release: 2.0.0 — reconverge 0.4.0, and the first ten minutes - #28
Merged
Conversation
A major, and both reasons are on this project's own breaking list: a
changed CLI flag, and a change to what the gate admits.
The gate pins reconverge 0.4.0, which reads a shared-memory length
written as a named const. 0.3.0 could only read a literal — given
`SharedArray<f32, TILE>` its analyzer refused the unevaluated const and
dropped the static from the RC004 budget with no finding and no
diagnostic.
That is not an abstract gap; it is the shape every tunable kernel has.
`corpus/matmul-tiled` declares `SharedArray<f32, { TM * TK }>` and this
tool rewrites TM and TK per candidate, so every configuration it tries
took the path RC004 could not see. Verified both ways: the six corpus
kernels' verdicts are unchanged, and raising matmul-tiled to
TM = TK = 128 now reports 73728 bytes over the cap where 0.3.0 said
nothing.
`--cc` is required by `tune` now, as it already was by `prune` and
`model`. It defaulted to 8.6 — so the one command whose answer you act
on quietly picked a device while the two inspection commands made you
choose, and `prune --cc`'s own help says a verdict at one capability does
not transfer to another.
The rest is the first ten minutes of using this tool.
A mistyped `--cc` used to spawn eleven subprocesses and print ninety
lines in which the problem appeared nowhere; it is one line in ~100ms
with nothing spawned, and `--cc 86` and `sm_86` now work rather than
failing. A reconverge failure reports the lines reconverge marked
`error:` rather than the last six, which were reliably its exit-code
legend. `model` says it is not gated — its top five on reduce-flip are
all configurations the gate refuses, under a header that carefully
labelled the cheap mistake and left the expensive one unmarked. `tune
--backend model` no longer leaves an empty directory in `runs/`.
`launchbound-tui --help` prints help instead of looking for a directory
called `--help`. The chosen configuration's interval is dropped whole at
eighty columns rather than cut mid-number.
And the TUI goldens wait for a finished frame instead of a 150ms quiet
period. That had already cost this suite once — the comment in
`ranking_scrolls_a_long_candidate_list` records a golden blessed from a
too-early capture, which then verified nothing while passing — and the
same shape failed reconverge's main on macOS this week. The binary
already brackets its repaints, so only the tests changed. The
100-iteration gate went from 15.8s to 0.7s, and thirty local runs at 2
and 16 threads found no flake.
Docs: the CLI table listed a `launchbound tui` subcommand that does not
exist, omitted `model`, and showed `tune` without the `--cc` it now
requires; the Action's input table gave reconverge-version as 0.1.11,
two releases stale.
Closes #18, closes #19, closes #20, closes #21, closes #22, closes #23,
closes #24, closes #26.
Signed-off-by: Vyncint Ng <115854244+vyncint@users.noreply.github.com>
A floating major tag is a promise to the people who followed the documentation, and this release breaks that promise if the documentation still says @v1: they would get a 1.x action — pinned to reconverge 0.3.0, the analyzer that cannot see a named-const shared-memory size — for a 2.0 tool whose entire subject is that it now can. `release.yml` moves `vN` automatically from the pushed tag, so `v2` appears on its own; only the two places a reader copies from needed changing. `@v1` stays on 1.2.0, which is what a floating major tag is for. The CHANGELOG now says so, and says what it costs. Signed-off-by: Vyncint Ng <115854244+vyncint@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What & why
Closes #18, #19, #20, #21, #22, #23, #24, #26 — the whole
1.3.0 — the first ten minutesmilestone, plus the reconverge upgrade.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.0reads a shared-memory length written as a named const. 0.3.0 could
only read a literal:
SharedArray<f32, TILE>arrived as an unevaluatedconst, the analyzer's
eval_target_usizerefused it, and the static wasdropped 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 }>, andlaunchbound rewrites
TM/TKper candidate, so every configurationthis 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 raising
matmul-tiledtoTM = TK = 128now produceserror[RC004]: kernel matmul declares 73728 bytes, where 0.3.0 saidnothing. 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 bypruneandmodel. It defaulted to8.6, which meant the one command whose answeryou act on quietly picked a device, while the two inspection commands
made you choose.
prune --cc's own help says a verdict at one capabilitydoes 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 percandidate: eleven subprocesses for
reduce-flip, 101 over the corpus, andninety lines of output in which the actual problem appeared nowhere. It is
now one line in ~100ms with nothing spawned.
--cc 86and--cc sm_86are normalized to
8.6rather than rejected — for two digits the mappingis 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 marked
error:regardless, because no caller controls what itsanalyzer prints, and falls back to the head rather than the tail.
modelsays that it is not gated. It ranks the whole space, and onreduce-flipits top five are all configurations the gate refuses — thefastest 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 no
reconverge; it now says so, and namestune --backend modelas the gated form.tune --backend modelno longer leaves an empty run directory. Thedirectory was created before the backend match, for every backend, and the
model path writes nothing — so every run littered
runs/, which ischecked in, and
launchbound reporton it failed withverdicts.json: No such file. An--outgiven to this backend is now answered rather thansilently ignored.
launchbound-tui --helpprints help. It readargs()directly, soevery flag was taken as a run-directory path:
--helpcame back asrun dir: --help/verdicts.json: No such file or directory, which reads asa broken tool.
-h,--help,-Vand--versionanswer; any otherleading 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 ended
0.0400 ms [0.0398,: a number with no upper bound and adangling 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_listcarries a comment about a golden blessed from a too-early capture, which
then verified nothing while passing — and the same shape failed
reconverge's
mainon macOS. The binary already brackets every repaint inDEC 2026 synchronized updates, so
wait_frameobserves only whole frames.The 100-iteration stress gate went from 15.8s to 0.7s.
Documentation
launchbound tui <run>, which is not a subcommand —the binary is
launchbound-tui. It also omittedmodel, and showedtunewithout the--ccit now requires.reconverge-versionas0.1.11, tworeleases stale.
Verification
fmt,clippy --workspace --all-targets -D warnings, 47 tests,cargo deny,just schemas— clean.just gate(the S5 gate tests, against reconverge 0.4.0 installed from crates.io) — 3/3.just pruneover the whole corpus under 0.4.0 — six kernels, verdicts identical to 0.3.0.matmul-tiledatTM = TK = 128reports73728 bytesover the cap; 0.3.0 reported nothing.--ccmatrix measured: malformed values exit 2 in ~106ms with zero subprocesses;86andsm_86normalize and run.Why 2.0.0 and not 1.3.0
docs/RELEASING.mdlists as breaking, post-1.0 → major: "a changed CLI flag, or a change to what the gate admits that a user would have to relearn." This has both. The milestone was named1.3.0before the reconverge upgrade was in scope; understating a gate-behaviour change in a safety tool is the wrong direction to round.Checklist
cargo fmt --allandcargo clippy --workspace --all-targetscleanCHANGELOG.mdupdated — released as[2.0.0]