Part of Epic #12416 (graduated from Discussion #12412).
Context
Each clone/worktree defaults .neo-ai-data to cwd-relative, requiring a manual bootstrapWorktree --link-data symlink pass. Missing it -> isolated graph -> bound:false (the live @neo-claude-opus failure tonight, #11812: the memory-core clone missed the identityRoots.mjs pull -> empty per-clone graph).
Scope
Introduce a NEO_AI_DATA_ROOT config/env that resolves the shared canonical data root, so all consumers that persist Agent OS runtime state can read one shared location by config instead of depending on per-clone symlinks.
The shipped surface is broader than the original graph/chroma/wake shorthand:
- Top-level AI config:
aiDataRoot, backup path, wake-daemon heartbeat sentinel, and Chroma persist directory defaults.
- Memory Core config: graph SQLite, wake-daemon watermarks/cursors, REM run state, RLAIF dataset path, and shared MCP logs.
- Knowledge Base / Neural Link configs: shared
aiDataRoot and shared log directory; KB Chroma path follows top-level AiConfig.engines.chroma.dataDir. Their telemetry/action-log DB sinks stay on their existing explicit keys unless narrower overrides move them.
- Daemon and lifecycle runtime state: bridge DB/state/logs, orchestrator task/chroma/data defaults, orchestrator daemon state, heavy-maintenance lease, wake-decision backoff, wake safety gate, inflight/heartbeat locks, trio/resume cooldowns, harness lifecycle state, and heartbeat liveness lookup.
- Operator startup guidance:
AGENTS_STARTUP.md documents when NEO_AI_DATA_ROOT replaces --link-data for independent clones and that identity-root seeding is additive, not garbage-collecting.
Existing narrower overrides still win when explicitly set.
Acceptance Criteria
Contract Ledger
| Surface |
Source of Authority |
Behavior |
Fallback |
Evidence |
NEO_AI_DATA_ROOT / aiDataRoot |
this ticket / Epic #12416 / Discussion #12412 |
canonical shared Agent OS runtime data root for graph, Chroma, wake-daemon state, backups, logs, REM, datasets, orchestrator state, locks, cooldowns, harness state, and heartbeat liveness |
historical cwd/script-root .neo-ai-data defaults when unset |
unit + post-merge fresh-clone validation |
| Narrower path overrides |
existing config/env contract |
path-specific overrides win over the shared-root default (NEO_MEMORY_DB_PATH, NEO_AI_DB_PATH, NEO_AI_DAEMON_DIR, NEO_CHROMA_DATA_DIR, NEO_BACKUP_PATH, NEO_HEARTBEAT_ALIVE_PATH, WAKE_GATE_FILE_PATH, and sibling explicit keys) |
shared-root-derived path |
unit |
Top-level ai/config.template.mjs |
this ticket |
backupPath, wakeDaemonHeartbeatAlivePath, and engines.chroma.dataDir derive from aiDataRoot |
<neoRootDir>/.neo-ai-data/... |
unit / static config-shape |
| Memory Core config template |
this ticket |
graph SQLite, wake-daemon watermarks/cursors, REM run state, RLAIF dataset path, and Memory Core logs derive from aiDataRoot |
<neoRootDir>/.neo-ai-data/... or explicit narrower override |
unit |
| Knowledge Base / Neural Link config templates |
this ticket |
shared aiDataRoot and shared logs directory; KB Chroma follows top-level AiConfig.engines.chroma.dataDir; telemetry/action-log DB sinks remain on their existing explicit keys |
existing per-server defaults / explicit DB overrides |
unit |
| Bridge / orchestrator / lifecycle runtime defaults |
this ticket |
bridge DB/state/logs, orchestrator state/tasks, Chroma launch path, heavy-maintenance lease, wake decision/backoff, wake safety gate, inflight and heartbeat locks, trio/resume cooldowns, harness lifecycle state, and heartbeat liveness resolve below NEO_AI_DATA_ROOT when set |
prior relative or script-root defaults when unset |
unit + node --check |
| Operator startup guidance |
AGENTS_STARTUP.md |
documents NEO_AI_DATA_ROOT as the tracked config/runtime equivalent of data symlinks for independent clones and documents additive identity-root seeding |
bootstrapWorktree --link-data remains the default for true git worktrees |
docs + peer A2A |
Related
Epic #12416; design Discussion #12412; failure anchor #11812; PR #12420; complements bootstrapWorktree --link-data (#12401 bridge-to-wake rename adjacent).
Part of Epic #12416 (graduated from Discussion #12412).
Context
Each clone/worktree defaults
.neo-ai-datato cwd-relative, requiring a manualbootstrapWorktree --link-datasymlink pass. Missing it -> isolated graph ->bound:false(the live@neo-claude-opusfailure tonight, #11812: the memory-core clone missed theidentityRoots.mjspull -> empty per-clone graph).Scope
Introduce a
NEO_AI_DATA_ROOTconfig/env that resolves the shared canonical data root, so all consumers that persist Agent OS runtime state can read one shared location by config instead of depending on per-clone symlinks.The shipped surface is broader than the original graph/chroma/wake shorthand:
aiDataRoot, backup path, wake-daemon heartbeat sentinel, and Chroma persist directory defaults.aiDataRootand shared log directory; KB Chroma path follows top-levelAiConfig.engines.chroma.dataDir. Their telemetry/action-log DB sinks stay on their existing explicit keys unless narrower overrides move them.AGENTS_STARTUP.mddocuments whenNEO_AI_DATA_ROOTreplaces--link-datafor independent clones and that identity-root seeding is additive, not garbage-collecting.Existing narrower overrides still win when explicitly set.
Acceptance Criteria
NEO_AI_DATA_ROOT(env/config) resolves the shared data root; memory-core graph, Chroma, wake-daemon state, and sibling Agent OS runtime-data surfaces honor it..neo-ai-datasymlinks to share the graph -- the clone-stalenessbound:falseclass is structurally removed.Contract Ledger
NEO_AI_DATA_ROOT/aiDataRoot.neo-ai-datadefaults when unsetNEO_MEMORY_DB_PATH,NEO_AI_DB_PATH,NEO_AI_DAEMON_DIR,NEO_CHROMA_DATA_DIR,NEO_BACKUP_PATH,NEO_HEARTBEAT_ALIVE_PATH,WAKE_GATE_FILE_PATH, and sibling explicit keys)ai/config.template.mjsbackupPath,wakeDaemonHeartbeatAlivePath, andengines.chroma.dataDirderive fromaiDataRoot<neoRootDir>/.neo-ai-data/...aiDataRoot<neoRootDir>/.neo-ai-data/...or explicit narrower overrideaiDataRootand shared logs directory; KB Chroma follows top-levelAiConfig.engines.chroma.dataDir; telemetry/action-log DB sinks remain on their existing explicit keysNEO_AI_DATA_ROOTwhen setnode --checkAGENTS_STARTUP.mdNEO_AI_DATA_ROOTas the tracked config/runtime equivalent of data symlinks for independent clones and documents additive identity-root seedingbootstrapWorktree --link-dataremains the default for true git worktreesRelated
Epic #12416; design Discussion #12412; failure anchor #11812; PR #12420; complements
bootstrapWorktree --link-data(#12401 bridge-to-wake rename adjacent).