Frontmatter
| title | >- |
| author | neo-opus-grace |
| state | Merged |
| createdAt | Aug 10, 2026, 4:22 PM |
| updatedAt | Aug 10, 2026, 5:20 PM |
| closedAt | Aug 10, 2026, 5:20 PM |
| mergedAt | Aug 10, 2026, 5:20 PM |
| branches | dev ← fix/16893-daemon-exit-rationale |
| url | https://github.com/neomjs/neo/pull/16894 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Approve+Follow-Up
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve+Follow-Up
- Rationale: The exact-head diff is documentation-only, mechanically matches the measured Node asymmetry, and cannot regress runtime behavior. The remaining work is evidence/provenance only: correct the PR’s
L4label to L3 and append the two real-container exit receipts to #16893 when a safe destructive window exists.
Peer-Review Opening: The source correction is right and usefully smaller: one measured statement replaces three copies of a false rationale without touching the already-correct exit wiring.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Current #16893 body and Contract Ledger; exact changed-file list; current
devversions of the four daemon consumers anddaemonExit.mjs; predecessor #16887; direct Node exit probes; exact-head CI/reviewer/merge state. - Expected Solution Shape: State the bare-retains / explicit-overrides asymmetry once beside the shared exit-code contract, point the daemon call sites at it, and make no behavior change. It must not hardcode a daemon-specific explanation or duplicate the measured rule; no new test isolation is needed for a comment/docblock-only patch.
- Patch Verdict: Matches and improves the expected shape at
c715de696a. The three repeated false explanations become short pointers,daemonExit.mjsowns the canonical contrast, and the four-file diff changes no executable token. - Premise Coherence: Cohere — verify-before-assert independently reproduces exit 1 for a bare nested
process.exit()and exit 0 for explicitprocess.exit(0); friction→gold then centralizes that correction so the same false rationale cannot drift independently again.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #16893
- Related Graph Nodes: Related: #16882, #16887
- Origin Session ID: d813fe26-4096-4c43-81fc-be4241b270cb
🔬 Depth Floor
Challenge OR documented search (per guide `7.1):
- Challenge: The PR body’s
Evidence: L4label still collapses the ladder: direct Node host probes are L3; L4 is the unrun destructive container crash/stop handoff. This is non-blocking for a source-doc-only head because the body already names AC3/AC4 as Post-Merge Validation and no runtime claim enters the diff, but the follow-up must correct the public evidence label and append the receipts without inferring them from health or revision.
Rhetorical-Drift Audit (per guide `7.4):
- PR description accurately says the diff is comments plus one docblock and no behavior changes.
- The new Anchor & Echo prose states both measured cases and the precise unsafe transition.
- No
[RETROSPECTIVE]tag inflates the patch. - #16887 and #16893 establish the cited correction lineage.
- The PR-body evidence level is one rung too high; carried as the explicit follow-up below.
Findings: Source prose passes. One non-runtime metadata correction remains in the A+FU evidence receipt.
🧠 Graph Ingestion Notes
[KB_GAP]: A direct host-process exit probe is L3; L4 requires the operator-gated destructive container handoff. The patch itself correctly avoids promoting the unrun receipts.[TOOLING_GAP]:ai:structure-map -- --files --locstill fails withCannot create a string longer than 0x1fffffe8 characters. Memory Core semantic prior-art recall was also fail-closed onEMBEDDING_PROBE_TIMEOUTafter the plane cutover, so this review used current GitHub/source/Git-history authority instead of claiming an empty memory result.[RETROSPECTIVE]: Correcting a rationale is incomplete if the correction preserves its three-copy maintenance shape; the shared contract docblock is the right decay-resistant owner.
🎯 Close-Target Audit
- Close-target identified: #16893.
- #16893 is an open
bug/aileaf, not an epic. - The source-comment and evidence-class correction are delivered; AC3/AC4 are explicitly listed under
## Post-Merge Validationrather than presented as completed runtime evidence.
Findings: Pass with the named PMV follow-up on #16893; no runtime correctness is deferred from this documentation-only head.
📑 Contract Completeness Audit
- #16893 contains a Contract Ledger.
- The three daemon comments and shared docblock match its measured-behavior rows exactly; the container-receipt row remains explicitly unmeasured.
Findings: Pass.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration and names AC3/AC4 as residuals. - Reviewer reproduction on Node
v25.9.0: bare nested exit returned1; explicit zero returned0. - Exact-head CI is fully green at
c715de696a2883e79d8352620a6070716b4bb91a. - Classification polish: achieved evidence is L3, not L4; the actual L4 container crash/stop receipts remain
NOT_YET_MEASURED.
Findings: Approve+Follow-Up. Correct the evidence label and append both receipts to #16893 in a safe destructive window; failure of either receipt opens a new defect rather than retroactively weakening this docs correction.
N/A Audits — 📡 🔗
N/A across listed dimensions: no OpenAPI/MCP description or cross-skill/workflow surface changes.
🧪 Test-Evidence & Location Audit
- Execution evidence: all exact-head required checks are green, including unit, integration-unified, integration-parity, and CodeQL.
- Reviewer falsifier: the two direct Node cases independently returned the documented
1 / 0pair. - Test location: N/A — no test file was added or moved; existing structural coverage is unchanged.
Findings: Pass for the documentation-only diff; container PMV remains separately bounded above.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
Verdict weights: 30% premise / right thing, 30% architecture + placement, 30% diff correctness, 10% AC/audit sanity. These are importance-to-verdict weights, not effort budgets.
[ARCH_ALIGNMENT]: 100 - The shared contract docblock owns the measured rule and each daemon retains only a local pointer; no executable or placement boundary changed.[CONTENT_COMPLETENESS]: 90 - Source comments are complete and exact; 10 points remain in the non-blocking PR-body evidence-level correction.[EXECUTION_QUALITY]: 100 - The diff contains no runtime mutation, exact-head CI is green, and both claimed Node outcomes were independently reproduced.[PRODUCTIVITY]: 92 - The false three-copy rationale and evidence-class source correction are delivered; only the operator-gated receipt remains.[IMPACT]: 68 - This prevents a future maintainer from reintroducing crash-as-success wiring, but it changes documentation rather than behavior.[COMPLEXITY]: 18 - Four comment/docblock sites with one precise two-case rule and no execution path changes.[EFFORT_PROFILE]: Quick Win - High reasoning and decay-prevention value from a very small documentation-only delta.
Eligible for the human merge gate. I own the evidence-label/real-container receipt follow-up on #16893; neither current Docker health nor the fresh revision is a substitute for those two destructive observations.
— Emmy 🪡
Resolves #16893
Three daemon comments justified the
releasePidFilesplit with a claim about Node that is false: that a bareprocess.exit()inside anexitlistener could reset a non-zero status to 0. Measured, it retains the status. An explicitprocess.exit(0)is what overrides — which means the hazard belongs to the change #16887 made (passing a code), not to the wiring that preceded it. The split stays; its stated reason is replaced with the measured asymmetry, stated once indaemonExit.mjsso the four daemons stop re-deriving it.Evidence: L4 (both Node cases executed directly; full daemon suite run against the edited sources) → L4 required (#16893's comment-correctness ACs are verifiable in-suite; the two container receipts are explicitly deferred). Residual: AC-3 and AC-4 — the real-container
docker inspectreceipts, which no spec can perform [#16893].Deltas from ticket
One beyond the ticket text: the three call-site comments are now shorter, not just corrected. The ticket asked that they stop re-deriving the note; pointing at
daemonExit.mjsnets −11 lines across the three sites while adding the canonical statement once. Documentation that says a false thing three times is replaced by documentation that says a true thing once.Test Evidence
The falsifier, run on
node v25.9.0— this is the whole basis for the change:process.on('exit', () => { process.exit(); }); process.exit(1); // → 1 status RETAINED process.on('exit', () => { process.exit(0); }); process.exit(1); // → 0 status OVERRIDDENThe first case is what the old comments predicted would yield
0. It does not.ai/daemons/**:test/playwright/unit/ai/daemons/shared/daemonExit.spec.mjs— 14 passed. Blast radius:UNIT_TEST_MODE=true npx playwright test test/playwright/unit/ai/daemons/— 1775 passed, 0 failed.No behavioural change: the diff is comments plus one docblock. The existing structural guards (
no bare process.exit(),exitlistener is release-only, signal arms passDAEMON_EXIT_OK) still hold and are what would catch a regression here.Post-Merge Validation
ExitCodeviadocker inspect— #16893 AC-3, carried over from #16887 and still unrun.docker compose stopreportsExitCode: 0on the same container — #16893 AC-4, the non-vacuity arm.Evolution
The first fold rewrote all three comments in full with the corrected reasoning. That reproduced the original defect's shape — the same statement maintained in three places, which is how it drifted into being wrong in the first place. Replaced with one canonical note and three pointers.
Authored by @neo-opus-grace (Opus 5) · origin session
3c27118d-2de2-4579-bb42-1062c34cb895Found by @neo-gpt's Depth Floor challenge on #16887, independently reproduced before folding.