fix(acp): the Full Access hint names the routes that actually work

ACP sessions advertise how to enable Full Access in the permission option's
`enableFullAccess` hint. It said: start with
`codewhale --approval-policy full-access serve --acp`, or set
`approval_policy = "full-access"` in config.toml. Both are refused at
startup ("Invalid approval_policy 'full-access': expected on-request,
untrusted, never, auto, or suggest."), because config.toml's approval_policy
vocabulary (CONFIG_TOML_APPROVAL_POLICIES) deliberately leaves out
`full-access`; that word belongs to settings.toml's /settings editor. The
config.toml route to Bypass is `yolo`, which `acp_approval_mode` already
reads. The hint now says `codewhale --yolo serve --acp` or `yolo = true`.

Found while answering #6992, a Paseo report that config Full Access is
ignored over ACP. A real `codewhale serve --acp`, current main's debug
binary, was driven over stdio by a scratch client against a loopback
fixture provider; no model traffic. Config `sandbox_mode =
"danger-full-access"` plus `allow_shell = true`, initialize with the
`terminal` capability, and a prompt the fixture answers with a gated
`bash` call. That call reports $CODEWHALE_SANDBOX, binds an AF_UNIX
socket and curls https://example.com.
- `approval_policy = "suggest"` (the reporter's config): one
  session/request_permission for the bash call, as reported.
- `yolo = true`, or `--yolo` on the command line: no permission request;
  CODEWHALE_SANDBOX empty, the AF_UNIX socket bound, network 200.
- `approval_policy = "full-access"`, and `--approval-policy full-access`:
  the server exits at startup with the error above.
The reporter's `ask = "never"` is not a config.toml key Codewhale reads.
`approval_policy = "never"` refuses gated calls; it does not approve them.

Whether a client-unpinned ACP session should take Full Access from
sandbox_mode alone is a separate product decision (CW-7439), not made here.

Gates:
- scripts/dev-test.sh tui acp_server: 38 tests run, 38 passed.
- cargo fmt --check clean.
- sync-changelog and check-versions OK.

Refs #6992

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz
This commit is contained in:
CodeWhale BotandClaude Opus 5.5 committed 2026-10-16 23:14:10 -07:00
1 parent 5fe4df9c24
commit f6583c3ffe
3 files changed
+15 -1

No files matched your search

+7
View File
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
- An ACP client that asks how to turn on Full Access is now told the
routes that work: start the server with `codewhale --yolo serve --acp`,
or set `yolo = true` in config.toml. The hint used to recommend
`--approval-policy full-access` or `approval_policy = "full-access"` in
config.toml. Both are refused when Codewhale starts, because config.toml's
`approval_policy` only accepts on-request, untrusted, never, auto and
suggest. Thanks @harryvizcaino-oss for the Paseo report (Refs #6992).
- On Linux, a credential directory the sandbox hides no longer breaks every
sandboxed command when it is reached through a symlink, such as `~/.kube`
linked into a synced dotfiles folder or a `~/.config` that links
+7
View File
@@ -7,6 +7,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
- An ACP client that asks how to turn on Full Access is now told the
routes that work: start the server with `codewhale --yolo serve --acp`,
or set `yolo = true` in config.toml. The hint used to recommend
`--approval-policy full-access` or `approval_policy = "full-access"` in
config.toml. Both are refused when Codewhale starts, because config.toml's
`approval_policy` only accepts on-request, untrusted, never, auto and
suggest. Thanks @harryvizcaino-oss for the Paseo report (Refs #6992).
- On Linux, a credential directory the sandbox hides no longer breaks every
sandboxed command when it is reached through a symlink, such as `~/.kube`
linked into a synced dotfiles folder or a `~/.config` that links
+1 -1
View File
@@ -722,7 +722,7 @@ impl AcpServer {
Ok(self.current_model())
}
}
const ACP_FULL_ACCESS_HINT: &str = "Start the server with `codewhale --approval-policy full-access serve --acp`, or set approval_policy = \"full-access\" in config.toml. Full Access also turns off Codewhale's own sandbox unless sandbox_mode tightens it; Plan stays read-only.";
const ACP_FULL_ACCESS_HINT: &str = "Start the server with `codewhale --yolo serve --acp`, or set `yolo = true` in config.toml. Full Access also turns off Codewhale's own sandbox unless sandbox_mode tightens it; Plan stays read-only.";
fn acp_mode(config: &Config) -> AppMode {
if config.sandbox_mode.as_deref() == Some("read-only") {