← back to Unclaimed Property Platform
docs: ledger Cycle-8 record (claims persistence); TK-10097
e7a163fe18e245e45ffe95dfcbe1646f28935cee · 2026-08-01 20:56:50 -0700 · Steve Abrams
Files touched
Diff
commit e7a163fe18e245e45ffe95dfcbe1646f28935cee
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sat Aug 1 20:56:50 2026 -0700
docs: ledger Cycle-8 record (claims persistence); TK-10097
---
docs/LOOP-LEDGER.md | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/docs/LOOP-LEDGER.md b/docs/LOOP-LEDGER.md
index 90aaf48..cb72c67 100644
--- a/docs/LOOP-LEDGER.md
+++ b/docs/LOOP-LEDGER.md
@@ -99,13 +99,20 @@ deserves a dedicated cycle; suppression is contained, higher value/risk, and clo
property+owner+version history are retained; every action writes an immutable audit_event;
`audit_trail()` reads it; unknown record -> False. `tests/test_cycle8_suppression.py`.
-## Cycle 8 — planned (DTD to select at next fire)
-- Double Metaphone phonetic upgrade for international name recall (needs a dedicated cycle:
- add as a SEPARATE blocking key + feature, re-tune weights, re-verify all suites).
-- Batch-retry for partial C1 failure (idempotent re-run from last-good offset).
-- SQLite → Postgres persistence scaffold (thread-safe pool — enables threaded server).
+## Cycle 8 — COMPLETE (commit c3d81a0; 9/9 suites green)
+**Landed:** `services/claims/sqlite_claim_repo.py` — concrete ClaimRepository over
+claim_case/claim_event/outbox_event (shares the SqliteRepository conn). Claims now run
+end-to-end on real persistence; the C3 idempotency fix is proven against the REAL
+UNIQUE(claim_id, idempotency_key) constraint (duplicate -> sqlite3.IntegrityError), closing
+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)
+- 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.
+- 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).
-- Suppression latency METRIC + a suppression feed adapter (batch state takedown instructions).
- 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).
← c3d81a0 Cycle 8: concrete SqliteClaimRepository — claims subsystem r
·
back to Unclaimed Property Platform
·
Cycle 9: outbox worker — completes the transactional-outbox e3a39c3 →