arborist/aborist
russell@unturf.com 933a4f4752
qa: 3-mode bench, HTTP retry, trim-and-verify, doc snapshot
Three-way QA-quality bench (quote / pointer / JSON) over an expanded
22-question set × 3 samples = 198 LLM calls. Findings landed in
docs/qa-modes-bench-2026-04-30.md with per-question breakdown and
roadmap. Aggregate at bench time:

  quote                  31S 20H 15U  0e   strict-rate 47%   7.7s
  claim_lattice_pointer  14S 34H 18U  0e   strict-rate 21%   4.4s
  claim_lattice (JSON)   26S 12H  9U 19e   strict-rate 39%*  4.4s

The 19 JSON-mode "errors" turned out to be HTTP 502 from vLLM upstream,
not parse failures — clustered, all on the JSON-mode pass, plausibly
correlated with `guided_json` stressing the grammar engine.

Two improvements based on findings:

(1) OpenAICompatibleClient grew retry on transient 502/503/504 with
    exponential backoff (0.5/1/2s, 3 attempts default). Network-layer
    errors (ConnectError, ReadTimeout, RemoteProtocolError) get the
    same retry. Smooths over the cluster without changing semantics:
    persistent failures still raise, transient bursts no longer
    dominate the error column. Helps all modes; JSON benefits most.

(2) Pointer-cap behavior changed from hard SCHEMA_INVALID to
    trim-and-verify. When `[E2,...,E14]` over-cites a single claim,
    keep first N pointers, verify normally, record
    POINTER_OVERFLOW_TRIMMED in violations. STRICT becomes unreachable
    (audit_mode caps at HYBRID) so the over-cite pattern stays
    surfaced — but a correct claim like "Leonardo da Vinci painted
    the Mona Lisa." no longer gets nuked for cosmetic over-citation.
    Pre-fix: pointer mode hit 0/3 STRICT on Mona Lisa (mega-bracket
    triggered SCHEMA_INVALID). Post-fix: HYBRID 2/14 with the right
    answer rendered alongside both kept source spans. The dropped
    pointers count toward n_quotes so the denominator surfaces the
    over-cite to the auditor.

Bench scaffolding: ANSWER_MODES tuple now includes "claim_lattice"
(JSON), Makefile default sweeps all three. Question set expanded
from 8 to 22 covering narrow factoid, broad descriptive, entity
list, relationship, comparison, niche, adversarial, out-of-corpus.

460 tests pass. Connecticut output stays clean (HYBRID 4/7); JP-
dinosaurs pointer mode still UNGROUNDED via the bare-name guard
(model emits one-token entity names, the right floor catches them).
2026-04-30 14:40:57 -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: 3-mode bench, HTTP retry, trim-and-verify, doc snapshot 2026-04-30 14:40:57 -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 cli: surface answer_mode=claim_lattice on ask/query (JSON variant) 2026-04-30 12:37:49 -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