ci(quality): enable the Code Quality gates this repo was silently skipping - #26
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.
Quality Report — ConductionNL/petstore @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| test-unit | ✅ | ||||
| check-specs | ✅ | ||||
| check-manifest | ❌ | ||||
| composer | ✅ | ✅ 100/100 | |||
| npm | ✅ | ✅ 771/771 | |||
| PHPUnit | ✅ | ||||
| Newman | ✅ | ||||
| Playwright | ✅ |
Quality workflow — 2026-08-04 15:06 UTC
Download the full PDF report from the workflow artifacts.
What the run actually producedRun 30921031668 — the measurement that matters, since it is the one that decides the verdict. Jobs: 32 → 33 (skipped: 6 → 4). Counted from the jobs API, not from the AttributionCaused by this change: Failing jobs
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 Where
That is live drift between three apps' dashboard/widget manifests and the shared |
|
What
Enables the Code Quality gates this repo was silently skipping.
check:manifestwas not in the list["test:unit", "check:specs", "check:manifest"]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:manifestFAILS —pages[8].type: "roadmap" not in v1.1 enum. It is not part of this repo'scheck:specsaggregate (json-strict + manifest-v2 + register + registry), which is why it ran nowhere.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= 45.56 — this repo's own measured coverage, 272 of 597statements, read from
clover.xmlinside thecoverage-reportartifact ofrun 30911249478.
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.