66 lines
4.3 KiB
Markdown
66 lines
4.3 KiB
Markdown
# [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.
|