2026-11-02: Claude’s memory is split by JOB, not by type. MEMORY.md is a small always-loaded ROUTER holding every standing rule (feedback_, user_) in full, because rules fire whether or not anyone thinks to look them up. Per-memory lines for reference_/project_ moved to CATALOG.md, the complete listing generated from each file’s own frontmatter by /opt/scripts/memory-catalog.py and never auto-loaded; those are reached by brain.js recall. Trigger: MEMORY.md hit 27,683 bytes against a server-side load cap above 24 KB and was silently loading only partially, so older rules stopped reaching sessions with no error. Trimming was rejected as a treadmill: 46 memory files were written in 30 days, and reference+project drove 75% of growth (70 of 93 files in 60 days) while being exactly the class recall finds without an index line. Result: 27,683 → 8,887 bytes with all 70 rules retained, 270 memories catalogued, zero orphans. brain.js (vendored, not a git repo) gained store pointer routing by type + a 20,000-byte over-cap warning, and recall gained a content-scan fallback after a proven gap (a query whose words appeared in no filename returned an unrelated file at score 1 while the answer sat in two files it never opened); patch kept at /opt/scripts/rubric-brain-patches/01-router-catalog-split.patch. claude-home 8f6e155 + 2129d34, mostly-ops da0816e. Session narrative belongs in SESSION_LOG.md, never a memory file.