Files
buzz/docs
Duncan a0309cdbd3 fix(acp): treat channel_full as transient; fix legacy-key retirement with colon-bearing sessionId
P1 (Desktop retransmit): channel_full is a queue-saturation signal emitted when
the owning read loop's queue is momentarily full. The previous code settled the
retransmit loop with 'failed' on this status, re-enabling the card for a manual
retry. The fix: treat channel_full as transient in retransmitPermissionDecision.ts
— the loop stays subscribed, the scheduler keeps firing, and the card stays
disabled until the loop either receives 'sent'/'already_decided' (acked) or the
deadline expires (expired/fail-closed). The owning loop's first-wins dedup
tolerates duplicate deliveries once the queue drains. Authoritative routing
refusals (no_active_turn, channel_closed, no_channel) still settle 'failed'.
NIP-AO.md updated to describe channel_full as transient rather than listing it
among the four failure statuses. Stale lib.rs and permission-request-card.tsx
comments updated to match.

P2 MINOR (legacy key colon safety): retireLivePermissionCardsForTurn cleaned up
pendingPermissions legacy keys via positional split(':') at index 2, assuming
sessionId never contains ':'. ACP SessionId is an unrestricted string. Fix:
match by the item's turnId field (which already carries the authoritative
identity) rather than parsing the key. No key-format change; existing entries
continue to be cleaned up correctly, and colon-bearing session identities no
longer leave stale legacy keys.

Tests: retransmitPermissionDecision.test.mjs split into channel_full-stays-active
(+2 tests: keeps loop/resends until acked; expires cleanly at deadline) and
authoritative-statuses-fail (3 statuses, unchanged contract).
agentSessionTranscript.test.mjs adds colon-in-sessionId regression test.

Co-authored-by: Will Pfleger <pfleger.will@gmail.com>
Signed-off-by: Will Pfleger <pfleger.will@gmail.com>
2026-09-01 20:04:27 -04:00
..
2026-07-21 17:16:23 +00:00