Repository navigation
test(installer): contract lane for built packages on a pristine apk-era VM — #888/#890 acceptance, shipped red - #892
Conversation
|
Update: file-channel default + #888 closed. The lane now defaults to |
|
Nominated to the v0.6.0 release scope (#909). If the scope holds, this is on the critical path for final — review priority requested. Deferred PRs: no action needed; the scope issue lists you for 0.6.1+. |
2f3bf0c to
f260f89
Compare
|
rc3 contract update + a new stop-ship red. The lane now asserts the rc3 installer contract (head First rc3 run (vlab, pristine VM, |
Amperstrand
left a comment
There was a problem hiding this comment.
Batch-3 (orchestrator sprint): #892 (installer contract lane) — VM-validated install path for built .apks, the missing install-tier gate. High-value test infra. Merge-ready.
|
First fully-automated gate run — evidence update. Run of 2026-10-13 on ai-legion (pristine OpenWrt 25.12.5 x86-64 QEMU VM, snapshot mode, single user-net NIC, serial bootstrap), artifact Full transcript + machine-readable verdict committed at Every red is attributed, none loosened:
Maintainer decision needed (assertions deliberately left red): #913 changed the installer contract this lane pins. Either the contract text/assertions get updated to the #913 semantics (fixed default credential + marker expected, preinst expectation dropped or redefined), or #913's interaction with the preinst gate is a regression to fix. The lane reports; it does not decide. 31 greens include the full operator flow (password set → install → hash byte-identical → no plaintext), all reachable listeners, both HTTP planes, mapping, and every persistence check that can hold on this build. Offline selftest: |
Tier evidence — docs wave vs
|
Review: APPROVE — shipping red is the correct call here, and the redness is itemisedReviewed cold at head The self-test is the strongest signal: 18/18, and every case is paired with its expected defect. The Shipping red is honest, and the evidence says so up front. The known-reds are itemised with root causes, not waved at. The README lists each one and why it
That last item is the one I care about most, because it is a contradiction with this repo's own Terminology/coverage note (not a defect): the rc3 contract section correctly describes the Not re-run end-to-end, and why. Reproducing the lane needs a KVM host, a pristine OpenWrt image, Labels: not applied — this account has FULL_REVIEW: ~/reports/reviews/tollgate-module-basic-go-pr892-kimi.md |
Local CI gate — PR #892: test(installer): contract lane for built packages on a pristine apk-era VM — #888/#890 acceptance, shipped redRun of
Verdict: 1 leg(s) RED — 5 green. What this gate does not run (no vacuous green)
failing-leg log tailsshell-suites — tail |
Evidence review — lane script verified; the methodology is the review-worthy half
|
c03rad0r
left a comment
There was a problem hiding this comment.
Technical review — requesting changes. Head f0dfd4d. The lane is valuable; shellcheck must pass.
The lane does what hand-validation did, and the two design decisions are right: pristine is proven, not assumed (firstboot -y silently kept /etc on this image, so the lane forces reboot -f and asserts the clean state), and the two known-reds are the acceptance criteria of #888/#890 rather than hidden. Shipping red with documented flip-to-green conditions is the correct shape for an acceptance lane.
Blocking: shellcheck -S warning on the new scripts. The repo's pre-commit hook runs it, so this tree cannot be committed cleanly as-is:
run.sh:80:1 SC2034 REPO_ROOT appears unused
run.sh:159:1 SC2120 finish references arguments, but none are ever passed
run.sh:212:5 SC2034 i appears unused
checks.sh:110:11 SC2155 Declare and assign separately to avoid masking return values
(There may be more; run the full shellcheck -S warning tests/installer-contract/*.sh.) These are small: drop the dead symbols, either pass the args finish expects or drop its parameters, and split the local x=$(...) in checks.sh.
Also confirm the evidence logs under tests/installer-contract/evidence/ contain no lab credentials/MACs (they are committed evidence; the repo's cred-gate should be run on them before merge).
The lane itself: land after shellcheck. Disposition: request-changes.
…ra VM (#892) Fix the shellcheck warnings (SC2155 local split, unused REPO_ROOT/i, the unused finish extra arg) so the lane can be committed under the repo hook.
f0dfd4d to
88afae1
Compare
c03rad0r
left a comment
There was a problem hiding this comment.
Re-review — shellcheck clean. Approving.
The four warnings are fixed without changing the lane: local shape split from its assignment (SC2155), the unused REPO_ROOT/i removed, and finish no longer references arguments ("$*" and the unused extra unpack dropped). shellcheck -S warning on both scripts is clean; bash -n clean.
The lane itself (pristine-by-proof, two known-reds as the #888/#890 acceptance criteria) is unchanged and was reviewed as the right shape.
Disposition: land.
What
tests/installer-contract/run.sh+ README: the installer validation performed by hand on the vlab lane on 2026-10-11, made repeatable — install a built.apkon a pristine OpenWrt 25.12 VM with the documented operator env (TOLLGATE_ADMIN_PASSWORD,TOLLGATE_PRIVATE_WIFI_PASSWORD), then assert the credential and convergence contracts, including reboot persistence. Output idiom matchestests/happy-path(ICCHECK/ICRESULT/ICEXIT).Verified end-to-end on the vlab lane (ai-legion, OpenWrt 25.12.5 x86-64,
tollgate-wrt-0.6.0_rc1-r0.apk@362e5d5, sha256a9a8c007…)firstboot -y && rebootwas proven to silently keep/etcon this image (false pristine → credential assertions would lie); the lane forcesreboot -fAND asserts the clean state (no tollgate-wrt, empty root credential);contract:credential-appliedFAIL = the installer: TOLLGATE_ADMIN_PASSWORD / TOLLGATE_PRIVATE_WIFI_PASSWORD never reach the uci-defaults script underapk addon 25.12 — the documented install-time credential UX is broken #888 acceptance criterion (apk-tools drops the install-time env; the manual session proved the script honors the env when run directly);contract:provisional-lifecyclePASS = the safe degraded path pinned (silent random credential, marker, FIRST-RUN page);listeners:8090/:8443FAIL = the entry-port flip: LuCI's :8090/:8443 pair does not converge after a fresh-image install (board mode) — caught by the new installer-contract lane #890 acceptance criterion — the lane caught the entry-port flip's LuCI half not converging on a true fresh-image install (present on the earlier already-booted path;uhttpd mainends with no listeners).Why shipped red
The two known-reds are the acceptance criteria of open issues; a fence that cannot fail is decoration. README documents the flip-to-green conditions (#888 fix ⇒ credential-applied green + provisional-lifecycle SKIP; #890 fix ⇒ listeners green).
Out of scope (README): radios/SSID, br-private, ipk-era — physical/PRTA lane ground.
Closes nothing; acceptance-for #888 #890. Review lane: wave2a.