memory: snapshot — crown-recall arc CLOSED at b185 (identity-anchor enrichment, 79%->12%)

The crown-recall investigation resolved: worldtree-dev's b185 rerank-input identity-anchor
enrichment closed the class (lexical_recall_gate --anchor crown --runs=8: 79% post-fold ->
12% miss, 0% knife-edge, item @rank 0). Floor packet stays shut (concurred); the 12%
residual is bare-query formulation — the shared prompt-side ceiling (with #397's 47%
adoption). WT #400 closes on brokkr's no-harm post-half. Memory-only snapshot — no bump.
This commit is contained in:
2026-08-08 15:28:09 -07:00
parent 7b8ca04a6b
commit 93011dc353
+2 -1
View File
@@ -47,7 +47,7 @@ upstream API key stays server-side (INV-003).
_As of 2026-08-07:_
**✅ CROWN-RECALL investigation → a RETRIEVAL-CLASS limitation; gate shipped; awaiting deploy pre/post (this session).** Operator: "shouldn't Donut know about her crown?" Traced (with worldtree-dev, thread `01KZETD98T` / WT **#400**) to a GENERAL retrieval property — NOT persona, extraction, or synonymy: an exact-lexical match on an INDEXED surface form ("Crown of the Sepsis Whore", chunks `ch11_s022_c04`/`ch11_s023_c01` — literally contain "crown") loses to dense-semantic neighbors (the Donut-vanity cluster) on ownership-phrased queries. Three mechanisms (worldtree-dev decomposition vs a pulled index): (1) BM25 tokenizer has **no stemming** → "crowns"≠"crown" (plural miss); (2) RRF arithmetic parks single-arm-strong rows on the top-10 **knife edge** (fused rank 9-11); (3) the **reranker** prefers status chunks for ownership phrasings. **Operator-greenlit evidence-gated sequence:** ship the stemming fold (fixes the plural CLASS — crowns/swords/potions, runtime, re-runs R42 floor bracketed) + measure the residual + **HOLD the `rerank_hybrid_floor` lever** until the gate reports a real-world miss-rate. **Consumer deliverable: `docs/diagnostics/lexical_recall_gate.py`** — class acceptance instrument (stress vs control anchors; binary = a natural query serves ≥1 term-containing chunk in top-10; knife-edge≥8; real-world end-to-end + `--runs` samples query-formulation variance). **Pre-fold baseline (the "before"): control 0% miss / stress[crown] 100% miss / 0% knife-edge, 11 trials.** PENDING: worldtree-dev pings on the fold+#397 deploy → run pre/post at higher `--runs`, drop the stress-class miss-rate delta on #400 = the number that rules the floor lever in/out (decided alongside brokkr's fleet demotion rate — two independent instruments). Sibling items from this thread: **WT #399** (expose rerank-relevance in served results — FILED), **WT #397** (`order_by=chapter`) **DEPLOYED b184 + gate shipped** (`docs/diagnostics/temporal_order_gate.py`): mechanism works cleanly (monotone-when-flag-applied **100%** / relevance-baseline **0%**); residual is **ADOPTION** — the agent invokes the flag only **~47%** of temporal turns. **Cross-cutting theme:** both the crown (query-expansion) and #397 (order_by) have the SAME residual class — a schema-taught retrieval mechanism that WORKS when invoked but is invoked variably; the irreducible prompt-side gap neither a floor nor a flag closes.
Post-fold crown update: the fold shipped + works (BM25 #0-2 everywhere), post-fold gate = **79% stress miss** (fired the operator's evidence-gated trigger), attribution = **rerank-cut** (rows reach the window, reranker buries them)`rerank_hybrid_floor` **floor:1** is the lever; operator packet (benefit/lever + R43 cost + one decision) assembling, awaits brokkr's post-deploy readings. Explicitly NOT a persona fix (operator rejected fact-stashing) and NOT a synonym band-aid (operator rejected overfitting the symptom).
Post-fold crown update: the fold shipped + works (BM25 #0-2 everywhere), post-fold gate = **79% stress miss** (fired the operator's evidence-gated trigger), attribution = **rerank-cut** (rows reach the window, reranker buries them). **RESOLVED at b185: worldtree-dev shipped an identity-anchor rerank-input enrichment (`50ecec7`, chain-wide tie-determinism) INSTEAD OF the floor lever; our gate verdict = crown stress miss 79%→12% (n=24), item now serves predominantly @rank 0, knife-edge 0%.** The class is CLOSED — the `rerank_hybrid_floor` packet does NOT reopen. The 12% residual is degenerate bare-query formulation (the shared prompt-side adoption/formulation ceiling, same class as #397's 47% adoption — irreducible from the retrieval side). ARC COMPLETE + CONCURRED both sides (worldtree-dev: floor packet stays shut, verdict banked on #400); #400 closes on brokkr's no-harm post-half. Bonus: the tie-determinism rider is live-confirmed (swinginess collapsed), so the gate is now sharper — any future run-to-run movement on ANY class = service-numerics by elimination. Upstream tail only = b185 promotion beyond personal/demo. Explicitly NOT a persona fix (operator rejected fact-stashing) and NOT a synonym band-aid (operator rejected overfitting the symptom).
**✅ TTS MIGRATED off Zonos → chatterbox-fast (this session; COMMITTED, not pushed).** `tts.py` repointed from the Zonos gateway (:8890 `/v1/audio/speech`) to **chatterbox-fast** (`http://10.100.79.3:8197/tts` — bespoke non-OpenAI `{text,voice,format,stream}` schema, no auth, 24kHz, infra-ops-verified against image `local/chatterbox-fast:v1`). Three subsystems DELETED: (1) **affect** — Turbo has no emotion knob, so `PadState`/`EmotionDials`/`pad_to_dials` + `/api/tts` `p`/`a` fields + browser `pad` arg are gone (DEC-7 retired; operator-directed "drop it for chatterbox"); (2) **client-side chunking** — no per-synth cap (gateway chunks internally), so `chunk_text`/`tts_stream_long`/`_pcm_after_header` gone, one `tts_stream` call voices a whole turn (DEC-10 retired, the mid-stream `yielded_any` degrade folded into `tts_stream`); (3) **language pin** — English-only, no `language` field (DEC-9 re-purposed, below). **Browser SR 44100→24000** (load-bearing correctness fix). Default voice `Cora``glados_25s`; `donut` registered lowercase at `/refs/donut.wav`. 518 suite green, live-smoked (real 24kHz synth + endpoint proxy + bounced `ratatoskr-web`). Contract `donut_voiced_interview.contract.md` amended (migration banner; DEC-1/3/8 amended; DEC-7/9/10 retired w/ historical notes). `tts.py` is the single swap seam; `RATATOSKR_TTS_URL` overrides (no env pin, uses the code default).
@@ -200,6 +200,7 @@ relational-dynamics verify (bind `--bifrost-url :8392`); WT #356 resume-durabili
Chronological log of decisions with `[YYYY-MM-DD]` prefix. One line per
decision. Captures rationale that won't be obvious from code alone.
- `[2026-08-08]` **Crown-recall RESOLVED at b185 — identity-anchor rerank enrichment closed the class (gate: 79%→12% stress miss).** worldtree-dev shipped a rerank-input identity anchor (from character/terms metadata) + chain-wide tie-determinism (`50ecec7`) instead of the floor lever; `lexical_recall_gate --anchor crown --runs=8` at b185 = 12% miss / 0% knife-edge / item @rank 0 (vs 79% post-fold b184). Floor packet does NOT reopen; 12% residual = bare-query formulation ceiling. Arc complete our side; efficacy delta on WT #400.
- `[2026-08-07]` **Crown-recall traced to a general RETRIEVAL-CLASS limitation (exact-lexical match on an indexed surface form buried by dense-semantic neighbors), NOT persona/extraction/synonymy.** worldtree-dev decomposition (WT #400): no-stemming tokenizer + RRF top-10 knife-edge + reranker ownership-demotion. Operator-greenlit evidence-gated sequence (ship stemming fold → gate measures residual → hold `rerank_hybrid_floor` lever). Shipped `docs/diagnostics/lexical_recall_gate.py` (class acceptance instrument); pre-fold baseline control 0% / stress[crown] 100% miss. Awaiting worldtree-dev fold+#397 deploy ping for the pre/post delta. Thread `01KZETD98T`; siblings WT #399 (filed), #397 (committed, not deployed).
- `[2026-08-07]` **TTS migrated Zonos→chatterbox-fast (`:8197` bespoke schema); affect DROPPED (Turbo has no emotion knob, operator "drop it for chatterbox"), client-chunking DROPPED (no per-synth cap), language pin DROPPED, browser SR 44100→24000.** Pushed `19b499a`. English "German drift" real cause (after 2 wrong hypotheses) = Turbo model OVER-RUNS its generation TAIL on long single generations (garble in final ~2-3s, ZCR 1.58x); **fixed SERVER-SIDE by infra-ops (`max_chunk_chars=250`, image :v2, operator ear-confirmed).** Consumer: **REVERTED my interim `top_k/top_p/temp` curbs** (they made it WORSE — pulled garble onset earlier), send full text + default sampling; KEPT the `/api/tts` empty-200→503 guard as hygiene. Contract `donut_voiced_interview.contract.md` amended. Loop closed.
- `[2026-08-07]` **order_by=chapter tool flag → FILED as Worldtree #397 (DEFERRED to next session's contract pass).** Narrative/temporal-query gap ("first encounter in the dungeon"): `reference_knowledge` sorts by relevance not chronology; `provenance.chapter` is on every chunk but the consumer can't reorder native results (kb_bridge retired). Operator ruled the upstream sort flag the clean fix; worldtree-dev accepted, our fixture is the measurement instrument. Tracked at **Worldtree #397** (+ althing thread `01KZED2T3XHJ2WMS5NCYK42W6R`).