chore: merge release v1.4.5 to main (#1142)

* chore: bump version to 1.4.5 for hotfix

* fix(#1133): honor model_policy on the claude runtime via alias mapping

model_policy (including the anthropic-fable Claude Fable 5 preset) was
silently ignored on the default `claude` runtime: resolveModelInternal
gated the policy branch on `runtime !== 'claude'`, so agents kept
resolving from model_profile and no warning was emitted.

Wire model_policy into the claude path: map the policy-resolved model ID
back to a Claude Code agent alias (claude-fable-5 -> fable, claude-opus-4-8
-> opus, etc.). A value that is already a bare alias is returned as-is; an
ID with no Claude alias warns once to stderr and falls back to the
configured tier alias rather than emitting an unspawnable ID. Non-claude
runtimes return full IDs verbatim (unchanged) and resolveModelForTier
precedence is unchanged.

Authored against the v1.4.4 base (src/core.cts) for the 1.4.5 hotfix
line — NOT next, where this logic lives in src/model-resolver.cts; the
forward-port to next is a separate follow-up.

Closes #1133

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>

* chore: promote CHANGELOG for v1.4.5

---------

Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Tom Boucher
2026-06-12 19:18:09 -04:00
committed by GitHub
parent 820ef28785
commit cf70d8251a
9 changed files with 116 additions and 30 deletions

View File

@@ -672,6 +672,8 @@ Canonical tier mappings by provider and budget:
Look up the selected (provider, budget) row and proceed to Step E to write those values.
> **claude runtime note:** On the default `claude` runtime, policy-resolved model IDs (e.g. `claude-fable-5`) are mapped to Claude Code agent aliases (`fable`, `opus`, `sonnet`, `haiku`); an ID with no corresponding alias emits a stderr warning and falls back to the configured tier alias.
**Step D — Generic-provider path:**
Prompt the user to enter each model ID as a free-text input. An empty input means "keep