4.3 KiB
[2026-07-15/16] person-prime scan build — SHIPPED + DEPLOYED + LIVE-VERIFIED (v0.20.14)
The "last push": fix Sindra not remembering Vuong's name across sessions.
Root cause (worldtree-dev)
WT injects a recalled fact only if combined score (sim×salience) ≥ 0.45
(auto_inject_combined_score_threshold, core/memory/context_promotion/config.py),
and recall is per-turn query-gated → moderate-sim durable facts (name hit ~0.40)
never inject. Designed turn-0 fix = WT #349 person-prime: a query-LESS
top-N-by-recency durable-fact injection, capability-gated on the store advertising
updated_at in sort_fields at the Bifrost handshake — DARK for our provider until now.
Fix (ZERO Worldtree change): implement the sorted scan verb + advertise the cap.
What shipped (6 commits, v0.20.11 → v0.20.14; suite 639 green throughout)
8fc757av0.20.11 —scanverb +sortable_chunk_fieldscap. Query-LESS, LIVE-only (INV-009: superseded/tombstoned excluded server-side), globally-ordered- before-pagination by indexedupdated_at(INV-010), sort dispatch-gated. Offset cursor with ahas_morepeek (no empty trailing page = reference-parity). TDD 7/7 incl.parity_vs_reference#195. NUANCE resolved: bifrost'sInMemoryMemoryStoreREADSupdated_at(never stamps it) — identical to ours; ref does NOT lifecycle- filter so parity is over the live set only.a9c521av0.20.12 — Sindra holodesk first-message preset (split out of the soong-lab redefine as its own concern).25ccb5cv0.20.13 — heid-bug-hunt fix: a truthy non-dictsort("updated_at"/["updated_at"]/int) hit(sort or {}).get(...)→ AttributeError instead of InvalidArguments. Added isinstance guard (Gróa#1/Hulda#2 confirmed).8199774— contract: marked the offset cursor v1-provisional / KNOWN DEVIATION (see 2026-07-16-bifrost-cursor-conformance).f46ccbav0.20.14 — THE DEPLOY-BREAKER (see Tried/abandoned): advertisedsortable_chunk_fields=[{"name":"updated_at"}]WITHOUTtype→ bifrosthandshake_responseSortableChunkFieldrequires BOTH name+type (additionalProperties:false) → whole bind broke. Fixed → add"type":"timestamp"- regression guard in the caps test.
heid-bug-hunt triage (panel Gróa/Hulda/Regin, thread 01KXK5XTYHV8TGEDRAZV8GRXWC)
FIXED: non-dict sort (v0.20.13). SURFACED→operator: offset-cursor cross-page dup/drop (→ became the bifrost cursor arc). NOTED (reference-parity/accept-known-risk, no fork): full-table materialize-then-Python-filter (matches ref's O(store) iteration), unbound limit, falsy scope coercion, lexical timestamp ordering. REFUTED: Regin's mixed-type ORDER BY "crash" (SQLite orders by storage class, doesn't raise) + its self-retracted None item.
Deploy + live verify (2026-07-15, operator-authorized)
Restarted BOTH :8392 combined provider + :8765 web on the new code via the env-
preserving scratchpad/relaunch_by_pid.py <pid> (captures /proc cmdline+environ+cwd →
byte-identical config; self-daemonizes). Added the missing REQUIRED
RATATOSKR_MEMORY_EMBEDDING_DIM=1024 to env.sh.
Drove a bound Sindra turn (ratatoskr --new --agent ratatoskr:sindra --send … --bifrost-url http://10.100.10.50:8392 --end-user-id ratatoskr-tui):
- GATE LIT + scan fired ONCE at turn 1 with worldtree-dev's exact args
(
scope_all={end_user:ratatoskr-tui} cursor=null limit=3 sort={updated_at,desc}) → 3 records in ~5ms (no 500ms fail-open). Injection confirmed in Sindra's CoT. - Cross-session recognition WORKS — she recalls Vuong as a distinct person + his patterns. The blank-slate problem is SOLVED.
- BUT name-recall FAILS —
"Name is Vuong."is the OLDEST chunk (07:09) → excluded from top-3-by-recency AND scores 0.354 (sub-0.45) on the query path → injects via NEITHER; meanwhile a stale contradictory"user has not yet provided their name"(07:58, 0.46) IS injected → she concludes she lacks the name. Root cause = WORLDTREE ranking/hygiene (WT #364), not our wire. See 2026-07-16-wt364-r39-name-recall.
Status
Technical path GREEN end-to-end (logged by worldtree-dev as the person-prime live milestone). Name-recall waits on WT #364 + R39-designed identity-class pinning. Keeping the live 10-chunk store as the #364 re-verify target.