Skip to content

Integrate Codewhale 0.9.13 contributor fixes and release verification - #6002

Open
Hmbown wants to merge 234 commits into
mainfrom
integration/new-prs-20260907
Open

Integrate Codewhale 0.9.13 contributor fixes and release verification#6002
Hmbown wants to merge 234 commits into
mainfrom
integration/new-prs-20260907

Conversation

@Hmbown

@Hmbown Hmbown commented Sep 7, 2026

Copy link
Copy Markdown
Owner

This integrates the Codewhale 0.9.13 contributor work and repairs found while testing the combined CLI, terminal UI, Runtime API and bundled Computer Use implementation.

The candidate includes provider catalog pagination and exact routing, OpenRouter vendor selection, output limits and pricing validation, queued paste and slash history, session/task ownership, Fleet isolation, localized notifications, Runtime image inputs and durable turn recovery. Native plugin authoring guides cover English and Chinese, with explicit conversion support and rejection boundaries for OpenCode and DSH. Contributor code and reporting credit are retained.

Follow-up changes make two Windows fixtures portable, reject plugin conversions that would discard source permissions, retain the observed macOS element when dispatching a click, remove duplicated tool guidance, and make the tool-schema metric independent of the inherited shell. Provider failures retain their sanitized underlying cause, and owned OAuth credentials use the earliest known access-token expiry.

Contributor PR implementations represented here: #5996, #5990, #5985, #5984, #5982, #5973, #5946, #5861, #5859, #5842, #5752 and #5726. Some implementations were adapted during integration; this list does not claim every contributor branch was merged unchanged.

Public candidate: a2a7a455bb1d1633f1944caaf57a97533847dcaa. The changelog explicitly marks 0.9.13 as an unreleased candidate.

Verified local evidence:

  • Full workspace, all features at this public head: 15,069 passed, 0 failed, 19 skipped (256.154 seconds), using freshly built binaries in an isolated test home.
  • All 22 version-0.9.13 crates passed the real publication dry run, including compilation of all unpacked tarballs at this exact clean source. No crates uploaded. Two nonfatal macOS debug-link compact-unwind warnings were recorded.
  • Website at 5978f41b6: 440 passed, 0 failed; lint (0 errors, 2 existing image warnings), types and production build passed. The subsequent generated release-note/provenance change passed its 20 focused web tests, docs projection checks and the 26-reference feature-release-note gate.
  • Runtime and persistence budgets passed at 5978f41b6. Runtime tool-schema growth was attributed to individual source changes; 12 measured tool-byte/token ceilings were reconciled with no added headroom. The initial active tool catalog measured 13,274 bytes / 3,319 estimated tokens. These byte-derived estimates are not provider usage or billing receipts.
  • The 11 follow-up commits from the preceding public head passed a redacted secret scan with 0 findings. The security review remains in progress; a clean scan is not a complete security assessment.

Hosted evidence for the preceding 8fbdc5fc head: Buildkite build 1925 passed, with Linux 15,058 passed / 0 failed / 19 skipped and macOS 15,066 passed / 0 failed / 19 skipped, plus lint and doctests. GitHub Linux, macOS, Lint, npm-wrapper and all CodeQL language jobs passed. Windows finished with 14,666 passed / 2 failed / 18 skipped; both failing fixtures are corrected in this candidate. Hosted checks for the current head are running, and their outcomes remain unverified.

The previous advisory Codewhale review refused the complete 556-file, 9,431,066-byte diff at its 8 MiB capture limit before model inference. No completed whole-PR model review is claimed. That review is advisory under the existing repository rules.

The exact-head, nonpublishing release-candidate workflow is running. It does not create a release or upload to a package/container registry. Final artifact acceptance and a completed authenticated session with the requested DeepSeek model and Computer Use—including images, cancellation and recovery—remain release checks. The requested preview returned HTTP 402 on the configured route; availability, vision, tools, speed and price have not been qualified. Local Developer ID signing is separate from notarization and public artifact publication.

Codewhale 0.9.13 is not released. Issue closure follows actual fix and release evidence. Apps deployment/customer activation and live billing remain separate evidence gates. Security disclosure follows patched-release availability.

No-Issue: This release integration combines the contributor fixes and verification listed above; individual issue closure requires its own fix and release evidence.


Note

Medium Risk
Changes span advisory PR-review credential boundaries, fork handling, and every Rust test invocation path; mistakes could skip tests, leak secrets to fork PRs, or block releases, though workflow tests aim to prevent hermetic-home drift.

Overview
This PR prepares the 0.9.13 unreleased candidate: a large CHANGELOG refresh (integrity fixes, metrics/catalog routing, Computer Use 0.2.1, plugin guides, posture/metrics UI, redaction opt-out, and expanded contributor credits) plus aligned README and locale copy, Shannon Sans on the site (DESIGN.md), and a new workspace crate codewhale-cloud-facts with lockfile cleanup (Starlark-related deps and cargo-audit suppressions removed).

CI and release plumbing shifts away from the deleted Buildkite pipeline toward GitHub Actions and CNB: Rust cargo test / nextest invocations in CI, release, and CNB now run through scripts/with-hermetic-test-home.sh, with workflow tests enforcing that contract; CNB tag builds call check-versions.sh --require-dated-release before compile. Other gates add VS Code npm run package, a Homebrew depends_on "node", Windows test steps that disable sccache under the isolated home, and .gitguardian.yml ignoring the public test signing-key fixture.

.github/workflows/codewhale-review.yml is tightened: model/App secrets and trusted builds only on same-repo PRs, pinned checkout and PR object fetch, CODEWHALE_API_KEY via the codewhale account relay (no vendor key overwrite), plus --max-chars / --max-passes and clearer non-run receipts. Housekeeping: .impeccable/ critiques removed and gitignored, CONTRIBUTING project layout rewritten, goransh-walia on approved contributors.

Reviewed by Cursor Bugbot for commit b706304. Bugbot is set up for automated code reviews on this repo. Configure here.

CodeWhale Bot and others added 22 commits September 2, 2026 13:32
Rewrite $\sim0 error/status strings in en.json (send failures,
permissions, sessions, automation, compaction, provider, telemetry
prefs, voice, clipboard) and lowercase the product name to codewhale
in user-visible inline errors. Keys, placeholders, and parsed
punctuation unchanged.

Tests: 167 targeted + 704 config/runtime_api pass; 65 locale goldens
pass; cargo fmt clean; check-tui-product-vocabulary.sh clean.
Rewrite picker/menu/config/fleet/provider/plugin copy in en.json
(shorter, warmer; product name lowercased to codewhale) and sync the
inline translate() fallbacks plus registry strings that render the
same copy. Keys, placeholders, and parsed punctuation unchanged;
test-pinned phrases (session-model-only, context length/size,
provider rejection wording) preserved.

Tests: 1401 targeted pass; 65 locale goldens pass; cargo fmt clean;
check-tui-product-vocabulary.sh clean.
Rewrite launch/setup/onboarding/telemetry-notice/command-help copy
in en.json (shorter, warmer; product name lowercased to codewhale,
zero capitalized values left) and sync the inline English strings
that render the same copy. Keys, placeholders, and parsed
punctuation unchanged; test-pinned phrases (unknown-command head,
context length/size, separate sign-in, Nothing deleted) preserved.
Pixel-blessed launch goldens untouched (menu keeps Changelog).

Tests: full codewhale-tui lib suite 11909 pass; cargo fmt clean;
check-tui-product-vocabulary.sh clean.
…n reply

Accumulate streamed content into Completed.summary so receipt notes show a bounded deliverable excerpt instead of 'no verifiable output'.

Emit the real saved-session id in the session_capture stream event, persist it on FleetReceipt, and expose it via the runtime API so a client can resolve the worker's final assistant reply through GET /v1/sessions/{id}.
… once, saved_session_id

Maintainer follow-up on #5946 (original by @gaord, preserved below as
c58c74912). Keeps the saved-session half; reworks the summary half per
review:

1. The excerpt now travels in the exec terminal event: the terminal
   `metadata` receipt carries `visible_final_answer_excerpt` (bounded,
   secret-redacted) next to the REAL pre-bound count
   `visible_final_answer_chars` of `summary.output` — the final reply,
   not the opening of the run.
2. The fleet executor's frame accumulator is deleted: nothing streams
   assistant text into per-worker memory anymore; `WorkerStream` only
   records the terminal receipt's answer.
3. Exactly one bound-and-redact helper, `exec_stream_final_answer_excerpt`
   (crates/tui/src/lib.rs, 4,000 chars); the executor-side
   `bounded_worker_summary` and task_spec-side `bounded_receipt_excerpt`
   duplicates are deleted.
4. The terminal frame is parsed exactly once: `parse_exec_terminal_*`
   take `&serde_json::Value`, and `WorkerStream::observe_line` parses
   each line once for route evidence, final answer, session capture, and
   payload mapping (`map_exec_stream_value`).
5. `session_capture.session_id` renamed to `saved_session_id` everywhere,
   and protocol `FleetReceipt.session_id` to `saved_session_id`; all
   consumers updated (runtime_api receipt JSON, manager, task_spec,
   ledger/alerts/control tests); `metadata` stays fingerprint-only and
   `metadata.resume_command` now names the field instead of pretending
   to redact one.
6. Docs updated in docs/AGENT_RUNTIME.md and docs/zh_hans/AGENT_RUNTIME.md.
7. The excerpt also surfaces on FAILED outcomes: it stays on
   `FleetWorkerTerminalEvent.final_answer` whatever the outcome, and a
   no-scorer failed/cancelled receipt keeps the text in its score notes;
   lifecycle event labels show a 160-char excerpt and worker inspection
   summaries bound notes to 240 bytes while payloads/receipts keep the
   full excerpt.

Gates (RUST_MIN_STACK=16777216, shared target dir):
- cargo fmt --all: clean, no changes
- cargo clippy --workspace --all-targets --all-features --locked
  -D warnings -A clippy::uninlined_format_args -A clippy::too_many_arguments
  -A clippy::unnecessary_map_or: pass, 0 warnings
- cargo test -p codewhale-tui --lib --locked -- fleet::executor
  fleet::task_spec fleet::manager terminal_mode_tests::exec_stream
  runtime_api::tests::fleet_receipt: 100 passed, 0 failed
- cargo test -p codewhale-protocol --locked: 85 passed, 0 failed
- cargo test -p codewhale-tui --lib --locked: 11856 passed, 0 failed,
  13 ignored (one earlier run had 1 unrelated tmux clipboard flake that
  passes in isolation; a mass-failure run in between was shared-target-dir
  cross-worktree contamination, not this change)

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
The second half of #5950; the /statusline composition half landed as #5962.

These presets only decide how much of each of the two rows under the composer paints:

  [tui].posture_bar  = full | compact | hidden   (default full)
  [tui].metrics_line = full | compact | hidden   (default full)

Both also settable live with /config posture_bar compact; --save writes the [tui] key, a session-only set says so, and an unknown preset names the three and changes nothing.

compact is not a second renderer: each row keeps its existing shed ladder and the preset starts it at a fixed rung, so what compact keeps is exactly what a narrow row keeps (posture bar starts render_tideline_footer at COMPACT_SHED; metrics line starts shed_pass with every segment at or above SHED_BEFORE_HELP). hidden gives the row to the transcript, resolving info_height/footer_height to 0 exactly as mini mode already did.

Honesty in what the rows claim (respecting #5578): a route that cannot prove its effective reasoning tier states no effort field instead of a placeholder that could never resolve (App::provable_reasoning_effort_label is the single gate); the cost segment is omitted only where the route itself cannot be priced (UsageChip::Unknown on BillingPresentation::Unknown) — cost: unknown stays wherever a price could exist.

Absence in an older config.toml means full; an unknown preset is refused at parse time rather than guessed.

Gates (run by the agent that authored this slice, on the pre-rebase tree; CARGO_PROFILE_DEV_DEBUG=0 to pin own artifacts in the shared target dir):
- cargo fmt --all: clean
- cargo clippy --workspace --all-targets --all-features --locked -- -D warnings (standing allowances): clean
- targeted (config, tui::infoline, tui::phase_strip, tui::ui::frame): 1014 passed / 0 failed / 0 ignored
- full cargo test -p codewhale-tui --lib --locked: 11857 passed / 0 failed / 13 ignored

Rebased onto main 9c66003 by the operator; CI is the gate for the rebased tree.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
…ake; passes on re-roll)

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
The model boundary masks credential-shaped tool output before it reaches an
upstream model (configured secrets plus a CredentialShaped structural pass).
Editing files that contain real credentials has always been awkward because
the model cannot quote those bytes back. This adds a deliberate, documented
opt-out that treats lowering the boundary as a security decision:

- config.toml gains [redaction] model_bound = "enabled" (default) | "disabled";
  "disabled" only records a request.
- After a restart the interactive TUI shows a full-screen startup gate (same
  explicit-key discipline as workspace trust: 1/Y confirm, 2/U keep, 3/N/Esc
  quit; Enter never confirms by reflex).
- Confirming persists a receipt to ~/.codewhale/redaction-state.json and
  rebuilds the engine so its client applies the opt-out. Until a receipt
  exists every process - including headless/exec runs - stays masked.
- The client opt-out covers structured ToolResult blocks only; routing/
  classification summaries and durable goal-state text keep always-on
  redaction.
- Gate copy is localized across all 15 shipped locale packs; enum, JSON, and
  ALL_MESSAGE_IDS stay in sync.
`prune_older_than_keeps_the_newest_and_drops_only_the_old_tail` fails
intermittently on windows-latest with

  assertion `left == right` failed: only the old tail should be removed
    left: 3
   right: 2

The fixture builds two old snapshots, sleeps 8s, then two new ones 1.1s
apart, and cuts at a hardcoded 6s. That assumes `repo.snapshot()` is fast:
`new:0` is only ~1.2s plus one git subprocess older than prune time, so on
a loaded Windows runner that subprocess alone carries it past the 6s line
and it is pruned with the old pair.

The existing fixture guard could not catch it — it asserts on `before[0]`
and `before[2]`, and `before[1]` is the entry that drifts.

The cut is now computed from the timestamps the repo actually recorded:
aim at the midpoint of the gap between the oldest survivor and the newest
victim, which leaves ~4s of slack in both directions instead of depending
on wall-clock luck. The gap itself is asserted first, so a fixture that
collapsed says so plainly rather than failing later as a count mismatch.

Behaviour under test is unchanged: two removed, `new:1` and `new:0`
survive. No production code is touched.

  cargo clippy -p codewhale-tui --lib -> 0 errors
  cargo test -p codewhale-tui --lib -- prune_older_than
    -> test result: ok. 3 passed; 0 failed

Found when it failed the windows leg of #5987, a PR containing zero Rust
files (TypeScript, CI config and .gitignore only), so it cannot have been
caused there.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01D4rk4NXwyy6wmvii9Lp84P
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
# Conflicts:
#	CHANGELOG.md
#	crates/tui/CHANGELOG.md
… cumulative stream

Devin follow-up on #5946: in a multi-step turn ExecSummary::output
accumulates every streamed delta, including pre-tool commentary from
earlier steps, so the terminal metadata could present progress text as
the deliverable. Derive visible_final_answer_chars/excerpt from the
last assistant-like message of the persisted session; the cumulative
output stays only as the fallback when the session carries no assistant
text.

Signed-off-by: Ben Gao <bengao168@msn.com>
The model boundary masks credential-shaped tool output before it reaches an
upstream model (configured secrets plus a CredentialShaped structural pass).
Editing files that contain real credentials has always been awkward because
the model cannot quote those bytes back. This adds a deliberate, documented
opt-out that treats lowering the boundary as a security decision:

- config.toml gains [redaction] model_bound = "enabled" (default) | "disabled";
  "disabled" only records a request.
- After a restart the interactive TUI shows a full-screen startup gate (same
  explicit-key discipline as workspace trust: 1/Y confirm, 2/U keep, 3/N/Esc
  quit; Enter never confirms by reflex).
- Confirming persists a receipt to ~/.codewhale/redaction-state.json and
  rebuilds the engine so its client applies the opt-out. Until a receipt
  exists every process - including headless/exec runs - stays masked.
- The client opt-out covers structured ToolResult blocks only; routing/
  classification summaries and durable goal-state text keep always-on
  redaction.
- Gate copy is localized across all 15 shipped locale packs; enum, JSON, and
  ALL_MESSAGE_IDS stay in sync.
Preserve SparkofSpike commit and two-stage confirmation. Resolve client HTTP security validation against current main. Bind consent to readable disabled config bytes and modification time; legacy or missing bindings fail closed.

Validation: config lib 647 passed, 0 failed, 1 ignored; TUI opt-out/gate/localization filters 62 passed, 0 failed; web 407 passed. Negative control against original redaction code: 0 passed, 1 failed (missing config confirmation). fmt, web facts/docs/tokens, lint and TypeScript pass (2 existing lint warnings). Prescribed root npm test && npm run check:web could not run: root package has no test script. Hosted CI and live TUI acceptance not claimed.
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Resolve changelog conflicts against release preparation, preserve contributor history, and refresh derived release notes including the reviewed redaction opt-out.

Validation: focused chrome and Shannon tests 17 passed, 0 failed; web tests 407 passed, 0 failed. Web facts/docs/tokens, ESLint and TypeScript pass, with 2 existing image warnings. Root npm test && npm run check:web unavailable: missing root test script. Historical Linux Shannon ETXTBSY flake is not claimed fixed. No hosted integration CI or live TUI acceptance claimed.
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
No tree changes. Preserve the rebased contributor commit and the already-tested config-binding fixes. Existing receipts: config 647 passed, 0 failed, 1 ignored; focused TUI 62 passed, 0 failed; web 407 passed. Root npm gate unavailable as previously recorded.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Reviewed values against turn_budget.rs and goal configuration resolvers. Web tests 407 passed, 0 failed; docs parity passes. Root npm test/check:web scripts remain unavailable. Preserve original contributor history.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Preserve original signed commit. Focused prune tests: 3 passed, 0 failed, including snapshot::repo::tests::prune_older_than_keeps_the_newest_and_drops_only_the_old_tail. No production changes. Combined integration hosted CI remains unrun; root npm test/check:web scripts unavailable as recorded.

Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Founder requested deferring ShannonNet and Levee. Remove the backend, command, delegation/context hooks, configuration, translations, and release claims. Preserve OpenSandbox and backend receipts. Unsupported old backend settings refuse execution instead of silently selecting local execution. Independent project repositories and state remain untouched.

Validation: focused runtime/commands/localization/work-surface tests 153 passed, 0 failed; web tests 407 passed, 0 failed. Web facts/docs/tokens/lint/TypeScript and locale parity pass (2 existing lint warnings); cargo fmt passes. TUI library check passed. Literal root npm test && npm run check:web remains unavailable because the root package lacks scripts. Hosted integration CI not yet run.
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Copilot AI lite review requested due to automatic review settings September 7, 2026 19:42
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Sep 7, 2026

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review Completed 2026-09-07T19:58:33.453480Z 13c0f4a PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@cursor

cursor Bot commented Sep 7, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_3d991310-f22b-41a2-86c6-dd80c49c12bc)

@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Claude finished @Hmbown's task in 2m 42s —— View job


Review: Integrate 0.9.13 PRs and defer ShannonNet execution

Todo list

  • Gather context (CLAUDE.md/AGENTS.md, PR diff against origin/main)
  • Review redaction/opt-out receipt logic (crates/config/src/redaction.rs, crates/tui/src/tui/redaction_gate.rs, crates/tui/src/config.rs)
  • Review ShannonNet removal for completeness/dead references (sandbox/backend.rs, client.rs, commands, locales, docs)
  • Review other integrated changes (chrome presets, snapshot-prune fixture, config docs)
  • Check for provider/model-prefix inference issues (EPIC v0.8.65 EPIC: Separate provider facts, model facts, offerings, and route resolution #2608 invariant)
  • Post final review summary

(Could not run cargo check/cargo test in this sandbox — tool execution required approval that wasn't grantable in this non-interactive review. Findings below are from careful manual reading of the full diff and cross-referencing call sites/grep, not a build.)

Summary

This is a clean, well-executed integration. I did not find correctness bugs or safety issues. Highlights:

  • Redaction opt-out (crates/config/src/redaction.rs, tui/redaction_gate.rs, client.rs): the fail-closed design is sound — confirmed_for_current_request re-derives the config's sha256+mtime binding on every check and sweeps stale receipts; missing/unreadable config, an "enabled" request, or any config edit all correctly fall back to masked. DeepSeekClient::model_bound_masking is computed once at construction from effective_masking(...), and the event loop explicitly rebuilds the engine after a confirmed opt-out (event_loop.rs ~L4789) so the new client picks it up — good, since the engine is spawned before the gate is answered (masking-on by default, as commented). Routing/classification summaries and goal-state text correctly keep unconditional redaction via the separate redact_model_bound_text path, independent of the opt-out flag.
  • ShannonNet removal: verified via grep across the whole tree — no dangling shannon/Shannon references remain outside the intentional negative-test case names in sandbox/backend.rs's unsupported_backend_refuses_execution_instead_of_falling_back_to_local test. All three create_backend call sites (lib.rs, acp_server.rs, core/engine.rs) were updated consistently for the dropped workspace parameter, and workspace remains used elsewhere in those functions (no unused-var/clippy risk). The new UnsupportedBackend correctly refuses execution for old/misspelled sandbox_backend values instead of silently falling back to local exec — matches the PR's stated intent and is a genuine safety improvement. run_subagent_in was cleanly folded back into run_subagent after the delegated-authority hooks (for_child/child_joined/child_context) were removed, and native_store_from_memory_path was correctly narrowed to private now that its only external caller (session_memory_notes) is gone.
  • Chrome row presets (posture_bar/metrics_line): the compact shed-ladder logic in phase_strip.rs/infoline.rs is internally consistent with the existing priority tables (COMPACT_SHED = SHED_COUNTS, segment.id.shed_priority() < SHED_BEFORE_HELP), and /config validation, persistence, and tests look correct.
  • Snapshot-prune fixture fix: deriving the prune cutoff from actual recorded timestamps (midpoint between the surviving/pruned pairs) instead of a fixed 6s window is a reasonable fix for the flake described in the commit message.
  • Locale parity: all 15 locale JSON files carry exactly the 13 new RedactionGate* keys and none retain the removed CmdShannonDescription key.
  • No provider/model-prefix inference issues found — nothing in this diff infers a provider/model switch from a wire-id prefix or freeform text; the sandbox-backend selection is explicit config only.

No blocking issues found. One very minor, non-blocking observation: redaction.rs's config_binding() reads file.metadata()?.modified() before reading the file body — a theoretical TOCTOU window if config.toml is edited between those two calls — but this is a local single-user security opt-out confirmation, not a trust boundary, so it's not worth extra complexity.

Nice attention to detail on the two-stage confirmation UX, the fail-closed receipt binding, and the thoroughness of the ShannonNet removal (docs, changelog, env vars, locales, tests all swept together).

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔵 Needs a closer look

It makes high-impact security-boundary and execution-backend behavior changes and still has at least one confirmed correctness issue to address before merge.

Pull request overview

This PR integrates several 0.9.13 release-bound changes (redaction opt-out, bottom chrome presets, config docs, test flake fix) while deferring/removing the experimental ShannonNet sandbox backend so legacy/unknown remote backend settings refuse shell execution rather than silently running locally.

Changes:

  • Add a gated, receipt-bound opt-out for model-bound tool-output redaction ([redaction] model_bound = "disabled") with a two-stage startup confirmation screen.
  • Add [tui].posture_bar / [tui].metrics_line row-size presets (full|compact|hidden) and /config wiring + tests.
  • Remove ShannonNet backend + /shannon command surface, and introduce an UnsupportedBackend that blocks execution for legacy/unknown sandbox_backend values.
File summaries
File Description
web/lib/changelog.generated.ts Changelog entries for redaction gate + chrome presets; removes ShannonNet items
docs/zh_hans/GUIDE.md Documents bottom chrome presets in zh-Hans guide
docs/SANDBOX.md Removes ShannonNet backend docs; states unsupported backends refuse execution
docs/GUIDE.md Documents bottom chrome presets in English guide
docs/CONFIGURATION.md Adds R1 budget key reference + model-bound redaction opt-out documentation
docs/ARCHITECTURE.md Removes ShannonNet backend mention from architecture listing
crates/tui/src/tui/work_surface/model.rs Updates test fixture strings away from ShannonNet path references
crates/tui/src/tui/ui/tests.rs Extends config fixtures with new chrome preset fields
crates/tui/src/tui/ui/frame/one_owner_tests.rs Adds frame layout tests for chrome row presets
crates/tui/src/tui/ui/frame.rs Implements compact/hidden behavior + cost/effort “honesty” rules + renders redaction gate
crates/tui/src/tui/ui/event_loop.rs Arms and handles the redaction startup gate; engine respawn after confirmation
crates/tui/src/tui/redaction_gate.rs New full-screen, two-stage confirmation UI for disabling model-bound masking
crates/tui/src/tui/phase_strip/tideline_tests.rs Adds compact posture bar behavior test
crates/tui/src/tui/phase_strip.rs Omits unprovable effort field; adds compact posture-bar ladder start
crates/tui/src/tui/mod.rs Exposes new redaction_gate module
crates/tui/src/tui/infoline/tests.rs Adds compact metrics-line shedding/hitbox parity test
crates/tui/src/tui/infoline.rs Adds compact metrics-line mode (pre-shed telemetry/help)
crates/tui/src/tui/app/init.rs Initializes new gate state + chrome preset fields from config
crates/tui/src/tui/app.rs Adds app state for gate + chrome presets; adds provable_reasoning_effort_label
crates/tui/src/tools/subagent/mod.rs Removes ShannonNet delegated-authority plumbing from subagent runtime
crates/tui/src/snapshot/repo.rs Fixes Windows flake by deriving prune cutoff from recorded timestamps
crates/tui/src/sandbox/shannon.rs Deletes ShannonNet sandbox backend implementation
crates/tui/src/sandbox/mod.rs Removes shannon module export
crates/tui/src/sandbox/backend.rs Adds UnsupportedBackend that refuses exec for unknown/legacy backends
crates/tui/src/localization.rs Adds RedactionGate message IDs; removes Shannon command message ID
crates/tui/src/lib.rs Updates sandbox backend creation call signature
crates/tui/src/core/engine.rs Updates sandbox backend creation call signature
crates/tui/src/config/tests.rs Adds parsing tests for chrome row presets
crates/tui/src/config.rs Adds chrome row preset config fields + redaction config plumbing; removes Shannon keys
crates/tui/src/commands/mod.rs Removes /shannon from command list
crates/tui/src/commands/groups/utility/shannon.rs Deletes /shannon implementation
crates/tui/src/commands/groups/utility/mod.rs Removes /shannon from utility command group
crates/tui/src/commands/groups/config/config.rs Adds /config support for posture_bar and metrics_line
crates/tui/src/commands/contract.rs Makes native_store_from_memory_path private (no longer re-exported)
crates/tui/src/client.rs Gates model-bound ToolResult redaction on confirmed opt-out; adds tests
crates/tui/src/acp_server.rs Updates sandbox backend creation call signature
crates/tui/locales/zh-Hant.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/zh-Hans.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/vi.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/uk.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/ru.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/pt-BR.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/ko.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/ja.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/id.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/hi.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/fr.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/es-419.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/en.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/de.json Adds redaction gate strings; removes Shannon command string
crates/tui/locales/ca.json Adds redaction gate strings; removes Shannon command string
crates/tui/CHANGELOG.md Updates TUI changelog entries for chrome presets + redaction; removes ShannonNet items
crates/config/src/redaction.rs New receipt-bound model-bound redaction opt-out implementation + tests
crates/config/src/lib.rs Adds [redaction] table to config schema and accessor
config.example.toml Documents [redaction] opt-out, chrome presets, and [goal] example
CHANGELOG.md Updates root changelog entries for chrome presets + redaction; removes ShannonNet items
Review details
  • Files reviewed: 56/56 changed files
  • Comments generated: 15
  • Review effort level: Lite

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread crates/config/src/redaction.rs Outdated
Comment on lines +249 to +252
let file = fs::File::open(path)?;
let modified = file.metadata()?.modified()?;
let mut body = String::new();
std::io::Read::read_to_string(&mut &file, &mut body)?;
Comment thread crates/tui/locales/ca.json Outdated
Comment thread crates/tui/locales/de.json Outdated
Comment thread crates/tui/locales/es-419.json Outdated
Comment thread crates/tui/locales/fr.json Outdated
Comment thread crates/tui/locales/ru.json Outdated
Comment thread crates/tui/locales/uk.json Outdated
Comment thread crates/tui/locales/vi.json Outdated
Comment thread crates/tui/locales/zh-Hans.json Outdated
Comment thread crates/tui/locales/zh-Hant.json Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 13c0f4ac29

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread crates/config/src/redaction.rs Outdated
Comment on lines +116 to +119
pub fn default_model_bound_state_path() -> Option<PathBuf> {
crate::default_config_path()
.ok()
.map(|path| path.with_file_name(MODEL_BOUND_STATE_FILE_NAME))

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Bind redaction receipts to the loaded config

When the documented --config option (crates/tui/src/lib.rs:226-228) or CODEWHALE_CONFIG_PATH selects another file, this still stores and validates the receipt against the default home config. Consequently, confirmation fails if only the selected config requests disabled masking; worse, an existing receipt for a disabled default config authorizes any selected config that requests disabled masking without binding the confirmation to that file. Pass the resolved config path into the receipt APIs rather than recomputing the default.

AGENTS.md reference: AGENTS.md:L28-L29

Useful? React with 👍 / 👎.

Comment on lines +711 to +715
// A `[redaction] model_bound = "disabled"` request lowers the model-bound
// masking boundary only after an explicit one-time confirmation on this
// startup gate. Arm the gate before the engine spawns so it owns the first
// screen; answering it rebuilds the engine with the confirmed mode.
app.redaction_gate = crate::tui::redaction_gate::confirmation_required(config);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Block initial dispatch until the gate is resolved

For an already-onboarded launch with auto-submitted initial input, run_tui calls submit_initial_input_if_ready before entering the event loop, and that helper checks onboarding but not app.redaction_gate. The first billable request can therefore start behind the confirmation screen, and confirming may subsequently shut down its engine. Defer initial submission until the user confirms or keeps masking enabled.

AGENTS.md reference: AGENTS.md:L28-L29

Useful? React with 👍 / 👎.

Comment thread crates/tui/src/tui/ui/event_loop.rs Outdated
Comment on lines +4814 to +4816
let _ = engine_handle.send(Op::Shutdown).await;
let engine_config = build_engine_config(app, config);
engine_handle = spawn_tui_engine(engine_config, config);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Resync history after rebuilding the engine

When this gate is confirmed while resuming a session, the original engine has already received app.api_messages through the startup Op::SyncSession, but the replacement engine is spawned without an equivalent sync. The transcript still displays the resumed conversation while the model's next turn starts with an empty history. Send the same session snapshot to the replacement before dismissing the gate.

Useful? React with 👍 / 👎.

Comment thread crates/tui/src/tui/ui/event_loop.rs Outdated
Comment on lines +4822 to +4824
app.status_message = Some(format!(
"Failed to record redaction confirmation: {err}"
));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Send gate notices through typed toasts

The confirmation-write error here and the Enter hint below add new writes to the legacy status_message sink, so these notices have no typed severity or lifetime and can overwrite unrelated status state. Route both through the toast API as required for new TUI notices.

AGENTS.md reference: crates/tui/AGENTS.md:L20-L21

Useful? React with 👍 / 👎.

Comment thread crates/tui/src/tui/redaction_gate.rs Outdated
Comment on lines +73 to +75
ActionHint::new(
"1/Y",
app.tr(MessageId::RedactionGateActionConfirm).to_string(),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Source gate key hints from the binding table

These literal 1/Y, 2/U, and 3/N hints duplicate the accepted keys in event_loop.rs; any key-routing change can therefore leave the footer advertising controls the gate no longer accepts. Define the gate actions in shell_key_routing and render their chords from that shared table.

AGENTS.md reference: crates/tui/AGENTS.md:L8-L13

Useful? React with 👍 / 👎.

Comment thread crates/tui/src/tui/redaction_gate.rs Outdated
}
}

fn screen_lines(app: &App, width: usize, _height: usize) -> Vec<Line<'static>> {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Keep the danger warning visible on short terminals

On compact terminals such as 40x12, the action footer leaves only a few body rows, but screen_lines ignores its height argument and returns the entire wrapped explanation. Paragraph then clips the tail: the first stage loses the risk/effect/rollback guidance, and the shorter second stage can still clip part of the red danger warning while its confirm action remains reachable. Use the available height to shed chrome or provide scrolling while keeping the security warning visible.

AGENTS.md reference: crates/tui/AGENTS.md:L22-L24

Useful? React with 👍 / 👎.

Comment thread CHANGELOG.md
Comment on lines +183 to +186
- Optional model-bound tool-output redaction opt-out, with two explicit startup
confirmations and a receipt bound to the readable config contents and
modification time. Unconfirmed requests keep masking enabled; routing and
stored goal summaries remain redacted (#5982, thanks @SparkofSpike).

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Preserve the harvested contributor trailer

This single-parent commit lands the model-bound redaction work from PR #5982 and explicitly credits @SparkofSpike here, but its commit message has neither the required Harvested from PR #5982 by @SparkofSpike line nor the canonical Co-authored-by trailer from .github/AUTHOR_MAP. A changelog thanks does not drive auto-close-harvested.yml or the contribution graph, so add the required mechanical credit before landing.

AGENTS.md reference: AGENTS.md:L201-L206

Useful? React with 👍 / 👎.

@codewhale-agent codewhale-agent Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Codewhale review

Integrates redaction opt-out, bottom chrome presets, snapshot prune fixture, and removes ShannonNet. Security-sensitive redaction is fail-closed and tested; removal of ShannonNet correctly refuses unsupported backends instead of local fallback.

Findings

  • [WARNING] Redaction receipt path ignores custom config paths (crates/config/src/redaction.rs)
    default_model_bound_state_path() and config_binding() always use crate::default_config_path(), so a Codewhale session started with --config/CODEWHALE_CONFIG cannot confirm or honor the [redaction] model_bound opt-out against the actual loaded file. record_model_bound_disabled_confirmation() will fail if the default config does not request disabled, or bind to the default config instead of the active one. This fails closed, but makes the feature unusable outside the default config location.
  • [INFO] Stale receipt is not swept on effective_masking(Enabled) (crates/config/src/redaction.rs)
    The doc comment on effective_masking says it sweeps a stale receipt when the desired mode is Enabled, but the function returns immediately for Enabled without touching the receipt. This is not a security issue because confirmed_for_current_request still invalidates stale receipts before honoring Disabled, but the documented cleanup behavior does not occur.

Assessment

The PR looks strong: the security boundary is fail-closed and tested, unsupported sandbox backends refuse execution, and cleanup is focused. The custom-config-path issue in redaction should be fixed before merging, but it does not introduce a security vulnerability.


Advisory review by Codewhale (codewhale review --pr 6002 --post, head 13c0f4ac2939e93b1eb1a485a5dffdd0bb571de7). Line-specific findings are also posted as inline review comments; mechanical fixes arrive as committable suggestions you can apply from the Files tab. CODEOWNERS approval still governs merge.

Preserve exact regional provider identity and saved automatic model selection,
round-trip configuration bundles without losing inactive provider preferences,
and validate custom defaults against their own route. Make tool-registry
lookup an optional fallback and safely upgrade untouched bundled guidance.
Give approvals one-use runtime identifiers with tool-call correlation for
snapshots and streams. Keep relay polling alive and record bounded provider
completion diagnostics without logging prompt content or changing limits.

Validation: joined approval/provider selection 350 passed, 0 failed;
provider/export/registry selection 96 passed, 0 failed; earlier bounded
diagnostics/poll/frame/CLI selection 14 passed, 0 failed. cargo fmt and git
diff --check passed. Full workspace gates, hosted CI, final signed artifacts
and customer workflows remain unverified on this candidate.
@cursor

cursor Bot commented Sep 9, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_d8988830-059b-4c97-bc68-ebf1913b9d1b)

@claude

claude Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Claude finished @Hmbown's task in 2m 42s —— View job


Review in progress

Since the last review pass on this thread (commit 13c0f4ac), the branch has grown by ~200 more commits and ~590 more changed files — nearly the entire diff. Running a focused pass over the newest, highest-risk work rather than re-covering ground already reviewed.

  • Gather context (CLAUDE.md/AGENTS.md, PR body, prior review threads)
  • Identify what changed since the last reviewed commit (13c0f4ac) — confirmed via git diff 13c0f4ac..HEAD
  • Provider/model/route identity safety (EPIC v0.8.65 EPIC: Separate provider facts, model facts, offerings, and route resolution #2608 invariant) — in progress (background agent)
  • OAuth/auth security (host trust, redirects, token expiry) — in progress (background agent)
  • Engine/turn-loop concurrency safety — in progress (background agent)
  • Fleet/task-store ownership & file I/O safety — in progress (background agent)
  • Plugin conversion & Computer Use safety — in progress (background agent)
  • Post final review summary

@Hmbown

Hmbown commented Sep 9, 2026

Copy link
Copy Markdown
Owner Author

0.9.13 integration update: the current tested candidate is c400fff841e52e751784a30c2e0b398929d711ed on the existing candidate branch. PR #6002 has not yet advanced to this candidate.

The exact candidate passed the complete local workspace gate: 15,330 passed, 0 failed, 21 skipped (1 slow, 0 leaky). CI-equivalent Clippy, warning-denied rustdoc, doctests (3 passed, 8 ignored), all 55 budget checks and version/platform contracts also passed. The latest repair preserves a resumed session's store binding on clean exit even when no model turn occurs; recovery checkpoints remain protected.

Exact-candidate platform builds and full CI are running. Their final results are still required.

Hands-on testing of installed predecessor c281d539de0e passed file-tool use, image input, shell cancellation, a new turn after cancellation, ordinary session resume and retained automation results. Those observations remain tied to that binary; the rebuilt c400 artifact needs its own final acceptance.

0.9.13 is not released yet. Final platform artifacts, integration review and publication remain pending. Contributor fixes and release evidence continue through this PR.

CodeWhale Bot added 15 commits September 8, 2026 17:52
Remove the automatic 200-step default from interactive and exec assembly, including Fleet subprocess omission. Keep explicit positive limits and independent wall-clock/stream protections. Interpret the compatibility sentinel as no ceiling at TurnContext, including soft landing, counter saturation and diagnostics. Stop the sample configuration from reinstalling an implicit cap.

Validation: targeted rustfmt check, git diff --check and config.example.toml parse passed. Independent 13-file source review found no remaining actionable defect. Rust compilation, tests and fail-before verification: UNRUN; 0 tests executed because native qualification belongs to the release integrator. Existing regression coverage now crosses 200 productive rounds and follows production Fleet arguments through CLI resolution.
(cherry picked from commit 8241bd6309631b560b5c6435b02320211e6ad0f4)
(cherry picked from commit 9aa01c811068343180d21cb85bf1d7d7a76b5e42)
Reuse the existing read-only shell parser for single-command numeric sed
inspection at the Fleet machine authority seam. Preserve explicit shell
grants, effective read-only policy, command denials, network ceilings, and
the parent approval/parallel classifier. Related to #6015; adaptive stall
detection and other grammar families remain outside this patch.

Extend the existing Fleet envelope regression with actual numeric sed output
on Unix and mutation/pipeline controls, and add canonical/legacy input,
lifecycle, approval, parallel, denial, and shell-less boundary assertions.

Validation: targeted rustfmt --check PASS; git diff --check PASS.
Native tests: UNRUN, 0 executed; exclusive Cargo/native ownership remains
with integrator 01a08120-eb20-7ae3-be9c-edfbe2aa52fa. Regression fail-before
execution: UNRUN. Root npm test/check:web scripts are absent in this Core
checkout; no npm gate claimed. CI, packaged runtime and release: UNRUN.

(cherry picked from commit e093d621b3171a5dd5751f2b20cc538af8848f43)
Use Syntect embedded syntax/theme assets with the existing fancy-regex
backend. Remove unused YAML/plist/HTML loader features and the three
now-unreferenced lock packages. Preserve versions and checksums of every
retained package.

Remove advisory ignores for four crates already absent from the lock and
for yaml-rust removed by this change. Keep only the existing cargo-deny
bincode maintenance exception with current consumer and retirement notes;
cargo-audit ignores are now empty.

Validation: independent five-file source review, TOML parsing, exact lock
graph comparison, and git diff --check passed. Lock pruning is mechanical;
Cargo resolver acceptance, locked compilation, renderer tests and fresh
audit/deny qualification remain UNRUN in the release owner's native lane.
This does not resolve separate Apps/GTK or GLib qualification.

(cherry picked from commit 0e9911378358a44e75e3fc1789417bec635f1c36)
Runtime completion receipts carry worker_status, while metrics defaulted a
missing legacy success boolean to true. Failed, cancelled, interrupted and
budget-exhausted workers therefore appeared successful; terminal-only
windows could also show no data.

Use one outcome reader for audit and Runtime receipts, preserve explicit
unknown outcomes, retain legacy boolean compatibility, and display separate
receipt outcome counts. Do not infer success from the enclosing item's
completed status or show a percentage over incomplete receipts.

Related to #6011; this does not complete its global stats, token/cost/tool
or Fleet analytics requirements. Three reader regressions cover current
producer-shaped payloads, unknown/future data, legacy compatibility and
terminal-only display. All three and native compilation are UNRUN in this
supporting lane. Source review, rustfmt --check and git diff --check pass.

(cherry picked from commit 37160cdd311f0e78d47b8bf2d47a9086fed8091f)
Remove the obsolete claim that the model-facing agent schema advertises
max_depth with a ceiling of three. Model calls inherit Runtime depth;
legacy/parser aliases remain supported and values above eight are rejected.
Distinguish Workflow IR nesting from child delegation and identify its
five-node limit as the default in both English and Chinese.

Validation: compared current schema/parser, config constants, WorkflowFleetLimits
and the English guide. git diff --check passed. Documentation only; no runtime
behavior, tests, provider calls, CI or release operations changed.

(cherry picked from commit 2d08f11f1d27a9fba2f76738635a2484f9316f9d)
Plugin trust-review responses now reuse the structural URL sanitizer so
userinfo, path, queries, fragments and malformed input do not reach API
clients. The bundle configuration and hash-bound trust receipt are unchanged.
Preserve IPv6 brackets already supplied by Url::host_str in that sanitizer.

Remove literal name placeholders from review guidance and assert the
existing marketplace add test receives CREATED before decoding its response.
Correct the marketplace loader comment.

Addresses source findings from PR #5842. Added one projection regression
and expanded the existing sanitizer case. Author source review, rustfmt and
git diff --check pass. Native compilation and test execution are UNRUN;
the primary release integrator retains that qualification ownership.

(cherry picked from commit 7b6a867b5d88ae76fa0c69ba86be925a9e7184b7)
Make the snapshot retention fixture reject a gap shorter than its intended
eight seconds and fail explicitly when its cutoff is not in the past.
This clarifies fixture failures; it does not eliminate wall-clock scheduling
risk or qualify Windows behavior.

Document lowercase TOML row presets in both guides, distinguish the metrics
cost formatter from the detailed /cost report, and resolve the two public
account-entry comments to one unambiguous source-asset definition.

Addresses review feedback on PRs #5990, #5973 and #5861. Source review,
comment-only checks, rustfmt and git diff --check pass. No new tests; the
modified snapshot regression is UNRUN under primary native-build ownership.
No product runtime implementation, visual assets or changelogs changed.

(cherry picked from commit 4c6f176fe7e90abb308782a22a25e31e0d341473)
Hosted Lint on a7c0fb4 reported production items after route_preferences'
test module and six stderr prints in frame acceptance tests. Move the test
module to file end without changing its contents or production functions.
Keep frame capture output as acceptance evidence with a narrowly scoped
test-only print_stderr allowance; the production TUI deny remains intact.

Place the new plugin review regression module at file end as well, before
it can produce the same lint when the support stack is integrated.

Source checks confirm both module moves preserve all items. rustfmt and
git diff --check pass. Cargo/clippy/native execution remain UNRUN under
the primary release integrator's ownership. This is not a hosted CI pass.
The a7c0fb4 Windows job failed before compiling: sccache panicked resolving
its configuration directory during rustc -vV under the hermetic test home.
Set an empty RUSTC_WRAPPER for Windows nextest and doctest invocations only.
Other platforms retain their configured wrapper.

The full workspace/all-features/locked test commands, hermetic home and
stack size remain unchanged. This bypasses an optional build accelerator;
it does not skip tests or restore the runner's real user home.

Validation: actionlint and git diff --check pass. Parsed before/after YAML
confirms only the two wrapper environment entries changed. Actual Windows
CI execution remains pending with the primary integrator. No remote retry.
Correct the existing RedactionGateActionQuit label in fourteen locale packs
from CodeWhale to Codewhale. Preserve each translation, key and placeholder.
This addresses the fourteen corresponding PR6002 review comments without
changing security-gate behavior or compatibility identifiers.

Validation: all edited JSON parses; exact key/value comparison confirms only
that product spelling changed. git diff --check passes. No new tests or
native run for a proper-name correction.
Expand home-relative file paths through existing workspace and credential guards. Raise the uncatalogued output allowance while honoring explicit route and context limits. Stop promoting conversational prompts to persistent goals by word count and make startup recovery guidance readable.

Validation: 212 selected Rust regressions passed, 0 failed, 12291 unselected; cargo fmt and git diff --check passed. Full workspace, hosted CI and packaged/live qualification remain pending.
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
…migration

Validate the selected provider model before a retained root fallback and preserve exact route declarations. Reject malformed legacy settings before committing a migration receipt or route change. Strengthen the existing persistence and provider-switch regressions, including unchanged inactive preferences and the reloaded route.

Align command and bundled-generation fixtures with current product behavior, isolate the golden value-edit fixture after migration, and construct restart options from Config as the real launcher does.

Validation: source review, rustfmt on six changed Rust files, git diff --check, authored catalog generation-only comparison, and preserved generation-10 body comparison passed. Native compilation, seven focused tests and hosted CI on this commit remain UNRUN; native execution belongs to the primary release integrator.
Give the redaction consent gate exclusive focus in the existing shell binding table. Read its three choice hints and scroll hint from that table and use the same key admission in the event loop. Modified letters cannot count as consent; Enter stays non-confirming. Preserve the two-stage decision, receipt writer and engine replacement paths.

Extend focus/composer admission coverage and add a regression for explicit choices, modifiers and exclusive gate scope. Consent choices remain advertised on the gate rather than in global shortcut help.

Validation: author source review, rustfmt on six files, git diff --check and exact comparisons of confirmation/keep transitions, body rendering and receipt writer passed. Native compile/tests and PTY acceptance remain UNRUN with the primary release integrator. Short-terminal warning visibility remains separate acceptance work.
Remove the Buildkite-only pipeline and step scripts after repository webhook removal and pipeline archival. Keep GitHub Actions, generic CI detection, and existing test coverage intact.

Validation: hermetic test-home checks 8 passed, 0 failed; shell syntax and diff checks passed. No Rust product implementation changed in this commit. Hosted CI and release readiness remain separate.
@cursor

cursor Bot commented Sep 9, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_2230a008-1a41-416d-93bd-f78432dcd499)

@claude

claude Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Claude finished @Hmbown's task in 2m 28s —— View job


Review: delta since last pass (13c0f4ac → current HEAD)

Todo list

  • Gather context (CLAUDE.md/AGENTS.md, PR body, prior review threads)
  • Identify what changed since the last reviewed commit — only 2 commits ahead of the previously-reviewed a7c0fb46e: 45a8b088 (product fix) and 19f8ebff (CI-only, Buildkite pipeline removal)
  • Correctness bugs in the new commits
  • Provider/model/route safety check (EPIC v0.8.65 EPIC: Separate provider facts, model facts, offerings, and route resolution #2608 invariant)
  • Reuse/simplification/dead-code check
  • Test coverage check
  • Security check (secrets, shell/exec policy, input validation)
  • Post final review summary

Summary

This PR has already been reviewed in depth across many earlier passes on this thread (redaction opt-out, ShannonNet removal, chrome presets, cloud_facts, notifications.rs, provider catalog/routing, CodeQL alerts). Since then the branch only gained two commits, both addressing the exact regressions Hmbown's own update comment called out ("an unknown-model output allowance truncating a tool call" and "home-relative file paths being treated as workspace paths"). I reviewed both directly rather than trusting the commit messages.

45a8b088 — tool paths and Operate goal promotion

  • Home-relative (~/) path resolution (crates/tui/src/tools/spec.rs::resolve_home_path): correctly scoped to exact ~ / ~/ (and ~\ on Windows) prefixes only — ~otheruser, $HOME, `whoami`, globs, and ./~/literal all stay unexpanded (verified by test_resolve_home_path_exact_prefixes and test_tool_context_resolve_path_no_shell_expansion). The Windows drive-prefix guard (~/C:\file) is a good catch of a PathBuf::join footgun. Reuses the existing resolve_path workspace-escape/is_trusted_external_path gate — a ~/-rooted path outside the workspace still hits ToolError::PathEscape unless it's under an explicitly trusted external root, and enforce_read_denylist/is_codewhale_credential_path are threaded through the raw pre-resolution string in crates/tui/src/tools/file.rs, so ~/.codewhale/config.toml is still denied even in trust mode (read_file_denies_home_credential_path). No new module, no bypass of the existing security boundary — this is rung-2 reuse done right.
  • Uncatalogued output-token fallback (crates/tui/src/route_budget.rs): raising UNCATALOGUED_COMPAT_MAX_OUTPUT_TOKENS from a fixed 8,192 to API_MAX_OUTPUT_TOKENS, with a narrow added branch that only lets an explicit CODEWHALE_MAX_OUTPUT_TOKENS-style override exceed the uncatalogued guess when there's no concrete route cap. The final ContextBudget::new(...).output_cap_tokens clamp still applies unconditionally in every branch, so this can't push a request cap past the actual context window regardless of the override. Known compatibility/route caps are still intersected exactly as before.
  • operate_goal_from_prompt (crates/tui/src/tools/goal.rs): dropping the word-count-based auto-promotion in favor of "direct work instruction only" is a real behavior narrowing, not just a threshold tweak, and it's paired with operate_does_not_promote_conversation_by_length_or_quoted_commands plus an core/engine/tests.rs end-to-end version covering English/Chinese conversational followups and quoted-command inputs. Good test-to-change ratio.
  • No provider/model-prefix inference touched by this commit — out of scope for EPIC v0.8.65 EPIC: Separate provider facts, model facts, offerings, and route resolution #2608 here.

19f8ebff — Buildkite retirement

Deletes .buildkite/** and the two doc/gitignore references to it. Swept the tree for lingering references: the remaining "BUILDKITE" hits (crates/release/src/check.rs, crates/cloud-facts/src/lib.rs, docs/CONFIGURATION.md) are generic "detect any CI vendor by env var" lists, not dead references to the deleted pipeline — consistent with the commit's stated "keep generic CI detection intact."

No correctness, route-safety, reuse, or security issues found in either commit.

Still open (pre-existing, unrelated to this delta, carried from earlier passes on this thread):

  • 14 non-English locale files (crates/tui/locales/{ca,de,es-419,fr,hi,id,ja,ko,pt-BR,ru,uk,vi,zh-Hans,zh-Hant}.json) still render "...CodeWhale" instead of Codewhale in the RedactionGate* strings — cosmetic, not a merge blocker.
  • The redaction gate's 1/Y/2/U/3/N key hints in crates/tui/src/tui/redaction_gate.rs are still literal strings duplicated against the key-matching logic in event_loop.rs — low-risk, non-correctness.

CodeWhale Bot added 6 commits September 8, 2026 19:00
Keep outgoing provider models when switching routes and refuse one-way preference migration from unreadable settings. Refresh current command/catalog fixtures and preserve lint-clean diagnostic tests.

Validation: all-feature focused Rust regressions 63 passed, 0 failed (12456 unselected); full workspace all-target/all-feature Clippy passed with CI warning policy. Earlier default-feature selection 58 passed; corrected all-feature run includes the four command-surface acceptance cases. Hosted CI and packaged acceptance remain separate.
Split oversized text file diffs only at whole hunk boundaries, repeat file headers, and verify byte-for-byte reconstruction before any provider request. Preserve raw binary evidence and fail before execution when the complete plan cannot fit the configured pass budget.

Validation: cargo nextest focused review and review_pr tests: 41 passed, 0 failed, 12467 unselected. git diff --check passed. Hosted CI and full workspace gates have not run on this commit.
Preserve the recovered contributor commits while resolving config migration, provider selection, restart and test-module conflicts. API and CLI provider writes share root-alias reconciliation; a legacy custom switch that cannot preserve a reloadable configuration fails atomically without changing saved state. Reconcile the pruned lockfile dependency closure.

Validation on the merged source: 79 focused all-feature TUI tests passed, 0 failed, 12457 unselected; cargo fmt and git diff --check passed. Full joined workspace, hosted CI, packaged artifacts and customer acceptance remain separate pending gates.
Join the reconciled support branch with lossless PR hunk handling. Support source passed 79 focused all-feature tests, 0 failures; review source passed 41 tests, 0 failures. Full tests on this merged candidate remain pending.
Keep unknown model metadata separate from the automatic output allowance already covered by route_budget tests. Require visible startup-hold guidance without depending on its capitalization, preserving all byte-retention and deliberate-second-Enter assertions. Include terminal size and submit delay in the existing offline queue failure label without changing timing or inputs.

Validation: rustfmt, git diff --check, unchanged PTY behavior source comparison, and read-only application on the primary dirty19f8 candidate passed. Native compilation, the two unit regressions, six-case PTY acceptance and hosted CI remain UNRUN and primary-owned.
Signed-off-by: CodeWhale Bot <bot@codewhale.net>
Translate Git Bash homes for native tools while retaining POSIX PATH semantics, provision isolated AppData folders, and keep cleanup bound to the original temporary path. Recovered Gemini donor reviewed and corrected by the coordinator.

Validation: 9 hermetic-home shell tests and 22 dev-cache shell tests passed, 0 failures. These offline path fixtures do not prove execution on a native Windows runner; hosted Windows acceptance remains pending.
@cursor

cursor Bot commented Sep 9, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit.

A user or team admin can review and increase usage limits in the Cursor dashboard.

(requestId: serverGenReqId_20a580d6-1e3f-4822-9ddb-93933f9df282)

@claude

claude Bot commented Sep 9, 2026

Copy link
Copy Markdown
Contributor

Claude finished @Hmbown's task in 1m 9s —— View job


Review in progress

New commits landed since the last reviewed HEAD (19f8ebff). Running a focused pass over just the delta.

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.

6 participants