Releases: codewandler/flux
Release list
0.59.3 - 2026-08-08
Release Notes
flux-cli 0.59.3
Install flux-cli 0.59.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codewandler/flux/releases/download/v0.59.3/flux-cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/codewandler/flux/releases/download/v0.59.3/flux-cli-installer.ps1 | iex"Download flux-cli 0.59.3
| File | Platform | Checksum |
|---|---|---|
| flux-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| flux-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| flux-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| flux-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| flux-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
codewandler-flux-lsp 0.59.3
Install codewandler-flux-lsp 0.59.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codewandler/flux/releases/download/v0.59.3/codewandler-flux-lsp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/codewandler/flux/releases/download/v0.59.3/codewandler-flux-lsp-installer.ps1 | iex"Download codewandler-flux-lsp 0.59.3
| File | Platform | Checksum |
|---|---|---|
| codewandler-flux-lsp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| codewandler-flux-lsp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| codewandler-flux-lsp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| codewandler-flux-lsp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| codewandler-flux-lsp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.59.2 - 2026-08-08
Release Notes
Backfilled after the fact (C-743). This section was cut empty over 9675 insertions because
scripts/cut-release.sh rolls ## [Unreleased] into the version heading and [Unreleased] was
empty: story workers are fenced out of CHANGELOG.md — correctly, since two stories each appending
an entry once made a wave unintegrable — and nothing downstream of that fence composed one. The tag
and the binaries were always right; only the prose was missing.
Added
-
A datasource connects from where its endpoint is reachable (C-716). A host binding says where
a connection is made from, an endpoint says what is connected to, and a datasource is the
governed read over that composition — but nothing tied a datasource's connection to the substrate
its endpoint is reachable from.LiveAccessgains aLiveLocalityofAnywhere(the default and
today's behaviour) orHost(<binding id>), copied from the endpoint's ownhostanswer rather
than re-derived, so the datasource cannot disagree with the record it reads. The refusal happens at
admission: the generated<domain>.list/.getand the eleven board operations check the declared
locality against the session's selected binding before entering the backend, and name both the host
the endpoint needs and the host the session has.live_connection_systemand
board_connection_systemhand the backend the substrate its declaration names, and a host-bound
domain registers asSelectedExecutionSystemrather thanNativeSystemOnly— hiding it under a
selection would refuse it without ever naming the host it needs. A blank host, or a declaration
naming two of them, is refused at contract validation, because one session selects one substrate
and such a backend could never be satisfied.flux-codegategains the live-backend census: every
shippedLiveDatasource/WorkBoardimplementation is enumerated and a backend that builds its own
HTTP client, database connection or socket is a red gate — unlike the direct-IO gate, no annotation
excuses it, because a self-built client cannot follow a selection. An endpoint with nohostis
unchanged: no admission runs and the backend receives the same system it does today. -
flux ops --explorebrowses every operation flux can run (C-643). Operations are what flux
actually does, and there was no way to see the whole catalog. The explorer opens a start screen and
fuzzy-searches it: a ranked list on the left, and on the right what the selected operation does,
its parameters, its risk and its documentation links, with a node-constellation pictogram and a
category filter on Tab.ops_docs.jsoncarries the documentation index, covered by
crates/flux-cli/tests/ops_doc_index.rs. Recovered work: it was found uncommitted in a worktree
whose branch had already been merged for unrelated build-cache work, and it was committed at its
original base — 215 commits behind main — so the authorship stayed separable from the conflict
resolution. The index was then regenerated against current documentation, sincefleet.isolate,
git_worktree_enter,http.request,web.crawlandweb.fetchhad each gained a referencing
page since that base. -
Immutable causal resource-usage receipts (C-575). Token counts and wall time lived in unrelated
surfaces and nothing tied either to the request that caused them, so "what did producing this
result actually consume?" had no answer that survived two concurrent workers.flux_events::receipt
is the ledger the rest of the resource-accounting epic reads from: small immutable spans forming one
causal tree per request/result, carrying root/span/parent, the causal binding (agent, session,
worker, wave, repository,BoardRef, assignment revision), timings with clock precision,
measurements, money, coverage, freshness and an optional correction identity. A 36-dimension
catalogue spans every family the design names, each with a stable wire name and a unit;
measure_model_callstates everyUsagetier, because a tier missing from a receipt is not the
same fact as a tier reported at zero. Absence is typed rather than zeroed and enforced at the
builder, so an in-process library can never report child-process CPU it does not have. Receipts
ride aresource:<root-id>ad-hoc stream onEventKind::Custom; the event id is the receipt id,
derived from (root, span), so an at-least-once pipeline replaying a span gets back the receipt
already recorded, and the return value is always decoded from the log rather than from the
argument.span_treefolds by explicit parent links and yields every receipt exactly once,
promoting an orphan or a cycle member to a root rather than dropping it and understating the bill.
Money stays separate from physical measurement, and an unpriced dimension carries no charge at all
rather than a$0one. Retention gains the matching row: a receipt is the measurement itself and
cannot be re-derived once the work is over. Nothing produces receipts yet — the model-call seam,
the guarded transport, the guarded process runner and the tool dispatcher are not instrumented;
this is the ledger and its conformance suite.
Fixed
-
A wave is applied only when the canonical ref contains its commits (C-721).
appliedis the
fleet's word for "this work is delivered", andapplywrote it from intent: it tagged each
accepted candidate and then set the status unconditionally, having never once read the ref it was
making a claim about. wave-649 carried that claim while it was false in every sense that matters —
its repository declarescanonical_ref = "origin/main", a remote-tracking ref only a push can move
and the fleet never pushes — and the product then contradicted itself:fleet statusreported it
applied whilefleet applyrefused it for having no green gate andfleet integraterefused it as
not ready. Each accepted repository's canonical ref is now re-read from git after the tags are
written, and the wave becomesappliedonly where every one of them is observed to contain the
candidate, asked ofmerge-base --is-ancestor; a question git declines to answer is never read as
delivery. A gated, accepted and pinned wave that has not landed becomesawaiting-delivery, which
claims exactly what happened, and re-runningapplyre-asks the question. A remote-tracking
canonical ref is named as such, with the reason travelling into the report, the warnings and the
durable event.--dry-runreports no verdict rather than a default one.fleet doctorgains
applied-without-delivery(naming wave, repository, stranded story and the exact missing commit)
andapplied-without-green-gate, andflux fleet reopen <wave> [--reason]is the supported path
back — it refuses a wave whose status claims no delivery, refuses one whose refs really do hold its
candidates, and derives the status it restores rather than choosing it. -
A story worktree's uncommitted work is reported, never swept (C-722). wave-745 died overnight
with a 531-line failing-first specification sitting untracked in its story worktree, and three
independent mechanisms agreed the work did not exist:handoff --from-worktreederives its write
set frombase..HEADand could not see an untracked file,doctorreported the branch as
branch-without-unique-work, and the fix doctor prescribed wasreclaim— the command documented
to delete worktrees that provably hold no work. Uncommitted is the normal state of an interrupted
worker, and treating it as absence is what turns an interrupted turn into lost work.fleet doctor
gainsstory-worktree-holds-uncommitted-work, naming the worktree, wave, story and file count from
git status --porcelain -uall(the default collapses an untracked directory into one entry, so one
stray file and a whole afternoon read the same), and it takes precedence over
branch-without-unique-work— both fire on exactly that state and prescribe opposite actions.
Reclamation's refusal now says which of its two conditions it found. Andflux fleet capture <wave> [--item BOARD/ITEM]commits what an interrupted worker left onto that story's own branch: it
stages everything except Fleet's own loop-binding snapshot, refuses a detached or reassigned HEAD,
and reports a commit only after re-reading the head and the worktree. The check is deliberately not
filtered by wave status or worker liveness — mid-turn is the window in which the host dies, and a
check that stayed quiet until the turn ended would have said nothing about the one wave it exists
for. -
The driver verifies an already-built signal before it withholds (C-723). A drive tick with
eight free slots and nine ready items dispatched one, and its reasons were wrong in both
directions: two unbuilt stories left the schedulable pool asalready-builtwhile the single item
it sent was the one whose implementation genuinely existed.already-builtwas never a fact the
driver established — it was membership inboard reconcile's finding set, and reconcile fires
implementation-landedon any commit that merely names an id (C-718). Withholding is the
strongest action a tick takes and the only invisible one, so it was the last place that heuristic
belonged. Each actionable finding is now verified against the story it claims to have implemented,
through four gates: a wholly unticked Acceptance outranks a commit that mentions the id; every
symbol and path the story's Acceptance names must be present in that member's checkout, found
outside Markdown and outside comments (absent is conclusive and releases the item, present is weak
and only fails to veto); an artifact the tree could not be asked about has not said yes; and a
finding with no artifact and no reviewer behind it is a guess, and a guess dispatches. A signal that
fails ve...
0.59.1 - 2026-08-08
Release Notes
Added
- An endpoint records the host it is reachable through (C-709).
EndpointRefrecorded url,
product, credential_ref and labels and nothing about locality, so a ClusterIP endpoint looked
identical to a public one — a cluster-internal name is meaningless on a laptop and exactly right
inside the cluster, and the record could not tell the two apart.EndpointRefgains
host: Option<String>, the[[host]]binding id the endpoint is reachable through; absent means
"reachable from wherever the caller is", which is every endpoint declared before this field
existed, so the wire and store forms skip the key and old records read back unchanged.
[[endpoint.static]]may declarehost = "k8s-dev",flux endpoint addtakes--host, and
list/show/resolverender it —resolvenow answers "from where" alongside the credential
location it already answered "as whom" with. Naming an undeclared binding is a load-time error
naming the endpoint, the binding and the ones that do exist, not a dial-time surprise: malformed
entries stay warn-and-skip, but this one is fatal because skipping it would leave the endpoint
reachable-from-anywhere, so a typo'd binding name would silently widen where it is dialled
from.StaticResolvercarries the session's selected binding and refuses a host-bound endpoint
from any other position, naming both, before any credential is materialized. An unbound endpoint
resolves exactly as before.
Fixed
-
A tag build that publishes nothing is now red (C-719). v0.59.0 was tagged and its Release
workflow reported success while creating no Release at all: no binaries, no attestation, no
image, no announcement. GitHub propagatesskippedtransitively throughneeds, so the chain
has to be broken at every hop rather than only the first —hostalready broke it with
always(), but the jobs below did not, so a correctly skippedbuild-local-artifactsflowed
through a successfulhostand took attest, publish-github-release and publish-container-image
with it. Those three now usealways()and assert their upstreams actually succeeded, which
admits a transitively-skipped graph but never a failed or skipped dependency, and
verify-publishedfails the run when the ref was publishing and no Release was created. -
The plugins workspace resolves against flux-evidence 1.2.0 again (C-719). The release bump
movedcodewandler-flux-evidenceto 1.2.0 whileplugins/Cargo.lockstill pinned 1.1.0, so every
job that resolves that workspace with--lockedrefused outright. That took down three CI jobs at
once — the plugins workspace fetch, andplugin_builds_exclude_host_only_cratesin both the
sandboxed and unsandboxed test jobs, which resolve the same workspace. -
codewandler-flux-evidencemoves to 1.2.0 so its published API matches its users (C-143).
crates.io publication of 0.59.0 stopped atcodewandler-flux-flow, which references
flux_evidence::KIND_BUDGET_PROJECTION— a constant that exists in this workspace but not in the
published flux-evidence 1.1.0. The constant predates v0.58.0, so the release-tag comparison never
flagged it: a protocol-line crate can drift from its published self without any diff against the
last release showing it. Already-published crates are skipped on re-run, so the remaining closure
resumes from this fix.
flux-cli 0.59.1
Install flux-cli 0.59.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codewandler/flux/releases/download/v0.59.1/flux-cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/codewandler/flux/releases/download/v0.59.1/flux-cli-installer.ps1 | iex"Download flux-cli 0.59.1
| File | Platform | Checksum |
|---|---|---|
| flux-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| flux-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| flux-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| flux-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| flux-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
codewandler-flux-lsp 0.59.1
Install codewandler-flux-lsp 0.59.1
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codewandler/flux/releases/download/v0.59.1/codewandler-flux-lsp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/codewandler/flux/releases/download/v0.59.1/codewandler-flux-lsp-installer.ps1 | iex"Download codewandler-flux-lsp 0.59.1
| File | Platform | Checksum |
|---|---|---|
| codewandler-flux-lsp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| codewandler-flux-lsp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| codewandler-flux-lsp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| codewandler-flux-lsp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| codewandler-flux-lsp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.58.0 - 2026-08-07
Release Notes
Added
-
Time and token spend now has one target-versus-limit vocabulary from the runtime to the screen
(C-542).BudgetEnvelopecarries a soft target beside a hard limit for wall time, model calls and
input/output/total tokens;BudgetUsageEventattributes measured spend to run, session, turn and
loop segment; andBudgetLedgeris the only accountant — a repeatedevent_id, a pre-summed child
rollup and an ancestor's spend are each ignored with a distinct reason, so a total is never doubled
and elapsed wall time folds as a maximum instead of a sum. The engine host charges every model call
and clock sample once and publishes abudget.projectionobservation; the adaptive stage enforces a
hard limit at its safe boundary after charging the round that just finished, so a call still in
flight is never reported stopped.--turn-budgetis now expressed in that vocabulary as a
turn-scope hard limit. The TUI header renders a live spent-versus-declared segment and the CLI
prints the crossings: a crossed target warns once and execution continues, a crossed hard limit
stops with a typed scope, dimension, spent and limit. No surface recalculates totals, which is the
same contract C-571's durable Fleet reservation/settlement ledger consumes. -
flux fleet statusandflux fleet dashboardare now bounded projections (C-562). The
defaultflux.fleet-status/v1view reports main state, active/attention/settled worker counts,
wave and item state, exactBoardRefs, repositories, current sessions, last transition/error
summaries and the current revision inside a reviewed fixed byte budget, instead of copying
retainedlast_turnreceipts, intake receipts and historical event arrays into the default
output — the shape that reached 2,694,752 bytes on the 2026-08-05 roadmap dogfood run. Redaction
runs before budgeting, oversized values and trimmed arrays become payload-free
flux.fleet-status-omitted/v1records, and detail stays behind the explicitly bounded
flux fleet inspectroute. Status and the TUI dashboard now share one worker-liveness
derivation, so a completed, failed, cancelled or interrupted process is never counted as active
because a stale receipt saidworking, while a delivered continuation is not settled by the
receipt of its previous turn.
Fixed
- A worker is granted the toolchain bundles its assigned repository actually surfaces, not the ones
the coordinator's own root happens to reveal, so a wave dispatched against one repository no longer
offers its writer a toolchain that is not there (C-605). - Operator permission denials and disabled tools now reach every sub-agent, descending through nested
delegation for the same reason a resource ceiling does (C-612). - The Board pane renders items as collapsed boxes grouped by status and ordered as
board nextorders
them, paging to the selection so the rows built stay bounded by terminal height rather than by board
size (C-620).
0.57.0 - 2026-08-06
Release Notes
Added
-
A native workspace Board is now the complete cross-repository program authority (C-588).
A default.flux/board.tomlbinds member repositories and canonical refs, active milestone,
ordered program lanes, cross-repository dependencies, configured waves and planning documents.
Plainflux boardauto-selects it;board nextandfleet scheduleconsume the same validated
projection and never admit an unrelated ready story when a program catalogue exists. Board
planning config, Fleet execution config and mutable Fleet state now have disjoint schemas and
ownership, accepted decisions no longer surface as open attention, and workspace metrics report
real program stories, milestone lanes, waves and members instead of legacy placeholders. -
flux tui --fleet[=ROOT]is a native Board/Fleet operations surface (C-556, C-557, C-582).
Explicit attachment validates one Fleet root, opens the reserved main coordinator's isolated
store and exact recorded session, and journals conversation intake through accepted, delivered,
and completed/failed acknowledgements. A typed in-process projection supplies a responsive
attention rail plus bounded Overview, Board, Workers, Decisions, and Stats views from the same
durable readers and exactflux.board-stats/v1cube as the CLI; it does not capture ANSI, scrape
tmux, or spawn CLI subprocesses. Refresh keeps the last-good snapshot on failure. Only explicit
intake and a twice-confirmed open-decision choice may mutate state; push, release, deploy,
Fleet-apply, cleanup, and capacity changes remain outside the TUI. Desired/draining capacity is
shown as unavailable until canonical Fleet state carries it. -
The attached Fleet main now has a closed coordinator runtime instead of an ordinary coding
agent catalog (C-556). Fleet config binds an explicit operator-authored Flux-Lang loop; each
turn supplies only the current request and a bounded native Board/Fleet catalog, bypassing the
generic intent/explore and retained-history budget path. The parent can manage Board and Fleet
state or start onetask; that child uses a separately configured host-authored loop and an
independently closed read-only research catalog with no genericcreate_plan, shell, edit,
git-write, Board/Fleet mutation or nested delegation authority. Missing or invalid main/research
loop config refuses at startup instead of silently widening behavior. -
Every runnable agent now has a resolved, versioned loop binding (C-569). General omission
resolves to the explicitadaptive@1preset; CLI/SDK, role, nested-task, app and served starts all
cross the same validation boundary. Start, status, stream and terminal receipts carry bounded
profile/revision/source-digest/runner metadata, while resume reconstructs digest-addressed source
and refuses a live-session switch. Fleet task kinds resolve through operator-authored loop policy,
validate against the admitted capability ceiling, and snapshot exact source for message, restart,
resume and rework.fleet.runreceipts now also return admitted worker ids and wave linkage.
Changed
- Board and Fleet public docs now define the complete domain model. Concepts appears before
Coding, and the guides distinguish epics, stories, milestones, program lanes, configured waves,
dispatched wave instances, workers, handoffs, review, gates, apply and release. Compact diagrams
show story states, eligibility, isolated worktrees, review/rework and the separate publication
boundary.
Added
flux fleet reclaim [wave]reclaims a finished wave's build output, and its worktrees when they
provably hold no commit and no uncommitted change. Reclamation previously ran on acceptance alone, so
every wave that ended any other way — cancelled, parked, conflicted, gate-red — kept its target
directories and checkouts for as long as the fleet root existed. Disk is what caps how many workers can
run, so those are not free: the first run on a real fleet removed 47 stale worktrees and retained the
two that held work. Cancelling a wave now reclaims it in the same step. A wave that can still advance is
refused rather than reclaimed, since deleting a build it is about to use would cost work rather than
space.
Changed
- A Fleet agent no longer pays disk for incremental compilation it can never reuse. Each story gets
a fresh worktree and a fresh target directory that is discarded when the wave is reclaimed, so
incremental artifacts were written and then deleted without ever being read — roughly half of a
checkout's build output. Disk, not model concurrency, is what caps how many workers can run, so this
is directly a width change.CARGO_INCREMENTALalso joins the forwarded environment allow-list,
without which the variable was dropped between the agent process and thecargoit runs and setting
it had no effect at all.CARGO_TARGET_DIRis deliberately not forwarded: it is a path, and one
shared target directory is locked exclusively by cargo, which would serialize the parallelism the
fleet exists to provide. An operator's own rebuilds keep incremental compilation. flux board createcommits the document it creates, path-scoped, with--no-committo opt out.
Items are resolved at a git ref wherever a board is federated — a workspace member's stories are read
withls-tree/showat itscanonical_ref— so an uncommitted document is invisible to every read
that matters. Twenty-seven stories were filed, reported as created, and could not be scheduled: the
command had succeeded and nothing had happened. The commit names exactly the new path and never sweeps
in unrelated dirt, it goes to the current branch rather than a side branch (a side branch would
reproduce the same invisibility), it does nothing outside a git repository, and it refuses rather than
committing into an in-progress merge or rebase. The reported envelope carries the commit sha.
Fixed
Added
- A repository may declare a
preparestep that regenerates its candidate's derived artifacts before
the gate. Some checked-in artifacts are derived from a whole wave rather than from one story — a
documentation mirror, a generated index — and they belong to the candidate, not to any story. Two
stories regenerating one artifact collide, and regenerating it on either branch alone produces an
artifact missing the other story's contribution. Observed on a real wave whose gate refused the
candidate withembedded docs are stalewhile both stories were correct in isolation. The step runs
once, after every cherry-pick for that repository and before its gate, and whatever it regenerates is
committed into the candidate so it survives into the accepted tag. A preparation failure is recorded as
that repository's failure rather than surfacing later as the stories being wrong.
Fixed
- Accepting a candidate no longer requires the repository to have stood still. Two refusals were left
over from when applying MERGED the candidate: a merge has to land on the base it was tested against and
it touches the working tree, so a moved canonical ref and a dirty checkout were both real hazards.
Acceptance now writes an annotated tag on the candidate and nothing else — it does not read the working
tree, moves no branch, and cannot be invalidated by unrelated commits arriving on the canonical ref.
Keeping the checks cost a green wave: one passed both repository gates and was then refused with "moved
from its pinned base" because ordinary work had continued during the hours the wave took, which means the
longer a wave is worth accepting the more certain it becomes that it cannot be. The invariant that does
matter is still enforced — the candidate branch must point at the commit that was gated — and the base it
was gated against is now recorded in the acceptance entry, because the later step that writes the
canonical branch has to re-gate against whatever that branch has become. Acceptance is not landing. - A concurrent write no longer throws away an entire integration. Integration is the longest operation
the fleet performs — cherry-picks, candidate preparation and a full repository gate, tens of minutes from
cold — and it writes state several times along the way. Any coordinator write inside that window lost the
compare-and-set and discarded the whole run: one real integration died onstale fleet revision 428; current revision is 429after both gates had already produced their verdicts. Each of those writes now
rebases onto current state, which is safe for the same reason it is safe for dispatch: the call replaces
the record of exactly one wave, and that wave is owned by the integration for its duration, with the
ownership recorded. - A retry no longer re-judges a repository whose candidate is already accepted. Acceptance is the end of
that repository's road — its candidate is pinned by a tag and nothing later in the wave can improve it —
so re-gating it spends the pipeline's longest operation to re-derive a known answer, and a re-gate that
came out red would make accepted work read as failed. Stale preparation evidence is cleared too, so a
retry cannot report work it did not do. - Reclamation no longer removes a worktree an unfinished wave still needs. Build output is regenerable
and always goes; a worktree is structure, andworktree_holds_workanswers "does this contain work?"
rather than "is this still needed?". Reclaiming a wave whose worker turn had failed therefore removed its
integration worktree — legitimately empty and at its pinned base — while a story worktree in the same
wave held 940 uncommitted lines, leaving the wave with deliverable work, nowhere to assemble a candidate,
and no operation able to rebuild the missing structure. Worktrees are now removed only for a wave ...
0.56.0 - 2026-08-05
Release Notes
Added
-
Boards and the local coding fleet are now first-class agent automation surfaces (Decision
0010; C-547, A-134, L-130, C-548–C-551, C-242, C-244, C-245, A-117).flux boardexposes
session, repository and workspace scopes; general, planning and execution profiles; Track,
session, Markdown, memory and federated backends; vision, roadmap, decision and design documents;
deterministic Track rendering; and the exact current/history metric cube.flux fleetexposes
durable local sub-agent scheduling, acknowledged control, bounded inspection, handoff/rework/gate
records and explicit local-only apply. Both families share theflux.cli/v1JSON/NDJSON contract,
optimistic revisions, idempotent mutations, dry runs, schemas and concise rendered Agent Skills.
BoardId,BoardRef, independent scope/profile/backend contracts andBoardRegistryare public
through the datasource/capability/SDK seams, and Flux-Lang has a first-class closedboard
declaration. The new Coding / AI-assisted development documentation ties the complete workflow
together for humans, Claude and Codex. Neither fleet run nor apply pushes, publishes, releases,
deploys or automatically deletes worktrees. -
Autonomy is now a named posture rather than an absence of safety (C-463).
flux_runtime::AutonomyPosturenames four choices —supervised,bounded-autonomy,
exploratoryandrefusing— and each one selects its approval stance, sandbox floor and budget
together as a single coherent value, instead of leaving them to three independently settable
flags. That coupling is the point: a posture that set approval without also setting confinement
would be C-444's bug with a nicer name. Selectable as--postureon the CLI and
ClientBuilder::posture()in the SDK.--yesandauto_approveare unchanged and map onto
bounded-autonomy; contradictory combinations are refused rather than silently resolved. The set
is a fixed four with no builder — deliberately not an extensible preset generator. Authorization,
guarded IO and evidence recording are invariant across all four, asserted by tests that drive the
same ungranted operation and the same workspace escape through every posture, including those
whose approver allows everything. Each posture documents what it does not protect against, and
no surface presents an autonomous posture as degraded. -
flux reviewnow shows live progress while its built-in review flow runs (C-530). The CLI can
render an interactive reviewer tree, append-only summaries, or no progress via
--progress auto|tree|plain|off; progress stays on stderr so Markdown and JSON reports remain clean
on stdout. The SDK's shared sink-backed flow runner forwards both direct operation events and
correlated child-agent activity without bypassing the normal execution envelope. -
flow_runcan execute Flux-Lang supplied directly in its request. The new mutually exclusive
inline_programaddress is parsed and revalidated against the live operation catalog, then runs
through the same session, approval, guarded-IO, input-seeding, and reentry boundaries as stored
names and workspace paths. Inline route receipts report no resolved filesystem path. -
Independent native gather calls from one model response now execute concurrently (C-528).
Model stages and adaptive exploration share one batch scheduler that admits only idempotent,
low-risk, non-mutating calls with explicit read-only effects and an approval-free authorization
verdict. Pre-tool hooks, active cassettes, approval-sensitive calls, incomplete connector
Network-without-Readmetadata, and every captured action remain ordered. Results retain the
provider's call order and ids across completion, refusal, failure and queue timeout; execution
still crosses the existing authorization, approval, cancellation, redaction, guarded-IO and
max_concurrent_tool_callsenvelope. -
A tracked Flux-Lang writer role now authors checked
.fluxsources (C-513).
.flux/agents/flux-lang-writer.mduses the coding profile and an explicit tool allow-list, reads
the repository language contract before editing, and separates parse/analyze checks from an
explicitly requested run through the ordinary guarded runtime. The public agent catalogue now
links every embedded fallback and tracked project role to its canonical source, with a census
test that detects inventory drift. The role narrows delegated capabilities; it does not create a
new authority boundary. -
Flux now embeds the Exchange Service Account client for official integrations (C-503).
Operator-only environment configuration binds one Exchange origin and bearer; its authenticated
effective catalogue is adopted between turns and one-shot operations run through Exchange's HTTP
invokecontract. Exchange retains credential, tenant, connection, grant and runtime authority.
An outage withdraws only Exchange operations, leaves core Flux usable, and never selects a local
or plugin fallback. Streaming, subscriptions, cancellation frames, terminal lifecycle and leases
remain outside this first slice. -
Running REPL sessions can adopt a plugin's refreshed operation catalog at the next turn
boundary (C-318)./plugin-refresh <name>publishes one atomic generation shared by prompting,
validation, authorization and dispatch. Mid-turn and already-running calls retain their original
catalog; withdrawals, wildcard disables, nested runtimes and newly spawned children all preserve
their existing authority ceilings. A refused refresh leaves both the retained plugin and the
published generation unchanged. -
Flux-Lang supports JSON-quoted object keys in field paths (C-320). Expressions such as
$response.headers["content-type"]and their optional?form preserve the existing strict-field
diagnostics, distinguish quoted numeric keys from array indexes, round-trip through the formatter,
and are mirrored in Prism, tree-sitter, TextMate and IntelliJ.
Changed
-
Every Fleet worker turn now retains its admitted capability ceiling (C-565). Template or
ad-hoc admission normalizes named capability bundles into an exact host-enforced operation set
plus mode, writable/read roots and fences. Missing required capabilities fail before a model
turn; message, restart, resume and rework reconstruct the stored contract instead of reloading a
possibly wider template. Nested tasks can narrow but not widen the active scope. Durable state
and receipts expose a bounded capability-set digest and counts without storing the full operation
catalogue, paths or prompt body. -
Fleet story workers now start with assignment-only context (C-566). A new writer gets a fresh
worker-specific store plus its configured writer contract, exact BoardRef, pinned base, branch and
isolated worktree; the main conversation, intake text, Fleet-wide goal set and other assignments
are not copied into its prompt, and sibling repository roots are not mounted automatically. Only
a turn addressed to that worker can continue its session.
Receipts carry a bounded context-origin manifest with assignment/contract digests instead of
prompt content. -
Automatic Flux releases no longer depend on a model provider account (C-251). The release
workflow now runs the host-onlyexamples/release-cut.flux, consumes the reviewed
[Unreleased]notes already in the repository, and preserves the exact version, protocol,
transaction, candidate-receipt and publication gates. Model selection, Anthropic/OpenRouter/OpenAI
credentials and live-provider smoke are absent from the automatic path, and the parsed authority
policy rejects their reintroduction. The candidate gate also fetches the complete locked
dependency graph before its offline architecture checks, including packages used only by other
compilation targets. -
The v0.56.0 release path now runs from the repository's existing Actions secrets without a
dedicated GitHub App, release Environments, rulesets or branch protection (C-559; supersedes the
C-353 configuration proposal and the matching C-354/C-516 identity clauses). Plan, cut, build,
receipt and verification work remains mutation-credential-free.RELEASE_TOKENis scoped
to the isolated core promotion, plugin tag-control and GitHub Release steps; it preflights before
mutation and performs the exact cut, fast-forward main merge, candidate and tag ref pushes so both
tag workflows run. The ambientGITHUB_TOKENowns only exact cut-CI/candidate dispatch and
Actions observation, with repository contents kept read-only. Parsed adversarial
fixtures reject secret scope drift, model/build exposure, ambient-token tag creation, missing PAT
tag triggering, combined publication authority and any restored App/Environment dependency. -
Operation execution placement is now explicit per operation (C-478). The runtime distinguishes
local control-plane work, selected-execution-system effects, and native-system-only effects. Remote
catalogs retain compatible members of mixed packs, hide native-only operations, and repeat the
same fail-closed check at dispatch; unannotated extensions default to native-only remotely while
local execution remains unchanged./toolsreports the incompatibility reason, and a production
census keeps every built-in classification deliberate. -
Fenced Markdown code blocks now carry a structural
▎gutter (C-537). The shared layout
path applies it to every code row, including blank and list-nested rows, so terminal, ANSI, export,
and monochrome rendering identify code blocks consistently without relying on color. -
Every release authority is now scoped to the explicit job and step that consumes it (C-354,
as superseded by C-559). All
four release workflows declare workflow-levelcontents: read; any other GitHub...
0.55.0 - 2026-08-03
Release Notes
Added
- File-configured hosts can now bound delegated fan-out with
[limits] max_live_agents
(C-471). The ceiling counts the root and every transitive child in one shared census, so0and
1both disable delegation and a spawn over the limit is refused immediately. Combined with
max_concurrent_tool_calls, it bounds simultaneous tool execution across the tree at the product
of the two values. Project config overrides user config; an explicit host limit wins over the
autonomous posture preset.
Changed
-
The CLI now reads its compaction fallback from the agent-owned default instead of carrying
three copies of 48,000 (C-466).FLUX_COMPACT_CHARSprecedence,0disabling, and malformed
value warnings are unchanged; changing the shared default now moves CLI, served, SDK, and checked
documentation surfaces together. -
The 48,000-character compaction default is now an explicit fixed history budget, not an
unresolved model-window approximation (C-462). Recorded usage shows whole-request prompt size is
dominated by more than conversation history, and Flux has no trustworthy context-window metadata
for arbitrary local, custom, or evolving model ids. The runtime value and override precedence are
unchanged; code and docs now state that operators should tune the existing per-agent / environment
override when their known workload needs a different retained-history cap. -
Flux-Lang context slicing now has one honest, deterministic token-budget policy instead of two
unused extension points (C-469). It always uses its documented four-characters-per-token
estimate; the host counter argument and both unrelatedTokenCountertraits have been removed.
Removing the public traits and theslice_contextargument is a breaking change for direct
flux-provider/flux-langcallers and therefore a next-minor release change. Production Flux
behavior is unchanged because no provider implemented the capability and the only runtime caller
never supplied a counter.
Fixed
-
Malformed adaptive-stage results now identify their producer instead of blaming Flux-Lang
(C-327). Thedetect_intentandexplorereflect boundaries require a tagged JSON object before
the authored loop reads.kind. Scalar or untagged results halt with the stage name, returned
type, and a bounded executor-redacted excerpt retained in the step trace. -
The plugin hash-drift test no longer copies a whole binary into ambient
/tmp(C-468).
Its writable fixture now lives in a unique, automatically cleaned directory beside Cargo's active
target binary. A staging failure names that directory and its storage cause before any hash check,
so tmpfs pressure can no longer masquerade as a verification regression. -
Malformed
FLUX_COMPACT_CHARSoverrides now warn on served agents as well as the CLI
(C-507). Both surfaces consume oneflux-agentparse/outcome contract: missing, valid, and0
values stay quiet, while an explicit invalid value names the rejected input and shared fallback.
A per-agentcompact_threshold_charssetting still wins without consulting the environment. -
/compactnow reports whether it actually rewrote the conversation (C-465). The REPL no
longer printscontext compactedfor an under-threshold, disabled, unsplittable, empty-summary,
or cancelled check; successful rewrites carry their before/after message counts. The published
FlowEngine::maybe_compactAPI now returnsCompactionOutcomeinstead of(), a breaking change
for directflux-flowcallers and therefore a next-minor release change.
flux-cli 0.55.0
Install flux-cli 0.55.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codewandler/flux/releases/download/v0.55.0/flux-cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/codewandler/flux/releases/download/v0.55.0/flux-cli-installer.ps1 | iex"Download flux-cli 0.55.0
| File | Platform | Checksum |
|---|---|---|
| flux-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| flux-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| flux-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| flux-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| flux-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
codewandler-flux-lsp 0.55.0
Install codewandler-flux-lsp 0.55.0
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codewandler/flux/releases/download/v0.55.0/codewandler-flux-lsp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/codewandler/flux/releases/download/v0.55.0/codewandler-flux-lsp-installer.ps1 | iex"Download codewandler-flux-lsp 0.55.0
| File | Platform | Checksum |
|---|---|---|
| codewandler-flux-lsp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| codewandler-flux-lsp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| codewandler-flux-lsp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| codewandler-flux-lsp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| codewandler-flux-lsp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.54.4 - 2026-08-03
Release Notes
Fixed
- The public Plugins and Direction sections now state the connector-native destination (C-501).
The signed first-party plugin pack is labelled as today's compatibility path, the Direction
sidebar exposes the migration program, and the new page records ownership, current limitations,
parity gates and the rule that generic plugin support may remain after vendor crates move.
flux-cli 0.54.4
Install flux-cli 0.54.4
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codewandler/flux/releases/download/v0.54.4/flux-cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/codewandler/flux/releases/download/v0.54.4/flux-cli-installer.ps1 | iex"Download flux-cli 0.54.4
| File | Platform | Checksum |
|---|---|---|
| flux-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| flux-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| flux-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| flux-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| flux-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
codewandler-flux-lsp 0.54.4
Install codewandler-flux-lsp 0.54.4
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codewandler/flux/releases/download/v0.54.4/codewandler-flux-lsp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/codewandler/flux/releases/download/v0.54.4/codewandler-flux-lsp-installer.ps1 | iex"Download codewandler-flux-lsp 0.54.4
| File | Platform | Checksum |
|---|---|---|
| codewandler-flux-lsp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| codewandler-flux-lsp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| codewandler-flux-lsp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| codewandler-flux-lsp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| codewandler-flux-lsp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.54.3 - 2026-08-03
Release Notes
Changed
-
All official integrations now have one documented connector destination (C-500, C-501).
Protocol-rich adapters move out of Flux's vendor-specific native plugin catalogue after local and
Exchange parity; Flux retains generic guarded runtime mechanisms, including the plugin protocol
where useful. Cross-repository epics and stories now cover the runtime, migration, isolation,
stream, artifact, and cutover work. -
The shared family vocabulary reserves Agent for the runtime (C-492). An Agent is consistently
a model plus a loop plus bounded operations and datasources; Exchange's non-human bearer principal
is a Service Account, retaining/api/agentsonly as its documented legacy spelling. Concepts now
define App, Managed Agent, Event Type, Event Delivery, Datasource Definition, Model Provider and
Identity Provider, and the public Concepts/Ecosystem mirrors carry the same definitions.
flux-cli 0.54.3
Install flux-cli 0.54.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codewandler/flux/releases/download/v0.54.3/flux-cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/codewandler/flux/releases/download/v0.54.3/flux-cli-installer.ps1 | iex"Download flux-cli 0.54.3
| File | Platform | Checksum |
|---|---|---|
| flux-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| flux-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| flux-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| flux-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| flux-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
codewandler-flux-lsp 0.54.3
Install codewandler-flux-lsp 0.54.3
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codewandler/flux/releases/download/v0.54.3/codewandler-flux-lsp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/codewandler/flux/releases/download/v0.54.3/codewandler-flux-lsp-installer.ps1 | iex"Download codewandler-flux-lsp 0.54.3
| File | Platform | Checksum |
|---|---|---|
| codewandler-flux-lsp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| codewandler-flux-lsp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| codewandler-flux-lsp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| codewandler-flux-lsp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| codewandler-flux-lsp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
0.54.2 - 2026-08-03
Release Notes
Fixed
- The release cutter now regenerates and commits
flux-server's embedded docs after rolling the
website changelog (C-498). v0.54.1 proved the earlier one-time refresh was insufficient: the cut
changedwebsite/docs/whats-new.mdafter the archive had been built, so its tag-only website
workflow correctly found stale bytes. The archive is now a snapshotted, restored, verified and
path-limited release output, making that ordering part of every cut instead of release-day memory.
flux-cli 0.54.2
Install flux-cli 0.54.2
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codewandler/flux/releases/download/v0.54.2/flux-cli-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/codewandler/flux/releases/download/v0.54.2/flux-cli-installer.ps1 | iex"Download flux-cli 0.54.2
| File | Platform | Checksum |
|---|---|---|
| flux-cli-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| flux-cli-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| flux-cli-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| flux-cli-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| flux-cli-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |
codewandler-flux-lsp 0.54.2
Install codewandler-flux-lsp 0.54.2
Install prebuilt binaries via shell script
curl --proto '=https' --tlsv1.2 -LsSf https://github.com/codewandler/flux/releases/download/v0.54.2/codewandler-flux-lsp-installer.sh | shInstall prebuilt binaries via powershell script
powershell -ExecutionPolicy Bypass -c "irm https://github.com/codewandler/flux/releases/download/v0.54.2/codewandler-flux-lsp-installer.ps1 | iex"Download codewandler-flux-lsp 0.54.2
| File | Platform | Checksum |
|---|---|---|
| codewandler-flux-lsp-aarch64-apple-darwin.tar.xz | Apple Silicon macOS | checksum |
| codewandler-flux-lsp-x86_64-apple-darwin.tar.xz | Intel macOS | checksum |
| codewandler-flux-lsp-x86_64-pc-windows-msvc.zip | x64 Windows | checksum |
| codewandler-flux-lsp-aarch64-unknown-linux-gnu.tar.xz | ARM64 Linux | checksum |
| codewandler-flux-lsp-x86_64-unknown-linux-gnu.tar.xz | x64 Linux | checksum |