arborist/aborist
russell@unturf.com bd576fda13
qa: title-purity rerank + 6th hard check (CITATION_MISMATCH)
Two layered fixes that close the lazy-anchor gap. Title-purity
moves the right SOURCES to the top of retrieval; the new hard
check makes the verifier ruthlessly honest about whether each
cited chunk actually mentions what its claim says.

1. _rerank_by_title_purity. New stage at the end of _rerank().
   purity = |title_tokens ∩ query_tokens| / |title_tokens|; score
   multiplied by (1 + 2*purity), so a title that IS the topic
   ("Jurassic Park (film)" against the dinosaur question) gets
   3.0x and titles that drag in off-topic tokens like
   "Jurassic Park: Operation Genesis" only get 2.0x. Composes
   with the role-rank weights from the prior commit. Florida
   query: list-pages dropped out of top-8 entirely. JP-dinosaurs
   query: Operation Genesis sank from #4 to #8.

2. CITATION_MISMATCH hard check. Sixth deterministic check in
   verify_claim_lattice — for each (claim, pointer) pair, at
   least one content token from the claim text must textually
   appear in the cited evidence span. Lexical only, no NER, no
   embeddings; same _content_tokens extractor as the spotlight
   so the proof-path stays on the soft/hard boundary. Catches
   the magnet-chunk lazy-anchor where the model cites a chunk
   whose text contains zero overlap with what its claim asserts.

   New status CITATION_MISMATCH joins the per-claim taxonomy.
   New violation kind CITATION_MISMATCH joins the run-DAG verify
   payload. JP-dinosaurs verdict went from "13/14 verified
   ratio 0.77 (cite E13 for everything)" pre-check to "1/14
   verified" post-check — only Tyrannosaurus Rex's claim
   actually overlapped its cited chunk. The architecture
   stopped lying about evidence-linkage that the cited spans
   don't textually support.

   Pure-stopword claims pass the overlap check vacuously (no
   content tokens means nothing to check against) — other hard
   checks own that case.

Tests: +3 covering CITATION_MISMATCH (claim-token absent yields
fail, partial overlap yields HYBRID with EVIDENCE_LINKED_PARTIAL,
pure-stopword claim passes vacuously). Updated 7 prior tests
that used colloquial stub claims ("Trex") which don't textually
appear in the sample spans ("Tyrannosaurus rex"); they now use
claim text that overlaps the source content. 445 tests passing,
all 7 production shards report 0 chain breaks.
2026-04-29 21:57:37 -04:00
..
distill storage cheats + TF-IDF retrieval fix 2026-04-27 17:24:51 -04:00
mesh mesh: per-peer audit chain-of-claims tracking on the wire 2026-04-28 19:41:25 -04:00
qa qa: title-purity rerank + 6th hard check (CITATION_MISMATCH) 2026-04-29 21:57:37 -04:00
search verify: layered strategies + entity policies, rename VISUAL → UNGROUNDED 2026-04-28 16:58:31 -04:00
sources crawler: skip feeds + sitemaps at ingest (they're discovery, not knowledge) 2026-04-29 05:55:28 -04:00
__init__.py phase 0 explore: aborist core + sources + distill + evict 2026-04-27 07:53:18 -04:00
cli.py qa: positive-form prompts + source-role rank boost + smell-line floor 2026-04-29 21:42:35 -04:00
compress.py storage cheats + TF-IDF retrieval fix 2026-04-27 17:24:51 -04:00
document.py phase 0 explore: aborist core + sources + distill + evict 2026-04-27 07:53:18 -04:00
evict.py storage cheats + TF-IDF retrieval fix 2026-04-27 17:24:51 -04:00
ingest.py storage cheats + TF-IDF retrieval fix 2026-04-27 17:24:51 -04:00
merkle.py phase 0 explore: aborist core + sources + distill + evict 2026-04-27 07:53:18 -04:00
progress.py progress reporter + structured benchmark 2026-04-27 11:37:20 -04:00
snapshot.py add corpus-level snapshots: single-hash identity for the forest 2026-04-27 21:29:10 -04:00
source.py phase 0 explore: aborist core + sources + distill + evict 2026-04-27 07:53:18 -04:00
store.py qa: G0 claim-lattice-pointer answer mode — CTI quote-by-pointer 2026-04-29 21:19:19 -04:00
wikitext.py verify: strip wikitext from context before substring matching 2026-04-28 15:48:07 -04:00