# [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.11** — `scan` 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.14** — **THE 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 ` (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.