Skip to content

ci: modernize Node builds and add validation gates - #2109

Draft
rarepops wants to merge 2 commits into
DeusData:mainfrom
rarepops:ci/2108-modernize-node-workflow-gates
Draft

rarepops wants to merge 2 commits into
DeusData:mainfrom
rarepops:ci/2108-modernize-node-workflow-gates

Conversation

@rarepops

@rarepops rarepops commented Sep 8, 2026

Copy link
Copy Markdown
Contributor

What does this PR do?

Closes #2108.

This draft implements the CI maintenance proposal while awaiting maintainer feedback on its scope. Node 22 is still supported; this is not a blanket action-runtime deprecation update.

  • Centralize UI build, Windows UI guard, and npm publishing runtimes on Node 24 through .node-version.
  • Run the existing frontend tests and production build on Node 22 and 24 through one shared local/CI entry point.
  • Expand the existing package-wrapper matrix to Node 22 and 24 without changing the public runtime minimum.
  • Pin all three Noble-specific LLVM lint/diagnostics jobs to Ubuntu 24.04.
  • Replace deprecated actions/attest-sbom with the exact actions/attest implementation it already delegates to, preserving SBOM inputs, defaults, and NODE_OPTIONS.
  • Add actionlint 1.7.12, with a verified release checksum, to the reusable lint workflow. Keep ShellCheck and Pyflakes outside this focused check.
  • Schedule weekly graph-ui npm updates, grouping minor/patch updates and keeping major upgrades separate.
  • Extend the venue-parity contract and document the shared local validation commands.

Existing C/sanitizer coverage, SHA-pinning policy, token permissions, release gate ordering, and supported platforms remain intact. No application dependency versions are changed.

Validation

Passed locally on Windows:

  • actionlint 1.7.12 across all 22 workflows.
  • Frontend on Node 22: 47 tests passed and production build passed.
  • Frontend on Node 24: 47 tests passed and production build passed.
  • npm wrapper on Node 22 and 24: 10 tests passed on each runtime.
  • tests/test_venue_parity_contract.sh, including 20 help entries and 10 strict-argument probes.
  • tests/test_release_gate_chain_contract.sh.
  • tests/test_shell_line_endings.sh.
  • SBOM compatibility check: same delegate SHA, artifact inputs, environment, input defaults, and permissions.
  • Structured runner check: all three jobs using apt.llvm.org/noble run on ubuntu-24.04.
  • git diff --check.

Not run locally: the full C test suite, C lint, Go/PyPI wrapper suites, and hosted cross-platform/release jobs. The existing hosted gates remain enabled; maintainer approval to run fork CI may be required. The frontend build still reports its existing bundle-size warning.

Broader CI audit (2026-09-08)

The follow-up in 840de91 is based on workflow annotations and action metadata, not just action version labels:

  • Parsed all 22 checked-in workflows at e65fffc and resolved 25 distinct action entry points plus their composite dependencies (28 action manifests in total). None declared Node 12, 16, or 20. This result does not cover GitHub-owned generated workflows.
  • Inspected 155 checks from the latest completed run of each of 22 standalone/generated workflow histories. Some histories are months old, so their warnings were distinguished from current configuration problems.
  • The release SBOM job explicitly warns that actions/attest-sbom is deprecated. The unchanged wrapper pin in current source emitted the same warning; it is now replaced by its exact delegate.
  • The diagnostics job had the same moving-runner/Noble-repository mismatch as the lint jobs. All three jobs are now pinned consistently.
  • Maintainer setting required: this generated Pages run loads upload-pages-artifact@v3 -> upload-artifact@v4 (Node 20). The Pages API reported build_type: legacy, source main:/docs. The checked-in Pages workflow already uses upload-pages-artifact v5 with a Node 24 uploader. Select Settings > Pages > Build and deployment > Source > GitHub Actions, then run Deploy Pages. This PR does not change live repository settings and cannot eliminate that generated-run warning by changing setup-node.
  • The sampled June fablize-ci PR run also had old checkout/setup-python warnings, but that workflow is absent from this current checkout. CodeQL's manual-mode overlay fallback and Homebrew's tap-trust advisory are left unchanged; this patch does not weaken C extraction or tap trust to suppress warnings.

The follow-up passes actionlint and the venue-parity/release-gate contracts. Actual hosted SBOM attestation remains a release-only check and was not triggered locally.

Checklist

  • Every commit is signed off (git commit -s).
  • Tests pass locally (make -f Makefile.cbm test): full C suite not run; focused checks are listed above.
  • Lint passes (make -f Makefile.cbm lint-ci): C lint not run; workflow lint passes.
  • New behavior is covered by a test: existing frontend tests are now gating and the new shared entries are protected by the venue-parity contract.

Use a shared Node 24 build baseline while testing Node 22 and 24. Add frontend and actionlint gates, pin Noble lint runners, and schedule UI dependency updates.

Refs DeusData#2108

Signed-off-by: Rares Popa <2606875+rarepops@users.noreply.github.com>
@github-actions

github-actions Bot commented Sep 8, 2026

Copy link
Copy Markdown

Thanks for opening this — it has been seen, and it is queued.

This note is automated, but it is not a brush-off: it exists so you know where your PR stands instead of having to guess from silence.

Current review status: working through a backlog. 0.9.1-rc.1 is out, so the release freeze that held reviews is over — but it left a large queue of open pull requests behind it, and we are reading through them oldest-first. The background is in discussion #1144.

What that means for this PR, concretely:

  • It will not be closed for inactivity. No stale bot touches pull requests here.
  • It may still sit a while before a human reads it. That is on us, not on you.
  • Older PRs are read first, so a recent one is not being skipped — it is behind a queue.

Things that will genuinely speed it up whenever review does happen:

  • Keep it rebased on main — the tree is moving quickly right now, and a conflicting branch cannot be reviewed as the diff you intended.
  • Get CI green, or say which failures you believe are pre-existing.
  • Keep the change to one claim. Bundled features and refactors get split before they get merged, which costs you a round trip.
  • Every commit needs a sign-off (git commit -s) — CI enforces DCO.

If this fixes a bug, a reproduction we can run is worth more than a description of the symptom.

Thanks for contributing, and sorry in advance for the wait.

Call the exact actions/attest implementation already used by the deprecated wrapper, preserving inputs, defaults, and Node options. Match the diagnostics runner to its Noble LLVM package source.

Refs DeusData#2108

Signed-off-by: Rares Popa <2606875+rarepops@users.noreply.github.com>
@rarepops

rarepops commented Sep 8, 2026

Copy link
Copy Markdown
Contributor Author

CI run 34255410324: Windows daemon guard recurrence

Run at 840de91 completed with one primary failed job: test / test-windows-guards. The ci-ok failure is the expected downstream propagation.

Passing hosted checks include both frontend Node 22/24 jobs, all four package-wrapper matrix jobs, all three lint jobs, security gates, Unix/Windows C shards, sanitizer lanes (diagnostics/MSan/LSan/TSan), and shard completeness. Seven of the eight native Windows guard scripts also passed.

The failures are both in tests/windows/test_daemon_stability.py:

  • section_start_status_port: daemon start on an occupied UI port reports daemon.client.rendezvous_wait / daemon.client.connect_deadline with status=absent, then "the daemon did not accept the UI configuration; browser was not opened".
  • section_cold_storm: client 1 exits with "secure CLI coordination could not be created (endpoint)". This is a completed client returning an error, not the harness's missing-result timeout path.

These symptoms match the pre-existing reports in #2057. I also checked the independent September 6 job directly: it prints the identical cold-storm endpoint refusal for client 2. Comparing upstream base 161df2b with this head confirms src/, internal/, tests/windows/, and scripts/test-windows.ps1 are unchanged by this PR.

The current stability guard already sets a per-section CBM_RUNTIME_DIR, so the older issue description alone is not enough to establish the remaining cause. This report records the recurrence; it does not claim a proven timeout or isolation fix. No retries, timeout increases, skips, or weakened assertions have been added. The root cause remains tracked separately in #2057.

@DeusData DeusData added enhancement New feature or request github_actions Pull requests that update GitHub Actions code priority/normal Standard review queue; useful PR with ordinary maintainer urgency. labels Sep 9, 2026
@DeusData

DeusData commented Sep 9, 2026

Copy link
Copy Markdown
Owner

Thank you for contributing the Node and validation updates, and for documenting the Windows-guard recurrence without weakening the guard. This touches build, test and release workflows as well as contributor guidance, so we need more time to review the scope and release implications before giving a decision.

The review queue is currently full, so detailed feedback may take a little time. We are working through it carefully and appreciate the work you have put into supporting the project. Thank you for your patience.

@DeusData

Copy link
Copy Markdown
Owner

You are owed a decision, and here it is — with an apology for the eleven days it took. On 2026-09-09 we said we needed more time to review the scope; the ball was ours the whole time, and the acknowledgement bot on this thread promises we would not close it for inactivity. We meant that.

First, the thing that deserves saying plainly: when your CI went red you reported it yourself, diagnosed it as pre-existing #2057, corroborated it against an independent job from 2026-09-06, and proved non-causation by diffing base against head to show src/, internal/, tests/windows/ and scripts/test-windows.ps1 were untouched. And then you wrote: "No retries, timeout increases, skips, or weakened assertions have been added." Taking a red rather than laundering it is exactly the instinct this project needs, and it is why the Windows daemon-stability guard is still at full strength.

Decision: two slices taken now, in #2249, with Co-authored-by credit to you. The rest is declined for reasons that are mostly about us, not your code.

Taken:

  1. The three runner pins. This is the best value-per-line change in the PR. lint, lint-mem and test-diag each install from llvm-toolchain-**noble**, which is 24.04 by name, while requesting ubuntu-latest. You spotted a trapdoor that fires on GitHub's schedule rather than ours.
  2. The SBOM attest swap. I verified both halves before touching the release path: 59d89421… is exactly tag v4.1.0 of actions/attest, and sbom-path is a genuine input there. One addition to your version — the step now carries a comment stating it is deliberately release-blocking, because an unattested SBOM is worse than an absent one.

Declined, and why:

  • The actionlint job, as sited. Not the tool — the position. _lint.yml is consumed by pr.yml, dry-run.yml and release.yml; pr.yml gates its entire test stage on lint succeeding, and release.yml:105 gates build on needs.lint.result == 'success'. So a job added there is merge-blocking and release-blocking, with no branch-protection edit to make that visible to a reviewer. Combined with a curl from github.com releases that has no cache and no fallback, one download hiccup would block every merge and every release. Also worth knowing: actionlint 1.7.12 has never been run against current main, which has since gained userns work in _test.yml, a code-scanning gate in release.yml and a clang-21 repin in _lint.yml. If you would like to bring it back in its own workflow — off the lint → test → build chain — after a clean run against main, I would take it.
  • The test-package-wrappers node matrix. test-package-wrappers.sh runs Go, npm and PyPI suites; only the npm leg reads the Node version, so the extra dimension reruns Go and PyPI for no added signal.
  • Everything frontendtest-frontend, .node-version, the dependabot graph-ui block. This one is entirely on our side: the UI is being rebuilt from the ground up, so a PR-time gate on the current graph-ui would buy coverage of a surface that is about to be replaced. You could not have known that from outside. Separately, .node-version = 24 would have desynced the Windows local-CI VM, which pins v22.23.1 in provision-windows.sh:96 — that companion change was missing, and it would have quietly stopped the local ladder reproducing hosted builds.

#2109 stays open and is yours to decide. If you would like to rework it down to the actionlint job re-sited off the critical path, that is a contribution I would welcome and review promptly. If you would rather close it now that the two best pieces have landed, say so and I will close it with thanks. Either is a good outcome; what I did not want was to close it while the only outstanding action was ours.

DeusData added a commit that referenced this pull request Sep 20, 2026
…wrapper

Distilled from #2109 by Rares Popa. Two slices only; the rest of that PR is
either frontend work the UI rebuild makes redundant, or a gating change that
needs re-siting first.

1. Three jobs move from ubuntu-latest to ubuntu-24.04

   _lint.yml `lint` and `lint-mem`, and _test.yml `test-diag`, each install a
   toolchain from an apt.llvm.org repo whose name contains the release:

       deb http://apt.llvm.org/noble/ llvm-toolchain-noble-20 main
       deb http://apt.llvm.org/noble/ llvm-toolchain-noble-21 main

   noble IS 24.04. So these jobs already depend on a specific release while
   asking for whatever ubuntu-latest happens to mean that morning. The day
   GitHub advances ubuntu-latest, all three break at once, on a schedule
   nobody here chose, and the failure surfaces as an apt error far from its
   cause. Pinning the runner to the release the repo line already names costs
   nothing and removes the trapdoor.

2. actions/attest-sbom -> actions/attest

   attest-sbom is deprecated. Its remaining behaviour is to print
   "::warning::actions/attest-sbom has been deprecated" and forward to
   actions/attest with NODE_OPTIONS set, passing sbom-path through unchanged.
   Calling attest directly yields the same attestation minus the wrapper.

   Verified rather than assumed, because this sits on the release path:
   59d89421af93a897026c735860bf21b6eb4f7b26 is exactly tag v4.1.0 of
   actions/attest, and sbom-path is a real input on that action at that SHA.

   The step keeps no continue-on-error, so a failed SBOM attestation still
   fails the release. That is the intended behaviour and the comment now says
   so: an unattested SBOM is worse than an absent one, because the artifact
   ships looking complete.

Deliberately NOT taken from #2109, each for its own reason:

  - the actionlint job, as sited. _lint.yml is consumed by pr.yml, dry-run.yml
    and release.yml, pr.yml gates its whole test stage on `if lint succeeded`,
    and release.yml gates build on needs.lint.result == 'success'. A job there
    is merge-blocking and release-blocking with no branch-protection edit to
    make it visible, and this one curls a tarball from github.com releases with
    no cache and no fallback. actionlint is worth having; not on that path, and
    not before it has been run against current main.
  - the test-package-wrappers node matrix. It reruns the Go and PyPI suites a
    second time per OS to vary a Node version only the npm leg reads.
  - everything frontend: the test-frontend job, .node-version, and the
    dependabot graph-ui block. The UI is being rebuilt from the ground up, so
    gating on the current one buys coverage of a surface that is going away.

Co-authored-by: Rares Popa <2606875+rarepops@users.noreply.github.com>
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request github_actions Pull requests that update GitHub Actions code priority/normal Standard review queue; useful PR with ordinary maintainer urgency.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ci: modernize Node builds and add frontend/workflow regression gates

2 participants