feat(memory-v3): consolidation drains shared buffer into tree + maintains standing-context#31985
Conversation
…ains standing-context files
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 831d2926c6
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| const memoryDir = join(getWorkspaceDir(), "memory"); | ||
| const lockPath = join(memoryDir, ".v3-state", "consolidation.lock"); | ||
| const bufferPath = join(memoryDir, "buffer.md"); |
There was a problem hiding this comment.
Use a shared lock for v2/v3 consolidation drainers
memoryV3ConsolidateJob acquires memory/.v3-state/consolidation.lock, but memoryV2ConsolidateJob still uses its own .v2-state lock and still runs whenever memory.v2.enabled is true. After flipping memory.v3.write.enabled on, any already-queued memory_v2_consolidate rows can run concurrently with newly scheduled memory_v3_consolidate rows because the lock files are different, even though both mutate the same shared files (memory/buffer.md, memory/recent.md, memory/essentials.md, memory/threads.md). That can cause conflicting trims/rewrites and lose updates; the drainer needs a single shared lock (or explicit v2 skip when v3 write is active).
Useful? React with 👍 / 👎.
#31990) * feat(memory-v3): tree-node on-disk format + node store (#31971) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): config schema + cheap/capable LLM call sites (#31972) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): curated edge-expansion lane (#31973) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): write-path job types + config (no behavior) (#31974) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): gate decision (ready/more) + final selection (#31975) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): tree index with DAG adjacency + cache (#31976) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): always-on scouts over the v2 substrate (#31977) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): compose node index from children + routing hints (#31978) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): fast filter judging dense hits (sticky bypass) (#31979) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): parallel-fan-out traversal with cycle/visited guards (#31980) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): tree validator (orphans, cycles, dangling refs, freshness) (#31981) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): scout-seeded tree-walk descent driver (#31982) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): assistant memory v3 validate/tree CLI + routes (#31983) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): retrieval loop (scouts->filter->tree->edges->gate) (#31984) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): consolidation drains shared buffer into tree + maintains standing-context files (#31985) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): v3 Retriever as comparand #2 in the compare harness (#31986) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): pass-1->pass-2 co-activation logging (#31987) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): weighted, decaying auto-edge learning job (#31988) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * feat(memory-v3): live shadow via memoryRetrieval middleware (inject v2, log v3) (#31989) Co-authored-by: Vellum Assistant <assistant@vellum.ai> * fix(memory-v3): null-safe shadow gate when memory.v3 config is absent The live-shadow middleware runs on every turn and read `config.memory.v3.enabled` unguarded. Configs built outside the Zod schema (agent-loop test fixtures) have no `memory.v3` block, so the gate threw `TypeError: undefined is not an object` and aborted the turn — cascading across ~13 agent-loop test files. Guard with optional chaining (matches the loop's existing `write?.coactivation` pattern) and add a regression test for the absent-v3 config. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(memory-v3): add route policies for memory/v3/validate + tree PR #31983 registered the two read-only v3 routes but never added their ACTOR_ENDPOINTS entries in route-policy.ts; the per-PR run skipped CI so the route-policy coverage guard never ran. Add both as settings.read (mirroring the v2 read routes), satisfying guard-tests.test.ts. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Vellum Assistant <assistant@vellum.ai> Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Summary
Part of plan: memory-v3-build.md (PR 19 of 19)