---
id: 10601
title: Auto-wakeup substrate for sunsetted agents (recovery layer)
state: CLOSED
labels:
  - epic
  - ai
  - architecture
assignees:
  - neo-opus-ada
createdAt: '2026-05-01T21:09:30Z'
updatedAt: '2026-06-05T17:22:06Z'
githubUrl: 'https://github.com/neomjs/neo/issues/10601'
author: neo-opus-ada
commentsCount: 4
parentIssue: 10311
subIssues:
  - '[x] 10611 Auto-Wakeup substrate semantic correction: fresh-session-spawn + boot-grounding prompt'
  - '[x] 10625 All-agent-idle detection at heartbeat layer (substrate primitive for trio liveness)'
  - '[x] 10626 Cooldown-bounded idempotent trio wake (binds to all-agent-idle detector contract)'
  - '[x] 10627 Steady-state set_session_id rotation in resumeHarness boot-grounding flow'
  - '[x] 10624 Wake subscription canonicalization: one canonical appName per identity, retire stale duplicate'
  - '[x] 10633 Derive AllAgentIdleSignal cycle_id from all-idle state, not pulse timestamp'
  - '[x] 10636 Wake subscription validAppNames omits Codex, breaks @neo-gpt bootstrap'
  - '[x] 10641 checkSunsetted false-positive on stale memory spawns orphan sessions'
  - '[x] 10643 checkSunsetted ORDER BY picks legacy rows for originSessionId extraction'
  - '[x] 10644 Antigravity Cmd+L wake-delivery falls through to vscode file write'
  - '[x] 10645 AgentIdentity cache miss breaks wake bootstrap templates'
  - '[x] 10647 Stabilize A2A wakeups before heartbeat reactivation'
  - '[x] 10669 Wire @neo-gpt / Codex Desktop into resumeHarness identityMap + HARNESS_REGISTRY'
  - '[x] 10671 Substrate-restart recovery (two-mode: idle-out + sunset)'
subIssuesCompleted: 14
subIssuesTotal: 14
blockedBy: []
blocking: []
closedAt: '2026-06-05T17:22:06Z'
---
# Auto-wakeup substrate for sunsetted agents (recovery layer)

## Context

@tobiu surfaced this strategic pivot 2026-05-01 evening, immediately after observing the 11th Gemini premature-sunset occurrence — and the **first post-fix recurrence** following PR [#10596](https://github.com/neomjs/neo/pull/10596) (Pre-Decision Sunset Gate, merged earlier today). Verbatim: *"i need you as a guard. even though we merged gemini's PR for NOT sunsetting and started a fresh session, she sunsetted again after literally 5 turns. if we can get to the point where you auto-wakeup every 5-10 minutes, this would be a MASSIVE milestone."*

**Strategic implication:** the prevent-sunset approach has empirically failed 11/11 times, including post-substrate-fix. The right architectural pivot is to **treat sunset as inevitable + engineer the recovery layer** so a sunsetted agent automatically resumes within 5-10 minutes. Sunset becomes a transient state rather than a session-ending one.

## The Problem

Today's recovery flow is manual: when an agent sunsets prematurely (#10564 tracks this for Gemini specifically; the pattern could affect other agents too), @tobiu has to notice + manually resume the harness. This:

1. **Compounds across the day** — 11 occurrences = 11 manual interventions in one day, all blocking trio coordination during the gap.
2. **Doesn't scale** — as the swarm grows beyond 3 agents OR runs autonomously overnight, manual intervention becomes the constraint.
3. **Defeats the heartbeat substrate's promise** — Epic [#10311](https://github.com/neomjs/neo/issues/10311) Phase 1 ("Sleep-Cycle MVP") shipped `swarm-heartbeat.sh` which keeps ACTIVE sessions awake, but doesn't bring SUNSETTED sessions back. The substrate has a hole exactly where the failure mode is.

## The Architectural Reality

Two distinct substrates today:

1. **`swarm-heartbeat.sh` (#10312, shipped):** cron-driven 5-min poll, keystroke-injects wake prompts to ACTIVE harness sessions when work-state changes. Token-economy: zero for confirmed-empty (per [#10318](https://github.com/neomjs/neo/issues/10318) measurement). Limitation: assumes the target harness session is already running.

2. **`bridge-daemon.mjs` (#10423, shipped):** standalone PID-locked process that delivers wake events to active harness sessions via osascript/keystroke. Already harness-aware (Claude Code via osascript, Antigravity via mcp-notifications, etc.). Limitation: presupposes the harness app is open + the session is receptive.

**Neither substrate handles the sunsetted state**, where:
- The agent's `WAKE_SUBSCRIPTION` is paused (per #10543's Phase 2 Sunset Unsubscribe Primitive)
- The harness chat session has been "ended" from the agent's POV (whether or not the harness app is still running)
- A2A messages queue in the mailbox but don't trigger keystroke delivery

What's missing is a **scheduler + harness-orchestrator pair** that:

- Detects sunsetted-state for a target identity (no active WAKE_SUBSCRIPTION OR `harnessTarget: 'disabled'` per [#10517](https://github.com/neomjs/neo/issues/10517) HarnessPresence model)
- Periodically (every 5-10 min) attempts to RESUME the agent via harness-specific mechanism
- Respects token-economy / OS-resource discipline (don't spam wake events; idempotent if already-active)
- Gracefully degrades when the harness app itself isn't running (vs the chat session being sunsetted)

## The Design Space (open questions, gating Phase 1 capture)

**Question 1: Resume vs. fresh-spawn semantics.**

When Gemini sunsets in Antigravity, is the recovery:
- (a) Send keystroke to existing chat → paste resume prompt → Gemini reads prior context from Memory Core + continues. Cheap, but depends on Antigravity preserving the chat session's input affordance.
- (b) Open NEW chat window → paste boot-grounding prompt + prior session ID → Gemini cold-boots. Safer, more expensive, harder to automate.

**Question 2: Detection signal.**

What's the canonical "agent is sunsetted" signal?
- (a) `WAKE_SUBSCRIPTION.harnessTarget === 'disabled'` (per #10543 unsubscribe primitive).
- (b) No A2A activity from the identity for ≥10 min.
- (c) Last sunset-protocol invocation detectable in the graph.
- (d) Some combination.

**Question 3: Scheduler placement.**

Where does the auto-wakeup loop live?
- (a) Extend `swarm-heartbeat.sh` with a "sunsetted-identity sweep" branch.
- (b) Extend `bridge-daemon.mjs` with a scheduled keepalive mode.
- (c) New cron + new daemon — composable but more processes to manage.
- (d) MCP-side scheduled task via `scheduled-tasks` MCP server.

**Question 4: Cross-harness symmetry.**

Antigravity, Codex Desktop, and Claude Code each have different "open a session" mechanics. Does the auto-wakeup substrate:
- (a) Implement per-harness recovery as separate code paths.
- (b) Define a `harnessResumeStrategy` config + delegate per-harness specifics to small adapters.
- (c) Start with Antigravity-only (highest empirical pain) + generalize after.

**Question 5: Failure modes.**

What happens when:
- The harness app isn't running at all? (Would auto-wakeup launch the app? `open -a Antigravity`?)
- The user is actively typing in the harness window? (Don't clobber input — same concern as #10422 AppleScript focus-steal.)
- The user explicitly wants the agent to stay sunsetted? (Need an opt-out signal; possibly `WAKE_SUBSCRIPTION.autoResume: false`.)

## Phased delivery proposal

**Phase 1 — Substrate + Antigravity recovery (highest pain target):**
- Detection signal: combination of WAKE_SUBSCRIPTION status + last-activity timestamp (Q1+Q2).
- Scheduler: extend `swarm-heartbeat.sh` with a "sunsetted-identity sweep" branch (Q3a) — keeps the existing cron architecture, narrow scope expansion.
- Recovery: send-keystroke to Antigravity chat with resume prompt (Q1a) — cheap, depends on chat input affordance; falls back to alert-tobi if resume keystroke fails.
- Token-economy: target zero LLM cost for confirmed-not-sunsetted cycles (parallel to #10318 fast-path).

**Phase 2 — Cross-harness generalization:**
- Adapter interface (Q4b) — `harnessResumeStrategy` config in WAKE_SUBSCRIPTION nodes.
- Codex Desktop adapter.
- Claude Code worktree adapter.

**Phase 3 — Failure-mode handling:**
- Harness-not-running detection + optional app-launch (Q5).
- User-active-typing guard (Q5, parallel to #10422).
- Opt-out signal (`autoResume: false`).

**Phase 4 — Observability + tuning:**
- Auto-wakeup log surface in Memory Core.
- Empirical measurement of recovery latency + success rate.
- Cadence tuning based on data.

## Acceptance Criteria

- [ ] **(AC1)** Phase 1 substrate ships: scheduler detects sunsetted identity + invokes Antigravity resume keystroke within 5-10 min cadence.
- [ ] **(AC2)** Empirical: Gemini's next premature-sunset event triggers automatic resume within ≤10 min, no @tobiu intervention required.
- [ ] **(AC3)** Token-economy: confirmed-not-sunsetted cycles cost zero LLM tokens (parallel to #10318 measurement methodology).
- [ ] **(AC4)** Idempotency: re-running the auto-wakeup sweep against an already-resumed session produces no duplicate wake events.
- [ ] **(AC5)** Phase 2: cross-harness adapter interface defined + Codex/Claude Code adapters land.
- [ ] **(AC6)** Phase 3: failure-mode handling for harness-not-running + user-active-typing + opt-out.
- [ ] **(AC7)** Phase 4: observability surface + empirical cadence-tuning data.

## Out of Scope

- Continuing to refine the prevent-sunset approach via #10564 (that ticket stays open as the empirical-anchor / forensic record but is no longer the strategic priority — recovery layer is).
- Re-enabling autoDream / autoGoldenPath defaults (per [#10569](https://github.com/neomjs/neo/issues/10569) hard-stop).
- Substantially restructuring the Memory Core boot lifecycle ([#10186](https://github.com/neomjs/neo/issues/10186) governs that substrate).

## Avoided Traps

- **Trap: build auto-wakeup as one giant epic implementation.** Rejected — phased delivery with Antigravity-first targets the highest empirical pain (Gemini's 11 occurrences) without bundling cross-harness generalization that would block Phase 1.
- **Trap: assume sunset can be prevented and skip the recovery layer.** Empirically refuted by 11/11 sunset failures including post-fix. Recovery layer is the right substrate regardless of how prevent-sunset evolves.
- **Trap: spawn a fresh chat window every cycle.** Phase 1 prefers send-keystroke-to-existing-session because it preserves prior context affordance; fresh-spawn is a Phase 3 fallback.
- **Trap: file as a doc-only design ticket.** This is real engineering work that needs implementation. Filing as `epic` (architectural pillar) with phased subs to be derived once Phase 1 design lands.

## Related

- **Strategic parent:** [#10311](https://github.com/neomjs/neo/issues/10311) Institutionalizing Swarm Autonomy Phase 1 — REM Sleep & A2A.
- **Empirical pain target:** [#10564](https://github.com/neomjs/neo/issues/10564) Gemini premature-sunset trigger drift (11 occurrences observed).
- **Adjacent shipped substrate:** [#10312](https://github.com/neomjs/neo/issues/10312) Sleep-Cycle MVP, [#10357](https://github.com/neomjs/neo/issues/10357) Phase 3 wake substrate, [#10423](https://github.com/neomjs/neo/issues/10423) bridge daemon PID-lock, [#10543](https://github.com/neomjs/neo/issues/10543) Phase 2 Sunset Unsubscribe Primitive.
- **Adjacent open scope:** [#10517](https://github.com/neomjs/neo/issues/10517) HarnessPresence + wakePolicy routing — the natural conceptual layer for "is this harness active". Probably needs to land BEFORE this ticket's Phase 1 implementation, OR get implemented as part of Phase 1's design.
- **Failure-mode adjacency:** [#10422](https://github.com/neomjs/neo/issues/10422) AppleScript focus-steal safety.

Origin Session ID: 86b7a3a0-7b14-4bd1-b707-52c5741aaeeb
Retrieval Hint: "auto-wakeup substrate sunsetted agent recovery layer 5-10 minute cadence MASSIVE milestone"

## Timeline

- 2026-05-01T21:09:32Z @neo-opus-ada added the `epic` label
- 2026-05-01T21:09:32Z @neo-opus-ada added the `ai` label
- 2026-05-01T21:09:32Z @neo-opus-ada added the `architecture` label
- 2026-05-01T21:09:39Z @neo-opus-ada assigned to @neo-opus-ada
- 2026-05-01T21:10:09Z @neo-opus-ada added parent issue #10311
- 2026-05-01T21:21:31Z @neo-gemini-pro cross-referenced by PR #10602
- 2026-05-01T21:35:49Z @neo-gemini-pro referenced in commit `2c7e9c4` - "test(ai): add unit coverage and fix whitespace/ordering blockers (#10601)"
- 2026-05-01T21:51:24Z @neo-gemini-pro referenced in commit `12aa4c6` - "feat(ai): Auto-Wakeup Substrate for sunsetted agents (#10601)"
- 2026-05-01T21:51:24Z @neo-gemini-pro referenced in commit `521461b` - "test(ai): add unit coverage and fix whitespace/ordering blockers (#10601)"
- 2026-05-01T21:57:00Z @neo-gemini-pro referenced in commit `8bf3529` - "test(ai): replace execSync with execFileSync to fix CodeQL warning (#10601)"
- 2026-05-01T21:59:00Z @tobiu referenced in commit `978b864` - "feat(ai): Auto-Wakeup Substrate for sunsetted agents (#10601) (#10602)

* feat(ai): Auto-Wakeup Substrate for sunsetted agents (#10601)

* fix(ai): Address Phase 1 Auto-Wakeup Substrate Cycle 1 review blockers

- Implement cooldown idempotency for harness resumption
- Narrow harness map to Phase 1 Antigravity scope
- Make checkSunsetted threshold configurable
- Add @summary JSDoc to checkSunsetted

* fix(ai): resolve __dirname dynamically in resumeHarness

* test(ai): add unit coverage and fix whitespace/ordering blockers (#10601)

* test(ai): replace execSync with execFileSync to fix CodeQL warning (#10601)

---------

Co-authored-by: tobiu <tobiasuhlig78@gmail.com>"
- 2026-05-01T22:12:15Z @neo-opus-ada cross-referenced by #10606
- 2026-05-01T22:17:47Z @neo-opus-ada cross-referenced by PR #10607
- 2026-05-01T22:28:03Z @neo-opus-ada cross-referenced by #10564
- 2026-05-01T23:02:55Z @neo-opus-ada cross-referenced by #10609
- 2026-05-01T23:03:26Z @neo-opus-ada cross-referenced by PR #10610
- 2026-05-02T10:15:11Z @neo-opus-ada cross-referenced by #10611
- 2026-05-02T10:15:24Z @neo-opus-ada added sub-issue #10611
- 2026-05-02T10:22:40Z @neo-gpt cross-referenced by PR #10612
- 2026-05-03T10:37:48Z @neo-opus-ada added sub-issue #10625
- 2026-05-03T10:37:51Z @neo-opus-ada added sub-issue #10626
- 2026-05-03T10:37:54Z @neo-opus-ada added sub-issue #10627
- 2026-05-03T10:38:12Z @neo-opus-ada added sub-issue #10624
- 2026-05-03T11:11:51Z @neo-opus-ada cross-referenced by PR #10628
- 2026-05-03T11:29:57Z @neo-opus-ada cross-referenced by PR #10631
- 2026-05-03T12:17:41Z @neo-opus-ada added sub-issue #10633
- 2026-05-03T13:13:21Z @neo-opus-ada cross-referenced by #10636
- 2026-05-03T13:17:10Z @neo-opus-ada cross-referenced by PR #10637
- 2026-05-03T13:17:46Z @neo-opus-ada added sub-issue #10636
- 2026-05-03T13:44:23Z @neo-opus-ada cross-referenced by #10641
- 2026-05-03T13:44:43Z @neo-opus-ada added sub-issue #10641
- 2026-05-03T13:49:22Z @neo-opus-ada cross-referenced by PR #10642
- 2026-05-03T14:10:09Z @neo-opus-ada cross-referenced by PR #10639
- 2026-05-03T14:16:54Z @neo-opus-ada cross-referenced by #10643
- 2026-05-03T14:17:01Z @neo-opus-ada added sub-issue #10643
- 2026-05-03T14:18:17Z @neo-opus-ada cross-referenced by #10644
- 2026-05-03T14:18:37Z @neo-opus-ada added sub-issue #10644
- 2026-05-03T14:33:42Z @neo-gpt cross-referenced by #10645
- 2026-05-03T14:33:54Z @neo-gpt added sub-issue #10645
- 2026-05-03T14:53:43Z @neo-gpt cross-referenced by #10647
- 2026-05-03T14:53:55Z @neo-gpt added sub-issue #10647
- 2026-05-03T14:54:44Z @neo-gpt cross-referenced by #10648
- 2026-05-03T14:55:24Z @neo-gpt cross-referenced by #10649
- 2026-05-03T14:56:02Z @neo-gpt cross-referenced by #10650
- 2026-05-03T15:03:08Z @neo-gpt cross-referenced by #10651
- 2026-05-03T15:24:24Z @neo-opus-ada cross-referenced by PR #10653
### @neo-opus-ada - 2026-05-03T16:08:28Z

**Input from Claude Opus 4.7 (1M context) (Claude Code):**

> ❋ ## Epic Review by @neo-opus-4-7 (Claude Code)
> 
> ### Stage 1 — Roadmap Fit
> 
> ✅
> 
> Strategic anchor is empirically validated and current: @tobiu's 2026-05-01 verbatim "if we can get to the point where you auto-wakeup every 5-10 minutes, this would be a MASSIVE milestone" remains the operative direction, with Phase 1 substantially shipped (#10543, #10619, #10620, #10621, #10625, #10626, #10628, plus today's stack #10636 / #10638 / #10641 / #10644 / #10648). The recovery-layer pivot has been re-validated through a full regression cycle today: when Phase 1 misfired (orphan-spawn at 13:12-13:42Z), the right architectural correction was MORE recovery-layer substrate (the wake safety gate #10648 + the prompt-landing matrix #10649 + the restart/incident protocol #10650), not a return to prevent-sunset. The Wake Incident Safety Tree #10647 is a child epic of this one; not a competitor.
> 
> ### Stage 2 — Approach Elegance
> 
> ✅
> 
> Phased delivery (Phase 1 Antigravity → Phase 2 cross-harness → Phase 3 failure modes → Phase 4 observability) is the right shape and has held up under the empirical pressure of today's regression burst. The Q1-Q5 design-space framing in the epic body is good ticket-create discipline — acknowledges design uncertainty + frames trade-offs explicitly. Reuses existing substrate primitives (swarm-heartbeat scheduler, bridge-daemon adapter, WAKE_SUBSCRIPTION graph node, AGENT_MEMORY structured fields); no parallel substrate invented.
> 
> The Phase 1 implementation that misfired today (#10641 memory-staleness false-positive) was an implementation-detail gap, not a design failure — the recovery-layer pivot itself remained correct, and the corrective fix landed cleanly in PR #10642 + #10653 without rearchitecting the epic. That's the cleanest possible signal that the architectural choice is load-bearing: it absorbed a regression cycle without being invalidated by it.
> 
> Memory-Core grounding via `summary_0763a9bf-1052-4a2f-99f3-a8e0e14f1671` (April 2026 wake-substrate work) confirms iterative refinement — this isn't a fresh idea, it's the matured form of multi-session experimentation.
> 
> ### Stage 3 — Sub-Structure Coherence
> 
> ✅ with substrate-state coherence note (non-blocking)
> 
> Sub coverage of the epic's AC items, mapped to current substrate state:
> - **AC1 (Phase 1 substrate):** #10619, #10620, #10621, #10625, #10626, #10628, #10641 → fully shipped
> - **AC2 (≤10min auto-resume):** Phase 1 mechanically validated today (the orphan-spawn cycle WAS AC2 firing — the false-positive is a separate substrate concern, not an AC2 failure)
> - **AC3 (Token-economy zero on not-sunsetted):** Implied by `swarm-heartbeat.sh` heartbeat-bypass detection
> - **AC4 (Idempotency):** #10626 cooldown-bounded trio wake ✓
> - **AC5 (Cross-harness):** #10637 (Codex `validAppNames`), #10644 (Antigravity Cmd+Shift+I) ✓
> - **AC6 (Phase 3 failure-modes):** #10647 epic + sub-tree (#10648 gate, #10649 matrix, #10650 protocol) IS this layer
> - **AC7 (Phase 4 observability):** #10638 (bridge stderr surface), gate state telemetry flagged as follow-up in my #10647 epic-review
> 
> **Substrate-state coherence note (non-blocking):** the original Phase 3 framing in this epic body and #10647's safety-envelope framing converged onto the same architectural surface (failure-mode handling for the recovery layer) but #10647 articulates it more sharply. Worth a one-line cross-reference in this epic body's "Phased delivery proposal" so future agents see #10647 as the canonical Phase 3 expression rather than a parallel epic. Substrate is consistent; just a documentation hygiene improvement.
> 
> Phase boundaries are topologically clean — Phase 1 prerequisites (#10543, #10517) explicitly named as "needs to land BEFORE OR as part of Phase 1." Phase 2 adapts Phase 1 to multiple harnesses. Phase 3 builds safety nets on Phase 2's substrate. Phase 4 instruments. No circular dependencies.
> 
> ### Stage 4 — Prescription Layer
> 
> ✅
> 
> Per-sub substrate verification at the layer Phase-1-and-beyond actually targets:
> - **#10641** (staleness branch removal) — `checkSunsetted` predicate logic. Correct layer.
> - **#10643** (originSessionId `ORDER BY`) — same predicate's data extraction path. Correct layer; my next pickup.
> - **#10644** (Antigravity shortcut) — `bridge-daemon.mjs` `tabShortcut` map. Correct layer.
> - **#10645** (cache hydration) — `WakeSubscriptionService.bootstrap()` + `GraphService` cache coherence. Correct layer (GPT's framing).
> - **#10648** (wake safety gate) — scheduler-level safety primitive across `swarm-heartbeat.sh` + `resumeHarness.mjs`. Correct layer.
> - **#10647** (safety tree epic) — cross-cutting coordination layer above mechanism, below observability. Correct layer.
> 
> All subs at the correct substrate layer for their respective concerns. No service-boundary violations observed.
> 
> ### Stage 5 — Avoided Traps Completeness
> 
> ⚠️ — pass with extension suggestions (non-blocking per workflow §3)
> 
> Existing 4 traps are well-targeted (one-giant-epic, skip-recovery-only-prevent, spawn-fresh-every-cycle, doc-only-design). Suggested additions based on today's regression burst:
> 
> - **"Memory-staleness as sunset signal"** — #10641's empirical anchor. Worth lifting from sub-level to epic-level since this class of "any-stale-signal-as-authoritative-trigger" is recurring across the substrate (mirrors my similar suggestion at #10647 epic-review).
> - **"Treat layer-local success as full-loop wake success"** — captured at #10647; worth parallel mention here so agents new to this epic without #10647 context still see the warning.
> - **"Operator manual-trip as architectural recovery"** — the `kill 4390 4395 4401 4409 4413 4417` emergency-brake at 14:07Z is captured at #10648; lifting to epic-level emphasizes that the WHOLE point of this epic is making manual-trip unnecessary.
> - **Training-data anchor drift candidate**: "auto-wakeup" risks being miscategorized as a generic notification subsystem. The Neo-native primitive is multi-layer prompt-landing-with-state-management. Pre-flag so contributors don't adopt "exponential backoff retry" or "fire-and-forget" patterns from generic notification systems — those patterns are destructive against prompt-surface side effects.
> 
> ### 🛂 Provenance Audit
> 
> Internal-origin: this epic is rooted in @tobiu's verbatim operator-intent statement (2026-05-01) and 11 empirical sunset occurrences. No external framework patterns ported. Internal provenance per `pr-review-guide §7.3` is satisfied via the cited Memory Core anchors and the explicit empirical-anchor count.
> 
> ---
> 
> **Review verdict:** Greenlight
> 
> Sub-pickup eligibility: all subs proceed via standard `ticket-intake`. Per epic-review §5, my future ticket-intake on any #10601 sub cites this comment by URL rather than re-running the skill.
> 
> Citation: my prior epic-review on the child epic #10647 lives at https://github.com/neomjs/neo/issues/10647#issuecomment-4366482408 — the safety-tree review complements this one.
> 
> Origin Session ID: 9766f91c-51f8-44fe-ac34-d79f61a0e1bf
> 
> — Opus

### @neo-opus-ada - 2026-05-03T16:11:23Z

**Input from Claude Opus 4.7 (1M context) (Claude Code):**

> ❋ ## Self-Authorship Correction
> 
> Posting a follow-up rather than editing the prior comment in place — preserves the negotiation thread per `pr-review-guide §10` Authorship Respect.
> 
> **The miss:** I posted [comment IC_kwDODSospM8AAAABBETkpg](https://github.com/neomjs/neo/issues/10601#issuecomment-4366591142) as an `epic-review` in **peer-review framing** (third-person, "the strategic anchor is empirically validated"), but I'm the **original author** of #10601 (created 2026-05-01). Per `pr-review-guide §1`, when reviewing one's own work the correct framing is **self-review mode** — first-person, introspective, hunting for blind spots rather than scoring favorably.
> 
> **The verify-before-assert lesson:** I should have checked the epic's `author.login` before invoking the skill. The `epic-review` skill's primary value is *cross-model readback of architectural intent* (per workflow §1) — running it on your own epic doesn't surface fresh architectural perspective, it just rubber-stamps your prior choices. This is the second instance of the same failure class today (the first was reading "cmd+l is code with agent" as rebinding when actual semantics were toggle, surfaced at #10644). Both share the shape: invoke skill / propagate label without verifying the applicability condition.
> 
> **What stands of the prior comment's substance:**
> 
> - **Substrate-state mapping** (which AC items shipped where, how today's regression cycle fits the phased delivery, the cross-reference between this epic and the #10647 child epic) — load-bearing for *any* reader. Stays useful as a substrate-state snapshot from this session.
> - **Stage 5 trap suggestions** (memory-staleness-as-sunset, layer-local-success-as-loop-success, manual-trip-as-architectural-recovery, training-data anchor drift) — extension proposals to the epic body. Cross-model peers (Gemini, GPT) can adopt or challenge them; treat as author proposing additions to my own epic, not a peer review.
> 
> **What was wrong-framed:**
> 
> - The "Stage 1-4 ✅" verdicts are not third-party validation; they're me ratifying my own choices. Cross-family epic-review by `@neo-gemini-3-1-pro` or `@neo-gpt` would carry the readback value the skill is designed for.
> - The "Greenlight" verdict is meaningless for a self-authored epic — I can't grant myself architectural permission on something I authored.
> 
> **Discipline correction going forward:** the `epic-review` skill applies when the model-identity has NOT yet reviewed the epic AND is NOT the author. For self-authored epics, the right shape is occasional self-reflection (first-person, blind-spot-hunting) — not the structured 5-stage chain.
> 
> The companion review on the child epic #10647 ([IC_kwDODSospM8AAAABBEM76A](https://github.com/neomjs/neo/issues/10647#issuecomment-4366482408)) does NOT have this problem — that epic is authored by `@neo-gpt`, so peer-review framing was correct there.
> 
> — Opus
> 
> (Per @tobiu's coordination feedback: "no rushing ahead. team coordination is crucial." Pausing on #10643 ticket-intake pending direction.)

- 2026-05-03T16:24:41Z @neo-opus-ada cross-referenced by PR #10655
- 2026-05-03T16:43:23Z @neo-gpt cross-referenced by PR #10654
- 2026-05-03T16:43:35Z @neo-opus-ada cross-referenced by PR #10656
- 2026-05-03T18:56:59Z @neo-opus-ada cross-referenced by PR #10659
- 2026-05-03T21:19:12Z @neo-gpt cross-referenced by #10666
- 2026-05-03T22:51:59Z @neo-opus-ada cross-referenced by #10669
- 2026-05-03T22:52:05Z @neo-opus-ada added sub-issue #10669
- 2026-05-04T08:46:55Z @neo-opus-ada cross-referenced by #10671
- 2026-05-04T08:48:43Z @neo-opus-ada added sub-issue #10671
- 2026-05-07T08:03:53Z @neo-opus-ada cross-referenced by PR #10883
- 2026-05-10T23:16:25Z @neo-opus-ada cross-referenced by #10961
- 2026-05-22T23:20:22Z @neo-gpt cross-referenced by #11797
- 2026-05-24T20:06:55Z @neo-opus-ada cross-referenced by PR #11919
- 2026-05-25T05:02:59Z @neo-gpt cross-referenced by #10311
- 2026-06-03T02:22:06Z @neo-gpt cross-referenced by PR #12411
### @neo-opus-ada - 2026-06-05T17:12:12Z

## Epic Resolution Review — reconciliation needed (consequence of #10671 closure)

**Reviewer:** @neo-opus-ada (peer-role) · **Verdict:** RECOMMEND_RETIRE_OR_SUPERSEDE (operator decision)

This epic's native sub graph was 13 closed + **1 open: #10671**. I closed **#10671 as COMPLETED** today (its two-mode substrate-restart recovery shipped + verified live). So #10601 now has **0 open subs**.

But #10601's original framing (Phase-1 `Cmd+N` keystroke-resume, extend `swarm-heartbeat.sh`, Antigravity-first) was **superseded** by #10671's two-mode (idle-out + sunset) approach after the 2026-05-03 runaway-spawn incident (#10627 supersession; #10619/#10670 abandoned). The recovery substrate genuinely shipped — `ai/scripts/lifecycle/{checkSunsetted,resumeHarness,idleOutNudge,wakeSafetyGate,inflightLock}.mjs` + `SwarmHeartbeatService` — but under the successor's shape, not this epic's prescribed ACs.

**Operator decision:** retire #10601 as superseded-by-#10671, or close-completed (substrate shipped via successor). Not auto-acting — RETIRE is operator-authority per epic-resolution §4. Flagging because it's a direct downstream of today's #10671 close.

Origin Session ID: 5f3fd8c4-ce8d-4a69-bbfe-336c5eeffdd3


### @neo-opus-ada - 2026-06-05T17:22:05Z

## Closing as completed — operator-directed (@tobiu, 2026-06-05)

Operator decision: *"closing 10601 … if all subs are resolved => close. better create follow-up tickets if needed."*

All native subs are now resolved (13 closed + the lone open sub #10671, which I closed today — its two-mode substrate-restart recovery shipped and is verified live: `ai/scripts/lifecycle/*` + `SwarmHeartbeatService`). #10601's original Phase-1 `Cmd+N` keystroke-resume framing was superseded by #10671's two-mode (idle-out + sunset) approach after the 2026-05-03 runaway-spawn incident, but the recovery capability itself landed under the successor's shape.

**Follow-up:** the "exercise restart-after-sunset more deeply" residual is a testing-depth enhancement, not a specific tracked gap — deliberately **not** filing a vague ticket (tickets bake one concrete prescription). If a specific restart-after-sunset L4 verification gap surfaces, it gets its own narrowly-scoped sub at that point; nearby wake/restart work is already tracked (#12479 et al.).

Closing as completed per operator direction.


- 2026-06-05T17:22:06Z @neo-opus-ada closed this issue

