[object Object]

← 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 →