docs(#667): close both open-unknowns via live smoke - #678
Merged
Conversation
…uest
Legacy GET /permission + POST /session/{id}/permissions/{id} (deprecated
in the server's own OpenAPI doc) are what squadrant's merged code
actually uses and they work. The v2 pair this spec's open-unknowns
table named (GET /api/permission/request, POST
/api/session/{id}/permission/{reqId}/reply) exists and matches its
documented schema, but its backing SessionRunner errors with
ModelUnavailableError before it can ever reach a tool call in
opencode v1.18.18 (reproduced against two unrelated providers), so it
never sees a real pending permission. Recorded live transcripts for
pending/empty/dead-session/dead-request-id on both endpoint pairs.
…er message Reconfirms the 2026-08-08 spike's hold trigger (from-mode="bypass" against a --permission-mode auto receiver) on Claude Code 2.1.233, then goes further and exercises both resolutions live for the first time: - deny (default selection, no navigation): receipt status:"denied", no user turn added to the transcript. - approve (arrow-down to "Deliver", then confirm): receipt status:"delivered", and the message lands as a real type:"user" transcript entry. The confirm key is not a plain \r/\n/space/tab/digit — none of those resolved the prompt despite arrow-key navigation visibly working. Only the Kitty keyboard protocol CSI-u encoding (\x1b[13u) worked. Also documents an environmental trap: spawning a throwaway claude session via `nohup ... &` from inside another Claude Code session leaks CLAUDE_CODE_* env vars into the child and silently breaks its session registry entry; fixed by spawning with a sanitized env. No human-in-the-loop blocker was needed — the earlier "never exercised" unknown was closed entirely via automated pty driving.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Live-smoke investigation closing the two remaining #667 open-unknowns (docs only, no production code). Read-only/throwaway probing per the task brief — no real project or crew was touched.
GET /api/permission/request: the endpoint exists and matches its documented OpenAPI schema, but is fed by opencode's v2SessionRunner, which cannot complete a turn against any tested provider in v1.18.18 (ModelUnavailableError, reproduced against two unrelated providers). It never sees a real pending permission. squadrant's merged slice-2 code already uses the working (if"deprecated": true) legacyGET /permission/POST /session/{id}/permissions/{permissionID}pair instead — this smoke confirms that was the right call.heldpeer message: reconfirmed the hold trigger (from-mode="bypass"vs a--permission-mode autoreceiver) on Claude Code 2.1.233, then exercised both resolutions live for the first time. Deny →status:"denied"receipt, no transcript turn added. Approve →status:"delivered"receipt, message lands as a realtype:"user"transcript entry. The blocker turned out to be mechanical, not a human-in-the-loop requirement: the confirm key is the Kitty keyboard protocol\x1b[13u, not a plain\r/\n/space/tab/digit — those were all tried and silently did nothing despite arrow-key navigation visibly working.Also documents an environmental trap found along the way: spawning a throwaway
claudesession vianohup ... &from inside another Claude Code session leaksCLAUDE_CODE_*env vars into the child and silently breaks its session registry entry (no<pid>.jsonwritten). Fixed by spawning with a sanitized env (env -i HOME=... PATH=... TERM=...).No production code changed. Both findings are appended as dated sections to
docs/specs/2026-08-13-agent-control-channel-design.md, matching the style of the existing 2026-08-17 opencode mid-turn smoke test section, with real transcripts/commands. All throwaway processes (2 opencode server instances, 4 claude sessions, their pty drivers, and Node probe daemons) were killed by exact PID as they were created — no broad-kill was used.Test plan
git diff develop..HEAD— docs-only change, single filecc-probe-667-related processes remain (ps aux | grep cc-probe-667)squadrant projects addregistrations were left behind (both probes used direct HTTP/pty against throwaway servers, no captain/crew orchestration needed)