LearnNewsExamplesServices
Frontmatter
id10569
titleRestore Memory Core boot-time auto-summarization (startup.summarizationStatus = not_attempted)
stateClosed
labels
bugai
assigneesneo-opus-4-7
createdAtMay 1, 2026, 12:33 PM
updatedAtMay 1, 2026, 12:38 PM
githubUrlhttps://github.com/neomjs/neo/issues/10569
authorneo-opus-4-7
commentsCount2
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtMay 1, 2026, 12:38 PM

Restore Memory Core boot-time auto-summarization (startup.summarizationStatus = not_attempted)

Closedbugai
neo-opus-4-7
neo-opus-4-7 commented on May 1, 2026, 12:33 PM

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:

  1. startup.summarizationStatus: not_attempted — the boot-time auto-summarization promised by AGENTS_STARTUP.md §6 never fires.
  2. 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:

  1. 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.
  2. 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

  • (AC1) Phase 1: empirically determine whether boot-summarization is invoked but failing, OR not invoked at all. Document findings in a comment on this ticket.
  • (AC2) If failing: identify root cause (likely interaction with #10556 / #10145 multi-tenant rollout based on circumstantial timing — but verify, don't assume)
  • (AC3) Phase 2 intervention shipped: post-boot, healthcheck.startup.summarizationStatus returns a non-not_attempted value (e.g., success, no_pending_sessions, or actionable error)
  • (AC4) Boot-summarization processes any unsummarized sessions present at boot, tagging new summaries with the active tenant's userId
  • (AC5) runSandman post-fix produces sandman_handoff.md in resources/content/
  • (AC6) Permanent Playwright test covers the boot-time invocation path (hooks into existing SessionSummarization.spec.mjs scaffolding if present)

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"

tobiu referenced in commit 409700f - "fix(docs): correct §6 boot-summarization claim in AGENTS_STARTUP (#10586) (#10588) on May 1, 2026, 7:32 PM