arborist/arborist
russell@unturf.com a3ac6539c1
feat(retrieval): numeral-fold (ordinal-word <-> Roman) + mined ground-truth eval instrument
The first MEASURED, above-noise retrieval win this thread. The 75-q
n=3 audit_mode bench couldn't resolve any single lever (every failure
class <=3-5 q, sub the 5pp floor — four hypotheses died there). Fix
the instrument, not just the lever:

- bench/mine_questions.py + bench/recall_at_k.py: mine questions from
  corpus titles (ground-truth target known by construction), grade by
  deterministic retrieval recall@k via `query --dry-run` — no LLM, no
  verifier, no n=3 noise, scalable to the 22K-deep numeral pool. The
  curated qa_questions.txt stays the separate verifier-honesty/trap
  gate; mined fixtures measure the answerable long tail per class.

- _numeral_fold_variants in query.py: ordinal-word ("Alexander the
  second") <-> multi-char Roman ("Alexander II"), additive+symmetric,
  unioned into _title_query_tokens exactly like _hyphen_fold_variants
  (#000007). Strict 2..40 Roman set → no English-word collision;
  single-char Romans (I/V/X) intentionally out of scope (universal
  len>1 token filter — stated before building, ~4 of 10 residual
  misses).

Measured on the mined numeral fixture: recall@8 22/40 (55%) -> 30/40
(75%), +20pp; 20 hits now rank-1. Discipline applied end to end:
measured-first, mirrored precedent, full-suite regression run (2482
passed, 0 regressions — numeral-fold is hot-path in
_title_query_tokens), real-path test (FakeSource->ingest->query()->
real _Hit, not a hand-built object), measured-after on a noise-free
instrument. The ~6 multi-char residual misses are a different
downstream cause the instrument now exposes for future iteration.
2026-05-18 15:16:10 -04:00
..
capital capital: land ticket #000020 (8-capital-form cost ledger) 2026-05-07 16:41:48 -04:00
concepts #000054 Phase 2: synonym_expand cap-aware + strict view + retrieval-route surfacing 2026-05-13 10:23:36 -04:00
distill capital: land ticket #000020 (8-capital-form cost ledger) 2026-05-07 16:41:48 -04:00
memory memory: land ticket #000017 (memory-root lifelong learning summary) 2026-05-07 16:46:41 -04:00
mesh modified: CLAUDE.md 2026-05-07 09:24:46 -04:00
pi_star ticket #000032: combinatorics@v1 π* (pure-integer counting kernel) 2026-05-09 13:20:29 -04:00
qa feat(retrieval): numeral-fold (ordinal-word <-> Roman) + mined ground-truth eval instrument 2026-05-18 15:16:10 -04:00
search ticket #000039: --quant {float32,int8} + int8 head-to-head 2026-05-11 13:16:51 -04:00
selfmodel selfmodel: land ticket #000014 (identity record + falsification) 2026-05-07 16:36:34 -04:00
sources ticket #000031 follow-ups B-1 + B-2: alias attribution + source-side title author 2026-05-10 09:35:49 -04:00
substrate #000047 — close: delta_aggregator knob on ForkScore (Option D) 2026-05-11 08:27:38 -04:00
world #000013 closed: v7-W spatial-temporal substrate paper + namespace 2026-05-09 15:00:05 -04:00
__init__.py modified: CLAUDE.md 2026-05-07 09:24:46 -04:00
cli.py feat: cross-language Q&A (Operation Sandwich) + Windows quickstart — all default-OFF 2026-05-18 12:12:23 -04:00
compress.py modified: CLAUDE.md 2026-05-07 09:24:46 -04:00
document.py modified: CLAUDE.md 2026-05-07 09:24:46 -04:00
evict.py docs: clear all 39 cold-build Sphinx warnings (truly green) 2026-05-09 18:00:15 -04:00
ingest.py loss_report: land ticket #000022 (adapter LossReport sidecar) 2026-05-07 17:58:50 -04:00
journal.py modified: CLAUDE.md 2026-05-07 09:24:46 -04:00
merkle.py modified: CLAUDE.md 2026-05-07 09:24:46 -04:00
progress.py modified: CLAUDE.md 2026-05-07 09:24:46 -04:00
snapshot.py modified: CLAUDE.md 2026-05-07 09:24:46 -04:00
source.py modified: CLAUDE.md 2026-05-07 09:24:46 -04:00
store.py store: append_audit atomic head-read+insert — no audit-chain forks 2026-05-11 08:29:57 -04:00
wikitext.py loss_report: land ticket #000022 (adapter LossReport sidecar) 2026-05-07 17:58:50 -04:00