fix(ci): make the nightly contract suite runnable #412
No reviewers
Labels
No labels
bug
contract
documentation
duplicate
enhancement
good first issue
help wanted
invalid
question
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
iterative-works/iw-cli!412
Loading…
Reference in a new issue
No description provided.
Delete branch "fix/nightly-contract-suite"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
The nightly tool-contract job has failed on every one of its 34 scheduled runs, starting with the first one on 2026-06-27 — it has never been green. Two independent defects, both present since the suite landed in #377. Neither is related to recent work.
All other jobs (compile, format, lint, test, dashboard-build) were green throughout; only
contractfailed.1.
mill showoutput was parsed from a merged streammill_contract.batsparsed$outputfrom a plainrun, which merges stderr into it. Cold,dashboard.assemblybuilds the frontend, andbuild.mill:104-105runs yarn and vite withstderr = os.Inherit— sojqreceived 29 lines of build chatter ahead of the jar ref and failed withInvalid numeric literal.iw-run:51reads stdout and diverts stderr to a file, so the merged stream was never the contract being pinned. Fixed by reading stdout alone viarun --separate-stderr(withbats_require_minimum_version 1.5.0, or bats warns BW02).This is why it was green locally and red in CI: a developer's
out/is warm, so the frontend never rebuilds and no stderr is emitted. Reproduced locally by deletingout/frontend/viteBuild.*.iw-runitself was never affected — no production code changes here.2.
glabwas never installed in the CI imageThe suite probes glab's flag surface, but
Dockerfile.ciinstallsgh,fj, JDK, scala-cli, node and mill — neverglab. All five surface tests failed with exit 127. They passed locally only because a developer machine has glab installed.Added as a pre-downloaded
deps/binary like the other major tools, rather than from a package repo at build time, matching the reproducibility the image already aims for. Verified glab 1.110.0 advertises every flag the suite asserts.Verification
The rebuilt image is pushed (
iw-cli-ci:latest→sha256:b23facad508e). The full contract suite was run inside it against a clean clone of this branch, cold — empty coursier cache, noout/:viteBuild.logrecords Yarn 4.13.0 and vite 8.0.9), so the exact stderr that used to break the test was present and is now correctly separatedscala-cli compile --scalac-option -Werroroncore/passed cold, so the coursier-cache-reset gotcha from the last image rebuild did not recurThis PR is labeled
contractso the job runs here rather than waiting for the nightly.Note
Worth deciding separately: 34 consecutive failures produced no signal anyone acted on. Even with both defects fixed, a drift detector nobody is notified about will rot again.
🤖 Generated with Claude Code