ci(quality): move the hydra-gates pin v1.0.1 -> v1.3.0 - #130
Conversation
v1.0.1's gate-5 (route-auth) could not tell "this routed method has no auth attribute" from "I could not resolve the controller class", and reported both as the former. It also read route names through `'[a-z_]+#...'`, so every camelCase route slug was invisible to it in either direction, and its 20-line attribute lookback could borrow the PREVIOUS method's attribute. Fixed in ConductionNL/.github#162 (closing #153). v1.2.0 also carries the runner's COVERAGE accounting, which v1.0.1 does not have at all: v1.0.1's summary printed only "N gate(s) failed", so a gate that never ran was indistinguishable from one that passed. EXPECT NEW FINDINGS. gate-5 now sees code it never saw. Red is the honest outcome of a measurement that previously was not taken; nothing here is baselined or suppressed to avoid it.
Quality Report — ConductionNL/openbuild @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| composer | ✅ | ✅ 101/101 | |||
| npm | ✅ | ✅ 654/654 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-05 13:29 UTC
Download the full PDF report from the workflow artifacts.
|
Adopting this rather than opening a duplicate — but v1.2.0 is no longer a green target, and the green tick on this PR is stale. Please re-point it to The tick predates the contract change. This PR's Code Quality run 31010171177 was created What #164 changed. It flipped Measured, same repo, same branch, both runs after #164 merged (app-versions, one-file diff, diff-scoped against
Reproduced locally at all three pins, each run in its own mount namespace with a private tmpfs:
One line to change: |
v1.2.0 added the COVERAGE accounting but not the declarations that accounting asks for. v1.0.1/v1.2.0 have no `_skip` vocabulary, so a gate whose prerequisite is absent emits nothing and require-full-coverage (default ON) counts it as DID NOT RUN. v1.3.0 ships 36 not-applicable declarations; measured on doriath PR #160, Hydra Gates went failure -> success on the pin alone. Lands this repo on the same pin as the rest of the fleet.
|
Advanced this PR's pin v1.2.0 -> v1.3.0 rather than opening a competing PR, so the whole fleet lands on one pin in a single wave. v1.2.0 delivered the COVERAGE accounting but not the declarations that accounting asks for. Measured on doriath PR #160 (merged): on the pin change alone, Hydra Gates went failure -> success and gates 4/24/33 moved from unexplained "DID NOT RUN" to explicit NOT APPLICABLE with a named reason each. The control argument in the file's comment is untouched — it concerns gate-5/gate-14, which v1.3.0 does not change. |
Quality Report — ConductionNL/openbuild @
|
| Check | PHP | Vue | Security | License | Tests |
|---|---|---|---|---|---|
| lint | ✅ | ||||
| phpcs | ✅ | ||||
| phpmd | ✅ | ||||
| psalm | ✅ | ||||
| phpstan | ✅ | ||||
| phpmetrics | ✅ | ||||
| eslint | ✅ | ||||
| stylelint | ✅ | ||||
| build | ✅ | ||||
| check-manifest | ✅ | ||||
| test-l10n | ✅ | ||||
| composer | ✅ | ✅ 101/101 | |||
| npm | ✅ | ✅ 654/654 | |||
| PHPUnit | ✅ | ||||
| Newman | ⏭️ | ||||
| Playwright | ⏭️ | ||||
| Hydra gates | ✅ |
Quality workflow — 2026-08-05 18:11 UTC
Download the full PDF report from the workflow artifacts.
Moves this repo's
hydra-gates-refpin fromv1.0.1tov1.2.0.Why
v1.0.1's gate-5 (route-auth) had four defects. Two were reported asConductionNL/.github#153;
the other two were found while fixing it, and one of those is the expensive
direction:
lib/Controller/<X>Controller.phpdid not exist, the verdict read"N routed method(s) missing auth attribute". On ADR-040 AppHost adopters
those files are absent by design — the controllers are OpenRegister
generics aliased at runtime — and the attributes live in the openregister
package. The gate was reporting "I cannot see it" as "it is absent".
continued beforethe
_in_scopecall, so those findings fired on apackage.json-onlyDependabot bump. Now scoped per ADR-020.
'[a-z_]+#…'. Gate-14 already used a wider regex; the narrower one was thesecurity gate. On scholiq, 14 of 37 routed names matched — the other 23
were never opened.
method, so a short guarded method within 20 lines above an unguarded one
donated its
#[NoAdminRequired]to its neighbour. A false negative, andinvisible, because a pass leaves no log.
Fixed in ConductionNL/.github#162 with 25 control-pair assertions, mutation-tested
against three realistic degradations.
v1.2.0also brings, fromv1.1.0, a countable gate-22 (it printedFAIL — 0while a real finding sat in its log) and the runner's COVERAGEaccounting —
v1.0.1's summary printed onlyN gate(s) failed, so a gatethat never ran was indistinguishable from one that passed.
Expect red
Gate-5 now sees code it never saw. New findings from this PR are the point of
it, not a regression. Nothing has been baselined or suppressed to keep a repo
green.
single workflow file, and the gates are diff-scoped — so its green says almost
nothing. The measurement that matters is the next real code PR.
🤖 Generated with Claude Code