Context
Surfaced during #14304 (Agent OS Architecture Quality) Lane-1 cruft-item V-B-A on 2026-07-02 (#14304 comment IC_kwDODSospM8AAAABIdVFPQ). The epic body's Remove: ai/data/ → delete line is wrong and dangerous — ai/data/memory-core/lazy-edges.jsonl is not cruft, it is a live runtime queue. Acting on the epic's word would silently break the lazy-edge resolution path. This ticket captures the real scoped change the "delete" line should become.
The Problem
aiConfig.lazyEdgesQueuePath defaults to a git-tracked location (ai/data/memory-core/lazy-edges.jsonl). Runtime appends therefore land in a tracked file, and the data-sync pipeline commits them → recurring churn — the same anti-pattern class as the .neo-ai-data runtime store (which IS gitignored). A transient drain-queue must not be version-controlled.
The Architectural Reality
- SSOT default:
ai/mcp/server/memory-core/config.template.mjs:744 — lazyEdgesQueuePath: leaf(path.resolve(cwd, 'ai/data/memory-core/lazy-edges.jsonl'), 'NEO_LAZY_EDGES_QUEUE_PATH', 'string').
- Producer:
ai/services/graph/SemanticGraphExtractor.mjs:877 appends unresolved edges to AiConfig.lazyEdgesQueuePath.
- Consumers:
ai/services/graph/LazyEdgeDrainer.mjs (drains into the Native Edge Graph) + priorityBackfill.mjs.
- gitignore:
.gitignore:102 ignores .neo-ai-data but NOT ai/data/; git ls-files confirms ai/data/memory-core/lazy-edges.jsonl is tracked.
The Fix
Re-home the lazyEdgesQueuePath default (via the AiConfig SSOT, config.template.mjs) off the tracked path onto a gitignored runtime store matching the existing .neo-ai-data convention (e.g. .neo-ai-data/memory-core/lazy-edges.jsonl):
- Update the
config.template.mjs leaf default (+ re-materialize config.mjs).
- Ensure the new path is gitignored; keep the
NEO_LAZY_EDGES_QUEUE_PATH env override behavior unchanged.
- Remove the tracked
ai/data/memory-core/lazy-edges.jsonl (and the now-orphan ai/data/ tree).
- Update
LazyEdgeDrainer.mjs JSDoc (lines 16-17) citing the old default path.
- Correct #14304's body line
Remove: ai/data/ → delete → the re-home framing (removes the hazard).
Contract Ledger Matrix
| Field |
Value |
| Target Surface |
aiConfig.lazyEdgesQueuePath (config leaf) |
| Source of Authority |
ai/mcp/server/memory-core/config.template.mjs:744 (AiConfig SSOT, ADR-0019) |
| Proposed Behavior |
default resolves to a gitignored runtime path (.neo-ai-data/memory-core/lazy-edges.jsonl) |
| Fallback |
NEO_LAZY_EDGES_QUEUE_PATH env override — unchanged |
| Docs |
LazyEdgeDrainer.mjs JSDoc default-path reference |
| Evidence |
queue append→drain round-trips from the new path (unit/integration) |
Decision Record impact
aligned-with ADR-0019 (AiConfig reactive Provider SSOT) — a config-default re-home through the SSOT leaf; no re-derived/pass-through config surface, no ADR challenge.
Acceptance Criteria
Out of Scope
- The broader
ai/ domain-first migration / file-moves (#14304 Lane-1 — fenced behind v13.1 #14039).
- No change to the lazy-edge queue's logic (append/drain unchanged) — path-only.
- The sibling
ai/docs/ mis-diagnosed cruft item (relocate wake-prompt-landing-matrix.md → learn/agentos/process/ + tree.json register) — a foldable companion cleanup; can ride this PR or a Lane-1 batch.
Avoided Traps
- Delete
ai/data/ (the epic's original word): rejected — V-B-A proved it's the live lazy-edges queue; deleting silently breaks edge resolution.
- Re-derive/env-read the path outside the SSOT: rejected — ADR-0019 forbids config pass-through / re-derivation; the change lands at the SSOT leaf default only.
Related
#14304 (Agent OS Architecture Quality — Lane-1/2 goal-anchor; this corrects a mis-diagnosed cruft item in its body).
.neo-ai-data runtime-store convention (the correct gitignored home; the #14469 data-home saga settled this class).
#14079 / #14192 / #14193 (Chroma-store bloat — distinct substrate: vector-DB dedup / FTS5 index, NOT the JSONL queue; noted to disambiguate).
- ADR-0019 (AiConfig reactive Provider SSOT).
Origin Session ID: 1d7923bf-11bd-4c02-925b-5286b10d244d
Handoff Retrieval Hints: query_raw_memories("lazyEdgesQueuePath re-home git-tracked ai/data runtime churn"); #14304 comment IC_kwDODSospM8AAAABIdVFPQ.
Live latest-open sweep: checked latest 25 open issues 2026-07-02T~14:36Z; no equivalent found. A2A in-flight claim sweep (last 25): no overlapping claim.
Authored by Grace (@neo-opus-grace, Claude Opus 4.8).
Context
Surfaced during #14304 (Agent OS Architecture Quality) Lane-1 cruft-item V-B-A on 2026-07-02 (#14304 comment
IC_kwDODSospM8AAAABIdVFPQ). The epic body'sRemove: ai/data/ → deleteline is wrong and dangerous —ai/data/memory-core/lazy-edges.jsonlis not cruft, it is a live runtime queue. Acting on the epic's word would silently break the lazy-edge resolution path. This ticket captures the real scoped change the "delete" line should become.The Problem
aiConfig.lazyEdgesQueuePathdefaults to a git-tracked location (ai/data/memory-core/lazy-edges.jsonl). Runtime appends therefore land in a tracked file, and the data-sync pipeline commits them → recurring churn — the same anti-pattern class as the.neo-ai-dataruntime store (which IS gitignored). A transient drain-queue must not be version-controlled.The Architectural Reality
ai/mcp/server/memory-core/config.template.mjs:744—lazyEdgesQueuePath: leaf(path.resolve(cwd, 'ai/data/memory-core/lazy-edges.jsonl'), 'NEO_LAZY_EDGES_QUEUE_PATH', 'string').ai/services/graph/SemanticGraphExtractor.mjs:877appends unresolved edges toAiConfig.lazyEdgesQueuePath.ai/services/graph/LazyEdgeDrainer.mjs(drains into the Native Edge Graph) +priorityBackfill.mjs..gitignore:102ignores.neo-ai-databut NOTai/data/;git ls-filesconfirmsai/data/memory-core/lazy-edges.jsonlis tracked.The Fix
Re-home the
lazyEdgesQueuePathdefault (via the AiConfig SSOT,config.template.mjs) off the tracked path onto a gitignored runtime store matching the existing.neo-ai-dataconvention (e.g..neo-ai-data/memory-core/lazy-edges.jsonl):config.template.mjsleaf default (+ re-materializeconfig.mjs).NEO_LAZY_EDGES_QUEUE_PATHenv override behavior unchanged.ai/data/memory-core/lazy-edges.jsonl(and the now-orphanai/data/tree).LazyEdgeDrainer.mjsJSDoc (lines 16-17) citing the old default path.Remove: ai/data/ → delete→ the re-home framing (removes the hazard).Contract Ledger Matrix
aiConfig.lazyEdgesQueuePath(config leaf)ai/mcp/server/memory-core/config.template.mjs:744(AiConfig SSOT, ADR-0019).neo-ai-data/memory-core/lazy-edges.jsonl)NEO_LAZY_EDGES_QUEUE_PATHenv override — unchangedLazyEdgeDrainer.mjsJSDoc default-path referenceDecision Record impact
aligned-with ADR-0019(AiConfig reactive Provider SSOT) — a config-default re-home through the SSOT leaf; no re-derived/pass-through config surface, no ADR challenge.Acceptance Criteria
lazyEdgesQueuePathdefault re-homed to a gitignored runtime path via theconfig.template.mjsSSOT leaf.ai/data/memory-core/lazy-edges.jsonlremoved from git tracking;ai/data/no longer tracked.NEO_LAZY_EDGES_QUEUE_PATHenv override still honored.LazyEdgeDrainer.mjsJSDoc default-path reference updated.Remove: ai/data/ → deleteline corrected to the re-home framing (body author: @neo-opus-grace).Out of Scope
ai/domain-first migration / file-moves (#14304 Lane-1 — fenced behind v13.1 #14039).ai/docs/mis-diagnosed cruft item (relocatewake-prompt-landing-matrix.md→learn/agentos/process/+tree.jsonregister) — a foldable companion cleanup; can ride this PR or a Lane-1 batch.Avoided Traps
ai/data/(the epic's original word): rejected — V-B-A proved it's the live lazy-edges queue; deleting silently breaks edge resolution.Related
#14304(Agent OS Architecture Quality — Lane-1/2 goal-anchor; this corrects a mis-diagnosed cruft item in its body)..neo-ai-dataruntime-store convention (the correct gitignored home; the #14469 data-home saga settled this class).#14079/#14192/#14193(Chroma-store bloat — distinct substrate: vector-DB dedup / FTS5 index, NOT the JSONL queue; noted to disambiguate).Origin Session ID: 1d7923bf-11bd-4c02-925b-5286b10d244d
Handoff Retrieval Hints:
query_raw_memories("lazyEdgesQueuePath re-home git-tracked ai/data runtime churn"); #14304 commentIC_kwDODSospM8AAAABIdVFPQ.Live latest-open sweep: checked latest 25 open issues 2026-07-02T~14:36Z; no equivalent found. A2A in-flight claim sweep (last 25): no overlapping claim.
Authored by Grace (@neo-opus-grace, Claude Opus 4.8).