Skip to content

Releases: Twinning-Labs/styre

v0.13.1

Choose a tag to compare

@styre-release-bot styre-release-bot released this 29 Jul 07:30

Bug Fixes

  • Fixed re-running a ticket with --fresh after it had already been pushed. Previously, redoing a ticket's work diverged from what a prior run had already pushed to the remote branch, causing the push to fail as a rejected non-fast-forward update. styre now safely overwrites its own remote branch in this case, while still refusing to clobber changes pushed by someone else in the meantime.

v0.13.0

Choose a tag to compare

@styre-release-bot styre-release-bot released this 29 Jul 05:13

Features

  • styre ls shows leftover state on disk. A new styre ls command lists resumable runs (paused waiting on you, out of budget, or interrupted) with resume hints, plus a preview of finished runs (PR-ready or done), and marks any run that's still live.
  • styre clean reaps finished runs. Use styre clean <ident> to remove one run's on-disk artifacts (worktree and checkpoint), or styre clean --all to sweep every provably-finished run for the current project; clean never touches ticket status, and it refuses to touch a run that's still in progress.
  • --purge closes out the branch too. Add --purge to styre clean <ident> to also delete the local and remote branch (closing its PR); it's opt-in, single-ident only, quietly does nothing if there's no branch or PR, and it will never delete your repo's default branch.
  • Resuming a run now actually resumes it. styre run --resume clears the pending "needs you" signal before continuing, so a resumed run picks up where it left off instead of immediately pausing again.
  • --inspect reports the right step. When inspecting a run dry-run, styre now correctly points at the failed step instead of showing (none).
  • Resuming the same ticket twice is blocked. styre run --resume now takes a lock for the ticket, so a second concurrent resume of the same run is refused instead of corrupting state.
  • --fresh no longer gets stuck on old worktrees. styre run --resume --fresh now cleans up a leftover worktree from a previous run before discarding its checkpoint, instead of failing.
  • A fresh run leaves a proper checkpoint on crash. styre run now journals directly to the run's durable checkpoint from the start, so a crash, escalation, or block leaves behind a checkpoint you can resume — not an orphaned temp file.
  • Re-running a ticket is safer. styre run now refuses to start over a ticket that already has a checkpoint (with a hint to use --resume or --fresh), and holds a per-ticket lock while running so two runs can't collide on the same state.
  • Pause outcomes are simpler and more consistent. Runs that get stuck or blocked now pause with a clear, resumable "needs you" status instead of silently going into a handful of inconsistent dead-end states; exit code 75 is now used consistently for every kind of pause.

Bug Fixes

  • Re-running a ticket no longer collides on its old branch. styre now detects and frees a leftover worktree still holding a previous run's branch (fixing the "already used by worktree" failure on re-run), while refusing to touch a worktree that's still live or owned by something else.

v0.12.0

Choose a tag to compare

@styre-release-bot styre-release-bot released this 24 Jul 11:08

Features

  • Telemetry now includes an estimated USD cost (cost_usd_estimated) for dispatches and run summaries, so spend from providers like Codex that don't report actual USD is no longer unknowable; this is a list-price estimate derived from token counts, shown alongside (never overwriting) any reported cost.
  • Cost estimates are computed from a new configurable pricing block (rates, tiers, and a version stamp), so pricing can be updated without a new release.
  • The default Codex model preset moves from gpt-5.4-* to gpt-5.6-sol/terra/luna, since the old model IDs are stale and had no matching price data.

Bug Fixes

  • Fixed a bug where a discarded file (like cmd/build.go) could falsely count as covering a check's acceptance criterion just because its extension happened to match part of an unrelated module name; this was causing real failures to be silently marked as passing on several languages including Go, Java, Kotlin, Scala, and Python.
  • .pyi type-stub files are no longer treated as importable source, which fixes both a class of false "check passed" results and a related case where a genuinely broken check was incorrectly marked as covered.
  • .svelte, .cts, and .mts files are now correctly recognized when matching a failing check to a file your agent discarded, closing gaps where Svelte components or TypeScript helpers reached via compiled .mjs specifiers weren't detected.
  • Editing a Gemfile, Gemfile.lock, *.gemspec, composer.json, or composer.lock now correctly re-triggers dependency installation before the next verify, so Ruby and PHP projects no longer verify against a worktree with stale dependencies.
  • Fixed file paths containing non-ASCII characters (accented letters, CJK, Cyrillic) or newlines being mangled when read from git, which could prevent dependency-manifest changes from re-triggering installs, break file-based check routing, and cause file lookups to silently fail.
  • Corrected the exit-code documentation in the README and runtime-parameters guide to match actual behavior: there is no exit code 2, escalations exit 75 (not 1) and are distinct from parked runs (only parked runs can be resumed), and previously undocumented exit codes 64, 70, and 78 are now listed.
  • Fixed the brew install command in the README, which was missing the tap prefix.

v0.11.0

Choose a tag to compare

@styre-release-bot styre-release-bot released this 22 Jul 14:13

Features

  • Preflight now checks your toolchain, not just your CLI provider. styre run fails fast, before any spend, if a command your repo's build/test/check steps need isn't installed, and the design phase now runs provision first so environment problems surface before design work begins.
  • Missing or outdated claude/codex CLIs are now caught immediately. If your configured agent CLI is missing or below the version styre requires, styre run, styre setup, and --resume all fail fast with a clear message telling you to install or upgrade it, instead of retrying three times and failing with a cryptic error.
  • Run outcomes are easier to read. styre run now leads with a plain-language outcome sentence, always prints the PR URL when there is one, names the pending signal when a ticket is waiting on you, and shows loopback history as a readable timeline instead of raw internal terms. Errors render as a single clear message with a suggested fix instead of a stack trace.
  • Escalations to a human are now reported distinctly from dead ends. A run that hands off to a person now shows the outcome escalated (exit code 75) everywhere — the terminal summary, Slack, and analytics — instead of being lumped in with blocked.
  • Telemetry now includes run identity and honest cost totals. Every exported event carries a stable run_id so you can tell two runs of the same ticket apart (and --resume keeps the same id), summary cost/token fields are null when nothing reported them (instead of a misleading 0), and a new usage_coverage field tells you how complete a summary total is. This is a breaking change to the NDJSON export schema (v1 → v2).
  • styre notify and legibility docs. Documentation now fully covers the checks/arbiter subsystem, all config keys, exit codes, environment variables, and prompt templates, so the reference material actually matches shipping behavior.

Bug Fixes

  • A missing or broken test launcher no longer counts as a passed check. If the test framework can't even start (exit code 126/127, e.g. the launcher isn't installed), styre no longer marks the acceptance criterion as covered — it's retried loudly instead.
  • A check that errors with no output no longer counts as covered. Previously a check that couldn't run at all (no test framework detected, no interpreter, or a timeout) and produced no output was silently marked as covering its acceptance criterion; it's now routed to a loud retry with a reason.
  • Discarded-file detection now works across more languages. The guard that catches a check silently broken by an undeclared, discarded file now understands Go, Rust, JVM, Ruby, and PHP output (previously Python/Node only), and Rust/Ruby/PHP symbol matching is now anchored so a test's own error text can't be mistaken for a real compiler error.
  • Discarded Python support files now produce a clear message. If a discarded __init__.py or conftest.py breaks test collection, styre now names the real cause instead of silently installing a broken check.
  • Telemetry events can now be joined back to the dispatch that caused them. loopback and escalated events now carry the originating dispatch_id, which was previously always null.
  • Early failures (bad config, wrong adapter, running outside a git repo) are now counted in analytics. Previously only failures after config was fully resolved were recorded, so early exits were invisible to usage tracking.

v0.10.0

Choose a tag to compare

@styre-release-bot styre-release-bot released this 19 Jul 13:54

Features

  • Remote CI status is now reported, not gated on: styre run exits as soon as local ground truth (verify-green, review-clean, PR open) is met, takes one best-effort snapshot of CI status, and records it as a ci_handoff telemetry event instead of waiting or looping on a red check.
  • checks:dispatch now handles undeclared throwaway files more gracefully: instead of rejecting and stalling the ticket, it discards undeclared new files and continues, while out-of-scope edits to tracked files still get rejected as before.
  • The checks scope guard now recognizes legitimate support files (like Python __init__.py package markers) written alongside a check file in styre_checks/, instead of wrongly treating them as out-of-scope and escalating the ticket.

Bug Fixes

  • Fixed a bug where redesigning a ticket didn't reset the design steps' retry budget, which could cause a healthy ticket to be wrongly escalated after a redesign loopback.
  • Fixed several GitHub CI verdict bugs: cancelled check runs (including ones triggered by styre's own push-then-PR sequence) are no longer misread as failures, unrecognized check conclusions now fail safe instead of silently passing, and repos whose workflows never run on pull requests are no longer misdetected as having a usable checks system.
  • Fixed a wedge where the design stage could delete an implement-authored test that also satisfied an acceptance criterion, emptying the work unit and causing the ticket to get stuck; test files are now classified by who writes them, and the implement step is now shown the scope it's expected to cover.

v0.9.0

Choose a tag to compare

@styre-release-bot styre-release-bot released this 15 Jul 21:16

Features

  • Setup enrichment now reads dependency manifests across seven ecosystems (Node, Rust/Cargo, Python, Go, Ruby, PHP, and JVM) and passes the list of dependency names into the enrichment prompt as extra context, helping styre correctly recognize capabilities like data storage, caching, observability, and config/secrets handling in non-Node repos instead of marking them as absent just because they weren't found by scanning the codebase alone.

v0.8.2

Choose a tag to compare

@styre-release-bot styre-release-bot released this 15 Jul 15:48

[0.8.2] - 2026-07-15

Bug Fixes

  • Reconcile checks:dispatch RED-first test path to the file actually written (ENG-296) (#79)
  • Harden checks/implement prompts + normalize resolver fallback (ENG-297) (#80)
  • Sweep a sanctioned styre_scratch/ drawer so scratch never blocks checks/implement (ENG-300) (#81)

v0.8.1

Choose a tag to compare

@styre-release-bot styre-release-bot released this 14 Jul 16:40

Bug Fixes

  • Completeness check no longer false-flags correctly delivered work as "under-delivered." Previously, if the design agent couldn't name an output's exact path ahead of time — for example, a changelog file named after a not-yet-created PR number — styre would wrongly conclude the work was incomplete and escalate, even when the correct file existed. Declared file paths can now include <token> placeholders that match the actual produced filename, so this class of false positive no longer blocks a run.
  • Verification tests no longer trigger false completeness failures or get duplicated. Design no longer declares the checks-owned verification test by name, since that test is authored separately and its filename can never be predicted in advance; verification is instead confirmed by the existing checks-postcondition and RED-first gates, which are the real source of truth for it.

v0.8.0

Choose a tag to compare

@styre-release-bot styre-release-bot released this 11 Jul 16:48

Features

  • JIRA Cloud is now a supported issue tracker. Set issueTracker: "jira" in your config to run styre against JIRA Cloud instead of Linear, with the same fetch, state transitions, labels, and comments support as the Linear adapter.
  • JIRA authentication uses a simple Basic-auth setup with JIRA_BASE_URL, JIRA_EMAIL, and JIRA_API_TOKEN; the setup command's credential summary now reports these when they're present, and JIRA_API_TOKEN is kept out of any spawned agent's environment.
  • JIRA ticket descriptions written in Atlassian's rich-text format are converted to markdown, including checklists, so acceptance-criteria parsing works the same way it does for Linear.
  • An optional jira config block lets you customize status-to-transition mapping and bug issue-type names if your JIRA workflow doesn't match the defaults.
  • When a ticket's status update is skipped because of a workflow mismatch (not a connection failure), styre now records a structured note in the run log so you can see why the state wasn't projected.

v0.7.0

Choose a tag to compare

@styre-release-bot styre-release-bot released this 11 Jul 15:21

Features

  • Slack notifications: styre can now post to Slack for escalations, terminal states, and (at higher verbosity) stage transitions, so you can follow ticket progress without watching the CLI directly.
  • Slack messages include the ticket title and a "View PR" button linking to the pull request, formatted with Slack's rich Block Kit layout.
  • Dead-end blocked terminals now trigger a Slack notification distinct from escalation-blocked cases, so you get exactly one message per outcome instead of none or duplicates.
  • Added a styre notify --test command to send a test Slack message and confirm your bot token and channel configuration are working.
  • Set SLACK_BOT_TOKEN and configure your notification policy and channel in config.json to turn this on; styre fails loudly at startup if the configuration is incomplete.

Bug Fixes

  • Slack delivery failures are now surfaced with clearer diagnostic messages instead of failing silently, and they never cause a ticket to be escalated on their own.