Skip to content

fix(register): drop the unresolvable $ref on the cross-app decisions relation (gate-54 1 → PASS) - #473

Merged
rubenvdlinde merged 1 commit into
developmentfrom
fix/gate54-external-decision-ref
Aug 9, 2026
Merged

fix(register): drop the unresolvable $ref on the cross-app decisions relation (gate-54 1 → PASS)#473
rubenvdlinde merged 1 commit into
developmentfrom
fix/gate54-external-decision-ref

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

gate-54 relation-dialect: 1 → PASS. hydra-gates 365fa31d09a26f980e6dc76cb0800575ef005a4e, measured at the CI scope (--scope-to-diff --base origin/beta).

The defect

contract.decisions references decidesk Decision objects (ADR-066). It carried both x-external-register: "decidesk" and $ref: "Decision".

OpenRegister resolves $ref inside one register set and can never reach another app's schema, so that $ref is dead weight — it names a target nothing will ever look up.

I had this wrong earlier today, and I am correcting it

Measuring the same finding against package 651e5c5, I concluded it was an unclosable gate gap and left it red on that basis — and I added my instance to .github#305 arguing the gate could not express a sanctioned ADR-066 relation.

That conclusion is now wrong. .github#286 landed hours later and gave the cross-app case a dialect. The gate is right; the register was wrong. I have followed up on #305 rather than leaving my earlier comment as the last word there.

The sanctioned form, and why the old message fired

_is_external_ref() reads x-external-register on the property. This register had it on items only — invisible to the gate — which is why the generic "$ref 'Decision' does not resolve to a schema key" fired instead of the new, actionable cross-app message.

 "decisions": {
   "type": "array",
+  "x-external-register": "decidesk",
   "items": {
     "type": "string",
     "format": "uuid",
-    "$ref": "Decision",
     "x-external-register": "decidesk"
   },

The annotation is kept on items too — it documents the item, and the exemption is what the property carries.

Can-fail proof

Restoring the $ref puts gate-54 straight back to 1 finding.

Other measurements

  • gate-51 schema-property-titles stays PASS.
  • The register still parses (json.load).
  • No other gate count moved.

…relation

gate-54 relation-dialect 1 -> PASS, measured with hydra-gates 365fa31 at the CI
scope (--scope-to-diff --base origin/beta).

`contract.decisions` references decidesk Decision objects (ADR-066). It carried
BOTH `x-external-register: "decidesk"` AND `$ref: "Decision"`. OpenRegister
resolves `$ref` inside ONE register set and can never reach another app's
schema, so that $ref is dead weight — it names a target nothing will ever look
up.

Earlier today I measured this same finding against package 651e5c5, concluded
it was an unclosable gate gap, and left it red with that reasoning — .github
#305 says exactly that, and I added my instance to it. That conclusion is now
WRONG: .github#286 landed hours later and gave the cross-app case a dialect.
The gate is right and the register was wrong.

The sanctioned form is `x-external-register: <app>` on the property carrying
the bare identifier (`type: string` + `format: uuid`), with no `$ref`. The
annotation moves to the PROPERTY as well as the item, because
`_is_external_ref()` reads it on the property; on `items` alone it is invisible
to the gate, which is why the old generic "does not resolve" message fired
instead of the new cross-app one.

Can-fail: restoring the $ref puts gate-54 back to 1.
gate-51 stays PASS; the register still parses.
@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/softwarecatalog @ 943b4f3

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
check-manifest
check-vue-demi
test-l10n
composer ✅ 128/128
npm ✅ 718/718
PHPUnit
Newman ⏭️
Playwright
Hydra gates

Quality workflow — 2026-08-09 21:13 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde
rubenvdlinde merged commit 0586437 into development Aug 9, 2026
29 checks passed
@rubenvdlinde
rubenvdlinde deleted the fix/gate54-external-decision-ref branch August 9, 2026 21:14
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