Status: draft 2 (2026-10-28).
Rule: bernie stays lean and simple, and keeps what really helps users. A feature earns a place if it gets a new user from a bare machine to a working server and a connected client, or keeps results honest. One command does the job. No wizard, no new product surface.
Each item has a spec section and one test that proves it.
| # | Item | Spec | Test |
|---|---|---|---|
| 1 | Fit in recipe data. A recipe lists download_gb, vram_gib, ram_gib, kv_bytes_per_token. recipe list shows fits, tight: <reason> or no: <reason>. |
§7.2, §7.8 | recipe list --json on a fixture host: each recipe has fit.verdict; fit.reasons is non-empty unless fits. |
| 2 | Plan shrinks to fit. recipe plan lowers max-model-len (32K, 16K, 8K) until the KV budget fits free VRAM. Each change is in plan.adjustments[] with a reason. A --set value is never changed. |
§7 | recipe plan --json on a 16 GB fixture shows the adjustment; --set args.max-model-len=8192 stays 8192. |
| 4 | Ready means answers. A run is ready only after /health and a one-token completion succeed. |
§3.1, §8.3 | A run with the model unloaded stays starting and says why. |
| 5 | Log doctor on failure. When a run exits during startup, serve and up print the matched rule: id, cause, fix. |
§5.3 | A fixture log with a known error prints that rule. |
| 6 | Next command in every state. status --json has next for: no GPU, no recipe fits, recipe fits, run starting, run ready. |
§3.1 | Fixture set covers the five states. |
| # | Item | Spec | Test |
|---|---|---|---|
| 7 | Model file hashes. A result stores the hashes of the model files it measured, so a number can be tied to the exact weights. | §10 | A result of a run holds the hashes of the model files. |
| 8 | Redacted report. doctor --report writes JSON with no hostname, user name, home paths or keys, and lists what it removed. |
§5 | grep for user, host and /home/ finds nothing. |
| 9 | Smoke chat. bernie chat --run NAME "prompt" sends one prompt, prints the reply, time to first token and tok/s. It proves the server works. |
§3 | Prints reply, TTFT and tok/s for a fixture server; exits non-zero when the run is not ready. |
| 10 | connect <app>. Prints the ready-to-paste config for opencode, Open WebUI or a generic OpenAI client, using the run's port and model name. It prints only; it writes nothing. |
§3 | connect opencode output contains the run's base URL and served model name. |
-
Bench suites. A suite is data:
bench/suites/*.yamlholds the cells, the repetitions and the thresholds of a run. The loader is strict, and the digest of the suite pins the cells of a result.bernie bench suiteslists them,bernie bench --suite prruns the fixed pull request cells, and every cell keeps its group, its lens, its repetitions and the spread of its metrics. Spec §10.2. -
Repeated cells. Every cell of a suite runs several times. The numbers of the cell are the medians over the repetitions, the repetitions themselves are in the result, and the spread says how well they agree. A cell that lost a request is
incomplete: its numbers stay, but no verdict uses them. The result records the power cap and the clocks of the cards. Spec §10.2. -
Bench verdict.
bernie bench comparesays, for every metric of every cell, whether the second run is better, the same or worse. The noise band comes from the suite and from the spread of the repetitions, and an arm whose repetitions disagree gets no verdict. A failed recall or an incomplete cell makes the whole comparison invalid. Spec §10.3. -
Bench A/B run.
bernie bench abruns a baseline and a candidate in the order base, cand, cand, base, so a drift of the machine hits both arms the same way. One server runs at a time, and every visit saves its own result. Spec §10.4. -
Measurement gates. Every cell says whether its prompt was the size it asked for, whether its replies look like text and whether its stream arrived in more than one chunk. A cell that is off size or degenerate keeps its numbers, but they are labelled. The recall gate of a suite makes a comparison invalid when the server did not repeat the hidden fact. Spec §10.
-
ECC check. The doctor check
gpu.ecc.<hip index>reads the RAS counters of every card:okwhen ECC is on and the card counted no memory error,warnwhen ECC is off on a card that has it or when the card corrected errors,failwhen the card counted uncorrectable ones. The counters come from sysfs,amd-smiis the fallback. Spec §5.2. -
Junction and memory temperature, clocks. The telemetry sample carries the temperature of the memory junction, the temperature of the memory and the shader and memory clocks of every card. The GPUs tab shows them with their units and the word
hotwhen a card reaches the limit of its device table. Spec §11. -
Progress words. One function turns the tail of a setup or serve log into one sentence ("Loading the model weights, 2 of 5 shards").
serveandupprint it when it changes,ps --jsonandstatus --jsoncarry the phase of a live run, and the Logs tab shows the sentence under the state badge. Spec §5.4. -
P2P readiness checklist.
bernie topo --checkand the doctor categorytopo.p2panswer whether multi-GPU peer-to-peer copies and the custom all-reduce work on this host, and say why when they do not. The Topology tab shows the same checklist. Spec §4.5. -
MCP server.
bernie mcpon stdio andPOST /mcpon the dashboard, read-only by default, write tools behind--allow-writeand a confirm token. It reuses the--jsoncode paths. Spec §13, how-to mcp.md. -
Pass key recall.
bernie bench --recallhides a short random fact in every prompt and checks the reply for it. A cell that misses the fact has broken attention, and its speed numbers mean nothing. Spec §10. -
Bench workload. A result stores its
workload(protocol_id,corpus_sha256, input, output, concurrency, recall) andbernie bench comparerefuses two results of different workloads. Spec §10. -
Bench metrics. Every cell reports five groups of numbers: the prefill and the decode speed (the rate of the whole cell and the distribution of the rates of its requests), the time to first token in seconds, the inter-token latency in milliseconds and the output rate. The server's own numbers from
/metricscome next to them inserver_side. The text, the dashboard and the MCP tools show the same numbers with their units. Spec §10. -
Numeric GPU group ids. A container run adds the numeric ids of the GPU groups of the host, never their names: the image has no /etc/group to resolve a name in. The plan shows the ids and where they came from. Spec §8.2.
-
Resumable model download. The model step fetches the files of a Hugging Face repo into the cache itself: a partial file continues with a
Rangerequest, the checksum of every file is checked, and the progress is one line with a speed. Spec §6.1. -
Power cap service.
tune power setwrites the desired caps to<config>/power.yaml,tune power applywrites them to hwmon as root, andtune power serviceprints the systemd unit pair that applies the file at boot and on every change. The GPUs tab shows the cap, the allowed range, the desired value and the drift, and writes a new desired value. Spec §9.2. -
Copy buttons and raw JSON links. Every command the dashboard shows has a copy button that copies the command as it is written, and every card header carries a
jsonlink to the raw document behind it. Spec §11. -
Bench receipt.
bernie bench compare <a> <b> --markdownprints the comparison as a receipt: the scope of the two runs, their correctness, the numbers with the verdict of every metric, and the command that reproduces it. The pull request template has a Receipt block, and CONTRIBUTING.md says how to fill it withbernie bench --suite prandbernie bench ab. Spec §10.3. -
Bench suites in the dashboard. The Bench tab runs a suite, shows the five metric groups of every cell, compares a result with a saved one and draws the context-length curve of a ladder suite as plain SVG. Spec §11.
-
Check groups. A suite group of kind
checkasserts a declared answer instead of a speed. Its verdict lands in the cell fieldcheck, separate from the suite-wide recall gate. Spec §10.2. -
Long-context ladder. The built-in
long-contextsuite measures one cell per prompt length, from 2048 to 16384 tokens. It shows how the prefill and the time to first token grow with the prompt, and the dashboard draws it as the length curve. Spec §10.2. -
Dashboard structure. The dashboard is one server package plus the internal packages
api,auth,telemetry,sseandhttpjson. The web tree is grouped by role:web/css,web/js,web/componentsandweb/views/<tab>for the four tabs Setup, Dashboard, Benchmark and Logs. The old hash names still open their new tab.
The design of the new dashboard is written down: the shell, the tokens, the four tabs (Setup, Dashboard, Benchmark, Logs), the copy of every state and the wireframes are in design-dashboard.md and in design/. It is a design, not a plan: the first commit that uses it is the shell, and every commit names the files it touches.
| # | Item | Spec | Test |
|---|---|---|---|
| 10 | The dashboard v3 shell. Four tabs in a rail, the measured tokens, one primary action per tab, a toast, a tooltip and an Advanced panel on every tab. | design-dashboard.md | the four tabs open from their hash routes, the old routes still work, and the page does not scroll sideways at 390 px |
The design of the dashboard and parts of its markup and CSS come from CrispyGinger's vllm-rdna-dash, used with the author's permission. Pending: the author adds a licence file to that repository, so the use is recorded with a licence and not with a permission.
These add surface without helping first-run success. Reopen only with a concrete user request.
- Dashboard chat page. The
chatcommand covers the check. The page is deferred, not cancelled: its sketch is in design-dashboard.md §10, and the Dashboard tab carries a one-promptTry itbox meanwhile. connect --writeand self-check. Print-only first.- Demo mode for the dashboard.
- "Did you mean" suggestions beyond what the flag parser prints.
- A separate privacy page. The spec's "files and paths" section covers it.
- Download byte counts in plans. Progress words cover the wait.
- Per-recipe
sourcesfield.
- It runs vLLM, with tensor-parallel across cards, topology and P2P tools.
- Recipes are plain YAML that anyone can add.
- CLI first. The dashboard is a view of the same data.
- It never becomes an inference engine. Engine work goes to the fork.