Skip to content

chore: adopt the standard CI shape and fold release.yml into ci.yml - #25

Merged
StuartMeeks merged 1 commit into
mainfrom
chore/standards-ci-conformance
Aug 20, 2026
Merged

chore: adopt the standard CI shape and fold release.yml into ci.yml#25
StuartMeeks merged 1 commit into
mainfrom
chore/standards-ci-conformance

Conversation

@StuartMeeks

@StuartMeeks StuartMeeks commented Aug 20, 2026

Copy link
Copy Markdown
Owner

What changed

Adopts the canonical CI shape from NextIteration.Standards — §3.0, §3.1, §3.5, §3.6, §3.7, §4.4, §4.6. Copied from NextIteration.SpectreConsole.Auth, the 25/25 reference implementation, rather than re-derived.

  • release.yml folded into ci.yml (§3.0). publish now downloads the artifact this run's build job produced, so the bytes pushed to nuget.org are the bytes the gate tested. The tag-triggered workflow rebuilt from the tag and published an artifact no gate had ever seen.
  • New aggregating gate job ci (§3.1), needs: [build, test], if: always(), failing on any upstream result that is not success — skipped included.
  • concurrency + cancel-in-progress (§3.5, never on tags), per-job timeout-minutes (§3.6), NuGet restore cache (§3.7).
  • codeql.yml added (§4.4) — security-and-quality, explicit build rather than autobuild.
  • dependabot-auto-merge.yml added (§4.7/§4.8) — minor+patch only, queued behind ci.
  • .github/dependabot.yml rewritten (§4.6/§4.10).

Why

Two of these fix live defects rather than merely conforming:

  1. The old artifact upload globbed *.nupkg. The .snupkg was packed on every release and then silently never published. The glob is now *nupkg.
  2. build and test were required status checks directly. test is a matrix, so its check names carry the matrix values — editing the platform list breaks branch protection. The ci gate's name never changes, so build and test can be renamed, split or re-platformed freely.

if: always() on the gate is load-bearing. Without it the gate is skipped when an upstream job fails, and branch protection reads a skipped check as satisfied — it would pass precisely when it must fail.

Sequencing — two things outside this diff

  • nuget.org Trusted Publishing policy repointed from release.yml to ci.yml. The policy binds to a workflow filename; without this the next publish fails to authenticate. Being done before this merges.
  • Required status check → [ci]. Cannot be set before this PR reports a ci check. Once ci is green here, apply-repo-settings.sh --repo NextIteration.SpectreConsole.SelfUpdate --with-required-checks sets it and this PR becomes mergeable. Per ADOPTING.md, no interim relaxation to [build] is needed — pull_request runs the workflow from the PR's own head, so the PR that adds ci reports ci.

Checklist

  • Build is clean — no new warnings (TreatWarningsAsErrors is on)
  • Tests pass on every shipped target framework — 392 tests, 196 × net8.0/net10.0, verified locally before this branch
  • Public API changes carry XML docs — n/a, no code change
  • CHANGELOG.md updated under [Unreleased]
  • Dependency floors unchanged

Consumer impact

None. No change to the library, its public surface, or the package contents. <Version> is untouched and no tag is pushed, so nothing publishes.

🤖 Generated with Claude Code

STANDARD.md sections 3.0, 3.1, 3.5, 3.6, 3.7, 4.4 and 4.6. Copied from Auth,
the 25/25 reference implementation, rather than re-derived.

The `ci` gate is the substantive change. `build` and `test` were required
status checks directly, which couples the ruleset to the matrix shape —
`test`'s check names carry its matrix values, so touching the platform list
breaks branch protection. The gate's name never changes. `if: always()` on it
is load-bearing: without it the gate is *skipped* when an upstream job fails,
and branch protection reads a skipped check as satisfied, so it would pass
precisely when it must fail. It treats `skipped` as failure for the same
reason.

Folding release.yml into ci.yml (3.0) means `publish` downloads the artifact
this run's `build` produced, so what reaches nuget.org is what the gate tested;
the tag-triggered workflow rebuilt from the tag and published bytes no gate had
seen. It also fixes a live bug: the old upload globbed `*.nupkg`, so the
.snupkg was packed and then never published. The glob is now `*nupkg`.

The nuget.org Trusted Publishing policy for this package has been repointed
from release.yml to ci.yml — the policy binds to a workflow filename, and
without that the next publish fails to authenticate.

dependabot.yml now groups minor+patch and leaves majors ungrouped, and ignores
majors for the two per-TFM-floored packages (4.10) — an 8.x -> 10.x bump on the
net8 floor is never mergeable. It names those two and not Auth's third; 4.6 is
a structural clause precisely so a repo does not inherit an ignore entry for a
package it never references.

No change to the library, its public surface, or the package contents. Local
verification before this branch: Release build at 0 warnings, 392 tests passing
across net8.0 and net10.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@github-advanced-security

Copy link
Copy Markdown

You are seeing this message because GitHub Code Scanning has recently been set up for this repository, or this pull request contains the workflow file for the Code Scanning tool.

What Enabling Code Scanning Means:

  • The 'Security' tab will display more code scanning analysis results (e.g., for the default branch).
  • Depending on your configuration and choice of analysis tool, future pull requests will be annotated with code scanning analysis results.
  • You will be able to see the analysis results for the pull request's branch on this overview once the scans have completed and the checks have passed.

For more information about GitHub Code Scanning, check out the documentation.

@StuartMeeks
StuartMeeks merged commit 1acc08c into main Aug 20, 2026
9 checks passed
@StuartMeeks
StuartMeeks deleted the chore/standards-ci-conformance branch August 20, 2026 07:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants