Summary
DeployCore scaffolds <configRoot>/LIFEOS/MEMORY/ as a real directory in the system
tree, but SystemUserBoundary.md specifies it must be a symlink into the USER data
repo. LinkUser only links USER, never MEMORY. The result is that LifeOS's own
system/user boundary guard refuses every KNOWLEDGE and proposal write the memory reviewer
produces.
What the boundary doc specifies
LIFEOS/DOCUMENTATION/SystemUserBoundary.md, line 57:
~/.claude/LIFEOS/MEMORY/** (symlink → ~/.config/LIFEOS/USER/MEMORY/**, post-Phase-G.2,
2026-05-23) | USER (work history, knowledge graph, learning signals, ...)
What a fresh install actually produces
DeployCore emits plain mkdir actions:
mkdir -p <configRoot>\LIFEOS\MEMORY\WORK
mkdir -p <configRoot>\LIFEOS\MEMORY\KNOWLEDGE
mkdir -p <configRoot>\LIFEOS\MEMORY\LEARNING
mkdir -p <configRoot>\LIFEOS\MEMORY\STATE
mkdir -p <configRoot>\LIFEOS\MEMORY\OBSERVABILITY
mkdir -p <configRoot>\LIFEOS\MEMORY\SKILLS
LinkUser then reports "<configRoot>\LIFEOS\USER → <dataRoot>\USER" and stops. MEMORY
is never relocated or linked, and <dataRoot>/MEMORY does not exist.
Symptom
The first successful memory reviewer run dispatches its items and 3 of 5 are refused:
EWRITE_FAILED: memory write refused at the system/user boundary: resolved target
<configRoot>\LIFEOS\MEMORY\KNOWLEDGE\Companies\<name>.md is outside the USER_DATA repo
(<dataRoot>\USER) — personal data must never land in the system tree (SystemUserBoundary.md)
Same for MEMORY/OBSERVABILITY/pending-proposals.jsonl.
The hot-layer writes (PRINCIPAL_MEMORY.md, DA_MEMORY.md) succeed, because those live under
USER/ which is linked. So the failure is partial and easy to miss: memory appears to work
while the entire knowledge archive and the proposal queue are silently rejected.
Reproduction
- Fresh install on a machine where
LinkUser relocates USER to a separate data root.
ls -la <configRoot>/LIFEOS/ — MEMORY is a directory, not a link.
- Trigger a reviewer run that emits a
knowledge item.
- Observe
EWRITE_FAILED for every non-USER target.
Fix applied locally
Moved the tree into the data root and linked it back, which resolved every refusal:
mv <configRoot>/LIFEOS/MEMORY <dataRoot>/USER/MEMORY
# Windows, unelevated (see #1730 for why a junction rather than a symlink):
New-Item -ItemType Junction -Path <configRoot>\LIFEOS\MEMORY -Target <dataRoot>\USER\MEMORY
After this the same reviewer run returns succeeded: 2, failed: 0 and the knowledge files
land in the USER repo where the boundary guard expects them.
Suggested fix
LinkUser should handle MEMORY the same way it handles USER: relocate any existing
content into the data root, then link. Alternatively DeployCore should not create
MEMORY/ in the system tree at all and leave it to LinkUser, since the boundary doc makes
the USER data repo its only legitimate home.
Summary
DeployCorescaffolds<configRoot>/LIFEOS/MEMORY/as a real directory in the systemtree, but
SystemUserBoundary.mdspecifies it must be a symlink into the USER datarepo.
LinkUseronly linksUSER, neverMEMORY. The result is that LifeOS's ownsystem/user boundary guard refuses every KNOWLEDGE and proposal write the memory reviewer
produces.
What the boundary doc specifies
LIFEOS/DOCUMENTATION/SystemUserBoundary.md, line 57:What a fresh install actually produces
DeployCoreemits plainmkdiractions:LinkUserthen reports"<configRoot>\LIFEOS\USER → <dataRoot>\USER"and stops.MEMORYis never relocated or linked, and
<dataRoot>/MEMORYdoes not exist.Symptom
The first successful memory reviewer run dispatches its items and 3 of 5 are refused:
Same for
MEMORY/OBSERVABILITY/pending-proposals.jsonl.The hot-layer writes (
PRINCIPAL_MEMORY.md,DA_MEMORY.md) succeed, because those live underUSER/which is linked. So the failure is partial and easy to miss: memory appears to workwhile the entire knowledge archive and the proposal queue are silently rejected.
Reproduction
LinkUserrelocates USER to a separate data root.ls -la <configRoot>/LIFEOS/—MEMORYis a directory, not a link.knowledgeitem.EWRITE_FAILEDfor every non-USER target.Fix applied locally
Moved the tree into the data root and linked it back, which resolved every refusal:
After this the same reviewer run returns
succeeded: 2, failed: 0and the knowledge filesland in the USER repo where the boundary guard expects them.
Suggested fix
LinkUsershould handleMEMORYthe same way it handlesUSER: relocate any existingcontent into the data root, then link. Alternatively
DeployCoreshould not createMEMORY/in the system tree at all and leave it toLinkUser, since the boundary doc makesthe USER data repo its only legitimate home.