Releases: Twinning-Labs/styre
Releases · Twinning-Labs/styre
Release list
v0.13.1
Bug Fixes
- Fixed re-running a ticket with
--freshafter 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
Features
styre lsshows leftover state on disk. A newstyre lscommand 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 cleanreaps finished runs. Usestyre clean <ident>to remove one run's on-disk artifacts (worktree and checkpoint), orstyre clean --allto sweep every provably-finished run for the current project;cleannever touches ticket status, and it refuses to touch a run that's still in progress.--purgecloses out the branch too. Add--purgetostyre 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 --resumeclears the pending "needs you" signal before continuing, so a resumed run picks up where it left off instead of immediately pausing again. --inspectreports 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 --resumenow takes a lock for the ticket, so a second concurrent resume of the same run is refused instead of corrupting state. --freshno longer gets stuck on old worktrees.styre run --resume --freshnow 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 runnow 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 runnow refuses to start over a ticket that already has a checkpoint (with a hint to use--resumeor--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
75is 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
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
pricingblock (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-*togpt-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. .pyitype-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.mtsfiles 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.mjsspecifiers weren't detected.- Editing a
Gemfile,Gemfile.lock,*.gemspec,composer.json, orcomposer.locknow 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 exit75(not1) and are distinct from parked runs (only parked runs can be resumed), and previously undocumented exit codes64,70, and78are now listed. - Fixed the
brew installcommand in the README, which was missing the tap prefix.
v0.11.0
Features
- Preflight now checks your toolchain, not just your CLI provider.
styre runfails fast, before any spend, if a command your repo's build/test/check steps need isn't installed, and thedesignphase now runsprovisionfirst so environment problems surface before design work begins. - Missing or outdated
claude/codexCLIs are now caught immediately. If your configured agent CLI is missing or below the version styre requires,styre run,styre setup, and--resumeall 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 runnow 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 withblocked. - Telemetry now includes run identity and honest cost totals. Every exported event carries a stable
run_idso you can tell two runs of the same ticket apart (and--resumekeeps the same id), summary cost/token fields arenullwhen nothing reported them (instead of a misleading0), and a newusage_coveragefield tells you how complete a summary total is. This is a breaking change to the NDJSON export schema (v1 → v2). styre notifyand 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__.pyorconftest.pybreaks 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.
loopbackandescalatedevents now carry the originatingdispatch_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
Features
- Remote CI status is now reported, not gated on:
styre runexits 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 aci_handofftelemetry event instead of waiting or looping on a red check. checks:dispatchnow 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__.pypackage markers) written alongside a check file instyre_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
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
v0.8.1
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
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, andJIRA_API_TOKEN; the setup command's credential summary now reports these when they're present, andJIRA_API_TOKENis 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
jiraconfig 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
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
blockedterminals 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 --testcommand to send a test Slack message and confirm your bot token and channel configuration are working. - Set
SLACK_BOT_TOKENand configure your notification policy and channel inconfig.jsonto 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.