v2.13.6
Forge v2.13.6
CLI/TUI and desktop release v2.13.6; mobile remains on its compatible native version.
- CLI / TUI — binaries below (
*.tar.gz/*.zip) orbrew upgrade forge - Desktop (macOS · Windows · Linux) — app bundles below + in-app auto-update
- Mobile (iOS) — production OTA by default; native/TestFlight builds are manual when required
Fixed
-
OpenCode Go's top-ranked models now reach the endpoint they actually implement instead of
failing or spending 6m47s in “recovering provider”. The service exposes three incompatible
wire formats without identifying them in/models:gpt-5.6-luna,grok-4.5,
grok-4.6, andmuse-spark-1.2-contributorreject Chat Completions immediately and answer
only on Responses, while the other Go models do the reverse. Forge now seeds that measured
matrix, learns an unknown model's endpoint only after its characteristic rejection and a
successful one-shot Responses retry, and omits unsupported temperature parameters by model
family. Two identical errors returned within two seconds are treated as a rejection, so a pinned
model surfaces the real error immediately instead of consuming the 600-second outage budget;
live turn-loop checks answered on Muse, Luna, Grok, and GLM in 7–12 seconds
(vendor/genai-0.6.5/src/adapter/adapters/opencode_go/adapter_impl.rs,
crates/forge-provider/src/genai_provider.rs,crates/forge-core/src/model_request.rs). -
Claude CLI tool and filesystem errors no longer disable a valid login for 30 minutes. A
workingclaude-cli::opus[1m]was stored asexcluded: auth failed: auth failedbecause the
permanent-auth phrase list accepted generic “permission denied” and “credentials” text emitted
by tool gates, OS errors, and keychain notices. Only text that identifies the login can now earn
that provider-wide verdict, and the stored health row retains up to 240 characters of the CLI's
actual evidence instead of repeating the classification. Discovery also unions Claude 2.1.257's
initialize picker with its documented aliases, so Fable is available even though initialize
advertises only Opus, Sonnet, and Haiku (crates/forge-provider/src/cli_provider.rs,
crates/forge-provider/src/cli_provider/error_policy.rs,
crates/forge-core/src/compaction_policy.rs). -
Reinstalling the daemon service now applies the new binary instead of merely rewriting the
unit.systemctl --user enable --nowis a no-op for an already-active unit, so the rendered
ExecStartcould point at the release while the old process kept serving; in the observed
failure this ended in a203/EXECservice outage. Active systemd units are explicitly restarted,
loaded launchd agents are reloaded, and active Windows scheduled tasks are ended and re-run.
Install and status inspect the live process before and after activation, report its executable
and version, and fail honestly when the replacement cannot be established
(crates/forge-cli/src/cli/commands/service.rs,
crates/forge-cli/src/cli/commands/service_report.rs). -
forge doctorreports the daemon's version, not the version of the doctor binary printing the
report. A unit stamped 2.12.2 with a daemon actually running 2.13.5 was reported as “running
2.13.2” because 2.13.2 happened to be the separately installed CLI invoking doctor. Version
evidence now comes from the live daemon's authenticated/api/identity, then the unit's
ExecStart --version, otherwise an explicit unknown; the report labels the unit stamp, daemon
binary, and current CLI separately so upgraded-on-disk-but-not-restarted processes are visible
(crates/forge-cli/src/doctor.rs,crates/forge-cli/src/doctor_daemon.rs).
Added
-
Routing prices now follow current model economics instead of stale hardcoded burn weights.
OpenRouter has no GPT-5.6 rows, leaving Codex decisions at$0, while the fallback
Sol/Terra/Luna ladder of 5/2.5/1 predated current $4/$20, $2/$12, and $0.20/$1.20 per-million-token
prices—roughly 17.5× and 10× Luna for Sol and Terra. Forge fetches models.dev beside OpenRouter,
maps its prices onto native and CLI-bridge namespaces, preserves bundled rates on fetch failure,
and resolves override → fetched/bundled price → table. A nonzero subscription floor prevents a
heavier sibling winning on a marginal score at zero pressure; that old behavior burned 64% of a
fresh $12/5h OpenCode Go pool in two hours on Kimi K3 over a 0.14-point advantage
(crates/forge-cli/src/context_windows.rs,crates/forge-mesh/src/pricing.rs,
crates/forge-mesh/src/subscription_cost.rs,docs/features/mesh-routing.md). -
Subscription routing accounts for the size of the pool and the share consumed by one request.
At OpenCode Go 28% and Codex 25%, the former's Kimi K3 scored 3.27 over Codex OAuth's Sol at
2.96 even though one Kimi request consumed about 1% of its $12/5h pool and Sol used a fraction of
a much larger plan. Providers now carry an explicit capacity class—OpenCode Go is Tiny; captured
CLI plan slugs map 20x to Large, max/pro to Medium, plus/team to Small, and an unset plan remains
Unknown—and ranking applies request share times model burn times scarcity, with scarcity capped
at 3×. Equal models therefore prefer the larger, fuller pool without guessing an unknown plan
(crates/forge-mesh/src/catalog.rs,crates/forge-mesh/src/subscription_cost.rs).
What's Changed
- chore(dist): update package manifests to v2.13.5 by @github-actions[bot] in #1220
- feat(mesh): track OpenCode Go usage windows by @florisvoskamp in #1219
- fix: report actual daemon version in doctor by @florisvoskamp in #1221
- fix: restart daemon when reinstalling service by @florisvoskamp in #1222
- feat(mesh): fetch model prices from models.dev and let prices outrank the burn-weight table by @florisvoskamp in #1223
- fix(provider): route OpenCode Go per model, learn endpoints, and stop waiting out rejections by @florisvoskamp in #1224
- fix(provider): stop benching claude-cli as 'auth failed' on non-login text, record the evidence, and list Fable by @florisvoskamp in #1225
- feat(mesh): weigh a request by its share of the subscription pool by @florisvoskamp in #1226
- chore: prepare v2.13.6 release by @florisvoskamp in #1227
Full Changelog: v2.13.5...v2.13.6