v2.13.7
Forge v2.13.7
CLI/TUI and desktop release v2.13.7; 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
- Every claude bridge on the machine stopped reporting
Not logged in · Please run /loginafter a
Forge process ran inside a bridged turn.real_claude_config_dirhonoured an inherited
CLAUDE_CONFIG_DIReven when it was Forge's own isolated mirror, soforge mcp-serve(and any
child session it spawned) rebuilt the mirror onto itself and every entry became a symlink to
itself,.credentials.jsonincluded. The inherited value is now ignored when it is the mirror,
prepare_claude_bridge_homerefuses to mirror a directory onto itself, and a first auth failure
seconds after the same provider completed a turn benches one model for five minutes instead of
excluding the provider for thirty (crates/forge-provider/src/claude_bridge_home.rs,
crates/forge-core/src/compaction_policy.rs). - Unattended sessions no longer die on failover with
rate limited: HTTP error.while 150+
models are usable. The headless presenter answers the compact-on-switch prompt with
NO_ANSWER, which the consent gate read as "No", skipping every smaller-window fallback until
the chain ran dry. A non-answer now compacts and continues (crates/forge-core/src/compaction_policy.rs). - Unattended turns run past the soft step cap instead of exiting with uncommitted work. A
headlessforge run(or--mode bypass) treatsmesh.max_stepsas a checkpoint: one warning
with the step count and the turn's cumulative tokens, then it continues to
mesh.max_steps_unattended(default 400) and ends with an ERROR naming the uncommitted work.
Attended sessions still pause. A newmesh.max_turn_input_tokensceiling (default 10M) ends a
runaway turn on every surface, and both guards latch so re-drives cannot reset the counters
(crates/forge-core/src/turn_guards.rs,crates/forge-config/src/lib.rs). - Failover hops obey the subscription pacing verdict, not just the primary pick. Two builder
sessions failed over onto a held codex model and burned 5–7M input tokens each. Held models are
now parked until every non-held candidate is exhausted, reached only as a last resort with the
rationalelast resort: pacing hold overridden, andforge meshmarks the hold per model
(crates/forge-core/src/model_request.rs,crates/forge-mesh/src/lib.rs). - A resumed follow-up turn inherits the session's routing tier. "continue" on a complex
session was classified on its own text and handed to a free trivial-tier model; the turn is now
floored at the session's most recent routing tier unless a pin or explicit effort overrides it,
withtier inherited from previous turnin the rationale (crates/forge-core/src/routing_policy.rs,
crates/forge-store/src/provenance_store.rs). - Gemini 3.x no longer rejects a transcript whose tool calls came from another model. Unsigned
functionCallparts get the documented placeholder signature, captured signatures are replayed
intact, and an HTTP 400 that names a transcript-compatibility problem classifies as a per-model
capability failure so failover continues instead of ending the turn
(vendor/genai-0.6.5/src/adapter/adapters/gemini/adapter_impl.rs,
crates/forge-provider/src/genai_provider/error_policy.rs). - The Antigravity bridge stops being killed at exactly 120 s on healthy turns.
agy -pprinted
nothing until the whole answer was ready, so the idle watchdog killed every complex turn and the
mesh walked through -high/-low/-medium for six minutes per cascade. agy now runs with
--output-format stream-jsonand a 600 s print timeout, its usage block is recorded (no more
↑0 ↓0), and a stall names the budget that fired inmodel_health
(crates/forge-provider/src/cli_provider.rs,crates/forge-provider/src/cli_provider/cli_stream.rs). - OpenCode Go burn weights account for each model's own weekly quota. The dashboard's weekly
percentage is the sum of per-model percentages against $7.50 / $15 / $30 quotas, so a dollar on
Grok 4.6 or Kimi K3 drains the pool four times faster than a dollar on Muse; the price-derived
weight is now multiplied bylargest quota / model quota(fallback table, since the usage
endpoint exposes no per-model data) andforge meshprints the quota buckets
(crates/forge-mesh/src/subscription_cost.rs). - A binary compiled alongside the test suite says so instead of reporting "no keys".
forge auth --list,forge models,forge meshandforge doctorname the active secret-store
backend and warn loudly when it is thetest-secretsin-memory store
(crates/forge-config/src/secret_store.rs).
Added
- The subscription pacing verdict is visible everywhere routing acts on it.
forge mesh, the
TUI usage overlays, the daemon usage API and the mobile usage screen show used vs allowed, the
elapsed fraction and whether models are being held (crates/forge-types/src/subscription_pacing.rs,
mobile/src/app/usage.tsx).
What's Changed
- chore(dist): update package manifests to v2.13.6 by @github-actions[bot] in #1228
- fix(store): migrate model_pricing to the cache_read_per_1k column and stop swallowing price writes by @florisvoskamp in #1229
- fix(provider): read agy's slug column, clamp its argv prompt, and fail over instead of dying on a rejected model or a failed spawn by @florisvoskamp in #1230
- feat(mesh): show the subscription pacing verdict in forge mesh, the TUI overlays, and the usage API by @florisvoskamp in #1231
- fix(core): unattended sessions compact on failover instead of dying by @florisvoskamp in #1232
- fix(provider): claude bridge home mirrored onto itself logged every bridge out by @florisvoskamp in #1234
- fix: preserve Gemini thought signatures on failover by @florisvoskamp in #1236
- fix(config): report which secret store a forge binary reads by @florisvoskamp in #1233
- fix: inherit prior routing tier on resume by @florisvoskamp in #1238
- fix(mesh): weight OpenCode Go burn by each model's weekly quota, not price alone by @florisvoskamp in #1239
- fix(agy): stream agy output so idle watchdog stops killing healthy turns by @florisvoskamp in #1237
- fix(core): unattended turns run past the step checkpoint instead of dying half-done by @florisvoskamp in #1240
- fix(core): apply the subscription pacing verdict to failover hops, not just the primary pick by @florisvoskamp in #1241
- chore: prepare v2.13.7 release by @florisvoskamp in #1243
Full Changelog: v2.13.6...v2.13.7