launchbound 2.0.0 — reconverge 0.4.0, and the first ten minutes
A major, and both reasons are in the "breaking" list this project keeps in
docs/RELEASING.md: a changed CLI flag, and a change to
what the gate admits.
Changed — breaking
-
The safety gate pins
reconverge0.4.0, up from 0.3.0, and 0.4.0
reads a shared-memory length written as a named const. 0.3.0 could
only read a literal:SharedArray<f32, TILE>arrived as an unevaluated
const, the analyzer'seval_target_usizerefused it, and the static was
dropped from the RC004 budget with no finding and no diagnostic.This is not an abstract gap — it is the shape every tunable kernel has.
corpus/matmul-tileddeclaresSharedArray<f32, { TM * TK }>, and
launchbound rewritesTM/TKper candidate, so every configuration
this tool tries took the path RC004 could not see. A space with an
over-cap tile pruned as all-clean.Verified against the corpus: the six kernels' verdicts are unchanged
(their tiles are well under the cap), and raisingmatmul-tiledto
TM = TK = 128now produces
error[RC004]: kernel matmul declares 73728 bytes, where 0.3.0 said
nothing. Any kernel whose shared memory is sized by a const may now be
refused where it previously passed — which is the gate working, and is
why this is a major. -
--ccis required bytune, as it already was bypruneand
model. It defaulted to8.6, which meant the one command whose answer
you act on quietly picked a device, while the two inspection commands
made you choose.prune --cc's own help says a verdict at one capability
does not transfer to another; RC004 is a capacity check, and 8.6 offers
164 KB per SM against 7.5's 64 KB.launchbound tune <kernel> --backend modelnow asks for--cc.
Added
--ccis validated at the command line, and the CUDA spellings work.
A mistyped--ccused to be handed tocargo reconvergeonce per
candidate: eleven subprocesses forreduce-flip, 101 over the corpus, and
ninety lines of output in which the actual problem appeared nowhere. It is
now one line in ~100ms with nothing spawned.--cc 86and--cc sm_86
are normalized to8.6rather than rejected — for two digits the mapping
is unambiguous, and it is the spelling a CUDA user already has.
Fixed
-
A reconverge failure reports what reconverge said. The tool error
showed the last six lines of its stderr — a reasonable-looking default,
since a failing tool usually fails last, and reliably the wrong six:
reconverge prints its diagnosis first and its usage reference after it, so
the tail was the exit-code legend. reconverge 0.4.0 stopped printing usage
after a bad value, which fixes that case at the source; this reads the
lines markederror:regardless, because no caller controls what its
analyzer prints, and falls back to the head rather than the tail. -
modelsays that it is not gated. It ranks the whole space, and on
reduce-flipits top five are all configurations the gate refuses — the
fastest row was a kernel that hangs, under a header that carefully said
"estimated, not a measurement" and nothing about safety. It still runs no
gate and needs noreconverge; it now says so, and namestune --backend modelas the gated form. -
tune --backend modelno longer leaves an empty run directory. The
directory was created before the backend match, for every backend, and the
model path writes nothing — so every run litteredruns/, which is
checked in, andlaunchbound reporton it failed withverdicts.json: No such file. An--outgiven to this backend is now answered rather than
silently ignored. -
launchbound-tui --helpprints help. It readargs()directly, so
every flag was taken as a run-directory path:--helpcame back as
run dir: --help/verdicts.json: No such file or directory, which reads as
a broken tool.-h,--help,-Vand--versionanswer; any other
leading dash is reported as an unknown option, which is what stops the
next flag landing here as a path. This is a published binary. -
The chosen configuration's interval is dropped, not cut. At eighty
columns — the default terminal size, and the width this suite mandates —
the line ended0.0400 ms [0.0398,: a number with no upper bound and a
dangling comma, on the one line carrying the result. The interval now goes
whole when it does not fit; at 110 columns it is unchanged. -
The TUI goldens wait for a finished frame. They synced on a 150ms
quiet period, which is a guess at how long a repaint takes; on a loaded
runner the app pauses mid-repaint and the screen read is half-painted.
This had already cost the suite once —ranking_scrolls_a_long_candidate_list
carries a comment about a golden blessed from a too-early capture, which
then verified nothing while passing — and the same shape failed
reconverge'smainon macOS. The binary already brackets every repaint in
DEC 2026 synchronized updates, sowait_frameobserves only whole frames.
The 100-iteration stress gate went from 15.8s to 0.7s.
Migrating from 1.x
- The Action's floating tag is now
@v2.uses: vyncint/launchbound/action@v1keeps working and stays on 1.2.0, which is
the point of a floating major tag — but it stays on reconverge 0.3.0 with
it, and 0.3.0 is the analyzer that cannot see a named-const shared-memory
size. Move to@v2to get the gate this release is about. - Add
--ccto anylaunchbound tuneinvocation. It has no default now.
Documentation
- The CLI table listed
launchbound tui <run>, which is not a subcommand —
the binary islaunchbound-tui. It also omittedmodel, and showed
tunewithout the--ccit now requires. - The Action's input table still gave
reconverge-versionas0.1.11, two
releases stale.
Install
cargo install launchbound-cli --locked # the CLI
cargo install launchbound-tui --locked # the run browserIn CI, the Action:
- uses: vyncint/launchbound/action@v2
with:
kernel: path/to/kernel
cc: "8.6"@v1 keeps working and stays on 1.2.0 — with reconverge 0.3.0, the analyzer
that cannot see a named-const shared-memory size.
The gate needs cargo-reconverge 0.4.0 and reconverge-driver 0.4.0, built
by nightly-2026-04-03; the Action installs both. Locally:
cargo install cargo-reconverge --locked --version 0.4.0
cargo +nightly-2026-04-03 install reconverge-driver --locked --version 0.4.0