From 7f6128ba4c7201737c2fe02be692677894e7f710 Mon Sep 17 00:00:00 2001 From: Claude Date: Fri, 4 Sep 2026 23:22:51 +0000 Subject: [PATCH] stale-impossibility: main( ) is not a control method The probe reads a deviation's prose for `someMethod( )` and asks the frontend's allowlist whether that method is refused. Four names in these sidecars are not control methods at all and can never be on that list, so a claim that mentions one produces a hit that cannot be real: `main( )` is z2ui5_if_app~main, the ABAP entry point every port implements and the notes discuss constantly; `render( )` and `stringify( )` are z2ui5_cl_ui5_view_builder's own (and `stringify` is also JSON's, which is how app 447's note mentions it); `factory( )` opens every chain. That was the whole standing hit list: app 351's note explains that Invalidate is denied and that the branch used to be a no-op because main_end only sends a model when main( ) changed one - and the probe asked whether `main` is denied. Six lines of reading, every sweep, for a question with no answer. 622 ports, 0 to re-read now. Re-verified against a synthetic defect: a deviation naming `setBusy( )` on a control is still reported. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01CD8XM2xmi9NHb17JHP67nZ --- scripts/probes/stale-impossibility-probe.mjs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/scripts/probes/stale-impossibility-probe.mjs b/scripts/probes/stale-impossibility-probe.mjs index 28983ffcd..e6ca1ad2f 100644 --- a/scripts/probes/stale-impossibility-probe.mjs +++ b/scripts/probes/stale-impossibility-probe.mjs @@ -71,6 +71,16 @@ const DENY_EXACT = new Set(['destroy', 'exit', 'fireEvent', 'clone', 'applySetti const DENY_PREFIX = ['bind', 'unbind', 'attach', 'detach', 'addDependent', 'placeAt', 'setBinding']; const denied = (m) => DENY_EXACT.has(m) || DENY_PREFIX.some((p) => m.startsWith(p)); +/* Not control methods at all, and in this prose for other reasons: `main( )` + * is z2ui5_if_app~main, the ABAP entry point every port in this repository + * implements and the sidecars discuss constantly; `render( )` and + * `stringify( )` are z2ui5_cl_ui5_view_builder's own (and `stringify` is also + * JSON's, which is how app 447 mentions it); `factory( )` opens every chain. + * The frontend's allowlist has no opinion about any of them, so asking + * "is it denied?" of one produces a hit that can never be real - which is what + * the single standing hit of the 2026-09 sweep was. */ +const NOT_A_CONTROL_METHOD = new Set(['main', 'render', 'stringify', 'factory']); + const CLAIM = /(cannot be|no abap2UI5 equivalent|not expressible|has no equivalent|no wire (?:can|exists)|cannot express|no bindable equivalent|which no wire|that no wire)/i; /* A hit leaves the list in one of TWO ways, and both have to be recorded in * the sidecar where the claim lives, or the next reader re-derives it. The @@ -97,7 +107,8 @@ for (const m of metas) { for (const mm of d.what.matchAll(METHOD)) { const name = mm[1]; // a getter is never the thing a port is blocked on - if (!denied(name) && !/^(get|is|has)/.test(name)) names.add(name); + if (denied(name) || NOT_A_CONTROL_METHOD.has(name)) continue; + if (!/^(get|is|has)/.test(name)) names.add(name); } if (!names.size) continue; hits++;