ci(quality): enable the Code Quality gates this repo was silently skipping - #430
Conversation
…pping A skipped job and a passing job are indistinguishable in the Quality Report. Every gate turned on here reported 'skipped' in every run. Each newly-enabled leg was measured against this tree BEFORE being enabled; the results are in the PR description. Legs that were measured failing are enabled anyway - the defects are pre-existing, and the only thing that changed is that CI can now see them. Journeydoc Capture and enable-axe are deliberately NOT enabled.
…pt-outs A second key in the same with: block is accepted last-one-wins by every YAML parser involved, so the file reads as configured while the value is decided somewhere else in it. Where enable-newman: false already carried a specific, still-live reason (OR React/Async await + SQLite REGEXP; ZGW API incomplete; collections hard-coding non-CI URLs and unseeded registers), it is left off and the reason is quoted rather than overridden. Where it was a bare line with no comment, the stale line is removed instead of shadowed.
Quality Report — ConductionNL/softwarecatalog @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| check-vue-demi | ✅ | ||||
| test-l10n | ✅ | ||||
| composer | ✅ | ✅ 121/121 | |||
| npm | ✅ | ✅ 849/849 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ✅ |
Quality workflow — 2026-08-04 15:09 UTC
Download the full PDF report from the workflow artifacts.
What the run actually producedRun 30921051685 — the measurement that matters, since it is the one that decides the verdict. Jobs: 27 → 29 (skipped: 8 → 5). Counted from the jobs API, not from the AttributionCaused by this change: nothing. Every newly-enabled gate — No failing jobs — the whole run is green with the new gates on.Correction to the pre-measurement in the descriptionThe description says I ran the script locally with no So I measured the fallback path, not the path CI takes, and drew a fleet-wide |
This workflow had only a pull_request trigger - the only caller in the fleet without a push one. SBOM, Features Extract and Coverage Baseline Check are push-only jobs, so none of them could ever fire here. The last push run on development is from 2026-03-19. Nothing showed this: on a pull_request those three jobs are correctly skipped, so every PR's Quality Report looked complete. The only way to see it is to ask when a push run last happened. enable-coverage-guard was switched on in #430; without this its push-side half would have been dead on arrival.
|
What
Enables the Code Quality gates this repo was silently skipping.
frontend-checks: [])["check:manifest", "check:vue-demi", "test:l10n"]enable-coverage-guardunset)enable-hydra-gatesunset)v1.0.1Why
A skipped job and a passing job are indistinguishable in the Quality Report.
Every gate listed above reported
skippedin this repository's runs, which readsas "fine". This turns them on.
Two prerequisites landed on
ConductionNL/.github@mainfirst and are what makethis viable:
no-admin-idor) now follows delegation, andgates 6/7 no longer pass on an empty scope. Before that, gate-7 flagged
correctly-guarded methods whose guard is reached through a helper, which is
why 19 of 20 repos kept the whole tier switched off.
frontend-checkslist deleted the Frontend Check jobfrom the run rather than skipping it, because
inputs.frontend-checks != '[]'was a literal string comparison.
Not enabled, on purpose
enable-axe— it produces the report hydra-gates gate-33 consumes, but avanilla Nextcloud 34 with no app installed already returns three
serious/critical violations from core's own UI. Turning it on in the same
change as the gates would confuse "this app has an accessibility defect" with
"Nextcloud core does". Separate change.
On red
Some legs below were measured failing before this PR was opened, and are
enabled anyway. The defects are pre-existing; the only thing that changed is
that CI can now see them. Per the brief, a gate is not switched back off because
it failed on arrival — the failure is the result.
Measured before flipping, not after
Every leg below was run against this branch's tree before it was enabled:
check:manifestPASSES — 30 pages, structural lint 0 issues.check:vue-demiPASSES.test:l10nPASSES — 531 keys used, 690 inen.json.Coverage baseline inputs
enable-coverage-guardneedsscripts/coverage-guard.phpand.coverage-baseline, neither of which existed here.scripts/coverage-guard.php— byte-identical to the copies inopenregisterandprocest, the only two repos in the fleet that already hadit.
.coverage-baseline= 13.01 — this repo's own measured coverage, 4077 of 31330statements, read from
clover.xmlinside thecoverage-reportartifact ofrun 30911570224.
A note on where that number came from: the job's own error message points you at
a
coverage-baselineartifact, and the same log saysNo files were found with the provided path— that artifact does not exist, because it is onlyuploaded on drift. The value was therefore taken from the clover file
coverage-guard.phpitself parses, which is the same source the job would use.Coverage Baseline Protection(PR side) only rejects a lowered baseline andexplicitly accepts a newly-introduced one, so it should pass here.
Coverage Baseline Check(push side) runs only after merge.Left off, with reasons
Integration Tests (Newman) — left OFF. I initially enabled it, then reverted: the existing
enable-newman: falserecords that the collection hard-codes/var/www/html/custom_apps/openregister/...paths that do not exist on a CI runner and assumes a seededvoorzieningenregister /moduleschema. It goes back on in the commit that rewrites the collection and adds the seed step.Worth recording from checking this path: the validator counts collections recursively (
find) while the run step globs them flat (for collection in *.postman_collection.jsonaftercd). Anewman-collection-paththat only satisfies the validator would pass validation and then run nothing.test:l10n:parity— measured short 404+ translations across the required locales. Translation backlog, not a CI defect.test/test:unit— already run by the shared Frontend Tests (unit) job.