Document Work and To-do as the two product concepts, synchronize every shipped locale, publish the six-tool and typed-image contracts, and keep static web generation offline while live GitHub chrome refreshes after deployment.
The previous commit added "including which role ran on which model" to the
resume bullet. Testing a real fleet run showed that is not true of the
Fleet ledger: `FleetTaskState` in `crates/tui/src/fleet/ledger.rs` carries
`entry`, `status`, `lifecycle_seq`, `leased_to`, `leased_at`, and
`completed_at` — no model, no provider, no route. A grep for `pub model` /
`pub provider` in that file returns zero.
The route *is* recorded, but by the sub-agent state
(`.codewhale/state/subagents.v1.json` holds
`runtime_profile.model = {fixed: "deepseek-v4-flash"}` and
`provider = "deepseek"`), which is a different system from `fleet.jsonl`.
Conflating the two put a claim in the README that the named artifact does
not back.
The rest of the fleet positioning stands and was verified in the same run:
spawning with only `type=scout` and no model resolved the scout profile's
pinned `deepseek-v4-flash` / `deepseek` route, with `permissions.write =
false`.
Reverted in English and all nine translations; re-stamped.
Assisted by Claude Code.
The README sold "any model, any provider" as *switching*: pick a provider,
pick a model, change it mid-task with `/model`. That undersells what the
runtime does. A saved role records its `provider`, `model`, and reasoning
tier explicitly, so roles in one fleet can run on different models from
different vendors in a single run — a cheap fast model directing an
expensive reasoning one, a GLM builder beside a Kimi reviewer.
That capability was documented in docs/FLEET.md (which even ships a
`provider = "zai"` / `model = "glm-5.2"` example) and absent from the front
door. `/fleet` was described as "runs a team of workers", which reads like
a thread pool rather than a team you compose.
Four changes, all prose:
- An intro paragraph stating the idea directly: you pick the model per
role, and they don't have to match.
- The first "What it does" bullet now says roles pin their route
explicitly, so a fleet can span vendors and a role's route does not
depend on whichever provider happens to be active.
- A new bullet for the other half — roles and the constitution are files
you author, so the harness matches your practice instead of ours.
- `/fleet` and the resume bullet name the per-role model.
Claims verified against `FleetProfileDraft` (`model`, `provider`,
`reasoning_effort` are per-profile fields) and docs/FLEET.md, not written
from the product pitch.
All nine translations updated in step and re-stamped; no new sections,
code blocks, or URLs, so the structural gates hold. Verified:
check-readme-translations.py, check-readme-locales.sh, 250 web tests,
check:docs.
Assisted by Claude Code.
The one-paragraph TUI tour in README.md and all nine translations taught two
false preconditions and the wrong verb for undo.
Tab: the README said "when the composer is idle". The gate is EMPTINESS, not
idleness — crates/tui/src/tui/ui.rs:6978 does `if !app.input.is_empty() {
continue; }` immediately before `app.cycle_mode()`, and the comment at
ui.rs:6974-6977 explicitly denies the idle/running distinction ("Tab is
completion when the composer has content and a mode switch only when it is
empty ... so Tab never changes roles based on whether a turn happens to be
running"). A user with typed text and no turn running got completion, not a
mode switch.
Shift+Tab: the README applied the same "idle" qualifier. Shift+Tab has no
composer precondition at all — ui.rs:6363-6367 gates only on the modal stack,
per the comment at ui.rs:6358-6359 ("Shift+Tab is a shell-level permission
control. Keep it live in the composer.").
/restore: "undoes a turn" conflated two commands and described neither. Bare
`/restore` lists snapshots and reverts nothing
(crates/tui/src/commands/groups/skills/restore.rs:33-42 returns
`format_listing(&snapshots)` and returns early); `/restore <N>` reverts
workspace files only ("conversation history is unchanged", restore.rs:104-108).
The verb that undoes a turn is `/undo`
(crates/tui/src/commands/groups/debug/undo.rs:9-16). The product's own help
string already had this right — crates/tui/locales/en.json:287.
Also in this commit, because the translation stamp couples them:
- docs/KEYBINDINGS.md:18 inherited the same wrong "idle" qualifier on the
Shift+Tab row; KEYBINDINGS.md:17 was already correct for Tab.
- README.id.md was stamped in sync but was missing the docs/AUTHORIZATION_ORDER
and docs/HOOKS "Learn more" bullets that README.md:87-92 and the other eight
translations carry, and its language switcher omitted Русский and Українська.
Provenance: 171f0b2a2 touched README.md plus the eight files in the checker's
TRANSLATIONS list and skipped README.id.md; 92128e669 then refreshed the stamp
wholesale, so the marker certified a sync that did not exist.
- scripts/check-readme-translations.py checked only eight of the nine shipped
translations. README.id.md was absent from both TRANSLATIONS and the
LANGUAGE_LINKS exemption set, which is exactly how the gap above survived CI.
Adding it makes the gate report "9 translations in sync".
- README.ru.md:24 listed [Українська](README.uk.md) twice.
The gate was already red before this commit: cc20f407f added the Discord link
and badge to README.md and to every translation body but never re-stamped, so
all eight checked files reported stale. All nine are now re-stamped to
sha256:a7f294018f28.
Verified: `python3 scripts/check-readme-translations.py` exit=0 ("9
translations in sync"), `bash scripts/check-readme-locales.sh` exit=0 (PASS).
Adds https://discord.gg/37gfS3ksug in the places someone actually looks for
a community: a badge in the first badge row and an entry on the language/link
line of all ten READMEs, a Discord action in the site nav beside the star
badge, an entry in the footer Project column, and a link in the homepage
community section.
"Discord" is a brand name, so it is a literal rather than a dictionary key —
it needs no translation and every routed locale gets the identical link shape.
The one exception is the zh README's nav line, which reads "Discord 社区" so
the word is a noun phrase in context rather than a bare English token.
docs-ia.test.ts pins the footer project routes in exact locale-swap parity, so
its expectation is extended rather than relaxed — a new footer link still has
to appear in every locale or the test fails.
Receipts: cd web && npx tsc --noEmit exit=0; npm test -> 28 files, 235 tests
passed; npm run lint exit=0.
Absorbs the lane's README.md changes into every locale: the
'codewhale account login' quickstart line (code blocks byte-identical to
English), the translated provider-vs-account authentication paragraph, the
docs/WORKFLOW_EXPERIMENTAL_SEARCH.md bullet, and the refreshed source
stamp (sha256:4d02e29bfb3a). check-readme-translations.py is clean.
No-Issue: mechanical translation sync for the release train (CI Lint gate).
Agent-assisted: translated per-locale with a Claude Code workflow fan-out.
https://claude.ai/code/session_01AAEuFJrqcMqF1oztnjZeMy
Publish the implemented authorization order and lock its precedence with regression coverage. Preserve the contributor's documentation, translation, and contract-test work.
README.ru.md and README.uk.md are full translations of README.md,
including the docs/HOOKS.md bullet the candidate added after the lane
forked. Every README's language nav gains the two links (each file omits
its own), and all eight translations are restamped against the new
README.md sha256.
check-readme-translations.py learns the two files in both TRANSLATIONS
and LANGUAGE_LINKS. `scripts/check-readme-translations.py` and
`scripts/check-readme-locales.sh` both pass.
Scope: this is the README half only — #4788/#4789 ship no fr/de/ca/id
READMEs and no marketing-site pages for those locales.
Harvested from the v0.9.2 localization lane (#3092, #4791).
Add the new TUI hooks documentation link to every complete README translation and advance their source stamps. Deterministic link and locale parity checks pass; native-speaker review remains a separate human gate.
Supersedes the previous simplification pass in this branch with a
stronger rewrite from a parallel session (PR #4746, branch
claude/github-readme-simplify-al6fi3): opens with the actual history
(native DeepSeek experience -> community-driven multi-provider harness)
instead of a slogan, researches the opencode/pi README register for
tone, and moves the feature list under a plain "What it does" heading
instead of bold marketing labels. Adopted verbatim (byte-identical,
including all 6 translations) since it lands the same brief better
than my first pass and matches the user's explicit direction, without
re-deriving the same research.
Also fixes the one JS/TS contract test the retired tagline broke
(web/lib/public-surface-contract.test.ts:145 pinned the literal phrase
"supported hosted and local models"): asserts the substantive
hosted-or-local claim instead of the exact retired marketing string.
Verified: full web vitest suite (136/136), both README CI gates
(check-readme-translations.py, check-readme-locales.sh).
The "Why Codewhale" bold-tagline bullet list and the hedge-heavy sandbox/
pricing paragraph read like generated landing-page copy, not a project
README. Folded the real facts (multi-provider, approval gating,
constitution.json write holds, fleet resume) into two plain paragraphs
and dropped the defensive edge-case detail (per-OS sandbox backend
enumeration, the "$0" pricing aside) that belongs in docs, not the
front page.
Retranslated the changed passages into all 6 shipped locales and
restamped each against the new README.md hash so
scripts/check-readme-translations.py stays green.
Derive website sandbox facts from explicit runtime capability markers instead of source filenames. Document actual platform wrappers, narrow model and audit claims, and make two-package/three-command installs exact.
Verify release assets under their manifest filenames before renaming them, with an executable contract test for every Unix snippet. Refresh localized README receipts and keep source-candidate toolCount at 66.
Signed-off-by: Hunter B <hmbown@gmail.com>
Label v0.9.1 as an unpublished source candidate while keeping v0.9.0 as the verified latest release. Correct channel and Android/Termux preview guidance, narrow model claims, synchronize localized README controls, and credit @fleitz for PR #4673/#4674 without rewriting contributor history.
Signed-off-by: Hunter B <hmbown@gmail.com>
* 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>
Rewrite the README top per the 0.9.1 public-surface brief: tagline, a
concrete first paragraph, three Why bullets (no lock-in, safe by
construction, work that survives), and the deepseek-tui origin line.
Fold the long What-it-does list into the Why bullets plus a short
Learn-more section that deep-links PROVIDERS, FLEET, and CONFIGURATION.
Port the changed hero and Learn-more sections into all six locale
READMEs and refresh their source stamps;
scripts/check-readme-translations.py passes. Star counts stay omitted
rather than hardcoded. No anti-cloud phrasing.
Prepared with agent assistance for the 0.9.1 public-surface pass.
Signed-off-by: Hunter B <hmbown@gmail.com>
Integrate the underwater TUI, message-first Operate, Fleet and Workflow reliability, expanded model/provider catalog, exact custom-route restoration, docs-first site, localization, packaging, and release metadata for the v0.9.0 candidate.
Harden endpoint-bound credential provenance, approval and goal UX, Fleet attempt fencing and crash recovery, large-workspace mention discovery, Kimi budgeting, and release asset/version gates. Include the stopship Fleet and Workflow fixtures used by release dogfood.
Verified with workspace fmt/check/clippy/tests on Rust 1.88, release-script and npm suites, 18-crate publish dry run, production web build, Docker build check, secret scan, dependency audit, and protected-state hash validation.
Rewrite the README in plain developer language — what it is, install, use,
what it does, how to contribute — with details linked out to docs and
codewhale.net. The contributor-culture section stays substantive: feedback
is a gift, harvested PRs keep credit, first-contribution paths explicit.
Translate it into 简体中文, 日本語, Tiếng Việt, 한국어, and (new) Español
and Português so every complete UI locale has a README. Each translation
carries a source stamp, and scripts/check-readme-translations.py — wired
into CI — fails whenever the English README changes without translations
following, or when code blocks, links, or section structure drift.
Machine translations follow each pack's terminology; flagged for native
review.
Make the repo self-explaining where the work happens: crates/tui/AGENTS.md
(shell grammar contract, l10n rules, PTY QA traps), crates/tui/locales/
AGENTS.md (pack parity discipline, translation conventions, how to add a
locale), web/AGENTS.md (derived facts, gate list). The blanket AGENTS.md
gitignore now carves out these maintained files.
Rewrite the 0.8.68 changelog section to cover the complete candidate —
the full underwater shell, streaming/repaint work, the exec JSONL fix,
the 104-key localization layer, harvests, and doc-status work — and
resync the packaged mirror.
Update workspace, npm, changelogs, docs, and generated site facts for the 0.8.68 release. Refresh the public mode and Workflow language to match the shipped Plan/Act/Operate surface.
Document /constitution as the primary personal constitution surface, with structured user-global constitution data rendered to prose, repo-local law as optional project policy, AGENTS.md as project instructions, and memory/handoffs below those layers.
Mark the full base-prompt Markdown override as expert-only and keep WHALE.md as deprecated migration-only guidance. Update README translations and the web constitution page so the docs map has localized coverage.
Tests: git diff --check; npm --prefix web run check:docs; npm --prefix web run lint; cargo fmt --all -- --check
Refs #3811. Refs #3412. Refs #3806.