workflow.tsx) and a working bunx smthrs init scaffold; each case runs that workflow with the given input and checks the result.
API reference: Scorers lists every scorer, its options, and links to source and tests.
1. Create cases
Createevals/smoke.jsonl:
cases array:
expected checks:
status: one offinished,continued,failed,cancelled,waiting-approval,waiting-event, orwaiting-timeroutput: exact JSON match against the workflow outputoutputContains: recursive partial JSON match; array elements match by containment (at least one must match the partial object)errorContains: substring match against thrown errors
Judge assertions
Use a judge assertion when correctness depends on meaning or tone rather than an exact JSON match:judge.instructions must be a non-empty string; judge.threshold is optional (0 to 1, default 0.8). A case with both expected and judge passes only when every deterministic assertion passes and the judge score meets its threshold.
Smithers automatically picks an authenticated local judge agent; use --judge-provider and --judge-model to select one explicitly:
reason field; cases still run and the report still writes.
2. Dry-run the plan
--run-label <label> to keep dry-run and execution IDs consistent.
3. Execute the suite
.smithers/evals/smoke.json; use --report path/to/report.json for a different location.
The command exits 0 when all cases pass, 1 when any genuinely fail, 4 for invalid case files, and 5 when the only reds are INCONCLUSIVE: cases that died on a harness or environment fault (connection refused, TLS failure, network denied, missing binary, out of memory, rate limit) before the workflow’s behavior could be observed. Exit 5 means fix the harness, not the workflow; a loop that treats it like 1 will iterate on product code the suite never actually tested.
Warning: Bash-tool network access is off by default for every eval run. Loopback stays reachable (localhost,127.0.0.1,*.localhost, unix sockets), so local compositions work, but a suite whose workflow reaches any real external service needs--allow-networkor every case dies withTOOL_NETWORK_DISABLEDand grades INCONCLUSIVE.
Tip: Pass a workflow ID (implement) instead of a file path for workflows discovered from.smithers/workflowsto run the same suite on every checkout without hard-coded entry paths.
4. Use structured output in CI
Options that matter in production
--concurrency N: run cases concurrently; keep it low for stateful or expensive workflows.--run-label LABEL: append a stable label to run IDs, useful for CI build IDs or benchmark names.--max-concurrency N: pass a per-workflow task concurrency cap to each case.--max-cases N: shard or sample a large suite.--no-include-output: omit workflow outputs from the report when they’re too large or sensitive.--allow-network: enable network access for bash tools in cases that need it.--root PATH: set the sandbox root for tool execution.