Skip to content

0.3.0 - 2026-08-24

Choose a tag to compare

@github-actions github-actions released this 24 Aug 05:01
7696738

Release Notes

Added

  • Differentiated per-tier model binding in warble eval run — --models-config plus inline
    --strong / --cheap / --orchestrator, matching warble 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-turns knob 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_cases aggregate distinct from flaky_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-local back-end in eval, with table rows normalized before
    comparison so formatting differences don't read as wrong answers.

Removed

  • config.tier_policy — removed, and warble_ir_version bumped to 0.6. The profile-level
    config block no longer accepts tier_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 with cost_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 of answer_query is 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's tier_overrides for per-step control; see docs/spec/ir-schema.md
    (config — emptied in 0.6) for the full rationale.

    The config block itself stays, empty, so future profile-level config is an additive change
    rather than the reintroduction of a removed key.

  • Every stored 0.5 artifact must be regenerated. Per the IR version contract, back-ends
    exact-match warble_ir_version: a committed ir.golden.json, vercel bundle, or codex-local
    manifest built against 0.5 is 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_tier was
    derived only when a component's realization_kind was skill, so a gated-tool or tool
    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-cli eval 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 the wren
    CLI's keyed relationships: 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 | sh

Install prebuilt binaries into your npm project

npm install @warble/cli@0.3.0

Download 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