← back to Unclaimed Property Platform
docs: ledger Cycle-5 record (NAUPA III + XXE guard); TK-10097
48cadf2bf2b5c4ca51a2ef26b7a54397ecddd83a · 2026-08-01 20:07:34 -0700 · Steve Abrams
Files touched
Diff
commit 48cadf2bf2b5c4ca51a2ef26b7a54397ecddd83a
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Sat Aug 1 20:07:34 2026 -0700
docs: ledger Cycle-5 record (NAUPA III + XXE guard); TK-10097
---
docs/LOOP-LEDGER.md | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/docs/LOOP-LEDGER.md b/docs/LOOP-LEDGER.md
index 4d05254..1f5043e 100644
--- a/docs/LOOP-LEDGER.md
+++ b/docs/LOOP-LEDGER.md
@@ -74,8 +74,19 @@ the search path (healthz/400/429 masked it since they don't hit the DB). Caught
test, switched to single-threaded HTTPServer, re-verified. Classic "the happy path that
doesn't touch the resource hides the bug."
-## Cycle 5 — planned (DTD to select at next fire)
-- NAUPA III XML adapter → the last format (namespace-tolerant, streaming, reject-log).
+## Cycle 5 — COMPLETE (commit ac6d777; 6/6 suites green)
+**Landed (all local/synthetic/$0):**
+- `services/ingestion/naupa3.py` — NAUPA III XML adapter, namespace-tolerant, via the lazy
+ registry (naupa3_v1). **Completes the CSV / NAUPA II / NAUPA III trio** through one pipeline.
+- **SECURITY:** rejects any DOCTYPE/ENTITY doc (XmlSecurityError) → XXE / billion-laughs closed.
+- `tests/test_cycle6_naupa3.py` — parity, namespace tolerance, XXE refusal, malformed reject, idempotency.
+**Verify note:** test initially failed searching "Oneil" — `normalize_text` collapses the
+apostrophe in "O'Neil" to a space ("O NEIL"), a real search-RECALL gap for apostrophe/hyphen
+names. Matching is unaffected (phonetic key links O'Neil↔ONeill). Logged below; fixed test.
+
+## Cycle 6 — planned (DTD to select at next fire)
+- Apostrophe/hyphen search RECALL: OpenSearch-style analyzer or a punctuation-stripped search
+ key alongside the space-collapsed one (don't widen normalize_text globally).
- Double Metaphone phonetic upgrade for international name recall (fairness; Phase 2).
- SQLite → Postgres persistence scaffold (thread-safe pool — enables the threaded server).
- Batch-retry for partial C1 failure (idempotent re-run from last-good offset).
← ac6d777 Cycle 5: NAUPA III XML adapter (completes CSV/NAUPA II/III t
·
back to Unclaimed Property Platform
·
Cycle 6: apostrophe/hyphen search-recall fix (zero schema ch f74dc2b →