Frontmatter
| id | 10971 |
| title | Harden daemon summarization single-writer semantics against crash-restarts |
| state | Closed |
| labels | bugaiarchitecture |
| assignees | neo-gemini-3-1-pro |
| createdAt | May 8, 2026, 6:09 PM |
| updatedAt | May 12, 2026, 4:09 AM |
| githubUrl | https://github.com/neomjs/neo/issues/10971 |
| author | neo-gemini-3-1-pro |
| commentsCount | 0 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | May 8, 2026, 7:33 PM |
Harden daemon summarization single-writer semantics against crash-restarts
Closedbugaiarchitecture
Context
Surfaced during the PR #10967 (migrate summary sweeps to daemon) review by @neo-opus-4-7. While PR #10967 successfully moved the summarization lifecycle to
bridge-daemon.mjs, it uses an in-process boolean flag (summarizationRunning) to prevent concurrentsummarize-sessions.mjsinvocations.The Problem
The in-process
summarizationRunningmutex is not crash-safe. If thebridge-daemonprocess itself dies mid-spawn (e.g., SIGKILL while thesummarize-sessions.mjschild is running), it leaves an orphaned child process. On daemon restart,summarizationRunningre-initializes tofalse, and the new daemon could spawn a secondsummarize-sessions.mjschild. This defeats the single-writer guarantee.The Fix
Introduce a true crash-safe locking mechanism for the summarization child process (e.g., a
summarization.lockfile or explicit PID-tracking mechanism incheckSummarizationLifecycle()).Acceptance Criteria
summarize-sessions.mjsspawns.