Skip to content

Releases: codewandler/flux

0.59.3 - 2026-08-08

Choose a tag to compare

@timofriedlberlin timofriedlberlin released this 08 Aug 13:13

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 | sh

Install 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 | sh

Install 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

Choose a tag to compare

@timofriedlberlin timofriedlberlin released this 08 Aug 09:52

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. LiveAccess gains a LiveLocality of Anywhere (the default and
    today's behaviour) or Host(<binding id>), copied from the endpoint's own host answer rather
    than re-derived, so the datasource cannot disagree with the record it reads. The refusal happens at
    admission: the generated <domain>.list/.get and 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_system and
    board_connection_system hand the backend the substrate its declaration names, and a host-bound
    domain registers as SelectedExecutionSystem rather than NativeSystemOnly — 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-codegate gains the live-backend census: every
    shipped LiveDatasource/WorkBoard implementation 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 no host is
    unchanged: no admission runs and the backend receives the same system it does today.

  • flux ops --explore browses 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.json carries 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, since fleet.isolate,
    git_worktree_enter, http.request, web.crawl and web.fetch had 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_call states every Usage tier, 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 a resource:<root-id> ad-hoc stream on EventKind::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_tree folds 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 $0 one. 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). applied is the
    fleet's word for "this work is delivered", and apply wrote 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 declares canonical_ref = "origin/main", a remote-tracking ref only a push can move
    and the fleet never pushes — and the product then contradicted itself: fleet status reported it
    applied while fleet apply refused it for having no green gate and fleet integrate refused it as
    not ready. Each accepted repository's canonical ref is now re-read from git after the tags are
    written, and the wave becomes applied only where every one of them is observed to contain the
    candidate, asked of merge-base --is-ancestor; a question git declines to answer is never read as
    delivery. A gated, accepted and pinned wave that has not landed becomes awaiting-delivery, which
    claims exactly what happened, and re-running apply re-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-run reports no verdict rather than a default one. fleet doctor gains
    applied-without-delivery (naming wave, repository, stranded story and the exact missing commit)
    and applied-without-green-gate, and flux 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-worktree derives its write
    set from base..HEAD and could not see an untracked file, doctor reported the branch as
    branch-without-unique-work, and the fix doctor prescribed was reclaim — 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
    gains story-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. And flux 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 as already-built while the single item
    it sent was the one whose implementation genuinely existed. already-built was never a fact the
    driver established — it was membership in board reconcile's finding set, and reconcile fires
    implementation-landed on 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...

Read more

0.59.1 - 2026-08-08

Choose a tag to compare

@timofriedlberlin timofriedlberlin released this 08 Aug 07:50

Release Notes

Added

  • An endpoint records the host it is reachable through (C-709). EndpointRef recorded 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. EndpointRef gains
    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 declare host = "k8s-dev", flux endpoint add takes --host, and
    list/show/resolve render it — resolve now 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. StaticResolver carries 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 propagates skipped transitively through needs, so the chain
    has to be broken at every hop rather than only the first — host already broke it with
    always(), but the jobs below did not, so a correctly skipped build-local-artifacts flowed
    through a successful host and took attest, publish-github-release and publish-container-image
    with it. Those three now use always() and assert their upstreams actually succeeded, which
    admits a transitively-skipped graph but never a failed or skipped dependency, and
    verify-published fails 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
    moved codewandler-flux-evidence to 1.2.0 while plugins/Cargo.lock still pinned 1.1.0, so every
    job that resolves that workspace with --locked refused outright. That took down three CI jobs at
    once — the plugins workspace fetch, and plugin_builds_exclude_host_only_crates in both the
    sandboxed and unsandboxed test jobs, which resolve the same workspace.

  • codewandler-flux-evidence moves to 1.2.0 so its published API matches its users (C-143).
    crates.io publication of 0.59.0 stopped at codewandler-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 | sh

Install 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 | sh

Install 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

Choose a tag to compare

@timofriedlberlin timofriedlberlin released this 06 Aug 23:34

Release Notes

Added

  • Time and token spend now has one target-versus-limit vocabulary from the runtime to the screen
    (C-542). BudgetEnvelope carries a soft target beside a hard limit for wall time, model calls and
    input/output/total tokens; BudgetUsageEvent attributes measured spend to run, session, turn and
    loop segment; and BudgetLedger is the only accountant — a repeated event_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 a budget.projection observation; 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-budget is 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 status and flux fleet dashboard are now bounded projections (C-562). The
    default flux.fleet-status/v1 view reports main state, active/attention/settled worker counts,
    wave and item state, exact BoardRefs, repositories, current sessions, last transition/error
    summaries and the current revision inside a reviewed fixed byte budget, instead of copying
    retained last_turn receipts, 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/v1 records, and detail stays behind the explicitly bounded
    flux fleet inspect route. 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 said working, 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 next orders
    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

Choose a tag to compare

@timofriedlberlin timofriedlberlin released this 06 Aug 23:34

Release Notes

Added

  • A native workspace Board is now the complete cross-repository program authority (C-588).
    A default .flux/board.toml binds member repositories and canonical refs, active milestone,
    ordered program lanes, cross-repository dependencies, configured waves and planning documents.
    Plain flux board auto-selects it; board next and fleet schedule consume 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 exact flux.board-stats/v1 cube 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 one task; that child uses a separately configured host-authored loop and an
    independently closed read-only research catalog with no generic create_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 explicit adaptive@1 preset; 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.run receipts 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_INCREMENTAL also joins the forwarded environment allow-list,
    without which the variable was dropped between the agent process and the cargo it runs and setting
    it had no effect at all. CARGO_TARGET_DIR is 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 create commits the document it creates, path-scoped, with --no-commit to opt out.
    Items are resolved at a git ref wherever a board is federated — a workspace member's stories are read
    with ls-tree/show at its canonical_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 prepare step 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 with embedded docs are stale while 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 on stale fleet revision 428; current revision is 429 after 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, and worktree_holds_work answers "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 ...
Read more

0.56.0 - 2026-08-05

Choose a tag to compare

@timofriedlberlin timofriedlberlin released this 05 Aug 22:16

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 board exposes
    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 fleet exposes
    durable local sub-agent scheduling, acknowledged control, bounded inspection, handoff/rework/gate
    records and explicit local-only apply. Both families share the flux.cli/v1 JSON/NDJSON contract,
    optimistic revisions, idempotent mutations, dry runs, schemas and concise rendered Agent Skills.
    BoardId, BoardRef, independent scope/profile/backend contracts and BoardRegistry are public
    through the datasource/capability/SDK seams, and Flux-Lang has a first-class closed board
    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::AutonomyPosture names four choices — supervised, bounded-autonomy,
    exploratory and refusing — 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 --posture on the CLI and
    ClientBuilder::posture() in the SDK. --yes and auto_approve are 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 review now 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_run can execute Flux-Lang supplied directly in its request. The new mutually exclusive
    inline_program address 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-Read metadata, 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_calls envelope.

  • A tracked Flux-Lang writer role now authors checked .flux sources (C-513).
    .flux/agents/flux-lang-writer.md uses 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
    invoke contract. 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-only examples/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_TOKEN is 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 ambient GITHUB_TOKEN owns 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. /tools reports 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-level contents: read; any other GitHub...

Read more

0.55.0 - 2026-08-03

Choose a tag to compare

@timofriedlberlin timofriedlberlin released this 03 Aug 15:48

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, so 0 and
    1 both 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_CHARS precedence, 0 disabling, 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 unrelated TokenCounter traits have been removed.
    Removing the public traits and the slice_context argument is a breaking change for direct
    flux-provider / flux-lang callers 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). The detect_intent and explore reflect 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_CHARS overrides now warn on served agents as well as the CLI
    (C-507). Both surfaces consume one flux-agent parse/outcome contract: missing, valid, and 0
    values stay quiet, while an explicit invalid value names the rejected input and shared fallback.
    A per-agent compact_threshold_chars setting still wins without consulting the environment.

  • /compact now reports whether it actually rewrote the conversation (C-465). The REPL no
    longer prints context compacted for an under-threshold, disabled, unsplittable, empty-summary,
    or cancelled check; successful rewrites carry their before/after message counts. The published
    FlowEngine::maybe_compact API now returns CompactionOutcome instead of (), a breaking change
    for direct flux-flow callers 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 | sh

Install 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 | sh

Install 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

Choose a tag to compare

@timofriedlberlin timofriedlberlin released this 03 Aug 11:07

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 | sh

Install 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 | sh

Install 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

Choose a tag to compare

@timofriedlberlin timofriedlberlin released this 03 Aug 09:57

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/agents only 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 | sh

Install 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 | sh

Install 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

Choose a tag to compare

@timofriedlberlin timofriedlberlin released this 03 Aug 05:27

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
    changed website/docs/whats-new.md after 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 | sh

Install 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 | sh

Install 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