Files
ratatoskr/persistent-memory.d/2026-07-16-person-prime-scan-shipped.md

4.3 KiB
Raw Permalink Blame History

[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)

  • 8fc757a v0.20.11scan verb + sortable_chunk_fields cap. Query-LESS, LIVE-only (INV-009: superseded/tombstoned excluded server-side), globally-ordered- before-pagination by indexed updated_at (INV-010), sort dispatch-gated. Offset cursor with a has_more peek (no empty trailing page = reference-parity). TDD 7/7 incl. parity_vs_reference #195. NUANCE resolved: bifrost's InMemoryMemoryStore READS updated_at (never stamps it) — identical to ours; ref does NOT lifecycle- filter so parity is over the live set only.
  • a9c521a v0.20.12 — Sindra holodesk first-message preset (split out of the soong-lab redefine as its own concern).
  • 25ccb5c v0.20.13 — heid-bug-hunt fix: a truthy non-dict sort ("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).
  • f46ccba v0.20.14THE DEPLOY-BREAKER (see Tried/abandoned): advertised sortable_chunk_fields=[{"name":"updated_at"}] WITHOUT type → bifrost handshake_response SortableChunkField requires 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.