Consent boundaryA missing card is not approval. Recover the authentic request or cancel the turn.
One screen. Two failure chains.
no close → no reconnect → no replaySleep, network switching, or background throttling leaves the old path apparently open.
requested → onConnected → resync → pending.clear()The Host replays correctly, but the new browser wait is erased.
Three owners. Three lifetimes.
AgentLive turnTool promise waits.HostAcross disconnectStable rpcId stays pending.BrowserOne generationPendingWait renders card.Recover without inventing an answer.
Do not call the response API manually
That would manufacture human consent. If replay fails, cancel the turn and ask the Agent to request the decision again.
Both layers need repair.
Twelve regression gates.
- Question survives resync.
- Approval survives resync.
- Old waits clear early.
- Settled waits stay gone.
- Replay deduplicates.
- Answer reaches Host.
- Cancel withdraws all cards.
- Dead socket is bounded.
- Reconnect needs no refresh.
- Tabs cannot double-answer.
- Shutdown clears pumps.
- No synthetic consent log.