test(e2e): cover release channels end to end - #1023
Draft
rl-block wants to merge 1 commit into
Draft
Conversation
This was referenced Sep 4, 2026
🔐 Codex Security Review
Review SummaryOverall Risk: HIGH Findings[HIGH] Automated review incomplete
NotesHuman review is required because the bounded automated review was incomplete. Generated by Codex Security Review | |
rl-block
force-pushed
the
rollout/03c-release-channels-e2e
branch
from
September 4, 2026 09:39
c267228 to
e7bc2ab
Compare
This was referenced Sep 4, 2026
rl-block
force-pushed
the
rollout/03c-release-channels-e2e
branch
from
September 4, 2026 10:10
e7bc2ab to
c1f0ef4
Compare
rl-block
force-pushed
the
rollout/03c-release-channels-e2e
branch
2 times, most recently
from
September 4, 2026 10:36
145d118 to
df2a72d
Compare
Channel creation, firmware enforcement and drift correction as miners move in and out of scope, rollback, pilot and batched updates with review gates and auto-continue, cancel remaining, and the header pill deep-link.
rl-block
force-pushed
the
rollout/03c-release-channels-e2e
branch
from
September 4, 2026 12:06
df2a72d to
9486cab
Compare
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.
Reviewable diff: +498/-1 across 1 files (excludes generated, test, and story files). Figures are for the pre-rebase head; see Contract alignment.
Summary
Covers release channels end to end against the fake proto-rig setup: creating channels, enforcing firmware per model, keeping miners exclusive to one channel, rolling back, pilot and batched updates with review gates and auto-continue, cancelling the remaining updates, and the header pill's attention state and deep-link. Top of the stack; no product code changes.
Stack. #1014 (merged: API contract) -> #1015 -> #1016 -> #1017 -> #1018 -> #1019 -> #1020 (Release Channels tab) -> #1021 (active updates UI) -> #1022 (header pill and activity log) -> #1023 (this PR). Diff is relative to #1022 and exercises the whole series; nothing here needs to be re-reviewed for behaviour, only for what the spec asserts. Upstream context: the UI test ids and flows from #1020–#1022, and the engine timings from #1017 (verification happens on the next enforcement tick after a fake rig reports the new version). Out of scope: running against real hardware (
test.skipwhentarget === "real"), and console-error assertions.How it works
The spec (
firmwareRollout.spec.ts) drives the app as an admin. Each test uploads Rig firmware files with a per-run version (3.x.<runId>) so the fake rigs, which keep their firmware between runs, are always mismatched and an assignment always starts a rollout;afterEachdeletes the run's channels and files in a fresh browser context so a failing test does not leave state behind. Five scenarios:The page object (
settingsFirmware.ts) hides the DOM behind intent-level methods: tab switching, channel create/edit/delete, scope selection through the shared miner modal, behaviour controls (method, sizes, auto-continue toggle), firmware assignment, banner and detail interactions (continue, cancel remaining, roll back, view miners), history, and the header pill (validateAppRolloutPill,validateAppRolloutPillNeedsAttention,followAppRolloutPillToChannels). Waits are on server-derived state (device versions, rollout state labels), not fixed sleeps.Diagrams
flowchart LR Spec["firmwareRollout.spec.ts: 5 scenarios, per-run versions, afterEach cleanup"] --> PO["SettingsFirmwarePage page object"] PO --> UI["Firmware page: tabs, manage view, banners, detail, history, header pill (#1020-#1022)"] UI --> API["RolloutService (#1018)"] API --> Engine["enforcement loop (#1017)"] Engine --> Rigs["fake proto rigs: accept FirmwareUpdate, report new version"] Rigs --> EngineAreas of the code involved
client/e2eTests/protoFleet/pages/settingsFirmware.tscheck()for the hidden switch input; modal defaultdata-testidused; waits for the miners modal's paged fetch; rollback located by its "Roll back to " action, which lives on the entry that replaced the version)testIds in #1020–#1022 and that waits are state-basedclient/e2eTests/protoFleet/spec/firmwareRollout.spec.ts(new)Key technical decisions & trade-offs
afterEach, so a scenario that fails mid-modal still deletes its channels and files.Contract alignment (after the #1014 merge)
#1014 merged on 2026-09-08 as
74454ed9. This stack was cut against the contract as it stood on 2026-09-04 (4256f05f); the contract then absorbed thirty Codex review rounds before merging. On 2026-09-08 the branch was rebased ontomainso it carries only its own commit. Head on GitHub is pre-rebase. The rebased branch does not compile against the merged contract (the pre-push typecheck/lint hooks reject it), so it has not been pushed; until the reconciliation below lands, the diff GitHub shows against the moved base branch is inflated with the pre-merge contract commits.This PR implements: Playwright coverage of the Release Channels flow end to end.
Contract surface added after the stack was cut, not in this PR:
These gaps are tracked in the stack status note and are the subject of the reconciliation plan for the next revision of this stack.
Testing & validation
eslint --max-warnings 0on both files.just test-e2e-fleet --grep firmwareRollout, desktop project) on the functionally identical tree of the previous stack (feat(rollout): active firmware updates, history and header pill #1011); this stack only reshuffles server test files and rebases onto currentmainplus the fix(client): stop MinerSelectionModal re-rendering in a loop #1013 test commit.