ci: enforce the coverage floor per package, and keep the fuzz corpus - #257
Merged
Conversation
Adopts both halves of Glyndor/.github#106. The coverage floor now has to hold in every package rather than on average. This module ran at 91% against a gate of 90 while auth/oauth sat at 87.7% and internal/keymanager at 85.7% — the two with the most attack surface were the two thinnest, and internal/clock at 100% was paying for them. Every package clears 90 today, which is exactly when a floor is cheapest to adopt: it locks in a state that already holds instead of demanding new work. The fuzz corpus now survives between runs. It never did: setup-go restores GOCACHE but does not save it again on a cache hit, so each week started from the seed corpus and re-explored the same ground. Measured here, a cold 60s run of FuzzParseJWK finds 219 new interesting inputs and 300s finds 293 — a single run saturates well before its budget, so the budget was never the constraint. Starting from zero was. Pinned by SHA rather than tag: Glyndor/.github is only tagged once a consumer has proved a workflow green, and this is that consumer. Closes #218. Closes #225. Signed-off-by: Jaro-c <75870284+Jaro-c@users.noreply.github.com>
Signed-off-by: Jaro-c <75870284+Jaro-c@users.noreply.github.com>
The gate names every package under the floor with a ::error:: annotation and fails the job, verified at 96 where six packages are under it. Back to 90, which every package clears. Signed-off-by: Jaro-c <75870284+Jaro-c@users.noreply.github.com>
Member
Author
|
Proved the gate can fail before trusting it, since a gate nobody has seen fail is decoration. Temporarily raised the floor to 96 on this branch (f1323f4) and the job went red, naming each package individually: Reverted to 90 in 382807a, and the job is green again with This is the same discipline the sweep in #229 was about: the failing direction is the one worth checking. |
This was referenced Jul 28, 2026
Jaro-c
added a commit
that referenced
this pull request
Jul 28, 2026
Seven callers were spread across three versions: | caller | was | now | |---|---|---| | `ci.yml`, `fuzz.yml` | raw commit, no version comment | `# v1.12.0` | | `schedule-freshness.yml` | v1.11.0 | v1.12.0 | | `dco.yml`, `go-audit.yml`, `line-limit.yml`, `main-guard.yml` | v1.10.1 | v1.12.0 | `ci` and `fuzz` were pinned bare on purpose — Glyndor/.github#106 was waiting for a consumer to prove it green before being tagged, and #257 was that consumer. Now that v1.12.0 exists they get their comment back. That comment is not decoration. Without a version beside the SHA, Dependabot has nothing to compare against, never proposes a bump, and the pin rots — which is exactly how four of these ended up two releases behind while nobody noticed. Supersedes #250, #251, #252 and #254, which each moved one caller to v1.11.0. Verified with `actionlint` across all seven workflows. Signed-off-by: Jaro-c <75870284+Jaro-c@users.noreply.github.com>
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.
Closes #218. Closes #225. Adopts both halves of Glyndor/.github#106, and is the consumer that proves them before that repository gets a tag.
Per-package coverage floor
This module ran at 91% against a gate of 90 while
auth/oauthsat at 87.7% andinternal/keymanagerat 85.7%. The two with the most attack surface were the two thinnest, andinternal/clockat 100% was paying for them.Every package clears 90 today, which is exactly when a floor is cheapest to adopt — it locks in a state that already holds rather than demanding new work:
auth/oauthauth/emailinternal/keymanagerauth/apikeyauth/jwtauth/passwordauth/usernameauthcoreinternal/clockThe measurement that made this decidable: comparing isolated profiles against
-coverpkg=./...moves those packages by +0.5 and +0.0, so the per-package numbers are honest rather than an artefact of helpers being exercised from a sibling package.The fuzz corpus survives between runs
It never did.
setup-gorestoresGOCACHE— where Go keeps the corpus — but on a cache hit does not save it again, so every discovery died with the runner and the next week re-explored the same ground from the seeds.Measured here before changing anything: a cold 60s run of
FuzzParseJWKfinds 219 new interesting inputs, 300s finds 293. A single run saturates well before its budget, so the budget was never the constraint — starting from zero every week was.fuzztimeis deliberately unchanged.The compounding will not be visible in this pull request; the first scheduled run after it merges seeds the cache, and the one after that is the first to start warm.
Pinned by SHA
Glyndor/.githubis only tagged once a consumer has proved a workflow green, and this is that consumer. The pin moves to the release tag afterwards.