How a claim runs
What it is¶
A claim enters Adjust360 through one of two doors and leaves as a thesis record, a rendered brief and a receipt. The structured door takes a carrier payload in the published format and runs rules only. The document door takes a file set, extracts facts with provenance, and hands the same canonical shape to the same rules. No downstream tool can tell which door was used, and none may branch on it .
This page follows the subrogation profile, which is the path built and tested end to end. Other profiles follow the same shape as their trace contracts land.
The structured path¶
The carrier supplies a payload in the carrier_structured profile of the generated manifest, with a single header carrying the claim id, LOB, stage, format version and profile, and every fact in a four-status envelope . The stages run in this order.
The normalizer validates the payload against the canonical schema, collecting every error rather than stopping at the first, and produces the core_facts plus claims_by_lob shape that every tool reads. It walks the spec's field list, not the payload's keys, so a field the spec expects and the payload omits becomes not_returned .
JurisdictionResolverGKR reads the jurisdiction context the harness derives from the payload and returns the state sections the profile needs: the subrogation section with no-fault and per-head gates, the fault system, statutes of limitation with their anchors, and any obligations that compute a deadline. date_of_loss is the only core anchor; an obligation whose stage cannot supply its anchor returns not applicable rather than a permanently indeterminate deadline .
SensitiveIndicatorDetectorGKR Phase B runs where its structured triggers are curated for the LOB. Where it is not run, the trace records detector_not_run with the reason, never an empty result that reads as no indicators fired .
SubrogationScreenerGKR evaluates Phase 0 gates (comparative fault bar, no-fault per head, waiver, first-party payment, candidate-target gating by role), then every active theory and defense in the corpus, and writes the two-layer thesis: the ten-field surface and the unabridged decision trace, with payload hash, spec versions and ruleset hash in the header .
build_thesis_record(decision_trace) is then the only consumer of the trace. It builds the thesis record against subro_thesis_schema.json, and the template renderer reads only that record to produce the HTML and PDF brief. Nothing downstream of the builder reads the trace directly .
What is not on that path¶
The liability analyzer and the coverage analyzer do not run on the subrogation profile of the structured path. They are recorded as not run with a reason. A run in which they instead reported an error and a synthesis refusal on a carrier payload was ruled a defect, because a tool that was never meant to run must not appear to have failed .
The consequence is visible in the thesis. legally_recoverable stays pending until the liability contract lands, because the comparative fault gate clears on a police determination and a citation but the stated fault percentage is not on the payload. The brief says pending, not a number.
The document path¶
The other door is a file set. The harness resolves a file, a directory, repeated flags or a zip into an ordered bundle, with doc_index 0 as primary and a cache keyed on the set hash so a bundle whose primary matches an earlier single-document run cannot hit the wrong fact set. Each document is segmented and classified, deterministically first and with the model advisory only where rules return null. Policy documents route out of the claim path into the policy snapshot. Each document is read under its profile with per-fact attestation, facts are reconciled by governed precedence rather than document order, and collection-level facts such as policy_source are derived last .
The output contract is identical to the structured path, including classification_source, whether the native extractor or an external vendor read the documents. A carrier without a vendor loses throughput, not capability. The native extractor is a reference implementation and a measurement baseline; the vendor path is selected with --idp native, reducto or databricks, and the last two require --manifest.
The subrogation regression runs on the structured path only. Native extraction was removed from it after extraction variance produced an invented employer, an invented rental total and a fifth status literal; those findings went to the extractor track. Morales and Martinez remain as document-verified baselines expressed as structured payloads.
Harness modes¶
adjust360_harness.py --mode receipt --idp carrier_structured --profile subro --in payload --out dir validates the payload through the normalizer, builds a receipt record and renders receipt.json and receipt.html, and runs no tool. The receipt lists, by tier, what the payload stated, what it checked and found absent, and what it did not supply, with which theory or gate needs each field, what falls outside the profile, and whether each jurisdiction section is published and each deadline computable. It shares the payload hash with the subro mode, and its assertions require that it predicts the thesis completeness ledger exactly and carries no determination words .
--mode subro runs the pipeline above and produces the thesis record, the brief and the trace. The receipt is what a carrier sees before a run; the brief is what they see after.
The standing five¶
Every report on a commit that changes behaviour opens with the verbatim output of five commands in this order: check_subro_corpus_drift.py, check_corpus_coverage.py, fuzz_subro.py --n 500, generate_idp_manifest.py --profile carrier_structured --diff, and run_conformance.py. Tool-specific checks follow. A report opening with any other set is rejected unread .
Each guards a different thing. Drift proves the seed script, the database and the signed snapshot agree. Coverage proves every corpus record is reachable from the seed set. Fuzz proves 500 random payloads violate no invariant. The manifest diff proves the generated contract matches its source. Conformance runs the signed seeds and scores ten criteria per case, with no aggregate. The baseline at the corpus freeze was 53 of 53 on the structured path, snapshot v1.2.0, drift clean, fuzz 500 with zero violations.
An error is never a decision¶
A missing resolver, section or upstream output stops the run with a named error. A run does not degrade into a verdict. The pattern that keeps reappearing in new forms is the silent fallback producing a plausible value where a refusal belongs: a date of loss falling through to today's date, a missing variant resolver degrading to a weaker guess, a fallback table producing a full reserve during an outage. A missing dependency fails the run closed with a named reason, and the harness fallback to a flat copy when the database is unavailable is an open item for the same reason .
A caller-supplied override that contradicts the payload fails the run too. One run applied California law to a Texas document because --state routed straight to the resolver; both values are now named in the failure.
Skipped, not configured, error¶
A stage that did not run is in one of three states, and they are distinct. skipped means the stage does not apply to this LOB. not_configured means it applies but its governed content is unbuilt. error means it should have run and failed. An empty result once meant all three, so a deliberate Property liability skip rendered as a stage error and blocked action synthesis. The brief has a separate renderer for each state, and a dependency check is positive: a section is satisfied only when its struct says ran or skipped, never by the absence of an error key .
Open items¶
- Standing header item 4 is to be replaced by
generate_intake_schema.py --diffonce the canonical intake schema lands. - The harness fallback to a flat copy when the database is unavailable should fail closed.
- The engine has not yet been shown to produce the Morales brief from the carrier sample payload through
--mode subrowith a sentence-by-sentence diff against the target; that is the first engineering item before the remaining renders.