fix(gate-24): the JS probe knew one of two registration APIs, so it cleared repos that have leaves - #349
Conversation
…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.
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.
|
Superseded by #370, which is merged. Same runner change, rebased onto
openregister ships 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 |
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 forregisterIntegration(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 ofstructural, whichdoes. 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 noregisterIntegration(in src/.decidesk registers exactly one leaf,
decidesk-decisions, atsrc/integrations/registerDecisionsLeaf.js:175 via
target.OCA.OpenRegister.integrations.register(decisionsLeafDescriptor)— andthat 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 setwas 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
natoSKIPPED (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\.registercannot collide withunregister(, because thequalifier 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
kvkandopencorporatesover OCScapabilities 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
nainto a countedstructuralgap in at least two repos, so it can redden a
--require-full-coveragerunmid-wave — the same reason #347 is being held. Land it once the wave settles.
🤖 Generated with Claude Code