Repository navigation
[Tracking] Remaining CI / build / release / E2E automation work #3278
Description
Activity
- addedepicA large development increment that brings definite value to Cozystack usersA large development increment that brings definite value to Cozystack usersarea/ciIssues or PRs related to CI workflows, GitHub Actions, automationIssues or PRs related to CI workflows, GitHub Actions, automationarea/testingIssues or PRs related to testing (e2e, bats, unit tests)Issues or PRs related to testing (e2e, bats, unit tests)area/buildIssues or PRs related to image build infrastructure, multi-arch supportIssues or PRs related to image build infrastructure, multi-arch supportarea/releaseIssues or PRs related to release tooling (changelog, backport, release pipeline)Issues or PRs related to release tooling (changelog, backport, release pipeline)
on Jul 13, 2026 myasnikovdaniil commented
on Jul 20, 2026 ContributorAuthorMore actionsState refresh — 2026-07-20
Body updated to the 2026-07-20 snapshot, verified against
main+ live PR/issue state. What moved since the 07-13 snapshot:Done
- A8 — diff-driven install selector merged (test(e2e): diff-driven install selector select-install.sh #3279, 07-15).
hack/select-install.sh+select-install_test.batsonmain; sub-epic [Epic] Diff-driven E2E install selector — hack/select-install.sh + test-minimal (#2847 Track A) #3277 closed as completed.
Two corrections to what the previous snapshot claimed
- A4 was overstated. It recorded
NIGHTLY_ENABLEDas a partial win. The Nightly workflow has in fact never completed a run — every scheduled run since the variable was set fails ~80s in at "Resolve source commit and version", becausecozystack-packagesis a Flux OCI artifact (application/vnd.cncf.flux.config.v1+json) andskopeo inspect --format '{{.Digest}}'is an image-specific operation on it. Nothing has been published:cozy-installer:nightlyandcozystack-packages:nightlyboth 404 on GHCR. fix(ci): resolve nightly packages digest without image-specific skopeo ops #3332 fixes that plus twoflux pull artifact --outputfailures queued behind it. A4 is enabled but non-functional, not partially done. - A11 changed shape. No longer "unstall the [ci] Add upgrade test job to release pipeline #2401 review". [ci] Add upgrade test job to release pipeline #2401 predates the BATS→Chainsaw migration and is now a single conflicting 895-line BATS file; test(e2e): add chainsaw-native release upgrade testing lane #3276 supersedes it with a Chainsaw-native upgrade lane (install-previous → seed canary data → upgrade → assert survival/data-integrity/HR-reconciliation/migration-stamp) as a parallel non-blocking
upgrade-e2ejob. Remaining is review + a dev-cluster run for the canary access paths and the env-gated tenant-Kubernetes suites.
Two new action IDs
- A16 — select-e2e.sh: a per-suite test edit silently defeats the full-suite escalation #3330:
select-e2e.sh's full-suite escalation is silently defeated when a PR also edits one unrelated suite's tests. The empty-final_appssafety net keys off emptiness alone, so any other contributed suite name swallows the escalation — the same system-package change selects 22 suites alone and exactly 1 alongside a suite edit. This is in the selection foundation A8 mirrors and A9 wires into CI, so it is sequenced ahead of A9. - A17 — ci: guard against pinned base-image digests disappearing upstream #3305: retired base-image digests block unrelated builds (
quay.io/centos/centos:stream9retired its pinned manifest on 07-15, five days after the last Renovate digest bump). Direction: mirror volatile bases into a project-controlled registry + a scheduled preflight that verifies every pinned base still resolves.
Verified unchanged — A6 (no
go build ./...gate inpull-requests.yaml), A13 (backport/backport-previousstill top-level in.github/labels.yml), A12, A14 not started; A3 and A5 still admin / event-driven. A15's #3266 is still an open draft.- A8 — diff-driven install selector merged (test(e2e): diff-driven install selector select-install.sh #3279, 07-15).
- added a commit that references this issue
on Aug 10, 2026 - addedtriage/acceptedIndicates an issue is ready to be actively worked onIndicates an issue is ready to be actively worked on
on Aug 12, 2026 myasnikovdaniil commented
on Aug 14, 2026 ContributorAuthorMore actionsState refresh, 2026-08-13
Body re-verified against
mainat09dc7f47fplus live PR, workflow-run and registry state. A5 is done,promote-rc.yamlhas cut two releases live, v1.6.0 (2026-07-22) and v1.6.1 (2026-08-05), so the orchestration has been proven twice rather than never. A16 is done, #3441 (2026-08-10) closed #3330 and #3665 by deciding coverage per changed path, and #3670 closed #3392 before it, which removes the correctness prerequisite that was sequenced ahead of A9. A9 is re-sequenced rather than started: it is now gated on the install-telemetry measurement in #2847 Track A, because the "~60% of PRs touch one app" payoff has never been measured and §7 ofdocs/agents/e2e-testing.mdrecords that most PRs legitimately escalate to the full suite. The escalation surface moved three times in the six days to 2026-08-10 and settled when #3434 closed on 2026-08-13, so a measurement should record the commit it was taken at. A4's recorded diagnosis is obsolete. #3332 worked,cozy-installer:nightlyandcozystack-packages:nightlyboth resolve on GHCR now where both previously 404'd, and the lane published for ten days, but every scheduled run since 2026-08-02 fails on itsE2E (full suite)job. That failure is known and being worked, so A4's remaining repo-side content is theRETENTION_APPLYflip and the action ID stays whole. A17 is partial: #3386 and #3400 fixed the retired-digest trigger and moved kubevirt-csi-driver todocker.io/library/almalinux:9, but the inventory, mirror and scheduled preflight #3305 asks for do not exist. Two smaller corrections: A11 has gone backwards (#3276 is now conflicting as well asCHANGES_REQUESTED, and #3449 moved the release-validation jobs it sequences against), and A10 should not be read as closing #2979, which still has two BATS suites left. Everything else on the list is unchanged, and #3572 is a citation of this issue in the CNCF GTR questionnaire rather than work in scope.Status as of 2026-09-01
Re-verified against
mainate84a44689plus live run, PR and label state.A13 is done, #2585 closed 2026-08-27.
kind/backportandkind/backport-previousare in.github/labels.ymlwith bare names kept asaliases:, andbackport.yamluses the namespaced literals. Adjacent fix noted alongside it did not land:full-e2eis still undeclared (zero occurrences inlabels.yml) and survives only because sync runs withdelete-other-labels: false. Worth folding into next labels change.Everything else was re-checked individually rather than carried forward, and is unchanged: A6 (no
go build ./...gate inpull-requests.yaml), A9 (select-install.shinvoked by no workflow), A12 (.chainsaw.yamlstillparallel: 1), A14/A15 (hack/e2e-chainsaw/backup/chainsaw-test.yaml.disabledstill parked), A2 (SBOM ?= 0inhack/common-envs.mk, no workflow sets it), A17 systemic half (no scheduled base-digest preflight among the 27 workflows), A3 (one ruleset) and A4'sRETENTION_APPLY(stillfalse). A1 code half remains done, everyruns-onisubuntu-*ororacle-vm-*.A4: nightly is the steady state, not an incident
The 2026-08-13 snapshot recorded nightly's
E2E (full suite)job as a known failure being worked. It has failed every scheduled run since 2026-08-02, thirty days in a row, always atRun E2E tests (full suite). Latest: https://github.com/cozystack/cozystack/actions/runs/33462145699"Being worked" doesn't describe that anymore. Platform has had no daily full-suite signal for a month, so whatever TIA narrows away on the PR lane is unobserved until a release cut re-runs the full suite. It also blocks work nobody has proposed yet: any plan that moves an expensive suite off the PR lane and into nightly needs somewhere green to move it to, and there isn't one right now. I suggest promoting this from a note under A4 into its own action, size is unknown and other things queue behind it.
A9: the measurement it waits on is partly answered, and points elsewhere
A9 is gated on measuring the "~60% of PRs touch one app" figure. A related number is already available from workflow-run history, and it reframes the action instead of unblocking it. Over 2026-06-23..2026-08-23, of 2,118 E2E job executions only ~12% selected light suites, 1,260 selected
kubernetes-*, and 692 died before the selector ran. Most runs escalate, which matches whatdocs/agents/e2e-testing.mdalready says about escalation being usually correct.So wiring
select-install.shas it stands would act on roughly one run in eight, because escalation decides install scope before the closure ever gets to narrow it. That doesn't make A9 wrong, but its payoff is bounded by escalation rate rather than by closure precision, so narrowing what an escalation escalates to should come first.Not currently tracked
Three items with no action ID, all acting on the PR lane without touching what any suite asserts.
-
Fourth selector outcome.
select-e2e.shhas three now: full suite, a scoped set, nothing. Fail-closed is right and stays, but the only thing to fail closed to is the full suite, which includes the two most expensive tests in the tree.kubernetes-latestandkubernetes-previousare 68 of the 131 minutes of chainsaw time on a green run, measured on run 33372552453 via itschainsaw-reportartifact. A broad-but-not-heaviest tier, every app suite withoutkubernetes-*, keeps every path classified and every escalation mandatory, only the destination changes. This is the prerequisite for A9 above. -
Suite parallelism.
.chainsaw.yamlrunsparallel: 1and the stated reason is one suite's fixed port-forward port. The 17 suites that are neitherkubernetes-*nor a backup round-trip cost 26 minutes sequentially. Needs scoping rather than a global flip, the heavy suites are already CPU starved on the current runner class, so per-Testconcurrency control is likelier to be the right shape. -
Expensive lane once per PR instead of once per push. Currently 4.5 runs per PR on average, and one renovate branch got 41. Trigger it on
pull_request_review(approved) rather than onsynchronize. This costs nothing in coverage and that is checkable rather than asserted: renovate runs withautomerge: falseandplatformAutomerge: false, the ruleset requires one approving review, so every PR that reachesmainis approved by definition and gets the lane. Organization admins can still bypass, exactly as they can today.dismiss_stale_reviews_on_pushis already on, so a push after approval invalidates it and the next approval re-runs the lane.Worth separating two axes that the
full-e2elabel currently carries together: when the lane runs, and what scope it runs at. The gating sites readgithub.event.label.name(the concurrency key,plan, and the two job guards), the scope sites readcontains(labels.*.name, 'full-e2e')(the rc check, the TIA skip, and theFULL_E2Eenv). They are already in separate places. A second label for "run the lane now at the scope this diff selects" fits the gating sites only, and leavesfull-e2eowning scope alone. It should be one-shot, removed when the run starts, whilefull-e2estays sticky because promote PRs rely on that. Naming:e2e/runande2e/full, withaliases: ['full-e2e']on the second, same shape A13 just gave the backport labels.full-e2ehas to be declared inlabels.ymlanyway, so declaring the pair in the right form now is cheaper than renaming it later.One caution for whoever writes it: the concurrency key and
plan's guard are exact complements of each other by design, and the comment above them records what happened on live CI when they disagreed. A third label name has to be added to both.
A15 has moved
Tracker points A15 at #3266, which is still a draft with changes requested and hasn't moved since 2026-07-20. Live work is #3961 now, container lane plus three storage fixes it exposed. Worth repointing.
-
- added a commit that references this issue
on Sep 7, 2026 State refresh, 2026-10-02
Added the rest of the re-check to the body, against
mainatbc400dff1. A18 stays as written (#4642).Two things I wrote on 2026-09-01 are wrong. Nightly was not red 30 days in a row, there was a green scheduled run on 2026-09-03 (and one on 2026-08-17). And A15 should not point at #3961, it was closed unmerged on 2026-09-30 after #4020 landed the container lane.
New is A19: the GHCR retention job fails on its package listing (HTTP 400, red on every scheduled run since 2026-08-18), so flipping
RETENTION_APPLYin A4 would delete nothing. A6 is partial,go build ./...already runs incodeql.yml, it is just not a required check. A9 changed design, #4022 uses a--disabledlist, sotest-minimalis obsolete. A13 is done. A17 got a third incident (#4486) outside the scan scope of #3305.The PR-cost series was in no tracker before. #4005, #4008, #4022 and #4023 are open, #4019, #4020 and #4021 are merged.
A19 has a cause: GitHub refuses to list an org's container packages to a GitHub App installation token.
GET /orgs/{org}/packages?package_type=containerreturns400 Invalid argumentfor that token type, other package types work with the same token, andretention.yamlcalls it with the cozystack-ci app token. A classic PAT withread:packageslists all 97 org packages with the same request. This is undocumented but known, see actions/github-script#449 and cli/cli#9606.The listing never worked in this workflow. Every scheduled run from 2026-07-15 to 2026-08-17 logged the same 400 and still exited green with "No cozystack/* container packages found", so retention has never pruned anything. ffae003 only made the old failure visible, from 2026-08-18 on.
Two ways out. One is a classic PAT with
read:packagesanddelete:packagesas a secret for this job only. The other is to drop the org-wide listing and loop over a known list of package names, because/orgs/{org}/packages/container/{name}/versionsaccepts an installation token. I didn't check whether the version DELETE accepts the app token either, that needs a test beforeRETENTION_APPLYis flipped.A4 follow-up from #4826: the retention workflow will not prune
cozystack/cozystack-ui. It has 68 dated nightly versions today, 54 over the keep count of 14, and the number grows with every nightly.The reason is the token. #4826 deletes with this repository's
GITHUB_TOKEN, because the app token gets 404 on DELETE. That token deleted a version of a package linked tocozystack/cozystack, butcozystack/cozystack-uiis linked to thecozystack/cozystack-uirepository. I did not test the token there and the workflow does not try: it skips the package and names it in a warning on every run.Two ways to cover it:
- a retention job in
cozystack/cozystack-uiitself, deleting with that repository's ownGITHUB_TOKEN - an explicit Actions access role for
cozystack/cozystackin the package settings (needs a package admin, and it is untested whether that is enough for DELETE)
- a retention job in
Summary
Umbrella tracking issue for the remaining CI / build / release / E2E-testing automation work. It is a companion to the individual epics (#2937, #2677, #2499, #2847, #2653, #2585, #3238, #4642) and gives one place to see what is done, what is ready, and what is externally blocked. Action IDs (A1-A19) are stable references.
Update 2026-10-01
The E2E lane items were re-checked first. The remaining actions were checked against
mainatbc400dff1on 2026-10-02 and the bullets below carry the corrections, the 2026-08-13 text further down is the older snapshot.A14 and A15 are done via #4020 (2026-09-07, backported in #4437): srv1-srv3 of both merge-gating lanes run as Talos containers, and #3238 is closed. What the container lane cannot run (DRBD, the
replicatedStorageClass, live migration, the cozystack talos image) is the new action A18, tracked in #4642.nightly.yamlande2e-tag.yamlstill boot QEMU, the rc e2e job failed on v1.6.2-rc.1, v1.6.3-rc.1, v1.6.3-rc.2 and v1.6.4-rc.1, and v1.6.2, v1.6.3 and v1.6.4 were promoted withskip_e2e_gate: true. The nightly mirror job failure since 2026-09-15 is #4423 and is not part of A18.Nightly is worse than the 2026-08-13 text says. The last scheduled green was 2026-09-03, before that 2026-08-17, and
Artifact Retentionhas been red on every scheduled run since 2026-08-18 (new action A19).Promote RCskipped the e2e gate on all five runs since 2026-08-05 (v1.6.1, v1.6.2, v1.5.4, v1.6.3 and v1.6.4), each loggedPromoting <rc> without verified green full E2E evidence.Status as of 2026-08-13
Re-verified against
mainat09dc7f47fplus live PR, run and registry state. Two actions moved to done since the 2026-07-20 snapshot: A5, becausepromote-rc.yamlhas now cut two releases live (v1.6.0 on 2026-07-22 and v1.6.1 on 2026-08-05), and A16, closed by #3441 on 2026-08-10, which removes the sequencing constraint it placed on A9. One diagnosis is obsolete rather than resolved. A4's "nightly has never completed a run" was fixed by #3332 and nightly published for ten days, but it has failed every scheduled run since 2026-08-02 on itsE2E (full suite)job. That failure is known and is being worked, so what changes here is the recorded cause, not the ownership. A17 is now partial, the specific retired-digest blocker is gone and the systemic preflight is not. The other twelve actions are unchanged, and none has been overtaken by the Chainsaw migration.One sequencing change: A9 is gated on measurement rather than merely unblocked. Its payoff rests on a "~60% of PRs touch one app" figure that has never been measured, while
docs/agents/e2e-testing.md§7 records that most PRs legitimately escalate to the full suite. The install-telemetry task in #2847 Track A is A9's prerequisite. The escalation surface that measurement would run against moved three times in the six days to 2026-08-10 and settled when #3434 closed on 2026-08-13, so a number taken now describes post-#3441 behaviour and should record the commit it was taken at.Status snapshot
go build ./...runs incodeql.ymlon every PR andgo-module-testsrunsgo testin the nested modules, A6 is a decision nowselect-install.sh --disabledin #4022 (open) and the measurement was read by hand, install takes about 28 min and 73% of PR runs are full-suite. Track B is #3276 (A11), which needs a rework on the container laneDone since the 2026-07-20 snapshot
promote-rc.yamlsucceeded on 2026-07-21, twice on 2026-07-22 and on 2026-08-05, covering v1.6.0-rc.4 → v1.6.0 (2026-07-22) and v1.6.1-rc.1 → v1.6.1 (2026-08-05).cut-prerelease.yamlsucceeded four times of five. Update 2026-10-02: the promotes since then (v1.6.2, v1.5.4, v1.6.3, v1.6.4) succeeded too, all with the e2e gate skipped, see A18.docs/agents/e2e-testing.md§7. Related: fix(ci): close the silent-green gaps in e2e selection and the helm unit sweep #3670 (2026-08-08) closed e2e: an empty TIA selection concludes "E2E Tests" green with no suite run #3392, so an unclassified path escalates rather than producing an empty selection that both lanes read as "skip Chainsaw" before postingE2E Testsgreen (hack/select-e2e.sh:322). A9 no longer has a correctness prerequisite ahead of it, what stands in front of it now is the measurement described under "Ready now".localStorageClass. test(e2e): lightweight E2E cluster (kind / Talos-in-Docker) for diff-scoped PR runs #3238 was closed on 2026-10-01 as done via test(e2e): run the merge-gating lanes on Talos containers #4020. The suites and cases that still need a real cluster are listed in e2e: retire the QEMU lane, run what only it covered on a temporary cluster #4642 (A18). The OpenEBS LocalPV hostpath package from feat(local-storage): add opt-in OpenEBS LocalPV hostpath package #3266 (open, changes requested) is not part of it, the lane runs on the LINSTORlocalStorageClass.full-e2eis still not declared in.github/labels.ymland survives only because the label sync runs withdelete-other-labels: false.Carried forward from earlier snapshots, still true:
hack/select-install.sh+hack/select-install_test.batsare onmainand run on every PR viaMakefile:161→make unit-tests→pull-requests.yaml:212. Sub-epic [Epic] Diff-driven E2E install selector — hack/select-install.sh + test-minimal (#2847 Track A) #3277 closed as completed. Note the selector is still not invoked by any workflow, so its closure has never been exercised against a real install, and that is A9's job.hack/e2e-chainsaw/, 21 runnable,backupparked aschainsaw-test.yaml.disabled. The migration issue test(e2e): migrate the E2E app suite from BATS to Kyverno Chainsaw #2979 was closed on 2026-08-14 as done. The two unported files,hack/e2e-apps/monitoring-oidc-customconfig.batsandhack/e2e-apps/monitoring-oidc-system.bats, moved to [Tracking] Shell test architecture: vanilla BATS for unit tests, assert library, testable suite shell #3453 item 7, where the point is that no lane invokes either of them, so monitoring OIDC has e2e coverage on paper and none in practice. Update 2026-10-02: 23 suites are runnable now,backupandkubernetes-proxmoxare parked, and the two monitoring OIDC BATS suites were deleted in test(e2e): remove unused monitoring suites and audit BATS runners #4019 (2026-09-25), which closed [Tracking] Shell test architecture: vanilla BATS for unit tests, assert library, testable suite shell #3453 item 7.debugreroute (ci: move remaining workflows off the persistent self-hosted runner #3268, 2026-07-09). Everyruns-ononmainisubuntu-*ororacle-vm-*, excepte2e-proxmox.yaml, which uses[self-hosted, proxmox]on purpose and is gated behind thePROXMOX_NIGHTLYvariable (unset). Residual is the physical host retirement plus rehoming the breakpoint rendezvous server, which is still load-bearing: the breakpoint step reaches it through theBREAKPOINT_ENDPOINTrepository variable (pull-requests.yaml:1026).Corrections to the previous snapshot
cozy-installer:nightlyand 200 forcozystack-packages:nightly, where both previously 404'd. What is true now is a different failure: 12 consecutive scheduled failures since 2026-08-02, and on the latest run the failing job isE2E (full suite)atRun E2E tests (full suite)whileMirror images to GHCRandBuild & publish nocloud diskboth succeed. Six of the last 29 scheduled runs passed, plus one manual dispatch on 2026-07-21. The current failure is known and is actively being worked, so A4's remaining repo-side content is theRETENTION_APPLYflip, and what this correction changes is the recorded cause, which is no longer the digest-resolution bug fix(ci): resolve nightly packages digest without image-specific skopeo ops #3332 fixed. docs: add CNCF General Technical Review (GTR) questionnaire #3572's GTR questionnaire reports the same flapping independently and adds thate2e-tag.yamlalso failed around the v1.6.1 release, which may share a cause. Update 2026-10-02: scheduled nightly was green on 2026-08-17 and 2026-09-03, so the count of failures above is off by those two.packages/apps/kubernetes/images/kubevirt-csi-driver/Dockerfile:17is nowdocker.io/library/almalinux:9@sha256:d2515c76…and noquay.io/centosbase remains underpackages/. The systemic half, an inventory of volatile digest-pinned bases, a project-controlled mirror, a scheduled preflight that verifies every pinned base still resolves, is untouched, and ci: guard against pinned base-image digests disappearing upstream #3305 stays open on that.CHANGES_REQUESTED, and now conflicting (last updated 2026-07-31), so a rebase is part of the work. The jobs it has to sequence against also changed under ci(release): move release validation to rc time — e2e lane, changelog button, promote gate, docs at promote #3449 (2026-07-29):tags.yamlnow runsrc-e2e(line 322) ahead ofgenerate-changelog(368) andupdate-website-docs(625), andpromote-rc.yamlcarries its ownchangelog(499) andwebsite-docs(536).Ready now, no blockers
go build ./...gate. The gate exists:codeql.ymlruns it in the root module,api/apps/v1alpha1and the three image modules on every PR since 2026-06-26, andgo-module-testsrunsgo test ./...in the nested modules. CodeQL is not a required check, the required contexts arepre-commitandE2E Tests. Needs a decision: count CodeQL and close ci: add CI gates for codegen drift, Go build, and Go unit tests #2499, add a step topull-requests.yaml, or make the CodeQL check required.CHANGES_REQUESTED) addsselect-install.sh --disabled <suites>, which emitsbundles.disabledPackagesfor an ordinary variant, so thetest-minimalbundle andCOZYSTACK_ENABLED_PACKAGESare obsolete. Wiring it into a workflow is follow-up work, nothing under.github/referencesselect-install. The measurement was read by hand from 62 PR e2e jobs on the container lane (2026-09-28 to 09-30): install took 28 min median, andRun E2E testswas full-shaped in 73% of jobs, scoped in 23% and skipped in 5%, classified by step duration. Install selection can only save on the scoped jobs. The window is three days and heavy on re-runs.hack/e2e-chainsaw/*/chainsaw-test.yaml, find theassert/waitsteps that duplicateHR Ready, keep the CR-operator-async waits. The audit in Audit e2e Chainsaw post-HR-Ready asserts for redundancy under Flux v2.8 kstatus #2653 was redone on the Chainsaw suites on 2026-10-01, the candidate list, the check of the nested-systemHR on a dev cluster and the scope of the first PR are in its comments. Coordinate with [Epic] Adopt the kstatus readiness model platform-wide (Flux 2.8 / helm-controller v1.5.0) #2642: feat(api): typed waitStrategy/healthCheckExprs for kstatus readiness (#2642) #3273 (merged 2026-07-21) landed the typedwaitStrategy/healthCheckExprsAPI, adopted so far only inpackages/extra/monitoringandpackages/extra/seaweedfs, and feat(flux): kstatus health gates on CR-wrapping umbrella HelmReleases #3264 is still a draft with changes requested.Blocked / sequential
v*,api/apps/v1alpha1/*creation-restricted to the CI app). Repo-admin only. The repo has no rulesets of its own, the one that applies is an org-level branch ruleset ("Require PR review for default branches", apull_requestrule, no tag target). Ruleset + rollout order documented indocs/release.mdvia feat(release): add Cut Pre-release Tag workflow (#2677) #3253.RETENTION_APPLY(retention still defaults to dry-run at.github/workflows/retention.yaml:65). Bundles with A3 in one admin request. The workflow fix is done (fix(ci): resolve nightly packages digest without image-specific skopeo ops #3332), and the red nightly runs are ci(nightly): Mirror images to GHCR fails on ghcr write_package, so the nightly e2e has not run since 2026-09-15 #4423 (mirror job) and A18 (e2e: retire the QEMU lane, run what only it covered on a temporary cluster #4642, E2E job). Flipping it would delete nothing today, A19 comes first.--sbom=true→ delivery decision. The plumbing already exists (hack/common-envs.mk:61,:71:SBOM=1→--sbom=true, landed 2026-06-22) and no workflow sets it, so the remaining work is the probe and the delivery decision, not the build flag. Ties into the OpenSSF supply-chain work (ci: harden GitHub Actions workflows for OpenSSF Scorecard (pin, permissions, zizmor gate) #3223) and is cited as a gap in the CNCF GTR questionnaire (docs: add CNCF General Technical Review (GTR) questionnaire #3572).CHANGES_REQUESTEDon 2026-09-29, and it needs a rework more than a rebase. The review lists: 13 of 19 commits carry trailers the contributing rules don't allow, the lane sits on QEMU and on artifacts the main PR pipeline no longer produces, baseline v1.6.4 has nodrbd.enabledin the linstor chart so a baseline run needs QEMU until a release has it, and the lane has its own HR wait next tocozy_wait_all_helmreleases_ready. test(e2e): wire the 1.5→1.6 etcd upgrade job into CI as the authoritative regression guard #3316 was closed as stale on 2026-10-01, it asked for a 1.5 to 1.6 job and v1.6.4 is stable and main is v1.7.0-alpha.3.quay.io/kubev2vdigests inpackages/system/forklift-operator/templates/forklift-operator.yamlno longer resolve (forklift-operator: 14 of 16 pinned images no longer exist on quay.io #4486). It sits in a vendored template, outside what ci: guard against pinned base-image digests disappearing upstream #3305 looks at (Dockerfiles and.tagfiles), so the scope has to widen to templates and values.nightly.yamlande2e-tag.yamlstay on QEMU, rc e2e is red and releases go out withskip_e2e_gate: true.retention.yamlreturnsgh: Invalid argument. (HTTP 400). It did on 2026-07-08 already, back then the job printedNo cozystack/* container packages foundand exited 0.ffae003d6(2026-08-14) made that case fail, so every scheduled run is red since 2026-08-18. I couldn't find the cause of the 400, my token gets 403 on the packages API.Effort and closeability
Sizes recalculated 2026-08-13 against current state, not carried over. The A6, A9, A11 and A13 rows were updated on 2026-10-02. S = hours, M = a day or two, L = multi-day.
codeql.yml.full-e2eis still undeclared inlabels.yml.RETENTION_APPLYflip, bundled with A3. The nightly lane's red runs are #4423 and A18.test-minimalis obsolete. Size not re-estimated.Issue → closeability
hack/e2e-apps/monitoring-oidc-*.batssuites moved to [Tracking] Shell test architecture: vanilla BATS for unit tests, assert library, testable suite shell #3453 item 7 as a coverage regression rather than a migration remnant, and neither is covered by an action ID here. They were deleted in test(e2e): remove unused monitoring suites and audit BATS runners #4019 instead of being ported.Recommended sequence
RETENTION_APPLYflip in A4 (longest external lead time).select-install.sh --disabledinto the PR and fork lanes.