Repository navigation
Releases
v1.3.0
Adds Qwen Code as an experimental worker, reviewer and foreman harness; hands each agent's permissions to its own CLI instead of a scope of brigada's, so a claude worker now defaults to bypassPermissions and a review is no longer read-only by brigada's doing; lets a cancel say why; and bounds a review's requeue during a provider outage. Five store migrations (0073 to 0077) and new settings plan_file_branch, retention_days, permission.<harness>/<model> and read_scope.<harness>/<model>: once a 1.3.0 engine has opened the store, an older binary refuses it. Read the Changed section before you upgrade: the permission defaults are wider. Restart the engine and runner after you upgrade.
Changed
- Permissions belong to the user's harness, and brigada passes them through per agent. An agent's
permission=(or the config keypermission.<harness>/<model>) reaches its CLI as that CLI's own permission flag or argument on claude, codex, opencode, dsh, kimi and qwen-code, and every job grant of the agent carries it, a review's included: brigada no longer sets a tool scope of its own, so a review is no longer read-only by brigada's doing. Claude defaults tobypassPermissions; a foreman turn on codex, opencode and qwen-code never reads it (issue #228). - The agent's
tools=, the config keytools.claude/<model>,init --toolsand the project'sworker_toolsare deprecated aliases ofpermission=. They still read and warn, and a project'sworker_toolsstands in for a claude agent'spermission=on that project's work and fix jobs, as it replaced the worker's scope before; they are removed in the next major version, and aproject.yamlthat usesworker_toolsstays schema 1.brigada initsaves a Claude agent that has no permission with the harness default as its explicitpermission=, andbrigada configshows each agent's resolvedpermission:(issue #228). - The read-scope hook that confines a claude foreman's file reads to its reading checkout is a default the user can turn off per agent, with
read-scope=falseon the--agentorread_scope.<harness>/<model> = falsein the config file (issue #228). - A worker can no longer push its own branch. A task worktree carries no push URL, so the runner is the only path to the remote and only its credentials reach it (issue #228).
- A review runs under the agent's
permission=in every harness, with no read-only default of brigada's. Aqwen-codeagent takes the review class and defaults toimplement,review,answerlike any other,brigada initincluded, and a Kimi review no longer swaps in a read-only agent definition: the runner writes nokimi-readonly.mdany more (issue #228). - A claude agent with no
tools=no longer shows brigada's Go default allowlist as its registered scope: the runner's startup line and the foreman'scapacitytool show what the harness actually runs, the agent'spermission=, and an explicittools=keeps showing its patterns; the capacity snapshot carriespermissionbesidetools.brigada configshows the default oftools.claude/<model>asunset: the claude permission appliesinstead of the allowlist (issue #228).
Added
- The
qwen-codeadapter drives Alibaba's Qwen Code CLI (qwen) as an experimental harness that implements, reviews and answers, its default classesimplement,review,answer.brigada initoffers it, marked experimental, whenqwenis onPATH. Each job runsqwen -pwith stream-json output and--setting-sources user, under the agent'spermission=as--approval-mode, or--dangerously-skip-permissionswhen the agent sets none; checked against 1.0.0-preview.1 (issue #224). An HTTP 402billing_errorthat names a futurequota.reset_atis the subscription's window and cools the account until that reset; a 402 with no usable reset is a spent balance and cools it for eight days, as dsh's does, so neither marks the agent broken (issue #230). qwen-codeis a foreman harness as well, experimental: a foreman turn carries thebrigadaMCP bridge through--mcp-configand--strict-mcp-config, and the attach forks the session onto the client's id. It has no read-only foreman scope, so a foreman on it keeps auto-approve and its read-only confinement is not enforced (issue #226).- A cancel can say why. Each
plan_amendcancel entry may be{task, reason}beside the bare task name or id, andtask_canceltakes an optionalreason, in the foreman's MCP tools and the API alike. Every task an amendment newly cancels records onetask_cancelled_by_amendevent with the plan, the reason verbatim and the caller (foreman or user), andbrigada historyshows the reason. A reason is expected on every cancel; one without is still accepted, as before, and recorded as "no reason given". - A restarted dependent now rebuilds on the land target, or on the waiting landings' ref
refs/brigada/land/<target>, when its dependency already landed (squashed or not) or was cancelled or retired, instead of on the dependency's old result branch, whose landing conflicted. Thetask_base_stalereason names that base. A task base may now be the waiting ref, which the runner fetches by name. plan_file_branch, a project setting (brigada project set,project showand.brigada/project.yaml), names the branch the plan files are pushed to;mainor the repository's default branch name commits them to the default branch. The mirror read the key, but nothing could set it (issue #215).retention_daysin the config file prunes messages and artifacts older than that many days on the engine's sweep; 0, the default, keeps everything, and the event log is never pruned. The engine could prune, but no key set it (issue #217).
Fixed
- A review that failed on infrastructure, such as a DNS outage, was requeued at once and without bound (68 review jobs in 68 minutes on one task). It now rides the infra backoff and three-hour window that work, fix and plan-review jobs use, spending no review retry, round, restart or wake, and a spent window parks the task at
needs_foremanwith the outage as the reason. - A per-model
tools.*key in the machine config wrapped at spaces inbrigada config, splitting a pattern likeBash(go vet:*)across lines; it now wraps at+, where the patterns join (issue #228). - A task restarted while its landing waited at the push gate, or sat for a hand push under
gate_push = never, could not land its reworked head, andbrigada push approvestill pushed the old commit. A restart now forgets that landing and the landings stacked on the same waiting ref, the next landing of the target deletesrefs/brigada/land/<target>before it stacks, and the re-made landings wait at the push gate again (issue #205). Restart the engine and runner after you upgrade. - A dependent whose landing was waiting on a
land_readyre-check or a not-ready retry could land on its dependency's old round after the dependency was rebuilt from a new-r<n>branch. A queued land job is now checked for a stale base when it is leased: it is cancelled and the task parks atneeds_foremanwithtask_base_stale, as a landing the land rule refuses does (issue #205). - The claude adapter sorts the CLI's "You've hit your 5-hour limit" and weekly wordings as limits, so the account cools and the foreman parks until the reset the message names; the reset parser already read the wording's
resets <time> (<zone>)suffix, which the old classification never reached. - A foreman turn's limit cools the account it shares with task workers, as §4.4 says: the workers stop placing on a wall the foreman already hit, the dispatcher serves another tier's agents until the reset, and the status shows every agent of the account cooling. A limit still never counts toward the failure streak.
- The AGENTS box of
brigada topkeeps a zero-capped agent off its rows while the shared account cools or the agent is broken: an agent that can never place was listed as a cooling row the moment its account cooled. The top border'sN offcount carries it as before. - A landing whose push git rejected because the target moved (
! [rejected] … (fetch first)) was sorted as the remote failing, so the task parked under the project's grouped environment wake. It now parks on its own, as the landing's own failure. brigada topandbrigada capacityrefused a--projectthat names a local-path remote (file:/…), and run inside a repository with such an origin they showed every project. They now read a project's identity as the engine does.brigada topleft its idle connections to the engine open after every refresh until the engine's idle timeout closed them; each refresh now closes its own.- A worker tool call cut for the loop watch could end in a split UTF-8 character.
- The
approval_max_tasksusage error said a negative value turns every approval rule off; it turns off the count rule alone, and the error now says so (issue #218). - The coordinator's
plan_rejectadvertisedand_stop_asking, which it ignored; its schema now offers onlyrepo_url,planandversion, and a test holds every coordinator tool's arguments to COMPATIBILITY.md (issue #216). - A quota limit counted toward an agent's failure streak: a success, a limit and then one failure marked the agent broken, since the stored limit job was one of the "last two". The streak now skips limit failures as it skips setup and infra ones (issue #212).
- A spent DeepSeek balance (dsh's HTTP 402
Insufficient Balance) was sorted as a plain limit, so the account cooled for the 30-minute default and walked back into the same wall every half hour while still empty. It is now a kind of its own: the account cools for eight days — the cap a suspect reset is capped at — andbrigada agent resetlifts it once the account is topped up. A foreman turn's balance error marks it limited with an unknown reset, as a limit without a time does, and no balance counts ...
v1.2.0
Pauses dispatch per engine or project, with a draining stop; prints brigada history as a table; lists pinned queued jobs in brigada capacity; and keeps an automatic retry from pinning a task to an agent capped at 0. One store migration (0072, the pause table) and no new setting: once a 1.2.0 engine has opened the store, an older binary refuses it. Restart the engine and runner after you upgrade.
Changed
- The AGENTS box of
brigada toplists agents in the order of theirharness/modelname, so a row no longer moves when an agent starts or finishes a job, and its top border counts the broken and cooling agents (1 broken · 3 cooling). - The AGENTS box of
brigada topshows each agent's tier and cost weight asH×3(Hx3without UTF-8) and uses two columns only when every cell fits whole. brigada topshortens an agent name of more than two/segments to its harness and model, soopencode/zai-coding-plan/glm-5.3readsopencode/glm-5.3and the harness stays visible.- Bare
brigada historyprints a table, one row per event: time, kind, number, what happened and the title, with a landing's short commit and anafter-land failed: --task Nflag. It shows the last 50 rows, oldest first; the new--allprints every row.--task,--job,--rawand--limitprint what they did (issue #191). - The PLANS box of
brigada toplists finished plans newest first (highest plan id first) below the live plans, which keep id order, so a short terminal drops the oldest finished plans first.
Added
brigada pauseandbrigada resumepause and resume dispatch for the engine or, with--repo, one project;brigada stop --engine --drainpauses the engine, waits for its running jobs and then stops.brigada statusprints apaused:line per pause,brigada topshows it in a band of its own beside theppause, and the foreman'sstatusandcapacitytools show it; a queued job of a paused scope is counted under the pause, never asheld:(issue #198).brigada capacityprints a PINS table when queued jobs are pinned to an agent, and the foreman'scapacitytool lists the same pins: each job with its task, kind, agent, whether the pin can place (ready,coolinguntil a time,brokenorcapped_at_0) and the cap hold, if any. A wait for a slot that will free now reads apart from a pin that can never place (issue #195).- In the full-screen
brigada top, a running job's▸is a spinner on a 120 ms redraw of its own, with colour and UTF-8 and while a job runs;--intervalstill sets the fetch, a frame makes no API call, and only the lines that changed are written (issue #176).
Fixed
- An automatic retry could pin a task to an agent whose model or account cap is 0, and the task then waited forever for a free slot. Placement now skips an agent capped at 0 for the job's kind (ranked picks, retry pins, the
review.family=prefersteps and the cooling hold), and a pin on such an agent parks at the queue TTL with a reason naming the pin and the layer. A foreman turn still ignores a model capped at 0 (issue #195). - Plans parked by review leave the needs-you queue while the foreman handles them and notify when it cannot (issue #197).
brigada toplists live plans before finished ones, and a short terminal spends a free row on a running line (issue #184).
v1.1.1
Fixes brigada top in macOS Terminal.app, reads its events as a table, and lets a flaky land check rerun without a restart. No store migration and no new setting. Restart the engine and runner after you upgrade.
Changed
- The EVENTS rows of
brigada topread as a table: time, kind, number, what happened and the plan's or task's title, each column aligned. A task'sdonerow is hidden once itslandedrow shows, and a narrow box cuts the title first.brigada historyprints what it did.
Fixed
brigada toplost the last character of every full-width line in macOS Terminal.app, so boxes had no right border andp pausereadp paus. It now keeps the last column, and a terminal resize redraws at once from the data the view holds, with no fetch (issue #186).- A land check that failed on a flake could only be restarted, which rebuilt every dependent.
land_retrynow reruns a failed land check through the land rule, with every gate applying and no restart spent, at most twice for one approved head: after the third failure it refuses and namestask_restart. The foreman calls it only whencheck_logshows the failure is unrelated to the task's diff; a conflict, a real check failure and a moved approved head still needtask_restart(issue #181).
v1.1.0
A rebuilt brigada top, a readable brigada history, and fixes that name failures brigada used to hide. No store migration and no new setting. Restart the engine and runner after you upgrade.
Changed
brigada topis rebuilt as one column of rounded boxes (issue #162): NEEDS YOU first, then FOREMAN and JOBS when they have lines, PLANS, AGENTS and EVENTS. A two-row header carries the brand mark, scope, uptime, clock and keys, then a slots meter with the run, queue, held and needs counters. The keys, flags and piped snapshot stay as they were.brigada topshows the state of the work. An active plan shows one cell per task,■■■■■■□□ 3/8, with a legend in the PLANS border; a plan that is not active showsawaiting approval,reviewing round Norneeds foreman; cancelled and retired tasks leave the total. Every job sits under its plan in fixed columns: task, title, kind, agent, age, last event. A done task waiting to land keeps a⇡line, and needs-you and running rows sit on a dark red and a dark blue at 256 colours and true colour.brigada toplists agents in two columns: a green●, a yellow↺withuntil HH:MMor a red✗with its reason, the name, then one cell per slot of the effective cap, filled up to the running count. A running agent's name and its job line take the family colour. The AGENTS border carriesall ≤ global N,M offorall ready.brigada toplists events one per row, newest on top, in plain words such as#328 landedandplan #99 done, with no job bookkeeping. The first line of the foreman's report sits in the EVENTS border.- A needs-you line in
brigada topends in the command that answers it, whole:→ brigada plan approve N,→ brigada land approve N,→ brigada push approveor→ brigada agent reset <harness>/<model>. The reason is cut instead. brigada tophas a screen for each state: a first run shows the command to type, a view with no live plan readsnone live · N finishedwith the time of the last landing, an engine it cannot reach shows a red✗ ENGINE UNREACHABLEband with the age of the data and dims everything below it so old data does not read as live, and a pause shows a yellow|| PAUSEDband and freezes the job ages.brigada topfits the terminal: the frame never has more lines than the height, and lines drop class by class, finished plans before queued tasks and queued tasks before running ones, with the header and NEEDS YOU last. Rows are measured in terminal cells, so wide characters no longer break a box. Every glyph has an ASCII fallback, and with no colour each plan-cell state keeps its own glyph (issue #182).brigada topshows one scope in every section: with--projectthat project, except that a broken agent still shows; without it the whole engine, with each plan line naming its repo when more than one project shows. The header names the scope in place of the pid.brigada historyprints plain words by default: each line starts with its local time asMM-DD HH:MMand says what happened, and the bare view shows only those events.--task Nand--job Nshow every item, with a worker's result as its status and summary and a review's findings in full. The new--rawflag prints the earlier form unchanged.- The capacity AGENTS table shows each agent's effective cap: its own runner, account and model caps with the global layer folded in, naming the layer that binds it. Plan caps stay out of the fold.
- The operator guide and skill cover the way back from the foreman:
brigada askreturns at once, the reply is theforeman report:line ofbrigada status, and the answer goes back with anotherbrigada ask. They also namebrigada logs --task N, the engine restart after an upgrade, and landing by hand andbrigada budget --wakesamong the user's decisions. - The docs no longer say a task parks at
needs_user: the state is reserved and no path enters it. A task that needs judgment parks atneeds_foreman, the foreman reaches the user through its report, andask_userrecords a question and parks nothing (issue #173).
Added
check_log, a foreman tool (issue #180): it reads a job's whole check log, byjobwithoffsetandlimitin bytes, the last 16 KB by default and at most 64 KB a read. The defaultforeman.mdtells it to read the log before it calls a failure a flake: a rerun ofbrigada initbrings that text to a project that has not edited its file, andbrigada init --take-default foremanreplaces an edited one.
Fixed
- A run of opencode cut off at its output token limit read as a run with no result. It now fails with the
output_limiterror kind and a reason such asoutput limit reached: 32,000 tokens, 31,951 of them reasoning, restarts on another agent without raising effort, and parks atneeds_foremanwith that reason when no retry applies. A run that still ended with a readable result block stands (issue #172). - A failed land check told the foreman the start of its output, cut to 500 bytes, which was often noise. The event now keeps the end of the log, where the failure is, and names the land job whose log
check_logreads (issue #180). - A task the foreman is already handling no longer shows under NEEDS YOU or raises a banner (issue #166). The task appears in a new
foreman_holdslist, and atask_unattendedevent announces a park the foreman will not handle, once. - A worker under a limited shell scope could decide it had no shell and stop: the worker prompt now names the commands in scope, and says that a refusal covers one command, not the shell (issue #167).
- A done foreman turn that swallowed a plan's
changesverdict left the plan parked with no explanation. Aplan_verdict_unansweredevent now names the plan, the round and the turn, and the needs-you entry heads its findings with the same turn (issue #164). scripts/land-ready.shno longer reads a CI job that GitHub never gave a runner as failed CI. It reruns the failed jobs and waits, up to three attempts, then holds and says why. The gate now writes, soghneeds write access to Actions (issue #168).- Two flaky tests:
TestInitCodexDiscoverySafetyandTestRunnerToolCallSuspendsStallClockno longer fail on a busy machine (issues #175 and #179).
v1.1.0-rc.1
Release candidate of 1.1.0, with the same code as 1.1.0. See the [1.1.0] section for what changed since 1.0.0.
v1.0.0
Changed
-
brigada inituses a repository's sole git remote whatever its name, prefersoriginwhen several exist, and accepts--remote NAMEto select another (issue #102). Client commands use the same default and resolve SSH aliases through the configured hostname.diffandlandfetch from, andlandnames in its printed push command, the remote whose URL matches the project (--repoincluded),originpreferred; when no remote matches, they useorigin, else the only remote.removelists and names the remote it derives the project from. -
A runner restart drains instead of cutting the running jobs (issue #75):
brigada initandbrigada agents add— which now restarts the runner itself instead of telling you to stop and start it — ask the runner to take no new lease, finish its running jobs, exit and start again, andbrigada statusshowsrunner restarting after N running jobswhile it waits.--nowon either cuts the running jobs instead. -
A provider outage no longer spends restarts (issue #71): a CLI that cannot reach its provider — it cannot connect, cannot resolve the host, or the connection is refused or reset — before it produced any message or tool call fails with the error kind
infra, which never counts against the agent. Work, fix and plan-review jobs that fail on infra are requeued on a backoff of their own (1, 2 and 5 minutes, then every 15) for up to three hours, the task keeping its state and spending no restart, round, foreman wake or agent health; a spent window parks the task, or holds the plan review, with the reason naming the outage. A foreman turn that fails on infra keeps its wake armed on the same backoff and raises one needs-you entry when the window is spent.brigada statusand the QUEUE section ofbrigada topshow a waiting job astask #4 work: retry in 5m: could not resolve github.com. -
The interactive foreman is
brigada attach: it joins the brigada-owned foreman session, so your chat and the headless turns are one transcript, and it runs in the foreman's reading checkout with your own harness config and user-scope MCP servers;attach --model M --effort Eoverrides the project's foreman choice for that chat alone. Mode A — your own harness session as the foreman, wired bybrigada init— is retired:brigada initwrites.brigada/project.yamland.brigada/operator.mdand nothing else, and a rerun orbrigada removestrips an older init's wiring. Theholdcommand,brigada mcp --foreman, the settingshold_idle_minutes,hold_max_minutesandinteractive_quiet_minutes, and the toolshold_acquire,hold_yieldanddecision_noteare gone;brigada hold yieldandhold confirmremain as no-ops so old hooks do not block. A repository whose.mcp.jsonstill carries an older init'sbrigadaentry must drop it (brigada remove, or a rerun ofbrigada init), or the twobrigadaservers clash. -
A fix round whose CLI fails for a transient reason — a quota error, an authentication error, a server error, a lost runner — is retried once instead of parking the task (issue #41): the author's session resumes on the author's agent when it can still take it, else the round runs fresh on another agent of the tier with the round's feedback (the check output or the review findings) in its prompt. A second transient failure, or a failure that is not transient, parks the task for the foreman.
-
With
land_targetset, a new task's work starts from the land target instead of the default branch (issue #59): its worktree is built on that branch and its land job diffs against that base, both atplan_createand for a taskplan_amendadds. A plan task may also depend, by id, on a landed task of another plan of the same project when its work is on the land target — done and pushed there: such a dep counts as done from the start, no edge waits on it, and one landed on another branch, not pushed, not landed, or belonging to another project is refused with the reason. -
The
Co-Authored-Bytrailer of a landed task carries the vendor's conventional noreply address for all five shipped model families — anthropic, openai, moonshot, deepseek and zhipu — instead of anthropic alone; any other family (google, alibaba, meta, mistral, xiaomi, meituan, nvidia, or opencode's unknown default) still gets the model name alone and the missing address is still reported (design §7.1). -
An agent that is cooling is unavailable, however soon its reset (issue #112): the asked tier no longer waits out a cooling of an hour or less, and the dispatch falls back at once to the closest tier with an available agent, one tier up first, then down, where the usual cost/score ranking picks. A busy-but-ready agent still holds the job for a free slot, and only when no tier has an available agent does the job wait, for the earliest reset. The session affinities follow the same line: a continued dep's session and a re-review's reviewer resume only on an agent that is ready, and a retry's reviewer exclusion holds only while another reviewer is not cooling.
-
review.family(issue #126), a new engine config key:prefer(the default) orrequire. Behavior change: reviews no longer wait for another model family under the default — they go to another family when one is available, else the same family or the author's own agent (labelledsame_familyorsame_agentin history);review.family = requirerestores the old wall.brigada initfollows it: with fewer than two review families,preferprints a warning naming the fallback and reports ready without--accept-limited;requirekeeps theLIMITED SETUPstop and the acknowledgement. Its intro, workers step, Reviews line and completion text,--accept-limitedhelp, and the user docs state the effective policy. -
The review placement is visible (issue #126): the history of a review's
job_agent_pickedevent names the placement kind the lease recorded —cross_family,same_family,same_agentorunknown— with the reviewer's agent, inbrigada historyand the history tool;brigada statusshows a leased review's placement beside its reviewing task or plan when it issame_family,same_agentorunknownand leavescross_familyunsaid; a review verdict or park from a non-cross-family review names its placement once in the needs-you reason, the foreman's wake text and the notification, while a review no one has leased names its unservable reason, never a placement.docs/design.md§6.2, §7, §7.2, §8 and §13.1 and the glossary describe thereview.familyrule (preferorrequire) and its three steps. -
The plan-closing rule counts a land-gate hold as a landing still to come (issue #133): a done task held at the land gate keeps its plan open until the user releases the hold and the landing settles, by its land job or by its trailer on the branch, instead of the plan closing under "waits at a gate". A hold on the push of a landing already recorded is a waiting push: the plan may close over it, named under "waits to push", and every path that settles a landing or a hold — the land job's outcomes, a hold release or rejection, the trailer detection — re-evaluates the close. A landing the user rejects (
brigada land reject) closes a plan the hold kept open, the done report naming it under "landing declined". -
Worker and reviewer roles no longer fall back to the text embedded in the binary at run time (issue #119): a role with no row in the store runs on the contract alone, and a row recorded empty is empty by choice; the standalone
review --branchresolves its reviewer and worker texts the same way.
Fixed
-
With
land_targetset, the foreman's reading checkout (headless turns and attach) and the plan reviewer's worktree read the land target instead of the default branch (issue #122), so a plan review finding no longer goes stale against work that landed there. A land target the remote does not hold yet falls back to the default branch, and the foreman's opening prompt and the plan reviewer's prompt name the ref read and the default branch, with the fallback noted. A standalone branch review keeps the default branch as its diff base. The foreman and plan review grants carry the default branch beside the land target as their base ref, and the attach result carriesland_target; the plan review template moves to version 4. -
A Codex reset time at or within 15 minutes before the limit message now cools the account for two minutes instead of rolling the reset into the next day or year (issue #114).
-
brigada initresolves SSH origin aliases throughssh -Gafter confirmation and accepts--repoas a full URL or, with an SSH origin, a canonical identity (issue #102). Registration stores the canonical identity and a usable transport. -
A model the provider rejects for the account, or that does not exist (a 400
invalid_request_error), was retried and probed as if the agent were flaky (issue #82). It now has the error kindmodel: the engine marks the agent broken with the provider's words, never probes it, and onlybrigada agent resetor removing the agent clears it; the needs-you line names the model and points atbrigada agents, and a review whose reviewer's model was rejected is requeued without spending its no-verdict retry. An error codex prints beforeturn.startedis a startup notice and reads as a warning, not the job's error;turn.failedstays the final verdict. -
An amendment sent while a plan review round ran was refused, and an
approveverdict woke nobody, so the change was lost until you asked again (issue #84).plan_amendnow accepts it: the running round judges the plan as it was queued, the added and respecified tasks wait as the plan's amendment work, and the round's verdict —approveincluded — queues the next review round over them.brigada statusshows the waiting amendment under the plan. -
An authentication break on dsh, whose key comes from the environment, re...
v1.0.0-rc.5
Fifth release candidate of 1.0.0. The binary changes since rc.4, so this candidate restarts the quiet period before 1.0.0. Since rc.4: role instructions and task skills — .brigada/project.yaml maps a file per role and names a skills_dir, brigada init writes the shipped defaults and --take-default resets one, brigada instructions diff diffs a file three ways, and every prompt runs on the texts and skills recorded when the task was made, never on a text embedded in the binary (#119, #117); reviews prefer a reviewer from another model family, the review.family key prefer or require, with the placement named in status and history (#126); opencode can be the foreman (#152), and the README's agent-setup prompt sets brigada up through your own coding agent; a done task held at the land gate keeps its plan open and land_retry re-queues a parked landing (#133), a plan once closed over live work reopens once at start-up (#137), a land_ready hold re-checks itself and releases once the gate passes (#142), and a plan whose tasks can never land stays open and says so (#122); brigada task retire settles tasks that will never land (#140); the sweep, a heartbeat and the retention prune ride out a busy store (#135); the foreman's file tools read only its checkout and its issue_read answers an issue or pull request (#131); brigada project import reads .brigada/skills when no skills_dir is named (#146); scripts/land-ready.sh waits for green CI on the staging head (#128) and the land check runs gofmt, guard and vet before the tests (#132); brigada version of a build from a modified tree no longer passes a pseudo-version off as a release; CI runs the engine's race tests in new shards with a cached build, and three flaky runner tests are fixed. The changes are listed under Unreleased below.
v1.0.0-rc.4
Fourth release candidate of 1.0.0. The binary is unchanged from rc.3; this candidate runs the new release steps once before 1.0.0. Since rc.3: each release file carries a build provenance attestation, checked with gh attestation verify (#96); install.sh installs a verified release binary without sudo (#86), and a release tag without a suffix updates the Homebrew tap, brew install blackfire-ai/tap/brigada (#85), which a release candidate such as this one leaves alone; a test holds docs/COMPATIBILITY.md to the binary, and --now on init and agents add is frozen (#95); the README says what the cross-family review is measured to do (#92); test helpers no longer outlive a test binary that timed out or was killed. The changes are listed under 1.0.0 below.
v1.0.0-rc.3
Third release candidate of 1.0.0. Since rc.2: a restart drains the runner instead of cutting its running jobs, an auth break on dsh names the missing variable, and a harness's credential can come from the keychain or a mode-0600 file (#75); a provider outage rides an infra backoff of its own and shows in brigada status (#71); a model the provider rejects breaks the agent until brigada agent reset, and a codex error before the turn starts is a warning (#82); an amendment sent while a plan review round runs is kept (#84); land_ready gates each landing on a command, and the repository ships scripts/land-ready.sh, which waits for green CI on brigada/landed (#87); every install path prints a real version (#79). The changes are listed under 1.0.0 below.
v1.0.0-rc.2
Second release candidate of 1.0.0. Since rc.1: with land_target set, new tasks start from the land target and may depend on landed tasks of other plans (#59); a plan review's changes verdict parks the plan at needs_foreman and its findings are kept whole (#66, #70); a Z.ai limit reset is read in its own zone (#54); the foreman's report is no longer cut at 500 bytes (#52); a landed commit's subject comes from the worker's commit message (#48) and its Co-Authored-By trailer carries every shipped family's address (#74); the foreman's task size guide and the plan review's size check (#50); brigada init writes .brigada/operator.md, the guide for your own coding agent (#73); CI runs the race tests in shards. The changes are listed under 1.0.0 below.