# Changelog Semantic versioning for the launcher CLI (`sm121`). The add-on image has its own version and its own `sm121/CHANGELOG.md`; do not mix them. ## 0.2.2 — 2026-10-28 - **Dashboard bench window.** The recipes panel's `⚡ bench` button now opens a bench window instead of firing the standard run blindly: choose recipe, cluster, target node (`node`), run host (`ssh_host`, e.g. `pluto.lan`), label, seed, concurrency, parallel, timeout, tokenizer, perf-only, depth and no-think. The choices persist in `localStorage` (`sm121-bench-params`). - **Live harness log.** `GET /api/bench/log?recipe=…` tail-reads the newest bench log for the recipe; the window polls it while the run starts so early failures (readiness, tokenizer, harness) are visible before a long wait. - **Cancel.** `POST /api/bench/cancel` sets the job's cancellation flag; `run_tool` polls it and kills the `tool-eval-bench` child (also the SSH child for remote runs), so the job finishes failed and the log stops. - **Reopen.** The bench window is a named window: closing it leaves a dock chip, the dock menu has `bench…`, and the last recipe/job is restored on reload. - Bench API now accepts `node`, `seed`, `concurrency`, `parallel`, `timeout`, `tokenizer`, `no_think`; the report row's bench button posts to the parent dashboard and opens the window. ## 0.2.1 — 2026-10-28 - **FLARE cluster identification.** A cluster is only paired with an orbit if the private config names it (`[flare.clusters.]`). The flat `orbit_cluster` is a fallback for `serve`, not for the dashboard/`health`: our clusters share nodes (`dgx1` is rank 0 of prod4, 6nodes-switch, 2nodes-dac, qwen38 and 1node-1), so probing an unpaired cluster with `sparks` made the sparks lane look like that cluster's lane. `serve` now refuses an unpaired FLARE cluster instead of silently launching onto the flat default. - **Dashboard shows the orbit.** Each cluster head carries a `◆ prod4` badge (orbit + controller + live groups; dimmed when nothing runs), and the topology frame/chip labels include the orbit. `health` folds only the selected cluster's lane, not every lane that shares its controller. - **Prepared-package identification.** After a successful mirror the controller writes `.sm121-flare-package.json` (repo, revision, TP, package version, local `model.safetensors`). A serve with a matching marker — checked against the CURRENT `flare models list --json` version, so a lab re-cut under the same revision is detected — skips both `flare download` verification and the 500 GB copy. - **Incremental mirror with `rsync`.** The local mirror uses `rsync -a --delete` (marker excluded), so a changed/stale package copies only the changed files; a partial mirror resumes instead of being wiped and re-copied. Download/mirror/orbit launch all use long-running SSH (the 5 s inactivity timeout used to kill a 500 GB copy or a detached launch). - **Settings editor.** `POST /api/settings/extra/check` validates without writing; parse errors report line/column for the textarea; `Ctrl+Enter` saves. The private block stays in `/data/config-extra.toml`, edited in the dashboard's settings window. ## 0.2.0 — 2026-10-28 - FLARE: cached `flare download` now resolves the prepared package through `flare models list --json` instead of failing on the metadata-only "Resolved package" line. - FLARE: `flare download` gets `--tensor-parallel` from the recipe's launch size; a TP4 package is no longer rejected as "TP size 1". - FLARE: local mirror copies the package directory recursively, including `weights/` and `deployments/` companions; it clears the destination first and runs over a long-lived SSH session (read-only package files and a 500 GB copy must not be killed by the 5 s inactivity timeout). - FLARE: `flare download` and `flare orbit run` also use long-running SSH, so a cached-package verification or a detached launch is not cut short. - FLARE ledger: `serve` records the recipe **directory** name, not the display `name` field — the old `recipe.name` lookup failed with `recipe dir not found for 'DeepSeek-V4.1-Flash-1017 (…) '`. - FLARE `gb10`: production recipe updated to the 2026-10-27 package (`c32`, 1 GiB row cache, resident scales, `--served-model-name`). - Tooling: `sm121` installed with `cargo install --path . --force`; version now follows `Cargo.toml`, not a hard-coded 0.1.0.