Skip to content

chore: trek gedeelde config en workflow-commentaar gelijk met de rest van de organisatie - #101

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

chore: trek gedeelde config en workflow-commentaar gelijk met de rest van de organisatie#101
Stensel8 merged 11 commits into
mainfrom
claude/ai-code-quality-global-2iw0q0

Conversation

@Stensel8

@Stensel8 Stensel8 commented Aug 23, 2026

Copy link
Copy Markdown
Collaborator

Summary

Part of an organisation-wide consistency audit. The scope grew after the PR was opened — it started as .gitattributes only, and the title and description have been corrected to match what is actually in the diff.

Type of change

  • chore — maintenance (dependencies, config, CI/CD)

What changed

.gitattributes added. This repository had none, while seven others carried four slightly different versions. This is the shared version.

.editorconfig replaced with the org-wide version. It existed in five variants across seven repositories; the rules were already identical everywhere, only the comments differed.

Renovate assignees and reviewers set to Stensel8 and AdiH1310. This repository had neither, so dependency PRs were assigned to nobody. Also enables dependencyDashboard, osvVulnerabilityAlerts and configMigration, matching the rest.

Workflow comments translated to Dutch in config-validation.yml, update-checksums.yml and pr-checks.yml. The organisation settled on Dutch for code comments; the shared workflow files were translated once and copied, so they stay byte-identical with the repositories that share them.

Checklist

  • PR title follows the commit convention (chore: ...)
  • Both EN and NL versions updated (if applicable) — n/a, no content change
  • Media is in AVIF format (not PNG/JPG) — n/a, no media added
  • No broken image references — n/a
  • Tested locally with hugo server — n/a, no site change

Verification

Only comments changed in the workflow files: a diff with every comment line filtered out is empty for each one, and each file was re-parsed as YAML. git add --renormalize . produces no changes, so nothing here relied on CRLF.

Note

On the rest of the audit this repository came out ahead: it was the only one already pinning codeql-action to a precise version (# v4.37.8) rather than a bare # v4, and that pin is what the other five have now been levelled onto.

The file existed in four slightly different versions across seven
repositories, differing in whitespace, ordering and which binary types they
covered. This is the shared version, covering the union of all of them.

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:26

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 2 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
@Stensel8 Stensel8 self-assigned this Aug 23, 2026
@Stensel8 Stensel8 changed the title chore: add the organisation-wide .gitattributes chore: trek gedeelde config en workflow-commentaar gelijk met de rest van de organisatie Aug 23, 2026
Claude and others added 8 commits August 23, 2026 11:49
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
De vorige commit haalde de pr-title-job uit pr-checks.yml, maar de
update-checklist-job hing er nog van af via `needs` en
`needs.pr-title.result`. Een job kan niet wachten op een job in een andere
workflow, dus actionlint sloeg hierop aan met "job needs job which does not
exist in this workflow" en de workflow-check werd rood.

De afhankelijkheid is niet hersteld maar overbodig gemaakt: het vinkje "PR
title follows the commit convention" wordt nu uit de titel zelf afgeleid.
De job haalt de pull request toch al op, dus het jobresultaat voegde daar
niets aan toe. De regex gebruikt dezelfde typelijst als pr-title.yml en
CONTRIBUTING.md, en staat een scope en een `!` voor een breaking change toe.

Gecontroleerd met dezelfde actionlint als CI (1.7.12, tegen de gepinde
checksum): alle negen repositories komen er nu schoon doorheen. De regex is
apart getest tegen negen titels, geldige en ongeldige.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
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
bandit draaide twee keer per pull request: als eigen job in pr-checks.yml
op src/static/scripts/, en nogmaals in python-checks.yml op het enige
bestand in die map. Twee jobs, twee Python-setups, dezelfde scan. De job in
pr-checks.yml vervalt; python-checks.yml draait al op elke pull request, dus
de dekking blijft.

Wel met de bredere scan van de twee: flake8 en bandit kijken daar nu naar
src/static/scripts/ in plaats van naar saxion-eduroam.py. Vandaag is dat
hetzelfde bestand, maar een tweede script wordt zo vanzelf meegenomen in
plaats van stilletjes overgeslagen.

In config-validation.yml wordt actionlint een stap in plaats van een eigen
job. Het is in vijf seconden klaar en heeft dezelfde checkout nodig als de
stappen ernaast, dus een eigen job kostte een volle minuut voor niets. Elke
stap daar draait nu op !cancelled(), zodat een rode Renovate-validatie
actionlint niet verbergt.

Samen twee gefactureerde minuten per pull request minder, van dertien naar
elf jobs.

Gecontroleerd met actionlint 1.7.12.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XRouUjCEayFPybaPnv6GGu
markdownlint, de EN/NL-pariteit, de AVIF-controle, de Hugo-build, de linkcheck
en het bijwerken van de checklist stonden elk op een eigen runner. Ze duurden
3, 4, 3, 12, 6 en 6 seconden: vierendertig seconden werk, verdeeld over zes
runners. GitHub rekent per job en rondt elke job naar boven af op een hele
minuut, dus dat waren zes gefactureerde minuten per pull request-event.

Er is geen enkele controle weggehaald.

Er verdwijnt meer dan die vijf minuten. De linkcheck kreeg de gebouwde site via
een artefact aangeleverd, met een upload, een download en de opslag erbij. Nu
staat de build ernaast en leest lychee gewoon de map. Dezelfde vorm als in
LohuisHoveniers.nl, waar CI die aanroep vandaag heeft bevestigd: hij leest
src/public en meldde 20 links, 17 OK, 0 fouten.

De checklist-job las vier jobresultaten via needs. In een job is dat
steps.<id>.outcome, en dat scheelt de zesde runner. Een detail daarbij: de
AVIF-stap slaagt ook als hij PNG's vindt -- het oordeel zit in zijn output en
niet in zijn uitkomst -- dus dat vinkje leest steps.images.outputs.found.

Elke stap draait op !cancelled(), zodat een rode markdownlint de Hugo-build
niet verbergt. Je wilt alle fouten in een run zien en niet de tweede pas nadat
je de eerste hebt opgelost. De job faalt alsnog zodra er iets fout is.

De job draagt `pull-requests: write` omdat twee stappen op de pull request zelf
schrijven: de AVIF-controle plaatst een comment en de laatste stap werkt de
checklist bij. Dat is de prijs van het samenvoegen; alle actions staan op een
vastgezette SHA.

Verder krijgt de workflow een concurrency-groep, zodat drie pushes achter
elkaar naar dezelfde pull request niet drie volledige runs opleveren.

Daarmee gaat Zephyrus-Linux van elf naar zes gefactureerde jobs per pull
request.

Gecontroleerd met actionlint 1.7.12 en de checklist-logica los getest op negen
gevallen: goede en slechte titel, gevonden PNG's, een rode build met een
overgeslagen linkcheck, stappen die helemaal niet draaiden, een lege
omschrijving, idempotentie, en het opruimen van de typelijst met en zonder
aangevinkt type.
flake8 en bandit draaiden als eigen job in python-checks.yml, op elke pull
request en zonder padfilter. Dat was een volle gefactureerde minuut, ook op een
pull request die alleen content aanraakte -- en de map die ze bekijken bevat
een script.

Ze draaien nu als stap in pr-checks.yml, waar de checkout er toch al is. Dat
kost geen extra job.

python-checks.yml blijft bestaan voor de wekelijkse run, de run op main en
workflow_dispatch. Daar zit de waarde van een herhaalde scan: bandit vindt met
nieuwe regels iets in code die zelf niet veranderd is, en dat merk je nooit als
hij alleen op gewijzigde code draait.

Vooraf gecontroleerd dat branch protection hier niet op checknamen wacht: alle
negen checkruns op PR #101 staan afgerond, geen enkele op "expected", en
mergeable_state is blocked omdat er nog een review-goedkeuring ontbreekt. Het
weghalen van de check "lint" op pull requests zet dus niets vast.

Beide commando's zijn hier gedraaid met dezelfde argumenten als CI:
flake8 src/static/scripts/ --max-line-length=120 is schoon, en bandit -ll geeft
nul bevindingen op medium of hoger. actionlint 1.7.12 schoon.

Daarmee gaat Zephyrus-Linux van zes naar vijf gefactureerde jobs per pull
request.
@Stensel8
Stensel8 merged commit 3a20271 into main Aug 23, 2026
8 checks passed
@Stensel8
Stensel8 deleted the claude/ai-code-quality-global-2iw0q0 branch August 23, 2026 22:46
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