Delivery report — docrecon
ON TRACK
- Report
- 1 · deliverable: docrecon · 2026-10-15
- Scope
- Open-source reconciliation engine, two implementations, parity-tested
- Demo
- dalteno.com/lab/docrecon/
- Repo
- github.com/dalteno/docrecon
Done this week — against the agreed acceptance criteria
| Criterion | Status | Evidence |
|---|---|---|
| Visitor can enter values we never anticipated and get an explained verdict | ✅ | Live demo; every finding carries rule, field, expected, actual, reason |
| Rules identical in .NET 10 and JS | ✅ | 52 golden reports; .NET parity test compares every field |
| ≥ 40 shared cases incl. adversarial, expectations hand-written | ✅ | 52 cases, 15 adversarial, cases/generate.mjs |
| CI green on both engines | ✅ | .github/workflows/ci.yml — JS, .NET, generator drift check, golden coverage check. Update 18 Oct: first real run green — GitHub Actions run #3, commit 99c5257, 33 s total; dotnet test on CI: Dalteno.DocRecon.Tests Passed 145, Failed 0 (305 ms, net10.0) |
| Documented decisions | ✅ | ADR-0001 pure engine · ADR-0002 integer arithmetic · ADR-0003 cases as spec |
Not done / changed
- Multi-currency invoices with per-line FX conversion — out of scope, never planned (R08 flags mixed currencies instead); listed so nobody assumes otherwise.
- Air waybill support — not in scope for v1.0; the model is sea-freight only. Would be a v1.1 item if a partner needs it.
Found and fixed
- Mutation check showed the ±0.01 amount tolerance was masking a rounding-mode change at the integration level. Added
C17b_half_cent_zero_tolerance. (See case study, "what went wrong".) - The gross-weight boundary case was initially written against the smaller value; the rule measures tolerance against the larger value (documented). Case
C34corrected before the suite was frozen.
Measured
- JS: 62 tests passing · 38 µs per bundle (1,000 bundles / 38 ms, Node 22)
- .NET: 136 tests defined (52 expectation, 52 parity, 32 unit) at the time of this report. Update 18 Oct: after the external review added three cases, the suite is 145 tests — 145 passed, 0 failed on GitHub Actions (run #3, 305 ms, net10.0)
- Mutation checks: 3 run, 3 caught
Decisions needed from you
- None blocking. Optional: should weight tolerance default stay at 2 % or follow your broker's practice? One-line change in
ReconcileOptions.
Risks
- Low: party-name normalisation strips one trailing legal suffix; names with a suffix in the middle ("Acme GmbH & Co. KG") compare literally. Documented in R17; a longer suffix list is a config change, not a code change.
Next week (if this were a continuing engagement)
- v1.1: configurable rule set per client (enable/disable, per-rule severity), air waybill model, CSV import for line items.
- Demo on Friday 16:00 CET in your repo or ours.