Frontmatter
| title | >- |
| author | neo-opus-ada |
| state | Merged |
| createdAt | May 23, 2026, 5:18 PM |
| updatedAt | May 23, 2026, 5:26 PM |
| closedAt | May 23, 2026, 5:26 PM |
| mergedAt | May 23, 2026, 5:26 PM |
| branches | dev ← tobiu/11845-subdaemon-cluster-cleanup |
| url | https://github.com/neomjs/neo/pull/11850 |
🚨 Agent PR Body Lint Violation
@neo-opus-ada — your PR body on PR #11850 does not match the pull-request template structure.
Required action: read .agents/skills/pull-request/SKILL.md BEFORE editing the PR body. The skill points at:
- Minimum-viable PR body structure:
.agents/skills/pull-request/references/pull-request-workflow.md §9 - Self-Identification mandate:
.agents/skills/pull-request/references/pull-request-workflow.md §5
Do NOT compose a substitute template or hallucinate section headings. The validator checks more structural anchors than this comment names. The only reliable path to passing is reading the actual workflow file and following its structure.
Diagnostic hint: at least one recognized anchor like FAIR-band: is missing.
Visible anchors missing (full list)
FAIR-band:Evidence:Ticket reference (e.g., Resolves #N, Related: #N)
This is the CI tool-boundary lint companion to PR #11494's MCP manage_pr_review validator and PR #11502's agent-pr-review-body-lint.yml reviewer-side lint.
Resolves #11501.
🚨 Agent PR Body Lint Violation
@neo-opus-ada — your PR body on PR #11850 does not match the pull-request template structure.
Required action: read .agents/skills/pull-request/SKILL.md BEFORE editing the PR body. The skill points at:
- Minimum-viable PR body structure:
.agents/skills/pull-request/references/pull-request-workflow.md §9 - Self-Identification mandate:
.agents/skills/pull-request/references/pull-request-workflow.md §5
Do NOT compose a substitute template or hallucinate section headings. The validator checks more structural anchors than this comment names. The only reliable path to passing is reading the actual workflow file and following its structure.
Diagnostic hint: at least one recognized anchor like FAIR-band: is missing.
Visible anchors missing (full list)
FAIR-band:Evidence:Ticket reference (e.g., Resolves #N, Related: #N)
This is the CI tool-boundary lint companion to PR #11494's MCP manage_pr_review validator and PR #11502's agent-pr-review-body-lint.yml reviewer-side lint.
Resolves #11501.

No review body provided.
Authored by Claude Opus 4.7 (Claude Code). Session 5572d9a5-558d-4bea-b416-e31496c289c4.
FAIR-band: in-band [verify @ merge-gate]
Resolves #11845
Summary
Sub 9 of Epic #11831 — co-locates the four sub-daemon clusters into per-folder mirrors of Sub 8's orchestrator pattern. Each cluster gets its own folder under
ai/daemons/with the daemon-class file alongside adaemon.mjsentry script (folder context provides identity).Evidence: L1 (76/76 moved-spec + 200/200 consumer-spec; 2011 pass / 19 pre-existing flakes on full unit) → L1 required for substrate refactor (pure structural moves + mechanical import rewires; no behavioral change).
Source moves (8)
ai/scripts/bridge-daemon.mjsai/daemons/bridge/daemon.mjsai/scripts/bridge-daemon-queries.mjsai/daemons/bridge/queries.mjs(renamed)ai/daemons/KbAlertingService.mjsai/daemons/kb-alerting/KbAlertingService.mjsai/scripts/kb-alerting-daemon.mjsai/daemons/kb-alerting/daemon.mjsai/daemons/KbGarbageCollectionService.mjsai/daemons/kb-gc/KbGarbageCollectionService.mjsai/scripts/kb-gc-daemon.mjsai/daemons/kb-gc/daemon.mjsai/daemons/KbReconciliationService.mjsai/daemons/kb-reconciliation/KbReconciliationService.mjsai/scripts/kb-reconciliation-daemon.mjsai/daemons/kb-reconciliation/daemon.mjsTest moves (5)
bridge-daemon.spec.mjs→ai/daemons/bridge/daemon.spec.mjsbridge-daemon-queries.spec.mjs→ai/daemons/bridge/queries.spec.mjsKbAlertingService.spec.mjs→ai/daemons/kb-alerting/KbGarbageCollectionService.spec.mjs→ai/daemons/kb-gc/KbReconciliationService.spec.mjs→ai/daemons/kb-reconciliation/Deltas from ticket: Ticket stated "(No bridge unit spec exists currently.)" but
bridge-daemon.spec.mjs(49KB, 12 spawn-tests) andbridge-daemon-queries.spec.mjs(3.7KB) both exist. Moved them to mirror source structure rather than leave behind inai/scripts/.Wiring updates
package.json: 3 npm script paths (ai:kb-alerting/kb-gc/kb-reconciliation)Orchestrator.mjs:14-16:from '../bridge/queries.mjs'TaskDefinitions.mjs:70:bridgeDaemon.argsresolves to new pathTaskDefinitions.mjs:72:expectedCommand: 'daemons/bridge/daemon.mjs'— disambiguates among the 5daemon.mjsfiles post-Sub-8/9 (else any daemon's process command line would falsely match)bridge/daemon.mjs:179:enforceSingleton()substring check updated for the same reasonSummarizationCoordinatorService.mjs:8: bridge-queries import pathmulti-tenant.spec.mjs:114: dynamic-import pathV-B-A discipline (#11844 anchor)
Sub 8's missed dynamic-import (MailboxService.spec.mjs
await import(...ai/daemons/SwarmHeartbeatService.mjs)) prompted me to sweep BOTH staticfrom '...'AND dynamicawait import('...')call-sites this time. Caught the SummarizationCoordinatorService import via the dual sweep.Test Evidence
Local full unit run on dev (no
NEO_TEST_SKIP_CIfilter — Sub 8's lesson):Post-Merge Validation
npm run ai:kb-alerting/npm run ai:kb-gc/npm run ai:kb-reconciliationsmoke (each daemon boots, registers via NL, accepts SIGTERM).ps -p ${pid} -o command=substring check passes the disambiguatedexpectedCommand.Depends on
Sub 8 #11844 — merged to dev ✓ (commit
6cc917980).Unblocks
Deltas from ticket
expectedCommandorenforceSingleton()substring updates; both are required because all daemon entry scripts now sharedaemon.mjsfilename, so substring matching must include the folder.Authored by: [Claude Opus 4.7] (Claude Code)