Skip to content

docs(#667): close both open-unknowns via live smoke - #678

Merged
tu11aa merged 2 commits into
developfrom
crew/667-probe2
Aug 17, 2026
Merged

docs(#667): close both open-unknowns via live smoke#678
tu11aa merged 2 commits into
developfrom
crew/667-probe2

Conversation

@tu11aa

@tu11aa tu11aa commented Aug 17, 2026

Copy link
Copy Markdown
Owner

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.

  • Unknown (b) — the real shape of GET /api/permission/request: the endpoint exists and matches its documented OpenAPI schema, but is fed by opencode's v2 SessionRunner, 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) legacy GET /permission / POST /session/{id}/permissions/{permissionID} pair instead — this smoke confirms that was the right call.
  • Unknown (c) — claude approve/deny of a held peer message: reconfirmed the hold trigger (from-mode="bypass" vs a --permission-mode auto receiver) 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 real type:"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 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 (no <pid>.json written). 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 file
  • All throwaway processes killed by exact PID; verified no cc-probe-667-related processes remain (ps aux | grep cc-probe-667)
  • No squadrant projects add registrations were left behind (both probes used direct HTTP/pty against throwaway servers, no captain/crew orchestration needed)

tu11aa added 2 commits August 17, 2026 16:43
…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.
@tu11aa
tu11aa merged commit 426c2cd into develop Aug 17, 2026
1 check passed
@tu11aa
tu11aa deleted the crew/667-probe2 branch August 17, 2026 09:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant