Skip to content

chore: trek CI-pins en Renovate-config gelijk met de andere repositories - #7

Merged
Stensel8 merged 8 commits into
mainfrom
claude/ai-code-quality-global-2iw0q0
Aug 23, 2026
Merged

Stensel8 merged 8 commits into
mainfrom
claude/ai-code-quality-global-2iw0q0

Conversation

@Stensel8

@Stensel8 Stensel8 commented Aug 23, 2026

Copy link
Copy Markdown
Member

Part of an organisation-wide consistency audit.

What changed

codeql-action/upload-sarif pinned to v4.37.8. This repository had two different commits for the same action — 5595ccaf (v4.37.6) in security.yml and ff2f1c62 (v4.37.7) in quality.yml — both labelled only # v4, so the difference was invisible at the pin. Across the organisation there were three distinct SHAs. All now point at v4.37.8, with the exact version in the comment so the next divergence is visible.

Semgrep digest updated. Two groups of repositories were scanning with different Semgrep builds, and therefore different rule sets. This one was on the older digest; it now matches the current latest manifest.

SARIF uploads no longer skip on a private repository. The guard was correct when written — the comment even said it would give the step back "the day this repository goes public or gets Advanced Security". Advanced Security is now enabled across the organisation, so that day has arrived. The comments explaining it were removed rather than left describing behaviour that no longer exists.

htmlhint package renamed. .github/htmlhint/package.json was hugo-template-htmlhint; it is now thectic-htmlhint in all five repositories that use it, so the file is byte-identical everywhere.

Added after this PR was opened

The audit continued while this was open, so later commits are also in the diff:

  • .gitattributes and .editorconfig replaced with the org-wide versions.
  • Workflow comments translated to Dutch. The shared files (config-validation.yml, update-checksums.yml, setup-hugo/action.yml) were translated once and copied, so they stay byte-identical with the repositories that share them. Only comments changed: a diff with every comment line filtered out is empty for each file, and each was re-parsed as YAML.
  • Conventional Commits enforced on the PR title, via a shared pr-title.yml that is byte-identical in all nine repositories.
  • The contributor files this repository was missing. It is the template, but it lacked CODEOWNERS and a PR template that repositories generated from it already had. Both are now here, on the shared skeleton — so a new site inherits them instead of starting a repository short.
  • pr-checklist.yml ticks the two checklist items derivable from the pull request itself and clears the unchosen type lines.
  • Renovate gains dependencyDashboard, osvVulnerabilityAlerts and configMigration, plus both owners as assignee and reviewer.

Still outstanding

deploy-bunny.yml still has English comments — it is the one workflow that differs per repository, so it could not be translated once and copied.

There is still no org-level .github repository. Until there is, every repository carries its own copy of these files and this drift can recur — though configMigration now catches the Renovate half on its own.

Verification

renovate-config-validator --strict passes; migrateConfig reports no migration needed. Every # renovate: annotation was checked against the configured managers by simulating the regexes — all five match. actionlint 1.7.12 is clean, and markdownlint passes against this repository's own config.

An audit across the organisation found the same tools pinned differently in
each repository, with nothing to make them converge again.

codeql-action/upload-sarif sat on three different commits org-wide, all
labelled only `# v4`, so the difference was invisible at the pin. All of
them now point at v4.37.8 with the exact version in the comment.

The Semgrep container was pinned to two different digests, meaning two
groups of repositories scanned with a different rule set. Both now use the
current `latest` manifest digest.

HTMLHint installs with `npm ci` against a checked-in lockfile instead of
`npm install -g htmlhint@version`, which resolved through the registry at
run time with nothing to verify the result against. Scorecard's
Pinned-Dependencies check and zizmor's adhoc-packages audit both flag the
old form. Renovate gets the npm manager enabled so the lockfile stays
current.

The SARIF uploads no longer skip themselves on a private repository. That
guard was correct when it was written, but Advanced Security is now enabled
across the whole organisation, so the uploads it was suppressing would
succeed today. The comments explaining the guard went with it rather than
being left to describe behaviour that no longer exists.

.gitattributes was four slightly different files across seven repositories.
It is now one, covering the union of what the variants covered.

Renovate also gains dependencyDashboard, osvVulnerabilityAlerts and
configMigration. The last one is the point: it opens a pull request when an
option goes stale, which is what would have surfaced this drift on its own.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
Copilot AI lite review requested due to automatic review settings August 23, 2026 11:25

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Claude and others added 3 commits August 23, 2026 11:35
.editorconfig bestond in vijf varianten over zeven repositories. De regels
waren overal al hetzelfde; alleen de comments verschilden, deels Engels en
deels Nederlands. Dit is de gedeelde versie, in het Nederlands.

Renovate wees per repository iemand anders aan: vijf hadden Stensel8, een
had Stensel8 en AdiH1310, en vier hadden helemaal niemand staan, waardoor
dependency-PR's daar bij niemand terechtkwamen. Nu overal allebei.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
De comments waren een mengeling: hugo-template en StenTijhuis stonden volledig
in het Engels, LohuisHoveniers en Hagmolenpups door elkaar heen binnen hetzelfde
bestand. Dat is nu overal Nederlands, gelijk aan de rest van de organisatie.

Alleen commentaar. De workflowlogica is regel voor regel gecontroleerd en
ongewijzigd: een diff met alle commentregels weggefilterd is leeg voor elk
gewijzigd bestand, en elk bestand is opnieuw als YAML geparsed.

De gedeelde bestanden zijn per stuk één keer vertaald en daarna gekopieerd,
zodat config-validation.yml en setup-hugo/action.yml byte-identiek blijven over
de repositories die ze delen.

Twee comments klopten niet meer en zijn meegenomen: bij LohuisHoveniers stond
een dubbele regel over de SARIF-upload, en op drie plekken beschreef het
commentaar nog de private-guard die er inmiddels uit is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
Alleen Zephyrus-Linux controleerde of de titel van een pull request het
Conventional Commits-formaat volgt. Dat is nu overal een aparte workflow,
byte-identiek en met dezelfde jobnaam, zodat de check in elke repository
"Conventional commit title" heet.

De titel en niet de losse commits: de titel is wat er op main terechtkomt
zodra je squasht. Renovate levert zijn eigen titels al in dit formaat aan
via semanticCommits, wat in alle negen repositories al aanstond; deze
controle dekt de rest.

De check draait ook op `edited`. Zonder dat blijft hij rood staan nadat
iemand de titel heeft verbeterd, want een titelwijziging is geen nieuwe
push -- een gat dat in de opzet van Zephyrus-Linux zat.

In Zephyrus-Linux verhuist de bestaande job uit pr-checks.yml naar deze
workflow. De jobnaam blijft gelijk, dus een branch protection-regel die op
die check wacht blijft werken. De job daar meeverhuizen was nodig omdat
`types` voor een hele workflow geldt: hem in pr-checks.yml zetten had de
Hugo-build en de bandit-scan laten draaien zodra iemand een PR-omschrijving
aanpast.

CONTRIBUTING.md in hugo-template en LohuisHoveniers.nl documenteerde zes
types terwijl de check er acht accepteert. `content` en `revert` stonden er
niet in, dus die leken ongeldig terwijl ze dat niet zijn. Nu gelijk aan
Zephyrus-Linux, dat ze wel allemaal noemde.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
@Stensel8 Stensel8 changed the title Level CI pins and Renovate config with the other repositories chore: trek CI-pins en Renovate-config gelijk met de andere repositories Aug 23, 2026
claude added 4 commits August 23, 2026 12:08
Wie een pull request opende kreeg per repository iets anders te zien. Vier
van de negen hadden een PR-template en die drie verschilden onderling in
opbouw en taal; vier hadden een CODEOWNERS, drie een CONTRIBUTING en vijf
een SECURITY.md.

Nu heeft elke repository alle vier, met hetzelfde skelet: Samenvatting,
Type wijziging, Checklist. De eerste 24 regels van de template zijn
byte-identiek in alle acht Nederlandstalige repositories; Zephyrus-Linux
houdt zijn Engelse versie omdat dat project tweetalig is en een EN/NL-
pariteitscontrole heeft.

Wat per repository verschilt, is de checklist eronder, en alleen omdat de
stack verschilt: Hugo-sites vragen om `hugo server`, Tijhuis-Tuinen om PHP
en welke van de twee sites je raakt, Web-Dev om `docker compose up`, en
Blocklists om het lijstformaat en een bron. Een Hugo-vraag stellen in een
PHP-repository helpt niemand.

De "Type wijziging"-lijst komt overeen met de acht types die de controle
"Conventional commit title" accepteert en die CONTRIBUTING.md beschrijft.
Zephyrus-Linux miste `revert` in zijn template terwijl de check die wel
toestond; dat is rechtgezet.

Een nieuwe workflow pr-checklist.yml vinkt de twee punten af die uit de
pull request zelf af te leiden zijn en ruimt de niet-gekozen types op.
Anders dan de variant in Zephyrus-Linux gebeurt dat opruimen alleen als er
al een type is aangevinkt: zonder die voorwaarde stript de eerste run alle
acht regels weg voordat de auteur er een kon kiezen. Zephyrus-Linux houdt
zijn eigen, uitgebreidere job die daarnaast EN/NL-pariteit, AVIF en de
linkcheck afvinkt.

CODEOWNERS is overal `* @Stensel8`, de vorm die de vier bestaande al
gebruikten. Bewust niet AdiH1310 erbij: waar "Require review from Code
Owners" aanstaat zou dat een merge blokkeren op iemand die niet in elke
repository actief is. Voor Renovate staan ze wel allebei als reviewer.

Gecontroleerd met actionlint 1.7.12 (alle negen schoon) en met
markdownlint tegen de eigen configuratie van de drie repositories die
root-Markdown linten (nul issues). De herschrijflogica van de checklist is
apart getest op vijf gevallen, waaronder een lege omschrijving en of een
tweede run niets meer verandert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
CODEOWNERS stond op alleen @Stensel8, met als redenering dat een tweede
naam een merge zou kunnen ophouden. Dat was onjuist: staan er meerdere
eigenaren op hetzelfde pad, dan vraagt GitHub ze allebei om review maar is
de goedkeuring van één van hen genoeg om aan "Require review from Code
Owners" te voldoen.

Beide namen erop betekent dus niet meer wachten maar minder: het werk ligt
niet stil als een van de twee er even niet is.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
De vorige commits zetten de titelcontrole en het bijwerken van de checklist
in twee losse workflows. Dat was precies de fout die commit 530ba29 in
THectic.nl al had rechtgezet: GitHub rekent per job en rondt elke job naar
boven af op een hele minuut. Beide stappen zijn in een paar seconden klaar
en hebben geen checkout nodig, dus als losse jobs kostten ze twee volle
minuten voor tien seconden werk. In één job is dat één minuut.

Dat scheelt een gefactureerde minuut per pull request-event, in acht
repositories. Zephyrus-Linux hield zijn eigen, uitgebreidere checklist-job
in pr-checks.yml en verandert hier alleen door de concurrency-groep.

Die concurrency-groep is de tweede besparing: snel achter elkaar de
omschrijving aanpassen startte evenveel runs, terwijl alleen de laatste nog
iets zegt. cancel-in-progress ruimt de rest op.

De job draagt nu `pull-requests: write` terwijl de titelcontrole aan lezen
genoeg heeft. Dat is de prijs van het samenvoegen; beide actions staan op
een vastgezette SHA, dus dat is hier een acceptabele ruil.

Gecontroleerd met actionlint 1.7.12 (alle negen schoon) en de
herschrijflogica opnieuw getest op zes gevallen, waaronder een lege
omschrijving en of een tweede run niets meer verandert.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
…ositories

security.yml is nu in alle vijf de Hugo-repositories hetzelfde bestand, op de
regel met het semgrep-scanpad na. Dat pad verschilt terecht: niet elke
repository heeft dezelfde mappenstructuur.

Wat hier verschilde was alleen de plaatsing van permissies en de formulering
van het commentaar. Dat leest als betekenisverschil terwijl het er geen is,
en juist bij een securityworkflow wil je in één oogopslag kunnen zien dat vijf
repositories hetzelfde doen.

.markdownlint.yml gaat om dezelfde reden mee: het commentaar naar het
Nederlands, en MD033 erbij zodat het bestand ook bruikbaar is in de
repositories die <details> in hun README of <address> in hun content
gebruiken. Hier stond alleen MD060 al uit, daar week deze van de rest af.
@Stensel8 Stensel8 self-assigned this Aug 23, 2026
@Stensel8
Stensel8 merged commit a887f89 into main Aug 23, 2026
12 checks passed
@Stensel8
Stensel8 deleted the claude/ai-code-quality-global-2iw0q0 branch August 23, 2026 22: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.

3 participants