Integrate Codewhale 0.9.13 contributor fixes and release verification - #6002
Integrate Codewhale 0.9.13 contributor fixes and release verification#6002Hmbown wants to merge 234 commits into
Conversation
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>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
Bugbot couldn't run - usage limit reachedBugbot 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 finished @Hmbown's task in 2m 42s —— View job Review: Integrate 0.9.13 PRs and defer ShannonNet executionTodo list
(Could not run SummaryThis is a clean, well-executed integration. I did not find correctness bugs or safety issues. Highlights:
No blocking issues found. One very minor, non-blocking observation: 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). |
There was a problem hiding this comment.
🔵 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_linerow-size presets (full|compact|hidden) and/configwiring + tests. - Remove ShannonNet backend +
/shannoncommand surface, and introduce anUnsupportedBackendthat blocks execution for legacy/unknownsandbox_backendvalues.
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.
| 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)?; |
There was a problem hiding this comment.
💡 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".
| 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)) |
There was a problem hiding this comment.
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 👍 / 👎.
| // 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); |
There was a problem hiding this comment.
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 👍 / 👎.
| let _ = engine_handle.send(Op::Shutdown).await; | ||
| let engine_config = build_engine_config(app, config); | ||
| engine_handle = spawn_tui_engine(engine_config, config); |
There was a problem hiding this comment.
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 👍 / 👎.
| app.status_message = Some(format!( | ||
| "Failed to record redaction confirmation: {err}" | ||
| )); |
There was a problem hiding this comment.
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 👍 / 👎.
| ActionHint::new( | ||
| "1/Y", | ||
| app.tr(MessageId::RedactionGateActionConfirm).to_string(), |
There was a problem hiding this comment.
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 👍 / 👎.
| } | ||
| } | ||
|
|
||
| fn screen_lines(app: &App, width: usize, _height: usize) -> Vec<Line<'static>> { |
There was a problem hiding this comment.
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 👍 / 👎.
| - 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). |
There was a problem hiding this comment.
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 👍 / 👎.
There was a problem hiding this comment.
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.
Bugbot couldn't run - usage limit reachedBugbot 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 finished @Hmbown's task in 2m 42s —— View job Review in progressSince the last review pass on this thread (commit
|
|
Release-candidate progress (September 9):
The contributor implementations are incorporated in candidate source with provenance retained. Final integration review and PR disposition remain open. These candidate checks do not claim this PR's final head is approved or that |
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.
Bugbot couldn't run - usage limit reachedBugbot 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 finished @Hmbown's task in 2m 28s —— View job Review: delta since last pass (
|
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.
Bugbot couldn't run - usage limit reachedBugbot 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 finished @Hmbown's task in 1m 9s —— View job Review in progressNew commits landed since the last reviewed HEAD (
|

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:
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.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.Hosted evidence for the preceding
8fbdc5fchead: 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 cratecodewhale-cloud-factswith 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/nextestinvocations in CI, release, and CNB now run throughscripts/with-hermetic-test-home.sh, with workflow tests enforcing that contract; CNB tag builds callcheck-versions.sh --require-dated-releasebefore compile. Other gates add VS Codenpm run package, a Homebrewdepends_on "node", Windows test steps that disable sccache under the isolated home, and.gitguardian.ymlignoring the public test signing-key fixture..github/workflows/codewhale-review.ymlis tightened: model/App secrets and trusted builds only on same-repo PRs, pinned checkout and PR object fetch,CODEWHALE_API_KEYvia the codewhale account relay (no vendor key overwrite), plus--max-chars/--max-passesand 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.