fix(shell): accept Windows verbatim-path operands; changelog receipt for C3

Read-only Scout shell operands are judged by resolved location, but
Windows Path::canonicalize returns verbatim device paths (\\\\?\\C:\\...)
that Path::is_absolute does not recognize, so every canonical absolute
in-workspace operand fell into the shape refusal on Windows (CI:
readonly_operands_are_workspace_bounded_and_symlink_aware and
read_only_inspection_roles_execute_pwd_and_absolute_git_log). Strip the
verbatim prefix before classification; the stripped form resolves to the
same location, so location-based judgement is unchanged and unix hosts
stay fail-closed for such spellings.

Also add the missing CHANGELOG receipt for the C3 cache-hit-rate feature
(DSH #3) and resync crates/tui/CHANGELOG.md, clearing the Version drift
check.
This commit is contained in:
CodeWhale Bot committed 2026-08-24 16:52:02 -07:00
1 parent 0098062ed1
commit 42857108ff
3 files changed
+32

No files matched your search

+4
View File
@@ -30,6 +30,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
self-updater refuses to fight an Omarchy/package-manager installation.
- Added a Fleet run-wide cost/token usage ceiling (R6, #5567): an accumulator
plus admission gate and alert bound a whole run's spend across workers.
- Added the real provider cache hit rate to `/context` (C3, DSH #3): the
token-weighted provider-reported rate from the same telemetry `/cache`
aggregates, plus an honest "no cache telemetry yet" state when nothing is
recorded.
- Added per-step cost movement: `TurnUsage` receipts are priced as they land
so the live cost surface moves during long agentic turns instead of only at
`TurnComplete` (#5578), and the footer now honestly shows `cost: unknown`
+18
View File
@@ -9,6 +9,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Added
- Added the managed Chat relay: account-owned Chat commands now execute on the
native runtime thread engine through a new `runtime_chat_relay` module
instead of a second execution path. Each Chat thread is a dedicated,
isolated runtime thread with an empty model-visible tool allowlist, a
chat-only system prompt, and no workspace, memory, skill, credential, or
local-path context; the active interactive TUI thread is never reused. The
relay keeps one durable state file per scope behind a session-wide owner
lock, binds a saved session permanently to its first remote target, replays
exact duplicate commands from retained results instead of starting a second
inference turn, terminalizes orphaned reservations on restart, and rejects
(never queues into) a busy local Work turn with an immediate retryable
result. Stop commands require the exact run and turn identity, and a worker
aborts on any account or target mismatch during token refresh.
- Added a verified Omarchy/AUR packaging path: `packaging/aur` now carries a
`PKGBUILD` template, `.SRCINFO` renderer and tests, release-candidate
render step, and docs; the live AUR compatibility alias `codewhale-tui ->
@@ -16,6 +30,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
self-updater refuses to fight an Omarchy/package-manager installation.
- Added a Fleet run-wide cost/token usage ceiling (R6, #5567): an accumulator
plus admission gate and alert bound a whole run's spend across workers.
- Added the real provider cache hit rate to `/context` (C3, DSH #3): the
token-weighted provider-reported rate from the same telemetry `/cache`
aggregates, plus an honest "no cache telemetry yet" state when nothing is
recorded.
- Added per-step cost movement: `TurnUsage` receipts are priced as they land
so the live cost surface moves during long agentic turns instead of only at
`TurnComplete` (#5578), and the footer now honestly shows `cost: unknown`
+10
View File
@@ -3865,6 +3865,16 @@ fn enforce_readonly_workspace_operands(
.split_once('=')
.map_or(token.as_str(), |(_, value)| value)
.trim();
// Windows `Path::canonicalize` returns verbatim device paths
// (`\\?\C:\...`), which `Path::is_absolute` does not recognize; without
// stripping the prefix the operand falls into the shape refusal and
// every canonical absolute read is denied on Windows. The stripped
// form resolves to the same location, so location-based judgement is
// unchanged. On unix hosts such spellings stay fail-closed below.
let value = value
.strip_prefix(r"\\?\")
.or_else(|| value.strip_prefix(r"\\.\"))
.unwrap_or(value);
if value.is_empty() || value == "-" {
continue;
}