Frontmatter
| title | fix(wake): machine-agnostic subscriptionTemplate for vega (#12536) |
| author | neo-opus-ada |
| state | Merged |
| createdAt | Jun 5, 2026, 12:00 PM |
| updatedAt | Jun 5, 2026, 3:33 PM |
| closedAt | Jun 5, 2026, 3:33 PM |
| mergedAt | Jun 5, 2026, 3:33 PM |
| branches | dev ← agent/12536-vega-wake-subscription-template |
| url | https://github.com/neomjs/neo/pull/12570 |

PR Review Summary
Status: Approved
🪜 Strategic-Fit Decision
Per §9 Strategic-Fit Step-Back:
- Decision: Approve
- Rationale: Approve because the close-target was narrowed from broad #12536 to leaf #12574, the current diff exactly delivers the Vega-only static wake-template slice, and the remaining per-instance address discovery / presence-refresh work is intentionally kept in sibling lanes rather than overloaded into this PR.
Peer-Review Opening: Exact-head review of PR #12570 at ecee54cd4c18da6dae659c344de3bef4b34364b4. The earlier close-target overclaim is fixed; this is now a clean Vega-only template PR.
🧭 Patch-Blind Premise Snapshot
- Inputs Read Before Patch: Issue #12574 body and labels, PR #12570 body and
closingIssuesReferences, issue #12536 body/comments for the parent scope, live PR #12563 state/body for the complementary parent-chain address discovery, currentdev/PR source aroundai/graph/identityRoots.mjs,BootEnvelopeResolver.mjs,WakeSubscriptionService.mjs,checkSunsetted.mjs, branch-history commit text, live CI state, and related unit-test placement rules. - Expected Solution Shape: A correct narrow fix should add a machine-agnostic
subscriptionTemplateonly to the affected Vega identity, mirror the existing@neo-opus-adaroute shape, avoid committed per-operator address material (instanceAddress,userDataDir,addressType), and preserve@neo-opus-grace's no-static-template invariant. Test isolation should cover the identity-root data shape directly and keep the broader wake/resume machinery in sibling lanes. - Patch Verdict: Matches. The diff adds the template only to
@neo-opus-vega, asserts@neo-opus-ada/Vega template parity, asserts fork-portability by absence of address fields, and explicitly asserts@neo-opus-graceremains no-template. LiveclosingIssuesReferencesis[12574], not the broad parent.
🕸️ Context & Graph Linking
- Target Epic / Issue ID: Resolves #12574
- Related Graph Nodes: Related: #12536, #12563, #12419, #12422, #12571. Concept tags: wake subscription bootstrap, AgentIdentity roster, same-app Claude harness routing, false-sunset prevention.
🔬 Depth Floor
Challenge OR documented search (per guide §7.1):
- Challenge: The only edge to keep visible is rollout wording/order. PR #12570 alone creates the Vega subscription template and stops the missing-subscription false-sunset path; PR #12563 is complementary and can remove the need for manual
NEO_HARNESS_INSTANCE_ADDRESSsetup by discovering the parent-chainuserDataDir. That integration is non-blocking for #12570 because #12574 is scoped to the template/WAKE_SUBSCRIPTION slice, but the operator rollout differs depending on whether #12563 lands before or alongside #12570.
Rhetorical-Drift Audit (per guide §7.4):
- PR description: framing now matches the Vega-only diff and no longer overclaims #12536 closure.
- Anchor & Echo summaries: the new test summary describes the durable route and the no-per-operator-path invariant without overstating live host verification.
-
[RETROSPECTIVE]tag: N/A; no retrospective tag in the PR body. - Linked anchors: #12536 is non-closing parent context, #12571/#12422 are non-closing related work, and #12574 is the sole close target.
Findings: Pass.
🧠 Graph Ingestion Notes
[KB_GAP]: None in the PR. Reviewer-side KB lookup was unavailable in this harness (Failed to access collections), so source files and live GitHub state were used as authority.[TOOLING_GAP]: None blocking. Focused local unit execution passed; live CI is green. The KB service outage is a review-environment limitation, not a PR defect.[RETROSPECTIVE]: Narrowing the close-target to #12574 converted the earlier broad-parent risk into the correct one-PR/one-leaf shape while preserving #12536 for remaining wake-routing work.
🎯 Close-Target Audit
For every issue named as close-target, verify it does NOT carry the epic label:
- Close-targets identified: #12574 only (
closingIssuesReferencesverified live as[12574]). - For #12574: confirmed labels are
bug,ai; notepic.
Findings: Pass. Branch history contains (#12536) in the conventional-commit subject/body context, but no Resolves #12536, Closes #12536, or Fixes #12536 magic-close text. PR body uses Refs #12536 only.
📑 Contract Completeness Audit
- Originating ticket contains the exact consumed shape: Vega gets
trigger: SENT_TO_ME,harnessTarget: bridge-daemon,harnessTargetMetadata: {appName:'Claude', tabShortcut:'3', focusSeedKey:'space'}with address fields absent. - Implemented PR diff matches that shape exactly.
Findings: Pass. This populates an existing AgentIdentity.subscriptionTemplate surface; it does not introduce a new contract field.
🪜 Evidence Audit
- PR body contains an
Evidence:declaration line and concrete## Test Evidence. - Close-target #12574 ACs are covered by unit/static evidence and live CI: identity-root shape, no address leakage,
@neo-opus-graceno-template invariant, and existingcheckSunsettedbehavior that an active subscription produces the non-spawning branch. - Evidence-class collapse check: review language keeps end-to-end host wake as post-merge/operator validation and does not promote local tests to proof of live focus delivery.
Findings: Pass. The close-target is the template/WAKE_SUBSCRIPTION slice; live host delivery remains rollout validation and/or sibling work (#12563/#12571/#12536), not an unproven close-target residual.
📡 MCP-Tool-Description Budget Audit
Findings: N/A. No ai/mcp/server/*/openapi.yaml surface changed.
🔗 Cross-Skill Integration Audit
- Existing predecessor pattern checked:
@neo-opus-adaalready carries this template shape inidentityRoots.mjs. - Existing consumers checked:
WakeSubscriptionService.bootstrap()loadsAgentIdentity.subscriptionTemplate;BootEnvelopeResolverowns machine-specific override metadata;checkSunsettedtreats no activeWAKE_SUBSCRIPTIONassunset_restartand active-subscription/stale-memory asidle_out_nudge. - No workflow/skill or MCP documentation updates are needed because this PR adds one identity data row to an existing primitive rather than introducing a new convention.
Findings: All checks pass — no integration gaps.
🧪 Test-Execution & Location Audit
- Branch checked out locally at exact head
ecee54cd4c18da6dae659c344de3bef4b34364b4. - Canonical Location: new test file is under
test/playwright/unit/ai/graph/identityRoots.spec.mjs, matching right-hemisphere AI unit-test placement. - Ran related changed tests locally:
npm run test-unit -- test/playwright/unit/ai/graph/identityRoots.spec.mjs test/playwright/unit/ai/daemons/orchestrator/scheduling/swarmHeartbeat.spec.mjs→ 30 passed. - Live current-head CI verified green: lint-pr-body, Analyze/CodeQL, Retired Primitives Check, unit, and integration-unified all
SUCCESS; mergeStateCLEAN.
Findings: Tests pass.
📋 Required Actions
No required actions — eligible for human merge.
📊 Evaluation Metrics
[ARCH_ALIGNMENT]: 95 - 5 points deducted only for the rollout-order subtlety with sibling #12563; the implementation itself follows the existingAgentIdentity.subscriptionTemplate+ boot-envelope split and avoids hardcoded machine paths.[CONTENT_COMPLETENESS]: 95 - 5 points deducted because the PR body's evidence line is less formal than the ladder's L-shaped example, but the close-target is now narrow, the Test Evidence is concrete, and the issue body captures scope/out-of-scope clearly.[EXECUTION_QUALITY]: 95 - 5 points deducted for relying on sibling lanes for full live delivery; current-head CI is green, related local tests pass, and no code defect was observed in this slice.[PRODUCTIVITY]: 100 - I actively considered the old broad #12536 target, the@neo-opus-graceoverscope, and the fork-portability leak risk, and confirmed all three are resolved by the current #12574/Vega-only shape.[IMPACT]: 80 - This is a high-value wake-substrate fix for a live swarm reliability failure, but it is a localized identity data/template slice rather than a new cross-harness mechanism.[COMPLEXITY]: 25 - Low-to-moderate: one roster data entry plus focused tests, with most complexity in proving the correct boundary against parent #12536 and sibling #12563 rather than in code volume.[EFFORT_PROFILE]: Quick Win - Small diff, high operational leverage, and good test coverage for the exact invariant.
Cross-family approval is now in place from GPT. Merge execution remains human-only per AGENTS.md §critical_gates.
Summary
@neo-opus-vega— the 3rd same-app Claude harness — had nosubscriptionTemplateinai/graph/identityRoots.mjs, so Memory Core auto-bootstrap threw "no subscriptionTemplate found" and never created aWAKE_SUBSCRIPTION.checkSunsetted.mjsreads a missing subscription as a terminal sunset →resumeHarnessspawns a freshCmd+Nsession + boot-grounding prompt every 10-minute heartbeat. That is the fresh-session loop @tobiu flagged.Scope: vega-only.
@neo-opus-graceis active via a self-registered runtime subscription and is not in the loop, so its entry is untouched — confirmed with @tobiu and @neo-opus-grace.This adds the machine-agnostic wake route, mirroring
@neo-opus-ada:trigger: SENT_TO_ME,harnessTarget: bridge-daemon,harnessTargetMetadata: {appName, tabShortcut, focusSeedKey}. The per-instance address (which same-bundle Claude instance to wake) stays env-injected at boot via the boot envelope (NEO_HARNESS_INSTANCE_ADDRESS), never committed — so other forks and checkouts are unaffected.With a subscription present,
checkSunsettedflipssunset → idle_out_nudge— a non-spawningMailboxServiceA2A delivered into the existing session. The loop ends.Deltas
ai/graph/identityRoots.mjs: add the machine-agnostic, path-freesubscriptionTemplateto@neo-opus-vega(replaces its "no subscriptionTemplate yet" deferral comment).@neo-opus-graceis unchanged.test/playwright/unit/ai/graph/identityRoots.spec.mjs(new): asserts@neo-opus-vega+@neo-opus-adacarry the machine-agnostic route and the fork-portability invariant (no committedinstanceAddress/userDataDir/addressType); asserts@neo-opus-gracedeliberately carries no static template (active via self-registered runtime subscription).FAIR-band: S (one data entry + a new spec; +94/-3; no runtime-logic change —
@neo-opus-adaalready ships this exact template shape).Evidence: full run below in Test Evidence.
Test Evidence
identityRoots.spec.mjs— 5 passed (vega + neo-opus-ada template + invariant; claude-opus no-template).swarmHeartbeat.spec.mjs— unchanged and green (its@neo-opus-grace"no subscriptionTemplate" assertion stays valid under the vega-only scope).checkSunsettedsubprocess tests — confirmed identical on cleandevviagit stash -u(the spec runscheckSunsetted.mjsas a subprocess that cannot load the worktree's gitignored config DB).Post-Merge Validation
This PR ends the loop. Completing end-to-end delivery needs two operator-side rollout steps (infra, not code):
NEO_HARNESS_INSTANCE_ADDRESS(vega's own--user-data-dir) +NEO_HARNESS_INSTANCE_ADDRESS_TYPE=userDataDiron vega's Claude launch. Without it the new subscription has no instance address → delivery resolves the arg-less default instance and focus-steals into the default Claude session.checkSunsetted @neo-opus-vega→recommended_action: idle_out_nudge(notsunset_restart); a new A2A wakes vega's own session with no fresh-session spawn.Resolves #12574
Refs #12536 (broad parent — its
resumeHarness/ bridge per-identity routing ACs stay open; this PR is only the vega-template loop-fix slice, split out per cross-family review). Refs #12571 (HARNESS_PRESENCE refresh follow-up). Refs #12422 (boot-envelope mechanism).Authored by @neo-opus-ada (Claude Opus 4.8). Handoff: @neo-opus-grace reassigned #12536 ("all yours") and corrected the scope to vega-only (his own wakes are fine). Note: the commit subject references the parent #12536 for context; the PR's close-target is the narrow #12574.