Cross-check
This chapter was written from the product's source code and has not yet been checked by a person on a running Cogneris. If what you see on screen differs, the screen is right — please tell your Cogneris contact so the chapter can be corrected.
Compares values of a case with each other — a field of one document against a field of another document, against what the customer typed in the form, or against process data — and publishes a verdict for each rule and for the whole case. A divergence never rejects a case: it marks the case for human review.
| Palette | Nodes › Cross-check |
| Outputs | One output. The phase never branches; it writes a decision (pass or review) that a later phase reads — see Use the decision. |
| Content status | From source; not observed (workflow-fe f88c5c1, workflow-be 6703373, comparison rules from vision-be fce7fcc, 2026-10-22) |
When to use it
- After Extraction (or Zero Shot), when two documents of the same case must agree — the name on the ID and on the proof of address, the amount on the proposal and on the payslip.
- When a document must agree with the form — the document number the customer typed against the one read off the ID.
- Before Manual Review, so the reviewer sees which rules diverged and on which documents.
The Identity verification and Business onboarding workflow templates include this phase.
What happens in a run
- The case is gathered. The phase reads the documents of the run with their type, template, checklist slot and extracted fields, the form answers, and the process data. Extracted fields are addressable by their full dotted path and by their short name (for example both
caderneta.distritoanddistrito). Placed after a Manual Review, the phase still finds the documents and fields of the phases before the review. - Each rule is resolved into pairs of values. For each side (Compare and With):
- Document: every document of the case that fills the chosen role. The role is matched by checklist slot first, then by template, then by classified document type. If several documents fill it, each pairing is a separate comparison (a document is never compared with itself). At most 10 pairings per rule are compared; when a rule has more, the rest are dropped and the rule's reason says
truncated_to_10_combinations. - Form answer: the value of that form answer.
- Process data: the value of that process field. Process data includes
identifier,requester.nameandtoday(the day the check runs,yyyy-MM-dd).
- Document: every document of the case that fills the chosen role. The role is matched by checklist slot first, then by template, then by classified document type. If several documents fill it, each pairing is a separate comparison (a document is never compared with itself). At most 10 pairings per rule are compared; when a rule has more, the rest are dropped and the rule's reason says
- The pairs are compared. Every pair is compared by its rule's Comparison (see Comparisons). All non-face rules go to the comparison service in a single call; face rules go to the face-matching service, one call per pairing.
- Each rule gets one verdict:
match,mismatch,inconclusiveornotApplicable, combined from its pairings as described in How a rule's verdict is combined. - The case gets one decision:
passwhen no rule ismismatchorinconclusive; otherwisereview. Rules that arenotApplicabledo not prevent apass. - Implicated documents are marked. Every document involved in a rule that did not match is recorded with the ids of those rules, so the review screen can show the reviewer why the document is in front of them.
The phase adds a crossCheck block to the run's data: decision, a summary (total, match, mismatch, inconclusive, notApplicable), and one entry per rule in checks (rule id, name, comparison, verdict, score, method deterministic or ai, reason, and the values compared). When the case has face rules and no earlier Facematch phase ran, the face results are also published as a facematch block, so the review screen can show the face conference.
Comparisons
| Comparison | How two values are compared | Can Let AI settle close calls decide it? |
|---|---|---|
| Person name | Name particles are ignored. The same names, or the same names in another order, match. When one name is contained in the other (also abbreviated, such as an initial for a first name), or they share at least half their names, the pair is a close call. Otherwise they do not match. Accept a surname changed by marriage is passed with the pair; the first, rule-based pass does not use it, so it only matters for close calls settled by AI. | Yes |
| Text | Equal when they are the same ignoring case, accents and extra spaces. Any other difference is a close call. | Yes |
| Exact | Character-for-character equality. No normalization. | No |
| Document number | Only the digits are compared. Equal digits match. A masked number matches when it shows at least 4 digits and they are the end of the other number. Other differences do not match. A value with no digits is inconclusive. | No |
| Date | Both values are read as dates; the same day matches, a different day does not. A date that cannot be read (for example written out in words) is a close call. | Yes |
| Amount | Both values are read as numbers, in either 1.234,56 or 1,234.56 style, ignoring currency symbols. They match when the difference is within the tolerance: the absolute tolerance when it is set (it wins), otherwise the percentage of the larger value, otherwise zero. A value that cannot be read is inconclusive. | No |
| AI judgement | Always decided by AI, using the question you write for the pair. | Always |
| Face match | Compares the face on the Compare document with the face on the With document. Put the selfie on With. Both sides must be documents. No face found, more than one face, or a failed call is inconclusive. | No |
A side with no value — the document does not carry the field — makes the pair inconclusive, never a mismatch.
A close call is decided by AI when Let AI settle close calls is on. When it is off, close calls come back inconclusive and go to review.
How a rule's verdict is combined
| Situation | Rule verdict |
|---|---|
| A side names a document role that no document of the case fills, and When the document is missing is Send for review | inconclusive (reason role_not_present) |
| The same, and When the document is missing is Skip the rule | notApplicable |
| When several documents match is Any one is enough | match if any pairing matches; otherwise mismatch if any pairing does not match; otherwise inconclusive |
| When several documents match is All must agree | mismatch if any pairing does not match; otherwise inconclusive if any pairing is not a match; otherwise match |
| When several documents match is Only the first | Only the first document on each side is used, so the rule has one pairing and takes its verdict |
| The comparison service refuses or fails the call after its retry | Every rule of that call is inconclusive, with the service's reason |
When the document is missing applies only to a missing document role. A document that is present but lacks the field is a missing value, which is inconclusive whatever this option says.
The rule reports the pairing that decided its verdict, and lists every pairing tried as evidence.
Use the decision
The phase has a single output: the run always continues to the next phase. To treat a review differently, either place a Manual Review after it (a manual review that would approve on its own never does so when a cross-check ran — see Manual Review), or add a Conditional that tests the field crossCheck.decision.
When the phase fails
The phase fails the run only for a structural problem: no rules, or no documents. A temporary failure of the comparison service is retried once; after that, the rules are recorded as inconclusive instead of failing.
Examples
Three cases, each with the rules a company would set up. The field names are illustrative: yours are the field names of your own extraction templates and the keys of your own form.
Bank: opening an account remotely
A customer opens an account from their phone. The form asks for their name, document number, date of birth and address; they send their identity card, a proof of address and a live selfie. The bank wants to stop mule accounts — an applicant using someone else's documents, or documents that do not belong together.
| Rule name | Compare | With | Comparison | Settings | What it catches |
|---|---|---|---|---|---|
| Name on the ID | Document Identity card › full_name | Form answer fullName | Person name | — | The applicant typed one name and sent someone else's ID. Names in another order, or with particles left out, still match. |
| Document number | Form answer documentNumber | Document Identity card › document_number | Document number | — | A mistyped or invented number. Dots and dashes do not matter; a masked number matches when its last 4 or more digits agree. |
| Date of birth | Document Identity card › birth_date | Form answer birthDate | Date | — | A different date — a frequent sign of a borrowed ID. |
| Address | Document Proof of address › address | Form answer address | Text | Let AI settle close calls on | A different address. Abbreviations such as Av. for Avenida are close calls the AI settles. |
| Proof of address holder | Document Proof of address › holder_name | Document Identity card › full_name | Person name | Accept a surname changed by marriage on | A bill in someone else's name. A married surname is expected, not a fraud sign. |
| Selfie | Document Identity card | Document Selfie | Face match | — | The person in the selfie is not the person on the ID. |
When every rule matches, the decision is pass and the case continues without a person. When the face does not match, or any rule diverges, the decision is review: the case goes to the Manual Review that follows, and the reviewer sees which rule diverged and on which documents.
Insurer: an insurance claim
A policyholder reports a claim through the Portal and sends the policy, the incident report, the repair invoices, their identity card and a bank statement for the payment. The insurer wants to pay clear claims quickly and send the doubtful ones to an adjuster.
| Rule name | Compare | With | Comparison | Settings | What it catches |
|---|---|---|---|---|---|
| Policyholder | Document Policy › holder_name | Form answer fullName | Person name | — | A claim filed by someone who is not the policyholder. |
| Policy number | Form answer policyNumber | Document Policy › policy_number | Document number | — | A claim against the wrong policy. |
| Incident date | Form answer incidentDate | Document Incident report › incident_date | Date | — | The date told in the form and the date in the report do not agree. |
| Policy in force | Document Policy › coverage_period | Form answer incidentDate | AI judgement | Is the incident date inside the coverage period of the policy? | An incident before the policy started or after it ended. A plain Date comparison only checks for the same day, so this question needs the AI. |
| Amount claimed | Form answer amountClaimed | Document Repair invoice › total | Amount | Tolerance (absolute) 50 | A claimed amount that differs from the invoice by more than 50. |
| Invoices addressed to the policyholder | Document Repair invoice › customer_name | Form answer fullName | Person name | When several documents match: All must agree | One invoice, among several, issued to someone else. With All must agree, a single divergent invoice is enough to send the claim to review. |
| Bank account holder | Document Bank statement › account_holder | Document Identity card › full_name | Person name | When the document is missing: Skip the rule | A payment to someone else's account. The bank statement is optional in this form, so a claim without one is not held for review. |
A claim whose rules all match continues straight to payment; any mismatch or inconclusive rule sends it to the adjuster with the divergent documents marked. The video below (in Brazilian Portuguese) follows a claim checked by 14 such rules.
Bank: a mortgage application
An applicant sends their last three payslips, their tax return, their identity card and the property's land registry record. The form asks for their declared monthly income and the property's district.
| Rule name | Compare | With | Comparison | Settings | What it catches |
|---|---|---|---|---|---|
| Income on every payslip | Document Payslip › net_salary | Form answer monthlyIncome | Amount | Tolerance 10 %; When several documents match: All must agree | A declared income no payslip supports, or one payslip that is far off the others. Each of the three payslips is compared with the form. |
| Name on every payslip | Document Payslip › employee_name | Document Identity card › full_name | Person name | When several documents match: All must agree | A payslip that belongs to someone else. |
| Employer | Document Payslip › employer | Document Tax return › employer | Text | Let AI settle close calls on; When several documents match: Only the first | The employer on the tax return is not the one paying the salary. ACME, S.A. and Acme SA are close calls the AI settles. |
| Property district | Document Land registry record › distrito | Form answer propertyDistrict | Text | — | The property described in the form is not the one in the registry record. |
The income rule shows why When several documents match matters: with Any one is enough, a single payslip close to the declared income would pass; with All must agree, every payslip has to support it.
Reading the result
In all three cases the phase adds the same crossCheck block to the run (see What happens in a run): one decision for the case, and one entry per rule in checks with its verdict and the values compared. To route on it, add a Conditional on the field crossCheck.decision, or place a Manual Review after the phase, which never approves on its own a case whose cross-check asked for review.
Configuration
The panel shows the hint Compare a field of one document against a field of another, or against what the customer typed in the form., one block per rule, Add rule, and Let AI settle close calls.
| Field | What it does | Required | Format / values | Default | Validation messages |
|---|---|---|---|---|---|
| Description | Name shown on the node. | No | Text | Cross-check | — |
| Rule name | Names the rule for the reviewer and in the results. | No | Text | Empty | — |
| Compare › Source | Where the first value comes from. | Yes | Document, Form answer, Process data | Document | — |
| Compare › Document | The document role. Shown when Source is Document. | Yes, for Document | Select a document…, then the workflow's checklist slots (by title, or Checklist slot #… for a slot without a title), then your templates | Select a document… (none) | Could not load your templates. You can still type a document type and a field name. |
| Compare › Field | The field to read. Hidden for Face match. When Document is a template, the field names of the template are suggested. | Yes, except for Face match | Field name or dotted path; for Form answer the answer's key; for Process data identifier, requester.name or today | Empty | — |
| With › Source, Document, Field | The second value, same options as Compare. For Face match, the selfie. | As for Compare | As for Compare | As for Compare | As for Compare |
| Comparison | How the two values are compared. | Yes | Person name, Text, Exact, Document number, Date, Amount, AI judgement, Face match | Text | — |
| Accept a surname changed by marriage | Tells the AI that a surname added or replaced by marriage is expected. Shown for Person name. | No | On / off | Off | — |
| Tolerance (%) | Allowed difference as a percentage of the larger amount. Shown for Amount. | No | Number, 0 or more | Empty (no tolerance) | — |
| Tolerance (absolute) | Allowed absolute difference, in the amount's own unit; wins over the percentage. Shown for Amount. | No | Number, 0 or more | Empty | — |
| Instruction for the AI | The question for the AI. Shown for AI judgement; the box suggests What should the AI judge about this pair? | Yes, for AI judgement | Text | Empty | — |
| When several documents match | How the pairings of a rule are combined. | No | Any one is enough, All must agree, Only the first | Any one is enough | — |
| When the document is missing | What a document role that no document fills means. | No | Send for review, Skip the rule | Send for review | — |
| Let AI settle close calls | Lets the AI decide pairs the rule-based comparison cannot settle. Applies to every rule of the phase. | No | On / off | On | — |
Checklist slots are offered only once the workflow has been saved.
Buttons and actions
| Button | What happens | Reversible? |
|---|---|---|
| Add rule | Adds an empty rule (Text, both sides Document). It is saved once you change one of its fields. | Yes — remove it |
| × (Remove rule) | Removes the rule. The phase's other settings, such as Let AI settle close calls, are kept. With no rule left the panel warns Add at least one rule: a cross-check without rules fails the run. | Add the rule again |
Common problems
| Message | Cause | What to do |
|---|---|---|
| Could not load your templates. You can still type a document type and a field name. | The template list did not load. | Reload the editor. The Document list keeps the checklist slots. |
| Cross-check step has no rules configured. Add at least one rule, or remove the step. (run error) | The phase has no rule. | Add at least one rule and publish again. |
| No documents found for cross-check. (run error) | The run reached the phase with no documents. | Check the phases before it and what the process was started with. |
A rule is always inconclusive with reason role_not_present | No document of the case fills the role — wrong template, or the document type differs from the one classified. | Check the role; use Skip the rule if the document is optional. |
A rule is inconclusive with reason missing_value | The document does not carry the field, or the field name is wrong. | Check the field name against the extraction result. |
A Face match rule is inconclusive with reason face_needs_two_documents | A side of the face rule is not a document. | Set both sides to Document. |
Reasons starting with rejected: or call_failed: | The comparison service refused or failed the call. | The case goes to review; the reason names the cause. |
Related
- Facematch — the dedicated face check.
- Manual Review
- Conditional
- Generate document — can print the cross-check decision and counts.
- Organize human review
- Design and publish a workflow
Last reviewed 2026-10-22 · Version 1.1.0 · Owner: product-documentation