Skip to content

ci(quality): move hydra-gates-ref v1.0.1 -> v1.3.0, which is what is failing CI - #124

Merged
rubenvdlinde merged 2 commits into
developmentfrom
ci/hydra-gates-v1.2.0
Aug 5, 2026
Merged

ci(quality): move hydra-gates-ref v1.0.1 -> v1.3.0, which is what is failing CI#124
rubenvdlinde merged 2 commits into
developmentfrom
ci/hydra-gates-v1.2.0

Conversation

@rubenvdlinde

@rubenvdlinde rubenvdlinde commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

One line: hydra-gates-ref: v1.0.1 -> v1.3.0.

This repo's CI is red right now, and it is not this repo's fault

At 2026-08-05T13:52Z, ConductionNL/.github commit f7eaf2a (#164) flipped hydra-gates-require-full-coverage to default true in the shared quality.yml. Every repo references that workflow at @main, so the flip went live everywhere at once. But the flag requires a gate to declare itself not-applicable — and that vocabulary ships in the pinned package:

_skip calls
v1.0.1 (this repo's pin) 0
v1.3.0 36

A pin with no _skip calls cannot say "not applicable". So every gate without subject matter here — 4 (composer-audit, correctly diff-scoped out per ADR-020), 24 (integration-parity), 33 (axe-core, whose producer enable-axe is deliberately off) — became DID NOT RUN and failed the job.

The red is fleet-wide, dated, and caused by a shared-workflow flag meeting a pinned script that predates the vocabulary it needs. It is not a code defect and not anything a PR author did. The control that settles it: decidesk#407 is PHPMD-only with zero npm changes and shows the identical failure, and it passed on pre-13:52Z base runs — the base is a different vintage of the shared workflow, not of the code.

The pin was also four fixes stale

v1.0.1 is f4d9756 (2026-08-03). Every Hydra Gates run this repo has ever made executed a script in which:

PR what it fixed in v1.0.1?
#147 16 gates reported PASS when their helper never ran
#148 gate-33 had no axe report to read, and never said so
#149 gates 6 and 7 reported PASS on an empty scope
#162 gate-5 reported a resolution failure as a security finding

A gate that reports PASS without running emits a tick identical to a real one, which is why nothing in this repo's history shows the difference. Tracked in .github#159.

Measured before opening this PR

Diff-scoped against origin/development, exactly as CI scopes it. Each run in its own mount namespace with a private tmpfs — the runner writes ~50 detail logs to hardcoded /tmp/hydra-gate-<name>.log paths and reads its verdicts back out of them, so two concurrent runs on one host silently corrupt each other's counts (.github#158 item 6). Another agent was running the gates unisolated on the same host during this work, so that is not hypothetical.

v1.0.1   exit 98   FAIL — "GATES THAT DID NOT RUN: 24 33"
v1.3.0   exit 0    PASS — ALL 58 APPLICABLE GATES PASSED, and all 58 ran
                          NOT APPLICABLE: 4 6 7 24 33 — each with a reason

Verified not merely that the job is green but that gates 4, 24 and 33 each name themselves not-applicable and say why. A green that came from somewhere else would not be the fix landing.

Independently confirmed end-to-end by doriath#160, which changed this same single line and nothing else: Hydra Gates went failure -> success.

v1.3.0 is f7eaf2a = .github@main at the time it was cut.

Refs ConductionNL/.github#159

…dead gates

v1.0.1 is `f4d9756` (2026-08-03). Three gate fixes merged after it, so
every Hydra Gates run this repo has ever made executed a script in which
16 gates reported PASS when their helper never ran (.github#147),
gate-33 had no axe report to read and never said so (#148), and gates 6
and 7 reported PASS on an empty scope (#149).

The tick was identical either way, which is why nothing here shows it.

Measured before opening this PR — full tree, private mount namespace and
tmpfs so the runner's hardcoded /tmp/hydra-gate-*.log paths cannot be
contaminated by another run on the same host (.github#158 item 6):

  v1.0.1  4 gates fail: 38 skip-link, 40 form-label-association,
                        43 table-headers, 45 prefers-reduced-motion
  v1.2.0  the SAME 4 fail; no new failure, and no failure disappears

What does change is the accounting: 61 declared gates become 63, and
gates 24 and 33 now print SKIPPED with a named reason instead of being
absent from the summary.

Refs ConductionNL/.github#159
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/app-versions @ bd79e04

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
composer ✅ 17/17
npm
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️
Hydra gates

Quality workflow — 2026-08-05 13:58 UTC

Download the full PDF report from the workflow artifacts.

…he shared quality.yml

The first commit here was measured against quality.yml as it stood this
morning. It has since changed underneath the pin, and that is the second
half of the same defect.

ConductionNL/.github#164 (merged 13:52Z) flipped
`hydra-gates-require-full-coverage` to default TRUE in the SHARED
quality.yml — which every repo references at `@main`. The accounting
that makes that flag survivable, NOT APPLICABLE as distinct from a
structural or a wiring gap, ships in the PINNED package. So a repo on
any pin older than that change fails the coverage assertion for gates it
has no subject matter for.

Not a prediction. Run 31012647428 on this branch, at v1.2.0, 26 jobs,
Hydra Gates FAILED:

  RESULT: ALL GATES PASSED — EXCEPT GATES 4 5 6 7 14 15 22 24 25 33 53,
  WHICH DID NOT RUN.
  --require-full-coverage was set: treating incomplete coverage as failure.

Re-measured on this branch, diff-scoped against origin/development
exactly as CI scopes it, each run in its own mount namespace with a
private tmpfs:

  v1.0.1  exit 98  FAIL
  v1.2.0  exit 98  FAIL   <- confirmed by the real CI run above
  v1.3.0  exit 0   PASS   52 applicable gates ran and passed;
                          11 named NOT APPLICABLE

v1.3.0 is `f7eaf2a` = .github@main, tagged so the ref is reproducible.

Refs ConductionNL/.github#159
@github-actions

github-actions Bot commented Aug 5, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/app-versions @ 20009d6

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
composer ✅ 17/17
npm
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️
Hydra gates

Quality workflow — 2026-08-05 14:08 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde rubenvdlinde changed the title ci(quality): move hydra-gates-ref off v1.0.1, which predates 16 live dead gates ci(quality): move hydra-gates-ref v1.0.1 -> v1.3.0, which is what is failing CI Aug 5, 2026
@rubenvdlinde
rubenvdlinde merged commit beae9f4 into development Aug 5, 2026
21 of 32 checks passed
rubenvdlinde added a commit that referenced this pull request Aug 5, 2026
…is PR

The earlier commit here quoted the `stylelint` globs. That was a real finding
— unquoted, the shell (no globstar) expands `src/**/*.vue` to `src/*/*.vue`,
which matches src/components/ but NOT src/App.vue, so the largest component in
the app has never been linted. But fixing it forces edits to App.vue (two
`no-descending-specificity` errors it was hiding), and App.vue in the diff
pulls in three DIFF-SCOPED Hydra a11y gates that pass vacuously on any PR that
does not touch it:

    [gate-38] skip-link                FAIL — 1 root component
    [gate-40] form-label-association   FAIL — 5 inputs
    [gate-45] prefers-reduced-motion   FAIL — 1 <style> block

Two of those want judgement this PR should not be making:

* gate-40 is a FALSE POSITIVE on 4 of its 5 findings. Those inputs are each
  wrapped in a `<label>` carrying visible text — implicit association, valid
  HTML and valid WCAG; the gate's regex just cannot see a wrapping label
  across a multi-line `<input>`. "Fixing" them with `aria-label` would
  OVERRIDE the visible label and regress SC 2.5.3 (Label in Name). Only the
  version filter input (placeholder, no label) is a genuine defect.
* gate-38 wants a skip link on App.vue, which renders inside Nextcloud's
  admin settings page — a surface that already carries core's own skip link.

So this stays out of a CI-unblocking PR, and none of it is waived: no skip, no
exclude, no `continue-on-error`. The stylelint scope returns to exactly what it
was, the gates keep full strength, and the debt is recorded as a follow-up
issue. #124 measured the same four gates (38/40/43/45) as inherited whole-tree
debt at both v1.0.1 and v1.3.0, which is the same conclusion.

The `word-break: break-word` fixes in the two components stylelint DOES cover
stay — those are what the running lint actually reported.
@rubenvdlinde
rubenvdlinde deleted the ci/hydra-gates-v1.2.0 branch August 14, 2026 09:16
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.

1 participant