# Changelog v0.5.30 - 2026-06-15

### Added
- **Harmonized Playgrounds across all surfaces (fixes Playground UI mismatches).** Created a single shared `<PlaygroundChat>` React component that acts as the single source of truth for the full-screen Playground modal, the Router View's "Test Router" panel, and the Expanded Detail Row's "Mini Playground". 
- **Universal real-time response metadata.** Under every assistant reply in all three playground locations, users now see the serving model (correctly resolved, even when routed through `fcm`), total latency, generated token count, and tokens per second (TPS). The addressed model or the router's Primary pick is also displayed under every user bubble for clarity.
- **Web Router Benchmarking (`Probe all`).** Added a "Probe all" action to the Web Router Dashboard. This lets you benchmark AI Latency and TPS on all models in the active routing set concurrently inside the daemon process. A visual progress bar displays the benchmarking status, and results flow back into each row's AI Latency cell.
- **New server proxy endpoint `/api/router/probe-all`** in `web/server.js` to handle the web dashboard's probe request and safely proxy it to the daemon's `/api/global-benchmark` with an extended timeout.
- **Playground daemon-status alignment tests.** Added unit tests in `test/test.js` to ensure the `/health` and `/stats` daemon endpoints consistently report `running: true` alongside `ok: true`, preventing a mismatch where the router dashboard would report "running" but the playground would report "offline".

### Changed
- **Dynamic port and PID resolvers for dev mode (`FCM_DEV=1`).** Refined paths in `src/core/router-daemon.js`, `src/core/playground.js`, `src/core/sync-set.js`, and `web/server.js` to use dynamic functions (`getRouterPortPath()`, `getRouterPidPath()`). This ensures dev checkouts correctly detect and signal the dev daemon (`-dev` port/PID files) instead of reading stale production constants resolved at module load time.

### Fixed
- **Fixed false "router offline" alerts.** The Playground now correctly trusts the daemon status because both `/health` and `/stats` endpoints uniformly report `running: true`.
- **Restored served-model badge for routed streams.** Forwarded the daemon's custom `x-fcm-router-model` response header in stream completions through the web proxy, so the playground can display which specific provider/model actually resolved the request when calling the `fcm` auto-router.
