Session captured: the FV outbound-NAT root cause and its diagnostic signature, the fv-ml1 dead man's switch, fleet identity/group/path conventions and the root:docker normalization, nh3-dev's ts-input reachability fix, ESPHome modernisation and the kb KB-search tool, and the Hermes bearer rotation release. Six new detail files. Tried-and-abandoned gains three: probing OPNsense endpoints by POSTing at them (which rebooted the FV firewall), advertising a /32 from nh3-dev, and the nh3-scale remote-site masquerade rules that fired but were not the fix. Housekeeping: 8 Recent-decisions entries archived to archival-memory.md, and 21 oversized inline entries split into detail files per the two-tier rule -- they had been sitting fully inline in the index, which is what the split exists to prevent. Two pointers to a detail file archived this run were repointed at archival-memory.md. The index is 389 lines, still over the ~300 soft cap. The archival guards stop it there: only 4 further entries are old enough to move and every one carries an open deferred-work pointer. An over-cap file that keeps live decisions beats a scannable one that lost a deferred call.
1.5 KiB
[2026-09-11] Worldtree memory-split (U6) — PROTOCOL AGREED with worldtree-dev: nobody flips memory.reader.enabled or `mem
Worldtree memory-split (U6) — PROTOCOL AGREED with worldtree-dev: nobody flips memory.reader.enabled or memory.writer.enabled on any deployment without infra-ops first confirming the memory root is writable by the container's uid. The reader REFUSES AT BOOT if it cannot append+read back <memory root>/reader/canary.jsonl (deliberate, the #335 typo'd-reranker precedent: refuse loudly, never silently disable); per-euid subdirs are created lazily and only warn, so the root canary is the only boot-blocking check. The writer degrades rather than refuses. Both ship DARK (enabled: false, parity-only config/defaults.yaml) until the operator schedules the tracer skeleton. ⭐ Measured 2026-09-11 on corviduo-dev — all three deployments PASS: demo :8080 uid 0 and personal :8081 uid 0 both have /data/state/memory at 1000:1000 755 writable; pinned :8082 uid 1000 lacks memory/ but its parent /data/state is 1000:1000 755 so it can create it. ⚠ I had predicted personal was uid 1000 and warned it would fail — wrong, retracted; only pinned runs as 1000, and it passes anyway. ⚠ Re-probe immediately before any flip: a permissions reading is a claim about its own date, not about boot time. Heimdall side is clear too — demo and personal grant 7x tool.*, pinned uses image defaults, and the lone tool.evidence.* is additive, so tool.memory_read needs no policy change. Thread 01M2A05WED5W.