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:
- Add a controlled Codex validation path that distinguishes:
- pure heartbeat digest;
- direct A2A message digest;
- mixed message + heartbeat digest.
- Extend the Codex wake adapter/test harness so adapter success is not treated as full delivery success unless submission/start-turn evidence exists.
- 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.
- 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
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"
Context
Operator-observed Codex wake behavior on 2026-06-15 suggests a split between heartbeat wake delivery and real A2A message wake delivery:
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-8already 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-33requires Codex proof through prompt landing, no fresh-session spawn, actionable receipt, and evidence artifact.ai/daemons/wake/daemon.mjs:727-736implements the Codex app-server path ascodex debug app-server send-message-v2 <digest>and logs adapter delivery success after the CLI call returns.ai/daemons/wake/daemon.mjs:823-853routes both message and heartbeat digests through the samedeliverDigestadapter selection, so a backend adapter success line alone cannot prove Codex submitted the prompt.ai/daemons/wake/daemon.mjs:1130-1165builds 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.manage_wake_subscription({action:'list'})showed active@neo-gptsubscriptionWAKE_SUB:7648b86c-2f1e-43a8-95a6-cc399f66a938withtrigger:SENT_TO_ME,harnessTarget:bridge-daemon, and metadata{appName:'Codex', tabShortcut:null, focusSeedKey:'r'}. There is no explicitadapter, so current macOS delivery defaults to theosascriptbridge path, not an explicitly selectedcodex-app-serverroute.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:
Contract Ledger
WAKE_SUBSCRIPTION.harnessTargetMetadata.adapter/manage_wake_subscription({action:'list'})ai/mcp/server/memory-core/openapi.yamlmanage_wake_subscriptionschema + live@neo-gptsubscription V-B-Acodex-app-serverrouting from absent-adapter default routing; current@neo-gptevidence starts frombridge-daemon+ no adapter.manage_wake_subscription({action:'list'})and update the lane evidence before asserting adapter behavior.ai/daemons/wake/daemon.mjs#buildWakeDigest()ai/daemons/wake/daemon.mjs#deliverDigest()Codex bridge deliverywake-prompt-landing-matrix.mdai/docs/wake-prompt-landing-matrix.mdCodex columnAcceptance Criteria
Out of Scope
Related
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 adapterreturned 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"