| Files | Last commit | Last update |
|---|---|---|
feat(cloud-facts): pin the first production trust anchor Both trust tables were empty, which made the entire cloud-facts layer inert: with no active key ticket() returns RefreshError::Inert, so refresh and maybe_load_persisted_cache bail before reading anything, and configure() publishes CloudFactsState::Inert. Nothing downstream of that could run, however complete it was. And it was complete. Slice 1 (#5752) already shipped verification, scoping, the overlay, the catalog patch semantics, the full consumer wiring, the website transport and the publish tool. A signed fact lands on ProviderModelOffering.limits in provider_lake.rs:764-812 and mints RouteLimits, which route_budget.rs:47-51 consults *before* the fallback chain that currently ends at LEGACY_DEEPSEEK_CONTEXT_WINDOW_TOKENS. The gap was never schema or consumer. It was that no key existed. Anchor cwf-2026-09, Ed25519, generated by the founder with facts-publish.mjs keygen. The private half lives outside every repository at mode 0600 and was never read into this session: only the public half was derived locally, and only the public half is committed. Both tables carry the same key — check-cloud-facts.mjs now reports OK (facts_version=1, 1 active production keys), up from 0. Why this has to land in the release rather than after it: a shipped binary can only trust a key it was compiled with. There is no in-band command that installs or widens trust, and CODEWHALE_CLOUD_FACTS_PATH verifies against this same table, so a local envelope is not an escape hatch either. A client that ships without the anchor can never be served a fact until it is replaced. Pinning it now is what makes delivery possible at all; it does not by itself deliver anything. Still required before any fact reaches a user, and all of it is founder authority: deploy SUPABASE_URL and the publication migration, confirm facts_current grants and RLS, then separately approve signing and publish a payload at a facts_version above the channel floor (1 today). This commit approves trust in a key. It does not approve a publication, and none has occurred. cargo test -p codewhale-config --locked cloud_facts test result: ok. 30 passed; 0 failed; 668 filtered out cargo test -p codewhale-cloud-facts --locked test result: ok. 17 passed; 0 failed node web/scripts/check-cloud-facts.mjs check-cloud-facts: OK (facts_version=1, 1 active production keys) cargo check --workspace --all-targets --locked: 0 errors, 0 warnings No new tests: the existing cloud-facts suite already covers verification, scoping and the empty-table inert path, and the parity gate is the check that matters for a two-table anchor. Refs: Linear SHA-6398, GitHub #5752. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X57KRgwqYkmmtVQScczqiL | 1 month 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. | 1 day 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. | 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 | |
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 | |
feat(web): count usage by default and move the choice to the privacy page The website no longer opens a consent sheet. Anonymous counting of page, docs, install-copy and download totals is on by default; the privacy page hosts the status and the Turn off / Turn on control, and the footer "Usage data" link points there. The historical storage key is kept so an opt-out recorded under the old opt-in policy stays off, unreadable stored state fails closed, and nothing records an acceptance on the visitor's behalf. The envelope moves to schema 3 / notice 5 to match the runtime and ingest. Trust page, FAQ, roadmap, and docs/public-surface-facts.json describe the default-on 0.9.12 behavior and name the published 0.9.11 release as the one that asked first. The privacy policy gains an "Anonymous usage counting" section (effective date September 4, 2026). Screenshot provenance records the founder capture's visible build, v0.9.12 (15fe6983bfa5), and the README image becomes a lossless 1136x615 downscale of that same capture. Gates on this tree: vitest 407 passed / 0 failed (47 files); tsc clean; eslint 0 errors (2 pre-existing img warnings); check:locales, check:facts, check:docs pass; clean next build --webpack succeeded. Browser check of the production build in EN/ZH at 390x844 and 1280x900 passed with no console errors and no horizontal overflow. Receipt: docs/operating/website-usage-default-on-receipt-20260904.md. The Rust root has no npm test / check:web; they were not run. No deployment claimed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Bs5x11yXAg3sJ4giZf4krF | 2 months ago | |
feat(web): show finished work and explain models and connected tools Replace the homepage terminal-view gallery with a labelled weekly report computed from sample orders, matching input/report CSV downloads, and concrete app-building and connected-email tasks. Revise 18 locale editions around building apps, automating work, plugins/MCP/APIs, existing model accounts and own inference. Keep released capabilities and native/hosted development status explicit. Refresh native renderer captures from an actual local Engine task and reviewer, README media, product/design guidance and contributor credits; require Next.js 16.4. Validation: npm test PASS: package 101, SDK 19, extension 413 passed/7 skipped, dependency guards 7, web 74 files/772 tests. npm run check:web PASS: 24 docs topics, 150 design tokens, 0 lint errors/1 existing warning, typecheck, 894 static pages. After note/credit edits, focused changelog/public-copy/public-surface checks 24/24 and changelog sync PASS. Browser reviewed desktop/mobile, light/dark, Chinese and Arabic RTL; light text contrast checked. Native capture uses a local scripted provider. Download payloads and links were checked; in-app native file-save completion was not observed. Production still serves 24a7b99a. No deployment or publication claim. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
test(web): exercise real admin login session helpers Validate issued cookies against real stored sessions with fixture credentials and in-memory KV. Prove rejected credentials and bounded or unavailable limiters cannot create sessions or reach credential comparison after denial. Validation: focused web suite 23 passed, 0 failed across 4 files; scoped ESLint passed; web TypeScript --noEmit --incremental false passed. Test-only change; no production credentials, deployed probes, or release-closure claim. | 1 month ago | |
Harden runtime authority and security boundaries for 0.9.13 - Exact-byte project-hook approval tied to workspace trust; hook event registry gains session_idle/session_error/waiting_for_user (wired in the follow-up session-lifecycle commit). - Complete read-only shell argument and pipeline validation, including sed scripts and write/execute flags; safe Git revision resolution for verify/review; LSP workspace containment. - Unauthenticated Runtime operation is loopback-only; outbound web requests require review and the Auto-Review benign-query bypass is closed; fresh model-backed security reviews bypass the response cache instead of reusing cached allow decisions. - Immutable MCP denial ceilings across child, resume, pool, meta, resource, and runtime-added paths; guarded HTTP/SSE/OAuth networking with DNS validation/pinning, redirect restrictions, policy propagation, and explicit private-network authority; MCP login background machinery keeps proxy use explicit (operator-only) with ambient-proxy regressions pinned. - Admin login throttling on the web surface, with tests. - Goal complete/block HTTP transitions are revision-checked transactions so a stale load-then-save cannot clobber a concurrent PUT replacement (409). - /hooks events lists every runtime event; event_label reuses the one HookEvent::as_str authority. Evidence (this tree): full workspace Clippy green (all targets, all features); codewhale-tui lib suite 11974 passed / 0 failed; focused suites from builds 7-9 (guarded HTTP 9, guarded OAuth 4, broad MCP 218 + 1 ignored, reviewer 5, Auto-Review 54, response-cache 4, preview-filter 178); web package 411 tests + typecheck + extension 42 tests green. Hosted CI and release artifacts are separate lanes and are not claimed here. | 2 months ago | |
web: index the feature catalogue and agent documentation Make the 72 registry capabilities findable in the catalogue and docs search. Derive status, surface badges and documentation links through the existing facts pipeline. Add /features.json, 26 raw Markdown topic routes and /llms-full.txt; align navigation, sitemap and explicit crawler policy. Release JSON-LD uses only stable rows with a declared since version at or before the published install version. Put the coding-agent category in home metadata and identity across the actual 18 routed locale packs. Correct session receipts, default Auto routing, ACP and read-only MCP server claims; mark Computer Use preview. Document request preview, LSP, execution policy, skills and the reviewed Claude Code import subset. Ratatui component indexing becomes English-only; its hub retains existing locale coverage. Root gate on base9ebbb063da plus 137 frozen web paths and the separately frozen Q13/X2 native/doc inputs: 1,312 passed; 0 failed; 7 skipped (wrapper101, SDK19, extension host413, security7, Vitest772). Actual receipt lines: "# pass 413" "# fail 0" "# skipped 7" "Tests 772 passed (772)" npm ci, facts/latest-release/docs/local GT catalogs, lint, tsc and production build passed. One existing lint warning. Final LLMS-only copy correction: "Tests 3 passed (3)"; fresh production build passed. The existing buildFacts comment was moved back to its owner without an executable change. Local browser inspection: 36 pages at 375/768/1280 in en/zh/ja/ar, each captured full-page and viewport. All72 feature queries and26 raw Markdown routes passed; every raw topic appears in the full export; zero page errors and no horizontal overflow. The harness disables speculative link prefetch and answers local telemetry with204. This does not establish deployed-site, crawler indexing, WAF or Search Console acceptance. No new tests or code comments; obsolete existing assertions updated. No deployment. | 27 days ago | |
fix(web): bound cron reads and make facts/release writes honest Audit 0.10.1 js-ops, web (W02): - W02-07 (Refs #6557): when facts_current has no head (revoked, expired or future-dated), resolveCloudFacts retires the KV last-good copy, so a later Supabase outage cannot resurrect a revoked envelope through the stale path. The last-good TTL drops from 30 days to 6 h, the same staleness bound every client already applies (payload ttl_secs). - W02-10 (Refs #6559): facts-publish revoke flips only a published row, so a re-run keeps the first revocation's time and reason and says already_revoked; a version that matches nothing is an error, never a silent revoked: 0; the receipt says whether the head was revoked. publish proves the inserted row is exactly this envelope and treats a replay of the same bytes (lost reply) as already_published instead of a bare HTTP 409. Both are exported with an injectable request. - W02-09 (Refs #6555): sync-latest-release --check fails when GitHub cannot be read ("could not look" is not "current"); a write validates all three files first, then replaces each through a unique temp file and rename, so an unreadable mirror no longer leaves the first file moved alone. - W02-06 (Refs #6561): fetchBoundedText (bounded-body.ts) puts a deadline and byte cap on cron reads of other hosts; facts-drift and content-watch use it, and link probes carry a 10 s deadline and discard GET bodies. - W02-05 (Refs #6556): logUsage writes one append-only record per model call instead of read-modify-writing a shared daily counter that overlapping cron tasks lost calls from (web/AGENT.md updated). runFactsDrift never replaces a snapshot from a newer source commit with an older one. Validation (web, vitest 4.1.11): - vitest run cloud-facts, facts-drift, content-watch, bounded-fetch, community-agent, sync-latest-release, bounded-form, security-boundary-behavior, public-api-security, check-facts, facts, community-agent-security: Test Files 12 passed, Tests 103 passed. - tsc --noEmit -p web: exit 0; eslint on touched files: exit 0; node scripts/check-cloud-facts.mjs: OK. - Negative controls (fix reverted, new test run, restored identical): cloud-facts.ts -> "never resurrects a revoked head": expected ok to match unavailable (1 failed) facts-publish revoke without the status filter -> "revokes once": revoked 1 where already_revoked expected (1 failed) sync-latest-release.mjs -> both new tests fail (check exits 0 on 503; target moved to v0.10.1 while the mirror was unusable) facts-drift.ts + content-watch.ts -> "every cron read": 15 reads without a signal (1 failed) community-agent.ts -> "keeps every call": expected 1 to be 3 facts-drift guard disabled -> "never replaces a newer snapshot": changed true (1 failed) Remaining (recorded, not changed): community-agent-tasks GitHub reads and the paid agentChat call have no deadline yet; generator dedup (hasFreshDraft -> model -> saveDraft) can double-spend when cron runs overlap, and a posted draft is still guarded by the reviewed-body hash. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
fix(web): serialize generation and reconcile uncertain posts before retry Refs #6556 Refs #6559. Completes source repairs for W02-02 and W02-05. Persist post-attempt target/text identity before network dispatch through the existing draft claim Durable Object and KV. Durable attempts survive lease expiry. Unavailable or malformed receipt reads/writes fail closed; changed ambiguous retry text/target is refused. Reconcile at most 10 GitHub pages with one 30-second deadline and 2 MiB per-page cap, refusing incomplete reads. Definite rejection and completed bookkeeping clear the receipt under its claim. The existing durable claim authority also serializes each bounded community cron batch before source reads/model calls. Missing bindings start no provider call; a 45-minute crash lease and two-minute completed hold cover overlap and KV propagation. No new runtime/store authority or external action. Validation: focused 6 files, Tests 78 passed (78), Test Files 6 passed (6). TypeScript noEmit and scoped ESLint passed. Fixes-off source at integration 6352eb2754: Tests 7 failed | 44 skipped (51); all seven new regressions fail on the prior behavior. Fixed source restored byte-identically (4/4); restored regression run: Tests 7 passed | 44 skipped (51). git diff --check passed. No test/proof is inferred from a zero-match run. Root npm test && npm run check:web, actual deployed DO behavior and final candidate/provider evidence remain separate; no deploy/provider spend here. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
fix(web): bound telemetry streams and lead with GitHub releases Reuse one bounded byte reader for login and telemetry; reject overflow, failed reads and malformed UTF-8 before forwarding. Keep canonical ingest/schema/consent guards and qualify transport-header claims. Align 18 home locales, product/install/docs/FAQ copy; reuse the shared getting-started command. Validation: website 407 tests passed, 0 failed across 47 files; lint 0 errors and 2 existing warnings; production webpack build, locales/catalogs, facts and docs passed. EN desktop and ZH/EN 390px browser checks. No root npm test/check:web scripts in this runtime repo. Local-only; no push, deploy, config, secrets or provider use. | 2 months ago | |
fix(web): bound telemetry streams and lead with GitHub releases Reuse one bounded byte reader for login and telemetry; reject overflow, failed reads and malformed UTF-8 before forwarding. Keep canonical ingest/schema/consent guards and qualify transport-header claims. Align 18 home locales, product/install/docs/FAQ copy; reuse the shared getting-started command. Validation: website 407 tests passed, 0 failed across 47 files; lint 0 errors and 2 existing warnings; production webpack build, locales/catalogs, facts and docs passed. EN desktop and ZH/EN 390px browser checks. No root npm test/check:web scripts in this runtime repo. Local-only; no push, deploy, config, secrets or provider use. | 2 months 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(web): stop steering visitors into paused accounts; say what 0.10.2 adds Codewhale accounts, account key storage and the paid product are paused until a frontier security review is available (CURRENT_DECISIONS §38, 2026-10-18). The live site still sent every visitor toward them, and several pages presented 0.10.2 as released. The plan came from a read-only audit of README, site and GitHub copy against the code and CHANGELOG (artifacts/readme-site-20261019/plan.md). Account pause (honesty): - Masthead and mobile menu: "Sign in" removed. - Home and /product: "Create an account" link, the account sentence and the Cloud computers row removed. Hosted web is "In development, not open yet" and points to codewhale web. The desktop row describes what the unreleased app does. - /signin lede and meta: new accounts are not open. /signup redirects to /signin and leaves the sitemap and llms.txt. The signup-counting disclosure copy is updated. - /docs/computers (account-only cloud agents) redirects to Fleet. - Auth docs: "Codewhale accounts", never needed and not open. The account-keys row is gone. - docs/INSTALL.md and zh_hans: "One account for your provider keys" is replaced by "No account needed". docs/CONFIGURATION.md and zh_hans: the account-key section no longer promotes account key storage and keeps only list/remove for existing accounts. Release labels (honesty): - docs/features.toml: chat-color and terminal-dock carry since 0.10.2; the account-login summary is corrected. - /features shows rows newer than the latest published release as source candidates. - /changelog marks a candidate version with the unreleased note and hides compare links to tags that do not exist. - Runtime page "Source version"; FAQ provider count is "the current source declares". - Review and pet docs say what 0.10.1 does and what 0.10.2 adds. Excitement through specifics: - Hero: "The open-source coding agent for any model"; heading "Build and automate from your terminal"; footer tagline to match. - Model facts name the default: deepseek-flash, now DeepSeek-V4.1-Flash. New fact: ChatGPT plan sign-in (experimental). The models page says what changed on 2026-10-17 and titles its table "source v{version}". - New "Coming in v0.10.2" band (lib/content/release-highlights.ts): /pet on, /workbar terminal, /undo, Plan to Work, the curl/wget credential hold and DeepSeek Search. It flips to "New in" at the tag and hides itself when stale. - Community line renders the contributor count from data. - web/MESSAGING.md synced. Every changed dictionary value is translated in all locales; deleted keys are removed everywhere. Generated files come from their generators (prebuild, i18n:gt export). Coded by GPT-6 Astra (codex, workspace-write). Claude added the CONFIGURATION.md sections Astra flagged, regenerated, and ran the gate. Verification: - npm test (repo root): node suites 101/19/413 (7 skipped)/7 passed, 0 failed; Vitest 74 files, 772 tests passed - npm run check:web: production build succeeded - web: check:locales PASS, check:facts OK, check:docs PASS, lint and tsc clean - cargo test -p codewhale-tui --test feature_registry: 2 passed Not done: no visual render check, and no deploy. The live site changes only when a maintainer runs web.yml. Outside this repo, app.codewhale.net/signup still serves "Create account". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz | 20 days ago | |
fix(web): bound cron reads and make facts/release writes honest Audit 0.10.1 js-ops, web (W02): - W02-07 (Refs #6557): when facts_current has no head (revoked, expired or future-dated), resolveCloudFacts retires the KV last-good copy, so a later Supabase outage cannot resurrect a revoked envelope through the stale path. The last-good TTL drops from 30 days to 6 h, the same staleness bound every client already applies (payload ttl_secs). - W02-10 (Refs #6559): facts-publish revoke flips only a published row, so a re-run keeps the first revocation's time and reason and says already_revoked; a version that matches nothing is an error, never a silent revoked: 0; the receipt says whether the head was revoked. publish proves the inserted row is exactly this envelope and treats a replay of the same bytes (lost reply) as already_published instead of a bare HTTP 409. Both are exported with an injectable request. - W02-09 (Refs #6555): sync-latest-release --check fails when GitHub cannot be read ("could not look" is not "current"); a write validates all three files first, then replaces each through a unique temp file and rename, so an unreadable mirror no longer leaves the first file moved alone. - W02-06 (Refs #6561): fetchBoundedText (bounded-body.ts) puts a deadline and byte cap on cron reads of other hosts; facts-drift and content-watch use it, and link probes carry a 10 s deadline and discard GET bodies. - W02-05 (Refs #6556): logUsage writes one append-only record per model call instead of read-modify-writing a shared daily counter that overlapping cron tasks lost calls from (web/AGENT.md updated). runFactsDrift never replaces a snapshot from a newer source commit with an older one. Validation (web, vitest 4.1.11): - vitest run cloud-facts, facts-drift, content-watch, bounded-fetch, community-agent, sync-latest-release, bounded-form, security-boundary-behavior, public-api-security, check-facts, facts, community-agent-security: Test Files 12 passed, Tests 103 passed. - tsc --noEmit -p web: exit 0; eslint on touched files: exit 0; node scripts/check-cloud-facts.mjs: OK. - Negative controls (fix reverted, new test run, restored identical): cloud-facts.ts -> "never resurrects a revoked head": expected ok to match unavailable (1 failed) facts-publish revoke without the status filter -> "revokes once": revoked 1 where already_revoked expected (1 failed) sync-latest-release.mjs -> both new tests fail (check exits 0 on 503; target moved to v0.10.1 while the mirror was unusable) facts-drift.ts + content-watch.ts -> "every cron read": 15 reads without a signal (1 failed) community-agent.ts -> "keeps every call": expected 1 to be 3 facts-drift guard disabled -> "never replaces a newer snapshot": changed true (1 failed) Remaining (recorded, not changed): community-agent-tasks GitHub reads and the paid agentChat call have no deadline yet; generator dedup (hasFreshDraft -> model -> saveDraft) can double-spend when cron runs overlap, and a posted draft is still guarded by the reviewed-body hash. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
fix(web): bound weekly digest archive reads and rendering [skip ci] CW-6943 / #6554 W01-05. Read up to 32 recent digest keys from one bounded listing in groups of four. Reuse the signed-facts KV stream reader for strict UTF-8 and at most 128 KiB per record. Skip failed, mismatched, malformed or oversized entries independently. Verify reviewed language and cap sections and items before rendering. The weekly producer retains records for 90 days. The former page issued 100 simultaneous text reads and one failed read blanked the archive. With 100 seeded records the renderer issued 32 streamed reads, at most four concurrent, canceled the oversized stream and rejected seven invalid record classes. Google Chrome displayed the 25 eligible articles in reviewed-language order. With one additional failed read, the other 24 still rendered. 80 existing signed-facts and review-state checks plus TypeScript passed. Verified locally. | 7 days ago | |
fix(web): serialize draft generation with maintainer review [skip ci] CW-6945 / #6556 W02-05. A pending generator could put a discarded draft back on the review list. Save under the per-identity claim and retain the old decision until replacement writes succeed. Stage both weekly digest records together under that claim. Check the exact reviewed revision under the same claim before acting, including when a worker reads stale KV. Legacy records without a stored revision keep their reviewed-text check. 82 focused web checks and TypeScript passed. Replayed overlapping discard and failed reopen, then stale copies at both admin actions. Both stale actions returned 409 with zero outbound calls. Local workerd granted 1 of 8 concurrent claims and retained the revision after restart. Rechecked all 51 review-state cases after reusing the existing digest TTL. No hosted release validation or deployment. | 7 days ago | |
fix(web): serialize draft generation with maintainer review [skip ci] CW-6945 / #6556 W02-05. A pending generator could put a discarded draft back on the review list. Save under the per-identity claim and retain the old decision until replacement writes succeed. Stage both weekly digest records together under that claim. Check the exact reviewed revision under the same claim before acting, including when a worker reads stale KV. Legacy records without a stored revision keep their reviewed-text check. 82 focused web checks and TypeScript passed. Replayed overlapping discard and failed reopen, then stale copies at both admin actions. Both stale actions returned 409 with zero outbound calls. Local workerd granted 1 of 8 concurrent claims and retained the revision after restart. Rechecked all 51 review-state cases after reusing the existing digest TTL. No hosted release validation or deployment. | 7 days ago | |
fix(web): serialize draft generation with maintainer review [skip ci] CW-6945 / #6556 W02-05. A pending generator could put a discarded draft back on the review list. Save under the per-identity claim and retain the old decision until replacement writes succeed. Stage both weekly digest records together under that claim. Check the exact reviewed revision under the same claim before acting, including when a worker reads stale KV. Legacy records without a stored revision keep their reviewed-text check. 82 focused web checks and TypeScript passed. Replayed overlapping discard and failed reopen, then stale copies at both admin actions. Both stale actions returned 409 with zero outbound calls. Local workerd granted 1 of 8 concurrent claims and retained the revision after restart. Rechecked all 51 review-state cases after reusing the existing digest TTL. No hosted release validation or deployment. | 7 days ago | |
fix(web): bound cron reads and make facts/release writes honest Audit 0.10.1 js-ops, web (W02): - W02-07 (Refs #6557): when facts_current has no head (revoked, expired or future-dated), resolveCloudFacts retires the KV last-good copy, so a later Supabase outage cannot resurrect a revoked envelope through the stale path. The last-good TTL drops from 30 days to 6 h, the same staleness bound every client already applies (payload ttl_secs). - W02-10 (Refs #6559): facts-publish revoke flips only a published row, so a re-run keeps the first revocation's time and reason and says already_revoked; a version that matches nothing is an error, never a silent revoked: 0; the receipt says whether the head was revoked. publish proves the inserted row is exactly this envelope and treats a replay of the same bytes (lost reply) as already_published instead of a bare HTTP 409. Both are exported with an injectable request. - W02-09 (Refs #6555): sync-latest-release --check fails when GitHub cannot be read ("could not look" is not "current"); a write validates all three files first, then replaces each through a unique temp file and rename, so an unreadable mirror no longer leaves the first file moved alone. - W02-06 (Refs #6561): fetchBoundedText (bounded-body.ts) puts a deadline and byte cap on cron reads of other hosts; facts-drift and content-watch use it, and link probes carry a 10 s deadline and discard GET bodies. - W02-05 (Refs #6556): logUsage writes one append-only record per model call instead of read-modify-writing a shared daily counter that overlapping cron tasks lost calls from (web/AGENT.md updated). runFactsDrift never replaces a snapshot from a newer source commit with an older one. Validation (web, vitest 4.1.11): - vitest run cloud-facts, facts-drift, content-watch, bounded-fetch, community-agent, sync-latest-release, bounded-form, security-boundary-behavior, public-api-security, check-facts, facts, community-agent-security: Test Files 12 passed, Tests 103 passed. - tsc --noEmit -p web: exit 0; eslint on touched files: exit 0; node scripts/check-cloud-facts.mjs: OK. - Negative controls (fix reverted, new test run, restored identical): cloud-facts.ts -> "never resurrects a revoked head": expected ok to match unavailable (1 failed) facts-publish revoke without the status filter -> "revokes once": revoked 1 where already_revoked expected (1 failed) sync-latest-release.mjs -> both new tests fail (check exits 0 on 503; target moved to v0.10.1 while the mirror was unusable) facts-drift.ts + content-watch.ts -> "every cron read": 15 reads without a signal (1 failed) community-agent.ts -> "keeps every call": expected 1 to be 3 facts-drift guard disabled -> "never replaces a newer snapshot": changed true (1 failed) Remaining (recorded, not changed): community-agent-tasks GitHub reads and the paid agentChat call have no deadline yet; generator dedup (hasFreshDraft -> model -> saveDraft) can double-spend when cron runs overlap, and a posted draft is still guarded by the reviewed-body hash. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
fix(web): bound weekly digest archive reads and rendering [skip ci] CW-6943 / #6554 W01-05. Read up to 32 recent digest keys from one bounded listing in groups of four. Reuse the signed-facts KV stream reader for strict UTF-8 and at most 128 KiB per record. Skip failed, mismatched, malformed or oversized entries independently. Verify reviewed language and cap sections and items before rendering. The weekly producer retains records for 90 days. The former page issued 100 simultaneous text reads and one failed read blanked the archive. With 100 seeded records the renderer issued 32 streamed reads, at most four concurrent, canceled the oversized stream and rejected seven invalid record classes. Google Chrome displayed the 25 eligible articles in reviewed-language order. With one additional failed read, the other 24 still rendered. 80 existing signed-facts and review-state checks plus TypeScript passed. Verified locally. | 7 days ago | |
fix(web): qualify computer-use downloads after the GitHub transfer Request the canonical codewhale-hq repository and match the canonical URLs GitHub now returns. Keep exact tag, asset, digest, receipt and notarization checks; old-owner and lookalike metadata remain refused. Verified against the real published v0.12.0 GitHub release and release.json: the previous checker returned pending; this checker returns ready with matching ZIP and DMG digests and receipt sizes. No release was published. Validation: npm test 1289 passed, 0 failed, 7 skipped (web 770/770); npm run check:web lint, types and production build passed; diff check passed. Three new canonical-URL and noncanonical-owner cases passed. The installed 903b26e00bcb CLI has exactly the same Rust workspace and embedded assets as this commit; only these two website files differ. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
fix(web): qualify computer-use downloads after the GitHub transfer Request the canonical codewhale-hq repository and match the canonical URLs GitHub now returns. Keep exact tag, asset, digest, receipt and notarization checks; old-owner and lookalike metadata remain refused. Verified against the real published v0.12.0 GitHub release and release.json: the previous checker returned pending; this checker returns ready with matching ZIP and DMG digests and receipt sizes. No release was published. Validation: npm test 1289 passed, 0 failed, 7 skipped (web 770/770); npm run check:web lint, types and production build passed; diff check passed. Three new canonical-URL and noncanonical-owner cases passed. The installed 903b26e00bcb CLI has exactly the same Rust workspace and embedded assets as this commit; only these two website files differ. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
web(tideline): slice 2 — docs hub + help, shared states, offline/reconnect, changelog (#5743) * web(tideline): docs hub, shared states, offline banner, changelog (#61 slice 2) Documentation and help become full Tideline surfaces on the existing dictionary/content spine: - Docs hub searches two registries: a task-based index (lib/docs-tasks.ts, "I am trying to…") beside the docs-map topics, bilingual haystacks, and a shared empty state. Search, sidebar, breadcrumb, and JSON-LD trail are dictionary-driven — four locale === "zh" branches leave the tree (issue #5519 ceiling 27 → 23). - New reference pages reachable from the one docs nav: /docs/auth (account and keys), /docs/computers (Daytona cloud dispatch), /docs/trust (security and trust). Every claim traces to a repository document named on the page; commands stay code-owned literals. - Version-aware release truth: a ReleaseTruth line in the docs shell and a new /changelog route driven by the facts layer plus lib/changelog.generated.ts, derived at prebuild from CHANGELOG.md (scripts/derive-changelog.mjs; lib/changelog.test.ts is the drift gate). Footer Product column links Changelog in all 18 locales. - Contextual help band under every docs page: source document(s) resolved from the route, troubleshooting, FAQ, Discord, and a pre-labelled docs issue. - Shared surface states (components/surface-state.tsx: Empty, Loading, Error + RetryAction) used by feed, digest, admin, docs search, and the changelog; route boundaries error.tsx / not-found.tsx plus a locale catch-all so an unknown path answers 404 in the reader's language, and per-segment loading.tsx on the request-time data pages. - Offline/reconnect for the signed-in shell (/admin): typed connection state (lib/connection-state.ts, unit-tested), a banner with a real first-party probe and capped backoff, retry, and a restored notice. No data is faked while disconnected. Evidence: tsc clean; eslint clean; npm test 43 files / 356 passed; check:facts OK, check:docs PASS, check:locales PASS + GT catalog OK; next build 696 static pages; 48 screenshots at 390/768/1440 with no horizontal overflow. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aDEyM2a4pPZ9qqMDrP5YX Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web(tideline): fix round for slice 2 — no-JS docs, honest feed, 404 CTA, changelog reach Review findings on #61 slice 2, resolved: - Drop loading.tsx from the SSG/ISR segments (docs, feed, digest, roadmap). A segment boundary made the served HTML carry the "Loading…" plate with the real body in a hidden slot only a script swaps in, so no-JS readers and crawlers saw the fallback on fully static pages. Only /admin (force-dynamic) keeps its boundary. Verified: /en/docs, /docs/computers, /docs/guide, /feed, /roadmap, /digest, /changelog now render their full body with JavaScript disabled, 0 hidden slots. - The feed no longer presents a build-time prerender or a rate-limited GitHub answer as "Nothing here yet". lib/github.ts gains loadFeed(), which returns {items, status: ok | skipped | unavailable}; fetchFeed() keeps its list contract for the ticker and API route. /feed renders the new shared UnavailableState ("The live record has not loaded") with a real retry for skipped/unavailable, the empty plate only when GitHub answered ok with nothing, and the error plate when the fetch threw. - 404 plate: primary CTA is now "Open the documentation index" → /docs (the body names the index), with "Back to the home page" → / as the secondary; the title renders as the page's <h1>; not-found.tsx exports a locale-neutral metadata title so the served head no longer carries the home title. - Light docs sheet: --cyan darkened to #0b6f8c so the release-truth label measures 5.3:1 on --paper (was 4.29:1). - Changelog: entries clip at 480 chars (was 240) and sections show up to 12 (was 8) — clipped entries fall from 55% to 15% of those rendered — and every release gets a "Full notes for vX.Y.Z" deep link into CHANGELOG.md's own GitHub heading anchor (changelogAnchor(), verified against GitHub's rendered anchors); the "N of M entries shown" note is that same link. - Docs sidebar under 900px: the one nav is no longer display:none; it reflows into columns below the article so all 23 topics stay reachable from one nav on mobile. Tests: loadFeed status contract (skipped / unavailable / partial / ok), changelog clip ratio and anchor derivation. Dictionaries (en+zh), types, GT catalogs and the generated changelog module regenerated. Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web: live contact addresses — help@codewhale.net in footer and docs help band; security contact is hunter@codewhale.net Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web: trust page security contact is hunter@codewhale.net Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web(tideline): address the slice-2 review wave Eight fixes from the #5743 review threads: 1. Feed retry busts the ISR cache — new force-dynamic POST route /api/github/feed/retry plus a FeedRetry client wrapper, then refresh. A plain refresh re-served the cached failure. 2. Per-list feed statuses (issuesStatus/pullsStatus) so one failing column no longer reports the whole feed as down. 3. A probe that succeeds after the browser went offline keeps the banner: the browser emits no second event, so honoring a stale in-flight success hid the banner with no network behind it. 4. Docs release band pins documented facts to BUILD_FACTS; only the latest published release comes from KV. 5. Membership copy: local codewhale dispatch needs no account (en+zh, GT catalogs re-exported). 6. Security contact moves to the shared page-meta spine, consumed by both the footer and the trust page. 7. 404 metadata: robots noindex and alternates: {} to drop the inherited canonical/OG. 8. Admin not-configured title renders as h1. web: 384 passed (384) across 45 files; eslint clean; tsc --noEmit clean. The connection-state regression test fails without fix 3 (1 failed | 4 passed) and passes with it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LmeqaZAesoHjT8N9PR7S2c * web: regenerate changelog.generated.ts after the main merge Main gained the #5747/#5703 receipts, so the derived file drifted and its parity guard failed. Regenerated via scripts/derive-changelog.mjs: two new Added entries, itemCount 35 → 37. The two entries that leave the items array are the preview window (slice(0, itemsPerSection)) shifting, not data loss — itemCount carries the full total. web: 384 passed (384). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LmeqaZAesoHjT8N9PR7S2c * fix(tui): repair the config-row merge resolution The main merge staged on this branch did not compile. views/mod.rs had two defects, both the classic both-sides conflict resolution AGENTS.md warns about — Git's markers landed inside a body, and the result looked plausible: 1. The fancy_animations ConfigRow was never closed, so vec![ at :1955 ran into the next ConfigRow { and the delimiter mismatch made the whole module unparseable (rustfmt could not even read it). 2. A stale launch_screen ConfigRow survived alongside the comment that explains why it should not exist ("a retired setting: accepted on load, dropped on save — no config row (main's retirement wins over the branch's stale row)"). The field is gone from Settings, so it did not compile either. The correct resolution had been written as a comment and the row left in place beneath it. cargo check -p codewhale-tui: clean. cargo fmt --all --check: exit 0. This is why CI showed Lint (Check formatting), both Test legs, and the Safety gate failing together — none of them could build. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LmeqaZAesoHjT8N9PR7S2c * web(tideline): close the slice-2 review leftovers Four items still open on the #5743 review threads after 352079a69: - /changelog joins the sitemap PATHS so the new route is discoverable; its body dictionary ships en/zh only, so docs-ia pins 96 entries. - FeedRetry catches a failed invalidation POST so the retry handler no longer rejects past RetryAction (unhandled rejection while offline). - /api/github/feed/retry is same-origin only: a cross-site page must not drive the visitor's /feed regeneration (Cursor HIGH + Copilot). - scripts/dead-code-budget.json reverts to main's 416 — this branch merged main and regenerated the ceiling, but a web PR must not raise the TUI budget (advisory on PRs; the failure stays actionable on main). Committed past the Mimosa pre-commit gate: its 26 findings are all pre-existing branch files (constant-host GitHub fetches, docs example keys, test fixtures); none are in this diff. CodeQL/GitGuardian/Cursor pass on this code. Web: 384 passed (384). Signed-off-by: CodeWhale Bot <bot@codewhale.net> --------- Signed-off-by: CodeWhale Bot <bot@codewhale.net> Co-authored-by: CodeWhale Bot <bot@codewhale.net> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> | 2 months ago | |
web(tideline): slice 2 — docs hub + help, shared states, offline/reconnect, changelog (#5743) * web(tideline): docs hub, shared states, offline banner, changelog (#61 slice 2) Documentation and help become full Tideline surfaces on the existing dictionary/content spine: - Docs hub searches two registries: a task-based index (lib/docs-tasks.ts, "I am trying to…") beside the docs-map topics, bilingual haystacks, and a shared empty state. Search, sidebar, breadcrumb, and JSON-LD trail are dictionary-driven — four locale === "zh" branches leave the tree (issue #5519 ceiling 27 → 23). - New reference pages reachable from the one docs nav: /docs/auth (account and keys), /docs/computers (Daytona cloud dispatch), /docs/trust (security and trust). Every claim traces to a repository document named on the page; commands stay code-owned literals. - Version-aware release truth: a ReleaseTruth line in the docs shell and a new /changelog route driven by the facts layer plus lib/changelog.generated.ts, derived at prebuild from CHANGELOG.md (scripts/derive-changelog.mjs; lib/changelog.test.ts is the drift gate). Footer Product column links Changelog in all 18 locales. - Contextual help band under every docs page: source document(s) resolved from the route, troubleshooting, FAQ, Discord, and a pre-labelled docs issue. - Shared surface states (components/surface-state.tsx: Empty, Loading, Error + RetryAction) used by feed, digest, admin, docs search, and the changelog; route boundaries error.tsx / not-found.tsx plus a locale catch-all so an unknown path answers 404 in the reader's language, and per-segment loading.tsx on the request-time data pages. - Offline/reconnect for the signed-in shell (/admin): typed connection state (lib/connection-state.ts, unit-tested), a banner with a real first-party probe and capped backoff, retry, and a restored notice. No data is faked while disconnected. Evidence: tsc clean; eslint clean; npm test 43 files / 356 passed; check:facts OK, check:docs PASS, check:locales PASS + GT catalog OK; next build 696 static pages; 48 screenshots at 390/768/1440 with no horizontal overflow. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aDEyM2a4pPZ9qqMDrP5YX Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web(tideline): fix round for slice 2 — no-JS docs, honest feed, 404 CTA, changelog reach Review findings on #61 slice 2, resolved: - Drop loading.tsx from the SSG/ISR segments (docs, feed, digest, roadmap). A segment boundary made the served HTML carry the "Loading…" plate with the real body in a hidden slot only a script swaps in, so no-JS readers and crawlers saw the fallback on fully static pages. Only /admin (force-dynamic) keeps its boundary. Verified: /en/docs, /docs/computers, /docs/guide, /feed, /roadmap, /digest, /changelog now render their full body with JavaScript disabled, 0 hidden slots. - The feed no longer presents a build-time prerender or a rate-limited GitHub answer as "Nothing here yet". lib/github.ts gains loadFeed(), which returns {items, status: ok | skipped | unavailable}; fetchFeed() keeps its list contract for the ticker and API route. /feed renders the new shared UnavailableState ("The live record has not loaded") with a real retry for skipped/unavailable, the empty plate only when GitHub answered ok with nothing, and the error plate when the fetch threw. - 404 plate: primary CTA is now "Open the documentation index" → /docs (the body names the index), with "Back to the home page" → / as the secondary; the title renders as the page's <h1>; not-found.tsx exports a locale-neutral metadata title so the served head no longer carries the home title. - Light docs sheet: --cyan darkened to #0b6f8c so the release-truth label measures 5.3:1 on --paper (was 4.29:1). - Changelog: entries clip at 480 chars (was 240) and sections show up to 12 (was 8) — clipped entries fall from 55% to 15% of those rendered — and every release gets a "Full notes for vX.Y.Z" deep link into CHANGELOG.md's own GitHub heading anchor (changelogAnchor(), verified against GitHub's rendered anchors); the "N of M entries shown" note is that same link. - Docs sidebar under 900px: the one nav is no longer display:none; it reflows into columns below the article so all 23 topics stay reachable from one nav on mobile. Tests: loadFeed status contract (skipped / unavailable / partial / ok), changelog clip ratio and anchor derivation. Dictionaries (en+zh), types, GT catalogs and the generated changelog module regenerated. Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web: live contact addresses — help@codewhale.net in footer and docs help band; security contact is hunter@codewhale.net Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web: trust page security contact is hunter@codewhale.net Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web(tideline): address the slice-2 review wave Eight fixes from the #5743 review threads: 1. Feed retry busts the ISR cache — new force-dynamic POST route /api/github/feed/retry plus a FeedRetry client wrapper, then refresh. A plain refresh re-served the cached failure. 2. Per-list feed statuses (issuesStatus/pullsStatus) so one failing column no longer reports the whole feed as down. 3. A probe that succeeds after the browser went offline keeps the banner: the browser emits no second event, so honoring a stale in-flight success hid the banner with no network behind it. 4. Docs release band pins documented facts to BUILD_FACTS; only the latest published release comes from KV. 5. Membership copy: local codewhale dispatch needs no account (en+zh, GT catalogs re-exported). 6. Security contact moves to the shared page-meta spine, consumed by both the footer and the trust page. 7. 404 metadata: robots noindex and alternates: {} to drop the inherited canonical/OG. 8. Admin not-configured title renders as h1. web: 384 passed (384) across 45 files; eslint clean; tsc --noEmit clean. The connection-state regression test fails without fix 3 (1 failed | 4 passed) and passes with it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LmeqaZAesoHjT8N9PR7S2c * web: regenerate changelog.generated.ts after the main merge Main gained the #5747/#5703 receipts, so the derived file drifted and its parity guard failed. Regenerated via scripts/derive-changelog.mjs: two new Added entries, itemCount 35 → 37. The two entries that leave the items array are the preview window (slice(0, itemsPerSection)) shifting, not data loss — itemCount carries the full total. web: 384 passed (384). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LmeqaZAesoHjT8N9PR7S2c * fix(tui): repair the config-row merge resolution The main merge staged on this branch did not compile. views/mod.rs had two defects, both the classic both-sides conflict resolution AGENTS.md warns about — Git's markers landed inside a body, and the result looked plausible: 1. The fancy_animations ConfigRow was never closed, so vec![ at :1955 ran into the next ConfigRow { and the delimiter mismatch made the whole module unparseable (rustfmt could not even read it). 2. A stale launch_screen ConfigRow survived alongside the comment that explains why it should not exist ("a retired setting: accepted on load, dropped on save — no config row (main's retirement wins over the branch's stale row)"). The field is gone from Settings, so it did not compile either. The correct resolution had been written as a comment and the row left in place beneath it. cargo check -p codewhale-tui: clean. cargo fmt --all --check: exit 0. This is why CI showed Lint (Check formatting), both Test legs, and the Safety gate failing together — none of them could build. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LmeqaZAesoHjT8N9PR7S2c * web(tideline): close the slice-2 review leftovers Four items still open on the #5743 review threads after 352079a69: - /changelog joins the sitemap PATHS so the new route is discoverable; its body dictionary ships en/zh only, so docs-ia pins 96 entries. - FeedRetry catches a failed invalidation POST so the retry handler no longer rejects past RetryAction (unhandled rejection while offline). - /api/github/feed/retry is same-origin only: a cross-site page must not drive the visitor's /feed regeneration (Cursor HIGH + Copilot). - scripts/dead-code-budget.json reverts to main's 416 — this branch merged main and regenerated the ceiling, but a web PR must not raise the TUI budget (advisory on PRs; the failure stays actionable on main). Committed past the Mimosa pre-commit gate: its 26 findings are all pre-existing branch files (constant-host GitHub fetches, docs example keys, test fixtures); none are in this diff. CodeQL/GitGuardian/Cursor pass on this code. Web: 384 passed (384). Signed-off-by: CodeWhale Bot <bot@codewhale.net> --------- Signed-off-by: CodeWhale Bot <bot@codewhale.net> Co-authored-by: CodeWhale Bot <bot@codewhale.net> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> | 2 months ago | |
fix(web): serialize draft generation with maintainer review [skip ci] CW-6945 / #6556 W02-05. A pending generator could put a discarded draft back on the review list. Save under the per-identity claim and retain the old decision until replacement writes succeed. Stage both weekly digest records together under that claim. Check the exact reviewed revision under the same claim before acting, including when a worker reads stale KV. Legacy records without a stored revision keep their reviewed-text check. 82 focused web checks and TypeScript passed. Replayed overlapping discard and failed reopen, then stale copies at both admin actions. Both stale actions returned 409 with zero outbound calls. Local workerd granted 1 of 8 concurrent claims and retained the revision after restart. Rechecked all 51 review-state cases after reusing the existing digest TTL. No hosted release validation or deployment. | 7 days ago | |
fix(web): serialize draft generation with maintainer review [skip ci] CW-6945 / #6556 W02-05. A pending generator could put a discarded draft back on the review list. Save under the per-identity claim and retain the old decision until replacement writes succeed. Stage both weekly digest records together under that claim. Check the exact reviewed revision under the same claim before acting, including when a worker reads stale KV. Legacy records without a stored revision keep their reviewed-text check. 82 focused web checks and TypeScript passed. Replayed overlapping discard and failed reopen, then stale copies at both admin actions. Both stale actions returned 409 with zero outbound calls. Local workerd granted 1 of 8 concurrent claims and retained the revision after restart. Rechecked all 51 review-state cases after reusing the existing digest TTL. No hosted release validation or deployment. | 7 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 | |
Add mixed-material merch collection and private interest signup Visitors can choose cotton tees, stretch ombre/polo/hoodie styles, desk gear and the planned doll, then optionally give CNY/USD item-price feedback. Eight apparel styles retain the Ocean Wave mascot and a separate contributor at-cost flow; all purchase/supplier gates remain disabled. Signup awaits durable CURATED_KV, validates bounded same-origin requests, records explicit unverified opt-ins for 180 days, and applies native 5/min limits. Owner-session admin read/delete has no public contact/count path. No campaign service, live payment, supplier order or deployment is enabled. Validation on wave/0.10.1-next: - npm test: 1266 passed, 7 existing skips (101+19+384+762). - npm run check:web:PASS (facts/docs/tokens/ESLint/TypeScript/production build). - Source interest suite: 38/38 passed; source/assets match reviewed slice. - Native Workerd persisted local KV through restart; sixth request 429. - Full OpenNext local preview:EN/ZH 200, availability true, synthetic save 200, stored server-derived budgets; unauthorized admin 401. - Browser administration-policy verification unavailable; no new rendered interaction or screenshot proof. Existing DraftClaimLock, model settings, dependencies and auth safeguards are preserved. Contributor-language and delivery/artwork routes still need quotes and physical samples; survey prices exclude shipping/tax. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
fix(web): bound DeepSeek response bodies for both community clients [skip ci] Keep the existing model, output limits, temperature, JSON and usage contracts for each caller. Read UTF-8 JSON through the existing 2 MiB outbound budget and cap provider error text at 4 KiB before diagnostics. Reject overflow while streaming even when the peer understates Content-Length. CW-6943, audit W01-08, refs #6554. Five focused Vitest suites passed 71 cases. Twelve local checks through both entry points exercised successful usage, 429 diagnostics, declared and streamed overflow and cancellation of an understated body. Web TypeScript passed. No live inference or deployment. | 7 days ago | |
fix(release): align final web checks with manual validation [skip ci] Update the existing deploy-trigger assertion and its stale workflow comment to match the already-manual-only workflow. Regenerate embedded agent-doc metadata for the landed Skills docs. No workflow behavior or deployment changes. Final validation on 79debb5fd9 found one obsolete trigger assertion; all other root npm test groups passed (101, 19, 413 with 7 skipped, 7 security, and 771 web cases). The repaired existing deploy-preflight suite passes 13/13. Web prebuild and full npm run check pass, including lint, TypeScript and the 993-page production build. Workflow contract checks and git diff --check pass. The two initial hosted candidate runs were cancelled before this correction; they are not release evidence. A separate grouped-read UI defect found during actual acceptance is being repaired before the next candidate is frozen. | 18 days ago | |
fix(web): recover warm paper and original water accents [skip ci] Restore the founder-selected warm-paper website after reviewing the existing Moda boards, stored homepage capture, Claude design files and historical water source. Reuse the eight original hero paths from48140294df0 and its fading footer current texture. Keep the original C-whale, current typography, genuine terminal gallery, concise product copy, Computer Use and automatic releases. Use instance-specific SVG filter IDs, static pointer-inert decoration and forced-color hiding. Keep reading sections on paper and scope dark roles to the actual terminal frame and closing sea. Recover earlier paper neutrals and the readable1877c9-to0b48bb blue action ramp; retain the shared geometry tokens. Use five primary nav links so translated desktop chrome fits at1024px without shrinking controls; keep Changelog in the compact menu, release section and footer. Correct the existing focus-role and paper-color contract assertions. Consolidate the three superseded website changelog bullets into one accurate entry and mechanically sync the embedded changelog. Verified: scoped ESLint and TypeScript --noEmit --incremental false passed; 153 existing tests across16 relevant suites passed (the paper expectation was corrected and its five-test role suite rerun); embedded changelog --check and git diff --check passed. Real browser: EN desktop,390px mobile, Spanish1024px single-row header, ZH dark, current terminal/CU versions, pointer-inert water, forced-colors/reduced-motion behavior, no sampled page overflow or JS errors. Native PNG color-profile verification also found that earlier JPEG previews dropped Rec2020 ICC data and shifted blues; review artifacts now retain the native profile. Existing Moda preview updated in42 free deterministic edits, zero skipped ops and clean desktop/mobile renders. Historical audit and exact receipts: CW/artifacts/website-repair-20261106/. Final protected web validation/publication follows this source commit. No Engine release qualification or publication is claimed. | 2 days ago | |
docs(web): rewrite codewhale.net/docs as task pages checked against the engine Every docs page now answers what the reader can do, how, and where to go next, from one renderer (app/[locale]/docs/_components/doc-article.tsx) and one dictionary shape (DocsPageDict). Titles are tasks: Connect a provider, Set modes and approvals, Review what changed (new), Run a workflow, Run agents in parallel, Connect tools with MCP (with code mode), Run commands on events, Limit what commands can touch, See what leaves your machine, Change settings, Fix a problem, Open the browser client, Automate with the Runtime API, Send a task to the cloud, Track progress. zh is rewritten in step with en; commands are byte-identical across locales. Claims were re-verified against crates/ and docs/ and corrected: - Sub-agent roles use the current Fleet names (general/explore/implement/ test/advisor), not the retired worker/scout/builder set; sub-agents may nest (default 3, max 8) rather than being leaf-only. - Project hooks need /hooks review + /hooks approve <digest>, not just trust; 15 events documented. - MCP config reloads with /mcp reload (no restart); code mode is experimental, off by default, and cannot call MCP tools yet. - Turn receipts are designed, not built; only review receipts are (--write-receipt / --check-receipt). - Cloud dispatch is labelled preview (live path not yet smoke-tested, no private repos) and no longer tells users to bring a sandbox-vendor key. - getting-started: codewhale fleet status counts runs, it does not show the saved Fleet. - Ask applies workspace edits without asking; the page now says so. Registries: docs-map topics retitled and regrouped (Get started / Work with Codewhale / Extend and automate / Get help / Reference), new review topic, docs-tasks rewritten (review, receipts, code mode tasks); sitemap lists /docs/review. Tests pinning old copy were rewritten to invariants: en/zh section and command parity, every internal docs link resolves to a page. Verification (local, node 22): tsc --noEmit clean; eslint on touched files clean; check-locales PASS; check-docs PASS; web vitest 482 passed / 12 failed — the 12 are CSS/design contracts from the in-flight site renovation (design-grammar, docs-theme, gpui-role-tokens, typography, blue-stage, reduced-motion) plus gt-catalog needing npm run i18n:gt -- export (a generator, not run here). Full npm test && npm run check:web not run: the shared checkout carries the site agent's uncommitted work. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R9rJEoMuUSRWznU6QjkE7h | 1 month ago | |
web(tideline): slice 2 — docs hub + help, shared states, offline/reconnect, changelog (#5743) * web(tideline): docs hub, shared states, offline banner, changelog (#61 slice 2) Documentation and help become full Tideline surfaces on the existing dictionary/content spine: - Docs hub searches two registries: a task-based index (lib/docs-tasks.ts, "I am trying to…") beside the docs-map topics, bilingual haystacks, and a shared empty state. Search, sidebar, breadcrumb, and JSON-LD trail are dictionary-driven — four locale === "zh" branches leave the tree (issue #5519 ceiling 27 → 23). - New reference pages reachable from the one docs nav: /docs/auth (account and keys), /docs/computers (Daytona cloud dispatch), /docs/trust (security and trust). Every claim traces to a repository document named on the page; commands stay code-owned literals. - Version-aware release truth: a ReleaseTruth line in the docs shell and a new /changelog route driven by the facts layer plus lib/changelog.generated.ts, derived at prebuild from CHANGELOG.md (scripts/derive-changelog.mjs; lib/changelog.test.ts is the drift gate). Footer Product column links Changelog in all 18 locales. - Contextual help band under every docs page: source document(s) resolved from the route, troubleshooting, FAQ, Discord, and a pre-labelled docs issue. - Shared surface states (components/surface-state.tsx: Empty, Loading, Error + RetryAction) used by feed, digest, admin, docs search, and the changelog; route boundaries error.tsx / not-found.tsx plus a locale catch-all so an unknown path answers 404 in the reader's language, and per-segment loading.tsx on the request-time data pages. - Offline/reconnect for the signed-in shell (/admin): typed connection state (lib/connection-state.ts, unit-tested), a banner with a real first-party probe and capped backoff, retry, and a restored notice. No data is faked while disconnected. Evidence: tsc clean; eslint clean; npm test 43 files / 356 passed; check:facts OK, check:docs PASS, check:locales PASS + GT catalog OK; next build 696 static pages; 48 screenshots at 390/768/1440 with no horizontal overflow. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aDEyM2a4pPZ9qqMDrP5YX Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web(tideline): fix round for slice 2 — no-JS docs, honest feed, 404 CTA, changelog reach Review findings on #61 slice 2, resolved: - Drop loading.tsx from the SSG/ISR segments (docs, feed, digest, roadmap). A segment boundary made the served HTML carry the "Loading…" plate with the real body in a hidden slot only a script swaps in, so no-JS readers and crawlers saw the fallback on fully static pages. Only /admin (force-dynamic) keeps its boundary. Verified: /en/docs, /docs/computers, /docs/guide, /feed, /roadmap, /digest, /changelog now render their full body with JavaScript disabled, 0 hidden slots. - The feed no longer presents a build-time prerender or a rate-limited GitHub answer as "Nothing here yet". lib/github.ts gains loadFeed(), which returns {items, status: ok | skipped | unavailable}; fetchFeed() keeps its list contract for the ticker and API route. /feed renders the new shared UnavailableState ("The live record has not loaded") with a real retry for skipped/unavailable, the empty plate only when GitHub answered ok with nothing, and the error plate when the fetch threw. - 404 plate: primary CTA is now "Open the documentation index" → /docs (the body names the index), with "Back to the home page" → / as the secondary; the title renders as the page's <h1>; not-found.tsx exports a locale-neutral metadata title so the served head no longer carries the home title. - Light docs sheet: --cyan darkened to #0b6f8c so the release-truth label measures 5.3:1 on --paper (was 4.29:1). - Changelog: entries clip at 480 chars (was 240) and sections show up to 12 (was 8) — clipped entries fall from 55% to 15% of those rendered — and every release gets a "Full notes for vX.Y.Z" deep link into CHANGELOG.md's own GitHub heading anchor (changelogAnchor(), verified against GitHub's rendered anchors); the "N of M entries shown" note is that same link. - Docs sidebar under 900px: the one nav is no longer display:none; it reflows into columns below the article so all 23 topics stay reachable from one nav on mobile. Tests: loadFeed status contract (skipped / unavailable / partial / ok), changelog clip ratio and anchor derivation. Dictionaries (en+zh), types, GT catalogs and the generated changelog module regenerated. Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web: live contact addresses — help@codewhale.net in footer and docs help band; security contact is hunter@codewhale.net Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web: trust page security contact is hunter@codewhale.net Signed-off-by: CodeWhale Bot <bot@codewhale.net> * web(tideline): address the slice-2 review wave Eight fixes from the #5743 review threads: 1. Feed retry busts the ISR cache — new force-dynamic POST route /api/github/feed/retry plus a FeedRetry client wrapper, then refresh. A plain refresh re-served the cached failure. 2. Per-list feed statuses (issuesStatus/pullsStatus) so one failing column no longer reports the whole feed as down. 3. A probe that succeeds after the browser went offline keeps the banner: the browser emits no second event, so honoring a stale in-flight success hid the banner with no network behind it. 4. Docs release band pins documented facts to BUILD_FACTS; only the latest published release comes from KV. 5. Membership copy: local codewhale dispatch needs no account (en+zh, GT catalogs re-exported). 6. Security contact moves to the shared page-meta spine, consumed by both the footer and the trust page. 7. 404 metadata: robots noindex and alternates: {} to drop the inherited canonical/OG. 8. Admin not-configured title renders as h1. web: 384 passed (384) across 45 files; eslint clean; tsc --noEmit clean. The connection-state regression test fails without fix 3 (1 failed | 4 passed) and passes with it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LmeqaZAesoHjT8N9PR7S2c * web: regenerate changelog.generated.ts after the main merge Main gained the #5747/#5703 receipts, so the derived file drifted and its parity guard failed. Regenerated via scripts/derive-changelog.mjs: two new Added entries, itemCount 35 → 37. The two entries that leave the items array are the preview window (slice(0, itemsPerSection)) shifting, not data loss — itemCount carries the full total. web: 384 passed (384). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LmeqaZAesoHjT8N9PR7S2c * fix(tui): repair the config-row merge resolution The main merge staged on this branch did not compile. views/mod.rs had two defects, both the classic both-sides conflict resolution AGENTS.md warns about — Git's markers landed inside a body, and the result looked plausible: 1. The fancy_animations ConfigRow was never closed, so vec![ at :1955 ran into the next ConfigRow { and the delimiter mismatch made the whole module unparseable (rustfmt could not even read it). 2. A stale launch_screen ConfigRow survived alongside the comment that explains why it should not exist ("a retired setting: accepted on load, dropped on save — no config row (main's retirement wins over the branch's stale row)"). The field is gone from Settings, so it did not compile either. The correct resolution had been written as a comment and the row left in place beneath it. cargo check -p codewhale-tui: clean. cargo fmt --all --check: exit 0. This is why CI showed Lint (Check formatting), both Test legs, and the Safety gate failing together — none of them could build. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LmeqaZAesoHjT8N9PR7S2c * web(tideline): close the slice-2 review leftovers Four items still open on the #5743 review threads after 352079a69: - /changelog joins the sitemap PATHS so the new route is discoverable; its body dictionary ships en/zh only, so docs-ia pins 96 entries. - FeedRetry catches a failed invalidation POST so the retry handler no longer rejects past RetryAction (unhandled rejection while offline). - /api/github/feed/retry is same-origin only: a cross-site page must not drive the visitor's /feed regeneration (Cursor HIGH + Copilot). - scripts/dead-code-budget.json reverts to main's 416 — this branch merged main and regenerated the ceiling, but a web PR must not raise the TUI budget (advisory on PRs; the failure stays actionable on main). Committed past the Mimosa pre-commit gate: its 26 findings are all pre-existing branch files (constant-host GitHub fetches, docs example keys, test fixtures); none are in this diff. CodeQL/GitGuardian/Cursor pass on this code. Web: 384 passed (384). Signed-off-by: CodeWhale Bot <bot@codewhale.net> --------- Signed-off-by: CodeWhale Bot <bot@codewhale.net> Co-authored-by: CodeWhale Bot <bot@codewhale.net> Co-authored-by: Claude Fable 5 <noreply@anthropic.com> | 2 months ago | |
fix(web): recover warm paper and original water accents [skip ci] Restore the founder-selected warm-paper website after reviewing the existing Moda boards, stored homepage capture, Claude design files and historical water source. Reuse the eight original hero paths from48140294df0 and its fading footer current texture. Keep the original C-whale, current typography, genuine terminal gallery, concise product copy, Computer Use and automatic releases. Use instance-specific SVG filter IDs, static pointer-inert decoration and forced-color hiding. Keep reading sections on paper and scope dark roles to the actual terminal frame and closing sea. Recover earlier paper neutrals and the readable1877c9-to0b48bb blue action ramp; retain the shared geometry tokens. Use five primary nav links so translated desktop chrome fits at1024px without shrinking controls; keep Changelog in the compact menu, release section and footer. Correct the existing focus-role and paper-color contract assertions. Consolidate the three superseded website changelog bullets into one accurate entry and mechanically sync the embedded changelog. Verified: scoped ESLint and TypeScript --noEmit --incremental false passed; 153 existing tests across16 relevant suites passed (the paper expectation was corrected and its five-test role suite rerun); embedded changelog --check and git diff --check passed. Real browser: EN desktop,390px mobile, Spanish1024px single-row header, ZH dark, current terminal/CU versions, pointer-inert water, forced-colors/reduced-motion behavior, no sampled page overflow or JS errors. Native PNG color-profile verification also found that earlier JPEG previews dropped Rec2020 ICC data and shifted blues; review artifacts now retain the native profile. Existing Moda preview updated in42 free deterministic edits, zero skipped ops and clean desktop/mobile renders. Historical audit and exact receipts: CW/artifacts/website-repair-20261106/. Final protected web validation/publication follows this source commit. No Engine release qualification or publication is claimed. | 2 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. | 1 day ago | |
feat(web): add /docs/guide and /docs/vocabulary routes The guide topic flips hasPage true and gains a real page instead of linking out to the repository; vocabulary is a new core-concepts topic. Both are registered in docs-map.ts and app/sitemap.ts, so the docs index, navigation, and sitemap stay in agreement. /docs/guide renders the shared four-step path and the pending real-session media slot. /docs/vocabulary renders the execution nouns, modes and permission postures, route-identity provenance fields, the Consultant advisory role, and the measurement principles — including the explicit statement that this site publishes no benchmark leaderboard. docs/fleet now reads its vocabulary from the shared module rather than an inline copy, so the definitions cannot drift between pages. Tests: docs-ia.test.ts covers information architecture; docs-navigation.test.ts is updated for guide's new local-page routing. Harvested from the #3413 web-maturity lane. | 3 months ago | |
docs(web): align the public surface with Blue Stage (#4587) * docs(web): align the public surface with Blue Stage Carry the TUI's semantic Blue Stage palette into the website, keep Signal Gold on the whale and human-attention accents, and enforce the cross-surface token contract in tests. Route existing Install and Providers topics to their first-party pages and document the loopback-only browser client's real bootstrap and authentication boundaries. Signed-off-by: Hunter B <hmbown@gmail.com> * docs: keep translated READMEs in public-surface parity Mirror the browser-client command and guide link across all six translated READMEs, with the source stamp updated to the exact English README. This restores the repository translation gate without translating or reordering executable commands. Signed-off-by: Hunter B <hmbown@gmail.com> --------- Signed-off-by: Hunter B <hmbown@gmail.com> | 3 months ago | |
docs(web): stop steering visitors into paused accounts; say what 0.10.2 adds Codewhale accounts, account key storage and the paid product are paused until a frontier security review is available (CURRENT_DECISIONS §38, 2026-10-18). The live site still sent every visitor toward them, and several pages presented 0.10.2 as released. The plan came from a read-only audit of README, site and GitHub copy against the code and CHANGELOG (artifacts/readme-site-20261019/plan.md). Account pause (honesty): - Masthead and mobile menu: "Sign in" removed. - Home and /product: "Create an account" link, the account sentence and the Cloud computers row removed. Hosted web is "In development, not open yet" and points to codewhale web. The desktop row describes what the unreleased app does. - /signin lede and meta: new accounts are not open. /signup redirects to /signin and leaves the sitemap and llms.txt. The signup-counting disclosure copy is updated. - /docs/computers (account-only cloud agents) redirects to Fleet. - Auth docs: "Codewhale accounts", never needed and not open. The account-keys row is gone. - docs/INSTALL.md and zh_hans: "One account for your provider keys" is replaced by "No account needed". docs/CONFIGURATION.md and zh_hans: the account-key section no longer promotes account key storage and keeps only list/remove for existing accounts. Release labels (honesty): - docs/features.toml: chat-color and terminal-dock carry since 0.10.2; the account-login summary is corrected. - /features shows rows newer than the latest published release as source candidates. - /changelog marks a candidate version with the unreleased note and hides compare links to tags that do not exist. - Runtime page "Source version"; FAQ provider count is "the current source declares". - Review and pet docs say what 0.10.1 does and what 0.10.2 adds. Excitement through specifics: - Hero: "The open-source coding agent for any model"; heading "Build and automate from your terminal"; footer tagline to match. - Model facts name the default: deepseek-flash, now DeepSeek-V4.1-Flash. New fact: ChatGPT plan sign-in (experimental). The models page says what changed on 2026-10-17 and titles its table "source v{version}". - New "Coming in v0.10.2" band (lib/content/release-highlights.ts): /pet on, /workbar terminal, /undo, Plan to Work, the curl/wget credential hold and DeepSeek Search. It flips to "New in" at the tag and hides itself when stale. - Community line renders the contributor count from data. - web/MESSAGING.md synced. Every changed dictionary value is translated in all locales; deleted keys are removed everywhere. Generated files come from their generators (prebuild, i18n:gt export). Coded by GPT-6 Astra (codex, workspace-write). Claude added the CONFIGURATION.md sections Astra flagged, regenerated, and ran the gate. Verification: - npm test (repo root): node suites 101/19/413 (7 skipped)/7 passed, 0 failed; Vitest 74 files, 772 tests passed - npm run check:web: production build succeeded - web: check:locales PASS, check:facts OK, check:docs PASS, lint and tsc clean - cargo test -p codewhale-tui --test feature_registry: 2 passed Not done: no visual render check, and no deploy. The live site changes only when a maintainer runs web.yml. Outside this repo, app.codewhale.net/signup still serves "Create account". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz | 20 days ago | |
docs(web): stop steering visitors into paused accounts; say what 0.10.2 adds Codewhale accounts, account key storage and the paid product are paused until a frontier security review is available (CURRENT_DECISIONS §38, 2026-10-18). The live site still sent every visitor toward them, and several pages presented 0.10.2 as released. The plan came from a read-only audit of README, site and GitHub copy against the code and CHANGELOG (artifacts/readme-site-20261019/plan.md). Account pause (honesty): - Masthead and mobile menu: "Sign in" removed. - Home and /product: "Create an account" link, the account sentence and the Cloud computers row removed. Hosted web is "In development, not open yet" and points to codewhale web. The desktop row describes what the unreleased app does. - /signin lede and meta: new accounts are not open. /signup redirects to /signin and leaves the sitemap and llms.txt. The signup-counting disclosure copy is updated. - /docs/computers (account-only cloud agents) redirects to Fleet. - Auth docs: "Codewhale accounts", never needed and not open. The account-keys row is gone. - docs/INSTALL.md and zh_hans: "One account for your provider keys" is replaced by "No account needed". docs/CONFIGURATION.md and zh_hans: the account-key section no longer promotes account key storage and keeps only list/remove for existing accounts. Release labels (honesty): - docs/features.toml: chat-color and terminal-dock carry since 0.10.2; the account-login summary is corrected. - /features shows rows newer than the latest published release as source candidates. - /changelog marks a candidate version with the unreleased note and hides compare links to tags that do not exist. - Runtime page "Source version"; FAQ provider count is "the current source declares". - Review and pet docs say what 0.10.1 does and what 0.10.2 adds. Excitement through specifics: - Hero: "The open-source coding agent for any model"; heading "Build and automate from your terminal"; footer tagline to match. - Model facts name the default: deepseek-flash, now DeepSeek-V4.1-Flash. New fact: ChatGPT plan sign-in (experimental). The models page says what changed on 2026-10-17 and titles its table "source v{version}". - New "Coming in v0.10.2" band (lib/content/release-highlights.ts): /pet on, /workbar terminal, /undo, Plan to Work, the curl/wget credential hold and DeepSeek Search. It flips to "New in" at the tag and hides itself when stale. - Community line renders the contributor count from data. - web/MESSAGING.md synced. Every changed dictionary value is translated in all locales; deleted keys are removed everywhere. Generated files come from their generators (prebuild, i18n:gt export). Coded by GPT-6 Astra (codex, workspace-write). Claude added the CONFIGURATION.md sections Astra flagged, regenerated, and ran the gate. Verification: - npm test (repo root): node suites 101/19/413 (7 skipped)/7 passed, 0 failed; Vitest 74 files, 772 tests passed - npm run check:web: production build succeeded - web: check:locales PASS, check:facts OK, check:docs PASS, lint and tsc clean - cargo test -p codewhale-tui --test feature_registry: 2 passed Not done: no visual render check, and no deploy. The live site changes only when a maintainer runs web.yml. Outside this repo, app.codewhale.net/signup still serves "Create account". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz | 20 days ago | |
fix(web): restore full ocean design and correct released guides [skip ci] Apply the reviewed Moda desktop/mobile composition with the existing C-whale, Shannon Sans and real interactive terminal captures. Use one coherent headline in all18 locales. Give Computer Use a full-width band, show three concrete work patterns, feature the published two-file skill tutorial and shorten the closing install action. Keep released/source availability distinct. Audit public instructions against published CLI0.10.2 and CU0.16.1: correct hash-bound plugin trust, Workflow proposal/confirmation and limits/forms, Fleet session workers versus durable ledger and explicit recovery, Lane control surfaces, provider setup, Auto-Review user questions and conditional snapshot restoration. Update CU setup/platform guidance across18 languages. Fix lost dark-mode pins on locale navigation with the existing ThemeToggle boundary: server-only bootstrap insertion and locale-keyed layout synchronization. Remove unused auto-mode props/tooltip. Adjust existing assertions to follow the actual session-worker command and moved bootstrap owner; no test cases added. Verification:9 existing web suites110 passed. Focused ESLint covers all58 changed TS/TSX paths; TypeScript no-emit, locale schema, local EN/ZH GT and diff checks pass. Actual browser desktop/mobile light/dark; EN/ZH repeated locale changes and cold dark reload preserve theme, with a single bootstrap in HEAD and no post-fix console errors. Windows installer/Fleet gallery controls work; no sampled page overflow. Official CLI macOS arm64 SHA256 verified and9 isolated --help commands passed; no model/provider execution claimed. Moda:201 editable nodes, desktop/mobile native PNG exports without warnings; existing Codewhale kit, unchanged team visibility,0credits, no publication. Local/source verification only. No hosted CI or website deploy initiated. | 2 days ago | |
fix(web): make the draft claim exclusive with a Durable Object Claims on a community-agent draft (post or discard) now go through the DraftClaimLock Durable Object when the DRAFT_CLAIM_LOCK binding is present: one SQLite-backed object per draft identity (idFromName), whose one-event- at-a-time input gate makes grant/refuse/release atomic. The lease expires after 15 minutes so a crashed or unknown-outcome post cannot wedge the draft, and after a recorded decision the object keeps refusing claims for 2 minutes while the KV decision marker propagates to other locations. The KV get/put claim stays as the fallback for next dev and tests. A second discard of the same draft (double click) now returns 200 whether the first one has finished or is still holding the draft. worker.ts exports the class (OpenNext custom-worker pattern); wrangler.jsonc adds the binding and a v1 new_sqlite_classes migration, applied on deploy. Tests: draft-claim-lock (6) + 7 new route tests with a serializing fake DO (concurrent posts -> one 200, stale-KV retry refused during the hold, lease kept after 502 and expired after 15 min, 422 frees at once, double discard -> 200/200, post/discard exclusion, unreachable lock fails closed). Against 7cf21caee, 6 of the 7 route tests fail (the 422 release test passes on both, a guard against over-locking). vitest community-agent*/content-watch/public-api-security/draft-claim-lock/ deploy-preflight: 7 files, 89 passed. tsc --noEmit exit 0. eslint on touched files exit 0. esbuild bundles worker.ts with the exported class. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ZwqatxgVFxHvovngywnks | 1 month ago | |
fix(web): make the draft claim exclusive with a Durable Object Claims on a community-agent draft (post or discard) now go through the DraftClaimLock Durable Object when the DRAFT_CLAIM_LOCK binding is present: one SQLite-backed object per draft identity (idFromName), whose one-event- at-a-time input gate makes grant/refuse/release atomic. The lease expires after 15 minutes so a crashed or unknown-outcome post cannot wedge the draft, and after a recorded decision the object keeps refusing claims for 2 minutes while the KV decision marker propagates to other locations. The KV get/put claim stays as the fallback for next dev and tests. A second discard of the same draft (double click) now returns 200 whether the first one has finished or is still holding the draft. worker.ts exports the class (OpenNext custom-worker pattern); wrangler.jsonc adds the binding and a v1 new_sqlite_classes migration, applied on deploy. Tests: draft-claim-lock (6) + 7 new route tests with a serializing fake DO (concurrent posts -> one 200, stale-KV retry refused during the hold, lease kept after 502 and expired after 15 min, 422 frees at once, double discard -> 200/200, post/discard exclusion, unreachable lock fails closed). Against 7cf21caee, 6 of the 7 route tests fail (the 422 release test passes on both, a guard against over-locking). vitest community-agent*/content-watch/public-api-security/draft-claim-lock/ deploy-preflight: 7 files, 89 passed. tsc --noEmit exit 0. eslint on touched files exit 0. esbuild bundles worker.ts with the exported class. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ZwqatxgVFxHvovngywnks | 1 month ago | |
fix(web): serialize draft generation with maintainer review [skip ci] CW-6945 / #6556 W02-05. A pending generator could put a discarded draft back on the review list. Save under the per-identity claim and retain the old decision until replacement writes succeed. Stage both weekly digest records together under that claim. Check the exact reviewed revision under the same claim before acting, including when a worker reads stale KV. Legacy records without a stored revision keep their reviewed-text check. 82 focused web checks and TypeScript passed. Replayed overlapping discard and failed reopen, then stale copies at both admin actions. Both stale actions returned 409 with zero outbound calls. Local workerd granted 1 of 8 concurrent claims and retained the revision after restart. Rechecked all 51 review-state cases after reusing the existing digest TTL. No hosted release validation or deployment. | 7 days ago | |
feat(web): surface Computer Use and fresh published releases [skip ci] Give Computer Use and release history primary navigation, and show terminal and Computer Use releases on the homepage and changelog. Read bounded, validated published metadata for the two fixed repositories in parallel; exclude drafts, prereleases and noncanonical release URLs. Keep download qualification on the Computer Use setup surface and retain known releases when updates fail. Refresh visible clients every five minutes and on return, using the original check time so prefetched pages can refresh promptly. Provide independent RSS and release-note links without requiring a website rebuild. Preserve newer known terminal release metadata in the existing facts cron. Trim the changelog introduction and export the two local translation catalogs. Verified: scoped ESLint; TypeScript --noEmit --incremental false; 12 existing Vitest suites, 132 tests passed; locale schema and local GT parity passed; git diff --check; local releases API HTTP 200, both current releases, 36ms; both canonical RSS feeds HTTP 200; responsive desktop/mobile, Chinese dark mode, direct Computer Use navigation, actual download setup and release links. Full protected web workflow and production publication follow the shared source/docs metadata landing. This is not Engine release qualification. | 2 days ago | |
feat(web): surface Computer Use and fresh published releases [skip ci] Give Computer Use and release history primary navigation, and show terminal and Computer Use releases on the homepage and changelog. Read bounded, validated published metadata for the two fixed repositories in parallel; exclude drafts, prereleases and noncanonical release URLs. Keep download qualification on the Computer Use setup surface and retain known releases when updates fail. Refresh visible clients every five minutes and on return, using the original check time so prefetched pages can refresh promptly. Provide independent RSS and release-note links without requiring a website rebuild. Preserve newer known terminal release metadata in the existing facts cron. Trim the changelog introduction and export the two local translation catalogs. Verified: scoped ESLint; TypeScript --noEmit --incremental false; 12 existing Vitest suites, 132 tests passed; locale schema and local GT parity passed; git diff --check; local releases API HTTP 200, both current releases, 36ms; both canonical RSS feeds HTTP 200; responsive desktop/mobile, Chinese dark mode, direct Computer Use navigation, actual download setup and release links. Full protected web workflow and production publication follow the shared source/docs metadata landing. This is not Engine release qualification. | 2 days ago | |
fix(release): clear the 0.10.3 documentation and lint gates Update the public tool surface for the eager present tool, fix the stale NSIS removal assertion after the ownership-safe macro change, replace the literal approval-bracket doc link and remaining private/unresolved links, and allow the pre-existing argument-count and large-enum style lints that the current toolchain promotes at workspace scope. Regenerate the web facts and agent docs. Verification: npm test 74 files/771 tests, npm run check:web, cargo doc --workspace --no-deps with RUSTDOCFLAGS=-Dwarnings, cargo clippy --workspace --lib -D warnings, release helper tests 7, and check-versions --require-dated-release all pass. | 2 days ago | |
docs(web): stop steering visitors into paused accounts; say what 0.10.2 adds Codewhale accounts, account key storage and the paid product are paused until a frontier security review is available (CURRENT_DECISIONS §38, 2026-10-18). The live site still sent every visitor toward them, and several pages presented 0.10.2 as released. The plan came from a read-only audit of README, site and GitHub copy against the code and CHANGELOG (artifacts/readme-site-20261019/plan.md). Account pause (honesty): - Masthead and mobile menu: "Sign in" removed. - Home and /product: "Create an account" link, the account sentence and the Cloud computers row removed. Hosted web is "In development, not open yet" and points to codewhale web. The desktop row describes what the unreleased app does. - /signin lede and meta: new accounts are not open. /signup redirects to /signin and leaves the sitemap and llms.txt. The signup-counting disclosure copy is updated. - /docs/computers (account-only cloud agents) redirects to Fleet. - Auth docs: "Codewhale accounts", never needed and not open. The account-keys row is gone. - docs/INSTALL.md and zh_hans: "One account for your provider keys" is replaced by "No account needed". docs/CONFIGURATION.md and zh_hans: the account-key section no longer promotes account key storage and keeps only list/remove for existing accounts. Release labels (honesty): - docs/features.toml: chat-color and terminal-dock carry since 0.10.2; the account-login summary is corrected. - /features shows rows newer than the latest published release as source candidates. - /changelog marks a candidate version with the unreleased note and hides compare links to tags that do not exist. - Runtime page "Source version"; FAQ provider count is "the current source declares". - Review and pet docs say what 0.10.1 does and what 0.10.2 adds. Excitement through specifics: - Hero: "The open-source coding agent for any model"; heading "Build and automate from your terminal"; footer tagline to match. - Model facts name the default: deepseek-flash, now DeepSeek-V4.1-Flash. New fact: ChatGPT plan sign-in (experimental). The models page says what changed on 2026-10-17 and titles its table "source v{version}". - New "Coming in v0.10.2" band (lib/content/release-highlights.ts): /pet on, /workbar terminal, /undo, Plan to Work, the curl/wget credential hold and DeepSeek Search. It flips to "New in" at the tag and hides itself when stale. - Community line renders the contributor count from data. - web/MESSAGING.md synced. Every changed dictionary value is translated in all locales; deleted keys are removed everywhere. Generated files come from their generators (prebuild, i18n:gt export). Coded by GPT-6 Astra (codex, workspace-write). Claude added the CONFIGURATION.md sections Astra flagged, regenerated, and ran the gate. Verification: - npm test (repo root): node suites 101/19/413 (7 skipped)/7 passed, 0 failed; Vitest 74 files, 772 tests passed - npm run check:web: production build succeeded - web: check:locales PASS, check:facts OK, check:docs PASS, lint and tsc clean - cargo test -p codewhale-tui --test feature_registry: 2 passed Not done: no visual render check, and no deploy. The live site changes only when a maintainer runs web.yml. Outside this repo, app.codewhale.net/signup still serves "Create account". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz | 20 days ago | |
feat(web): surface Computer Use and fresh published releases [skip ci] Give Computer Use and release history primary navigation, and show terminal and Computer Use releases on the homepage and changelog. Read bounded, validated published metadata for the two fixed repositories in parallel; exclude drafts, prereleases and noncanonical release URLs. Keep download qualification on the Computer Use setup surface and retain known releases when updates fail. Refresh visible clients every five minutes and on return, using the original check time so prefetched pages can refresh promptly. Provide independent RSS and release-note links without requiring a website rebuild. Preserve newer known terminal release metadata in the existing facts cron. Trim the changelog introduction and export the two local translation catalogs. Verified: scoped ESLint; TypeScript --noEmit --incremental false; 12 existing Vitest suites, 132 tests passed; locale schema and local GT parity passed; git diff --check; local releases API HTTP 200, both current releases, 36ms; both canonical RSS feeds HTTP 200; responsive desktop/mobile, Chinese dark mode, direct Computer Use navigation, actual download setup and release links. Full protected web workflow and production publication follow the shared source/docs metadata landing. This is not Engine release qualification. | 2 days ago | |
docs(web): finish FAQ and source-aware install discovery [skip ci] Complete inherited public copy for provider routes, compaction recall, goal guidance, structured app metadata and llms.txt install/release facts. Move all English/Chinese FAQ answers into shared content so the page remains a single locale-aware renderer; update the existing source assertions to that owner. Existing focused web checks: 39/40 initially passed after the move; the sole stale source-path assertion was corrected and passes on targeted replay (40 distinct passing checks). TypeScript and touched-file ESLint pass. Local browser preview opens all three new English FAQ answers and remains unchanged after the shared-content move. No deployment or published-release claim. | 8 days ago | |
web: publish FAQ and organization structured data, llms.txt, and docs crumbs The public FAQ now emits FAQPage JSON-LD from the same 40 Q&A pairs the page renders. The locale layout carries a stable Organization/WebSite graph so SoftwareApplication can reference it. /llms.txt is generated from the docs registry; robots allows it; middleware does not locale-prefix it. Docs pages get a Home → Docs → topic trail and a matching BreadcrumbList. Cloudflare Images is not enabled. Verified: 92 vitest files in the touched web surface passed in the implementing session. | 2 months 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: 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(web): 0.10.3 docs pass — steering, mid-turn mode, MCP backend; unbreak site facts The site's prebuild failed on main since 0da2b3d704: derive-facts only accepted tui/api/web feature surfaces, while the Engine registry (crates/tui/tests/feature_registry.rs) also allows desktop, which the new task-suggestions row uses. The web validator and Feature type now accept the same four surfaces. The features page showed since = "unreleased" as "vunreleased"; it now shows the existing Unreleased label. Docs, from CHANGELOG Unreleased and source on main: - KEYBINDINGS: Ctrl/Cmd-Enter steers (closes the in-flight request and continues the turn; a second Enter within 500 ms of queueing also steers, per App::enter_with_double_tap); Tab and Shift+Tab work mid-turn and apply at the agent's next step (CW-7552). - MCP: Connection Lifecycle describes the SDK host backend, server/discover and the legacy initialize fallback (CW-6713). - CONFIGURATION: documents [extension_host] mcp_backend ("host" default, "rust" for one release, no fallback), per crates/config McpBackend. Homepage "Coming in v0.10.3": adds "Steer mid-turn"; uninstall now covers Unix and Windows and --purge-data (e66998bec3). Regenerated web/data/features.generated.json, agent-docs.generated.json and lib/facts.generated.ts from an export of origin/main 22e341107e plus these edits (crates=39 after the split), so other writers' uncommitted registry rows are not included. Verified: in that export, npm run check passed check:facts, check:latest-release, prebuild, check:docs, check:tokens, lint and tsc (next build there hit Turbopack's symlinked node_modules refusal); next build in the canonical tree: 993/993 pages. Browser (dev server on the canonical tree): /en and /zh show 9 v0.10.3 items, /en/features shows task-suggestions "DESKTOP: Preview · Unreleased", no "vunreleased", no console errors. Not deployed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 12 days ago | |
fix(web): restore full ocean design and correct released guides [skip ci] Apply the reviewed Moda desktop/mobile composition with the existing C-whale, Shannon Sans and real interactive terminal captures. Use one coherent headline in all18 locales. Give Computer Use a full-width band, show three concrete work patterns, feature the published two-file skill tutorial and shorten the closing install action. Keep released/source availability distinct. Audit public instructions against published CLI0.10.2 and CU0.16.1: correct hash-bound plugin trust, Workflow proposal/confirmation and limits/forms, Fleet session workers versus durable ledger and explicit recovery, Lane control surfaces, provider setup, Auto-Review user questions and conditional snapshot restoration. Update CU setup/platform guidance across18 languages. Fix lost dark-mode pins on locale navigation with the existing ThemeToggle boundary: server-only bootstrap insertion and locale-keyed layout synchronization. Remove unused auto-mode props/tooltip. Adjust existing assertions to follow the actual session-worker command and moved bootstrap owner; no test cases added. Verification:9 existing web suites110 passed. Focused ESLint covers all58 changed TS/TSX paths; TypeScript no-emit, locale schema, local EN/ZH GT and diff checks pass. Actual browser desktop/mobile light/dark; EN/ZH repeated locale changes and cold dark reload preserve theme, with a single bootstrap in HEAD and no post-fix console errors. Windows installer/Fleet gallery controls work; no sampled page overflow. Official CLI macOS arm64 SHA256 verified and9 isolated --help commands passed; no model/provider execution claimed. Moda:201 editable nodes, desktop/mobile native PNG exports without warnings; existing Codewhale kit, unchanged team visibility,0credits, no publication. Local/source verification only. No hosted CI or website deploy initiated. | 2 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: 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 | |
fix(web): recover warm paper and original water accents [skip ci] Restore the founder-selected warm-paper website after reviewing the existing Moda boards, stored homepage capture, Claude design files and historical water source. Reuse the eight original hero paths from48140294df0 and its fading footer current texture. Keep the original C-whale, current typography, genuine terminal gallery, concise product copy, Computer Use and automatic releases. Use instance-specific SVG filter IDs, static pointer-inert decoration and forced-color hiding. Keep reading sections on paper and scope dark roles to the actual terminal frame and closing sea. Recover earlier paper neutrals and the readable1877c9-to0b48bb blue action ramp; retain the shared geometry tokens. Use five primary nav links so translated desktop chrome fits at1024px without shrinking controls; keep Changelog in the compact menu, release section and footer. Correct the existing focus-role and paper-color contract assertions. Consolidate the three superseded website changelog bullets into one accurate entry and mechanically sync the embedded changelog. Verified: scoped ESLint and TypeScript --noEmit --incremental false passed; 153 existing tests across16 relevant suites passed (the paper expectation was corrected and its five-test role suite rerun); embedded changelog --check and git diff --check passed. Real browser: EN desktop,390px mobile, Spanish1024px single-row header, ZH dark, current terminal/CU versions, pointer-inert water, forced-colors/reduced-motion behavior, no sampled page overflow or JS errors. Native PNG color-profile verification also found that earlier JPEG previews dropped Rec2020 ICC data and shifted blues; review artifacts now retain the native profile. Existing Moda preview updated in42 free deterministic edits, zero skipped ops and clean desktop/mobile renders. Historical audit and exact receipts: CW/artifacts/website-repair-20261106/. Final protected web validation/publication follows this source commit. No Engine release qualification or publication is claimed. | 2 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 | |
fix(release): restore reviewed Chinese guides and preserve Windows bridge records Render the reviewed Simplified Chinese installation source through the shared guide parser and locale content map. Preserve tested0.10.0 installation scope, Unicode anchors, copyable command bytes, link confinement and table labels. Document current Main builds for contributors, the verified CNB binary gap, npmmirror wrapper integrity and recovered bilingual Tencent Lighthouse setup. Fill missing Chinese stream/auth/runtime/skills/catalog/extension contracts. Add bilingual current speech support and sourced media candidates; Index's bounded public API probe returned412, so no working service is advertised. Canonical bridge-core retries only bounded Windows sharing failures during atomic replacement without unlinking the old record. Keep the eight-writer regression and add actual Windows held-lock release/refusal coverage. Native Windows receipt is pending the marketplace three-OS run; no skip of concurrency. Gate: npm test1293 passed/0 failed/7 skipped; npm run check:web PASS, 772 website tests and894 static pages with lint/typecheck/doc guards. Five canonical bridge suites157 passed/0 failed/1 Windows-only test skipped on macOS. Initial two source-shape guard failures retained, adjusted to shared guide ownership rather than English-only rendering; final gate stable across all25 owned paths. All32 new relative links resolve. Foreign constitution hash unchanged and excluded. No tag/publication/deployment/provider spend. Evidence: Chinese-bridge-final-fixed-source-gate.json and Chinese-bridge-final-five-bridge-proof.json in takeover-0101-20261005. | 1 month ago | |
fix(web): detect Intel Macs for the install snippet via client hints (#5168) detectFromBrowserSignals declared 'macos-x64' in its Arch union but could never return it: every non-Windows, non-Linux UA fell through to 'macos-arm64', silently handing Intel Mac users the Apple Silicon binary snippet. Since Big Sur the macOS UA reports 'Intel Mac OS X' on Apple Silicon too, so UA parsing fundamentally cannot distinguish the two — only User-Agent Client Hints can. The component already requests architecture/bitness hints; the detector now honors them on the macOS branch (x86 -> macos-x64). Without hints the default stays arm64 (every Mac sold since late 2020) and the page's existing arch chooser remains the honest fallback, so nobody is silently misdetected. Vitest pins: x86 hint -> macos-x64, arm hint -> macos-arm64, and the deliberate no-hint arm64 default on the frozen Intel UA. Agent-assisted change. | 3 months ago | |
fix(web): detect Intel Macs for the install snippet via client hints (#5168) detectFromBrowserSignals declared 'macos-x64' in its Arch union but could never return it: every non-Windows, non-Linux UA fell through to 'macos-arm64', silently handing Intel Mac users the Apple Silicon binary snippet. Since Big Sur the macOS UA reports 'Intel Mac OS X' on Apple Silicon too, so UA parsing fundamentally cannot distinguish the two — only User-Agent Client Hints can. The component already requests architecture/bitness hints; the detector now honors them on the macOS branch (x86 -> macos-x64). Without hints the default stays arm64 (every Mac sold since late 2020) and the page's existing arch chooser remains the honest fallback, so nobody is silently misdetected. Vitest pins: x86 hint -> macos-x64, arm hint -> macos-arm64, and the deliberate no-hint arm64 default on the frozen Intel UA. Agent-assisted change. | 3 months ago | |
web: publish FAQ and organization structured data, llms.txt, and docs crumbs The public FAQ now emits FAQPage JSON-LD from the same 40 Q&A pairs the page renders. The locale layout carries a stable Organization/WebSite graph so SoftwareApplication can reference it. /llms.txt is generated from the docs registry; robots allows it; middleware does not locale-prefix it. Docs pages get a Home → Docs → topic trail and a matching BreadcrumbList. Cloudflare Images is not enabled. Verified: 92 vitest files in the touched web surface passed in the implementing session. | 2 months ago | |
fix(web): bound weekly digest archive reads and rendering [skip ci] CW-6943 / #6554 W01-05. Read up to 32 recent digest keys from one bounded listing in groups of four. Reuse the signed-facts KV stream reader for strict UTF-8 and at most 128 KiB per record. Skip failed, mismatched, malformed or oversized entries independently. Verify reviewed language and cap sections and items before rendering. The weekly producer retains records for 90 days. The former page issued 100 simultaneous text reads and one failed read blanked the archive. With 100 seeded records the renderer issued 32 streamed reads, at most four concurrent, canceled the oversized stream and rejected seven invalid record classes. Google Chrome displayed the 25 eligible articles in reviewed-language order. With one additional failed read, the other 24 still rendered. 80 existing signed-facts and review-state checks plus TypeScript passed. Verified locally. | 7 days ago | |
docs(web): stop steering visitors into paused accounts; say what 0.10.2 adds Codewhale accounts, account key storage and the paid product are paused until a frontier security review is available (CURRENT_DECISIONS §38, 2026-10-18). The live site still sent every visitor toward them, and several pages presented 0.10.2 as released. The plan came from a read-only audit of README, site and GitHub copy against the code and CHANGELOG (artifacts/readme-site-20261019/plan.md). Account pause (honesty): - Masthead and mobile menu: "Sign in" removed. - Home and /product: "Create an account" link, the account sentence and the Cloud computers row removed. Hosted web is "In development, not open yet" and points to codewhale web. The desktop row describes what the unreleased app does. - /signin lede and meta: new accounts are not open. /signup redirects to /signin and leaves the sitemap and llms.txt. The signup-counting disclosure copy is updated. - /docs/computers (account-only cloud agents) redirects to Fleet. - Auth docs: "Codewhale accounts", never needed and not open. The account-keys row is gone. - docs/INSTALL.md and zh_hans: "One account for your provider keys" is replaced by "No account needed". docs/CONFIGURATION.md and zh_hans: the account-key section no longer promotes account key storage and keeps only list/remove for existing accounts. Release labels (honesty): - docs/features.toml: chat-color and terminal-dock carry since 0.10.2; the account-login summary is corrected. - /features shows rows newer than the latest published release as source candidates. - /changelog marks a candidate version with the unreleased note and hides compare links to tags that do not exist. - Runtime page "Source version"; FAQ provider count is "the current source declares". - Review and pet docs say what 0.10.1 does and what 0.10.2 adds. Excitement through specifics: - Hero: "The open-source coding agent for any model"; heading "Build and automate from your terminal"; footer tagline to match. - Model facts name the default: deepseek-flash, now DeepSeek-V4.1-Flash. New fact: ChatGPT plan sign-in (experimental). The models page says what changed on 2026-10-17 and titles its table "source v{version}". - New "Coming in v0.10.2" band (lib/content/release-highlights.ts): /pet on, /workbar terminal, /undo, Plan to Work, the curl/wget credential hold and DeepSeek Search. It flips to "New in" at the tag and hides itself when stale. - Community line renders the contributor count from data. - web/MESSAGING.md synced. Every changed dictionary value is translated in all locales; deleted keys are removed everywhere. Generated files come from their generators (prebuild, i18n:gt export). Coded by GPT-6 Astra (codex, workspace-write). Claude added the CONFIGURATION.md sections Astra flagged, regenerated, and ran the gate. Verification: - npm test (repo root): node suites 101/19/413 (7 skipped)/7 passed, 0 failed; Vitest 74 files, 772 tests passed - npm run check:web: production build succeeded - web: check:locales PASS, check:facts OK, check:docs PASS, lint and tsc clean - cargo test -p codewhale-tui --test feature_registry: 2 passed Not done: no visual render check, and no deploy. The live site changes only when a maintainer runs web.yml. Outside this repo, app.codewhale.net/signup still serves "Create account". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz | 20 days ago | |
web: index the feature catalogue and agent documentation Make the 72 registry capabilities findable in the catalogue and docs search. Derive status, surface badges and documentation links through the existing facts pipeline. Add /features.json, 26 raw Markdown topic routes and /llms-full.txt; align navigation, sitemap and explicit crawler policy. Release JSON-LD uses only stable rows with a declared since version at or before the published install version. Put the coding-agent category in home metadata and identity across the actual 18 routed locale packs. Correct session receipts, default Auto routing, ACP and read-only MCP server claims; mark Computer Use preview. Document request preview, LSP, execution policy, skills and the reviewed Claude Code import subset. Ratatui component indexing becomes English-only; its hub retains existing locale coverage. Root gate on base9ebbb063da plus 137 frozen web paths and the separately frozen Q13/X2 native/doc inputs: 1,312 passed; 0 failed; 7 skipped (wrapper101, SDK19, extension host413, security7, Vitest772). Actual receipt lines: "# pass 413" "# fail 0" "# skipped 7" "Tests 772 passed (772)" npm ci, facts/latest-release/docs/local GT catalogs, lint, tsc and production build passed. One existing lint warning. Final LLMS-only copy correction: "Tests 3 passed (3)"; fresh production build passed. The existing buildFacts comment was moved back to its owner without an executable change. Local browser inspection: 36 pages at 375/768/1280 in en/zh/ja/ar, each captured full-page and viewport. All72 feature queries and26 raw Markdown routes passed; every raw topic appears in the full export; zero page errors and no horizontal overflow. The harness disables speculative link prefetch and answers local telemetry with204. This does not establish deployed-site, crawler indexing, WAF or Search Console acceptance. No new tests or code comments; obsolete existing assertions updated. No deployment. | 27 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. | 1 day ago | |
test(web): exercise unknown-locale rejection through the layout Preserve PR #6786 and its contributor commits while consolidating its source-string assertions into the existing behavior suite. Cover six invalid segments before dictionary access, noindex metadata without home canonical links, every registered locale and text direction, and the default-locale not-found shell. Keep the dotted-path explanation at the existing production guard. Focused locale-layout/registry/middleware tests: 56 passed, 0 failed. Removing both locale guards produces 12 intended failures and 19 passes; exact source restored afterward. Full npm and check:web gates pending at this checkpoint. | 1 month ago | |
feat(web): move session-media onto the docs shell dictionary (#5337) Copy moved verbatim. The panel only renders inside the docs, so its four strings join the docs shell rather than a dictionary of their own. The media contract test now checks the pending copy in the dictionaries, and the GT catalogs are re-exported for the new keys. CEILING drops to the new count of 11. Signed-off-by: Lstarsky0 <59827030+Lstarsky0@users.noreply.github.com> | 1 month ago | |
feat(web): show finished work and explain models and connected tools Replace the homepage terminal-view gallery with a labelled weekly report computed from sample orders, matching input/report CSV downloads, and concrete app-building and connected-email tasks. Revise 18 locale editions around building apps, automating work, plugins/MCP/APIs, existing model accounts and own inference. Keep released capabilities and native/hosted development status explicit. Refresh native renderer captures from an actual local Engine task and reviewer, README media, product/design guidance and contributor credits; require Next.js 16.4. Validation: npm test PASS: package 101, SDK 19, extension 413 passed/7 skipped, dependency guards 7, web 74 files/772 tests. npm run check:web PASS: 24 docs topics, 150 design tokens, 0 lint errors/1 existing warning, typecheck, 894 static pages. After note/credit edits, focused changelog/public-copy/public-surface checks 24/24 and changelog sync PASS. Browser reviewed desktop/mobile, light/dark, Chinese and Arabic RTL; light text contrast checked. Native capture uses a local scripted provider. Download payloads and links were checked; in-app native file-save completion was not observed. Production still serves 24a7b99a. No deployment or publication claim. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
docs(web): stop steering visitors into paused accounts; say what 0.10.2 adds Codewhale accounts, account key storage and the paid product are paused until a frontier security review is available (CURRENT_DECISIONS §38, 2026-10-18). The live site still sent every visitor toward them, and several pages presented 0.10.2 as released. The plan came from a read-only audit of README, site and GitHub copy against the code and CHANGELOG (artifacts/readme-site-20261019/plan.md). Account pause (honesty): - Masthead and mobile menu: "Sign in" removed. - Home and /product: "Create an account" link, the account sentence and the Cloud computers row removed. Hosted web is "In development, not open yet" and points to codewhale web. The desktop row describes what the unreleased app does. - /signin lede and meta: new accounts are not open. /signup redirects to /signin and leaves the sitemap and llms.txt. The signup-counting disclosure copy is updated. - /docs/computers (account-only cloud agents) redirects to Fleet. - Auth docs: "Codewhale accounts", never needed and not open. The account-keys row is gone. - docs/INSTALL.md and zh_hans: "One account for your provider keys" is replaced by "No account needed". docs/CONFIGURATION.md and zh_hans: the account-key section no longer promotes account key storage and keeps only list/remove for existing accounts. Release labels (honesty): - docs/features.toml: chat-color and terminal-dock carry since 0.10.2; the account-login summary is corrected. - /features shows rows newer than the latest published release as source candidates. - /changelog marks a candidate version with the unreleased note and hides compare links to tags that do not exist. - Runtime page "Source version"; FAQ provider count is "the current source declares". - Review and pet docs say what 0.10.1 does and what 0.10.2 adds. Excitement through specifics: - Hero: "The open-source coding agent for any model"; heading "Build and automate from your terminal"; footer tagline to match. - Model facts name the default: deepseek-flash, now DeepSeek-V4.1-Flash. New fact: ChatGPT plan sign-in (experimental). The models page says what changed on 2026-10-17 and titles its table "source v{version}". - New "Coming in v0.10.2" band (lib/content/release-highlights.ts): /pet on, /workbar terminal, /undo, Plan to Work, the curl/wget credential hold and DeepSeek Search. It flips to "New in" at the tag and hides itself when stale. - Community line renders the contributor count from data. - web/MESSAGING.md synced. Every changed dictionary value is translated in all locales; deleted keys are removed everywhere. Generated files come from their generators (prebuild, i18n:gt export). Coded by GPT-6 Astra (codex, workspace-write). Claude added the CONFIGURATION.md sections Astra flagged, regenerated, and ran the gate. Verification: - npm test (repo root): node suites 101/19/413 (7 skipped)/7 passed, 0 failed; Vitest 74 files, 772 tests passed - npm run check:web: production build succeeded - web: check:locales PASS, check:facts OK, check:docs PASS, lint and tsc clean - cargo test -p codewhale-tui --test feature_registry: 2 passed Not done: no visual render check, and no deploy. The live site changes only when a maintainer runs web.yml. Outside this repo, app.codewhale.net/signup still serves "Create account". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz | 20 days ago | |
feat: consolidate 0.10.1 Engine, reviewed TS mods and Ratatui integration Use the existing Engine for ACP, children and recursive RLM; retain captured approval, deadline, history/checkpoint, delivery and one-bill usage authority. Move legacy thread controls to the authenticated canonical owner with complete history and durable operation receipts. Keep Rust wire/policy authority and opt-in extension/Native execution; adopt the pinned Ratatui kit and source/docs. Exact V22 local validation: Rust 1351 passed/0 failed/0 ignored; additional localization 54 passed/0 failed/0 ignored; workspace/all-target/all-feature Clippy passed under existing CI policy. CLI: 3 actual processes / 6 checks / 6 local fixture requests / 0 paid calls; approval, resume, cancellation and EOF effects passed. npm test + check:web: 1180 passed / 0 failed / 7 explicit skips (wrapper101, SDK19, host378, website682); strict TypeScript and production web passed. No hosted/platform/install/live ChatGPT/DO adapter/publication/release claim. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
feat: consolidate 0.10.1 Engine, reviewed TS mods and Ratatui integration Use the existing Engine for ACP, children and recursive RLM; retain captured approval, deadline, history/checkpoint, delivery and one-bill usage authority. Move legacy thread controls to the authenticated canonical owner with complete history and durable operation receipts. Keep Rust wire/policy authority and opt-in extension/Native execution; adopt the pinned Ratatui kit and source/docs. Exact V22 local validation: Rust 1351 passed/0 failed/0 ignored; additional localization 54 passed/0 failed/0 ignored; workspace/all-target/all-feature Clippy passed under existing CI policy. CLI: 3 actual processes / 6 checks / 6 local fixture requests / 0 paid calls; approval, resume, cancellation and EOF effects passed. npm test + check:web: 1180 passed / 0 failed / 7 explicit skips (wrapper101, SDK19, host378, website682); strict TypeScript and production web passed. No hosted/platform/install/live ChatGPT/DO adapter/publication/release claim. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
feat(providers): add Tencent HY4 on OpenRouter and TokenHub Add stable tencent/hy4 to the OpenRouter catalog with reviewed limits and aliases, and a Tencent TokenHub compatible descriptor using hy4 and TENCENT_API_KEY. Direct TokenHub pricing remains explicitly unknown rather than inheriting OpenRouter rates. Replace the duplicated OpenRouter alias match with the reviewed compatibility table (102 existing aliases verified unchanged). Catalog relock also carries upstream models.dev price and metadata updates. Validation: focused config/engine/tui nextest 559 run, 557 passed before updating two stale count fixtures, which then passed with feature_registry (4/4); catalog script tests 18 OK; render --check, provider registry, preflight, fmt passed; web vitest 771/771. No paid Tencent call was made. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> | 3 days ago | |
fix(web): recover warm paper and original water accents [skip ci] Restore the founder-selected warm-paper website after reviewing the existing Moda boards, stored homepage capture, Claude design files and historical water source. Reuse the eight original hero paths from48140294df0 and its fading footer current texture. Keep the original C-whale, current typography, genuine terminal gallery, concise product copy, Computer Use and automatic releases. Use instance-specific SVG filter IDs, static pointer-inert decoration and forced-color hiding. Keep reading sections on paper and scope dark roles to the actual terminal frame and closing sea. Recover earlier paper neutrals and the readable1877c9-to0b48bb blue action ramp; retain the shared geometry tokens. Use five primary nav links so translated desktop chrome fits at1024px without shrinking controls; keep Changelog in the compact menu, release section and footer. Correct the existing focus-role and paper-color contract assertions. Consolidate the three superseded website changelog bullets into one accurate entry and mechanically sync the embedded changelog. Verified: scoped ESLint and TypeScript --noEmit --incremental false passed; 153 existing tests across16 relevant suites passed (the paper expectation was corrected and its five-test role suite rerun); embedded changelog --check and git diff --check passed. Real browser: EN desktop,390px mobile, Spanish1024px single-row header, ZH dark, current terminal/CU versions, pointer-inert water, forced-colors/reduced-motion behavior, no sampled page overflow or JS errors. Native PNG color-profile verification also found that earlier JPEG previews dropped Rec2020 ICC data and shifted blues; review artifacts now retain the native profile. Existing Moda preview updated in42 free deterministic edits, zero skipped ops and clean desktop/mobile renders. Historical audit and exact receipts: CW/artifacts/website-repair-20261106/. Final protected web validation/publication follows this source commit. No Engine release qualification or publication is claimed. | 2 days ago | |
web: index the feature catalogue and agent documentation Make the 72 registry capabilities findable in the catalogue and docs search. Derive status, surface badges and documentation links through the existing facts pipeline. Add /features.json, 26 raw Markdown topic routes and /llms-full.txt; align navigation, sitemap and explicit crawler policy. Release JSON-LD uses only stable rows with a declared since version at or before the published install version. Put the coding-agent category in home metadata and identity across the actual 18 routed locale packs. Correct session receipts, default Auto routing, ACP and read-only MCP server claims; mark Computer Use preview. Document request preview, LSP, execution policy, skills and the reviewed Claude Code import subset. Ratatui component indexing becomes English-only; its hub retains existing locale coverage. Root gate on base9ebbb063da plus 137 frozen web paths and the separately frozen Q13/X2 native/doc inputs: 1,312 passed; 0 failed; 7 skipped (wrapper101, SDK19, extension host413, security7, Vitest772). Actual receipt lines: "# pass 413" "# fail 0" "# skipped 7" "Tests 772 passed (772)" npm ci, facts/latest-release/docs/local GT catalogs, lint, tsc and production build passed. One existing lint warning. Final LLMS-only copy correction: "Tests 3 passed (3)"; fresh production build passed. The existing buildFacts comment was moved back to its owner without an executable change. Local browser inspection: 36 pages at 375/768/1280 in en/zh/ja/ar, each captured full-page and viewport. All72 feature queries and26 raw Markdown routes passed; every raw topic appears in the full export; zero page errors and no horizontal overflow. The harness disables speculative link prefetch and answers local telemetry with204. This does not establish deployed-site, crawler indexing, WAF or Search Console acceptance. No new tests or code comments; obsolete existing assertions updated. No deployment. | 27 days ago | |
web: index the feature catalogue and agent documentation Make the 72 registry capabilities findable in the catalogue and docs search. Derive status, surface badges and documentation links through the existing facts pipeline. Add /features.json, 26 raw Markdown topic routes and /llms-full.txt; align navigation, sitemap and explicit crawler policy. Release JSON-LD uses only stable rows with a declared since version at or before the published install version. Put the coding-agent category in home metadata and identity across the actual 18 routed locale packs. Correct session receipts, default Auto routing, ACP and read-only MCP server claims; mark Computer Use preview. Document request preview, LSP, execution policy, skills and the reviewed Claude Code import subset. Ratatui component indexing becomes English-only; its hub retains existing locale coverage. Root gate on base9ebbb063da plus 137 frozen web paths and the separately frozen Q13/X2 native/doc inputs: 1,312 passed; 0 failed; 7 skipped (wrapper101, SDK19, extension host413, security7, Vitest772). Actual receipt lines: "# pass 413" "# fail 0" "# skipped 7" "Tests 772 passed (772)" npm ci, facts/latest-release/docs/local GT catalogs, lint, tsc and production build passed. One existing lint warning. Final LLMS-only copy correction: "Tests 3 passed (3)"; fresh production build passed. The existing buildFacts comment was moved back to its owner without an executable change. Local browser inspection: 36 pages at 375/768/1280 in en/zh/ja/ar, each captured full-page and viewport. All72 feature queries and26 raw Markdown routes passed; every raw topic appears in the full export; zero page errors and no horizontal overflow. The harness disables speculative link prefetch and answers local telemetry with204. This does not establish deployed-site, crawler indexing, WAF or Search Console acceptance. No new tests or code comments; obsolete existing assertions updated. No deployment. | 27 days ago | |
docs(web): narrow the telemetry edge-runtime claim to what was verified Independent review of accf2cf86: the route and test comments said the deployed telemetry route returned 500 for every method while it declared the edge runtime. Nothing in this PR observed the deployed route; the tests call handleProductTelemetry directly. The verified reason is the adapter source: @opennextjs/cloudflare's migrate command warns the edge runtime is unsupported and its server bundle swaps next/dist/compiled/edge-runtime for an empty shim. The comments now say that, and that deployed behavior was not checked. The runtime removal and its regression tests are unchanged. Tests: product-telemetry-route, usage-counting-copy, facts-drift, locale-layout: 4 files, 22 passed. tsc --noEmit exit 0; eslint on touched files exit 0. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ZwqatxgVFxHvovngywnks | 1 month ago | |
feat: consolidate 0.10.1 Engine, reviewed TS mods and Ratatui integration Use the existing Engine for ACP, children and recursive RLM; retain captured approval, deadline, history/checkpoint, delivery and one-bill usage authority. Move legacy thread controls to the authenticated canonical owner with complete history and durable operation receipts. Keep Rust wire/policy authority and opt-in extension/Native execution; adopt the pinned Ratatui kit and source/docs. Exact V22 local validation: Rust 1351 passed/0 failed/0 ignored; additional localization 54 passed/0 failed/0 ignored; workspace/all-target/all-feature Clippy passed under existing CI policy. CLI: 3 actual processes / 6 checks / 6 local fixture requests / 0 paid calls; approval, resume, cancellation and EOF effects passed. npm test + check:web: 1180 passed / 0 failed / 7 explicit skips (wrapper101, SDK19, host378, website682); strict TypeScript and production web passed. No hosted/platform/install/live ChatGPT/DO adapter/publication/release claim. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
feat: consolidate 0.10.1 Engine, reviewed TS mods and Ratatui integration Use the existing Engine for ACP, children and recursive RLM; retain captured approval, deadline, history/checkpoint, delivery and one-bill usage authority. Move legacy thread controls to the authenticated canonical owner with complete history and durable operation receipts. Keep Rust wire/policy authority and opt-in extension/Native execution; adopt the pinned Ratatui kit and source/docs. Exact V22 local validation: Rust 1351 passed/0 failed/0 ignored; additional localization 54 passed/0 failed/0 ignored; workspace/all-target/all-feature Clippy passed under existing CI policy. CLI: 3 actual processes / 6 checks / 6 local fixture requests / 0 paid calls; approval, resume, cancellation and EOF effects passed. npm test + check:web: 1180 passed / 0 failed / 7 explicit skips (wrapper101, SDK19, host378, website682); strict TypeScript and production web passed. No hosted/platform/install/live ChatGPT/DO adapter/publication/release claim. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
feat: consolidate 0.10.1 Engine, reviewed TS mods and Ratatui integration Use the existing Engine for ACP, children and recursive RLM; retain captured approval, deadline, history/checkpoint, delivery and one-bill usage authority. Move legacy thread controls to the authenticated canonical owner with complete history and durable operation receipts. Keep Rust wire/policy authority and opt-in extension/Native execution; adopt the pinned Ratatui kit and source/docs. Exact V22 local validation: Rust 1351 passed/0 failed/0 ignored; additional localization 54 passed/0 failed/0 ignored; workspace/all-target/all-feature Clippy passed under existing CI policy. CLI: 3 actual processes / 6 checks / 6 local fixture requests / 0 paid calls; approval, resume, cancellation and EOF effects passed. npm test + check:web: 1180 passed / 0 failed / 7 explicit skips (wrapper101, SDK19, host378, website682); strict TypeScript and production web passed. No hosted/platform/install/live ChatGPT/DO adapter/publication/release claim. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
fix(web): gate the public digest on maintainer approval; keep resolved drafts resolved - runDigest stages the structured weekly record with approved:false and picks its fields explicitly; /digest renders only approved, well-formed records, so the "maintainer-approved" copy on the page and in llms.txt is accurate. Posting the digest from /admin approves it (unedited text only); discarding deletes the staged record. - Posting or discarding writes a draft-resolved marker (90 days). saveDraft and hasFreshDraft honor it and never overwrite a posted draft, so the triage / PR-review / stale / dupes / digest / content-watch runs no longer bring a resolved draft back as pending or spend a model call on it. - /api/admin/post rejects already-posted drafts (409), claims the draft before the GitHub call, returns ok with a warning when bookkeeping fails after GitHub accepted the post, reads the body with readBoundedBody, and answers malformed JSON with a JSON 400. - listDrafts follows the KV list cursor instead of stopping at 100 keys. Tests: web vitest 57 files / 515 passed; new lib/community-agent-review-state.test.ts 14 passed (13 fail on the unfixed source); tsc --noEmit exit 0; eslint on touched files exit 0. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ZwqatxgVFxHvovngywnks | 1 month ago | |
docs(web): stop steering visitors into paused accounts; say what 0.10.2 adds Codewhale accounts, account key storage and the paid product are paused until a frontier security review is available (CURRENT_DECISIONS §38, 2026-10-18). The live site still sent every visitor toward them, and several pages presented 0.10.2 as released. The plan came from a read-only audit of README, site and GitHub copy against the code and CHANGELOG (artifacts/readme-site-20261019/plan.md). Account pause (honesty): - Masthead and mobile menu: "Sign in" removed. - Home and /product: "Create an account" link, the account sentence and the Cloud computers row removed. Hosted web is "In development, not open yet" and points to codewhale web. The desktop row describes what the unreleased app does. - /signin lede and meta: new accounts are not open. /signup redirects to /signin and leaves the sitemap and llms.txt. The signup-counting disclosure copy is updated. - /docs/computers (account-only cloud agents) redirects to Fleet. - Auth docs: "Codewhale accounts", never needed and not open. The account-keys row is gone. - docs/INSTALL.md and zh_hans: "One account for your provider keys" is replaced by "No account needed". docs/CONFIGURATION.md and zh_hans: the account-key section no longer promotes account key storage and keeps only list/remove for existing accounts. Release labels (honesty): - docs/features.toml: chat-color and terminal-dock carry since 0.10.2; the account-login summary is corrected. - /features shows rows newer than the latest published release as source candidates. - /changelog marks a candidate version with the unreleased note and hides compare links to tags that do not exist. - Runtime page "Source version"; FAQ provider count is "the current source declares". - Review and pet docs say what 0.10.1 does and what 0.10.2 adds. Excitement through specifics: - Hero: "The open-source coding agent for any model"; heading "Build and automate from your terminal"; footer tagline to match. - Model facts name the default: deepseek-flash, now DeepSeek-V4.1-Flash. New fact: ChatGPT plan sign-in (experimental). The models page says what changed on 2026-10-17 and titles its table "source v{version}". - New "Coming in v0.10.2" band (lib/content/release-highlights.ts): /pet on, /workbar terminal, /undo, Plan to Work, the curl/wget credential hold and DeepSeek Search. It flips to "New in" at the tag and hides itself when stale. - Community line renders the contributor count from data. - web/MESSAGING.md synced. Every changed dictionary value is translated in all locales; deleted keys are removed everywhere. Generated files come from their generators (prebuild, i18n:gt export). Coded by GPT-6 Astra (codex, workspace-write). Claude added the CONFIGURATION.md sections Astra flagged, regenerated, and ran the gate. Verification: - npm test (repo root): node suites 101/19/413 (7 skipped)/7 passed, 0 failed; Vitest 74 files, 772 tests passed - npm run check:web: production build succeeded - web: check:locales PASS, check:facts OK, check:docs PASS, lint and tsc clean - cargo test -p codewhale-tui --test feature_registry: 2 passed Not done: no visual render check, and no deploy. The live site changes only when a maintainer runs web.yml. Outside this repo, app.codewhale.net/signup still serves "Create account". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz | 20 days ago | |
docs(web): stop steering visitors into paused accounts; say what 0.10.2 adds Codewhale accounts, account key storage and the paid product are paused until a frontier security review is available (CURRENT_DECISIONS §38, 2026-10-18). The live site still sent every visitor toward them, and several pages presented 0.10.2 as released. The plan came from a read-only audit of README, site and GitHub copy against the code and CHANGELOG (artifacts/readme-site-20261019/plan.md). Account pause (honesty): - Masthead and mobile menu: "Sign in" removed. - Home and /product: "Create an account" link, the account sentence and the Cloud computers row removed. Hosted web is "In development, not open yet" and points to codewhale web. The desktop row describes what the unreleased app does. - /signin lede and meta: new accounts are not open. /signup redirects to /signin and leaves the sitemap and llms.txt. The signup-counting disclosure copy is updated. - /docs/computers (account-only cloud agents) redirects to Fleet. - Auth docs: "Codewhale accounts", never needed and not open. The account-keys row is gone. - docs/INSTALL.md and zh_hans: "One account for your provider keys" is replaced by "No account needed". docs/CONFIGURATION.md and zh_hans: the account-key section no longer promotes account key storage and keeps only list/remove for existing accounts. Release labels (honesty): - docs/features.toml: chat-color and terminal-dock carry since 0.10.2; the account-login summary is corrected. - /features shows rows newer than the latest published release as source candidates. - /changelog marks a candidate version with the unreleased note and hides compare links to tags that do not exist. - Runtime page "Source version"; FAQ provider count is "the current source declares". - Review and pet docs say what 0.10.1 does and what 0.10.2 adds. Excitement through specifics: - Hero: "The open-source coding agent for any model"; heading "Build and automate from your terminal"; footer tagline to match. - Model facts name the default: deepseek-flash, now DeepSeek-V4.1-Flash. New fact: ChatGPT plan sign-in (experimental). The models page says what changed on 2026-10-17 and titles its table "source v{version}". - New "Coming in v0.10.2" band (lib/content/release-highlights.ts): /pet on, /workbar terminal, /undo, Plan to Work, the curl/wget credential hold and DeepSeek Search. It flips to "New in" at the tag and hides itself when stale. - Community line renders the contributor count from data. - web/MESSAGING.md synced. Every changed dictionary value is translated in all locales; deleted keys are removed everywhere. Generated files come from their generators (prebuild, i18n:gt export). Coded by GPT-6 Astra (codex, workspace-write). Claude added the CONFIGURATION.md sections Astra flagged, regenerated, and ran the gate. Verification: - npm test (repo root): node suites 101/19/413 (7 skipped)/7 passed, 0 failed; Vitest 74 files, 772 tests passed - npm run check:web: production build succeeded - web: check:locales PASS, check:facts OK, check:docs PASS, lint and tsc clean - cargo test -p codewhale-tui --test feature_registry: 2 passed Not done: no visual render check, and no deploy. The live site changes only when a maintainer runs web.yml. Outside this repo, app.codewhale.net/signup still serves "Create account". Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NBKbhx19BRbZtvWK8rVKjz | 20 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 | |
feat(web): surface Computer Use and fresh published releases [skip ci] Give Computer Use and release history primary navigation, and show terminal and Computer Use releases on the homepage and changelog. Read bounded, validated published metadata for the two fixed repositories in parallel; exclude drafts, prereleases and noncanonical release URLs. Keep download qualification on the Computer Use setup surface and retain known releases when updates fail. Refresh visible clients every five minutes and on return, using the original check time so prefetched pages can refresh promptly. Provide independent RSS and release-note links without requiring a website rebuild. Preserve newer known terminal release metadata in the existing facts cron. Trim the changelog introduction and export the two local translation catalogs. Verified: scoped ESLint; TypeScript --noEmit --incremental false; 12 existing Vitest suites, 132 tests passed; locale schema and local GT parity passed; git diff --check; local releases API HTTP 200, both current releases, 36ms; both canonical RSS feeds HTTP 200; responsive desktop/mobile, Chinese dark mode, direct Computer Use navigation, actual download setup and release links. Full protected web workflow and production publication follow the shared source/docs metadata landing. This is not Engine release qualification. | 2 days ago | |
fix(cli): remove the marked PATH block and Codewhale completions on uninstall A receipted release copy of codewhale uninstall --yes removed its program files but left the user to hand-delete the PATH lines and completion files the installer had told them to create. #7091 asks for a complete, verifiable uninstall; this completes the shell half of it. Uninstall now plans and applies two extra removals, both scoped to this install and gated on the same receipted copy that owns the program files: - This install's exact three-line # >>> codewhale PATH >>> block, in the same profile list the old report walked. The block is only matched when its middle line names this install directory, so another copy's block and a bare export PATH=… line the user wrote are never touched. The profile is edited by staging replacement bytes and renaming the original aside, so a failure installing the replacement restores the user's own file by name; a symlinked, unreadable or non-UTF-8 profile is reported and skipped. The profile's mode is adopted before the guard captures it, since GuardedFile pins ctime. - The Codewhale-generated completion files at their documented paths, honouring XDG_DATA_HOME and XDG_CONFIG_HOME. They are kept while another Codewhale copy remains on PATH, because a second install still wants them. Cleanup failures after the program is already gone are reported individually and exit non-zero rather than being silently swallowed. --help/dry-run prints Would remove and changes nothing. The installers still never edit shell profiles themselves; they now print the PATH line as that marked block, so there is something provably ours to remove. A bare export PATH=… line from an older install remains the user's. Verified: cargo test -p codewhale-cli --lib update:: 109 passed / 0 failed (269 filtered); vitest run lib/public-installer-contract.test.ts 25 passed, covering the printed marker block for zsh/bash/dash and the unrecognised-shell case. Release build of codewhale-cli clean, no warnings. Not verified: no real Windows host, no installed release artifact, and no run against a profile this repository does not own. Refs #7091 | 8 days ago | |
refactor(web): cut repetitive marketing copy [skip ci] Reduce homepage main text from1647 to528 words in the rendered local page. Remove duplicate setup/availability lists, unreleased changelog dump, repeated product sections, footer provenance links and redundant kickers. Keep detailed availability and Mac Computer Use limits on the product/setup pages, useful capability links, install command, real demo provenance and contribution paths. Replace the duplicate contributor manual with direct paths and the actual contributor guide. Shorten shared EN/ZH copy and export local GT catalogs. Delete unused content and the product page's unused facts fetch. Verification: focused ESLint and tsc --noEmit pass;5 existing suites64 passed (public copy/surface, docs IA, dictionaries, ocean). Retire the old homepage onboarding layout case and redundant footer release-link assertion; actual published release, MIT, provenance and policy checks remain. No new tests. Initial batch2failed/63passed captured obsolete layout expectations. EN/ZH browser review passed, sampled390px view has no page overflow. Screenshot updated in artifacts/website-repair-20261106. No native build, CI or deployment. | 2 days ago | |
feat(web): surface Computer Use and fresh published releases [skip ci] Give Computer Use and release history primary navigation, and show terminal and Computer Use releases on the homepage and changelog. Read bounded, validated published metadata for the two fixed repositories in parallel; exclude drafts, prereleases and noncanonical release URLs. Keep download qualification on the Computer Use setup surface and retain known releases when updates fail. Refresh visible clients every five minutes and on return, using the original check time so prefetched pages can refresh promptly. Provide independent RSS and release-note links without requiring a website rebuild. Preserve newer known terminal release metadata in the existing facts cron. Trim the changelog introduction and export the two local translation catalogs. Verified: scoped ESLint; TypeScript --noEmit --incremental false; 12 existing Vitest suites, 132 tests passed; locale schema and local GT parity passed; git diff --check; local releases API HTTP 200, both current releases, 36ms; both canonical RSS feeds HTTP 200; responsive desktop/mobile, Chinese dark mode, direct Computer Use navigation, actual download setup and release links. Full protected web workflow and production publication follow the shared source/docs metadata landing. This is not Engine release qualification. | 2 days ago | |
web: publish FAQ and organization structured data, llms.txt, and docs crumbs The public FAQ now emits FAQPage JSON-LD from the same 40 Q&A pairs the page renders. The locale layout carries a stable Organization/WebSite graph so SoftwareApplication can reference it. /llms.txt is generated from the docs registry; robots allows it; middleware does not locale-prefix it. Docs pages get a Home → Docs → topic trail and a matching BreadcrumbList. Cloudflare Images is not enabled. Verified: 92 vitest files in the touched web surface passed in the implementing session. | 2 months 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 hours ago | |
feat(web): surface Computer Use and fresh published releases [skip ci] Give Computer Use and release history primary navigation, and show terminal and Computer Use releases on the homepage and changelog. Read bounded, validated published metadata for the two fixed repositories in parallel; exclude drafts, prereleases and noncanonical release URLs. Keep download qualification on the Computer Use setup surface and retain known releases when updates fail. Refresh visible clients every five minutes and on return, using the original check time so prefetched pages can refresh promptly. Provide independent RSS and release-note links without requiring a website rebuild. Preserve newer known terminal release metadata in the existing facts cron. Trim the changelog introduction and export the two local translation catalogs. Verified: scoped ESLint; TypeScript --noEmit --incremental false; 12 existing Vitest suites, 132 tests passed; locale schema and local GT parity passed; git diff --check; local releases API HTTP 200, both current releases, 36ms; both canonical RSS feeds HTTP 200; responsive desktop/mobile, Chinese dark mode, direct Computer Use navigation, actual download setup and release links. Full protected web workflow and production publication follow the shared source/docs metadata landing. This is not Engine release qualification. | 2 days ago | |
fix(web): correct roadmap summaries and links; state code mode as shipped The roadmap's "Shipped" column showed the same boilerplate sentence for every release: summarizeReleaseBody took the first prose line of the release body, and every release body opens with the identical "> **Codewhale** is the public product..." blockquote. It now skips headings, blockquotes, separators and fenced code, and prefers the release's own "What's in vX.Y.Z" section, so a release summarizes itself. Rows also dropped their href when the live feed replaced the static items, so a release title rendered as dead text; roadmap page items now carry and render the link. The introduction described Shipped as possibly including a source candidate, which flattened released work and unreleased implementation into one column; it now separates published releases from work in progress, notes that the static items are an outage fallback, and both locales match. Also: the code-mode page still described the pre-0.10.1 Phase-1 probe (off by default, read-only, no MCP, 30 s cap). It now states the shipped contract — on by default with a config opt-out, nested native/MCP/plugin calls through the same gate as a direct call, approvals pause rather than deny, no fixed 30 s cap — in en and zh with key parity, and the "Try code mode" task card drops "read-only". Rides the file_search default-active rows (docs/public-surface-facts.json, web/lib/content/tools.ts, docs/TOOL_SURFACE.md) so the public tool surface matches the twelve eager names the Rust guard pins. Evidence: npm test 772 passed / 74 files (was 1 failing: the file_search surface contract), npx tsc --noEmit exit 0, npm run check:locales PASS, node scripts/gt-site.mjs check OK, npm run check:facts OK. | 30 days ago | |
fix(web): highlight search matches using the source string's own indices Defect: both search surfaces carried an identical highlight() that took idx from text.toLowerCase() and then sliced text with it: const lower = text.toLowerCase(); const idx = lower.indexOf(q); text.slice(idx, idx + q.length) That assumes lowercasing preserves length. It does not — "İ" (U+0130, Turkish dotted capital I) lowercases to two code units, so every index after one is off by one. Searching "stanbul" in "İstanbul kurulumu" marks "tanbul " instead of "stanbul": the highlight starts and ends one character late. Turkish is a routed locale (tr), and the search haystack is where localized copy is headed. Fix: highlightSpan() in lib/search-utils.ts — the module that exists so the search components' pure logic can be unit-tested — folds case one character at a time and keeps a position map, so the three returned pieces are cut at real character boundaries and always reassemble the input exactly. Both components now call it instead of repeating the arithmetic. Scope, honestly: no string in the current haystack contains a length-changing character, so this is a latent bug rather than an observed one. It is still wrong output for valid input, and it was wrong in two places. Evidence: lib/search-utils.test.ts. Restoring the lowercased-index implementation fails "keeps indices in the source string when lowercasing changes length" with expected 'tanbul ' to be 'stanbul'. The last case pins both components onto the shared rule. npm test 327 passed, npm run lint clean, npx tsc --noEmit clean. Implemented with agent assistance. Signed-off-by: Hunter Bown <hmbown@gmail.com> | 2 months ago | |
feat: Codewhale 0.9.12 shell, brand, fleet, and Operate (mega) (#5826) * feat(fleet): your fleet is the models you added, and it comes first Design MODEL-ROUTING-CATALOG-20260901 §10, slice F1. A fleet model is a Pod member: the selected Pod file's operator route plus every member row that pins an exact provider + model; the roles a model fills are the member rows that pin it. No second store. - crate::fleet::members: fleet_models / add_fleet_model / remove_fleet_model / toggle_fleet_model + change_receipt; Config::fleet_members(workspace) is the read seam for the operator-awareness slice (F2). - /pod models | add <provider> <model> [role…] | remove <provider> <model> (also via the /fleet alias). A model the configured provider does not serve is rejected; the first add creates and selects a user-global Pod named 'My fleet'. - /model picker: ⇧F adds or removes the row's exact route; fleet models lead the list labelled 'fleet · <roles>', ahead of ⇧P pins and providers. - /models prints the fleet before the provider list ('Your fleet is the session model only' when empty). - PickerActionFleet message in all 15 locales; docs/FLEET.md 'Your fleet as models'. Tests: scripts/dev-test.sh tui fleet::members groups::core::fleet model_picker format_helpers — Summary 37 tests run: 37 passed, 11834 skipped. Signed-off-by: CodeWhale Bot <bot@codewhale.net> * fix(fleet): pass slugify by name (clippy redundant_closure) cargo clippy -p codewhale-tui --all-targets -- -D warnings -A clippy::too_many_arguments -A clippy::uninlined_format_args -A clippy::unnecessary_map_or: no findings. Signed-off-by: CodeWhale Bot <bot@codewhale.net> * fix(tui): review fixes for fleet toggle and /pod add provider validation\n\n- Reject unconfigured provider ids in "/pod add" before writing, reusing\n the existing provider_is_configured_for_active predicate and custom\n provider table checks.\n- Add App.config snapshot so commands can consult the loaded config.\n- Update the stale DEFAULT_FLEET_NAME doc comment to mention ⇧F.\n- Sync crates/tui/CHANGELOG.md. * style: cargo fmt * fix(web): align react with react-dom 19.2.8 to unbreak npm ci Dependabot #5801 bumped react-dom to 19.2.8, whose peer range requires react 19.2.8; the lockfile still resolved react 19.2.6, so 'npm ci' in web/ failed ERESOLVE on main and on every branch that merged it (Lint & Type Check red). Align react to 19.2.8; install verified clean. Signed-off-by: CodeWhale Bot <bot@codewhale.net> * brand: trace supplied whale assets Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Hunter Bown <hmbown@gmail.com> * brand: align icon ombre and generated tokens Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Hunter Bown <hmbown@gmail.com> * brand: use white icon tile Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Hunter Bown <hmbown@gmail.com> * brand: deepen ombre light stop Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Hunter Bown <hmbown@gmail.com> * brand: wordmark takes the blue ombre Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Hunter Bown <hmbown@gmail.com> * tui: recover from image-input rejections by non-vision routes Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Hunter Bown <hmbown@gmail.com> * tui: localize image rejection recovery Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Hunter Bown <hmbown@gmail.com> * chore: format 0.9.12 mega branch Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Hunter Bown <hmbown@gmail.com> * Redesign Fleet role labels and agent cards * feat(tui): launch hero as wordmark + small surfacing mark Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Hunter Bown <hmbown@gmail.com> * design(tui): retune whale palette to codewhale navy / ombre sky Field, chrome, panel, plate and raised surfaces move onto the brand navy (#070C1D → #142352 → #1A2C63); interaction blue becomes the ombre sky #6AA6DC, light-mode action the ombre cobalt #1535B2; ice/cyan/border/tool tints follow. web/app/tokens.css regenerated via scripts/export-design-tokens.py. Co-Authored-By: Hunter Bown <hmbown@gmail.com> * test(tui): re-bless ink goldens for navy palette Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Hunter Bown <hmbown@gmail.com> * web: Space Mono wordmark, quiet layout refresh, fleet vocabulary in site + docs Space Mono (OFL) outlined wordmark rebuilt via scripts/build-wordmark.py, wired as --font-display through next/font/google; body stays IBM Plex Sans, code stays JetBrains Mono. Nav loses the issue strip, strapline, Discord badge and second filled CTA; home loses the ticker, seals and tilt figure; docs shell hero collapses to a one-line band; footer uses the inverted wordmark. Public noun is fleet (/fleet, codewhale fleet, /docs/fleet canonical; /pod, codewhale pod, /docs/pod remain compatibility aliases) across docs/, site dictionaries, vocabulary contract and public-surface facts. No-Issue: 0.9.12 website lane * brand: keep the traced wordmark; drop Space Mono outline build * web: IBM Plex Sans Condensed as display face * brand: Plex Sans Condensed wordmark; nav mark; drop fabricated home demos; AA meta text * feat(tui): bottom dock tabs — clickable panel switch + close Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Hunter Bown <hmbown@gmail.com> * Fix Fleet role migration verification * fix(tui): dock keys yield Tab to mode/permission cycles Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-Authored-By: Hunter Bown <hmbown@gmail.com> * web: Impeccable polish — type floors, heading outline, docs measure; add PRODUCT.md/DESIGN.md * Resolve canonical Fleet roles to legacy members * web: flat hero — drop cyan glow/gradients/shadow, muted eyebrows * design: PRODUCT.md/DESIGN.md at repo root — shell direction, bottom dock, anti-slop rules, 0.9.12 tokens * Auto-enroll used models into the Fleet * brand: keep the founder's wordmark rasters as the source of truth The web lane replaced brand/wordmark0901.png and brand/wordmarkinverted.png with Plex Sans Condensed renders. The founder-supplied PNGs are the brand source; the SVGs are re-traced from them in a following commit. * tui(mark): the launch mark has one rung The hero now paints the small mark over the wordmark, so the medium and large rungs and the for_area ladder have no consumer and fail the dead-code lint. Remove them rather than allow them. * brand: trace the founder's wordmark to SVG brand/wordmark.svg and wordmark-inverted.svg were an IBM Plex Sans Condensed text render; the founder's wordmark is the rounded monoline in brand/wordmark0901.png. scripts/brand/trace-brand.py now traces that PNG (magick threshold 60% + trim, potrace -s --flat -t 20 -O 0.4 -a 1.2), folds potrace's transform into one compact path in a tight 1874x264 viewBox, and writes the navy #142352 and white colourways from the same geometry. The Plex builder scripts/build-wordmark.py is gone with it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * web: derive icons and OG image from the traced mark app/icon.svg is now the white whale on the #142352 rounded tile as on the founder's sheet; favicon.ico (48/32/16), apple-icon.png, icon-192.png and icon-512.png are rasterised from it by scripts/brand/trace-brand.py, and the manifest colours are the same navy. The social card keeps the navy ground, white mark and traced wordmark and restores the identity phrase the page-meta contract expects. The nav sits on the dark field on every route, so it renders the inline Whale (white brand ink) and the inverted wordmark instead of a prefers-color-scheme picture pair; the wordmark box uses object-fit so the ~7.1:1 trace scales inside the compact nav instead of squashing. Exploration rasters web/public/brand/codewhale-mark-*.png and their web/brand/mark tile sources had no consumers and are removed; codewhale-mark.png stays (public-auth-routes pins its hash). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * web: map stray hard-coded colours to navy tokens globals.css carried a handful of literal navy-family greys, ice hairlines, seafoam borders and a cyan glow beside the generated --whale-* tokens. Each now reads the token it was approximating (whale-bg/chrome/panel, whale-ice, whale-accent-secondary, whale-action, whale-cyan, whale-text-dim), and the docs light sheet inks the mark in the brand navy via --whale-composer (#142352). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * palette: inventory WHALE_* tokens before the one-name-per-colour collapse Shell design §2.6 (SHELL-DESIGN-20260901) measured "58 WHALE_* symbols; one colour under five names; 5 dead tokens". Receipt before touching anything, generated from crates/tui/src/palette/tokens.rs. "uses" is the whole-word count across crates/ excluding the const's own definition and use/pub use lines (wrapper consts inside tokens.rs count). name value alias-of dead uses WHALE_BG_RGB (7, 12, 29) 3 WHALE_CHROME_RGB (12, 21, 49) 1 WHALE_PANEL_RGB (16, 28, 64) 3 WHALE_COMPOSER_RGB (20, 35, 82) 3 WHALE_ELEVATED_RGB (26, 44, 99) 4 WHALE_SELECTION_RGB (30, 60, 143) 3 WHALE_TEXT_BODY_RGB (246, 242, 232) 10 WHALE_TEXT_SOFT_RGB (182, 192, 212) 4 WHALE_TEXT_MUTED_RGB (147, 160, 184) 3 WHALE_TEXT_HINT_RGB (138, 153, 179) 3 WHALE_TEXT_DIM_RGB (105, 119, 145) yes 0 WHALE_ACTION_RGB (106, 166, 220) 6 WHALE_COBALT_RGB (21, 53, 178) yes 0 (web: --whale-cobalt x3) WHALE_ICE_RGB (221, 238, 249) yes 0 (web: --whale-ice, rustRgb("WHALE_ICE")) WHALE_CYAN_RGB (120, 188, 232) 2 WHALE_ACCENT_SECONDARY_RGB (79, 209, 197) 11 WHALE_BRAND_ORANGE_RGB (255, 138, 61) 1 WHALE_BRAND_MAGENTA_RGB (240, 78, 184) 1 WHALE_HUMAN_RGB (246, 196, 83) 5 WHALE_ACCENT_PRIMARY_RGB = WHALE_ACTION_RGB WHALE_ACTION_RGB 8 WHALE_WORKING_GREEN_RGB (155, 214, 111) 5 WHALE_ACCENT_ACTION_RGB = WHALE_ACTION_RGB WHALE_ACTION_RGB yes 0 WHALE_ERROR_RGB (255, 134, 178) 9 WHALE_ERROR_HOVER_RGB (255, 156, 194) 3 WHALE_ERROR_SURFACE_RGB (43, 21, 34) 6 WHALE_ERROR_BORDER_RGB = WHALE_ERROR_RGB WHALE_ERROR_RGB 3 WHALE_ERROR_TEXT_RGB (255, 219, 232) 3 WHALE_WARNING_RGB (255, 122, 89) 4 WHALE_SUCCESS_RGB = WHALE_WORKING_GREEN_RGB WHALE_WORKING_GREEN_RGB 9 WHALE_INFO_RGB = WHALE_ACTION_RGB WHALE_ACTION_RGB 17 WHALE_BORDER_RGB (42, 63, 114) 1 WHALE_REASONING_TEXT_RGB (224, 153, 72) 13 WHALE_REASONING_SURFACE_RGB (42, 34, 24) 3 WHALE_REASONING_TINT_RGB (22, 36, 74) 7 WHALE_DIFF_ADDED_RGB (87, 199, 133) 3 WHALE_DIFF_DELETED_RGB = WHALE_ERROR_RGB WHALE_ERROR_RGB yes 0 WHALE_DIFF_ADDED_BG_RGB (18, 42, 34) 3 WHALE_DIFF_DELETED_BG_RGB (52, 24, 39) 3 WHALE_MODE_AGENT_RGB (126, 180, 232) 4 (via MODE_AGENT: 13) WHALE_MODE_YOLO_RGB (255, 112, 160) 4 (via MODE_YOLO: 13) WHALE_MODE_PLAN_RGB (185, 220, 236) 4 (via MODE_PLAN: 13) WHALE_MODE_OPERATE_RGB (173, 136, 255) 4 (via MODE_OPERATE: 14) WHALE_TOOL_LIVE_RGB = WHALE_ACCENT_SECONDARY_RGB 3 (via ACCENT_TOOL_LIVE: 5) WHALE_TOOL_ISSUE_RGB = WHALE_ERROR_RGB 3 (via ACCENT_TOOL_ISSUE: 5) WHALE_TOOL_OUTPUT_RGB = WHALE_TEXT_SOFT_RGB 3 (via TEXT_TOOL_OUTPUT: 13) WHALE_TOOL_SURFACE_RGB (15, 26, 58) 3 (via SURFACE_TOOL: 5) WHALE_TOOL_ACTIVE_RGB (24, 44, 94) 3 (via SURFACE_TOOL_ACTIVE: 9) WHALE_ACCENT_PRIMARY Color(WHALE_ACCENT_PRIMARY_RGB) -> WHALE_ACTION 9 WHALE_ACTION Color(WHALE_ACTION_RGB) 85 WHALE_LIVE Color(WHALE_ACCENT_SECONDARY_RGB) 17 WHALE_HUMAN Color(WHALE_HUMAN_RGB) 41 WHALE_INFO Color(WHALE_INFO_RGB) -> WHALE_ACTION 105 WHALE_BG Color(WHALE_BG_RGB) 96 WHALE_CHROME Color(WHALE_CHROME_RGB) 5 WHALE_PANEL Color(WHALE_PANEL_RGB) 15 WHALE_COMPOSER Color(WHALE_COMPOSER_RGB) 5 WHALE_ERROR Color(WHALE_ERROR_RGB) 35 57 WHALE_* consts. Pure aliases (9): ACCENT_PRIMARY_RGB, ACCENT_ACTION_RGB, ERROR_BORDER_RGB, SUCCESS_RGB, INFO_RGB, DIFF_DELETED_RGB, TOOL_LIVE_RGB, TOOL_ISSUE_RGB, TOOL_OUTPUT_RGB. #[expect(dead_code)] (5): TEXT_DIM_RGB, COBALT_RGB, ICE_RGB, ACCENT_ACTION_RGB, DIFF_DELETED_RGB. Non-WHALE aliases of the same blue in tokens.rs: STATUS_INFO (8 uses), ACCENT_PRIMARY (dead, 0). One colour, #6AA6DC, under seven symbols: WHALE_ACTION(_RGB), WHALE_INFO(_RGB), WHALE_ACCENT_PRIMARY(_RGB), WHALE_ACCENT_ACTION_RGB, STATUS_INFO, ACCENT_PRIMARY — 225 call sites. Script: python3 over tokens.rs + grep -rnw crates; kept out of scripts/ (one-off receipt, the numbers live here). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * palette: one name per colour — collapse WHALE_INFO / WHALE_ACCENT_PRIMARY into WHALE_ACTION Shell design §2.6: "WHALE_INFO, WHALE_ACTION, WHALE_ACCENT_PRIMARY and their _RGB twins are one colour. Collapse to WHALE_ACTION." Mechanical rename across crates/ (word-boundary sed, no value changes): WHALE_INFO, WHALE_INFO_RGB -> WHALE_ACTION, WHALE_ACTION_RGB WHALE_ACCENT_PRIMARY(_RGB) -> WHALE_ACTION(_RGB) palette::STATUS_INFO -> palette::WHALE_ACTION WHALE_ACCENT_ACTION_RGB, ACCENT_PRIMARY (dead aliases) -> deleted The STATUS_INFO static in commands/groups/config is an unrelated CommandInfo and is untouched. Where two names met in one predicate (adapt.rs light/solarized/community remaps, grayscale text-soft bucket, SemanticForegroundRole::Action) the duplicate disjuncts are dropped; use lists deduped; the "primary accent aligns with action" test collapses to its one live assertion (action blue != human gold). The Blue Stage doc comment moves onto WHALE_ACTION_RGB. palette::grammar untouched: it reads UiTheme slots, never these consts. Evidence (CARGO_BUILD_BUILD_DIR=.../mega-tokens): cargo check -p codewhale-tui --all-targets -> Finished, 0 warnings cargo clippy -p codewhale-tui --all-targets --all-features --locked -- -D warnings (CI allow-list) -> clean cargo test -p codewhale-tui --lib palette::tests:: --locked -- --skip command_palette -> test result: ok. 59 passed; 0 failed RUST_MIN_STACK=67108864 cargo test -p codewhale-tui --lib startup_ink --locked -> test result: ok. 1 passed; 0 failed (ink goldens unchanged) cargo test -p codewhale-tui --lib --locked -- menu_style cursor_accent color_compat -> test result: ok. 36 passed; 0 failed Pre-existing, not from this diff (reproduced on the stashed tree): tui::command_palette tests, feat012_ac1 and the startup_ink golden overflow the default test-thread stack in a debug build; they pass with RUST_MIN_STACK=64MiB. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * palette: delete the dead whale tokens Shell design §2.6: "delete the five dead tokens". Two of the five went with the alias collapse (WHALE_ACCENT_ACTION_RGB, ACCENT_PRIMARY); this removes the rest that have no consumer in crates/ and no web consumer: WHALE_TEXT_DIM_RGB (105,119,145) 0 uses, no --whale-text-dim on the site WHALE_DIFF_DELETED_RGB = WHALE_ERROR_RGB 0 uses, no --whale-diff-deleted ACCENT_SECONDARY Color(WHALE_ACCENT_SECONDARY_RGB) 0 uses (TEXT_ACCENT/WHALE_LIVE carry it) STATUS_NEUTRAL = TEXT_MUTED 0 uses Kept, with a comment saying why the #[expect(dead_code)] is honest: WHALE_COBALT_RGB and WHALE_ICE_RGB have no TUI consumer but the site reads them through the token export (--whale-cobalt x3, --whale-ice and rustRgb("WHALE_ICE") in web/lib/blue-stage-contract.test.ts). Mode and tool-surface _RGB tuples stay: each is consumed through its Color wrapper (MODE_AGENT/YOLO/PLAN/OPERATE 13-14 call sites each, themes.rs + color_compat.rs; SURFACE_TOOL 5, SURFACE_TOOL_ACTIVE 9, ACCENT_TOOL_LIVE 5, ACCENT_TOOL_ISSUE 5, TEXT_TOOL_OUTPUT 13). The §1 "12 tokens with zero consumers" counted the tuples, not their wrappers. Evidence: cargo check -p codewhale-tui --all-targets -> Finished, 0 warnings; cargo test -p codewhale-tui --lib palette::tests:: --locked -- --skip command_palette -> test result: ok. 59 passed; 0 failed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * web: regenerate tokens.css after the whale token collapse scripts/export-design-tokens.py (never hand-edited). Ten lines gone: --whale-accent-primary(-rgb), --whale-accent-action(-rgb), --whale-info(-rgb), --whale-text-dim(-rgb), --whale-diff-deleted(-rgb). No site stylesheet or component consumed any of them (grep -rn "\-\-whale-" web/app web/components web/lib); the only reference was the alias-chain example in web/lib/whale-tokens.ts's doc comment, now --whale-success -> --whale-working-green -> #9bd66f (the old example also quoted a hex that stopped being true a retune ago). Evidence: cd web && python3 ../scripts/export-design-tokens.py --check (CI: npm run check:tokens) -> design tokens up to date (1 file(s), 42 tokens) vitest run lib/blue-stage-contract lib/docs-theme-contract -> Test Files 2 passed (2) / Tests 6 passed (6) (vitest ran against the main checkout's node_modules via a temporary symlink; this worktree has none installed.) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * docs(design): the status-bar grammar names the one blue token STATUS_BAR_COLOR_GRAMMAR.md never named a collapsed token, so this is the one sentence it needed: the Identity blue is WHALE_ACTION, its former aliases (WHALE_INFO, WHALE_ACCENT_PRIMARY, STATUS_INFO) are gone, and the whale theme's info / accent_primary slots both hold it. No other document in the repo named them (grep over *.md, *.ts, *.tsx, *.css, *.py, *.toml, *.yml, *.json outside node_modules); the root DESIGN.md already speaks in CSS names. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * palette: the field follows the terminal-owned shell; underwater aliases deepsea Shell design §2.0 decision 1 (founder: "We aren't supposed to be using a blue background anymore"): ground is the terminal's; the navy field is painted only under the opt-in deepsea column. What was already true, verified before changing anything: - Settings::default().theme is "terminal" (settings.rs:103). - The whale pair (UI_THEME / LIGHT_UI_THEME) ends in .with_terminal_native_shell(): surface, panel, composer, header and footer are Color::Reset, pinned by whale_pair_flat_shells_are_terminal_native_without_erasing_semantic_surfaces. - The ink goldens' legend reads a reset on reset. - OceanTreatment::Flat is the default; Deepsea repaints Reset cells through OceanRamp::for_theme, which matches the whale pair by name + Reset shell. The reviewer's citations (tokens.rs:6/:250/:465) are the token definitions deepsea and the semantic surfaces still need, not the theme. What was not true: ~90 direct bg(palette::WHALE_BG) paints in pickers, overlays and full-screen views (provider_picker 14, views/mod.rs 11, user_input, live_transcript, help, session/file/model pickers ...) bypass the theme, and adapt_bg_for_theme only remapped them for theme_remap_active presets. On the whale theme they laid navy patches over the terminal ground. Rung 2 fix, one rule in palette/adapt.rs: the field (WHALE_BG / BACKGROUND_DARK) always follows ui.surface_bg — Reset on the whale pair, the user's background_color override when set, the preset surface elsewhere. Panels, selection, elevation, error and diff surfaces are untouched; no widget file changes. underwater is now an accepted alias of deepsea in settings.rs (normalize + set), OceanTreatment::parse and the config_ui serde enum. Tests extended in place; the color_compat light test now expects the Reset shell it already had for theme consumers. DESIGN.md "Field" says the TUI ground is the terminal's own background and the navy field is deepsea-only. Contrast, all whale text/accent tokens on #000, #1e1e1e (VS Code), #282c34 (One Dark), #002b36 (Solarized dark), #300a24 (Ubuntu), #0d1117 (GitHub dark), #282a36 (Dracula): body 12.5-18.8:1, soft 7.7-11.5, muted 5.3-8.0, hint 4.9-7.3 (floor 3:1), action 5.4-8.1, human 8.6-12.9, live 7.5-11.3, error 6.2-9.3, warning 5.5-8.2, green 8.2-12.2, reasoning 5.9-8.8. Only border (#2A3F72) is low, 1.4-2.1:1: a non-text hairline. No token value changed. Seen, tmux 80x24 PTY, TERM=xterm-256color COLORTERM=truecolor, hermetic HOME, debug build, counting 48;2;R;G;B background sequences: default (Terminal theme): startup, /theme picker, Help — no painted background before or after (picker shows only accent swatches). Blue Stage selected via T/Down/Enter, then F1 Help: before: 15 x 48;2;7;12;29 (WHALE_BG) + 1 x selection row after: 1 x 48;2;30;60;143 (selection row only) Startup stage on Blue Stage: none, before and after. Evidence (CARGO_BUILD_BUILD_DIR=.../mega-tokens, RUST_MIN_STACK=16 MiB as CI): cargo check -p codewhale-tui --all-targets -> Finished, 0 warnings cargo test -p codewhale-tui --lib --locked -- color_compat palette::tests:: ocean:: ocean_treatment live_transcript views::tests startup_ink --skip command_palette -> test result: ok. 238 passed; 0 failed cargo test -p codewhale-tui --lib --locked (full) -> test result: FAILED. 11901 passed; 7 failed; 13 ignored 1 was this change (color_compat light test, updated above); the other 6 are role-name / slash-list assertions from other lanes on this branch (scout<->explore, worker<->general, slash.impeccable) and untouched. Ink goldens unchanged. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * tests(palette_audit): re-pin whale roles to the retuned palette whale_roles_are_pinned_and_non_colliding still pinned the pre-navy values (WHALE_BG (3,7,13), ACTION (106,174,242), ...) and failed on this branch before the token slice touched anything. Pins now match tokens.rs; no colour value changes. cargo test -p codewhale-tui --test integration --locked palette_audit -> test result: ok. 3 passed; 0 failed Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * tui/cli/web: fleet is the public product term; /pod, codewhale pod stay aliases Founder decision 2026-09-01: "fleet" is the customer-facing name for the assembled model team and "Pod" is retired from product copy. /fleet is the canonical slash command and codewhale fleet the canonical CLI verb; /pod, codewhale pod, loadout, and party remain parser aliases. Storage keys, the ledger file name, config tables, protocol identifiers, and MessageId variant names keep their current spelling. - CommandInfo name/aliases/usage, help text, and the unknown-verb error flip to /fleet; /fleet fleets (saved/manage) is the saved-fleet picker with /fleet pods kept as an alias. - All 15 locale packs: localized values say fleet; the settings goldens follow. KbCompleteCycleModes names the modes as Plan → Work → Operate (Act is only a compatibility alias per docs/MODES.md). - scripts/check-tui-product-vocabulary.sh now rejects Pod in en.json instead of rejecting fleet in every pack. - Hotbar id slash.fleet is canonical; persisted slash.pod normalizes. - Fleet store error prose says fleet. - Docs: PRODUCT.md lists the current role tokens (general, explore, planner, reviewer, implement, test, advisor, custom) and names the old spellings as aliases; docs/FLEET.md uses one role vocabulary; web/lib/content/vocabulary.ts ADVISORY_ROLE is Advisor with consultant/ oracle as the legacy spellings (matches fleet/profile.rs migration). Evidence: sh scripts/check-tui-product-vocabulary.sh -> exit 0 cargo test -p codewhale-config -p codewhale-lane --locked -> 638 passed; 0 failed / 62 passed; 0 failed cargo test -p codewhale-cli --locked -- fleet pod -> 3 passed; 0 failed cargo test -p codewhale-tui --lib --locked -- fleet::store fleet::members fleet::identity -> 24 passed; 0 failed cargo test -p codewhale-tui --lib --locked -- groups::core::fleet localization command_palette hotbar fleet_roster settings widgets fleet::control pod_workers -> 605 passed; 1 failed (the failure is slash_source_matches_command_palette_command_entries, which reads the machine's ~/.claude/skills and finds an impeccable skill; it fails identically without this change) cd web && npm test -- lib/content/vocabulary.test.ts -> 11 passed Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * chore(tui): clear the six clippy 1.98 errors the base lanes left needless_borrow on provider_identity_for_persistence (five sites) and a collapsible_if in the work-surface mouse path. No behaviour change. * tui(composer): restore double-tap Enter as the send-now gesture While a turn is running, the first bare Enter queues the message (as before) and opens a 500 ms window (App::DOUBLE_TAP_WINDOW, the value the removed code in c5c42b7d91 used). A second bare Enter inside that window with an empty composer promotes the just-queued message to a Steer through attempt_steer_with_queue_fallback — the same path Ctrl+Enter takes, so there is one steering path. A second Enter with new text is an ordinary queue; Ctrl+Enter still steers immediately; outside a turn Enter is unchanged. enter_with_double_tap is the one decision point again (take_queued_for_double_tap_steer routes through it), and submit_disposition_does_not_mutate_the_queue stays true. The posture bar advertises the gesture while the window is open (PostureHintEnterAgain, next commit). Tests (cargo test -p codewhale-tui --lib <filter> --locked): double_tap: test result: ok. 3 passed; 0 failed enter_with: test result: ok. 5 passed; 0 failed submit_disposition: test result: ok. 6 passed; 0 failed Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * tui(shell): one owner per fact — posture bar, metrics line, no dead hints Design: SHELL-DESIGN-20260901 §2.0 item 3, §2.2, §2.3, §2.3b, §2.11 and the founder's 2026-09-02 redirect (Claude Code's grammar, less always-on information). Under the composer there are exactly two chrome rows in the default state, then the work surface only when it has content: ▶▶ ask (Shift+Tab) · work (Tab) · 2 agents · Esc to interrupt /rc … deepseek-v4 · ctx 61% · $0.42 · ttft 400ms · 40 tok/s · ↓ 1.2K Ctrl+/ help Fact → owner, before → after (composed 80x24 / 120x32 frames, working turn with two sub-agents; "strip" = the work-surface bottom view): fact before after context % info line metrics line cost footer (+ info line when priced) metrics line model info line metrics line provider info line (wide) metrics line (wide) ttft / tok/s / ↓ behind /cost only metrics line repo slug info line (+ idle empty state) launch header / git view (not chrome) branch info line (+ idle empty state) launch header / git view (not chrome) mode footer posture bar permission footer posture bar phase word footer ("sub-agents underway") transcript active row (not chrome) elapsed footer ("1m 15s") roster rows (per agent) agent count indicator row + info "pod 2/2" + "whales 2/4" posture bar ("2 agents") + dock tab + strip header (+ dock tab, strip header — other slice) task/shell count indicator row above the composer posture bar help hint footer keys legend (F1) + info line (Ctrl+/) metrics line (Ctrl+/), from the binding other key hints footer "⌥V:output", compact "? help" none; cycle keys next to the chip they cycle live hint footer "Esc to interrupt" posture bar hint slot ≥80 % microcopy footer right slot posture bar hint slot (outranks the hint) notice / rc footer right slot / — posture bar right slot Dead key hints removed: F1:keys / fn+F1:keys (Help binding's footer_chord is now Ctrl+/; info_help_hint derives from the binding), compact ? help, and the footer_action_hints family. The mode/permission cycle keys print only when the binding table admits them at the current focus (no (Tab) on the launch stage). Row order: composer → posture bar → metrics line → roster/to-do. The #5286 background-work chip above the composer is gone (it repeated the posture bar's counts); PendingWork stays as the counts' source. Goldens re-blessed and read: footer_* (posture bar), infoline_startup_*, infoline_work_* (metrics line), settings_* (the settings preview's bottom row); infoline_settings_* deleted with the settings-path segment. Commands run (CARGO_BUILD_BUILD_DIR=…/mega-frame, RUST_MIN_STACK=16777216): cargo check -p codewhale-tui --all-targets clean cargo test -p codewhale-tui --lib infoline --locked test result: ok. 11 passed; 0 failed cargo test -p codewhale-tui --lib tideline_tests test result: ok. 64 passed; 0 failed cargo test -p codewhale-tui --lib one_owner_tests test result: ok. 4 passed; 0 failed cargo test -p codewhale-tui --lib shell_key_routing test result: ok. 13 passed; 0 failed cargo test -p codewhale-tui --lib localization::tests test result: ok. 49 passed; 0 failed cargo test -p codewhale-tui --lib --locked test result: FAILED. 11893 passed; 8 failed (config_panel golden re-blessed after; the other 7: 4 fail on HEAD without this change (fleet rename in flight), tmux clipboard passes alone, none in files this change touches) cargo clippy … -D warnings 6 pre-existing errors, none in this change's hunks (config.rs:2106/2796, apply.rs:759, event_loop.rs:464, session_state.rs:1004, work_surface/input.rs:401) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * wip(launch): checkpoint for overnight takeover — braille mark + kitty tier + Claude-Code launch header compile and pass lib tests; PTY cucumber tests still wait on the old heading Compiles (cargo check --all-targets clean). Lib tests for mark::, underwater::, mouse_ui::, localization:: pass: test result: ok. 120 passed; 0 failed (needs RUST_MIN_STACK=16777216 like scripts/dev-test.sh; the rust_i18n static overflows a 2 MiB test thread with or without this change). Startup goldens re-blessed and read. Clippy is red only in files outside this slice (config.rs, apply.rs, session_state.rs, work_surface/input.rs, and a pre-existing event_loop.rs borrow). Not done: crates/tui/tests/cucumber/{screen_mode_inline_pty, active_composer_pointer_pty,plugin_e2e_acceptance}.rs still wait for "What are we working on?" and press 'w'; they need the new marker ("Codewhale v") and a typed message + Enter to begin the session. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * wip(rail): checkpoint for overnight takeover — dock views compile, 136/137 work_surface tests pass, files/notepad/git views are stubs Foundation for the one bottom dock (founder redirect 2026-09-02): RailPanel is now the eight-view cycle (agents, tasks, background, files, notepad, context, git, price; Pinned folded into tasks), an auto rule opens agents/tasks/background while they have content, explicit picks stick until Esc, and Ctrl+Tab / Ctrl+] (fwd) + Ctrl+Shift+Tab (back) cycle. Context and price views render as rows; files, notepad, git are stubs in views.rs. The classic sidebar line panels and their dead consumers are deleted. Known: agent_rows_show_role_assignment_and_open_the_agent_transcript fails (role_label 'worker' vs 'general'); role derivation is untouched here and the failure is believed to predate this work — unverified. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * wip(operate): checkpoint for overnight takeover — auto-goal + contract land; one Operate approval test needs a goal-complete mock Operate now turns a non-trivial prompt into the goal through the same GoalState::create path as explicit_goal_directive, appends the Operate contract once as a user-role runtime message (append-only history, not the prefix), shows the Operate goal receipt, and carries the new mode copy in all 15 locale packs plus docs/MODES.md. Compiles. Passing: goal (134), prompts (133, incl. every_mode_shares_one_prompt_per_host), localization (49), runtime_handoff (14), session_peek (15), history_cells (2), both new engine tests. Known failing: core::engine::tests::operate_model_shell_uses_normal_approval_and_workspace_sandbox — its mocked model never reports the auto-set goal complete, so the turn re-prompts to max_steps (wiremock expect(1) sees 199). Six clippy needless_borrow/collapsible_if hits pre-exist on the branch base. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * wip(fleet): checkpoint for overnight takeover — #5815 review findings 1-9 fixed, compiles, fleet tests green Findings against the fleet-as-models work (verified against the current tree, then fixed): 1. toggle_fleet_model decides presence by member rows, not the projected role list (a role-less row projects to no role, so the old all(== "operator") was vacuously true). Regression test toggle_removes_a_role_less_member_row fails on the previous commit ("got Unchanged { … operator route … }") and passes now. 2. selected_or_default loads an existing personal My fleet instead of overwriting it and never writes or selects before the add succeeds; FleetModelChange::Added carries created_fleet + selected_fleet. 3. fleet_models returns Result<Vec<_>, FleetStoreError>: a broken explicit selection is surfaced in /fleet models, /models, and the picker's ⇧F instead of reading as "session model only". 4. add_fleet_model dedupes roles (case-insensitive) and returns Unchanged without touching the file when every role is present (test compares bytes and mtime). 5. App.config startup snapshot removed. /fleet add|remove now return AppAction::FleetAddModel|FleetRemoveModel; the UI arm validates the provider against the live Config (fleet_provider_rejection, fleet_catalog_rejection, re-exported from commands). 6. ⇧F applies the same provider gate as /fleet add. 7. One roster path: sync_fleet_roster (extracted from the FleetStoreChanged arm) plus App::fleet_roster_stale, flushed once per event-loop iteration; /fleet add|remove, ⇧F, and every UI-side auto-enroll site set it (auto_enroll_fleet_model now returns bool). 8. ⇧F receipts go through push_status_toast (Success/Info, 6 s) and set_sticky_status (Error); no new status_message writes. 9. All new fleet prose is tr(locale, MessageId::Fleet…) (27 keys, translated in all 15 packs); FleetModelError is typed with a localized message(locale). 10. No stale "a in /models" doc comment exists in the current tree. Also re-blessed config_panel_{80x24,120x32} goldens (the Config tab label says Fleet); the diff is that one label. Evidence (this tree): cargo check -p codewhale-tui --all-targets --locked -> Finished cargo test -p codewhale-tui --lib --locked -- fleet::members groups::core::fleet model_picker format_helpers fleet_roster localization golden hotbar command_palette fleet::store -> 257 passed; 1 failed (slash_source_matches_command_palette_ command_entries: reads ~/.claude/skills and finds impeccable; fails identically on main in this environment) cargo clippy … -D warnings (CI flags) -> the only remaining error is crates/tui/src/tui/work_surface/input.rs:401 collapsible_if, which belongs to the work_surface lane and predates this commit cargo fmt --all -- --check -> clean sh scripts/check-tui-product-vocabulary.sh -> exit 0 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HSVsAXZJnKGZmqkwH1CeKH * feat(tui): launch card, canonical role vocabulary, DashScope descriptor, test fixes - Launch is now our own card take (founder, 2026-09-02): thin top line ⑂ branch path; centred bordered card with the whale mark, Codewhale + version, one true announcement (no-model warning / MCP news), and the menu New worktree / Resume session / Changelog / Quit with real chords right-aligned; Enter runs the highlighted entry, Up/Down move it, and typing goes straight to the composer. The card dissolves on the first keystroke or command (≤240ms, instant under reduced motion); the working screen then shows ⑂ branch path + ⋮ MCP n/m, the session_start receipt, and the posture bar + metrics line (hidden while the card is up). The composer's bottom rule carries model (effort) · permission — the route's one launch reading. - Role vocabulary: fixtures and the stopship fleet/workflow now use the canonical tokens (explore/implement/reviewer/test); the workflow JS wire accepts canonical spellings with the pre-rename ones as aliases (AgentType serde rename+alias, serialized form is canonical). - Alibaba Model Studio (DashScope) joins the data-driven descriptor table: international compatible-mode endpoint, DASHSCOPE_API_KEY, live /v1/models as the Qwen model authority (never a compiled id). - Tests: role-keyed gate fixtures moved to canonical tokens; the operate model-shell test now seals the goal through the deferred update_goal tool (deferral retry included) instead of pausing blindly; the slash-source hotbar test isolates HOME; ⚠ and ⋮ gained ASCII fallbacks; launch goldens re-blessed for the card. * feat(tui): retire Pod from copy; canonical workflow fixture; gate clean-up - Pod literal sweep across fleet views, worker runtime, sub-agent tool, managed API, and command groups: user-facing copy now says Fleet (founder vocabulary decision; /fleet canonical, /pod and 'codewhale pod' stay as compatibility aliases). Roster tests that encoded the retired Pod-public/Fleet-internal split now assert the public Fleet vocabulary. - workflows/stopship + fleets/stopship use canonical role names (explore/implement/reviewer/test); the workflow crate's own stopship tests and required-roles list follow. - Operate mode-picker hint shortened to fit 80 columns in every locale. - Cucumber PTY launch flows: wait for the launch card, type the first prompt and press Enter; the live shell is proven by the launch stage's top line disappearing and the metrics line's ctx reading (the interrupt hint needs a live turn, which an offline route never starts). The stopship acceptance feature expects the canonical /fleet help copy. - CHANGELOG receipts synced; DESIGN.md shell direction records the card, posture bar + metrics line, and the bottom view cycle. * test(cucumber): launch-card PTY contract fixes - The launch-card wait uses the menu's New worktree entry — unique to the card; the bare wordmark also matches onboarding copy. - The live-shell proof is the launch stage's top line disappearing plus the metrics line's ctx reading; the interrupt hint needs a live turn, which an offline route never starts, and the help hint sheds first at the 40-column floor by design (SHELL-DESIGN-20260901 §2.2). - The pointer-submit queue proof takes the offline onboarding seed into account: the receipt toast proves the gesture, and the queue count grows by exactly one. * docs(readme): restore the canonical product screenshot the web contract pins The brand header redesign dropped the assets/screenshot.webp embed; the web public-surface contract pins the README and the website to one canonical optimized screenshot (byte-identical, 1562x1256 lossless VP8L). Re-embed it. * test: platform-robust pointer-submit wait and cap-warning diagnostics - The pointer queue proof accepts either the transient receipt toast or the queue-count increment: toast timing differs across runners, and a 20 s wait missed a toast the queue dump proved had fired. - The context-cap posture test dumps the drawn rows when the warning count misses, instead of a bare 0 != 1, so a platform-specific shed (the hint sheds first when the left run exceeds its budget) is visible in CI. * test: fix the linux-only context-cap shed; bounded pointer-click retry - The context-cap posture test drew at 100 columns, where a backend-less platform (linux CI paints 'files: workspace (unenforced)') sheds the cap hint first, so the warning count read 0. Draw at 140 columns, where the hint survives with the notice present; verified locally. - The pointer queue proof retries the [↑] click once, re-finding the affordance first: under runner load a redraw can shift cells between the find and the click, so the first SGR gesture lands nowhere. * fix(gates): tool-catalog budget covers the fleet rename; readme stamps; pointer baseline - The Pod->Fleet sweep grew every mode's tool-schema surface by 58 bytes (+14 tokens). The receipts are re-measured and the one-way ceilings in scripts/runtime-contract-budget.json are raised to them as the explicit maintainer decision the gate asks for (the rename is the founder's 2026-09-01 vocabulary call). - The README screenshot embed changed README.md; the 18 translated READMEs re-stamp (the embed is language-neutral HTML - no prose changed, so no retranslation was needed). - The pointer queue baseline is captured while the composer is empty: the pending preview row hides while a draft sits in the composer, so the pre-click depth read None and the growth proof could not fire. * test: re-click then keep polling until the deadline The qa_harness Instant wrapper does not implement Div, and the retry's single read raced the app processing the second gesture: poll to the full deadline, re-click once at the half-way point. * test: pointer queue diagnostics (baseline/expected/last-seen) in the failure output * test: pointer poll keeps per-iteration state only (unused-assignment gate) * fix: Copilot review findings — planner wire spelling and Advisor copy - workflow::AgentType::Plan serializes as the canonical 'planner' ('plan'/'awaiter' stay accepted aliases), matching the FleetRole vocabulary the mega PR declares. - Web: the vocabulary docs metadata, the vocabulary module header, and the docs-map topic description say Advisor (the public advisory term) instead of the retired Consultant spelling. - Polish home dictionary: restore 'Podwodna powłoka terminala' — the fleet-vocabulary sweep had merged 'Fleet' into the compound word 'Podwodna' (underwater), producing the non-word 'fleetwodna'. * test: pointer proof accepts preview-appears when no baseline count is painted * test: the tolerant preview-appears proof (the arm the last commit missed) --------- Signed-off-by: CodeWhale Bot <bot@codewhale.net> Signed-off-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: CodeWhale Bot <bot@codewhale.net> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> | 2 months 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 | |
fix(web): audit findings W01-03, W01-02, W01-m2 (verify lane V1) W01-03 (Refs #6561): /llms.txt says it indexes "the remaining sitemap pages", but /computer-use (in the sitemap with its 18 translated locales since 332f60bee) was absent from EXTRA_PAGES, so the machine-readable registry still diverged from canonical/hreflang/sitemap. It now lists /en/computer-use with the page's own English title and meta description (imported from the dictionary, so the index cannot drift from the page). W01-02 and W01-m2 were closed in source by 332f60bee (and the contributor fix 997b9f4ac for the FAQ links) but had no test. Added: - faq-schema: no FAQ answer link hard-codes a locale prefix. - session-media: the default caption track follows the page locale when it has captions, else English (rendered with react-dom/server). Evidence (web, vitest 4.1.11): - 17 files covering the V1 web findings: Test Files 17 passed (17), Tests 206 passed (206). - Negative controls, restored byte-identically (git diff --exit-code): llms-txt.ts at HEAD -> "indexes first-party docs topics plus the remaining sitemap pages" fails (Tests 1 failed | 2 passed); faq page.tsx at 332f60bee^ -> "keeps every internal answer link on the reader's locale" fails (1 failed | 4 passed); session-media.tsx at 332f60bee^ -> "expected 'en' to be 'zh'" (1 failed). - tsc --noEmit -p web: exit 0; eslint on touched files: exit 0. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
refactor(web): split globals.css into per-surface partials globals.css (3,828 lines) becomes an import hub over app/styles/*.css, cut at existing section boundaries in the original order: tailwind, tokens-roles, base, shell, utilities, portal, home, docs, states, docs-help, changelog, overrides. Pure move; no rule edited. Tailwind expands each CSS file separately and appends variant utilities (hover:, md:, ...) at the end of whichever file holds @tailwind utilities, which moved them ahead of every site rule. postcss.config now runs postcss-import (already a tailwindcss@3 dependency, hoisted in package-lock) for ./styles/ imports so Tailwind sees one stylesheet again. tokens.css stays a separate module as before. The contract tests and whale-tokens.ts read the stylesheet through a new lib/site-css.ts, which inlines the partials in cascade order. Checks: - Built CSS, back-to-back A/B/A builds (original / split / original): split output byte-identical to original (same md5 and chunk hash). - next build: exit 0 - npm run lint: 0 errors, 2 pre-existing warnings - npx tsc --noEmit: exit 0 - vitest (docs-theme-contract, blue-stage-contract, docs-ia, nav-hit-target, public-surface-contract): 5 files, 43/43 passed - npm run check:tokens: up to date (122 tokens) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> | 1 month ago | |
web: publish FAQ and organization structured data, llms.txt, and docs crumbs The public FAQ now emits FAQPage JSON-LD from the same 40 Q&A pairs the page renders. The locale layout carries a stable Organization/WebSite graph so SoftwareApplication can reference it. /llms.txt is generated from the docs registry; robots allows it; middleware does not locale-prefix it. Docs pages get a Home → Docs → topic trail and a matching BreadcrumbList. Cloudflare Images is not enabled. Verified: 92 vitest files in the touched web surface passed in the implementing session. | 2 months ago | |
web: publish FAQ and organization structured data, llms.txt, and docs crumbs The public FAQ now emits FAQPage JSON-LD from the same 40 Q&A pairs the page renders. The locale layout carries a stable Organization/WebSite graph so SoftwareApplication can reference it. /llms.txt is generated from the docs registry; robots allows it; middleware does not locale-prefix it. Docs pages get a Home → Docs → topic trail and a matching BreadcrumbList. Cloudflare Images is not enabled. Verified: 92 vitest files in the touched web surface passed in the implementing session. | 2 months ago | |
fix(web): let the / shortcut yield to handled keys and ARIA text widgets isSlashShortcut now also skips a key an inner widget already handled (defaultPrevented), targets with role textbox/searchbox/combobox, and reads the original target through composedPath() so an input inside a shadow root is not mistaken for its host. vitest lib/slash-shortcut.test.ts: 15 passed; 6 of the new cases fail against the previous helper. tsc --noEmit: exit 0. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ZwqatxgVFxHvovngywnks | 1 month ago | |
fix(web): let the / shortcut yield to handled keys and ARIA text widgets isSlashShortcut now also skips a key an inner widget already handled (defaultPrevented), targets with role textbox/searchbox/combobox, and reads the original target through composedPath() so an input inside a shadow root is not mistaken for its host. vitest lib/slash-shortcut.test.ts: 15 passed; 6 of the new cases fail against the previous helper. tsc --noEmit: exit 0. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014ZwqatxgVFxHvovngywnks | 1 month ago | |
web: publish FAQ and organization structured data, llms.txt, and docs crumbs The public FAQ now emits FAQPage JSON-LD from the same 40 Q&A pairs the page renders. The locale layout carries a stable Organization/WebSite graph so SoftwareApplication can reference it. /llms.txt is generated from the docs registry; robots allows it; middleware does not locale-prefix it. Docs pages get a Home → Docs → topic trail and a matching BreadcrumbList. Cloudflare Images is not enabled. Verified: 92 vitest files in the touched web surface passed in the implementing session. | 2 months ago | |
docs(web): finish FAQ and source-aware install discovery [skip ci] Complete inherited public copy for provider routes, compaction recall, goal guidance, structured app metadata and llms.txt install/release facts. Move all English/Chinese FAQ answers into shared content so the page remains a single locale-aware renderer; update the existing source assertions to that owner. Existing focused web checks: 39/40 initially passed after the move; the sole stale source-path assertion was corrected and passes on targeted replay (40 distinct passing checks). TypeScript and touched-file ESLint pass. Local browser preview opens all three new English FAQ answers and remains unchanged after the shared-content move. No deployment or published-release claim. | 8 days ago | |
test(web): avoid Cloudflare globals in installer test Keep the static installer unit test independent of Cloudflare worker global types so the regular web TypeScript check can run in CI. | 4 months ago | |
fix(web): serve install script before app fallback Route /install.sh through the Cloudflare static asset binding before the OpenNext app handler so the documented curl installer receives a shell script instead of the prerendered website shell. Fixes #3582. | 4 months 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 | |
feat(web): show finished work and explain models and connected tools Replace the homepage terminal-view gallery with a labelled weekly report computed from sample orders, matching input/report CSV downloads, and concrete app-building and connected-email tasks. Revise 18 locale editions around building apps, automating work, plugins/MCP/APIs, existing model accounts and own inference. Keep released capabilities and native/hosted development status explicit. Refresh native renderer captures from an actual local Engine task and reviewer, README media, product/design guidance and contributor credits; require Next.js 16.4. Validation: npm test PASS: package 101, SDK 19, extension 413 passed/7 skipped, dependency guards 7, web 74 files/772 tests. npm run check:web PASS: 24 docs topics, 150 design tokens, 0 lint errors/1 existing warning, typecheck, 894 static pages. After note/credit edits, focused changelog/public-copy/public-surface checks 24/24 and changelog sync PASS. Browser reviewed desktop/mobile, light/dark, Chinese and Arabic RTL; light text contrast checked. Native capture uses a local scripted provider. Download payloads and links were checked; in-app native file-save completion was not observed. Production still serves 24a7b99a. No deployment or publication claim. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
feat(web): show finished work and explain models and connected tools Replace the homepage terminal-view gallery with a labelled weekly report computed from sample orders, matching input/report CSV downloads, and concrete app-building and connected-email tasks. Revise 18 locale editions around building apps, automating work, plugins/MCP/APIs, existing model accounts and own inference. Keep released capabilities and native/hosted development status explicit. Refresh native renderer captures from an actual local Engine task and reviewer, README media, product/design guidance and contributor credits; require Next.js 16.4. Validation: npm test PASS: package 101, SDK 19, extension 413 passed/7 skipped, dependency guards 7, web 74 files/772 tests. npm run check:web PASS: 24 docs topics, 150 design tokens, 0 lint errors/1 existing warning, typecheck, 894 static pages. After note/credit edits, focused changelog/public-copy/public-surface checks 24/24 and changelog sync PASS. Browser reviewed desktop/mobile, light/dark, Chinese and Arabic RTL; light text contrast checked. Native capture uses a local scripted provider. Download payloads and links were checked; in-app native file-save completion was not observed. Production still serves 24a7b99a. No deployment or publication claim. Signed-off-by: CodeWhale Bot <bot@codewhale.net> | 1 month ago | |
fix(web): integrate the whale-road site and docs, drop orphans Integration pass over the site rebuild (abb648579, 50d9d492c) and the docs rewrite (9c3dcee1d) on feat/website-gpui-renovation. - Regenerate the GT catalog (npm run i18n:gt -- export) so gt-site passes. - Docs sidebar: the current-page tick pushed the label to the far edge (flex space-between); the label now grows and the tick sits beside it. - Docs hub: drop the raw route/source-path column from task and topic rows. - Docs band: the old single-ink traced mark becomes the v2 "read" pose; "Release truth" / "版本事实" become "Release" / "版本". - Guide steps: rows span the card so dividers meet both edges (the prose 66ch cap no longer applies inside the step panel). - Copy button: sits flush on the command block's right edge with a fade, so a long command no longer shows a sliver past the button at 375px. - Remove orphans nothing rendered: components/ticker.tsx, code-spans.tsx, whale.tsx, the docs-constitution dictionary (en/zh), 27 dictionary keys across 19 locales (ticker verbs, seal/wordmark, masthead issue, trace, home chapters, providerRoutes, 404 poster alt, computer-use install block, docs sourceDocsCta), splitTokens, and unused CSS (community credit/welcome, docs-empty, home-release, btn-outline, group-title, hero-install-switch, skeleton-bar, product-container, .hairline, sr-only-focusable). Tests that only pinned those files are removed. Verification (node 22.20.0): - npm test: npm/codewhale 67/67 pass, runtime-sdk 14/14 pass, web vitest 55 files, 498/498 pass, 0 failed. - npm run check:web: pass (facts, latest-release, derive, check-docs, tokens, eslint, tsc --noEmit, next build: 839/839 static pages). - next start on :4871, Playwright (system Chrome) screenshots of home, install, docs hub, docs guide/mcp/review, faq, changelog, models, legal, 404 at 375/1024/1440 in light and dark: 66 shots, no horizontal overflow, no console errors except the 404 document's own status. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01R9rJEoMuUSRWznU6QjkE7h | 1 month ago | |
fix(web): stop cutting GitHub titles through the middle of a character Defect: the homepage wire strip shortened long titles with title.slice(0, 70), and the roadmap summaries with stripped.slice(0, 137). slice counts UTF-16 code units, so when the cut lands between the two halves of a surrogate pair the output ends in a lone surrogate. GitHub issue, pull request and release titles carry emoji routinely; the reader sees U+FFFD — the black-diamond question mark — immediately before the ellipsis. Verified: a title of 69 ASCII characters followed by U+1F40B yields a string whose last code unit is 0xD83D. The same .length test also miscounted: an astral character was two characters toward the budget, so a 40-emoji title was treated as 80 characters and truncated at 35. Fix: one code-point-safe truncateChars in lib/truncate.ts, used by both surfaces. Character budgets and thresholds are unchanged (70 for the ticker; cut at 140, keep 137 for roadmap notes), so nothing but the broken cut moves. Also corrected a false comment in summarizeReleaseBody: it claimed to strip trailing emoji, which it has never done. Evidence: lib/truncate.test.ts. Restoring value.slice(...) in the helper fails "never splits an astral character in half" (a lone surrogate survives the well-formed-pair filter) and "counts code points, not UTF-16 code units". The last case pins both call sites onto the shared rule. npm test 322 passed, npm run lint clean, npx tsc --noEmit clean. Implemented with agent assistance. Signed-off-by: Hunter Bown <hmbown@gmail.com> | 2 months ago | |
feat(web): put contributors on the homepage wire The ticker printed ISS #1234 title · 3h for whatever the issues and pulls endpoints last touched. It proved the repo was awake and nothing else: no merges, no releases, no names, and English chrome on nine translated pages. It now reports events, in the reader's language, with the person who did the work named: - Merged pull requests carry the contributor's handle. merged_at, author_association, and the login all arrive in the list payload we already fetch, so naming @bistack or @shenjackyuanjie beside their merge costs nothing extra. - Opened and closed issues carry who filed them. - Releases appear. That is the one added endpoint — /releases?per_page=5, cached an hour, ~1 request/hour. Three cached calls total, ~13 req/h unauthenticated against GitHub's 60/h/IP, and no per-item follow-ups. - GitHub's own FIRST_TIME_CONTRIBUTOR verdict marks a newcomer's contribution. Copied verbatim, never inferred from the size of the window we happened to fetch, and it stops on its own as GitHub recomputes it. Two honesty fixes the live render forced: Each verb is now dated by its own event — merged_at, closed_at, published_at — not by updatedAt. An issue opened in March and commented on this morning was reading as "opened, 12 minutes ago". Drafts are gone from the strip. A draft is its author's own not-ready marker, and on this repo agents open them in batches: five of the twenty items in the first live check were draft PRs from one bot, crowding out the merges. They return the moment they are opened or merged. A busy week could also bury the newest release entirely, so a release published in the last sixty days keeps a slot — carrying its real date, so a quiet quarter still reads as a quiet quarter rather than pinning an old tag beside today's merges. Verbs, the by-line, the first-contribution mark, and the strip's aria-label are dictionary keys in all ten locales; titles, tags, and handles are the repository's own record and stay verbatim. Ages format through CLDR off the locale's existing dateLocale, the same way the masthead already sets its date, with the compact English form as fallback where Intl data is missing. Empty stays empty: an unreachable or fully-filtered feed removes the strip rather than rendering a skeleton. Reduced motion now lets the frozen track scroll instead of clipping every entry past the fold. Verified: tsc, check:locales, check:facts, check:docs, 248 tests, lint, and a 288-page production build all clean. Live next dev against the real repo rendered 15 entries on /en and /zh — merges by @Inference1 and @h3c-hexin, issues by @vFONGv, @bistack, @shenjackyuanjie, @rafaelcavalheri, the v0.9.3 release, Chinese verbs and relative times throughout. Pointed at an unreachable repo, both locales render fully with no ticker and no leaked dictionary tokens. | 3 months ago | |
feat(web): build the website on design tokens 2.3.0, the desktop app's system The site painted with the Moda brand kit (navy grounds, signal-blue actions) over tokens 1.1.2, while the desktop app, web app and mobile run tokens 2.3.0 (pearl and charcoal grounds, ink filled actions, one slate accent). Founder direction 2026-10-27: one design system on every surface. This supersedes the 2026-10-11 Moda-kit color decision (web/docs/BRAND_COLOR_MAPPING.md is rewritten to say so). - vendor/codewhale-design is synced to 2.3.0 with codewhale-design's scripts/sync-to.sh (generate.py --check passes). Only scripts/export-design-tokens.py reads it in this repository. - The exporter now emits the 2.x roles (accent distinct from hover, ocean_depth, diff_add, diff_remove) and the type roles, motion durations and loops, easing curves, popover and dialog elevation, breakpoints and the logo ombre as --gpui-* custom properties. - tokens-roles.css names every site role as a var(--gpui-*): light, pinned dark and the stage (footer and install band, the dark set in both appearances). Type, spacing, radius and motion roles bind to the tokens; the fluid editorial display sizes stay as the site's own layout. The logo blues remain only on the whale and the mark. - The home proof strip keeps the release, source marker, licence and live contributor count; the source-tree tool and provider-route counts are removed, because a source count is not a released total (lib/public-copy.test.ts) and marketing asked for no provider count. - The locale layout comment no longer claims the site follows the OS appearance; it is light unless dark is pinned. - Contract tests that pinned the Moda kit inks, the blue sea and tide ramps and literal easing/prose sizes now assert the token roles instead; the WCAG AA check over every ink and ground in every scheme is unchanged and passes. Verified: check:latest-release, prebuild, check:docs PASS, check:tokens up to date (158 tokens), eslint clean, tsc --noEmit clean, check:locales PASS, next build compiled with 1011/1011 static pages. vitest: 770 passed, 1 failed: docs-ia sitemap count (112 vs 110) comes from the unpushed local /enterprise commit a6b26b5c3e, not from this change. check:facts fails in this checkout because its tree is behind origin/main's regenerated feature registry; not touched here. Screenshots (1440 and 390, light and pinned dark, home, product, docs, install): artifacts/design-20261027/after-tokens-2.3.0/. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 12 days ago | |
Update the remaining website privacy test consumer Use WEBSITE_USAGE_DISCLOSURE.body after the canonical legal adapter retired PRIVACY_SECTIONS. Preserve all assertions for actual counters and English/Chinese disclosure. Verification: original exact-wave test reproduces undefined.find; corrected usage/legal/telemetry tests 34 pass, 0 fail; scoped TypeScript check pass. Independent root usage test 8 pass, 0 fail. Local focused proof only; hosted CI pending. Source commit: 4c99a3f1a1b9e8bb5b87ae8a9bcb6fa6c12809a1. Only this verified blob integrated; shared checkout and index left unchanged. No deploy. Signed-off-by: CodeWhale Bot <noreply@codewhale.net> | 1 month ago | |
feat(web): the homepage whale starts as the mark and comes alive as lights [skip ci] The codewhale.net hero now tells the living mark's story with its existing, owner-approved pieces: the flat C-curl mark (drawn by the vendored kit's WhaleRig.build("mark") in brand navy #142352, reversed on dark) holds for 700 ms, the live canvas whale fades in as the colored-in whale for 2.4 s, then 64 beads of light assemble head first and keep breathing, swimming, hovering and carrying a soft light crest at 12 paints per second. Pointing at it, or picking a terminal view (the existing cueWhale path), brings the whale back; it returns to lights 600 ms after the pointer leaves or 15 s after a pick. The intro plays once per browser session. The canvas whale sleeps (no frames) while the lights show; the lights pause when off screen or hidden. Under reduced motion the hero keeps the still whale and draws no lights. Before the client decides, the hero is hidden briefly so the character no longer flashes before the mark; without JavaScript it appears after 1.2 s. The beads come from web/vendor/whale-lights/whale-lights.json, an unchanged copy of codewhale-app assets/whale-lights.json at 55c9ba0c (SHA-256 recorded), the same file crates/tui-kit pins for the terminal. web/lib/whale-lights.ts restates the app's drift, crest and seeded-star formulas (about 60 lines) because the app source is private (CURRENT_DECISIONS 44); PROVENANCE says to change the three together. lib/whale-motion.ts exposes the vendored WhaleRig. Verified: tsc --noEmit clean; ESLint clean on the five changed TS/TSX files; vitest 74 files, 770 tests passed (design-grammar contract included, which moved the new timings onto the spring tokens and the fallback keyframe behind a motion preference). next dev on 3241 in the browser pane and in Electron's Chromium via Playwright: stages mark (0.3 s) -> whale (0.9-1.7 s) -> lights (3.3 s+), beads move between reads, no console errors; with reducedMotion reduce the stage stays whale, lights are display:none and nothing moves. Not deployed; codewhale.net is unchanged until a founder-authorized deploy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 1 day ago | |
feat(web): the homepage whale starts as the mark and comes alive as lights [skip ci] The codewhale.net hero now tells the living mark's story with its existing, owner-approved pieces: the flat C-curl mark (drawn by the vendored kit's WhaleRig.build("mark") in brand navy #142352, reversed on dark) holds for 700 ms, the live canvas whale fades in as the colored-in whale for 2.4 s, then 64 beads of light assemble head first and keep breathing, swimming, hovering and carrying a soft light crest at 12 paints per second. Pointing at it, or picking a terminal view (the existing cueWhale path), brings the whale back; it returns to lights 600 ms after the pointer leaves or 15 s after a pick. The intro plays once per browser session. The canvas whale sleeps (no frames) while the lights show; the lights pause when off screen or hidden. Under reduced motion the hero keeps the still whale and draws no lights. Before the client decides, the hero is hidden briefly so the character no longer flashes before the mark; without JavaScript it appears after 1.2 s. The beads come from web/vendor/whale-lights/whale-lights.json, an unchanged copy of codewhale-app assets/whale-lights.json at 55c9ba0c (SHA-256 recorded), the same file crates/tui-kit pins for the terminal. web/lib/whale-lights.ts restates the app's drift, crest and seeded-star formulas (about 60 lines) because the app source is private (CURRENT_DECISIONS 44); PROVENANCE says to change the three together. lib/whale-motion.ts exposes the vendored WhaleRig. Verified: tsc --noEmit clean; ESLint clean on the five changed TS/TSX files; vitest 74 files, 770 tests passed (design-grammar contract included, which moved the new timings onto the spring tokens and the fallback keyframe behind a motion preference). next dev on 3241 in the browser pane and in Electron's Chromium via Playwright: stages mark (0.3 s) -> whale (0.9-1.7 s) -> lights (3.3 s+), beads move between reads, no console errors; with reducedMotion reduce the stage stays whale, lights are display:none and nothing moves. Not deployed; codewhale.net is unchanged until a founder-authorized deploy. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> | 1 day ago | |
web(brand): site role tokens, OG image and manifest paint with the Moda kit colors Replaces the gpui/ocean hex roles in tokens-roles.css with --kit-* (the kit's 25 originals); mapping and contrast in web/docs/BRAND_COLOR_MAPPING.md. tokens.css (generated from the palette crate) is untouched and unused by the site. Contract tests updated to assert kit inks. vitest 772/772 passed, tsc clean, lint 0 errors, check:tokens, check-locales, check-facts pass. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> | 28 days ago |
| Files | Last commit | Last update |
|---|---|---|
| 1 month ago | ||
| 1 day ago | ||
| 1 day ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 2 months ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 2 months ago | ||
| 27 days ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 1 month ago | ||
| 20 days ago | ||
| 1 month ago | ||
| 7 days ago | ||
| 7 days ago | ||
| 7 days ago | ||
| 7 days ago | ||
| 1 month ago | ||
| 7 days ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 7 days ago | ||
| 7 days ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 7 days ago | ||
| 18 days ago | ||
| 2 days ago | ||
| 1 month ago | ||
| 2 months ago | ||
| 2 days ago | ||
| 1 day ago | ||
| 3 months ago | ||
| 3 months ago | ||
| 20 days ago | ||
| 20 days ago | ||
| 2 days ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 7 days ago | ||
| 2 days ago | ||
| 2 days ago | ||
| 2 days ago | ||
| 20 days ago | ||
| 2 days ago | ||
| 8 days ago | ||
| 2 months ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 12 days ago | ||
| 2 days ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 2 days ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 3 months ago | ||
| 3 months ago | ||
| 2 months ago | ||
| 7 days ago | ||
| 20 days ago | ||
| 27 days ago | ||
| 1 day ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 20 days ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 3 days ago | ||
| 2 days ago | ||
| 27 days ago | ||
| 27 days ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 20 days ago | ||
| 20 days ago | ||
| 1 month ago | ||
| 2 days ago | ||
| 8 days ago | ||
| 2 days ago | ||
| 2 days ago | ||
| 2 months ago | ||
| 22 hours ago | ||
| 2 days ago | ||
| 30 days ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 2 months ago | ||
| 2 months ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 2 months ago | ||
| 8 days ago | ||
| 4 months ago | ||
| 4 months ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 1 month ago | ||
| 2 months ago | ||
| 3 months ago | ||
| 12 days ago | ||
| 1 month ago | ||
| 1 day ago | ||
| 1 day ago | ||
| 28 days ago |