You are comparing one submitted application against the documents filed to support it, and
producing the field-by-field comparison a reviewer signs before the application is accepted.
The application declares a fixed set of values. The packet of documents evidences some of them --
sometimes in a different unit, sometimes in a different format, sometimes split across more than one
document, and sometimes not at all. The comparison rulebook follows, in full.
How to read the packet:
- Work field by field, in the order the declared values are listed. Report EVERY declared field,
including the ones nothing in the packet mentions.
- A document may state the same fact in a different SHAPE: a different date format, an abbreviated
street, a synonym for an enumerated value, or an amount for a different PERIOD. Convert first,
compare second. The period is usually carried by the LABEL, not by the number.
- Two documents may have to be ADDED to evidence one declared amount or count. When they do,
report the combined total and every document you added.
- A document that another document in the packet says it REPLACES is not evidence of anything.
Read the prose, not only the labelled lines.
- SAYING NOTHING IS NOT DISAGREEING. If no admissible document mentions a field at all, that field
is UNSUPPORTED, not CONFLICTS. Do not manufacture a contradiction out of a silence.
- Do not infer a value from a related field. A household roster is not an income statement, and an
amount that "must be" right because another number implies it has not been evidenced.
- Then give the one application-level decision the rulebook's fixed order earns.
Reply with JSON and nothing else, in the shape given at the end.
THE COMPARISON RULEBOOK, as written:
# The comparison rulebook
This is how a declared value and a document are compared. It is the same set of facts as
`data/rules.json`, written out for a reader instead of for a parser.
## 1. What is being compared
An application declares a fixed set of fields. A packet of supporting documents is filed with it.
For **each declared field**, the question is whether the documents agree with what was declared,
contradict it, or say nothing about it.
Three answers, and only three:
- **`MATCHES`** — at least one admissible document, or one admissible combination of documents,
evidences the declared value.
- **`CONFLICTS`** — no admissible document or combination evidences the declared value, and at
least one of them evidences a *different* value for that field.
- **`UNSUPPORTED`** — no admissible document says anything about that field at all.
`UNSUPPORTED` is **not** a mild conflict. It means the paperwork is silent, not that the paperwork
disagrees. A declared value nothing evidences and a declared value something contradicts are two
different problems with two different fixes, and collapsing them loses the one that matters.
## 2. A value is compared by its TYPE, never as text
| type | how it is compared |
|---|---|
| `money` | converted to **integer cents** on both sides, then compared with a tolerance of **100 cents**. A difference of 100 cents or less is a match; 101 cents or more is a conflict. `$1,234.56`, `1234.56` and `1,234.56 USD` are one value. |
| `count` | converted to an **integer** on both sides and compared exactly. A number written as a word (`three`) is that number. |
| `date` | parsed to a calendar date on both sides and compared exactly. `2007-03-04`, `03/04/2007` and `4 March 2007` are one value. **A slashed date is month/day/year.** |
| `text` | compared after lower-casing, dropping punctuation, collapsing whitespace and expanding the street abbreviations in the table below. `118 Ridgeway Ct., Apt 4` and `118 Ridgeway Court Apartment 4` are one value. |
| `enum` | compared after mapping through the synonym table below. `Married filing jointly`, `married, filing jointly` and `MFJ` are one value. |
**Street abbreviations that expand:** st/str → street · ct → court · rd → road · ave/av → avenue ·
ln → lane · dr → drive · blvd → boulevard · ter/terr → terrace · pl → place · hwy → highway ·
sq → square · apt/apts → apartment · ste → suite · unit → apartment ·
n → north · s → south · e → east · w → west · ne → northeast · nw → northwest · se → southeast ·
sw → southwest.
**Filing-status synonyms:** `single` · `married filing jointly` / `married, filing jointly` /
`married joint` / `MFJ` → married_joint · `married filing separately` / `married, filing
separately` / `MFS` → married_separate · `head of household` / `HOH` → head_of_household.
## 3. A document may state a value for a DIFFERENT PERIOD
A field declared as an annual figure may be evidenced by a document that states a monthly,
weekly, biweekly, semimonthly, quarterly or semiannual one. **Convert it to the period the
application declared, then compare.** The multipliers are fixed:
| the document states | multiply by |
|---|---|
| annual | 1 |
| semiannual | 2 |
| quarterly | 4 |
| monthly | 12 |
| semimonthly | 24 |
| biweekly | 26 |
| weekly | 52 |
The period is usually in the **label**, not in the number: *"Monthly benefit amount: $1,200.00"*
is $14,400.00 a year. A document that gives a rate and a count of pay periods —
*"Regular rate $738.00 per week, weeks paid 52"* — states the same thing the long way.
## 4. Two documents may be COMBINED
For a `money` or `count` field, up to **three** admissible documents may be **added together** to
evidence one declared value. Two employers in one year are two wage statements and one annual
income. Two enrolment letters are two students.
Combining is only ever an **addition**, and only for money and counts. A date, an address or a
filing status is evidenced by one document or by none; adding two of them together would invent a
value neither of them states.
**When a combination is what evidences the field, report the combined total and every document
you added.**
## 5. A document that has been replaced is not admissible
A document that another document in the same packet states it **replaces** — an amended wage
statement naming the statement it corrects, by document id, in its own text — is out. It is not
evidence of anything, and a declared value whose only support is a replaced document is
**`CONFLICTS`**, against the replacement.
Nothing else is excluded. A document may be undated, unsigned, or from any issuer, and it still
counts.
## 6. Which value to report
- For **`CONFLICTS`**, report the value the documents actually show, **converted to the unit and
period the application declared it in**, and every document id it came from. A monthly figure
that annualises to the wrong number is reported as the annual figure, not as the monthly one:
the whole point is that the two sides are now comparable.
- Where more than one contradicting value exists, report the one **closest to the declared value**
— fewest documents first if two are equally close, then lowest document id.
- For **`MATCHES`**, report the same way: the evidenced value and the documents behind it.
- For **`UNSUPPORTED`**, there is no value and no document. Report null and an empty list.
## 7. The application-level decision
One word for the whole application, decided in this fixed order from the field verdicts and from
nothing else:
1. **`CONFLICTED`** — at least one declared field is `CONFLICTS`.
2. **`INCOMPLETE`** — nothing is contradicted, but at least one declared field is `UNSUPPORTED`.
3. **`CONSISTENT`** — every declared field is `MATCHES`.
`CONSISTENT` is the only one of the three that says the paperwork is done.
THE DECLARED VALUES -- what the application states. Every one of these must be reported.
application AP-0001
submitted 2026-08-20
field name type declared value
-------------------------- -------------- ----------------------------------
household_size count 2
students_in_household count 2
applicant_annual_income money $45,950.00
parent_annual_income money $100,450.00
untaxed_annual_income money $0.00
applicant_date_of_birth date 2006-04-02
residence_address text 1842 Coalpit Ln, Apt 16, Norrow Ferry MC 60408
tax_filing_status enum Married filing separately
The form prints these under the labels: Persons in household = household_size; Household members enrolled at least half-time = students_in_household; Applicant earned income, annual = applicant_annual_income; Parent earned income, annual = parent_annual_income; Untaxed income and benefits, annual = untaxed_annual_income; Applicant date of birth = applicant_date_of_birth; Address of record = residence_address; Tax filing status = tax_filing_status.
THE FILED PACKET, verbatim:
FILED APPLICATION PACKET
Application AP-0001 | received 2026-08-20 | applicant reference AR-5788-53
Applicant Lorna Sotelo | institution of record Norrow Ferry Community College
Documents filed with this application: 8
=== THE APPLICATION AS SUBMITTED ===
Persons in household ................................ 2
Household members enrolled at least half-time ....... 2
Applicant earned income, annual ..................... $45,950.00
Parent earned income, annual ........................ $100,450.00
Untaxed income and benefits, annual ................. $0.00
Applicant date of birth ............................. 2006-04-02
Address of record ................................... 1842 Coalpit Ln, Apt 16, Norrow Ferry MC 60408
Tax filing status ................................... Married filing separately
=== SUPPORTING DOCUMENTS ===
--- DOCUMENT D1 ------------------------------------------------------
Type Tax return summary
Issuer Kelvedge Regional Revenue Office
Issued 2026-05-26
Adjusted gross income ............................... $100,450.00
Filing status ....................................... Married filing jointly
--- DOCUMENT D2 ------------------------------------------------------
Type Employer wage statement
Issuer Sallowfield Grocers
Issued 2026-04-15
Gross wages paid .................................... $20,225.00
Weeks paid .......................................... 32
--- DOCUMENT D3 ------------------------------------------------------
Type Employer wage statement
Issuer Trentham Print Works
Issued 2026-04-13
Gross wages paid .................................... $23,425.00
Weeks paid .......................................... 30
--- DOCUMENT D4 ------------------------------------------------------
Type Benefit award letter
Issuer Ardsmoor Township Assistance Board
Issued 2026-04-25
Annual benefit total ................................ $0.00
--- DOCUMENT D5 ------------------------------------------------------
Type Household roster
Issuer Calderhaugh Housing Registry
Issued 2026-04-25
Persons in household ................................ 2
--- DOCUMENT D6 ------------------------------------------------------
Type Enrolment confirmation
Issuer Norrow Ferry Community College
Issued 2026-06-09
Students enrolled at least half-time ................ 2
--- DOCUMENT D7 ------------------------------------------------------
Type Identity record
Issuer Thistlebank Records Bureau
Issued 2026-05-05
Date of birth ....................................... 04/02/2006
--- DOCUMENT D8 ------------------------------------------------------
Type Residence statement
Issuer Calderhaugh Housing Registry
Issued 2026-06-29
Address of record ................................... 1842 Coalpit Ln, Apt 16, Norrow Ferry MC 60408
Reply with JSON and nothing else, exactly this shape:
{"fields": [
{"field": "<the field name, exactly as the declared-values block spells it>",
"verdict": "MATCHES" | "CONFLICTS" | "UNSUPPORTED",
"document_value": "<what the documents show for this field, as ONE value, in the SAME unit and
period the application declared it in -- annualise a monthly figure, add a
combination together, write a date any way you like. null when UNSUPPORTED>",
"document_ids": ["<every document id you took that value from; [] when UNSUPPORTED>"],
"why": "<one short sentence>"}
],
"decision": "CONSISTENT" | "INCOMPLETE" | "CONFLICTED"}
One entry per declared field, in the order the declared-values block lists them, and NO other
entries. `document_value` is what the PAPERWORK shows, never what was declared -- on a MATCHES they
are the same value and you still report the paperwork's. Money may be written any way you like; it
is compared as an amount, not as text.