Files
ratatoskr/persistent-memory.md
T
vh 13efdf43a5 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.
2026-07-17 21:44:10 -07:00

340 lines
42 KiB
Markdown
Raw 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.
# Persistent memory — ratatoskr
_Last updated: 2026-07-18_
> **Always check for `/tmp/ratatoskr-dev-handoff.md`** — if it exists and its
> `Written:` stamp is under an hour old, read it (it carries the in-flight
> handoff from the previous session), then delete it. Older than an hour:
> stale — delete it unread.
This file captures durable intent and supporting evidence (goals, decisions,
foot-gun warnings, in-flight state) across context resets. Read it at session
start; treat it as one input alongside `CLAUDE.md` and the auto-memory system,
not as the single source of truth.
When durable state shifts enough to warrant capture, run `/snapshot` and
commit alongside the next commit per the persistent-memory commit-along rule
in `CLAUDE.md`.
---
## Repo purpose
Ratatoskr is a **dev-grade debug-observability TUI** for Worldtree's
Conversation API. The product IS the observability surface; chat is the
input mechanism. Devs run Ratatoskr against a local Worldtree to watch a
turn flow through every layer of the system, side-by-side, in one terminal:
agent SSE stream, persona/Vili affect dispatch, tool calls, Bifrost
handshake state, admin lifecycle events, optional raw server log.
Named after the squirrel that runs up and down Yggdrasil carrying messages
between layers. On-the-nose Worldtree resonance (Yggdrasil = the World Tree).
**Second identity (since 2026-06-14): the v1 Bifrost Tier-3 consumer/provider**
the durable persistence Worldtree writes Tier-3 agent affect (PAD/persona, `:8390`)
+ memory (`:8391`) into. Lives in `src/ratatoskr/provider/`, depends on `bifrost`
(`provider` optional-extra), separate from the conversation-API spec pin. So
ratatoskr now owns BOTH ends of the Bifrost round-trip — the lens #17 exploits.
**v0.15.0+ sibling browser surface** (`ratatoskr.web`, `ratatoskr-web` console
script): same five-pane debug surface over the same SSE wire, LAN-viewable.
Internal-LAN trust model — `0.0.0.0`, no auth/TLS/CORS (operator direction).
Disciplined regardless: transcript HTML-escapes assistant content (INV-004);
upstream API key stays server-side (INV-003).
## Current state / in-flight
_As of 2026-07-18:_
**#368 (user, character) MEMORY SILO TEST — DONE, PASSED LIVE (2026-07-18, WT b127).** The reason for the clear;
now closed. Silo holds end-to-end: write-side promoted chunks carry conjunctive `{end_user, agent_self}` (proven on
3 live Sindra promotions under end_user `silo-368`); read-side isolation proven by cold-recall (fresh Betty session,
SAME end_user, got ZERO hits → "I don't know", did NOT bleed Sindra's coffee; Sindra recalled her own coffee).
Migration sentinel `worldtree:migration:agent-scope-v1` written on first bind (backfill a no-op on the born-empty
store). Zero consumer changes, as contracted. Throwaway `ratatoskr:betty` DELETED (WT + local); Sindra intact. Full
record → `persistent-memory.d/2026-07-18-368-silo-test-passed.md`. **Still QUEUED:** the backfill live-verify
(synthetic legacy corpus — exercises the backfill machinery a born-fresh store skips).
**▶️ NEXT MAJOR: FORK ratatoskr for arbo image-gen (operator call 2026-07-17).** The arbo debug-observability
idea did NOT become a feature bolted onto ratatoskr. Operator decision: **ratatoskr stays the Worldtree
debug surface; the arbo image-gen product becomes a FORK of ratatoskr** (clean chat-first surface, debug
panes hidden by default). The fork is the next major workstream; "get ready to assist with fork" is the
standing directive.
**✅ Pre-fork UI prep SHIPPED (v0.20.17, committed c678853, NOT pushed).** Web console: left+right debug
panes (`#rail-left`, `#affect-console`) are now independently collapsible/hideable — chevron button folds
each to a 22px re-open strip, `#center` reflows to fill, state persists per-pane in localStorage. Both
collapsed = the clean chat surface the fork starts from. Playwright-verified. Web server bounced (now pid
3194361 on :8765, serving the updated HTML). TUI untouched by this change (web-only).
**⚠️ TUI DEPRECATED (operator call 2026-07-17) — rip pending, NOT a clean delete.** The textual TUI is
superseded by the web interface; per no-backwards-compat it gets ripped. BLAST RADIUS (mapped, not yet
executed): `tui.py` (textual app) + `tests/test_tui.py` delete cleanly. BUT `cli.py` is **SHARED, not
TUI-only** — `web/entrypoint.py` and `tier3.py` both import `USER_AGENT` from it, and `cli.py` holds
`ParsedArgs`/`_format_duration_ms`/`_format_usage` (used by tui) plus its own headless `CliPresenterState`.
So the rip is a surgical disentangle, not `rm tui.py`. OPEN SCOPE Q for operator: remove textual-only
(`tui.py`, keep `cli.py`'s headless CLI + `ratatoskr` entry) vs remove the whole terminal interface
(relocate shared consts out of `cli.py` first). Breaking public-surface removal → **minor bump (needs
operator approval)**. `textual`/`textual-dev` deps removable only after confirming tui.py is the sole user.
**arbo API intel (from comfy-dev 2026-07-17, banked for fork planning):** validated-workflow-library REST
API, NOT raw txt2img. `GET /workflows` (~200 recipes: t2i/img2img/inpaint/video/…) → `POST /workflows/{id}/run`
→ 202 JobHandle → **poll** `GET /jobs/{id}` (NO SSE/websocket — coarser than WT's live stream) → `GET
outputs[].url` for the image. Thin RunRequest (prompt raw|compiled + optional seed/dims/image). Bearer
auth via infra-ops `ENGINE_TOKEN`. Deploy: `irv-ml1:8201`, WireGuard-only. Canonical doc (pinnable):
`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.
**#368 cross-agent Tier-3 bleed — ARC DONE from ratatoskr's side** (diagnosis → two-channel investigation →
both scrubs → marker repro → enforcement read → silo test). Full forensic history moved to
`persistent-memory.d/2026-07-18-368-silo-test-passed.md`. Net: WT b127 silos Tier-3 memory per (user,character)
via conjunctive `{end_user, agent_self}` write+read; silo test PASSED live (see the ✅ summary above); our stores
scrubbed clean afterward. tier3 CLI define/patch adapted to the b127 `role` schema (`860e0d5`). Sibling issues
WT-owned: **#369** (recited-content re-promotion feedback loop), **#367** (copula-absence bridge phrasing).
**✅ 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
end-to-end both sides; Sindra durably recalls Vuong's name** (the "name unknown" negatives are RETIRED
via mark_superseded, not just recency-evicted). Full arcs:
`persistent-memory.d/2026-07-16-person-prime-scan-shipped.md` + `…-2026-07-16-wt364-r39-name-recall.md`.
**✅ Web-console UI shipped (v0.20.16, pushed):** code-block word-wrap + per-code-block & per-turn copy
buttons (hover-revealed; one delegated `#tw` handler + LAN-http clipboard fallback; Playwright-verified).
Served from disk → browser refresh picks it up, no :8765 restart for UI edits.
**OBSOLETE — Sindra pristine baseline WIPED 2026-07-18.** The whole Tier-3 memory.db was scrubbed to 0
chunks (operator full-scrub ruling for #368 — contamination noise, nothing worth keeping; no backup taken
per direct order). The old `sindra-baseline/*.db` checkpoints predate the scrub and no longer reflect a
"clean 5-fact" target — the store is now born-empty. Any future test drive starts from the born-fresh store.
**Deferred/queued tasks (all NON-URGENT — tracked in Recent decisions):** (1) P06-driver **referential-
frame A/B/C probe** (operator-ratified; waits on WT b122; read-shape + brokkr's scoring rubric captured →
`persistent-memory.d/2026-07-17-referential-frame-probe.md`); (2) R39 Phase-2 **matched-quartets rebuild**
(confirmatory, "whenever"); (3) bifrost **snapshot-cursor adoption** (ruled normative, not blocking →
`persistent-memory.d/2026-07-16-bifrost-cursor-conformance.md`).
**Substrate / environment:** branch `main` at **v0.21.1** — local commits ahead of origin's v0.20.16 (`5a1883a`): tier3 b127-role adaptation (`860e0d5`) + memory snapshots, UNPUSHED; origin
`git@gitea.phasefinal.com:vh/ratatoskr.git`. bifrost **`==1.1.4`** / wire v0.7 (maintenance-verb hasattr
backstop + scan/cursor conformance harness); Worldtree openapi vendored 2.3.0; **suite 644 green**.
Personal WT on **b127** (#368 (user,character) silo live + deployed both instances; #364 promotion-hygiene also live). The combined **:8392** provider (memory+affect) +
**:8765** web are THE surfaces, dev-box BACKGROUND SHELLS — restart via
`scratchpad/relaunch_by_pid.py <pid>` (env-preserving, self-daemonizing; pid via `ss -ltnp | grep <port>`);
web serves static `index.html` from disk. `env.sh` sets the REQUIRED `RATATOSKR_MEMORY_EMBEDDING_DIM=1024`.
Keys env-only mode-600 in `~/.config/ratatoskr/provider.env` + `RATATOSKR_ADMIN_API_KEY` (7 read scopes,
personal-:8081-only; Heimdall keys per-instance). **FOOT-GUN: check owner-scoped agents via
`GET /agents/<owner>:<name>` with the OWNER key (`WORLDTREE_API_KEY`), NOT the admin key** — the admin
token gives a false 404. `graphify-out/` runs dirty (auto-regen, never stage). v1 = full Worldtree I/O
coverage, cuts when WT tags 1.0 (`docs/coverage-map.md`).
**Other live threads:** soong-lab = Tier-3 agent-authoring studio (v0.3.24 fixed the motivational
string→object export; our workaround droppable for v0.3.24+ bundles). Open/deferred: #10 subject-
migration watch; relational-dynamics-arc verify (bind via `--bifrost-url :8392`); P06 optimization-phase
re-drive (brokkr brings prereg); we-framing-conditional affect-egress re-vendor. WT #356 resume-durability
+ WT #367 (copula-absence bridge phrasing) = worldtree-owned.
## Recent decisions
Chronological log of decisions with `[YYYY-MM-DD]` prefix. One line per
decision. Captures rationale that won't be obvious from code alone.
- `[2026-06-15]` **Affect plane shipped (v0.17.2) + LIVE-PROVEN end-to-end against real Worldtree v0.35.2**`persistent-memory.d/2026-06-15-affect-plane-shipped-v0-17-2-live-proven-end.md`
- `[2026-06-16]` **#295 cold-recall miss root-caused — UPSTREAM, scope-axis asymmetry** → `persistent-memory.d/2026-06-16-295-cold-recall-miss-root-caused-upstream-sco.md`
- `[2026-06-16]` **agent_self → make it CANONICAL (operator decided A)**`persistent-memory.d/2026-06-16-agentself-make-it-canonical-operator-decided.md`
- `[2026-06-16]` **Self-drive auth identity: bound session-create uses the CONSUMER Heimdall key as bearer, NOT `WORLDTREE_API_KEY`**`persistent-memory.d/2026-06-16-self-drive-auth-identity-bound-session-create.md`
- `[2026-06-16]` **Issue #17 v1 scope locked (operator 1A/2A): single-plane bind + dispatch-layer op-feed**`persistent-memory.d/2026-06-16-issue-17-v1-scope-locked-operator-1a-2a-singl.md`
- `[2026-06-16]` **agent_self lattice SHIPPED both sides → our axis-validation gap CLOSED (v0.17.5)**`persistent-memory.d/2026-06-16-agentself-lattice-shipped-both-sides-our-axis.md`
- `[2026-06-16]` **Repinned bifrost 0.7.0→0.8.0 + reimplemented memory `search` to the v0.6 scope split (operator-directed)**`persistent-memory.d/2026-06-16-repinned-bifrost-0-7-0-0-8-0-reimplemented-me.md`
- `[2026-06-17]` **Worldtree spec pin bumped v0.29.0→v0.35.16 (`562001a`→`f1b59f8`); cold recall closed on the WIRE**`persistent-memory.d/2026-06-17-worldtree-spec-pin-bumped-v0-29-0-v0-35-16-56.md`
- `[2026-06-17]` **End-to-end cold-recall proof RAN — our stack proven, #296 isolated**`persistent-memory.d/2026-06-17-end-to-end-cold-recall-proof-ran-our-stack-pr.md`
- `[2026-06-17]` **DELETE+redefine `ratatoskr:sindra` (operator-authorized; pre-v1 debug surface)**`persistent-memory.d/2026-06-17-delete-redefine-ratatoskr-sindra-operator-aut.md`
- `[2026-06-17]` **Promotion = 4-trigger hybrid (worldtree-dev, code-grounded):**`persistent-memory.d/2026-06-17-promotion-4-trigger-hybrid-worldtree-dev-code.md`
- `[2026-06-17]` **#296 triage sent to worldtree-dev** (`01KVBBH0…`): extraction SUBJECT-INVERSION (promotes assistant prose, drops the user's fact) + META-DESCRIPTION-not-content; verbose-persona aggravator. WAD-vs-bug resolved to BUG (extraction quality), not idle-gating.
- `[2026-06-18]` **Tier-3 memory PROVEN end-to-end live**`ratatoskr:terse-probe` recalled a seeded user fact in a COLD history-free session (scope_any → 1 hit @ cosine 0.6994). Closes the opening "how far from Tier-3 memory" question for normal agents.
- `[2026-06-18]` **#296 Stages 1+2 closed** → `persistent-memory.d/2026-06-18-296-stages-1-2-closed.md`
- `[2026-06-18]` **#17 implemented end-to-end via direct in-session TDD** → `persistent-memory.d/2026-06-18-17-implemented-end-to-end-via-direct-in-sessi.md`
- `[2026-06-18]` **#17 live-smoke PROVEN — the whole thesis validated** → `persistent-memory.d/2026-06-18-17-live-smoke-proven-the-whole-thesis-validat.md`
- `[2026-06-18]` **Fixed a pre-existing test-isolation bug exposed by the #17 CLI tests**`persistent-memory.d/2026-06-18-fixed-a-pre-existing-test-isolation-bug-expos.md`
- `[2026-06-18]` **#18 filed (composite endpoint + PAD read-endpoint) — DEFERRED, tracked at Gitea #18** → `persistent-memory.d/2026-06-18-18-filed-composite-endpoint-pad-read-endpoint.md`
- `[2026-06-18]` **#18 SPLIT; Deliverable 1 (composite) routed to bifrost — Option C (operator)** → `persistent-memory.d/2026-06-18-18-split-deliverable-1-composite-routed-to-bi.md`
- `[2026-06-18]` **FR-1 RESOLVED — the composite premise was unverified, now wire-proven: single-endpoint, caps-routed**`persistent-memory.d/2026-06-18-fr-1-resolved-the-composite-premise-was-unver.md`
- `[2026-06-18]` **#18 D2 implemented via direct in-session TDD (suite 470→482)** → `persistent-memory.d/2026-06-18-18-d2-implemented-via-direct-in-session-tdd-s.md`
- `[2026-06-19]` **#18 D2 SHIPPED (`v0.17.14`, `39eebd1`) and the full #17+#18 arc PUSHED to origin** → `persistent-memory.d/2026-06-19-18-d2-shipped-v0-17-14-39eebd1-and-the-full-1.md`
- `[2026-06-19]` **bifrost repinned 0.8.0→0.10.0; `affect.fetch` became MANDATORY (strong-or-absent)**`persistent-memory.d/2026-06-19-bifrost-repinned-0-8-0-0-10-0-affect-fetch-be.md`
- `[2026-06-19]` **#18 D1 SHIPPED — composite `build_combined_app` on `:8392` (`v0.17.16`, `7f4ceaa`); #18 CLOSED; published `v0.18.0` (`359dbb1`)** → `persistent-memory.d/2026-06-19-18-d1-shipped-composite-buildcombinedapp-on-8.md`
- `[2026-06-19]` **op-feed handshake field-name fix (#17, `v0.17.17` `d60b77d`): `capabilities_requested`→`capabilities`**`persistent-memory.d/2026-06-19-op-feed-handshake-field-name-fix-17-v0-17-17.md`
- `[2026-06-19]` **Ratatoskr is a REFERENCE implementation of the Worldtree/Bifrost standard (operator)**`persistent-memory.d/2026-06-19-ratatoskr-is-a-reference-implementation-of-th.md`
- `[2026-06-19]` **Ratatoskr v1 is DERIVED from Worldtree I/O coverage (operator) — no self-defined feature ROADMAP**`persistent-memory.d/2026-06-19-ratatoskr-v1-is-derived-from-worldtree-i-o-co.md`
- `[2026-06-20]` **#18's final leg PROVEN — composite `:8392` WT-driven smoke ran end-to-end + persisted** → `persistent-memory.d/2026-06-20-18-s-final-leg-proven-composite-8392-wt-drive.md`
- `[2026-06-20]` **#17 CLOSED in the tracker.** Shipped end-to-end (`v0.17.8``.13` + op-feed field fix `v0.17.17`); the 2026-06-20 composite smoke re-exercised its op-feed live. Closing comment captures the full both-plane proof. Open issues now just #11 (scope-blocked) + #10 (watch).
- `[2026-06-20]` **Sindra has real PAD but ~empty memory — the affect/memory persistence asymmetry, confirmed on real sessions**`persistent-memory.d/2026-06-20-sindra-has-real-pad-but-empty-memory-the-affe.md`
- `[2026-06-29]` **Web SPA combined-bind default (`v0.18.1`, `719e4d6`) — operator-caught gap**`persistent-memory.d/2026-06-29-web-spa-combined-bind-default-v0-18-1-719e4d6.md`
- `[2026-06-29]` **bifrost repinned 1.0.0 (`v0.18.2`, `af67ad9`)**`persistent-memory.d/2026-06-29-bifrost-repinned-1-0-0-v0-18-2-af67ad9.md`
- `[2026-06-30]` **Worldtree v1.0.0b1→b2 consumer adaptation: eager turn-launch statuses (`v0.18.3` `b2e4901`, `v0.18.4` `e4317f6`)**`persistent-memory.d/2026-06-30-worldtree-v1-0-0b1-b2-consumer-adaptation-eag.md`
- `[2026-06-30]` **Verify-against-the-real-spec-before-committing caught a real upstream gap**`persistent-memory.d/2026-06-30-verify-against-the-real-spec-before-committin.md`
- `[2026-06-30]` **regard is a DEAD AXIS in Worldtree's emitted affect (caught provider-side; worldtree-dev confirmed + escalated to Vuong)**`persistent-memory.d/2026-06-30-regard-is-a-dead-axis-in-worldtree-s-emitted.md`
- `[2026-06-30]` **v1 coverage-audit kicked off; coverage ledger written (`docs/coverage-map.md`) — the first one**`persistent-memory.d/2026-06-30-v1-coverage-audit-kicked-off-coverage-ledger.md`
- `[2026-06-30]` **Scope mandate A locked (operator): v1 "done" = every frozen I/O point CLASSIFIED (covered-or-excluded-with-rationale), zero unaccounted — NOT a feature-complete client**`persistent-memory.d/2026-06-30-scope-mandate-a-locked-operator-v1-done-every.md`
- `[2026-06-30]` **Finding P-1 (pin drift) + pin-remediation PENDING**`persistent-memory.d/2026-06-30-finding-p-1-pin-drift-pin-remediation-pending.md`
- `[2026-06-30]` **(b) Tier-1 frontier SCOPED, ready for a contract-first TDD cycle (next focused work)** → `persistent-memory.d/2026-06-30-b-tier-1-frontier-scoped-ready-for-a-contract.md`
- `[2026-06-30]` **(b1) SSE-resume SHIPPED (`v0.18.5`) — `stream_turn_resilient` (sse_client.py)** → `persistent-memory.d/2026-06-30-b1-sse-resume-shipped-v0-18-5-streamturnresil.md`
- `[2026-06-30]` **(b2) session-picker SHIPPED (`v0.18.7`) — bare TUI mode → startup picker (design-brief §4)** → `persistent-memory.d/2026-06-30-b2-session-picker-shipped-v0-18-7-bare-tui-mo.md`
- `[2026-06-30]` **capabilities+me slice SHIPPED (`v0.18.8`) — `GET /me` + `GET /capabilities` consumed via a new `--whoami` one-shot**`persistent-memory.d/2026-06-30-capabilities-me-slice-shipped-v0-18-8-get-me.md`
- `[2026-07-01]` **b1 (SSE-resume) heid-code-review panel: ZERO findings — cross-model-verified clean**`persistent-memory.d/2026-07-01-b1-sse-resume-heid-code-review-panel-zero-fin.md`
- `[2026-07-01]` **`GET /sessions/{id}/tools` quick-win SHIPPED (`v0.18.9`) — owner-scoped tool inventory in the TUI Tools pane** → `persistent-memory.d/2026-07-01-get-sessions-id-tools-quick-win-shipped-v0-18.md`
- `[2026-07-01]` **BifrostState pane SHIPPED (`v0.18.10`) — `GET /admin/sessions/{id}/bifrost` in a new TUI "Bifrost" pane; the FIRST admin-key consumer in ratatoskr**`persistent-memory.d/2026-07-01-bifroststate-pane-shipped-v0-18-10-get-admin.md`
- `[2026-07-01]` **LEDGER CORRECTION: #11 (AdminEvents) is NO LONGER BLOCKED**`persistent-memory.d/2026-07-01-ledger-correction-11-adminevents-is-no-longer.md`
- `[2026-07-01]` **AdminEvents pane SHIPPED (`v0.18.11`) — `GET /admin/events` SSE in a new TUI pane; #11 closed-by-build; Tier 1 (debug-observability core) COMPLETE**`persistent-memory.d/2026-07-01-adminevents-pane-shipped-v0-18-11-get-admin-e.md`
- `[2026-07-01]` **Tier-2 SHIPPED (`v0.19.1`) — transient-characters CRUD + persona-state write; the v1 coverage-audit CONVERGES (zero in-scope gaps)**`persistent-memory.d/2026-07-01-tier-2-shipped-v0-19-1-transient-characters-c.md`
- `[2026-07-01]` **env.sh now PERSISTS the web Bifrost-bind vars (gitignored, local-only)**`persistent-memory.d/2026-07-01-env-sh-now-persists-the-web-bifrost-bind-vars.md`
- `[2026-07-01]` **Tier-3 stores RESET (operator-directed)**`persistent-memory.d/2026-07-01-tier-3-stores-reset-operator-directed.md`
- `[2026-07-01]` **Embedding-latency loop RESOLVED — it was WORLDTREE's, not ratatoskr (the consumer/provider thesis paid off again)**`persistent-memory.d/2026-07-01-embedding-latency-loop-resolved-it-was-worldt.md`
- `[2026-07-01]` **Web debug-surface parity SHIPPED (`v0.19.2`, `a0a9d5f`) — direct in-session TDD**`persistent-memory.d/2026-07-01-web-debug-surface-parity-shipped-v0-19-2-a0a9.md`
- `[2026-07-01]` **heid-code-review (`v0.19.3`, `75dec01`) — panel caught 2 real client-side SSE-lifecycle bugs TDD missed**`persistent-memory.d/2026-07-01-heid-code-review-v0-19-3-75dec01-panel-caught.md`
- `[2026-07-01]` **Affect snapshot shape CHANGED valence→relations (relation_edge/1) — the persona pane was reading a dead field**`persistent-memory.d/2026-07-01-affect-snapshot-shape-changed-valence-relatio.md`
- `[2026-07-01]` **Trust/warmth VALUES converge and go FLAT at confidence 1.0 — that's WAD, not a stuck pane**`persistent-memory.d/2026-07-01-trust-warmth-values-converge-and-go-flat-at-c.md`
- `[2026-07-01]` **relation_context "stranger" + agency-all-zero flagged to worldtree-dev → both WAD/intentional-v1-deferrals**`persistent-memory.d/2026-07-01-relationcontext-stranger-agency-all-zero-flag.md`
- `[2026-07-01]` **Persona pane displays the CANONICAL affect→NL Worldtree injects — ADOPT, don't invent (operator steer + reference-impl posture)**`persistent-memory.d/2026-07-01-persona-pane-displays-the-canonical-affect-nl.md`
- `[2026-07-01]` **Sindra PAD is over-regulated — characterized via controlled probe, flagged to worldtree-dev (separate affect slice)**`persistent-memory.d/2026-07-01-sindra-pad-is-over-regulated-characterized-vi.md`
- `[2026-07-01]` **Memory plane PROVEN healthy end-to-end**`persistent-memory.d/2026-07-01-memory-plane-proven-healthy-end-to-end.md`
- `[2026-07-01]` **Salience scorer non-discriminating → 3-way routing**`persistent-memory.d/2026-07-01-salience-scorer-non-discriminating-3-way-rout.md`
- `[2026-07-01]` **Canonical check BLOCKED an access_tally fork (reference-impl posture held)**`persistent-memory.d/2026-07-01-canonical-check-blocked-an-accesstally-fork-r.md`
- `[2026-07-01]` **relation_context coherence FIXED upstream (my flag → Worldtree Wave-0, IMPLEMENTED v1.0.0b5)**`persistent-memory.d/2026-07-01-relationcontext-coherence-fixed-upstream-my-f.md`
- `[2026-07-01]` **Foot-gun (measurement, self-caught before flagging): establish the baseline before claiming a rate**`persistent-memory.d/2026-07-01-foot-gun-measurement-self-caught-before-flagg.md`
- `[2026-07-02]` **Salience finding matured into brokkr R28 (OPEN) — ratatoskr is the eval instrument**`persistent-memory.d/2026-07-02-salience-finding-matured-into-brokkr-r28-open.md`
- `[2026-07-02]` **Relational-dynamics arc LIVE on demo (Worldtree v1.0.0b9) — driven by MY relation_context flag**`persistent-memory.d/2026-07-02-relational-dynamics-arc-live-on-demo-worldtre.md`
- `[2026-07-02]` **R28 (salience→promotion-worthiness) CLOSED (operator-directed)**`persistent-memory.d/2026-07-02-r28-salience-promotion-worthiness-closed-oper.md`
- `[2026-07-02]` **R29 (PAD mood-dynamics) finding SHIPPED as Worldtree's A1 anchor fix (demo v1.0.0b14, `e1cdf82`)**`persistent-memory.d/2026-07-02-r29-pad-mood-dynamics-finding-shipped-as-worl.md`
- `[2026-07-03]` **R30 Phase-1 φ0 measured — deployed engine CONFIG-FAITHFUL (φ0≈0.95)**`persistent-memory.d/2026-07-03-r30-phase-1-0-measured-deployed-engine-config.md`
- `[2026-07-03]` **R30 forward disposition (brokkr-owned; tracked at brokkr R30, "brokkr/worldtree will ping")**`persistent-memory.d/2026-07-03-r30-forward-disposition-brokkr-owned-tracked.md`
- `[2026-07-03]` **Relational-arc verify DEFERRED — `relations[]` is Bifrost-provider-only (ADR-0009), confirmed both ways**`persistent-memory.d/2026-07-03-relational-arc-verify-deferred-relations-is-b.md`
- `[2026-07-04]` **R30 CLOSED on offline-tests + human face-validity (operator steer, relayed via worldtree-dev)**`persistent-memory.d/2026-07-04-r30-closed-on-offline-tests-human-face-validi.md`
- `[2026-07-05]` **Authored-history-write primitive proposed -> accepted as Worldtree #347 (Worldtree owns the engine design; ratatoskr = reference consumer)**`persistent-memory.d/2026-07-05-authored-history-write-primitive-proposed-acc.md`
- `[2026-07-05]` **#347 v1 wire validated as reference consumer (GREEN)** → `persistent-memory.d/2026-07-05-347-v1-wire-validated-as-reference-consumer-g.md`
- `[2026-07-06]` **Sindra role character-rp -> character (operator)**`persistent-memory.d/2026-07-06-sindra-role-character-rp-character-operator.md`
- `[2026-07-06]` **Sindra persona/OCEAN DECLARED -> mood fixed (the full diagnostic converged on a stale personal container)**`persistent-memory.d/2026-07-06-sindra-persona-ocean-declared-mood-fixed-the.md`
- `[2026-07-06]` **OpenAPI re-vendored 2.2.0->2.3.0 (`75da676`, pin-only no bump)**`persistent-memory.d/2026-07-06-openapi-re-vendored-2-2-0-2-3-0-75da676-pin-o.md`
- `[2026-07-06]` **#347 authored-history-write CONSUMER SIDE SHIPPED (`v0.19.6`) — direct in-session TDD** → `persistent-memory.d/2026-07-06-347-authored-history-write-consumer-side-ship.md`
- `[2026-07-06]` **Tail-2 SHIPPED (`v0.19.7`) — Tier-3 prose docs re-vendored + persona_state body-shape aligned**`persistent-memory.d/2026-07-06-tail-2-shipped-v0-19-7-tier-3-prose-docs-re-v.md`
- `[2026-07-06]` **Sindra rewritten onto a #347 authored first-message + first-message-preset AUTO-SEED SHIPPED (`v0.19.8`)**`persistent-memory.d/2026-07-06-sindra-rewritten-onto-a-347-authored-first-me.md`
- `[2026-07-06]` **Web UI now RENDERS the seeded first-message (`v0.19.9`) — operator-reported "i don't see Sindra's greeting on the web ui"**`persistent-memory.d/2026-07-06-web-ui-now-renders-the-seeded-first-message-v.md`
- `[2026-07-06]` **Web UI: pivot from incremental CSS polish to a designed prototype (Claude Design) that I wire into**`persistent-memory.d/2026-07-06-web-ui-pivot-from-incremental-css-polish-to-a.md`
- `[2026-07-07]` **Affect-egress reference delivered by worldtree-dev + a we-framing render DRIFT-WATCH banked**`persistent-memory.d/2026-07-07-affect-egress-reference-delivered-by-worldtre.md`
- `[2026-07-12]` **R34/R35 character-self-report reframe LIVE (WT b53); affect-half VALIDATED in prod, powered memory-half eval GREENLIT + designed**`persistent-memory.d/2026-07-12-r34-r35-character-self-report-reframe-live-wt.md`
- `[2026-07-12]` **Capture-path resolved → a worldtree producer-probe (ratatoskr-caught blocker)**`persistent-memory.d/2026-07-12-capture-path-resolved-a-worldtree-producer-pr.md`
- `[2026-07-12]` **bifrost 1.1.1 adopted (v0.20.10, pushed) — the library-level fix for the frozen-v0.6 handshake leak**`persistent-memory.d/2026-07-12-bifrost-1-1-1-adopted-v0-20-10-pushed-the-lib.md`
- `[2026-07-10]` **Bifrost bound-handshake blocker → bifrost 1.1.0 broke frozen-v0.6; fixed by Worldtree b47/wire-v0.7, our side needed ZERO change**`persistent-memory.d/2026-07-10-bifrost-bound-handshake-blocker-bifrost-1-1-0.md`
- `[2026-07-09]` **Sindra PATCHed to `character-rp` → Deckard reasoning-RP seat (operator-directed, INTERIM)**`persistent-memory.d/2026-07-09-sindra-patched-to-character-rp-deckard-reason.md`
- `[2026-07-08]` **PAD display relaxed for R32-1B unbounded-z, done PROACTIVELY (`v0.20.9`, patch, operator-directed "sindra full and unbounded")**`persistent-memory.d/2026-07-08-pad-display-relaxed-for-r32-1b-unbounded-z-do.md`
- `[2026-07-07]` **Web-UI iteration-3 SHIPPED (`v0.20.7`, patch) — all three queued items + the memory 0/0 root-caused**`persistent-memory.d/2026-07-07-web-ui-iteration-3-shipped-v0-20-7-patch-all.md`
- `[2026-07-07]` **Web-UI next-work QUEUED for a fresh-context session (operator-directed `/snapshot` handoff) — full specs in Current state § ⏭ QUEUED**`persistent-memory.d/2026-07-07-web-ui-next-work-queued-for-a-fresh-context-s.md`
- `[2026-07-07]` **Markdown pass-1 SHIPPED (`v0.20.6`) — RP semantic coloring + paragraph reflow (operator-directed markdown rework, step ①)**`persistent-memory.d/2026-07-07-markdown-pass-1-shipped-v0-20-6-rp-semantic-c.md`
- `[2026-07-07]` **Affect-derived tooltips (`v0.20.5`) + transparent squirrel vendored + v0.20.0.5 PUSHED to origin (operator-authorized)**`persistent-memory.d/2026-07-07-affect-derived-tooltips-v0-20-5-transparent-s.md`
- `[2026-07-07]` **SVG sparklines + 3D mood cube imported from the updated Claude Design prototype (`v0.20.4`) — operator: "the svg sparklines and the new 3d graph"**`persistent-memory.d/2026-07-07-svg-sparklines-3d-mood-cube-imported-from-the.md`
- `[2026-07-07]` **Brand mark + favicon → the aurora squirrel (`v0.20.3`), replacing the `ᛯ` rune**`persistent-memory.d/2026-07-07-brand-mark-favicon-the-aurora-squirrel-v0-20.md`
- `[2026-07-07]` **Context-injection view SHIPPED (`v0.20.2`) — the console now reconstructs the FULL hidden affect block Worldtree injects into the agent's system prompt (operator: "use that canon in the interface, see as much context injection as possible")**`persistent-memory.d/2026-07-07-context-injection-view-shipped-v0-20-2-the-co.md`
- `[2026-07-06]` **Claude Design console SHIPPED (`v0.20.0` MINOR, operator-approved) — see Current state for the full record**`persistent-memory.d/2026-07-06-claude-design-console-shipped-v0-20-0-minor-o.md`
- `[2026-07-13]` **P06 memory-half DRIVEN + SCORED — the reframe's memory mechanism is validated**`persistent-memory.d/2026-07-13-p06-memory-half-driven-scored-the-reframe-s-m.md`
- `[2026-07-13]` **Memory extraction turned REASONING-OFF for the eval (operator-directed)**`persistent-memory.d/2026-07-13-memory-extraction-turned-reasoning-off-for-th.md`
- `[2026-07-13]` **Vendored the brokkr R34 psych-profile canon (Vuong-directed) — BOTH files, not just the parameters**`persistent-memory.d/2026-07-13-vendored-the-brokkr-r34-psych-profile-canon-v.md`
- `[2026-07-13]` **Affect-egress "coordinated re-vendor" open item RESOLVED — it was a benign R32-1B doc note, not the we-framing conditional**`persistent-memory.d/2026-07-13-affect-egress-coordinated-re-vendor-open-item.md`
- `[2026-07-13]` **WT #355 root-caused via ratatoskr telemetry (Vuong-routed via soong-dev)**`persistent-memory.d/2026-07-13-wt-355-root-caused-via-ratatoskr-telemetry-vu.md`
- `[2026-07-13]` **WT #355 VALIDATION — fix CONFIRMED; the standing loop-in obligation is DISCHARGED**`persistent-memory.d/2026-07-13-wt-355-validation-fix-confirmed-the-standing.md`
- `[2026-07-13]` **b61 adopted as the personal target — the orthogonal over-budget TRIGGER also fixed**`persistent-memory.d/2026-07-13-b61-adopted-as-the-personal-target-the-orthog.md`
- `[2026-07-13]` **Cleaned + prepped for a Sindra run (operator: "clean up everything + prep")**`persistent-memory.d/2026-07-13-cleaned-prepped-for-a-sindra-run-operator-cle.md`
- `[2026-07-14]` **soong-lab adopted as our Tier-3 agent-authoring studio (operator-directed)**`persistent-memory.d/2026-07-14-soong-lab-adopted-as-our-tier-3-agent-authori.md`
- `[2026-07-15]` **Cross-session recall failure root-caused → the person-prime `scan` build**`persistent-memory.d/2026-07-15-cross-session-recall-failure-root-caused-the.md`
- `[2026-07-15]` **Sindra redefined from the soong-lab bundle**`persistent-memory.d/2026-07-15-sindra-redefined-from-the-soong-lab-bundle.md`
- `[2026-07-16]` **WT #364 + brokkr R39 re-drive (DECISIVE) — name-recall root-caused Worldtree-side; the fix is the signal FAMILY, not a threshold**`persistent-memory.d/2026-07-16-wt-364-brokkr-r39-re-drive-decisive-name-reca.md`
- `[2026-07-16]` **bifrost ruled scan snapshot-cursor NORMATIVE (offset NOT blessed) + shipped conformance coverage in bifrost 1.1.3**`persistent-memory.d/2026-07-16-bifrost-ruled-scan-snapshot-cursor-normative.md`
- `[2026-07-16]` **brokkr flagged ratatoskr as R39 Phase-2 PROBE-RUNNER (Arm-2 contradiction set = our frozen 10-chunk specimen); ACCEPTED IN PRINCIPLE (Vuong 2026-07-16) — formal scope + effort commit lands when Arm-2 actually spins**`persistent-memory.d/2026-07-16-brokkr-flagged-ratatoskr-as-r39-phase-2-probe.md`
- `[2026-07-17]` **`mark_superseded` verb SHIPPED + live-verified (v0.20.15, `be2c577`) — WT #364 durable retirement lands on our store; #364 CLOSED end-to-end both sides** → `persistent-memory.d/2026-07-17-marksuperseded-verb-shipped-live-verified-v0.md`
- `[2026-07-17]` **Web-console UI (v0.20.16, pushed): code-block word-wrap + per-code-block & per-turn copy buttons**`persistent-memory.d/2026-07-17-web-console-ui-v0-20-16-pushed-code-block-wor.md`
- `[2026-07-17]` **P06-driver referential-frame A/B/C probe QUEUED (operator-ratified, deploy-gated on WT b122)**`persistent-memory.d/2026-07-17-p06-driver-referential-frame-a-b-c-probe-queu.md`
- `[2026-07-17]` **Sindra live memory.db tidied to a 5-fact PRISTINE baseline for a test drive**`persistent-memory.d/2026-07-17-sindra-live-memory-db-tidied-to-a-5-fact-pris.md`
- `[2026-07-18]` **#368 (user, character) memory silo test — DONE, PASSED live (WT b127).** Write + read isolation both proven end-to-end; betty (throwaway) deleted; the immediate post-clear action, closed. → `persistent-memory.d/2026-07-18-368-silo-test-passed.md`
_46 older entries (2026-05-* debug-TUI/web era + the 2026-06-14→16 Bifrost-provider build era) archived to archival-memory.md._
_For per-issue TDD implementation notes, Volva findings, and contract amendments, see the git log — every per-issue commit carries a structured message capturing the trail._
## Tried and abandoned
Log of approaches that were tried and rejected, with rationale. Future-self
defense against re-attempting the same cul-de-sac.
- `[2026-07-10]` **Reverting our provider to bifrost 1.0.0 to fix the bound-handshake `schema_validation_failed` — DISPROVEN, and it would've been the WRONG state**`persistent-memory.d/2026-07-10-reverting-our-provider-to-bifrost-1-0-0-to-fi.md`
- `[2026-06-15]` **"Sindra hasn't been registered" was an under-verified inference — WRONG** → `persistent-memory.d/2026-06-15-sindra-hasn-t-been-registered-was-an-under-ve.md`
- `[2026-06-14]` **Artifact-only contract review can't validate against a dependency's ACTUAL behavior**`persistent-memory.d/2026-06-14-artifact-only-contract-review-can-t-validate.md`
- `[2026-06-15]` **"byte-equal" round-trip slip propagated affect→memory via copy-paste** → `persistent-memory.d/2026-06-15-byte-equal-round-trip-slip-propagated-affect.md`
- `[2026-06-15]` **Canonical sync retired the issue-scoped parser staleness.** `contract_parser.py` synced to v2.1 (commit `d85ab43`): now validates issue-scoped frontmatter + four v2.1 test categories. The old "treat parser ERROR-on-issue-scoped as expected" note no longer applies.
- `[2026-06-15]` **Memory plane TDD'd + shipped**`persistent-memory.d/2026-06-15-memory-plane-tdd-d-shipped.md`
- `[2026-06-15]` **Memory provider LIVE-PROVEN against personal v0.35.3; recall-injection is upstream**`persistent-memory.d/2026-06-15-memory-provider-live-proven-against-personal.md`
- `[2026-06-15]` **Diagnostic: our recall-search is SOUND — the cross-session recall gap is UPSTREAM, and it caught an upstream bug**`persistent-memory.d/2026-06-15-diagnostic-our-recall-search-is-sound-the-cro.md`
- `[2026-06-15]` **"Wire 200 ≠ recall works" — prove recall efficacy at the model's answer in a COLD (history-free) session, not on the wire** → `persistent-memory.d/2026-06-15-wire-200-recall-works-prove-recall-efficacy-a.md`
- `[2026-06-15]` **Issue #17 filed.** REVERSES design-brief §6's "no Bifrost-binding consumer support" — that negative clause predates ratatoskr's provider identity (2026-06-14), so the canary now owns both ends but its client couldn't drive its own provider. (Shipped 2026-06-18.)
- `[2026-06-16]` **`scripts/contract_drift_check.py` defaults `GITEA_REPO` to "Worldtree"** (line 74), so a bare run in ratatoskr false-positives DRIFT by hashing Worldtree's same-numbered issue. Always `export GITEA_REPO=ratatoskr GITEA_OWNER=vh` before running the drift-checker here.
- `[2026-06-16]` **My #295 coupling hypothesis (the promoted question crowds out the fact at small top_k) was REFUTED**`persistent-memory.d/2026-06-16-my-295-coupling-hypothesis-the-promoted-quest.md`
- `[2026-06-16]` **#17 contract drifted from its own design in two spots, caught only by `/heid-contract-review` (not same-author paraphrase):** → `persistent-memory.d/2026-06-16-17-contract-drifted-from-its-own-design-in-tw.md`
- `[2026-06-16]` **"No promotion" was checked TOO EARLY — Tier-3 promotion is ASYNC (lands AFTER the SSE turn-end)** → `persistent-memory.d/2026-06-16-no-promotion-was-checked-too-early-tier-3-pro.md`
- `[2026-06-17]` **"sindra is GONE" (infra-ops, from `GET /agents` + admin token) was a FALSE NEGATIVE** → `persistent-memory.d/2026-06-17-sindra-is-gone-infra-ops-from-get-agents-admi.md`
- `[2026-06-17]` **"Promotion didn't fire → #296" was PREMATURE — twice over** → `persistent-memory.d/2026-06-17-promotion-didn-t-fire-296-was-premature-twice.md`
- `[2026-06-18]` **Wiping our `:8391` store does NOT reset Worldtree's promotion-side dedup**`persistent-memory.d/2026-06-18-wiping-our-8391-store-does-not-reset-worldtre.md`
- `[2026-06-18]` **`affect.emit` is POST-TURN ASYNC — checking the op-feed immediately after a turn MISSES it** → `persistent-memory.d/2026-06-18-affect-emit-is-post-turn-async-checking-the-o.md`
- `[2026-06-18]` **Rationalized away a KNOWN contract-invariant deviation during TDD — only the cross-model code-review caught it**`persistent-memory.d/2026-06-18-rationalized-away-a-known-contract-invariant.md`
- `[2026-06-18]` **Latent SQLite thread-safety bug in the affect store, surfaced ONLY by the new HTTP read route**`persistent-memory.d/2026-06-18-latent-sqlite-thread-safety-bug-in-the-affect.md`
- `[2026-06-19]` **The SAME `check_same_thread` sqlite bug recurred in the MEMORY store — exposed by the contract-mandated `search` dispatch test (TestClient = worker thread)**`persistent-memory.d/2026-06-19-the-same-checksamethread-sqlite-bug-recurred.md`
- `[2026-06-19]` **Full WT-driven `:8392` live-smoke is infra-gated — `:8392` not in WT's `BIFROST_CLIENT_ALLOWED_HOSTS` (bind 422s)**`persistent-memory.d/2026-06-19-full-wt-driven-8392-live-smoke-is-infra-gated.md`
- `[2026-06-19]` **heid-code-review pulled MORE weight than its own "marginal" self-assessment**`persistent-memory.d/2026-06-19-heid-code-review-pulled-more-weight-than-its.md`
- `[2026-06-20]` **The post-turn-async timing trap bit AGAIN — even a 35s post-`[done]` read missed the promotion `upsert_many` by ~2s**`persistent-memory.d/2026-06-20-the-post-turn-async-timing-trap-bit-again-eve.md`
- `[2026-06-30]` **Heimdall keys are PER-INSTANCE — a key minted on one Worldtree 401s on another**`persistent-memory.d/2026-06-30-heimdall-keys-are-per-instance-a-key-minted-o.md`
- `[2026-06-30]` **`tea comment <N>` hangs on Gitea** → `persistent-memory.d/2026-06-30-tea-comment-n-hangs-on-gitea.md`
- `[2026-07-02]` **Mask-HOSTED transient characters have a STATIC mood engine — cost a whole R29 probe**`persistent-memory.d/2026-07-02-mask-hosted-transient-characters-have-a-stati.md`
- `[2026-07-03]` **The "neutral non-appraising tail" premise fails — the neutral MESSAGE choice dominates**`persistent-memory.d/2026-07-03-the-neutral-non-appraising-tail-premise-fails.md`
- `[2026-07-03]` **Two φ0-fit traps: fast-turn timescale + low-baseline conditioning**`persistent-memory.d/2026-07-03-two-0-fit-traps-fast-turn-timescale-low-basel.md`
- `[2026-07-06]` **`persona_state` + the agent envelope are Tier-3-BLIND -- NOT valid signals for "did a persona store"** → `persistent-memory.d/2026-07-06-personastate-the-agent-envelope-are-tier-3-bl.md`
- `[2026-07-06]` **Raw `POST /sessions` is NOT Bifrost-bound -> zero affect/memory emits**`persistent-memory.d/2026-07-06-raw-post-sessions-is-not-bifrost-bound-zero-a.md`
- `[2026-07-06]` **A fast/"no-op" deploy can leave a STALE container running the old image -- verify the running version, not the deploy status**`persistent-memory.d/2026-07-06-a-fast-no-op-deploy-can-leave-a-stale-contain.md`
- `[2026-07-06]` **#348 OCEAN key-mismatch: a declared OCEAN silently resolved to neutral** → `persistent-memory.d/2026-07-06-348-ocean-key-mismatch-a-declared-ocean-silen.md`
- `[2026-07-06]` **`pkill -f "ratatoskr-web --host"` SELF-MATCHES the bash command running it** → `persistent-memory.d/2026-07-06-pkill-f-ratatoskr-web-host-self-matches-the-b.md`
- `[2026-07-06]` **Playwright: no python `playwright` module in the venv; use NODE playwright + an explicit `executablePath`**`persistent-memory.d/2026-07-06-playwright-no-python-playwright-module-in-the.md`
- `[2026-07-06]` **The Bash tool's `grep` is a ugrep-wrapper (`--ignore-files -I`) that silently returns NOTHING on some files**`persistent-memory.d/2026-07-06-the-bash-tool-s-grep-is-a-ugrep-wrapper-ignor.md`
- `[2026-07-06]` **`DesignSync` (claude.ai/design MCP) needs claude.ai design scopes before ANY method works** → `persistent-memory.d/2026-07-06-designsync-claude-ai-design-mcp-needs-claude.md`
- `[2026-07-13]` **`thinking_enabled=False` on the define was a NO-OP — char-rp-reasoning ignores it** → `persistent-memory.d/2026-07-13-thinkingenabled-false-on-the-define-was-a-no.md`
- `[2026-07-13]` **A same-image redeploy does NOT reload a bind-mounted config — the ModelRegistry boot-caches it at `__init__`**`persistent-memory.d/2026-07-13-a-same-image-redeploy-does-not-reload-a-bind.md`
- `[2026-07-15]` **soong-lab bundle `ship.native.motivational.goals/fears` are bare STRINGS, but WT `agents.define` requires OBJECTS**`persistent-memory.d/2026-07-15-soong-lab-bundle-ship-native-motivational-goa.md`
- `[2026-07-15]` **`re.sub`/`re.subn` INTERPRETS backslash-escapes in the REPLACEMENT string** → `persistent-memory.d/2026-07-15-re-sub-re-subn-interprets-backslash-escapes-i.md`
- `[2026-07-13]` **Called Deckard "hung" off a short timeout — WRONG (operator correction)**`persistent-memory.d/2026-07-13-called-deckard-hung-off-a-short-timeout-wrong.md`
- `[2026-07-13]` **Resumed-session context-snapshot is IN-MEMORY → lost on a container recreate (agent_not_available on resume)**`persistent-memory.d/2026-07-13-resumed-session-context-snapshot-is-in-memory.md`
- `[2026-07-16]` **`sortable_chunk_fields` advertised WITHOUT the required `type` field = whole-handshake deploy-breaker; only DRIVING the real bind caught it** → `persistent-memory.d/2026-07-16-sortablechunkfields-advertised-without-the-re.md`
_18 older entries (2026-05-* — the original debug-TUI/web build era) archived to archival-memory.md._