承認 — a gated tool suspends the turn and the client answers it #26
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#26
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?
What to build
A gated tool suspends her turn and the client answers it. The design has drawn this twice — Turn 4 承認 and all of Turn 9 (承認 on a parked tab) — and nothing tracked it, because the fidelity audit wrongly listed it as having no data path. It has one, and has since before this design existed.
Everything needed is already on the
/v1/runssurface the go-between talks to. Verified againsthermes-agent 0.19.0:approval.requestevent on the run-events stream, command pre-redacted via_redact_approval_commandgateway/platforms/api_server.py:6250-6275choicesarray on that event —["once","deny"]when smart-denied, else["once","session","always","deny"]or["once","session","deny"]api_server.py:71-74(_approval_event_choices)waiting_for_approvalapi_server.py:1348,6271POST /v1/runs/{run_id}/approval, body{choice, resolve_all}; acceptsonce/session/always/denyplus the aliasesapprove/approved/allow→onceapi_server.py:1847,6548approval_events,run_approval_responseapi_server.py:2873-2875The gap is entirely go-between-side.
HermesAgenthas no approval handling —grep -n approval src/open_llm_vtuber/agent/agents/hermes_agent.pyreturns nothing, and_stream_run_eventsdiscardsapproval.requestwith every other unrecognised event. Today a gated tool therefore reads as a hang and then a failure, which is the symptom, not the cause.Scope
Go-between:
approval.requestdown the client socket as a new message type, carrying the redacted command, the specifics the card shows, and thechoicesarray verbatim.waiting_for_approvalis alive. The poll/stream loop must distinguish it from a stall.POST /v1/runs/{run_id}/approval. The client must not hold the Hermes bearer key — the go-between makes the call.Client:
許可(44px,#eaff3c) /やめて/差分, the ask in plain language, the specifics line, and the保留 · 12秒hold timer.choicesis per-request — a smart-denied tool offers["once","deny"], so drawing four buttons unconditionally would invent two. This is the one place the design's "four values, not two" needs a conditional.許可が必要, name in#eaff3c, hold timer in the duration slot).許可 · 今回だけ/許可 · 交信中/許可 · ずっと/拒否. Per Turn 4, a standing grant is the thing you most want to find again later, and where one is in force the 承認後 line says so (fs.write はもうきかない).やめて→ she finishes the turn without that tool and the log records拒否.Acceptance criteria
choicesare rendered; a smart-denied tool shows two buttons, not fourresolve_allis reachable where the design implies a blanket answerNot blocked by anything
Independent of
ollvt-hermes-bridge#16(the Platform adapter) and of the go-between inbound receiver. The adapter'ssend_exec_approvalis a second path to the same capability, not a prerequisite.Design reference:
docs/design/denpa-receiver/README.md— Turn 4 承認, Turn 9, and the Buildable today section of the fidelity table.Closing as a duplicate of #19, which covers this and predates it — I filed this after wrongly concluding nothing tracked 承認. #19 is reopened with the corrected wire facts.
#19 also holds a decision this issue got wrong: the grant vocabulary does not ship as four keys. Per #19 and Turn 9 of the design doc, the two-key 許可 / やめて layout stays and
session/alwayslive behind a press-and-hold on 許可, because the acid 許可 must remain the one obvious thing to press and a parked tab's 168px cuff cannot hold four 44px targets. This issue's "the four grant values ship as drawn" was wrong and would have re-litigated a settled decision.The one piece worth keeping — gate the press-and-hold reveal on the event's per-request
choices, so a smart-denied tool suppresses the notch tell instead of revealing dead options — is carried over to #19.