Context
Surfaced 2026-05-01 during the Memory Core diagnostic that produced #10556 (fix(ai): backfill ChromaDB legacy userId). Healthcheck consistently reports:
"startup": {
"summarizationStatus": "not_attempted",
"summarizationDetails": null
}
Per AGENTS_STARTUP.md §6: "On startup, the Memory Core server automatically finds and summarizes any previous sessions that were not yet processed."
This is NOT happening. New sessions accumulate raw memories without ever being summarized into the neo-agent-sessions collection. This is independent of the tenant-isolation rollout (#10556) — the boot-summarization daemon should produce new tagged summaries for current tenants, but isn't running.
The Problem
Two distinct symptoms cluster here, both observable today:
startup.summarizationStatus: not_attempted — the boot-time auto-summarization promised by AGENTS_STARTUP.md §6 never fires.
runSandman produces no sandman_handoff.md — the Golden Path / strategic-roadmap synthesis depends on summaries to build the topological prioritization. Without summarization, no handoff.
Cluster of related downstream effects:
- Agents querying their own past sessions get nothing back (covered by #10556's read-path fix once migration runs)
- The Dream Pipeline / REM cycle has no incremental summary corpus to ingest
- Strategic context-priming via
get_context_frontier returns empty (also tracked by the strategicNeighbors guard fix in #10557 → #10558, but the deeper issue is no summaries to weight)
The Architectural Reality
The Memory Core's summarization pipeline lives across:
ai/mcp/server/memory-core/services/SessionSummarization.spec.mjs — existing test scaffolding (suggests the pipeline IS implemented)
- Boot-time invocation likely in
ai/mcp/server/memory-core/Server.mjs or services/lifecycle/SystemLifecycleService.mjs
- Sandman daemon:
buildScripts/ai/runSandman.mjs (separate concern; produces sandman_handoff.md)
- Healthcheck observability surface:
ai/mcp/server/memory-core/services/HealthService.mjs — #startupSummarizationStatus private field + startup.summarizationStatus payload field already exposed; population path is what's broken
Two failure modes possible:
- Pipeline is wired but never invoked at boot. The
#startupSummarizationStatus field stays at its default null because no code path calls the summarization on boot.
- Pipeline is invoked but fails silently. The
summarizationDetails: null observation is consistent with both.
Need empirical capture (Phase 1) to disambiguate.
The Fix
Investigation-first, similar to #10564's Phase-1-before-Phase-3 discipline:
Phase 1 — Capture (gating evidence):
- Read the boot lifecycle:
Server.mjs + SystemLifecycleService.mjs to identify whether/where summarization-on-boot is invoked
- If invoked: instrument the call site to log success/error/skip-reason; gather telemetry on next 1–2 boots
- If NOT invoked: identify why — was the call removed, gated behind a flag, or never wired?
Phase 2 — Targeted intervention:
Based on Phase 1 evidence:
- If invocation missing: restore the call at boot
- If invocation failing: fix the failure (likely related to the same multi-tenant rollout that produced #10556 — write-side summarization may be tagging records correctly but read-side filter is preventing the summarizer from finding sessions to process)
- If gated: re-enable with appropriate condition
Phase 3 — Validation:
- Healthcheck
startup.summarizationStatus reports success after boot on a session-rich corpus
- New session summaries land in
neo-agent-sessions with userId: <tenant> tag
runSandman consumes the new summaries and produces sandman_handoff.md
Acceptance Criteria
Out of Scope
- Sandman daemon scheduling / reliability concerns (separate substrate; this ticket only validates that runSandman gets non-empty input post-fix)
- Multi-tenant write-tagging on summaries (covered by #10556 + the migration runner; if boot-summarization writes are subject to the same tenant logic, this ticket consumes that fix as a precondition)
- Deep DreamService / REM pipeline rework (this ticket targets the missing input, not the downstream consumer)
Avoided Traps
- Trap: assume the pipeline is broken without checking whether it's invoked. Prior fix attempts on Memory Core observability (#10374, #10529, #10017) demonstrate that speculative trigger-refinement without empirical capture is a fragile pattern. Phase 1 gates Phase 2.
- Trap: bundle with #10556 (chromadb backfill). Already explicitly rejected per the #10556 Out-of-Scope section. Independent root cause (write-side missing-invocation, vs read-side tenant-filter exclusion).
- Trap: blame the summarization daemon code without checking the lifecycle invocation. The most parsimonious explanation per the symptom (
not_attempted literal status) is that the call site is missing or gated, not that the pipeline implementation is broken.
Related
- Adjacent (now MERGED): #10556 / PR #10567 — chromadb tenant-isolation read-path fix; eliminates one downstream amplifier of summarization staleness
- Adjacent prior fixes (CLOSED): #10017 (multi-tenant migration observability), #10374 (sunset trigger refinement), #10529 (sunset disambiguation) — same family of swarm-substrate restoration work
- Adjacent OPEN: #10564 (Gemini sunset trigger drift, passive capture)
- Sandman daemon adjacency:
buildScripts/ai/runSandman.mjs, learn/agentos/DreamPipeline.md
Origin Session ID: 1f30c9d8-4a36-4be0-98a5-bd5b89289227
Retrieval Hint: "Memory Core boot summarization not_attempted sandman_handoff missing"
Context
Surfaced 2026-05-01 during the Memory Core diagnostic that produced #10556 (
fix(ai): backfill ChromaDB legacy userId). Healthcheck consistently reports:"startup": { "summarizationStatus": "not_attempted", "summarizationDetails": null }Per AGENTS_STARTUP.md §6: "On startup, the Memory Core server automatically finds and summarizes any previous sessions that were not yet processed."
This is NOT happening. New sessions accumulate raw memories without ever being summarized into the
neo-agent-sessionscollection. This is independent of the tenant-isolation rollout (#10556) — the boot-summarization daemon should produce new tagged summaries for current tenants, but isn't running.The Problem
Two distinct symptoms cluster here, both observable today:
startup.summarizationStatus: not_attempted— the boot-time auto-summarization promised by AGENTS_STARTUP.md §6 never fires.runSandmanproduces nosandman_handoff.md— the Golden Path / strategic-roadmap synthesis depends on summaries to build the topological prioritization. Without summarization, no handoff.Cluster of related downstream effects:
get_context_frontierreturns empty (also tracked by the strategicNeighbors guard fix in #10557 → #10558, but the deeper issue is no summaries to weight)The Architectural Reality
The Memory Core's summarization pipeline lives across:
ai/mcp/server/memory-core/services/SessionSummarization.spec.mjs— existing test scaffolding (suggests the pipeline IS implemented)ai/mcp/server/memory-core/Server.mjsorservices/lifecycle/SystemLifecycleService.mjsbuildScripts/ai/runSandman.mjs(separate concern; producessandman_handoff.md)ai/mcp/server/memory-core/services/HealthService.mjs—#startupSummarizationStatusprivate field +startup.summarizationStatuspayload field already exposed; population path is what's brokenTwo failure modes possible:
#startupSummarizationStatusfield stays at its defaultnullbecause no code path calls the summarization on boot.summarizationDetails: nullobservation is consistent with both.Need empirical capture (Phase 1) to disambiguate.
The Fix
Investigation-first, similar to #10564's Phase-1-before-Phase-3 discipline:
Phase 1 — Capture (gating evidence):
Server.mjs+SystemLifecycleService.mjsto identify whether/where summarization-on-boot is invokedPhase 2 — Targeted intervention: Based on Phase 1 evidence:
Phase 3 — Validation:
startup.summarizationStatusreportssuccessafter boot on a session-rich corpusneo-agent-sessionswithuserId: <tenant>tagrunSandmanconsumes the new summaries and producessandman_handoff.mdAcceptance Criteria
healthcheck.startup.summarizationStatusreturns a non-not_attemptedvalue (e.g.,success,no_pending_sessions, or actionable error)runSandmanpost-fix producessandman_handoff.mdinresources/content/SessionSummarization.spec.mjsscaffolding if present)Out of Scope
Avoided Traps
not_attemptedliteral status) is that the call site is missing or gated, not that the pipeline implementation is broken.Related
buildScripts/ai/runSandman.mjs,learn/agentos/DreamPipeline.mdOrigin Session ID: 1f30c9d8-4a36-4be0-98a5-bd5b89289227 Retrieval Hint: "Memory Core boot summarization not_attempted sandman_handoff missing"