0.3.0 - 2026-08-24
Release Notes
Added
-
Differentiated per-tier model binding in
warble eval run—--models-configplus inline
--strong/--cheap/--orchestrator, matchingwarble dispatch's own flag names and
precedence. Eval could previously bind one model to all three LLM tiers or none, so on a back-end
that dispatches live from IR (claude-agent-sdk) every strong step silently ran on the same model
the flat binding named. The resolved binding threads through to the back-end adapter as a
first-class flat-or-tiered override. -
A
--max-turnsknob for the SDK back-end, so turn count can be isolated as a variable when
comparing back-ends with different defaults. The trace cache key grows only when the flag is
present, keeping existing uncapped entries valid, and the flag loud-fails against a back-end with
no turn-budget knob rather than being silently ignored. -
Output-level instability, not just verdict flips. Repeated sampling now reports an
output_unstable_casesaggregate distinct fromflaky_cases, and surfaces the answer
distribution for output-unstable cases too — a question that returns a different wrong answer
every run but never flips its (failing) verdict was previously invisible. On the one repeated-
sampling dataset available, verdict flips were 1/15 while output divergence was 5/15. -
Ask components on the
codex-localback-end in eval, with table rows normalized before
comparison so formatting differences don't read as wrong answers.
Removed
-
config.tier_policy— removed, andwarble_ir_versionbumped to0.6. The profile-level
configblock no longer acceptstier_policy, and the IR emits"config": {}. The field was
inert: no back-end ever read it, its value was never validated against any vocabulary, and
compiling the same profile withcost_sensitive,null, or an invented string produced
byte-identical dispatch output — so a profile declaring it advertised cost control it did not
have. All eleven bundled profiles dropped the key; none changes behavior.It was removed rather than wired up because the rule it needs does not exist and the obvious
rule is measurably wrong: eval shows a blanket downgrade ofanswer_queryis free on a clean
schema (no accuracy lost, ~3× cheaper) and costly on a messy one (execution accuracy 0.93 →
0.60). Which steps are safe to downgrade is a property of the bound context, not of the profile.
Use a mount'stier_overridesfor per-step control; seedocs/spec/ir-schema.md
(config— emptied in 0.6) for the full rationale.The
configblock itself stays, empty, so future profile-level config is an additive change
rather than the reintroduction of a removed key. -
Every stored
0.5artifact must be regenerated. Per the IR version contract, back-ends
exact-matchwarble_ir_version: a committedir.golden.json,vercelbundle, orcodex-local
manifest built against0.5is now rejected loudly at load time. All in-tree goldens, fixtures,
bundles, and manifests are regenerated in this change.
Fixed
-
A per-step LLM tier is now honored regardless of realization kind.
llm:per_step_tierwas
derived only when a component'srealization_kindwasskill, so agated-toolortool
component declaring divergent step tiers had its authored tiers silently collapsed by every
back-end — 3 of the 8 shared hub components (bootstrap_mdl,edit_pipeline,
enrich_knowledge) were affected in practice. Both the capability derivation and the per-step
split predicate are now driven purely by IR shape in all three back-ends. -
A failed
claude-code-clieval invocation says why it failed. The adapter collapsed "the
process never started" and "the process exited non-zero" into an empty reason, discarding the
spawn error and the CLI's stderr. An environment failure — an expired credential, a binary
missing from the run PATH, a refused workspace — therefore reached the committed report as every
case scoring 0.000 against a 1.000 baseline, indistinguishable from the model answering
everything wrong, with the actual cause recorded nowhere. -
The bundled jaffle example declares its three relationships again. Its
relationships.yml
was still the original bare list, and the two shapes do not degrade equally against thewren
CLI's keyedrelationships:mapping: an older CLI ignores a bare list silently — reporting
success while emitting a manifest with zero relationships — and a newer one rejects it as a hard
validation error. The three joins (orders→customers, raw_orders→raw_customers,
raw_orders→raw_items) are restored in the keyed form, which builds on both.
Install warble-cli 0.3.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/Canner/Warble/releases/download/v0.3.0/warble-cli-installer.sh | shInstall prebuilt binaries into your npm project
npm install @warble/cli@0.3.0Download warble-cli 0.3.0
| File | Platform | Checksum |
|---|---|---|
| warble-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| warble-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| warble-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| warble-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |