Resolves #17057
Raw Memory Core turns now keep the WAL/Chroma UUID as their single AGENT_MEMORY graph identity. REM enriches that node and attaches session topology without minting a prefixed duplicate; lazy memory: input remains compatible and resolves through verified Chroma provenance. A dry-run-default offline migration reports every population, retargets compatible edges atomically, and refuses property, tenant, semantic, or bare-ID ambiguity before deleting anything.
Evidence: L2 (production planner/apply exercised against real SQLite; Chroma paging and GraphService/ingestor paths exercised through deterministic fixtures) → L2 required (all eight close-target ACs are deterministic graph-row, edge, conflict, coverage, or consumer-suite observables). No residuals.
AC Evidence
| AC-1 | MemorySessionIngestor.spec.mjs proves forward/lazy convergence onto the bare AGENT_MEMORY id; reconcileRawMemoryGraphIdentities.spec.mjs proves legacy-only/dual apply plus an idempotent second plan. |
| AC-2 | MemorySessionIngestor.spec.mjs asserts ORIGINATES_IN uses the bare UUID and no memory:<uuid> node is created. |
| AC-3 | reconcileRawMemoryGraphIdentities.spec.mjs retargets both edge directions, collapses equivalent duplicates, preserves the stronger weight, and refuses cross-tenant custody. |
| AC-4 | The migration spec pins node-property, malformed-identity, bare-ID-label, edge-property, and apply-time conflict refusal; the transaction rollback arm proves no partial winner/deletion. |
| AC-5 | The semantic suffix-collision fixture compares the semantic node and incident edge byte-for-byte before/after an otherwise valid apply. |
| AC-6 | Tombstone coverage remains outside Chroma-backed actions; archive, public-recall, and concept-walk consumer specs keep archived AGENT_MEMORY behavior green. |
| AC-7 | The planner reports agentOnly, legacyOnly, dual, neither, tombstone, semanticOnly, and explicit orphan/malformed/collision buckets from a full paginated census. |
| AC-8 | The focused consumer matrix covers recency, archive, concept-walk, session resume/fallback, REM observability, lazy edges, Dream, schema, migration, and extraction-inventory paths. |
Deltas from ticket
None substantive. The fail-closed boundary now names two ambiguity classes the ticket implied but did not label: a non-AGENT_MEMORY occupant at the canonical bare id and a live-Chroma legacy node whose prefixed id disagrees with properties.chromaId. Dry-run opens SQLite read-only and refuses a missing DB path.
Test Evidence
All coverage runs in CI.
Post-Merge Validation
None deferred. Operational use remains intentionally manual and dry-run-first; any apply follows the runner's explicit offline stop/apply/restart contract.
Commits
d93f5613 — converge production identities, add the atomic migration, and cover the consumer matrix.
eb13cde6 — keep direct CLI bootstrap storage-free and register its spawned witness in extraction custody.
Authored by Emmy (GPT-5.6 Sol Ultra, Codex). Session 418186a5-792f-4722-a0e2-e5b5368cd8bd.
Resolves #17057
Raw Memory Core turns now keep the WAL/Chroma UUID as their single
AGENT_MEMORYgraph identity. REM enriches that node and attaches session topology without minting a prefixed duplicate; lazymemory:input remains compatible and resolves through verified Chroma provenance. A dry-run-default offline migration reports every population, retargets compatible edges atomically, and refuses property, tenant, semantic, or bare-ID ambiguity before deleting anything.Evidence: L2 (production planner/apply exercised against real SQLite; Chroma paging and GraphService/ingestor paths exercised through deterministic fixtures) → L2 required (all eight close-target ACs are deterministic graph-row, edge, conflict, coverage, or consumer-suite observables). No residuals.
AC Evidence
| AC-1 |
MemorySessionIngestor.spec.mjsproves forward/lazy convergence onto the bareAGENT_MEMORYid;reconcileRawMemoryGraphIdentities.spec.mjsproves legacy-only/dual apply plus an idempotent second plan. | | AC-2 |MemorySessionIngestor.spec.mjsassertsORIGINATES_INuses the bare UUID and nomemory:<uuid>node is created. | | AC-3 |reconcileRawMemoryGraphIdentities.spec.mjsretargets both edge directions, collapses equivalent duplicates, preserves the stronger weight, and refuses cross-tenant custody. | | AC-4 | The migration spec pins node-property, malformed-identity, bare-ID-label, edge-property, and apply-time conflict refusal; the transaction rollback arm proves no partial winner/deletion. | | AC-5 | The semantic suffix-collision fixture compares the semantic node and incident edge byte-for-byte before/after an otherwise valid apply. | | AC-6 | Tombstone coverage remains outside Chroma-backed actions; archive, public-recall, and concept-walk consumer specs keep archivedAGENT_MEMORYbehavior green. | | AC-7 | The planner reportsagentOnly,legacyOnly,dual,neither,tombstone,semanticOnly, and explicit orphan/malformed/collision buckets from a full paginated census. | | AC-8 | The focused consumer matrix covers recency, archive, concept-walk, session resume/fallback, REM observability, lazy edges, Dream, schema, migration, and extraction-inventory paths. |Deltas from ticket
None substantive. The fail-closed boundary now names two ambiguity classes the ticket implied but did not label: a non-
AGENT_MEMORYoccupant at the canonical bare id and a live-Chroma legacy node whose prefixed id disagrees withproperties.chromaId. Dry-run opens SQLite read-only and refuses a missing DB path.Test Evidence
All coverage runs in CI.
Post-Merge Validation
None deferred. Operational use remains intentionally manual and dry-run-first; any apply follows the runner's explicit offline stop/apply/restart contract.
Commits
d93f5613— converge production identities, add the atomic migration, and cover the consumer matrix.eb13cde6— keep direct CLI bootstrap storage-free and register its spawned witness in extraction custody.Authored by Emmy (GPT-5.6 Sol Ultra, Codex). Session 418186a5-792f-4722-a0e2-e5b5368cd8bd.