Repository navigation
feat(handoff): expose explicit ACK, deadline, and unknown outcome for unanswered requests #181
Description
Reddit feedback
A reader asked whether the sender can tell when a target closes before replying and whether a pending request is safe to retry. Source: https://www.reddit.com/r/codex/comments/1wotij6/i_built_sessionpeer_to_message_live_codex_and/
Current v1.0.0 boundary
A posted Claude inbox write or queued Codex message is submission evidence, not a read/completion receipt. Session exit or an absent reply does not prove non-delivery. Native local/SSH adapters do not implement wait or acknowledgement (see docs/architecture/agent-transports.md); a prior reply-wait proposal #31 was closed without turning native submission into an ACK.
Proposed work
- Design an opt-in handoff correlation ID, explicit receiver reply/ACK, and deadline/result states that distinguish
submitted,acknowledged,timed_out_unknown, and definite pre-submission refusal. - Specify what evidence is available for Claude, Codex, local, and SSH, and what remains unknowable. Never infer consumption from a queue result or process exit.
- Default to no automatic resend after an ambiguous outcome. Do not claim exactly-once delivery.
- Evaluate a privacy-preserving observation mechanism before reading agent transcripts; document unsupported cases.
- Test no reply, delayed reply, target exit/restart, duplicate ACK, and reply with the wrong correlation ID.
This is a design/implementation issue, not evidence that a native read receipt already exists.
Current follow-up scope after v1.1.0 — 2026-10-09
The original proposal above is retained as historical context. User-authorized release accounting keeps this issue OPEN and moves the remaining acceptance work from v1.1.0 to v1.2.0.
Shipped in v1.1.0
Experimental same-machine POSIX Claude receipt handling and correlation-only local Codex / one-destination POSIX source-streamed SSH submission are shipped. The joint frozen design remains the authoritative contract.
Merged implementation: #290. Published release, exact source 8ca77cf31254c8287a2593fe484bb30a7dba2727; integrated main CI and PyPI publication/verification succeeded. Publication does not establish operational rollout or new live-agent acceptance.
Remaining acceptance — not completed by the release
- Implement and validate body-free, precisely correlated Codex injection observation and explicit ACK; turn completion and queue removal are not ACK evidence.
- Validate installed reverse-SSH receipt-handler/bootstrap and remote preparation before enabling remote receipts; required unsupported waits continue to refuse before effect.
- Complete Windows bounded native pipe/process cleanup, paired-device handoff and explicit opt-in fanout acceptance independently.
- Complete cross-boot retention, restore/reconcile and stale collector lifecycle tooling; retained sender fencing is not general receiver deduplication or exactly-once delivery.
- Require actual supported native/platform acceptance in addition to synthetic fixtures. investigate(delivery): extend request-ID deduplication safely to ordinary local and SSH sends #182 remains a separate long-term receiver-dedup investigation, not a blanket prerequisite or retry permission.
This is backlog/state accounting only. No new runtime implementation, skill merge/release, operational change, native experiment or publication is authorized by this reassignment.
Activity
abruption commentedon Sep 29, 2026
Research: what each agent lets a sender observe (2026-09-29)
Read-only investigation to ground this design. No live delivery tests were run for this comment.
Claude Code
postedtherefore means only that the socket write completed (session_peer_core/claude.pyignores any response).notify_when_idleis limited to a local main Claude conversation and reports idleness, not receipt.Codex
codex queuehas no status or listing option, and the queue row carries no status. It is deleted when consumed, so deletion alone cannot distinguish consumption from a manual removal. Stale unconsumed rows can persist for weeks, which is a concrete example of queued ≠ consumed.codex queuereturns.Observability by stage
posted)queued+ queue ID)turn/completed"Turn completed" still does not prove the model understood or acted on the request.
Suggested direction
submitted→delivered(injection observed) →acknowledged(correlated reply), withtimed_out_unknownwhen not observed before the deadline. Keep no automatic resend and no exactly-once claim.codex queueand report observation asunsupported.Implementation is out of scope for the v1.0.x maintenance line and would target v1.1.0.
fujiezee commentedon Oct 1, 2026
Thanks for the stage-by-stage table; having each of Claude and Codex spelled out for what the sender can actually observe makes the design much easier to discuss. The state model, no automatic resend, and the correlation ID are already a solid base. Two small things that might be worth considering, both about what happens after
timed_out_unknown:timed_out_unknownreturned to the sender with the options spelled out (keep waiting, resend with the same ID, give up) would make the "default to no automatic resend" rule actionable for whoever is running the sender.abruption commentedon Oct 1, 2026
Thanks, @fujiezee — I agree with both suggestions and am accepting them as design/acceptance follow-ups.
For #181, the
timed_out_unknownresult should make the sender/operator the decision owner and explain the available next actions:The design should expose retry eligibility and the evidence/reason behind it rather than simply returning an unexplained timeout. No automatic resend remains the default. A late or duplicate ACK must attach to the original request without triggering another delivery.
I will track duplicate request handling and its durable receiver contract in #182, separately from this issue's duplicate/wrong-ID ACK tests. #181 can provide useful deadline/decision guidance even when dedup is unsupported; it must honestly report that limitation rather than promise a safe retry.
Thank you for pointing out the gap. This comment records planned design coverage, not an implemented feature or an exactly-once guarantee. #181 remains in v1.1.0 and #182 remains the separate long-term investigation; no milestone or release scope is changed here.
feat(handoff): add fenced receipt, queue and wait runtime (#290)
abruption commentedon Oct 15, 2026
Owner-authorized allocation — correlation PY120-REMAINING-DELEGATION-20261015.
Implementation/preparation request submitted to the session-peer-claude session; consumption and acceptance are not yet confirmed.
First map remaining acceptance to shipped behavior, implementable offline slices and native/upstream/live-test gates. Prepare a separate isolated, contract-preserving candidate for safe implementable lifecycle/retention/reconcile or negative-fixture work. Codex observation/ACK stays unsupported without the required body-free/original-generation proof. Declare the unmerged #311 dependency where relevant; do not reintroduce its storage bypass.
The coordinating Codex session owns independent-cli-review, finding verification, PR creation and exact-head CI checks after receiving frozen commits. No new live model/session experiments, operations, merge, release or publication are authorized here. Keep the issue OPEN until its actual acceptance gates are met; the 2026-10-18 target does not waive them.
test(handoff): pin stale-channel, retention and restore boundaries (#314