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

66 lines
4.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# [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 <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.