# fix\(approvals\): command approvals show the command, not only the agent's description · PR \#20145 · pingdotgg/t3code

[View on GitCafe](https://git.cafe/pingdotgg/t3code/pull/20145)

Repository: [pingdotgg/t3code](https://git.cafe/pingdotgg/t3code)

Visibility: public

State: open

Source repository: pingdotgg/t3code

Source branch: t3/approval-command-visibility

Target branch: main

Head commit: 6e8ad24cac13bf51d12bcc2270e18123c7313e54

[Discussion and reviews](https://git.cafe/pingdotgg/t3code/pull/20145)

[Commits](https://git.cafe/pingdotgg/t3code/pull/20145/commits?format=markdown)

[Files changed](https://git.cafe/pingdotgg/t3code/pull/20145/diffs?format=markdown)

## Description

---

Command approvals could show the agent’s explanation in place of the command, or reconstruct pipelines from permission patterns. The cards now show the complete operation and keep the explanation in the approval item’s existing title.

Codex preserves legacy argument boundaries. Network approvals show the protocol and host followed by the complete command, with the reason kept in the title even when all three arrive together. Claude, OpenCode, OpenCode 2, and Pi retain the command rather than a description, split pipeline, or truncated JSON. OpenCode 2 fills in late tool input after reconnect without replacing authoritative permission metadata or changing a request already being answered. Web and mobile share labels; command text and explanations wrap and scroll within bounds, and decision buttons match main. Shell-wrapper removal remains conservative and preserves command whitespace.

Scope and approval: this fixes incorrect information in existing approval flows. It adds no execution authority or new approval action. The active maintainer request for large-command verification is addressed below and remains open for human re-review.

Verification:

- Reduced 26 added cases in three files to seven added cases plus two strengthened inherited cases in seven existing files. All seven tests-phase scenarios fail on content assertions without the fix; removing the OpenCode 2 metadata guard also reproduces its regression.
- The network follow-up strengthens the existing replay row without adding tests: host + reason + command failed on content before the fix and passes after it. After merging main at [284ce8fe2f](https://github.com/pingdotgg/t3code/commit/284ce8fe2ff99076657707fd754e538403d88d76), 541 tests in the Codex adapter, approval projection, and command-label suites pass, along with scoped server typechecking and targeted lint/formatting.
- 955 focused tests, 245 adjacent tests, and three browser tests pass. The new browser regression fails without the explanation-height bound (1,168px instead of at most 40px). Scoped client-runtime, OpenCode, Pi, web, mobile, and server typechecks pass. Formatting and targeted lint pass, with five unchanged unused-variable warnings. One unchanged Claude scenario timed out in a combined run; its six variants passed on targeted rerun and the full focused run passed again.
- Linux browser proof uses the real approval panel, banner layout, and decision components with synthetic data. Base and head captures use identical data and viewport. The complete 6,282-character command remains exact at 1280px and 520px; its detail area is 160px high, scrolls vertically to the end marker, and has no horizontal overflow. A separate 10,000-character unbroken token also wraps without losing text or hiding the buttons. A separate synthetic network-title stress case retains a 6,282-character explanation in a 40px scroll area; its end marker is reachable and its decision buttons remain visible. The current adapter emits the network command in the primary detail, not the title. The screenshots compare explanation display; adapter replay tests establish command-versus-description extraction.
- This maintainer pass did not run live provider approval sessions or verify macOS, Windows/WSL, native iOS/Android, Electron, or remote/tunnel connections. Native scrolling and real-provider approval/decline remain for a human to verify. Earlier author screenshots and live-provider claims have been replaced with current-head evidence.

Before — main approval panel with the same synthetic command:

![Before: main approval panel omits the explanation](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/3b20267b4d82db1b/20145-before.png)

After — complete command and separate explanation:

![After: command approval with wrapping explanation](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/d8634c288c1210ba/20145-after.png)

After — 520px viewport:

![After: narrow approval card keeps decisions visible](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/929815a2627573f3/20145-after-narrow.png)

After scrolling to the final command line:

![After: final command marker is readable](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/2621c3303bd3a032/20145-after-end.png)

[Recording: scroll through the complete command and network explanation](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/670a90586d01a464/20145-long-command.mp4)

Network follow-up — identical current-head components with the old and fixed synthetic adapter payloads. Replay tests prove the adapter emission; no live provider command was executed.

Before — host and reason hide the command:

![Before: network approval has host and reason but omits the command](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/7cb6f0a5df5e90cc/20145-network-combined-before.png)

After — host, exact command, and reason remain visible:

![After: network approval includes the complete command alongside the host and reason](https://gh-file-drop-api-prod-mi5fy3sowv63ufte.pinglabs.workers.dev/f/07b65b9b59aecab5/20145-network-combined-after.png)

Thanks to [@maria-rcks](https://github.com/maria-rcks) for the original [#20145](https://github.com/pingdotgg/t3code/pull/20145), cross-provider investigation, and shell-display constraints. Contributor history is preserved.

Independent full-PR review: two original takeover rounds (network-title overflow fixed in round one, round two clean), then one clean post-network-fix round on both Opus and Sol. Opus noted optional Claude non-shell tool labeling, pre-existing writeStdin semantics, and native/live-provider verification limits; these are left for coordinator follow-up. The active human changes request is preserved.

Maintainer implementation: Codex gpt-6.1-sol; test reduction: Codex gpt-6-astra. Adversarial reviews: Claude Code claude-opus-5-5 and Codex gpt-6-sol.

Fixes #20146
GitCafe: https://git.cafe/pingdotgg/t3code/issues/20146

