Fixed
- Router now respects your priority order (fixes #120, reported by @jammin1911). Previously, priority was only 20% of the routing score, so a healthy low-priority model (e.g. GPT-OSS 120B) could serve traffic even when higher-priority models you deliberately ranked above it were also healthy. Routing is now strict priority-first:
#1is always tried first while it is healthy, and the health score is only used as a tiebreaker between models that share the same priority (e.g. cold-start ties). Circuit-breaker safety is preserved — closed (healthy) models always come before half-open (recovering) ones. Your fallback chain is now authoritative. - Daemon startup errors are now surfaced instead of swallowed. The TUI captures
--daemon-bgstdout/stderr and shows the real failure reason (port in use, config corruption, etc.) as a dashboard notice, instead of silently flipping back to "stopped". - Dev checkouts no longer clash with production installs. A git checkout now auto-enables dev mode (
FCM_DEV=1) so its router daemon uses dev ports/files (29280,-devsuffixed PID/port/log files) and never collides with a globally-installedfree-coding-modelsrunning on the same machine. Dynamic path resolvers pick upFCM_DEVchanges that happen after module load.
Added
routingOrderfield in/stats— exposes the exact attempt order the daemon will use for the next request (priority-first among healthy models).routingOrder[0]is the model that will serve the next chat completion. Dashboards use it to show which model is active.- Clearer priority indicators in the Router UI (all surfaces) so users understand the fallback chain at a glance:
- Web Dashboard: the active-set list now labels
#1as a highlighted Primary badge (accent-colored) and the rest as numbered fallbacks. A one-line legend explains "Primary tries first → Fallback on failure / rate-limit". The model that will serve the next request gets a green accent border + tint (Next up badge in the legend). Tooltips on every badge explain the semantics. - TUI Dashboard: a
▶ NEXTmarker (green) is drawn on the exact model the daemon will route to next, so the top of your fallback chain is obvious. Empty-state copy now explains "Favorites become your router fallback chain — #1 is tried first."
- Web Dashboard: the active-set list now labels
- Always-visible Quick Setup card on the Router dashboard (Web + TUI) with sensible defaults (
localhost:19280/v1, modelfcm, keyfcm-local), so you can copy your tool config even before starting the daemon. The Web version adds a one-click Copy all button and a hero glow when running. - Better empty states across the Web Router view: the active-set list and request log now show helpful guidance ("No models in the active set → Add models or Sync best", "No requests yet. Start coding to see traffic here.") instead of disappearing.
- Auto-expanding request log — the Web request log expands automatically the first time traffic appears, so you don't have to click to see your routed requests.
- More prominent Start button — the stopped-state "Start Router" CTA is now larger and easier to hit.
Changed
- Router candidate sorting changed from
score DESC, priority ASCtopriority ASC, score DESC— the user's explicit ranking now wins. Thescoringweights config is retained (still used for the health table and same-tier tiebreaks), so existing user configs and config normalization are unaffected.