diff --git a/.superpowers/sdd/2026-09-18-hybrid-delivery-note-ingestion/final-fix-report.md b/.superpowers/sdd/2026-09-18-hybrid-delivery-note-ingestion/final-fix-report.md index e775652..ce9a33a 100644 --- a/.superpowers/sdd/2026-09-18-hybrid-delivery-note-ingestion/final-fix-report.md +++ b/.superpowers/sdd/2026-09-18-hybrid-delivery-note-ingestion/final-fix-report.md @@ -31,3 +31,11 @@ git diff --check ## Residual risk The migration remains unapplied and `DN_STAGED_INGESTION_ENABLED` remains unchanged. Existing rows without `global_page` and with a source-page gap require manual repair/re-extraction; the posting path intentionally refuses to infer their identity. + +## Follow-up P1 fixes + +- Exported `evaluateRequiredChecks`; the staged runner and posting readiness gate now share the exact required/optional policy. A null `product_matched`, `units_convertible`, or `qty_plausible` result cannot produce `ready_to_post`. +- Staged checks now load cumulative `delivery_note_items.qty_received` totals once per run and pass them to `qty_plausible`. Missing schema, failed reads, or invalid quantities persist a failed `delivered_totals_available` gate and fail closed. A sequential over-delivery regression proves the current candidate remains review-only. + +Follow-up code commit: `199dfba` +Follow-up focused verification: 4 files, 92 tests passed; `npm run typecheck`; `git diff --check`. diff --git a/.superpowers/sdd/2026-09-18-hybrid-delivery-note-ingestion/progress.md b/.superpowers/sdd/2026-09-18-hybrid-delivery-note-ingestion/progress.md index acdb98e..9509a38 100644 --- a/.superpowers/sdd/2026-09-18-hybrid-delivery-note-ingestion/progress.md +++ b/.superpowers/sdd/2026-09-18-hybrid-delivery-note-ingestion/progress.md @@ -174,3 +174,8 @@ Final cross-feature fix wave: focused verification passed — 8 files, 89 tests; Ruling: staged candidates must persist the aggregate page evidence, line links, and complete canonical checks before they can be ready_to_post — cost if wrong: more candidates enter review, but no incomplete candidate can pass the posting gate. Ruling: global_page is an additive stable identity and legacy page remapping is allowed only when source ordinals/pages are contiguous and unambiguous — cost if wrong: old ambiguous rows require manual repair instead of risking the wrong scan page. Ruling: manual split/join invalidates all derived candidate commercial/entity/match/check fields and requires recomputation — cost if wrong: an operator must wait for the staged runner, but stale PO links cannot be posted after page reassignment. +Final fix follow-up: dispatched at base 0f910c1 +Final fix follow-up: code complete (shared required-check policy and strict cumulative ledger totals; commit 199dfba) +Final fix follow-up: focused verification passed — 4 files, 92 tests; npm run typecheck; git diff --check +Ruling: staged readiness and posting use the same exported required-check helper; required checks must be true and only explicitly optional checks may be null — cost if wrong: a document remains in review until all financial gates are proven. +Ruling: delivery-note item totals are loaded once per staged run and any read/schema/quantity error adds a failed persisted gate — cost if wrong: the batch pauses for operator repair instead of comparing against an unsafe zero baseline.