Current Disposition (2026-06-18)
This ticket remains open, but the original heartbeat-only framing is now too narrow.
Operator-observed wake behavior on 2026-06-18 shows that a direct A2A message wake can reach Codex, paste into the prompt window, and still fail to submit/start a turn. A later direct A2A wake on the same active route did submit successfully. That means the closed #13287 problem class is back as an intermittent final-submit reliability failure, not as a total direct-message outage.
Classification: Agent Harness wake-submit regression / Codex route / intermittent direct-message submit failure confirmed.
Fresh Evidence
Live V-B-A from 2026-06-18:
- Memory Core delivered a direct message to
@neo-gpt: MESSAGE:da9d00ab-cb8f-444f-a9bb-c7b81fabb760, from @neo-opus-vega, sent 2026-06-18T21:47:13.051Z, wakeSuppressed absent/false.
- Active wake subscription for
@neo-gpt: WAKE_SUB:7648b86c-2f1e-43a8-95a6-cc399f66a938, trigger SENT_TO_ME, harnessTarget=bridge-daemon, metadata {appName:"Codex", tabShortcut:null, focusSeedKey:"r", adapter:"osascript"}.
- Wake daemon log at
2026-06-18T21:47:46.903Z:
[Wake Daemon] Delivered WAKE_SUB:7648b86c-2f1e-43a8-95a6-cc399f66a938 via osascript to Codex (scenario=direct-message; route=osascript; adapterSource=metadata; app=Codex; counts=messages:1,tasks:0,permissions:0,heartbeats:0)
- Operator observation: the wake payload landed inside the Codex prompt window but did not auto-submit via Enter.
- Follow-up contrast:
MESSAGE:a37e41f1-9a63-4425-9f21-930bc6866cf4 from @neo-opus-grace used the same active Codex subscription and the daemon logged delivery at 2026-06-18T21:55:37.364Z:
[Wake Daemon] Delivered WAKE_SUB:7648b86c-2f1e-43a8-95a6-cc399f66a938 via osascript to Codex (scenario=direct-message; route=osascript; adapterSource=metadata; app=Codex; counts=messages:1,tasks:0,permissions:0,heartbeats:0)
- Operator observation: this second direct wake did auto-submit and start the turn.
- Second failed-submit sample:
MESSAGE:c531ad34-e353-462e-b65f-c96946c12185 from @neo-opus-grace, sent 2026-06-18T22:16:33.866Z, again used the same active Codex subscription and the daemon logged delivery at 2026-06-18T22:17:08.857Z:
[Wake Daemon] Delivered WAKE_SUB:7648b86c-2f1e-43a8-95a6-cc399f66a938 via osascript to Codex (scenario=direct-message; route=osascript; adapterSource=metadata; app=Codex; counts=messages:1,tasks:0,permissions:0,heartbeats:0)
- Operator observation: this third direct wake landed in the prompt window and again did not auto-submit.
This is not a mailbox-delivery issue and not a wakeSuppressed issue. The daemon saw direct-message scenarios, selected the active Codex route, ran the osascript adapter, and recorded success for both failed-submit and successful-submit cases. The missing proof is the final UI boundary: prompt submitted and turn started.
Source Links
Reconciled Prior Art
- #13287 tracked the earlier direct A2A symptom: payload may land in Codex without submitting. It closed after #13405-era validation, but this fresh direct-message event matches the same final-submit failure class.
- #13456 / PR #13457 intentionally stopped heartbeat-only events from submitting into prompt-submitting adapters. Therefore "pure heartbeat does not start a Codex turn" is no longer automatically a bug after #13457; the current regression evidence is stronger because it is a direct actionable message.
- The active
@neo-gpt route is adapter:"osascript", not the retired codex-app-server subscription. Any fix must validate the live route actually used by the wake daemon.
The Problem
The wake daemon currently overclaims final delivery for Codex UI wakes. For Codex osascript delivery, Delivered ... via osascript to Codex means the automation script exited without throwing. It does not prove:
- the payload landed in the intended composer,
- the submit primitive was accepted by Codex,
- a turn started without operator Enter.
The live failure is exactly between 1 and 2/3: payload landed, but the turn did not start. Because the follow-up direct wake did submit on the same route, the likely immediate boundary is UI-state-sensitive Codex Desktop handling of the key code 36 submit step, not a permanently broken message route.
Updated Fix Shape
- Rename/handle this as a general Codex wake delivered-but-not-submitted regression, not heartbeat-only.
- Split Codex wake evidence into distinct states:
adapter-ran, prompt-pasted, submit-attempted, and turn-started.
- For actionable direct A2A wakes, use a submit-proven Codex route or submit primitive. If the UI route remains
osascript, prove the current submit key sequence against Codex Desktop rather than assuming Enter.
- Preserve #13457 semantics: pure heartbeat events for prompt-submitting adapters must not become chat interrupts again.
- Add focused tests for route selection and success vocabulary, plus a live matrix validation artifact for the Codex-only submit/start-turn boundary.
Contract Ledger
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback / Edge Case |
Evidence |
ai/daemons/wake/daemon.mjs Codex osascript delivery |
Current active @neo-gpt subscription + wake-daemon source |
Codex UI delivery must not log/communicate full delivery when only adapter completion is known. Success vocabulary distinguishes adapter completion from submit/start-turn proof. |
If Codex Desktop cannot expose a deterministic turn-start signal, daemon evidence stays partial and the live matrix carries L4 proof. |
Focused unit coverage for delivery evidence wording/classification plus live operator sample. |
Codex submit primitive (key code 36 path) |
Wake daemon Codex UI route + operator observations |
Actionable direct-message wakes use a submit-proven sequence or explicitly classify failures when Enter is ignored/consumed. |
If UI state remains intermittent, classify and surface the submit boundary instead of overclaiming delivery. |
Repeated direct-message validation samples on the active route. |
ai/docs/wake-prompt-landing-matrix.md |
Existing prompt landing matrix + #13291/#13292 |
Matrix remains the authority for Codex L4 proof: prompt landed, submitted, turn started, and whether human Enter was required. |
Backend-only tests are L2/L3 evidence and cannot close the live Codex behavior. |
Live matrix artifact in PR or ticket update. |
| #13457 pure-heartbeat suppression semantics |
PR #13457 and operator correction |
Fixing direct-message submit reliability must not reintroduce pure-heartbeat prompt submits for prompt-submitting adapters. |
Heartbeat liveness can be handled by a separate non-chat nudge or evidence surface, not by chat interrupt regression. |
Existing #13457 tests plus adjacent wake-daemon regression coverage. |
Decision Record impact
Aligned with ADR 0002 wake-substrate standards and the existing Agent Harness evidence ladder. No ADR amendment expected: this changes evidence classification / Codex UI submit reliability, not the wake-substrate architecture.
Acceptance Criteria
Out of Scope
- Reintroducing pure-heartbeat prompt submits for Codex, Antigravity, or tmux.
- Non-Codex harness UI automation except comparison evidence.
- Mailbox storage/delivery changes; the fresh evidence shows mailbox delivery works.
- Same-bundle Claude instance routing; this ticket is about the Codex final submit boundary.
Retrieval Hints
Codex wake delivered but not submitted, intermittent direct A2A message submit, lands in prompt, no Enter submit, key code 36, wake prompt landing matrix, #13287 regression back, #13457 heartbeat-only suppression, WAKE_SUB:7648b86c-2f1e-43a8-95a6-cc399f66a938.
Current Disposition (2026-06-18)
This ticket remains open, but the original heartbeat-only framing is now too narrow.
Operator-observed wake behavior on 2026-06-18 shows that a direct A2A message wake can reach Codex, paste into the prompt window, and still fail to submit/start a turn. A later direct A2A wake on the same active route did submit successfully. That means the closed #13287 problem class is back as an intermittent final-submit reliability failure, not as a total direct-message outage.
Classification: Agent Harness wake-submit regression / Codex route / intermittent direct-message submit failure confirmed.
Fresh Evidence
Live V-B-A from 2026-06-18:
@neo-gpt:MESSAGE:da9d00ab-cb8f-444f-a9bb-c7b81fabb760, from@neo-opus-vega, sent2026-06-18T21:47:13.051Z,wakeSuppressedabsent/false.@neo-gpt:WAKE_SUB:7648b86c-2f1e-43a8-95a6-cc399f66a938, triggerSENT_TO_ME,harnessTarget=bridge-daemon, metadata{appName:"Codex", tabShortcut:null, focusSeedKey:"r", adapter:"osascript"}.2026-06-18T21:47:46.903Z:MESSAGE:a37e41f1-9a63-4425-9f21-930bc6866cf4from@neo-opus-graceused the same active Codex subscription and the daemon logged delivery at2026-06-18T21:55:37.364Z:MESSAGE:c531ad34-e353-462e-b65f-c96946c12185from@neo-opus-grace, sent2026-06-18T22:16:33.866Z, again used the same active Codex subscription and the daemon logged delivery at2026-06-18T22:17:08.857Z:This is not a mailbox-delivery issue and not a
wakeSuppressedissue. The daemon saw direct-message scenarios, selected the active Codex route, ran theosascriptadapter, and recorded success for both failed-submit and successful-submit cases. The missing proof is the final UI boundary: prompt submitted and turn started.Source Links
osascriptpath still sendskey code 36after paste and treatsosascriptexit as delivery success: https://github.com/neomjs/neo/blob/dev/ai/daemons/wake/daemon.mjsReconciled Prior Art
@neo-gptroute isadapter:"osascript", not the retiredcodex-app-serversubscription. Any fix must validate the live route actually used by the wake daemon.The Problem
The wake daemon currently overclaims final delivery for Codex UI wakes. For Codex
osascriptdelivery,Delivered ... via osascript to Codexmeans the automation script exited without throwing. It does not prove:The live failure is exactly between 1 and 2/3: payload landed, but the turn did not start. Because the follow-up direct wake did submit on the same route, the likely immediate boundary is UI-state-sensitive Codex Desktop handling of the
key code 36submit step, not a permanently broken message route.Updated Fix Shape
adapter-ran,prompt-pasted,submit-attempted, andturn-started.osascript, prove the current submit key sequence against Codex Desktop rather than assuming Enter.Contract Ledger
ai/daemons/wake/daemon.mjsCodexosascriptdelivery@neo-gptsubscription + wake-daemon sourcekey code 36path)ai/docs/wake-prompt-landing-matrix.mdDecision Record impact
Aligned with ADR 0002 wake-substrate standards and the existing Agent Harness evidence ladder. No ADR amendment expected: this changes evidence classification / Codex UI submit reliability, not the wake-substrate architecture.
Acceptance Criteria
@neo-gptstart Codex turns without operator Enter on the active route, or failures are classified with durable evidence.@neo-gptsubscription route is validated before and after the fix.ai/docs/wake-prompt-landing-matrix.mdremains the authority for Codex L4 evidence, and the fix records a live validation artifact.Out of Scope
Retrieval Hints
Codex wake delivered but not submitted, intermittent direct A2A message submit, lands in prompt, no Enter submit, key code 36, wake prompt landing matrix, #13287 regression back, #13457 heartbeat-only suppression, WAKE_SUB:7648b86c-2f1e-43a8-95a6-cc399f66a938.