なぜ lands on a window that explains nothing when an approval is outstanding #72
Labels
No labels
needs-info
needs-triage
ready-for-agent
ready-for-human
v2
wayfinder:grilling
wayfinder:map
wayfinder:prototype
wayfinder:research
wayfinder:task
wayfinder:ticket
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
aiko/denpa#72
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found on 2026-07-31 by the cross-seam review of the
#62–#68batch.The sequence
approval-requestarrives and the card is drawn.twoHopStatusyieldssocket-closed. The pal bar goes 不通 and offers なぜ —pal-bar.tsxdraws that key off the fault alone, with no reference to an outstanding ask.#64wires it tosetMode('window'), so window mode mounts.receiver-chrome.tsxwithholdsFaultScreenwhileapproval !== null— a suspended turn outranks a fault screen, which is a deliberate#59-era rule.What the operator gets instead is the approval card with 送信, ハンズフリー and 文 all disabled by
#65'ssocketHeld, and no statement anywhere of why they are dead.socketHeldis keyed on the fault existing, not on its screen being drawn, so the keys go inert exactly when the explanation is suppressed.Why it does not clear itself
This state is durable, not a frame of jitter.
use-approvals.ts'ssendshort-circuits on a non-OPEN socket and callsrestoreAsk(..., 'offline'), putting the same ask straight back at the head.#62's dismiss cannot clear it either. Anapproval-dismissframe can only arrive over the socket that is shut.So the fault screen stays unreachable until the socket returns — which is precisely the thing the operator pressed なぜ to find out about.
Why nothing caught it
#64's own test asserts that every fault putting なぜ on the bar has a non-nullfaultFor(hops)behind it. That is true and insufficient: it proves a fault screen exists for that state, never thatreceiver-chromewill render it. Theapproval === nullguard is not in the test's world at all.Each ingredient is defensible alone.
#64created the affordance;#65made the destination's keys inert for a good reason;#62defined the only remote way a card leaves the screen; the approval-outranks-fault rule predates all three. Only the combination produces a window with a dead dock, no explanation, and no way out.Ways it could go
Not prescribing one — this is a design call about what outranks what.
socketHeldholds keys under a suppressed fault, the card itself carries the reason.Acceptance
Related
denpa#64,denpa#65,denpa#62,denpa#59, ADR-0012