v0.9.2 release candidate integration (umbrella, draft) - #4911
Conversation
Represent provider wire selection as either fixed or model-aware. Resolve model-aware protocols from catalog endpoint keys and fail closed when an endpoint does not prove a supported request shape.\n\nExisting providers remain fixed-policy routes, so this creates the Zen routing seam without changing current provider behavior. Signed-off-by: snailoniu <snailoniu@gmail.com>
Register OpenCode Zen across config, CLI, secrets, and TUI surfaces with provider-scoped API key guidance. Keep its wire policy model-aware and fail closed until a catalog offering proves the selected model protocol. Signed-off-by: snailoniu <snailoniu@gmail.com>
Route the documented Zen catalog across Responses, Anthropic Messages, and Chat Completions by model. Normalize the official opencode/model selector and reject Gemini or unknown models until their request protocol is supported and proven. Signed-off-by: snailoniu <snailoniu@gmail.com>
Bind clients to the resolver-proven request protocol and send Zen models through Responses, Anthropic Messages, or Chat Completions as appropriate. Keep Zen on bearer authentication, exclude Codex OAuth headers, and fail closed when a request changes protocol or uses an unproven FIM route. Signed-off-by: snailoniu <snailoniu@gmail.com>
Document Zen as a separate API-key provider with model-scoped Responses, Messages, and Chat Completions groups. Record the unsupported Gemini boundary and teach the provider registry drift check about the manual model-aware provider implementation. Signed-off-by: snailoniu <snailoniu@gmail.com>
OpenCode Zen routes Anthropic models through the Messages API, which expects the native x-api-key header. Sending Zen keys as Authorization bearer tokens produced upstream 401 Missing API key errors for Claude models. Refresh the request-shape test to lock the Zen Messages auth dialect while keeping bearer auth for Zen Responses and Chat Completions routes. Signed-off-by: snailoniu <snailoniu@gmail.com>
The model-aware route guard now reports that the Anthropic-compatible route has no proven FIM wire contract. Keep the local-failure test aligned with that fail-closed behavior and continue asserting that no HTTP request is made. Signed-off-by: snailoniu <snailoniu@gmail.com>
Align the rebased provider with current route candidate accessors, offering capabilities, registry counts, and Responses URL construction. Rename custom-provider test fixtures now that opencode_zen is a built-in identity, and remove the superseded protocol helper. Signed-off-by: snailoniu <snailoniu@gmail.com>
Route the opt-in resource-admission test skip notice through tracing so the all-targets Clippy gate respects the TUI module's print_stderr deny policy. Signed-off-by: snailoniu <snailoniu@gmail.com>
State explicitly that Zen Responses and Chat Completions use Bearer authorization while Anthropic Messages uses x-api-key, matching the request-shape implementation and detailed protocol section. Signed-off-by: snailoniu <snailoniu@gmail.com>
Align the workflow trigger with the fail-closed deploy preflight so normal pushes and pull requests run validation without creating an impossible deploy job. Pin manual deploys to the dispatched SHA and cover the workflow contract with tests.
Give every direct, nested, sibling, and background worker its own todo list so child updates cannot overwrite the supervisor checklist or parent work graph. Preserve parent progress as immutable fork context and cover the isolation boundaries with focused tests.
Three follow-ups from automated review on #4899. The real bug: mention_menu_limit = 0 is a documented way to disable the mention popup, but the @git/@diff tokens were seeded into the entry list before the limit applied, so typing @g with the popup disabled still surfaced a one-entry menu. The tokens are menu entries like any other and now respect the same cap. Efficiency: one submit resolved each git mention twice — once building the context-inspector references and once building the model-facing payload. For @diff that made git compute the entire working-tree diff twice, before the 32 KB budget applies, to attach it once. Both passes now share a GitMentionCache scoped to a single submit, so a later message always re-shells out and can never show a stale working tree. Reuse: ExternalTool::available() already expressed the git-on-PATH check without constructing a throwaway Command; this is its first real caller, so its allow(dead_code) is gone too. Receipts: file-mention and git-mention suites 28/28, including a zero-limit regression and a test asserting one submit resolves @diff exactly once; codewhale-tui 8344/8344; CI's exact clippy invocation, fmt, and diff clean. Refs #4067.
Only the test build fails on it: CI runs with -D warnings, which promotes unused_attributes to an error, and the duplicate sat on a cfg(test) item so an ordinary build never saw it. Verified with the exact CI shape: RUSTFLAGS="-D warnings" cargo test -p codewhale-tui --bin codewhale-tui --locked --no-run.
Give each composer chord one stable role: Enter sends or queues, Ctrl+Enter steers, newline chords always add a line, Ctrl+G/Ctrl+S only stash, and Tab never submits text. Empty Enter now promotes the oldest queued follow-up explicitly. Keep modified Enter chords out of paste-burst suppression, align hints/help/locales/docs, and cover the contract with unit and PTY runtime regressions.
Take the shared environment lock and clear DeepSeek runtime overrides before resolving the Zen route so sibling provider tests cannot leak CODEWHALE_PROVIDER into this assertion. Completes the focused review fix for contributor PR #4467 without changing its implementation.
Stop guessed trailing-newline handling from re-arming the paste window indefinitely, and distinguish a lone IME commit from a paste-speed CJK run. Preserve raw multiline and laggy-link protection while ensuring subsequent human Enter submits. Cover ASCII paste, CJK IME, and repeated-Enter behavior with unit and real PTY regressions.
Pin the v0.9.2 composer contract: bare Enter queues during any running turn, while Ctrl/Cmd+Enter is the explicit same-turn steer gesture. The previous test still asserted the superseded waiting-state behavior.
Render one bounded authoritative work-state tail for parent turns and sub-agent steps, keep it out of stable history and compaction prefixes, and make fork and relay handoffs consume the same graph-backed snapshot.\n\nAdd regressions for staged graph state, context accounting, per-agent isolation, compaction rehydration, and same-turn relay behavior. Document the exact request boundaries without overstating auxiliary model calls.
Serialize the model-aware provider test with other environment-mutating config tests and clear runtime provider overrides so parallel runs cannot leak a sibling test's provider selection. Signed-off-by: snailoniu <snailoniu@gmail.com>
Mint an immutable non-secret route authority from the installed client at turn start and require exact provider, model, endpoint, and key generation continuity before launching a DeepSeek prompt suggestion. Injected clients and configured path overrides fail closed, and all debug/display surfaces redact route and credential material.
Route interactive mode, reasoning, model, and permission changes through one busy-turn lock and a cross-process settings transaction. Atomic no-clobber migration, startup-write shutdown draining, localized failure receipts, and same-live selection outcomes keep the next launch truthful without blocking the TUI event loop.
Keep the public provider facts and source-candidate count aligned with the new ApiProvider variant so the hosted web gate remains truthful. Verified: npm run check:facts; npm run check:docs; npm test (137/137); npm run lint; npm run build.
Keep the canonical idle-composer wording contiguous so the public-surface contract can verify it without weakening the assertion. Verified: web check:facts, check:docs, 143/143 tests, lint, and production build.
Publish bounded, agent-addressed WorkState snapshots after real child todo changes and project only matching snapshots onto delegate cards. Keep private ledgers out of transcripts and fanout aggregation while preserving the last truthful snapshot on terminal cards. Verified: cargo check -p codewhale-tui --locked; focused work-grounding, agent-card, routing, mailbox, and child-work-state filters 89/89; independent static re-review PASS.
Record the live candidate identity, exact CI commands, approval rails, issue dispositions, product decisions, integrated receipts, and unresolved release blockers in one maintained source of truth.
Remove an explicit dereference rejected by Rust 1.97 clippy while preserving the leaked per-path mutex reference used by serialized settings writes. Verified: settings filter 114/114 (1 child helper ignored); exact codewhale-tui clippy warning policy PASS.
Group configuration rows by their actual scope, identify the saved DeepSeek fallback as a legacy off-route setting, and keep Fleet, Workflow, Lane, Runtime, and future Operation vocabulary distinct across shipped locales and docs. Closes #4751
Update candidate install copy and contributor credits, keep changelog comparisons truthful before the tag exists, and permit an honestly versioned screenshot to lag the source candidate.
Assemble credential-shaped redaction fixtures at runtime so the tests preserve their adversarial coverage without publishing literals that secret scanners classify as live material.
Refresh the living v0.9.2 ledger with the bumped candidate identity, three focused repair commits, and the exact local verification evidence that precedes the hosted rerun.
|
Bugbot is not enabled for your account, so this pull request was not reviewed. Enable Bugbot in the Cursor dashboard to get automatic reviews on future PRs. |
Claude Code is reviewing this PR
|
Guard nullable screenshot metadata explicitly and compare it with the non-null source-candidate version so the hosted TypeScript check agrees with the runtime public-surface contract.
|
Claude finished @Hmbown's task in 3m 59s —— View job Claude Code is reviewing this PR
|
Serialize the unknown-mode regression with the shared environment lock and remove ambient MINIMAX_API_KEY so suite order cannot turn an unproven route into a metered or token-plan route.
Advance the living candidate identity and replace the prior flake disposition with the isolated 9,299-test pass plus the hosted TypeScript follow-up evidence.
|
Claude finished @Hmbown's task in 2m 12s —— View job Claude Code is reviewing this PR
|
Add an explicit child-start handshake before the parent's atomic-write loop so slower Windows process startup cannot produce a zero-read, non-proving result.
Advance the v0.9.2 candidate ledger to the settings-test repair and record five consecutive strict targeted passes before the definitive hosted run.
|
Claude finished @Hmbown's task in 5m 35s —— View job Claude Code review — v0.9.2 integration candidateTodo list
EPIC #2608 (provider/model-prefix invariant): no violations foundChecked route resolution, the lane control plane, TUI client/chat/prepared/responses plumbing, and Lane/Fleet control commands. Provider selection consistently comes from Findings (posted inline, most important first)
Additional minor items not inline (lower priority, no action required):
What's genuinely well done
No blocking correctness bugs or EPIC #2608 violations found. This PR is explicitly marked "Do not merge" (umbrella review/CI surface per the description), so the above should feed narrower harvest PRs rather than block this draft. |
Let missing records retain their typed I/O cause, map only true absence to NotFound, and surface corrupt or unreadable records as retryable backend failures with focused coverage.
Drop the byte-identical unreachable require_catalog_match branch left by integration; the surviving guard remains the sole fail-closed protocol proof.
Build the bundled OpenCode Zen route resolver once per process instead of reparsing and rebuilding its offerings on every request, while retaining per-request protocol validation.
Correct the endpoint fingerprint contract after the catalog cache moved away from FNV.
Advance the candidate ledger through all four final-head Claude findings and record the Lane, Zen routing, protocol, clippy, format, and diff receipts.
|
Claude finished @Hmbown's task in 1m 55s —— View job Claude Code review — v0.9.2 integration candidate (re-review after push)Todo list
All four previously flagged findings are resolvedI diffed
The final commit ( No new issues found in this delta, and EPIC #2608 provider/route-safety invariants are unaffected by these commits (none of them touch provider-selection logic). Note: This PR remains marked "Do not merge" (umbrella review/CI surface). Nothing here blocks continued integration. |

Summary
Umbrella draft PR for the v0.9.2 release candidate (
codex/v092-integration-direct-main, currently 82 commits ahead of main). Opened to put hosted CI and code review on the combined candidate while integration continues; focused harvest PRs will target this branch for narrow review.Living disposition:
docs/releases/v0.9.2-completion-ledger.mdon this branch.Do not merge — landing on protected main remains maintainer-gated. This PR is a review/CI surface, not a landing request.
No-Issue: umbrella integration candidate; per-issue closure happens with per-issue receipts on the final release SHA, not via this PR's merge.
🤖 Generated with Claude Code