Skip to content

fix(gate-46): resolve anchors the way GitHub actually publishes them - #165

Merged
rubenvdlinde merged 1 commit into
mainfrom
fix/compose-app-mounts
Aug 5, 2026
Merged

fix(gate-46): resolve anchors the way GitHub actually publishes them#165
rubenvdlinde merged 1 commit into
mainfrom
fix/compose-app-mounts

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

What

spec-anchor-existence (gate-46) kebab-cased headings with one rule: every run of non-alphanumerics becomes a dash. GitHub does something different — it drops punctuation inside a word instead of replacing it.

heading   A subscription's retry/backoff policy MUST be independently configurable (REQ-009)
GitHub    #requirement-a-subscriptions-retrybackoff-policy-must-be-independently-configurable-req-009
gate-46   #requirement-a-subscription-s-retry-backoff-policy-must-be-independently-configurable-req-009

So a @spec tag written against the anchor a reader actually clicks was reported unresolved.

Why it matters

On openconnector this was 137 findings, none of them real, and it was failing on development — not just on branches. A gate that reports 137 non-issues is one nobody reads, which is the failure mode where a real broken anchor hides in the noise.

The tempting fix — retagging 137 call sites to match the gate — would have made every one of those links stop working on GitHub.

What changed

Headings are matched against both shapes. The old kebab form is still accepted so tags written to satisfy it keep resolving; either way the heading must exist, which is what the gate is actually for.

Verification

Fixture with both controls:

  • resolve: GitHub-shaped anchor, old kebab-shaped anchor, punctuation-free anchor
  • still fail: a fragment naming a heading that does not exist, and a near-miss of a real one

On openconnector: 137 → 46 findings, and those 46 are genuine (target file missing, or fragment names nothing).

Gate suite: 25 entry-point tests pass, 17 helper suites pass, 2 pre-existing quarantines unchanged.

spec-anchor-existence kebab-cased headings with a single rule: every run of
non-alphanumerics becomes a dash. GitHub does something different — it drops
punctuation inside a word rather than replacing it. "A subscription's
retry/backoff policy" is published as

  #a-subscriptions-retrybackoff-policy

but the gate computed

  #a-subscription-s-retry-backoff-policy

so a tag written against the anchor a reader actually clicks was reported
unresolved. On openconnector that was 137 findings, none of them real, and
it turned the gate into noise nobody could act on — the failures sat on
development, not just on branches.

Headings are now matched against both shapes. Accepting the old kebab form
as well keeps tags that were written to satisfy it resolving, and either way
the heading still has to exist, which is the whole point of the gate.

Verified with both controls: anchors in GitHub form, in the old kebab form,
and with no punctuation at all resolve; a fragment naming a heading that
does not exist, and a near-miss of a real one, still fail. On openconnector
the finding count drops 137 → 46, and those 46 are genuine — targets whose
file is missing or whose fragment names nothing.
@rubenvdlinde
rubenvdlinde merged commit 8b0928d into main Aug 5, 2026
7 checks passed
rubenvdlinde added a commit to ConductionNL/openregister that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/opencatalogi that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/docudesk that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/procest that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/hermiq that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/doriath that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/scholiq that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/decidesk that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/openbuild that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/larpingapp that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/pipelinq that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/zaakafhandelapp that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/softwarecatalog that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/nldesign that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/openconnector that referenced this pull request Aug 5, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/openregister that referenced this pull request Aug 6, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/softwarecatalog that referenced this pull request Aug 6, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/procest that referenced this pull request Aug 6, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/scholiq that referenced this pull request Aug 6, 2026
A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.
rubenvdlinde added a commit to ConductionNL/openconnector that referenced this pull request Aug 6, 2026
* chore(ci): move hydra-gates-ref v1.3.0 -> v1.4.0

A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.

* chore(ci): stop pinning hydra-gates — track the package at @main

Removes `hydra-gates-ref` entirely instead of moving it v1.3.0 -> v1.4.0.
The shared workflow already defaults the input to @main, and this repo
consumes `ConductionNL/.github/.github/workflows/quality.yml@main`, so both
sides now move together: a gate-package fix reaches this repo with no commit
here.

A pin is a silent expiry date. 22 repos sat on v1.0.1 while 16 gates were
dead fleet-wide and every one of them reported PASS (.github#159), and a
default flipped at @main later reached those same old runners and failed them
on gates they had no subject matter for (.github#173). Bumping the pin is a
treadmill that reintroduces the same failure mode on the next release.

The pin-justifying comment block is replaced with a short note saying why
there is no ref here and how to reintroduce one deliberately. The rationale
for `enable-hydra-gates: true` is kept, as is `enable-axe` being left off and
this repo's explicit `hydra-gates-require-full-coverage: false`.

---------

Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
rubenvdlinde added a commit to ConductionNL/pipelinq that referenced this pull request Aug 6, 2026
* chore(ci): move hydra-gates-ref v1.3.0 -> v1.4.0

A pinned `hydra-gates-ref` is a silent expiry date on every upstream fix:
this repo cannot receive a gate-package change until this line moves.

v1.4.0 is the latest tag and the first one that carries
`hydra-gates/scripts/axe-run.cjs` (verified absent at v1.3.0), so it is
also the first that has ConductionNL/.github#168 axe DOM scoping and
ConductionNL/.github#165 gate-46 fix.

`enable-axe` is deliberately NOT enabled in this commit. Ordering matters:
the ref lands first, enabling axe is a separate decision.

* chore(ci): stop pinning hydra-gates — track the package at @main

Removes `hydra-gates-ref` entirely instead of moving it v1.3.0 -> v1.4.0.
The shared workflow already defaults the input to @main, and this repo
consumes `ConductionNL/.github/.github/workflows/quality.yml@main`, so both
sides now move together: a gate-package fix reaches this repo with no commit
here.

A pin is a silent expiry date. 22 repos sat on v1.0.1 while 16 gates were
dead fleet-wide and every one of them reported PASS (.github#159), and a
default flipped at @main later reached those same old runners and failed them
on gates they had no subject matter for (.github#173). Bumping the pin is a
treadmill that reintroduces the same failure mode on the next release.

The pin-justifying comment block is replaced with a short note saying why
there is no ref here and how to reintroduce one deliberately. The rationale
for `enable-hydra-gates: true` is kept, as is `enable-axe` being left off; the
"no count is written here" note now refers to the package version rather than
to a pin that no longer exists.

---------

Co-authored-by: Conduction Release Bot <release-bot@conduction.nl>
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