test(binary): clean-machine matrix smoke over the binary path, through install.sh - #622
Merged
KnockOutEZ merged 5 commits intoSep 7, 2026
Conversation
…artifact The release workflow gains a 3-OS job that acquires the artifact through the public contract rather than through the run's own artifact hand-off: unix legs pipe raw.githubusercontent.com/install.sh into sh, Windows downloads the zip and verifies SHA256SUMS before unpacking. No interpreter is on PATH for any of it, and clean-path.sh proves that in the step that uses it instead of exporting a claim later steps cannot check. install.sh gains WIGOLO_RELEASE_TAG. It addresses assets as <base>/<tag>/<name> and derived the tag as v$VERSION, so a release published under any other tag was unreachable — which is every release on the binary-only channel, whose tags sit outside the v* namespace precisely so they cannot start an npm publish.
|
Important Review skippedAuto reviews are disabled on base/target branches other than the default branch. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Team Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
…etwork the way the runner allows Two facts the first live matrix produced. `wigolo --version` answers `wigolo 0.2.1`, so the semver is the last field and not the whole line; the stub in the suite now wears the same shape, which is why no arm caught this. And Ubuntu 24.04 restricts unprivileged user namespaces, so `unshare -rn` refuses at /proc/self/uid_map — a refusal from the sandbox, not from the artifact. The offline arm now takes the passwordless-sudo route when there is one and keeps the unprivileged route for machines without it.
…re it answers A redirected stderr pipe nobody reads fills at a few tens of kilobytes and blocks the writer, so the server stopped before replying, the first read timed out at 60s and the second threw "the stream has already been closed". verify.mjs avoids this with child.stderr.resume(); the PowerShell leg now starts a ReadToEndAsync at process start and an arm pins that ordering. The unix battery redirects stderr to a file and cannot reach this shape.
… the live feed The main unix leg has to pin the version and the tag, because a prerelease on the binary-only channel is not what the feed's latest points at — so it never runs resolve_version's feed branch at all, and counter-review finding 4 asked for exactly that branch live. A last unix step runs it with nothing pinned, into a temporary root. Resolution finishes before any asset is fetched, so a resolved version in the transcript is the whole assertion and a download failure naming that same version is the tolerated end — the state every release stays in until a v*.*.* tag carries binary assets. A feed that cannot be reached is red after one retry, not tolerated: that means the branch under test never ran.
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.
Closes #509 (BIN-8). Single-binary mini-spec §4 guarantees + §5.
What this adds
.github/workflows/binary-release.ymlgains asmokejob on three OS runners thatacquires the artifact through the public contract, not through the run's own artifact
hand-off:
curl -fsSL raw.githubusercontent.com/<repo>/<sha>/install.sh | sh,the published one-liner, aimed at the commit the release was built from. This is the only
way to exercise live what
install.sh's own suite has to fake: release resolution over thereal API, the
uname→ asset-name mapping on real hardware, and the real download URLs(counter-review finding 4).
install.shby design (§5), so the leg downloads the.zip, verifies itagainst
SHA256SUMSbefore unpacking, and runs it.Expand-Archive, nottar: BIN-4measured that a Windows bash step's
taris Git's GNU tar and readsC:\…as a remote spec.Then, from the artifact alone:
--version, a relocated copy under a path with a space, anMCP stdio handshake, one
fetchand onecache stats. Each arm fails naming the §4guarantee it broke (G1 relocatable, G2 offline-first, G4 verifiable, G5 versioned, plus the
run surface), because "the smoke is red" is not something anyone can act on.
No interpreter is on PATH for any of it, and the strip is proven by the script that
produces it (
clean-path.sh), in the step that uses it — a PATH exported once throughGITHUB_ENVis a claim the later steps cannot check. Anodethat still resolves is a redbefore the artifact runs.
install.shgainsWIGOLO_RELEASE_TAG— a territory extension, declaredThe issue's
lane-extranames.github/workflows/binary-release.ymlandtests/integration/**. I needed one more file:install.sh.It addresses assets as
<base>/<tag>/<name>and derived the tag asv$VERSION. The artifactNAME carries the bare semver and the download PATH carries the tag, and those are different
strings on the binary-only channel — whose tags sit outside the
v*namespace precisely sothey cannot start a package release. So every release on that channel was unreachable by the
installer, and the live-URL half of this issue's acceptance was unreachable with it. The fix
is one line plus its documentation;
WIGOLO_VERSIONnames the version,WIGOLO_RELEASE_TAGnames the tag, and on a
v*.*.*release both are the release's own defaults and neither isneeded. Recorded as A-509-1.
The activation gate, and why two arms are tolerant
PX brief §0a.1 makes the registration gate Studio-only: "core CLI/MCP runs unregistered."
The tip does not do that yet —
fetchandcacheare still walled by the PX2 gate, which isthe known-red class owned by
wigolo-studio-run#336. Measured here on the built tip:So the two tool arms accept exactly that line and nothing else, count the deferral, and end
the run with a
::warning::naming the issue. Any other failure of those arms is red — thereis a control mutant for that in the suite. Once #336 lands, the tolerated branch stops being
taken and the arms are hard assertions with no edit to either file.
--version, relocationand the MCP handshake are hard assertions today.
Proven able to fail
tests/integration/binary-consumer-smoke.test.ts— 19 arms. Eight static ones assert the jobis wired to be an outside signal (it waits on
release, notbuild; nosetup-node; nodownload-artifact; the raw URL is pinned togithub.sha; every unix step strips PATH initself; the Windows probe precedes the run in the same step; the checksum precedes the unpack).
Eleven executed ones drive the real scripts. The battery is run against a §4-shaped stand-in
artifact and then against five mutants, one per guarantee — a version that disagrees with
the release (G5), a tree that only works where it was unpacked (G1), an MCP server that
answers correctly and prints a banner on stdout (RUN — an arm that only grepped for
"serverInfo"would call that green), acache statsthat fails for a non-gate reason (OPS),and the gate refusal itself (deferred, warns, still green).
clean-path.shhas its own three:it prunes the directory an interpreter actually resolves from, and refuses when pruning would
take
curlwith it.The PATH probe itself was mutated by hand and put back: disabling the prune loop and handing
it a base PATH with a
nodeon it reds at exit 1 with::error::node --version answered under the stripped PATH.Non-goals held
No new test frameworks. No npm-path duplication —
ci.yml'sclean-machine smokestill ownsthat.
release.ymluntouched; the binary channel still cannot start a package release.Live evidence —
binary-v0.2.1-sd509.4, run 34169090853, conclusion successFive artifacts built, five platform-native verify lanes, publish, then all three smoke legs green.
darwin-arm64 is identical to linux apart from
n/a G2 — no unprivileged network-namespace equivalent on Darwin; the linux leg carries this arm.Three defects only a live run could show
install.shcould not address the binary channel at all — theWIGOLO_RELEASE_TAGgapabove. Every release on that channel was unreachable by the shipped installer.
wigolo --versionanswerswigolo 0.2.1, not0.2.1— the battery compared the wholeline, and its own stub printed a bare semver, so nothing local could have caught it. The
stub now wears the CLI's real shape.
reads fills at a few tens of kilobytes and blocks the writer, so the first read timed out
at 60 s and the second threw
the stream has already been closed.verify.mjsdrains itwith
child.stderr.resume(); the PowerShell leg now starts aReadToEndAsyncat processstart, and an arm pins that ordering.
Also measured: Ubuntu 24.04 restricts unprivileged user namespaces, so
unshare -rnrefuses at
/proc/self/uid_map— a refusal from the sandbox, not from the artifact. Theoffline arm takes the passwordless-sudo route when there is one.
Four tags were cut to get here; the three earlier prereleases and their tags were deleted
afterwards, and the run logs are the evidence.
Suites
npm test971 files / 12,068 passed / 0 failed, exit 0 ·npx tsc --noEmit0 ·npm run gate:studio0 (tests/ type-check debt holds at baseline 341) ·shellcheck -s shclean on all three shell files.
CI on this head: every job green except the seven
clean-machine smokejobs, whose failuretext is
wigolo needs an account — run \wigolo register`— the named known-red class owned bywigolo-studio-run#336`, the same set BIN-5 measured on the base. No other red class appears.