[object Object]

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