Skip to content

fix(gate-24): the JS probe knew one of two registration APIs, so it cleared repos that have leaves - #349

Closed
rubenvdlinde wants to merge 1 commit into
mainfrom
fix/gate-24-detects-direct-registry-register
Closed

fix(gate-24): the JS probe knew one of two registration APIs, so it cleared repos that have leaves#349
rubenvdlinde wants to merge 1 commit into
mainfrom
fix/gate-24-detects-direct-registry-register

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

gate-24 (integration-parity) decides applicability from its own subject matter:
does this repo register integration leaves at all? The PHP half looks for
new LeafDescriptor( in lib/. The JS half looked only for
registerIntegration( in src/.

There are TWO canonical JS registration forms, and the gate knew one.
registerIntegration(descriptor) is the convenience wrapper exported from
@conduction/nextcloud-vue; the registry object it wraps is called directly as
OCA.OpenRegister.integrations.register(descriptor), which is equally canonical
— it is how nextcloud-vue registers its OWN built-in leaves
(src/integrations/builtin/files.js).

So an app using the direct form was told, verbatim, "this repo registers no
integration leaves at all". That sentence is not cosmetic: it routes the gate to
na, which does NOT count against coverage, instead of structural, which
does. The one gate that exists to correlate the server and JS halves of a leaf
therefore switched itself off precisely in repos that have halves to correlate,
and did so while printing a confident absence claim.

MEASURED, --full, on ConductionNL/decidesk at e03f5932:

[gate-24] integration-parity: NOT APPLICABLE — ... this repo registers no
integration leaves at all — no new LeafDescriptor( in lib/ and no
registerIntegration( in src/.

decidesk registers exactly one leaf, decidesk-decisions, at
src/integrations/registerDecisionsLeaf.js:175 via
target.OCA.OpenRegister.integrations.register(decisionsLeafDescriptor) — and
that id was present in the LIVE JS registry in the same repo's Playwright run,
read out of window.OCA.OpenRegister.integrations.list(). The gate said the set
was empty while the runtime enumerated a member of it.

POSITIVE CONTROL, old probe vs new, over the fleet checkout:

decidesk old=0 new=1 <- false negative, fixed
openregister old=0 new=1 <- false negative, fixed
openconnector old=1 new=1 <- no regression
procest old=1 new=1 <- no regression
hermiq old=1 new=1 <- no regression
nldesign old=0 new=0 <- correctly negative
docudesk old=0 new=0 <- correctly negative

and on decidesk the verdict moves from a false na to SKIPPED (structural),
which moves the coverage line from "58 of 58 applicable gates ran" to "58 of 59"
— the gap becomes visible instead of being absorbed.

integrations\.register cannot collide with unregister(, because the
qualifier is part of the match, nor with registerIntegrationIcons(, because
\( anchors the end.

Why this matters beyond the count: the drift gate-24 exists to catch is live
right now. openregister advertises kvk and opencorporates over OCS
capabilities while @conduction/nextcloud-vue never registered either in JS
(ConductionNL/nextcloud-vue#630), and it went unnoticed until an app's e2e test
compared the two lists by hand. A parity gate that cannot tell it has leaves is
a parity gate that cannot find that.

NOT FOR IMMEDIATE MERGE. This turns a silent na into a counted structural
gap in at least two repos, so it can redden a --require-full-coverage run
mid-wave — the same reason #347 is being held. Land it once the wave settles.


🤖 Generated with Claude Code

…leared repos that have leaves

gate-24 (integration-parity) decides applicability from its own subject matter:
does this repo register integration leaves at all? The PHP half looks for
`new LeafDescriptor(` in lib/. The JS half looked only for
`registerIntegration(` in src/.

There are TWO canonical JS registration forms, and the gate knew one.
`registerIntegration(descriptor)` is the convenience wrapper exported from
@conduction/nextcloud-vue; the registry object it wraps is called directly as
`OCA.OpenRegister.integrations.register(descriptor)`, which is equally canonical
— it is how nextcloud-vue registers its OWN built-in leaves
(src/integrations/builtin/files.js).

So an app using the direct form was told, verbatim, "this repo registers no
integration leaves at all". That sentence is not cosmetic: it routes the gate to
`na`, which does NOT count against coverage, instead of `structural`, which
does. The one gate that exists to correlate the server and JS halves of a leaf
therefore switched itself off precisely in repos that have halves to correlate,
and did so while printing a confident absence claim.

MEASURED, `--full`, on ConductionNL/decidesk at e03f5932:

  [gate-24] integration-parity: NOT APPLICABLE — ... this repo registers no
  integration leaves at all — no `new LeafDescriptor(` in lib/ and no
  `registerIntegration(` in src/.

decidesk registers exactly one leaf, `decidesk-decisions`, at
src/integrations/registerDecisionsLeaf.js:175 via
`target.OCA.OpenRegister.integrations.register(decisionsLeafDescriptor)` — and
that id was present in the LIVE JS registry in the same repo's Playwright run,
read out of `window.OCA.OpenRegister.integrations.list()`. The gate said the set
was empty while the runtime enumerated a member of it.

POSITIVE CONTROL, old probe vs new, over the fleet checkout:

  decidesk       old=0 new=1   <- false negative, fixed
  openregister   old=0 new=1   <- false negative, fixed
  openconnector  old=1 new=1   <- no regression
  procest        old=1 new=1   <- no regression
  hermiq         old=1 new=1   <- no regression
  nldesign       old=0 new=0   <- correctly negative
  docudesk       old=0 new=0   <- correctly negative

and on decidesk the verdict moves from a false `na` to `SKIPPED (structural)`,
which moves the coverage line from "58 of 58 applicable gates ran" to "58 of 59"
— the gap becomes visible instead of being absorbed.

`integrations\.register` cannot collide with `unregister(`, because the
qualifier is part of the match, nor with `registerIntegrationIcons(`, because
`\(` anchors the end.

Why this matters beyond the count: the drift gate-24 exists to catch is live
right now. openregister advertises `kvk` and `opencorporates` over OCS
capabilities while @conduction/nextcloud-vue never registered either in JS
(ConductionNL/nextcloud-vue#630), and it went unnoticed until an app's e2e test
compared the two lists by hand. A parity gate that cannot tell it has leaves is
a parity gate that cannot find that.

NOT FOR IMMEDIATE MERGE. This turns a silent `na` into a counted `structural`
gap in at least two repos, so it can redden a `--require-full-coverage` run
mid-wave — the same reason #347 is being held. Land it once the wave settles.
rubenvdlinde added a commit that referenced this pull request Aug 11, 2026
Supersedes #349, rebased onto main with a fixture and a measured blast radius. gate-24's JS probe knew only the convenience wrapper, so an app registering a leaf through OCA.OpenRegister.integrations.register(...) was told it registers no leaves at all - routing the gate to na, which does not count against coverage, instead of structural, which does. Measured old runner vs new over each fleet checkout: decidesk NOT APPLICABLE -> SKIPPED (structural); openregister, openconnector and hermiq PASS -> PASS. Exactly one repo changes; #349's body naming openregister as a second is corrected. Fixture: a paired arm on the existing clean bundle, red x3 before and green x3 after, with clean/ still asserted na. Its first draft was a dead test that went green pre-fix because its own comment named the wrapper call - the .github#358 prose shape met while fixturing a different gate.
@rubenvdlinde

Copy link
Copy Markdown
Contributor Author

Superseded by #370, which is merged.

Same runner change, rebased onto main, plus the two things this PR was missing:

  1. A fixture. A paired arm on the existing gates-23-33/clean bundle: one overlaid file registering a leaf through the direct form. clean/ alone stays NOT APPLICABLE (asserted, so an over-correction that made gate-24 structural everywhere is caught); clean/ + that file must be SKIPPED (structural). Observed 3 red before, 3 green after.

  2. A measured blast radius — and it corrects this PR's body. This description says the verdict moves "in at least two repos" and names openregister. Running the runner over each fleet checkout, old vs new, nothing else changed:

repo old new
decidesk NOT APPLICABLE SKIPPED (structural)
openregister PASS PASS
openconnector PASS PASS
hermiq PASS PASS

openregister ships scripts/check-integration-parity.sh, so gate-24 takes the wrapper path and passes either way. Exactly one repo changes, and it is filed as ConductionNL/decidesk#466 with the one-file remedy so the redness has an owner.

Worth recording: the fixture's first draft was a dead test — it went green against the pre-fix runner because its own explanatory comment named the wrapper call, and gate-24's probe is a plain grep over file text. That is #358's prose-parsing shape, met while fixturing a different gate. The warning is now written into the fixture file.

Branch fix/gate-24-detects-direct-registry-register can be deleted.

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