Skip to content

fix(ios): keep an identifier hook the fold cannot prove inert - #2643

Merged
thymikee merged 1 commit into
mainfrom
fix/ios-2638-identifier-hittability-verdict
Sep 16, 2026
Merged

thymikee merged 1 commit into
mainfrom
fix/ios-2638-identifier-hittability-verdict

Conversation

@thymikee

Copy link
Copy Markdown
Member

Summary

collectIosStructuralIdentifierSuppression deleted a childless Other wrapper carrying only an
identifier, assuming its content would carry that identifier onward. A childless wrapper has nothing
to delegate to, so the identifier left every canonical view while is, get, and click still
resolved it from the same capture. Whether a wrapper arrives childless is decided by a fact the
producer may not report at all: the Apple runner answers hittable for every node, the Simulator AX
bridge for none. Suppression now requires the node's own declared hittable: false (ADR 0004).

On one screen of one installed app, snapshot -i over both producers now yields identical 18-hook
sets: home-title, gesture-lab-card, drag-gesture-fixture and gesture-metrics are addressable
under Simulator AX, as they already were under XCTest. Refs #2638. Out-of-process surfaces in that
report (PHPicker, MapLibre annotation content) are not this rule and still need raw captures. 7
touched files.

Validation

Tested at 35d1a35f77087f0412b644d49df073d9d45bbe4f.

  • pnpm check:affected --run: all runnable checks passed (2163 tests).
  • Reverting the rule turns exactly two tests red: the rule case in noise.test.ts and
    daemon-runtime-port-identifier-hook.test.ts. The delegation case and both negatives stay green;
    they pin unchanged behavior.
  • Live, iPhone 17 Pro, iOS 26.2, examples/test-app: snapshot -i --json identifier sets identical
    across producers (18 vs 18, none one-sided); a Maestro flow asserting home-title then
    gesture-lab-card reports 1 passed; is visible 'id="home-title"' passes.
  • A live off-screen negative was unreachable because this Home list ignores synthesized scrolls, so
    it is pinned at the adapter seam.

Risk: a bridge capture has no occlusion signal, so a hook behind an in-app modal can read visible —
predates this change, covers every bridge node. Sessions closed; simulator 2638-verify left booted.

Suppressing a childless structural identifier wrapper deletes its identifier from every canonical view, and the interactive fold did it on a missing fact: the Apple runner declares hittable:false for those wrappers, the Simulator AX bridge declares nothing, and the same testID hook resolved on one producer and vanished on the other. Suppression now needs the node's own declared verdict.

Refs #2638
@github-actions

Copy link
Copy Markdown

Size Report

Metric Base Current Diff
Installed (including dependencies) 4.58 MB 4.58 MB -1.1 kB
Package (unpacked) 4.58 MB 4.58 MB -1.1 kB
Package (download) 1.36 MB 1.36 MB -363 B

Startup median (7 runs, lower is better):

Scenario Base Current Diff
CLI --version 29.5 ms 28.2 ms -1.3 ms
CLI --help 85.8 ms 82.2 ms -3.7 ms

@thymikee

Copy link
Copy Markdown
Member Author

Reviewed at 35d1a35. The fold now suppresses a childless identifier-only wrapper only when the node itself declares hittable: false, so a producer that reports no hittability keeps the hook addressable. The new daemon-route test goes red without the guard, because a suppressed wrapper maps to no presented node and reads as not visible. The live snapshot -i comparison over both producers in the PR body covers the changed path.

Smoke Tests fails on RunnerTests.testAlertAcceptDoesNotActivateAReplacementWithASharedButton, a runner XCTest for alert activation. This diff changes no Swift or alert code, so the failure looks unrelated. There are no conflicts. Next: human review.

@thymikee thymikee added the ready-for-human Valid work that needs human implementation, judgment, or maintainer merge label Sep 15, 2026
@thymikee
thymikee merged commit ca5528d into main Sep 16, 2026
17 of 18 checks passed
@thymikee
thymikee deleted the fix/ios-2638-identifier-hittability-verdict branch September 16, 2026 09:17
@github-actions

Copy link
Copy Markdown
PR Preview Action v1.8.1
Preview removed because the pull request was closed.
2026-09-16 09:17 UTC

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ready-for-human Valid work that needs human implementation, judgment, or maintainer merge

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant