Unclaimed Property Platform

repo: ~/Projects/unclaimed-property-platform · 42 commits · 0 in last 24h, 0 in last 7d ·

Search the build

42 commits indexed

  1. 10056f2 2026-08-13 auto-data-snapshot: 2026-08-13T15:04:38 (1 data files) — db/schema.sql
  2. 50995a7 2026-08-07 auto-data-snapshot: 2026-08-07T11:47:33 (2 data files) — db/ca_unclaimed.sqlite-shm db/ca_unclaimed.sqlite-wal
  3. 941205e 2026-08-07 auto-data-snapshot: 2026-08-07T11:14:36 (1 data files) — db/ca_unclaimed.sqlite-wal
  4. c41cc84 2026-08-07 auto-data-snapshot: 2026-08-07T10:41:58 (1 data files) — db/ca_unclaimed.sqlite-wal
  5. 60d2295 2026-08-07 auto-data-snapshot: 2026-08-07T10:09:04 (2 data files) — db/ca_unclaimed.sqlite-shm db/ca_unclaimed.sqlite-wal
  6. 0b2c4c2 2026-08-07 auto-data-snapshot: 2026-08-07T09:37:33 (1 data files) — db/ca_unclaimed.sqlite-wal
  7. 91b20cb 2026-08-07 auto-data-snapshot: 2026-08-07T09:05:06 (2 data files) — db/ca_unclaimed.sqlite-shm db/ca_unclaimed.sqlite-wal
  8. f9cc59e 2026-08-07 auto-data-snapshot: 2026-08-07T08:32:43 (2 data files) — db/ca_unclaimed.sqlite-shm db/ca_unclaimed.sqlite-wal
  9. d8cf6c0 2026-08-07 auto-data-snapshot: 2026-08-07T08:00:20 (2 data files) — db/ca_unclaimed.sqlite-shm db/ca_unclaimed.sqlite-wal
  10. 9f2367a 2026-08-07 ca: masked search UI (serve_ca.py :8799) + disk-safe full-CA fetch-load loop
  11. eeef319 2026-08-07 ingest: CA adapter + streaming loader — real California DB built (3.76M records, $11.1B)
  12. 42ad8e0 2026-08-07 outreach: CA has a free public CSV bulk download — no PRA letter needed (letters become fallback)
  13. 5f6f29b 2026-08-07 outreach: 51-state public-records request generator + CA letter ready
  14. 5d968bc 2026-08-01 chore: v0.1.0 — compile-clean, 11/11 green (session close)
  15. 3b35078 2026-08-01 docs: LOOP CLOSED — Cycle 11 wrap + final state + deferred backlog; TK-10097
  16. 3532e9b 2026-08-01 Cycle 11 (DTD verdict C): packaging + consolidation, then wrap
  17. d4ba8b0 2026-08-01 docs: ledger Cycle-10 record (reconciliation); TK-10097
  18. edfce96 2026-08-01 Cycle 10: feed-completeness reconciliation (catches silent truncation)
  19. 2a43af4 2026-08-01 docs: ledger Cycle-9 record (outbox worker); TK-10097
  20. e3a39c3 2026-08-01 Cycle 9: outbox worker — completes the transactional-outbox pattern
  21. e7a163f 2026-08-01 docs: ledger Cycle-8 record (claims persistence); TK-10097
  22. c3d81a0 2026-08-01 Cycle 8: concrete SqliteClaimRepository — claims subsystem runnable on real persistence
  23. afbc9ad 2026-08-01 docs: ledger Cycle-7 record (suppression path); TK-10097
  24. 3ca22d7 2026-08-01 Cycle 7: state suppression / reinstatement path (near-real-time takedown)
  25. 02a3ead 2026-08-01 docs: ledger Cycle-6 record (recall fix); TK-10097
  26. f74dc2b 2026-08-01 Cycle 6: apostrophe/hyphen search-recall fix (zero schema change)
  27. 48cadf2 2026-08-01 docs: ledger Cycle-5 record (NAUPA III + XXE guard); TK-10097
  28. ac6d777 2026-08-01 Cycle 5: NAUPA III XML adapter (completes CSV/NAUPA II/III trio) + XXE guard
  29. 9a96426 2026-08-01 docs: ledger Cycle-4 record (search service + real limiter); TK-10097
  30. bdd1a4b 2026-08-01 Cycle 4: runnable masked-search service + REAL rate limiter (closes Sec 1.3)
  31. 3d2a81a 2026-08-01 auto-save: 2026-08-01T11:36:26 (2 files) — services/common/rate_limit.py services/search/service.py
  32. ef78cf7 2026-08-01 docs: ledger Cycle-3 verification/reconciliation record; TK-10097
  33. 789f72c 2026-08-01 verify: clean commit passes tripwire
  34. 509f657 2026-08-01 chore: mark pre-commit-tripwire.sh executable; TK-10097 (hook verified: blocks SSN, exit 1)
  35. 9fbefae 2026-08-01 Cycle 3: NAUPA II adapter + candidate-blocking + guardrail tripwire + doc reconcile
  36. c0f1c68 2026-08-01 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
  37. a02e4b2 2026-08-01 Cycle 3 complete: blocking_keys, Sec2.5 encryption marker, roadmap doc, 7/7 tests — 4am-loop
  38. 902afd8 2026-08-01 Cycle 3: NAUPA II/III parsers, jurisdictions.json, pre-commit tripwire, M1+m4 fixes — 15/15 tests pass
  39. 831558d 2026-07-31 auto-save: 2026-07-31T15:29:10 (1 files) — docs/LOOP-LEDGER.md
  40. 527cc26 2026-07-31 docs(marker): Cycle 2 = adversarial-review fixes (see f576a32); TK-10097
  41. f576a32 2026-07-31 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
  42. 9819a89 2026-07-31 Cycle 1: scaffold national unclaimed-property platform (B2G, synthetic-only)

Authors

Agents used

  • security-auditor1
  • code-reviewer1

Skills used

  • /synthetic7
  • /ingestion4
  • /common4
  • /search4
  • /claims3
  • /hyphen2
  • /service2
  • /ingest2
  • /schema1
  • /legal1
  • /reinstate1
  • /zsh1
  • /short1
  • /over1
  • /unknown1
  • /returns1
  • /fraud1
  • /phonetic1
  • /naupa31
  • /healthz1
  • /reconciliation1
  • /masking1
  • /pre-commit-tripwire1
  • /jurisdictions1
  • /budget1
  • /naupa21
  • /normalize1
  • /version1

Creative ideas + design notes

Commits with substantial prose (≥120 chars) — the rationale behind each move.

3532e9b · 2026-08-01 · Cycle 11 (DTD verdict C): packaging + consolidation, then wrap
DTD 5/5 verdict C (CONTINUE/WRAP/PIVOT -> PIVOT to packaging then wrap); Cody dissent (real
blocker is business/legal) folded in as a real DUA template, not dismissed.
- scripts/demo_tour.py: one-command narrated end-to-end tour (ingest 3 formats + reconcile ->
  masked search -> suppress/reinstate -> claim + outbox retry). VERIFIED runs /bin/zsh.
- Makefile: make demo / test / serve / install (one-command front door).
- README.md: rewritten — what works + proof table, 60-second demo, guardrails, repo map,
  and the real critical path up front.
- docs/04-data-use-agreement-template.md: the fill-in DUA + GTM sequence — the artifact that
  actually unblocks a real deployment (honors the dissent).
- MERGE: removed the orphan parallel NAUPA duplicate triad (naupa2_fixed/naupa3_xml/
  test_cycle3) — consolidated to the single pipeline-wired implementation. History retained.
Tests: 11/11 suites green after consolidation.

TK-10097
edfce96 · 2026-08-01 · Cycle 10: feed-completeness reconciliation (catches silent truncation)
- FeedDefinition.expected_count (state control total; NAUPA trailer in prod); _reconcile()
  compares parsed (accepted+rejected) vs expected -> ok|short|over|unknown + delta.
- 'short' is the silent-truncation signal (a transfer that cut off looks 'successful' otherwise).
  Persisted on ingestion_batch (expected_count + reconciliation cols); batch_reconciliation() reads it.
- tests/test_cycle11_reconciliation.py: ok/short/over/unknown + persistence.
Tests: 11/11 suites green. All local/synthetic/$0.

TK-10097
e3a39c3 · 2026-08-01 · Cycle 9: outbox worker — completes the transactional-outbox pattern
- services/claims/outbox_worker.py: drains pending outbox_event -> StateAdapter with
  AT-LEAST-ONCE semantics + bounded retry. Transient fail -> stays pending (attempts++);
  exhausted -> 'failed' (claim NOT lost, stays SUBMITTING for ops); already-SUBMITTED ->
  treated as idempotent success (no retry loop).
- schema: outbox_event gains attempts + last_error; SqliteClaimRepository fetch_pending_outbox
  / mark_outbox / outbox_row.
- tests/test_cycle10_outbox_worker.py: transient-then-success, no-op re-drain, permanent-fail
  exhaustion. Now events are not just WRITTEN (Cycle 8) but reliably DELIVERED.
Tests: 10/10 suites green. All local/synthetic/$0.

TK-10097
c3d81a0 · 2026-08-01 · Cycle 8: concrete SqliteClaimRepository — claims subsystem runnable on real persistence
- services/claims/sqlite_claim_repo.py implements ClaimRepository against claim_case/
  claim_event/outbox_event, sharing the SqliteRepository connection (one system-of-record).
- Closes the last 'runs only on a test fake' gap: the claim lifecycle now persists end-to-end
  and the C3 idempotency fix is proven against the REAL UNIQUE(claim_id, idempotency_key)
  constraint (duplicate -> sqlite3.IntegrityError), not an in-memory imitation.
- tests/test_cycle9_claims_persistence.py: full DRAFT->SUBMITTED_TO_STATE lifecycle, outbox,
  DB-level idempotency, state-only guard, illegal-transition rejection.
Tests: 9/9 suites green. All local/synthetic/$0.

TK-10097
3ca22d7 · 2026-08-01 · Cycle 7: state suppression / reinstatement path (near-real-time takedown)
- SqliteRepository.suppress_property/reinstate_property: flip search_document_state.is_suppressed
  so a record leaves/returns to anonymous search IMMEDIATELY (masked_search already filters it),
  while property + owner + version history are fully retained. Every action writes an immutable
  audit_event; audit_trail() reads it back. Unknown record -> False (no silent success).
- Closes the brief's near-real-time suppression requirement (privacy/fraud takedown) — the gap
  where nothing could pull a record from public search. State-authenticated in production.
- tests/test_cycle8_suppression.py: suppress->gone, data retained, audit written, reinstate->back.
Tests: 8/8 suites green. All local/synthetic/$0.

TK-10097
f74dc2b · 2026-08-01 · Cycle 6: apostrophe/hyphen search-recall fix (zero schema change)
- normalize_search(): fully-collapsed alphanumeric key (spaces+punct removed) — CATHERINEONEIL.
- masked_search matches REPLACE(owner_name_normalized,' ','') LIKE collapsed-query, so 'Oneil'
  now finds "O'Neil" and 'Smith-Jones' variants match. Does NOT widen normalize_text (masks/
  blocking/phonetic unchanged). Empty-query guard (m2) preserved.
- tests/test_cycle7_recall.py proves the fix + no-regression.
Tests: 7/7 suites green. All local/synthetic/$0.

TK-10097
ac6d777 · 2026-08-01 · Cycle 5: NAUPA III XML adapter (completes CSV/NAUPA II/III trio) + XXE guard
- services/ingestion/naupa3.py: namespace-tolerant XML parser via the lazy adapter registry
  (format_name naupa3_v1); same CanonicalProperty as CSV/NAUPA II.
- SECURITY: rejects any DOCTYPE/ENTITY document (XmlSecurityError) -> closes XXE /
  billion-laughs entity-expansion at the door before parsing. build_naupa3_xml helper for
  aligned fixtures (optional default xmlns to exercise namespace tolerance).
- tests/test_cycle6_naupa3.py: parity, namespace tolerance, XXE refusal, malformed-record
  reject, idempotency.
- Logged backlog: apostrophe/hyphen search RECALL (normalize_text collapses ' to space, so
  LIKE-search misses 'Oneil' for O'Neil; matching unaffected via phonetic key). Prod = OpenSearch analyzers.
Tests: 6/6 suites green. All local/synthetic/$0.

TK-10097
bdd1a4b · 2026-08-01 · Cycle 4: runnable masked-search service + REAL rate limiter (closes Sec 1.3)
- services/common/rate_limit.py: SlidingWindowRateLimiter (injectable clock, per-key budgets,
  retry_after). Replaces the require_rate_limit_STUB masquerade — anti-enumeration is now real.
- services/search/service.py: SearchService composes validate -> rate-limit -> masked_search
  -> assert_public_safe (fail-closed) so every transport enforces identical privacy controls.
- services/search/run_local.py: dependency-free stdlib HTTP endpoint ($0). SMOKE-TESTED over
  real HTTP: 200 masked JSON, 400 empty-query, 429 after budget, /healthz. Single-threaded
  (SQLite is thread-bound; prod = Postgres pool).
- tests/test_cycle5_search.py: deterministic (injected clock) proof of masked results, real
  429 + window refill, empty-query rejection, per-client-key isolation.
Tests: 5/5 suites green. All local/synthetic/$0.

TK-10097
9fbefae · 2026-08-01 · Cycle 3: NAUPA II adapter + candidate-blocking + guardrail tripwire + doc reconcile
Product:
- NAUPA II fixed-width parser via lazy adapter registry (_get_parser); same CanonicalProperty
  as CSV so dedup/masking/search are format-agnostic. build_naupa2_line keeps fixtures aligned.
- tests/test_cycle3_naupa_and_blocking.py: NAUPA parity + idempotency + blocking-key bucketing.
Matching:
- blocking_keys fairness fix: empty-norm (CJK/Arabic) names now fall through to geo keys so
  they're never un-indexable; tests/test_cycle4_fairness.py asserts the coverage floor.
Claims:
- FIX regression from M1 refactor: complete_state_submission namespaced its transition key
  (:transition) so it no longer collides with queue's SUBMITTING event (C3-variant, caught
  by the Cycle-2 regression test).
Guardrails:
- scripts/pre-commit-tripwire.sh: blocks SSN-shaped strings + real-feed formats at commit.
Docs:
- docs/jurisdictions.json (machine-readable, 50+DC); docs/03 roadmap/budget.
- RECONCILED docs/03 revenue model from consumer finder-fees -> B2G government-paid, matching
  the thesis + brief (finder-fee model was explicitly excluded at launch). Fixed data/ -> docs/
  jurisdictions.json path (data/* is gitignored).
Tests: 4/4 suites green. All local/$0.

TK-10097
527cc26 · 2026-07-31 · docs(marker): Cycle 2 = adversarial-review fixes (see f576a32); TK-10097
Cody+security-auditor+code-reviewer fan-out -> 4 criticals + crown-jewel privacy fix,
all fixed + regression-tested (tests/test_cycle2_hardening.py, 7/7 pass).
9819a89 · 2026-07-31 · Cycle 1: scaffold national unclaimed-property platform (B2G, synthetic-only)
- Thesis + hard guardrails (no scraping, no real feeds, no autonomous contracting)
- 50-state + DC acquisition matrix (feed-first, records-request fallback, public handoff)
- Polyglot architecture + canonical schema (provenance/version non-destructive)
- Reference services: idempotent NAUPA/CSV ETL, Fellegi-Sunter matcher w/ phonetic key,
  masked FastAPI search, claim state-machine + transactional outbox
- Stdlib-only end-to-end smoke test (ingest idempotency + masking + matching) PASSES at $0

TK-10097

File tree

107 files tracked. Click any to browse the source at HEAD.

Other build journals

← Twil Golive 2026 07  ·  all 4 projects  ·  Ungate Console →

Export

commits.csv · feed.atom · project.json · commits.json

rendered in 1ms