v2.12.0
Forge v2.12.0
CLI/TUI and desktop release v2.12.0; 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
Added
-
Forge has a logo. Every icon the product shipped was the stock Expo placeholder — the blue "A"
on the iOS app icon, the Android adaptive icon, the desktop bundles, the PWA manifest and the
favicon, and the grid-and-circles placeholder on both splash screens, which is the "stock Expo
flash" visible on every cold start. The only real mark lived indocs/and no app target used it.
The new mark is a pair of tongs closing on a billet at welding heat; reduced to its silhouette it
also reads as< >, so it means smithing and code at once. Symmetric, flat single colour, and it
holds its shape down to 16px. -
One vector source for every icon.
scripts/brand/forge-mark.svgis now the only place the mark
is drawn, andscripts/gen-brand-assets.pyrenders all 25 shipped assets from it: iOS app icon,
Android foreground/background/monochrome, both splash marks plus the six committed native splash
images, the web manifest icons, two favicons, a multi-size.icoand a.icns(written directly,
sinceiconutilis macOS-only). There was previously no vector source anywhere and each target
carried its own hand-placed PNG, so changing the logo meant finding them all and missing some.
scripts/gen-splash-light-variant.pyis superseded and removed. -
The web root now serves a real
favicon.ico. Browsers request/favicon.icounprompted and there
was nothing there. -
Reproducible, history-safe benchmark cells for Codex, Claude, and full-mesh routing. The
harnesses now recreate exact source trees, gate model/effort/CLI identity, include child-session
usage, preserve superseded attempts, and publish official-evaluator plus quota/integrity evidence.
The matched July samples retain the important caveat: they are evidence for those tasks, models,
hosts, and dates, not population-wide performance estimates.
Changed
- Single coding tasks stay direct and recursive delegation is opt-in. Completeness, named-API,
and migration guidance is stronger without paying for redundant orchestration or repeated audits;
failed environment setup is bounded and child-session cost is included in benchmark accounting. - Claude's persistent bridge is stricter and more resilient. Authoritative model discovery,
bounded tool aliases, MCP readiness, partial-message deduplication, safe no-replay behavior, and a
bounded extra idle window for known long-running tools make subscription-backed Claude sessions
less prone to stalls, duplicate activity, or silent capability drift. - Long mesh sessions retain quality with less repeated context. Complex task-defining turns get
a usable quality anchor, continuations keep controlled diversification, verified session/model/
account boundaries can reuse provider prefixes and Codex response chains, completed tool logs are
pruned, and task-list bookkeeping no longer consumes an independent model round trip. - Runtime ownership is split behind narrower internal boundaries. Core, Mesh, Store, CLI, TUI,
Tools, Config, Provider, Anywhere, and Serve now use cohesive private modules, with no
implementation owner above 5,000 lines. This is an architecture improvement, not a claim that the
longer-term file-size distribution or numerical coverage targets have been reached. - Auto-merge reconciliation now observes completed workflows instead of depending on events GitHub
can drop, while still requiring the protected aggregateCIgate for code-bearing changes.
Fixed
- Rust Analyzer can no longer create an unbounded workstation burst. Forge permits one live
analyzer tree process-wide, uses a one-worker/one-Cargo-job lightweight profile, enforces a
configurable aggregate RSS guard (2 GiB by default), reaps idle servers after 120 seconds, keeps
healthy timed-out servers warm, and rejects diagnostics for stale document versions. A real
workspace probe reduced the observed peak from 3.7 GiB/37 processes/about 14 cores to
1675.7 MiB/four processes/about one core while still finding an injected Rust type error. - Long-running sessions now handle queued steering, interruption cleanup, stale completion markers,
context fitting, cancellation rollback, stream snapshots, and provider reconnect/recovery without
advancing the wrong turn, repeating activity, or retaining detached work. - OAuth pasted callbacks preserve CSRF-state validation; explicit model pins survive reservation
pressure; context windows no longer borrow unrelated provider metadata; and usage-store failures
no longer become plausible zero values. - Serve now aborts timed-out or dropped drivers, prunes unexpectedly completed drivers, performs
bounded shutdown joins, preserves malformed MCP catalogs during mutation, rejects project-path
ambiguity and symlink escapes, serializes configuration writes, and includes stored pricing in
model projections. - Queue repository validation, gate exits and failed-task branches, Assay semantics, MCP dynamic
registration/device-flow separation, Claude import policy and error propagation, Codex alias
freshness, Gemini classification, and TypeScript protocol parity were corrected. - Tauri desktop icons are generated as RGBA PNGs, so
tauri::generate_context!accepts the shared
brand assets instead of failing release builds on RGB-only icons.
What's Changed
- Improve Forge GPT-5.6 quality and benchmark efficiency by @florisvoskamp in #917
- Surface latest GPT-5.6 benchmark in README and docs by @florisvoskamp in #918
- feat(claude): harden bridge and publish Claude 5 benchmark by @florisvoskamp in #919
- chore(dist): update package manifests to v2.11.0 by @github-actions[bot] in #916
- ci: reconcile auto-merge on workflow completion, not on events that get dropped by @florisvoskamp in #920
- ci: approve parked runs that carry no external code, instead of weakening the policy by @florisvoskamp in #921
- Benchmark Forge with history-safe pinned and mesh runs by @florisvoskamp in #922
- feat(brand): give Forge a logo, generated from one vector source by @florisvoskamp in #925
- Harden Forge for long-running mesh sessions by @florisvoskamp in #926
- Close long-session stress honest-review gaps by @florisvoskamp in #927
- Gate native stress execution identity by @florisvoskamp in #928
- fix(stress): publish matched native Claude result by @florisvoskamp in #929
- perf(mesh): add cache-aware session affinity by @florisvoskamp in #930
- refactor(mesh): extract task classification policy by @florisvoskamp in #931
- refactor: harden architecture boundaries and runtime stability by @florisvoskamp in #932
- fix(lsp): bound rust-analyzer resource usage by @florisvoskamp in #934
- chore: prepare v2.12.0 release by @florisvoskamp in #935
Full Changelog: v2.11.0...v2.12.0