{"slug":"unclaimed-property-platform","total":42,"limit":100,"offset":0,"since":null,"commits":[{"hash":"10056f2","date":"2026-08-13 15:04:43 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-13T15:04:38 (1 data files) — db/schema.sql","body":""},{"hash":"50995a7","date":"2026-08-07 11:48:05 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-07T11:47:33 (2 data files) — db/ca_unclaimed.sqlite-shm db/ca_unclaimed.sqlite-wal","body":""},{"hash":"941205e","date":"2026-08-07 11:15:23 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-07T11:14:36 (1 data files) — db/ca_unclaimed.sqlite-wal","body":""},{"hash":"c41cc84","date":"2026-08-07 10:42:48 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-07T10:41:58 (1 data files) — db/ca_unclaimed.sqlite-wal","body":""},{"hash":"60d2295","date":"2026-08-07 10:09:53 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-07T10:09:04 (2 data files) — db/ca_unclaimed.sqlite-shm db/ca_unclaimed.sqlite-wal","body":""},{"hash":"0b2c4c2","date":"2026-08-07 09:38:14 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-07T09:37:33 (1 data files) — db/ca_unclaimed.sqlite-wal","body":""},{"hash":"91b20cb","date":"2026-08-07 09:05:54 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-07T09:05:06 (2 data files) — db/ca_unclaimed.sqlite-shm db/ca_unclaimed.sqlite-wal","body":""},{"hash":"f9cc59e","date":"2026-08-07 08:33:31 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-07T08:32:43 (2 data files) — db/ca_unclaimed.sqlite-shm db/ca_unclaimed.sqlite-wal","body":""},{"hash":"d8cf6c0","date":"2026-08-07 08:01:13 -0700","author":"auto-commit-fleet","subject":"auto-data-snapshot: 2026-08-07T08:00:20 (2 data files) — db/ca_unclaimed.sqlite-shm db/ca_unclaimed.sqlite-wal","body":""},{"hash":"9f2367a","date":"2026-08-07 07:57:43 -0700","author":"steve@designerwallcoverings.com","subject":"ca: masked search UI (serve_ca.py :8799) + disk-safe full-CA fetch-load loop","body":""},{"hash":"eeef319","date":"2026-08-07 07:54:15 -0700","author":"steve@designerwallcoverings.com","subject":"ingest: CA adapter + streaming loader — real California DB built (3.76M records, $11.1B)","body":""},{"hash":"42ad8e0","date":"2026-08-07 07:43:55 -0700","author":"steve@designerwallcoverings.com","subject":"outreach: CA has a free public CSV bulk download — no PRA letter needed (letters become fallback)","body":""},{"hash":"5f6f29b","date":"2026-08-07 07:40:37 -0700","author":"steve@designerwallcoverings.com","subject":"outreach: 51-state public-records request generator + CA letter ready","body":""},{"hash":"5d968bc","date":"2026-08-01 22:12:11 -0700","author":"Steve Abrams","subject":"chore: v0.1.0 — compile-clean, 11/11 green (session close)","body":""},{"hash":"3b35078","date":"2026-08-01 22:00:07 -0700","author":"Steve Abrams","subject":"docs: LOOP CLOSED — Cycle 11 wrap + final state + deferred backlog; TK-10097","body":""},{"hash":"3532e9b","date":"2026-08-01 21:59:11 -0700","author":"Steve Abrams","subject":"Cycle 11 (DTD verdict C): packaging + consolidation, then wrap","body":"DTD 5/5 verdict C (CONTINUE/WRAP/PIVOT -> PIVOT to packaging then wrap); Cody dissent (real\nblocker is business/legal) folded in as a real DUA template, not dismissed.\n- scripts/demo_tour.py: one-command narrated end-to-end tour (ingest 3 formats + reconcile ->\n  masked search -> suppress/reinstate -> claim + outbox retry). VERIFIED runs /bin/zsh.\n- Makefile: make demo / test / serve / install (one-command front door).\n- README.md: rewritten — what works + proof table, 60-second demo, guardrails, repo map,\n  and the real critical path up front.\n- docs/04-data-use-agreement-template.md: the fill-in DUA + GTM sequence — the artifact that\n  actually unblocks a real deployment (honors the dissent).\n- MERGE: removed the orphan parallel NAUPA duplicate triad (naupa2_fixed/naupa3_xml/\n  test_cycle3) — consolidated to the single pipeline-wired implementation. History retained.\nTests: 11/11 suites green after consolidation.\n\nTK-10097"},{"hash":"d4ba8b0","date":"2026-08-01 21:08:14 -0700","author":"Steve Abrams","subject":"docs: ledger Cycle-10 record (reconciliation); TK-10097","body":""},{"hash":"edfce96","date":"2026-08-01 21:07:53 -0700","author":"Steve Abrams","subject":"Cycle 10: feed-completeness reconciliation (catches silent truncation)","body":"- FeedDefinition.expected_count (state control total; NAUPA trailer in prod); _reconcile()\n  compares parsed (accepted+rejected) vs expected -> ok|short|over|unknown + delta.\n- 'short' is the silent-truncation signal (a transfer that cut off looks 'successful' otherwise).\n  Persisted on ingestion_batch (expected_count + reconciliation cols); batch_reconciliation() reads it.\n- tests/test_cycle11_reconciliation.py: ok/short/over/unknown + persistence.\nTests: 11/11 suites green. All local/synthetic/$0.\n\nTK-10097"},{"hash":"2a43af4","date":"2026-08-01 21:02:03 -0700","author":"Steve Abrams","subject":"docs: ledger Cycle-9 record (outbox worker); TK-10097","body":""},{"hash":"e3a39c3","date":"2026-08-01 21:01:39 -0700","author":"Steve Abrams","subject":"Cycle 9: outbox worker — completes the transactional-outbox pattern","body":"- services/claims/outbox_worker.py: drains pending outbox_event -> StateAdapter with\n  AT-LEAST-ONCE semantics + bounded retry. Transient fail -> stays pending (attempts++);\n  exhausted -> 'failed' (claim NOT lost, stays SUBMITTING for ops); already-SUBMITTED ->\n  treated as idempotent success (no retry loop).\n- schema: outbox_event gains attempts + last_error; SqliteClaimRepository fetch_pending_outbox\n  / mark_outbox / outbox_row.\n- tests/test_cycle10_outbox_worker.py: transient-then-success, no-op re-drain, permanent-fail\n  exhaustion. Now events are not just WRITTEN (Cycle 8) but reliably DELIVERED.\nTests: 10/10 suites green. All local/synthetic/$0.\n\nTK-10097"},{"hash":"e7a163f","date":"2026-08-01 20:56:50 -0700","author":"Steve Abrams","subject":"docs: ledger Cycle-8 record (claims persistence); TK-10097","body":""},{"hash":"c3d81a0","date":"2026-08-01 20:56:28 -0700","author":"Steve Abrams","subject":"Cycle 8: concrete SqliteClaimRepository — claims subsystem runnable on real persistence","body":"- services/claims/sqlite_claim_repo.py implements ClaimRepository against claim_case/\n  claim_event/outbox_event, sharing the SqliteRepository connection (one system-of-record).\n- Closes the last 'runs only on a test fake' gap: the claim lifecycle now persists end-to-end\n  and the C3 idempotency fix is proven against the REAL UNIQUE(claim_id, idempotency_key)\n  constraint (duplicate -> sqlite3.IntegrityError), not an in-memory imitation.\n- tests/test_cycle9_claims_persistence.py: full DRAFT->SUBMITTED_TO_STATE lifecycle, outbox,\n  DB-level idempotency, state-only guard, illegal-transition rejection.\nTests: 9/9 suites green. All local/synthetic/$0.\n\nTK-10097"},{"hash":"afbc9ad","date":"2026-08-01 20:14:17 -0700","author":"Steve Abrams","subject":"docs: ledger Cycle-7 record (suppression path); TK-10097","body":""},{"hash":"3ca22d7","date":"2026-08-01 20:13:56 -0700","author":"Steve Abrams","subject":"Cycle 7: state suppression / reinstatement path (near-real-time takedown)","body":"- SqliteRepository.suppress_property/reinstate_property: flip search_document_state.is_suppressed\n  so a record leaves/returns to anonymous search IMMEDIATELY (masked_search already filters it),\n  while property + owner + version history are fully retained. Every action writes an immutable\n  audit_event; audit_trail() reads it back. Unknown record -> False (no silent success).\n- Closes the brief's near-real-time suppression requirement (privacy/fraud takedown) — the gap\n  where nothing could pull a record from public search. State-authenticated in production.\n- tests/test_cycle8_suppression.py: suppress->gone, data retained, audit written, reinstate->back.\nTests: 8/8 suites green. All local/synthetic/$0.\n\nTK-10097"},{"hash":"02a3ead","date":"2026-08-01 20:10:34 -0700","author":"Steve Abrams","subject":"docs: ledger Cycle-6 record (recall fix); TK-10097","body":""},{"hash":"f74dc2b","date":"2026-08-01 20:10:17 -0700","author":"Steve Abrams","subject":"Cycle 6: apostrophe/hyphen search-recall fix (zero schema change)","body":"- normalize_search(): fully-collapsed alphanumeric key (spaces+punct removed) — CATHERINEONEIL.\n- masked_search matches REPLACE(owner_name_normalized,' ','') LIKE collapsed-query, so 'Oneil'\n  now finds \"O'Neil\" and 'Smith-Jones' variants match. Does NOT widen normalize_text (masks/\n  blocking/phonetic unchanged). Empty-query guard (m2) preserved.\n- tests/test_cycle7_recall.py proves the fix + no-regression.\nTests: 7/7 suites green. All local/synthetic/$0.\n\nTK-10097"},{"hash":"48cadf2","date":"2026-08-01 20:07:34 -0700","author":"Steve Abrams","subject":"docs: ledger Cycle-5 record (NAUPA III + XXE guard); TK-10097","body":""},{"hash":"ac6d777","date":"2026-08-01 20:07:08 -0700","author":"Steve Abrams","subject":"Cycle 5: NAUPA III XML adapter (completes CSV/NAUPA II/III trio) + XXE guard","body":"- services/ingestion/naupa3.py: namespace-tolerant XML parser via the lazy adapter registry\n  (format_name naupa3_v1); same CanonicalProperty as CSV/NAUPA II.\n- SECURITY: rejects any DOCTYPE/ENTITY document (XmlSecurityError) -> closes XXE /\n  billion-laughs entity-expansion at the door before parsing. build_naupa3_xml helper for\n  aligned fixtures (optional default xmlns to exercise namespace tolerance).\n- tests/test_cycle6_naupa3.py: parity, namespace tolerance, XXE refusal, malformed-record\n  reject, idempotency.\n- Logged backlog: apostrophe/hyphen search RECALL (normalize_text collapses ' to space, so\n  LIKE-search misses 'Oneil' for O'Neil; matching unaffected via phonetic key). Prod = OpenSearch analyzers.\nTests: 6/6 suites green. All local/synthetic/$0.\n\nTK-10097"},{"hash":"9a96426","date":"2026-08-01 19:32:10 -0700","author":"Steve Abrams","subject":"docs: ledger Cycle-4 record (search service + real limiter); TK-10097","body":""},{"hash":"bdd1a4b","date":"2026-08-01 19:31:42 -0700","author":"Steve Abrams","subject":"Cycle 4: runnable masked-search service + REAL rate limiter (closes Sec 1.3)","body":"- services/common/rate_limit.py: SlidingWindowRateLimiter (injectable clock, per-key budgets,\n  retry_after). Replaces the require_rate_limit_STUB masquerade — anti-enumeration is now real.\n- services/search/service.py: SearchService composes validate -> rate-limit -> masked_search\n  -> assert_public_safe (fail-closed) so every transport enforces identical privacy controls.\n- services/search/run_local.py: dependency-free stdlib HTTP endpoint ($0). SMOKE-TESTED over\n  real HTTP: 200 masked JSON, 400 empty-query, 429 after budget, /healthz. Single-threaded\n  (SQLite is thread-bound; prod = Postgres pool).\n- tests/test_cycle5_search.py: deterministic (injected clock) proof of masked results, real\n  429 + window refill, empty-query rejection, per-client-key isolation.\nTests: 5/5 suites green. All local/synthetic/$0.\n\nTK-10097"},{"hash":"3d2a81a","date":"2026-08-01 11:36:29 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-01T11:36:26 (2 files) — services/common/rate_limit.py services/search/service.py","body":""},{"hash":"ef78cf7","date":"2026-08-01 11:17:27 -0700","author":"Steve Abrams","subject":"docs: ledger Cycle-3 verification/reconciliation record; TK-10097","body":""},{"hash":"789f72c","date":"2026-08-01 11:16:25 -0700","author":"Steve Abrams","subject":"verify: clean commit passes tripwire","body":""},{"hash":"509f657","date":"2026-08-01 11:16:25 -0700","author":"Steve Abrams","subject":"chore: mark pre-commit-tripwire.sh executable; TK-10097 (hook verified: blocks SSN, exit 1)","body":""},{"hash":"9fbefae","date":"2026-08-01 11:14:35 -0700","author":"Steve Abrams","subject":"Cycle 3: NAUPA II adapter + candidate-blocking + guardrail tripwire + doc reconcile","body":"Product:\n- NAUPA II fixed-width parser via lazy adapter registry (_get_parser); same CanonicalProperty\n  as CSV so dedup/masking/search are format-agnostic. build_naupa2_line keeps fixtures aligned.\n- tests/test_cycle3_naupa_and_blocking.py: NAUPA parity + idempotency + blocking-key bucketing.\nMatching:\n- blocking_keys fairness fix: empty-norm (CJK/Arabic) names now fall through to geo keys so\n  they're never un-indexable; tests/test_cycle4_fairness.py asserts the coverage floor.\nClaims:\n- FIX regression from M1 refactor: complete_state_submission namespaced its transition key\n  (:transition) so it no longer collides with queue's SUBMITTING event (C3-variant, caught\n  by the Cycle-2 regression test).\nGuardrails:\n- scripts/pre-commit-tripwire.sh: blocks SSN-shaped strings + real-feed formats at commit.\nDocs:\n- docs/jurisdictions.json (machine-readable, 50+DC); docs/03 roadmap/budget.\n- RECONCILED docs/03 revenue model from consumer finder-fees -> B2G government-paid, matching\n  the thesis + brief (finder-fee model was explicitly excluded at launch). Fixed data/ -> docs/\n  jurisdictions.json path (data/* is gitignored).\nTests: 4/4 suites green. All local/$0.\n\nTK-10097"},{"hash":"c0f1c68","date":"2026-08-01 11:06:17 -0700","author":"Steve Abrams","subject":"auto-save: 2026-08-01T11:06:15 (4 files) — services/ingestion/ingest.py services/ingestion/naupa2.py tests/test_cycle3_naupa_and_blocking.py tests/test_cycle4_fairness.py","body":""},{"hash":"a02e4b2","date":"2026-08-01 04:26:27 -0700","author":"steve@designerwallcoverings.com","subject":"Cycle 3 complete: blocking_keys, Sec2.5 encryption marker, roadmap doc, 7/7 tests — 4am-loop","body":""},{"hash":"902afd8","date":"2026-08-01 04:13:18 -0700","author":"Steve Abrams","subject":"Cycle 3: NAUPA II/III parsers, jurisdictions.json, pre-commit tripwire, M1+m4 fixes — 15/15 tests pass","body":""},{"hash":"831558d","date":"2026-07-31 15:29:12 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-31T15:29:10 (1 files) — docs/LOOP-LEDGER.md","body":""},{"hash":"527cc26","date":"2026-07-31 14:59:26 -0700","author":"Steve (yoloforever loop)","subject":"docs(marker): Cycle 2 = adversarial-review fixes (see f576a32); TK-10097","body":"Cody+security-auditor+code-reviewer fan-out -> 4 criticals + crown-jewel privacy fix,\nall fixed + regression-tested (tests/test_cycle2_hardening.py, 7/7 pass)."},{"hash":"f576a32","date":"2026-07-31 14:58:44 -0700","author":"Steve Abrams","subject":"auto-save: 2026-07-31T14:58:42 (8 files) — .gitignore services/claims/claim_workflow.py services/common/normalize.py services/common/sqlite_repo.py services/ingestion/ingest.py","body":""},{"hash":"9819a89","date":"2026-07-31 12:27:11 -0700","author":"Steve (yoloforever loop)","subject":"Cycle 1: scaffold national unclaimed-property platform (B2G, synthetic-only)","body":"- Thesis + hard guardrails (no scraping, no real feeds, no autonomous contracting)\n- 50-state + DC acquisition matrix (feed-first, records-request fallback, public handoff)\n- Polyglot architecture + canonical schema (provenance/version non-destructive)\n- Reference services: idempotent NAUPA/CSV ETL, Fellegi-Sunter matcher w/ phonetic key,\n  masked FastAPI search, claim state-machine + transactional outbox\n- Stdlib-only end-to-end smoke test (ingest idempotency + masking + matching) PASSES at $0\n\nTK-10097\n"}]}