← back to Unclaimed Property Platform
docs: ledger Cycle-9 record (outbox worker); TK-10097
2a43af461b5bbf76edf6e1d1ddf0450a05a4a371 · 2026-08-01 21:02:03 -0700 · Steve Abrams
Files touched
Diff
commit 2a43af461b5bbf76edf6e1d1ddf0450a05a4a371
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sat Aug 1 21:02:03 2026 -0700
docs: ledger Cycle-9 record (outbox worker); TK-10097
---
docs/LOOP-LEDGER.md | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
diff --git a/docs/LOOP-LEDGER.md b/docs/LOOP-LEDGER.md
index cb72c67..4ba7a36 100644
--- a/docs/LOOP-LEDGER.md
+++ b/docs/LOOP-LEDGER.md
@@ -107,12 +107,19 @@ UNIQUE(claim_id, idempotency_key) constraint (duplicate -> sqlite3.IntegrityErro
the "runs only on a mock" gap. `tests/test_cycle9_claims_persistence.py` (full lifecycle,
outbox, DB idempotency, state-only guard, illegal-transition rejection).
-## Cycle 9 — planned (DTD to select at next fire)
+## Cycle 9 — COMPLETE (commit e3a39c3; 10/10 suites green)
+**Landed:** `services/claims/outbox_worker.py` — completes the transactional-outbox pattern.
+At-least-once delivery + bounded retry; transient fail -> pending(attempts++); exhausted ->
+'failed' (claim recoverable, stays SUBMITTING); already-SUBMITTED -> idempotent success (no
+loop). outbox_event gained attempts+last_error. `tests/test_cycle10_outbox_worker.py`.
+Events are now WRITTEN (C8) *and* reliably DELIVERED (C9).
+
+## Cycle 10 — planned (DTD to select at next fire)
- Double Metaphone phonetic upgrade (dedicated cycle: separate blocking key + feature, re-tune, re-verify).
-- Outbox WORKER: drain pending outbox_event -> StateAdapter, mark sent/failed w/ retry (completes the outbox pattern).
-- Suppression feed adapter (batch state takedown file) + suppression-latency metric.
+- Suppression feed adapter (batch state takedown file, format_name suppress_csv_v1) + latency metric.
- Batch-retry for partial ingestion failure (resume from last-good offset).
- FastAPI reference: wire search_api.py to SearchService + OpenAPI (needs deps; verify in venv).
+- Reconciliation report: per-batch accepted vs state control-total (feed-completeness metric).
- SQLite → Postgres persistence scaffold (thread-safe pool — enables the threaded server).
- Batch-retry for partial C1 failure (idempotent re-run from last-good offset).
- FastAPI reference: wire search_api.py to SearchService + OpenAPI (needs deps; verify in venv).
← e3a39c3 Cycle 9: outbox worker — completes the transactional-outbox
·
back to Unclaimed Property Platform
·
Cycle 10: feed-completeness reconciliation (catches silent t edfce96 →