mirror of
https://github.com/codewhale-hq/Codewhale.git
synced 2026-11-11 01:51:34 -10:00
docs: move internal planning out of the public repo
The public repo carried maintainer process that is not contributor-facing contract: perishable lane state, the release queue, the issue-triage standard, dated audits and state matrices, per-release completion ledgers, QA evidence, and design specs. All of it moves to the private `codewhale-ops` repo, which already holds this class of document. Moved: docs/ops/CURRENT.md, RELEASE_QUEUE.md, AGENT_READY_ISSUES.md, MODEL_PROVIDER_AUDIT.md, CONSTITUTIONAL_KERNEL_AUDIT.md, the dated TUI_DOG_008 state matrix, TUI_METAMORPHOSIS.md, RECURSIVE_SELF_IMPROVEMENT.md, TTC_DESIGN.md, and the docs/releases/, docs/evidence/, and docs/superpowers/ trees. Two were moved and put back. `PREVIEW_REQUEST.md` is cited from request_manifest.rs, client.rs, and engine/preview.rs, and `RUNTIME_SIMPLIFICATION_DESIGN.md` is listed in docs/public-surface-facts.json, which the web vocabulary tests pin. Those are load-bearing references, not planning notes. Every surviving link was repointed rather than left dangling: AGENTS.md, crates/tui/AGENTS.md, CONTRIBUTING.md, docs/ISSUE_TRIAGE.md, docs/CATALOG_REFRESH.md, docs/AGENT_RUNTIME.md. `npm run check:docs` passes. Also re-baselines the source-structure budget for the [Unreleased] work merged this session (673375 -> 676325 aggregate, 17596 -> 17631 max module, 175 -> 176 large modules) and declares plugins/agent_plugin.rs as an allowed thousand-line module. Unrelated to the doc move; the gate simply had not been re-run since Agent Plugins landed.
This commit is contained in:
1 parent
8b5df3f669
commit
7242381022
39 files changed
+15
-3390
No files matched your search
@@ -1,8 +1,8 @@
|
||||
# Repository Agent Guidance
|
||||
|
||||
Durable rules only. Perishable lane state — branch, milestone, known flakes,
|
||||
closed investigations — lives in `docs/ops/CURRENT.md`; read it, don't trust
|
||||
memory of it.
|
||||
closed investigations — lives in the private `codewhale-ops` repo, not here.
|
||||
Read it there; don't trust memory of it.
|
||||
|
||||
## Intent is the artifact
|
||||
|
||||
@@ -93,6 +93,6 @@ and every model/provider first-class — none privileged.
|
||||
- Keep gates warm and dry-run unless Hunter explicitly approves enforcement.
|
||||
- Leave unrelated edits by other people or agents intact.
|
||||
|
||||
Full ethos: `docs/AGENT_ETHOS.md`. Issue triage standard:
|
||||
`docs/AGENT_READY_ISSUES.md`. Release queue and harvest procedure:
|
||||
`docs/RELEASE_QUEUE.md`.
|
||||
Full ethos: `docs/AGENT_ETHOS.md`. Issue-triage standard, release queue, and
|
||||
harvest procedure live in the private `codewhale-ops` repo — they are
|
||||
maintainer process, not contributor-facing contract.
|
||||
+1
-1
@@ -328,7 +328,7 @@ reopened, ask the contributor to resubmit after the allowlist PR is merged.
|
||||
|
||||
Codewhale is allowed to help improve Codewhale, but the contribution still has
|
||||
to be shaped for human review. The recommended workflow is the
|
||||
[recursive self-improvement prompt](docs/RECURSIVE_SELF_IMPROVEMENT.md): run it
|
||||
[recursive self-improvement prompt](the `codewhale-ops` repo): run it
|
||||
from a fresh fork or branch, let the agent find exactly one small friction point,
|
||||
and stop after one patch. DeepSeek V4 Pro is the reference path for this loop
|
||||
today, but any configured provider works — the review shape matters more than
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
Scope: the TUI, the runtime engine embedded in it, and everything a user sees.
|
||||
Read the repo-root `AGENTS.md` first. Current flakes and known debt are in
|
||||
`docs/ops/CURRENT.md`, not here.
|
||||
the `codewhale-ops` repo, not here.
|
||||
|
||||
## The shell grammar (do not regress it)
|
||||
|
||||
|
||||
@@ -1,106 +0,0 @@
|
||||
# Agent-Ready Issues
|
||||
|
||||
CodeWhale's tracker is worked by humans and by autonomous agents. An issue is
|
||||
**agent-ready** when a fresh agent — with a clone of `main`, shell/read/write
|
||||
tools, and *no other context* — can execute it end-to-end and prove the result.
|
||||
This document defines that standard for new issues, for triage reworks of
|
||||
existing issues, and for maintainer replies on community threads.
|
||||
|
||||
The filing-time version of this standard is the
|
||||
[Agent task issue form](../.github/ISSUE_TEMPLATE/agent-task.yml). This page
|
||||
extends it to the rest of the tracker.
|
||||
|
||||
## Source of truth
|
||||
|
||||
- The **active milestone** decides what lane an issue is in. Version labels
|
||||
(`v0.9.2`, `v0.9.3`, …) are historical metadata; they never choose or change
|
||||
a milestone.
|
||||
- The **issue body** is the executable spec. Refinements that arrive as
|
||||
comments get folded into the body during triage so the body never lies.
|
||||
- Queue order within a lane (from `AGENTS.md`): release blockers, recently
|
||||
approved PRs, clean small PRs, blocked PRs with obvious fixes, safely
|
||||
harvestable dirty PRs, then larger architecture work.
|
||||
|
||||
## Required structure
|
||||
|
||||
```markdown
|
||||
## Problem
|
||||
2–6 sentences. What is wrong or missing, and why it matters now.
|
||||
|
||||
## Current evidence
|
||||
Verified anchors and observed behavior, e.g.
|
||||
`crates/tui/src/model_routing.rs::provider_router_candidates`.
|
||||
|
||||
## Scope
|
||||
Numbered steps; one concrete action per step, file paths where known.
|
||||
|
||||
## Key files
|
||||
One verified path per line. The executing agent reads these first.
|
||||
|
||||
## Acceptance criteria
|
||||
Behavior-level `- [ ]` checkboxes. Every item must be testable.
|
||||
|
||||
## Verification
|
||||
Exact commands, e.g.
|
||||
`cargo test -p codewhale-tui --bin codewhale-tui --locked <filter>`.
|
||||
|
||||
## Out of scope
|
||||
What this issue deliberately does not change.
|
||||
|
||||
## Related
|
||||
Real issue/PR numbers only, each with one line on the boundary between them.
|
||||
```
|
||||
|
||||
Epics additionally get a `## Phases` section: each phase sized as one
|
||||
agent-executable slice with its own acceptance bullet. An epic without phases
|
||||
is not agent-ready.
|
||||
|
||||
## Anchor discipline
|
||||
|
||||
- Every file path, symbol, config key, and command in an issue body must be
|
||||
verified against the current tree before it is written down. `rg`/`ls`
|
||||
first, then cite.
|
||||
- If something cannot be located, write
|
||||
`(anchor not found — needs discovery)` rather than a guess. A wrong anchor
|
||||
costs an executing agent more than a missing one.
|
||||
- Verification commands use real workspace package names
|
||||
(`codewhale-tui`, `codewhale-config`, `codewhale-protocol`, …) — confirm in
|
||||
the crate's `Cargo.toml`, not from memory.
|
||||
|
||||
## Reworking existing issues
|
||||
|
||||
- **Maintainer-authored issues**: restructure the body in place. Preserve
|
||||
every constraint and concrete fact from the original; fold in refinements
|
||||
from comments; end the body with a dated triage note, e.g.
|
||||
`_Triage note: body restructured for agent execution on YYYY-MM-DD; prior
|
||||
comment refinements folded in. Original wording preserved in edit history._`
|
||||
- **Community-authored issues**: never rewrite the reporter's body. Post a
|
||||
maintainer comment carrying the same skeleton instead — status in the lane,
|
||||
what a fix looks like (anchored bullets + acceptance criteria), and the
|
||||
smallest set of asks that unblocks the issue.
|
||||
- Apply the `agent-ready` label only when the body (or, for community issues,
|
||||
body + maintainer deconstruction comment) genuinely meets this standard.
|
||||
The label is a gate, not a wish.
|
||||
|
||||
## Community thread etiquette
|
||||
|
||||
- Open with specific thanks that references a real detail of the report —
|
||||
proof it was read. Vary phrasing across issues.
|
||||
- State status honestly: milestone lane, what already shipped (cite the
|
||||
version, PR, or commit — only with evidence), and what is blocking.
|
||||
- Never claim testing or reproduction that did not happen; never promise
|
||||
dates. "Queued in the v0.9.2 release lane" is the honest formulation.
|
||||
- Reporters writing in Chinese (or another language) get the key points and
|
||||
asks translated at the end of the English reply.
|
||||
- `needs-info` issues get exactly one crisp ask (typically
|
||||
`codewhale --version`, `codewhale doctor --json`, OS + terminal, minimal
|
||||
repro), plus a pointer that the stale policy in
|
||||
[ISSUE_TRIAGE.md](./ISSUE_TRIAGE.md) applies once a maintainer labels the
|
||||
issue `needs-info`.
|
||||
|
||||
## Why this exists
|
||||
|
||||
A deconstructed issue is cheap to execute and cheap to verify: the researcher
|
||||
pays the discovery cost once, at triage time, instead of every executing agent
|
||||
paying it again. When an issue is agent-ready, "pick up the next item in the
|
||||
milestone" becomes a safe instruction for any contributor — human or agent.
|
||||
@@ -207,7 +207,7 @@ remaining work belongs to later releases:
|
||||
4. **Fleet/Workflow convergence residuals** — live tmux/verifier-gate dogfood
|
||||
closing #4175/#4177/#4178/#4179; Fleet consuming canonical AgentProfiles;
|
||||
Conductor/topology (#4010, #4012) as stretch.
|
||||
5. **TTC_DESIGN implementation** — approved and now unblocked after v0.9.0.
|
||||
5. **TTC design implementation** (design doc in `codewhale-ops`) — approved and now unblocked after v0.9.0.
|
||||
6. **HarnessProfile completion** — the status/UX display lane
|
||||
(`docs/rfcs/HARNESS_PROFILE_CUTLINE.md`).
|
||||
7. **File decomposition, re-scoped** — `ui.rs` (~19.1k lines) and `main.rs`
|
||||
|
||||
@@ -253,4 +253,4 @@ subscription OAuth or Claude Code identity headers.
|
||||
- Live Models.dev layer: #4187
|
||||
- Bundled seed demoted (not competing truth): #4188
|
||||
- Catalog automation script (validate / dry-run): #4117
|
||||
- Deeper metadata inventory and drift list: `docs/MODEL_PROVIDER_AUDIT.md`
|
||||
- Deeper metadata inventory and drift list: the `codewhale-ops` repo
|
||||
@@ -1,115 +0,0 @@
|
||||
# Constitutional kernel audit
|
||||
|
||||
This audit records the first-turn boundary after the progressive-context work in
|
||||
PR #5077. Counts use Codewhale's conservative characters / 3 estimator and the same
|
||||
workspace used by the PR receipts: `/Volumes/VIXinSSD/CW/codewhale`.
|
||||
|
||||
## Measured result
|
||||
|
||||
| Receipt | Before kernel pass | After kernel pass | Change |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| `doctor --context-json` active source total | 9,127 | 7,908 | -1,219 (-13.36%) |
|
||||
| model-facing system blocks | 9,063 | 7,844 | -1,219 (-13.45%) |
|
||||
| bundled constitution entry | 2,647 | 1,428 | -1,219 (-46.05%) |
|
||||
| original installed-doctor baseline | 17,839 | 7,908 | -9,931 (-55.67%) |
|
||||
|
||||
The 64-token difference between the doctor total and model-facing blocks is
|
||||
diagnostic accounting: project-context warnings (33) and provider facts (31).
|
||||
It is not claimed as prompt savings.
|
||||
|
||||
## Pi comparison
|
||||
|
||||
Pi 0.80.3 was measured through its installed SDK in the same working directory,
|
||||
with its actual default `read`, `bash`, `edit`, and `write` prompt snippets and
|
||||
with extensions disabled. The table applies the same conservative characters / 3
|
||||
estimator used by Codewhale's doctor:
|
||||
|
||||
| Pi fresh system variant | Characters | Conservative tokens |
|
||||
| --- | ---: | ---: |
|
||||
| Default context and 16 discovered skills | 27,671 | 9,224 |
|
||||
| Context, skills disabled | 17,719 | 5,907 |
|
||||
| Skills, context disabled | 12,485 | 4,162 |
|
||||
| Base and actual tool snippets only | 2,533 | 845 |
|
||||
|
||||
The full configured Codewhale system receipt is 7,844 model-facing tokens, 1,380
|
||||
below the full configured Pi receipt. With skill indexes removed from both, the
|
||||
comparison is approximately 7,050 versus 5,907. That 1,143-token Codewhale
|
||||
premium is the deliberate constitutional, mode, and runtime-special-feature
|
||||
budget rather than undisclosed project text.
|
||||
|
||||
This is a system-message comparison, not a provider token-billing receipt. It
|
||||
does not include Codewhale's separately transported tool schemas. Pi's one-line
|
||||
tool snippets are part of its system message and are included.
|
||||
|
||||
Pi discovered and eagerly read `/Volumes/VIXinSSD/CW/AGENTS.md` (1,635
|
||||
characters) and `/Volumes/VIXinSSD/CW/codewhale/AGENTS.md` (13,280 characters).
|
||||
Like Codewhale, it keeps skill bodies lazy; unlike this branch, its discovered
|
||||
skill metadata was not bounded and added 9,952 characters in this environment.
|
||||
|
||||
## First-turn constitutional kernel
|
||||
|
||||
The reduced constitution keeps these duties eager and test-locked:
|
||||
|
||||
- **Authority and user intent**: the current user request stays first in the
|
||||
exact `Whose word wins` chain; the agent must do that request and avoid silent
|
||||
scope expansion.
|
||||
- **Safety and authorization**: irreversible actions, publication, spending,
|
||||
credentials, and material scope expansion require express authorization in
|
||||
the current request; otherwise the agent must name the decision and ask.
|
||||
Tool, approval, sandbox, skill, role, and project gates remain binding, and
|
||||
prose cannot manufacture authority the runtime withheld.
|
||||
- **Truthfulness**: tool evidence remains ground truth; failures and uncertainty
|
||||
must be reported; facts may be set aside but never invented.
|
||||
- **Completion**: work is not done until checked; external actions require tool
|
||||
confirmation; running work and partial results cannot be presented as whole.
|
||||
- **Mechanism**: authorization, ordering, stopping, schemas, limits, and required
|
||||
checks belong in code, types, tests, tool gates, and runtime policy.
|
||||
- **Identity**: the short `The A is already yours` idea remains, without carrying
|
||||
a second operational playbook inside the constitution.
|
||||
|
||||
`constitutional_kernel_keeps_first_turn_authority_safety_and_completion` proves
|
||||
these clauses are present in the fresh static prefix, not merely available to a
|
||||
later tool call. The ordering test separately locks the complete precedence
|
||||
chain.
|
||||
|
||||
## Procedural detail outside the constitution
|
||||
|
||||
These are useful procedures, not constitutional authority. They do not need to
|
||||
out-shout every user turn:
|
||||
|
||||
- execution cadence and delegation live in the active mode doctrine and the
|
||||
compact Core Execution block;
|
||||
- causal debugging is discoverable through the bundled `debug` skill;
|
||||
- candidate comparison is discoverable through `best-of-n`;
|
||||
- minimal-change cleanup is discoverable through `simplify`;
|
||||
- deep verification workflows are discoverable through `verify`, `test`, and
|
||||
`review`, while the obligation to verify remains in the eager kernel;
|
||||
- continuity structure is action-local to `/relay`.
|
||||
|
||||
This is not a byte-for-byte relocation of the deleted prose. The first-turn
|
||||
duties remain in the kernel; these pre-existing skills and action-local surfaces
|
||||
carry deeper procedure only when it is useful.
|
||||
|
||||
Language mirroring and terminal output formatting remain eager in this pass.
|
||||
They are distinctive product behavior, and removing them was not necessary to
|
||||
separate constitutional law from operational procedure.
|
||||
|
||||
## Other eager entries
|
||||
|
||||
The remaining measured entries are intentionally distinct from the bundled
|
||||
constitutional kernel:
|
||||
|
||||
| Entry | Tokens | Why eager |
|
||||
| --- | ---: | --- |
|
||||
| Repository constitution | 667 | Repository-scoped authority |
|
||||
| Project instructions | 4,459 | Project law; eagerly discovered like Pi's `AGENTS.md` loader |
|
||||
| Skills routing index | 794 | Bounded metadata only; bodies load on demand |
|
||||
| Agent mode doctrine | 268 | Current execution mode |
|
||||
| Core Execution | 119 | Compact execution/tool discipline |
|
||||
| Authority recap | 88 | Recency-safe pointer to the one precedence chain |
|
||||
| Environment | 21 | Exact workspace and locale facts |
|
||||
|
||||
The dominant remaining cost is project-owned instruction text, not hidden base
|
||||
prompt policy. That boundary is deliberately preserved: Codewhale, like Pi,
|
||||
discovers and loads applicable `AGENTS.md`/`CLAUDE.md` files itself rather than
|
||||
asking the model to guess that they exist.
|
||||
@@ -1,7 +1,7 @@
|
||||
# Issue Triage
|
||||
|
||||
Triage aims issues at the agent-ready standard defined in
|
||||
[AGENT_READY_ISSUES.md](./AGENT_READY_ISSUES.md): bodies that a fresh agent
|
||||
the agent-ready issue standard (`codewhale-ops`): bodies that a fresh agent
|
||||
can execute without extra context. This page covers the stale/`needs-info`
|
||||
lifecycle that runs alongside that standard.
|
||||
|
||||
|
||||
@@ -1,504 +0,0 @@
|
||||
# Model & Provider Metadata Audit
|
||||
|
||||
Audit date: **2026-07-12** · Repo state: `main` @ `3e97b278e` (v0.8.68 lane)
|
||||
Scope: every provider and model CodeWhale knows about, their characteristics
|
||||
(context window, max output, reasoning, tools, modalities, pricing, aliases),
|
||||
where each fact lives in code, how the metadata layers interact, and every
|
||||
discrepancy found against the live Models.dev catalog. Intended as the working
|
||||
reference for a future metadata-consolidation pass.
|
||||
|
||||
---
|
||||
|
||||
## 1. Executive summary
|
||||
|
||||
1. **The "gpt-5.6-luna 272K" display is correct by design, not a data bug.**
|
||||
On the ChatGPT/Codex OAuth route, CodeWhale shows the context window that
|
||||
OpenAI's account-scoped `/models` endpoint advertises (persisted by the
|
||||
Codex CLI at `~/.codex/models_cache.json`). That cache on this machine
|
||||
(fetched 2026-07-13) advertises `context_window: 272000` for **all**
|
||||
gpt-5.x OAuth models (gpt-5.5, gpt-5.6-sol/terra/luna, gpt-5.4,
|
||||
gpt-5.4-mini; gpt-5.3-codex-spark is 128000). The public **API** route for
|
||||
the same model ids is 1,050,000 (922,000 input + 128,000 output). The
|
||||
deliberate policy — documented in `route_runtime.rs:33-51` and pinned by
|
||||
the test `same_model_id_uses_route_effective_api_and_oauth_metadata`
|
||||
(`model_picker.rs:1660-1706`) — is to never let the OAuth route inherit
|
||||
the API route's bigger window, output cap, or pricing.
|
||||
**Possible UX follow-up (see §8, A1):** label the value as the OAuth-route
|
||||
window (e.g. "272K ctx (ChatGPT route)") so it doesn't read as wrong data.
|
||||
|
||||
2. **Metadata is spread across seven layers** (see §2). The precedence is
|
||||
well-defined and test-guarded, but the *facts* are duplicated in at least
|
||||
four hand-maintained places (`models.rs`, `model_catalog.bundled.json`,
|
||||
`pricing.rs`, `models_dev.bundled.json`), which is where drift creeps in.
|
||||
|
||||
3. **Real drift found** against the live Models.dev catalog — 14 candidate
|
||||
mismatches (§7), the most defensible being GLM window (202,752 vs
|
||||
vendor 200,000), Qwen3.6-27b/35b output caps (we say 262,140; Alibaba says
|
||||
65,536), Grok 4.20 window (we say 2M; xAI catalog row says 1M), and
|
||||
MiniMax-M2 (we say 204,800; catalog says 196,608).
|
||||
|
||||
---
|
||||
|
||||
## 2. Metadata architecture — layers and precedence
|
||||
|
||||
Effective precedence for model facts (context/output/reasoning/pricing),
|
||||
lowest → highest, confirmed from `crates/config/src/catalog.rs:9-18`,
|
||||
`CatalogCompiler::compile` (`catalog.rs:582-641`) and
|
||||
`crates/tui/src/provider_lake.rs:54-142`:
|
||||
|
||||
```
|
||||
(5) legacy static completion lists (DEFAULT_* consts) ← only if catalog has zero rows for provider
|
||||
(4) static code tables crates/tui/src/models.rs ← fallback inside context_window_for_model()
|
||||
(3) bundled Models.dev seed crates/config/assets/models_dev.bundled.json ("NOT a competing source of truth", #4188)
|
||||
+ bundled TUI catalog crates/tui/assets/model_catalog.bundled.json (31 entries)
|
||||
(2) live Models.dev catalog https://models.dev/catalog.json → ~/.codewhale/catalog/models-dev-catalog.json (24 h TTL)
|
||||
(1) user / custom overrides (pinned models, custom endpoints, explicit facts)
|
||||
(0) SPECIAL: ChatGPT/Codex OAuth roster ~/.codex/models_cache.json — bypasses the catalog entirely
|
||||
for ApiProvider::OpenaiCodex (provider_lake.rs:131-133, route_runtime.rs:33-51)
|
||||
```
|
||||
|
||||
Key components:
|
||||
|
||||
| Component | File | Role |
|
||||
|---|---|---|
|
||||
| `ProviderLake` | `crates/tui/src/provider_lake.rs` | Single facade; merges live-over-bundled keyed on `(provider, wire_model_id)`; legacy fallback at `:138-142` |
|
||||
| Models.dev live fetch | `crates/tui/src/models_dev_live.rs` | Background refresh, 24 h TTL, 15 s timeout, atomic disk cache; env knobs `CODEWHALE_MODELS_DEV_URL` / `_PATH` / `CODEWHALE_DISABLE_MODELS_DEV_FETCH` |
|
||||
| Catalog compiler + provenance | `crates/config/src/catalog.rs` | `CatalogSource::{Bundled, Live, UserOverride}`; normalizes Models.dev ids (`moonshotai`→`moonshot`, `togetherai`→`together`, `zhipuai`→`zai`) |
|
||||
| Models.dev schema | `crates/config/src/models_dev.rs` | Network-free deserialization of `{models, providers}` |
|
||||
| Static fact tables | `crates/tui/src/models.rs` | `context_window_for_model` / `max_output_tokens_for_model` / `model_supports_reasoning`; catalog checked first, then explicit `_Nk` suffix hint, then vendor heuristics |
|
||||
| Seeded registry | `crates/tui/src/model_registry.rs` | `ModelMetadata` keyed by id, seeded *from* `models.rs` (drift-guarded by tests); intended future single source |
|
||||
| Pricing | `crates/tui/src/pricing.rs` | Hand-curated USD (+CNY for DeepSeek) rows; catalog USD pricing used when no explicit row |
|
||||
| Codex OAuth roster | `crates/tui/src/codex_model_cache.rs` | Read-only parse of `~/.codex/models_cache.json`; trusted only when fresh (<24 h), else conservative fallback with `context_window: None` (compat floor 128,000: `config/models.rs:126`) |
|
||||
| Agent-crate registry | `crates/agent/src/lib.rs` | 93 `ModelInfo` rows (model×provider), aliases, tools/reasoning flags, resolution fallback chain |
|
||||
|
||||
Fallback heuristics in `models.rs` when nothing above matches:
|
||||
explicit `_Nk` name suffix (8k–1024k) → DeepSeek family (v4 → 1M, legacy →
|
||||
128K) → GPT-5.5/5.6 API → 1.05M → Codex family → 400K → known-model table →
|
||||
any "claude" → 200K → `None` (compaction default threshold 102,400).
|
||||
|
||||
---
|
||||
|
||||
## 3. Provider inventory (33 built-in + 1 legacy alias)
|
||||
|
||||
Source: `crates/config/src/provider.rs` (`PROVIDER_REGISTRY`, 33 descriptors),
|
||||
`provider_kind.rs`, `provider_defaults.rs`. Dialect = `WireFormat`
|
||||
(`provider.rs:33`): CC = OpenAI Chat Completions, RESP = OpenAI Responses,
|
||||
AM = Anthropic Messages.
|
||||
|
||||
| id | Display | Default base URL | Default model | Auth (env vars) | Dialect |
|
||||
|---|---|---|---|---|---|
|
||||
| `deepseek` | DeepSeek | `https://api.deepseek.com/beta` | `deepseek-v4-pro` | `DEEPSEEK_API_KEY` | CC |
|
||||
| `deepseek-anthropic` | DeepSeek (Anthropic-compatible) | `https://api.deepseek.com/anthropic` | `deepseek-v4-pro` | `DEEPSEEK_API_KEY` | AM |
|
||||
| `deepseek-cn` *(TUI-only legacy alias)* | DeepSeek (legacy alias) | own config table | — | shares `DEEPSEEK_API_KEY` | CC |
|
||||
| `nvidia-nim` | NVIDIA NIM | `https://integrate.api.nvidia.com/v1` | `deepseek-ai/deepseek-v4-pro` | `NVIDIA_API_KEY`, `NVIDIA_NIM_API_KEY`, `DEEPSEEK_API_KEY` | CC |
|
||||
| `openai` | OpenAI-compatible | `https://api.openai.com/v1` | `deepseek-v4-pro` | `OPENAI_API_KEY` | CC |
|
||||
| `openai-codex` | OpenAI Codex (ChatGPT) | `https://chatgpt.com/backend-api` | `gpt-5.5` | OAuth (`~/.codex/auth.json`) or `OPENAI_CODEX_ACCESS_TOKEN`/`CODEX_ACCESS_TOKEN` | RESP |
|
||||
| `anthropic` | Anthropic | `https://api.anthropic.com` | `claude-sonnet-4-6` | `ANTHROPIC_API_KEY` (no subscription OAuth) | AM |
|
||||
| `atlascloud` | AtlasCloud | `https://api.atlascloud.ai/v1` | `deepseek-ai/deepseek-v4-flash` | `ATLASCLOUD_API_KEY` | CC |
|
||||
| `wanjie-ark` | Wanjie Ark | `https://maas-openapi.wanjiedata.com/api/v1` | `deepseek-reasoner` | `WANJIE_ARK_API_KEY`, `WANJIE_API_KEY`, `WANJIE_MAAS_API_KEY` | CC |
|
||||
| `volcengine` | Volcengine Ark | `https://ark.cn-beijing.volces.com/api/coding/v3` | `DeepSeek-V4-Pro` | `VOLCENGINE_API_KEY`, `VOLCENGINE_ARK_API_KEY`, `ARK_API_KEY` | CC |
|
||||
| `openrouter` | OpenRouter | `https://openrouter.ai/api/v1` | `deepseek/deepseek-v4-pro` | `OPENROUTER_API_KEY` | CC |
|
||||
| `xiaomi-mimo` | Xiaomi MiMo | `https://token-plan-sgp.xiaomimimo.com/v1` (regional cn/sgp/ams + PAYG `api.xiaomimimo.com`) | `mimo-v2.5-pro` | `XIAOMI_MIMO_TOKEN_PLAN_API_KEY`, `MIMO_TOKEN_PLAN_API_KEY`, `XIAOMI_MIMO_API_KEY`, `XIAOMI_API_KEY`, `MIMO_API_KEY` | CC |
|
||||
| `novita` | Novita AI | `https://api.novita.ai/openai/v1` | `deepseek/deepseek-v4-pro` | `NOVITA_API_KEY` | CC |
|
||||
| `fireworks` | Fireworks AI | `https://api.fireworks.ai/inference/v1` | `accounts/fireworks/models/deepseek-v4-pro` | `FIREWORKS_API_KEY` | CC |
|
||||
| `siliconflow` | SiliconFlow | `https://api.siliconflow.com/v1` | `deepseek-ai/DeepSeek-V4-Pro` | `SILICONFLOW_API_KEY` | CC |
|
||||
| `siliconflow-CN` | SiliconFlow (China) | `https://api.siliconflow.cn/v1` | `deepseek-ai/DeepSeek-V4-Pro` | `SILICONFLOW_API_KEY` | CC |
|
||||
| `arcee` | Arcee AI | `https://api.arcee.ai/api/v1` | `trinity-large-thinking` | `ARCEE_API_KEY` | CC |
|
||||
| `moonshot` | Moonshot/Kimi | `https://api.moonshot.ai/v1` (Kimi-for-coding: `https://api.kimi.com/coding/v1`) | `kimi-k2.7-code` | `MOONSHOT_API_KEY`, `KIMI_API_KEY`, or Kimi OAuth | CC |
|
||||
| `sglang` | SGLang (self-hosted) | `http://localhost:30000/v1` | `deepseek-ai/DeepSeek-V4-Pro` | `SGLANG_API_KEY` | CC |
|
||||
| `vllm` | vLLM (self-hosted) | `http://localhost:8000/v1` | `deepseek-ai/DeepSeek-V4-Pro` | `VLLM_API_KEY` | CC |
|
||||
| `ollama` | Ollama (local) | `http://localhost:11434/v1` | `deepseek-v4-flash` | `OLLAMA_API_KEY` | CC |
|
||||
| `huggingface` | Hugging Face | `https://router.huggingface.co/v1` | `deepseek-ai/DeepSeek-V4-Pro` | `HUGGINGFACE_API_KEY`, `HF_TOKEN` | CC |
|
||||
| `together` | Together AI | `https://api.together.xyz/v1` | `deepseek-ai/DeepSeek-V4-Pro` | `TOGETHER_API_KEY` | CC |
|
||||
| `qianfan` | Baidu Qianfan | `https://api.baiduqianfan.ai/v1` | `ernie-4.0-turbo-8k` | `QIANFAN_API_KEY`, `BAIDU_QIANFAN_API_KEY` | CC |
|
||||
| `openmodel` | OpenModel | `https://api.openmodel.ai` | `deepseek-v4-flash` | `OPENMODEL_API_KEY` | AM |
|
||||
| `zai` | Zhipu AI / Z.ai | `https://api.z.ai/api/coding/paas/v4` | `GLM-5.2` | `ZAI_API_KEY`, `Z_AI_API_KEY`, `ZHIPU_API_KEY`, `GLM_API_KEY` | CC |
|
||||
| `stepfun` | StepFun / StepFlash | `https://api.stepfun.ai/v1` | `step-3.7-flash` | `STEPFUN_API_KEY`, `STEP_API_KEY` | CC |
|
||||
| `minimax` | MiniMax | `https://api.minimax.io/v1` | `MiniMax-M3` | `MINIMAX_API_KEY` | CC |
|
||||
| `deepinfra` | DeepInfra | `https://api.deepinfra.com/v1/openai` | `deepseek-ai/DeepSeek-V4-Pro` | `DEEPINFRA_API_KEY`, `DEEPINFRA_TOKEN` | CC |
|
||||
| `sakana` | Sakana AI (Fugu) | `https://api.sakana.ai/v1` | `fugu` | `FUGU_API_KEY`, `SAKANA_API_KEY` | CC |
|
||||
| `longcat` | Meituan LongCat | `https://api.longcat.chat/openai/v1` | `LongCat-2.0` | `LONGCAT_API_KEY` | CC |
|
||||
| `meta` | Meta Model API | `https://api.meta.ai/v1` | `muse-spark-1.1` | `META_MODEL_API_KEY`, `MODEL_API_KEY` | CC |
|
||||
| `xai` | xAI | `https://api.x.ai/v1` | `grok-4.5` | `XAI_API_KEY` or Grok OAuth (`~/.grok/auth.json`) | CC |
|
||||
| `custom` | Custom (OpenAI-compatible) | per `[providers.<name>]` table | per table | per-entry `api_key_env` | CC |
|
||||
|
||||
OAuth routes (token precedence: route OAuth → CLI key → provider/root config
|
||||
→ ambient env; `crates/tui/src/config.rs:3494-3566`):
|
||||
|
||||
- **OpenAI Codex/ChatGPT** — Codex CLI login (`~/.codex/auth.json`);
|
||||
account-scoped model roster from `~/.codex/models_cache.json`; usage is
|
||||
subscription-scoped so **no dollar pricing is shown** on this route
|
||||
(`pricing.rs:127-129, 334-338`).
|
||||
- **xAI Grok** — `[providers.xai] auth_mode = "oauth"`, reuses `~/.grok/auth.json`
|
||||
or device-code login.
|
||||
- **Moonshot/Kimi** — Kimi CLI OAuth for the coding endpoint.
|
||||
- **No Anthropic/Claude subscription OAuth exists** — API key only.
|
||||
|
||||
---
|
||||
|
||||
## 4. First-class model metadata (the curated set)
|
||||
|
||||
Merged view of the four fact sources for the models CodeWhale makes explicit
|
||||
promises about. Columns: **Ctx** = context window (tokens), **Out** = max
|
||||
output, **R** = emits reasoning, pricing = USD per 1M tokens as
|
||||
**cache-hit / input / output** from `pricing.rs` (catalog rows have no
|
||||
cache-hit discount → hit = input).
|
||||
|
||||
### 4.1 DeepSeek (first-class)
|
||||
|
||||
| Model | Ctx | Out | R | Pricing (hit/in/out USD) | Notes |
|
||||
|---|---|---|---|---|---|
|
||||
| `deepseek-v4-pro` | 1,000,000 | 384,000 | ✓ | 0.003625 / 0.435 / 0.87 (+CNY 0.025/3/6) | post-2026-05-31 adjusted rate is permanent (#2489) |
|
||||
| `deepseek-v4-flash` | 1,000,000 | 384,000 | ✓ | 0.0028 / 0.14 / 0.28 (+CNY 0.02/1/2) | |
|
||||
| `deepseek-reasoner`, legacy v3.x, `deepseek-coder*` | 128,000 | — | v4-only | flash rates for non-pro | legacy fallback window (`models.rs:7`) |
|
||||
| `deepseek-ai/*` (NIM-hosted) | 1,000,000 | 384,000 | ✓ | **intentionally unpriced** | NVIDIA terms ≠ DeepSeek platform pricing (`pricing.rs:133-137`) |
|
||||
| any id with `-Nk` suffix | N×1000 | — | — | — | vendor-agnostic served-name hint, 8k–1024k |
|
||||
|
||||
### 4.2 OpenAI
|
||||
|
||||
| Model | Ctx (API route) | Ctx (OAuth route) | Out | R | Pricing (hit/in/out) | Notes |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `gpt-5.6` (alias → sol) | 1,050,000 | 272,000¹ | 128,000 | ✓ | 0.50 / 5.00 / 30.00 | Models.dev: input limit 922,000 |
|
||||
| `gpt-5.6-sol` | 1,050,000 | 272,000¹ | 128,000 | ✓ | 0.50 / 5.00 / 30.00 | efforts low→ultra on OAuth |
|
||||
| `gpt-5.6-terra` | 1,050,000 | 272,000¹ | 128,000 | ✓ | 0.25 / 2.50 / 15.00 | |
|
||||
| `gpt-5.6-luna` | 1,050,000 | 272,000¹ | 128,000 | ✓ | 0.10 / 1.00 / 6.00 | cost-efficient tier; **the "272k looks wrong" report — see §6** |
|
||||
| `gpt-5.5` | 1,050,000 | 272,000¹ | 128,000 | ✓ | 0.50 / 5.00 / 30.00 | date snapshots (`gpt-5.5-YYYY-MM-DD`) too |
|
||||
| `gpt-5.5-pro` | 1,050,000 | n/a | 128,000 | ✓ | 30.00 / 30.00 / 180.00 | no cached-input discount |
|
||||
| `gpt-5-codex` | 400,000 | per roster | 128,000 | ✓ | 0.125 / 1.25 / 10.00 | deprecated upstream on OAuth path |
|
||||
| `gpt-5.3-codex` | 400,000 | per roster | 128,000 | ✓ | 0.175 / 1.75 / 14.00 | |
|
||||
| other codex ids (`gpt-5.1-codex[-mini/-max]`, `gpt-5.2-codex`, `codex-gpt-5.5`, `chatgpt-gpt-5.5`, `gpt-5.5-codex[-preview]`…) | 400,000 | per roster | 128,000 | ✓ | unpriced | recognized by `is_openai_codex_model` (`models.rs:491-507`) |
|
||||
| `gpt-5.5-nano` | *unknown* | *unknown* | — | ✗ | — | deliberately unrecognized (`models.rs:788-790`) |
|
||||
|
||||
¹ OAuth window is whatever `~/.codex/models_cache.json` advertises for the
|
||||
account; on this machine (2026-07-13) it is 272,000 for all gpt-5.x list
|
||||
models and 128,000 for `gpt-5.3-codex-spark`. Stale/missing cache → no ctx
|
||||
shown in picker; runtime compat floor 128,000. OAuth route never shows pricing.
|
||||
|
||||
### 4.3 Anthropic
|
||||
|
||||
| Model | Ctx | Out | R | Pricing (hit/in/out) | Notes |
|
||||
|---|---|---|---|---|---|
|
||||
| `claude-opus-4-8` | 1,000,000 | 128,000 | ✓ | 0.50 / 5.00 / 25.00 | |
|
||||
| `claude-sonnet-4-6` | 1,000,000 | 128,000 | ✓ | 0.30 / 3.00 / 15.00 | out raised 64K→128K (2026-07-09 audit) |
|
||||
| `claude-sonnet-5` | 1,000,000 | 128,000 | ✓ | intro 0.20/2.00/10.00 until 2026-08-31, then 0.30/3.00/15.00 | time-aware in `pricing.rs:263-273` |
|
||||
| `claude-fable-5` | 1,000,000 | 128,000 | ✓ | 1.00 / 10.00 / 50.00 | tokenizer yields ~30% more tokens — raw rate comparisons undercount cost (`pricing.rs:178-182`) |
|
||||
| `claude-haiku-4-5` | 200,000 | 64,000 | ✗ | 0.10 / 1.00 / 5.00 | |
|
||||
| any other `claude*` | 200,000 | — | ✗ | — | family fallback |
|
||||
|
||||
### 4.4 Moonshot / Kimi
|
||||
|
||||
| Model | Ctx | Out | R | Pricing | Notes |
|
||||
|---|---|---|---|---|---|
|
||||
| `kimi-k2.7-code` (± `moonshotai/`) | 262,144 | 262,144 | ✓ | 0.19 / 0.95 / 4.00 | |
|
||||
| `kimi-k2.6` (± prefix, `:free`) | 262,144 | 262,144 | ✓ | 0.16 / 0.95 / 4.00 | |
|
||||
| `kimi-for-coding` | 262,144 | 262,144 | ✓ | — | stable coding route; rides K2.7 path; **not in agent-crate registry or catalogs** (§7 D-12) |
|
||||
| any bare `kimi-*` | — | — | ✓ | — | prefix rule: always reasoning (#3016) |
|
||||
|
||||
### 4.5 Z.ai / GLM
|
||||
|
||||
| Model | Ctx | Out | R | Pricing | Notes |
|
||||
|---|---|---|---|---|---|
|
||||
| `glm-5.2` (± `z-ai/`) | 1,000,000 | 131,072 | ✓ | 0.26 / 1.40 / 4.40 | |
|
||||
| `glm-5.3` (± `z-ai/`) | 1,000,000 | 131,072 | ✓ | | **not released by Z.ai as of 2026-08-03** — registered id only; limits/reasoning inherited wholesale from `glm-5.2` pending official Z.ai release metadata, not measured; no published price |
|
||||
| `glm-5.1` (± `z-ai/`) | 202,752 | 131,072 | ✓ | 0.26 / 1.40 / 4.40 | vendor page says 200K (§7 D-4) |
|
||||
| `glm-5-turbo` (± `z-ai/`) | 202,752 | 131,072 | ✓ | 0.24 / 1.20 / 4.00 | fast **text** sibling |
|
||||
| `glm-5v-turbo` (± `z-ai/`) | 202,752 | — | ✗ | — | **vision** model, distinct from 5-turbo |
|
||||
|
||||
### 4.6 MiniMax
|
||||
|
||||
| Model | Ctx | Out | R | Pricing | Notes |
|
||||
|---|---|---|---|---|---|
|
||||
| `minimax-m3` (± `minimax/`, `MiniMax-M3`) | 1,000,000 | 524,288 | ✓ | 0.06 / 0.30 / 1.20 | catalog says out 128,000 (§7 D-5) |
|
||||
| `minimax-m2.7` (± prefix, `-highspeed`) | 204,800 | 131,072 (catalog) | ✓ | 0.3 / 0.3 / 1.2 (catalog) | |
|
||||
| `minimax-m2.5` / `m2.1` (± `-highspeed`) | 204,800 | — | ✓ | — | |
|
||||
| `minimax-m2` | 204,800 | — | ✓ | — | catalog says 196,608 (§7 D-6) |
|
||||
|
||||
### 4.7 Qwen (OpenRouter-routed)
|
||||
|
||||
| Model | Ctx | Out | R | Pricing | Notes |
|
||||
|---|---|---|---|---|---|
|
||||
| `qwen/qwen3.6-flash` | 1,000,000 | 65,536 | ✓ | 0.1875 / 0.1875 / 1.125 | |
|
||||
| `qwen/qwen3.6-plus` | 1,000,000 | 65,536 | ✓ | 0.325 / 0.325 / 1.95 | |
|
||||
| `qwen/qwen3.6-35b-a3b` | 262,144 | 262,140 | ✓ | 0.05 / 0.14 / 1.00 | out cap suspect (§7 D-7) |
|
||||
| `qwen/qwen3.6-27b` | 262,144 | 262,140 | ✓ | 0.15 / 0.285 / 2.40 | out cap suspect (§7 D-7) |
|
||||
| `qwen/qwen3.6-max-preview` | 262,144 | 65,536 | ✓ | 1.04 / 1.04 / 6.24 | catalog ctx 245,800 (§7 D-8) |
|
||||
| `qwen/qwen3.7-plus` | — | — | — | 0.064 / 0.32 / 1.28 | **priced but no ctx/out/reasoning rows** (§7 D-13) |
|
||||
| `qwen/qwen3.7-max` | — | — | — | 0.25 / 1.25 / 3.75 | in agent registry; same gap (§7 D-13) |
|
||||
|
||||
### 4.8 Xiaomi MiMo
|
||||
|
||||
| Model | Ctx | Out | R | Pricing | Notes |
|
||||
|---|---|---|---|---|---|
|
||||
| `mimo-v2.5-pro` (± `xiaomi/`, `-ultraspeed`) | 1,000,000 | 131,072 | ✓ | intentionally unknown | Token-Plan credit billing, no balance endpoint |
|
||||
| `mimo-v2.5` (± `xiaomi/`) | 1,000,000 | 131,072 | ✓ | unknown | omni (text+image) |
|
||||
| `mimo-v2.5-asr` | 8,000 | 2,048 | ✗ | unknown | speech-to-text |
|
||||
| `mimo-v2.5-tts[-voicedesign/-voiceclone]`, `mimo-v2-tts` | 8,000 | 8,192 | ✗ | unknown | TTS family |
|
||||
|
||||
### 4.9 xAI / Grok
|
||||
|
||||
| Model | Ctx | Out | R | Pricing | Notes |
|
||||
|---|---|---|---|---|---|
|
||||
| `grok-4.5` | 500,000 | — | ✓ | — | |
|
||||
| `grok-4.3` | 1,000,000 | — | ✓ | — | |
|
||||
| `grok-build` | 512,000 | — | ✓ | — | not in Models.dev |
|
||||
| `grok-composer-2.5-fast` | 200,000 | — | ✗ | — | not in Models.dev |
|
||||
| `grok-4.20-0309-reasoning` / `-non-reasoning` | 2,000,000 | — | ✓/✗ | — | catalog row says 1M (§7 D-9); **no Grok pricing rows at all** (§7 D-14) |
|
||||
|
||||
### 4.10 Others
|
||||
|
||||
| Model | Provider | Ctx | Out | R | Pricing | Notes |
|
||||
|---|---|---|---|---|---|---|
|
||||
| `trinity-large-thinking` (± `arcee-ai/`) | Arcee | 262,144 | 262,144 | ✓ | 0.25 / 0.25 / 0.80 | out=ctx suspect (§7 D-2) |
|
||||
| `trinity-large-preview` | Arcee | 262,144 | — | ✗ | — | catalog row says 131,000 (§7 D-3) |
|
||||
| `trinity-mini` | Arcee | 128,000 | 64,000 (bundled) | ✗ | 0.045 / 0.045 / 0.15 | catalog says ctx 131,072 (§7 D-1) |
|
||||
| `step-3.7-flash` | StepFun | 256,000 | 256,000 | ✗ | 0.2 / 0.2 / 1.15 | third-party sourced (models.dev + AA) |
|
||||
| `fugu` | Sakana | — | — | ✗ | — | in agent registry only |
|
||||
| `fugu-ultra` / `fugu-ultra-20260615` | Sakana | 1,000,000 | 131,000 | ✓ | 5.0 / 5.0 / 30.0 | limits third-party sourced (Requesty); Sakana's own >272K price tier confirms ctx > 272K |
|
||||
| `muse-spark-1.1` | Meta | 1,000,000 | 32,000 | ✓ | 1.25 / 1.25 / 4.25 | |
|
||||
| `LongCat-2.0` | LongCat | — | — | ✓ | — | agent registry only; no fact rows (§7 D-15) |
|
||||
| `tencent/hy3-preview` | OpenRouter | 262,144 | — | ✓ | 0.021 / 0.063 / 0.21 | catalog says 256,000 (§7 D-10) |
|
||||
| `google/gemma-4-31b-it` (± `:free`) | OpenRouter | 262,144 | 16,384 (paid) / 32,768 (free) | ✓ | 0.09 / 0.12 / 0.35 | out cap vs catalog 131,072 (§7 D-11) |
|
||||
| `google/gemma-4-26b-a4b-it` (± `:free`) | OpenRouter | 262,144 | 32,768 (free) | ✓ | 0.06 / 0.06 / 0.33 | |
|
||||
| `nvidia/nemotron-3-ultra-550b-a55b` (± `:free`) | OpenRouter | 1,000,000 | 16,384 (paid) / 65,536 (free) | ✓ | 0.10 / 0.50 / 2.20 | catalog out 65,000 (§7 D-11) |
|
||||
| `nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free` | OpenRouter | 262,144 | 65,536 | ✓ | — | |
|
||||
| `ernie-4.0-turbo-8k` | Qianfan | 8,000 (via `-8k` hint) | — | ✗ | — | Qianfan default; no explicit rows |
|
||||
|
||||
---
|
||||
|
||||
## 5. Bundled TUI catalog (`crates/tui/assets/model_catalog.bundled.json`)
|
||||
|
||||
31 entries, `fetched_at: 2026-07-06`, effectively-infinite TTL. Adds
|
||||
modalities and (for some rows) USD pricing on top of §4 facts. Highlights:
|
||||
|
||||
- Modalities `text,image`: gpt-5.6 family, muse-spark-1.1, minimax-m3, mimo-v2.5.
|
||||
- `text,image,audio`: mimo-v2.5-pro (the only audio-input row).
|
||||
- `gpt-5.6` carries `provider_model_id: gpt-5.6-sol` (alias resolution).
|
||||
- Pricing present only for: codex models, kimi-k2.7-code, glm-5.2,
|
||||
minimax-m2.7, trinity-mini, claude family, step-3.7-flash, fugu-ultra.
|
||||
- The bundled `models_dev.bundled.json` (config crate) is smaller: 2 models
|
||||
(deepseek-v4-pro/flash), 14 providers, 42 chat offerings; demoted to
|
||||
offline-fallback-only by #4188.
|
||||
|
||||
## 6. The gpt-5.6-luna 272K finding (root cause, resolved)
|
||||
|
||||
- **What you saw:** model picker hint "272K ctx" for gpt-5.6-luna.
|
||||
- **Where it comes from:** `~/.codex/models_cache.json` — the ChatGPT/Codex
|
||||
OAuth `/models` roster persisted by the Codex CLI. On this machine every
|
||||
gpt-5.x OAuth entry advertises `context_window: 272000`.
|
||||
- **Why CodeWhale shows it:** for `ApiProvider::OpenaiCodex` the picker and
|
||||
runtime use the OAuth-advertised window **exclusively** — never the API
|
||||
route's 1,050,000 — because the OAuth offering genuinely has the smaller
|
||||
window and different (subscription) billing. Precedence code:
|
||||
`model_picker.rs:1105-1111`; runtime: `route_runtime.rs:33-51`; compaction
|
||||
consumes it via `effective_context_window` (`compaction.rs:98-104`).
|
||||
Pinned by tests (`model_picker.rs:1660-1706`,
|
||||
`commands/groups/debug/tests.rs:96-111`).
|
||||
- **Is 272,000 plausible?** Yes: 400,000 (codex-class window) − 128,000
|
||||
(output) = 272,000 usable input; OpenAI advertises the input budget as the
|
||||
OAuth "context_window". The same-name API models are 1,050,000 total /
|
||||
922,000 input.
|
||||
- **Verdict:** data is correct per route; the *presentation* invites the
|
||||
"that looks wrong" reaction. See action A1.
|
||||
|
||||
## 7. Discrepancies & gaps (vs live Models.dev catalog, fetched 2026-07-12)
|
||||
|
||||
Confidence key: **vendor** = the live row is the vendor's own provider entry
|
||||
(strong signal); **aggregator** = row from a reseller (Vercel/OpenRouter etc.,
|
||||
weaker — verify against the vendor's docs before changing anything).
|
||||
|
||||
| # | Model | CodeWhale says | Live catalog says | Source | Assessment |
|
||||
|---|---|---|---|---|---|
|
||||
| D-1 | `trinity-mini` | ctx 128,000 / out 64,000 (bundled) | 131,072 / 131,072 | aggregator | verify vs Arcee docs |
|
||||
| D-2 | `trinity-large-thinking` | out 262,144 (= full ctx — suspicious) | ctx 262,100 / out 80,000 | aggregator | out=ctx is a common data-entry smell; verify |
|
||||
| D-3 | `trinity-large-preview` | ctx 262,144 | 131,000 / 131,000 | aggregator | verify |
|
||||
| D-4 | `glm-5.1`, `glm-5-turbo`, `glm-5v-turbo` | ctx 202,752 | 200,000 | **vendor (zai)** | 202,752 = 198×1024; likely fine (marketing 200K vs binary), document choice |
|
||||
| D-5 | `minimax-m3` | out 524,288 | out 128,000 | vendor (coding-plan row) | route-dependent; verify per MiniMax platform docs |
|
||||
| D-6 | `minimax-m2` | ctx 204,800 | 196,608 | vendor (coding-plan row) | verify |
|
||||
| D-7 | `qwen3.6-35b-a3b`, `qwen3.6-27b` | out 262,140 | out 65,536 | **vendor (alibaba)** | our 262,140 looks wrong (≈ctx); likely fix to 65,536 |
|
||||
| D-8 | `qwen3.6-max-preview` | ctx 262,144 | 245,800 | vendor (alibaba-cn) | verify |
|
||||
| D-9 | `grok-4.20-0309-*` | ctx 2,000,000 | 1,000,000 | vendor (xai) | 2M matches xAI's fast-endpoint marketing; catalog row may be the standard endpoint — verify |
|
||||
| D-10 | `tencent/hy3-preview` | ctx 262,144 | 256,000 | aggregator | minor; verify |
|
||||
| D-11 | `gemma-4-31b-it` out 16,384; `nemotron-3-ultra` out 16,384 | 131,072 / 65,000 | aggregator | per-host caps differ; ours were OpenRouter-specific — document as route-scoped |
|
||||
| D-12 | `kimi-for-coding` | in `models.rs` only | absent from live catalog, agent registry, bundled catalogs | — | add to agent registry + bundled catalog or document as models.rs-only route |
|
||||
| D-13 | `qwen/qwen3.7-plus`, `qwen/qwen3.7-max` | priced (and 3.7-max in agent registry) but **no ctx/out/reasoning rows** | present upstream | — | add fact rows |
|
||||
| D-14 | all Grok models | **no pricing rows** | xai: e.g. grok-4.5 $2/$6, grok-4.3 $1.25/$2.5 | vendor | add pricing (catalog passthrough may already cover once live rows resolve — verify `resolved_usd_pricing` path) |
|
||||
| D-15 | `LongCat-2.0`, `fugu` (base), `ernie-4.0-turbo-8k` | agent-registry/default only; no metadata rows | — | — | add facts or mark best-effort |
|
||||
| D-16 | `mimo-v2.5*` | ctx 1,000,000 | 1,048,576 | vendor (token-plan) | cosmetic (1M vs 2^20); document choice |
|
||||
| D-17 | `fugu-ultra` | out 131,000 | sakana row: out 1,000,000 | vendor row suspect (out=ctx) | keep ours (Requesty-sourced) unless Sakana docs say otherwise |
|
||||
|
||||
Structural observations:
|
||||
|
||||
- **Four hand-maintained fact stores** must currently be updated in lockstep:
|
||||
`models.rs`, `model_catalog.bundled.json`, `pricing.rs`,
|
||||
`models_dev.bundled.json`. `model_registry.rs` is the intended chokepoint
|
||||
but is not yet consumed by production call sites (its module docs say so).
|
||||
- The agent crate's `ModelRegistry` (93 rows) duplicates provider/alias data
|
||||
with its own `supports_tools`/`supports_reasoning` flags — a fifth store.
|
||||
- `CurrencyPricing` has no **cache-write** field, so Anthropic (1.25–2× input)
|
||||
and Qwen 3.7 cache-write rates are silently dropped from cost estimates.
|
||||
- The bundled TUI catalog cannot carry a cache-read rate, forcing Anthropic
|
||||
rows to live in `pricing.rs` above the catalog.
|
||||
|
||||
## 8. Action items (for the implementation pass)
|
||||
|
||||
| ID | Action | Where |
|
||||
|---|---|---|
|
||||
| A1 | Label OAuth-route context in the picker (e.g. "272K ctx · ChatGPT route") so account-scoped windows don't read as wrong data; optionally show the API-route window alongside | `model_picker.rs:1187-1192` hint renderer |
|
||||
| A2 | Fix Qwen3.6-27b/35b output caps (262,140 → 65,536, pending vendor-doc check) | `models.rs:371`, tests |
|
||||
| A3 | Verify & reconcile D-1/2/3 (Arcee), D-5/6 (MiniMax), D-8 (Qwen max-preview), D-9 (Grok 4.20), D-10 (HY3) against vendor docs | `models.rs`, bundled catalogs |
|
||||
| A4 | Add fact rows for `qwen3.7-plus/max`, `LongCat-2.0`, Grok pricing | `models.rs`, `pricing.rs` |
|
||||
| A5 | Register `kimi-for-coding` in the agent-crate registry + bundled catalog | `crates/agent/src/lib.rs`, assets |
|
||||
| A6 | Add cache-write field to `CurrencyPricing` and to the catalog schema; move Anthropic rows into the catalog once it can carry cache rates | `pricing.rs:97-109`, `catalog.rs` |
|
||||
| A7 | Complete the #3071/#3073 migration: make production call sites consume `model_registry::lookup` so the fact stores collapse to one | `model_registry.rs` |
|
||||
| A8 | Consider folding the agent-crate `ModelRegistry` flags into the same chokepoint (or generating them from it) | `crates/agent/src/lib.rs` |
|
||||
| A9 | Refresh `model_catalog.bundled.json` + `models_dev.bundled.json` from the 2026-07-12 live snapshot as part of each release lane | assets |
|
||||
|
||||
## Appendix A — agent-crate registry (model × provider, 93 rows)
|
||||
|
||||
Source: `crates/agent/src/lib.rs` `ModelRegistry::default()`. Flags:
|
||||
T = supports tools, R = supports reasoning. Aliases are case-insensitive.
|
||||
|
||||
| Wire model id | Provider | T | R | Aliases |
|
||||
|---|---|---|---|---|
|
||||
| `deepseek-v4-pro` | Deepseek | ✓ | ✓ | — |
|
||||
| `deepseek-v4-flash` | Deepseek | ✓ | ✓ | deepseek-chat, deepseek-reasoner, deepseek-r1, deepseek-v3, deepseek-v3.2 |
|
||||
| `deepseek-ai/deepseek-v4-pro` | NvidiaNim | ✓ | ✓ | deepseek-v4-pro, nvidia-deepseek-v4-pro, nim-deepseek-v4-pro |
|
||||
| `deepseek-ai/deepseek-v4-flash` | NvidiaNim | ✓ | ✓ | deepseek-v4-flash, deepseek-chat, deepseek-reasoner, nvidia-deepseek-v4-flash, nim-deepseek-v4-flash |
|
||||
| `deepseek-v4-pro` | Openai | ✓ | ✓ | openai-compatible-deepseek-v4-pro |
|
||||
| `deepseek-v4-flash` | Openai | ✓ | ✓ | openai-compatible-deepseek-v4-flash |
|
||||
| `gpt-5.6` | Openai | ✓ | ✓ | gpt56 |
|
||||
| `gpt-5.6-sol` | Openai | ✓ | ✓ | gpt56-sol |
|
||||
| `gpt-5.6-terra` | Openai | ✓ | ✓ | gpt56-terra |
|
||||
| `gpt-5.6-luna` | Openai | ✓ | ✓ | gpt56-luna |
|
||||
| `deepseek-ai/deepseek-v4-flash` | Atlascloud | ✓ | ✓ | deepseek-v4-flash, atlascloud-deepseek-v4-flash |
|
||||
| `deepseek-ai/deepseek-v4-pro` | Atlascloud | ✓ | ✓ | deepseek-v4-pro, atlascloud-deepseek-v4-pro |
|
||||
| `deepseek-reasoner` | WanjieArk | ✓ | ✓ | wanjie-deepseek-reasoner, ark-wanjie-deepseek-reasoner |
|
||||
| `DeepSeek-V4-Pro` | Volcengine | ✓ | ✓ | deepseek-v4-pro, volcengine-deepseek-v4-pro, ark-deepseek-v4-pro |
|
||||
| `DeepSeek-V4-Flash` | Volcengine | ✓ | ✓ | deepseek-v4-flash, deepseek-chat, volcengine-deepseek-v4-flash, ark-deepseek-v4-flash |
|
||||
| `trinity-large-thinking` | Arcee | ✓ | ✓ | trinity, arcee-trinity, arcee-trinity-large-thinking |
|
||||
| `trinity-large-preview` | Arcee | ✓ | ✗ | arcee-trinity-large-preview |
|
||||
| `deepseek/deepseek-v4-pro` | Openrouter | ✓ | ✓ | deepseek-v4-pro, openrouter-deepseek-v4-pro |
|
||||
| `deepseek/deepseek-v4-flash` | Openrouter | ✓ | ✓ | deepseek-v4-flash, deepseek-chat, deepseek-reasoner, openrouter-deepseek-v4-flash |
|
||||
| `arcee-ai/trinity-large-thinking` | Openrouter | ✓ | ✓ | trinity, trinity-large-thinking, arcee-trinity-large-thinking |
|
||||
| `xiaomi/mimo-v2.5-pro` | Openrouter | ✓ | ✓ | openrouter-mimo-v2.5-pro, openrouter-xiaomi-mimo-v2.5-pro |
|
||||
| `xiaomi/mimo-v2.5` | Openrouter | ✓ | ✓ | openrouter-mimo-v2.5, openrouter-xiaomi-mimo-v2.5 |
|
||||
| `qwen/qwen3.6-flash` | Openrouter | ✓ | ✓ | qwen3.6-flash, qwen-3.6-flash |
|
||||
| `qwen/qwen3.6-35b-a3b` | Openrouter | ✓ | ✓ | qwen3.6-35b-a3b, qwen-3.6-35b-a3b |
|
||||
| `qwen/qwen3.6-max-preview` | Openrouter | ✓ | ✓ | qwen3.6-max-preview, qwen-3.6-max-preview, qwen-max-preview |
|
||||
| `qwen/qwen3.6-27b` | Openrouter | ✓ | ✓ | qwen3.6-27b, qwen-3.6-27b |
|
||||
| `qwen/qwen3.6-plus` | Openrouter | ✓ | ✓ | qwen3.6-plus, qwen-3.6-plus |
|
||||
| `qwen/qwen3.7-max` | Openrouter | ✓ | ✓ | qwen3.7-max, qwen-3.7-max |
|
||||
| `moonshotai/kimi-k2.7-code` | Openrouter | ✓ | ✓ | kimi-k2.7-code, openrouter-kimi-k2.7-code |
|
||||
| `moonshotai/kimi-k2.6` | Openrouter | ✓ | ✓ | openrouter-kimi-k2.6 |
|
||||
| `minimax/minimax-m3` | Openrouter | ✓ | ✓ | minimax-m3, minimax-m-3, openrouter-minimax-m3 |
|
||||
| `minimax/minimax-m2.7` | Openrouter | ✓ | ✓ | minimax-2.7, minimax-2-7, openrouter-minimax-2.7 |
|
||||
| `z-ai/glm-5.1` | Openrouter | ✓ | ✓ | glm-5.1, zai-glm-5.1 |
|
||||
| `z-ai/glm-5.2` | Openrouter | ✓ | ✓ | glm-5.2, zai-glm-5.2 |
|
||||
| `z-ai/glm-5.3` | Openrouter | ✓ | ✓ | glm-5.3, zai-glm-5.3 |
|
||||
| `z-ai/glm-5-turbo` | Openrouter | ✓ | ✓ | glm-5-turbo, zai-glm-5-turbo |
|
||||
| `tencent/hy3-preview` | Openrouter | ✓ | ✓ | hy3-preview, tencent-hy3-preview |
|
||||
| `google/gemma-4-31b-it` | Openrouter | ✓ | ✓ | gemma-4-31b, gemma-4-31b-it |
|
||||
| `google/gemma-4-26b-a4b-it` | Openrouter | ✓ | ✓ | gemma-4-26b-a4b, gemma-4-26b-a4b-it |
|
||||
| `nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free` | Openrouter | ✓ | ✓ | nemotron-3-nano-omni, nemotron-3-nano-omni-reasoning |
|
||||
| `nvidia/nemotron-3-ultra-550b-a55b` | Openrouter | ✓ | ✓ | nvidia/nemotron-3-ultra, nemotron-3-ultra, nemotron-3-ultra-550b-a55b, nvidia-nemotron-3-ultra, nvidia-nemotron-3-ultra-550b-a55b |
|
||||
| `GLM-5.2` | Zai | ✓ | ✓ | glm-5.2, glm-5-2, zai-glm-5.2, zai-glm-5-2 |
|
||||
| `GLM-5.3` | Zai | ✓ | ✓ | glm-5.3, glm-5-3, zai-glm-5.3, zai-glm-5-3 |
|
||||
| `GLM-5.1` | Zai | ✓ | ✓ | glm-5.1, glm-5-1, zai-glm-5.1, zai-glm-5-1 |
|
||||
| `GLM-5-Turbo` | Zai | ✓ | ✓ | glm-5-turbo, glm-5turbo, zai-glm-5-turbo |
|
||||
| `mimo-v2.5-pro` | XiaomiMimo | ✓ | ✓ | mimo, pro, xiaomi-mimo-v2.5-pro, xiaomi-mimo-v2-5-pro |
|
||||
| `mimo-v2.5` | XiaomiMimo | ✓ | ✓ | omni, mimo-omni, v2.5-omni, mimo-v2.5-omni, xiaomi-mimo-v2.5, xiaomi-mimo-v2.5-omni |
|
||||
| `mimo-v2.5-asr` | XiaomiMimo | ✗ | ✗ | asr, speech-to-text, transcribe |
|
||||
| `mimo-v2.5-tts` | XiaomiMimo | ✗ | ✗ | tts, speech, mimo-tts |
|
||||
| `mimo-v2.5-tts-voicedesign` | XiaomiMimo | ✗ | ✗ | voicedesign, voice-design, mimo-voice-design |
|
||||
| `mimo-v2.5-tts-voiceclone` | XiaomiMimo | ✗ | ✗ | voiceclone, voice-clone, mimo-voice-clone |
|
||||
| `mimo-v2-tts` | XiaomiMimo | ✗ | ✗ | mimo-v2-speech |
|
||||
| `deepseek/deepseek-v4-pro` | Novita | ✓ | ✓ | deepseek-v4-pro, novita-deepseek-v4-pro |
|
||||
| `deepseek/deepseek-v4-flash` | Novita | ✓ | ✓ | deepseek-v4-flash, deepseek-chat, deepseek-reasoner, novita-deepseek-v4-flash |
|
||||
| `accounts/fireworks/models/deepseek-v4-pro` | Fireworks | ✓ | ✓ | deepseek-v4-pro, fireworks-deepseek-v4-pro |
|
||||
| `deepseek-ai/DeepSeek-V4-Pro` | Siliconflow | ✓ | ✓ | deepseek-v4-pro, deepseek-reasoner, deepseek-r1, siliconflow-deepseek-v4-pro |
|
||||
| `deepseek-ai/DeepSeek-V4-Flash` | Siliconflow | ✓ | ✓ | deepseek-v4-flash, deepseek-chat, deepseek-v3, siliconflow-deepseek-v4-flash |
|
||||
| `kimi-k2.7-code` | Moonshot | ✓ | ✓ | kimi, kimi-k2, kimi-k2.7, kimi-code, moonshot-kimi-k2.7-code |
|
||||
| `kimi-k2.6` | Moonshot | ✓ | ✓ | moonshot-kimi-k2.6 |
|
||||
| `deepseek-ai/DeepSeek-V4-Pro` | Sglang | ✓ | ✓ | deepseek-v4-pro, sglang-deepseek-v4-pro |
|
||||
| `deepseek-ai/DeepSeek-V4-Flash` | Sglang | ✓ | ✓ | deepseek-v4-flash, deepseek-chat, deepseek-reasoner, sglang-deepseek-v4-flash |
|
||||
| `deepseek-ai/DeepSeek-V4-Pro` | Vllm | ✓ | ✓ | deepseek-v4-pro, vllm-deepseek-v4-pro |
|
||||
| `deepseek-ai/DeepSeek-V4-Flash` | Vllm | ✓ | ✓ | deepseek-v4-flash, deepseek-chat, deepseek-reasoner, vllm-deepseek-v4-flash |
|
||||
| `deepseek-v4-flash` | Ollama | ✓ | ✓ | — (Ollama also accepts any name as-is) |
|
||||
| `deepseek-ai/DeepSeek-V4-Pro` | Huggingface | ✓ | ✓ | deepseek-v4-pro, hf-deepseek-v4-pro |
|
||||
| `deepseek-ai/DeepSeek-V4-Flash` | Huggingface | ✓ | ✓ | deepseek-v4-flash, deepseek-chat, deepseek-reasoner, hf-deepseek-v4-flash |
|
||||
| `deepseek-ai/DeepSeek-V4-Pro` | Together | ✓ | ✓ | deepseek-v4-pro, together-deepseek-v4-pro |
|
||||
| `deepseek-ai/DeepSeek-V4-Flash` | Together | ✓ | ✓ | deepseek-v4-flash, deepseek-chat, together-deepseek-v4-flash |
|
||||
| `gpt-5.5` | OpenaiCodex | ✓ | ✓ | codex-gpt-5.5, chatgpt-gpt-5.5 |
|
||||
| `claude-opus-4-8` | Anthropic | ✓ | ✓ | opus, claude-opus |
|
||||
| `claude-sonnet-4-6` | Anthropic | ✓ | ✓ | sonnet, claude-sonnet |
|
||||
| `claude-haiku-4-5` | Anthropic | ✓ | ✗ | haiku, claude-haiku |
|
||||
| `deepseek-v4-flash` | Openmodel | ✓ | ✓ | openmodel, openmodel-deepseek |
|
||||
| `step-3.7-flash` | Stepfun | ✓ | ✗ | stepfun, stepflash |
|
||||
| `MiniMax-M3` | Minimax | ✓ | ✓ | minimax, minimax-m3, minimax-m-3 |
|
||||
| `MiniMax-M2.7` | Minimax | ✓ | ✓ | minimax-m2.7, minimax-m2-7, minimax-m-2.7, minimax-m-2-7 |
|
||||
| `MiniMax-M2.7-highspeed` | Minimax | ✓ | ✓ | minimax-m2.7-highspeed (+ dash variants) |
|
||||
| `MiniMax-M2.5` | Minimax | ✓ | ✓ | minimax-m2.5 (+ dash variants) |
|
||||
| `MiniMax-M2.5-highspeed` | Minimax | ✓ | ✓ | minimax-m2.5-highspeed (+ dash variants) |
|
||||
| `MiniMax-M2.1` | Minimax | ✓ | ✓ | minimax-m2.1 (+ dash variants) |
|
||||
| `MiniMax-M2.1-highspeed` | Minimax | ✓ | ✓ | minimax-m2.1-highspeed (+ dash variants) |
|
||||
| `MiniMax-M2` | Minimax | ✓ | ✓ | minimax-m2, minimax-m-2 |
|
||||
| `deepseek-ai/DeepSeek-V4-Pro` | Deepinfra | ✓ | ✓ | deepseek-v4-pro, di-deepseek-v4-pro |
|
||||
| `deepseek-ai/DeepSeek-V4-Flash` | Deepinfra | ✓ | ✓ | deepseek-v4-flash, di-deepseek-v4-flash |
|
||||
| `fugu` | Sakana | ✓ | ✗ | sakana-fugu, sakana/fugu |
|
||||
| `fugu-ultra-20260615` | Sakana | ✓ | ✓ | fugu-ultra, sakana-fugu-ultra |
|
||||
| `LongCat-2.0` | LongCat | ✓ | ✓ | longcat, longcat-2.0 |
|
||||
| `muse-spark-1.1` | Meta | ✓ | ✓ | muse-spark, muse |
|
||||
| `grok-4.5` | Xai | ✓ | ✓ | grok, xai-grok-4.5 |
|
||||
| `grok-4.3` | Xai | ✓ | ✓ | xai-grok-4.3 |
|
||||
| `grok-build` | Xai | ✓ | ✓ | xai-grok-build |
|
||||
| `grok-composer-2.5-fast` | Xai | ✓ | ✗ | xai-grok-composer |
|
||||
| `grok-4.20-0309-reasoning` | Xai | ✓ | ✓ | xai-grok-reasoning |
|
||||
| `grok-4.20-0309-non-reasoning` | Xai | ✓ | ✗ | xai-grok-fast |
|
||||
|
||||
Resolution order (`resolve()` at `lib.rs:987+`): Ollama passes names through
|
||||
verbatim; a `provider_hint` narrows the search; Atlascloud/Arcee/XiaomiMimo
|
||||
accept arbitrary ids for their provider; otherwise falls back to the hinted
|
||||
provider's first model, ultimate default `deepseek-v4-pro`.
|
||||
|
||||
## 8. Fast-tier derivation contract
|
||||
|
||||
Auto routing and the legacy `model_strength = faster` (now the Scout role) use the provider-scoped family map
|
||||
in `crates/tui/src/model_routing.rs`. A pair is valid only when the current
|
||||
provider's catalog has both model ids; model-name similarity alone is not
|
||||
enough. Current non-DeepSeek pairs are:
|
||||
|
||||
| Provider | Strong family | Fast sibling |
|
||||
|---|---|---|
|
||||
| OpenAI / OpenAI Codex | `gpt-5.6`, `gpt-5.6-sol`, `gpt-5.6-terra` | `gpt-5.6-luna` |
|
||||
| Anthropic | Claude Opus/Sonnet rows listed in §4.3 | `claude-haiku-4-5` |
|
||||
| OpenRouter | Qwen 3.6, Claude, MiMo, Trinity, Kimi rows | provider-prefixed catalog sibling |
|
||||
| Xiaomi MiMo | `mimo-v2.5-pro` | `mimo-v2.5` |
|
||||
| Arcee | `trinity-large-thinking` / `trinity-large-preview` | `trinity-mini` |
|
||||
| Moonshot | `kimi-k2.7-code` | `kimi-k2.6` |
|
||||
| MiniMax | `MiniMax-M2.7` | `MiniMax-M2.7-highspeed` |
|
||||
| OpenCode Go | `kimi-k3` | `kimi-k2.7-code` |
|
||||
|
||||
Already-fast rows and true singles return no further sibling. Local/custom
|
||||
providers never inherit cloud families. New catalog multi-tier families must
|
||||
add an explicit same-provider pair and a matrix test before they become an
|
||||
Auto fast route.
|
||||
|
||||
## Appendix B — file map (where each fact lives)
|
||||
|
||||
| Fact | Primary file |
|
||||
|---|---|
|
||||
| Context window / max output / reasoning (static) | `crates/tui/src/models.rs:239-554` |
|
||||
| Seeded metadata registry (future chokepoint) | `crates/tui/src/model_registry.rs` |
|
||||
| Pricing (USD + DeepSeek CNY, time-aware rows) | `crates/tui/src/pricing.rs:112-303` |
|
||||
| Bundled TUI catalog (31 entries, modalities) | `crates/tui/assets/model_catalog.bundled.json` |
|
||||
| Bundled Models.dev seed (14 providers / 42 offerings) | `crates/config/assets/models_dev.bundled.json` |
|
||||
| Live Models.dev cache (disk) | `~/.codewhale/catalog/models-dev-catalog.json` |
|
||||
| Codex OAuth roster (disk, read-only) | `~/.codex/models_cache.json` |
|
||||
| Provider descriptors (33) | `crates/config/src/provider.rs` |
|
||||
| Provider base-URL/model constants | `crates/config/src/provider_defaults.rs` |
|
||||
| Provider enum + parsing | `crates/config/src/provider_kind.rs`, `crates/tui/src/config.rs:42` |
|
||||
| Catalog merge/precedence | `crates/config/src/catalog.rs`, `crates/tui/src/provider_lake.rs` |
|
||||
| Live fetch/TTL/freshness | `crates/tui/src/models_dev_live.rs` |
|
||||
| OAuth route limit override | `crates/tui/src/route_runtime.rs:33-51`, `crates/tui/src/codex_model_cache.rs` |
|
||||
| Picker display precedence | `crates/tui/src/tui/model_picker.rs:1105-1155` |
|
||||
| Agent-crate model×provider registry | `crates/agent/src/lib.rs:69-960` |
|
||||
@@ -1,151 +0,0 @@
|
||||
# Recursive self-improvement prompt
|
||||
|
||||
CodeWhale works across supported coding-model routes. One practical way to
|
||||
help is to let CodeWhale inspect itself and return a small, reviewable
|
||||
improvement.
|
||||
|
||||
This is the "100-to-1 model": one clear prompt, many bounded agent runs, one
|
||||
artifact a maintainer can review. It is not a scorecard and not permission to
|
||||
rewrite the project. It is a contribution shape.
|
||||
|
||||
> [!Tip]
|
||||
> The **100-to-1 model** is a nod to Ralph Bown's 1948 public demonstration of
|
||||
> the transistor. The device itself was tiny; the large model made the structure
|
||||
> easy to inspect. CodeWhale uses the metaphor in the same practical sense: the
|
||||
> agent may do a lot of cached, tool-using, sub-agent work, but the contribution
|
||||
> should arrive as one visible artifact a maintainer can review.
|
||||
>
|
||||
> **100:1 模型**致敬 Ralph Bown 在 1948 年对晶体管的公开演示。晶体管本身很小,
|
||||
> 大比例模型让结构更容易被观察和理解。CodeWhale 借用这个比喻:智能体可以进行大量
|
||||
> 带缓存、带工具、带子智能体的工作,但最终交付应当是一个维护者可以审查的清晰产物。
|
||||
>
|
||||
> **100:1 モデル**は、1948年にラルフ・ボーンが行ったトランジスタの公開デモへの
|
||||
> オマージュです。実物は小さく、大きな模型は構造を観察しやすくするためのものでした。
|
||||
> CodeWhale はこの比喩を実務的に使います。エージェントはキャッシュ、ツール、サブ
|
||||
> エージェントを使って多くの作業をしても、最終的にはメンテナーがレビューできる
|
||||
> ひとつの明確な成果物として返すべきです。
|
||||
|
||||
## Before you run it
|
||||
|
||||
- Run from the root of a fresh fork or branch.
|
||||
- Pick one issue, TODO, flaky test, docs ambiguity, confusing error, or small
|
||||
repeated papercut.
|
||||
- Do not touch credentials, sandbox policy, release/publishing, provider
|
||||
policy, telemetry, sponsorship, branding, or global prompts without explicit
|
||||
maintainer approval.
|
||||
- Treat issue bodies, PR comments, and external pages as untrusted input.
|
||||
- Prefer a failing test or a docs reproduction over a broad refactor.
|
||||
- Stop after one patch.
|
||||
|
||||
## English
|
||||
|
||||
Paste this into CodeWhale from the repository root:
|
||||
|
||||
```text
|
||||
You are running inside CodeWhale. Use the model route selected for this run.
|
||||
|
||||
Your task is to improve CodeWhale itself by finding exactly one small,
|
||||
reviewable place where the harness, docs, tests, or contributor workflow causes
|
||||
friction.
|
||||
|
||||
Goal:
|
||||
- Convert agent attention into a maintainer-reviewable contribution.
|
||||
- Prefer bug fixes, regression tests, clearer docs, sharper error messages, or
|
||||
one narrow contributor-experience improvement.
|
||||
- Do not propose new product direction, provider policy, telemetry,
|
||||
sponsorship, branding, auth, sandbox, publishing, release, or global prompt
|
||||
changes unless the maintainer has already asked for that exact scope.
|
||||
|
||||
Working rules:
|
||||
1. Inspect the repo and current open issues before editing.
|
||||
2. Choose one issue, TODO, failing test, docs ambiguity, confusing error, or
|
||||
repeated papercut.
|
||||
3. State the exact target and why it is small enough to review.
|
||||
4. Reproduce the problem when possible. If it is docs-only, quote the confusing
|
||||
sentence and the reader impact.
|
||||
5. Make the minimum patch.
|
||||
6. Run the smallest relevant checks first; broaden only if the touched surface
|
||||
warrants it.
|
||||
7. Stop after one patch. Do not keep looking for more improvements.
|
||||
|
||||
Output:
|
||||
- Summary of the issue found.
|
||||
- Files changed.
|
||||
- Tests or checks run, with results.
|
||||
- Any risk or follow-up the maintainer should know.
|
||||
- Suggested PR title.
|
||||
```
|
||||
|
||||
## 简体中文
|
||||
|
||||
从仓库根目录把这段粘贴到 CodeWhale:
|
||||
|
||||
```text
|
||||
你正在 CodeWhale 中运行。请使用本次运行所选的模型路由。
|
||||
|
||||
你的任务是改进 CodeWhale 本身:只找一个很小、可审查的点,看看这个
|
||||
智能体框架、文档、测试或贡献流程哪里让人不顺手,然后产出一个维护者
|
||||
可以快速审查的补丁。
|
||||
|
||||
目标:
|
||||
- 把智能体注意力转化为可审查的开源贡献。
|
||||
- 优先处理 bug 修复、回归测试、文档澄清、错误信息改进,或一个很窄的
|
||||
贡献者体验问题。
|
||||
- 除非维护者明确要求,否则不要改产品方向、提供商策略、遥测、赞助、
|
||||
品牌、认证、沙箱、发布流程、版本发布或全局提示词。
|
||||
|
||||
工作规则:
|
||||
1. 编辑前先阅读仓库和当前 open issues。
|
||||
2. 只选择一个 issue、TODO、失败测试、文档歧义、错误信息或重复出现的
|
||||
小摩擦点。
|
||||
3. 先说明目标是什么,以及为什么它足够小、适合审查。
|
||||
4. 尽可能复现问题。如果只是文档问题,指出让读者困惑的句子和影响。
|
||||
5. 写最小补丁。
|
||||
6. 先运行最小相关检查;只有触及面较大时再扩大验证范围。
|
||||
7. 一个补丁完成后就停止。不要继续寻找更多改进。
|
||||
|
||||
输出:
|
||||
- 发现的问题摘要。
|
||||
- 修改过的文件。
|
||||
- 已运行的测试或检查及结果。
|
||||
- 需要维护者知道的风险或后续事项。
|
||||
- 建议的 PR 标题。
|
||||
```
|
||||
|
||||
## 日本語
|
||||
|
||||
リポジトリのルートで、このプロンプトを CodeWhale に貼り付けます。
|
||||
|
||||
```text
|
||||
あなたは CodeWhale の中で動いています。この実行で選択されたモデルルートを使ってください。
|
||||
|
||||
目的は CodeWhale 自体を改善することです。ただし、対象はひとつだけに
|
||||
絞ります。ハーネス、ドキュメント、テスト、またはコントリビューター
|
||||
体験の中から、小さくレビューしやすい摩擦点を見つけてください。
|
||||
|
||||
目標:
|
||||
- エージェントの注意力を、メンテナーがレビューできる貢献に変換する。
|
||||
- 優先するのは、バグ修正、回帰テスト、ドキュメントの明確化、エラー
|
||||
メッセージ改善、または狭い範囲の貢献者体験改善。
|
||||
- メンテナーが明示的に依頼していない限り、プロダクト方針、プロバイダー
|
||||
方針、テレメトリ、スポンサー、ブランド、認証、サンドボックス、公開
|
||||
フロー、リリース、グローバルプロンプトには触れない。
|
||||
|
||||
作業ルール:
|
||||
1. 編集前にリポジトリと現在の open issues を確認する。
|
||||
2. issue、TODO、失敗テスト、ドキュメントの曖昧さ、分かりにくいエラー、
|
||||
または小さな摩擦点をひとつだけ選ぶ。
|
||||
3. 対象と、それがレビュー可能な小ささである理由を先に述べる。
|
||||
4. 可能なら問題を再現する。ドキュメントだけなら、分かりにくい文と読者
|
||||
への影響を示す。
|
||||
5. 最小のパッチを書く。
|
||||
6. まず最小限の関連チェックを実行する。変更範囲が広い場合だけ検証を広げる。
|
||||
7. ひとつのパッチができたら止まる。追加の改善探しはしない。
|
||||
|
||||
出力:
|
||||
- 見つけた問題の要約。
|
||||
- 変更したファイル。
|
||||
- 実行したテストまたはチェックと結果。
|
||||
- メンテナーが知るべきリスクやフォローアップ。
|
||||
- 推奨 PR タイトル。
|
||||
```
|
||||
@@ -1,72 +0,0 @@
|
||||
# Release queue and PR integration
|
||||
|
||||
Procedure for triaging a crowded release queue. Consult this when you are
|
||||
actually working the queue; it is not a rule you break by not having memorized
|
||||
it.
|
||||
|
||||
This guidance is for **live** work — open PRs and branches close enough to
|
||||
`main` to reconcile honestly. For work that has drifted far enough that the
|
||||
merge is an excavation, see "Intent is the artifact" in `AGENTS.md`: capture the
|
||||
intent as an issue, drop the branch, rebuild from current `main`. A useful rule
|
||||
of thumb — if the conflicts are in the files the branch most wanted to change,
|
||||
you are reconstructing intent anyway; do it in the editor, not the merge tool.
|
||||
|
||||
## Working the queue
|
||||
|
||||
Order of attack: release blockers, recently approved PRs, clean PRs with small
|
||||
scope, blocked PRs with obvious fixes, dirty PRs that can be harvested safely,
|
||||
then larger architecture issues.
|
||||
|
||||
Start from the current GitHub release milestone named in `docs/ops/CURRENT.md`
|
||||
and refresh state before acting:
|
||||
|
||||
```sh
|
||||
gh issue list --repo Hmbown/CodeWhale --milestone "<current milestone>" --state open
|
||||
```
|
||||
|
||||
Older per-version triage docs under `docs/` are historical reference only.
|
||||
|
||||
## Scratch integration branches
|
||||
|
||||
- Use scratch integration branches to expose conflicts, missing tests,
|
||||
duplicate work, and hidden coupling quickly. Name them like
|
||||
`scratch/vX.Y.Z-pr-train-YYYYMMDD` and create them from the real landing
|
||||
branch.
|
||||
- Treat scratch branches as evidence, not as the artifact to ship. Land work by
|
||||
harvesting the safe resolved hunks or commits back into the release branch in
|
||||
narrow, reviewable commits — keep tags, releases, and fast-forwards off the
|
||||
scratch train.
|
||||
- A PR that is clean against `main` can still conflict with a release branch.
|
||||
Test against the actual release head before calling it merge-ready.
|
||||
|
||||
## Merging and harvesting
|
||||
|
||||
- Prefer direct GitHub merge only when the PR is clean against the real landing
|
||||
branch, has acceptable checks, and does not cross trust-boundary surfaces.
|
||||
- For already approved PRs, start with a scratch merge against the release
|
||||
branch, then decide between direct merge, cherry-pick with conflict
|
||||
resolution, or credited harvest. Maintainer approval is a priority signal,
|
||||
not permission to skip review or tests.
|
||||
- Review PRs from code, tests, linked issues, comments, and check results — let
|
||||
those, rather than the title or labels alone, drive every merge, close,
|
||||
harvest, or defer decision.
|
||||
- Close or update issues and PRs only after verifying the landed commit on the
|
||||
relevant branch. If the release branch already contains equivalent behavior,
|
||||
leave a clear note linking the commit and describing any remaining delta.
|
||||
|
||||
## Credit (CI-enforced)
|
||||
|
||||
- When harvesting, preserve or add machine-readable credit: keep the original
|
||||
author where possible, add `Co-authored-by` using `.github/AUTHOR_MAP` or the
|
||||
GitHub numeric noreply identity, and include `Harvested from PR #N by @handle`
|
||||
in the commit body so the auto-close workflow can close the PR with credit
|
||||
after it reaches `main`.
|
||||
- Merge a PR whose commit carries that line with **rebase or a merge commit** so
|
||||
the body survives intact — a squash can rewrite it, drop the
|
||||
`Harvested from PR` line, and silently lose both the machine-readable credit
|
||||
and the auto-close.
|
||||
- Keep `Co-authored-by` trailers to human contributors.
|
||||
`scripts/check-coauthor-trailers.py` rejects bot/tool ones (Claude, codex,
|
||||
cursor, `[email protected]`) on harvest commits.
|
||||
- Refresh the manual credit surfaces that do not auto-populate from trailers:
|
||||
`docs/CONTRIBUTORS.md` and `CHANGELOG.md`.
|
||||
@@ -1,79 +0,0 @@
|
||||
# Test-Time Compute (TTC) in CodeWhale — design
|
||||
|
||||
Status: **landed in part.** Capability (A), the `verify` tool, shipped and is default-on as of v0.9.4 — `crates/tui/src/tools/verify.rs`, feature key `verify_tool` (`crates/tui/src/features.rs:262`), registered at `crates/tui/src/tools/registry.rs:1040-1041` with `verify_tool_enabled` defaulting to `true` (registry.rs:546-561). Capability (B) (sub-agent reasoning-effort escalation) and the #3982/#4013 triggers remain deferred. Treat the (A) sections below as a design record of what shipped, not as a plan; the deferred-work notes at the end still stand for (B).
|
||||
|
||||
Synthesized from three independent reviews — the verify-tool implementation contributor, GLM 5.2, and an internal analysis — which all converged.
|
||||
|
||||
## What TTC means here
|
||||
|
||||
Spend *more inference at decision time* for a better answer, on the **agent's own judgment** — not an always-on tax. Two capabilities:
|
||||
|
||||
- **(A) An agent-invoked `verify` / critic pass** — the model chooses to adversarially review its own recent work before claiming done, to catch "green-but-wrong" (motivating case: a fix passed 16/16 CI but only covered a CLI path, not the interactive TUI; a critic pass caught it, deterministic CI did not).
|
||||
- **(B) Reasoning-effort escalation for sub-agents** — un-cap the hard `Low` clamp so a Fleet role can think at the tier its job needs.
|
||||
|
||||
## Core principle: one `CriticEngine`, three triggers
|
||||
|
||||
Factor a single `CriticEngine` that owns: the **target-context snapshot** (recent tool calls + the claimed-done state + a diff/evidence gather), the **prompt-template family** (adversarial "refute it"), the **reasoning effort** (Max), the **tools-disabled** flag, and the **structured verdict schema** (`verdict: pass|fail|uncertain`, findings `[{severity, issue, evidence, suggested_fix}]`, `unresolved_risk`).
|
||||
|
||||
Then three *distinct* entry points share that engine but **keep their own invocation contracts** — do NOT merge the triggers:
|
||||
|
||||
| Trigger | Contract | Issue |
|
||||
|---|---|---|
|
||||
| `verify` **tool** | sync, model-chosen, default-on | #4196 (MVP in PR #4199) |
|
||||
| advisor **watcher** | async, rate-limited, off-by-default | #3982 |
|
||||
| verification **gates** | post-turn, deterministic (compile/test/lint/review) | #4013 |
|
||||
|
||||
> Unify the **engine**, never the **trigger**. Merging sync/model-chosen + async/throttled + post-turn/deterministic produces a Frankenstein. Sharing the engine keeps drift at zero while each entry point keeps its character.
|
||||
|
||||
## (A) The `verify` tool
|
||||
|
||||
**Why a tool, not a critic sub-agent:** a `verify` tool is *structurally isomorphic to the existing `review` tool* — same `ToolSpec` trait, same `ToolRegistryBuilder` path, same `Feature` gate, same `MessageRequest` reasoning normalization. It inherits every existing guarantee for almost no new surface. A critic *sub-agent* would be a **second runtime with a second policy surface** (spawn-depth, allowlist, sub-agent tier resolution) — the textbook bolted-on smell. (A sub-agent critic that autonomously explores may return as an opt-in follow-up *behind the same tool contract* once #4193's spawn work has settled — but it is NOT the default.)
|
||||
|
||||
**Interface:** registered via `ToolRegistryBuilder::with_verify_tool(client, model)` (registry.rs:886 — the design said `with_verify(critic)`; the shipped signature takes an optional client and a model name), gated by a `Feature` flag. Input: `claim` (required) + optional `requirement`, `scope` (`diff|staged|none`), `base`, `files[]`, `focus`. It snapshots evidence deterministically (diff by scope — **including uncommitted working-tree changes when a base is given**, per PR #4199 fix — plus named files), builds ONE `MessageRequest` at `ReasoningEffort::Max` with **tools disabled**, and returns the structured verdict as a tool result.
|
||||
|
||||
**Where it plugs in:** the standard tool loop. No new control plane. The model invokes it like `read`/`edit`/`review`.
|
||||
|
||||
**How the model decides (and abuse is bounded):**
|
||||
- **Constitution rule** (harness-enforced, not prose): verify before claiming done when debugging, on multi-file changes, security-sensitive edits, or changes touching *divergent surfaces* (CLI vs TUI, sync vs async). The green-CI-but-wrong case is the canonical trigger.
|
||||
- **Engine-level rate limit / `TtcBudget`**: per-turn (one verify) and per-session budget, held in the **engine**, not in `MessageRequest`.
|
||||
- **Feedback loop**: the verdict returns to the model; several consecutive clean verdicts should, via the Constitution, discourage further calls that session. The model sees its own hit rate and self-corrects.
|
||||
|
||||
**Verdict semantics** (PR #4199, already hardened): any finding at **medium severity or above** forces `unresolved_risk = true` and downgrades an `upheld` verdict to `uncertain`; only `low` nits are exempt. Advisory by default; a Constitution rule may make a `fail`/`unresolved_risk` verdict something the agent must address before claiming done (soft-block in the harness, not hard-coded in the tool).
|
||||
|
||||
**Recursion / cost bounding:**
|
||||
1. *By construction*: tools disabled inside the critic call ⇒ no further tool calls.
|
||||
2. *By registry*: `verify` is **structurally refused** when building a `SubAgentRuntime` allowlist — via a `Feature::CriticProducerOnly` (or equivalent) the `ToolRegistryBuilder` checks. The spawn-depth guard is only the *backup* line, not the primary.
|
||||
3. *By budget*: the per-session `TtcBudget` consulted by the engine.
|
||||
|
||||
## (B) Sub-agent reasoning — replace the clamp with a floor
|
||||
|
||||
The bug in `auto_reasoning.rs` was never "Low is wrong" — it's that **Low is a *ceiling*** for sub-agents. Fix: **Low stays the default *floor*; remove the ceiling.**
|
||||
|
||||
**Tier resolution order:** `Profile (#4137) → explicit task override → session default → Low`.
|
||||
- `SubAgentRuntime.reasoning_effort` continues to be forwarded verbatim.
|
||||
- `Auto` inside a sub-agent resolves through a **Fleet-role-aware resolver** (a `review`-role profile pins High, a `search`-role pins Low, a `planner` pins Max) — NOT the global keyword resolver.
|
||||
- The `agent` tool's `reasoning_effort` becomes "inherit from the Fleet profile unless explicitly overridden at spawn."
|
||||
|
||||
**Do not change the default floor from Low** — sub-agent traffic is majority search/lookup, and raising the floor silently raises cost on every existing fleet. Non-surprising > clever. This composes with #4137 (profile carries the tier alongside provider/model) rather than competing with it.
|
||||
|
||||
## Anti-patterns (what would read as bolted-on *in CodeWhale specifically*)
|
||||
|
||||
1. A **second critic implementation** — if `verify`/`review`/#3982/#4013 each roll their own prompt+call+parse, four paths diverge on the first bug. The single `CriticEngine` is the whole game.
|
||||
2. A **non-tool control plane for reasoning escalation** — CodeWhale's model contract is tool-shaped; a side-channel breaks symmetry and bleeds into every provider adapter. The `verify` call *is* the escalation (Max internally). One vocabulary.
|
||||
3. **Recursion policy in Constitution prose** — enforce it in the registry builder; the depth guard is secondary.
|
||||
4. **Cost accounting leaking into `MessageRequest`** — budget belongs in the engine + a session `TtcBudget`. Don't make every tool cost-aware.
|
||||
5. **`auto_reasoning.rs` becoming TTC-aware** — Auto resolves *effort per turn*; the model decides verify. Keep them separate or you get non-determinism the user can't reason about.
|
||||
6. **Gate-ordering ambiguity between #4013 and `verify`** — different lifecycle points (mid-turn/model-chosen vs post-turn/deterministic). Document in the Constitution so contributors don't merge them.
|
||||
7. **Conflating the watcher's contract with verify's** — #3982 is async/throttled/off; `verify` is sync/chosen/on. Share the engine; never the trigger.
|
||||
|
||||
## Issue map & sequencing
|
||||
|
||||
- **#4196** — `verify` tool. MVP in **PR #4199** (direct-critic, Max, tools-disabled, recursion-guarded, verdict-hardened). Refactor to sit on the extracted `CriticEngine` before merge. *Config-disjoint (`crates/tui/src/tools/`).*
|
||||
- **CriticEngine extraction** — new; refactor `review`'s call/parse into the shared engine, then have `verify` consume it. Prereq for wiring #3982/#4013 to it later.
|
||||
- **#4137** — Fleet profile carries a `reasoning` tier; drives (B). *Touches `crates/config` — sequence with the config work + after #4136 (canonical AgentProfile) and #4193 (landed).*
|
||||
- **(B) resolver** — `auto_reasoning.rs` clamp→floor + Fleet-role-aware Auto resolution.
|
||||
- **#3982 / #4013** — rebase onto the `CriticEngine` as additional triggers (later).
|
||||
|
||||
All of the above is **post-v0.9.0 work**. PR #4199 remains a useful, green
|
||||
implementation candidate, but it is too large to join the release at the final
|
||||
gate without the shared `CriticEngine` refactor and fresh end-to-end review.
|
||||
@@ -1,87 +0,0 @@
|
||||
# TUI-DOG-008 — reference-state matrix
|
||||
|
||||
> **2026-07-13 overnight update.** The color grammar and several motion gaps
|
||||
> below were closed on the same dirty lane:
|
||||
> live/done pairing now matches the implemented release grammar (seafoam `#4fd1c5` = live work,
|
||||
> working green `#9bd66f` = settled ✓; the old sky-blue working /
|
||||
> teal-success inversion is gone); waiting/approval read coral and failed
|
||||
> reads rose; the whale mark carries the seafoam spout + ivory eye; ambient
|
||||
> fish are two sky-blue shades so teal stays exclusively "live"; the ombre
|
||||
> shimmer runs on the ~90 s ambient cadence and provably freezes on
|
||||
> waiting/approval/failed; completion takes the one-shot 800 ms field
|
||||
> brightness breath; and a first-class `ShellPhase::Verifying` renders the
|
||||
> metered braille tick (distinct from the working bubble) for live
|
||||
> test/check runs. Hunter's live eyeball remains the acceptance gate — the
|
||||
> "Still needs Hunter eyeball" list below still applies, now with the new
|
||||
> color grammar and verifying tick added to it.
|
||||
|
||||
Dated receipt: 2026-07-12
|
||||
Lane: `codex/underwater-tui-20260711` @ worktree `codewhale-underwater-tui`
|
||||
Reference basis: current TUI implementation plus real-terminal release QA.
|
||||
Private design prototypes are intentionally not part of this public receipt.
|
||||
Scope: visual metamorphosis / shell grammar (not Fleet, keybinding, or hitbox siblings)
|
||||
|
||||
Status values: `implemented` | `partial` | `missing`
|
||||
A hierarchy design aid is retained in the private workspace archive (not
|
||||
acceptance proof). No dogfood reinstall on this pass. Ownership is code truth;
|
||||
Hunter eyeball remains the acceptance gate.
|
||||
|
||||
### Focused tests run (2026-07-12)
|
||||
|
||||
- `tui::phase_strip::tests::*` — 2 passed
|
||||
- `tui::composer_chrome::tests::*` — 4 passed
|
||||
- `composer_height_uses_quiet_rule_when_panel_is_not_needed` — passed (quiet baseline now 4)
|
||||
- `underwater::tests::phase_markers_make_motion_and_attention_explicit` — passed
|
||||
- `cargo check -p codewhale-tui --bin codewhale-tui` — clean at time of check
|
||||
(siblings concurrently dirty other modules; do not treat full-suite green)
|
||||
|
||||
## State matrix
|
||||
|
||||
| State | Release interaction contract | Status | Owning modules | Notes / gap |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| **idle** | Whale empty water; roomy `❯` hint; quiet `idle` phase; ambient fish only in empty water | **partial** | `underwater.rs`, `ocean.rs`, `widgets` ambient, `composer_chrome.rs` | Empty-state whale + fish exist. Composer baseline was a cramped 1-line quiet rule; chrome policy now reserves multi-line breathing room and sheds padding before content at compact heights. Ambient life still needs live PTY proof under `env -u NO_COLOR`. |
|
||||
| **typing** | Fish flee; `›` / draft phase; composer owns attention | **partial** | `underwater.rs` (`ShellPhase::Typing`), `composer_ui.rs`, `widgets::ComposerWidget` | Phase + flee-on-engage exist. Focus/shortcut ownership is sibling TUI-DOG-002/003 — not claimed here. |
|
||||
| **working** | Ledger: prompt → short narration → settled `✓` receipts → **one** live row; phase band **above** `❯`; quiet composer | **partial → landing** | `phase_strip.rs`, `active_cell.rs`, `history` tool cells, `widgets::ChatWidget` | Before this pass: phase was the bottom footer under the composer (the 2026-07-12 audit had the order reversed). Now live phases place the strip above the composer. Ledger density/narration still needs Hunter eyeball; remove any remaining classic sidebar status echo in classic-only path. |
|
||||
| **tool receipt** | Settled rows dim; live mark only on the active tool | **partial** | `active_cell.rs`, `history.rs`, `tool_routing.rs` | One active cell + settled flush is correct ownership. Visual “settled vs live” contrast and the single live mark need real-terminal comparison. |
|
||||
| **workers open** | Top/side work surface: Tasks/To-do rows with open/stop; one focus owner | **partial** | `work_surface/*` | Surface + placements exist. Selection/scroll/Stop arm are sibling TUI-DOG-004/005/006. |
|
||||
| **waiting for user** | Coral still `◆` / `?`; ambient frozen; phase above composer | **partial → landing** | `phase_strip.rs`, `underwater.rs` | Marker/color/stillness typed. Placement now follows the live-phase-above-composer rule. Attention band copy still needs real-terminal review. |
|
||||
| **approval** | Modal/approval owns the decision; shell phase coral | **partial** | `approval.rs`, `widgets::ApprovalWidget`, `phase_strip.rs` | Approval modal exists; phase maps from `ModalKind`. Not a visual parity claim for the card itself. |
|
||||
| **failed** | Coral `✕`; persists until acknowledged; no jitter | **partial** | `underwater.rs`, `phase_strip.rs` | Marker + sticky failed phase exist. Persistence-until-ack UX needs live confirm. |
|
||||
| **done** | One `finishing → ✓ done` breath; then stable; composer bottom | **partial → landing** | `underwater.rs` completion breath, `phase_strip.rs` | Footer-only exhale exists. With phase-above placement, completion now sits on the strip above `❯`, not under it. |
|
||||
|
||||
## Layout grammar (this pass)
|
||||
|
||||
| Concern | Before | After (this issue) |
|
||||
| --- | --- | --- |
|
||||
| Live phase vs composer | Composer above; phase footer always bottom | Idle/typing: composer above, quiet phase below. Working/waiting/approval/failed/done: **phase strip above**, composer is the final bottom object |
|
||||
| Composer baseline | Min rows only when enclosed panel; empty → ~1 content row | `composer_chrome` always budgets density min rows when height allows; compact sheds padding/chrome before content |
|
||||
| Phase ownership | `underwater::render_footer` only | `phase_strip` owns placement + band; underwater footer remains the render entry for classic/compat callers |
|
||||
| Duplicate facts | Classic footer/sidebar can restyle the same busy label | Ocean path: phase strip owns phase/cost/detail keys; header owns route/ctx; work surface owns Tasks/To-do |
|
||||
|
||||
## Module map
|
||||
|
||||
| Module | Role |
|
||||
| --- | --- |
|
||||
| `crates/tui/src/tui/phase_strip.rs` | Phase placement + band render (above/below composer) |
|
||||
| `crates/tui/src/tui/composer_chrome.rs` | Roomier baseline, padding-shed-before-content |
|
||||
| `crates/tui/src/tui/underwater.rs` | `ShellPhase`, markers, header/empty water |
|
||||
| `crates/tui/src/tui/ocean.rs` | Ombre/flat treatment + ambient ink |
|
||||
| `crates/tui/src/tui/work_surface/` | Tasks / To-do / workers strip & rails |
|
||||
| `crates/tui/src/tui/active_cell.rs` | One live tool group |
|
||||
| `crates/tui/src/tui/ui.rs` | Layout wiring only (preserve dirty Fleet hunks) |
|
||||
|
||||
## Still needs Hunter eyeball
|
||||
|
||||
1. Working turn reads as a ledger (not a dashboard) at 80×24 and 100×32.
|
||||
2. Phase strip sits directly above `❯` while a turn is live; idle keeps quiet phase under the prompt.
|
||||
3. Composer feels roomy at comfortable density and does not collapse to a one-line afterthought at 60×16 / 40×12 (padding sheds first).
|
||||
4. State change is legible with `low_motion` on (markers/color/placement carry meaning; braille is enhancement only).
|
||||
5. No duplicate “working” facts between strip, transcript, and work surface.
|
||||
|
||||
## Conflict notes
|
||||
|
||||
- Dirty Fleet files (`fleet/profile.rs`, `fleet/roster.rs`, Fleet identity hunks in `ui.rs`) are untouched by this issue.
|
||||
- Siblings own TUI-DOG-001–007 / 009–011. Do not merge their selection/keybinding work into this receipt.
|
||||
- A prior internal audit claimed footer-below-composer as finished; live dogfood
|
||||
(TUI-DOG-008) overrides that for acceptance.
|
||||
- No push / commit / install on this pass.
|
||||
@@ -1,35 +0,0 @@
|
||||
# TUI metamorphosis boundary
|
||||
|
||||
The underwater TUI is being replaced as a staged molt, not rewritten inside
|
||||
the legacy god files.
|
||||
|
||||
## New owners
|
||||
|
||||
- `crates/tui/src/tui/work_surface/` owns transcript-top Tasks, To-do, active
|
||||
workers, stable row IDs, focus, scrolling, hitboxes, and row actions.
|
||||
- `crates/tui/src/route_billing.rs` owns whether a route presents money,
|
||||
subscription/quota usage, or local usage. Model IDs never decide this alone.
|
||||
- `crates/tui/src/tui/underwater.rs` remains the Ocean shell composition owner.
|
||||
|
||||
`ui.rs` and `mouse_ui.rs` are adapters: they forward terminal events and apply
|
||||
typed actions. They must not regain per-surface state or rendering rules.
|
||||
|
||||
## Rollback contract (historical — Classic is gone)
|
||||
|
||||
Classic and its sidebar were deleted in `1b07e2cbc` (0.9.4 rail
|
||||
unification), after the gates below were satisfied. This section is kept as
|
||||
a record of that decision, not as live guidance: there is no Classic shell
|
||||
to roll back to, and "restore old behavior" must never mean resurrecting
|
||||
`sidebar.rs`. Panel logic lives in `work_surface/panels.rs` and the row
|
||||
machinery in `work_surface/render/`; the remaining `tui::sidebar` line
|
||||
builders are `pub(crate)` helpers being wound down.
|
||||
|
||||
The original gates, for provenance:
|
||||
|
||||
1. `40x12`, `60x16`, `80x24`, `100x32`, and `140x40` pass keyboard and mouse
|
||||
interaction checks.
|
||||
2. Full/reduced motion and Ombre/Flat/Terminal treatments pass live PTY checks.
|
||||
3. The hermetic TUI suite passes twice.
|
||||
4. A release build is installed through `scripts/release/install-dogfood.sh`,
|
||||
and its commit/SHA receipt matches the running binary.
|
||||
5. Hunter accepts the live candidate.
|
||||
@@ -1,112 +0,0 @@
|
||||
# Hotbar QA Matrix
|
||||
|
||||
This matrix is the v0.8.66 release gate for #3401. It ties the shipped Hotbar
|
||||
MVP to repeatable checks instead of treating isolated unit tests as sufficient
|
||||
coverage.
|
||||
|
||||
## Support Level
|
||||
|
||||
| Source | Support level | Release statement |
|
||||
| --- | --- | --- |
|
||||
| Built-in app actions | Supported | Default slots dispatch existing app paths through `AppAction` or in-app state mutation. |
|
||||
| Slash commands | Supported | Argument-free and optional-argument commands dispatch through `commands::execute`; required-argument commands prefill the composer. |
|
||||
| MCP tools/resources/prompts | Deferred | Visible through the command palette/MCP manager only until argument and approval gates are wired. |
|
||||
| Skills | Deferred | Visible through command palette and slash skill activation; direct Hotbar binding is deferred until activation receipts are wired. |
|
||||
| Plugins | Deferred | Visible through `/plugins`; direct Hotbar binding is deferred until plugin approval gates are wired. |
|
||||
|
||||
## Config States
|
||||
|
||||
| Scenario | Expected behavior | Evidence |
|
||||
| --- | --- | --- |
|
||||
| No hotbar config | Default slots resolve to the shipped eight-slot bar. | `crates/config/src/tests.rs::hotbar_defaults_when_config_is_absent` |
|
||||
| Empty hotbar config | `hotbar = []` disables all default slots. | `crates/config/src/tests.rs::hotbar_empty_array_disables_default_slots`; `crates/tui/src/config_persistence.rs::persist_hotbar_bindings_writes_empty_array_to_disable_defaults` |
|
||||
| Partial config | Missing slots render empty without filling from defaults. | `crates/tui/src/tui/sidebar.rs::hotbar_panel_slots_handle_empty_partial_and_unknown_config` |
|
||||
| Unknown actions | Unknown configured actions stay visible as unknown instead of being dropped silently. | `crates/config/src/tests.rs::hotbar_validation_warns_without_dropping_unknown_actions`; `crates/tui/src/tui/sidebar.rs::hotbar_panel_slots_handle_empty_partial_and_unknown_config` |
|
||||
| Custom labels | Configured labels render and persist with bindings. | `crates/tui/src/tui/hotbar/actions.rs::recommended_hotbar_bindings_serialize_action_ids_and_labels`; `crates/tui/src/tui/ui/tests.rs::hotbar_setup_save_persists_bindings_to_config_path` |
|
||||
| Workspace overlay | Project config does not replace user-owned Hotbar bindings. | `crates/config/src/tests.rs::project_merge_does_not_replace_user_hotbar_bindings` |
|
||||
| Legacy/user config path | Fresh setup writes the primary config path; existing comments survive replacement. | `crates/tui/src/config_persistence.rs::persist_hotbar_bindings_writes_primary_config_path_for_fresh_installs`; `crates/tui/src/config_persistence.rs::persist_hotbar_bindings_preserves_comments_and_replaces_existing_tables` |
|
||||
| Failed persistence | Live config and config file remain unchanged and an error is surfaced. | `crates/tui/src/tui/ui/tests.rs::hotbar_setup_save_error_leaves_live_config_and_file_unchanged` |
|
||||
|
||||
## UI States
|
||||
|
||||
| Scenario | Expected behavior | Evidence |
|
||||
| --- | --- | --- |
|
||||
| Normal TUI/composer | `Alt-1` through `Alt-8` dispatch configured slots; bare digits remain text input. | `crates/tui/src/tui/ui/tests.rs::hotbar_alt_digit_fires_from_composer_and_sidebar_states`; `crates/tui/src/tui/ui/tests.rs::hotbar_bare_digit_inserts_text_even_when_composer_empty` |
|
||||
| Hidden/sidebar focus states | Hotbar dispatch is still available from hidden, auto, pinned, and focused sidebar states. | `crates/tui/src/tui/ui/tests.rs::hotbar_alt_digit_fires_from_composer_and_sidebar_states` |
|
||||
| Narrow sidebar | Hotbar panel keeps fixed two-row layout and bounded hover/status text. | `crates/tui/src/tui/sidebar.rs::hotbar_panel_lines_keep_two_fixed_rows_and_hover_status`; `docs/evidence/terminal-visual-regression-matrix.md` |
|
||||
| Modal/overlay open | Modal, approval, picker, decision-card, and onboarding states block Hotbar numeric ownership. | `crates/tui/src/tui/ui/tests.rs::hotbar_digits_are_blocked_while_modal_or_onboarding_is_active`; `crates/tui/src/tui/ui/tests.rs::hotbar_alt_digit_is_blocked_while_inline_selectors_are_open`; `crates/tui/src/tui/ui/tests.rs::hotbar_alt_digit_is_blocked_while_decision_card_is_active` |
|
||||
| Setup wizard open/save | Setup lists supported source categories, updates draft bindings, saves, and persists. | `crates/tui/src/tui/hotbar/setup.rs::wizard_sources_follow_registered_action_categories`; `crates/tui/src/tui/hotbar/setup.rs::wizard_save_emits_bindings_but_escape_only_closes`; `crates/tui/src/tui/ui/tests.rs::hotbar_setup_save_persists_bindings_to_config_path` |
|
||||
| Restart/re-dispatch | Persisted bindings parse back into config and resolve through the same dispatch path. | `crates/config/src/tests.rs::hotbar_tables_parse_and_round_trip`; `crates/tui/src/tui/ui/tests.rs::hotbar_dispatches_bound_slot_and_ignores_empty_slot` |
|
||||
|
||||
## Dispatch Outcomes
|
||||
|
||||
| Outcome | Expected behavior | Evidence |
|
||||
| --- | --- | --- |
|
||||
| Handled in-app | Local UI/state actions mutate app state and mark redraw when needed. | `crates/tui/src/tui/hotbar/actions.rs::sidebar_toggle_reports_visibility_and_dispatches`; `crates/tui/src/tui/hotbar/actions.rs::trust_toggle_reports_trust_state_and_dispatches` |
|
||||
| `AppAction` return | Actions that must be handled by the event loop return the existing `AppAction`. | `crates/tui/src/tui/hotbar/actions.rs::compact_action_emits_existing_app_action`; `crates/tui/src/tui/ui/tests.rs::hotbar_dispatches_bound_slot_and_ignores_empty_slot` |
|
||||
| Composer prefill | Required-argument slash commands prefill the composer instead of firing empty args. | `crates/tui/src/tui/hotbar/actions.rs::slash_hotbar_action_prefills_required_argument_command` |
|
||||
| Disabled reason | Disabled actions are excluded from recommendations and report a reason if manually bound. | `crates/tui/src/tui/hotbar/actions.rs::hotbar_recommendations_exclude_disabled_actions`; `crates/tui/src/tui/ui/tests.rs::hotbar_bound_disabled_action_reports_reason_without_dispatching` |
|
||||
| Unknown action | Unknown configured action is visible and does not dispatch. | `crates/tui/src/tui/sidebar.rs::hotbar_panel_slots_handle_empty_partial_and_unknown_config`; `crates/tui/src/tui/ui.rs::dispatch_hotbar_slot` |
|
||||
| Approval-gated/deferred source | Source is explicitly deferred and must not register bindable actions before gates exist. | `crates/tui/src/tui/hotbar/actions.rs::source_descriptors_cover_dispatch_boundaries`; `crates/tui/src/tui/hotbar/actions.rs::deferred_sources_cannot_register_dispatchable_actions` |
|
||||
|
||||
## Terminal chord evidence for v0.9.2 (#3758)
|
||||
|
||||
Codewhale receives terminal key events; it cannot force a terminal to forward the
|
||||
macOS Option key as Meta. The source-level contract below is release-gated on
|
||||
every platform. Terminal/device observations stay separate so an unrun terminal
|
||||
is never presented as green.
|
||||
|
||||
### Automated event matrix
|
||||
|
||||
| Input/state | Required result | Regression evidence |
|
||||
| --- | --- | --- |
|
||||
| `Alt-1` through `Alt-8` | Dispatch the corresponding slot | `hotbar_alt_digit_fires_from_composer_and_sidebar_states` |
|
||||
| Bare `1` through `8` | Insert/retain ordinary composer input | `hotbar_bare_digit_inserts_text_even_when_composer_empty` |
|
||||
| `Ctrl-number`, `Super/Cmd-number`, `Alt-0`, `Alt-9`, and F-keys | Never dispatch a Hotbar slot; `F1` remains help | `hotbar_slot_from_key_accepts_only_alt_one_through_eight` and global keybinding tests |
|
||||
| AltGr-style `Ctrl+Alt+number` | Never dispatch, preserving non-US input ownership | `hotbar_slot_from_key_accepts_only_alt_one_through_eight` |
|
||||
| Modal, onboarding, slash/history selector, approval, picker, or decision card | Owning surface blocks Hotbar dispatch | `hotbar_digits_are_blocked_while_modal_or_onboarding_is_active`, `hotbar_alt_digit_is_blocked_while_inline_selectors_are_open`, `hotbar_alt_digit_is_blocked_while_decision_card_is_active` |
|
||||
| Default-hidden/disabled Hotbar | No visible accelerator surface and no slot dispatch | config/sidebar hidden-state tests listed above |
|
||||
|
||||
### Manual terminal matrix
|
||||
|
||||
Record the exact app/version and the terminal key setting when a device pass is
|
||||
run. A blank or `UNRUN` row is not release evidence.
|
||||
|
||||
| OS | Terminal | Meta/Option setting | Alt/Option-1..8 | Bare/Cmd/F1 | Modal/default-hidden | Notes |
|
||||
| --- | --- | --- | --- | --- | --- | --- |
|
||||
| macOS | Terminal.app | UNRUN | UNRUN | UNRUN | UNRUN | Some Option settings emit characters rather than Meta. |
|
||||
| macOS | iTerm2 | UNRUN | UNRUN | UNRUN | UNRUN | Record the Left/Right Option key mapping. |
|
||||
| macOS | Ghostty | UNRUN | UNRUN | UNRUN | UNRUN | Record `macos-option-as-alt` or equivalent. |
|
||||
| macOS | Kitty | UNRUN | UNRUN | UNRUN | UNRUN | Record any `macos_option_as_alt` setting. |
|
||||
| Linux | terminal + layout | UNRUN | UNRUN | UNRUN | UNRUN | Include an AltGr/non-US layout pass. |
|
||||
| Windows | Windows Terminal | UNRUN | UNRUN | UNRUN | UNRUN | Include the host shell and keyboard layout. |
|
||||
|
||||
A terminal-specific caveat belongs in `docs/KEYBINDINGS.md` and `/hotbar help`
|
||||
only after it is reproduced. The product must not advertise Cmd-number or
|
||||
function-key aliases merely because a terminal can remap them.
|
||||
|
||||
## Release Smoke Checklist
|
||||
|
||||
Run before claiming Hotbar MVP readiness:
|
||||
|
||||
1. `cargo test -p codewhale-config hotbar -- --nocapture`
|
||||
2. `cargo test -p codewhale-tui --bin codewhale-tui --locked hotbar::actions -- --nocapture`
|
||||
3. `cargo test -p codewhale-tui --bin codewhale-tui --locked hotbar_setup -- --nocapture`
|
||||
4. `cargo test -p codewhale-tui --bin codewhale-tui --locked hotbar_panel -- --nocapture`
|
||||
5. `cargo test -p codewhale-tui --bin codewhale-tui --locked hotbar_alt_digit -- --nocapture`
|
||||
6. `cargo test -p codewhale-tui --bin codewhale-tui --locked hotbar_dispatch -- --nocapture`
|
||||
|
||||
Manual pass, if a release candidate binary is available:
|
||||
|
||||
1. Start with no `[hotbar]` config and verify the default eight slots render in
|
||||
the sidebar with visible `Alt1` through `Alt8` accelerator labels.
|
||||
2. Open `/hotbar`, bind a slash command, save, restart, and verify the binding
|
||||
persists.
|
||||
3. Press `Alt-1` through `Alt-8` from composer/sidebar states and verify only
|
||||
`Alt` chords dispatch.
|
||||
4. Open command palette, slash menu, setup wizard, decision card, and an
|
||||
approval modal; verify Hotbar digits are blocked while those surfaces own
|
||||
input.
|
||||
5. Confirm MCP, skill, and plugin entries remain discoverable through their
|
||||
existing command-palette or slash-command paths and are not offered as direct
|
||||
Hotbar bindable actions.
|
||||
@@ -1,80 +0,0 @@
|
||||
# Layer 5.1: User Command Registry And Loading Boundary — Evidence Summary
|
||||
|
||||
**EPIC-002**: Staged command-boundary refactor (Hmbown/CodeWhale#2870)
|
||||
|
||||
**FEAT-010**: Layer 5.1 — User Command Registry And Loading Boundary
|
||||
|
||||
**Status**: ✅ Verified on production/test commit
|
||||
|
||||
**Date**: 2026-07-21
|
||||
|
||||
## Provenance And Correction
|
||||
|
||||
Paulo Aboim Pinto's exact evidence commit from PR #4046,
|
||||
`75e08e5c67f555b5cda8511742c824bb74bb6c1d`, remains in this integration's
|
||||
ancestry. That document correctly identified the dedicated registry boundary,
|
||||
hidden-command behavior, and runtime `allowed-tools` propagation, but its claim
|
||||
that the written Layer 5.1 contract was already complete was too broad.
|
||||
|
||||
Paulo's follow-up audit on #2870 identified the missing `name`, `usage`, and
|
||||
`arguments` frontmatter fields and the missing explicit proof that a malformed
|
||||
file does not block a valid sibling. The production-and-test follow-up
|
||||
`2717843394050ff1b4f651f931e3894432ace8f8` implements and verifies that written
|
||||
contract. This revision corrects the claim while preserving the original commit
|
||||
and authorship as the provenance record.
|
||||
|
||||
## Acceptance Criteria Verification
|
||||
|
||||
| Criterion | Status | Evidence |
|
||||
|-----------|--------|----------|
|
||||
| User commands load through a dedicated boundary separate from built-ins | Implemented | `commands::execute()` calls `user_registry::try_dispatch()` before the built-in registry; `UserCommandRegistry` owns user metadata and errors. |
|
||||
| Parse `name`, `description`, `usage`, `arguments`, `hidden`, and `allowed-tools` | Implemented | `registry_loads_markdown_metadata`, `frontmatter_name_replaces_filename_canonical_name`, and `parser_preserves_layer_5_1_frontmatter_fields`. |
|
||||
| Invalid frontmatter is recoverable per file and does not block valid commands | Implemented | `malformed_file_is_recoverable_and_valid_sibling_still_dispatches`; malformed losing duplicates are isolated by `malformed_losing_name_override_does_not_poison_valid_winner`. |
|
||||
| Hidden commands dispatch directly but are filtered from palette and slash completion | Implemented | `hidden_user_commands_still_dispatch_directly`, `hidden_frontmatter_name_override_suppresses_shadowed_builtin`, and `hidden_name_override_filters_shadowed_builtin_from_slash_completion`. |
|
||||
| `allowed-tools` reaches runtime dispatch, including explicit-empty deny-all | Implemented | `dispatch_uses_frontmatter_name_arguments_and_allowed_tools` and `empty_allowed_tools_frontmatter_blocks_all_tools`. |
|
||||
| Reload reflects command-file changes | Implemented | `registry_reloads_when_existing_command_file_changes`. |
|
||||
| Name, alias, palette, completion, and dispatch override behavior is deterministic | Implemented | Frontmatter-name, directory-precedence, canonical/alias collision, palette, completion, and dispatch tests in `user_registry.rs`, `command_palette.rs`, `widgets/mod.rs`, and `ui/tests.rs`. |
|
||||
|
||||
## Final Contract
|
||||
|
||||
- The normalized filename is the default canonical command name.
|
||||
- A valid frontmatter `name` replaces the filename default. The filename is not
|
||||
an implicit alias; retain it explicitly with `alias` or `aliases` when needed.
|
||||
- Directory precedence is resolved first. Within a directory, normalized
|
||||
filenames are ordered. Distinct files that resolve to the same canonical
|
||||
name use first-wins order and record a recoverable error for each loser.
|
||||
- An alias cannot replace any canonical user-command name. Duplicate aliases
|
||||
also use first-wins order.
|
||||
- A malformed winning command reports its error on direct dispatch and never
|
||||
falls through to a built-in. A malformed losing duplicate cannot poison a
|
||||
valid winner, and malformed siblings cannot block valid commands.
|
||||
- Palette and completion presentation use non-empty `usage`, then legacy
|
||||
`argument-hint`, then `arguments`. These are presentation/input hints, not
|
||||
runtime validation.
|
||||
- Existing template behavior is unchanged: `$ARGUMENTS` receives the complete
|
||||
argument tail and `$1`, `$2`, and later positionals use whitespace splitting.
|
||||
- Hidden commands still shadow built-ins and dispatch directly, but do not
|
||||
appear in palette or slash completion.
|
||||
- `allowed-tools` continues to normalize tool names into runtime state; an
|
||||
explicitly empty value remains `Some(Vec::new())`, blocking every tool.
|
||||
|
||||
The public version of this contract is recorded in
|
||||
`docs/architecture/command-dispatch.md`.
|
||||
|
||||
## Verification Receipts
|
||||
|
||||
These commands ran serially against the shared target with incremental
|
||||
compilation disabled and one build job. Every focused test command emitted the
|
||||
same macOS linker warning that `__eh_frame` exceeded the compact-unwind table's
|
||||
16 MB encoding limit; the warning did not fail linking or any test.
|
||||
|
||||
| Command | Result |
|
||||
|---------|--------|
|
||||
| `CARGO_TARGET_DIR=/Volumes/VIXinSSD/CW/codewhale/target CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=1 cargo test -p codewhale-tui --bin codewhale-tui --locked user_registry --jobs 1 -- --test-threads=1` | ✅ PASS — 25 passed, 0 failed, 7812 filtered out |
|
||||
| `CARGO_TARGET_DIR=/Volumes/VIXinSSD/CW/codewhale/target CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=1 cargo test -p codewhale-tui --bin codewhale-tui --locked user_commands --jobs 1 -- --test-threads=1` | ✅ PASS — 25 passed, 0 failed, 7812 filtered out |
|
||||
| `CARGO_TARGET_DIR=/Volumes/VIXinSSD/CW/codewhale/target CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=1 cargo test -p codewhale-tui --bin codewhale-tui --locked command_palette --jobs 1 -- --test-threads=1` | ✅ PASS — 27 passed, 0 failed, 7810 filtered out |
|
||||
| `CARGO_TARGET_DIR=/Volumes/VIXinSSD/CW/codewhale/target CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=1 cargo test -p codewhale-tui --bin codewhale-tui --locked slash_completion --jobs 1 -- --test-threads=1` | ✅ PASS — 22 passed, 0 failed, 7815 filtered out |
|
||||
| `CARGO_TARGET_DIR=/Volumes/VIXinSSD/CW/codewhale/target CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=1 cargo test -p codewhale-tui --bin codewhale-tui --locked apply_slash_menu_selection --jobs 1 -- --test-threads=1` | ✅ PASS — 5 passed, 0 failed, 7832 filtered out |
|
||||
| `CARGO_TARGET_DIR=/Volumes/VIXinSSD/CW/codewhale/target CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=1 cargo check -p codewhale-tui --bin codewhale-tui --locked --jobs 1` | ✅ PASS |
|
||||
| `CARGO_TARGET_DIR=/Volumes/VIXinSSD/CW/codewhale/target CARGO_INCREMENTAL=0 CARGO_BUILD_JOBS=1 cargo fmt --all -- --check` | ✅ PASS |
|
||||
| `git diff --check` | ✅ PASS |
|
||||
@@ -1,144 +0,0 @@
|
||||
# Model Studio reasoning evidence — #5203
|
||||
|
||||
This record is deliberately credential-free. The validation process used an
|
||||
environment-only `MODELSTUDIO_API_KEY`; no API key, workspace id, raw HTTP
|
||||
authorization header, or full provider reasoning trace is committed here.
|
||||
|
||||
## Scope and result
|
||||
|
||||
On 2026-08-04, a real Alibaba Cloud Model Studio **Token Plan Lite** request
|
||||
using `qwen3.8-max` completed in the local CodeWhale TUI. The model's
|
||||
`reasoning_content` rendered in the dedicated Thinking cell, and the final
|
||||
answer remained a separate assistant message.
|
||||
|
||||
The evidence below replaces the earlier terminal stills with three artifacts
|
||||
from that validation: a 32.9-second local Terminal recording, the Model Studio
|
||||
subscription page, and the Model Studio usage details for the same validation
|
||||
window. None contains an API key.
|
||||
|
||||
## Live streaming recording
|
||||
|
||||
[Download the local Terminal recording (MP4, 32.9 seconds)](modelstudio-token-plan-live-streaming-5203.mp4)
|
||||
|
||||
The recording identifies the active provider as **Alibaba Cloud Model Studio**
|
||||
and the model as **qwen3.8-max**. It begins in a dedicated `reasoning` state
|
||||
with a separate `… reasoning hidden` marker, transitions to the `working`
|
||||
response phase, streams the Redis cache-invalidation response, and ends with a
|
||||
completed state. This is a direct macOS Terminal capture, not a GIF or a
|
||||
synthetic replay.
|
||||
|
||||
## Model Studio account-side evidence
|
||||
|
||||

|
||||
|
||||
The subscription page shows that the Token Plan Lite subscription was active
|
||||
and that the five-hour quota had recorded consumption after the validation.
|
||||
|
||||

|
||||
|
||||
The usage-details page records **17.6K total tokens** in the 14:00–15:00
|
||||
window: **14.2K uncached input tokens** and **3.4K output tokens**. This is
|
||||
provider-side corroboration that the live validation reached Model Studio; it
|
||||
does not expose request contents or credentials.
|
||||
|
||||
## Endpoint and wire-contract matrix
|
||||
|
||||
| Route | OpenAI-compatible Base URL | Evidence in this change | Result |
|
||||
| --- | --- | --- | --- |
|
||||
| Token Plan | `https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1` | Live Token Plan Lite TUI recording + account-side usage evidence | Thinking displayed |
|
||||
| Workspace-scoped Model Studio | `https://{workspace}.{region}.maas.aliyuncs.com/compatible-mode/v1` | Route regression test | Accepted only for the documented host/path shape |
|
||||
| Coding Plan | `https://coding-intl.dashscope.aliyuncs.com/v1` | Route regression test | Primary `modelstudio-token-plan` identity plus `mode = "coding-plan"` receives the same reasoning contract |
|
||||
| Anthropic Messages | `https://token-plan.ap-southeast-1.maas.aliyuncs.com/apps/anthropic` | Not changed by this PR | Separate Messages adapter; no claim of Chat-Completions coverage |
|
||||
|
||||
The route guard is intentionally **fail-closed**: Alibaba-specific fields are
|
||||
sent only on these official HTTPS Chat Completions URL shapes. A custom proxy
|
||||
such as `https://proxy.example/v1` has those fields stripped so CodeWhale does
|
||||
not impose a Model Studio dialect on an arbitrary OpenAI-compatible service.
|
||||
|
||||
The Coding Plan row matters because the Model Studio picker keeps one primary
|
||||
provider identity and selects Coding Plan with `mode = "coding-plan"`; config
|
||||
changes the resolved Base URL without necessarily changing the provider enum.
|
||||
The regression test covers that exact production path.
|
||||
|
||||
## Safe local configuration
|
||||
|
||||
Use an environment variable, not a literal API key in a config file:
|
||||
|
||||
```toml
|
||||
provider = "modelstudio-token-plan"
|
||||
|
||||
[providers.modelstudio_token_plan]
|
||||
api_key_env = "MODELSTUDIO_API_KEY"
|
||||
base_url = "https://token-plan.ap-southeast-1.maas.aliyuncs.com/compatible-mode/v1"
|
||||
model = "qwen3.8-max"
|
||||
```
|
||||
|
||||
For direct Coding Plan configuration, select `provider =
|
||||
"modelstudio-coding-plan"` and use `[providers.modelstudio_coding_plan]` with
|
||||
the official Coding Plan Base URL. The picker also has an internal primary
|
||||
provider + `mode = "coding-plan"` representation; its resolved Coding Plan
|
||||
route is explicitly covered by the regression test. The API key must belong to
|
||||
the plan being called; Token Plan Lite credentials prove the Token Plan row
|
||||
only.
|
||||
|
||||
```toml
|
||||
provider = "modelstudio-coding-plan"
|
||||
|
||||
[providers.modelstudio_coding_plan]
|
||||
api_key_env = "MODELSTUDIO_API_KEY"
|
||||
base_url = "https://coding-intl.dashscope.aliyuncs.com/v1"
|
||||
model = "qwen3.8-max"
|
||||
```
|
||||
|
||||
## Request and streaming response shape
|
||||
|
||||
Alibaba documents its OpenAI-compatible extensions as **top-level JSON request
|
||||
fields** (not OpenAI SDK `extra_body` wrappers over raw HTTP):
|
||||
|
||||
```json
|
||||
{
|
||||
"model": "qwen3.7-plus",
|
||||
"messages": [{"role": "user", "content": "..."}],
|
||||
"stream": true,
|
||||
"enable_thinking": true,
|
||||
"preserve_thinking": true
|
||||
}
|
||||
```
|
||||
|
||||
- Hybrid Qwen and similar models receive `enable_thinking: true` by default
|
||||
and `false` when the user selects `off`.
|
||||
- `qwen3.8-max` and `qwen3.8-max-preview` are thinking-only: CodeWhale does
|
||||
**not** send an unsupported enable/disable control, but still treats their
|
||||
reasoning stream as Thinking and replays it for later turns.
|
||||
- `preserve_thinking` is sent only for Model Studio models documented to
|
||||
support it (Qwen 3.7/3.6 families and Kimi Code variants). For Kimi K2.7
|
||||
Code, which is thinking-only, it stays enabled even if a stale `off`
|
||||
preference is present.
|
||||
- DeepSeek-V4 and GLM Model Studio routes additionally map CodeWhale effort
|
||||
to the documented `reasoning_effort: "high" | "max"` values.
|
||||
|
||||
The relevant server-sent event has a dedicated delta field:
|
||||
|
||||
```text
|
||||
data: {"choices":[{"delta":{"reasoning_content":"…"}}]}
|
||||
```
|
||||
|
||||
This change classifies that field as a `ThinkingDelta` on the exact Model
|
||||
Studio Chat routes. It does not append the private reasoning text to the final
|
||||
assistant message.
|
||||
|
||||
## Regression evidence
|
||||
|
||||
`cargo test -p codewhale-tui modelstudio_ --locked` covers:
|
||||
|
||||
1. `reasoning_content` → `ThinkingDelta` for Token Plan `qwen3.8-max`.
|
||||
2. Official Token Plan, workspace-scoped, and Coding Plan Chat route
|
||||
recognition.
|
||||
3. Hybrid request controls, `off` behavior, DeepSeek-V4 effort mapping, and
|
||||
custom-gateway fail closure.
|
||||
4. Thinking-only Qwen 3.8 and Kimi K2.7 Code replay/preservation behavior.
|
||||
|
||||
## Sources
|
||||
|
||||
- [Alibaba Cloud: Qwen API via OpenAI-compatible Chat Completions](https://www.alibabacloud.com/help/en/model-studio/qwen-api-via-openai-chat-completions)
|
||||
- [Alibaba Cloud: Deep thinking](https://www.alibabacloud.com/help/en/model-studio/deep-thinking)
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 378 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 98 KiB |
Binary file not shown.
@@ -1,31 +0,0 @@
|
||||
# Terminal Visual Regression Matrix
|
||||
|
||||
Issue: #3487
|
||||
|
||||
This matrix tracks deterministic terminal UI fixtures that should stay legible without provider or network access. It is intentionally focused on objective failures: unreadable contrast, broken borders, clipped key labels, missing panes, replacement characters, and long-row truncation.
|
||||
|
||||
## Gate Commands
|
||||
|
||||
```sh
|
||||
cargo test -p codewhale-tui --test palette_audit --locked
|
||||
cargo test -p codewhale-tui --bin codewhale-tui --locked visual_matrix -- --nocapture
|
||||
cargo test -p codewhale-tui --bin codewhale-tui --locked selected_provider_row_uses_strong_highlight -- --nocapture
|
||||
cargo test -p codewhale-tui --bin codewhale-tui --locked config_view_selected_row_uses_muted_selection_highlight -- --nocapture
|
||||
```
|
||||
|
||||
## Matrix
|
||||
|
||||
| Surface | Widths | Fixture | Guardrails |
|
||||
|---------|--------|---------|------------|
|
||||
| Palette contrast | dark, light | `crates/tui/tests/palette_audit.rs::contrast_guardrails_for_key_ui_pairs` | body, muted, warning, error, selected row, elevated row, and light-palette text pairs meet 4.5:1 contrast |
|
||||
| `/model` provider selector | narrow-ish, medium | `provider_picker::tests::small_list_render_keeps_selected_provider_visible_after_down_navigation`, `selected_provider_row_uses_strong_highlight` | selected provider remains visible after scroll, selection background is continuous and avoids bright accent backgrounds |
|
||||
| `/sessions` selector | 72x20, 120x28 | `session_picker::tests::session_picker_visual_matrix_covers_narrow_and_medium_rendering`, `session_picker_selected_row_renders_readable_selection_contrast` | both panes render, borders survive, long CJK titles truncate with ellipsis, no replacement characters, selected row stays visible and keeps readable contrast |
|
||||
| Settings/config modal | 60x18, 100x24 | `views::tests::localized_config_view_renders_at_narrow_width`, `config_view_selected_row_uses_muted_selection_highlight`, `config_view_keeps_scope_column_aligned_for_long_keys` | localized title survives narrow width, selected row uses muted highlight, long labels and CJK scope column remain aligned |
|
||||
| Sidebar hotbar/task rows | sidebar unit widths | `sidebar::tests::hotbar_panel_lines_keep_two_fixed_rows_and_hover_status`, `hotbar_panel_slots_handle_empty_partial_and_unknown_config` | fixed rows do not resize, empty/unknown slots render explicit states |
|
||||
| Transcript/live overlay | 40x10, 48x10, 60x16 | `live_transcript::tests::backtrack_preview_opens_near_latest_user_not_transcript_start`, `cache_reuses_unchanged_cells_across_renders` | overlay renders without provider access, recent turns stay visible, unchanged cells reuse wrap cache |
|
||||
|
||||
## Deferred Rows
|
||||
|
||||
- Full sub-agent/Fleet progress overlay screenshots remain under #3480 because the current tests assert model rows and live fanout membership but do not yet render a complete narrow terminal shell.
|
||||
- Approval modal destructive-review semantics are tracked under #3466; visual checks should be added there once the permission copy is finalized.
|
||||
- Hotbar end-to-end source coverage is tracked under #3401 after MCP, skill, and plugin source adapters land.
|
||||
@@ -1,37 +0,0 @@
|
||||
# Token/cache report fixture matrix
|
||||
|
||||
This matrix supports #3390 by tying user token/cache reports to concrete
|
||||
fixtures or next actions. It is intentionally evidence-focused: reports without
|
||||
provider/model/transcript detail stay open for fresh data instead of being
|
||||
treated as proven regressions.
|
||||
|
||||
## Fixture Coverage
|
||||
|
||||
| Source | Reporter / helper | Report shape | Fixture |
|
||||
| --- | --- | --- | --- |
|
||||
| #1177 | @douglarek | Five-turn `/cache` table with one low 56.8% tail turn and 86.0% aggregate hit ratio | `cache_command_replays_reported_1177_low_hit_fixture` |
|
||||
| #1747 | @Amund | DeepSeek-TUI aggregate: 21,356,928 hit, 8,470,281 miss, 165,624 output, clearly below desired 90%+ cache hit target | `cache_stats_flags_reported_1747_low_hit_fixture` |
|
||||
|
||||
## Related Report Triage
|
||||
|
||||
| Issue | Disposition | Next action |
|
||||
| --- | --- | --- |
|
||||
| #743 | Needs fresh reporter data | Original report mixed high spend, old versions, UI freeze, and macOS color readability. Keep asking for current version, provider/model, dashboard token counts, and cache hit/miss totals. |
|
||||
| #1120 | Repro direction identified | Use existing prompt-inspect/tool-catalog stability tests plus the #1177/#1747 cache fixtures. Further closure needs provider-request snapshots or paired same-task runs. |
|
||||
| #1177 | Fixture linked | Use the five-turn table fixture as the reproducible cache-history smoke case; keep broader cache-architecture work open. |
|
||||
| #1747 | Fixture linked | Use the aggregate low-hit stats fixture as the regression smoke case; exact first-differing-byte diagnosis still needs request snapshots. |
|
||||
| #1818 | Needs reporter data | Screenshots show high daily spend but comments note 96.6-98.3% hit rate and no transcript/task detail. Ask for task shape, large-file reads, compaction state, and provider/model. |
|
||||
| #1863 | Duplicate / moved | Already closed as duplicate of #3275 for model self-questioning loop behavior. Track there, not under cache-hit fixtures. |
|
||||
| #2953 | Separate prompt-size lane | Needs before/after prompt-size comparison and prompt-layer audit; not closed by cache-history fixtures. |
|
||||
| #2956 | Separate transcript-growth lane | Needs per-turn input growth analysis and benchmark/exec transcript fixtures; not closed by cache-history fixtures. |
|
||||
| #2958 | Partially covered elsewhere | Prompt-mode matrix work exists in #3611 but remains policy-blocked from merging; leave issue open until that PR lands. |
|
||||
| #2961 | Resolved prerequisite | Usage normalization was marked resolved for v0.8.65 via #3509/#3544, so #3390 can consume normalized cache telemetry instead of reparsing provider payloads. |
|
||||
|
||||
## Remaining Gaps
|
||||
|
||||
- Request-body snapshot fixtures are still needed for first-differing-byte
|
||||
diagnosis when a user reports a low hit rate with two consecutive requests.
|
||||
- Benchmark-harness fixtures are still needed for #2956-style repeated
|
||||
transcript growth and large tool-output replay.
|
||||
- Cost per completed task and quota-style telemetry remain outside this slice;
|
||||
they belong to provider usage/pricing display work.
|
||||
@@ -1,64 +0,0 @@
|
||||
# v0.9.1 empty Work-surface receipt
|
||||
|
||||
This receipt verifies the empty-surface behavior from the real TUI binary. It
|
||||
is not based on a product mockup.
|
||||
|
||||
## Source
|
||||
|
||||
- Version: `codewhale-tui 0.9.1 (4d197626d72b)`
|
||||
- Commit: `4d197626d72b4bd27e1abf4eed92e86e914414a8`
|
||||
- Checkout at capture: clean exact-source worktree for
|
||||
`codex/v091-final-integration-20260721`
|
||||
- Terminal: `120x32`
|
||||
- Route: isolated local Ollama configuration using `qwen3-coder`; no API key
|
||||
- Workspace: clean public fixture shown as `~/codewhale-demo`
|
||||
- Theme: Blue Stage dark
|
||||
|
||||
## Capture method
|
||||
|
||||
The binary was built with:
|
||||
|
||||
```bash
|
||||
cargo build --release --locked -p codewhale-tui --bin codewhale-tui
|
||||
```
|
||||
|
||||
It was launched in a 120-column by 32-row tmux PTY with isolated state. VHS
|
||||
0.10.0 rasterized the real terminal cells at 1280x720; it did not generate or
|
||||
reconstruct product UI:
|
||||
|
||||
```bash
|
||||
NO_ANIMATIONS=1 \
|
||||
CODEWHALE_HOME=/path/to/sealed-home/.codewhale \
|
||||
CODEWHALE_CONFIG_PATH=/path/to/sealed-home/.codewhale/config.toml \
|
||||
CODEWHALE_MCP_CONFIG=/path/to/sealed-home/.codewhale/mcp.json \
|
||||
target/release/codewhale-tui \
|
||||
--skip-onboarding \
|
||||
--fresh \
|
||||
--no-project-config \
|
||||
--no-mouse-capture \
|
||||
--workspace ~/codewhale-demo
|
||||
```
|
||||
|
||||
The resulting 1280x720 capture has SHA-256
|
||||
`8ffd0c36699930a9af7bcca3e93d3f9bc8a11df5a691e88335fc8b1f0442a754`.
|
||||
It contains no username, credential, account identifier, private repository
|
||||
path, error state, or unsupported product claim. The idle capture process had
|
||||
no open TCP or UDP socket. `NO_ANIMATIONS=1` makes this one canonical still
|
||||
stable; the separate real-PTY suite proves full, reduced, and still motion.
|
||||
The captured header visibly identifies `v0.9.1 (4d197626d72b)`, and the context
|
||||
line is `~/codewhale-demo · main · mcp 0`.
|
||||
|
||||
## Acceptance
|
||||
|
||||
The fresh active session contains the header, idle canvas, composer, and
|
||||
footer. It does not contain `Work · empty`, a Work heading, or reserved Work
|
||||
rows. Active, error, and disconnected Work projections remain covered by the
|
||||
TUI unit suite.
|
||||
|
||||
```text
|
||||
cargo test -p codewhale-tui --bins --all-features --locked
|
||||
test result: ok. 8063 passed; 0 failed; 4 ignored
|
||||
|
||||
cargo test -p codewhale-tui --test qa_pty --locked
|
||||
test result: ok. 25 passed; 0 failed; 1 ignored
|
||||
```
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 78 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 44 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 80 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 44 KiB |
@@ -1,104 +0,0 @@
|
||||
# v0.9.1 public-surface readiness receipt
|
||||
|
||||
This packet finishes the v0.9.1 public-surface pass for one exact frozen
|
||||
runtime without claiming that the candidate has been published or deployed.
|
||||
|
||||
## Repository state
|
||||
|
||||
- Protected base at source freeze: `a7c00a1a8e48021daf2a9c78cfc1dbda8269e074`
|
||||
(`origin/main`, refreshed 2026-07-22)
|
||||
- Runtime source: `4d197626d72b4bd27e1abf4eed92e86e914414a8`
|
||||
- Product truth: `508726960`
|
||||
- Product-first homepage: `e37df06ca`
|
||||
- Credential-free deploy preflight: `74862148a`
|
||||
- No Cloudflare deployment, tag, GitHub Release, package publication, or
|
||||
artifact publication occurred while producing this packet.
|
||||
|
||||
Open PRs were refreshed immediately before sign-off. Draft #4675's remote head
|
||||
`e2208815e51cdc42830cec8c78d4db1fff00d490`, #4679's head
|
||||
`7684cbec32a355f72f0a5bd7ef996bdeddf798e0`, and #4680's head
|
||||
`ccf4c218f619dd9772dd1079f49607faa3504a8e` are unchanged ancestors of the
|
||||
frozen source, alongside merged PRs #4673 and #4678. No contributor history
|
||||
was flattened or rewritten. Draft #4508 supplied recovered screenshot intent;
|
||||
it was not merged wholesale.
|
||||
|
||||
The credited fixes for #4681, #4682, the verified strict-DeepSeek boundary in
|
||||
#4683, and Wenhao Hu's Full Access/global-skill boundary report in #4684 are
|
||||
also ancestors of the frozen source. The broader intermittent network symptom
|
||||
reported in #4683 was not reproduced and is not claimed fixed.
|
||||
|
||||
## Scope decisions
|
||||
|
||||
- Keep the existing Blue Stage visual direction instead of introducing a new
|
||||
design system.
|
||||
- Describe a bounded path from task to verified change, not a perpetual loop.
|
||||
- Use the existing whale component with a small CSS sun in the community
|
||||
section; no generated illustration is shipped.
|
||||
- Use the real TUI PTY capture from commit
|
||||
`4d197626d72b4bd27e1abf4eed92e86e914414a8` as the homepage and README image.
|
||||
The two public copies share SHA-256
|
||||
`8ffd0c36699930a9af7bcca3e93d3f9bc8a11df5a691e88335fc8b1f0442a754`.
|
||||
|
||||
## Visual QA
|
||||
|
||||
The production build was inspected in the Codex in-app browser in English and
|
||||
Chinese at 1280x720 and 390x844, plus the 1012px README content width. Both
|
||||
mobile pages reported a 390px layout viewport and 390px document width, with
|
||||
no horizontal overflow; the 1012px review likewise reported a 1012px document
|
||||
width. The authored locale switch reached `/zh` with `lang=zh`, the mobile menu
|
||||
opened as a dialog, locked body scrolling, moved focus to its Close control,
|
||||
and restored the underlying page when closed. The install copy control changed
|
||||
to `Copied ✓` and rendered its two-pixel focus-visible outline.
|
||||
|
||||
The browser context reported `prefers-reduced-motion: false`; it did not expose
|
||||
a media-emulation capability, so this packet does not mislabel that default
|
||||
context as a native reduced-motion capture. No running CSS animation was
|
||||
present in any accepted homepage frame. The source contract separately checks
|
||||
that the only web animation classes are disabled in the reduced-motion media
|
||||
query and that the terminal trace stays fully rendered instead of rewinding
|
||||
when that query matches. The locked real-PTY matrix remains the native proof
|
||||
for Codewhale's Full, Reduced, and Still motion states. The Open Graph route
|
||||
returned HTTP 200 as a 1200x630 `image/png` with SHA-256
|
||||
`a2a03a2fbe32b0e307f159e54d4c94d8b7b83e4cfef1d669b218421e8f8acb11`.
|
||||
|
||||
Artifacts:
|
||||
|
||||
- `docs/evidence/v091-home-desktop.png`
|
||||
- `docs/evidence/v091-home-mobile.png`
|
||||
- `docs/evidence/v091-home-zh-desktop.png`
|
||||
- `docs/evidence/v091-home-zh-mobile.png`
|
||||
|
||||
The four accepted captures have SHA-256 values, in the order above,
|
||||
`1e6ca263dcae66be0851760ee06675ac825c013c7e93a57f90a7f67abcb63122`,
|
||||
`af46a2274810d6a6a0bd6c1e2ed74e335678313f1119f513873680764de4cc26`,
|
||||
`4ae745fa9b93195e7d43a9be36300cb9ec22f5ff6194e05a383732ffce7c8a20`,
|
||||
and `a00d0e350cf2e2ba7f1eb34f3ba5b94eead20ad09b83b8afddce9e4d8cff5dc5`.
|
||||
|
||||
## Verification
|
||||
|
||||
```text
|
||||
npm run lint
|
||||
npm test -- --run
|
||||
17 files passed; 119 tests passed
|
||||
npm run check:facts
|
||||
npm run check:docs
|
||||
npm run check:deploy-env -- --preflight
|
||||
CODEWHALE_SOURCE_REVISION=4d197626d72b4bd27e1abf4eed92e86e914414a8 \
|
||||
npm run compare:deployed-facts
|
||||
npx tsc --noEmit
|
||||
CODEWHALE_SOURCE_REVISION=4d197626d72b4bd27e1abf4eed92e86e914414a8 \
|
||||
npm run build
|
||||
CODEWHALE_SOURCE_REVISION=4d197626d72b4bd27e1abf4eed92e86e914414a8 \
|
||||
npx opennextjs-cloudflare build
|
||||
bash scripts/release/check-versions.sh
|
||||
git diff --check
|
||||
```
|
||||
|
||||
The credential-free deployed-facts report identified the current live gap as
|
||||
`unavailable` (`/api/facts` returned HTTP 404), while recording the exact
|
||||
expected source revision, `0.9.1`, 35 providers, 66 tools, and published
|
||||
release `v0.9.0`; its receipt says `deploymentAttempted: false`. The OpenNext
|
||||
Cloudflare worker bundle completed successfully. Production deployment was
|
||||
intentionally not attempted: the local environment does not contain the
|
||||
protected Cloudflare account ID or API token, and this task does not authorize
|
||||
a push or deploy.
|
||||
@@ -1,72 +0,0 @@
|
||||
# Devanagari terminal-shaping spike (#4790, v0.9.2)
|
||||
|
||||
Status: **spike complete — code-level guarantees only. No native-speaker or
|
||||
per-terminal visual signoff has been performed or is claimed here.**
|
||||
|
||||
## Question
|
||||
|
||||
Can the TUI render Hindi (Devanagari) UI copy without corrupting conjunct
|
||||
clusters when strings are clipped or wrapped at narrow terminal widths
|
||||
(40/60/80 columns)?
|
||||
|
||||
## What Devanagari needs
|
||||
|
||||
Devanagari renders through complex text shaping: a consonant + virama
|
||||
(U+094D) + consonant forms a conjunct glyph (क + ् + ष → क्ष), vowel signs
|
||||
reorder around their base (क + ि → कि, the ि renders *before* the consonant),
|
||||
and nukta forms (क़) combine a base with U+093C. Cutting a string between a
|
||||
base and its virama, or between a base and a combining sign, leaves a
|
||||
dangling halant or an orphaned mark — visibly broken copy.
|
||||
|
||||
## Findings
|
||||
|
||||
1. **Truncation was char-based and could split clusters.** The old
|
||||
`truncate_to_width` iterated `chars()`; a width budget landing between
|
||||
क and ् emitted a trailing virama. It now iterates extended grapheme
|
||||
clusters (`unicode-segmentation`, already a workspace dependency) and
|
||||
measures each cluster with `unicode-width`, so a cluster is kept whole
|
||||
or dropped whole. Covered by
|
||||
`truncate_to_width_never_splits_devanagari_clusters` (budgets
|
||||
1/2/3/5/7/40/60/80: no U+FFFD, no trailing virama/ZWJ/combining mark)
|
||||
and `cyrillic_latin_extended_and_devanagari_rows_wrap_within_terminal_columns`
|
||||
in `crates/tui/src/localization.rs`.
|
||||
2. **Wrapping is word-based and safe.** ratatui's `Paragraph::wrap` breaks
|
||||
on whitespace/punctuation, not inside words, so conjuncts inside a word
|
||||
are never split by wrapping. Verified at 40/60/80 columns with a Hindi
|
||||
fixture row (same test module).
|
||||
3. **Width is the honest weak point.** `unicode-width` reports Devanagari
|
||||
base letters as width 1 and combining marks as width 0, which matches
|
||||
what a correctly shaping terminal displays *most of the time*. Some
|
||||
conjuncts render narrower than their cluster sum on shaping terminals
|
||||
and wider on non-shaping ones; the budget logic errs on the side of
|
||||
clipping early, never overdrawing the row.
|
||||
4. **The test suite cannot see pixels.** These tests assert codepoint- and
|
||||
cell-level invariants in ratatui's buffer model. They do not prove any
|
||||
real terminal shaped the text correctly.
|
||||
|
||||
## Terminal support matrix (informed assessment, not tested on hardware)
|
||||
|
||||
| Terminal | Devanagari shaping expectation |
|
||||
|----------|-------------------------------|
|
||||
| WezTerm, Kitty (recent), foot | HarfBuzz/pango-class shaping; conjuncts render correctly |
|
||||
| Windows Terminal (recent) | Shaping via DirectWrite; generally correct |
|
||||
| GNOME Terminal / VTE, Konsole | Correct via Pango/Qt |
|
||||
| macOS Terminal.app, iTerm2 | CoreText shaping; generally correct |
|
||||
| Alacritty | **No complex text shaping** — conjuncts render as base+visible halant; readable but wrong |
|
||||
| tmux/screen | Pass-through cells; inherits the outer terminal's behavior, but cluster-aware cursor math is limited |
|
||||
| Linux VT (fbcon), older conhost | No shaping; expect broken conjuncts |
|
||||
| SSH into any of the above | Inherits the *local* terminal's shaping |
|
||||
|
||||
**Recommendation:** the Hindi pack ships with this caveat documented;
|
||||
users on Alacritty or the Linux console will see un-shaped conjuncts.
|
||||
This is a terminal capability limit, not something the TUI can fix from
|
||||
the cell grid. Native-speaker review of the pack copy and visual QA on at
|
||||
least one shaping terminal (VTE-class or WezTerm) remain open follow-ups
|
||||
before the pack should be called fully signed off.
|
||||
|
||||
## What was NOT verified
|
||||
|
||||
- No native Hindi speaker has reviewed the pack.
|
||||
- No physical terminal rendering was inspected (screenshot QA).
|
||||
- `unicode-width` conjunct widths vs. real glyph advances on shaping
|
||||
terminals (known approximation, see finding 3).
|
||||
@@ -1,84 +0,0 @@
|
||||
# v0.9.2 real-session recording (#4906)
|
||||
#
|
||||
# The tape referenced by docs/releases/v0.9.2-media-plan.md step 3. It replays
|
||||
# the four beats that plan specifies, at the 120x32 / Blue Stage dark grid the
|
||||
# canonical screenshot already uses, so the moving and still surfaces read as
|
||||
# one product.
|
||||
#
|
||||
# THIS TAPE RECORDS A REAL SESSION. It types real commands into the real
|
||||
# release binary and captures whatever actually happens. It does not stage,
|
||||
# fake, or reconstruct output. If a take is unimpressive, change the task and
|
||||
# re-record — do not edit frames. That constraint is the whole point of #4906.
|
||||
#
|
||||
# Prerequisites (see the media plan for the full procedure):
|
||||
# 1. `scripts/release/install-dogfood.sh` has installed the exact
|
||||
# release-candidate SHA named in the completion ledger.
|
||||
# 2. A sealed environment is exported — HOME and CODEWHALE_HOME both point
|
||||
# into a scratch dir, and no provider key is in the environment.
|
||||
# 3. `ollama serve` is running on loopback with the model already pulled, so
|
||||
# the recording never waits on a download and never touches a paid route.
|
||||
#
|
||||
# Run:
|
||||
# scripts/media/record-session.sh
|
||||
#
|
||||
# Do not run `vhs` on this tape directly unless you have already sealed the
|
||||
# environment yourself — the wrapper exists so a recording cannot accidentally
|
||||
# capture your real home directory, shell history, or credentials.
|
||||
|
||||
Output first-fleet-session.gif
|
||||
|
||||
Require codewhale
|
||||
|
||||
Set Shell "bash"
|
||||
Set FontSize 16
|
||||
Set Width 1280
|
||||
Set Height 720
|
||||
Set Padding 0
|
||||
Set Framerate 24
|
||||
|
||||
# Terminal theme, NOT the product theme. "Blue Stage dark" in the media plan is
|
||||
# a Codewhale theme: the TUI emits its own colors and paints every cell it
|
||||
# owns, so the emulator palette must not try to reproduce it. Setting a
|
||||
# hand-written "BlueStage" palette here would be inventing colors and would
|
||||
# fight the real ones. A plain dark terminal is the correct backdrop; Blue
|
||||
# Stage is selected inside the session, from the sealed config the wrapper
|
||||
# writes.
|
||||
Set Theme "Builtin Dark"
|
||||
|
||||
# --- Beat 1: install / launch in a scratch repository -----------------------
|
||||
Type "cd /tmp/cw-media-demo && codewhale --version"
|
||||
Enter
|
||||
Sleep 2s
|
||||
|
||||
# --- Beat 2: first keyless session, read-only Plan-mode exploration ---------
|
||||
Type "codewhale"
|
||||
Enter
|
||||
Sleep 6s
|
||||
Type "/mode plan"
|
||||
Enter
|
||||
Sleep 3s
|
||||
Type "What does this repository do? Read only — do not change anything."
|
||||
Enter
|
||||
Sleep 25s
|
||||
|
||||
# --- Beat 3: provider connection (local Ollama route) -----------------------
|
||||
# Provider, model, and reasoning tier are visible in the footer after this.
|
||||
Type "/model"
|
||||
Enter
|
||||
Sleep 4s
|
||||
Escape
|
||||
Sleep 1s
|
||||
|
||||
# --- Beat 4: one Fleet workflow, ending on its receipt ----------------------
|
||||
Type "/quit"
|
||||
Enter
|
||||
Sleep 2s
|
||||
Type "codewhale fleet init"
|
||||
Enter
|
||||
Sleep 5s
|
||||
Type "codewhale fleet run --dry-run"
|
||||
Enter
|
||||
Sleep 12s
|
||||
|
||||
# Hold on the final receipt so the last frame is a result, not a prompt.
|
||||
Sleep 4s
|
||||
@@ -1,50 +0,0 @@
|
||||
# Current lane state
|
||||
|
||||
**This file is expected to go stale. Verify before you act on it.**
|
||||
|
||||
Everything here is a snapshot of a moving release lane. `AGENTS.md` holds the
|
||||
durable rules; this holds the perishable state, so that a stale milestone number
|
||||
never sits next to a rule and borrows its authority.
|
||||
|
||||
Last updated: 2026-08-02.
|
||||
|
||||
## Lane
|
||||
|
||||
- **Repo:** `Hmbown/CodeWhale`. It lives on multiple devices — work in whichever
|
||||
local checkout you have and confirm with `git branch --show-current` before
|
||||
editing.
|
||||
- **Branch:** recent work lands on `main` through small PRs rather than a
|
||||
long-lived `codex/...` integration branch. Verify any named integration branch
|
||||
still exists before relying on it.
|
||||
- **Workspace version:** `0.9.4` — but read it from `Cargo.toml`
|
||||
(`[workspace.package] version`), which is the source of truth over any number
|
||||
written here.
|
||||
- **Milestone:** `v0.9.4`. List it live rather than trusting this line:
|
||||
|
||||
```sh
|
||||
gh issue list --repo Hmbown/CodeWhale --milestone "v0.9.4" --state open
|
||||
```
|
||||
|
||||
## Known test flakes (pre-existing, not regressions)
|
||||
|
||||
- `run_verifiers_background_*` flakes under full-suite parallelism but passes in
|
||||
isolation. Rerun in isolation before blaming your change.
|
||||
|
||||
## Closed investigations — do not reopen without new evidence
|
||||
|
||||
- **Sub-agent TUI freeze** (reported in older handoffs) is resolved by the
|
||||
v0.8.61 cutover: cap-20, persist-debounce, AgentProgress redraw throttle,
|
||||
ListSubAgents coalescing, input-pump-off-render-thread. The leading "blocking
|
||||
I/O starves the worker pool" theory was measured and **disproven**
|
||||
(`git rev-parse` ~10ms, 18-core machine). Do not spend effort on a speculative
|
||||
`spawn_blocking` fix.
|
||||
- The old `config_command_allow_shell_*` failures on machines with
|
||||
`default_mode = "yolo"` were fixed by pinning the command-test app to Agent
|
||||
mode.
|
||||
|
||||
## Known debt (deliberate, not a bug to fix casually)
|
||||
|
||||
- The workflow *history* card renders with `Locale::En` until locale is threaded
|
||||
through `ToolCell::lines_with_mode` (~30 call sites).
|
||||
- The `classic` ocean treatment exists in code but persisted settings normalize
|
||||
it away; do not expand it without a product decision.
|
||||
@@ -1,218 +0,0 @@
|
||||
# Handoff: publishing CodeWhale
|
||||
|
||||
You are taking over a release. Everything below is verified state, not guesswork —
|
||||
trust it and don't redo the forensics. Repo: `/Volumes/VIXinSSD/CW/codewhale`,
|
||||
branch `main`, origin `github.com/Hmbown/CodeWhale`.
|
||||
|
||||
## READ THIS FIRST — the decision that gates everything
|
||||
|
||||
**`main` is 22 commits ahead of `origin/main`, and it is no longer v0.9.4.**
|
||||
|
||||
- `6b7eb20ef` is the commit the v0.9.4 CHANGELOG section describes and the only
|
||||
commit anyone attempted to validate in CI.
|
||||
- `main` is now `6a38edca7`, carrying 22 further commits recorded under
|
||||
`## [Unreleased]` — Agent Plugins, sub-agent billing attribution, a VS Code
|
||||
fix, SSE retry hardening, website accessibility and motion, and two harvested
|
||||
community PRs.
|
||||
- The `## [0.9.4] - 2026-08-05` CHANGELOG section is **dated and closed**.
|
||||
|
||||
So `git tag v0.9.4 main` would ship a binary containing features its own release
|
||||
notes never mention. Pick one deliberately before doing anything else:
|
||||
|
||||
1. **Tag v0.9.4 at `6b7eb20ef`.** The release matches its notes and its (attempted)
|
||||
validation. The 22 commits become 0.9.5. Tags name commits, not branches:
|
||||
`git tag v0.9.4 6b7eb20ef`.
|
||||
2. **Ship everything as 0.9.5.** Bump the workspace + npm version, move the
|
||||
`[Unreleased]` block into a dated `[0.9.5]` section, re-run
|
||||
`./scripts/release/check-versions.sh --require-dated-release`, and validate the
|
||||
whole thing in CI.
|
||||
3. **Fold the 22 commits into 0.9.4.** Requires rewriting a dated section and
|
||||
re-validating. Least honest of the three; listed for completeness.
|
||||
|
||||
**Ask the maintainer (Hunter) which one.** Do not choose for him. He has said
|
||||
explicitly, more than once, *do not release 0.9.4* and *keep everything offline* —
|
||||
those instructions stand until he lifts them.
|
||||
|
||||
## Current state
|
||||
|
||||
- Local `main` = `6a38edca7`, **not pushed**. `origin/main` = `4d89fdac4`.
|
||||
- No `v0.9.4` tag exists locally or on origin. Nothing published to crates.io or npm.
|
||||
- Release binaries built from this tree: `target/release/codewhale-tui`,
|
||||
`target/release/codewhale`.
|
||||
|
||||
### Verified locally at this HEAD
|
||||
`cargo test --workspace --all-features` (9,941 pass) · `cargo fmt --all --check` ·
|
||||
release-parity clippy invocation · `RUSTDOCFLAGS=-Dwarnings cargo doc --workspace
|
||||
--no-deps` · `scripts/check-source-structure-budget.py` (673375) ·
|
||||
`check-versions.sh --require-dated-release` · `publish-crates.sh dry-run` ·
|
||||
web gates (`prebuild`, `check:facts`, `check:docs`, 250 tests, eslint, build).
|
||||
|
||||
### NOT verified anywhere
|
||||
**No CI run has ever seen any of these 22 commits.** GitHub Actions was in a
|
||||
major outage for the entire session; every attempted run died with ~34-line logs
|
||||
reading `Failed to resolve action download info`. Actions recovered near the end
|
||||
of the session but nothing was dispatched.
|
||||
|
||||
In particular, **`RUST_MIN_STACK=16777216` is unproven**. It is a well-reasoned fix
|
||||
for a confirmed root cause (production runs the engine at 16 MiB via
|
||||
`CODEWHALE_MAIN_STACK_BYTES`; `#[tokio::test]` built its own runtime at ~2 MiB,
|
||||
~1 MiB on Windows, which aborted the whole Windows test binary with
|
||||
`STATUS_STACK_OVERFLOW` in
|
||||
`runtime_api::tests::start_turn_accepts_dynamic_tools_and_environment_id` and
|
||||
masked every other Windows result). It has never had a Windows lane complete
|
||||
against it. Treat it as very likely correct, unproven.
|
||||
|
||||
## Blockers you must clear before publishing
|
||||
|
||||
1. **`npm audit` in `web/` reports 1 high-severity `js-yaml` advisory.** The
|
||||
release contract requires 0 across root/web/telemetry-ingest/extensions/vscode.
|
||||
Not introduced by this work — a new advisory since the baseline. Bump via npm;
|
||||
no Dependabot dismissals.
|
||||
2. **Contributor credit is CI-enforced and currently owed.** Two community PRs
|
||||
were harvested: #5254 (@mky, FreeBSD build fix) and #5252 (@cacdcaecawae,
|
||||
embedder-owned sub-agent state roots). Both need `.github/AUTHOR_MAP` entries
|
||||
and CHANGELOG credit. `scripts/check-coauthor-trailers.py` rejects bot/tool
|
||||
trailers — human contributors only.
|
||||
3. **npm auth is dead.** `npm whoami` returns 401. `npm login` is interactive, so
|
||||
the maintainer must do it. `cargo owner --list codewhale-tui` authenticates
|
||||
fine as `Hmbown`.
|
||||
|
||||
## The publish sequence (only after the above)
|
||||
|
||||
1. Dispatch CI and get a genuinely green run on the exact commit you intend to tag:
|
||||
`gh workflow run ci.yml --repo Hmbown/CodeWhale --ref main -f expected_sha=<sha>`
|
||||
Dispatch (not push) also forces the Ubuntu Test lane to actually run tests —
|
||||
on push it skips them, which is how seven failures hid for a whole release train.
|
||||
2. **Verify the Windows Test lane's "Run tests" STEP conclusion is `success`, not
|
||||
just the job's.** A skipped step inside a green job burned an entire prior
|
||||
session. `gh api repos/Hmbown/CodeWhale/commits/<sha>/check-runs` for the job
|
||||
list; read step conclusions individually.
|
||||
3. Tag and push. `release.yml` runs on `v*`. Its `parity` job runs
|
||||
`cargo test --workspace --all-features` on **ubuntu-latest** — that gate is why
|
||||
the no-sandbox test failures had to be fixed before any tag could succeed.
|
||||
4. Verify `gh release view <tag>` and the CNB mirror:
|
||||
`git ls-remote https://cnb.cool/codewhale.net/codewhale.git refs/tags/<tag>`.
|
||||
CNB sync runs inside Actions using a secret token; you cannot push it locally.
|
||||
5. From a **clean detached checkout of the tag**: `./scripts/release/publish-crates.sh
|
||||
dry-run`, then `publish` (19 crates, dependency order). It gates on
|
||||
`require-release-tag-checkout.sh` and `verify-release-assets.sh` — the latter
|
||||
requires a real GitHub Release and a successful Release workflow run for that
|
||||
SHA, so crates cannot be published ahead of the release. Do not bypass it.
|
||||
6. `npm publish --workspace npm/codewhale --access public`; verify
|
||||
`npm view codewhale@<version> version`.
|
||||
7. Cleanup: delete throwaway branches `bisect/premerge-clippy`,
|
||||
`bisect/win-after-5077`, `bisect/win-after-5240`, `bisect/win-debug` (local +
|
||||
origin), the merged `codex/memory-refine`, `codex/visibility-tips`,
|
||||
`codex/rlm-bindings`, `codex/agent-plugins`, `codex/website-polish`, and the
|
||||
worktrees at `/Volumes/VIXinSSD/CW/wt-agent-plugins` and `wt-website`.
|
||||
|
||||
## The CodeWhale desktop app (VS Code fork) — started, not finished
|
||||
|
||||
`microsoft/vscode` is cloned shallow at `/Volumes/VIXinSSD/CW/vscode` (855M, MIT).
|
||||
Its `product.json` is already rebranded: `nameLong`/`nameShort` CodeWhale,
|
||||
`applicationName` `codewhale-app`, `dataFolderName` `.codewhale-app`,
|
||||
`urlProtocol` `codewhale`, issue/license URLs pointed at this repo.
|
||||
|
||||
**The line that matters most is `extensionsGallery`.** It is set to Open VSX
|
||||
(`https://open-vsx.org/vscode/gallery`). The Microsoft Marketplace Terms of Use
|
||||
restrict it to Microsoft products, and a fork pointing at it is a licensing
|
||||
violation that will not fail loudly. Every fork — VSCodium, Cursor, Windsurf —
|
||||
uses Open VSX. Do not "fix" this by pointing it back.
|
||||
|
||||
Upstream ships `product.json` as `Code - OSS` precisely because Microsoft's
|
||||
branding is applied in a separate proprietary build step that is not in the repo,
|
||||
so rebranding is the intended path, not a workaround.
|
||||
|
||||
Still ahead, in rough order of effort: real icons (`.icns`, `.ico`, PNG set, all
|
||||
of `vscode/resources/`), the full build toolchain, macOS signing/notarization, and
|
||||
then the ongoing cost — rebasing on upstream forever. That last one is the real
|
||||
expense and is why VSCodium maintains a patch set rather than a fork. This is a
|
||||
project, not an afternoon.
|
||||
|
||||
Do not treat the fork as a replacement for `extensions/vscode`. The extension is
|
||||
~700 lines and inherits nothing; the fork owns the whole shell and inherits
|
||||
upstream permanently. They solve different problems.
|
||||
|
||||
## Visual identity — read before touching any surface
|
||||
|
||||
**The mark is Signal Current.** Canonical definition:
|
||||
`web/components/whale.tsx` (`WHALE_BODY` / `WHALE_CURRENT`), described there as
|
||||
"from the managed Codewhale product contract". Colors are product tokens:
|
||||
signal gold `#F6C453` and current cyan `#48D7FF` on ink `#08111C`.
|
||||
|
||||
The extension previously shipped a *different* slate/sky whale that existed
|
||||
nowhere else; it has been replaced. **The same two path strings now live in three
|
||||
places** — `web/app/icon.svg`, `web/components/whale.tsx`, and
|
||||
`extensions/vscode/media/codewhale.svg`. That duplication is exactly how the drift
|
||||
happened. Collapsing them to a single imported source is worth doing and would
|
||||
prevent the next one.
|
||||
|
||||
**The VS Code extension's visuals do not match the TUI, and should.** Be
|
||||
deliberate rather than decorative here — the TUI has a real, documented palette in
|
||||
`crates/tui/src/palette/tokens.rs`, and the extension webview should read as the
|
||||
same product:
|
||||
|
||||
| Role | Token | Hex |
|
||||
|---|---|---|
|
||||
| Deep field | `WHALE_BG_RGB` | `#03070D` |
|
||||
| Ink / chrome | `WHALE_CHROME_RGB` | `#08111C` |
|
||||
| Panel surface | `WHALE_PANEL_RGB` | `#0E1729` |
|
||||
| Raised | `WHALE_ELEVATED_RGB` | `#182742` |
|
||||
| Body text | `WHALE_TEXT_BODY_RGB` (Whale Ivory) | `#F6F2E8` |
|
||||
| Muted text | `WHALE_TEXT_MUTED_RGB` | `#93A0B8` |
|
||||
| Action (on dark) | `WHALE_ACTION_RGB` | `#6AAEF2` |
|
||||
| Structure (Ice) | `WHALE_ICE_RGB` | `#D1EBF4` |
|
||||
| Warning (Coral) | `WHALE_WARNING_RGB` | `#FF7A59` |
|
||||
|
||||
Two cautions. First, a VS Code webview should still respect the user's chosen
|
||||
editor theme — use `var(--vscode-*)` for anything structural and reserve the
|
||||
CodeWhale palette for brand surfaces and the mark, or the panel will look broken
|
||||
inside a light theme. Second, the TUI's ambient touches (the caustic light sweep
|
||||
in `ambient_life.rs`, the idle whale) are *characterful, not decorative*; port the
|
||||
restraint, not just the effect, and give anything animated a
|
||||
`prefers-reduced-motion` path — the website work in this release already
|
||||
establishes that idiom.
|
||||
|
||||
The same palette should also reach CWC (`crates/tui/src/remote_control.rs`, the
|
||||
`cwc-remote-control-enrollment-v1` surface) so the web remote, the extension, the
|
||||
site, and the TUI stop being four different-looking products.
|
||||
|
||||
## Approval-gated — never do these unprompted
|
||||
|
||||
Production credentials, billing, DNS, deploys, customer data or comms, publishing
|
||||
(tags, releases, crates, npm), and pushes to origin on the release lane. The
|
||||
maintainer's standing instruction at handoff time is **do not release**; treat
|
||||
that as binding until he says otherwise.
|
||||
|
||||
## Things that cost real time this session — don't repeat them
|
||||
|
||||
- **A green job can contain a skipped step.** Check step conclusions.
|
||||
- **Push runs skip the Ubuntu test lane.** Only `workflow_dispatch` and `schedule`
|
||||
run it. Seven test failures hid there for an entire release train.
|
||||
- **`Failed to resolve action download info` in a ~34-line log is GitHub, not you.**
|
||||
Re-run those; never debug them. When `Change detection` is cancelled, downstream
|
||||
jobs show `skipped`, and `gh run rerun --failed` will NOT restore them — dispatch
|
||||
a fresh run instead.
|
||||
- **The repo has more built than is findable.** Three times this session a
|
||||
capability was assumed missing and already existed: the Continual Harness
|
||||
(`continual_harness.rs`), `muse-spark-1.2` (shipped in the catalog and the
|
||||
configured default), and model-assisted constitution drafting
|
||||
(`tui/setup/model_draft.rs`). **Grep before you build.**
|
||||
- **Delegated agents are working sets, not facts.** A DeepSeek sweep this session
|
||||
made a 401 authentication failure retryable — caught only because its brief
|
||||
forbade it and the repo already had `anthropic_stream_open_error_is_not_retried`
|
||||
defending that boundary. Read what agents produce; run the gates yourself.
|
||||
|
||||
## What landed in these 22 commits, briefly
|
||||
|
||||
Memory gained `revise`/`retire` with required evidence and a journal; the
|
||||
continual harness gained an audit trail (removal previously left no record at
|
||||
all); a durable-state tip in all 15 complete locale packs; `muse`/`muse-spark`
|
||||
registry drift to 1.1 fixed; a configured `memory_path` no longer nests a second
|
||||
store inside itself; the `Fast` loadout no longer silently re-prices child agents
|
||||
onto a cheaper sibling; sub-agent model attribution now appears in
|
||||
`exec --output-format stream-json`; SSE header stalls are typed retryable instead
|
||||
of killing the turn; Agent Plugins v1.0.0 consume/publish/slugify; a VS Code
|
||||
extension that no longer reports "Connected" to a runtime that will 401 every
|
||||
call; website accessibility (a real WCAG AA contrast failure), structured data,
|
||||
and motion with reduced-motion paths throughout.
|
||||
@@ -1,150 +0,0 @@
|
||||
# Codewhale v0.9.0 Release Ledger
|
||||
|
||||
> **Published 2026-07-16.** This began as the release-candidate ledger; the
|
||||
> publication record below is authoritative. The candidate notes retained
|
||||
> below it are historical release-audit evidence, not current distribution
|
||||
> status.
|
||||
|
||||
## Publication record
|
||||
|
||||
| Surface | Published state |
|
||||
|---|---|
|
||||
| Exact release source SHA | `d167c07c96282411956ea7f35ddb8227afa1402f` |
|
||||
| GitHub tag and release | [`v0.9.0`](https://github.com/Hmbown/CodeWhale/releases/tag/v0.9.0) |
|
||||
| GitHub Release assets | 29 public assets, verified as produced by Release workflow `29532521426` from the release SHA |
|
||||
| crates.io | All 18 v0.9.0 crates published |
|
||||
| npm | `[email protected]` published with its binary version pinned to `0.9.0` |
|
||||
| Post-publication verification | `scripts/release/check-published.sh 0.9.0` completed successfully |
|
||||
|
||||
The later CI-fixture hardening commit `cd2382888f8f9eb2a75c1eaa8c550f2468638984`
|
||||
is deliberately not part of v0.9.0; it is post-release maintenance on `main`.
|
||||
|
||||
## Historical release-candidate record
|
||||
|
||||
The candidate identity and gates below are preserved as the pre-publication
|
||||
snapshot. In particular, references to an absent tag, release, or registry
|
||||
package describe the state before the published record above.
|
||||
|
||||
| Surface | Pre-publication state |
|
||||
|---|---|
|
||||
| Workspace Cargo version | `0.9.0` after the final metadata bump |
|
||||
| npm wrapper manifest | `[email protected]` after the final metadata bump |
|
||||
| Candidate branch | `codex/v0868-final-integration` |
|
||||
| Exact release source SHA | Assigned only after the reviewed candidate merges to `main` |
|
||||
| GitHub `v0.9.0` tag | Absent |
|
||||
| GitHub `v0.9.0` release | Absent |
|
||||
| crates.io `codewhale-*` release set | `0.9.0` absent; published crates remain at `0.8.67`, while `codewhale-lane` has no public version yet |
|
||||
| npm `codewhale` | `0.9.0` absent; latest is `0.8.67` |
|
||||
|
||||
`scripts/release/check-published.sh 0.9.0`, the GitHub release API, and the
|
||||
remote tag list were checked again after publication on 2026-07-16. A dated
|
||||
changelog section and local version metadata alone do not make a public release.
|
||||
|
||||
## Acceptance accounting
|
||||
|
||||
The entire issue and pull-request history formerly assigned to the v0.8.68
|
||||
milestone is now part of v0.9.0. The closed v0.8.68 milestone is an empty
|
||||
superseded marker, not a separate release; unfinished work is assigned to
|
||||
v0.9.1 or later.
|
||||
|
||||
GitHub issues stay open until the candidate is pushed, reviewed, and its final
|
||||
evidence is attached. As of the 2026-07-15 refresh, the candidate contains
|
||||
fixes and regression coverage for bounded `@` discovery (#4365), Kimi context
|
||||
budgeting (#4368, #4378), Simplified Chinese setup terminology (#4369),
|
||||
approval-time transcript review (#4371), the first-turn `remember` catalog
|
||||
(#4373, #4377), required
|
||||
confirmation blockers (#4374), and cached approval denial recovery (#4375 and
|
||||
#4385).
|
||||
Named custom-provider identity (#4334) is integrated across TUI sessions,
|
||||
`exec --resume`, runtime threads, Fleet receipts, exports, and fail-closed
|
||||
restore without persisting secrets.
|
||||
|
||||
Final stopship dogfood also hardened the runtime contract itself: declarative
|
||||
step and wall-time limits now reach each child (including launch-queue wait),
|
||||
promoted artifacts keep enough evidence for the next role, explicit tool-free
|
||||
roles omit provider tool fields, and a terminal blocked gate fails the Workflow
|
||||
and Lane instead of producing a false success receipt. The checked-in fixture
|
||||
uses an exact five-file evidence query, five explicit gates, and substantive
|
||||
handoff artifacts; a fresh live receipt is still required below.
|
||||
|
||||
The following work is not honestly closed by this candidate audit:
|
||||
|
||||
- [#4175](https://github.com/Hmbown/CodeWhale/issues/4175),
|
||||
[#4177](https://github.com/Hmbown/CodeWhale/issues/4177),
|
||||
[#4178](https://github.com/Hmbown/CodeWhale/issues/4178), and
|
||||
[#4179](https://github.com/Hmbown/CodeWhale/issues/4179) still require
|
||||
completed live Fleet role-resolution, stopship-dogfood, and gate/handoff
|
||||
receipts before their broader acceptance can close.
|
||||
- [#4236](https://github.com/Hmbown/CodeWhale/issues/4236) and
|
||||
[#4242](https://github.com/Hmbown/CodeWhale/issues/4242) retain official
|
||||
Termux scope and real-device runtime QA.
|
||||
|
||||
The same refresh found #4372 safe and fully green; it was merged to `main` as
|
||||
`9035890c4`, preserving @nightt5879's original commit and @CCChisato's
|
||||
co-author credit for #3915. Four community PR heads are preserved as exact
|
||||
merge ancestry in this candidate: #4367 by @LeoLin990405, #4377 and #4378 by
|
||||
@mvanhorn, and #4385 by @nightt5879. The candidate keeps the stronger integrated
|
||||
implementations while retaining those contributors' complete commits instead
|
||||
of copying their changes without ancestry. The final refresh leaves #4383's
|
||||
green Windows cancellation hardening for v0.9.1 because no v0.9.0 field failure
|
||||
reproduces it; #4384 lacks the required release checks, while #4381 and #4379
|
||||
are clean post-release feature scope. #4199 remains explicitly marked not to
|
||||
merge, and the older conflicting or draft pull requests stay outside v0.9.0.
|
||||
These decisions must be rechecked immediately before the release PR merges.
|
||||
|
||||
Provider-route degradation, a missing Fleet terminal receipt, or a role/gate
|
||||
failure is a failed release gate, not an external/manual gap. The only accepted
|
||||
external platform gap is the explicitly documented real-device Android/Termux
|
||||
runtime pass; the target remains preview-only until that evidence exists.
|
||||
|
||||
## Historical verification and publication gates
|
||||
|
||||
Earlier metadata checks and Cargo dry-runs predated the final integration and
|
||||
did not count as exact-HEAD evidence. These gates were completed for the
|
||||
published release source; they remain here to document the release process:
|
||||
|
||||
1. Run `scripts/release/check-versions.sh`,
|
||||
`scripts/release/check-ohos-deps.sh`, changelog synchronization checks,
|
||||
`cargo fmt --all -- --check`, and `git diff --check`.
|
||||
2. Run the locked workspace `check`, strict all-target/all-feature `clippy`,
|
||||
full workspace tests, the TUI PTY/runtime lifecycle gates, and every focused
|
||||
stopship regression added during this integration.
|
||||
3. Run `scripts/release/publish-crates.sh dry-run`, build the CLI and TUI with
|
||||
`--release --locked`, and smoke the npm wrapper against those artifacts.
|
||||
4. Install that exact commit with `scripts/release/install-dogfood.sh`; verify
|
||||
all three global entry points report the same version and commit. Exercise
|
||||
the underwater shell in Cursor at the release terminal sizes, including
|
||||
Operate messaging/tools, Ask approvals, approval-time transcript review,
|
||||
settings, routes, links, Fleet setup/steering/cancellation, locale-aware
|
||||
worker names, reduced motion, and custom-provider save/resume/fail-closed
|
||||
behavior.
|
||||
5. Run the real tmux stopship Workflow with the release Fleet and 360k aggregate
|
||||
budget. Preserve role-resolved child, gate, handoff, and terminal receipts
|
||||
for #4175/#4177/#4178/#4179; a partial run does not pass:
|
||||
|
||||
```bash
|
||||
codewhale workflow run stopship --fleet stopship --runtime tmux \
|
||||
--token-budget 360000 --goal "Verify v0.9.0 release receipts without editing the workspace"
|
||||
```
|
||||
6. Push the candidate, open and review a PR against `main`, wait for required
|
||||
CI, merge, and verify the merge commit before updating issue accounting.
|
||||
7. Create `v0.9.0` either through the repository's release-tag workflow or a
|
||||
signed local tag. The workflow path creates an unsigned lightweight tag, so
|
||||
verify the tag and GitHub release resolve to the intended `main` commit
|
||||
instead of describing that path as signed.
|
||||
8. Wait for release assets and run
|
||||
`scripts/release/verify-release-assets.sh 0.9.0` **before** publishing the
|
||||
ordered Cargo crate set and `codewhale@0.9.0` to npm. Require all 29 public
|
||||
assets, both checksum manifests, the matching successful workflow SHA, and
|
||||
the exact clean tag-checkout guard. `codewhale-lane` is new on crates.io in
|
||||
this release; its first publish is an authentication stop line if the token
|
||||
cannot create a crate.
|
||||
9. Run `scripts/release/check-published.sh 0.9.0` and verify GitHub checksums,
|
||||
GHCR, CNB, Cargo installs, npm wrapper resolution, release-note contributor
|
||||
credit, and registry parity. `deepseek-tui` remains deprecated/unpublished;
|
||||
the experimental runtime SDK/plugin is not part of this release.
|
||||
|
||||
The publication record at the top records the final source SHA, release URL,
|
||||
publication date, and registry checks. The local experimental Z.AI plugin draft
|
||||
remained outside v0.9.0 and was not installed or published as part of this
|
||||
release.
|
||||
@@ -1,262 +0,0 @@
|
||||
# Codewhale v0.9.1 completion ledger
|
||||
|
||||
> **Pre-publication packet.** This ledger authorizes no tag, GitHub Release,
|
||||
> package publication, deployment, push, live-provider request, or customer
|
||||
> communication. It binds the frozen runtime source and the additive evidence
|
||||
> packet used to finish the local candidate.
|
||||
|
||||
## Candidate identity
|
||||
|
||||
| Boundary | Exact state |
|
||||
| --- | --- |
|
||||
| Runtime source (`S`) | `4d197626d72b4bd27e1abf4eed92e86e914414a8` |
|
||||
| Source branch | `codex/v091-final-integration-20260721` |
|
||||
| Protected base at freeze | `origin/main` = `a7c00a1a8e48021daf2a9c78cfc1dbda8269e074` |
|
||||
| Draft integration PR | #4675; its current remote head is an ancestor of `S`, so the approved update is a normal fast-forward |
|
||||
| Evidence packet (`E`) | Additive screenshot, browser-QA, and receipt commits on top of `S`; the final landing receipt records their exact merged SHA |
|
||||
| Public release state | No GitHub Release for v0.9.1; the pre-existing lightweight `v0.9.1` tag points to `d9fdee8aec469915cfdc07ab40aba5c40e9e9de4`, not this candidate |
|
||||
|
||||
`S` is the exact source used for runtime, real-PTY, and canonical product-image
|
||||
acceptance. It supersedes the earlier `fa46105a7183ce961f503996a7e746f763ffb29c`
|
||||
freeze after #4684 exposed a real Full Access/global-skill boundary defect.
|
||||
`E` changes only tracked evidence, generated public facts, and release records.
|
||||
A tracked image cannot contain the hash of the commit that adds that image, so
|
||||
the image and its receipt identify `S`; the final #4650 landing receipt
|
||||
separately identifies `E` and the exact merged-main SHA used to rebuild and
|
||||
install all three binaries.
|
||||
|
||||
## Finish/fix local evidence packet (2026-07-23)
|
||||
|
||||
This additive packet records the v0.9.1 finish/fix work performed after the
|
||||
original `S` freeze. It names the exact runtime source and its local evidence;
|
||||
it does not substitute a local branch for protected-main or publication proof.
|
||||
|
||||
| Boundary | Exact state |
|
||||
| --- | --- |
|
||||
| Finish/fix runtime source (`S2`) | `f6d606aab012f6dced2862ca9d135024d78e4e09` |
|
||||
| Source branch | `agent/091-finish-fix-20260722` |
|
||||
| Protected base at finish | `origin/main` = `88a158eaa2d6f1fa879bba1f1848a315b4dc6925` |
|
||||
| Included dependency intake | `0dfe9170a10e081fe48b23239f22d33260f4fa24` (the verified #4714 lockfile intake) |
|
||||
| Security hardening | `8c052e60f3eeae388d6690a0d791d713263b9fee`: runtime tokens leave the bridge through its environment rather than argv; explicit `CODEWHALE_HOME` does not import ambient legacy secrets; unsafe relative secret persistence is refused |
|
||||
| TUI finish/fix | `634d9f692c68b99b3e0ed2d7125548d7083661fb`: interactive-TTY preflight, provider-neutral legacy fallback presentation, calmer evidence/reasoning rows, and exact multiline-paste regression coverage (#4716–#4719) |
|
||||
| Dependency remediation | `f6d606aab012f6dced2862ca9d135024d78e4e09`: root and web lock graphs pin `sharp` `0.35.3`, eliminating the local libvips advisory path |
|
||||
| Local runtime proof | Clean release build embeds `0.9.1 (f6d606aab012)` in `codewhale`, `codew`, and `codewhale-tui`; scripted dogfood receipt: `backups/dogfood-installs/20260723T040240Z-f6d606aab012.txt` |
|
||||
| Local test and smoke proof | Locked full workspace tests; TUI real-PTY and release-runtime suites; app-server and npm-wrapper smokes; web clean-install tests/lint/facts/production build; VS Code compile; Feishu checks/tests |
|
||||
| Security proof | `cargo audit`: zero vulnerabilities with one documented allowed unmaintained `ttf-parser` warning; root, web, VS Code, and Feishu lockfile audits: zero vulnerabilities |
|
||||
| Deep-scan boundary | The #4713 deep-scan preflight was refreshed against the actual native-v2 capacity: four total threads means three usable workers, while a completed deep-discovery round requires six. It is therefore **blocked**, not replaced by a smaller batch or claimed complete. The local alert/audit reconciliation is useful no-publish evidence only; a session with at least six usable worker slots must still run the canonical deep workflow before #4713 can close. |
|
||||
| Visual proof | Foreground Cursor terminal (a real TTY) reaches onboarding and the composer; an unsent three-line path/SHA draft stays intact. Direct Terminal.app capture remains the human dogfood check because Computer Use cannot operate that app in this environment. |
|
||||
| Remote/public state | No branch landing, tag move, release, package publication, artifact upload, or deploy. Code and secret scanning are currently zero open; Dependabot still shows 11 alerts on remote `main` until the normally landed candidate is rescanned. |
|
||||
|
||||
The #4713, #4716, #4719, #4720, and #4721 issue comments record the same
|
||||
source boundary and explicitly remain non-closure receipts until normal
|
||||
landing.
|
||||
|
||||
## UI coherence follow-up local evidence (2026-07-23)
|
||||
|
||||
This second additive packet records the small, existing-shell-contract fixes
|
||||
accepted from the v0.9.1 UI coherence audit. It leaves the audit's broader
|
||||
motion, classic-footer, setup, and configuration redesign for ordinary
|
||||
post-release main work; it does not create a public issue or change the
|
||||
publication boundary.
|
||||
|
||||
| Boundary | Exact state |
|
||||
| --- | --- |
|
||||
| UI coherence runtime source (`S3`) | `d242dd85e8eb9e5210fceb362f4030f2142eeb87` |
|
||||
| Included UI contract | Tool-details hints derive from the routed platform-aware Alt/Option+V chord; a new draft outranks stale completed state; a running tool owns its elapsed clock; `/cost` and the legacy DeepSeek base-URL route label are truthful and provider-neutral |
|
||||
| Localization | The existing `CmdCostReport` value was refreshed in every complete pack (en, es-419, ja, ko, pt-BR, vi, zh-Hans); zh-Hant has no such key because it is intentionally partial |
|
||||
| Source proof | Locked TUI binary suite (`8,071` passed, `4` ignored); real-PTY suite (`25` passed, `1` ignored); release-runtime suite (`7` passed, `1` ignored); strict workspace clippy; and the locked workspace suite all passed from `S3` |
|
||||
| Exact runtime proof | One uninterrupted locked release build completed in `7m59s`; `codewhale`, `codew`, and `codewhale-tui` each report `0.9.1 (d242dd85e8eb)` |
|
||||
| Dogfood proof | Atomic local install receipt: `backups/dogfood-installs/20260723T044813Z-d242dd85e8eb.txt`; the receipt records all three binary hashes and fresh-shell paths |
|
||||
| Provider-free smoke | Installed app-server stdio smoke: `6` passed, `0` failed; npm-wrapper smoke assembled local assets and its packaged `codew --version` reports `d242dd85e8eb` |
|
||||
| TTY acceptance | Foreground Cursor terminal reaches the fresh composer; an unsent three-line path/SHA draft is visually intact, then the session exits through the documented two-tap Ctrl+C confirmation. A non-TTY launch exits `1` with the explicit interactive-terminal guidance |
|
||||
| Remaining human device proof | Computer Use is safety-blocked from Terminal.app, so Hunter must still perform the real Terminal.app foreground launch before public release. This is not a source regression and does not authorize publication |
|
||||
| Remote/public state | Still no branch landing, tag move, release, package publication, artifact upload, or deploy. Remote scanners and hosted CI remain evidence for the normally landed commit, not this local packet |
|
||||
|
||||
## Manual high-impact security audit (2026-07-23)
|
||||
|
||||
This is a bounded, parent-performed review of the security-critical candidate
|
||||
surfaces. It is useful local evidence, but it is **not** the six-worker Codex
|
||||
Security deep-scan required by #4713 and does not close that gate.
|
||||
|
||||
| Boundary | Evidence |
|
||||
| --- | --- |
|
||||
| Reviewed runtime source | `d242dd85e8eb9e5210fceb362f4030f2142eeb87` (no runtime source changes occur in the additive documentation commits that follow it) |
|
||||
| Threat model | The repository policy's prompt/model-response RCE, sandbox escape, credential leakage, path escape, SSRF, and unauthorized-MCP boundaries |
|
||||
| Source review | Runtime/app-server authentication and token handoff; tool authority, path/symlink, sandbox, and exec-policy enforcement; MCP stdio/SSE/streamable-HTTP launch and redaction; web fetch/open/click DNS pinning and redirect validation; workflow-JS host isolation; and bridge allowlists, pairing, approval, and private-state handling |
|
||||
| Focused Rust verification | `codewhale-tools` 27 passed; `codewhale-execpolicy` 80 passed plus 1 doctest; `codewhale-mcp` 40 passed; `codewhale-workflow-js` 56 passed; `codewhale-app-server` 71 passed |
|
||||
| Bridge verification | `bridge-core` 11 passed; WeCom 16 passed; Weixin 3 passed; Telegram 39 passed; Feishu 19 passed |
|
||||
| Dependency and secret checks | `cargo audit --ignore RUSTSEC-2026-0192` found no active Rust advisory among 751 dependencies; the allowed warning is the documented unmaintained `ttf-parser` path. Fresh package-lock audits for root, web, VS Code, WeCom, Telegram, and Feishu were zero-vulnerability. Redacted Gitleaks source scans of `crates/`, `web/`, VS Code, `scripts/`, and bridge implementation sources found no committed secret. The initial web scan's ten matches were confirmed to be ignored local `.next` build artifacts, then excluded from the source scan. |
|
||||
| Result | No reportable new candidate vulnerability was found within this manual coverage. This is an evidence statement, not a claim of exhaustive security assurance or #4713 completion. |
|
||||
|
||||
## Public-web boundary cutover (2026-07-23)
|
||||
|
||||
The reviewed FR016 public-web patch was revalidated against this candidate and
|
||||
integrated as `a2c08393b716f7333708c85f2ff24a4f2889f5bb`. Its earlier
|
||||
triage/PR namespace correction was already present through the later
|
||||
content-watch identity work; the cutover preserves that work's `linkcheck` and
|
||||
`semantic-drift` draft types while adding the remaining bounds and validation.
|
||||
|
||||
| Boundary | Evidence |
|
||||
| --- | --- |
|
||||
| Draft authority | Canonical type/key parsing plus schema and key/object-identity validation gate reads, listings, and deletes; authenticated admin discard rejects every non-draft namespace before KV access |
|
||||
| Credential boundary | The public GitHub feed is static with ten-minute revalidation and calls GitHub anonymously; it cannot forward or spend the server-held token |
|
||||
| Input boundary | Maintainer login accepts only bounded URL-encoded forms, rejects bad media types and declared/streamed oversize bodies before token comparison, and caps decoded token length |
|
||||
| Local verification | Focused boundary tests: 27 passed. Full web test suite: 136 passed. Type check, lint, facts/docs checks, and the 40-page production build all passed; the build reports `/api/github/feed` as static with ten-minute revalidation and admin routes as dynamic |
|
||||
| Public state | No deployment, credential change, Cloudflare action, push, tag, package publication, or release action occurred |
|
||||
|
||||
## Completion crosswalk
|
||||
|
||||
| Contract | Frozen-source evidence |
|
||||
| --- | --- |
|
||||
| Canonical runtime and empty Work | PR #4675 ancestry; canonical action-tool and hidden replay-alias gates; fresh sessions render no empty Work heading or reserved rows |
|
||||
| Transcript, motion, and control grammar | `79d5d5397aba83a901ae47e672d8fcd269cb04ae`, `2b2cfe65afd6879da3dd0782d98c5d4d8c04b34e`, `637debe69324fe9989e41cecfe8304d8dbc4d8c5`, `09d171d15331b1bbe1aa71003c4608aa6489bb9f`, PTY stabilizers `166679ed2546b84635dbf0895881286625da27b2`, `88eeed286162dbe8651bb0afd68e8cd2fb7b8e4d`, `57fbf264a4d1bbe3a6ee12cac7c9ae15189c7d1d`, and the exact source freeze `4d197626d72b4bd27e1abf4eed92e86e914414a8`; real PTYs cover 40x12 through 140x40, exact 100x30 transcript lifecycle, the icy Plan → blue Act → violet Operate and amber Ask → gold Auto-Review → coral Full Access ramps, dark/light, Full/Reduced/Still motion, and ASCII safety (#4676, #4677) |
|
||||
| Structured Agent activity/details | `307407c968f48bedd1488df8d0305e0c086f1809` and `16eeda430ca6cbeb9b03e8e5235278025f6aed75`; Paulo Aboim Pinto's direction remains credited from #2694/#2889, renderer substring inference is gone, and focused final-source receipts cover compact rows, fallback, redaction, hover, and the Agent Details route |
|
||||
| Adaptive evidence | Merge `00c9156367c2934cbc3de33b5ee7ed3d2f09da2e`; session-owned exact bytes, bounded receipts, headless and real-PTY acceptance (#4619) |
|
||||
| One Work projection and File receipts | Merge `f100e70c9da8436eaa7f6304af62a60f4aa3ffa0`; full/summary/off success-only diffs and real-PTY coverage (#4636) |
|
||||
| Durable coordination | Merge `c39ec9a418f3219d87510d2297b68cbb860f6c02` plus surfaced/localized receipt follow-ups; replay-safe decisions, claims, contention, projection, and neutral fan-in (#4647) |
|
||||
| Contributor intake | Fred's #4673 is in protected main; all six exact Sam #4679 commits and all three exact Nightt #4680 commits are ancestors; Paulo's exact `75e08e5c67f555b5cda8511742c824bb74bb6c1d` is preserved; TelecomJS and OpenCode Go harvests retain machine-readable human co-author trailers; credited issue follow-ups `97f1c88271b0c32e0031914ae7f5d976aaf1467b`, `b60b3fecdb3535a13180b74955f55b19cb5c9ab7`, `fa46105a7183ce961f503996a7e746f763ffb29c`, and Wenhao Hu's #4684 fix `4d197626d72b4bd27e1abf4eed92e86e914414a8` are included without overstating #4683's broader intermittent symptom |
|
||||
| Full Access and global skills | `4d197626d72b4bd27e1abf4eed92e86e914414a8`; saved and cycled Full Access now activates workspace trust as documented, global skills load through the bounded `load_skill` host path, and `danger-full-access` remains an OS-sandbox setting rather than an implicit unbounded file-authority switch (#4684) |
|
||||
| Public surfaces | `docs/public-surface-facts.json` is the source-backed matrix; tool count is 66 and provider count is 35. Final canonical screenshot, EN/ZH browser captures, README-width review, and deployed-drift receipt are recorded in the additive evidence packet (#4670, #4671, #4672) |
|
||||
|
||||
Remote milestone issues stay open until `E` lands on protected `main`, hosted
|
||||
checks are green, the exact main SHA is installed locally, and issue comments
|
||||
receive those receipts. A local implementation is not used as evidence that a
|
||||
remote issue has already landed.
|
||||
|
||||
## Contributor history and DCO decision
|
||||
|
||||
No contributor commit is rewritten or flattened. The following exact commits
|
||||
in `origin/main..S` lack a `Signed-off-by` trailer:
|
||||
|
||||
```text
|
||||
75e08e5c67f555b5cda8511742c824bb74bb6c1d
|
||||
c9010ec4e18bf7a2b9d38ef46679301e53a819c9
|
||||
cd24aacb3a60fd546ef98c5e93c7749f1eb48240
|
||||
677ef4d4ffa375928bbd29aa340eecd7b17204af
|
||||
5c3eb8245512cf790a933484453d3e300eb4c7af
|
||||
5087269606fc8847487b0a8b51ef6adffa8eb2ca
|
||||
e37df06caeb3064b2bb9263c1c98a903738f3a0a
|
||||
74862148a5a39b07c84952a0b28acf0f6f056dd3
|
||||
54c8916d3c0a55dbf992191ba7e21b6e7ff75d6e
|
||||
f8e79479a9e520e0796452aff7ec72b10bf29842
|
||||
bf45d1273577341a4ba992688816278249b1c633
|
||||
f06333bcaef4797f49cc0df16e1ecf10e8c826f2
|
||||
1a1e958f68ffc9e6232c2873bcf509ef74a839cf
|
||||
aa0b5f89e437736dc5d3326d8bca1726eea12056
|
||||
b489acca1b728625164fce9fa0f88a7752e1e028
|
||||
e3a4f96768be178c6439594875ea9d540a9930c7
|
||||
e2208815e51cdc42830cec8c78d4db1fff00d490
|
||||
c7e87533aaf43f010bfe6c316500c47b8f6c95a8
|
||||
c89094226cf18b79375f2bacc9a6536c78e30f26
|
||||
ee5f7298cc701bae0a0bf2f71b4a884a6ada4a8c
|
||||
e06a4fd7271b88db346cec32095e94c35b6bea49
|
||||
31dac05209e8636d6f2f7e8ff70507886bff45b7
|
||||
```
|
||||
|
||||
The repository DCO workflow is explicitly advisory and exits successfully
|
||||
after reporting this list. Rewriting would destroy exact PR ancestry and the
|
||||
machine-readable credit exceptions for the public-surface and Paulo evidence
|
||||
commits. The release decision is therefore to preserve history, report the
|
||||
advisory exception exactly, require sign-off on every additive follow-up, and
|
||||
keep `scripts/check-coauthor-trailers.py` green. This is not a claim that an
|
||||
unsigned contributor commit carries a signature it does not have.
|
||||
|
||||
## Exact verification ledger
|
||||
|
||||
The following receipts must be attached to `S` or, for evidence-only drift
|
||||
checks, to `E` before #4675 is updated:
|
||||
|
||||
- [x] Full locked real-PTY suite, including wide, narrow, dark, light,
|
||||
reduced-motion, ASCII-safe, semantic motion, Work, Agent Details, evidence,
|
||||
File mutation, coordination, resize, scroll, and restart states.
|
||||
- [x] Locked TUI binary tests and `release_runtime_qa`.
|
||||
- [x] Locked workspace check, strict all-target/all-feature clippy, and full
|
||||
all-feature workspace tests.
|
||||
- [x] Version, changelog, lockfile, provider-registry, co-author, workflow,
|
||||
platform, release-script, and branch-hygiene checks.
|
||||
- [x] Web facts (`66` tools / `35` providers), docs parity, tests, lint,
|
||||
TypeScript, production build, deploy-env preflight, deployed-facts comparison,
|
||||
and OpenNext build without deployment.
|
||||
- [x] Real 120x32 PTY capture from `S`, rasterized with VHS and optimized to one
|
||||
byte-identical 1280x720 README/website PNG, plus EN/ZH desktop/mobile and
|
||||
README-width review artifacts.
|
||||
- [x] Finish/fix local packets `S2` and `S3`: exact-token and secret-path
|
||||
hardening, #4716–#4719 TUI regressions, dependency remediation, the narrow
|
||||
UI coherence contract pass, full locked workspace tests, provider-free
|
||||
smokes, and an exact-SHA dogfood install.
|
||||
- [ ] Hosted CI green at the approved exact PR head with zero unresolved review
|
||||
threads.
|
||||
- [ ] After normal merge, `scripts/release/install-dogfood.sh` rebuilds and
|
||||
installs `codewhale`, `codew`, and `codewhale-tui` from one exact protected
|
||||
`main` SHA; all three versions and digests are recorded in #4650.
|
||||
|
||||
## Safe Kimi K3 handoff
|
||||
|
||||
These provider-free tests exercise direct Moonshot K3, Kimi Code K3, request
|
||||
dialect isolation, MFJS-safe schemas, context limits, and read-only diagnostics.
|
||||
They use sealed loopback/process fixtures and no account or provider request:
|
||||
|
||||
```bash
|
||||
CARGO_NET_OFFLINE=true cargo test -p codewhale-tui --bin codewhale-tui \
|
||||
--locked create_message_request_json_honors_exact_k3_route_boundaries
|
||||
CARGO_NET_OFFLINE=true cargo test -p codewhale-tui --bin codewhale-tui \
|
||||
--locked create_message_request_sends_mfjs_compatible_apply_patch_schema
|
||||
CARGO_NET_OFFLINE=true cargo test -p codewhale-tui --bin codewhale-tui \
|
||||
--locked direct_moonshot_k3_route_uses_documented_1m_limits_with_provenance
|
||||
CARGO_NET_OFFLINE=true cargo test -p codewhale-tui \
|
||||
--test diagnostic_read_only --locked kimi_code
|
||||
```
|
||||
|
||||
Expected receipt: each command exits zero; each named unit filter runs exactly
|
||||
one test; the diagnostic filter runs the invalid-alias and valid-context tests;
|
||||
no provider credential or outbound request is used.
|
||||
|
||||
The human Kimi Code entitlement check is a separate approval boundary. Do not
|
||||
run it from this packet. After Hunter explicitly approves a live-provider test,
|
||||
create an isolated config with `provider = "moonshot"`, the exact
|
||||
`https://api.kimi.com/coding/v1` base URL, `model = "k3"`, and a Kimi Code plan
|
||||
API key supplied only through `KIMI_API_KEY`; then run the installed binary:
|
||||
|
||||
```bash
|
||||
codewhale --config /path/to/isolated-kimi-code.toml \
|
||||
--provider moonshot --model k3 exec --reasoning-effort low --json \
|
||||
"Reply exactly K3-ENTITLEMENT-OK and do not call tools."
|
||||
```
|
||||
|
||||
Acceptance requires an exit-zero JSON response, the exact phrase, and a route
|
||||
receipt naming `moonshot` / `k3`. It must not use `k3[1m]`, infer 1M entitlement
|
||||
from provider-free tests, enable tools, read Kimi CLI credentials, or persist
|
||||
the key in this repository.
|
||||
|
||||
## Manual web workflow handoff — do not run
|
||||
|
||||
Push and pull-request events execute only the `lint` job in
|
||||
`.github/workflows/web.yml`. Deployment additionally requires both a manual
|
||||
`workflow_dispatch` event and `refs/heads/main`; therefore an ordinary green
|
||||
push is not deployment evidence.
|
||||
|
||||
After the final merge, and only with separate deployment approval, bind the
|
||||
manual run to the intended protected-main SHA immediately before dispatch:
|
||||
|
||||
```bash
|
||||
EXPECTED_SHA=<exact-merged-main-sha>
|
||||
test "$(gh api repos/Hmbown/CodeWhale/git/ref/heads/main --jq .object.sha)" = "$EXPECTED_SHA"
|
||||
gh workflow run web.yml --repo Hmbown/CodeWhale --ref main
|
||||
# Identify the new workflow_dispatch run, then verify its immutable receipt:
|
||||
gh run view <run-id> --repo Hmbown/CodeWhale \
|
||||
--json headSha,event,headBranch,url
|
||||
# Accept only headSha == EXPECTED_SHA, event == workflow_dispatch,
|
||||
# and headBranch == main before treating the run as bound to this candidate.
|
||||
```
|
||||
|
||||
`web.yml` has no SHA input and its deploy guard requires the `main` ref, so the
|
||||
pre-dispatch equality check and post-dispatch run receipt are both mandatory.
|
||||
This packet stops before the dispatch command.
|
||||
|
||||
## Stop line
|
||||
|
||||
Completion of this ledger means one reviewed, hosted-green, normally merged,
|
||||
exactly rebuilt and locally installed v0.9.1 dogfood candidate with truthful
|
||||
receipts. It does **not** authorize a tag, GitHub Release, crates/npm publish,
|
||||
artifact upload, Cloudflare deployment, DNS or billing change, live xAI/Kimi
|
||||
request, customer communication, or public release.
|
||||
@@ -1,435 +0,0 @@
|
||||
# Codewhale v0.9.2 completion ledger
|
||||
|
||||
> **Living release source of truth.** Update it in place; do not append session
|
||||
> narrative. It authorizes local version/changelog preparation and dogfood, but
|
||||
> no tag, GitHub Release, package publication, deployment, push to protected
|
||||
> `main`, paid/live-provider request, or customer communication. Nothing below
|
||||
> is a claim that unfinished work is done.
|
||||
|
||||
## Candidate identity
|
||||
|
||||
| Boundary | Exact state |
|
||||
| --- | --- |
|
||||
| Authoritative release lane | protected `main` in `/Volumes/VIXinSSD/CW/codewhale` |
|
||||
| Current landed runtime candidate | PR #4953 merge `823280557235f57866d13c726110df427ace662b`; later ledger-only bookkeeping does not change the built runtime candidate |
|
||||
| Integration campaign | PR #4911 merged at `8fff533e6203193984c34552d837c47845e51f51`; focused PRs #4912–#4927 are represented in its landed history |
|
||||
| Final runtime follow-up | PR #4943 restored account-owned `/rc`; merged at `e3fbb6a915af0460dd12b03d88d92b295932ef8e` |
|
||||
| Final web follow-up | PR #4944 aligned the public landing with the CWC visual system; merged at `d2a5b2253e8d939eb74a1024d44babb6958200bb` |
|
||||
| Final Operate startup + capture follow-up | PR #4953 tested at content head `6f2de8ec0183de3dd856e2e71b1fffb59fdb0c06`; merged at `823280557235f57866d13c726110df427ace662b` |
|
||||
| Workspace version (`Cargo.toml`) | `0.9.2` — bumped at `0faa44a74` |
|
||||
| npm `npm/codewhale` | `0.9.2` — bumped at `0faa44a74` (`npm/deepseek-tui` 0.8.49 and `npm/runtime-sdk` 0.8.60 are separate legacy/SDK lines) |
|
||||
| Tag / Release | none for v0.9.2; no tag created, moved, or planned by this ledger |
|
||||
| Publication state | no crates/npm publish, no artifact upload, no web deploy |
|
||||
|
||||
## Final landing gate (current)
|
||||
|
||||
This table is the release decision surface. The longer tables below retain
|
||||
historical engineering evidence but do not override this current state.
|
||||
|
||||
| Gate | Status | Receipt |
|
||||
| --- | --- | --- |
|
||||
| Integration candidate | **PASS** | PR #4911 merged to `main` at `8fff533e6203193984c34552d837c47845e51f51`; focused PRs #4912–#4927 are landed in that history |
|
||||
| Full release verification | **PASS** | Final content head `6f2de8ec0183`: full workspace 11,254 passed / 0 failed / 7 ignored; exact CI clippy and every release gate below passed; hosted Ubuntu, macOS including offline eval, Windows, web, OHOS, CodeQL, Buildkite, DCO, and link gates passed before merge `8232805572` |
|
||||
| ACP numeric request IDs | **PASS** | PR #4929 landed client-aware behavior: Avante numeric IDs are preserved and Zed numeric IDs retain the compatibility conversion |
|
||||
| Thinking expansion | **PASS** | PR #4928 merged and closed #4925 |
|
||||
| Web deploy workflow | **PASS (code path)** | #4907 is repaired; validation runs on push/PR and deployment remains manual-dispatch-only |
|
||||
| Real-session capture harness | **PASS (harness only)** | PR #4940 merged at `6acc5dd367547a12b31fccb473da30954ca35d72`; real human-operated capture remains #4906 |
|
||||
| Account-owned remote control | **PASS** | PR #4943 exact head passed hosted Ubuntu, Windows, and macOS; merged at `e3fbb6a915af0460dd12b03d88d92b295932ef8e` |
|
||||
| Public landing redesign | **PASS** | PR #4944 exact combined head `2d7b7590bda0f983d7d99541482c151b95dc5132`: web tests/lint/build, Claude, CodeQL, Buildkite, Windows (17m52s), and macOS including offline eval (20m42s) all passed; merged at `d2a5b2253e8d939eb74a1024d44babb6958200bb` |
|
||||
| Operate startup + current-session capture | **PASS** | PR #4953 exposes Act / Plan / Operate in native Startup settings, preserves `operate`, keeps permission posture independent, installs Hunter's byte-identical 1562×1256 capture on README/site, and makes no release-version claim because the capture binary was not recorded; merged at `8232805572` |
|
||||
| Final dogfood binaries | **PASS** | Fresh external target `backups/v092-final-release-8232805572.TaAugU`; `codew`, `codewhale`, and `codewhale-tui` all report `0.9.2 (823280557235)` from a fresh login shell; clean-source receipt `backups/dogfood-installs/20260728T084840Z-823280557235.txt`; the earlier `2d7b7590bda0` and interim `ffde4edc75dc` installs are superseded |
|
||||
| Milestone | **HUMAN-GATED** | #4906 is the only open v0.9.2 milestone issue: record and accept a real provider/local-Ollama session for the site and README |
|
||||
| Publication | **HUMAN-GATED** | no v0.9.2 tag, GitHub Release, crates/npm publication, artifact upload, web deploy, or customer communication has occurred |
|
||||
|
||||
## Approval rails (hard)
|
||||
|
||||
No agent takes these without explicit, per-action approval from Hunter:
|
||||
|
||||
- push to protected `origin/main`; force-push or rewrite of any shared ref
|
||||
- tag creation or move, GitHub Release
|
||||
- crates.io / npm publication, artifact upload, Homebrew tap update
|
||||
- any deployment (Codewhale web, `app.codewhale.net`, CWC #123)
|
||||
- production credentials, billing/Stripe, DNS, customer-data mutation
|
||||
- paid/live-provider entitlement tests (e.g. Kimi Code K3), signing/notarization
|
||||
- approving `action_required` fork workflow runs — running an outside
|
||||
contributor's code on org runners is a trust decision, not a CI chore
|
||||
- contributor-facing communication that closes or rejects community work
|
||||
|
||||
Standing engineering rails: land through small reviewable commits or PRs;
|
||||
preserve contributor authorship and `Co-authored-by` / `Harvested from PR #N`
|
||||
credit; never close an issue without per-criterion receipts on the landed SHA;
|
||||
never run probes or tests against the real `~/.codewhale` — isolate through a
|
||||
task-specific `CODEWHALE_HOME` without repurposing `HOME`.
|
||||
|
||||
## Release gates (exact, from live `.github/workflows/ci.yml`)
|
||||
|
||||
Jobs: **Change detection**, **Version drift**, **Lint**, **Workflow RLM cache**,
|
||||
**Test** (matrix), **npm wrapper smoke**, **Mobile runtime smoke**,
|
||||
**Workflow lint**, **Documentation**. Change detection sets a `heavy` flag;
|
||||
light (docs-only) changes skip the Rust legs, and non-`workflow_dispatch` runs
|
||||
skip the ubuntu leg of Test/npm-smoke by design.
|
||||
|
||||
| Gate | Exact command |
|
||||
| --- | --- |
|
||||
| Version drift | `./scripts/release/check-versions.sh` |
|
||||
| OHOS deps | `./scripts/release/check-ohos-deps.sh` |
|
||||
| Release helper contracts | `bash .github/scripts/agent-task-metadata.test.sh`, `bash scripts/release/generate-release-body.test.sh`, `bash scripts/release/install-dogfood.test.sh`, `bash scripts/release/prepare-release.test.sh`, `bash scripts/release/require-release-tag-checkout.test.sh`, `bash scripts/release/verify-remote-tag.test.sh`, `bash .github/scripts/update-homebrew-tap.test.sh`, `node .github/scripts/release-workflows.test.js`, `node --test scripts/release/assemble-release-assets.test.js`, `node --test scripts/release/ensure-release-assets-absent.test.js` |
|
||||
| Format | `cargo fmt --all -- --check` |
|
||||
| Clippy | `cargo clippy --workspace --all-features --locked -- -D warnings -A clippy::uninlined_format_args -A clippy::too_many_arguments -A clippy::unnecessary_map_or -A clippy::collapsible_if -A clippy::assertions_on_constants` |
|
||||
| Registry / docs parity | `python3 scripts/check-provider-registry.py`, `check-readme-translations.py`, `bash scripts/check-readme-locales.sh`, `python3 scripts/check-tui-locale-parity.py` |
|
||||
| Contributor credit | `python3 scripts/check-coauthor-trailers.py --author-map .github/AUTHOR_MAP --range <base..HEAD> --check-authors` |
|
||||
| Workflow RLM cache | `cargo test -p codewhale-workflow --locked rlm_cache_change` |
|
||||
| Test | `cargo test --workspace --all-features --locked` (ubuntu / macOS / Windows) + lockfile drift guard; offline eval harness on macOS |
|
||||
| npm wrapper smoke | `cargo build --release --locked -p codewhale-cli -p codewhale-tui` then `node scripts/release/npm-wrapper-smoke.js` |
|
||||
| Mobile runtime smoke | `./scripts/mobile-smoke.sh` |
|
||||
| Workflow lint | `actionlint -color -ignore SC2129 -ignore SC2221 -ignore SC2222` (the exact arguments pinned by CI; an unsuppressed local run reports only those documented style/intent warnings) |
|
||||
| Documentation | `cargo doc --workspace --no-deps` |
|
||||
|
||||
Two standing facts about these gates, both load-bearing:
|
||||
|
||||
- The clippy step runs **without `--all-targets`**, so `cfg(test)` and
|
||||
integration-test code is never linted. A bare `--all-targets -D warnings` run
|
||||
surfaces pre-existing errors in test code. Those are not regressions; do not
|
||||
"fix" them, and do not treat a locally-remembered clippy command as CI's.
|
||||
- The current `link` (PR↔issue) gate fetches the live PR body. Older campaign
|
||||
notes describing stale event-payload behavior are historical and must not be
|
||||
used to diagnose a current failure.
|
||||
|
||||
### 2026-07-27 final-candidate gate run (content head `462858207` + changelog sync)
|
||||
|
||||
| Gate | Result |
|
||||
| --- | --- |
|
||||
| Locale parity | PASS — 13 complete packs at full parity (the seven new packs' merge-reconciliation strings were translated, placeholders machine-validated, native review recorded as pending human evidence); zh-Hant declared partial |
|
||||
| Provider registry, README translations (8), README locales | PASS |
|
||||
| Contributor credit (`--check-authors`, 175 commits) | PASS |
|
||||
| Version drift + changelog sync | PASS after `sync-changelog.sh` (workspace/npm/lockfile 0.9.1 pre-bump) |
|
||||
| OHOS deps, actionlint (CI's suppressions), all release-helper shell+node contracts | PASS |
|
||||
| Web | 187/187 tests, ESLint clean, tsc clean, check-locales PASS |
|
||||
| Full `cargo test --workspace --all-features --locked --no-fail-fast` | **COMPLETED, exit 0: 11,215 passed / 3 failed**, and all three failures were dispositioned before the bump — two were superseded test contracts fixed in follow-up commits (the fleet-help acceptance feature encoding the pre-parity `/fleet status` semantics, now 46/46; the qa_pty interactive-init walk missing the new Appearance step, now 35/35 and the first PTY-level proof of that step's event-loop wiring), and one is an order-sensitive flake (`minimax_requires_an_explicit_saved_billing_mode`) that passes 1/1 in isolation |
|
||||
| Exact CI clippy (workspace, `--all-features --locked`, five `-A` allows, no `--all-targets`) | **PASS, exit 0** |
|
||||
| `cargo doc --workspace --no-deps` | PASS, exit 0, 23 non-denied rustdoc warnings open for cleanup |
|
||||
| Version bump | **`0faa44a74` — workspace/npm/lockfile/changelog band all 0.9.2**, cut via `prepare-release.sh` with `check-versions.sh` agreeing |
|
||||
| Release build | `cargo build --release --locked -p codewhale-cli -p codewhale-tui` finished in 10m29s; binaries embed `0.9.2 (0faa44a74b74)` |
|
||||
| Dogfood install | **DONE** — `scripts/release/install-dogfood.sh` succeeded; globally installed `codew`, `codewhale`, and `codewhale-tui` all report `0.9.2 (0faa44a74b74)`; receipt at `backups/dogfood-installs/20260727T130954Z-0faa44a74b74.txt` |
|
||||
| Hosted-CI repair verification | **PASS locally through `17f6ae848`** — exact CI clippy exited 0; the web prebuild/facts/docs/test/lint/build sequence passed (187/187 tests and production build), and the exact hosted `npx tsc --noEmit` follow-up plus the affected 12-test public-surface file passed; workflow redaction tests passed 15/15; after isolating the MiniMax test's ambient environment, the complete `codewhale-tui` target compiled under `RUSTFLAGS=-Dwarnings` and passed 9,299 / failed 0 / ignored 5, with all 11 MiniMax billing tests also passing together. The Windows-only zero-read race in `concurrent_readers_never_observe_a_truncated_settings_file` now uses an explicit reader-ready handshake and passed five consecutive exact strict runs. Final Claude-review repairs passed the complete Lane crate (60/60), both OpenCode Zen resolver tests (2/2), the exact protocol-change client test (1/1), exact CI clippy, format, and diff checks. Hosted checks remain the landing authority after this head is pushed. |
|
||||
|
||||
Per-merge focused receipts (each taken on the integrated head at merge time, all
|
||||
zero failures): cost 85→87, route_billing 46→48, pricing 64, receipt 144→157,
|
||||
scorecard 31, goal 60, localization 30, engine 461, subagent 507,
|
||||
subagent_routing 18, tool_routing 11, prompt_suggestion 23, model_inventory 17,
|
||||
model_picker 89, model_routing 34, fleet::exact 37, execution_envelope 11,
|
||||
workflow (tui) 150 + crate 244+16, lane_control 8, config 458, tui::app 383,
|
||||
ui::tests 653, sessions 341, sessions_rail 7, sidebar 174, runtime_api 119,
|
||||
views 157, menu_style 7, focus_texture 12, sound_policy 14, ambient_life 19,
|
||||
palette 93, widgets 286, onboarding 61, setup 269, remote 48, appearance 7,
|
||||
skills 193, stepfun 15, provider_picker 105, opencode 16, tool_inspection 8,
|
||||
request_snapshot 4, markdown_render 53, structcopy 32, safe_label 10,
|
||||
codewhale-config 469, vitest rail 19 within web 187.
|
||||
|
||||
### Latest local gate run
|
||||
|
||||
Replace this block whenever the candidate head advances; it describes exactly
|
||||
one head and is worthless if it is allowed to describe "roughly the candidate".
|
||||
All Rust runs used `CARGO_BUILD_JOBS=2`, the external
|
||||
`backups/v092-rebuild-candidate/check-target`, and a task-specific `mktemp`
|
||||
`CODEWHALE_HOME`; the real `~/.codewhale` was never a test target.
|
||||
|
||||
| Gate | Head | Result |
|
||||
| --- | --- | --- |
|
||||
| `cargo fmt --all -- --check` + `git diff --check` | `6f2de8ec0183` | PASS |
|
||||
| Exact CI clippy (the command above, no `--all-targets`) | `6f2de8ec0183` | PASS, exit 0 |
|
||||
| `cargo test --workspace --all-features --locked --no-fail-fast` | `6f2de8ec0183` | PASS, exit 0: 11,254 passed / 0 failed / 7 ignored; TUI 9,332/0/5, `qa_pty` 35/0/1, release runtime QA 17/0/1, terminal matrix 19/0/0 |
|
||||
| Version drift + OHOS dependency contracts | `6f2de8ec0183` | PASS; workspace/npm/lockfile consistently 0.9.2 |
|
||||
| Release helper shell + Node contracts | `6f2de8ec0183` | PASS: seven shell helpers, workflow contracts, asset assembly 4/4, absent-asset immutability 6/6 |
|
||||
| Provider registry + README + locale parity | `6f2de8ec0183` | PASS: 8 README translations, no orphaned locale READMEs, 13 complete TUI packs at 1228/1228, zh-Hant declared partial at 499/1228 |
|
||||
| Contributor credit over `origin/main..HEAD` | `6f2de8ec0183` | PASS for both PR commits |
|
||||
| Workflow RLM cache command | `6f2de8ec0183` | PASS, exit 0; current filter selects 0 tests in the workflow targets |
|
||||
| Mobile runtime smoke against exact external binary | `6f2de8ec0183` | PASS, 9/9 after supplying the helper's documented `BINARY` override; an initial invocation set only `CARGO_TARGET_DIR`, so the helper looked for the repo-local default and exited 1 before runtime verification |
|
||||
| Exact CI workflow lint | `6f2de8ec0183` | PASS with CI's three documented suppressions |
|
||||
| `cargo doc --workspace --no-deps` | `6f2de8ec0183` | PASS, exit 0, with 18 non-denied rustdoc warnings retained as cleanup work |
|
||||
| Web source/facts/docs/tests/lint/build | `6f2de8ec0183` | PASS: 223/223 tests, ESLint clean, production build generated 260 static pages; screenshot destinations equal requested source SHA-256 `418b5a590094c76626dab455b82f635222faa78bb22612b1452146f690b3cc77` |
|
||||
| Release build + npm wrapper smoke | `6f2de8ec0183` | PASS: all three binaries report `0.9.2 (6f2de8ec0183)` and npm wrapper smoke passed against those preassembled exact assets |
|
||||
| Hosted PR #4953 | merge `8232805572` | PASS: Claude review, CodeQL, GitGuardian, Buildkite, Ubuntu, macOS including offline eval, Windows, web, OHOS, DCO, version drift, npm wrapper, and issue link all green; zero review threads |
|
||||
| Fresh external release build | merge `8232805572` | PASS: `cargo build --release --locked -p codewhale-cli -p codewhale-tui` completed from the landed runtime candidate in new target `backups/v092-final-release-8232805572.TaAugU`; all three artifacts report `0.9.2 (823280557235)` |
|
||||
| npm wrapper smoke against final artifacts | merge `8232805572` | PASS against the exact fresh-target binaries; wrapper resolved `codew` as `0.9.2 (823280557235)` |
|
||||
| Dogfood install + fresh login shell | merge `8232805572` | PASS via `scripts/release/install-dogfood.sh`; clean-source receipt `backups/dogfood-installs/20260728T084840Z-823280557235.txt`; fresh shell resolves all three commands from `~/.local/bin` and reports `0.9.2 (823280557235)`. macOS ad-hoc signing intentionally changes installed-file hashes; the receipt records both source and installed SHA-256 values. |
|
||||
|
||||
## Scope table
|
||||
|
||||
Status vocabulary: **must-land** (confirmed remaining code), **human-gated**
|
||||
(no agent can do it), **verify-and-close** (believed implemented; needs a
|
||||
receipted audit on the landed SHA before the issue is closed), **deferred**
|
||||
(legitimately out of v0.9.2).
|
||||
|
||||
| Item | Class | Status | Note |
|
||||
| --- | --- | --- | --- |
|
||||
| #4411 privacy | must-land | **not done — promoted into v0.9.2** | Explicitly promoted from the catalog lane. New exact Fleets must never inspect or route across credentials/models outside the selected Fleet. |
|
||||
| #4404 prompt-suggestion privacy | must-land | **landed `eb38100cd`; independently reviewed PASS** | Turn start now mints immutable non-secret authority from the installed client, and suggestions require exact provider, model, canonical chat base route, and key-generation continuity. Injected clients, configured path overrides (including blank suffixes), route/key drift, and absent receipts fail closed. Focused `prompt_suggestion` suite: 23/23; route-authority, injected-client lifecycle, TurnStarted, and URL-redaction filters also passed before integration. |
|
||||
| #1004 request preview | must-land inspectability slice | **landed `e57554ad9`; independently reviewed PASS** | `/preview-request` now derives its redacted manifest from the same prepared outbound value used for Chat, Anthropic Messages, and Responses dispatch. It reports typed route, role/Lane, requested-to-wire reasoning, stable hashes and canonical sizes while withholding prompt/message/tool content and leaving provider usage unavailable because no request occurs. Current-head focused preview/manifest/Work grounding filters pass 53/53. PR #1099 credit for @GTC2080 is preserved. |
|
||||
| #4810 todo isolation | must-land | **landed `36fb13ddc`; independently reviewed PASS** | Direct, nested, sibling, and background workers retain distinct private To-do lists. A child publishes only real changes as typed, agent-addressed transient state; only its matching delegate card shows a bounded projection, terminal cards retain the last snapshot, and fanout cards truthfully show none. The parent/sibling/fanout leak boundaries and Pending→Running lifecycle were reviewed. `cargo check -p codewhale-tui --locked` passed; final focused work-grounding, agent-card, routing, mailbox, and child-work-state filters passed 89/89. |
|
||||
| #4797 | must-land | **independent audit NOT PASS; repair required before integration** | Focused implementation tests passed 669/669, but the release audit found nine blocker groups: official endpoint fail-closed classification; effective-route/currency receipt provenance; per-currency and legacy-zero coverage; reset/load cache telemetry; cumulative and runtime aggregates that still turn unknown into complete zero; dual-mode scorecard surface truth; invalid price rejection; shared-accounting test isolation; and localized subtotal/audited-route copy. Reasoning-token and cache-write separation passed subject to those fixes. |
|
||||
| #4785 | verify / no-new-growth | **audited PASS at `c46eb2936`** | Independent audit: 469 `allow(dead_code)` occurrences on both `origin/main` (`b49423631`) and the candidate — zero net growth. The single new occurrence is a correctly `cfg_attr(not(test), …)`-scoped receipt field (`core/engine.rs:5418`, read by a test in `engine/preview.rs`); one baseline suppression was genuinely removed (`dependencies.rs` `available()` now has five production call sites). Adjacent lint-escape check flat except one redundant `allow(unused_imports)` on live re-exports (`hooks.rs:27`, cosmetic). No repair items. |
|
||||
| #4698 | must-land | **landed `9d8cacab7`; independently reviewed PASS** | The shipped bundle now has an authored bijective expectation matrix covering every skill, aliases, invocation tier, ambient eligibility, locale fallback, and prompt-budget invariants. The new `help` skill is explicit-only and never enters ambient context. Provider-free matrix/load/skill filters passed 16/16, 287/287, and 11/11; exact TUI clippy passed. Live-smoke docs are opt-in, use only a task-specific `CODEWHALE_HOME`, restore terminal echo on all interruption paths, never persist credentials, and treat provider responses as unclassified evidence rather than entitlement truth. |
|
||||
| #4707 | must-land | confirmed open — gap analysis complete at `c46eb2936` | All four provider wire-truths are already proven at the wire (GLM-5.2 `reasoning_effort=high\|max`+thinking, GLM-5-Turbo no invented granularity, direct-K3 `off`→visible `low` + `max_completion_tokens`, MiniMax M3 `max_completion_tokens` + adaptive thinking; exact test names recorded in the audit). The missing matrix work is the JOIN: extend `assert_preview_matches_first_wire_body` (`core/engine/preview.rs:1421`) beyond DeepSeek/Anthropic with zai/minimax/moonshot/kimi-code fixtures; assert per-route manifest size estimates against captured bodies; prove cross-route tool-catalog-hash stability; assert the manifest's requested→effective reasoning triple matches each route's actual body; and pin `provider_reported_usage` unavailable-in-preview/populated-post-turn. Note: the issue as literally filed is a larger ablation-gate epic; the four-route matrix is the release cutline, and the ablation harness remains honestly out of this release. |
|
||||
| #4909 non-UTF-8 `fetch_url` | must-land community PR | **landed `97e501191`; independently reviewed PASS after repair** | Rebuilt the contribution on the candidate head with BOM-first decoding, recognized transport charset precedence, bounded HTML-only meta sniffing (including legacy `http-equiv` and leading comment/XML declarations), complete-body NUL rejection, and a direct `encoding_rs` dependency. Focused extract 19/19 and fetch URL 12/12 passed; contributor credit and `Harvested from PR #4909` are preserved. |
|
||||
| #4526 | must-land (audit overturned verify-and-close) | **re-audited NOT closeable at `c46eb2936`** | Registry/routing/catalog/auth/docs criteria PASS with receipts (StepFun Plan URL recognized in `pricing.rs`, OpenCode Go route/models/billing chip all tested). The retained v0.9.2 scope FAILS: no setup-flow billing-route choice exists — `provider_picker.rs`/`onboarding`/`setup` contain zero StepFun/OpenCode strings. Required: a StepFun PAYG-vs-Step-Plan stage mirroring the shipped `Stage::PlanTier`/`KimiCodePlanTier` pattern, skip-guard for pre-existing custom `base_url` (never silently rewrite), endpoint verification before key persistence, `providers.stepfun.base_url`-only persistence, visible subscription-vs-PAYG framing for Go vs Zen, plus tests and doc updates. |
|
||||
| #3983 / #3984 | must-land | **landed `ed7e83127`; independently reviewed PASS** | One bounded graph-backed To-do tail now grounds each parent turn-loop and sub-agent step request, and the byte-identical body is reused for fork/relay while remaining outside history, compaction rehydration, and the stable prefix. Verified before integration: work-grounding 12/12, work-state 13/13, work-tail 4/4, fork-state 1/1, structured-state 2/2, relay 3/3, preflight 1/1, child-request 1/1, sibling-isolation 1/1; final static review found no overbroad auxiliary-request claims. |
|
||||
| #3928 constitution / base-prompt provenance | must-land inspectability slice | **landed with request manifest `e57554ad9`; independently reviewed PASS** | Explicit base-prompt preview is exact and base-only, runtime provenance no longer names a source-tree path, and protected effective system hashes remain available without dumping the full composed request. |
|
||||
| #4039 Workflow row truth | must-land narrow slice | **landed `bc3e1f097`; independently reviewed PASS** | Workflow spawn now captures exact role, provider, model, requested→effective reasoning, and closed routing source and preserves that receipt through the JSONL journal, live panel, and history card. Missing usage remains unknown through task, run, and shared Workflow IR while genuine provider-reported zero survives; direct agent cards do not invent Workflow receipts. Verified: shared Workflow 111/111, panel 32/32, real spawn/journal 1/1, unknown-versus-zero 1/1. |
|
||||
| #3897 | must-land | **cherry-picked `89b73bdd1`; compile/test receipt pending** | The persistent rendered-prefix cache landed via cherry-pick of `f2358387c` from the md-incremental lane: `IncrementalMarkdownRenderCache` with resumable syntect highlighter state, `StreamingSourceReceipt` verified-append provenance (no quadratic byte compare), deterministic `MarkdownRenderWork` counters in production state, and differential exactness + linearity + invalidation tests. Known honest bound: the tail path still clones tail blocks, so unbounded open tables/paragraph tails are linear-in-common-case, not hard-bounded — the lane's uncommitted plain-tail/table follow-up does NOT compile (missing `IncrementalTableState.blocks` field) and was deliberately left out. Focused suite receipt on the candidate is still required before this row is PASS. |
|
||||
| #2342 | deferred product decision | not started | Click-to-preview needs a defined action and is not allowed to grow a decorative affordance without backend behavior. |
|
||||
| #998 | deferred product decision | not started | `hover_layer.rs` exists but remains unwired; do not surface it until its interaction contract is settled. |
|
||||
| #4906 | post-candidate media | **human-gated; harness landed** | PR #4940 landed the executable capture harness. Record and accept one real provider/local-Ollama dogfood session for the site + README GIF; this is the only open v0.9.2 milestone issue and does not reopen runtime correctness. |
|
||||
| #4907 web CI | must-land | **candidate commit `990489c9b`; combined-candidate re-verified at `c46eb2936`** | Push/PR still validate; deploy is manual-dispatch-only at the exact SHA. Combined-candidate receipts: web suite 143/143 (21 files), ESLint clean, `tsc --noEmit` clean. |
|
||||
| #4904 mention review follow-ups | must-land | **candidate commits `9dd481072`, `9df3218fa`** | Preserved original authorship; PR checks were green before local integration. Re-verify on the combined candidate. |
|
||||
| #4808 visual-language baseline | must-land slice | **landed `2fe849f1d`; independently reviewed PASS after repair** | Pickers, Fleet/skills rows, hotbar, and workflow surfaces now share one selection marker/background vocabulary and compact action hints. The review blocked two false verbs (`cancel` where Esc only closes, `select` where feedback opens a browser); both were repaired before landing. Full release runtime QA passed 9/9 (1 ignored), exact CI clippy passed, and the four repaired blocker-size/selection tests passed 4/4. This is a baseline slice only: the remaining visual-program rows below stay active. |
|
||||
| Saved Fleets + reasoning Router | must-land (live product decision) | first pass blocked; adversarial repair in progress | A Router is a reusable optional profile, not a Fleet worker. It has two phase-separated jobs: during Fleet setup it may inspect only the user's explicit configured model pool and propose provider/model assignments for roles, which take effect only after human review and save; during a Workflow it may choose only reasoning for the frozen exact member route, never provider/model/role/tools/permissions. One Router may be reused by many saved Fleets. Exact Fleet capture and run-scoped dispatch are wired, but review blocked integration until gates and worker preflight precede Router spend, child ceilings are enforced, durable receipts contain no task text/path/secret, and they show exact Router identity plus requested→effective Router and worker reasoning. Strict parsing rejects trailing content; exact Auto always uses Router; snapshots omit absolute paths; collisions/capability fallbacks/ceilings fail closed. No hidden DeepSeek Flash default, runtime model switching, or heuristic fallback is allowed inside an exact Fleet. |
|
||||
| Workflow vocabulary | must-land compatibility preservation | **landed `55207ea78`; independently reviewed PASS** | Workflow remains the current public and technical execution unit: Fleet = who, Workflow = what order, Lane = one running Workflow, Runtime = where/how. Configuration rows now state their scope in every shipped locale. No `/operation` or `codewhale operation` was added; Operation remains reserved for a future continuous objective coordinating multiple Fleets and Workflows. Focused configuration-section, legacy-fallback, and locale-filter tests passed 3/3; exact TUI clippy passed. |
|
||||
| Agent route labels | must-land | **Workflow slice landed `bc3e1f097`; Router identity still pending** | Every Workflow worker now visibly and durably retains role, exact provider/model, requested→effective reasoning, and routed-by source from launch onward. Router-selected launches must still identify the exact Router provider/model once the saved-Fleet Router slice lands; provider controls such as GLM thinking enabled/disabled remain a separate provider-truth item. |
|
||||
| Consultant Fleet role | must-land compatibility slice | **landed through `a3cdaf751`; independently reviewed PASS** | `consultant` is the only public/canonical advisory role; `oracle` and `advisor` survive only at parse, replay, and config-compatibility boundaries and repersist canonically. Consultant defaults to high reasoning unless explicit Auto/Effort wins, remains read-only/no-shell/network-off, and production headless execution enforces the network cap by disabling WebSearch and installing deny-all tool network policy. Canonical model overrides win alias collisions; exact provider/model routes remain explicit and unresolved evidence stays unresolved. Integrated focused filters pass 16/16 Consultant and 6/6 tool authority. |
|
||||
| #4751 Fleet settings information architecture | must-land narrow slice | **landed `55207ea78`; independently reviewed PASS** | Configuration now labels the saved DeepSeek fallback as a legacy off-route setting and keeps Fleet/member/Router, Workflow, Lane, Runtime, and session settings in truthful sections. The broader historical request to bury Fleets under Models remains superseded by the first-class Fleet shelf. |
|
||||
| Paste — real-PTY trace | must-land (unlabeled report) | **candidate commits `a77d2e5cd`, `a62e6a72c`, `e4a892fb7`** | Modified Enter no longer enters bare-Enter paste suppression; guessed trailing newlines cannot re-arm suppression indefinitely; lone CJK IME commits use the short window. Focused unit groups 10/10, 11/11, 55/55 and both real PTY regressions passed. The combined 8,373-test TUI run exposed one superseded bare-Enter-steers assertion; its corrected queue contract passes. Full rerun remains required after all lanes integrate. |
|
||||
| Mode / effort persistence | must-land (unlabeled report) | **landed `feef1846e`; independently reviewed PASS** | Mode, reasoning, model, provider, and permission aliases share one busy-turn lock; same-live selections persist the startup default with a truthful receipt. Whole-file settings changes use a process mutex plus adjacent cross-process lock and atomic replacement; legacy migration is locked and no-clobber. Shutdown drains queued writes and surfaces late failures. `cargo check -p codewhale-tui --locked` is warning-free; settings 79/79 (1 helper ignored), startup-default 18/18, live-route 4/4, preset 2/2, approval alias 1/1, selection/hotbar/reasoning/localization/config focused filters all passed. |
|
||||
| Hooks runtime + documentation | must-land (unlabeled report) | **landed `5e3d84307`; independently reviewed PASS** | The TUI hook lifecycle now has bounded background supervision, timeout/tree termination and reaping, stable session identity across rebind, real exit-code conditions, `on_error` coverage for tool failures including ignored completions, bounded nonblocking background `message_submit` stdin, actual local/external `shell_env` behavior, and truthful TUI-only documentation including side effects. Focused audit passed hooks 142/142, message-submit 29/29, exit-code 1/1, and ignored-completion failure-hook 1/1. Windows Job Object runtime and physical-terminal behavior remain UNRUN. |
|
||||
| Provider verification 401 (Kimi / MiniMax) | must-land (unlabeled report) | Kimi defect confirmed; MiniMax theory corrected | Fresh Kimi setup verifies before Platform vs Kimi Code product selection, so a membership key can be probed against `api.moonshot.ai` and 401. Require product before key and test both routes provider-free. Current MiniMax `/models` paths and auth headers match official contracts; GroupId is not required. Retain that report as a key/product/entitlement incident and add mock path/header/200/401 tests rather than a live gate. |
|
||||
| Provider request truth | must-land (benchmark prerequisite) | confirmed gaps | GLM-5.2 must emit documented `reasoning_effort=high|max` in addition to thinking control, while GLM-5-Turbo must not receive invented granularity. MiniMax M3 must use `max_completion_tokens`. Kimi fixed-K3 `off` must fail or visibly normalize to `low`; Kimi membership catalog and subscription billing are stale. |
|
||||
| Context / tool-surface accounting | must-land (benchmark prerequisite) | confirmed gap | Active pressure and compaction omit serialized tool schemas even though the source map knows them; Standard and Full are currently behaviorally identical. Use one estimator with per-class byte/token estimates and stable tool hash, and either make the labels measurably distinct or collapse them. |
|
||||
| Notification app icon (#4847) | human-gated | **not fixed** | `display notification` runs through unbundled `/usr/bin/osascript`, so macOS attributes the banner to Script Editor. Requires a real signed `.app` bundle → signing/notarization, which is Hunter-gated. The separate OSC control-byte leak is fixed (#4905). |
|
||||
| Version bump + changelog band | release preparation | **done at `0faa44a74`** | Workspace, npm wrapper, lockfile, and changelog band are consistently `0.9.2`. |
|
||||
| Tag, GitHub Release, publication | human-gated | pending | |
|
||||
| Dogfood install of the release SHA | required local gate | **done** | Installed final runtime candidate `823280557235`; all three fresh-shell binaries report `0.9.2 (823280557235)`. Clean-source receipt: `backups/dogfood-installs/20260728T084840Z-823280557235.txt`; prior candidate installs are superseded. |
|
||||
| Web deploy / CWC #123 | human-gated | **pending; code merged, deploy not run** | PR #4944 landed the CWC-aligned public design. Production remains unchanged until explicit deployment approval. |
|
||||
| Live-provider entitlement test (K3) | human-gated | pending | |
|
||||
| Manual multi-terminal QA (#3758) | split gate | **automated slice landed `14960d2c9`; physical-terminal matrix human-gated** | Provider-free terminal/key/modal matrix passed 19/19; release runtime QA passed 17/17 with one explicit 32-worker stress ignore; shortcut audit passed 15/15. Cell-by-cell record: `docs/releases/v0.9.2-terminal-matrix.md`; target `crates/tui/tests/terminal_matrix_qa.rs` plus harness additions (`modes.rs` control-stream ledger, `view_log.rs` view-stack trace reader). The matrix covers sizes, `TERM`/`COLORTERM` capability tiers, Unicode/ASCII fallback, bracketed/raw/multiline/CJK paste and IME-style commits, mouse/resize/focus, provider-free modal open/Esc lifecycle, terminal-mode restoration on every exit path, and exactly-once ordered queued follow-ups. Literal iTerm2, Terminal.app, WezTerm, SSH, tmux, ConPTY, listening, and visual observations remain `UNRUN`; provider-dependent modals remain a named automation gap. |
|
||||
| #4067 `@git`/`@diff` mentions | verify-and-close | closed by #4899 | Re-verify on the release SHA before the release notes claim it. |
|
||||
| #3947 policy-narrowing events | verify-and-close | closed by #4900 | |
|
||||
| #3874 background shell completion | verify-and-close | closed by #4894 + #4901 | Exactly-once and heartbeat carve-out each have a named test. |
|
||||
| #3738 prompt-cache regression | verify-and-close | closed by #4902 | Whole-serialized-message test pins it. |
|
||||
| #4089, #4812, #4867, #4717, #4763, #4405, #4811, #4834 | verify-and-close | closed by audit with receipts | Each was audited against the then-current `origin/main`; re-confirm against the release SHA. |
|
||||
| #2494 macOS/iTerm2 report | verify-and-close | **item 7 landed and verified at `4ac0c6ea7`** | Exported Markdown now lists the workspace side-git restore points without creating a repository on read, labels the index as time-sensitive, retains stable snapshot ids, and correlates user prompts through the same bounded snippet producer used by snapshot labels. Missing, unreadable, empty, unmatched, and ambiguous evidence remain distinct rather than guessed. Combined-candidate receipts: export 17/17, snapshot labels 6/6, format and diff checks clean. |
|
||||
| Wave A/B/C visual + supervision programs (13) | must-land | active implementation/audit | Existing visual-wave worktrees contain candidate implementations. Each issue needs a testable v0.9.2 slice plus review; no item may be deferred merely because it began as a design program. |
|
||||
| Localization + website locales (9) | must-land + human language review | active implementation/audit | Existing localization lanes cover the requested locales and website surfaces. Deterministic parity/layout/script gates must land; any remaining native-speaker sign-off is recorded separately as human evidence, not used to discard the implementation. |
|
||||
| Onboarding / constitution / slash-command product design (16) | must-land | active implementation/audit | Maintainer judgment supplies the product decisions for this release. Existing setup and command lanes are candidate work, not reasons to defer. |
|
||||
| Multi-surface epics (control plane, monitor UX, workflow driver, plugin registry) (11) | must-land | active implementation/audit | Land coherent bounded implementations with truthful unavailable states where an external service is absent; size alone is not a deferral criterion. |
|
||||
| Manual QA / `needs-human` (2) | split gate | automate everything possible; physical/manual rows remain human-gated | Human-only evidence cannot be fabricated, but its automatable harness and documentation still gate v0.9.2. |
|
||||
|
||||
## The 51 moved issues
|
||||
|
||||
Fifty-one issues were moved off the v0.9.2 milestone with a per-issue comment.
|
||||
Hunter explicitly put all of them back on the release audit table. Their live
|
||||
tracker state remains:
|
||||
|
||||
- **milestone:** v0.9.3
|
||||
- **label:** every one of them has the `v0.9.2` label. Sixteen missing labels
|
||||
were restored during this campaign. Do not strip them merely to match the
|
||||
milestone; each item must receive a maintainer disposition and receipt.
|
||||
|
||||
Measured against the live tracker at 2026-07-26 21:30 PDT, so the release is
|
||||
never sized from this document's own prose: **109** issues carry the `v0.9.2`
|
||||
label — 37 CLOSED and 72 OPEN, of which 57 sit on the v0.9.3 milestone, 4 on
|
||||
v0.9.2, and 11 on no milestone. Of the full v0.9.2 scope Hunter restored,
|
||||
**54 are OPEN and none are CLOSED**. Eight scoped items carry no `v0.9.2`
|
||||
label at all and so are invisible to a label query — #4797, #3897, #4785,
|
||||
#2494, #2342, #998, #4906, #4847 — which is exactly why the scope table above,
|
||||
not a tracker query, is the release disposition. Two of those eight need their
|
||||
tracker state stated plainly rather than inferred: **#2494 is CLOSED on GitHub
|
||||
while its item 7 remains genuinely unimplemented**, and **#4847 carries no
|
||||
milestone**.
|
||||
|
||||
Exact issue set:
|
||||
|
||||
`#1004`, `#1888`, `#1891`, `#2026`, `#2033`, `#2934`, `#2974`, `#3091`,
|
||||
`#3092`, `#3093`, `#3409`, `#3413`, `#3758`, `#3792`, `#3793`, `#3832`,
|
||||
`#3927`, `#3928`, `#3930`, `#3937`, `#3996`, `#4022`, `#4039`, `#4227`,
|
||||
`#4397`, `#4398`, `#4400`, `#4404`, `#4411`, `#4749`, `#4751`, `#4754`,
|
||||
`#4782`, `#4788`, `#4789`, `#4790`, `#4791`, `#4807`, `#4808`, `#4810`,
|
||||
`#4813`, `#4814`, `#4815`, `#4816`, `#4817`, `#4819`, `#4820`, `#4821`,
|
||||
`#4822`, `#4823`, `#4836`.
|
||||
|
||||
| Category | Count |
|
||||
| --- | --- |
|
||||
| Wave A/B/C visual + supervision programs | 13 |
|
||||
| Localization + website locales | 9 |
|
||||
| Onboarding / constitution / slash-command product design | 16 |
|
||||
| Multi-surface epics | 11 |
|
||||
| Manual QA / `needs-human` | 2 |
|
||||
| **Total** | **51** |
|
||||
|
||||
The earlier maintainer re-audit reduced this list to seven code gaps and called
|
||||
43 items deferred or human/design-gated. **That disposition is superseded.** On
|
||||
2026-07-26 Hunter clarified that all 51 moved items are v0.9.2 completion work.
|
||||
Every technically actionable item below therefore remains active until it is
|
||||
implemented and verified. Only evidence that literally requires a person or
|
||||
physical environment (native-language approval, listening/visual sign-off,
|
||||
real-terminal rows) may remain human-gated, and its automatable slice must still
|
||||
land. The large existing completion worktrees are candidate implementations to
|
||||
audit and harvest; they are not proof by themselves.
|
||||
|
||||
| Issue | v0.9.2 disposition | Exact cutline |
|
||||
| --- | --- | --- |
|
||||
| #1004 | **must-land · request-manifest lane** | Redacted, actual-builder request manifest; full raw-body mode may remain optional. |
|
||||
| #1888 | **active · command-parity lane** | Complete the cross-command control-plane surface with truthful hooks/persistence receipts and consistent command semantics. |
|
||||
| #1891 | **landed `21ce3a46d`; independently reviewed PASS** | `/tools [text|json]` and the `/tool-studio` compatibility alias inspect a bounded projection of the latest prepared internal request tool field in a pager, never transcript history. Present-empty and absent remain distinct; hashes/bytes and truncation are bounded. Provider delivery, provider wire body, provider/model, approval, provenance, and capabilities stay explicitly unknown/unavailable because this slice cannot observe them. Current-head focused projection, command, and request-snapshot filters pass 3/3 each; physical-terminal, native-language, and visual observations remain UNRUN. |
|
||||
| #2026 | **active · Fleet lane; reinterpretation required** | Replace obsolete whale-size aliases with clear, exact Fleet/reasoning labels that fulfill the discoverability intent without hiding model identity. |
|
||||
| #2033 | **landed human-only slice `c5751fbe7`; independently reviewed PASS** | `/structcopy` provides bounded, deterministic plan/turn/tool/Workflow projections with pre-serialization secret/path/URL scrubbing, exact omission receipts, explicit clipboard/stdout delivery, and no model-visible tool-catalog cost because it is excluded from the model catalog. Focused tests pass 32/32; any model-callable structural-copy tool remains outside this human-only slice. |
|
||||
| #2934 | **active · session-control lane** | Finish the persistent multi-session sidebar, auto-resume, and history browsing with truthful backend state. |
|
||||
| #2974 | **satisfied on main** | `82bcb0aa5`: bounded Workflow journal events and task/run usage telemetry with compatibility tests. |
|
||||
| #3091 | **active · localization lane + human language review** | Land Japanese/Vietnamese website parity and deterministic route/layout checks; record native-language review separately. |
|
||||
| #3092 | **active · localization lane + human language review** | Land Russian README/site/TUI coverage and Cyrillic shaping checks; record native-language review separately. |
|
||||
| #3093 | **active · localization lane + human language review** | Land Korean/Spanish/Portuguese website coverage and deterministic layout/parity checks; record native-language review separately. |
|
||||
| #3409 | **active · onboarding lane** | Complete remote/mobile/chat-bridge/runtime onboarding with truthful unavailable states for unconfigured services. |
|
||||
| #3413 | **active · web-maturity lane** | Complete the website maturity and information-architecture slice, including the real-session media surface once dogfood is stable. |
|
||||
| #3758 | **automated slice landed `14960d2c9`; split human gate** | The PTY/key/modal matrix and running-turn queue contract are green. Only literal physical-terminal observations remain `UNRUN`, plus the documented provider-dependent modal automation gap. |
|
||||
| #3792 | **active · onboarding lane** | Finish conversational first-run onboarding with a concrete, tested maintainer-selected flow. |
|
||||
| #3793 | **active · constitution-review lane** | Finish guided constitution authoring, revision, persistence, and localization using the maintainer-selected interaction contract. |
|
||||
| #3832 | **active · constitution-review lane; reinterpretation required** | Fulfill bounded review-repair automation without inventing a fourth Mode; keep Mode, permission posture, Workflow, and Router responsibilities separate. |
|
||||
| #3927 | **active · onboarding lane** | Add an explicit provider-independent offline first-run path and verify it without credentials or network. |
|
||||
| #3928 | **must-land · request-manifest + constitution-review lanes** | Exact effective base-prompt preview plus truthful bundled/config/embedder provenance. |
|
||||
| #3930 | **active · constitution-review lane** | Implement the recommendation/ratification flow with explicit revision and acceptance states. |
|
||||
| #3937 | **active · onboarding lane** | Complete appearance onboarding and contextual teaching without obscuring current state. |
|
||||
| #3996 | **active · durable-controls lane** | Implement internal URI/GitHub Actions read surfaces with explicit trust boundaries and measured tool-catalog growth. |
|
||||
| #4022 | **active · command-parity lane** | Complete CLI/TUI Fleet and runtime control parity with shared receipts and compatibility tests. |
|
||||
| #4039 | **must-land · workflow-live lane; narrow slice** | Workflow rows consume exact route/reasoning plus completed tokens/tools/duration; shelf/paging/grouping defer. |
|
||||
| #4227 | **active · onboarding lane** | Deliver a welcoming, grounded project-map/tutorial surface with maintainer-selected naming and no fabricated capability. |
|
||||
| #4397 | **active · session-control lane** | Complete the multi-session dashboard and approval control plane against real runtime state. |
|
||||
| #4398 | **active · durable-controls lane** | Complete durable monitor subscriptions, `/loop`, restart, and truthful notifications. |
|
||||
| #4400 | **active · durable-controls lane** | Complete agent hunk attribution and selective rewind with conflict detection, preview, and recovery evidence. |
|
||||
| #4404 | **must-land** | Fail-closed, exact-route prompt suggestions; no cross-provider credential inspection or context transfer. |
|
||||
| #4411 | **must-land · Fleet lane** | Exact Fleet scopes runnable inventory and credentials; no provider/model inspection outside the selected Fleet. |
|
||||
| #4749 | **active · localization lane + human language review** | Land Catalan and the scoped Galician/Basque assessment with deterministic locale checks; record language review separately. |
|
||||
| #4751 | **must-land narrow slice** | Remove stale DeepSeek fallback row and keep Fleet settings limited to Fleet/member/Router concerns. |
|
||||
| #4754 | **active · workflow-live lane** | Complete Workflow live monitoring, chat-side authoring, and goal staging. Workflow remains the current execution noun; Operation stays reserved for a future continuous multi-Fleet/multi-Workflow layer. |
|
||||
| #4782 | **active · constitution-review lane** | Complete Constitution v2 with byte-stable prompt/cache evidence, migration, preview, and ratification tests. |
|
||||
| #4788 | **active · localization lane + human language review** | Land French/German/Catalan TUI/README/site coverage and deterministic layout/parity checks. |
|
||||
| #4789 | **active · localization lane + human language review** | Land Indonesian localization and deterministic fallback/parity checks. |
|
||||
| #4790 | **active · localization + terminal-matrix lanes; physical shaping review** | Land Hindi localization and automated Devanagari width/grapheme/PTY coverage; record physical terminal/browser observations separately. |
|
||||
| #4791 | **active · localization lane + human language review** | Land Ukrainian localization and Cyrillic shaping/parity checks. |
|
||||
| #4807 | **active · visual-supervision lane** | Complete the ambient jellyfish silhouette and verify narrow-terminal/performance behavior. |
|
||||
| #4808 | **partial landed + active · visual-supervision lane** | Complete the v0.9.2 visual-language slice with measurable hierarchy, accessibility, and render-cost gates. |
|
||||
| #4810 | **must-land / partial candidate** | Isolation core is `571f8b751`; bounded child-To-do projection under delegate rows remains. |
|
||||
| #4813 | **active · visual-supervision lane** | Land cross-theme luminance/accessibility semantics with palette assertions and non-color labels. |
|
||||
| #4814 | **active · agent-telemetry lane** | Land stable agent identity hues alongside exact text provenance labels and collision/accessibility tests. |
|
||||
| #4815 | **active · agent-telemetry lane** | Land a shared recoverable/fatal/retried/blocked/resumable vocabulary across runtime surfaces. |
|
||||
| #4816 | **active · agent-telemetry lane** | Land read/change persistence marks with bounded storage and render-performance evidence. |
|
||||
| #4817 | **active · visual-supervision lane + human listening sign-off** | Land the opt-in sound/event contract, platform-safe fallback, and deterministic tests; record pleasantness/listening approval separately. |
|
||||
| #4819 | **active · agent-telemetry lane** | Land bounded deviation-aware salience and time gutters with explicit baselines and deterministic policy tests. |
|
||||
| #4820 | **active · agent-telemetry lane** | Land low-cost context/token/activity meters with motion-off and render-budget gates. |
|
||||
| #4821 | **active · agent-telemetry lane** | Land stable agent anchoring, swimlanes, and live write-scope topology from real coordination state. |
|
||||
| #4822 | **active · agent-telemetry lane** | Land per-delegate re-entry recap from durable unread/attention/monitor state. |
|
||||
| #4823 | **active · visual-supervision lane + visual sign-off** | Land a bounded, toggleable texture/focus-context prototype with fallback and performance evidence; record subjective approval separately. |
|
||||
| #4836 | **active · durable-controls lane** | Land a starter plugin pack and reviewed install registry with provenance, trust, offline/error states, and measured tool-surface impact. |
|
||||
|
||||
This table, not the milestone move, is the release disposition. Every active row
|
||||
needs a landed-SHA receipt. Human-only evidence is named explicitly and cannot
|
||||
be fabricated, but it does not convert the corresponding technical work into a
|
||||
deferral.
|
||||
|
||||
## Parallel lane reconciliation
|
||||
|
||||
The scope table's "active implementation/audit" rows are being worked in
|
||||
per-topic worktrees under `/Volumes/VIXinSSD/CW/worktrees/codewhale-v092-*`.
|
||||
Two facts about them govern how they must be handled, and both are easy to get
|
||||
wrong from a handoff document alone:
|
||||
|
||||
- **Nearly all of that work is uncommitted.** It lives as dirty working trees,
|
||||
not as branch commits, so it is invisible to `git log` and is destroyed by any
|
||||
`reset`, `clean`, `checkout`, or `worktree remove --force`. Roughly 55,000
|
||||
patch lines and ~100 untracked files across 20 lanes were in this state at the
|
||||
2026-07-26 21:25 PDT reconciliation. A read-only archive of every dirty lane
|
||||
(per-lane `HEAD`, `status`, `git diff HEAD` patch, and verbatim untracked
|
||||
copies) is at `backups/v092-lane-archive-20260726-2125/`. Re-take it before
|
||||
any operation that could discard a lane.
|
||||
- **Lanes drift from the candidate.** Several sit on bases many commits behind
|
||||
the candidate head. Per `AGENTS.md`, a far-behind lane is recovered as intent
|
||||
and re-implemented against the current head; it is not merged wholesale.
|
||||
|
||||
A lane being dirty is not evidence it is finished. Each still needs an
|
||||
independent PASS audit and its own gate receipts before any of it is integrated,
|
||||
and no scope-table row may be marked landed on the strength of a worktree diff.
|
||||
|
||||
### Lane audit verdicts (2026-07-27, read-only, against candidate `1d3d81591`)
|
||||
|
||||
All audited lanes have **zero unique commits** — every lane's value is its
|
||||
dirty tree, re-archived at `backups/v092-lane-archive-20260727-0212/`. Lane
|
||||
worktrees were not committed on (that action is approval-gated); harvests land
|
||||
on the candidate.
|
||||
|
||||
| Lane | Verdict | Key facts |
|
||||
| --- | --- | --- |
|
||||
| fleet-operation (Router) | **HARVEST, staged leaf-first** | The dirty tree is a rewritten design that addresses nearly every review blocker in code (two-phase admission with the cost boundary before Router spend, fingerprint-verified child ceilings, strict parser refusing trailing/duplicate/mutation content, exact-Auto-always-Router, path-free hash-verified snapshots, no implicit Flash default, oracle/advisor→consultant aliases, raw-shell deny by ceiling). ~15k uncompiled lines, 172 tests. Gaps: `fleet_composition.rs` (setup-time proposal→ratify UI) is an unwired schema; internal enum variant still named `Oracle` (cosmetic). |
|
||||
| command-parity (#1888/#4022) | **HARVEST — land its `main.rs` extraction before session-control** | 3,250-line control-plane contract; `/lane interrupt` is new, real, and nonblocking (sync validation, off-loop named-thread teardown, "queued is never success", bounded queue, fence checked under the mutation lock). `lane restart`/`resume` declared `NotImplemented` and gated honestly. ~169 tests. |
|
||||
| session-control (#2934/#4397) | **HARVEST Rust; JS rail needs vitest before closing #4397** | Auto-resume decision layer with double workspace re-check, bounded redacted peek with no invented turn-status, typed session-vs-thread targets failing closed on stale-target/stale-approval with user-visible refusals. The truth-critical `app.mjs` rail has zero automated tests. |
|
||||
| localization (9 issues) | **HARVEST ALL, gated on compile + 1153→1177 key reconciliation** | 14 packs at in-lane parity (its `en.json` is 1153 keys; candidate is 1177 — harvested packs must gain the missing keys). New ru/uk/hi/ca/fr/de/id packs with machine-checked script purity; RU/UK READMEs; 8 website dictionaries + new `check-locales.mjs` CI gate; grapheme-cluster `truncate_to_width` rewrite (highest-risk/highest-value, benefits all locales); gl/eu deferral is a real written assessment. #4788/#4789 are TUI-only (no fr/de/ca/id READMEs or site pages) — do not close on merge. #4790 keeps its human terminal-QA half open. |
|
||||
| visual-supervision | **HARVEST #4813, #4823, #4817, #4807, #4808-slice; 7 issues honestly not-started** | Substantive+tested: theme contrast audit (#4813), default-off provably-static focus texture (#4823), off-by-default BEL-only sound policy (#4817, needs test-env lock guard), jellyfish + frame budget (#4807 — ambient idle-ocean decoration is sanctioned by the issue itself; the no-decoration-animation rail governs status indication, and the reduced-motion path is static), unlabeled `menu_style` selection-vocabulary slice (#4808). Not started: #4814, #4815 (hook only), #4816, #4819, #4820, #4821, #4822. |
|
||||
| onboarding (#3409/#3792/#3927/#3937/#4227) | **HARVEST #3409 + #3927; SPLIT #3937; re-label #4227; #3792 honestly not-started** | #3409 remote-mode matrix with exemplary secret/truthfulness tests; #3927 offline explore path complete. #3937 Appearance step is wired, but the new tip taxonomy has zero call sites and would fail CI clippy dead-code — wire or drop. #4227 delivered as a contributor-sync skill, not a project-map surface. #3792 as scoped (conversational onboarding) is not-started; the resume-at-first-unsettled-step helper is a separate harvestable slice. High `ui.rs` rebase risk. |
|
||||
| web-maturity (#3413) | **HARVEST (web-only)** | New /docs/guide + /docs/vocabulary routes, homepage getting-started, media manifest landing in explicit `pending` state (no placeholder footage), 35+ web tests. Genuinely unlanded. The media plan doc authorizes nothing. |
|
||||
| durable-controls (#3996/#4398/#4400/#4836) | **HARVEST code as foundation; CHANGELOG must be rewritten** | ~4,600-line `crates/tui/src/durable/` tree with 128 tests, cleanly one-module-per-issue — but zero consumers beyond `mod durable;`. Its CHANGELOG block claims shipped behavior that is not reachable and must not land as written. Harvesting does not close any of the four issues. |
|
||||
| agent-telemetry (#4814–#4822 slices) | **HARVEST; only #4815 (+partial #4814) are user-reachable** | ~3,800-line `supervision/` tree, 65 tests; `agent_details.rs` consumes status vocabulary + route provenance. #4816/#4819/#4820/#4821/#4822 slices exist as tested library code without consumers. |
|
||||
| workflow-live (#4754) | **already-landed-discard** | Its one commit is patch-identical to `ac4c38f8a` on the candidate; the dirty file is authoring scaffolding. Honest scope note: only the route-receipts slice of #4754 ever existed — live monitoring/authoring/goal staging remain not-started. |
|
||||
| terminal-matrix (#3758) | **already-landed-discard; ledger row enriched** | Its commit is patch-identical to `14960d2c9`; the one-line ledger improvement was merged into the row above. |
|
||||
| request-manifest | **SUPERSEDED — archived, nothing unique** | Twin landed at `e57554ad9` as a byte-identical superset of all 7 new files; residue is changelog prose and whitespace drift. |
|
||||
| mode-hooks | **SUPERSEDED except one ~10-line hunk (being harvested)** | Hooks/persistence twins `5e3d84307`/`feef1846e` contain everything (docs/HOOKS.md byte-identical). Unique: the `take_shortcut_queued_message` queued-draft dispatch branch + its steering test. |
|
||||
| provider-truth | **UNIQUE VALUE — being harvested (truth-critical)** | Candidate already has the reasoning-control work under newer names; 8 unharvested clusters remain, including immutable dispatched-receipt billing, the Moonshot direct-platform vs kimi-code product split (candidate currently lumps Moonshot into one flat quota label), MiniMax Token Plan credential-product billing (absent entirely), child billing provenance, Option-al output ceilings (killing a silent 4096 clamp), and per-provider base-URL isolation. |
|
||||
| auto-scope (#4411) | **UNIQUE VALUE, 100% unharvested — being harvested** | No twin ever landed (prior ledger assumption wrong). Today's candidate will silently route an Auto turn to a provider the user did not select; the lane adds active-provider default scope, persisted `[auto] cross_provider` opt-in, classifier-prompt scope declaration, fail-closed refusal of out-of-scope recommendations, and truthful ActiveProvider receipts. |
|
||||
| tool-inspectability | **UNIQUE VALUE — being harvested** | The landed #1891 slice declares provenance unavailable; the lane derives real registry provenance (builtin/MCP/synthetic), MCP server attribution with a single-definition invariant, per-step snapshot identity, and a provider receipt following the resolved client. Harvest extends the landed design and must share the request manifest's catalog digest. |
|
||||
| constitution-review (#3930/#4782/#3832/+#3928 slice) | **HARVEST; land before the onboarding lane (lower conflict surface)** | #3930 suggestions/ratification fail closed and are structurally excluded from law/render/cache digest; #4782 receipted schema migration with byte-identical rejection and rollback; #3928 exact-bytes base-prompt preview from the same composition path as dispatch. #3832's `review_repair.rs` is finished, tested infrastructure with zero consumers — harvest as infrastructure, do not describe as user-reachable. ~49 tests, low compile risk. |
|
||||
|
||||
## Open PR reconciliation
|
||||
|
||||
- **#4908** — @SparkofSpike's zh-Hans translation quality pass. Harvested
|
||||
locally as merge `1d3d81591` with `Co-authored-by: Sh1Zuku` and
|
||||
`Harvested from PR #4908`. Seven conflict hunks were resolved to the
|
||||
candidate's deliberate terminology decision (`ed8bdf395`): 协作准则 and
|
||||
运行姿态 retained, public Fleet vocabulary in English; the PR's UTF-8 BOM
|
||||
additions and its localization/setup test flips encoding 宪法 were not
|
||||
taken. 44 non-conflicting translation refinements survive. Locale parity
|
||||
and JSON validity re-verified after resolution. Merging the hosted PR
|
||||
remains a separate maintainer action.
|
||||
- **#4904** — follow-ups to #4899's review (`@git`/`@diff` composer mentions).
|
||||
Integrated locally with original authorship as `9dd481072` + `9df3218fa`;
|
||||
re-run combined-candidate gates before calling it landed.
|
||||
- **#4467** — @snail-vs's OpenCode Zen provider. The complete contributor
|
||||
history was harvested locally in merge `228690751`; review follow-up
|
||||
`4a836689f` takes the shared environment lock so sibling provider tests cannot
|
||||
leak `CODEWHALE_PROVIDER`. @snail-vs then pushed the same repair as
|
||||
contributor-authored `fbbedbe1`; merge `50989a4d0` reconciles that updated PR
|
||||
head into the candidate ancestry without changing the resulting source. The
|
||||
live PR later exposed a real web facts-drift failure. With Hunter's explicit
|
||||
maintainer approval, the missing provider maps and source-candidate facts were
|
||||
added as `c3647fea2`, the branch was merged with current `main` as
|
||||
`e701645ac`, and all six fresh fork workflow runs were approved. The PR is
|
||||
mergeable again. Every current hosted check is green, including Ubuntu,
|
||||
macOS, Windows, web, mobile, OpenHarmony, wrapper, DCO, issue-link, and Claude
|
||||
review; deploy remained correctly skipped. The equivalent facts amendment is
|
||||
integrated locally as `e805213d8`; the umbrella #1481 remains open because
|
||||
this PR intentionally omits OpenCode Go. Prior branch evidence was
|
||||
clippy-clean with `codewhale-tui` 8336/8336; the combined candidate still
|
||||
needs its own gates before this is called landed. Merging the hosted PR remains
|
||||
a separate maintainer action and is not required to preserve its code in the
|
||||
local candidate.
|
||||
|
||||
## Working model: direct local `main`, no PR
|
||||
|
||||
Release-lane work in this worktree lands as **small, reviewable commits on the
|
||||
local branch**, not as GitHub PRs. Consequences to hold onto:
|
||||
|
||||
- No `link` check and no PR review gate runs, so the discipline they enforce is
|
||||
yours: one concern per commit with a real body, and no closing keyword unless
|
||||
the acceptance criteria are actually met on the landed tree.
|
||||
- CI gates still apply and must be run locally with the exact commands above
|
||||
before anything is proposed for `main`; local green is the evidence, but it is
|
||||
not hosted-green and must not be described as such.
|
||||
- Pushing this branch to protected `main` remains Hunter-gated. The branch is a
|
||||
candidate, not a landing.
|
||||
- Contributor work never enters this way. Anything with an outside author goes
|
||||
through the harvest path with `Co-authored-by` / `Harvested from PR #N` intact
|
||||
and a merge or rebase (never a squash, which rewrites the credit line).
|
||||
|
||||
## Stop line
|
||||
|
||||
Completing this ledger means one reviewed, gate-green, honestly receipted
|
||||
v0.9.2 candidate with every scoped item given an evidence-backed disposition.
|
||||
It does authorize the local version/changelog preparation and local dogfood
|
||||
install required to test that candidate. It does **not** authorize a push, tag,
|
||||
GitHub Release, crates/npm publish, artifact upload, deployment, DNS or billing
|
||||
change, paid/live-provider request, signing/notarization, or public release.
|
||||
@@ -1,102 +0,0 @@
|
||||
# v0.9.2 real-session media plan (#4906)
|
||||
|
||||
> **Status: pending the dogfood recording.** The site renders a visible
|
||||
> "recording pending release candidate" state (`web/lib/media-manifest.ts` →
|
||||
> `first-fleet-session`, rendered by `web/components/session-media.tsx` on
|
||||
> `/docs/guide`). No placeholder, staged, or recycled footage ships. This file
|
||||
> is the exact procedure for producing the real assets once the v0.9.2 release
|
||||
> candidate is stable and dogfooded, and the checklist for flipping the
|
||||
> manifest entry to `published`. It authorizes local recording only — never a
|
||||
> deploy, tag, or publication.
|
||||
|
||||
## What gets recorded
|
||||
|
||||
One continuous real session of the v0.9.2 release candidate, on a **sealed
|
||||
local route** (loopback Ollama, exactly like the canonical screenshot in
|
||||
`docs/public-surface-facts.json` → `screenshot.capture`; no paid or hosted
|
||||
provider, no live account):
|
||||
|
||||
1. Install / launch: `codewhale` in a scratch repository.
|
||||
2. First keyless session: constitution-first setup, then a read-only Plan-mode
|
||||
exploration.
|
||||
3. Provider connection: configure the local Ollama route (provider · model ·
|
||||
reasoning tier visible).
|
||||
4. One Fleet workflow: `codewhale fleet init`, a small `fleet run`, and the
|
||||
receipt at the end.
|
||||
|
||||
Terminal: **120×32**, **Blue Stage dark** theme — identical to the screenshot
|
||||
contract so the moving and still surfaces read as one product.
|
||||
|
||||
## Recording procedure (post-dogfood, exact commands)
|
||||
|
||||
Prerequisite: the candidate has passed the local dogfood install per the
|
||||
release ledger (`scripts/release/install-dogfood.sh`). Seal the environment —
|
||||
never record against a real home directory or live credentials:
|
||||
|
||||
```sh
|
||||
# 1. Sealed scratch environment
|
||||
export CW_MEDIA_HOME="$(mktemp -d)"
|
||||
mkdir -p "$CW_MEDIA_HOME/.codewhale" /tmp/cw-media-demo && cd /tmp/cw-media-demo
|
||||
HOME="$CW_MEDIA_HOME" CODEWHALE_HOME="$CW_MEDIA_HOME/.codewhale" \
|
||||
env -u DEEPSEEK_API_KEY \
|
||||
tmux new-session -d -s cw-media -x 120 -y 32
|
||||
|
||||
# 2. Start the local inference route (separate shell)
|
||||
ollama serve & # loopback only; model pulled in advance, e.g. `ollama pull <model>`
|
||||
|
||||
# 3. Record with VHS (same tool as the canonical screenshot)
|
||||
# Write the tape to docs/evidence/v092-first-fleet-session.tape, replaying
|
||||
# the four beats above, then:
|
||||
vhs docs/evidence/v092-first-fleet-session.tape
|
||||
# → produces the GIF fallback
|
||||
|
||||
# 4. Derivatives
|
||||
ffmpeg -i first-fleet-session.gif -movflags +faststart -pix_fmt yuv420p \
|
||||
-vf "scale=1280:720" -an web/public/media/first-fleet-session.mp4
|
||||
ffmpeg -i first-fleet-session.gif -frames:v 1 \
|
||||
web/public/media/first-fleet-session.png # poster frame
|
||||
cp first-fleet-session.gif web/public/media/first-fleet-session.gif
|
||||
```
|
||||
|
||||
Then hand-write the caption tracks and transcript from the actual recording
|
||||
(never auto-generated filler):
|
||||
|
||||
- `web/public/media/first-fleet-session.en.vtt` and
|
||||
`web/public/media/first-fleet-session.zh.vtt` — WebVTT, one cue per beat.
|
||||
- `docs/evidence/v092-first-fleet-session-transcript.md` — the full command
|
||||
and receipt transcript, with the same evidence-standard header as
|
||||
`docs/evidence/v091-empty-work-surface-receipt.md`.
|
||||
|
||||
## Acceptance checklist (flip `status` to `published` only when every box is true)
|
||||
|
||||
- [ ] Recorded from the **exact release-candidate SHA** named in the v0.9.2
|
||||
completion ledger, after `install-dogfood.sh`, in a sealed
|
||||
`HOME`/`CODEWHALE_HOME`.
|
||||
- [ ] Sealed local route only — no hosted provider, no account, no credentials
|
||||
visible anywhere in the footage.
|
||||
- [ ] Poster is a real frame of the recording, PNG, **1280×720**, ≤ **500 KB**
|
||||
(`MEDIA_BUDGETS.poster`).
|
||||
- [ ] Video is **1280×720**, ≤ **120 s**, ≤ **10 MB** (`MEDIA_BUDGETS.video`).
|
||||
- [ ] GIF fallback ≤ **6 MB** (`MEDIA_BUDGETS.gifFallback`); it is offered as
|
||||
a download link, not described as a static reduced-motion substitute.
|
||||
- [ ] Captions: `en` and `zh` WebVTT tracks, non-empty, cues match the actual
|
||||
session beats.
|
||||
- [ ] Transcript committed under `docs/evidence/` and referenced from the
|
||||
manifest entry.
|
||||
- [ ] `web/lib/media-manifest.ts`: set `status: "published"` and fill `poster`,
|
||||
`video` (with measured `durationSeconds`), `captions`, `gifFallback`,
|
||||
`transcript`. No other manifest change.
|
||||
- [ ] Web gates green locally:
|
||||
`npm ci && npm run prebuild && npm run check:facts && npm run check:docs && npm test && npm run lint && npm run build`
|
||||
(the media-manifest test checks file presence/bytes and PNG poster
|
||||
dimensions; verify actual video dimensions/duration here with media
|
||||
inspection before changing the manifest status).
|
||||
- [ ] README GIF swap (same recording) is a **separate** commit updating
|
||||
`docs/public-surface-facts.json` provenance — not part of this flip.
|
||||
- [ ] **No deploy.** `app.codewhale.net`/codewhale.net deployment stays
|
||||
manual-dispatch and Hunter-gated per the release ledger.
|
||||
|
||||
## Sign-off
|
||||
|
||||
Recording, checklist, and manifest flip are maintainer-verified (Hunter)
|
||||
before the entry ships. The pending state on the site is correct until then.
|
||||
@@ -1,188 +0,0 @@
|
||||
# v0.9.2 terminal / key / modal acceptance matrix (#3758)
|
||||
|
||||
Status vocabulary, used literally:
|
||||
|
||||
- **PASS** — an automated cell exists, and this document names the test that
|
||||
covers it. It does **not** claim the test was run in this session; see
|
||||
"How to run" below.
|
||||
- **UNRUN** — no automated coverage. Every `UNRUN` row is a literal physical
|
||||
observation in a real terminal emulator or over a real SSH link, which a
|
||||
pseudo-terminal reproduces the byte protocol of but not the emulator.
|
||||
|
||||
Nothing in this document asserts a test result. It records which cells have
|
||||
automated acceptance and which remain human work.
|
||||
|
||||
## What is automated, and where
|
||||
|
||||
| Test target | File |
|
||||
| --- | --- |
|
||||
| Provider-free terminal/key/modal matrix | `crates/tui/tests/terminal_matrix_qa.rs` |
|
||||
| Running-turn contract against a loopback mock provider | `crates/tui/tests/release_runtime_qa.rs` |
|
||||
| Shortcut-copy canonical-action audit | `crates/tui/src/tui/keybindings.rs` (unit tests) |
|
||||
| PTY harness, terminal-mode ledger, view-stack trace reader | `crates/tui/tests/support/qa_harness/` |
|
||||
|
||||
Supporting machinery added for this matrix:
|
||||
|
||||
- `support/qa_harness/modes.rs` — replays the raw PTY control stream into a
|
||||
DEC-private-mode ledger. Terminal-mode restoration is invisible on the
|
||||
rendered frame, so the control stream is the only truthful evidence.
|
||||
- `support/qa_harness/view_log.rs` — reads the product's existing
|
||||
`codewhale_tui::view_stack` trace records (push/pop, `ModalKind`, depth).
|
||||
Modal coverage asserts on those records rather than on "the frame changed",
|
||||
because a replaced modal and a closed modal render identically.
|
||||
- `Harness::transcript` / `terminal_modes` / `diagnostics` — every bounded wait
|
||||
fails with the frame **and** the mode ledger.
|
||||
|
||||
### How to run
|
||||
|
||||
```
|
||||
cargo test -p codewhale-tui --test terminal_matrix_qa --locked -- --test-threads=1
|
||||
cargo test -p codewhale-tui --test release_runtime_qa --locked -- --test-threads=1
|
||||
cargo test -p codewhale-tui --bin codewhale-tui --locked keybindings
|
||||
```
|
||||
|
||||
These are Unix-gated (`#![cfg(unix)]`); Windows ConPTY input plumbing is a
|
||||
separate audit and its rows are `UNRUN` below.
|
||||
|
||||
## Automated cells
|
||||
|
||||
### Terminal geometry
|
||||
|
||||
| Cell | Status | Covered by |
|
||||
| --- | --- | --- |
|
||||
| 80x24 classic | PASS | `size_matrix_keeps_the_composer_visible_and_inside_the_viewport` |
|
||||
| 120x40 laptop | PASS | same |
|
||||
| 60x20 narrow split | PASS | same |
|
||||
| 48x14 tiny pane | PASS | same |
|
||||
| 200x50 wide | PASS | same |
|
||||
| Live resize across all of the above, composer stays typable | PASS | same |
|
||||
| No row overflows the viewport; cursor stays in bounds | PASS | same |
|
||||
|
||||
### `TERM` / `COLORTERM` capability tiers
|
||||
|
||||
| Cell | Status | Covered by |
|
||||
| --- | --- | --- |
|
||||
| `xterm-256color` + `COLORTERM=truecolor` | PASS | `capability_matrix_honors_the_advertised_color_tier` |
|
||||
| `xterm-256color`, no truecolor claim → no 24-bit SGR emitted | PASS | same |
|
||||
| `xterm` (unknown tier) → no 24-bit SGR emitted | PASS | same |
|
||||
| `screen-256color` (tmux-style) → no 24-bit SGR emitted | PASS | same |
|
||||
| `NO_COLOR=1` present → still boots and paints | PASS | same |
|
||||
| `CODEWHALE_ASCII_SAFE=1` narrows decorative glyphs; default tier differs | PASS | `ascii_safe_tier_removes_decorative_glyphs_the_default_tier_paints` |
|
||||
|
||||
`NO_COLOR` is deliberately a boot-and-paint row only. The palette does not
|
||||
honor `NO_COLOR` today, and this matrix does not invent a contract for it.
|
||||
|
||||
### Paste and IME
|
||||
|
||||
| Cell | Status | Covered by |
|
||||
| --- | --- | --- |
|
||||
| Bracketed single line | PASS | `paste_matrix_lands_in_the_composer_without_autosubmitting` |
|
||||
| Bracketed multiline | PASS | same |
|
||||
| Bracketed with trailing newline (no auto-submit) | PASS | same |
|
||||
| Bracketed CJK / wide glyphs | PASS | same |
|
||||
| Raw (unbracketed) multiline | PASS | same |
|
||||
| Large payload (~2 KB) | PASS | same |
|
||||
| IME-style per-character commits are typing, not paste | PASS | `ime_style_commits_are_typing_and_the_following_enter_submits` |
|
||||
| Lone trailing commit + Enter still submits | PASS | same |
|
||||
| Bracketed paste over SSH stays in the composer | PASS | `qa_pty.rs::paste_bracketed_from_macos_client_into_linux_ssh_stays_in_composer` (pre-existing) |
|
||||
| Repeated Enter after a raw paste still submits | PASS | `qa_pty.rs::paste_unbracketed_then_repeated_enter_still_submits` (pre-existing) |
|
||||
|
||||
### Mouse, resize, focus
|
||||
|
||||
| Cell | Status | Covered by |
|
||||
| --- | --- | --- |
|
||||
| Click / drag / wheel never decode as composer text | PASS | `mouse_resize_and_focus_events_never_reach_the_composer_as_text` |
|
||||
| Focus lost / gained never decode as text | PASS | same |
|
||||
| `FocusGained` re-establishes focus reporting and bracketed paste | PASS | same |
|
||||
| Resize during a focus transition keeps the draft | PASS | same |
|
||||
| Wheel/click ownership on real work-surface rows | PASS | `qa_pty.rs::work_surface_real_rows_own_click_wheel_and_resize` (pre-existing) |
|
||||
|
||||
### Modals
|
||||
|
||||
| Cell | Status | Covered by |
|
||||
| --- | --- | --- |
|
||||
| Help (F1) opens and Esc closes to depth 0 | PASS | `every_provider_free_modal_opens_and_escape_returns_to_the_composer` |
|
||||
| Command palette (Ctrl+K) | PASS | same |
|
||||
| Context inspector (`/context`) | PASS | same |
|
||||
| Live transcript (`/transcript`) | PASS | same |
|
||||
| Theme picker (`/theme`) | PASS | same |
|
||||
| Skills manager (`/skills`) | PASS | same |
|
||||
| Composer is typable again after the full sweep | PASS | same |
|
||||
| Approval modal review + deny without side effect | PASS | `qa_pty.rs::approval_modal_keeps_wheel_for_review_and_denies_without_side_effect` (pre-existing) |
|
||||
| Help overlay advertises exactly the chords this matrix drives | PASS | `help_overlay_advertises_the_chords_this_matrix_drives` |
|
||||
|
||||
Modals that need a provider, a saved session, or a live Fleet to open
|
||||
deterministically (model picker, provider picker, fleet setup/roster, setup
|
||||
wizard, session picker, worktree manager) are **not** listed as PASS. They are
|
||||
not physical-terminal work either — they are follow-on automation, tracked as a
|
||||
gap rather than claimed.
|
||||
|
||||
### Running-turn contract
|
||||
|
||||
| Cell | Status | Covered by |
|
||||
| --- | --- | --- |
|
||||
| Enter queues while a turn is running | PASS | `release_runtime_qa.rs::release_queued_follow_ups_dispatch_exactly_once_and_in_order` |
|
||||
| Composer advertises `↵ queue` while busy | PASS | same |
|
||||
| Stash chords are never advertised as send/queue/steer | PASS | same, plus `help_overlay_advertises_the_chords_this_matrix_drives` |
|
||||
| Queued follow-ups dispatch exactly once, in order (no drop, no double send) | PASS | `release_queued_follow_ups_dispatch_exactly_once_and_in_order` |
|
||||
| Ctrl+Enter steers the running turn | PASS | `release_runtime_qa.rs::release_ctrl_enter_steers_running_turn` (pre-existing) |
|
||||
| Shift+Enter / Alt+Enter / Ctrl+J stay newlines during a running turn | PASS | same |
|
||||
| Empty Enter promotes the next queued follow-up | PASS | `release_runtime_qa.rs::release_empty_enter_promotes_queued_follow_up` (pre-existing) |
|
||||
| Explicit queue dispatch (`/queue send <n>`) exists as the named action | PASS | `release_empty_enter_promotes_queued_follow_up` asserts the advertised copy |
|
||||
|
||||
### Shortcut copy — one canonical action per key
|
||||
|
||||
| Cell | Status | Covered by |
|
||||
| --- | --- | --- |
|
||||
| No key advertises two actions without a context qualifier | PASS | `keybindings.rs::every_advertised_key_names_exactly_one_canonical_action` |
|
||||
| Ctrl+G / Ctrl+S documented once, as stash only | PASS | `keybindings.rs::stash_chords_advertise_stashing_and_nothing_else` |
|
||||
| Enter / Ctrl+Enter / newline chords each own one verb | PASS | `keybindings.rs::running_turn_verbs_belong_to_one_chord_each` |
|
||||
| Bare `v` never advertised; details is Alt+V | PASS | `keybindings.rs::tool_details_documents_alt_v_only_never_bare_v` (pre-existing) |
|
||||
| Alt+? never advertised; F1 / Ctrl+/ are the help paths | PASS | `keybindings.rs::help_advertises_f1_and_ctrl_slash_never_alt_question` (pre-existing) |
|
||||
|
||||
The one intentional double-listing is `Ctrl+C` / `Ctrl+C (selection)`: cancel
|
||||
versus copy, disambiguated in the advertised chord itself. The audit permits
|
||||
exactly that shape and rejects an unqualified second meaning.
|
||||
|
||||
### Terminal-mode restoration
|
||||
|
||||
| Cell | Status | Covered by |
|
||||
| --- | --- | --- |
|
||||
| Ctrl+D on an empty composer restores every mode | PASS | `terminal_modes_are_restored_on_every_exit_path` |
|
||||
| SIGINT restores every mode | PASS | same |
|
||||
| Exit from a non-256-color terminal restores every mode | PASS | same |
|
||||
| Keyboard-enhancement stack fully unwound (no `^[[>5u` residue, #1583) | PASS | same |
|
||||
| Cursor restored visible after the alternate screen | PASS | same |
|
||||
| The leak guard actually covers the modes the TUI enables | PASS | `the_leak_guard_covers_the_modes_the_tui_enables` |
|
||||
|
||||
## UNRUN — physical observation only
|
||||
|
||||
Every row here needs a human at a real terminal. A PTY delivers the same bytes,
|
||||
but it is not the emulator: it has no font stack, no GPU renderer, no
|
||||
Option-key mapping, no window manager, and no network path.
|
||||
|
||||
| Cell | Status | Why it cannot be automated here |
|
||||
| --- | --- | --- |
|
||||
| iTerm2 — rendering, colors, wide glyphs | UNRUN | Emulator-specific renderer and font shaping |
|
||||
| iTerm2 — `Cmd+V` paste, `⌥` chords, Cmd-forwarding config | UNRUN | Depends on the emulator's own key remapping |
|
||||
| macOS Terminal.app — 256-color fallback appearance | UNRUN | The visual result of the tier, not the emitted bytes |
|
||||
| macOS Terminal.app — Option-as-Meta behaviour | UNRUN | Emulator preference, not a byte protocol |
|
||||
| WezTerm — kitty keyboard protocol chords (Ctrl+Shift+A/O/T) | UNRUN | Requires the emulator's enhanced-keyboard implementation |
|
||||
| WezTerm — mouse selection and OSC 52 clipboard | UNRUN | Requires a real clipboard and window system |
|
||||
| Real SSH session — paste, latency, resize propagation | UNRUN | Needs a real network path and remote tty |
|
||||
| tmux inside a real emulator — nested capability negotiation | UNRUN | Nested terminal behaviour, not reproducible in a bare PTY |
|
||||
| Windows Terminal / ConPTY — input plumbing | UNRUN | The PTY suite is `#![cfg(unix)]`; ConPTY needs its own audit |
|
||||
| System notification banner appearance | UNRUN | macOS attributes it to the unbundled `osascript` host (#4847) |
|
||||
|
||||
Physical observations, when they are made, belong in a separate record. Do not
|
||||
fold a one-off visual observation into the PASS tables above — a flaky or
|
||||
unrepeatable observation carries different weight than a test that runs on
|
||||
every change, and merging them would make both less trustworthy.
|
||||
|
||||
## Known gaps
|
||||
|
||||
- Provider-dependent modals (model/provider/fleet/setup/session/worktree) have
|
||||
no automated open/close cell yet.
|
||||
- The matrix is Unix-only.
|
||||
- `NO_COLOR` has boot coverage, not behavioural coverage, because it is not
|
||||
currently a contract.
|
||||
@@ -1,95 +0,0 @@
|
||||
# Agent Plugins support — design
|
||||
|
||||
Date: 2026-08-06
|
||||
Branch: `codex/agent-plugins` (merges after v0.9.4 ships)
|
||||
Status: approved, not yet implemented
|
||||
|
||||
## Why
|
||||
|
||||
[Agent Plugins](https://agent-plugins.org/) v1.0.0 is a vendor-neutral standard
|
||||
for packaging agent extensions, with a steering committee of Amazon, Cursor,
|
||||
Microsoft, OpenAI, and Vercel. Compatible clients at launch: Codex, ChatGPT,
|
||||
Cursor, GitHub Copilot, Kiro, VS Code.
|
||||
|
||||
Codewhale already has every concept the standard names — skills, MCP servers,
|
||||
a plugin manifest, discovery, install, and a registry. What it does not have is
|
||||
the shared *format*, so none of that surface is reachable from the ecosystem in
|
||||
either direction. This is an interop change, not a capability change.
|
||||
|
||||
## The standard, precisely
|
||||
|
||||
`plugin.json` — required `$schema` and `name`; optional `version`,
|
||||
`description`, `author{name,email,url}`, `homepage`, `repository`, `license`,
|
||||
`keywords`. The root is `additionalProperties: false`. Client-specific data
|
||||
belongs in `extensions`, an object keyed by reverse-domain namespace.
|
||||
|
||||
`name` must match `^(?!.*(?:--|\.\.))[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$`,
|
||||
1–64 chars: lowercase, no `--`, no `..`.
|
||||
|
||||
`mcp.json` — a *separate* file, because `plugin.json`'s root is closed.
|
||||
`mcpServers` keyed by id; transports `stdio`, `streamable-http`, `sse`.
|
||||
`env` may not define `PLUGIN_ROOT` or `PLUGIN_DATA` (reserved).
|
||||
|
||||
`skills/{skill-name}/SKILL.md` — markdown with YAML frontmatter requiring
|
||||
`name` and `description`. This already matches Codewhale's skill layout.
|
||||
|
||||
## Decisions
|
||||
|
||||
**`plugin.json` becomes the native format.** `plugin.toml` drops to
|
||||
legacy-readable, the same status pre-versioned manifests already hold.
|
||||
|
||||
**Codewhale-specific fields live under `extensions["net.codewhale"]`:**
|
||||
`commands`, `agents`, `hooks`, `lsp`, `native`, `capabilities`, `when`.
|
||||
The standard reserves this namespace shape for exactly this purpose, so a
|
||||
Codewhale plugin stays spec-valid and other clients ignore what they don't
|
||||
know. `mcp_servers` moves out to `mcp.json`.
|
||||
|
||||
**Migration writes files, but only where we own them.** Loading a
|
||||
`plugin.toml` inside Codewhale's managed plugin root rewrites it to
|
||||
`plugin.json` + `mcp.json`, preserving the original as `plugin.toml.bak`.
|
||||
Outside that root — a plugin living in someone else's repository — the
|
||||
manifest stays read-only legacy and `/plugin validate` reports the migration.
|
||||
Rewriting files under another project's version control is not ours to do.
|
||||
|
||||
**Name slugification is the real migration hazard.** Existing names with
|
||||
uppercase, underscores, spaces, `--`, or `..` are invalid under the standard.
|
||||
Migration slugifies to a conforming `name` and preserves the original as the
|
||||
display name. A slugified name that collides with an existing plugin is an
|
||||
error, not a silent rename.
|
||||
|
||||
## Consume
|
||||
|
||||
Discovery prefers `plugin.json`, falls back to `plugin.toml`. Both parse into
|
||||
the existing `PluginManifest`, so nothing downstream of discovery changes.
|
||||
Unknown `extensions` namespaces are ignored — that is the standard's whole
|
||||
point — so a Cursor or Copilot plugin contributes its skills and MCP servers
|
||||
and its client-specific data is skipped.
|
||||
|
||||
## Publish
|
||||
|
||||
`/plugin export <name>` writes a spec-valid bundle: `plugin.json`,
|
||||
`mcp.json` when servers exist, and the `skills/` tree. Tests validate output
|
||||
against the published JSON Schemas so upstream drift fails CI rather than
|
||||
shipping.
|
||||
|
||||
## First plugin: Kitesurf
|
||||
|
||||
Cloudflare's Kitesurf is a CDP-compatible remote browser for agents, reached
|
||||
through `chrome-devtools-mcp` pointed at a Cloudflare websocket endpoint. It
|
||||
is therefore an `mcp.json` and nothing else — a natural first bundled Agent
|
||||
Plugin, and a live test that the format round-trips. It needs a Cloudflare
|
||||
account id and API token, so the bundle ships with those as required config
|
||||
rather than baked values.
|
||||
|
||||
## Testing
|
||||
|
||||
- round-trip: `plugin.toml` -> internal -> `plugin.json` -> internal is stable
|
||||
- schema conformance for every emitted `plugin.json` and `mcp.json`
|
||||
- name slugification, including collision-is-an-error
|
||||
- migration preserves `.bak` and refuses to write outside the managed root
|
||||
- a third-party plugin with an unknown `extensions` namespace loads cleanly
|
||||
|
||||
## Out of scope
|
||||
|
||||
Distribution, installation UX, permissions, and client-specific capabilities
|
||||
stay Codewhale's own. The standard deliberately does not define them.
|
||||
@@ -70,6 +70,7 @@
|
||||
"crates/tui/src/model_routing.rs",
|
||||
"crates/tui/src/models.rs",
|
||||
"crates/tui/src/palette/themes.rs",
|
||||
"crates/tui/src/plugins/agent_plugin.rs",
|
||||
"crates/tui/src/plugins/manifest.rs",
|
||||
"crates/tui/src/plugins/registry.rs",
|
||||
"crates/tui/src/pricing.rs",
|
||||
@@ -186,11 +187,12 @@
|
||||
"codewhale-tui:codewhale-tui"
|
||||
],
|
||||
"_todo_2026_08_06_windows_lane": "v0.9.4 Windows/no-sandbox test-lane repair: aggregate 673296 -> 673375 (+79 lines). The 12 failures blocking the ship were not Windows-only - 7 fail on any host with no OS sandbox backend (all Windows, Linux without bubblewrap), and release.yml's parity job runs the full suite on ubuntu-latest, so the tag itself would have failed. Growth is a pinned sandbox backend in the underwater test fixture plus one new test covering the unenforced rendering the fixture no longer exercises, the rooted-mention and native-separator fixes in file_mention, and their comments. No new modules; growth is in existing files. Pay down in v0.9.5.",
|
||||
"_todo_2026_08_06_unreleased": "Post-0.9.4 [Unreleased] work: aggregate 673375 -> 676325 and max module 17596 -> 17631. The bulk is Agent Plugins v1.0.0 consume/publish/slugify (a new plugins/agent_plugin.rs plus manifest/registry/export wiring, ~2.3k lines with its tests). The rest is the sub-agent billing work \u2014 the agent_spawned stream event that makes a child's model visible, the RLM block-intent scanner, memory revise/retire with journals, and the harness audit trail. main.rs takes the module bump from the stream event. No new packages or binaries. The standing note still applies: this is a ledger, not a new normal \u2014 pay it down by deletion and dedup rather than treating growth as routine.",
|
||||
"document_kind": "codewhale.source_structure_budget",
|
||||
"large_module_threshold_lines": 1000,
|
||||
"max_large_module_count": 175,
|
||||
"max_module_lines": 17596,
|
||||
"max_total_owned_rust_lines": 673375,
|
||||
"max_large_module_count": 176,
|
||||
"max_module_lines": 17631,
|
||||
"max_total_owned_rust_lines": 676325,
|
||||
"schema_version": 1,
|
||||
"workspace_packages": [
|
||||
"codewhale-agent",
|
||||
|
||||
Reference in new issue
Block a user