Context
This ticket exists because the #13287 residual Codex wake lane still requires L4 live Codex UI proof, but the implementation now ready for PR only delivers the narrower prerequisite: an isolated, repeatable dry-run validation harness that can prove backend route/isolation without dumping the production wake backlog or advancing production wake-daemon cursor state.
The split is required by the Evidence Ladder close-target gate: the harness PR should not use Resolves #13287, because #13287 still needs live prompt lands + submits + turn-start evidence for pure heartbeat, direct A2A message, and mixed message+heartbeat scenarios.
Release classification: post-release Agent Harness reliability hardening; boardless unless the operator explicitly promotes the parent Codex wake regression to a release blocker.
The Problem
#13287 needs controlled validation, but the live environment currently has active wake subscriptions, a live wake daemon, and mailbox backlog. Blindly firing a self-wake from the active session pollutes the matrix: it can mix old backlog, production cursor movement, and uncontrolled UI state with the single scenario being tested.
The parent issue already records that backend route success is not enough for L4 Codex UI proof. The missing prerequisite is a small harness path that can create exactly one matrix scenario in an isolated Memory Core graph, run one wake daemon subprocess against that graph, and produce a matrix-ready artifact with explicit dry-run vs live evidence fields.
The Architectural Reality
ai/docs/wake-prompt-landing-matrix.md is the authority for Codex wake prompt-landing validation. It requires inventorying subscriptions, stopping/neutralizing uncontrolled wake state, and running exactly one controlled delivery attempt.
ai/daemons/wake/daemon.mjs already owns wake scenario routing/logging and supports the test adapter for non-UI dispatch evidence.
package.json owns operator/agent script discovery through npm run ai:* commands.
- The new harness belongs under
ai/scripts/lifecycle/, matching the sibling one-shot Agent OS lifecycle utilities rather than long-running daemon placement.
The Fix
Add a Codex-specific validation command that:
- Reads the source Memory Core graph read-only.
- Loads exactly one active Codex
bridge-daemon wake subscription for the requested identity.
- Copies that subscription into a temporary graph and forces
adapter: test unless --live is explicitly passed.
- Injects exactly one requested scenario:
pure-heartbeat, direct-message, or mixed-message-heartbeat.
- Starts one wake-daemon subprocess against the temporary graph and daemon data directory.
- Emits a JSON artifact with backend evidence, isolation fields, and explicit live Codex assertion placeholders.
- Documents the command in the wake prompt landing matrix without claiming L4 UI proof.
Contract Ledger
| Target Surface |
Source of Authority |
Proposed Behavior |
Fallback / Edge Case |
Docs |
Evidence |
npm run ai:validate-codex-wake |
package.json script registry + ai/scripts/lifecycle/ sibling lifecycle utilities |
Agent/operator command for isolated Codex wake matrix dry-runs and intentional live attempts. |
Without --live, force adapter:test; with multiple active subscriptions, require --subscription-id. |
ai/docs/wake-prompt-landing-matrix.md. |
Unit tests for CLI parsing, isolation, direct/mixed scenarios, and explicit-subscription guard. |
| Wake daemon test-adapter evidence label |
ai/daemons/wake/daemon.mjs#deliverDigest() scenario evidence label |
Test-adapter delivery logs include the same scenario=...; route=... label needed by matrix dry-runs. |
Existing tests that match the old prefix continue to pass because the prefix is preserved. |
Inline code remains self-explanatory; no public API change. |
Existing wake-daemon Codex/test-adapter focused tests remain green. |
| Matrix artifact shape |
#13287 evidence ledger + ai/docs/wake-prompt-landing-matrix.md |
Artifact separates backend evidence from live Codex assertions so dry-run evidence cannot be promoted to L4. |
--live marks live fields as manual-observation-required rather than auto-proving them. |
Matrix doc command note. |
New script unit coverage and CLI --help smoke check. |
Decision Record impact
none — this is a narrow lifecycle validation utility aligned with the existing wake matrix authority and sibling lifecycle script placement.
Acceptance Criteria
Out of Scope
- Closing #13287.
- Running the live Codex Desktop L4 matrix.
- Changing Codex adapter submit behavior.
- Changing #13281/#13285 stale retry/read-state behavior.
- Adding a public MCP tool surface for validation orchestration.
Avoided Traps
- Do not treat wake-daemon backend delivery logs as proof of prompt submit/start-turn in Codex Desktop.
- Do not run a blind self-wake from an active session with unread backlog and an uncontrolled live daemon.
- Do not use
Resolves #13287 for the dry-run harness PR; that would close the parent regression before L4 UI evidence exists.
Related
Related: #13287
Related: #13012
Duplicate sweep
Live latest-open sweep: checked latest 20 open issues on 2026-06-15; #13287 is the parent residual L4 bug, and no separate open leaf covers the isolated dry-run validation harness.
A2A recency sweep: the Memory Core MCP list_messages call failed because the shared graph path is read-only in this sandbox, so I queried the same graph read-only for the latest 30 MESSAGE nodes by sentAt. The only overlapping claim was my earlier [lane-claim] #13287 — isolated Codex L4 wake validation path on clean origin/dev; no peer claim or newly filed duplicate covered this split leaf.
Local exact sweep: rg for isolated Codex wake, Codex wake validation harness, validate-codex-wake, and wake matrix found only this in-progress branch's new files plus historical archived #106xx wake-matrix ancestors.
Semantic KB sweep: ask_knowledge_base(query='isolated Codex wake validation harness ticket #13287 dry-run matrix', type='ticket') returned older #10649/#10666/#11872/#13067/#10650 context, not an equivalent current ticket.
Origin Session ID: 019ec8a7-1f8e-75a3-b223-fe59cc444776
Retrieval Hint: "#13287 isolated Codex wake matrix dry-run validate-codex-wake temporary Memory Core graph adapter test live placeholder"
Context
This ticket exists because the #13287 residual Codex wake lane still requires L4 live Codex UI proof, but the implementation now ready for PR only delivers the narrower prerequisite: an isolated, repeatable dry-run validation harness that can prove backend route/isolation without dumping the production wake backlog or advancing production wake-daemon cursor state.
The split is required by the Evidence Ladder close-target gate: the harness PR should not use
Resolves #13287, because #13287 still needs live prompt lands + submits + turn-start evidence for pure heartbeat, direct A2A message, and mixed message+heartbeat scenarios.Release classification: post-release Agent Harness reliability hardening; boardless unless the operator explicitly promotes the parent Codex wake regression to a release blocker.
The Problem
#13287 needs controlled validation, but the live environment currently has active wake subscriptions, a live wake daemon, and mailbox backlog. Blindly firing a self-wake from the active session pollutes the matrix: it can mix old backlog, production cursor movement, and uncontrolled UI state with the single scenario being tested.
The parent issue already records that backend route success is not enough for L4 Codex UI proof. The missing prerequisite is a small harness path that can create exactly one matrix scenario in an isolated Memory Core graph, run one wake daemon subprocess against that graph, and produce a matrix-ready artifact with explicit dry-run vs live evidence fields.
The Architectural Reality
ai/docs/wake-prompt-landing-matrix.mdis the authority for Codex wake prompt-landing validation. It requires inventorying subscriptions, stopping/neutralizing uncontrolled wake state, and running exactly one controlled delivery attempt.ai/daemons/wake/daemon.mjsalready owns wake scenario routing/logging and supports thetestadapter for non-UI dispatch evidence.package.jsonowns operator/agent script discovery throughnpm run ai:*commands.ai/scripts/lifecycle/, matching the sibling one-shot Agent OS lifecycle utilities rather than long-running daemon placement.The Fix
Add a Codex-specific validation command that:
bridge-daemonwake subscription for the requested identity.adapter: testunless--liveis explicitly passed.pure-heartbeat,direct-message, ormixed-message-heartbeat.Contract Ledger
npm run ai:validate-codex-wakepackage.jsonscript registry +ai/scripts/lifecycle/sibling lifecycle utilities--live, forceadapter:test; with multiple active subscriptions, require--subscription-id.ai/docs/wake-prompt-landing-matrix.md.ai/daemons/wake/daemon.mjs#deliverDigest()scenario evidence labelscenario=...; route=...label needed by matrix dry-runs.ai/docs/wake-prompt-landing-matrix.md--livemarks live fields as manual-observation-required rather than auto-proving them.--helpsmoke check.Decision Record impact
none — this is a narrow lifecycle validation utility aligned with the existing wake matrix authority and sibling lifecycle script placement.
Acceptance Criteria
ai:validate-codex-wakenpm script for the isolated Codex wake matrix harness.testadapter; live Codex delivery requires explicit--live.pure-heartbeat,direct-message, andmixed-message-heartbeatscenario injection.ai/docs/wake-prompt-landing-matrix.mdpoints Codex validation at the harness while preserving #13287 as the live L4 close target.Out of Scope
Avoided Traps
Resolves #13287for the dry-run harness PR; that would close the parent regression before L4 UI evidence exists.Related
Related: #13287 Related: #13012
Duplicate sweep
Live latest-open sweep: checked latest 20 open issues on 2026-06-15; #13287 is the parent residual L4 bug, and no separate open leaf covers the isolated dry-run validation harness.
A2A recency sweep: the Memory Core MCP
list_messagescall failed because the shared graph path is read-only in this sandbox, so I queried the same graph read-only for the latest 30MESSAGEnodes bysentAt. The only overlapping claim was my earlier[lane-claim] #13287 — isolated Codex L4 wake validation path on clean origin/dev; no peer claim or newly filed duplicate covered this split leaf.Local exact sweep:
rgforisolated Codex wake,Codex wake validation harness,validate-codex-wake, andwake matrixfound only this in-progress branch's new files plus historical archived #106xx wake-matrix ancestors.Semantic KB sweep:
ask_knowledge_base(query='isolated Codex wake validation harness ticket #13287 dry-run matrix', type='ticket')returned older #10649/#10666/#11872/#13067/#10650 context, not an equivalent current ticket.Origin Session ID: 019ec8a7-1f8e-75a3-b223-fe59cc444776
Retrieval Hint: "#13287 isolated Codex wake matrix dry-run validate-codex-wake temporary Memory Core graph adapter test live placeholder"