fix/dup-contracts
needs attentionviewing older commit5d0ec62 · incrementalPR #298reviewed 2026-07-13 20:31 UTC2H · 4M · 3L · 2I- Purpose
- Fix critical contract duplication bug — CFE persist pipeline used bills[0] (arbitrary position) as classification evidence, causing stale backfill batches to wrongly terminate active contracts (18 prod contracts deposed June 2026).
- Goal
- Newest-evidence guard: evidence always from newest bill with tariffCode; stale evidence creates terminated history row instead of deposing active contract; 23505 recovery adopts winning row without double-emitting outbox events.
- Sub-goals
- SG-1: selectEvidenceBill extracted to bill.decisions.ts
- SG-2: insertContractRaceSafe returns adopted flag
- SG-3: evidencePeriodEnd required at shell boundary
- SG-4: serviceName added to utility.contract.created payloads (most branches)
- SG-5: Historical contract dual-links to active contract site
- SG-6: assertNever tail + barrel export
- What
- Incremental commit (5d0ec624) addressing 13 of 21 prior loop-review findings. Adds adopted flag, serviceName to outbox, site dual-linking, tightens type signatures.
- Why
- Addresses loop-review findings from prior commit. Rejected findings (org-scoping, TOCTOU, nil-UUID) documented with rationale.
- Areas
- domains/utility/src/bill+413−13domains/utility/src/utility-contract+219−70
- Blast
- 9 files, +632/-83. No schema migrations, no API contract changes.
Findings · 11
correctness1
createdHistorical site-linking uses activeSites[0] — misses additional same-org sites
domains/utility/src/bill/bill.shells.ts:860
security2
Race-adopted contract re-points subscriptions without org re-verification
domains/utility/src/utility-contract/utility-contract.shells.ts:77
findNewestXmlPeriodEnd trusts pipeline-ingested MAX(period_end)
domains/utility/src/utility-contract/utility-contract.shells.ts:671
conventions3
EnrichWizardContract outbox missing required serviceName and status
domains/utility/src/utility-contract/utility-contract.shells.ts:730
Emits utility.contract.created without serviceName/status — both required by ContractCreatedEventSchema. Commit claims to have fixed all branches but missed EnrichWizardContract. Fix: add serviceName: enriched.serviceName, status: enriched.status to eventData.
Extra outbox fields not in ContractCreatedEventSchema
domains/utility/src/utility-contract/utility-contract.shells.ts:773
Active-contract SUC insert uses raw db outside wrapping transaction
domains/utility/src/bill/bill.shells.ts:904
tests3
23505 SAVEPOINT race recovery (adopted=true) has zero test coverage
domains/utility/src/utility-contract/utility-contract.shells.ts:760
adopted=true path exists in 3 branches but no test exercises it. Idempotency test hits UseExistingContract (pre-insertContractRaceSafe), not the SAVEPOINT path. Add a concurrent-insert simulation asserting exactly one outbox event.
selectEvidenceBill: same-periodEnd tie-break not in test matrix
domains/utility/src/bill/__tests__/bill.decisions.test.ts:1664
serviceName outbox assertion only covers CreateHistoricalContract
domains/utility/src/utility-contract/__tests__/ensure-contract-evidence.integration.test.ts:197
improvement2
siteDisplayName reads input.bills[0] (unordered) — use billsNewestFirst[0]
domains/utility/src/bill/bill.shells.ts:878
No shared assertNever helper — inline exhaustiveness tail is novel pattern
domains/utility/src/utility-contract/utility-contract.shells.ts:920