| Files | Last commit | Last update |
|---|---|---|
fix(engine): serialize worker admission and persist terminal receipts [skip ci] CW-6944 D02-01/D02-10: publish one revisioned format3 worker authority under a short OS transaction lock, preserve foreign records/claims and fence stale per-writer checkpoints. Keep exact legacy recovery bytes and a tombstone against the inspected old publisher. Retain pending terminal results and live ownership until durable publication; retry the exact winner and report failed delivery explicitly. Fleet reservations retain previous-attempt uncertainty until exact teardown or an authoritative receipt. Final stream tails, usage and the terminal receipt share the existing atomic ledger record; failed sync retries do not duplicate accounting. Carry the same executor and manager lock through bounded owner work, and migrate all callers. Update existing fixtures for the real transaction/provenance contract; no new repository test cases. Correct architecture and both changelogs. Read-only peer review checked the final source and ownership boundaries. Verified at base b8c541792718051f20d3d91a7802256b84014783 plus patch 116d80bad7a2bb58d68b6ecda05c5566f9673c14de970d1da623ff86db7f54a7; 2312 source inputs unchanged through builds and observations. Ordinary CLI build and Engine/TUI unit-binary build passed; 77 existing Engine + 4 TUI checks passed. 24 ordinary public-API native macOS process/fault/restart observations passed, plus 2 ordinary CLI RLM/handle_read synthetic-model journeys. Prior failed revisions remain in the local receipts. Existing blocking budget and changed-file formatting/diff checks passed. The macOS linker retains its __eh_frame size warning. Native observations use synthetic state/fake children with no provider/network; SIGKILL is not power-loss proof. Legacy admitted attempts without actual settlement fail closed. Native Windows, installed packages, hosted final CI, providers and release qualification remain separate. CW-6945 retry/replay policy and the wider 0.10.3 plan stay open; no publication. | 6 days ago | |
docs(contributors): refresh the wall to 421 people and 393 accounts scripts/contributor-wall.py refresh rebuilds the record from git history, the CHANGELOG, docs/CONTRIBUTORS.md and the GitHub API; it was last run on 2026-10-17 and had missed the work credited since, including this release's reporters. 417 -> 421 people, 390 -> 393 GitHub accounts, 31 -> 32 unlinked commit names. The rendered wall and docs/assets/contributors.png follow the data, and web/data/agent-docs.generated.json plus web/lib/facts.generated.ts are regenerated because docs/CONTRIBUTORS.md is one of their sources. Verification: check-contributor-credit.py OK (every contributor in the window is credited on all three surfaces); check-facts.mjs OK. | 16 days ago | |
chore(web): record v0.10.2 as the published release Written by release.yml sync-release-record after v0.10.2 published. Gates run in the job: sync-latest-release --check, check-cloud-facts, check-facts. | 14 days ago | |
refactor(engine): extract the shared runtime from the TUI [skip ci] Move the Engine band, extension host, fixtures and shared test support into codewhale-engine; wire TUI/CLI to that owner. Preserve human-decision construction boundaries and lower reusable test helpers. Remove unused copied dependencies and repair path-based guards, scripts and crate maps. Correct the blocking scanner external-module scope leak; raised counts equal the corrected pre-move source. Refresh embedded built-in hashes after path-only bundle regeneration. Restore the provider-free prompt budget to the exact pre-b984e31290 macOS bytes and representative identities; tool catalogs are unchanged. Portable prompt-fixture pinning remains follow-up work. Local validation: Engine/TUI/CLI clippy --tests --no-deps -D warnings passed with the existing allow-list; production CLI check passed; fmt passed. Focused native run: 705 passed / 83 failed initially; after hash/path repairs, 81 affected cases plus 2 existing build-relocation cases passed (83/83). Thus 786/788 original cases pass; 2 compiled-release-image cases lack input and are not qualified. Frozen input inventories unchanged. macOS test-link unwind-table warnings remain. Four metric tests pass; all 55 budgets pass. Host Node: 413 pass, 7 skip; Bun: 414 pass, 6 skip. Existing scanner checks: 34 + 33 pass. Compiled-delivery synthetic fixtures: 7 pass. Web: 42 pass. Import, blocking, dead-code, coarse-map, version and facts checks pass. CW-7701. No hosted CI, provider call, release build or publication. Stage A part 2 and the old App Server/ratatui dependencies remain separate. | 7 days ago | |
feat(engine): eager sub-agents and goals by default, with clearer tool text The founder-approved 0.10.3 batch from artifacts/eager-delegation-20261107/FINAL-CHANGES.md, all ten items. This is one declared re-pin of the session-pinned prefix (docs/CACHE.md): BASE_PROMPT and several eager tool descriptions change on upgrade, and nothing changes mid-session. 1. BASE_PROMPT gains "Delegation and goals". Independent parts of a request go to agent children started together in one message. Results arrive on their own, so never poll or sleep, and end the turn when only waiting remains. Each child gets a complete prompt and a disjoint file scope; the parent inspects a write-capable child's evidence, reviews the final diff and runs the checks. An independent reviewer tries to refute a non-trivial change before it is called done. create_goal is for any direct request, in any language, that describes a verifiable end state needing more than one turn. A goal is blocked only when the same concrete obstacle persists; difficulty is not blocked. Cost alone is not a reason to stop, and only limits the user or configuration sets apply. The scope line keeps express authorization for spending real money (purchases, paid providers, billing) and adds the founder-approved sentence "Sub-agents, workflows and goals within the current request are in scope." GOAL_CONTINUATION_PROMPT drops the stale tool_search sentence (update_goal is eager), asks for remaining independent work to be split across agent workers before the next verification pass, and uses the same blocked rule. 2. The engine no longer appends the Operate contract (record_mode_context). Its reviewer, cost and write-child-evidence lines now live in BASE_PROMPT for every session. Every saved wording stays recognized, so restored sessions replay it as internal state and compaction still keeps it. 3. The agent start receipt carries next: "Results arrive automatically; continue other work or end your turn." 4. The agent description leads with intent ("Delegate focused work and keep working. Start early; one agent per independent part, same message."), gives one trigger per role, adds a child-prompt brief with one worked example, names workflow and Run as the real tools, and drops the "In Operate" and "Legacy action=" sentences. The schema is unchanged. 5. create_goal, its token_budget property and update_goal (description and status property) say when to start a goal and what complete, blocked and yield mean, without judge jargon. The status enum and parser are unchanged, and the token_budget parameter stays. 6. The bundled goals skill (personal resolutions in goals.md) becomes personal-goals with aliases-for: goals, so saved references still resolve and the skills index no longer reads like goal mode. It keeps the generation-12 introduction, so a user who deleted goals does not get it back. On upgrade, an untouched goals copy (a shipped body by hash, SKILL.md its only entry, and no personal-goals directory yet) is renamed to personal-goals and then refreshed by the ordinary generation-20 upgrade, because its body hash is listed under personal-goals. An edited or extended copy stays where it is. Known limitation: a [skills.bundled] entry that names "goals" now reports as unknown and does not apply to personal-goals. delegate no longer forbids delegating final verification and treats the roster as optional; best-of-n uses the general and implement roles and drops "In Operate mode" and the 16-worker figure. v4-best-practices is not changed: it is a cfg(test) v4 migration fixture, not a bundled skill, so editing it would falsify the fixture and reach no user. 7. The tasks schema stops advertising mode=operate; the hidden legacy alias schema and the free-string parser still accept it. harness no longer names the hidden rlm tool (description and overview), list_dir loses its harness meta sentence, and TOOL_SURFACE.md (and zh_hans) drop Operate. goal.rs's Run action="verifiers" names a real deferred tool, which a well-formed first call activates, so it stays. 8. Workflow max_concurrent defaults to 64 (was 16), matching sub-agents. The workflow-js per-run clamp WORKFLOW_MAX_CONCURRENT moves from 16 to 128, the sub-agent hard maximum; without it the clamp would have kept every run at 16 and explicit configs above 16 would not take effect. No spend caps are added, and the high-budget approval trigger is untouched because the default token budget is 0. Docs and config.example.toml follow. 9. Each child's task message ends with its name, its scope (read-only, or may edit files within its assignment) and "Your final answer is delivered to the parent automatically; include the result and its evidence." This is the child seed built by the runner in subagent/engine.rs, beside the role prompt that carries SUBAGENT_OUTPUT_FORMAT; the role prompts that children share are unchanged. 10. tool_search lists the commonly registered deferred groups (Git, Run, Web, tasks, github, automation, lsp, review, session_search, terminal/*, apply_patch, grep_files, MCP) and says a listed tool can be called by name. Memory tools are opt-in, so they are not listed. Generating the list from the live catalog is the next-patch item. Bytes and cache: - /preview-request before, installed 0.10.3 (7b8a634, catalog-equivalent to main) on macOS with an isolated offline HOME: tool schemas 40,854 canonical JSON bytes, system 16,662, base prompt 3,336, 18 active of 59. - /preview-request after, a debug build of this diff on Linux (Boat farm) with the same isolated offline HOME and prompt: tool schemas 40,173 canonical JSON bytes (-681, eager bytes did not grow), base prompt 4,352 bytes. - Source delta on eager tool schemas: -681 bytes (agent 2,370 -> 1,737, create_goal -244, update_goal -129, tool_search 71 -> 396). BASE_PROMPT grows to 4,352 bytes in the system region. Tests changed with the behavior: prompts.rs universal_prompt_does_not_expose_control_plane_ceremony no longer forbids "sub-agent" and "dispatch, join" (the founder reversed that decision) and still forbids sentinel and runtime-event jargon; the deleted agent_tool_description_states_the_operate_child_approval_rule pinned the dropped Operate sentence; the tasks enum test, the workflow default tests, the Operate probes (now 0 contracts) and the delegate generation-18 reconstruction chain follow; the skills fixture moves to generation 20, with the old delegate and best-of-n bodies and the old goals body (under personal-goals) listed by hash. The prompt and event conformance goldens are re-recorded for the re-pin. Verified on the Boat farm (Linux x86_64), base 4c5426f9/f0fb6adb plus only this diff (engine.rs, subagent/mod.rs, subagent/tests.rs, tasks.rs and config.example.toml shipped as HEAD plus this batch's hunks): - cargo test -p codewhale-engine --lib, focused filters (prompts, goal, tasks, harness, canonical actions, agent description and parent surface ceiling, lifecycle, launch receipt, assignment prompt, limits, compaction last round, tool catalog, runtime handoff, registry, workflow): 533 passed, 0 failed. The final state on base f0fb6adb, same filters plus core::engine::tests::operate_ and mode_notice: 539 passed, 1 failed. The failure, create_mode_enum_advertises_neither_operate_nor_yolo, came from the farm copy of tasks.rs missing this commit's third hunk; the first run carried exactly the committed tasks.rs, and the test passed. - cargo test -p codewhale-skills: 182 passed, 0 failed, on the final rename migration; a throwaway migration check (not committed) covering untouched, edited, extended, deleted and fresh installs: 5 passed. - cargo test -p codewhale-config --lib workflow_config: 3 passed; cargo test -p codewhale-workflow-js: 12 + 82 passed. - cargo test -p codewhale-tui --lib conformance::prompt:: conformance::events::, update pass then compare pass: 5 passed each; the re-recorded goldens come from that run on base cd7f5b32 (conformance tool schemas 19,840 -> 19,792 bytes, system +1,033 bytes, matching the source delta); nothing that landed since touches the surfaces they capture. - cargo clippy -p codewhale-engine -p codewhale-skills -p codewhale-config -p codewhale-workflow-js --all-targets --all-features with the Lint job's flags: clean; skills clippy re-run on the final migration: clean. Local: rustfmt clean on every touched file; scripts/preflight.sh --check passes except the blocking-calls budget, which fails only on another session's untracked crates/engine/src/session_image_prune.rs (4 > 0), not part of this commit; dead-code budget 137 of 137. Not verified: a macOS run of the after binary (the before figure is macOS, the after figure Linux; the measured -681 equals the source delta), any live provider turn, and DSH's sleep/poll probe on the target models. Refs: CW-7852 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 8 hours ago | |
chore(deps): bump zod Bumps the npm_and_yarn group with 1 update in the /docs/examples/whalenet-reuse directory: [zod](https://github.com/colinhacks/zod). Updates zod from 4.2.1 to 4.6.7 - [Release notes](https://github.com/colinhacks/zod/releases) - [Commits](https://github.com/colinhacks/zod/compare/v4.2.1...v4.6.7) --- updated-dependencies: - dependency-name: zod dependency-version: 4.6.7 dependency-type: direct:production dependency-group: npm_and_yarn ... Signed-off-by: dependabot[bot] <support@github.com> | 15 days ago | |
feat(permissions): Ask asks before every edit; add Accept Edits [skip ci] Ask ( suggest) now opens a card for file edits inside the workspace too, as its name, the Plan handoff copy ("Edits and commands ask you first") and the founder-agreed model (2026-11-07, modeled on Claude Code's permission modes) promise. CW-7663 found that the desktop edit card could not appear with default settings because Ask ran in-repository writes unasked. The #5185 in-workspace write carve-out moves to a new posture, Accept Edits (ApprovalMode::AcceptEdits; settings and config.toml accept-edits, Runtime wire accept_edits), between Ask and Auto-Review: an edit whose every target stays inside the workspace git work tree runs without a card; .git, .codewhale, .env*, credential and key files, folders without git, commands, network and MCP actions ask exactly as in Ask. Everywhere else Accept Edits is an asking posture (ApprovalMode::is_ask_family): repo-law asks, sandbox escalation and Computer Use consent open a card; remembered grants treat it as Ask; non-authoritative provenance narrows it to Ask with a recorded narrowing event; live-authority narrowing ranks it between Ask and Auto-Review. - Shift+Tab: Ask -> Accept Edits -> Auto-Review -> Full Access. - Settings schema rows (permission_posture, approval_mode, approval_policy), /permissions, /status, /config, the Plan handoff ("Work (Accept Edits)"), footer chip and help strings; 7 new and 3 updated strings in all 15 locale packs. - config.toml approval_policy = "accept-edits"; a project file may only tighten: auto < accept-edits < on-request < never. - ACP runs Accept Edits as Ask, because ACP turns never apply the carve-out. - /import-claude maps Claude Code's acceptEdits to Accept Edits. - Docs: MODES, KEYBINDINGS, CONFIGURATION, INSTALL, GUIDE, README and its 18 translations (restamped), zh_hans mirrors, features.toml row, CHANGELOG entry, regenerated web/data/agent-docs.generated.json. Stated limits: write-capable workers keep #5186's in-folder edits under Ask (their spawn card is the consent); modes, Tab and Operate are unchanged pending the founder's answers to the modes/postures design (CW/artifacts/modes-postures-20261107/DESIGN.md D1-D4; Operate in CW-7849). Verification (shared checkout, source b3d18fe6bc plus this diff): - scripts/dev-cargo.sh test --locked --offline -j6, focused filters (approval_mode, posture, permission*, carve_out, authority::, protocol_parity, repo_law, sandbox_escalation, computer_use, narrow, approval_request, runtime_policy, project_config, settings_schema, plan_handoff, import_claude, file_edit_card, config_choice, keybinding, locale parity): codewhale-engine lib 263 passed, 0 failed; codewhale-tui lib 103 passed, 0 failed; codewhale-app-server lib 13 passed, 0 failed; codewhale-config 35 passed; codewhale-runtime 20 passed; codewhale-localization 15 passed; codewhale-execpolicy 12 passed; all 0 failed. Includes write_carve_out_posture_is_exactly_ accept_edits, workspace_write_carve_out_covers_accept_edits_only, file_write_card_names_the_missing_repository..., permission_cycle_is_a_ closed_loop..., cycle_approval_scenario, permission_postures_persist_ across_restart, shift_tab_migrates_user_root_policy..., plan handoff locale test, file_edit_card_says_when_it_asks_for_lack_of_a_git_repo. - codewhale-tui --test feature_registry: this row passes; the run fails only on another session's uncommitted clipboard-image-prune row, which this commit does not contain. - rustfmt --check on every touched .rs file; check-tui-locale-parity PASS (2823 keys x 15 packs); check-tui-product-vocabulary exit 0; check-readme-translations OK (18, stamp 20d0bb7c0784); check-readme-locales PASS; check-versions OK; check-dead-code-budget PASS (137). check-blocking-calls-budget fails only on another session's untracked crates/engine/src/session_image_prune.rs (not in this commit). - Not run: a live desktop/TUI turn showing the edit card (CW-7663's App acceptance); full workspace suites (final release validation owns them). Tests ran on the shared working tree, which also held other sessions' uncommitted edits; this commit stages only this slice's hunks (private index, HEAD + these changes). Refs CW-7663, CW-7849 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 7 hours ago | |
feat(skills): make bundled install and discovery configurable [skip ci] Implement #7066 with nested auto/all/none, selected, disabled and explicit_only policy. Canonical aliases share policy; filtering precedes first-wins merge so compatible/manual alternatives remain available. Reuse invocation and activation state rather than adding another store. All writes remain in the owned global root, use confined atomic replacement and preserve edited/managed bodies. None leaves bundle files/marker untouched. Remove legacy skill-directory deletion; refuse nonregular markers without deleting their contents. Carry one scoped SkillsConfig through Engine, App, children, tools, runtime API and MCP resources; retire mode-only production discovery/render entry points. Doctor and skills inspection report actual policy, paths and reasons. Escape configured-name controls; document profile clears and CODEWHALE_HOME behavior. Migrate the existing manager fixture to shared registered environment guards. Verification: 182 distinct skills cases resolved across scoped reruns; runtime config2 and command-contract11 pass. Host selection466 had464 pass/2 fixture failures; final affected manager/inspect/registry10 pass resolves both, without repeating unaffected cases. Current TUI lib+registry compilation passed; actual production CLI build13m40 passed. Sandboxed offline doctor JSON/text observed none mode, generation17, explicit-only PDF, compatible debug fallback, unknown and ignored names, and byte-identical bundle files/marker. Website metadata30, docs, format, boundaries, blocking/dead-code ratchets and diff checks passed. No new test functions. Existing oversized eh_frame warning retained. No full or hosted CI, provider/device/Windows/release qualification. Full0.10.3 remains open. | 9 days ago | |
docs: extract screenshots to images/ and reference them from the Windows guide | 3 months ago | |
docs(release): record what landed, and mark the preserved-work list superseded The checkpoint's "Preserved work awaiting qualification" list described files that are no longer uncommitted. It now carries a date-ordered landing log with each commit's verification receipt, and the old list is retained and labeled superseded rather than deleted, so the transition stays auditable. Also records the coordination fact worth keeping: bdcc8cfc5 landed half of a peer's packet, which left main uncompilable until 6c2cd67ca landed the other half. State now: canonical checkout clean, 29-crate publication set, confirmed CI green on the landing heads so far. Release acceptance, packaging sizes, installation and live provider qualification remain open. | 29 days ago | |
refactor(engine): extract the shared runtime from the TUI [skip ci] Move the Engine band, extension host, fixtures and shared test support into codewhale-engine; wire TUI/CLI to that owner. Preserve human-decision construction boundaries and lower reusable test helpers. Remove unused copied dependencies and repair path-based guards, scripts and crate maps. Correct the blocking scanner external-module scope leak; raised counts equal the corrected pre-move source. Refresh embedded built-in hashes after path-only bundle regeneration. Restore the provider-free prompt budget to the exact pre-b984e31290 macOS bytes and representative identities; tool catalogs are unchanged. Portable prompt-fixture pinning remains follow-up work. Local validation: Engine/TUI/CLI clippy --tests --no-deps -D warnings passed with the existing allow-list; production CLI check passed; fmt passed. Focused native run: 705 passed / 83 failed initially; after hash/path repairs, 81 affected cases plus 2 existing build-relocation cases passed (83/83). Thus 786/788 original cases pass; 2 compiled-release-image cases lack input and are not qualified. Frozen input inventories unchanged. macOS test-link unwind-table warnings remain. Four metric tests pass; all 55 budgets pass. Host Node: 413 pass, 7 skip; Bun: 414 pass, 6 skip. Existing scanner checks: 34 + 33 pass. Compiled-delivery synthetic fixtures: 7 pass. Web: 42 pass. Import, blocking, dead-code, coarse-map, version and facts checks pass. CW-7701. No hosted CI, provider call, release build or publication. Stage A part 2 and the old App Server/ratatui dependencies remain separate. | 7 days ago | |
tui: support safe user-authored theme overlays Load bounded semantic-color overlays from the Codewhale-owned themes directory, preserve custom selectors through typed settings, and surface invalid themes without silently changing persisted state.\n\nIncludes an embedded JSON Schema, symlink-safe leaf opens, exact hex validation, and focused config round-trip coverage. | 3 months ago | |
docs(skills): align cw-land's changelog step with the changelog rule [skip ci] Step 2 said a user-visible feat or fix commit carries a line and that docs need none. The changelog rule counts user docs, help text, defaults and security behavior as user-visible, and public lines cite a public issue or PR, never an internal tracker id. The step now says so: a user-visible change (usually feat or fix) carries its line, (#N) names a public issue or PR, and tests, CI, refactors and internal docs need no line. Verified: the edited paragraph reads cleanly in context; no other public skill restates the rule. No CHANGELOG line: maintainer documentation. Refs CW-7860 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 9 hours ago | |
fix(providers): identify defaults from each provider's model list A same-line successor replaces a stale pin. grok-4.7 and muse-spark-1.3 are the current models; a different line, such as GPT-6 beside GPT-5.6, does not take over. The provider pane shows one current model per line and spreads a gateway roster across authors, so OrcaRouter no longer opens as a wall of Claude snapshots. Wafer is a selectable OpenAI-compatible host. The public model list is the catalog, GLM-5.3 is the default, and inference uses WAFER_API_KEY. Verification: codewhale-config lib tests for default identity, Grok hydration, web search, and the Wafer descriptor (4 passed). codewhale-agent xAI and Meta default resolution (2 passed). codewhale-tui provider pane default-first (1 passed). codewhale-engine fleet xAI fallback (1 passed). python3 scripts/catalog_models_dev.py defaults audit reported 0 stale. python3 scripts/check-provider-registry.py passed. | 2 hours ago | |
fix: finish calm terminal cards and refresh security dependencies [skip ci] Finish the inherited Claude shell-card changes: lead with the description, keep the actual command visible, preserve explicit non-success states at narrow widths, and keep full transcript/copy behavior. Update the existing widget assertions and accessibility/tool documentation. Refresh rustls-webpki/root certificates, MCP 2.3.1 and its pinned bundle/notices, Vite/rolldown, and bridge follow-redirects security fixes. The bridge upgrade also appears in @aboimpinto's PR #7009; that contributor PR remains open. Check host restart generation instead of assuming an OS never reuses a PID. Verification on macOS, Node 22.20.0: - npm test: 1,312 passed, 0 failed, 7 skipped; check:web passed. - TUI focused nextest: 1,585 passed, 2 failed of 1,587. Fixed the missing THIRD_PARTY_NOTICES version entries. The unchanged crash-reentry test hit its admission deadline during the parallel run. - Follow-up license, owner-bootstrap and terminal CLI checks, one test process at a time: 157/157 passed, including the original two failures. No timeout or production behavior was weakened to obtain this result. - Config catalog and daemon checks: 73/73 passed. - Telemetry: 174/174; Feishu: 19/19; WeCom: 17/17; type/syntax checks passed. - cargo audit: zero vulnerabilities; cargo deny passed all four checks. - npm audits: MCP, telemetry and both bridges have zero findings. Web's reviewed audit has no blocked findings, with nine existing mitigated braces-chain findings retained. - rustfmt, diff whitespace, extension bundle build and typecheck passed. The compiled source stayed unchanged during the native run. Only the missing notice document was corrected afterward. Windows behavior awaits the final release gate. CI is intentionally deferred under the founder's October 20 final-step-only instruction. No release tag, publication or deploy. | 18 days ago | |
ci: cut PR CI to the fast required set; welcome contributor PRs [skip ci] Founder direction (2026-11-07): remove CI/CD steps that cost time without need, use CI conservatively, and make contributor rules standard and welcoming instead of closing or blocking PRs over CI. A read-only audit of two weeks of run history (Sonnet workflow with an adversarial release- engineer critique) drove the list; nothing release-critical is touched. Removed (enforced nothing, duplicated other checks, or gated contributors): - dco.yml (always exited 0), pr-issue-link.yml (red X on ~8% of contributor PRs), auto-close-harvested.yml, pr-gate.yml / issue-gate.yml / approve-contributor.yml and .github/APPROVED_CONTRIBUTORS (dry-run allowlist gate; drops a pull_request_target surface), agent-task-labels.yml (duplicates triage.yml). Moved to manual (workflow_dispatch) only: - codewhale-review.yml (review bot; AGENTS.md says review bots stay off), main-landing.yml (push trigger; run scripts/preflight.sh --check locally), ci.yml test (Linux suite, 54-94 min per PR), safety-gate (18-29 min), msrv, mobile-smoke, npm-wrapper-smoke (macOS leg dropped from the dispatch matrix; the release artifacts cover macOS). - The PR feature release-note receipt step is advisory (continue-on-error). - spam-lockdown keeps only unambiguous spam patterns. Unchanged: Lint and the compile-only Test (windows-latest) stay the required PR checks; release-candidate, release-artifacts, release-parity, release, the mirrors, OHOS and the Windows import guard are untouched. The branch ruleset drops "npm wrapper smoke (ubuntu-latest)" next (founder approved "Lint + 1 compile"). Rules: AGENTS.md, CONTRIBUTING.md, the PR template, AGENT_ETHOS.md and the cw-land skill now say contributor PRs are never closed or blocked because CI is slow, flaky or red for a reason they did not cause; nothing closes a PR automatically; harvesting is a rare, asked-first fallback with the contributor as author; the PR issue line is optional; maintainers reply generously. web/data/agent-docs.generated.json is regenerated from a clean export of main plus this change only. Verified: actionlint with CI's flags (-ignore SC2129/SC2221/SC2222) over all workflows passes; web/scripts/check-facts.mjs passes on the isolated export; only the contribution entry of agent-docs.generated.json changed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 10 hours ago | |
fix(engine): stop replaying inference with unknown outcomes [skip ci] Use typed dispatch confidence at retry owners; only proven transient pre-dispatch failures, ordinary429 and actual read-only operations may retry. Stop opened-stream replay and reqwest retry/redirect bypasses. Keep Interrupted child handback and source-bound primary unknown coverage through existing Runtime/TUI/exec owners; terminal exec failure exits1. Reconcile retry promises and parsed compatibility knobs in maintained docs. Validation: ordinary CLI build passed; 131 existing Engine and28 TUI checks passed via126+28 unchanged-source reuse,3 corrected fixtures,2 corrected multi-thread SSE fixtures. No new tests or comments. Original failed builds/check receipts retained. 40 local ordinary controls yielded 38 qualified and2 isolated safety-only observations retaining their full source-accounting failure underP04. Old CLI reproduced2acceptedPOSTs/ 2simulated effects; candidate ambiguous requests retained1/1 without replay. Existing bounded429/GET/pre-dispatch and manual next-turn controls passed. All2315 source inputs held frozen during each build/observation. Limits: full primary late/historical/isolated source accounting and broader P02 recovery remain open. HTTP/1 local proof only; no provider spend, Windows/Deepin/FreeBSD, installed package or final CI/release claim. Receipts: CW/artifacts/engine-0103-execution-20261102/ inference-retry-v4/RECEIPT.json and inference-retry-qa/RESULTS.json. | 5 days ago | |
refactor(engine): extract the shared runtime from the TUI [skip ci] Move the Engine band, extension host, fixtures and shared test support into codewhale-engine; wire TUI/CLI to that owner. Preserve human-decision construction boundaries and lower reusable test helpers. Remove unused copied dependencies and repair path-based guards, scripts and crate maps. Correct the blocking scanner external-module scope leak; raised counts equal the corrected pre-move source. Refresh embedded built-in hashes after path-only bundle regeneration. Restore the provider-free prompt budget to the exact pre-b984e31290 macOS bytes and representative identities; tool catalogs are unchanged. Portable prompt-fixture pinning remains follow-up work. Local validation: Engine/TUI/CLI clippy --tests --no-deps -D warnings passed with the existing allow-list; production CLI check passed; fmt passed. Focused native run: 705 passed / 83 failed initially; after hash/path repairs, 81 affected cases plus 2 existing build-relocation cases passed (83/83). Thus 786/788 original cases pass; 2 compiled-release-image cases lack input and are not qualified. Frozen input inventories unchanged. macOS test-link unwind-table warnings remain. Four metric tests pass; all 55 budgets pass. Host Node: 413 pass, 7 skip; Bun: 414 pass, 6 skip. Existing scanner checks: 34 + 33 pass. Compiled-delivery synthetic fixtures: 7 pass. Web: 42 pass. Import, blocking, dead-code, coarse-map, version and facts checks pass. CW-7701. No hosted CI, provider call, release build or publication. Stage A part 2 and the old App Server/ratatui dependencies remain separate. | 7 days ago | |
docs: say Work, not Act; stop offering dispatch while accounts are paused The mode is Work in the TUI since 0.10.2, but three docs still named Plan/Act/Operate (AUTHORIZATION_ORDER in English and Chinese, and the Xiaomi MiMo note in PROVIDERS). The user guide in both languages also offered codewhale dispatch to run heavy work on a cloud computer through the signed-in account; cloud computers and accounts are paused for new users (§38), so say it is not available. The website's generated agent docs are regenerated from these files. The hook-condition half of #6466 (a hook written as mode = "work") is a code change and is not in this commit. Refs #6466 Gates: npm test 772/772 passed; npm run check:web passed after npm --prefix web run prebuild. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz | 19 days ago | |
feat(engine): eager sub-agents and goals by default, with clearer tool text The founder-approved 0.10.3 batch from artifacts/eager-delegation-20261107/FINAL-CHANGES.md, all ten items. This is one declared re-pin of the session-pinned prefix (docs/CACHE.md): BASE_PROMPT and several eager tool descriptions change on upgrade, and nothing changes mid-session. 1. BASE_PROMPT gains "Delegation and goals". Independent parts of a request go to agent children started together in one message. Results arrive on their own, so never poll or sleep, and end the turn when only waiting remains. Each child gets a complete prompt and a disjoint file scope; the parent inspects a write-capable child's evidence, reviews the final diff and runs the checks. An independent reviewer tries to refute a non-trivial change before it is called done. create_goal is for any direct request, in any language, that describes a verifiable end state needing more than one turn. A goal is blocked only when the same concrete obstacle persists; difficulty is not blocked. Cost alone is not a reason to stop, and only limits the user or configuration sets apply. The scope line keeps express authorization for spending real money (purchases, paid providers, billing) and adds the founder-approved sentence "Sub-agents, workflows and goals within the current request are in scope." GOAL_CONTINUATION_PROMPT drops the stale tool_search sentence (update_goal is eager), asks for remaining independent work to be split across agent workers before the next verification pass, and uses the same blocked rule. 2. The engine no longer appends the Operate contract (record_mode_context). Its reviewer, cost and write-child-evidence lines now live in BASE_PROMPT for every session. Every saved wording stays recognized, so restored sessions replay it as internal state and compaction still keeps it. 3. The agent start receipt carries next: "Results arrive automatically; continue other work or end your turn." 4. The agent description leads with intent ("Delegate focused work and keep working. Start early; one agent per independent part, same message."), gives one trigger per role, adds a child-prompt brief with one worked example, names workflow and Run as the real tools, and drops the "In Operate" and "Legacy action=" sentences. The schema is unchanged. 5. create_goal, its token_budget property and update_goal (description and status property) say when to start a goal and what complete, blocked and yield mean, without judge jargon. The status enum and parser are unchanged, and the token_budget parameter stays. 6. The bundled goals skill (personal resolutions in goals.md) becomes personal-goals with aliases-for: goals, so saved references still resolve and the skills index no longer reads like goal mode. It keeps the generation-12 introduction, so a user who deleted goals does not get it back. On upgrade, an untouched goals copy (a shipped body by hash, SKILL.md its only entry, and no personal-goals directory yet) is renamed to personal-goals and then refreshed by the ordinary generation-20 upgrade, because its body hash is listed under personal-goals. An edited or extended copy stays where it is. Known limitation: a [skills.bundled] entry that names "goals" now reports as unknown and does not apply to personal-goals. delegate no longer forbids delegating final verification and treats the roster as optional; best-of-n uses the general and implement roles and drops "In Operate mode" and the 16-worker figure. v4-best-practices is not changed: it is a cfg(test) v4 migration fixture, not a bundled skill, so editing it would falsify the fixture and reach no user. 7. The tasks schema stops advertising mode=operate; the hidden legacy alias schema and the free-string parser still accept it. harness no longer names the hidden rlm tool (description and overview), list_dir loses its harness meta sentence, and TOOL_SURFACE.md (and zh_hans) drop Operate. goal.rs's Run action="verifiers" names a real deferred tool, which a well-formed first call activates, so it stays. 8. Workflow max_concurrent defaults to 64 (was 16), matching sub-agents. The workflow-js per-run clamp WORKFLOW_MAX_CONCURRENT moves from 16 to 128, the sub-agent hard maximum; without it the clamp would have kept every run at 16 and explicit configs above 16 would not take effect. No spend caps are added, and the high-budget approval trigger is untouched because the default token budget is 0. Docs and config.example.toml follow. 9. Each child's task message ends with its name, its scope (read-only, or may edit files within its assignment) and "Your final answer is delivered to the parent automatically; include the result and its evidence." This is the child seed built by the runner in subagent/engine.rs, beside the role prompt that carries SUBAGENT_OUTPUT_FORMAT; the role prompts that children share are unchanged. 10. tool_search lists the commonly registered deferred groups (Git, Run, Web, tasks, github, automation, lsp, review, session_search, terminal/*, apply_patch, grep_files, MCP) and says a listed tool can be called by name. Memory tools are opt-in, so they are not listed. Generating the list from the live catalog is the next-patch item. Bytes and cache: - /preview-request before, installed 0.10.3 (7b8a634, catalog-equivalent to main) on macOS with an isolated offline HOME: tool schemas 40,854 canonical JSON bytes, system 16,662, base prompt 3,336, 18 active of 59. - /preview-request after, a debug build of this diff on Linux (Boat farm) with the same isolated offline HOME and prompt: tool schemas 40,173 canonical JSON bytes (-681, eager bytes did not grow), base prompt 4,352 bytes. - Source delta on eager tool schemas: -681 bytes (agent 2,370 -> 1,737, create_goal -244, update_goal -129, tool_search 71 -> 396). BASE_PROMPT grows to 4,352 bytes in the system region. Tests changed with the behavior: prompts.rs universal_prompt_does_not_expose_control_plane_ceremony no longer forbids "sub-agent" and "dispatch, join" (the founder reversed that decision) and still forbids sentinel and runtime-event jargon; the deleted agent_tool_description_states_the_operate_child_approval_rule pinned the dropped Operate sentence; the tasks enum test, the workflow default tests, the Operate probes (now 0 contracts) and the delegate generation-18 reconstruction chain follow; the skills fixture moves to generation 20, with the old delegate and best-of-n bodies and the old goals body (under personal-goals) listed by hash. The prompt and event conformance goldens are re-recorded for the re-pin. Verified on the Boat farm (Linux x86_64), base 4c5426f9/f0fb6adb plus only this diff (engine.rs, subagent/mod.rs, subagent/tests.rs, tasks.rs and config.example.toml shipped as HEAD plus this batch's hunks): - cargo test -p codewhale-engine --lib, focused filters (prompts, goal, tasks, harness, canonical actions, agent description and parent surface ceiling, lifecycle, launch receipt, assignment prompt, limits, compaction last round, tool catalog, runtime handoff, registry, workflow): 533 passed, 0 failed. The final state on base f0fb6adb, same filters plus core::engine::tests::operate_ and mode_notice: 539 passed, 1 failed. The failure, create_mode_enum_advertises_neither_operate_nor_yolo, came from the farm copy of tasks.rs missing this commit's third hunk; the first run carried exactly the committed tasks.rs, and the test passed. - cargo test -p codewhale-skills: 182 passed, 0 failed, on the final rename migration; a throwaway migration check (not committed) covering untouched, edited, extended, deleted and fresh installs: 5 passed. - cargo test -p codewhale-config --lib workflow_config: 3 passed; cargo test -p codewhale-workflow-js: 12 + 82 passed. - cargo test -p codewhale-tui --lib conformance::prompt:: conformance::events::, update pass then compare pass: 5 passed each; the re-recorded goldens come from that run on base cd7f5b32 (conformance tool schemas 19,840 -> 19,792 bytes, system +1,033 bytes, matching the source delta); nothing that landed since touches the surfaces they capture. - cargo clippy -p codewhale-engine -p codewhale-skills -p codewhale-config -p codewhale-workflow-js --all-targets --all-features with the Lint job's flags: clean; skills clippy re-run on the final migration: clean. Local: rustfmt clean on every touched file; scripts/preflight.sh --check passes except the blocking-calls budget, which fails only on another session's untracked crates/engine/src/session_image_prune.rs (4 > 0), not part of this commit; dead-code budget 137 of 137. Not verified: a macOS run of the after binary (the before figure is macOS, the after figure Linux; the measured -681 equals the source delta), any live provider turn, and DSH's sleep/poll probe on the target models. Refs: CW-7852 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 8 hours ago | |
refactor(engine): extract the shared runtime from the TUI [skip ci] Move the Engine band, extension host, fixtures and shared test support into codewhale-engine; wire TUI/CLI to that owner. Preserve human-decision construction boundaries and lower reusable test helpers. Remove unused copied dependencies and repair path-based guards, scripts and crate maps. Correct the blocking scanner external-module scope leak; raised counts equal the corrected pre-move source. Refresh embedded built-in hashes after path-only bundle regeneration. Restore the provider-free prompt budget to the exact pre-b984e31290 macOS bytes and representative identities; tool catalogs are unchanged. Portable prompt-fixture pinning remains follow-up work. Local validation: Engine/TUI/CLI clippy --tests --no-deps -D warnings passed with the existing allow-list; production CLI check passed; fmt passed. Focused native run: 705 passed / 83 failed initially; after hash/path repairs, 81 affected cases plus 2 existing build-relocation cases passed (83/83). Thus 786/788 original cases pass; 2 compiled-release-image cases lack input and are not qualified. Frozen input inventories unchanged. macOS test-link unwind-table warnings remain. Four metric tests pass; all 55 budgets pass. Host Node: 413 pass, 7 skip; Bun: 414 pass, 6 skip. Existing scanner checks: 34 + 33 pass. Compiled-delivery synthetic fixtures: 7 pass. Web: 42 pass. Import, blocking, dead-code, coarse-map, version and facts checks pass. CW-7701. No hosted CI, provider call, release build or publication. Stage A part 2 and the old App Server/ratatui dependencies remain separate. | 7 days ago | |
fix(engine): stop replaying inference with unknown outcomes [skip ci] Use typed dispatch confidence at retry owners; only proven transient pre-dispatch failures, ordinary429 and actual read-only operations may retry. Stop opened-stream replay and reqwest retry/redirect bypasses. Keep Interrupted child handback and source-bound primary unknown coverage through existing Runtime/TUI/exec owners; terminal exec failure exits1. Reconcile retry promises and parsed compatibility knobs in maintained docs. Validation: ordinary CLI build passed; 131 existing Engine and28 TUI checks passed via126+28 unchanged-source reuse,3 corrected fixtures,2 corrected multi-thread SSE fixtures. No new tests or comments. Original failed builds/check receipts retained. 40 local ordinary controls yielded 38 qualified and2 isolated safety-only observations retaining their full source-accounting failure underP04. Old CLI reproduced2acceptedPOSTs/ 2simulated effects; candidate ambiguous requests retained1/1 without replay. Existing bounded429/GET/pre-dispatch and manual next-turn controls passed. All2315 source inputs held frozen during each build/observation. Limits: full primary late/historical/isolated source accounting and broader P02 recovery remain open. HTTP/1 local proof only; no provider spend, Windows/Deepin/FreeBSD, installed package or final CI/release claim. Receipts: CW/artifacts/engine-0103-execution-20261102/ inference-retry-v4/RECEIPT.json and inference-retry-qa/RESULTS.json. | 5 days ago | |
docs: document live catalog refresh and 0.10.3 limits [skip ci] Document the landed Engine catalog refresh and Runtime API projection so clients can discover new models on supported routes without replacing the binary. Explain exact-route refresh, freshness, retained snapshots, and the existing desktop picker refresh and revision polling. Carry the EN/ZH durable job receipt and implicit socket contract with native source 821c478eb9. Describe Tinker beta configuration without implying live provider qualification. Align the Chinese provider introduction with the supported-model-list boundary. Keep release limits explicit for plugins, platform qualification, history recovery, long sessions, and rollback. Credit zhuowp's rate-limit recovery contribution and SparkofSpike's proxy privacy report. Sync the embedded changelog and derived web metadata only after Mistral guidance 07853c32661 landed with its live-conversation caveat. Verified: derive-facts and check-facts passed; embedded changelog sync/check and scoped diff whitespace passed. Contributor credit check found all 15 contributors credited, retaining its known Bot/co-author warning. All 22 v11 manifest inputs were independently checked immediately before staging; six catalog/job API source paths matched committed main. Retained development receipts cover nine controlled catalog API assertions, eight mounted picker assertions, and a keyless public Models.dev fetch. These are scoped development observations, not final package or provider inference qualification. Proxy source matches the retained macOS 23/23 existing-test receipt; runtime log capture and other platforms are unqualified. No new maintained tests, native builds, hosted CI, or deployment in this slice. | 1 day ago | |
docs: point every link at the codewhale-hq organization Hunter moved the Codewhale repositories to github.com/codewhale-hq on 2026-10-05. Rewrite Hmbown/<moved repo> slugs to codewhale-hq/<repo> in docs, READMEs (all 19), website, CHANGELOGs, workflows, issue templates, Cargo/npm/VS Code/nix/winget metadata, install and updater code, the bundled first-party marketplace catalog and their tests: 1,795 references in 434 files, plus four escaped regex literals. Docker images publish to ghcr.io/codewhale-hq/codewhale from the next release. Old URLs keep working through GitHub's transfer redirects (verified live: API releases/latest, HTML releases/latest, release asset downloads, codeload tarballs, git clone), so released clients keep updating. Left unchanged on purpose: Hmbown/codewhale-cu-plugin (not moved yet; its shipped updater refuses redirects), Hmbown/deepseek-skills, cwc and other repos that did not move; package identities (winget Hmbown.CodeWhale, NSIS publisher); vendor/codewhale-ratatui (frozen reviewed package); and the extension-host GitHub adapter with tools/github/report.rs and their parity fixture, which need a bundle rebuild and move together in a follow-up. README translation stamps updated to the new README.md hash. Validation: npm test (wrapper 101/0, SDK 19/0, extension host 398 passed / 0 failed / 7 skipped, web 763/0) and npm run check:web exit 0 (one pre-existing facts-lib.mjs lint warning). cargo check --workspace --tests --all-features --locked: exit 0. cargo test -p codewhale-cli -p codewhale-release -p codewhale-protocol and the touched codewhale-tui modules (client, cloud_dispatch, commands, dispatch_runner, llm_client::mock, oauth, operate, plugins::marketplace, remote_control, remote_setup, tools::mcp_registry, tools::web::fetch, working_set, tui::ui::tests): all ok, 0 failed. check-readme-translations (18 in sync), readme locales, TUI locale parity, product vocabulary, web locales, contributor credit, plugin claims, release-workflows.test.js and check-versions all pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
0.10.2 candidate: endpoint-scoped catalog, tiered pricing and release verification (#6968) Squash of the 0.10.2 candidate branch wip/0.10.2-6396-handoff-20261012: endpoint-scoped model catalog and tiered pricing (#6396), the takeover fixes found while qualifying it, and the release-verification tooling. The full commit list and per-commit evidence are in PR #6968. Qualification of the squashed tree (head 704d435db1, a clean merge of main b5e270b690 into ba01538bc9 with no manual conflict resolutions): - Hosted CI on 704d435db1: 40 checks passed, 4 skipped (Cloudflare deploy and its approval gate, fork-only macOS budget/eval, docs), 0 failed. Run 38848133339. - nextest: Ubuntu 19101/19101 passed (34 skipped), Windows 18357/18357 passed (27 skipped), macOS 19104/19104 passed (33 skipped). - Local on the same head: clippy with CI's flags clean; 667/667 focused nextest; npm test 547 Node (540 passed, 7 skipped, 0 failed) and 772 Vitest passed; npm run check:web exit 0. - Main was frozen from b5e270b690 until this squash, so the squashed tree is the tested tree. Not covered here: the crates.io publish, tags and the GitHub release, which remain the founder's. Merged under the founder's 2026-10-13 authorization to squash #6968 after its final head passes CI and review. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz | 23 days ago | |
fix(plugins): install compatible Claude marketplace bundles Resolve Claude catalog paths from the repository root and normalize nested manifests plus root MCP declarations through the existing plugin adapters. Retain whole-bundle review hashes, path validation and explicit enablement. Map exact environment-backed credential headers without reading secrets; reject unsupported components and compound or literal credential templates. Validation: 186 plugin tests passed after the credential-header repair; combined focused suite 1772 passed before that repair. npm test: 66 wrapper, 9 SDK, 446 web passed. npm run check:web: PASS, 0 errors, 2 existing warnings. Locked dev build, cargo fmt and git diff --check passed. Real official Linear and GitHub recommendation actions installed into an owned sealed QA home and reached disabled/not-reviewed capability review while preserving the draft. No OAuth, provider activation or publication is claimed. | 1 month ago | |
feat(cli): connect each group member's provider in the cloud key handoff (CW-7182) dispatch --prepare-model --thread (and a send that uses the local model) only connected the lead's provider. A group member on another provider then failed at spawn on the guest. After the lead's key operation, the CLI now reads the conversation's group (GET /v1/threads/:id), resolves each active non-lead member's saved route from /api/agents/:id, and sends one more key operation per distinct provider from the local configuration for it, under the same portability checks as the lead (HTTPS endpoint, API-key auth, no device-bound sign-in). Keys stay memory-only on the guest through the existing session key operation. Removed members are ignored; a member whose provider is the lead's is not sent twice. A member with no saved model, or whose provider is not configured locally, stops the handoff with that member's name rather than being skipped. The prepare receipt gains members (agentId, provider) for the connections it added; the desktop already prepares before every cloud send, so it picks this up with no app change. Verification: a throwaway test (not committed) drove computer::run with the existing FakeTransport for a group (lead deepseek; Ana anthropic; Dee deepseek; Old removed): key operations went to deepseek then anthropic only, receipt listed Ana/anthropic; 1 passed, 0 failed. cargo test -p codewhale-cli --lib cloud: 122 passed, 1 failed — the failure, login_selects_managed_route_when_provider_is_default, fails identically without this change in this container (pre-existing, environment-dependent). cargo fmt clean. No live account, Boat computer or provider call. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PsruMwr3b8fWh1sfKL7JTQ | 13 days ago | |
fix(catalog): Codewhale corrections hold online, not only offline (#6396) The offline seed carried Codewhale's deliberate holds as hand edits: prices left out where a flat rate would mislead, DeepSeek's output limit kept at its published 384K. A live Models.dev refresh replaces seed rows wholesale, so every hold vanished on a networked install: live rows priced MiMo and DeepSeek, listed Alibaba plan rows at $0 (read as free), and raised DeepSeek's output limit to 393216. The holds now live in crates/config/assets/catalog_corrections.json as field patches in the cloud-facts ModelFact shape. The signed layer's patch code applies them to every Models.dev row as it is hydrated, bundled seed and live refresh alike. So a correction ranks above both Models.dev layers and below signed cloud facts (which may still correct it) and provider rosters. - ModelFact.pricing_withheld (optional reason) clears the row's price so the route reports PricingSku::UnknownOrStale. It is an optional field; payloads without it parse unchanged. - catalog_patch::apply_patches is shared: the signed layer calls it with row materialization, corrections without, so they never add a row. The loader also refuses hide, deprecate, allow_unlisted, labels, a patch that changes nothing, and any limit patch without a reason. - A corrected row keeps its own source. CatalogCompiler::with_live and other code sort rows by source, and a relabelled live row was placed above signed facts (an existing cloud-facts test caught it). The price a correction owns reports CatalogSource::CodewhaleBundled through cost_source. - The declared-but-unused CatalogCompiler.codewhale_bundled field is removed; the layer docs (catalog.rs, CATALOG_REFRESH.md, CLOUD_FACTS.md) now describe the rank where corrections actually apply. Each hold was checked again on its merits: - kept: DeepSeek native pricing (time-aware table in tui pricing.rs), xAI (rates double past 200K), MiMo (PAYG and Token Plan keys look the same), the four Model Studio plan providers (quota), StepFun (plan and PAYG share ids), DeepSeek native output 384000 (published 384K; which value the API accepts is unverified, and the lower bound is always accepted); - added: MiniMax-M3 (upstream price tiers at 512K, same rule as Grok; the seed already listed it unpriced without saying why); - dropped: aggregator-hosted DeepSeek (an aggregator's published rate is its own price, as it is for every other aggregator row we price), OpenRouter dots :free (a free model is free), zai GLM-5.3 (the zai route is the pay-as-you-go API, not the Coding Plan the hold cited), MiMo's text-only image hold (made harmless by the previous commit) and MiMo's 1,000,000 context (the only citation was our own rows). Tests (focused): - codewhale-config --lib: 706 passed, 0 failed, 1 ignored; --test configured_models: 9 passed - codewhale-tui -- vision image badge capabilit pricing provider_lake models_dev_live model_picker provider_catalog_live catalog deepseek xiaomi mimo modelstudio grok stepfun minimax: 872 passed, 0 failed, 2 ignored (one earlier run failed route_budget::uncatalogued_remote_model_keeps_a_conservative_ceiling; it passes alone and on rerun, and reads output-limit env vars without the env lock) - cargo fmt --check clean; clippy -p codewhale-config -p codewhale-tui --all-targets --all-features with CI flags clean; budget, boundary and module-graph gates pass; changelog chain passes (public-copy 6/6) Refs #6396 Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> | 1 month ago | |
ci(sync): gate the CNB mirror on repository owner Review asked for an owner gate instead of a secret probe. A secret-presence gate also swallows misconfiguration in this repository: a deleted or misspelled CNB_GIT_TOKEN would turn the main mirror, and the release-tag mirror that release.yml calls, into a green run with only a notice, while misconfiguration is supposed to fail loud — and main's Linux test lane runs on CNB, so a silent skip would also hide those tests. Forks can never inherit the secret, so the sync job now runs only when the repository owner is codewhale-hq; the credentials gate job is dropped. The existing hard failure on an empty token stays for this repository, and both CNB_MIRROR docs describe the two paths. Co-authored-by: Hmbown <101357273+Hmbown@users.noreply.github.com> Signed-off-by: asto <asto18089@126.com> | 19 days ago | |
refactor(engine): extract the shared runtime from the TUI [skip ci] Move the Engine band, extension host, fixtures and shared test support into codewhale-engine; wire TUI/CLI to that owner. Preserve human-decision construction boundaries and lower reusable test helpers. Remove unused copied dependencies and repair path-based guards, scripts and crate maps. Correct the blocking scanner external-module scope leak; raised counts equal the corrected pre-move source. Refresh embedded built-in hashes after path-only bundle regeneration. Restore the provider-free prompt budget to the exact pre-b984e31290 macOS bytes and representative identities; tool catalogs are unchanged. Portable prompt-fixture pinning remains follow-up work. Local validation: Engine/TUI/CLI clippy --tests --no-deps -D warnings passed with the existing allow-list; production CLI check passed; fmt passed. Focused native run: 705 passed / 83 failed initially; after hash/path repairs, 81 affected cases plus 2 existing build-relocation cases passed (83/83). Thus 786/788 original cases pass; 2 compiled-release-image cases lack input and are not qualified. Frozen input inventories unchanged. macOS test-link unwind-table warnings remain. Four metric tests pass; all 55 budgets pass. Host Node: 413 pass, 7 skip; Bun: 414 pass, 6 skip. Existing scanner checks: 34 + 33 pass. Compiled-delivery synthetic fixtures: 7 pass. Web: 42 pass. Import, blocking, dead-code, coarse-map, version and facts checks pass. CW-7701. No hosted CI, provider call, release build or publication. Stage A part 2 and the old App Server/ratatui dependencies remain separate. | 7 days ago | |
refactor(engine): extract the shared runtime from the TUI [skip ci] Move the Engine band, extension host, fixtures and shared test support into codewhale-engine; wire TUI/CLI to that owner. Preserve human-decision construction boundaries and lower reusable test helpers. Remove unused copied dependencies and repair path-based guards, scripts and crate maps. Correct the blocking scanner external-module scope leak; raised counts equal the corrected pre-move source. Refresh embedded built-in hashes after path-only bundle regeneration. Restore the provider-free prompt budget to the exact pre-b984e31290 macOS bytes and representative identities; tool catalogs are unchanged. Portable prompt-fixture pinning remains follow-up work. Local validation: Engine/TUI/CLI clippy --tests --no-deps -D warnings passed with the existing allow-list; production CLI check passed; fmt passed. Focused native run: 705 passed / 83 failed initially; after hash/path repairs, 81 affected cases plus 2 existing build-relocation cases passed (83/83). Thus 786/788 original cases pass; 2 compiled-release-image cases lack input and are not qualified. Frozen input inventories unchanged. macOS test-link unwind-table warnings remain. Four metric tests pass; all 55 budgets pass. Host Node: 413 pass, 7 skip; Bun: 414 pass, 6 skip. Existing scanner checks: 34 + 33 pass. Compiled-delivery synthetic fixtures: 7 pass. Web: 42 pass. Import, blocking, dead-code, coarse-map, version and facts checks pass. CW-7701. No hosted CI, provider call, release build or publication. Stage A part 2 and the old App Server/ratatui dependencies remain separate. | 7 days ago | |
docs(i18n): move Indonesian docs into docs/id/ with redirect stubs - Move all 10 docs/*.id.md files into docs/id/ (dropping the .id suffix), leaving English redirect stubs at the old paths for one release cycle - Update README.id.md links to point at docs/id/ - Note docs/id/ alongside docs/zh_hans/ in LOCALIZATION.md's scope note Part of #5482 Signed-off-by: Shizuku <2163018547@qq.com> | 2 months ago | |
fix(providers): identify defaults from each provider's model list A same-line successor replaces a stale pin. grok-4.7 and muse-spark-1.3 are the current models; a different line, such as GPT-6 beside GPT-5.6, does not take over. The provider pane shows one current model per line and spreads a gateway roster across authors, so OrcaRouter no longer opens as a wall of Claude snapshots. Wafer is a selectable OpenAI-compatible host. The public model list is the catalog, GLM-5.3 is the default, and inference uses WAFER_API_KEY. Verification: codewhale-config lib tests for default identity, Grok hydration, web search, and the Wafer descriptor (4 passed). codewhale-agent xAI and Meta default resolution (2 passed). codewhale-tui provider pane default-first (1 passed). codewhale-engine fleet xAI fallback (1 passed). python3 scripts/catalog_models_dev.py defaults audit reported 0 stale. python3 scripts/check-provider-registry.py passed. | 2 hours ago | |
fix(release): clear the two clippy collapsible_if errors; credit the two 0.10.3 reporters on the website Hosted Lint and the release-candidate Parity job failed on 072468aff2 with clippy::collapsible_if in crates/config/src/catalog.rs and, behind it, crates/tui/src/tui/provider_picker.rs. Both are flattened with let chains, same order and short-circuit. The web credits-parity test failed because @cmdcorp6534 and @Asteria1028 are in the 0.10.3 changelog ledger but not in the website release helpers or the docs/CONTRIBUTORS.md v0.10.3 band; both added. Verified locally: cargo clippy --workspace --all-targets --all-features --locked -D warnings (CI flags) exit 0; cargo fmt clean; web vitest public-copy 6 passed; check-contributor-credit passes. Hosted CI not rerun yet. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> | 22 minutes ago | |
refactor(engine): extract the shared runtime from the TUI [skip ci] Move the Engine band, extension host, fixtures and shared test support into codewhale-engine; wire TUI/CLI to that owner. Preserve human-decision construction boundaries and lower reusable test helpers. Remove unused copied dependencies and repair path-based guards, scripts and crate maps. Correct the blocking scanner external-module scope leak; raised counts equal the corrected pre-move source. Refresh embedded built-in hashes after path-only bundle regeneration. Restore the provider-free prompt budget to the exact pre-b984e31290 macOS bytes and representative identities; tool catalogs are unchanged. Portable prompt-fixture pinning remains follow-up work. Local validation: Engine/TUI/CLI clippy --tests --no-deps -D warnings passed with the existing allow-list; production CLI check passed; fmt passed. Focused native run: 705 passed / 83 failed initially; after hash/path repairs, 81 affected cases plus 2 existing build-relocation cases passed (83/83). Thus 786/788 original cases pass; 2 compiled-release-image cases lack input and are not qualified. Frozen input inventories unchanged. macOS test-link unwind-table warnings remain. Four metric tests pass; all 55 budgets pass. Host Node: 413 pass, 7 skip; Bun: 414 pass, 6 skip. Existing scanner checks: 34 + 33 pass. Compiled-delivery synthetic fixtures: 7 pass. Web: 42 pass. Import, blocking, dead-code, coarse-map, version and facts checks pass. CW-7701. No hosted CI, provider call, release build or publication. Stage A part 2 and the old App Server/ratatui dependencies remain separate. | 7 days ago | |
fix(transfer): report to the canonical repo and use available container images Point Rust and TypeScript default GitHub report routing to codewhale-hq/Codewhale, regenerate the extension host and its reviewed harness digest, and update parity fixtures together. Container guides use the verified public ghcr.io/hmbown image namespace while distinguishing published v0.10.0 from a current-source build; the new org image has not been published yet. Validation: hermetic focused GitHub/harness Rust suite 49 passed, 0 failed; GitHub adapter Node tests 10 passed, 0 failed; npm test 1286 passed, 0 failed, 7 skipped and npm run check:web passed. Public image manifests for latest and v0.10.0 returned 200 with the same digest; new-org publication remains separate. English/Chinese examples checked together. git diff --check passed. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
fix(release): align reviewed UI admission and terminal kit [skip ci] Refuse converted DSH client UI before minting asset grants, using the existing reviewed conversion bytes. Keep Native and MCP activation paths unchanged; unmodified DSH command UI remains unsupported. Correct the converter and compatibility notes to match the enforced behavior. Reuse codewhale-ratatui8311b65 design tokens5.0 and raised-panel contrast handling in the existing vendor, preserving Engine surface and motion behavior. Replace the Windows clipboard simulator with the existing Ctrl+G draft stash and exact24-line Unicode comparison. No inference or Enter is used; send-once and provider delivery are outside that check. Synchronize embedded changelog and existing feature projections; format the already-landed registry reconciliation expression. Verified before freeze: cargo fmt --all -- --check; version contracts (24 linked issue references); OHOS target dependency/bindgen contracts; web check:facts; Node syntax; git diff --check, all exit0. Independent read-only UI admission review found no blocking defect. The earlier 147-equivalent Linux source passed all6 selected existing cases,1case per command,0failures; original failed Node-shim result is retained. Native compilation, kit checks and HTTP refusal observations for this new frozen batch, plus real Windows acceptance, remain pending. No new product tests/comments, source push, CI dispatch or publication here. | 18 hours ago | |
fix(release): qualify 0.10.3 Windows 64-bit imports [skip ci] Release candidate run 42381818665 on 549ff01ebb stopped the Windows import guard on 12 x64 and 10 ARM64 pairs, every one from a DLL the profiles already listed. ARM64: existing windows-arm64-export-probe.yml run 42389141087 on Windows 11 ARM64 26200.9725 resolved 444/444 imports of that candidate's executables (sha256 38558ab2...). Only the 10 probe-resolved pairs were added (460 -> 470); the probe receipt replaces the 2026-10-16 qualification fields. x64: no native x64 export probe exists. The 12 pairs are recorded as namedApiContracts with Microsoft documentation sources, all below the unchanged 14393 floor, and labelled separately from the #6953 reporter-observed exports (456 -> 468). Floors, guard and x86 profile are unchanged. Verified: the checker's own parse_imports over the retained llvm-objdump outputs for all six candidate executables (3 x64 at 452 pairs, 3 ARM64 at 444) leaves zero unqualified pairs. The executables were not kept locally, so the checker was not rerun on the bytes; the next frozen candidate's RC import job is the real check. Not a 14393, installer or startup run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 14 hours ago | |
feat(plugins): update reviewed DSH compatibility to rc.5 [skip ci] Use founder-selected DSH 0.2.1-rc.5 and Cordis 4.0.5. Refresh vendored loader/include/group and pure hook helpers, npm pins, provenance and license notices. Retain reviewed imports, non-writing composition and the explicitly older preset adapter; Engine remains the only execution/prompt authority. Compatibility v3 groups the same 17 injectable names into DSH, Cordis and Codewhale sources. Boolean deferLoading is a no-op hint; non-booleans and when are refused. A direct probe caught the inherited when acceptance gap and verified its repair. The changed compatibility digest requires fresh Native plugin review/trust; no live trust state was edited. Local checks: typecheck/build pass; Node 413 pass, 7 skip; Bun 414 pass, 6 skip. Four direct admission/execution probes pass on each runtime. Twenty-five vendored source/candidate hash pairs verified, plus unchanged built-in hashes and the copied Rust compatibility asset. Native batch: 354/357 initially pass; two goal goldens and stale notice headings repaired, then 3/3 affected checks pass using the same binaries. Four metric tests pass; 55 budgets match exactly. Engine/TUI/plugins clippy --tests passes, fmt and blocking/dead-code budgets pass. Frozen native inputs remained unchanged. Six JS compiled-image cases and two Rust compiled-image cases remain unqualified; native test-link unwind warnings remain. No hosted CI, live-provider call or release qualification. CW-7054. Receipts: artifacts/dsh-upgrade-takeover-20261031/REPORT.md. | 7 days ago | |
docs(i18n): move Indonesian docs into docs/id/ with redirect stubs - Move all 10 docs/*.id.md files into docs/id/ (dropping the .id suffix), leaving English redirect stubs at the old paths for one release cycle - Update README.id.md links to point at docs/id/ - Note docs/id/ alongside docs/zh_hans/ in LOCALIZATION.md's scope note Part of #5482 Signed-off-by: Shizuku <2163018547@qq.com> | 2 months ago | |
feat(engine): eager sub-agents and goals by default, with clearer tool text The founder-approved 0.10.3 batch from artifacts/eager-delegation-20261107/FINAL-CHANGES.md, all ten items. This is one declared re-pin of the session-pinned prefix (docs/CACHE.md): BASE_PROMPT and several eager tool descriptions change on upgrade, and nothing changes mid-session. 1. BASE_PROMPT gains "Delegation and goals". Independent parts of a request go to agent children started together in one message. Results arrive on their own, so never poll or sleep, and end the turn when only waiting remains. Each child gets a complete prompt and a disjoint file scope; the parent inspects a write-capable child's evidence, reviews the final diff and runs the checks. An independent reviewer tries to refute a non-trivial change before it is called done. create_goal is for any direct request, in any language, that describes a verifiable end state needing more than one turn. A goal is blocked only when the same concrete obstacle persists; difficulty is not blocked. Cost alone is not a reason to stop, and only limits the user or configuration sets apply. The scope line keeps express authorization for spending real money (purchases, paid providers, billing) and adds the founder-approved sentence "Sub-agents, workflows and goals within the current request are in scope." GOAL_CONTINUATION_PROMPT drops the stale tool_search sentence (update_goal is eager), asks for remaining independent work to be split across agent workers before the next verification pass, and uses the same blocked rule. 2. The engine no longer appends the Operate contract (record_mode_context). Its reviewer, cost and write-child-evidence lines now live in BASE_PROMPT for every session. Every saved wording stays recognized, so restored sessions replay it as internal state and compaction still keeps it. 3. The agent start receipt carries next: "Results arrive automatically; continue other work or end your turn." 4. The agent description leads with intent ("Delegate focused work and keep working. Start early; one agent per independent part, same message."), gives one trigger per role, adds a child-prompt brief with one worked example, names workflow and Run as the real tools, and drops the "In Operate" and "Legacy action=" sentences. The schema is unchanged. 5. create_goal, its token_budget property and update_goal (description and status property) say when to start a goal and what complete, blocked and yield mean, without judge jargon. The status enum and parser are unchanged, and the token_budget parameter stays. 6. The bundled goals skill (personal resolutions in goals.md) becomes personal-goals with aliases-for: goals, so saved references still resolve and the skills index no longer reads like goal mode. It keeps the generation-12 introduction, so a user who deleted goals does not get it back. On upgrade, an untouched goals copy (a shipped body by hash, SKILL.md its only entry, and no personal-goals directory yet) is renamed to personal-goals and then refreshed by the ordinary generation-20 upgrade, because its body hash is listed under personal-goals. An edited or extended copy stays where it is. Known limitation: a [skills.bundled] entry that names "goals" now reports as unknown and does not apply to personal-goals. delegate no longer forbids delegating final verification and treats the roster as optional; best-of-n uses the general and implement roles and drops "In Operate mode" and the 16-worker figure. v4-best-practices is not changed: it is a cfg(test) v4 migration fixture, not a bundled skill, so editing it would falsify the fixture and reach no user. 7. The tasks schema stops advertising mode=operate; the hidden legacy alias schema and the free-string parser still accept it. harness no longer names the hidden rlm tool (description and overview), list_dir loses its harness meta sentence, and TOOL_SURFACE.md (and zh_hans) drop Operate. goal.rs's Run action="verifiers" names a real deferred tool, which a well-formed first call activates, so it stays. 8. Workflow max_concurrent defaults to 64 (was 16), matching sub-agents. The workflow-js per-run clamp WORKFLOW_MAX_CONCURRENT moves from 16 to 128, the sub-agent hard maximum; without it the clamp would have kept every run at 16 and explicit configs above 16 would not take effect. No spend caps are added, and the high-budget approval trigger is untouched because the default token budget is 0. Docs and config.example.toml follow. 9. Each child's task message ends with its name, its scope (read-only, or may edit files within its assignment) and "Your final answer is delivered to the parent automatically; include the result and its evidence." This is the child seed built by the runner in subagent/engine.rs, beside the role prompt that carries SUBAGENT_OUTPUT_FORMAT; the role prompts that children share are unchanged. 10. tool_search lists the commonly registered deferred groups (Git, Run, Web, tasks, github, automation, lsp, review, session_search, terminal/*, apply_patch, grep_files, MCP) and says a listed tool can be called by name. Memory tools are opt-in, so they are not listed. Generating the list from the live catalog is the next-patch item. Bytes and cache: - /preview-request before, installed 0.10.3 (7b8a634, catalog-equivalent to main) on macOS with an isolated offline HOME: tool schemas 40,854 canonical JSON bytes, system 16,662, base prompt 3,336, 18 active of 59. - /preview-request after, a debug build of this diff on Linux (Boat farm) with the same isolated offline HOME and prompt: tool schemas 40,173 canonical JSON bytes (-681, eager bytes did not grow), base prompt 4,352 bytes. - Source delta on eager tool schemas: -681 bytes (agent 2,370 -> 1,737, create_goal -244, update_goal -129, tool_search 71 -> 396). BASE_PROMPT grows to 4,352 bytes in the system region. Tests changed with the behavior: prompts.rs universal_prompt_does_not_expose_control_plane_ceremony no longer forbids "sub-agent" and "dispatch, join" (the founder reversed that decision) and still forbids sentinel and runtime-event jargon; the deleted agent_tool_description_states_the_operate_child_approval_rule pinned the dropped Operate sentence; the tasks enum test, the workflow default tests, the Operate probes (now 0 contracts) and the delegate generation-18 reconstruction chain follow; the skills fixture moves to generation 20, with the old delegate and best-of-n bodies and the old goals body (under personal-goals) listed by hash. The prompt and event conformance goldens are re-recorded for the re-pin. Verified on the Boat farm (Linux x86_64), base 4c5426f9/f0fb6adb plus only this diff (engine.rs, subagent/mod.rs, subagent/tests.rs, tasks.rs and config.example.toml shipped as HEAD plus this batch's hunks): - cargo test -p codewhale-engine --lib, focused filters (prompts, goal, tasks, harness, canonical actions, agent description and parent surface ceiling, lifecycle, launch receipt, assignment prompt, limits, compaction last round, tool catalog, runtime handoff, registry, workflow): 533 passed, 0 failed. The final state on base f0fb6adb, same filters plus core::engine::tests::operate_ and mode_notice: 539 passed, 1 failed. The failure, create_mode_enum_advertises_neither_operate_nor_yolo, came from the farm copy of tasks.rs missing this commit's third hunk; the first run carried exactly the committed tasks.rs, and the test passed. - cargo test -p codewhale-skills: 182 passed, 0 failed, on the final rename migration; a throwaway migration check (not committed) covering untouched, edited, extended, deleted and fresh installs: 5 passed. - cargo test -p codewhale-config --lib workflow_config: 3 passed; cargo test -p codewhale-workflow-js: 12 + 82 passed. - cargo test -p codewhale-tui --lib conformance::prompt:: conformance::events::, update pass then compare pass: 5 passed each; the re-recorded goldens come from that run on base cd7f5b32 (conformance tool schemas 19,840 -> 19,792 bytes, system +1,033 bytes, matching the source delta); nothing that landed since touches the surfaces they capture. - cargo clippy -p codewhale-engine -p codewhale-skills -p codewhale-config -p codewhale-workflow-js --all-targets --all-features with the Lint job's flags: clean; skills clippy re-run on the final migration: clean. Local: rustfmt clean on every touched file; scripts/preflight.sh --check passes except the blocking-calls budget, which fails only on another session's untracked crates/engine/src/session_image_prune.rs (4 > 0), not part of this commit; dead-code budget 137 of 137. Not verified: a macOS run of the after binary (the before figure is macOS, the after figure Linux; the measured -681 equals the source delta), any live provider turn, and DSH's sleep/poll probe on the target models. Refs: CW-7852 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 8 hours ago | |
docs(i18n): complete the Tier-2 should-have docs for EPIC #5482 Translate the 17 remaining should-have user-facing docs into Simplified Chinese under docs/zh_hans/, each with a language banner on its English original: PLUGINS, PLUGIN_BUNDLES, MEMORY, SANDBOX, WORKFLOW_AUTHORING, FLEET_WORKFLOW_TUTORIAL, DOCKER, TERMUX, ACCESSIBILITY, CACHE, CATALOG_REFRESH, BUILD_PERFORMANCE, VOICE, LOCALIZATION, REBRAND, HarmonyOS, CNB_MIRROR. With WEB.md already landed this closes the Tier-2 should-have list. Link hygiene in the same pass: 39 cross-links inside docs/zh_hans/ now point at the local translations with translated anchors, three pre-existing dead anchors are fixed, and docs/zh_hans/README.md lists the new entries. Structure is 1:1 with the English originals for all 17 pairs (headings, code fences, tables, lists, images and link counts verified); 205 relative links and 44 anchors resolve across docs/zh_hans. Refs #5482 | 1 month ago | |
fix(review): withhold unsupported Action findings from PR feedback [skip ci] The live mention review on PR 7126 published two suspected hypotheses as concerns despite recording that surrounding code was unavailable. The separate publisher now requires reproduced/traced evidence with nonempty detail, requires introduced authorship for inline comments, and collapses pre-existing findings. Model summaries, risk assessments and unlinked suggestions stay in the analysis artifact so they cannot repeat a withheld allegation. An empty result remains advisory and links to analysis/coverage. This is an evidence-record boundary, not independent reproduction or proof of accuracy; the Engine remains the review authority. Validation: existing Action checks 8 passed, 0 failed; Node syntax checks and diff whitespace check passed. Offline replay of actual run 40835017974 artifact withheld both suspected claims and emitted zero inline comments. Direct local variations covered empty/missing evidence, introduced/preexisting/unknown attribution, escaping and deduplication; a mocked publisher run reported 0 eligible and 2 withheld findings without network/provider calls or GitHub writes. No new tests, Rust build or hosted CI. Legacy post:true retains its pinned CLI policy. Refs CW-7503. | 10 days ago | |
feat(action): add self-serve GitHub review bot setup (CW-6869) [skip ci] Generate a workflow with immutable Action refs, exact release/model selection, separate read-only analysis and credential-isolated publication, and optional existing GitHub App identity. Reuse the Engine review command and installer. Accept exact review mentions from current write/maintain/admin users; recheck original and rerunning actors, comment identity/body and current revisions. Opt-in inert fork diffs only through trusted default-branch manual or issue comment triggers. Mentions require the separate publisher. No candidate code, hooks or project configuration is executed. Share provider-key metadata with the generator and redact every supported key, including OrcaRouter. Local verification: existing node review tests 8 passed, 0 failed; Node syntax checks and actionlint pass for default-token and App workflows. Direct offline execution completed mention -> findings -> inline publisher, refused 10 unsafe request cases, refused fork analysis without opt-in and cross-attempt findings, and confirmed provider-key isolation/redaction. No new tests or code comments. Live GitHub/provider acceptance follows separately; no release or moving tag. | 10 days ago | |
feat(permissions): Ask asks before every edit; add Accept Edits [skip ci] Ask ( suggest) now opens a card for file edits inside the workspace too, as its name, the Plan handoff copy ("Edits and commands ask you first") and the founder-agreed model (2026-11-07, modeled on Claude Code's permission modes) promise. CW-7663 found that the desktop edit card could not appear with default settings because Ask ran in-repository writes unasked. The #5185 in-workspace write carve-out moves to a new posture, Accept Edits (ApprovalMode::AcceptEdits; settings and config.toml accept-edits, Runtime wire accept_edits), between Ask and Auto-Review: an edit whose every target stays inside the workspace git work tree runs without a card; .git, .codewhale, .env*, credential and key files, folders without git, commands, network and MCP actions ask exactly as in Ask. Everywhere else Accept Edits is an asking posture (ApprovalMode::is_ask_family): repo-law asks, sandbox escalation and Computer Use consent open a card; remembered grants treat it as Ask; non-authoritative provenance narrows it to Ask with a recorded narrowing event; live-authority narrowing ranks it between Ask and Auto-Review. - Shift+Tab: Ask -> Accept Edits -> Auto-Review -> Full Access. - Settings schema rows (permission_posture, approval_mode, approval_policy), /permissions, /status, /config, the Plan handoff ("Work (Accept Edits)"), footer chip and help strings; 7 new and 3 updated strings in all 15 locale packs. - config.toml approval_policy = "accept-edits"; a project file may only tighten: auto < accept-edits < on-request < never. - ACP runs Accept Edits as Ask, because ACP turns never apply the carve-out. - /import-claude maps Claude Code's acceptEdits to Accept Edits. - Docs: MODES, KEYBINDINGS, CONFIGURATION, INSTALL, GUIDE, README and its 18 translations (restamped), zh_hans mirrors, features.toml row, CHANGELOG entry, regenerated web/data/agent-docs.generated.json. Stated limits: write-capable workers keep #5186's in-folder edits under Ask (their spawn card is the consent); modes, Tab and Operate are unchanged pending the founder's answers to the modes/postures design (CW/artifacts/modes-postures-20261107/DESIGN.md D1-D4; Operate in CW-7849). Verification (shared checkout, source b3d18fe6bc plus this diff): - scripts/dev-cargo.sh test --locked --offline -j6, focused filters (approval_mode, posture, permission*, carve_out, authority::, protocol_parity, repo_law, sandbox_escalation, computer_use, narrow, approval_request, runtime_policy, project_config, settings_schema, plan_handoff, import_claude, file_edit_card, config_choice, keybinding, locale parity): codewhale-engine lib 263 passed, 0 failed; codewhale-tui lib 103 passed, 0 failed; codewhale-app-server lib 13 passed, 0 failed; codewhale-config 35 passed; codewhale-runtime 20 passed; codewhale-localization 15 passed; codewhale-execpolicy 12 passed; all 0 failed. Includes write_carve_out_posture_is_exactly_ accept_edits, workspace_write_carve_out_covers_accept_edits_only, file_write_card_names_the_missing_repository..., permission_cycle_is_a_ closed_loop..., cycle_approval_scenario, permission_postures_persist_ across_restart, shift_tab_migrates_user_root_policy..., plan handoff locale test, file_edit_card_says_when_it_asks_for_lack_of_a_git_repo. - codewhale-tui --test feature_registry: this row passes; the run fails only on another session's uncommitted clipboard-image-prune row, which this commit does not contain. - rustfmt --check on every touched .rs file; check-tui-locale-parity PASS (2823 keys x 15 packs); check-tui-product-vocabulary exit 0; check-readme-translations OK (18, stamp 20d0bb7c0784); check-readme-locales PASS; check-versions OK; check-dead-code-budget PASS (137). check-blocking-calls-budget fails only on another session's untracked crates/engine/src/session_image_prune.rs (not in this commit). - Not run: a live desktop/TUI turn showing the edit card (CW-7663's App acceptance); full workspace suites (final release validation owns them). Tests ran on the shared working tree, which also held other sessions' uncommitted edits; this commit stages only this slice's hunks (private index, HEAD + these changes). Refs CW-7663, CW-7849 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 7 hours ago | |
refactor(runtime): move child_env, process_tree, external_credentials and dsh_credentials out of tui RS-10 narrowed (docs/design/TUI_DECONSTRUCTION.md, P1). Moves four modules that already had no upward references into codewhale-runtime and rewrites every caller to codewhale_runtime:: directly, with no path alias. runtime_log and working_set stay in tui: their test code reaches back into config, session_manager, automation_manager, compaction and tools, and working_set needs the ignore crate. shell_dispatcher stays: tests/integration includes it by #[path]. Runtime gains wait-timeout and, off OHOS, portable-pty (both already in the lock for tui). Test helpers tui's tests call across the crate boundary (external_credentials side-effect trap, process_tree pid helpers) are gated on cfg(any(test, feature = "test-support")) instead of cfg(test), and the items tui reaches are now pub; widen.py chose the rest. Local, not CI: cargo check --workspace --all-targets --locked exit 0 (-D warnings); cargo test -p codewhale-runtime --lib for the four modules 43 passed, 0 failed; module_graph.py --check PASS (prod 0, test 0, late 1, uilib 0); cargo fmt --all --check clean. Not run: the tui test suite, which links tests that call the widened helpers (compile only). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> | 14 days ago | |
docs(harmonyos): retain qualification limits and refresh generated guide Preserve the contributor rewrite while separating existing device probes from unverified TUI/editor/model workflows. Keep the unsupported-lock exception and describe explicit build stamps correctly in both languages. Verified: nine sections in each language, source review, and actual incumbent deriveAgentDocs over 25 topics with every public input hash checked. Regeneration also refreshes seven inherited stale public doc inputs. No device run or native qualification claim. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 5 days ago | |
docs(i18n): move Indonesian docs into docs/id/ with redirect stubs - Move all 10 docs/*.id.md files into docs/id/ (dropping the .id suffix), leaving English redirect stubs at the old paths for one release cycle - Update README.id.md links to point at docs/id/ - Note docs/id/ alongside docs/zh_hans/ in LOCALIZATION.md's scope note Part of #5482 Signed-off-by: Shizuku <2163018547@qq.com> | 2 months ago | |
feat(permissions): Ask asks before every edit; add Accept Edits [skip ci] Ask ( suggest) now opens a card for file edits inside the workspace too, as its name, the Plan handoff copy ("Edits and commands ask you first") and the founder-agreed model (2026-11-07, modeled on Claude Code's permission modes) promise. CW-7663 found that the desktop edit card could not appear with default settings because Ask ran in-repository writes unasked. The #5185 in-workspace write carve-out moves to a new posture, Accept Edits (ApprovalMode::AcceptEdits; settings and config.toml accept-edits, Runtime wire accept_edits), between Ask and Auto-Review: an edit whose every target stays inside the workspace git work tree runs without a card; .git, .codewhale, .env*, credential and key files, folders without git, commands, network and MCP actions ask exactly as in Ask. Everywhere else Accept Edits is an asking posture (ApprovalMode::is_ask_family): repo-law asks, sandbox escalation and Computer Use consent open a card; remembered grants treat it as Ask; non-authoritative provenance narrows it to Ask with a recorded narrowing event; live-authority narrowing ranks it between Ask and Auto-Review. - Shift+Tab: Ask -> Accept Edits -> Auto-Review -> Full Access. - Settings schema rows (permission_posture, approval_mode, approval_policy), /permissions, /status, /config, the Plan handoff ("Work (Accept Edits)"), footer chip and help strings; 7 new and 3 updated strings in all 15 locale packs. - config.toml approval_policy = "accept-edits"; a project file may only tighten: auto < accept-edits < on-request < never. - ACP runs Accept Edits as Ask, because ACP turns never apply the carve-out. - /import-claude maps Claude Code's acceptEdits to Accept Edits. - Docs: MODES, KEYBINDINGS, CONFIGURATION, INSTALL, GUIDE, README and its 18 translations (restamped), zh_hans mirrors, features.toml row, CHANGELOG entry, regenerated web/data/agent-docs.generated.json. Stated limits: write-capable workers keep #5186's in-folder edits under Ask (their spawn card is the consent); modes, Tab and Operate are unchanged pending the founder's answers to the modes/postures design (CW/artifacts/modes-postures-20261107/DESIGN.md D1-D4; Operate in CW-7849). Verification (shared checkout, source b3d18fe6bc plus this diff): - scripts/dev-cargo.sh test --locked --offline -j6, focused filters (approval_mode, posture, permission*, carve_out, authority::, protocol_parity, repo_law, sandbox_escalation, computer_use, narrow, approval_request, runtime_policy, project_config, settings_schema, plan_handoff, import_claude, file_edit_card, config_choice, keybinding, locale parity): codewhale-engine lib 263 passed, 0 failed; codewhale-tui lib 103 passed, 0 failed; codewhale-app-server lib 13 passed, 0 failed; codewhale-config 35 passed; codewhale-runtime 20 passed; codewhale-localization 15 passed; codewhale-execpolicy 12 passed; all 0 failed. Includes write_carve_out_posture_is_exactly_ accept_edits, workspace_write_carve_out_covers_accept_edits_only, file_write_card_names_the_missing_repository..., permission_cycle_is_a_ closed_loop..., cycle_approval_scenario, permission_postures_persist_ across_restart, shift_tab_migrates_user_root_policy..., plan handoff locale test, file_edit_card_says_when_it_asks_for_lack_of_a_git_repo. - codewhale-tui --test feature_registry: this row passes; the run fails only on another session's uncommitted clipboard-image-prune row, which this commit does not contain. - rustfmt --check on every touched .rs file; check-tui-locale-parity PASS (2823 keys x 15 packs); check-tui-product-vocabulary exit 0; check-readme-translations OK (18, stamp 20d0bb7c0784); check-readme-locales PASS; check-versions OK; check-dead-code-budget PASS (137). check-blocking-calls-budget fails only on another session's untracked crates/engine/src/session_image_prune.rs (not in this commit). - Not run: a live desktop/TUI turn showing the edit card (CW-7663's App acceptance); full workspace suites (final release validation owns them). Tests ran on the shared working tree, which also held other sessions' uncommitted edits; this commit stages only this slice's hunks (private index, HEAD + these changes). Refs CW-7663, CW-7849 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 7 hours ago | |
fix(dsh): read current DeepSeek Harness prerelease versions as semver The launcher integration parsed only MAJOR.MINOR.PATCH[-rc.N], so a current DSH release such as 0.1.7-alpha.2 was reported as offline and refused. The hand-rolled parser is replaced by the semver crate the tui crate already uses; precedence comparison ignores build metadata. Such a version is now stale-version (launchable once connected, unverified), like rc.7 was. VERIFIED_DSH_VERSION, the --patch check and the offline mapping for text that is not a version are unchanged; no newer version is claimed verified. cargo test -p codewhale-tui --lib integrations::dsh: 42 passed; 0 failed (run by the implementing agent; rustfmt check clean on both files). Full gate not run. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
docs(triage): point the agent-ready standard at the Agent task form [skip ci] docs/ISSUE_TRIAGE.md pointed at an "agent-ready issue standard" in codewhale-ops that does not exist; only old evidence copies of this page mention it. The standard in practice is the public Agent task issue form (.github/ISSUE_TEMPLATE/agent-task.yml), which applies the agent-ready label and requires a goal, a plan by path, done-when outcomes and verification commands for an agent with no other context. Verified: the relative link resolves from docs/. No CHANGELOG line: contributor documentation. Refs CW-7860 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 9 hours ago | |
docs(i18n): move Indonesian docs into docs/id/ with redirect stubs - Move all 10 docs/*.id.md files into docs/id/ (dropping the .id suffix), leaving English redirect stubs at the old paths for one release cycle - Update README.id.md links to point at docs/id/ - Note docs/id/ alongside docs/zh_hans/ in LOCALIZATION.md's scope note Part of #5482 Signed-off-by: Shizuku <2163018547@qq.com> | 2 months ago | |
feat(permissions): Ask asks before every edit; add Accept Edits [skip ci] Ask ( suggest) now opens a card for file edits inside the workspace too, as its name, the Plan handoff copy ("Edits and commands ask you first") and the founder-agreed model (2026-11-07, modeled on Claude Code's permission modes) promise. CW-7663 found that the desktop edit card could not appear with default settings because Ask ran in-repository writes unasked. The #5185 in-workspace write carve-out moves to a new posture, Accept Edits (ApprovalMode::AcceptEdits; settings and config.toml accept-edits, Runtime wire accept_edits), between Ask and Auto-Review: an edit whose every target stays inside the workspace git work tree runs without a card; .git, .codewhale, .env*, credential and key files, folders without git, commands, network and MCP actions ask exactly as in Ask. Everywhere else Accept Edits is an asking posture (ApprovalMode::is_ask_family): repo-law asks, sandbox escalation and Computer Use consent open a card; remembered grants treat it as Ask; non-authoritative provenance narrows it to Ask with a recorded narrowing event; live-authority narrowing ranks it between Ask and Auto-Review. - Shift+Tab: Ask -> Accept Edits -> Auto-Review -> Full Access. - Settings schema rows (permission_posture, approval_mode, approval_policy), /permissions, /status, /config, the Plan handoff ("Work (Accept Edits)"), footer chip and help strings; 7 new and 3 updated strings in all 15 locale packs. - config.toml approval_policy = "accept-edits"; a project file may only tighten: auto < accept-edits < on-request < never. - ACP runs Accept Edits as Ask, because ACP turns never apply the carve-out. - /import-claude maps Claude Code's acceptEdits to Accept Edits. - Docs: MODES, KEYBINDINGS, CONFIGURATION, INSTALL, GUIDE, README and its 18 translations (restamped), zh_hans mirrors, features.toml row, CHANGELOG entry, regenerated web/data/agent-docs.generated.json. Stated limits: write-capable workers keep #5186's in-folder edits under Ask (their spawn card is the consent); modes, Tab and Operate are unchanged pending the founder's answers to the modes/postures design (CW/artifacts/modes-postures-20261107/DESIGN.md D1-D4; Operate in CW-7849). Verification (shared checkout, source b3d18fe6bc plus this diff): - scripts/dev-cargo.sh test --locked --offline -j6, focused filters (approval_mode, posture, permission*, carve_out, authority::, protocol_parity, repo_law, sandbox_escalation, computer_use, narrow, approval_request, runtime_policy, project_config, settings_schema, plan_handoff, import_claude, file_edit_card, config_choice, keybinding, locale parity): codewhale-engine lib 263 passed, 0 failed; codewhale-tui lib 103 passed, 0 failed; codewhale-app-server lib 13 passed, 0 failed; codewhale-config 35 passed; codewhale-runtime 20 passed; codewhale-localization 15 passed; codewhale-execpolicy 12 passed; all 0 failed. Includes write_carve_out_posture_is_exactly_ accept_edits, workspace_write_carve_out_covers_accept_edits_only, file_write_card_names_the_missing_repository..., permission_cycle_is_a_ closed_loop..., cycle_approval_scenario, permission_postures_persist_ across_restart, shift_tab_migrates_user_root_policy..., plan handoff locale test, file_edit_card_says_when_it_asks_for_lack_of_a_git_repo. - codewhale-tui --test feature_registry: this row passes; the run fails only on another session's uncommitted clipboard-image-prune row, which this commit does not contain. - rustfmt --check on every touched .rs file; check-tui-locale-parity PASS (2823 keys x 15 packs); check-tui-product-vocabulary exit 0; check-readme-translations OK (18, stamp 20d0bb7c0784); check-readme-locales PASS; check-versions OK; check-dead-code-budget PASS (137). check-blocking-calls-budget fails only on another session's untracked crates/engine/src/session_image_prune.rs (not in this commit). - Not run: a live desktop/TUI turn showing the edit card (CW-7663's App acceptance); full workspace suites (final release validation owns them). Tests ran on the shared working tree, which also held other sessions' uncommitted edits; this commit stages only this slice's hunks (private index, HEAD + these changes). Refs CW-7663, CW-7849 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 7 hours ago | |
refactor(engine): extract the shared runtime from the TUI [skip ci] Move the Engine band, extension host, fixtures and shared test support into codewhale-engine; wire TUI/CLI to that owner. Preserve human-decision construction boundaries and lower reusable test helpers. Remove unused copied dependencies and repair path-based guards, scripts and crate maps. Correct the blocking scanner external-module scope leak; raised counts equal the corrected pre-move source. Refresh embedded built-in hashes after path-only bundle regeneration. Restore the provider-free prompt budget to the exact pre-b984e31290 macOS bytes and representative identities; tool catalogs are unchanged. Portable prompt-fixture pinning remains follow-up work. Local validation: Engine/TUI/CLI clippy --tests --no-deps -D warnings passed with the existing allow-list; production CLI check passed; fmt passed. Focused native run: 705 passed / 83 failed initially; after hash/path repairs, 81 affected cases plus 2 existing build-relocation cases passed (83/83). Thus 786/788 original cases pass; 2 compiled-release-image cases lack input and are not qualified. Frozen input inventories unchanged. macOS test-link unwind-table warnings remain. Four metric tests pass; all 55 budgets pass. Host Node: 413 pass, 7 skip; Bun: 414 pass, 6 skip. Existing scanner checks: 34 + 33 pass. Compiled-delivery synthetic fixtures: 7 pass. Web: 42 pass. Import, blocking, dead-code, coarse-map, version and facts checks pass. CW-7701. No hosted CI, provider call, release build or publication. Stage A part 2 and the old App Server/ratatui dependencies remain separate. | 7 days ago | |
refactor(skills): own discovery and share configurable routing index [skip ci] Move skill discovery, provenance, mutation and bundled content to codewhale-skills and migrate every consumer without a legacy facade. Keep native selection/lifetime checks in the existing host manager and refuse native authority when no host bridge is installed. Preserve bundled bytes, reviewed snapshot identity, workspace trust and the Engine decision mint. Add validated skills.listing_max_description_chars and skills.listing_budget_fraction with independent profile inheritance. Keep the 400-character/5-percent defaults and existing total budget bounds. Use the same renderer for parent and fresh/nested child catalogues, context loss notices and localized inspect notes. Remove the unbounded child-only catalogue. Update all 15 locale notes, current en/zh docs, release order, test selectors and generated facts; correct the old bundled Feishu claim. Local validation on frozen source: skills182, runtime config2, localization54 and command-contract11 passed. TUI lib and registry compiled in21m56s (existing oversized eh_frame warning). The scoped integration had 277 passes and one metadata-summary-length failure; after the docs-only correction both registry cases passed, covering278 distinct selected TUI/registry cases. Final generated metadata30 passed. Existing fixtures now cover configured80/400/1024 caps, fraction/profile validation, localized notes, authority-bound child catalogues and real host startup for restored native receipts. No new test functions or code comments were added. Workspace format, command/runtime boundaries, blocking budget569sites in 169files, dead-code budget164, actual Cargo publication order, package list (all62 skill assets) and diff checks passed. Only five non-Rust metadata/doc paths changed after native compilation, recorded separately; native inputs remain identical. No full-suite, hosted CI, real-provider/device or release qualification. CW-7521 bundled policy and full decomposition remain open. Refs CW-6129, CW-7531, #7073 | 9 days ago | |
docs(i18n): move Indonesian docs into docs/id/ with redirect stubs - Move all 10 docs/*.id.md files into docs/id/ (dropping the .id suffix), leaving English redirect stubs at the old paths for one release cycle - Update README.id.md links to point at docs/id/ - Note docs/id/ alongside docs/zh_hans/ in LOCALIZATION.md's scope note Part of #5482 Signed-off-by: Shizuku <2163018547@qq.com> | 2 months ago | |
refactor(engine): extract the shared runtime from the TUI [skip ci] Move the Engine band, extension host, fixtures and shared test support into codewhale-engine; wire TUI/CLI to that owner. Preserve human-decision construction boundaries and lower reusable test helpers. Remove unused copied dependencies and repair path-based guards, scripts and crate maps. Correct the blocking scanner external-module scope leak; raised counts equal the corrected pre-move source. Refresh embedded built-in hashes after path-only bundle regeneration. Restore the provider-free prompt budget to the exact pre-b984e31290 macOS bytes and representative identities; tool catalogs are unchanged. Portable prompt-fixture pinning remains follow-up work. Local validation: Engine/TUI/CLI clippy --tests --no-deps -D warnings passed with the existing allow-list; production CLI check passed; fmt passed. Focused native run: 705 passed / 83 failed initially; after hash/path repairs, 81 affected cases plus 2 existing build-relocation cases passed (83/83). Thus 786/788 original cases pass; 2 compiled-release-image cases lack input and are not qualified. Frozen input inventories unchanged. macOS test-link unwind-table warnings remain. Four metric tests pass; all 55 budgets pass. Host Node: 413 pass, 7 skip; Bun: 414 pass, 6 skip. Existing scanner checks: 34 + 33 pass. Compiled-delivery synthetic fixtures: 7 pass. Web: 42 pass. Import, blocking, dead-code, coarse-map, version and facts checks pass. CW-7701. No hosted CI, provider call, release build or publication. Stage A part 2 and the old App Server/ratatui dependencies remain separate. | 7 days ago | |
fix: retain the vision thinking off switch Signed-off-by: gannp <36723715+gannp@users.noreply.github.com> | 10 days ago | |
refactor(split): extract dependencies, snapshot, lsp and repl crates (S15, CW-6129) [skip ci] New crates codewhale-dependencies (external-tool resolution and bounded subprocess probes), codewhale-snapshot (pre/post-turn side-repo snapshots), codewhale-lsp (language-server client) and codewhale-repl (Python REPL runtime and RLM context files; write_context_file lives here). Callers rewired, no facades; FD-04 forks gated like S14. Implemented on Boat VM vm3 by the split session; integrated by the coordinator. Verification in the S16 commit. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 11 days ago | |
docs(i18n): move Indonesian docs into docs/id/ with redirect stubs - Move all 10 docs/*.id.md files into docs/id/ (dropping the .id suffix), leaving English redirect stubs at the old paths for one release cycle - Update README.id.md links to point at docs/id/ - Note docs/id/ alongside docs/zh_hans/ in LOCALIZATION.md's scope note Part of #5482 Signed-off-by: Shizuku <2163018547@qq.com> | 2 months ago | |
docs(web): explain plugins and MCP with verified Computer Use setup [skip ci] Answer the integration chooser, actual catalog prerequisites, supported plugin formats, direct-versus-plugin MCP authentication and troubleshooting on the existing paper/blue pages. Link the plugin guide from docs navigation and refresh its plain-text index. Add explicit Computer Use GitHub/contributor links in all18locales and version-aware direct-MCP setup for published CLI0.10.2, whose older built-in bundle is not upgraded by catalog installation. Reconcile repository EN/ZH docs for config precedence, validation/reload, URL-only servers, environment credentials, trust hashes, pinned-source updates and catalog freshness. Current marketplace and unreleased source remain separate from installed-release claims; DSH and MCPApps are not presented as universally qualified. Verified locally:47existingwebtests passed (26dictionary/copy+21llms/docsIA); focused ESLint, TypeScript, locale/GT checks and diff check passed. Initial custom test harness missed Vite alias configuration in2suites; corrected harness passed those21checks. Desktop1280/mobile390 EN/ZH browser review passed; stale development module hydration mismatch cleared after owned dev-server restart. Published CLI0.10.2 discovered current CU0.16.1 tools and executed request_access through a local synthetic model:ok=true/viaapp, accessibilitygranted, screen-captureprobeok. No input or provider spend. Credential-free Cloudflare Docs MCP discovery listed2tools. Existing-helper setup is not clean-Mac/app-task qualification. Generated agent documentation uses51hashedinputs: our5revieweddocs plus committed da143039f79 content for all other inputs, excluding active peer GUIDE/feature/native drafts. Full clean web validation/deployment follows this frozen commit; no Engine release qualification. CU setup README is carried separately by codewhale-cu-plugin afb98e8. Evidence:CW/artifacts/plugin-mcp-discoverability-20261107. Tracking:CW-7848; CU acceptance remains CW-6732. | 23 hours ago | |
docs, scripts and CI: follow the host move; document stdio/websocket controls and usage statistics Updates moved-file paths in the CI path filters, scripts, vitest config and editor/bridge sources; documents the Runtime API stdio/websocket controls and usage statistics (en and zh_hans); adds the usage-statistics and cache-call-receipts features to features.toml with regenerated web data; updates coarse-split design docs and crate maps, split scripts, the blocking-calls budget and release smoke scripts. Verification: whole-tree evidence only, not per group. A native21 build of the full dirty tree completed (patch sha ea25c782...), and an unsealed nextest rerun of all 389 selected existing checks passed 389/389 on it. The earlier sealed native20 run failed 369/20 before fixes and was not re-sealed. No CI run. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> | 4 days ago | |
docs: point every link at the codewhale-hq organization Hunter moved the Codewhale repositories to github.com/codewhale-hq on 2026-10-05. Rewrite Hmbown/<moved repo> slugs to codewhale-hq/<repo> in docs, READMEs (all 19), website, CHANGELOGs, workflows, issue templates, Cargo/npm/VS Code/nix/winget metadata, install and updater code, the bundled first-party marketplace catalog and their tests: 1,795 references in 434 files, plus four escaped regex literals. Docker images publish to ghcr.io/codewhale-hq/codewhale from the next release. Old URLs keep working through GitHub's transfer redirects (verified live: API releases/latest, HTML releases/latest, release asset downloads, codeload tarballs, git clone), so released clients keep updating. Left unchanged on purpose: Hmbown/codewhale-cu-plugin (not moved yet; its shipped updater refuses redirects), Hmbown/deepseek-skills, cwc and other repos that did not move; package identities (winget Hmbown.CodeWhale, NSIS publisher); vendor/codewhale-ratatui (frozen reviewed package); and the extension-host GitHub adapter with tools/github/report.rs and their parity fixture, which need a bundle rebuild and move together in a follow-up. README translation stamps updated to the new README.md hash. Validation: npm test (wrapper 101/0, SDK 19/0, extension host 398 passed / 0 failed / 7 skipped, web 763/0) and npm run check:web exit 0 (one pre-existing facts-lib.mjs lint warning). cargo check --workspace --tests --all-features --locked: exit 0. cargo test -p codewhale-cli -p codewhale-release -p codewhale-protocol and the touched codewhale-tui modules (client, cloud_dispatch, commands, dispatch_runner, llm_client::mock, oauth, operate, plugins::marketplace, remote_control, remote_setup, tools::mcp_registry, tools::web::fetch, working_set, tui::ui::tests): all ok, 0 failed. check-readme-translations (18 in sync), readme locales, TUI locale parity, product vocabulary, web locales, contributor credit, plugin claims, release-workflows.test.js and check-versions all pass. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
docs(config): explain Mistral Vibe key setup [skip ci] Point the existing Mistral provider at current Vibe Code key guidance and document setup, shared allowance and billing boundaries. Live use in Codewhale remains unverified. Verified: existing Mistral provider metadata test 1/1 on Mac, provider-registry and example-config checks, and captured Mac CLI build. No live provider call was made. | 1 day ago | |
refactor(workflow): delete dead replay/review-repair/search code; one chat prompt and one YOLO alias list (#6517) The workflow crate carried ~2,650 lines with no production consumer: replay.rs (WorkflowReplayExecutor, used only by one js_authoring test), review_repair.rs (ReviewRepairLoop, only re-exported) and experimental_search.rs (WorkflowSearchSpec, 0 external hits). Readers took them for live infrastructure. They are deleted. The replay executor was the only producer of WorkflowRunStatus::ReplayDiverged, so the variant, mark_replay_diverged, and the tui arms that mapped it ("replay_diverged" in the workflow tool, workflows manager and panel) go too. It was a crate-only executor that never ran in a shipped build, so no persisted run record can carry that status. The js_authoring test that used the replay executor now checks the compiled IR itself: it passes Fleet validation, keeps its id, lowers to a parallel branch of the three audit leaves, and the reduce step reads exactly those leaves. Two isolated Runtime Chat prompts already differed. The engine now owns ISOLATED_CHAT_SYSTEM_PROMPT (the relay's stricter text), and the relay sends it. The engine test asserts the provider request's system prompt equals the relay's, which failed before this change. The legacy YOLO alias list ("yolo" | "4" | "bypass" | ...) was copied in four places. AppMode::is_legacy_bypass_alias is now the one predicate, used by AppMode::parse, runtime_policy, runtime_threads and /mode. Docs (WORKFLOW_EXPERIMENTAL_SEARCH, WORKFLOW_AUTHORING, MODEL_LAB, the best-of-n skill and workflow) now describe the search spec as a proposal and no longer as shipped code. Tests (built with dev-cargo.sh test --lib --no-run, then the unittest binaries run with these filters): - codewhale-workflow js_authoring: 10 passed, 0 failed - codewhale-config retired_output_mode app_mode:: retired_inline: 7 passed, 0 failed - codewhale-tui (shared filter set incl. isolated_runtime_chat, isolated_chat, runtime_policy, legacy_yolo, legacy_bypass, tools::workflow::, workflow_panel, workflows_manager): 241 passed, 0 failed cargo check -p codewhale-{workflow,lane,config,cli,tui} --all-targets: clean. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> | 1 month ago | |
docs(i18n): move Indonesian docs into docs/id/ with redirect stubs - Move all 10 docs/*.id.md files into docs/id/ (dropping the .id suffix), leaving English redirect stubs at the old paths for one release cycle - Update README.id.md links to point at docs/id/ - Note docs/id/ alongside docs/zh_hans/ in LOCALIZATION.md's scope note Part of #5482 Signed-off-by: Shizuku <2163018547@qq.com> | 2 months ago | |
feat(permissions): Ask asks before every edit; add Accept Edits [skip ci] Ask ( suggest) now opens a card for file edits inside the workspace too, as its name, the Plan handoff copy ("Edits and commands ask you first") and the founder-agreed model (2026-11-07, modeled on Claude Code's permission modes) promise. CW-7663 found that the desktop edit card could not appear with default settings because Ask ran in-repository writes unasked. The #5185 in-workspace write carve-out moves to a new posture, Accept Edits (ApprovalMode::AcceptEdits; settings and config.toml accept-edits, Runtime wire accept_edits), between Ask and Auto-Review: an edit whose every target stays inside the workspace git work tree runs without a card; .git, .codewhale, .env*, credential and key files, folders without git, commands, network and MCP actions ask exactly as in Ask. Everywhere else Accept Edits is an asking posture (ApprovalMode::is_ask_family): repo-law asks, sandbox escalation and Computer Use consent open a card; remembered grants treat it as Ask; non-authoritative provenance narrows it to Ask with a recorded narrowing event; live-authority narrowing ranks it between Ask and Auto-Review. - Shift+Tab: Ask -> Accept Edits -> Auto-Review -> Full Access. - Settings schema rows (permission_posture, approval_mode, approval_policy), /permissions, /status, /config, the Plan handoff ("Work (Accept Edits)"), footer chip and help strings; 7 new and 3 updated strings in all 15 locale packs. - config.toml approval_policy = "accept-edits"; a project file may only tighten: auto < accept-edits < on-request < never. - ACP runs Accept Edits as Ask, because ACP turns never apply the carve-out. - /import-claude maps Claude Code's acceptEdits to Accept Edits. - Docs: MODES, KEYBINDINGS, CONFIGURATION, INSTALL, GUIDE, README and its 18 translations (restamped), zh_hans mirrors, features.toml row, CHANGELOG entry, regenerated web/data/agent-docs.generated.json. Stated limits: write-capable workers keep #5186's in-folder edits under Ask (their spawn card is the consent); modes, Tab and Operate are unchanged pending the founder's answers to the modes/postures design (CW/artifacts/modes-postures-20261107/DESIGN.md D1-D4; Operate in CW-7849). Verification (shared checkout, source b3d18fe6bc plus this diff): - scripts/dev-cargo.sh test --locked --offline -j6, focused filters (approval_mode, posture, permission*, carve_out, authority::, protocol_parity, repo_law, sandbox_escalation, computer_use, narrow, approval_request, runtime_policy, project_config, settings_schema, plan_handoff, import_claude, file_edit_card, config_choice, keybinding, locale parity): codewhale-engine lib 263 passed, 0 failed; codewhale-tui lib 103 passed, 0 failed; codewhale-app-server lib 13 passed, 0 failed; codewhale-config 35 passed; codewhale-runtime 20 passed; codewhale-localization 15 passed; codewhale-execpolicy 12 passed; all 0 failed. Includes write_carve_out_posture_is_exactly_ accept_edits, workspace_write_carve_out_covers_accept_edits_only, file_write_card_names_the_missing_repository..., permission_cycle_is_a_ closed_loop..., cycle_approval_scenario, permission_postures_persist_ across_restart, shift_tab_migrates_user_root_policy..., plan handoff locale test, file_edit_card_says_when_it_asks_for_lack_of_a_git_repo. - codewhale-tui --test feature_registry: this row passes; the run fails only on another session's uncommitted clipboard-image-prune row, which this commit does not contain. - rustfmt --check on every touched .rs file; check-tui-locale-parity PASS (2823 keys x 15 packs); check-tui-product-vocabulary exit 0; check-readme-translations OK (18, stamp 20d0bb7c0784); check-readme-locales PASS; check-versions OK; check-dead-code-budget PASS (137). check-blocking-calls-budget fails only on another session's untracked crates/engine/src/session_image_prune.rs (not in this commit). - Not run: a live desktop/TUI turn showing the edit card (CW-7663's App acceptance); full workspace suites (final release validation owns them). Tests ran on the shared working tree, which also held other sessions' uncommitted edits; this commit stages only this slice's hunks (private index, HEAD + these changes). Refs CW-7663, CW-7849 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 7 hours ago | |
tui: pace streamed text at a steady rate instead of provider-sized jumps Streaming read as bursty rather than as typing. The display clock bounded how often the transcript was mutated but not how much moved: StreamBuffer::take drained everything received since the previous beat, so a 200-byte SSE chunk arriving after a pause appeared as a 200-byte jump and the visible text inherited the provider's chunking exactly. A commit beat now reveals a bounded slice at REVEAL_PER_SECOND (2400 bytes/s, roughly 400 words per minute). That is several times a fast model's own output rate, so ordinary streaming is limited by when bytes arrive rather than by this ceiling and gets no artificial delay; the ceiling only spreads a burst that lands ahead of that rate. A receipt smaller than one beat's slice is still taken whole, so short updates are never slowed down. Cuts land on grapheme boundaries. A budget too small to hold the next cluster takes that cluster whole rather than stalling, so a drain can never split a ZWJ sequence across beats or wedge with nothing revealed. Buffering still never changes what the model emitted: accumulated_text and accumulated_thinking continue to track the full raw stream, so API messages and retries see the complete receipt regardless of how much is visible. docs/MOTION_CONTRACT.md said a commit beat "unconditionally flushes everything received"; that is no longer true, so it was corrected in the same slice. Tests: scripts/dev-test.sh tui -> 12686 passed, 0 failed, 19 skipped scripts/dev-test.sh tui streaming:: -> 16 passed, 0 failed cargo fmt --all -- --check clean | 1 month ago | |
docs(i18n): complete Tier 3 — developer and internal docs translated to zh_hans - 13 new Simplified-Chinese translations under docs/zh_hans/: RUNTIME_API, ARCHITECTURE, TOOL_SURFACE, AUTOMATIC_WORKFLOWS, AUTHORIZATION_ORDER, LIVE_SMOKE, COMMAND_CONTROL_PLANE, ENVIRONMENTS, LEGACY_PATHS, OPERATIONS_RUNBOOK, WORKROOM_ARCHITECTURE, WORKROOM_SECURITY, AGENT_ETHOS (structure verified 1:1 per document: headings, code fences, table rows) - The 13 English originals and docs/LOCALIZATION.md get the "read in Simplified Chinese" banner linking to their zh_hans translation - docs/zh_hans/README.md: 3 links retargeted to the translations, 10 new entries, date refreshed - Terminology follows #4908 (provider -> 提供商) and the Tier 1/2 corpus - Cross-links follow the corpus convention: ../<X>.md when a document exists only in English, plain <X>.md when it has a zh_hans translation (the five links into Tier-2 documents resolve once #6662 lands) - In-page anchors point at the translated headings (#引导送达, #工作区恢复端点, #按项目覆盖485) instead of the English slugs carried over from the sources Refs #5482 | 1 month ago | |
pet: follow HTTP Runtime work when the companion is idle Feed accepted HTTP Runtime turn activity into the existing companion's metadata-only producer. Attach only to a running owner, perform conditional idle selection inside the owner's world, and refuse a live producer even when it arrives after the inspected frame. Manual selection stays explicit. Bound queues/items/waits, clear uncertain observations after a gap, and stop heartbeats twelve seconds after completion or lost coverage. Completed turns alone grant Done; prompts, reasoning, tool names and arguments never cross. Keep HTTP client construction and disposal off Tokio workers. Document the current default whale and shared projection, refresh the existing feature facts, and leave native-terminal/live-audio pet qualification unclaimed. Founder F6 moves #6155 items 1-2 to next-milestone qualification; the issue remains open. No ACP/background-TUI projection or model/KV-cache additions. Verification on frozen fifteen-path batch, base 3126fe397b: - Existing native pet checks: "Summary [1.304s] 35 tests run: 35 passed, 15276 skipped". Two unchanged feature-registry checks also passed in the original "37 tests run: 37 passed" batch. - Exact hosted CI clippy flags, all targets/features: passed, 41.55s. - CLI build passed, 42.86s; existing macOS oversized __eh_frame linker warning retained, no Rust warnings. - Private loopback Runtime/companion inspection: 7 passed; 0 failed. Checks completion, interruption, delayed release, no companion spawning, active simulated TUI preservation and atomic idle-selection race refusal. - Existing shared-owner black-box contract: 11 passed; 0 failed. - Required JavaScript gate: original web run 769 passed; 3 timed out. Focused unchanged installer rerun: "Tests 25 passed (25)". Other suites 101+19+413+7 passed; repaired aggregate 1312 passed; 0 outstanding failed; 7 skipped. Original timeout outputs retained. check:web passed. - Generated facts/docs checks passed; fmt/whitespace passed. Existing budgets: "blocking-call budget: 538 sites across 165 files, within budget"; "PASS: 220 suppressions (allow=139, expect=81), exactly at budget". Receipts: CW/artifacts/0102-handoff-20261012/idle-handoff-*.log, idle-handoff-frozen-source.json, idle-handoff-binary.json and runtime-pet-receipt.json. Hosted Windows/native-app and real terminal/audio qualification remain separate. No release, deploy or provider spend. Refs #6155, #6139, CW-6587 | 26 days ago | |
docs(web): explain plugins and MCP with verified Computer Use setup [skip ci] Answer the integration chooser, actual catalog prerequisites, supported plugin formats, direct-versus-plugin MCP authentication and troubleshooting on the existing paper/blue pages. Link the plugin guide from docs navigation and refresh its plain-text index. Add explicit Computer Use GitHub/contributor links in all18locales and version-aware direct-MCP setup for published CLI0.10.2, whose older built-in bundle is not upgraded by catalog installation. Reconcile repository EN/ZH docs for config precedence, validation/reload, URL-only servers, environment credentials, trust hashes, pinned-source updates and catalog freshness. Current marketplace and unreleased source remain separate from installed-release claims; DSH and MCPApps are not presented as universally qualified. Verified locally:47existingwebtests passed (26dictionary/copy+21llms/docsIA); focused ESLint, TypeScript, locale/GT checks and diff check passed. Initial custom test harness missed Vite alias configuration in2suites; corrected harness passed those21checks. Desktop1280/mobile390 EN/ZH browser review passed; stale development module hydration mismatch cleared after owned dev-server restart. Published CLI0.10.2 discovered current CU0.16.1 tools and executed request_access through a local synthetic model:ok=true/viaapp, accessibilitygranted, screen-captureprobeok. No input or provider spend. Credential-free Cloudflare Docs MCP discovery listed2tools. Existing-helper setup is not clean-Mac/app-task qualification. Generated agent documentation uses51hashedinputs: our5revieweddocs plus committed da143039f79 content for all other inputs, excluding active peer GUIDE/feature/native drafts. Full clean web validation/deployment follows this frozen commit; no Engine release qualification. CU setup README is carried separately by codewhale-cu-plugin afb98e8. Evidence:CW/artifacts/plugin-mcp-discoverability-20261107. Tracking:CW-7848; CU acceptance remains CW-6732. | 23 hours ago | |
refactor(split): S19 codewhale-plugins crate (CW-6129) [skip ci] Plugin discovery, review, install, marketplace parsing and the provider registry move from crates/tui/src/plugins into a new codewhale-plugins crate (git mv, mod.rs -> lib.rs). The MCP config types (McpConfig, McpTimeouts, McpServerConfig, McpServerOAuthConfig) move to codewhale_mcp::config, with reviewed-plugin provenance stored as an opaque McpProvenance; the skills parse core and recommendations move to codewhale_skill_install::{skill_parse, recommend}. About 120 tui files are rewired with no re-export shims. The node composition reviewer stays in tui behind a OnceLock hook that fails closed ("composition reviewer is unavailable") if it is not installed. first-party-marketplace.json and dsh-compatibility.json move to crates/plugins/assets. Tests that need the extension host stay in tui (plugins_dsh_tests, plugins_skill_tests, plugins_provider_tests). Integration onto main: route_preferences.rs conflicted because 0296261823 moved the route-writer block above the test module; the patch's copy at the old location was dropped and the moved block repointed at codewhale_plugins (identical otherwise). The blocking-calls budget entry moved to crates/plugins/src/builtin.rs with upstream's tightened count. DeclarativePluginFixture gains a Default impl: as a pub item under --all-features it tripped clippy::new_without_default. Verified on Linux x86_64 Boat VM vm21, tree ea13bd15d4a9 on 0d0b2f46af: - cargo fmt --all -- --check: exit 0 - cargo check --workspace --all-targets --locked: exit 0, 0 warnings - CI Lint clippy (--workspace --all-targets --all-features -D warnings, CI's three -A allows): exit 0 - cargo test --lib: codewhale-plugins 201 passed, 1 ignored; codewhale-skill-install 47; codewhale-mcp 2; 0 failed - codewhale-tui lib filtered to plugins skills:: mcp:: extension_host:: runtime_threads runtime_api provider_lake provider_picker: 1780 passed, 3 failed, 2 ignored. Failures: runtime_api::tests::mcp_management_ selected_connection_and_retry_preserve_siblings and mcp_tools_endpoint_ is_passive_until_connect_requested (known Linux baseline), and extension_host::mcp::tests::host_restart_mints_fresh_owner_and_never_ revives_old_grant (bwrap handshake timeout under parallel load; passes 3/3 alone with --exact on the same binary) - check-blocking-calls-budget.py: only the pre-existing overages in cli/src/update/uninstall.rs and sandbox/src/{bwrap,lib}.rs Not run: full tui lib suite, tui integration binaries, macOS/Windows builds, hosted CI. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 11 days ago | |
feat(runtime): reconcile reviewed plugins and unify native account setup [skip ci] Restore missing plugin stages only from receipt-matching bytes under the existing state writer, with generation and policy checks. Refuse changed existing stages. Reuse normal reload/MCP invalidation for explicit restage; add read-only shell status and bounded authenticated DSH asset grants. Expose current-server MCP backoff without treating an absent backoff as health. Share profile-scoped Rust account custody across terminal and native hosts, keep local provider setup optional, and make ordinary logout session-only. Fence browser imports and cleanup by exact revision; preserve ambiguous or newer sessions. Keep definitely unadopted device grants in cleanup custody. Validation: six-crate Mac all-target check exit0, 4,270 source entries unchanged, 35m37s, no disk stop. Grok Linux raw evidence verified: secrets account6 and plugins202 passed, one existing real-home rehearsal ignored; all4,270 entries exactly matched that Mac freeze. Existing command-crate boundary gate passed; 2,816 keys complete in all15 TUI locales. The subsequent two-file private account cleanup has independent source review and exact pre/post hash checks; Linux verification is in progress. Only that cleanup and the already-landed visual-change changelog entry differ from the passing Mac compile snapshot. No new tests or code comments added. Qualification is incomplete: production recovery/asset HTTP smoke, published plugin, Electron, live sign-in, cross-platform/package and final release gates remain. This local candidate commit is not a release or publication. | 21 hours ago | |
docs(web): explain plugins and MCP with verified Computer Use setup [skip ci] Answer the integration chooser, actual catalog prerequisites, supported plugin formats, direct-versus-plugin MCP authentication and troubleshooting on the existing paper/blue pages. Link the plugin guide from docs navigation and refresh its plain-text index. Add explicit Computer Use GitHub/contributor links in all18locales and version-aware direct-MCP setup for published CLI0.10.2, whose older built-in bundle is not upgraded by catalog installation. Reconcile repository EN/ZH docs for config precedence, validation/reload, URL-only servers, environment credentials, trust hashes, pinned-source updates and catalog freshness. Current marketplace and unreleased source remain separate from installed-release claims; DSH and MCPApps are not presented as universally qualified. Verified locally:47existingwebtests passed (26dictionary/copy+21llms/docsIA); focused ESLint, TypeScript, locale/GT checks and diff check passed. Initial custom test harness missed Vite alias configuration in2suites; corrected harness passed those21checks. Desktop1280/mobile390 EN/ZH browser review passed; stale development module hydration mismatch cleared after owned dev-server restart. Published CLI0.10.2 discovered current CU0.16.1 tools and executed request_access through a local synthetic model:ok=true/viaapp, accessibilitygranted, screen-captureprobeok. No input or provider spend. Credential-free Cloudflare Docs MCP discovery listed2tools. Existing-helper setup is not clean-Mac/app-task qualification. Generated agent documentation uses51hashedinputs: our5revieweddocs plus committed da143039f79 content for all other inputs, excluding active peer GUIDE/feature/native drafts. Full clean web validation/deployment follows this frozen commit; no Engine release qualification. CU setup README is carried separately by codewhale-cu-plugin afb98e8. Evidence:CW/artifacts/plugin-mcp-discoverability-20261107. Tracking:CW-7848; CU acceptance remains CW-6732. | 23 hours ago | |
dsh: brokered Git review scopes in the host shim (policy v8) Adds the bounded git child_process shim (UTF-8 default, metadata-only Git, preserved denial codes, nonzero exit and ABORT_ERR/maxBuffer error shapes), the git_review_scope canonical action and read-only authority category, policy v8, and explicit composition-review setup in the four DSH/skill import fixtures that depended on a process-global reviewer. Verified on the frozen current tree (Engine 81ae174537 + dirty inputs): Node host 413 pass/7 skip earlier; tui lib plugins_dsh_tests 30/30, plugins_skill_tests 5/5, composition 8/8, tools::git 76/76, feature_registry 2/2. NOT verified: the published @michengai/dsh-code-review loopback journey, cancel parity and the sandbox-escape matrix; those remain open under CW-7055. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> | 9 days ago | |
fix(engine): stop replaying inference with unknown outcomes [skip ci] Use typed dispatch confidence at retry owners; only proven transient pre-dispatch failures, ordinary429 and actual read-only operations may retry. Stop opened-stream replay and reqwest retry/redirect bypasses. Keep Interrupted child handback and source-bound primary unknown coverage through existing Runtime/TUI/exec owners; terminal exec failure exits1. Reconcile retry promises and parsed compatibility knobs in maintained docs. Validation: ordinary CLI build passed; 131 existing Engine and28 TUI checks passed via126+28 unchanged-source reuse,3 corrected fixtures,2 corrected multi-thread SSE fixtures. No new tests or comments. Original failed builds/check receipts retained. 40 local ordinary controls yielded 38 qualified and2 isolated safety-only observations retaining their full source-accounting failure underP04. Old CLI reproduced2acceptedPOSTs/ 2simulated effects; candidate ambiguous requests retained1/1 without replay. Existing bounded429/GET/pre-dispatch and manual next-turn controls passed. All2315 source inputs held frozen during each build/observation. Limits: full primary late/historical/isolated source accounting and broader P02 recovery remain open. HTTP/1 local proof only; no provider spend, Windows/Deepin/FreeBSD, installed package or final CI/release claim. Receipts: CW/artifacts/engine-0103-execution-20261102/ inference-retry-v4/RECEIPT.json and inference-retry-qa/RESULTS.json. | 5 days ago | |
refactor(engine): project tool schemas once for the selected route [skip ci] Use the existing models/tool_projection owner for typed Exact/Relaxed/Omitted per-tool outcomes. Select strict shape and flag together, relax route compatibility with the existing sanitizers, share constraint-note rendering, and refuse forced choice of an omitted tool before transport. Keep logical catalogs and runtime argument validation independent of wire relaxation. Non-beta DeepSeek/local DS4 no longer receive strict-shaped parameters while strict is disabled; Responses keeps strict=false. Normalize cloned MCP API schemas like native registry schemas without changing original server records. Dispatch, streaming, preview and deferred/search measurements consume the prepared projection. Blocking warnings and preview manifests retain exact omission counts with the existing 8x64 sanitized name sample, without schemas/refs/endpoints. Keep logical prefix fingerprints unchanged and explicitly separate from prepared wire hashes; consolidate the three default tool-choice callers. Muse Wonder Full supplied the initial worker batch; its quota exhausted mid-edit. Root reviewed and completed the migration, bounded diagnostics, strict-route guards and existing consumer/assertion updates. No new repository tests or code comments. One unrelated pre-existing approval fixture formatting defect found by cargo fmt was corrected; review and comparison allowing whitespace/trailing commas confirm the same call and arguments, with no assertion or production change. Verified: frozen 4,249-input native library build, 125 focused existing Engine cases, 56 schema sanitizer cases, 8 canonicalization cases and 30 logical-prefix cases: 219 passed, 0 failed. Source hashes stayed unchanged through build/checks. The later approval-fixture formatting/trailing-comma delta has its own receipt. cargo fmt --all -- --check and git diff --check pass. Existing checks cover all three dialects, prepared/preview identity, mixed strict catalogs, Kimi omission/forced-choice/warnings/deferred schemas and MCP authorization/catalog isolation. Source and loopback fixture evidence; ordinary native CLI/product witness follows this commit. No real-provider acceptance/cache-savings, full-tool JSON-RPC admission, package, release or deployment claim. Refs: #5633, CW-6256 | 4 days ago | |
fix(web): use plain marketing copy and qualify service integrations Describe building apps, automating workflows, model choice and connected tools in direct language. Remove choppy slogans, robot voice and internal verification prose from the homepage, product, plugins, setup guides and common states. Update all 18 homepage and Computer Use locale packs and shared en/zh catalogs. Keep the single real native TUI capture. Prevent observed English headline hyphenation from splitting automate on desktop. Replace broad Slack/Gmail promises with per-service setup and authentication. Reconcile the agent documentation with current bot source: Slack commands control Codewhale, while agent Slack tools need a separately configured service; hosted authenticated Slack operation has not been qualified. Validation: required npm test && npm run check:web passed on these exact 52 paths. Wrappers 101/0; Runtime SDK 19/0; extension host 413/0 plus 7 skipped; dependency guards 7/0; web 74 files and 772/772 tests. Facts, latest release, docs, tokens, types and 894-page production build passed. Lint 0 errors with 1 existing unused-import warning. All 18 locale packs and GT catalogs pass parity checks. Final English desktop/mobile previews show one actual TUI capture and no page overflow. Canonical Slack source audited separately. Human website deployment approval is recorded; public deployment awaits green merged source. No deployment, provider spend, tag or release publication. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 30 days ago | |
docs(i18n): move Indonesian docs into docs/id/ with redirect stubs - Move all 10 docs/*.id.md files into docs/id/ (dropping the .id suffix), leaving English redirect stubs at the old paths for one release cycle - Update README.id.md links to point at docs/id/ - Note docs/id/ alongside docs/zh_hans/ in LOCALIZATION.md's scope note Part of #5482 Signed-off-by: Shizuku <2163018547@qq.com> | 2 months ago | |
fix(providers): identify defaults from each provider's model list A same-line successor replaces a stale pin. grok-4.7 and muse-spark-1.3 are the current models; a different line, such as GPT-6 beside GPT-5.6, does not take over. The provider pane shows one current model per line and spreads a gateway roster across authors, so OrcaRouter no longer opens as a wall of Claude snapshots. Wafer is a selectable OpenAI-compatible host. The public model list is the catalog, GLM-5.3 is the default, and inference uses WAFER_API_KEY. Verification: codewhale-config lib tests for default identity, Grok hydration, web search, and the Wafer descriptor (4 passed). codewhale-agent xAI and Meta default resolution (2 passed). codewhale-tui provider pane default-first (1 passed). codewhale-engine fleet xAI fallback (1 passed). python3 scripts/catalog_models_dev.py defaults audit reported 0 stale. python3 scripts/check-provider-registry.py passed. | 2 hours ago | |
docs: DSH plugin compatibility checklist (CW-7054) New docs/DSH_PLUGIN_COMPAT.md: feature-by-feature DeepSeek Harness 0.2.1-rc.2 plugin behavior versus Codewhale, with the landing commit for each verified row (25225ef051 first-turn tools, 17ebeb5f61 sessions.flush + 409 install conflict, fff5a476f9 userQuestions.ask), what is refused or unimplemented (subagents, agents, systemPrompt, tools.get/restrict, rich output, plugin UI), the WebRTC reason plugin UI stays off, and why the published code-review plugin still cannot activate. Linked from docs/README.md. Paths: docs/DSH_PLUGIN_COMPAT.md docs/README.md Verified: relative links resolve (EXTENSIONS.md, INTEGRATIONS_DSH.md). Docs only; no code or registry change. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 11 days ago | |
feat(sessions): prune pasted images no session still names Refs #7221 (CW-7804). Pasted clipboard images are written as flat clipboard-<nanos>.png files under ~/.codewhale/clipboard-images/ and nothing ever removed them; the reporter's Windows install grew by several hundred MB in a month of QQ screenshots. codewhale sessions prune-images sits beside scrub-secrets and keeps its shape: report by default, --apply to delete. An image is offered only when no file under the Codewhale state directory, the sessions directory or the Runtime task store names it (saved sessions, checkpoints, archives, Runtime threads, the composer stash and history) and it is older than the grace window (--older-than-days, default 7), so an unsent draft or a running turn keeps its picture. The scan reads raw bytes and needs no knowledge of each store's schema; it never follows symlinks inside the roots and stops once every image is accounted for. If any file or directory cannot be read, nothing is deleted. A file another process holds open (common on Windows) is reported and skipped. A missing image never fails resume: the bytes enter history when a message is built (expand_attachment_blocks), and re-sending an old message reports the missing file in-band. The traversal reuses session_secret_scrub's no-follow directory helpers (now pub(crate)). docs/READ_MEDIA.md documents the command and a features.toml row registers it. Known limits: references held only outside the scanned roots (for example a workspace-local .codewhale directory) are not seen; age-only pruning stays out of scope; grouping new pastes by session is not done. Verified (macOS, offline, locked): the batch's six commits were tested as one change on Boat farm VMs (Linux x86_64), shipping only git diff <base> <final>, so no other session's uncommitted files took part. cargo test --locked --lib with filters over config, runtime, engine, app-server, tui and cli on base 3631a174f6: 459 passed, 0 failed (config 8, runtime 117, engine 102, tui 220, cli 8, app-server 4; farm run 20261107T230833Z-issues-tests-503e01). cargo clippy with the Lint job's flags (--all-targets --all-features, -D warnings) on config, runtime, engine, command-contract, cli, tui and app-server: 0 warnings, 0 errors (run 20261107T231817Z-issues-clippy-e84152). Rebased onto 5ba1aa63bc (eager sub-agents), which shares subagent/mod.rs, subagent/tests.rs, tasks.rs and config.example.toml with this batch; this batch's changed lines are byte-identical on both bases, and a recheck of that overlap on the new base passed: engine 48 and app-server 2 passed, 0 failed (subagent coordination incl. the two-process case, human-wait, execution-guard and tools::tasks suites, server_task_config and server_task_runtime; farm run 20261108T000442Z-issues-recheck-67ab1a). Locally: cargo fmt --all -- --check, both budget checks, sync-changelog --check and the feature release-note receipts pass. Covers the session_secret_scrub suite whose no-follow directory helpers this reuses, and the build of the new subcommand. The fixture run of codewhale sessions prune-images on a macOS binary follows from the freeze build. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 7 hours ago | |
docs(i18n): move Indonesian docs into docs/id/ with redirect stubs - Move all 10 docs/*.id.md files into docs/id/ (dropping the .id suffix), leaving English redirect stubs at the old paths for one release cycle - Update README.id.md links to point at docs/id/ - Note docs/id/ alongside docs/zh_hans/ in LOCALIZATION.md's scope note Part of #5482 Signed-off-by: Shizuku <2163018547@qq.com> | 2 months ago | |
docs: install cleanup, automatic updates, rollback and release signing INSTALL.md: re-running the installer upgrades; automatic updates (signing rule, opt-out, organization policy); rollback; cleaning up old copies; release-signing founder steps. CONFIGURATION.md: [update] mode and 6 h interval. REBRAND.md: stale deepseek shims. CHANGELOG entries, crates/tui/CHANGELOG.md synced with scripts/sync-changelog.sh. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 11 days ago | |
feat(api): serve the Engine audit receipt as Markdown [skip ci] Add format=md to the authenticated thread/turn receipt routes using the existing shared Engine formatter. The default JSON response and access boundary remain unchanged; unsupported format values fail with 400. Desktop can display the same audit facts and coverage notes as the terminal without deriving a second record from its activity labels. Verified: existing authenticated receipt route case passed, including JSON, Markdown content type/body, anonymous refusal, unknown format and foreign turn refusal. Five existing SIWC cases also passed in the same frozen batch. Ordinary native24 CLI compiled with all 4,249 inputs unchanged. Mounted Electron/native24 displayed thread and selected-turn receipts with exact one-run/one-approved/one-denied totals, and exercised grant revoke and next-call approval. No final candidate, publication or deployment. Refs CW-7679. Founder selected Engine audit receipt authority 2026-11-03. | 4 days ago | |
feat(release): publish a signed native HarmonyOS binary Native HarmonyOS users had to install a Rust toolchain and an OpenHarmony SDK to get a working codewhale; a release could not serve them, and npm handed them the static Linux build, which a device refuses to start. Releases now build aarch64-unknown-linux-ohos as an eighth target and publish codewhale-ohos-arm64 with its codew alias and archive. The leg signs the binary with the SDK's own signer and refuses to stage it unless the signature reads back, because an unsigned ELF is refused at execve and would be a dead download. npm i -g codewhale on that platform now picks the native asset instead of the Linux one. The asset inventory stays exact and enforced: 38 files across eight targets, with the workflow, packaging and runbooks updated together so a candidate that misses the HarmonyOS leg fails instead of shipping quietly. Signed-off-by: Ben Gao <bengao168@msn.com> | 8 days ago | |
feat(release): publish a signed native HarmonyOS binary Native HarmonyOS users had to install a Rust toolchain and an OpenHarmony SDK to get a working codewhale; a release could not serve them, and npm handed them the static Linux build, which a device refuses to start. Releases now build aarch64-unknown-linux-ohos as an eighth target and publish codewhale-ohos-arm64 with its codew alias and archive. The leg signs the binary with the SDK's own signer and refuses to stage it unless the signature reads back, because an unsigned ELF is refused at execve and would be a dead download. npm i -g codewhale on that platform now picks the native asset instead of the Linux one. The asset inventory stays exact and enforced: 38 files across eight targets, with the workflow, packaging and runbooks updated together so a candidate that misses the HarmonyOS leg fails instead of shipping quietly. Signed-off-by: Ben Gao <bengao168@msn.com> | 8 days ago | |
feat(runtime-api): read and write verbosity and the sub-agent limit through /v1/config CW-7673 (App settings slice S1, codewhale-app 83634750). The desktop's Settings rows for reply style and "agents at once" had no Engine write path. POST /v1/config {key:"verbosity"} fell through to settings.toml, which rejects the key, and [subagents] max_concurrent was neither readable nor writable. Root approved this as a post-freeze-safe slice (2026-11-07). - GET /v1/config adds verbosity (unset reads "normal", the Engine's own default) and subagents_max_concurrent: the configured [subagents] max_concurrent capped at MAX_SUBAGENTS (128), or, when unset, the limit the Engine applies (top-level max_subagents, else 64). The Engine never writes that default (CURRENT_DECISIONS §62: a person-set limit). - POST /v1/config validates both keys before any write, also on dry runs: - verbosity: one of project_config's CONFIG_TOML_VERBOSITIES (normal, concise), case-insensitive, persisted as the root config.toml key. - subagents_max_concurrent: an integer 0..=128; larger values store 128, and 0 turns sub-agents off, matching max_concurrent = 0 in config.toml. Persisted through persist_subagents_integer_key, next to subagents_max_depth. The response value is what was stored. Persisted writes apply on POST /v1/config/reload, like the other config.toml keys. - RUNTIME_CONFIG_KEYS lists both keys beside the other curated arms. - docs/RUNTIME_API.md (and zh_hans) document the keys. CHANGELOG.md and crates/tui/CHANGELOG.md carry the line. settings.rs and settings_schema.rs are untouched. No schema row exists for either key, so GET /v1/settings/schema is unchanged. Evidence: EVIDENCE Refs CW-7673 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 4 hours ago | |
Merge current main and reconcile Runtime API store sockets and workspace leases Preserve both original @gaord commits and source branch. Keep owner/store/profile/bootstrap/auth/worker guards; kernel contention never authorizes inode replacement. Counted handles and asynchronous cleanup retain the lease; PrivateDirectory protects selected paths and identities. Windows creation success returns validated RW/noDELETE handle while failure cleanup keeps exact DELETE authority. RuntimeAPI/state-namespace/Unix-derived endpoint limits remain explicit; original9lease/6selector/4socket tests retained. Actual local frozenECD+V3 evidence:42testsrun42passed15284skipped; appserver19testsrun19passed158skipped; registry1passed0failed1filtered; productionCLI andscopedClippyPASS. ActualUnixmanual4PASS/0FAIL,9authGETs,5ownedprocessesreaped,networkNOT_MEASURED/noinference. V2config12/0 andnpm1312/0/7web unchanged exceptcfgtesthelper; originalsource/failures retained. ClippypostcheckEAGAIN recovered with source guard andcached0.80sactual0; initialstale-binary/manualPython failures are artifact-only, preserved. Localproof coversmatched10fullfiles andsameownedhunks in4forkbaselinevariants; it is NOT thiswholeownforktree/newWindows/fullnative/distproof. Fresh exact ownhead hostedCI/review required beforemerge. No newagenttestfunction/comment, no tag/publication/deletion. Refs #6924. Refs #6968. | 25 days ago | |
refactor(engine): extract the shared runtime from the TUI [skip ci] Move the Engine band, extension host, fixtures and shared test support into codewhale-engine; wire TUI/CLI to that owner. Preserve human-decision construction boundaries and lower reusable test helpers. Remove unused copied dependencies and repair path-based guards, scripts and crate maps. Correct the blocking scanner external-module scope leak; raised counts equal the corrected pre-move source. Refresh embedded built-in hashes after path-only bundle regeneration. Restore the provider-free prompt budget to the exact pre-b984e31290 macOS bytes and representative identities; tool catalogs are unchanged. Portable prompt-fixture pinning remains follow-up work. Local validation: Engine/TUI/CLI clippy --tests --no-deps -D warnings passed with the existing allow-list; production CLI check passed; fmt passed. Focused native run: 705 passed / 83 failed initially; after hash/path repairs, 81 affected cases plus 2 existing build-relocation cases passed (83/83). Thus 786/788 original cases pass; 2 compiled-release-image cases lack input and are not qualified. Frozen input inventories unchanged. macOS test-link unwind-table warnings remain. Four metric tests pass; all 55 budgets pass. Host Node: 413 pass, 7 skip; Bun: 414 pass, 6 skip. Existing scanner checks: 34 + 33 pass. Compiled-delivery synthetic fixtures: 7 pass. Web: 42 pass. Import, blocking, dead-code, coarse-map, version and facts checks pass. CW-7701. No hosted CI, provider call, release build or publication. Stage A part 2 and the old App Server/ratatui dependencies remain separate. | 7 days ago | |
refactor(engine): extract the shared runtime from the TUI [skip ci] Move the Engine band, extension host, fixtures and shared test support into codewhale-engine; wire TUI/CLI to that owner. Preserve human-decision construction boundaries and lower reusable test helpers. Remove unused copied dependencies and repair path-based guards, scripts and crate maps. Correct the blocking scanner external-module scope leak; raised counts equal the corrected pre-move source. Refresh embedded built-in hashes after path-only bundle regeneration. Restore the provider-free prompt budget to the exact pre-b984e31290 macOS bytes and representative identities; tool catalogs are unchanged. Portable prompt-fixture pinning remains follow-up work. Local validation: Engine/TUI/CLI clippy --tests --no-deps -D warnings passed with the existing allow-list; production CLI check passed; fmt passed. Focused native run: 705 passed / 83 failed initially; after hash/path repairs, 81 affected cases plus 2 existing build-relocation cases passed (83/83). Thus 786/788 original cases pass; 2 compiled-release-image cases lack input and are not qualified. Frozen input inventories unchanged. macOS test-link unwind-table warnings remain. Four metric tests pass; all 55 budgets pass. Host Node: 413 pass, 7 skip; Bun: 414 pass, 6 skip. Existing scanner checks: 34 + 33 pass. Compiled-delivery synthetic fixtures: 7 pass. Web: 42 pass. Import, blocking, dead-code, coarse-map, version and facts checks pass. CW-7701. No hosted CI, provider call, release build or publication. Stage A part 2 and the old App Server/ratatui dependencies remain separate. | 7 days ago | |
refactor(tui): remove settings-picker transaction scaffold (dead-code audit 2026-08-03, P1) TransactionCallbacks/TransactionEvent/TransactionLog and the matrix-only apply_nav_to_log adapter had no production consumer. The live controller/layout/option framework stays; matrix tests now assert on PickerNavResult directly. | 3 months ago | |
feat(engine): compose scoped MCP batches in the existing VM [skip ci] Expose a compact named-step form on the already-eager execute_tools when one ready server offers it. Use real same-server member schemas, current turn visibility and declared bounds; name and count are checked after hooks. Keep script and consent decisions direct, and route the batch through the existing cancellable VM gate and bounded receipts. Exact-name regex discovery now works. Bound ambient skill descriptions without changing authored instructions or on-demand discovery. Measure startup, turn setup, request preparation, gate planning and terminal processing on demand. Compute stream executable identity in the background from an opened file and keep its hash on the receipt. CW-7649: the optimized candidate used the installed plugin and real DeepSeek. Two ordinary goals chose the VM batch first and completed independently verified background hover/drag: 4 calls/5 requests and 7 calls/8 requests. A separate controlled recipe completed in one call/two requests. These are device-specific observations, not a matched speedup or a one-call planning guarantee. Initial attempts include a 14-call success and an incomplete run. 276 existing focused checks passed before the two-file bounds amendment. 27 affected checks passed on the measured source. Four existing provider-free cases matched all 55 contract metrics; five-library Clippy, formatting, documentation, version and blocking-budget checks passed. Both deferred and pinned wire probes refused out-of-offer members, post-hook rewrites and a three-step call to a two-step server before MCP dispatch. No hosted CI. | 7 days ago | |
docs, scripts and CI: follow the host move; document stdio/websocket controls and usage statistics Updates moved-file paths in the CI path filters, scripts, vitest config and editor/bridge sources; documents the Runtime API stdio/websocket controls and usage statistics (en and zh_hans); adds the usage-statistics and cache-call-receipts features to features.toml with regenerated web data; updates coarse-split design docs and crate maps, split scripts, the blocking-calls budget and release smoke scripts. Verification: whole-tree evidence only, not per group. A native21 build of the full dirty tree completed (patch sha ea25c782...), and an unsealed nextest rerun of all 389 selected existing checks passed 389/389 on it. The earlier sealed native20 run failed 369/20 before fixes and was not re-sealed. No CI run. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> | 4 days ago | |
fix(engine): stop replaying inference with unknown outcomes [skip ci] Use typed dispatch confidence at retry owners; only proven transient pre-dispatch failures, ordinary429 and actual read-only operations may retry. Stop opened-stream replay and reqwest retry/redirect bypasses. Keep Interrupted child handback and source-bound primary unknown coverage through existing Runtime/TUI/exec owners; terminal exec failure exits1. Reconcile retry promises and parsed compatibility knobs in maintained docs. Validation: ordinary CLI build passed; 131 existing Engine and28 TUI checks passed via126+28 unchanged-source reuse,3 corrected fixtures,2 corrected multi-thread SSE fixtures. No new tests or comments. Original failed builds/check receipts retained. 40 local ordinary controls yielded 38 qualified and2 isolated safety-only observations retaining their full source-accounting failure underP04. Old CLI reproduced2acceptedPOSTs/ 2simulated effects; candidate ambiguous requests retained1/1 without replay. Existing bounded429/GET/pre-dispatch and manual next-turn controls passed. All2315 source inputs held frozen during each build/observation. Limits: full primary late/historical/isolated source accounting and broader P02 recovery remain open. HTTP/1 local proof only; no provider spend, Windows/Deepin/FreeBSD, installed package or final CI/release claim. Receipts: CW/artifacts/engine-0103-execution-20261102/ inference-retry-v4/RECEIPT.json and inference-retry-qa/RESULTS.json. | 5 days ago | |
fix(telemetry): keep schema 4 first-party only Retain v2 and v3 PostHog forwarding rules while preventing schema 4 from expanding processor egress. Four existing test files passed 152 cases, TypeScript passed, and a local network-denied bundle passed 30 fixture comparisons. No deployment or production event was performed. | 1 day ago | |
0.10.2 candidate: MCP connects at start, background promotion, shell inspector, Full Access confirmation, Daytona and Sprite removal, composer-first launch, QA fixes One integrated slice of the 0.10.2 release work, three-way merged onto 64bb073a4. User-visible changes (details and per-item evidence in CHANGELOG.md): - MCP: user-configured servers connect in the background at session start ( lazy = true opts out, required still blocks, plugin-contributed servers stay on demand); a finished OAuth login reconnects that one server; /mcp reload redials every non-lazy server; the reload summary reports a not-connected count and the configured total. - #6944: bash promotes itself to the background after 30 s with elapsed time, last-output age and a cargo-shaped phase hint; kills say how far it got; task_shell_start is removed in favour of one background path. - #6931: a live shell inspector (cwd, owner, state, bounded output, stop); Alt+V opens the newest running shell when nothing is selected; dock rows share the formatter. - #6470: entering Full Access asks first (session by default, per-repo opt-in full_access_repos), chip text carries the scope, permission changes are receipted in the transcript and as a runtime status item; a saved full-access posture migrates to Ask once. Runtime API: PATCH into Full Access without full_access_confirmation is a 400 (documented). - Daytona and Sprites are gone from the engine: own-sandbox dispatch (--own-sandbox, /dispatch, agent runtime:"cloud", cloud-agent alias), cloud_dispatch.rs, dispatch_runner.rs, cloud_proposal.rs, computer_meter and the computer-use Sprite task-hold are deleted (archived in codewhale-hq/codewhale-sandboxes b68803e); logout sweeps a stored legacy sandbox token. codewhale dispatch is account-only, requires an actionable or queued intent, prints the Message ID, and prompts only when stdin and stdout are terminals. The CLI never prints a code or prose naming the VM vendor or retired providers. - CW-7167: a keyless first launch opens on the composer; the first send opens the provider picker with the draft kept; the first-run picker shows the typed filter (CW-7170). A local runtime is offered only when Ollama answers. - QA fixes: unknown --profile and a missing explicit --config fail loudly, -C on a missing directory errors, codewhale web works under a root-owned symlinked HOME ancestor (user-controlled symlinks are still rejected), /exi Enter fills instead of running destructive commands, Shift+Tab hint stays in Auto/Full Access, a crashed session shows an interrupted marker, help/exit-code fixes, README exec examples, zh docs. #6728: the pet owner stops building frames while nobody views. - Credit: @xiaoray-blip (0.9.8) and @xyzs996 (0.9.11) added to AUTHOR_MAP, CONTRIBUTORS and the CHANGELOG; 0.9.9 placement for @Lstarsky0 and @SparkofSpike. Evidence (2026-10-10, local only, on this exact tree): - cargo clippy --workspace --all-targets --all-features --locked with CI's flags: exit 0. - cargo nextest run --workspace --locked: 18981 tests, 18978 passed, 3 failed; the three are tools::test_runner::tests::* (environment-only: nested cargo inherits this machine's build-dir wrapper; they pass in CI). - scripts/check-dead-code-budget.py PASS 221; check-blocking-calls-budget.py within budget (537 sites; private_directory.rs records one canonicalize and one std_fs: sync startup path resolution, not on the async runtime); check-command-crate-boundaries.py PASS; module_graph.py --check PASS; check-contributor-credit.py v0.10.1 clean; check-versions.sh OK (0.10.2). - cargo fmt --all -- --check clean. Conformance goldens regenerated for the tool-catalog change (task_shell_start removed, bash description). Not verified: hosted CI on this commit, a real-TTY run of composer-first launch, MCP default connect, the shell inspector and the Full Access modal, bwrap on Linux, a real provider turn, the live ChatGPT sign-in (#6925), a real dispatch against the account service, and re-measuring runtime-contract-budget on Linux. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> | 28 days ago | |
Move the credentials module from tui into codewhale-runtime First placement-independent step of the S7=(c) decision (config, credentials and OAuth move toward codewhale-runtime). credentials has no dependency on any other tui module (0 outbound edges) and is the only module the config cluster was blocked on at module level (23 references), so it moves first and alone. - scripts/split/move-modules.py credentials rewrote the seven callers (config, config/credential_resolve, config/tests, provider_readiness, runtime_api/secrets, tui/provider_picker, client test cases) to codewhale_runtime::credentials. No shim or re-export stays in tui. - scripts/split/widen.py widened exactly the 38 items the compiler named (pub(crate) to pub) and deleted three expect(dead_code) attributes the export fulfils. Token and key material is unchanged: Credential keeps its hand-written Debug that prints only the variant tag, and secrets stay behind the existing store trait. - MapAuthContext is gated on any(test, feature = "test-support") instead of cfg(test) so tui tests can still use it across the crate boundary; the tui dev-dependency on runtime already enables test-support. - codewhale-runtime gains a codewhale-secrets dependency (Cargo.toml and Cargo.lock). codewhale-secrets is a leaf; the command-crate-boundaries check still passes with runtime free of UI packages. - One module comment that named crate::config::credential_resolve now names codewhale_tui::config::credential_resolve. THIRD_PARTY_NOTICES and the old decomposition roadmap carry the path sweep; the roadmap still plans a later move into codewhale-secrets, which S7=(c) supersedes. - dead-code budget lowered 212 to 209. Size: codewhale-runtime production lines 14,699 to 15,416 (closure_report), tui 965,801 to 965,081. This is NOT progress on the 79-module SCC (credentials was never in it) and the crate split is not done. Honest headroom note for the founder: moving the rest of the S7=(c) cluster (config 14,105, settings 5,935, config_persistence 2,180, oauth 9,896, codex_model_cache 608 = 32,724 production lines) would take runtime to about 48,140, within about 1,900 of the 50k ceiling and far from the 10k typical target, with no room for the 13 other wave-0 modules (5,988 lines). Verified (macOS, local only; no hosted CI, Linux/FreeBSD/Windows compile): - scripts/dev-cargo.sh build -p codewhale-cli --bin codewhale --locked: exit 0 (known ld __eh_frame warning only). - nextest -p codewhale-runtime -p codewhale-tui --lib, filters runtime credentials:: and tui credential / secrets / provider_readiness / provider_picker / config::tests: 774 run, 774 passed, 0 failed, 14792 skipped (10 runtime credentials tests, 755 tui tests). - module_graph --check 121 closure modules PASS, blocking calls 543/165, command-crate-boundaries PASS, dead-code 209 (budget updated). Not verified: a signing-in or key-saving run through the product. The exercised paths are the existing unit and API tests only. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> | 13 days ago | |
refactor(engine): extract the shared runtime from the TUI [skip ci] Move the Engine band, extension host, fixtures and shared test support into codewhale-engine; wire TUI/CLI to that owner. Preserve human-decision construction boundaries and lower reusable test helpers. Remove unused copied dependencies and repair path-based guards, scripts and crate maps. Correct the blocking scanner external-module scope leak; raised counts equal the corrected pre-move source. Refresh embedded built-in hashes after path-only bundle regeneration. Restore the provider-free prompt budget to the exact pre-b984e31290 macOS bytes and representative identities; tool catalogs are unchanged. Portable prompt-fixture pinning remains follow-up work. Local validation: Engine/TUI/CLI clippy --tests --no-deps -D warnings passed with the existing allow-list; production CLI check passed; fmt passed. Focused native run: 705 passed / 83 failed initially; after hash/path repairs, 81 affected cases plus 2 existing build-relocation cases passed (83/83). Thus 786/788 original cases pass; 2 compiled-release-image cases lack input and are not qualified. Frozen input inventories unchanged. macOS test-link unwind-table warnings remain. Four metric tests pass; all 55 budgets pass. Host Node: 413 pass, 7 skip; Bun: 414 pass, 6 skip. Existing scanner checks: 34 + 33 pass. Compiled-delivery synthetic fixtures: 7 pass. Web: 42 pass. Import, blocking, dead-code, coarse-map, version and facts checks pass. CW-7701. No hosted CI, provider call, release build or publication. Stage A part 2 and the old App Server/ratatui dependencies remain separate. | 7 days ago | |
feat(engine): eager sub-agents and goals by default, with clearer tool text The founder-approved 0.10.3 batch from artifacts/eager-delegation-20261107/FINAL-CHANGES.md, all ten items. This is one declared re-pin of the session-pinned prefix (docs/CACHE.md): BASE_PROMPT and several eager tool descriptions change on upgrade, and nothing changes mid-session. 1. BASE_PROMPT gains "Delegation and goals". Independent parts of a request go to agent children started together in one message. Results arrive on their own, so never poll or sleep, and end the turn when only waiting remains. Each child gets a complete prompt and a disjoint file scope; the parent inspects a write-capable child's evidence, reviews the final diff and runs the checks. An independent reviewer tries to refute a non-trivial change before it is called done. create_goal is for any direct request, in any language, that describes a verifiable end state needing more than one turn. A goal is blocked only when the same concrete obstacle persists; difficulty is not blocked. Cost alone is not a reason to stop, and only limits the user or configuration sets apply. The scope line keeps express authorization for spending real money (purchases, paid providers, billing) and adds the founder-approved sentence "Sub-agents, workflows and goals within the current request are in scope." GOAL_CONTINUATION_PROMPT drops the stale tool_search sentence (update_goal is eager), asks for remaining independent work to be split across agent workers before the next verification pass, and uses the same blocked rule. 2. The engine no longer appends the Operate contract (record_mode_context). Its reviewer, cost and write-child-evidence lines now live in BASE_PROMPT for every session. Every saved wording stays recognized, so restored sessions replay it as internal state and compaction still keeps it. 3. The agent start receipt carries next: "Results arrive automatically; continue other work or end your turn." 4. The agent description leads with intent ("Delegate focused work and keep working. Start early; one agent per independent part, same message."), gives one trigger per role, adds a child-prompt brief with one worked example, names workflow and Run as the real tools, and drops the "In Operate" and "Legacy action=" sentences. The schema is unchanged. 5. create_goal, its token_budget property and update_goal (description and status property) say when to start a goal and what complete, blocked and yield mean, without judge jargon. The status enum and parser are unchanged, and the token_budget parameter stays. 6. The bundled goals skill (personal resolutions in goals.md) becomes personal-goals with aliases-for: goals, so saved references still resolve and the skills index no longer reads like goal mode. It keeps the generation-12 introduction, so a user who deleted goals does not get it back. On upgrade, an untouched goals copy (a shipped body by hash, SKILL.md its only entry, and no personal-goals directory yet) is renamed to personal-goals and then refreshed by the ordinary generation-20 upgrade, because its body hash is listed under personal-goals. An edited or extended copy stays where it is. Known limitation: a [skills.bundled] entry that names "goals" now reports as unknown and does not apply to personal-goals. delegate no longer forbids delegating final verification and treats the roster as optional; best-of-n uses the general and implement roles and drops "In Operate mode" and the 16-worker figure. v4-best-practices is not changed: it is a cfg(test) v4 migration fixture, not a bundled skill, so editing it would falsify the fixture and reach no user. 7. The tasks schema stops advertising mode=operate; the hidden legacy alias schema and the free-string parser still accept it. harness no longer names the hidden rlm tool (description and overview), list_dir loses its harness meta sentence, and TOOL_SURFACE.md (and zh_hans) drop Operate. goal.rs's Run action="verifiers" names a real deferred tool, which a well-formed first call activates, so it stays. 8. Workflow max_concurrent defaults to 64 (was 16), matching sub-agents. The workflow-js per-run clamp WORKFLOW_MAX_CONCURRENT moves from 16 to 128, the sub-agent hard maximum; without it the clamp would have kept every run at 16 and explicit configs above 16 would not take effect. No spend caps are added, and the high-budget approval trigger is untouched because the default token budget is 0. Docs and config.example.toml follow. 9. Each child's task message ends with its name, its scope (read-only, or may edit files within its assignment) and "Your final answer is delivered to the parent automatically; include the result and its evidence." This is the child seed built by the runner in subagent/engine.rs, beside the role prompt that carries SUBAGENT_OUTPUT_FORMAT; the role prompts that children share are unchanged. 10. tool_search lists the commonly registered deferred groups (Git, Run, Web, tasks, github, automation, lsp, review, session_search, terminal/*, apply_patch, grep_files, MCP) and says a listed tool can be called by name. Memory tools are opt-in, so they are not listed. Generating the list from the live catalog is the next-patch item. Bytes and cache: - /preview-request before, installed 0.10.3 (7b8a634, catalog-equivalent to main) on macOS with an isolated offline HOME: tool schemas 40,854 canonical JSON bytes, system 16,662, base prompt 3,336, 18 active of 59. - /preview-request after, a debug build of this diff on Linux (Boat farm) with the same isolated offline HOME and prompt: tool schemas 40,173 canonical JSON bytes (-681, eager bytes did not grow), base prompt 4,352 bytes. - Source delta on eager tool schemas: -681 bytes (agent 2,370 -> 1,737, create_goal -244, update_goal -129, tool_search 71 -> 396). BASE_PROMPT grows to 4,352 bytes in the system region. Tests changed with the behavior: prompts.rs universal_prompt_does_not_expose_control_plane_ceremony no longer forbids "sub-agent" and "dispatch, join" (the founder reversed that decision) and still forbids sentinel and runtime-event jargon; the deleted agent_tool_description_states_the_operate_child_approval_rule pinned the dropped Operate sentence; the tasks enum test, the workflow default tests, the Operate probes (now 0 contracts) and the delegate generation-18 reconstruction chain follow; the skills fixture moves to generation 20, with the old delegate and best-of-n bodies and the old goals body (under personal-goals) listed by hash. The prompt and event conformance goldens are re-recorded for the re-pin. Verified on the Boat farm (Linux x86_64), base 4c5426f9/f0fb6adb plus only this diff (engine.rs, subagent/mod.rs, subagent/tests.rs, tasks.rs and config.example.toml shipped as HEAD plus this batch's hunks): - cargo test -p codewhale-engine --lib, focused filters (prompts, goal, tasks, harness, canonical actions, agent description and parent surface ceiling, lifecycle, launch receipt, assignment prompt, limits, compaction last round, tool catalog, runtime handoff, registry, workflow): 533 passed, 0 failed. The final state on base f0fb6adb, same filters plus core::engine::tests::operate_ and mode_notice: 539 passed, 1 failed. The failure, create_mode_enum_advertises_neither_operate_nor_yolo, came from the farm copy of tasks.rs missing this commit's third hunk; the first run carried exactly the committed tasks.rs, and the test passed. - cargo test -p codewhale-skills: 182 passed, 0 failed, on the final rename migration; a throwaway migration check (not committed) covering untouched, edited, extended, deleted and fresh installs: 5 passed. - cargo test -p codewhale-config --lib workflow_config: 3 passed; cargo test -p codewhale-workflow-js: 12 + 82 passed. - cargo test -p codewhale-tui --lib conformance::prompt:: conformance::events::, update pass then compare pass: 5 passed each; the re-recorded goldens come from that run on base cd7f5b32 (conformance tool schemas 19,840 -> 19,792 bytes, system +1,033 bytes, matching the source delta); nothing that landed since touches the surfaces they capture. - cargo clippy -p codewhale-engine -p codewhale-skills -p codewhale-config -p codewhale-workflow-js --all-targets --all-features with the Lint job's flags: clean; skills clippy re-run on the final migration: clean. Local: rustfmt clean on every touched file; scripts/preflight.sh --check passes except the blocking-calls budget, which fails only on another session's untracked crates/engine/src/session_image_prune.rs (4 > 0), not part of this commit; dead-code budget 137 of 137. Not verified: a macOS run of the after binary (the before figure is macOS, the after figure Linux; the measured -681 equals the source delta), any live provider turn, and DSH's sleep/poll probe on the target models. Refs: CW-7852 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 8 hours ago | |
docs(tui): mark modularization slices 3-9 extracted ui.rs is 2,130 lines from the 4,248 baseline; all nine slices are in owned modules. The event_loop/tests partition stays documented as the deliberate second phase. Implemented with agent assistance. Signed-off-by: Hunter Bown <hmbown@gmail.com> | 2 months ago | |
docs(i18n): complete the Tier-2 should-have docs for EPIC #5482 Translate the 17 remaining should-have user-facing docs into Simplified Chinese under docs/zh_hans/, each with a language banner on its English original: PLUGINS, PLUGIN_BUNDLES, MEMORY, SANDBOX, WORKFLOW_AUTHORING, FLEET_WORKFLOW_TUTORIAL, DOCKER, TERMUX, ACCESSIBILITY, CACHE, CATALOG_REFRESH, BUILD_PERFORMANCE, VOICE, LOCALIZATION, REBRAND, HarmonyOS, CNB_MIRROR. With WEB.md already landed this closes the Tier-2 should-have list. Link hygiene in the same pass: 39 cross-links inside docs/zh_hans/ now point at the local translations with translated anchors, three pre-existing dead anchors are fixed, and docs/zh_hans/README.md lists the new entries. Structure is 1:1 with the English originals for all 17 pairs (headings, code fences, tables, lists, images and link counts verified); 205 relative links and 44 anchors resolve across docs/zh_hans. Refs #5482 | 1 month ago | |
docs(i18n): move Indonesian docs into docs/id/ with redirect stubs - Move all 10 docs/*.id.md files into docs/id/ (dropping the .id suffix), leaving English redirect stubs at the old paths for one release cycle - Update README.id.md links to point at docs/id/ - Note docs/id/ alongside docs/zh_hans/ in LOCALIZATION.md's scope note Part of #5482 Signed-off-by: Shizuku <2163018547@qq.com> | 2 months ago | |
fix(security): close a daemon-socket sandbox escape and a codewhale web proof leak before 0.10.2 Found by a pre-release audit of the local network surfaces (Claude workflow wf_d93a93bb-48d: three auditors plus adversarial verification of every finding; a Gemini 4 Argon read-only review through agy found nothing exploitable by default). Founder, 2026-10-18: pause account work and hold the paid product until security review is stronger; this keeps the local release to the same bar. Two unrefuted High findings and one Medium are fixed here; the rest are listed in 0.10.2's Known limits. 1. Sandbox escape through the Runtime daemon socket (High). Sandboxed commands (test scripts, postinstall hooks) could read the owner receipt and connect to the daemon socket that codewhale serve, the desktop app, the VS Code extension or ACP holds. The socket checks only the peer uid, and an attached Control peer reaches the full dispatcher, including app/config/set (sandbox_mode, approval_policy, providers.*.base_url) and prompt/run. On Linux, bubblewrap's --unshare-all does not stop a path-based AF_UNIX connect. On macOS, Seatbelt with network on allows it. - read_guard.rs: the daemon's default run directories, as this process resolves them (CODEWHALE_HOME/run, $XDG_RUNTIME_DIR/codewhale, ~/Library/Application Support/codewhale, ~/.codewhale/run; an invalid CODEWHALE_HOME falls back to the other layouts), join the default sandbox deny-list. bubblewrap masks an existing denied directory with an empty tmpfs, so the socket and receipt are not there inside the sandbox. - seatbelt.rs: a file-read deny does not stop connect(2). Checked with sandbox-exec: with (allow network-outbound), the read deny alone still connected, and adding (deny network-outbound (remote unix-socket (subpath …))) refused it. With network on, every denied path now gets that rule. Live check (macOS, debug TUI, mock provider, CODEWHALE_SANDBOX_NETWORK_ACCESS=1, a listener at <CODEWHALE_HOME>/run/t.sock; release-0102-refreeze-20261018/): before "SOCKET-CONNECTED b'hi'", after "PermissionError: [Errno 1]". Linux bubblewrap was not run end to end here; it relies on the existing mask path proven for #7007. 2. codewhale web proof leak (High). GET / wrote the live request proof into a meta tag for any request carrying the session cookie and Sec-Fetch-Site: same-origin|none. The cookie is host-scoped, not port-scoped, so a listener on another 127.0.0.1 port can receive it, and a non-browser client can claim any Sec-Fetch-Site. Cookie plus proof opens every /v1 route (threads with auto_approve, approvals, terminal input, config). - web.rs: the page is static; the proof is never put in HTML. index.html drops the meta tag; app.mjs drops pageProof and keeps the proof in sessionStorage, so a reload still works. The existing source assertion that app.mjs never uses localStorage stays. - Behaviour change: a new tab opened by typing the address is not signed in. docs/WEB.md and docs/RUNTIME_API.md say so and say what to do. Live check (curl against codewhale web, harness HOME, bootstrap redeemed, then GET / with the cookie and Sec-Fetch-Site: none): before "PROOF RE-ISSUED", after "no proof in page". Headless Chrome over CDP on the fixed build: bootstrap ready with the proof in sessionStorage and nothing in localStorage, reload ready, and a typed new tab shows "not authenticated". 3. Web approval card spoofing (Medium). When the model had written anything, the card showed only intent_summary (the model's own text) and never the input. It now shows the deterministic summary; then description, the runtime's reason for asking (sandbox escalation, auto-review hold, repo law, Computer Use consent), when it differs; then every argument in a <pre>: the command first, then all other fields as JSON (sandbox_permissions, justification, stdin, cwd, task_id ...), not truncated; and the model's text last, labelled "The model says:". Headless Chrome with the mock provider: - phase3: summary "Run echo later-01", request "echo later-01" - phase10 (bash with sandbox_permissions=danger-full-access): reason "Sandbox escalation to 'danger-full-access' for this exact call: needs the whole disk", request shows the command and the escalation fields Tests changed for the new behaviour: - web.rs runtime_surface_review_web_page_recovers_proof_for_reload_and_second_tab becomes ..._web_page_never_carries_the_request_proof. - runtime_api/tests.rs: the reload loop asserts the proof is absent. - runtime_web_client.test.mjs: the independent-tab test becomes "web session uses only its fragment or this tab's stored proof". Checks: - cargo test -p codewhale-tui --lib -- runtime_api:: runtime_surface sandbox:: read_guard seatbelt bwrap provider_lake: 603 passed; 0 failed - cargo test -p codewhale-commands: 28 passed; 0 failed - node --test crates/tui/tests/runtime_web_client.test.mjs: 43/43; vitest runtime_web app.test.mjs: 29/29 - after the review fixes: cargo test -p codewhale-tui --lib -- sandbox:: read_guard seatbelt bwrap runtime_surface runtime_api::web: 114 passed; 0 failed; clippy (tui, CI flags) clean; web tests 43/43 and 29/29 - cargo clippy -p codewhale-tui -p codewhale-commands --all-targets --all-features --locked with CI's flags: clean; cargo fmt --check: clean - npm test: 101/101, 19/19, 413 passed + 7 skipped of 420, 7/7, vitest 772/772; web prebuild + check-facts + check:docs OK; sync-changelog --check up to date Pre-push review (Claude workflow wf_626dd2b1-3e0, three lenses; Gemini 4 Argon via agy on the diff) found no bypass of the default setup and these, all addressed before push: - The card hid the runtime's description (a regression for sandbox escalations) and dropped every input field but command. Fixed as in 3. - An invalid (relative) CODEWHALE_HOME made runtime_daemon_socket_dirs return nothing. Fixed with the fallback above. - docs/zh_hans/RUNTIME_API.md still described the meta-tag recovery, and zh_hans/WEB.md lacked the new-tab note. Both updated. - The changelog overstated coverage. It now says the default deny-list must stay on, and the gaps are listed under Known limits. Unverified and not acted on: a claimed window after a TUI workspace switch before the respawned engine installs the deny-list (recorded in the release packet). Known limits, listed in 0.10.2: no Host/Origin check under --insecure and --insecure-no-auth; the bootstrap nonce passes through the browser launcher's argv; the opt-in control socket has no peer-uid check; OAuth loopback callbacks can be ended by a malformed request; the daemon-socket deny covers only default locations as this process sees them, not a directory created after a long-running command started, and not a macOS workspace at or above the daemon directory (the directory can be moved). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz | 20 days ago | |
feat(engine): eager sub-agents and goals by default, with clearer tool text The founder-approved 0.10.3 batch from artifacts/eager-delegation-20261107/FINAL-CHANGES.md, all ten items. This is one declared re-pin of the session-pinned prefix (docs/CACHE.md): BASE_PROMPT and several eager tool descriptions change on upgrade, and nothing changes mid-session. 1. BASE_PROMPT gains "Delegation and goals". Independent parts of a request go to agent children started together in one message. Results arrive on their own, so never poll or sleep, and end the turn when only waiting remains. Each child gets a complete prompt and a disjoint file scope; the parent inspects a write-capable child's evidence, reviews the final diff and runs the checks. An independent reviewer tries to refute a non-trivial change before it is called done. create_goal is for any direct request, in any language, that describes a verifiable end state needing more than one turn. A goal is blocked only when the same concrete obstacle persists; difficulty is not blocked. Cost alone is not a reason to stop, and only limits the user or configuration sets apply. The scope line keeps express authorization for spending real money (purchases, paid providers, billing) and adds the founder-approved sentence "Sub-agents, workflows and goals within the current request are in scope." GOAL_CONTINUATION_PROMPT drops the stale tool_search sentence (update_goal is eager), asks for remaining independent work to be split across agent workers before the next verification pass, and uses the same blocked rule. 2. The engine no longer appends the Operate contract (record_mode_context). Its reviewer, cost and write-child-evidence lines now live in BASE_PROMPT for every session. Every saved wording stays recognized, so restored sessions replay it as internal state and compaction still keeps it. 3. The agent start receipt carries next: "Results arrive automatically; continue other work or end your turn." 4. The agent description leads with intent ("Delegate focused work and keep working. Start early; one agent per independent part, same message."), gives one trigger per role, adds a child-prompt brief with one worked example, names workflow and Run as the real tools, and drops the "In Operate" and "Legacy action=" sentences. The schema is unchanged. 5. create_goal, its token_budget property and update_goal (description and status property) say when to start a goal and what complete, blocked and yield mean, without judge jargon. The status enum and parser are unchanged, and the token_budget parameter stays. 6. The bundled goals skill (personal resolutions in goals.md) becomes personal-goals with aliases-for: goals, so saved references still resolve and the skills index no longer reads like goal mode. It keeps the generation-12 introduction, so a user who deleted goals does not get it back. On upgrade, an untouched goals copy (a shipped body by hash, SKILL.md its only entry, and no personal-goals directory yet) is renamed to personal-goals and then refreshed by the ordinary generation-20 upgrade, because its body hash is listed under personal-goals. An edited or extended copy stays where it is. Known limitation: a [skills.bundled] entry that names "goals" now reports as unknown and does not apply to personal-goals. delegate no longer forbids delegating final verification and treats the roster as optional; best-of-n uses the general and implement roles and drops "In Operate mode" and the 16-worker figure. v4-best-practices is not changed: it is a cfg(test) v4 migration fixture, not a bundled skill, so editing it would falsify the fixture and reach no user. 7. The tasks schema stops advertising mode=operate; the hidden legacy alias schema and the free-string parser still accept it. harness no longer names the hidden rlm tool (description and overview), list_dir loses its harness meta sentence, and TOOL_SURFACE.md (and zh_hans) drop Operate. goal.rs's Run action="verifiers" names a real deferred tool, which a well-formed first call activates, so it stays. 8. Workflow max_concurrent defaults to 64 (was 16), matching sub-agents. The workflow-js per-run clamp WORKFLOW_MAX_CONCURRENT moves from 16 to 128, the sub-agent hard maximum; without it the clamp would have kept every run at 16 and explicit configs above 16 would not take effect. No spend caps are added, and the high-budget approval trigger is untouched because the default token budget is 0. Docs and config.example.toml follow. 9. Each child's task message ends with its name, its scope (read-only, or may edit files within its assignment) and "Your final answer is delivered to the parent automatically; include the result and its evidence." This is the child seed built by the runner in subagent/engine.rs, beside the role prompt that carries SUBAGENT_OUTPUT_FORMAT; the role prompts that children share are unchanged. 10. tool_search lists the commonly registered deferred groups (Git, Run, Web, tasks, github, automation, lsp, review, session_search, terminal/*, apply_patch, grep_files, MCP) and says a listed tool can be called by name. Memory tools are opt-in, so they are not listed. Generating the list from the live catalog is the next-patch item. Bytes and cache: - /preview-request before, installed 0.10.3 (7b8a634, catalog-equivalent to main) on macOS with an isolated offline HOME: tool schemas 40,854 canonical JSON bytes, system 16,662, base prompt 3,336, 18 active of 59. - /preview-request after, a debug build of this diff on Linux (Boat farm) with the same isolated offline HOME and prompt: tool schemas 40,173 canonical JSON bytes (-681, eager bytes did not grow), base prompt 4,352 bytes. - Source delta on eager tool schemas: -681 bytes (agent 2,370 -> 1,737, create_goal -244, update_goal -129, tool_search 71 -> 396). BASE_PROMPT grows to 4,352 bytes in the system region. Tests changed with the behavior: prompts.rs universal_prompt_does_not_expose_control_plane_ceremony no longer forbids "sub-agent" and "dispatch, join" (the founder reversed that decision) and still forbids sentinel and runtime-event jargon; the deleted agent_tool_description_states_the_operate_child_approval_rule pinned the dropped Operate sentence; the tasks enum test, the workflow default tests, the Operate probes (now 0 contracts) and the delegate generation-18 reconstruction chain follow; the skills fixture moves to generation 20, with the old delegate and best-of-n bodies and the old goals body (under personal-goals) listed by hash. The prompt and event conformance goldens are re-recorded for the re-pin. Verified on the Boat farm (Linux x86_64), base 4c5426f9/f0fb6adb plus only this diff (engine.rs, subagent/mod.rs, subagent/tests.rs, tasks.rs and config.example.toml shipped as HEAD plus this batch's hunks): - cargo test -p codewhale-engine --lib, focused filters (prompts, goal, tasks, harness, canonical actions, agent description and parent surface ceiling, lifecycle, launch receipt, assignment prompt, limits, compaction last round, tool catalog, runtime handoff, registry, workflow): 533 passed, 0 failed. The final state on base f0fb6adb, same filters plus core::engine::tests::operate_ and mode_notice: 539 passed, 1 failed. The failure, create_mode_enum_advertises_neither_operate_nor_yolo, came from the farm copy of tasks.rs missing this commit's third hunk; the first run carried exactly the committed tasks.rs, and the test passed. - cargo test -p codewhale-skills: 182 passed, 0 failed, on the final rename migration; a throwaway migration check (not committed) covering untouched, edited, extended, deleted and fresh installs: 5 passed. - cargo test -p codewhale-config --lib workflow_config: 3 passed; cargo test -p codewhale-workflow-js: 12 + 82 passed. - cargo test -p codewhale-tui --lib conformance::prompt:: conformance::events::, update pass then compare pass: 5 passed each; the re-recorded goldens come from that run on base cd7f5b32 (conformance tool schemas 19,840 -> 19,792 bytes, system +1,033 bytes, matching the source delta); nothing that landed since touches the surfaces they capture. - cargo clippy -p codewhale-engine -p codewhale-skills -p codewhale-config -p codewhale-workflow-js --all-targets --all-features with the Lint job's flags: clean; skills clippy re-run on the final migration: clean. Local: rustfmt clean on every touched file; scripts/preflight.sh --check passes except the blocking-calls budget, which fails only on another session's untracked crates/engine/src/session_image_prune.rs (4 > 0), not part of this commit; dead-code budget 137 of 137. Not verified: a macOS run of the after binary (the before figure is macOS, the after figure Linux; the measured -681 equals the source delta), any live provider turn, and DSH's sleep/poll probe on the target models. Refs: CW-7852 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 8 hours ago | |
feat(engine): eager sub-agents and goals by default, with clearer tool text The founder-approved 0.10.3 batch from artifacts/eager-delegation-20261107/FINAL-CHANGES.md, all ten items. This is one declared re-pin of the session-pinned prefix (docs/CACHE.md): BASE_PROMPT and several eager tool descriptions change on upgrade, and nothing changes mid-session. 1. BASE_PROMPT gains "Delegation and goals". Independent parts of a request go to agent children started together in one message. Results arrive on their own, so never poll or sleep, and end the turn when only waiting remains. Each child gets a complete prompt and a disjoint file scope; the parent inspects a write-capable child's evidence, reviews the final diff and runs the checks. An independent reviewer tries to refute a non-trivial change before it is called done. create_goal is for any direct request, in any language, that describes a verifiable end state needing more than one turn. A goal is blocked only when the same concrete obstacle persists; difficulty is not blocked. Cost alone is not a reason to stop, and only limits the user or configuration sets apply. The scope line keeps express authorization for spending real money (purchases, paid providers, billing) and adds the founder-approved sentence "Sub-agents, workflows and goals within the current request are in scope." GOAL_CONTINUATION_PROMPT drops the stale tool_search sentence (update_goal is eager), asks for remaining independent work to be split across agent workers before the next verification pass, and uses the same blocked rule. 2. The engine no longer appends the Operate contract (record_mode_context). Its reviewer, cost and write-child-evidence lines now live in BASE_PROMPT for every session. Every saved wording stays recognized, so restored sessions replay it as internal state and compaction still keeps it. 3. The agent start receipt carries next: "Results arrive automatically; continue other work or end your turn." 4. The agent description leads with intent ("Delegate focused work and keep working. Start early; one agent per independent part, same message."), gives one trigger per role, adds a child-prompt brief with one worked example, names workflow and Run as the real tools, and drops the "In Operate" and "Legacy action=" sentences. The schema is unchanged. 5. create_goal, its token_budget property and update_goal (description and status property) say when to start a goal and what complete, blocked and yield mean, without judge jargon. The status enum and parser are unchanged, and the token_budget parameter stays. 6. The bundled goals skill (personal resolutions in goals.md) becomes personal-goals with aliases-for: goals, so saved references still resolve and the skills index no longer reads like goal mode. It keeps the generation-12 introduction, so a user who deleted goals does not get it back. On upgrade, an untouched goals copy (a shipped body by hash, SKILL.md its only entry, and no personal-goals directory yet) is renamed to personal-goals and then refreshed by the ordinary generation-20 upgrade, because its body hash is listed under personal-goals. An edited or extended copy stays where it is. Known limitation: a [skills.bundled] entry that names "goals" now reports as unknown and does not apply to personal-goals. delegate no longer forbids delegating final verification and treats the roster as optional; best-of-n uses the general and implement roles and drops "In Operate mode" and the 16-worker figure. v4-best-practices is not changed: it is a cfg(test) v4 migration fixture, not a bundled skill, so editing it would falsify the fixture and reach no user. 7. The tasks schema stops advertising mode=operate; the hidden legacy alias schema and the free-string parser still accept it. harness no longer names the hidden rlm tool (description and overview), list_dir loses its harness meta sentence, and TOOL_SURFACE.md (and zh_hans) drop Operate. goal.rs's Run action="verifiers" names a real deferred tool, which a well-formed first call activates, so it stays. 8. Workflow max_concurrent defaults to 64 (was 16), matching sub-agents. The workflow-js per-run clamp WORKFLOW_MAX_CONCURRENT moves from 16 to 128, the sub-agent hard maximum; without it the clamp would have kept every run at 16 and explicit configs above 16 would not take effect. No spend caps are added, and the high-budget approval trigger is untouched because the default token budget is 0. Docs and config.example.toml follow. 9. Each child's task message ends with its name, its scope (read-only, or may edit files within its assignment) and "Your final answer is delivered to the parent automatically; include the result and its evidence." This is the child seed built by the runner in subagent/engine.rs, beside the role prompt that carries SUBAGENT_OUTPUT_FORMAT; the role prompts that children share are unchanged. 10. tool_search lists the commonly registered deferred groups (Git, Run, Web, tasks, github, automation, lsp, review, session_search, terminal/*, apply_patch, grep_files, MCP) and says a listed tool can be called by name. Memory tools are opt-in, so they are not listed. Generating the list from the live catalog is the next-patch item. Bytes and cache: - /preview-request before, installed 0.10.3 (7b8a634, catalog-equivalent to main) on macOS with an isolated offline HOME: tool schemas 40,854 canonical JSON bytes, system 16,662, base prompt 3,336, 18 active of 59. - /preview-request after, a debug build of this diff on Linux (Boat farm) with the same isolated offline HOME and prompt: tool schemas 40,173 canonical JSON bytes (-681, eager bytes did not grow), base prompt 4,352 bytes. - Source delta on eager tool schemas: -681 bytes (agent 2,370 -> 1,737, create_goal -244, update_goal -129, tool_search 71 -> 396). BASE_PROMPT grows to 4,352 bytes in the system region. Tests changed with the behavior: prompts.rs universal_prompt_does_not_expose_control_plane_ceremony no longer forbids "sub-agent" and "dispatch, join" (the founder reversed that decision) and still forbids sentinel and runtime-event jargon; the deleted agent_tool_description_states_the_operate_child_approval_rule pinned the dropped Operate sentence; the tasks enum test, the workflow default tests, the Operate probes (now 0 contracts) and the delegate generation-18 reconstruction chain follow; the skills fixture moves to generation 20, with the old delegate and best-of-n bodies and the old goals body (under personal-goals) listed by hash. The prompt and event conformance goldens are re-recorded for the re-pin. Verified on the Boat farm (Linux x86_64), base 4c5426f9/f0fb6adb plus only this diff (engine.rs, subagent/mod.rs, subagent/tests.rs, tasks.rs and config.example.toml shipped as HEAD plus this batch's hunks): - cargo test -p codewhale-engine --lib, focused filters (prompts, goal, tasks, harness, canonical actions, agent description and parent surface ceiling, lifecycle, launch receipt, assignment prompt, limits, compaction last round, tool catalog, runtime handoff, registry, workflow): 533 passed, 0 failed. The final state on base f0fb6adb, same filters plus core::engine::tests::operate_ and mode_notice: 539 passed, 1 failed. The failure, create_mode_enum_advertises_neither_operate_nor_yolo, came from the farm copy of tasks.rs missing this commit's third hunk; the first run carried exactly the committed tasks.rs, and the test passed. - cargo test -p codewhale-skills: 182 passed, 0 failed, on the final rename migration; a throwaway migration check (not committed) covering untouched, edited, extended, deleted and fresh installs: 5 passed. - cargo test -p codewhale-config --lib workflow_config: 3 passed; cargo test -p codewhale-workflow-js: 12 + 82 passed. - cargo test -p codewhale-tui --lib conformance::prompt:: conformance::events::, update pass then compare pass: 5 passed each; the re-recorded goldens come from that run on base cd7f5b32 (conformance tool schemas 19,840 -> 19,792 bytes, system +1,033 bytes, matching the source delta); nothing that landed since touches the surfaces they capture. - cargo clippy -p codewhale-engine -p codewhale-skills -p codewhale-config -p codewhale-workflow-js --all-targets --all-features with the Lint job's flags: clean; skills clippy re-run on the final migration: clean. Local: rustfmt clean on every touched file; scripts/preflight.sh --check passes except the blocking-calls budget, which fails only on another session's untracked crates/engine/src/session_image_prune.rs (4 > 0), not part of this commit; dead-code budget 137 of 137. Not verified: a macOS run of the after binary (the before figure is macOS, the after figure Linux; the measured -681 equals the source delta), any live provider turn, and DSH's sleep/poll probe on the target models. Refs: CW-7852 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 8 hours ago | |
docs(i18n): complete Tier 3 — developer and internal docs translated to zh_hans - 13 new Simplified-Chinese translations under docs/zh_hans/: RUNTIME_API, ARCHITECTURE, TOOL_SURFACE, AUTOMATIC_WORKFLOWS, AUTHORIZATION_ORDER, LIVE_SMOKE, COMMAND_CONTROL_PLANE, ENVIRONMENTS, LEGACY_PATHS, OPERATIONS_RUNBOOK, WORKROOM_ARCHITECTURE, WORKROOM_SECURITY, AGENT_ETHOS (structure verified 1:1 per document: headings, code fences, table rows) - The 13 English originals and docs/LOCALIZATION.md get the "read in Simplified Chinese" banner linking to their zh_hans translation - docs/zh_hans/README.md: 3 links retargeted to the translations, 10 new entries, date refreshed - Terminology follows #4908 (provider -> 提供商) and the Tier 1/2 corpus - Cross-links follow the corpus convention: ../<X>.md when a document exists only in English, plain <X>.md when it has a zh_hans translation (the five links into Tier-2 documents resolve once #6662 lands) - In-page anchors point at the translated headings (#引导送达, #工作区恢复端点, #按项目覆盖485) instead of the English slugs carried over from the sources Refs #5482 | 1 month ago | |
docs(i18n): complete Tier 3 — developer and internal docs translated to zh_hans - 13 new Simplified-Chinese translations under docs/zh_hans/: RUNTIME_API, ARCHITECTURE, TOOL_SURFACE, AUTOMATIC_WORKFLOWS, AUTHORIZATION_ORDER, LIVE_SMOKE, COMMAND_CONTROL_PLANE, ENVIRONMENTS, LEGACY_PATHS, OPERATIONS_RUNBOOK, WORKROOM_ARCHITECTURE, WORKROOM_SECURITY, AGENT_ETHOS (structure verified 1:1 per document: headings, code fences, table rows) - The 13 English originals and docs/LOCALIZATION.md get the "read in Simplified Chinese" banner linking to their zh_hans translation - docs/zh_hans/README.md: 3 links retargeted to the translations, 10 new entries, date refreshed - Terminology follows #4908 (provider -> 提供商) and the Tier 1/2 corpus - Cross-links follow the corpus convention: ../<X>.md when a document exists only in English, plain <X>.md when it has a zh_hans translation (the five links into Tier-2 documents resolve once #6662 lands) - In-page anchors point at the translated headings (#引导送达, #工作区恢复端点, #按项目覆盖485) instead of the English slugs carried over from the sources Refs #5482 | 1 month ago | |
feat: general lifecycle outbox — JSONL + webhook, turn_start/stall/failed events Add an opt-in, machine-readable lifecycle event outbox for supervisors and automation harnesses. Unset/empty config = feature OFF = behavior unchanged. Config ([lifecycle_outbox]): - path — JSONL outbox file (unset/empty disables the feature) - webhook_url — optional webhook endpoint; POSTs only when set - webhook_token — optional bearer token for webhook_url Writer (crates/hooks/src/lifecycle_outbox.rs): - One JSONL line per event in the existing RuntimeEventEnvelope shape (schema_version, seq, event, kind, thread_id, turn_id, item_id, timestamp, created_at, payload); append + flush per event. - seq monotonic per file; recovers from the last complete line on open via a bounded 64 KiB tail scan (torn trailing lines ignored). - Single non-blocking writer task: emit() enqueues; no tokio runtime available => drop with warning. - Payloads only from bounded, pre-redacted fields (headline ≤ 80, detail ≤ 120, preview ≤ 200 chars; control bytes stripped). Signed-off-by: M-Maciej <130112810+M-Maciej@users.noreply.github.com> | 2 months ago | |
docs(contributors): refresh the wall to 421 people and 393 accounts scripts/contributor-wall.py refresh rebuilds the record from git history, the CHANGELOG, docs/CONTRIBUTORS.md and the GitHub API; it was last run on 2026-10-17 and had missed the work credited since, including this release's reporters. 417 -> 421 people, 390 -> 393 GitHub accounts, 31 -> 32 unlinked commit names. The rendered wall and docs/assets/contributors.png follow the data, and web/data/agent-docs.generated.json plus web/lib/facts.generated.ts are regenerated because docs/CONTRIBUTORS.md is one of their sources. Verification: check-contributor-credit.py OK (every contributor in the window is credited on all three surfaces); check-facts.mjs OK. | 16 days ago | |
fix(security): tighten approval, execution and endpoint boundaries for 0.10.1 Hardening across the Engine, the bundled Computer Use plugin and the chat bridges. Each item reuses the existing authority instead of adding a second one. - Computer control: a consent or script call runs only on an exact decision a person gave on its own approval card; rules, autonomous postures, child agents and code-mode programs cannot produce one. The bundled plugin carries the matching consent, script, helper and SSH argument checks and known-host routing. - Git status and review: automatic status, worktree and log reads go through the sanitized review command, refuse unsupported runtime configuration overrides, and stay pinned to the executable that was checked. - Redaction: persisted config backups, config dumps, MCP listings and notification payloads share one sensitive-key vocabulary in codewhale-sanitize. - Recursive RLM: each round of Python a child model writes is admitted by the turn serving the direct rlm call, through the same planning and approval as an inline repl block, and runs only as admitted; rlm is not available inside execute_tools programs. Python kernels are discarded when the applied posture narrows. - Gate commands and the cargo test runner start inside the session's shell sandbox with the sanitized environment. - Chat bridges decide an approval only for the human who started that turn, on the Runtime's current pending approval, and consume a stored action only after delivery. Upgrade note: approvals for turns started before the upgrade are decided from the TUI; WeCom /allow no longer takes remember. - Mutable session artifacts are written through the pinned session-relative replace; the owned-artifact pager reads through the pinned open with a 64 MiB display cap. - The stdio bridge's Runtime child binds an ephemeral loopback port itself and reports it; the parent validates that report, never follows redirects with the bearer token, and reaps the child on a bad or late report. Known limits: Python kernels are approval-gated local subprocesses, not OS-sandboxed; where no enforcing sandbox is configured (Linux without bubblewrap, Windows) a workspace-write policy runs runners unsandboxed, as it already does for exec_shell; an approval wait counts against an RLM turn's deadline; verifier, plugin, hook and lane child processes are unchanged. Local macOS evidence on this exact tree: CI-policy Clippy on Rust 1.99, whole workspace, all targets: exit 0. Focused Rust selection: app-server 7 passed / 0 failed, config 7/0, sanitize 2/0, codewhale-tui 1346/0. Bridges: core 37/0, feishu 19/0, telegram 39/0, wecom 17/0, weixin 13/0. Computer Use plugin: 401 passed / 0 failed / 16 skipped. npm test: 75/0, 19/0, 63/0 with 1 skipped; check:web passes. With each new guard disabled in turn, its regression tests fail and pass again on the restored source. A native run confirmed the stdio parent reaches a real Runtime child through the endpoint the child reported. Hosted three-OS, shared-process and release-candidate results are still required for this head; no Linux or Windows native run is claimed. Co-authored-by: CodeWhaleBot <268170417+CodeWhaleBot@users.noreply.github.com> Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
fix(docs): keep the pasted-image registry summary inside the 120-char rule The clipboard-image-prune row's summary was 143 characters, so cargo test -p codewhale-tui --test feature_registry failed at HEAD since c98ea3836e. Shortened to 115. Check: the registry rule itself is docs/features.toml summary of 1-120 characters on one line, crates/tui/tests/feature_registry.rs:103-107; the row's docs and owner paths both exist. The full feature_registry test runs in the TUI farm check for this batch. | 6 hours ago | |
| 11 hours ago | ||
fix: enforce retry deadlines and integrate main Recheck the public total timeout before another operation, including after time spent in callbacks or retry receipt delivery. Preserve the original typed error and exact attempt count. Clarify the independent rate-limit configuration, validation bounds and safe pre-dispatch HTTP/1.1 fallback. Merge upstream main at 13760312. Keep the precise Responses unknown-outcome test names with main's exact one-attempt and typed 503/499 assertions. Validation on Windows, rustc 1.99.1, locked dependencies: - Candidate-source Engine selections: 47 tests passed - Separate public-API real-clock deadline probe: 1 passed - Three causal negative controls failed as expected; exact source restored - Original candidate Runtime retry status: 7 passed - Full formatting, version consistency, whitespace and dead-code checks passed - Strict/diagnostic Clippy retain attributed existing dependency and Windows lint failures. Primary Runtime passed with the recorded decoder allowance; primary Engine lib/tests report only the two existing Windows lint sites. - Windows blocking checker retains its path-key mismatch; normalized complete measurements have no excess. This is not an official checker or CI pass. The Engine validation copy has test-only tracing and the local probe; production and lockfile bytes match the reviewed candidate. Validation instrumentation stays outside the product tree; contributor changes do not repair unrelated lints. Signed-off-by: z27014 <zhuo.wenpei@h3c.com> | 2 days ago |
Codewhale documentation
Start with the user guide. The website renders a subset of these
pages at codewhale.net/docs; the Markdown here
is the source. Translations live beside their English page (*.id.md) or in
id/ and zh_hans/.
Get started
- Installing Codewhale, including PATH help and shell completions
- User guide: first run, sessions, commands, everyday workflows
- Keybindings
- Pet mode: a glanceable whale view per terminal, with replies and agents on demand
- Modes and permission postures
- Configuration
- Providers and local models and the Model Lab roadmap
- Platform notes: Docker, Termux / Android, HarmonyOS, environment caveats, classroom and lab installs
Using Codewhale
- Local browser client (
codewhale web) - Agent fleet, sub-agents, and the fleet and workflow tutorial
- Workflow authoring, automatic workflows, and experimental workflow search
- Skills and evaluating skill changes
- User memory
read_mediaand/preview-request
Extending Codewhale
- MCP servers
- Hooks
- Installing plugins, writing a plugin, plugin bundles, the first-party marketplace, and Claude plugin compatibility
- Writing an extension tool (experimental
extension_host) - LSP: PHP and custom language servers
- Runtime API and integration contract
- GitHub App setup
- DeepSeek Harness integration and DSH plugin compatibility
Safety and trust
- Authorization order
- Sandbox threat model
- Workroom security model
- Runtime receipts
- Signed cloud facts
- Telemetry
- Accessibility
- Security reports: see
.github/SECURITY.md
Architecture
- Product and architecture overview
- Agent runtime and Codewhale Agent
- Command and control-plane contract
- Tool surface
- Prompt-cache stability
- Workroom architecture
- Design notes:
architecture/,design/,decisions/, andrfcs/
Contributing and operating
- Contribution guide and agent ethos
- Voice and terminal charter, motion contract, and settings picker framework
- Issue triage
- Build and test performance
- Live smoke runs
- Localization matrix
- Dependency maintenance
- Release checklist and release runbook
- Operations runbook
- Catalog refresh and CNB mirror
- Agent skills for contributors:
skills/
History and reference
- Feature registry: every user feature with its status, first release, docs page and owning code, checked against the code by a test
- Contributors
- Changelog archive and the lifecycle outbox changelog
- Rebrand: DeepSeek TUI to Codewhale and
legacy
.deepseek/paths - Third-party notices
- Historical plans: TUI modularization, post-0.9.1 seams, runtime simplification, tool lifecycle (v0.8.53)