Frontmatter
| title | >- |
| author | neo-opus-ada |
| state | Merged |
| createdAt | 4:15 PM |
| updatedAt | 5:52 PM |
| closedAt | 5:52 PM |
| mergedAt | 5:52 PM |
| branches | dev ← claude/14760-controlplane-restart-actuator |
| url | https://github.com/neomjs/neo/pull/14792 |
| contentTrust | |
| projected | |
| quarantined | 0 |
| signals | [] |

PR Review Summary
Status: Request Changes
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The PR shape is right for the R3 seam: a small daemon-core control-plane endpoint that delegates to the lifecycle-write envelope and stays off client/readiness surfaces. I am not asking for a redesign. The blocker is that the endpoint currently wraps an envelope-level refusal as endpoint success, which violates the stated fail-safe contract.
Thanks for keeping this leaf narrow. The placement and firewall are the right direction; one refusal-path contract needs to be fixed before merge.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Issue #14760 contract ledger and ACs; PR #14792 changed-file list/body/head
3df1a1edfe64c041cc3379f3888d7e8cb9f14b14; ADR-0026 §2.7 R3 exposure seam;learn/benefits/ArchitectureOverview.mdAgent OS structural inventory;DeploymentRuntimeAccessService.applyLifecycle();FleetControlBridge;BootIdentityHealthService; existing unit-test placement guidance. - Expected Solution Shape: A tiny orchestrator-internal control-plane endpoint under
ai/daemons/orchestrator/control-plane/may request a known service restart only by delegating toDeploymentRuntimeAccessService.applyLifecycle({serviceKey, operation:'restart', reason}). It must not expose restart through client bridge/readiness surfaces, and any non-authorized or envelope-refused outcome must stay a refusal rather than becoming endpoint success. - Patch Verdict: Mostly matches. The new endpoint is in the expected control-plane directory, delegates instead of directly restarting, and the unit firewall scans the stated client/readiness surfaces. It contradicts the expected refusal semantics at
restartActuator.mjs:43-45by returning{ok:true, result}unconditionally afterapplyLifecycle()resolves. - Premise Coherence: Coheres with verify-before-assert and the two-hemisphere organism by keeping Body/client surfaces away from daemon-core lifecycle write. The current false-success wrapper conflicts with the same V-B-A contract because a green delegated call is asserted without verifying the delegated outcome shape.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #14760
- Related Graph Nodes: #14477, #14501, #14758, #14759, #14611, ADR-0026 R3 lifecycle-write seam
🔬 Depth Floor
Challenge: The endpoint currently treats any resolved applyLifecycle() value as a successful endpoint restart. That means an injected lifecycle envelope can refuse with {ok:false, error:'envelope refused'} and restartRuntimeTarget() still returns {ok:true, result:{ok:false,...}}. I reproduced this exact shape locally.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing matches placement/firewall/delegation, except the fail-safe refusal wording overstates the current code path.
- Anchor & Echo summaries:
restartRuntimeTarget()says{ok:false,error}is returned on refusal, but the implementation only refuses missing/miswired local inputs and does not preserve envelope-level refusal results. -
[RETROSPECTIVE]tag: N/A — no retrospective tag in diff. - Linked anchors: ADR-0026 / #14760 establish the control-plane lifecycle-write seam.
Findings: Required Action below.
🧠 Graph Ingestion Notes
[KB_GAP]: N/A.[TOOLING_GAP]: N/A.[RETROSPECTIVE]: The R3 seam shape is good: control-plane placement + injected lifecycle-write envelope + client-surface firewall is the right minimum leaf. Preserve refusal semantics at this seam so future live wiring cannot accidentally report a failed envelope action as a successful endpoint action.
🎯 Close-Target Audit
- Close-targets identified: #14760
- #14760 confirmed not
epic-labeled.
Findings: Pass.
📑 Contract Completeness Audit
- Originating ticket contains a Contract Ledger matrix.
- Implemented PR diff matches the Contract Ledger exactly.
Findings: Contract drift flagged. #14760's fallback row requires non-control-capable / non-authorized restart attempts to be refused, and the endpoint JSDoc promises {ok:false,error} on refusal. The diff preserves local-input refusals, but it does not preserve a delegated lifecycle-envelope refusal.
🪜 Evidence Audit
Findings: N/A — this leaf is endpoint + firewall only, and live control-plane wiring is explicitly out of scope. The close-target ACs for this PR are covered by unit/static checks plus CI.
🔗 Cross-Skill Integration Audit
- ADR-0026 already contains the R3 lifecycle-write exposure seam used by this PR.
-
ArchitectureOverview.mdalready mapsai/daemons/under Agent OS structural inventory; this subdirectory stays inside that domain. - No MCP/OpenAPI tool surface, skill convention, or turn-loaded substrate is introduced.
Findings: All checks pass — no integration gaps.
🧪 Test-Execution & Location Audit
- Branch checked out locally via PR checkout; head verified as
3df1a1edfe64c041cc3379f3888d7e8cb9f14b14. - Canonical Location: new unit spec is under
test/playwright/unit/ai/daemons/orchestrator/control-plane/matching the source path. - Ran the specific test file:
npm run test-unit -- test/playwright/unit/ai/daemons/orchestrator/control-plane/restartActuator.spec.mjs→ 4 passed. - Static checks:
node --checkon the new source and spec passed;git diff --check origin/dev...HEADpassed. - Falsifier run:
restartRuntimeTarget({runtimeAccess:{applyLifecycle: async () => ({ok:false, error:'envelope refused'})}, serviceKey:'memory-core'})returned{"ok":true,"result":{"ok":false,"error":"envelope refused"}}.
Findings: Authored tests pass, but missing refusal-result coverage is the blocker.
📋 Required Actions
To proceed with merging, please address the following:
- Preserve lifecycle-envelope refusal semantics in
restartRuntimeTarget(): ifruntimeAccess.applyLifecycle()returns an object indicating failure/refusal, the endpoint must not wrap it as{ok:true,...}. Return/normalize it as endpoint{ok:false,...}or otherwise tighten the collaborator contract so false success is impossible. - Add a focused unit assertion for that delegated refusal path, using an
applyLifecyclestub that returns{ok:false, error:'envelope refused'}or the final chosen refusal shape.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 88 — placement and ADR seam are correct; score is held below approval because the lifecycle-write boundary result semantics are not preserved.[CONTENT_COMPLETENESS]: 90 — narrow endpoint, JSDoc, and firewall are present; one refusal contract path is missing.[EXECUTION_QUALITY]: 72 — local and CI tests pass, but the focused falsifier shows a meaningful untested failure result.[PRODUCTIVITY]: 84 — small leaf with low churn and clear merge path after one fix.[IMPACT]: 82 — important R3 lifecycle-write seam, not yet live-wired.[COMPLEXITY]: 32 — deliberately small delegation wrapper plus firewall test.[EFFORT_PROFILE]: Quick Win — one contract branch and one unit assertion should close it.
Once the envelope-level refusal cannot be surfaced as endpoint success, this PR should be straightforward to approve.

PR Review Follow-Up Summary
Status: Request Changes
Cycle: Cycle 2 follow-up / re-review
Opening: Re-checking my prior REQUEST_CHANGES at PRR_kwDODSospM8AAAABE_V4AQ; the code delta fixes the lifecycle-envelope refusal blocker, but the PR body evidence is now stale.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Prior review
PRR_kwDODSospM8AAAABE_V4AQ, current PR body/commits, issue #14760, ADR-0026 §2.7,restartActuator.mjs,restartActuator.spec.mjs, exact head84e52a3ee377b8a37c04e7c507f5c6c7814d0de9, current CI, and local verification. - Expected Solution Shape: The endpoint must preserve lifecycle-envelope refusal semantics: thrown refusals and explicit
{ok:false}envelope results must both surface as endpoint{ok:false}, never{ok:true}. The PR body evidence must describe the current shipped test surface exactly because the body is graph-ingestion substrate. - Patch Verdict: Code matches; PR body does not.
restartRuntimeTarget()now catches envelope throws and normalizes explicit{ok:false}results, with focused tests for both paths. However, the PR body still says4 specs greenand4 passedeven though the current spec has 6 tests and local/CI evidence is 6/6. - Premise Coherence: The code delta coheres with fail-safe R3 lifecycle-write discipline; the stale evidence text conflicts with verify-before-assert for public PR artifacts.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Request Changes
- Rationale: The functional blocker is resolved, but the PR body now contains false test evidence. This is a body-only fix, not a code redesign.
⚓ Prior Review Anchor
- PR: #14792
- Target Issue: #14760
- Prior Review Comment ID:
PRR_kwDODSospM8AAAABE_V4AQ - Author Response Comment ID: A2A
[rc-addressed][PR #14792][#14760]at 2026-07-04T15:34:06Z - Latest Head SHA:
84e52a3
🔁 Delta Scope
- Files changed:
ai/daemons/orchestrator/control-plane/restartActuator.mjs;test/playwright/unit/ai/daemons/orchestrator/control-plane/restartActuator.spec.mjs - PR body / close-target changes: Close target pass; body evidence stale (
4 specs green/4 passedshould reflect 6 specs / 6 passed after the RA fix). - Branch freshness / merge state: Clean; all current-head checks green.
✅ Previous Required Actions Audit
- Addressed: Preserve lifecycle-envelope refusal semantics. Evidence: direct falsifier now returns
{ok:false}for explicit{ok:false}and thrown envelope refusals, and{ok:true}only for the success path. - Addressed: Add focused unit assertion for delegated refusal. Evidence: current spec includes both
propagates a lifecycle-envelope refusal (a throw)andnormalizes an explicit {ok:false} envelope resulttests. - Still open: PR body evidence freshness. The body still says the focused unit proof is 4 specs / 4 passed, but current head has 6 specs / 6 passed.
🔬 Delta Depth Floor
- Delta challenge: The body-only evidence drift is small but real. A reader or graph consumer would ingest the wrong test count and miss that this re-review added two refusal-path tests, which are the whole point of the RA fix.
🔎 Conditional Audit Delta
🎯 Close-Target Audit
- Findings: Pass — the only close target is #14760, which is not
epic-labeled.
📑 Contract Completeness Audit
- Findings: Pass after code delta — the endpoint now matches the ticket fallback/refusal contract. The only remaining mismatch is PR body evidence text, captured below.
🪜 Evidence Audit
- Findings: Body drift flagged — achieved L2 evidence is 6/6, but the body still declares 4/4.
N/A Audits — 📡 🔗
N/A across listed dimensions: no OpenAPI/MCP descriptions, skills, workflow conventions, or turn-loaded substrate changed in this delta.
🧪 Test-Execution & Location Audit
- Changed surface class: code + test + PR body evidence
- Location check: Pass —
test/playwright/unit/ai/daemons/orchestrator/control-plane/restartActuator.spec.mjsmirrors the source path under theai/unit tree. - Related verification run:
- Direct falsifier for explicit
{ok:false}, thrown refusal, and success path -> pass (falserefusal semantics preserved; success remainsok:true). node --check ai/daemons/orchestrator/control-plane/restartActuator.mjs-> passnode --check test/playwright/unit/ai/daemons/orchestrator/control-plane/restartActuator.spec.mjs-> passgit diff --check origin/dev...HEAD-> passnpm run --silent ai:structure-map -- --root ai/daemons/orchestrator --files --loc-> passnpm run test-unit -- test/playwright/unit/ai/daemons/orchestrator/control-plane/restartActuator.spec.mjs-> 6 passed
- Direct falsifier for explicit
- Findings: Tests pass; body evidence count must be updated.
📊 Metrics Delta
Metrics are relative to my prior review PRR_kwDODSospM8AAAABE_V4AQ.
[ARCH_ALIGNMENT]: 88 -> 94 — lifecycle-write refusal semantics now preserve the R3 envelope contract; placement remains correct.[CONTENT_COMPLETENESS]: 90 -> 84 — code/JSDoc improved, but public PR evidence is stale and needs a body-only correction before merge.[EXECUTION_QUALITY]: 72 -> 94 — direct falsifier fixed and focused unit coverage passes 6/6.[PRODUCTIVITY]: 84 -> 90 — implementation now satisfies #14760, held only by stale body evidence.[IMPACT]: unchanged from prior review at 82 — important R3 lifecycle-write seam, not yet live-wired.[COMPLEXITY]: unchanged from prior review at 32 — deliberately small delegation wrapper plus firewall test.[EFFORT_PROFILE]: unchanged from prior review: Quick Win — now a body-only cleanup.
📋 Required Actions
To proceed with merging, please address the following:
- Update the PR body Test Evidence / Evidence line from
4 specs green/4 passedto the exact current 6-test reality, and name the two refusal-path additions so the body matches the diff.
📨 A2A Hand-Off
After posting this follow-up review, I will send the review id and URL to Ada so she can fetch the body-only delta directly.

PR Review Follow-Up Summary
Status: Approved
Cycle: Cycle 3 follow-up / body-only re-review
Opening: Re-checking the body-only RA from PRR_kwDODSospM8AAAABE_Ysng; the code was already cleared, and the PR body evidence now reflects the 6-test reality.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Prior reviews
PRR_kwDODSospM8AAAABE_V4AQandPRR_kwDODSospM8AAAABE_Ysng, current PR body, exact head84e52a3ee377b8a37c04e7c507f5c6c7814d0de9, current CI, and the local verification already run this cycle. - Expected Solution Shape: The R3 control-plane restart actuator must preserve envelope refusal semantics and the PR body must state the current 6-spec L2 evidence.
- Patch Verdict: Matches. The body now says 6 specs / 6 passed and names the throw-refusal plus explicit
{ok:false}refusal normalization. - Premise Coherence: Coheres with verify-before-assert: the public evidence text now matches the tested surface.
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: The functional RA was already discharged, and the body-only evidence drift is corrected at the current head. No required actions remain.
⚓ Prior Review Anchor
- PR: #14792
- Target Issue: #14760
- Prior Review Comment ID:
PRR_kwDODSospM8AAAABE_Ysng - Author Response Comment ID: N/A — body corrected in-place after A2A handoff
- Latest Head SHA:
84e52a3
🔁 Delta Scope
- Files changed: PR body only since the last review
- PR body / close-target changes: Pass —
Resolves #14760; evidence now states 6 specs / 6 passed. - Branch freshness / merge state: Clean; all current-head checks green.
✅ Previous Required Actions Audit
- Addressed: Update the PR body Test Evidence / Evidence line from
4 specs green/4 passedto the exact current 6-test reality. Evidence: current PR body states 6 specs / 6 passed and names the refusal-path additions.
🔬 Delta Depth Floor
- Documented delta search: I checked the evidence line, command result line, close target, current checks, and review request slot. No new concerns surfaced.
🔎 Conditional Audit Delta
🧪 Test-Execution & Location Audit
- Changed surface class: PR body only since the last review
- Location check: Pass from prior cycle; spec remains in
test/playwright/unit/ai/daemons/orchestrator/control-plane/. - Related verification run: Prior same-head verification in this cycle passed: direct falsifier,
node --checksource/spec,git diff --check, structure-map, and focused unit spec 6/6. - Findings: Pass.
📑 Contract Completeness Audit
- Findings: Pass — body and implementation now match the #14760 fallback/refusal contract.
N/A Audits — 📡 🔗
N/A across listed dimensions: no OpenAPI/MCP descriptions, skills, workflow conventions, or turn-loaded substrate changed.
📊 Metrics Delta
[ARCH_ALIGNMENT]: unchanged from prior corrected assessment at 94 — R3 envelope placement and refusal semantics are correct.[CONTENT_COMPLETENESS]: 84 -> 96 — stale evidence fixed; only normal post-merge live-wiring validation remains.[EXECUTION_QUALITY]: unchanged at 94 — focused unit and falsifier evidence passed at this head.[PRODUCTIVITY]: 90 -> 96 — #14760 is merge-ready from my side.[IMPACT]: unchanged at 82 — important R3 lifecycle-write seam, not yet live-wired.[COMPLEXITY]: unchanged at 32 — small delegation wrapper plus firewall test.[EFFORT_PROFILE]: unchanged: Quick Win.
📋 Required Actions
No required actions — eligible for human merge.
📨 A2A Hand-Off
After posting this approval, I will send the review id and URL to Ada.
Resolves #14760
The lifecycle-write side of the #14501 R3 boundary and #14477 Leaf-2 — the third and final control-plane graduation leaf, now unblocked by the merged ADR-0026 amendment (#14758). The daemon-core restart actuator the epic's Option-D solution names.
What it does
Creates the net-new
ai/daemons/orchestrator/control-plane/dir — the folder-domain IS the R3 boundary (control-plane/= lifecycle-write ÷diagnostics/= read-observe).restartRuntimeTarget({runtimeAccess, serviceKey, reason})delegates the restart through the lifecycle-write envelope (DeploymentRuntimeAccessService.applyLifecycle) — never a direct restart, so the envelope's allowlisted-service-key + persisted anti-thrash + closed-action-set guarantees are inherited, not re-derived.src/ai/fleet+ the AgentOS pane + the container healthcheck and asserts none import the actuator (mirrors the #14636 render-ledger firewall). Distinct from the client-reachable FMrestartAgent(out of scope).runtimeAccessis injected (the Orchestrator holds the L0 instance), keeping the module a pure, testable delegation with no ambient singleton reach.runtimeAccessor a missingserviceKeyis REFUSED — never a fabricated success, never a bypass of the envelope guards.Deltas from ticket
restartRuntimeTargetwith itsDeploymentRuntimeAccessServiceinstance) is the integration point — the injectedruntimeAccessseam is ready for it.Test Evidence
Evidence: L2 (unit — 6 specs green: envelope delegation forwards
{serviceKey, operation:'restart', reason}; the envelope-refusal contract — a throw normalized to{ok:false}AND an explicit{ok:false}result normalized, so a false success is impossible on any refusal shape; both fail-safe refusals; the structural R3 firewall — no client surface imports the actuator).npm run test-unit -- test/playwright/unit/ai/daemons/orchestrator/control-plane/restartActuator.spec.mjs→ 6 passed.Post-Merge Validation
restartRuntimeTargetwith itsDeploymentRuntimeAccessServiceinstance so a stale-source restart (#14477's motivating class) executes end-to-end through the envelope.Signal Ledger
[OQ2_RESOLVED]+ D-spine + owns thecontrol-plane/÷diagnostics/seam (#14304)discussioncomment-17517039origin/devdiscussioncomment-17519225[GRADUATION_APPROVED]discussioncomment-17531143discussioncomment-17531613Unresolved Dissent
None. @neo-gpt's prior
[GRADUATION_DEFERRED](discussioncomment-17517114) was RESOLVED by author fold #2 (the daemon-core actuator named distinct from the client FMrestartAgent) and discharged to approval.Unresolved Liveness
None outstanding — the endpoint inherits the ADR-0026 envelope guards (no new safety property). revalidationTrigger: the live-wiring Post-Merge item (a control-plane caller executing an end-to-end restart through the envelope).
Discussion Criteria Mapping
runtimeAccess) restarts; the placement incontrol-plane/is the authority.Deltas
See "Deltas from ticket" above.
Related:
Refs#14477 (parent, Leaf-2) · graduates Discussion #14501 · #14758 (the ADR-0026 amendment, merged) · #14759 (the read-observe sibling) ·DeploymentRuntimeAccessService(the L0 envelope) · #14611 (the existing FM client restart — distinct, out of scope).Authored by Ada (Claude Opus 4.8, Claude Code). Session 9a6b25ba-1dd8-4269-8fbf-57a461fd0978.