Skip to content

Model traits: Fast tier, update-CLI hints, signed catalog between releases (#1529) - #1551

Merged
currentbits merged 1 commit into
mainfrom
coder/model-traits-fast-tier-toggle-update-you-f6cd34
Oct 9, 2026
Merged

currentbits merged 1 commit into
mainfrom
coder/model-traits-fast-tier-toggle-update-you-f6cd34

Conversation

@currentbits

@currentbits currentbits commented Oct 9, 2026 •

Copy link
Copy Markdown
Owner

Closes #1529.

Fast tier

  • New per-thread fast flag set through threads.setFast, built the same way as setWebSearch. When the selected model supports a fast tier, the picker shows a Speed → Fast chip and the model button reads "· Fast".
  • Claude: sends --settings {"fastMode":true}, on Opus 5 and Opus 5.5 only. Tested live on 2.1.283: the init event's fast_mode_disabled_reason changes from sdk_opt_in_required to extra_usage_disabled, which means the flag is honoured and this account has no extra-usage credits for fast mode. When init reports fast_mode_state: off, the thread gets one notice with the reason.
  • Codex: sends -c service_tier=priority on exec, app-server and workflow phases. Which models get the chip comes from the per-model service_tiers in ~/.codex/models_cache.json.

"Update to use "

  • ModelInfo.minCli (GPT-6.1-Sol is 0.159.0) is compared with the cache's client_version. If Codex is too old, the picker row is disabled with "Update Codex to use GPT-6.1-Sol".
  • Claude: when the CLI replies model_not_found for a model in Solenta's catalog, the thread gets "Update Claude Code to use " instead of the generic error.

Catalog updates between releases

  • electron/remoteCatalog.js: on launch, applies a cached copy only if its Ed25519 signature checks out, then fetches the catalog release in the background (10s timeout, never blocks startup). It applies only when the revision is above both the bundled CATALOG_REV and anything applied earlier. Only data fields are copied, and a provider with malformed data keeps its bundled catalog.
  • scripts/catalog-publish.js and .github/workflows/catalog.yml sign the catalog on pushes to main and upload it to a fixed, non-prerelease release created with --latest=false, so the updater never sees it. The script refuses a key that doesn't match the embedded public key, and refuses changed data published under an unbumped CATALOG_REV.

Review fixes

  • fast joins the warm Claude process reuse key, so toggling Fast respawns the CLI instead of riding (or staying stuck in) the old --settings. A regression test fails without the fix.
  • Codex modelSupportsFast reads the live models_cache, the same source as the picker. A hidden toggle can't bill priority, and a model that only the cache marks as fast really sends it.
  • Rebuilt on origin/main. The earlier diff included other threads' unpushed local merges; they're gone now.
  • CATALOG_SIGNING_KEY secret is set.

Tests

  • npm run typecheck clean, vite build OK.
  • test:electron 4446/4446 on the rebased branch.
  • New: electron/test/fast-tier.test.js, electron/test/remote-catalog.test.js, plus Composer and modelPicker cases.
  • Checked the picker visually in the dev renderer.

🤖 Generated with Claude Code

@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-09T13:40:37.603832Z 2ddca95 PR opened
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2ddca951a7

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread electron/runner.js Outdated
model: thread.model || null,
reasoningEffort: thread.reasoningEffort || null,
webSearch: thread.webSearch === true,
fast: thread.fast === true,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Include Fast in the Claude reuse key

When a warm Claude process exists and the user changes the Fast toggle, this new argument is calculated but the reuse key at electron/runner.js:4917-4933 does not include thread.fast. The unchanged key causes the runner to call handle.send() on the existing process, so the new --settings {"fastMode":true} value is never applied; conversely, disabling Fast can leave the higher-usage mode active until the process is reaped. Include the Fast setting in the reuse key so changing it forces a respawn.

Useful? React with 👍 / 👎.

Comment on lines +361 to +362
if (fastIds.has(m.id)) m.fast = true;
else delete m.fast;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Apply live Codex traits to the runner's catalog

These live-cache mutations affect only the cloned ProviderInfo rows returned by listProviders; the runner later calls modelSupportsFast() on the unchanged global providerEntry. If Codex adds the priority tier to a model that the bundled snapshot did not mark, the picker exposes Fast but every run silently omits service_tier=priority; if a tier is removed, a persisted Fast preference can still send it. The live trait source needs to be shared with argument construction rather than applied only to the renderer copy.

Useful? React with 👍 / 👎.

…eases (#1529)

Fast toggle per thread (Claude --settings fastMode, Codex service_tier=priority)
gated by model; Codex follows the live models_cache for both picker and argv.
Fast joins the warm Claude reuse key. Update hints from minCli/client_version
and Claude model_not_found. Ed25519-signed catalog fetched from the fixed
catalog release, applied only above the bundled CATALOG_REV.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@currentbits
currentbits force-pushed the coder/model-traits-fast-tier-toggle-update-you-f6cd34 branch from 2ddca95 to 55b285f Compare October 9, 2026 13:44
@currentbits
currentbits merged commit b0d2b44 into main Oct 9, 2026
11 of 12 checks passed
currentbits pushed a commit that referenced this pull request Oct 9, 2026
… fast trait

Opus 5.5 and Opus 5 keep fast: true from #1551; the rest of the
Claude modelInfo is this PR's lineup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
currentbits added a commit that referenced this pull request Oct 9, 2026
…ope table (#1553)

#1545 added a coverage test that every IPC handler is classified exactly
once; #1542 (answerSecret) and #1551 (setFast) landed alongside it
unclassified, so main's electron suite fails. setFast is steer like
setReasoningEffort; answerSecret puts a value into the agent's run env,
so it stays full-only.

Co-authored-by: Willem <willem@willems-mbp.home>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
currentbits pushed a commit that referenced this pull request Oct 19, 2026
…ope table

#1545 added a coverage test that every IPC handler is classified exactly
once; #1542 (answerSecret) and #1551 (setFast) landed alongside it
unclassified, so main's electron suite fails. setFast is steer like
setReasoningEffort; answerSecret puts a value into the agent's run env,
so it stays full-only.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
currentbits pushed a commit that referenced this pull request Oct 19, 2026
#1545 added the scope table while #1551 (setFast) and #1542
(answerSecret) added channels in parallel, so main's scope-table test
fails. setFast is steer, like setReasoningEffort. answerSecret is full:
a device has no need to plant a secret in a run's env.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
currentbits pushed a commit that referenced this pull request Oct 19, 2026
…t/answerSecret web scopes

#1435: bill a warm Claude process's cost growth, not its running total.
#1436: worker-finished notice tells the orchestrator not to poll thread_status;
saved notices with the old footer still fold.
#1439: build devCoder on first use so importers don't stay alive ~4s.
webScopes: threads:setFast (steer) and threads:answerSecret (full) were
unclassified after #1545 landed alongside #1551 and #1542, failing main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
currentbits pushed a commit that referenced this pull request Oct 19, 2026
… fast trait

Opus 5.5 and Opus 5 keep fast: true from #1551; the rest of the
Claude modelInfo is this PR's lineup.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Model traits: Fast tier toggle, "update your CLI to get model X", catalog updates between releases

1 participant