LearnNewsExamplesServices
Frontmatter
id13287
titleCodex A2A message wakes may land without submitting while heartbeat wakes submit
stateClosed
labels
bugaitestingregressionarchitecturemodel-experience
assigneesneo-gpt
createdAtJun 15, 2026, 2:59 AM
updatedAtJun 17, 2026, 8:23 AM
githubUrlhttps://github.com/neomjs/neo/issues/13287
authorneo-gpt
commentsCount32
parentIssue13012
subIssues
13395 Restore Codex direct wake route to osascript
13407 Dismiss Codex composer UI before wake submit
subIssuesCompleted2
subIssuesTotal2
blockedBy[x] 13366 Codex app-server wakes fail when daemon PATH lacks codex
blocking[]
closedAtJun 16, 2026, 11:41 AM
milestonev13.1

Codex A2A message wakes may land without submitting while heartbeat wakes submit

Closed v13.1.0/archive-v13-1-0-chunk-3 bugaitestingregressionarchitecturemodel-experience
neo-gpt
neo-gpt commented on Jun 15, 2026, 2:59 AM

Context

Operator-observed Codex wake behavior on 2026-06-15 suggests a split between heartbeat wake delivery and real A2A message wake delivery:

  • A heartbeat wake did get submitted and started a turn.
  • Real A2A message wake-ups appear to populate Codex's prompt/mailbox surface but may no longer auto-submit when the operator is AFK.

This is distinct from #13281 / PR #13285, which addresses stale retry delivery of already-read messages after an adapter failure. This ticket is about the final Codex prompt landing/submission proof for actionable A2A message wakes.

The Problem

For autonomous lifecycle work, "wake payload appears in the prompt field" is not enough. If an actionable A2A message wake lands but does not submit/start a turn, the agent remains idle while the message sits in its mailbox. That breaks the lifecycle-first contract for review requests, addressed review responses, lane handoffs, and high-priority coordination when the operator is AFK.

The Architectural Reality

V-B-A source sweep:

  • ai/docs/wake-prompt-landing-matrix.md:5-8 already states that A2A storage success and adapter success are necessary but not sufficient proof of prompt delivery.
  • ai/docs/wake-prompt-landing-matrix.md:22-33 requires Codex proof through prompt landing, no fresh-session spawn, actionable receipt, and evidence artifact.
  • ai/daemons/wake/daemon.mjs:727-736 implements the Codex app-server path as codex debug app-server send-message-v2 <digest> and logs adapter delivery success after the CLI call returns.
  • ai/daemons/wake/daemon.mjs:823-853 routes both message and heartbeat digests through the same deliverDigest adapter selection, so a backend adapter success line alone cannot prove Codex submitted the prompt.
  • ai/daemons/wake/daemon.mjs:1130-1165 builds different digest shapes: pure heartbeat digests append the lifecycle directive, while message/task/permission digests omit it by design. The operator-observed split may therefore be payload-shape sensitive even if the adapter entrypoint is shared.
  • Live-subscription V-B-A on 2026-06-15: manage_wake_subscription({action:'list'}) showed active @neo-gpt subscription WAKE_SUB:7648b86c-2f1e-43a8-95a6-cc399f66a938 with trigger:SENT_TO_ME, harnessTarget:bridge-daemon, and metadata {appName:'Codex', tabShortcut:null, focusSeedKey:'r'}. There is no explicit adapter, so current macOS delivery defaults to the osascript bridge path, not an explicitly selected codex-app-server route.

The Fix

Investigate and harden Codex wake delivery so actionable A2A message wakes prove the same final outcome as heartbeat wakes: the prompt is submitted and a turn starts.

Candidate directions after V-B-A:

  1. Add a controlled Codex validation path that distinguishes:
    • pure heartbeat digest;
    • direct A2A message digest;
    • mixed message + heartbeat digest.
  2. Extend the Codex wake adapter/test harness so adapter success is not treated as full delivery success unless submission/start-turn evidence exists.
  3. If Codex app-server or the current bridge path intentionally supports "insert without submit" and "insert+submit" modes, make the wake daemon select the submit/start-turn mode for actionable A2A wakes.
  4. Preserve #13285's retry/read-state behavior; do not conflate stale-read retry suppression with submit proof.

Contract Ledger

Target Surface Source of Authority Proposed Behavior Fallback / Edge Case Docs Evidence
WAKE_SUBSCRIPTION.harnessTargetMetadata.adapter / manage_wake_subscription({action:'list'}) ai/mcp/server/memory-core/openapi.yaml manage_wake_subscription schema + live @neo-gpt subscription V-B-A Intake must distinguish explicit codex-app-server routing from absent-adapter default routing; current @neo-gpt evidence starts from bridge-daemon + no adapter. If the active subscription changes during implementation, re-run manage_wake_subscription({action:'list'}) and update the lane evidence before asserting adapter behavior. Issue / PR body evidence only unless behavior changes. Unit or integration evidence for route metadata parsing; live V-B-A transcript for the active subscription.
ai/daemons/wake/daemon.mjs#buildWakeDigest() Current wake daemon source + operator observation Controlled validation must compare pure heartbeat, direct A2A message, and mixed message+heartbeat digest shapes, because pure heartbeat appends the lifecycle directive while message digests do not. If digest shape is not causal, preserve the distinction in evidence and move the root-cause search to focus/submit/UI outcome. JSDoc/comment update only if behavior or invariant changes. Focused unit coverage for digest construction and any normalization mode; manual/live evidence for Codex UI submission.
ai/daemons/wake/daemon.mjs#deliverDigest() Codex bridge delivery Current wake daemon source + wake-prompt-landing-matrix.md Actionable A2A wakes must use a delivery path/mode that results in prompt submission and turn start, not only prompt insertion. Backend success must not overclaim final UI delivery. If Codex UI automation cannot prove turn start headlessly, record adapter success as partial and require the matrix's manual/live evidence artifact before declaring the lane complete. Retry/read-state semantics from #13285 remain intact. Update wake docs or comments if delivery success vocabulary changes. Unit/integration proof for adapter intent and failure classification; live matrix artifact for prompt lands + submits + turn starts without operator Enter.
ai/docs/wake-prompt-landing-matrix.md Codex column Existing matrix doc The Codex row remains the evidence authority for UI-only assertions: payload lands, no wrong target/fresh session, actionable receipt, and evidence artifact. If the matrix lacks a submission/start-turn row precise enough for this regression, extend it rather than burying the requirement in PR prose. Update matrix if the evidence taxonomy changes. Manual/live artifact linked in PR or issue comment.
#13281 / PR #13285 stale retry read-state behavior #13287 Out of Scope + current retry-path source The fix must not re-deliver already-read messages or weaken retry coalescing/watermark behavior. If a controlled wake test consumes or marks messages read, isolate/neutralize backlog per the matrix preflight before running wake daemon validation. No docs unless retry semantics change. Existing #13285 coverage plus any adjacent retry/read-state tests touched by this lane.

Acceptance Criteria

  • A controlled Codex wake validation demonstrates whether pure heartbeat wakes and direct A2A message wakes use the same final submit/start-turn behavior.
  • Actionable A2A message wake delivery to Codex proves all relevant matrix criteria: payload lands, no wrong session/file target, prompt is submitted, and a turn starts without operator Enter.
  • If heartbeat and A2A message digests differ in Codex app-server or bridge behavior, the adapter normalizes them or explicitly selects the submit mode for actionable A2A wakes.
  • Unit/integration coverage validates backend intent (adapter command/payload mode), and manual/live evidence captures Codex UI-only assertions per the wake prompt landing matrix.
  • #13281/#13285 stale retry read-state behavior remains green.

Out of Scope

  • Stale wake retry read-state suppression (#13281 / #13285).
  • General digest content enrichment (#12862).
  • Non-Codex harness adapters except as comparison evidence.

Related

  • Parent epic: #13012 (Agent Harness).
  • Adjacent wake lines: #13281 / #13285 (stale retry read-state), #13077 (retry/watermark), #11829 (multi-strategy wake-driver substrate), #12862 (digest enrichment).

Release classification: post-release Agent Harness reliability; high operational priority for AFK lifecycle continuity.

Duplicate sweep: live open search for wake a2a submit codex message heartbeat adapter returned no equivalent issue; latest open issue queue checked at creation time showed #13281/#13285 adjacent but non-duplicate. Intake refresh on 2026-06-15 repeated the open search and again found only this issue.

Retrieval Hint: "Codex A2A message wake lands prompt but not submit heartbeat submits send-message-v2 app-server wake-prompt landing matrix"

tobiu referenced in commit be66986 - "fix(wake): pin Codex wake submission boundary (#13287) (#13290)" on Jun 15, 2026, 8:44 AM
tobiu referenced in commit c6fb14a - "fix(wake): restore Codex direct wake route (#13395) (#13396) on Jun 16, 2026, 2:35 AM
tobiu referenced in commit 5419193 - "fix(wake): close Codex composer UI before submit (#13287) (#13405)" on Jun 16, 2026, 4:44 AM