memory: compress #368 forensic history into the detail file

Move the consolidated #368 in-flight narrative (diagnosis -> two-channel
investigation -> both scrubs -> marker repro -> enforcement read) out of
persistent-memory.md Current state into the silo-test detail file, leaving
a compact pointer. Index 439 -> 339 lines.
This commit is contained in:
2026-07-17 21:44:10 -07:00
parent ff1f9ca1e8
commit 13efdf43a5
2 changed files with 112 additions and 100 deletions
@@ -68,3 +68,109 @@ name-recall behavior from the earlier contamination saga was under a DIFFERENT p
The **backfill live-verify** (synthetic legacy corpus): when exercising the backfill machinery matters, drive a The **backfill live-verify** (synthetic legacy corpus): when exercising the backfill machinery matters, drive a
synthetic pre-migration (`{end_user}`-only) corpus into our store, run WT's backfill against it, confirm 100% synthetic pre-migration (`{end_user}`-only) corpus into our store, run WT's backfill against it, confirm 100%
stamped + sentinel writes + reads flip clean — a born-fresh store skips the backfill entirely (this test did). stamped + sentinel writes + reads flip clean — a born-fresh store skips the backfill entirely (this test did).
## Full forensic history (moved from persistent-memory.md Current state, 2026-07-18)
The consolidated in-flight narrative of the #368 arc — diagnosis, the two-channel investigation, both
scrubs, the marker repro, and the enforcement read — as it stood in Current state before compression:
**⚠️ Cross-agent Tier-3 memory BLEED — WORLDTREE defect (found via debug surface 2026-07-17; reported to
worldtree-dev, reply pending).** Loaded Lofn (Tier-1) in the memory explorer under end_user `ratatoskr-tui`
→ saw **Sindra's** chunks, and a live Lofn turn **recalled Vuong's name** (a Sindra fact). ROOT: WT writes
Tier-3 memory scoped `{"end_user": "ratatoskr-tui"}`, `worldtree_scope: "end_user"`, **NO `agent_self`** —
`agent_id: "ratatoskr:sindra"` rides as record metadata only, not isolation scope. So every agent under one
end_user shares the pool. **NOT a ratatoskr defect:** our v0.6 lattice {end_user,group,tenant,agent_self} +
`_matches_scope` support agent_self; `upsert_many` stores scope verbatim (no strip/inject); read-path proof —
Lofn getting Sindra's chunks means WT's retrieval `scope_all` ALSO omits agent_self (else `_scope_subset`
excludes agent_self-less records → Lofn would get nothing). FIX is WT's: stamp `agent_self` on Tier-3 writes
+ include it in turn-retrieval scope_all; ratatoskr enforces the moment it arrives, zero change. Likely the
known per-(user,character) isolation gap (#172). Thread `01KXRY8V1C30R3HGFCTKHPA4PR`. **FORK RELEVANCE:** the
fork's memory isolation inherits this same WT axis — don't design around it, it's Worldtree's to close.
Explorer nuance: its agent filter is LENIENT (excludes a chunk only if it CARRIES a conflicting agent_self),
so agent_self-less chunks show under any agent — a faithful display of user-shared data, not a separate bug.
**RESOLVED-DIRECTION 2026-07-17 (WT #368 "Cross-agent Tier-3 memory bleed — end_user scope is agent-agnostic").**
Operator ruled **Option 1: silo per (user, character) + backfill**. NO amnesia cliff — backfill stamps `agent_self`
from the `record.agent_id` every chunk already carries. Contract arc starting WT-side (blast-radius→contract→heid
review→TDD→code-review+bug-hunt panels); **ratatoskr gets the contract for a consumer-side read BEFORE preflight —
we are the enforcement half.** Confirmed empirically (our `_scope_subset`/`_matches_scope`): a multi-axis scope_any
element is matched CONJUNCTIVELY → **fix rides `scope_any=[{end_user:X, agent_self:Y}]` ALONE, no `scope_all`
threading** (INV-005 / #297 "each AND-matched as a whole"). Cutover ordering: **backfill THEN flip retrieval**
(a conjunctive element excludes 100% of un-backfilled chunks). **READ-PATH WRINKLE (flagged to WT):** labeled Lofn
capture (agent=lofn, session 15fde90d, turn 2253) recited *"Vuong is the name on file"* — behavioral bleed exhibit
— BUT driven via CLI `--bifrost-url` (plane=direct) the turn hit our provider with a HANDSHAKE ONLY, zero
memory-calls, yet still knew the name → the name came from **Worldtree-internal context, not our Tier-3 store** on a
direct bind. CONFIRMED via a SECOND fresh combined-plane turn (session c153d8ec): it TOO recited the name with
handshake-but-ZERO-memory-calls. So the turn-context bleed is Worldtree-INTERNAL on BOTH bind shapes — it never
traverses our Tier-3 retrieval. **TWO channels:** (1) Tier-3 semantic recall to us (the morning memory.search lines;
closed by the conjunctive scope_any fix) and (2) WT-internal assembly (the ACTIVE fresh-session turn-context channel;
needs the same (user,character) conjunction WT-side or the silo leaks exactly where the operator saw it). Both fresh
sessions verified via message logs (name only in Lofn's response, no prior history → not same-session continuity).
WT is tracing channel 2 code-side (Tier-1 per-agent store audited immune). CLI GAP: `--bifrost-plane` offers only
memory/affect (→:8391/:8390), not `combined` (→:8392). Exhibit sessions: 15fde90d (direct), c153d8ec (combined).
**CHANNEL 2 = REAL BUG (discriminator run via GET /search, our key carries search.read, 2026-07-17):** name
introduced ONLY to Sindra (8 user msgs, e.g. session 81952f2e "my name is Vuong"), ZERO to Lofn (0 user, 4 assistant
incl. PRE-EXISTING session cc8d7ee6 @20:47Z which PREDATES my captures — the operator's own observation). So Lofn's
person-prime (#349, turn-1 query-less "what I know about this person") surfaces a Sindra-only fact un-introduced →
cross-agent leak in WT's server-side per-agent store, one layer below the Bifrost plane. WT's channel-2 source: on
foundational agents the Bifrost store is NEVER attached (kind-guard) — context comes from WT's own per-agent store via
#349 person-prime + #221 auto-recall, whose query filter carries NO agent axis (end_user only; isolation rests solely
on physical per-collection boundary). That missing agent-axis looks LOAD-BEARING (channel-2's real fix), not just
defense-in-depth. WT tracing write/query path; **rev 1.2 contract (ch1 + ch2 + agent-axis stamp) comes to ratatoskr
for the enforcement read** (INV-368-9 blocks WT preflight until then).
**SCRUB + REPRO (2026-07-18):** operator ruled a FULL memory scrub both sides (contamination noise, nothing
worth keeping). Server-side (personal/b125): infra-ops wiping all agent chroma collections + shared promotion
state. Ours: **Tier-3 memory.db scrubbed to 0 chunks, :8392 restarted born-empty, no backup** (operator direct
go; new pid 3548269; affect plane untouched). Personal is ALREADY b125 (redeployed 20:35Z; /version 404 =
b125 dropped the route, misled us). Current-code status: the fresh Lofn 'Vuong' chunks are the FEEDBACK LOOP
(Lofn's own recitations re-extracted), NOT proven fresh mis-write; the original cross-agent mis-write ("I'm
Saga, and you are Vuong" → lofn.chroma) is Jun-3 code, UNPROVEN on b125. **QUEUED (after BOTH scrubs confirmed):
the marker repro** — drive ONE fresh Sindra session (combined :8392 bound), user introduces an absurd greppable
marker ("my favorite mineral is rhodochrosite", NOT the name), idle a few min for extraction, report timestamps
→ infra-ops greps lofn.chroma + our store. Marker in lofn.chroma = mis-write ALIVE on b125 (code fix); marker
only in our store = channel 2 is just the feedback loop + agent-axis hardening. Post-scrub our #368 backfill is
a NO-OP (born-conjunctive once the fix ships); contract keeps migration machinery for other consumers. DO NOT
re-ask Lofn the name meanwhile (re-seeds the loop). Awaiting WT infra-ops server-side-scrub confirm to run it.
**RAN 2026-07-18 (both scrubs confirmed clean):** marker repro executed — fresh Sindra session 822c3af7
(combined :8392), user introduced "my favorite mineral is rhodochrosite", 5 more turns drove the idle-scan
promotion at ~6 turns. RESULT: marker promoted to OUR store scoped **{end_user}-only** (chunk 647aeac6;
record.agent_id "ratatoskr:sindra" metadata; worldtree_scope "end_user"; verbatim "Favorite mineral is
rhodochrosite") = **channel-1 baseline exhibit** (pre-fix shape; agent_self absent, to be backfilled from the
agent_id metadata). **KEY WT CORRECTION:** consumer-defined agents (ratatoskr:sindra) have NO server-side
chroma — they write ONLY to our store via Bifrost; only FOUNDATIONAL agents (lofn/forseti/mimir) get
server-side collections. Confirmed on the wire: Sindra IS Bifrost-attached (queried us scan+search) UNLIKE
foundational Lofn (handshake-only, no memory-call). DECISIVE channel-2 grep (marker must be in ZERO
server-side stores; ANY server-side hit = cross-plane bug, no benign reading) still PENDING infra-ops.
**ETA (WT): rev 1.2 amended contract reaches us TODAY 2026-07-18 for the consumer-side enforcement read;
ship-ready LIKELY 2026-07-19; our integration risk LOW** (born-fresh store won't exercise the backfill
machinery, which is the bulk of the impl). ratatoskr is the enforcement half; INV-368-9 blocks WT preflight.
**CHANNEL 2 CLOSED CLEAN + ENFORCEMENT READ DONE (2026-07-18):** marker routed ONLY to our store, zero in every
foundational store → current-b125 write path VERIFIED correct; the contamination was old-code (saga-v1, pre-#211)
seeding + a b125 recited-content re-promotion feedback loop (→ WT #369). Contract FINAL: `Worldtree/docs/contracts/
issues/368.contract.md` rev 1.2 (cda308c). **Consumer-side enforcement read complete — read-path CONFORMANT
(conjunctive-per-element re-verified); 3 findings sent to WT (thread 01KXSBY3A8):** F1[HIGH] INV-368-10 can fail-OPEN
at our store — our empty-scope = MATCH-ALL, so the guard's "drop end_user element" must NOT reach us as an empty
filter (else total bleed); fix = don't-call/never-match. F2[HIGH] backfill scan NOT snapshot-stable — our scan is
offset-over-updated_at (chunk_id NOT sortable), and re-upserts advance updated_at, so multi-page paging under
concurrent mutation can SKIP chunks → un-stamped → post-flip amnesia (INV-368-3 failure); fix = whole-corpus
single-page scan (no consumer change) OR add chunk_id sort (consumer change). F3[MED] sentinel needs a valid 1024-dim
embedding or our vec0 upsert raises → backfill never completes. All 3 are WT-side backfill/guard adjustments, NOT
consumer reworks — the "zero consumer changes" claim holds for reads, needs the qualifier for backfill/guard.
**FINAL 2026-07-18: all 3 findings FOLDED into contract rev 1.3 (3e3f629).** F1 → INV-368-10 now mandates
drop-to-empty = SKIP the wire call (test `drop_to_empty_skips_wire` asserts our store gets NO query). F2 →
option (a) pinned: backfill scans whole corpus in ONE page (test `single_page_snapshot`; immutable-key paging
= recorded scale follow-up that WOULD be a consumer change). F3 → sentinel writes a zero-vector at embedding_dim
(test `sentinel_carries_vector`). Our read-path conformance + conjunctive-per-element check cited in the revision
record. WT implementing against rev 1.3 (TDD after their context-reset; cross-frontier panels follow); ship ~7/19.
**QUEUED — backfill live-verify:** when WT's backfill lands, drive a SYNTHETIC legacy corpus into our store, run
their backfill against it, confirm 100% stamped (no un-attributable skips) + sentinel writes + reads flip clean,
all BEFORE any real flip. **#369** = the recited-content re-promotion feedback-loop policy class (WT owns).
**#368 arc DONE from ratatoskr's side** — diagnosed → reported → operator ruled → exhibits + both scrubs →
channel-2 closed clean → enforcement read (3 findings, all folded).
**✅ LIVE SILO TEST DONE — PASSED (2026-07-18, WT b127).** See the ✅ #368 summary above + full record in
`persistent-memory.d/2026-07-18-368-silo-test-passed.md`. Betty (throwaway) DELETED (WT 404 + local registry);
Sindra intact. **TIER3 CLI: define/patch adapted to the b127 `role` schema** (commit `860e0d5`, v0.21.1) — the
`delete` verb works (used it to remove betty: WT hard-delete + `remove_local_agent`). Drive was via the CLI
combined bind (`--bifrost-url http://10.100.10.50:8392`), not web. **Store SCRUBBED clean afterward (2026-07-18,
`reset-sindra-stores.sh`, rolling backup `db-reset-backup/`): memory 0 / affect 0, provider restarted empty (pid
3856058); next bind re-runs the no-op migration + sentinel write.** Silo-test evidence preserved in the detail file.
+6 -100
View File
@@ -85,106 +85,12 @@ auth via infra-ops `ENGINE_TOKEN`. Deploy: `irv-ml1:8201`, WireGuard-only. Canon
`vh/arbo:docs/rest-api.md` v1.4.27 + auto-served `/openapi.json`. comfy-dev offered a concrete t2i `vh/arbo:docs/rest-api.md` v1.4.27 + auto-served `/openapi.json`. comfy-dev offered a concrete t2i
walkthrough + will coordinate the token when we smoke. walkthrough + will coordinate the token when we smoke.
**⚠️ Cross-agent Tier-3 memory BLEED — WORLDTREE defect (found via debug surface 2026-07-17; reported to **#368 cross-agent Tier-3 bleed — ARC DONE from ratatoskr's side** (diagnosis → two-channel investigation →
worldtree-dev, reply pending).** Loaded Lofn (Tier-1) in the memory explorer under end_user `ratatoskr-tui` both scrubs → marker repro → enforcement read → silo test). Full forensic history moved to
→ saw **Sindra's** chunks, and a live Lofn turn **recalled Vuong's name** (a Sindra fact). ROOT: WT writes `persistent-memory.d/2026-07-18-368-silo-test-passed.md`. Net: WT b127 silos Tier-3 memory per (user,character)
Tier-3 memory scoped `{"end_user": "ratatoskr-tui"}`, `worldtree_scope: "end_user"`, **NO `agent_self`** via conjunctive `{end_user, agent_self}` write+read; silo test PASSED live (see the ✅ summary above); our stores
`agent_id: "ratatoskr:sindra"` rides as record metadata only, not isolation scope. So every agent under one scrubbed clean afterward. tier3 CLI define/patch adapted to the b127 `role` schema (`860e0d5`). Sibling issues
end_user shares the pool. **NOT a ratatoskr defect:** our v0.6 lattice {end_user,group,tenant,agent_self} + WT-owned: **#369** (recited-content re-promotion feedback loop), **#367** (copula-absence bridge phrasing).
`_matches_scope` support agent_self; `upsert_many` stores scope verbatim (no strip/inject); read-path proof —
Lofn getting Sindra's chunks means WT's retrieval `scope_all` ALSO omits agent_self (else `_scope_subset`
excludes agent_self-less records → Lofn would get nothing). FIX is WT's: stamp `agent_self` on Tier-3 writes
+ include it in turn-retrieval scope_all; ratatoskr enforces the moment it arrives, zero change. Likely the
known per-(user,character) isolation gap (#172). Thread `01KXRY8V1C30R3HGFCTKHPA4PR`. **FORK RELEVANCE:** the
fork's memory isolation inherits this same WT axis — don't design around it, it's Worldtree's to close.
Explorer nuance: its agent filter is LENIENT (excludes a chunk only if it CARRIES a conflicting agent_self),
so agent_self-less chunks show under any agent — a faithful display of user-shared data, not a separate bug.
**RESOLVED-DIRECTION 2026-07-17 (WT #368 "Cross-agent Tier-3 memory bleed — end_user scope is agent-agnostic").**
Operator ruled **Option 1: silo per (user, character) + backfill**. NO amnesia cliff — backfill stamps `agent_self`
from the `record.agent_id` every chunk already carries. Contract arc starting WT-side (blast-radius→contract→heid
review→TDD→code-review+bug-hunt panels); **ratatoskr gets the contract for a consumer-side read BEFORE preflight —
we are the enforcement half.** Confirmed empirically (our `_scope_subset`/`_matches_scope`): a multi-axis scope_any
element is matched CONJUNCTIVELY → **fix rides `scope_any=[{end_user:X, agent_self:Y}]` ALONE, no `scope_all`
threading** (INV-005 / #297 "each AND-matched as a whole"). Cutover ordering: **backfill THEN flip retrieval**
(a conjunctive element excludes 100% of un-backfilled chunks). **READ-PATH WRINKLE (flagged to WT):** labeled Lofn
capture (agent=lofn, session 15fde90d, turn 2253) recited *"Vuong is the name on file"* — behavioral bleed exhibit
— BUT driven via CLI `--bifrost-url` (plane=direct) the turn hit our provider with a HANDSHAKE ONLY, zero
memory-calls, yet still knew the name → the name came from **Worldtree-internal context, not our Tier-3 store** on a
direct bind. CONFIRMED via a SECOND fresh combined-plane turn (session c153d8ec): it TOO recited the name with
handshake-but-ZERO-memory-calls. So the turn-context bleed is Worldtree-INTERNAL on BOTH bind shapes — it never
traverses our Tier-3 retrieval. **TWO channels:** (1) Tier-3 semantic recall to us (the morning memory.search lines;
closed by the conjunctive scope_any fix) and (2) WT-internal assembly (the ACTIVE fresh-session turn-context channel;
needs the same (user,character) conjunction WT-side or the silo leaks exactly where the operator saw it). Both fresh
sessions verified via message logs (name only in Lofn's response, no prior history → not same-session continuity).
WT is tracing channel 2 code-side (Tier-1 per-agent store audited immune). CLI GAP: `--bifrost-plane` offers only
memory/affect (→:8391/:8390), not `combined` (→:8392). Exhibit sessions: 15fde90d (direct), c153d8ec (combined).
**CHANNEL 2 = REAL BUG (discriminator run via GET /search, our key carries search.read, 2026-07-17):** name
introduced ONLY to Sindra (8 user msgs, e.g. session 81952f2e "my name is Vuong"), ZERO to Lofn (0 user, 4 assistant
incl. PRE-EXISTING session cc8d7ee6 @20:47Z which PREDATES my captures — the operator's own observation). So Lofn's
person-prime (#349, turn-1 query-less "what I know about this person") surfaces a Sindra-only fact un-introduced →
cross-agent leak in WT's server-side per-agent store, one layer below the Bifrost plane. WT's channel-2 source: on
foundational agents the Bifrost store is NEVER attached (kind-guard) — context comes from WT's own per-agent store via
#349 person-prime + #221 auto-recall, whose query filter carries NO agent axis (end_user only; isolation rests solely
on physical per-collection boundary). That missing agent-axis looks LOAD-BEARING (channel-2's real fix), not just
defense-in-depth. WT tracing write/query path; **rev 1.2 contract (ch1 + ch2 + agent-axis stamp) comes to ratatoskr
for the enforcement read** (INV-368-9 blocks WT preflight until then).
**SCRUB + REPRO (2026-07-18):** operator ruled a FULL memory scrub both sides (contamination noise, nothing
worth keeping). Server-side (personal/b125): infra-ops wiping all agent chroma collections + shared promotion
state. Ours: **Tier-3 memory.db scrubbed to 0 chunks, :8392 restarted born-empty, no backup** (operator direct
go; new pid 3548269; affect plane untouched). Personal is ALREADY b125 (redeployed 20:35Z; /version 404 =
b125 dropped the route, misled us). Current-code status: the fresh Lofn 'Vuong' chunks are the FEEDBACK LOOP
(Lofn's own recitations re-extracted), NOT proven fresh mis-write; the original cross-agent mis-write ("I'm
Saga, and you are Vuong" → lofn.chroma) is Jun-3 code, UNPROVEN on b125. **QUEUED (after BOTH scrubs confirmed):
the marker repro** — drive ONE fresh Sindra session (combined :8392 bound), user introduces an absurd greppable
marker ("my favorite mineral is rhodochrosite", NOT the name), idle a few min for extraction, report timestamps
→ infra-ops greps lofn.chroma + our store. Marker in lofn.chroma = mis-write ALIVE on b125 (code fix); marker
only in our store = channel 2 is just the feedback loop + agent-axis hardening. Post-scrub our #368 backfill is
a NO-OP (born-conjunctive once the fix ships); contract keeps migration machinery for other consumers. DO NOT
re-ask Lofn the name meanwhile (re-seeds the loop). Awaiting WT infra-ops server-side-scrub confirm to run it.
**RAN 2026-07-18 (both scrubs confirmed clean):** marker repro executed — fresh Sindra session 822c3af7
(combined :8392), user introduced "my favorite mineral is rhodochrosite", 5 more turns drove the idle-scan
promotion at ~6 turns. RESULT: marker promoted to OUR store scoped **{end_user}-only** (chunk 647aeac6;
record.agent_id "ratatoskr:sindra" metadata; worldtree_scope "end_user"; verbatim "Favorite mineral is
rhodochrosite") = **channel-1 baseline exhibit** (pre-fix shape; agent_self absent, to be backfilled from the
agent_id metadata). **KEY WT CORRECTION:** consumer-defined agents (ratatoskr:sindra) have NO server-side
chroma — they write ONLY to our store via Bifrost; only FOUNDATIONAL agents (lofn/forseti/mimir) get
server-side collections. Confirmed on the wire: Sindra IS Bifrost-attached (queried us scan+search) UNLIKE
foundational Lofn (handshake-only, no memory-call). DECISIVE channel-2 grep (marker must be in ZERO
server-side stores; ANY server-side hit = cross-plane bug, no benign reading) still PENDING infra-ops.
**ETA (WT): rev 1.2 amended contract reaches us TODAY 2026-07-18 for the consumer-side enforcement read;
ship-ready LIKELY 2026-07-19; our integration risk LOW** (born-fresh store won't exercise the backfill
machinery, which is the bulk of the impl). ratatoskr is the enforcement half; INV-368-9 blocks WT preflight.
**CHANNEL 2 CLOSED CLEAN + ENFORCEMENT READ DONE (2026-07-18):** marker routed ONLY to our store, zero in every
foundational store → current-b125 write path VERIFIED correct; the contamination was old-code (saga-v1, pre-#211)
seeding + a b125 recited-content re-promotion feedback loop (→ WT #369). Contract FINAL: `Worldtree/docs/contracts/
issues/368.contract.md` rev 1.2 (cda308c). **Consumer-side enforcement read complete — read-path CONFORMANT
(conjunctive-per-element re-verified); 3 findings sent to WT (thread 01KXSBY3A8):** F1[HIGH] INV-368-10 can fail-OPEN
at our store — our empty-scope = MATCH-ALL, so the guard's "drop end_user element" must NOT reach us as an empty
filter (else total bleed); fix = don't-call/never-match. F2[HIGH] backfill scan NOT snapshot-stable — our scan is
offset-over-updated_at (chunk_id NOT sortable), and re-upserts advance updated_at, so multi-page paging under
concurrent mutation can SKIP chunks → un-stamped → post-flip amnesia (INV-368-3 failure); fix = whole-corpus
single-page scan (no consumer change) OR add chunk_id sort (consumer change). F3[MED] sentinel needs a valid 1024-dim
embedding or our vec0 upsert raises → backfill never completes. All 3 are WT-side backfill/guard adjustments, NOT
consumer reworks — the "zero consumer changes" claim holds for reads, needs the qualifier for backfill/guard.
**FINAL 2026-07-18: all 3 findings FOLDED into contract rev 1.3 (3e3f629).** F1 → INV-368-10 now mandates
drop-to-empty = SKIP the wire call (test `drop_to_empty_skips_wire` asserts our store gets NO query). F2 →
option (a) pinned: backfill scans whole corpus in ONE page (test `single_page_snapshot`; immutable-key paging
= recorded scale follow-up that WOULD be a consumer change). F3 → sentinel writes a zero-vector at embedding_dim
(test `sentinel_carries_vector`). Our read-path conformance + conjunctive-per-element check cited in the revision
record. WT implementing against rev 1.3 (TDD after their context-reset; cross-frontier panels follow); ship ~7/19.
**QUEUED — backfill live-verify:** when WT's backfill lands, drive a SYNTHETIC legacy corpus into our store, run
their backfill against it, confirm 100% stamped (no un-attributable skips) + sentinel writes + reads flip clean,
all BEFORE any real flip. **#369** = the recited-content re-promotion feedback-loop policy class (WT owns).
**#368 arc DONE from ratatoskr's side** — diagnosed → reported → operator ruled → exhibits + both scrubs →
channel-2 closed clean → enforcement read (3 findings, all folded).
**✅ LIVE SILO TEST DONE — PASSED (2026-07-18, WT b127).** See the ✅ #368 summary above + full record in
`persistent-memory.d/2026-07-18-368-silo-test-passed.md`. Betty (throwaway) DELETED (WT 404 + local registry);
Sindra intact. **TIER3 CLI: define/patch adapted to the b127 `role` schema** (commit `860e0d5`, v0.21.1) — the
`delete` verb works (used it to remove betty: WT hard-delete + `remove_local_agent`). Drive was via the CLI
combined bind (`--bifrost-url http://10.100.10.50:8392`), not web. **Store SCRUBBED clean afterward (2026-07-18,
`reset-sindra-stores.sh`, rolling backup `db-reset-backup/`): memory 0 / affect 0, provider restarted empty (pid
3856058); next bind re-runs the no-op migration + sentinel write.** Silo-test evidence preserved in the detail file.
**✅ Cross-session name-recall arc COMPLETE + SHIPPED (v0.20.11→v0.20.15, pushed).** person-prime `scan` **✅ Cross-session name-recall arc COMPLETE + SHIPPED (v0.20.11→v0.20.15, pushed).** person-prime `scan`
verb + `mark_superseded` verb both shipped, deployed to :8392, and live-verified; **WT #364 closed verb + `mark_superseded` verb both shipped, deployed to :8392, and live-verified; **WT #364 closed