# Quote-template-unification anchor Eight quoting suppliers (`AST`, `BCN`, `CDR`, `DVR`, `EMB`, `FJR`, `HBR`, `IRS`) cover five BOM parts: **40 data rows**, or 41 CSV rows including the header. The unknown `GRN` intake is quarantined in the exception ledger, not added as a ninth quoting supplier. ## Run from this directory Install Bun and Git. Export `ANTHROPIC_API_KEY` and `BASETEN_API_KEY`; a Claude Code login alone is not this recipe's authentication contract. Run as a non-root user with writable execution and output directories. ```sh python3 ../verify.py prepare-data ../quote-template-unification task-data bunx hankweave@0.10.0 hank.json task-data --validate bunx hankweave@0.10.0 hank.json task-data --headless --start-new --execution exec --max-cost 9 --shim-idle-timeout 1800 --overwrite-output -o out python3 ../verify.py anchor out bun rigs/render-exceptions.ts out --check && bun rigs/render-award.ts out --check ``` The preparation command copies only task inputs into `task-data/`, mounted as `read_only_data_source/`. It leaves the answer key, generator, and planted failure examples outside the agent's input directory. Reuse this prepared directory for repeat runs; preparation refuses to overwrite an existing destination. The Python command compares output against the held-out truth and exits nonzero on missing or duplicate supplier-part rows, value drift, missing supplier hazards, or broken exception fields. The final command separately verifies the exported report and lossless exception CSV against their upstream sources. `--validate` checks configuration and paths without running codons or provider health checks; it does not prove that your credentials work. Runtime startup health checks and actual codons are separate. `--start-new` requests an independent execution; omit it only when deliberately resuming an interrupted execution with the same data source. ## Program and output contracts Seven codons run in order, without loops: 1. `normalize-aster`, `normalize-beacon`, `normalize-cedar`: `haiku`; preserve the three digitizer dialects in canonical envelopes. 2. `survey-and-extracts`: its `rigs/native-inputs.ts` setup deterministically parses five native exports and initializes an incomplete intake survey. The `haiku` agent inspects unmatched raw intake and completes the quarantine decisions. The step exports five envelopes plus `survey-notes.json`. 3. `validate-and-repair`: `pi/baseten/deepseek-ai/DeepSeek-V4-Pro`; setup requires byte-identical native envelopes and a completed survey before model work. The agent validates all eight suppliers and routes hazards to `exception-ledger.json`. 4. `reconcile`: the same Baseten model; writes 40 supplier-part rows. Its budget uses `onExceeded: "fail"`, so a budget stop cannot certify a truncated table. 5. `award-brief`: setup runs `rigs/render-award.ts` to generate cited financial recommendations from `unified-records.csv`; `haiku` completes only the qualitative assessment. `rigs/render-exceptions.ts` remains the lossless ledger-to-CSV renderer. The output-copy hook runs both source-based checks before exporting. The codon caps sum to $9.00; this is a configured ceiling, not a predicted bill. The command above also requests a $9 global maximum. Some non-reconcile codons use `onExceeded: "complete"`; a zero process exit is therefore insufficient evidence of complete artifacts. Run the deterministic check. The `quality-observer` sentinel receives only completion events. Its log can discuss fields present in those events. It cannot inspect files, prove row coverage, or infer missing files from absent `file.updated` events. Artifact checks belong to `verify.py`. ## Award report boundary The financial table always has five BOM-part rows. It chooses the lowest `line_extension_minor` among eligible `QUOTED` rows, breaking ties by `supplier_code` ascending and naming that tie explicitly. Each unit price and extension is immediately followed by the winning row's actual `[source_document_id:source_block_id]` citation. Ineligible quoted suppliers remain visible in a separate column; no eligible bid produces an explicit no-recommendation row. Missing price citations, unsupported currencies or normalized price bases, inconsistent extensions, and broken supplier-part coverage stop rendering. The helper reads reconciled rows and the exception ledger, never `truth/`. The agent replaces the unfinished assessment markers, not the financial section. It explains exclusions and every ledger exception in plain, qualitative prose, preserving each exception's identity and source reference and identifying judgment calls requiring human sign-off. Amounts and other numeric values are forbidden in that prose; part and exception identifiers are allowed. Exact numeric exception details stay in the ledger and its lossless CSV, not in an uncited narrative copy. `bun rigs/render-award.ts --check out` regenerates the expected financial section from the exported source rows without rewriting the report. It rejects financial drift, incomplete assessment sections or exception entries, altered exception references, and monetary or numeric additions outside the generated section. This is a mechanical boundary check, not an independent semantic review of the model's explanations. Rendering without `--check` replaces the report and requires the assessment to be completed again. The existing corpus oracle remains unchanged. ## Fresh-run comparison Model-written JSON/CSV is not promised to be byte-identical. The corpus checksum proves input integrity, not model determinism. Run two fresh attempts with separate execution and output paths (`--execution exec-a -o out-a`, then `--execution exec-b -o out-b`) and check each independently against the oracle. For the three extraction envelopes, `python3 ../verify.py compare-json out-a out-b` checks required identity, raw part, quantity, price/basis, status and citation fields while preserving array order. It records full-JSON and byte differences without rejecting otherwise valid optional-field or formatting variation. `expected/` is an example capture, not proof that your run passed. The version root's `recapture-required.json` binds capture evidence to the source revision that was exercised.