Stack: Claude Code, Opus 4.8 at extra-high reasoning effort while building the workflows, so model tier is not the variable.
Symptom: on the machine where I built it, the agent nails conventions and picks the right procedure unprompted. Same repo on another PC (or after splitting the monorepo into per-tier repos) and it gets visibly dumber. Same model, same files, same prompts. I ran several passes of flow debugging, routing tuning, and file cleanup, with no change.
So I went hunting for what differs between machines but isn't in the repo. I found two things, both unversioned and both silent. First, the agent's per-project memory store, which is keyed by project path and lives outside git; on the dev box it had been quietly complementing the KB for weeks, and on a new path the bucket is empty, so a whole layer is gone with no error thrown. Second, local harness config (session hooks and settings) that primed routing at startup, which also doesn't travel.
The part I almost missed: re-homing those facts into canonical docs is necessary but not sufficient. A rule already written in its canonical home still got skipped, because written is not the same as loaded at task time. Where I landed: performance = model x context actually loaded at runtime. Migration never touches the model, it fragments the loaded context.
Fix direction: split durability (one canonical home per fact) from availability (always-on Layer 0 for cross-cutting rules, verb-routed pointers for the rest), then verify in a clean, memory-less session that the rule surfaces by its trigger rather than because I already knew it.
Questions:
1. Is leaning on out-of-repo agent memory the classic first mistake, or am I misreading something structural in ICM?
2. Is there an ICM-native pattern for making a fact load-bearing (guaranteed in context at task time) vs just present in the tree?
3. Any heuristic for the always-on vs routed split before Layer 0 bloats?
4. Other unversioned dependencies that silently don't travel, beyond memory and local hooks?