# `[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 `/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`.