fix(register): gate-54 — three x-relation-filter tokens still name the pre-rename aanbieder property - #526
Conversation
…ovider property gate-54 relation-dialect, check (d): three `x-relation-filter` tokens still name `@object.aanbieder`, a property that no longer exists. Commit aab66d5 ("translate Dutch vocabulary to English", #506, 2026-08-14) renamed the property key `aanbieder` -> `provider` everywhere, including the filter KEY side (`{ "aanbieder": ... }` -> `{ "provider": ... }`), but its value-side rule never matched the compound token `"@object.aanbieder"`. So these three findings are INTRODUCED, not legacy debt — they are two days old. Effect of the defect: ADR-062 rule 6 drops an unresolved token rather than filtering on nothing, so the three pickers (service.contactPerson, service.modules, module.contactPerson) have been rendering UNSCOPED since the rename — every contact person in the instance, not just the provider's. This is NOT a data migration. `x-relation-filter` is picker-scoping metadata naming a property of the same schema; no property and no stored value changes. RenameDutchCatalogColumns already migrated the stored data (lib/Repair/ RenameDutchCatalogColumns.php:179 `'aanbieder' => 'provider'`). Both sides of each token verified by hand (the gate only checks the value side): service.contactPerson {organization: @object.provider} -> contactPerson.organization OK, service.provider OK service.modules {provider: @object.provider} -> module.provider OK, service.provider OK module.contactPerson {organization: @object.provider} -> contactPerson.organization OK, module.provider OK gate-54, the gate's own vendored helper (check_relation_dialect.py, blob 3d4c81ca == ConductionNL/.github@main), over its own enumeration (git ls-files lib/Settings, register*.json + register.d/*.json): BEFORE: 3 findings over 3 files AFTER: 0 findings over 3 files
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 | ✅ | ||||
| format | ✅ | ||||
| composer | ✅ | ✅ 130/130 | |||
| npm | ✅ | ✅ 704/704 | |||
| app:check-code | ⏭️ | ||||
| info.xml | ✅ | ||||
| REUSE | ❌ | ||||
| PHPUnit | ❌ | ||||
| Newman | ⏭️ | ||||
| Playwright | ❌ | ||||
| Hydra gates | ❌ |
Quality workflow — 2026-08-16 09:16 UTC
Download the full PDF report from the workflow artifacts.
CI verdict — gate-54 PASS, and zero new failures vs the baseRead from the Hydra Gates job logs of both runs (echoed step-source lines stripped first — GitHub Actions echoes the step's own script into the log, and a This PR — run Gate-by-gate parity (base =
|
What
Three
x-relation-filtertokens inlib/Settings/softwarecatalogus_register.jsonstill name@object.aanbieder, a property that no longer exists. Repointed to@object.provider.These three are INTRODUCED, not legacy debt
The CI verdict said "this run knew no base, so NONE of these could be classified as introduced or inherited", so the first job was to find out which they were.
git log -Sanswers it:aab66d52— refactor(softwarecatalog): translate Dutch vocabulary to English (#506), 2026-08-14 — renamed the property keyaanbieder→providereverywhere, including the filter KEY side ({ "aanbieder": … }→{ "provider": … }), but its value-side rule never matched the compound token"@object.aanbieder". The three findings are two days old, not historical backlog.This is the known codemod failure shape, in its mirror image: a rename that reaches bare identifier keys but not a quoted compound token that embeds the same name behind an
@object.prefix.Effect of the defect (it was not cosmetic)
ADR-062 rule 6: "Unresolved tokens drop their entry: an unfiltered picker beats an empty one." So since #506 these three pickers have been rendering unscoped — every contactPerson / module in the instance rather than only the ones belonging to the object's provider.
Not a data migration
x-relation-filteris picker-scoping metadata naming a property of the same schema. No property is renamed and no stored value changes. The stored data was already migrated bylib/Repair/RenameDutchCatalogColumns.php:179('aanbieder' => 'provider').Both sides of every token verified by hand
Gate check (d) validates only the value side (
@object.<field>must exist on the same schema). The key side (must be a property of the target schema) is unchecked, so it was verified manually:service.contactPerson{organization: @object.provider}contactPerson.organization✔service.provider✔service.modules{provider: @object.provider}module.provider✔service.provider✔module.contactPerson{organization: @object.provider}contactPerson.organization✔module.provider✔Also swept for other survivors of the same miss: zero live reads of an
aanbiederkey remain inlib/,src/,tests/orsrc/manifest*.json(only prose in comments, error strings and a_note). The rename itself is otherwise complete.Evidence — gate-54's own script, on its own paths
Instrument:
check_relation_dialect.pyfrom the vendoredconduction/hydra-gatespackage, blob3d4c81ca— byte-identical toConductionNL/.github@main, i.e. the copy CI actually runs (openregister's vendored copy is v1.7.0 and stale; this is v1.7.3).File enumeration reproduces the runner's own
_enum_trackedexactly:git ls-files -- lib/Settingsfiltered to(register[^/]*\.json|/register\.d/[^/]*\.json)$.3 findings over 3 files → 0 findings over 3 files. The 3 reproduce baseline run
31929364918exactly, so the instrument is measuring the same thing CI did. The gate is shown to both fail and pass on this repo, so a zero here is a verdict and not an unopened scope.JSON re-parsed clean after the edit. No test in
tests/assertsx-relation-filter.Checks
composer check:strict— not run, and it cannot be affected: this PR changes one.jsonfile and zero PHP. PHPCS/PHPMD/Psalm/PHPStan have no input here, so there is no L10 debt to inherit.sed, no codemod — this whole finding is what a codemod did.Baseline parity
Baseline for this repo (§1) is run
31929364918, which is red on Hydra Gates, Quality Report and E2E. This PR should clear gate-54 and change nothing else; E2E is a pre-existing red owned by S20.