Skip to content

refactor(android): raw is the acquired tree; one presentation for dialog recovery; residues declared (#1832 C3) - #1865

Merged
thymikee merged 3 commits into
mainfrom
claude/1832-c3-residues
Aug 19, 2026
Merged

refactor(android): raw is the acquired tree; one presentation for dialog recovery; residues declared (#1832 C3)#1865
thymikee merged 3 commits into
mainfrom
claude/1832-c3-residues

Conversation

@thymikee

@thymikee thymikee commented Aug 19, 2026

Copy link
Copy Markdown
Member

Summary

Second slice of #1832: Android behavior changes plus one behavior-neutral shared extraction. 28 files — the Android snapshot family, plus buildSnapshotState moved verbatim out of handlers/snapshot-capture.ts into src/daemon/snapshot-state.ts with its importers repointed (generic-settle, iOS presentation, interaction fixtures) and its 409 lines of tests moved to mirror it (28th file = the occlusion regression added in review). The moved function is byte-identical to main's; no iOS or shared behavior changes.

Covers step 4 (pruners into the regular projection), step 8 (residues), and the system-dialog half of step 3. The other half of step 3 — the Android RawAXNode fixture schema — is deliberately not here: its only consumer is the cross-runtime conformance suite in step 9, which needs #1797's Swift presentation to exist as a callable target, so landing the format now would pin a fixture shape nothing reads.

C3 — --raw is the acquired tree. The three pruners (nodes Android marks invisible, stale application windows, covered same-window surfaces) ran inside parseUiHierarchyTree, mutating the tree before either projection existed, so --raw was not the acquired tree and pruned content was unrecoverable. They now run as a non-mutating classification (collectAndroidHiddenNodes) that the regular projection consults; --raw presents everything the helper serialized (normalization only). interactive ⊆ regular ⊆ raw holds by construction.

Mutation had two silent consequences the move exposed, both fixed here:

  • Hidden-content hints and the scope root are per-projection. The vertical-vs-horizontal overflow estimate and "is this a presentation leaf" both counted node.children, which the mutating pruners had already emptied. They now count the children that projection shows — the semantics the old order implied but could not state.
  • The tree is shared by raw, by the regular projection, and by hint derivation (which builds a second projection from the same tree), so whichever ran first decided what the others saw.

Behavior evidence. A property differential ran main's implementation and this one over 3,000 random accessibility trees × 4 projections (regular, -i, --depth 2, --scope), comparing full node signatures including depth, parent edge, hittable and both hidden-content hints: 12,000/12,000 identical. Raw grew on 2,514 of 3,000 trees and never shrank. The differential found two real divergences during development (the two children semantics above); both are fixed and pinned by unit tests. The harness was scaffolding against a copy of main and is not part of the diff.

One presentation for dialog recovery, and it acts on the result (the #1784 pattern, daemon-side): android-system-dialog.ts hand-rolled attachRefs(pruneGroupNodes(...)), skipping normalization and occlusion annotation, so blocking-dialog detection could disagree with snapshot about which button is on top. It now calls buildSnapshotState and consumes that presentation's occlusion result: both containsBlockingDialog and findCloseAppButton filter through isSnapshotNodeInteractionBlocked, so a stale ANR surface left under the foreground one no longer triggers recovery, and a covered "Close app" is never tapped ahead of the visible one. (Routing alone left that gap — caught in review.) Two regressions pin it, both proven red against unfiltered selection; the pre-existing ref-frame test stays green. buildSnapshotState moves to src/daemon/snapshot-state.ts (it needs no session state) so the daemon-server type cycle does not grow — R9/R10 stay at their baselines.

Residues declared (step 8), each at its site plus CONTEXT.md: no checked/checkable/selected/long-clickable on the wire; the 5000-node cap applied device-side before any scope; API-level cache-reset divergence. And the residue that was actually load-bearing: the Android freshness route signature keyed on role and selected, fields the Android backend never carries — two constant columns claiming discrimination they never had. Removed.

Also: ui-hierarchy.ts splits by question — node predicates, regular-projection visibility, scope — 974 → 634 LOC, each new module mirrored by its test file.

Refs #1832 (migration step 4, step 8, and the system-dialog half of step 3).

Validation

  • pnpm check:affected --run green on the rebased head (1869 tests).
  • C3 projections, live on throwaway Pixel 7 emulators: with the test app (helper 0.20.9) --raw 142 / regular 41 visible / -i 9 on one screen, and raw 267 vs regular 65 after navigating to a pushed screen — every raw-only node is visible-to-user="false", zero-height, or system chrome, i.e. exactly what the regular projection hides. Re-verified on this head after pnpm build:android for 0.20.10 (Settings: raw 62 / regular 38 / -i 16).
  • Dialog-recovery route, live: openrecord starttype on a recording session drives recoverAndroidBlockingSystemDialog for real. Request diagnostics show the helper session capture running inside that request and the command proceeding — the changed call site captures through the shared presentation, finds no blocking dialog, and does not false-positive. A second run with a deliberately stale helper artifact shows the other branch (android_blocking_dialog_inspection_failed → fail-open, type still succeeds).
  • ANR recovery, live, on the positive route. A purpose-made fixture APK (one Activity that sleeps 120s on tap, built with the repo's own aapt2/d8/apksigner pipeline) staged a genuine ANR on a throwaway Pixel 7 / API 36 emulator: dumpsys window shows Application Not Responding: com.example.anrlab and the dialog reads "ANR Lab isn't responding" / "Close app" / "Wait" — the exact text the detector matches. With that dialog on screen, type on a recording session drove recoverAndroidBlockingSystemDialog through the changed path, and the request diagnostics record android_blocking_dialog_recovered with the tap it dispatched (x: 540, y: 1205 — the Close-app button), after which the dialog is gone and the app is foreground again. Detection → reachable-button selection → tap → dismissal all exercised against a real system dialog.
  • Why the earlier attempt failed, since it matters for future device work: app-error dialogs are suppressed on these emulator images until settings put global hide_error_dialogs 0 is set explicitly (it reads null on a fresh AVD). A forced am crash produced no dialog either, which is what identified the setting rather than the ANR staging as the blocker. With it set, both crash and ANR dialogs appear.
  • Remaining unit-only, as before: the synthetic covered-first ordering (a stale covered "Close app" preceding the visible one), which needs two simultaneous Close-app buttons and is impractical to stage on a real ANR.
  • Sessions closed, emulator killed, throwaway AVD deleted (Pixel_7_CI untouched).
  • Two gate runs showed unrelated timeouts (android-lifecycle provider scenario, daemon-entrypoint) while an emulator was booting on the same machine; both pass in isolation in 8.3s and 1.3s.
  • Rebased onto d29dc22 (16 commits, including refactor(daemon): one capture-input builder and one admit-then-bind step #1876's capture-input builder and refactor: migrate screenshot to request-bound runtime #1878's screenshot runtime migration). One conflict, in request-generic-dispatch.ts: main had removed the buildSnapshotState/captureSnapshotData imports this branch was repointing, so main's side won outright. One reconciliation the conflict did not surface: screenshot-runtime.ts arrived on main importing buildSnapshotState from its old home, and now points at src/daemon/snapshot-state.ts with the other importers — caught by typecheck, noted in the commit message. Still 28 files.
  • The earlier test-file-size-ratchet drift was main's own and is fixed there by test(ratchet): pin snapshot-handler.test.ts at main's 2654 lines #1860; this PR only lowers its own file's pin, which shrank by 2 lines.
  • provider-scenarios/settle-observation "press --settle" flakes under load on this machine — 1 of 3 runs passes on both this branch and plain origin/main (5s fixture timeout), so it is pre-existing, not a regression from this change.

Docs: website/docs/docs/commands.md (what Android --raw now shows, and the helper's state/cap limits), CONTEXT.md (projection vocabulary + declared residues), CHANGELOG.

@github-actions

github-actions Bot commented Aug 19, 2026

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

@github-actions

github-actions Bot commented Aug 19, 2026

Copy link
Copy Markdown

Size Report

Metric Base Current Diff
JS raw 2.33 MB 2.33 MB -48 B
JS gzip 765.0 kB 764.7 kB -270 B
npm tarball 888.6 kB 888.4 kB -208 B
npm unpacked 3.10 MB 3.10 MB -48 B

Startup median (7 runs, lower is better):

Scenario Base Current Diff
CLI --version 28.7 ms 29.3 ms +0.6 ms
CLI --help 70.6 ms 71.2 ms +0.6 ms

Top changed chunks:

Chunk Raw diff Gzip diff
dist/src/internal/daemon.js +38 B -271 B
dist/src/snapshot.js +15 B +36 B
dist/src/session2.js -16 B -6 B
dist/src/registry.js 0 B -2 B
dist/src/agent-device-client.js 0 B +2 B

@thymikee

Copy link
Copy Markdown
Member Author

[P1] Make dialog recovery consume the presentation’s occlusion result. buildSnapshotState annotates covered nodes with hittable: false / interactionBlocked: "covered", but containsBlockingDialog still scans every node and findCloseAppButton still returns the first matching node with a rect. A covered or stale “Close app” can therefore trigger recovery and be tapped ahead of the visible top button—the exact disagreement this change says it fixes. Filter dialog detection and button selection through the structured interaction-blocked predicate, then add planted-red regressions with (1) a covered matching button before a visible matching button, asserting the visible center is tapped, and (2) an all-covered dialog signal, asserting recovery does not trigger. Current tests use only unoccluded mocked nodes, so restoring the old hand-rolled presentation remains green.

Please also make the PR scope and migration claim exact. This is 27 files and includes a mechanical shared buildSnapshotState extraction, 409 moved shared tests, and repointed generic-settle/iOS/interaction imports; describe it as Android behavior plus a behavior-neutral shared extraction, not “no shared/iOS code changes.” #1832 step 3 also promises an Android RawAXNode fixture schema, which this head does not add, so either narrow the step-3 claim to the system-dialog portion or include the promised schema.

Exact-head CI is green and the C3/raw projection work plus Pixel evidence otherwise look sound, but this should not be labeled ready until the recovery behavior is fixed and proven.

thymikee added a commit that referenced this pull request Aug 19, 2026
…sult

Review P1 on #1865: routing blocking-dialog recovery through buildSnapshotState made the occlusion
result available but nothing consumed it. containsBlockingDialog scanned every node and
findCloseAppButton returned the first text match with a rect, so a stale ANR surface left under the
foreground one could still trigger recovery, and a covered "Close app" could be tapped ahead of the
visible top button — the disagreement the routing was supposed to remove.

Both decisions now filter through isSnapshotNodeInteractionBlocked, the shared predicate over the
annotator's structured result. Two regressions cover it, both proven red against an unfiltered
selection: a covered Close app preceding a visible one (asserts the visible center is tapped) and a
fully covered dialog signal (asserts recovery does not trigger, no tap dispatched).
@thymikee

Copy link
Copy Markdown
Member Author

Both P1 points addressed in 233f92a.

Recovery now consumes the occlusion result. You were right that routing through buildSnapshotState only made the annotation available — nothing read it. containsBlockingDialog and findCloseAppButton both filter through isSnapshotNodeInteractionBlocked (the shared predicate over the annotator's structured result, not a re-derivation from hittable), so a stale ANR surface under the foreground one no longer triggers recovery, and a covered "Close app" is never selected ahead of the visible one.

Two regressions in src/daemon/__tests__/android-system-dialog-occlusion.test.ts, both proven red against unfiltered selection (I removed the two .filter(isTouchableDialogNode) calls and reran):

  1. a covered "Close app" first in document order, a visible one after the covering sheet → asserts the tap lands at the visible button's center (140, 1840); unfiltered it taps the covered one at (140, 340).
  2. an ANR text + "Close app" fully under a foreground sheet → asserts status: 'absent' and no adb tap dispatched; unfiltered it triggers recovery and polls out.

The pre-existing ref-frame test stays green in both states, so the reds are attributable to the filter and not to fixture drift. Note the fixtures had to use a real overlay-kind type (BottomSheetDialog) — the annotator matches overlay kind on type/role, not identifier, so my first attempt annotated nothing and would have been a vacuous green.

Scope and step claims corrected. The summary now says Android behavior changes plus one behavior-neutral shared extraction, and names it: 27 files, buildSnapshotState moved verbatim (byte-identical to main's, diffed) with importers repointed and its 409 test lines moved to mirror it. The migration claim is now step 4, step 8, and the system-dialog half of step 3; the RawAXNode fixture schema is called out as deliberately absent, because its only consumer is the step-9 conformance suite that needs #1797's Swift presentation as a callable target — landing the format now pins a shape nothing reads. Happy to add it here instead if you'd rather have the schema early.

CHANGELOG gained the recovery behavior change. pnpm check:affected --run green (1848 tests).

@thymikee

Copy link
Copy Markdown
Member Author

Re-reviewed exact 233f92afece710d69fa257538f3eff29e9ce4098: the prior occlusion blocker is fixed non-vacuously, with no remaining code finding. Both blocking-dialog detection and Close-app selection now consume the shared presentation’s structured occlusion result. The regressions prove a covered button that appears first cannot beat the reachable button, and a fully covered dialog triggers no recovery/tap; both fail against the prior unfiltered selection. The step-3 claim is now appropriately limited to the system-dialog half, and the shared extraction is disclosed.

Hold readiness for three evidence/status items:

  • Correct the body scope to 28 files, not 27 (the blocker-fix regression added the 28th file).
  • Wait for all exact-head required CI; Coverage, Integration, FreeRange, smoke, and other lanes are still pending.
  • Add a relevant live Android dialog/ANR recovery pass for this device-facing tap route: show a visible blocking dialog is detected, the reachable Close-app button is tapped, and dismissal/relaunch succeeds. If the synthetic covered-first ordering is impractical to stage live, state explicitly that this ordering remains unit-only evidence.

Do not apply the readiness label yet.

@thymikee

Copy link
Copy Markdown
Member Author

All three items addressed — one of them by admitting a gap rather than closing it.

1. File count corrected to 28 in the body (the occlusion regression added in the blocker fix is the 28th).

2. Exact-head CI is complete: 30/30 green on 233f92a — Coverage, Integration, FreeRange, smoke and the rest all landed.

3. Live ANR pass — partially done, and I want to be exact about which part.

What I did drive live on a throwaway Pixel 7 (after pnpm build:android, since the 0.20.10 bump left this worktree's helper artifact stale — helper installs as versionCode 20010, sha matched):

  • The changed call site, for real. openrecord starttype on a recording session runs recoverAndroidBlockingSystemDialog; request diagnostics show the helper session capture inside that request and the command proceeding. So the recovery route captures through the shared presentation live and does not false-positive on a normal screen. A second run with a stale artifact exercised the other branch (android_blocking_dialog_inspection_failed → fail-open, type still succeeds).
  • C3 projections re-verified on this head: Settings raw 62 / regular 38 / -i 16.

What I could not stage, and why: a genuine ANR dialog. kill -STOP on the app pid is denied on the only system images installed here (google_apis_playstore, non-rootable — no sdkmanager CLI locally to fetch a google_apis one), and am hang was accepted but auto-restarted without surfacing a dialog (it also left the emulator's screenrecord subsystem holding recovery evidence, so I rebuilt the AVD and re-ran clean).

So the dialog-present branch — detection, reachable-button selection, the tap, dismissal/relaunch — remains unit-only evidence, including the covered-first ordering. That is stated explicitly in the body's Validation section rather than implied. Closing it live needs either a rootable google_apis image (kill -STOP <app pid> + input to trip the input-dispatch ANR) or a purpose-built hang APK; I'll run it if you want that before merge — happy to keep readiness held until then.

Sessions closed, emulator killed, throwaway AVD deleted; Pixel_7_CI untouched.

@thymikee

Copy link
Copy Markdown
Member Author

Went back at the live ANR item rather than leaving it as an offer. Result: I got a real ANR, but API 36 will not keep the dialog on screen, so the dialog-present branch stays unit-only — now with much sharper evidence about why.

What I did. Built a purpose-made ANR fixture APK — one Activity that sleeps 120s on tap — compiled with this repo's own aapt2/d8/zipalign/apksigner pipeline (the same steps as scripts/build-android-helper.sh), installed on a throwaway Pixel 7 / API 36 emulator.

What that proved:

  • A genuine ANR fires: the system dropbox records tag=data_app_anr, and while the fixture is hung uiautomator dump returns ERROR: null root node returned by UiTestAutomationBridge — the main thread really is blocked, not merely slow.
  • The production command carrying the recovery path (type on a recording session) ran against that hung app and completed instead of wedging — a real device exercise of the inspection-failure/fail-open branch, which matters precisely because a frozen app makes the a11y bridge unreadable.

What the platform refused: with hide_error_dialogs=0, repeated input into the hung app and 30s of polling, no ANR window ever appears in dumpsys window windows — API 36 kills or auto-dismisses rather than parking an "isn't responding" dialog. Earlier I put this down to a non-rootable image; that was only half of it, and the fixture APK removed that half. The remaining blocker is platform behavior on this API level, not tooling.

So, stated plainly in the body's Validation section: detection, reachable-button selection, the tap, and dismissal/relaunch remain unit-only evidence, including the covered-first ordering. The fixture recipe is written down for anyone on an image that does surface the dialog (tap once to hang, tap again to trip input dispatch) — with the caveat that while the app is frozen the a11y bridge returns a null root, so detection can only read the tree once the dialog window owns focus.

Body also carries the corrected 28-file count and the 30/30 exact-head CI. Fixture uninstalled, session closed, recording stopped, emulator killed, throwaway AVD deleted — your Pixel 9 Pro XL was untouched (I did bind a session to it briefly while chasing a device-selector lock, read-only snapshot, then closed it).

@thymikee

thymikee commented Aug 19, 2026

Copy link
Copy Markdown
Member Author

Re-reviewed exact 233f92afece710d69fa257538f3eff29e9ce4098. Code remains clean, the prior occlusion regressions are non-vacuous, the branch is conflict-free, and 30/30 exact-head checks are green.

The new live run materially strengthens evidence for the ANR inspection-failure/fail-open branch, but it does not exercise the changed positive dialog route: API 36 never surfaced a persistent ANR dialog, so detection, reachable Close-app selection/tap, and dismissal/relaunch remain unit-only.

Per the device-facing readiness rule, hold ready-for-human unless that production route is demonstrated on an image/device that surfaces the dialog, or a maintainer explicitly accepts the documented residual risk. The synthetic covered-first ordering can remain unit-only if staging it live is impractical.

@thymikee

Copy link
Copy Markdown
Member Author

The positive dialog route is now demonstrated live — the readiness item is closed on evidence, not on accepted risk.

What made it possible. My earlier conclusion ('API 36 never surfaces the dialog') was wrong in its cause. App-error dialogs are suppressed on these emulator images until hide_error_dialogs is set explicitly — it reads null on a fresh AVD, and I had only set it midway through the previous run, after the first ANR. The probe that found this was a forced am crash: it produced no dialog either, which pointed at the setting rather than at ANR staging. With settings put global hide_error_dialogs 0 from the start, both crash and ANR dialogs appear normally.

The live run (throwaway Pixel 7 / API 36, fixture APK that sleeps 120s on tap, built with this repo's aapt2/d8/apksigner pipeline):

  1. Genuine ANR staged — dumpsys window focus becomes Application Not Responding: com.example.anrlab, and the dialog reads "ANR Lab isn't responding" / "Close app" / "Wait": the exact text ANDROID_BLOCKING_MODAL_PATTERN matches.
  2. With the dialog on screen, type on a recording session ran the production recovery route.
  3. Request diagnostics record android_blocking_dialog_recovered with the dispatched tap — {"deviceId":"emulator-5582","appBundleId":"com.example.anrlab","x":540,"y":1205}, the Close-app button — and the command completed in ~3s.
  4. Post-state: dialog gone, app foreground again.

So detection, reachable-button selection, the tap, and dismissal are all exercised against a real system dialog on the changed path.

Still unit-only, and I think justifiably: the synthetic covered-first ordering (a stale covered "Close app" preceding the visible one). Staging it live needs two simultaneous Close-app buttons with one occluded, which a real ANR does not produce.

Body updated with this evidence and with the hide_error_dialogs gotcha, since it is the reason device-facing dialog work looks unstageable when it is not. Fixture uninstalled, session closed, recording stopped, emulator killed, AVD deleted.

…log recovery; residues declared (#1832 C3)

- C3: the three regular-projection pruners (invisible subtrees, stale application windows,
  covered same-window surfaces) move out of parseUiHierarchyTree into the projection as a
  non-mutating classification (collectAndroidHiddenNodes in ui-hierarchy-visibility.ts). --raw
  presents the acquired tree; interactive ⊆ regular ⊆ raw by construction. Hidden-content hints
  and the scope root are derived per projection over retained children, which is what the
  mutating pruners implied. Property-checked identical to main for regular/-i/depth/scope over
  12,000 random tree × projection pairs; raw grew on 2,514/3,000 and never shrank.
- Android blocking-dialog recovery routes through buildSnapshotState (the one presentation), which
  moves to src/daemon/snapshot-state.ts below the daemon-server type cycle; importers repointed,
  its tests mirror the module.
- Freshness route signature drops role/selected (Android never carries them).
- Residues declared at their sites and in CONTEXT.md; docs + CHANGELOG.
- ui-hierarchy.ts split by question: node predicates (ui-hierarchy-node.ts), regular-projection
  visibility (ui-hierarchy-visibility.ts), scope (ui-hierarchy-scope.ts); 974 → 634 LOC.
…sult

Review P1 on #1865: routing blocking-dialog recovery through buildSnapshotState made the occlusion
result available but nothing consumed it. containsBlockingDialog scanned every node and
findCloseAppButton returned the first text match with a rect, so a stale ANR surface left under the
foreground one could still trigger recovery, and a covered "Close app" could be tapped ahead of the
visible top button — the disagreement the routing was supposed to remove.

Both decisions now filter through isSnapshotNodeInteractionBlocked, the shared predicate over the
annotator's structured result. Two regressions cover it, both proven red against an unfiltered
selection: a covered Close app preceding a visible one (asserts the visible center is tapped) and a
fully covered dialog signal (asserts recovery does not trigger, no tap dispatched).

Rebase reconciliation: screenshot-runtime.ts arrived on main (#1878) importing buildSnapshotState
from its old home; repointed to src/daemon/snapshot-state.ts with the other importers.
@thymikee
thymikee force-pushed the claude/1832-c3-residues branch from 233f92a to f2d52b1 Compare August 19, 2026 15:42
@thymikee

Copy link
Copy Markdown
Member Author

Rebased onto d29dc22 and reconciled with what landed on main meanwhile.

The rebase crossed 16 commits, two of which touch this seam: #1876 (one capture-input builder / admit-then-bind) and #1878 (screenshot migrated to the request-bound runtime).

  • One conflict, in request-generic-dispatch.ts: this branch repointed its buildSnapshotState import, and main had meanwhile deleted both that import and captureSnapshotData from the file entirely. Main's side won outright — the repoint had nothing left to point.
  • One reconciliation the conflict did not surface, which is the more interesting one: screenshot-runtime.ts arrived on main (refactor: migrate screenshot to request-bound runtime #1878) importing buildSnapshotState from its old home in handlers/snapshot-capture.ts. A textual rebase has no reason to flag that, and it only failed at typecheck. It now points at src/daemon/snapshot-state.ts with the other importers, and the commit message records why the edit is in this PR at all.

That is the general hazard of a move-plus-repoint branch: conflicts catch collisions on lines you touched, never new callers of the old path. Typecheck is the thing that catches those, which is why the extraction is a compile-time move rather than a re-export shim.

Still 28 files; [WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
[WARN] Your node_modules are out of sync with your lockfile. The workspace structure has changed since last install
check:affected — diff origin/main...HEAD
Selected 17 check(s):

  • format: Formatting (oxfmt)
    · src/tests/test-file-size-ratchet.test.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/tests/android-system-dialog-occlusion.test.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/tests/generic-settle.test.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/tests/snapshot-state.test.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/android-snapshot-freshness.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/android-system-dialog.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/handlers/tests/interaction-ios-tap-outcome-fixtures.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/handlers/tests/interaction-settle.test.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/handlers/tests/interaction-touch-fixtures.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/handlers/tests/interaction.test.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/handlers/tests/snapshot-capture.test.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/handlers/snapshot-capture.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/screenshot-runtime.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/snapshot-presentation/ios/publication-membership.test.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/snapshot-presentation/ios/transitions.test.ts [gate:format] — oxfmt covers src/ and test/
    · src/daemon/snapshot-state.ts [gate:format] — oxfmt covers src/ and test/
    · src/platforms/android/tests/snapshot.test.ts [gate:format] — oxfmt covers src/ and test/
    · src/platforms/android/tests/ui-hierarchy-scope.test.ts [gate:format] — oxfmt covers src/ and test/
    · src/platforms/android/tests/ui-hierarchy.test.ts [gate:format] — oxfmt covers src/ and test/
    · src/platforms/android/snapshot-helper-capture.ts [gate:format] — oxfmt covers src/ and test/
    · src/platforms/android/ui-hierarchy-node.ts [gate:format] — oxfmt covers src/ and test/
    · src/platforms/android/ui-hierarchy-visibility.ts [gate:format] — oxfmt covers src/ and test/
    · src/platforms/android/ui-hierarchy.ts [gate:format] — oxfmt covers src/ and test/
  • lint: Lint (oxlint)
    · src/tests/test-file-size-ratchet.test.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/tests/android-system-dialog-occlusion.test.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/tests/generic-settle.test.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/tests/snapshot-state.test.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/android-snapshot-freshness.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/android-system-dialog.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/handlers/tests/interaction-ios-tap-outcome-fixtures.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/handlers/tests/interaction-settle.test.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/handlers/tests/interaction-touch-fixtures.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/handlers/tests/interaction.test.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/handlers/tests/snapshot-capture.test.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/handlers/snapshot-capture.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/screenshot-runtime.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/snapshot-presentation/ios/publication-membership.test.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/snapshot-presentation/ios/transitions.test.ts [gate:lint] — oxlint covers the source tree
    · src/daemon/snapshot-state.ts [gate:lint] — oxlint covers the source tree
    · src/platforms/android/tests/snapshot.test.ts [gate:lint] — oxlint covers the source tree
    · src/platforms/android/tests/ui-hierarchy-scope.test.ts [gate:lint] — oxlint covers the source tree
    · src/platforms/android/tests/ui-hierarchy.test.ts [gate:lint] — oxlint covers the source tree
    · src/platforms/android/snapshot-helper-capture.ts [gate:lint] — oxlint covers the source tree
    · src/platforms/android/ui-hierarchy-node.ts [gate:lint] — oxlint covers the source tree
    · src/platforms/android/ui-hierarchy-visibility.ts [gate:lint] — oxlint covers the source tree
    · src/platforms/android/ui-hierarchy.ts [gate:lint] — oxlint covers the source tree
  • typecheck: Typecheck (tsc)
    · src/tests/test-file-size-ratchet.test.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/tests/android-system-dialog-occlusion.test.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/tests/generic-settle.test.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/tests/snapshot-state.test.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/android-snapshot-freshness.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/android-system-dialog.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/handlers/tests/interaction-ios-tap-outcome-fixtures.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/handlers/tests/interaction-settle.test.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/handlers/tests/interaction-touch-fixtures.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/handlers/tests/interaction.test.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/handlers/tests/snapshot-capture.test.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/handlers/snapshot-capture.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/screenshot-runtime.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/snapshot-presentation/ios/publication-membership.test.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/snapshot-presentation/ios/transitions.test.ts [gate:typecheck] — tsc includes src/ and test/
    · src/daemon/snapshot-state.ts [gate:typecheck] — tsc includes src/ and test/
    · src/platforms/android/tests/snapshot.test.ts [gate:typecheck] — tsc includes src/ and test/
    · src/platforms/android/tests/ui-hierarchy-scope.test.ts [gate:typecheck] — tsc includes src/ and test/
    · src/platforms/android/tests/ui-hierarchy.test.ts [gate:typecheck] — tsc includes src/ and test/
    · src/platforms/android/snapshot-helper-capture.ts [gate:typecheck] — tsc includes src/ and test/
    · src/platforms/android/ui-hierarchy-node.ts [gate:typecheck] — tsc includes src/ and test/
    · src/platforms/android/ui-hierarchy-visibility.ts [gate:typecheck] — tsc includes src/ and test/
    · src/platforms/android/ui-hierarchy.ts [gate:typecheck] — tsc includes src/ and test/
  • layering: Import-direction layering guard
    · src/daemon/android-snapshot-freshness.ts [gate:layering] — layering guard reads production src/ modules
    · src/daemon/android-system-dialog.ts [gate:layering] — layering guard reads production src/ modules
    · src/daemon/handlers/snapshot-capture.ts [gate:layering] — layering guard reads production src/ modules
    · src/daemon/screenshot-runtime.ts [gate:layering] — layering guard reads production src/ modules
    · src/daemon/snapshot-state.ts [gate:layering] — layering guard reads production src/ modules
    · src/platforms/android/snapshot-helper-capture.ts [gate:layering] — layering guard reads production src/ modules
    · src/platforms/android/ui-hierarchy-node.ts [gate:layering] — layering guard reads production src/ modules
    · src/platforms/android/ui-hierarchy-visibility.ts [gate:layering] — layering guard reads production src/ modules
    · src/platforms/android/ui-hierarchy.ts [gate:layering] — layering guard reads production src/ modules
  • fallow: Fallow code-quality audit
    · src/tests/test-file-size-ratchet.test.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/tests/android-system-dialog-occlusion.test.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/tests/generic-settle.test.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/tests/snapshot-state.test.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/android-snapshot-freshness.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/android-system-dialog.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/handlers/tests/interaction-ios-tap-outcome-fixtures.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/handlers/tests/interaction-settle.test.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/handlers/tests/interaction-touch-fixtures.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/handlers/tests/interaction.test.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/handlers/tests/snapshot-capture.test.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/handlers/snapshot-capture.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/screenshot-runtime.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/snapshot-presentation/ios/publication-membership.test.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/snapshot-presentation/ios/transitions.test.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/daemon/snapshot-state.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/platforms/android/tests/snapshot.test.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/platforms/android/tests/ui-hierarchy-scope.test.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/platforms/android/tests/ui-hierarchy.test.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/platforms/android/snapshot-helper-capture.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/platforms/android/ui-hierarchy-node.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/platforms/android/ui-hierarchy-visibility.ts [gate:fallow] — fallow audits changed TypeScript for dead code
    · src/platforms/android/ui-hierarchy.ts [gate:fallow] — fallow audits changed TypeScript for dead code
  • build: Build (tsdown + declarations)
    · src/daemon/android-snapshot-freshness.ts [src-prod] — production source is compiled by the build
    · src/daemon/android-system-dialog.ts [src-prod] — production source is compiled by the build
    · src/daemon/handlers/snapshot-capture.ts [src-prod] — production source is compiled by the build
    · src/daemon/screenshot-runtime.ts [src-prod] — production source is compiled by the build
    · src/daemon/snapshot-state.ts [src-prod] — production source is compiled by the build
    · src/platforms/android/snapshot-helper-capture.ts [src-prod] — production source is compiled by the build
    · src/platforms/android/ui-hierarchy-node.ts [src-prod] — production source is compiled by the build
    · src/platforms/android/ui-hierarchy-visibility.ts [src-prod] — production source is compiled by the build
    · src/platforms/android/ui-hierarchy.ts [src-prod] — production source is compiled by the build
  • vitest-related: Tests related by Vitest module graph
    · src/tests/test-file-size-ratchet.test.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/tests/android-system-dialog-occlusion.test.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/tests/generic-settle.test.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/tests/snapshot-state.test.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/android-snapshot-freshness.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/android-system-dialog.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/handlers/tests/interaction-ios-tap-outcome-fixtures.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/handlers/tests/interaction-settle.test.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/handlers/tests/interaction-touch-fixtures.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/handlers/tests/interaction.test.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/handlers/tests/snapshot-capture.test.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/handlers/snapshot-capture.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/screenshot-runtime.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/snapshot-presentation/ios/publication-membership.test.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/snapshot-presentation/ios/transitions.test.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/daemon/snapshot-state.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/platforms/android/tests/snapshot.test.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/platforms/android/tests/ui-hierarchy-scope.test.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/platforms/android/tests/ui-hierarchy.test.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/platforms/android/snapshot-helper-capture.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/platforms/android/ui-hierarchy-node.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/platforms/android/ui-hierarchy-visibility.ts [vitest:related] — Vitest resolves affected tests through its static module graph
    · src/platforms/android/ui-hierarchy.ts [vitest:related] — Vitest resolves affected tests through its static module graph
  • coverage: Affected LCOV + changed-line coverage
    · src/platforms/android/snapshot-helper-capture.ts [platform-src] — Testing Matrix requires coverage for platform/device-response changes
    · src/platforms/android/ui-hierarchy-node.ts [platform-src] — Testing Matrix requires coverage for platform/device-response changes
    · src/platforms/android/ui-hierarchy-visibility.ts [platform-src] — Testing Matrix requires coverage for platform/device-response changes
    · src/platforms/android/ui-hierarchy.ts [platform-src] — Testing Matrix requires coverage for platform/device-response changes
  • provider-integration: Provider-backed integration suite
    · src/platforms/android/snapshot-helper-capture.ts [platform-src] — platform source shapes device/provider wire behavior
    · src/platforms/android/ui-hierarchy-node.ts [platform-src] — platform source shapes device/provider wire behavior
    · src/platforms/android/ui-hierarchy-visibility.ts [platform-src] — platform source shapes device/provider wire behavior
    · src/platforms/android/ui-hierarchy.ts [platform-src] — platform source shapes device/provider wire behavior
  • android-helpers: Android helper builds (snapshot + IME) (GitHub-authoritative; not run locally)
    · android/snapshot-helper/src/main/java/com/callstack/agentdevice/snapshothelper/AccessibilityTreeCapture.java [own:android-helpers] — Android helper packages have their own build
    · android/snapshot-helper/src/main/java/com/callstack/agentdevice/snapshothelper/AccessibilityTreeXml.java [own:android-helpers] — Android helper packages have their own build
  • web-smoke: Live web platform smoke (GitHub-authoritative; not run locally)
    · src/daemon/android-snapshot-freshness.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/android-system-dialog.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/handlers/snapshot-capture.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/screenshot-runtime.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/snapshot-state.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
  • command-docs: Command reference doc coverage
    · website/docs/docs/commands.md [own:command-docs] — the command reference is asserted against the CLI in both directions
  • replay-ios: iOS simulator replay suite (GitHub-authoritative; not run locally)
    · src/daemon/android-snapshot-freshness.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/android-system-dialog.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/handlers/snapshot-capture.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/screenshot-runtime.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/snapshot-state.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
  • replay-ios-device: iOS physical device replay suite (GitHub-authoritative; not run locally)
    · src/daemon/android-snapshot-freshness.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/android-system-dialog.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/handlers/snapshot-capture.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/screenshot-runtime.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/snapshot-state.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
  • replay-macos: macOS replay suite (GitHub-authoritative; not run locally)
    · src/daemon/android-snapshot-freshness.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/android-system-dialog.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/handlers/snapshot-capture.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/screenshot-runtime.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/snapshot-state.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
  • replay-linux: Linux replay suite (GitHub-authoritative; not run locally)
    · src/daemon/android-snapshot-freshness.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/android-system-dialog.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/handlers/snapshot-capture.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/screenshot-runtime.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/snapshot-state.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
  • replay-android: Android replay suite (GitHub-authoritative; not run locally)
    · android/snapshot-helper/src/main/java/com/callstack/agentdevice/snapshothelper/AccessibilityTreeCapture.java [own:device-lane:android] — android-owned tree: only the android device lanes execute it
    · android/snapshot-helper/src/main/java/com/callstack/agentdevice/snapshothelper/AccessibilityTreeXml.java [own:device-lane:android] — android-owned tree: only the android device lanes execute it
    · src/daemon/android-snapshot-freshness.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/android-system-dialog.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/handlers/snapshot-capture.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/screenshot-runtime.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/daemon/snapshot-state.ts [own:device-lane:shared] — shared runtime surface: every device lane drives the CLI and daemon through it
    · src/platforms/android/snapshot-helper-capture.ts [own:device-lane:android] — android-owned tree: only the android device lanes execute it
    · src/platforms/android/ui-hierarchy-node.ts [own:device-lane:android] — android-owned tree: only the android device lanes execute it
    · src/platforms/android/ui-hierarchy-visibility.ts [own:device-lane:android] — android-owned tree: only the android device lanes execute it
    · src/platforms/android/ui-hierarchy.ts [own:device-lane:android] — android-owned tree: only the android device lanes execute it
    Docs-only changes ignored: 2 file(s).

[skip] android-helpers — GitHub-authoritative (jobs: Android / Smoke Tests)

[skip] web-smoke — GitHub-authoritative (jobs: Integration Tests, Packaged CLI Node 22.12, Web Platform Smoke)

[skip] replay-ios — parked, workflow_dispatch only (Replay Manual / iOS Replay Suite)

[skip] replay-ios-device — parked, workflow_dispatch only (Replay Manual / iOS Replay Suite)

[skip] replay-macos — GitHub-authoritative (jobs: macOS / Smoke Tests)

[skip] replay-linux — GitHub-authoritative (jobs: Linux / Smoke Tests)

[skip] replay-android — parked, workflow_dispatch only (Replay Manual / Android Full Emulator Suite)

[run] format: pnpm run format:check
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
Checking formatting...

All matched files use the correct format.
Finished in 683ms on 2872 files using 12 threads.

[run] lint: pnpm run lint
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0

[run] typecheck: pnpm run typecheck
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0

[run] layering: pnpm run check:layering
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ registryAliasTokens reads every alias property value out of the registry source (0.965542ms)
✔ registryAliasTokens is not fooled by an unrelated alias string elsewhere in the file (0.083541ms)
✔ importsAliasResolver is true only for a real VALUE import of the resolver (0.121208ms)
✔ importsAliasResolver is false for a type-only import (0.055291ms)
✔ importsAliasResolver is false when the import is missing or from the wrong module (0.08375ms)
✔ aliasResolverLocalName resolves the LOCAL binding, following an as alias (0.065041ms)
✔ aliasResolverLocalName is null when there is no matching value import (0.066958ms)
✔ helpTargetBindingName reads the binding resolveSimpleHelpTarget produces (0.149125ms)
✔ helpTargetBindingName is null when the fast path no longer produces one (0.0885ms)
✔ countLocalBindings counts value declarations only, not the import or type positions (0.234125ms)
✔ usageTextDelegationFailure accepts the real composition, by local name (0.37425ms)
✔ usageTextDelegationFailure rejects a raw call, with no wrapping resolver call (0.233ms)
✔ usageTextDelegationFailure rejects a present-but-unused import (0.699625ms)
✔ usageTextDelegationFailure rejects an import used only unrelated to buildCommandUsageText (0.252333ms)
✔ usageTextDelegationFailure rejects a decoy wrapped call beside a raw shipped call (0.218791ms)
✔ usageTextDelegationFailure rejects the resolver applied to anything but the help target (0.153583ms)
✔ usageTextDelegationFailure rejects a local shadow of the imported resolver (0.090208ms)
✔ usageTextDelegationFailure rejects an ambiguous second help-target binding (0.296417ms)
✔ usageTextDelegationFailure reports a fast path that no longer builds usage text at all (0.273834ms)
✔ localAliasLiterals reports every requested token present as a string literal (0.134167ms)
✔ localAliasLiterals ignores tokens that only appear as identifiers, not string literals (0.065833ms)
✔ localAliasLiterals reports nothing when the fixed bin.ts delegates and holds no literals (0.278167ms)
✔ the real tree imports the resolver, calls it into buildCommandUsageText, holds no local alias literals, and passes R12 (5.840792ms)
✔ every catalogued rule is registered, and nothing else is (0.845791ms)
✔ every registered rule is callable, so no entry is a stale reference (0.462583ms)
✔ contracts rejects host process and timer mechanics (0.926292ms)
✔ contracts policy ignores type vocabulary, prose, tests, and capture-kit mechanics (0.386083ms)
✔ network traffic vocabulary cannot grow parser implementation inside contracts (0.308916ms)
✔ daemon modularity baseline records the measured R7 ownership pressure (0.419792ms)
✔ external daemon/types.ts importer membership changes require the baseline to change (3.167042ms)
✔ planned logical modules start with zero forbidden imports (0.86ms)
✔ replay-test rejects request-global and engine-internal imports (1.443958ms)
✔ replay-test may still import its own files inside the package (0.384875ms)
✔ replay-test carries no recorded migration imports (0.3005ms)
✔ internal trees reject deep imports globally, including from daemon (0.320458ms)
✔ R9 records zone ceilings and keeps engine files outside the largest component (0.52925ms)
✔ R10 zone overflow lists the whole zone so the joining member is visible (0.559417ms)
✔ R9 rejects a baseline left above the measured cycle (1.063083ms)
✔ readNamedExports collects re-export and direct-declaration forms, resolving aliases (0.86675ms)
✔ readNamedExports never reports the original name behind an as alias (0.110792ms)
✔ readNamedExports resolves export * as ns to its one real bound name (0.061792ms)
✔ readNamedExports rejects a bare export * re-export (0.189166ms)
✔ readNamedExports rejects a default export (0.088959ms)
✔ readNamedExports reports export { default as x } as the named symbol x (0.058125ms)
✔ readNamedExports collects a local export { … } list with no from (0.064542ms)
✔ readNamedExports collects every declarator of a multi-declarator export (0.051041ms)
✔ parseImports distinguishes value, type-only, dynamic, and value re-export edges (1.174375ms)
✔ value cycles fail while type-only and dynamic cycles stay outside the graph (0.727ms)
✔ back-edge identities follow the documented target spine (6.623333ms)
✔ neutral ownership zones reject value imports into higher layers (0.190792ms)
✔ a relative import resolves within its own workspace package src/, but not past it (0.187459ms)
✔ type-only edges are ranked by R6 and ignored by R5, and vice versa (0.14575ms)
✔ ranked and unranked zones are disjoint and both non-empty (0.089917ms)
✔ classifyZone separates the ranked spine from intentionally-unranked zones (0.063667ms)
✔ every production zone is deliberately classified as ranked or unranked (884.345833ms)
✔ listSourceFiles includes root-level src/.ts production files (416.422584ms)
✔ SessionState field names come from the declaration, not a hand-kept list (0.296833ms)
✔ session-state writes are found by field, and non-daemon or undeclared names are not (0.598292ms)
✔ every assignment form is a write, including the ones a regex forgets (0.950041ms)
✔ a computed session write is reported rather than silently unattributed (0.158458ms)
✔ every declared session-state owner is a real file path under src/daemon (0.329125ms)
✔ a session write counts through an aliased binding, not only one named session (0.143125ms)
✔ every SessionState field is classified exactly once (0.356792ms)
✔ classification drift is reported in all three directions (0.177834ms)
✔ largestTypeCycleSize counts type-only cycles and ignores dynamic ones (0.228542ms)
✔ specifier sites carry 1-based lines for static and dynamic imports (1.242834ms)
✔ every workspace package façade names its exports explicitly (no bare export *) (429.203916ms)
✔ every façade re-exports its sources exhaustively (no silent narrowing) (476.536334ms)
✔ double-quoted and re-export routes into packages are not invisible to R11 (0.628041ms)
✔ a package file importing root src is a violation (0.10975ms)
✔ intra-package relative imports hold (0.06675ms)
✔ an exported package self-reference holds while a deep self-import fails (0.124666ms)
✔ a cross-package import needs a workspace:
declaration and an exported subpath (0.100375ms)
✔ a root src file tunnelling into packages//src relatively is a violation (0.109667ms)
✔ a scripts/ file gets no relative route into a package either (0.110125ms)
✔ root workspace specifiers need a root workspace:
entry and an exported subpath (0.089958ms)
✔ the real tree parses, declares, and passes R11 (912.686333ms)
✔ Node resolution enforces the exports map at runtime (6.88ms)
✔ the inventory substrate has six private lazy packages and one exact composition root (2.64575ms)
✔ capture-kit and platform workspace packages are R11-owned unranked zones (0.103417ms)
✔ untracked production TypeScript makes committed-state evidence fail closed (0.984875ms)
✔ family packages are exact, private, and expose only their root facade (1.564125ms)
✔ composition policy does not pin local platform-module identifier spelling (0.587ms)
✔ only src/platform-runtime.ts may import a concrete platform package (2.584ms)
✔ contracts never depend on a concrete platform package in production or tests (3.134541ms)
✔ platform packages cannot escape to root, daemon, siblings, or raw process primitives (4.727458ms)
✔ platform packages may use capture-kit but no unrelated workspace implementation package (2.040958ms)
✔ package-owned tests may import their own public facade (0.553208ms)
✔ platform facades cannot evaluate mechanics eagerly (2.7075ms)
✔ composition policy does not infer host authority from function or class names (0.547916ms)
✔ composition keeps platform implementation loaders behind selected use (17.557292ms)
✔ implementation-loader detection ignores comments, strings, and deferred function bodies (3.918166ms)
✔ composition imports are category-based for future contracts and host adapters (3.5185ms)
✔ Node resolves only each platform package root facade (8.242375ms)
✔ committed-state discovery rejects untracked production and ignores untracked manifests (2260.304042ms)
✔ facade dynamic imports must be nested in deferred functions (0.88475ms)
✔ platform production cannot acquire ambient filesystem, OS, process, or network authority (0.519792ms)
✔ platform facades cannot probe injected host capabilities at module evaluation (0.105958ms)
✔ Apple production must route xcrun availability and execution through appleTools (0.176208ms)
✔ Apple xcrun routing guard ignores comments, strings, and non-xcrun generic commands (0.369708ms)
✔ syntax checks ignore comments and strings and allow deferred imports and host use (0.127625ms)
✔ R16 rejects native mechanics in the daemon record owner without scanning prose (1.151833ms)
✔ R16 rejects child termination and platform branching in daemon record owners (0.301583ms)
✔ R16 requires the real registry normalization path to assert the record use join (0.93275ms)
✔ the layering rules currently in tree carry no unallowed collision (3.3235ms)
✔ a collision nobody allowed fails, whichever order it lands in (0.189625ms)
✔ an allowance expires with the collision it allows (0.071916ms)
✔ reintroducing the transitional collision is rejected once the allowance is gone (0.074791ms)
✔ one rule declaring its id from several call sites is not a collision (0.061708ms)
✔ devices keeps one gateway-owned handler route through an aliased import (1.073375ms)
✔ devices rejects a missing handler module (0.112583ms)
✔ devices rejects a handler that imports but never calls the inventory gateway (0.104917ms)
✔ devices rejects a handler that never imports the inventory gateway (0.079167ms)
✔ devices does not accept a call through a binding that shadows the imported alias (0.105333ms)
✔ session state scan catches planted app-log record construction outside its owner (0.291209ms)
✔ source-executed syntax scan rejects using declarations but ignores prose (2.570041ms)
✔ appstate handler rejects legacy platform imports and calls (3.339792ms)
✔ appstate handler is green after legacy dispatch is removed (0.1695ms)
✔ lifecycle route proofs accept one shared admission per descriptor operation (1.140292ms)
✔ planted red: lifecycle route proof rejects a duplicate admission and legacy local dispatch (3.230292ms)
✔ planted red: lifecycle route proof rejects a handler that calls the raw gateway ports (2.828ms)
✔ planted red: close cutover rejects a legacy dispatch projection (0.28025ms)
✔ planted red: lifecycle route proof rejects a shared admission with two facts inspections (0.165416ms)
✔ lifecycle durable proof rejects a generic capture-kit lifecycle role and an unfenced IME mutation (0.092458ms)
✔ planted red: lifecycle durable proof rejects a gateway that names a platform durable owner (0.038333ms)
✔ planted red: lifecycle durable proof rejects unevidenced Android startup recovery (0.039042ms)
✔ the parametrized gate goes red on a planted row across every generalized column (2.260292ms)
✔ the planted row is green once the command has exactly one execution path (1.567208ms)
✔ rows are independent: one command going red leaves the others alone (0.469584ms)
✔ planted red: an incomplete row fails instead of enforcing nothing (0.114791ms)
✔ planted red: a row that retires nothing is rejected (0.077208ms)
✔ planted red: an empty singular-execution claim is rejected (0.054584ms)
✔ planted red: a named-operation row that enforces no operation is rejected (0.062666ms)
✔ planted red: a named-operation row that enforces only some operations is rejected (0.065ms)
✔ planted red: a row that enforces an operation it does not name is rejected (0.085292ms)
✔ planted red: duplicate operations on either side are rejected (0.097ms)
✔ planted red: every named operation declares its lexical owner (1.527041ms)
✔ unrelated daemon calls neither satisfy nor duplicate an owner-scoped operation (0.427667ms)
✔ a pattern-only row may prove singularity through its route alone (0.498459ms)
✔ planted red: a durable row without a lifecycle proof is rejected (0.050209ms)
✔ planted red: a request-scoped row claiming durable machinery is rejected (0.041ms)
✔ every shipped row states its claims (0.101834ms)
✔ R20 boot rejects the superseded root readiness adapter (5.3065ms)
✔ R20 boot operation singularity is scoped to the session-state handler (2.384042ms)
✔ R32 snapshot rejects legacy admission and dispatcher projection (7.406416ms)
✔ devices rejects an exact legacy inventory module path (1.49375ms)
✔ devices rejects executable legacy imports and identifiers (0.931333ms)
✔ devices rejects dynamic imports and re-exports of legacy inventory modules (1.435709ms)
✔ devices ignores comments, strings, and similarly named non-route modules (1.282833ms)
✔ legacy logs scan catches a planted provider route and plugin facet (1.231959ms)
✔ legacy logs scan ignores retired names in comments and string data (0.75275ms)
✔ legacy logs scan retains type-import and computed executable route coverage (2.679625ms)
✔ legacy logs scan catches planted capability and dual-admission routes (3.846ms)
✔ legacy logs scan follows declaration roles after files move (0.955458ms)
✔ R14 violations retain their exact source line (0.194208ms)
✔ logs narrowing scan catches planted assertions, non-null repair, and bracket access (0.755583ms)
✔ logs keeps the broader non-null scan over every daemon runtime operation (1.285083ms)
✔ network cutover scan catches planted legacy execution and dual admission (1.025125ms)
✔ network cutover scan rejects a retired implementation by committed path (0.485041ms)
✔ network cutover scan ignores retired names in comments and string data (0.373917ms)
✔ network narrowing scan catches planted casts, non-null repair, and bracket access (0.517666ms)
✔ network route scan rejects planted neither and duplicate routes (1.859875ms)
✔ R16 catches a planted legacy recording backend, admission, and plugin facet (3.89425ms)
✔ R16 excludes trace-only mechanics from the record cutover scan (1.832916ms)
✔ R16 rejects the retired recording-provider scope while allowing the focused transport (4.177125ms)
✔ R16 rejects proof repair for a narrowed screen-recording operation (0.623542ms)
✔ the four application-lifecycle descriptors each carry an independent durable cutover row (0.100375ms)
✔ the cutover table rejects a duplicate rule id (0.146166ms)
✔ every daemon-routed migrated descriptor has exactly one cutover row (0.683916ms)
✔ every import form that reaches the engine is refused (1.336333ms)
✔ the owner holds the engine, and the root façade stays open to everyone (0.388542ms)
✔ a missing engine door fails the gate instead of silencing it (0.110875ms)
✔ the refusal names the owner and the entries that replace the bypass (0.064084ms)
✔ R2 commands-floor closes the four zones below the command surface, whatever the kind (0.78625ms)
✔ R3 platforms-seam closes static value imports and opens the three declared seam owners (0.14675ms)
✔ every policy carries a hint, and the lead names the kind it rejected (0.118916ms)
✔ a policy states its scope with exactly one of to or exceptTo (0.063834ms)
ℹ tests 177
ℹ suites 0
ℹ pass 177
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 2816.155791
Layering guard: OK — 1334 source files satisfy R2-R3 and contain no value-import cycles (both checked globally); the ranked target spine contains no back-edges (only the composition root is unranked among src zones), and its type-only inversions match the R6 ratchet (7 remaining); all 33 SessionState fields are classified and every write is inside its declared owner (R7); the largest type-level cycle is 26 files (R9); R10 pins R7 at 21 writer-owned fields / 25 owner claims, R9 at 26 files with zone ceilings, 2 external daemon/types.ts importers, and zero forbidden logical-module imports beyond 0 recorded migration import(s); R11 holds 17 workspace package(s) behind 40 exported subpath(s) with zero root back-imports; R13 holds six private implementation-lazy platform packages above capture-kit behind one composition root; each migrated command (appstate, boot, apps, shutdown, install, reinstall, install_source, push, devices, logs, network, record, open, prepare, close, runtime, snapshot, diff, viewport, screenshot) keeps exactly one platform-execution path; and bin.ts imports normalizeCliCommandAlias, actually passes it into buildCommandUsageText, and holds no local alias literals (R12).

[run] fallow: pnpm run check:fallow --base origin/main
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
■ Metrics: dead code 0 · complexity 1 (warn, max cyclomatic: 10) · duplication 0
■ Metrics: 8,475 LOC · dead files 0.0% · dead exports 0.0% · avg cyclomatic 2.1 · p90 cyclomatic 5 · maintainability 87.7 (good)

Parameters: 95% low · 4% medium · 1% high · 0% very high (0-2 / 3-4 / 5-6 / >=7 params)

● High complexity functions (1 shown, 2 total)
CRAP scores are estimated from export references; run fallow health --coverage <coverage-final.json> for exact scores.
src/daemon/handlers/tests/interaction.test.ts
:746
10 cyclomatic 3 cognitive 45 lines
31.6 CRAP
Functions exceeding cyclomatic, cognitive, or CRAP thresholds (https://docs.fallow.tools/explanations/health#complexity-metrics)
use --top 2 to see all

[run] build: pnpm run build
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
ℹ tsdown v0.22.4 powered by rolldown v1.1.4
ℹ config file: /Users/thymikee/Developer/agent-device/.claude/worktrees/issue-1806-fix-verify-713262/tsdown.config.ts
ℹ entry: src/sdk/index.ts, src/sdk/io.ts, src/sdk/artifacts.ts, src/sdk/batch.ts, src/sdk/metro.ts, src/sdk/remote-config.ts, src/sdk/install-source.ts, src/sdk/android-adb.ts, src/sdk/limrun.ts, src/sdk/contracts.ts, src/sdk/selectors.ts, src/sdk/finders.ts, src/ai-sdk/index.ts, src/bin.ts, src/client/companion-tunnel.ts, src/daemon.ts, src/utils/png-worker.ts, src/utils/update-check-entry.ts
ℹ target: es2022
ℹ tsconfig: tsconfig.lib.json
ℹ Build start
ℹ Cleaning 245 files
ℹ dist/src/internal/daemon.js 229.27 kB │ gzip: 67.97 kB
ℹ dist/src/internal/companion-tunnel.js 8.38 kB │ gzip: 3.22 kB
ℹ dist/src/internal/bin.js 1.74 kB │ gzip: 0.74 kB
ℹ dist/src/android-adb.js 1.67 kB │ gzip: 0.74 kB
ℹ dist/src/ai-sdk.js 1.38 kB │ gzip: 0.77 kB
ℹ dist/src/internal/png-worker.js 1.09 kB │ gzip: 0.55 kB
ℹ dist/src/limrun.js 0.93 kB │ gzip: 0.35 kB
ℹ dist/src/selectors.js 0.33 kB │ gzip: 0.20 kB
ℹ dist/src/index.js 0.29 kB │ gzip: 0.18 kB
ℹ dist/src/metro.js 0.25 kB │ gzip: 0.17 kB
ℹ dist/src/install-source.js 0.15 kB │ gzip: 0.14 kB
ℹ dist/src/finders.js 0.13 kB │ gzip: 0.12 kB
ℹ dist/src/internal/update-check-entry.js 0.13 kB │ gzip: 0.13 kB
ℹ dist/src/contracts.js 0.12 kB │ gzip: 0.12 kB
ℹ dist/src/artifacts.js 0.08 kB │ gzip: 0.10 kB
ℹ dist/src/remote-config.js 0.08 kB │ gzip: 0.09 kB
ℹ dist/src/io.js 0.07 kB │ gzip: 0.09 kB
ℹ dist/src/batch.js 0.06 kB │ gzip: 0.08 kB
ℹ dist/src/session2.js 215.78 kB │ gzip: 62.32 kB
ℹ dist/src/registry.js 151.55 kB │ gzip: 45.66 kB
ℹ dist/src/script-source-bundle.js 105.60 kB │ gzip: 33.62 kB
ℹ dist/src/cli-help.js 88.56 kB │ gzip: 30.13 kB
ℹ dist/src/sdk-batch-runner.js 88.34 kB │ gzip: 22.73 kB
ℹ dist/src/runtime.js 68.20 kB │ gzip: 21.43 kB
ℹ dist/src/agent-device-client.js 59.76 kB │ gzip: 18.72 kB
ℹ dist/src/src4.js 59.46 kB │ gzip: 17.42 kB
ℹ dist/src/snapshot.js 52.89 kB │ gzip: 15.93 kB
ℹ dist/src/http-health.js 51.22 kB │ gzip: 16.34 kB
ℹ dist/src/src2.js 48.71 kB │ gzip: 14.61 kB
ℹ dist/src/runner-disposal.js 42.01 kB │ gzip: 13.54 kB
ℹ dist/src/runtime2.js 38.54 kB │ gzip: 11.31 kB
ℹ dist/src/runtime4.js 38.53 kB │ gzip: 10.64 kB
ℹ dist/src/runner-client.js 36.22 kB │ gzip: 10.97 kB
ℹ dist/src/png-worker-contract.js 30.34 kB │ gzip: 9.35 kB
ℹ dist/src/interaction2.js 29.32 kB │ gzip: 9.09 kB
ℹ dist/src/dispatch.js 27.96 kB │ gzip: 9.17 kB
ℹ dist/src/cli.js 27.41 kB │ gzip: 9.07 kB
ℹ dist/src/selector-runtime.js 24.66 kB │ gzip: 7.92 kB
ℹ dist/src/connection.js 23.02 kB │ gzip: 7.34 kB
ℹ dist/src/apps.js 22.75 kB │ gzip: 7.50 kB
ℹ dist/src/perf.js 22.36 kB │ gzip: 7.28 kB
ℹ dist/src/physical-device-control.js 22.32 kB │ gzip: 7.19 kB
ℹ dist/src/sdk-android-adb.js 21.71 kB │ gzip: 7.65 kB
ℹ dist/src/interaction.js 21.47 kB │ gzip: 6.86 kB
ℹ dist/src/src3.js 21.12 kB │ gzip: 6.67 kB
ℹ dist/src/client-metro.js 20.21 kB │ gzip: 6.81 kB
ℹ dist/src/src.js 20.09 kB │ gzip: 6.65 kB
ℹ dist/src/connection-runtime.js 19.39 kB │ gzip: 6.30 kB
ℹ dist/src/command-tools.js 19.12 kB │ gzip: 6.89 kB
ℹ dist/src/reporting.js 18.16 kB │ gzip: 6.30 kB
ℹ dist/src/platform-runtime-operation-host.js 17.30 kB │ gzip: 5.18 kB
ℹ dist/src/input-actions.js 17.10 kB │ gzip: 6.07 kB
ℹ dist/src/provider.js 15.40 kB │ gzip: 5.83 kB
ℹ dist/src/debug-symbols.js 14.25 kB │ gzip: 5.35 kB
ℹ dist/src/runtime6.js 14.04 kB │ gzip: 4.69 kB
ℹ dist/src/app-lifecycle.js 13.19 kB │ gzip: 4.80 kB
ℹ dist/src/app-log-runtime.js 12.83 kB │ gzip: 4.15 kB
ℹ dist/src/snapshot-runtime.js 11.95 kB │ gzip: 4.03 kB
ℹ dist/src/android.js 11.65 kB │ gzip: 4.42 kB
ℹ dist/src/platform-runtime.js 11.19 kB │ gzip: 3.48 kB
ℹ dist/src/location-coordinates.js 11.03 kB │ gzip: 3.75 kB
ℹ dist/src/install-source2.js 10.89 kB │ gzip: 4.10 kB
ℹ dist/src/sdk-contracts.js 10.23 kB │ gzip: 4.28 kB
ℹ dist/src/replay.js 9.16 kB │ gzip: 3.14 kB
ℹ dist/src/interactor.js 9.01 kB │ gzip: 3.16 kB
ℹ dist/src/auth-session.js 8.50 kB │ gzip: 2.94 kB
ℹ dist/src/video.js 8.20 kB │ gzip: 3.37 kB
ℹ dist/src/byte-limit-stream.js 8.14 kB │ gzip: 2.93 kB
ℹ dist/src/server.js 7.88 kB │ gzip: 3.37 kB
ℹ dist/src/proxy.js 7.80 kB │ gzip: 3.13 kB
ℹ dist/src/ime-lifecycle.js 7.43 kB │ gzip: 2.48 kB
ℹ dist/src/interactors.js 7.22 kB │ gzip: 2.35 kB
ℹ dist/src/runner-lease.js 7.21 kB │ gzip: 2.82 kB
ℹ dist/src/command-schema.js 7.08 kB │ gzip: 2.77 kB
ℹ dist/src/agent-browser-tool.js 7.07 kB │ gzip: 2.84 kB
ℹ dist/src/record-runtime.js 7.03 kB │ gzip: 2.50 kB
ℹ dist/src/inventory.js 7.01 kB │ gzip: 2.86 kB
ℹ dist/src/runtime9.js 6.85 kB │ gzip: 2.46 kB
ℹ dist/src/snapshot2.js 6.79 kB │ gzip: 2.43 kB
ℹ dist/src/find.js 6.43 kB │ gzip: 2.70 kB
ℹ dist/src/platform-runtime2.js 6.38 kB │ gzip: 1.91 kB
ℹ dist/src/boot-diagnostics.js 6.27 kB │ gzip: 2.37 kB
ℹ dist/src/platform-runtime-app-log-process.js 5.82 kB │ gzip: 2.30 kB
ℹ dist/src/app-resolution.js 5.67 kB │ gzip: 2.27 kB
ℹ dist/src/sdk-device.js 5.67 kB │ gzip: 2.10 kB
ℹ dist/src/cli-config.js 5.22 kB │ gzip: 2.35 kB
ℹ dist/src/platform-runtime-runtime-hints.js 5.10 kB │ gzip: 2.15 kB
ℹ dist/src/helper-package-install.js 4.96 kB │ gzip: 1.98 kB
ℹ dist/src/snapshot3.js 4.95 kB │ gzip: 2.23 kB
ℹ dist/src/platform-runtime-screen-recording-apple-simulator-host.js 4.92 kB │ gzip: 1.95 kB
ℹ dist/src/inventory2.js 4.85 kB │ gzip: 1.98 kB
ℹ dist/src/parser.js 4.69 kB │ gzip: 1.69 kB
ℹ dist/src/verified-file.js 4.57 kB │ gzip: 2.05 kB
ℹ dist/src/input-actions2.js 4.47 kB │ gzip: 1.92 kB
ℹ dist/src/helper.js 4.46 kB │ gzip: 1.95 kB
ℹ dist/src/tool-provider.js 4.20 kB │ gzip: 1.70 kB
ℹ dist/src/mobile-snapshot-semantics.js 4.13 kB │ gzip: 1.66 kB
ℹ dist/src/png-resize.js 4.12 kB │ gzip: 1.84 kB
ℹ dist/src/device-input-state.js 4.02 kB │ gzip: 1.67 kB
ℹ dist/src/input-actions3.js 3.96 kB │ gzip: 1.37 kB
ℹ dist/src/daemon.js 3.80 kB │ gzip: 1.52 kB
ℹ dist/src/platform-runtime-screen-recording-android-host.js 3.76 kB │ gzip: 1.50 kB
ℹ dist/src/device-claim-inspection.js 3.76 kB │ gzip: 1.54 kB
ℹ dist/src/lease.js 3.70 kB │ gzip: 1.54 kB
ℹ dist/src/install-artifact2.js 3.43 kB │ gzip: 1.42 kB
ℹ dist/src/tool-provider2.js 3.39 kB │ gzip: 1.25 kB
ℹ dist/src/react-native.js 3.38 kB │ gzip: 1.35 kB
ℹ dist/src/interaction-runtime.js 3.32 kB │ gzip: 1.24 kB
ℹ dist/src/platform-runtime-screen-recording-finalizer-host.js 3.28 kB │ gzip: 1.41 kB
ℹ dist/src/session-target-evidence.js 3.19 kB │ gzip: 1.28 kB
ℹ dist/src/simulator.js 3.13 kB │ gzip: 1.41 kB
ℹ dist/src/platform-runtime-open-target.js 3.08 kB │ gzip: 1.29 kB
ℹ dist/src/runtime7.js 2.87 kB │ gzip: 1.15 kB
ℹ dist/src/app-lifecycle2.js 2.80 kB │ gzip: 1.30 kB
ℹ dist/src/manifest.js 2.68 kB │ gzip: 1.22 kB
ℹ dist/src/update-check.js 2.63 kB │ gzip: 1.25 kB
ℹ dist/src/sdk-remote-config.js 2.63 kB │ gzip: 0.85 kB
ℹ dist/src/host-process.js 2.52 kB │ gzip: 1.05 kB
ℹ dist/src/runner-sequence.js 2.49 kB │ gzip: 1.09 kB
ℹ dist/src/app-log-reconnect.js 2.40 kB │ gzip: 1.00 kB
ℹ dist/src/platform-runtime-screen-recording-apple-runner-transport.js 2.40 kB │ gzip: 0.99 kB
ℹ dist/src/harmonyos.js 2.35 kB │ gzip: 1.09 kB
ℹ dist/src/platform-runtime-host.js 2.28 kB │ gzip: 0.99 kB
ℹ dist/src/platform-runtime-screen-recording-apple-runner-host.js 2.27 kB │ gzip: 0.88 kB
ℹ dist/src/screenshot.js 2.27 kB │ gzip: 1.08 kB
ℹ dist/src/limrun-runtime-dependencies.js 2.21 kB │ gzip: 0.94 kB
ℹ dist/src/runtime8.js 2.09 kB │ gzip: 0.99 kB
ℹ dist/src/interaction-common.js 2.05 kB │ gzip: 0.97 kB
ℹ dist/src/device2.js 2.04 kB │ gzip: 0.90 kB
ℹ dist/src/interactor2.js 2.00 kB │ gzip: 0.84 kB
ℹ dist/src/platform-runtime-screen-recording-apple-host.js 1.95 kB │ gzip: 0.52 kB
ℹ dist/src/device.js 1.94 kB │ gzip: 0.84 kB
ℹ dist/src/ime-recovery-marker.js 1.92 kB │ gzip: 0.91 kB
ℹ dist/src/linux.js 1.82 kB │ gzip: 0.79 kB
ℹ dist/src/record-trace.js 1.80 kB │ gzip: 0.82 kB
ℹ dist/src/inventory3.js 1.71 kB │ gzip: 0.91 kB
ℹ dist/src/snapshot-session.js 1.67 kB │ gzip: 0.78 kB
ℹ dist/src/remote-config2.js 1.65 kB │ gzip: 0.77 kB
ℹ dist/src/daemon-shutdown-report.js 1.63 kB │ gzip: 0.66 kB
ℹ dist/src/app-helpers.js 1.59 kB │ gzip: 0.78 kB
ℹ dist/src/sdk-io.js 1.48 kB │ gzip: 0.77 kB
ℹ dist/src/process-lock.js 1.44 kB │ gzip: 0.76 kB
ℹ dist/src/inventory5.js 1.40 kB │ gzip: 0.83 kB
ℹ dist/src/tool-provider3.js 1.34 kB │ gzip: 0.62 kB
ℹ dist/src/auth.js 1.28 kB │ gzip: 0.59 kB
ℹ dist/src/platform-runtime-app-log-android-transport.js 1.18 kB │ gzip: 0.66 kB
ℹ dist/src/platform-runtime-screen-recording-harmony-host.js 1.17 kB │ gzip: 0.53 kB
ℹ dist/src/url.js 1.14 kB │ gzip: 0.52 kB
ℹ dist/src/lease-context.js 1.13 kB │ gzip: 0.46 kB
ℹ dist/src/screenshot-density.js 1.13 kB │ gzip: 0.64 kB
ℹ dist/src/verdict.js 1.12 kB │ gzip: 0.50 kB
ℹ dist/src/sdk.js 1.10 kB │ gzip: 0.60 kB
ℹ dist/src/web.js 0.99 kB │ gzip: 0.51 kB
ℹ dist/src/runtime5.js 0.99 kB │ gzip: 0.51 kB
ℹ dist/src/generic.js 0.93 kB │ gzip: 0.51 kB
ℹ dist/src/generic-settle.js 0.89 kB │ gzip: 0.45 kB
ℹ dist/src/hdc.js 0.88 kB │ gzip: 0.54 kB
ℹ dist/src/app-state.js 0.87 kB │ gzip: 0.48 kB
ℹ dist/src/device-ready.js 0.86 kB │ gzip: 0.47 kB
ℹ dist/src/config.js 0.79 kB │ gzip: 0.46 kB
ℹ dist/src/app-log-files.js 0.79 kB │ gzip: 0.51 kB
ℹ dist/src/install-artifact.js 0.79 kB │ gzip: 0.44 kB
ℹ dist/src/observability.js 0.78 kB │ gzip: 0.40 kB
ℹ dist/src/platform-runtime-screen-recording-apple-transport.js 0.75 kB │ gzip: 0.46 kB
ℹ dist/src/simctl.js 0.74 kB │ gzip: 0.42 kB
ℹ dist/src/runtime3.js 0.70 kB │ gzip: 0.42 kB
ℹ dist/src/recording-telemetry.js 0.69 kB │ gzip: 0.42 kB
ℹ dist/src/unsupported-interactor.js 0.69 kB │ gzip: 0.36 kB
ℹ dist/src/runtime-transport.js 0.68 kB │ gzip: 0.42 kB
ℹ dist/src/plist.js 0.66 kB │ gzip: 0.39 kB
ℹ dist/src/owner-identity.js 0.65 kB │ gzip: 0.36 kB
ℹ dist/src/entities.js 0.60 kB │ gzip: 0.35 kB
ℹ dist/src/audio-probe.js 0.60 kB │ gzip: 0.37 kB
ℹ dist/src/snapshot-scope.js 0.52 kB │ gzip: 0.34 kB
ℹ dist/src/platform-runtime-network-web-transport.js 0.49 kB │ gzip: 0.31 kB
ℹ dist/src/interaction-snapshot.js 0.47 kB │ gzip: 0.31 kB
ℹ dist/src/project-runtime.js 0.46 kB │ gzip: 0.28 kB
ℹ dist/src/output-path.js 0.44 kB │ gzip: 0.28 kB
ℹ dist/src/version.js 0.43 kB │ gzip: 0.28 kB
ℹ dist/src/logcat.js 0.43 kB │ gzip: 0.31 kB
ℹ dist/src/simulator-state.js 0.39 kB │ gzip: 0.29 kB
ℹ dist/src/backend-snapshot-options.js 0.39 kB │ gzip: 0.24 kB
ℹ dist/src/command-catalog.js 0.37 kB │ gzip: 0.24 kB
ℹ dist/src/command-metadata.js 0.37 kB │ gzip: 0.25 kB
ℹ dist/src/recording-export-quality.js 0.36 kB │ gzip: 0.24 kB
ℹ dist/src/platform-runtime-screen-recording-web-host.js 0.36 kB │ gzip: 0.23 kB
ℹ dist/src/setting-state.js 0.35 kB │ gzip: 0.26 kB
ℹ dist/src/keyed-lock.js 0.34 kB │ gzip: 0.26 kB
ℹ dist/src/cli-runner.js 0.33 kB │ gzip: 0.21 kB
ℹ dist/src/rolldown-runtime.js 0.31 kB │ gzip: 0.24 kB
ℹ dist/src/path-resolution.js 0.30 kB │ gzip: 0.23 kB
ℹ dist/src/process-exit.js 0.30 kB │ gzip: 0.21 kB
ℹ dist/src/string-enum.js 0.27 kB │ gzip: 0.23 kB
ℹ dist/src/appearance.js 0.26 kB │ gzip: 0.21 kB
ℹ dist/src/command-surface.js 0.25 kB │ gzip: 0.19 kB
ℹ dist/src/provider-webdriver.js 0.25 kB │ gzip: 0.20 kB
ℹ dist/src/session.js 0.24 kB │ gzip: 0.20 kB
ℹ dist/src/bounds.js 0.23 kB │ gzip: 0.17 kB
ℹ dist/src/scoped-provider.js 0.23 kB │ gzip: 0.18 kB
ℹ dist/src/platform-runtime-screen-recording-output-host.js 0.21 kB │ gzip: 0.18 kB
ℹ dist/src/inventory4.js 0.21 kB │ gzip: 0.18 kB
ℹ dist/src/plist-xml.js 0.20 kB │ gzip: 0.16 kB
ℹ dist/src/shared.js 0.20 kB │ gzip: 0.18 kB
ℹ dist/src/process-entry.js 0.19 kB │ gzip: 0.16 kB
ℹ dist/src/handler-utils.js 0.18 kB │ gzip: 0.15 kB
ℹ dist/src/timing-safe-equal.js 0.17 kB │ gzip: 0.14 kB
ℹ dist/src/cli-grammar.js 0.16 kB │ gzip: 0.15 kB
ℹ dist/src/method-scope.js 0.16 kB │ gzip: 0.14 kB
ℹ dist/src/metro2.js 0.15 kB │ gzip: 0.13 kB
ℹ dist/src/shell-quote.js 0.14 kB │ gzip: 0.14 kB
ℹ dist/src/cli-output.js 0.13 kB │ gzip: 0.13 kB
ℹ dist/src/sdk-finders.js 0.13 kB │ gzip: 0.13 kB
ℹ dist/src/sdk-selectors.js 0.11 kB │ gzip: 0.12 kB
ℹ dist/src/inventory6.js 0.11 kB │ gzip: 0.12 kB
ℹ dist/src/timeouts.js 0.07 kB │ gzip: 0.09 kB
ℹ dist/src/limrun.d.ts 10.22 kB │ gzip: 2.61 kB
ℹ dist/src/metro.d.ts 4.42 kB │ gzip: 1.23 kB
ℹ dist/src/ai-sdk.d.ts 2.88 kB │ gzip: 1.34 kB
ℹ dist/src/android-adb.d.ts 2.40 kB │ gzip: 0.73 kB
ℹ dist/src/internal/png-worker.d.ts 1.39 kB │ gzip: 0.55 kB
ℹ dist/src/index.d.ts 0.65 kB │ gzip: 0.29 kB
ℹ dist/src/io.d.ts 0.63 kB │ gzip: 0.25 kB
ℹ dist/src/install-source.d.ts 0.62 kB │ gzip: 0.36 kB
ℹ dist/src/contracts.d.ts 0.56 kB │ gzip: 0.26 kB
ℹ dist/src/selectors.d.ts 0.50 kB │ gzip: 0.21 kB
ℹ dist/src/remote-config.d.ts 0.37 kB │ gzip: 0.18 kB
ℹ dist/src/artifacts.d.ts 0.23 kB │ gzip: 0.17 kB
ℹ dist/src/finders.d.ts 0.18 kB │ gzip: 0.13 kB
ℹ dist/src/batch.d.ts 0.07 kB │ gzip: 0.08 kB
ℹ dist/src/internal/bin.d.ts 0.01 kB │ gzip: 0.03 kB
ℹ dist/src/internal/companion-tunnel.d.ts 0.01 kB │ gzip: 0.03 kB
ℹ dist/src/internal/daemon.d.ts 0.01 kB │ gzip: 0.03 kB
ℹ dist/src/internal/update-check-entry.d.ts 0.01 kB │ gzip: 0.03 kB
ℹ dist/src/client-types.d.ts 55.65 kB │ gzip: 13.94 kB
ℹ dist/src/sdk-selectors.d.ts 23.32 kB │ gzip: 7.20 kB
ℹ dist/src/sdk-contracts.d.ts 15.75 kB │ gzip: 5.59 kB
ℹ dist/src/sdk-android-adb.d.ts 9.41 kB │ gzip: 2.78 kB
ℹ dist/src/sdk-remote-config.d.ts 6.72 kB │ gzip: 2.31 kB
ℹ dist/src/sdk-io.d.ts 2.30 kB │ gzip: 0.68 kB
ℹ dist/src/cloud-artifacts.d.ts 2.10 kB │ gzip: 0.75 kB
ℹ dist/src/sdk-batch-runner.d.ts 1.66 kB │ gzip: 0.73 kB
ℹ dist/src/device-input-state.d.ts 1.36 kB │ gzip: 0.49 kB
ℹ dist/src/sdk-finders.d.ts 1.11 kB │ gzip: 0.50 kB
ℹ dist/src/app-inventory.d.ts 0.14 kB │ gzip: 0.13 kB
ℹ 244 files, total: 2.47 MB
✔ Build complete in 2312ms

[dedupe] vitest-related — covered by affected LCOV or GitHub CI

[run] coverage: pnpm exec vitest related --run --passWithNoTests --maxWorkers=2 --coverage --coverage.reporter=lcov --coverage.thresholds.statements=0 --coverage.thresholds.lines=0 CHANGELOG.md CONTEXT.md android/snapshot-helper/src/main/java/com/callstack/agentdevice/snapshothelper/AccessibilityTreeCapture.java android/snapshot-helper/src/main/java/com/callstack/agentdevice/snapshothelper/AccessibilityTreeXml.java src/tests/test-file-size-ratchet.test.ts src/daemon/tests/android-system-dialog-occlusion.test.ts src/daemon/tests/generic-settle.test.ts src/daemon/tests/snapshot-state.test.ts src/daemon/android-snapshot-freshness.ts src/daemon/android-system-dialog.ts src/daemon/handlers/tests/interaction-ios-tap-outcome-fixtures.ts src/daemon/handlers/tests/interaction-settle.test.ts src/daemon/handlers/tests/interaction-touch-fixtures.ts src/daemon/handlers/tests/interaction.test.ts src/daemon/handlers/tests/snapshot-capture.test.ts src/daemon/handlers/snapshot-capture.ts src/daemon/screenshot-runtime.ts src/daemon/snapshot-presentation/ios/publication-membership.test.ts src/daemon/snapshot-presentation/ios/transitions.test.ts src/daemon/snapshot-state.ts src/platforms/android/tests/snapshot.test.ts src/platforms/android/tests/ui-hierarchy-scope.test.ts src/platforms/android/tests/ui-hierarchy.test.ts src/platforms/android/snapshot-helper-capture.ts src/platforms/android/ui-hierarchy-node.ts src/platforms/android/ui-hierarchy-visibility.ts src/platforms/android/ui-hierarchy.ts website/docs/docs/commands.md
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0

RUN v4.1.8 /Users/thymikee/Developer/agent-device/.claude/worktrees/issue-1806-fix-verify-713262
Coverage enabled with v8

✓ |interaction-contract| test/integration/interaction-contract/interaction-response-shape.contract.test.ts (10 tests) 12071ms
✓ interaction response shape: press @ref uses the canonical ref envelope 1947ms
✓ interaction response shape: fill @ref uses the canonical ref envelope 1139ms
✓ interaction response shape: longpress @ref uses the canonical ref envelope 1148ms
✓ interaction response shape: press selector uses the canonical selector envelope 918ms
✓ interaction response shape: fill selector uses the canonical selector envelope 1197ms
✓ interaction response shape: longpress selector uses the canonical selector envelope 1095ms
✓ interaction response shape: press point uses the canonical point envelope 1231ms
✓ interaction response shape: fill point uses the canonical point envelope 1191ms
✓ interaction response shape: type tolerates a zero-sized runner reference frame 1079ms
✓ interaction response shape: longpress point uses the canonical point envelope 1124ms
✓ |interaction-contract| test/integration/interaction-contract/direct-ios-selector.contract.test.ts (11 tests) 12197ms
✓ direct-ios-selector responseConstruction: runner payload response carries the canonical selector field set 1883ms
✓ direct-ios-selector resolutionDisclosure: the XCTest fast path discloses the explicit not-observed shape 891ms
✓ direct-ios-selector disambiguation: multiple raw runner matches delegate to runtime structural-equivalence collapse 1007ms
✓ default simple-selector fill resolves through the runtime before typing 1142ms
✓ recorded simple iOS selector click and fill use runtime resolution and persist target-v1 evidence 762ms
✓ direct-ios-selector offscreen: runner ELEMENT_OFFSCREEN falls back to the runtime refusal 990ms
✓ direct-ios-selector verifyEvidence: --verify disables the direct path and returns runtime evidence 984ms
✓ direct-ios-selector settleObservation: --settle disables the direct path and returns the runtime settled diff 1395ms
✓ direct-ios-selector errorTaxonomy: runner ELEMENT_NOT_FOUND falls back to runtime no-match diagnostics and hint 1028ms
✓ direct-ios-selector occlusion: runner ELEMENT_NOT_FOUND on a covered target falls back to the runtime covered refusal 1166ms
✓ direct-ios-selector nonHittable: runner ELEMENT_NOT_FOUND on a non-hittable target falls back to an annotated coordinate tap 947ms
✓ |interaction-contract| test/integration/interaction-contract/coordinate.contract.test.ts (6 tests) 4006ms
✓ coordinate errorTaxonomy: backend failure surfaces as a normalized daemon error 1612ms
✓ coordinate responseConstruction: daemon press x y response carries the canonical point field set 1244ms
✓ coordinate resolutionDisclosure: inapplicable — no resolution field is attached 1117ms
✓ |interaction-contract| test/integration/interaction-contract/maestro-fallback.contract.test.ts (5 tests) 5431ms
✓ maestro-non-hittable-fallback responseConstruction: fallback tap response carries the canonical field set and fallback markers 1256ms
✓ maestro-non-hittable-fallback resolutionDisclosure: allowed-but-not-taken discloses direct-ios not-observed 1042ms
✓ runtime fill the coordinate fallback did not execute keeps its resolution disclosure 1109ms
✓ Maestro fill of a non-hittable input resolves through the runtime path 1175ms
✓ maestro-non-hittable-fallback offscreen: runner rejects an element without a tappable frame 847ms
✓ |interaction-contract| test/integration/interaction-contract/runtime-ref.contract.test.ts (11 tests) 1291ms
✓ runtime-ref responseConstruction: daemon press @ref response carries the canonical ref field set 1252ms
✓ |interaction-contract| test/integration/interaction-contract/target-drag.contract.test.ts (6 tests) 2448ms
✓ target-drag responseConstruction: daemon response carries the canonical dual-target gesture shape 2435ms
✓ |interaction-contract| test/integration/interaction-contract/runtime-selector.contract.test.ts (14 tests) 1871ms
✓ runtime-selector responseConstruction: daemon press response carries the canonical selector field set 1827ms
✓ |interaction-contract| test/integration/interaction-contract/native-ref.contract.test.ts (8 tests) 37ms
✓ |provider-integration| test/integration/provider-scenarios/android-lifecycle.test.ts (12 tests) 11036ms
✓ Provider-backed integration Android Settings flow uses scripted ADB provider 8595ms
✓ Provider-backed integration Android text provider handles Unicode without shell input text 626ms
✓ |provider-integration| test/integration/provider-scenarios/android-test-suite.test.ts (7 tests) 15372ms
✓ Provider-backed integration Android replay test suite covers retries and fail-fast flags 1707ms
✓ Provider-backed integration Android Maestro refreshes action geometry and preserves authored swipe points 1438ms
✓ Provider-backed integration Android Maestro replay test suite discovers YAML flows in directories 1187ms
✓ Provider-backed integration Android Maestro types after tapOn inputText without trailing Enter 1177ms
✓ Provider-backed integration Android Maestro preserves authored inputText then pressKey Enter 1216ms
✓ Provider-backed integration Android Maestro executes runFlow conditions and retry batches at runtime 820ms
✓ Provider-backed integration Android Maestro optional tap misses without touching the device 7825ms
✓ |provider-integration| test/integration/provider-scenarios/apple-platform-output-guard.test.ts (3 tests) 6479ms
✓ macOS Apple session never emits the internal apple platform on the wire 973ms
✓ iOS-simulator Apple session never emits the internal apple platform on the wire 5503ms
✓ |provider-integration| test/integration/provider-scenarios/active-session-script-publication.test.ts (7 tests) 7886ms
✓ provider route publishes and replays an open-to-destination script with a live handoff 806ms
✓ replaying a published script against a reshuffled screen fails closed instead of false-passing the guard 1963ms
✓ a second successful open aborts publication and terminal save flags fail before close 655ms
✓ an unarmed session refuses close --save-script and closes cleanly on plain close 640ms
✓ an armed session still publishes target-v1 evidence through close --save-script 661ms
✓ parameterized fill publishes only ${VAR} and replay resolves it immediately before fill 2888ms
✓ |provider-integration| test/integration/provider-scenarios/interaction-direct-selector-fallback.test.ts (6 tests) 6318ms
✓ Provider-backed direct iOS selector wait strips selectorChain from the public response 1037ms
✓ Provider-backed integration runner AMBIGUOUS_MATCH falls back to runtime rejection 1169ms
✓ Provider-backed integration runner ELEMENT_NOT_FOUND on a covered element surfaces the occlusion refusal 1249ms
✓ Provider-backed integration runner ELEMENT_NOT_FOUND on a non-hittable element annotates targetHittable 985ms
✓ Provider-backed integration maestro replay dispatch keeps runner AMBIGUOUS_MATCH without fallback 701ms
✓ Provider-backed integration maestro replay dispatch keeps runner ELEMENT_OFFSCREEN without fallback 1176ms
✓ |provider-integration| test/integration/provider-scenarios/doctor.test.ts (9 tests) 6689ms
✓ Provider-backed integration doctor infers Android RN/Metro readiness through daemon route without resolving a default device 791ms
✓ Provider-backed integration doctor runs predictably for supported platform selectors 2187ms
✓ Provider-backed integration doctor --app asks for a selector when multiple devices are booted 594ms
✓ Provider-backed integration doctor probes Metro when runtime metadata exists outside an RN project 2771ms
✓ |provider-integration| test/integration/provider-scenarios/ios-lifecycle.test.ts (3 tests) 6514ms
✓ Provider-backed integration iOS Settings flow uses scripted simctl and runner providers 4250ms
✓ Provider-backed integration iOS regular snapshot preserves fixed bottom tabs after scroll content 1291ms
✓ Provider-backed integration iOS physical reinstall uses scripted devicectl provider 972ms
✓ |provider-integration| test/integration/provider-scenarios/settle-observation.test.ts (4 tests) 3890ms
✓ Provider-backed integration press --settle returns the settled diff and fresh refs 1209ms
✓ Provider-backed integration never-settled press --settle does not issue diff refs 1019ms
✓ Provider-backed integration modal-dismiss press --settle attaches the unchanged interactive tail 795ms
✓ Provider-backed integration fill --settle summoning the keyboard still attaches the unchanged interactive tail 866ms
✓ |provider-integration| test/integration/provider-scenarios/cloud-webdriver-ios-text-entry.test.ts (4 tests) 4280ms
✓ cloud iOS fill refuses, without typing, when nothing takes focus 2004ms
✓ cloud iOS fill sends no keys when a keyboard-up tap misses the second field 2004ms
✓ |provider-integration| test/integration/provider-scenarios/macos-recording.test.ts (3 tests) 3241ms
✓ Provider-backed integration macOS recording uses focused exact runner authority 966ms
✓ Provider-backed integration macOS recording rejects an invalid MP4 before artifact publication 2163ms
✓ |provider-integration| test/integration/provider-scenarios/record-trace-android-copy.test.ts (1 test) 2788ms
✓ Provider-backed integration Android record stop retries the pull until in-place moov finalization lands 2787ms
✓ |provider-integration| test/integration/provider-scenarios/ios-record-trace.test.ts (2 tests) 1465ms
✓ Provider-backed integration iOS simulator recording flow uses the focused Apple transport 1315ms
✓ |provider-integration| test/integration/provider-scenarios/stale-ref-warning.test.ts (2 tests) 1702ms
✓ Provider-backed integration iOS @refs reject after a selector press replaces the tree 964ms
✓ Provider-backed iOS press rejects a stale ref after navigation 736ms
✓ |provider-integration| test/integration/provider-scenarios/tvos-remote.test.ts (1 test) 1292ms
✓ Provider-backed integration tvOS remote flow maps navigation commands to runner remote presses 1291ms
✓ |provider-integration| test/integration/provider-scenarios/android-recording.test.ts (5 tests) 1425ms
✓ Provider-backed integration Android record start and stop use the composed scoped runtime 682ms
✓ Provider-backed integration Android record stop reattaches a matching durable descriptor 665ms
✓ |provider-integration| test/integration/provider-scenarios/versioned-refs.test.ts (1 test) 1275ms
✓ Provider-backed integration rejects stale pinned @refs and accepts current pins 1274ms
✓ |provider-integration| test/integration/provider-scenarios/interaction-verify.test.ts (1 test) 1292ms
✓ Provider-backed integration press --verify returns post-action evidence digest 1291ms
✓ |provider-integration| test/integration/provider-scenarios/android-find.test.ts (1 test) 737ms
✓ Provider-backed integration Android find flow covers refs, wait, ambiguity, and first/last selection 736ms
✓ |provider-integration| test/integration/provider-scenarios/web-desktop.test.ts (1 test) 781ms
✓ Provider-backed integration web desktop flow uses semantic web provider calls 780ms
✓ |provider-integration| test/integration/provider-scenarios/linux-desktop.test.ts (1 test) 829ms
✓ Provider-backed integration Linux desktop flow uses semantic desktop and input providers 828ms
✓ |provider-integration| test/integration/provider-scenarios/cloud-webdriver-runtime.test.ts (6 tests) 676ms
✓ |provider-integration| test/integration/provider-scenarios/replay-repair-abort-close.test.ts (1 test) 933ms
✓ Provider-backed integration: repair close paths (abort, plain close, committed) 932ms
✓ |provider-integration| test/integration/provider-scenarios/record-trace-android-liveness.test.ts (1 test) 741ms
✓ Provider-backed integration Android record stop finishes an artifact after a dead-pid reattach 740ms
✓ |provider-integration| test/integration/provider-scenarios/no-record-recorder-routes.test.ts (1 test) 495ms
✓ |provider-integration| test/integration/provider-scenarios/macos-desktop.test.ts (2 tests) 1045ms
✓ Provider-backed integration prepare uses the Apple runner lifecycle provider 523ms
✓ Provider-backed integration macOS desktop flow uses semantic host and helper providers 521ms
✓ |provider-integration| test/integration/provider-scenarios/provider-failures.test.ts (1 test) 213ms
✓ |provider-integration| test/integration/provider-scenarios/replay-repair-record-exclusion.test.ts (1 test) 384ms
✓ |provider-integration| test/integration/provider-scenarios/android-tv-remote.test.ts (1 test) 68ms
✓ |provider-integration| test/integration/provider-scenarios/ios-alert-settings.test.ts (1 test) 226ms
✓ |provider-integration| test/integration/provider-scenarios/daemon-http-server.test.ts (10 tests) 125ms
✓ |provider-integration| test/integration/provider-scenarios/provider-ios-selector-runtime.test.ts (1 test) 124ms
✓ |provider-integration| test/integration/provider-scenarios/provider-device-runtime.test.ts (4 tests) 205ms
✓ |provider-integration| test/integration/provider-scenarios/web-provider.test.ts (1 test) 210ms
✓ |provider-integration| test/integration/provider-scenarios/provider-ios-runner-transport.test.ts (3 tests) 113ms
✓ |provider-integration| test/integration/provider-scenarios/daemon-command-policy.test.ts (1 test) 125ms
✓ |provider-integration| test/integration/provider-scenarios/network-runtime-provider.test.ts (1 test) 85ms
✓ |provider-integration| test/integration/provider-scenarios/vega-tv-remote.test.ts (1 test) 82ms
✓ |provider-integration| test/integration/provider-scenarios/apple-app-log-runtime-provider.test.ts (1 test) 86ms
✓ |provider-integration| test/integration/provider-scenarios/batch-flags.test.ts (1 test) 75ms
✓ |provider-integration| test/integration/provider-scenarios/stale-provider-runtime-admission.test.ts (3 tests) 53ms
✓ |provider-integration| test/integration/provider-scenarios/cloud-webdriver-provider-adapters.test.ts (5 tests) 13ms
✓ |provider-integration| test/integration/provider-scenarios/cloud-webdriver-provider-regressions.test.ts (5 tests) 12ms
✓ |provider-integration| test/integration/provider-scenarios/provider-command-dispatch.test.ts (2 tests) 3ms
✓ |provider-integration| test/integration/provider-scenarios/android-recording-provider-fixtures.test.ts (1 test) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-maestro.test.ts (43 tests) 3708ms
✓ |unit-core| src/daemon/tests/request-router-screenshot.test.ts (16 tests) 1669ms
✓ iOS simulator screenshot omits logical density metadata after --scale downscale 589ms
✓ screenshot --pixel-density keeps overlay refs aligned to scaled iOS simulator output 609ms
✓ |unit-core| src/platforms/android/tests/snapshot-helper-session.test.ts (15 tests) 2698ms
✓ failed capture does not fall back when device runtime retirement is unconfirmed 2004ms
✓ |unit-core| src/daemon/handlers/tests/snapshot-handler.test.ts (54 tests) 9318ms
✓ snapshot warns when Android freshness retries still return the previous route 1256ms
✓ diff snapshot carries stale-tree warnings for recent Android presses 1256ms
✓ captureSnapshot lazily retries pending no-change touch before returning fresh state 502ms
✓ captureSnapshot does not retry when a tap change appears after a short delay 502ms
✓ captureSnapshot retries pending tap outcome before post-gesture stabilization 703ms
✓ alert accept adds a scoped-snapshot hint after retrying alert-not-found failures 2110ms
✓ alert dismiss retries on "no alert" message 603ms
✓ |unit-core| src/tests/platform-runtime-runtime-hints.test.ts (15 tests) 2692ms
✓ |unit-core| src/platforms/android/tests/input-actions-fill.test.ts (18 tests) 2177ms
✓ fillAndroid delegates target replacement to provider-native text injection 505ms
✓ fillAndroid returns target-bound unconfirmed evidence when an input mask reformats text 504ms
✓ fillAndroid waits for settled app text before reporting success 503ms
✓ fillAndroid accepts matching-length masked password verification 503ms
✓ |unit-core| src/platforms/android/tests/snapshot.test.ts (48 tests) 2060ms
✓ snapshotAndroid does not start one-shot capture when session retirement is unconfirmed 2004ms
✓ |unit-core| src/platforms/android/tests/touch-helper-session.test.ts (9 tests) 2031ms
✓ touch helper does not run one-shot while snapshot retirement is unconfirmed 2011ms
✓ |unit-core| src/daemon/tests/device-claim-admission.test.ts (10 tests) 1221ms
✓ |unit-core| src/platforms/android/tests/input-actions.test.ts (14 tests) 1525ms
✓ fillAndroid uses chunk-safe shell input and retries when verification still fails 508ms
✓ fillAndroid keeps delayed typing in typed-input mode 504ms
✓ fillAndroid tolerates delayed React Native text verification 505ms
✓ |unit-core| src/daemon/handlers/tests/session-open-execution-runtime.test.ts (6 tests) 1089ms
✓ open runtime payload replaces stored session runtime atomically 528ms
✓ |unit-core| src/tests/test-file-size-ratchet.test.ts (4 tests) 997ms
✓ no test file over the tripwire grows, and every pin matches its file exactly 995ms
✓ |unit-core| src/daemon/handlers/tests/session-open-runtime.test.ts (7 tests) 865ms
✓ |unit-core| src/daemon/tests/request-router-open.test.ts (12 tests) 895ms
✓ fresh open uses app-aware device selection for advisory locking and dispatch 634ms
✓ |unit-core| src/core/tests/dispatch-trigger-app-event.test.ts (9 tests) 1218ms
✓ |unit-core| src/tests/daemon-entrypoint.test.ts (5 tests) 1685ms
✓ daemon entrypoint publishes HTTP metadata and cleans up on shutdown 990ms
✓ daemon runtime records startup device-claim reconciliation in daemon.log 568ms
✓ |unit-core| src/daemon/handlers/tests/session-boot-shutdown-device-claims.test.ts (4 tests) 1176ms
✓ shutdown refuses a device held by a foreign live claim and never reaches the device 588ms
✓ |unit-core| src/platforms/android/tests/app-helpers.test.ts (3 tests) 434ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime.test.ts (20 tests) 650ms
✓ |unit-core| src/daemon/handlers/tests/session-close-error-precedence.test.ts (5 tests) 672ms
✓ |unit-core| src/daemon/handlers/tests/find.test.ts (28 tests) 698ms
✓ |unit-core| src/daemon/handlers/tests/wait-landmark-recording.test.ts (5 tests) 619ms
✓ a replayed wait with a landmark guard refuses at the deadline when only impostors matched 603ms
✓ |unit-core| src/daemon/tests/generic-settle.test.ts (7 tests) 323ms
✓ |unit-core| src/daemon/tests/request-router-lock-policy.test.ts (9 tests) 517ms
✓ |unit-core| src/daemon/handlers/tests/session-observability.test.ts (17 tests) 527ms
✓ |unit-core| src/platforms/android/tests/input-actions-test-ime.test.ts (2 tests) 510ms
✓ fillAndroid clears then commits non-ASCII text through the test IME and verifies it 507ms
✓ |unit-core| src/daemon/handlers/tests/system-surface-disclosure.test.ts (8 tests) 513ms
✓ |unit-core| src/core/tests/dispatch-tv-remote.test.ts (4 tests) 807ms
✓ |unit-core| src/daemon/tests/request-router-android-snapshot-helper.test.ts (2 tests) 369ms
✓ |unit-core| src/core/tests/dispatch-orientation.test.ts (3 tests) 522ms
✓ |unit-core| src/sdk/limrun-runtime-dependencies.test.ts (2 tests) 274ms
✓ |unit-core| src/core/tests/dispatch-back.test.ts (1 test) 227ms
✓ |unit-core| src/core/tests/dispatch-keyboard.test.ts (6 tests) 206ms
✓ |unit-core| src/daemon/handlers/tests/session-teardown-resources.test.ts (9 tests) 195ms
✓ |unit-core| src/daemon/handlers/tests/interaction.test.ts (17 tests) 230ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-direct-ios-eligibility.test.ts (4 tests) 219ms
✓ |unit-core| src/daemon/handlers/tests/session-open-url-prewarm.test.ts (16 tests) 177ms
✓ |unit-core| src/platforms/android/tests/snapshot-helper.test.ts (24 tests) 29ms
✓ |unit-core| src/daemon/handlers/tests/interaction-settle.test.ts (9 tests) 190ms
✓ |unit-core| src/daemon/tests/request-router-events.test.ts (6 tests) 217ms
✓ |unit-core| src/daemon/handlers/tests/session-logs.test.ts (15 tests) 215ms
✓ |unit-core| src/daemon/tests/request-router-replay-scope.test.ts (4 tests) 254ms
✓ |unit-core| src/daemon/tests/request-router-repair-expired.test.ts (5 tests) 139ms
✓ |unit-core| src/daemon/handlers/tests/record-runtime-stop-recovery.test.ts (5 tests) 171ms
✓ |unit-core| src/daemon/tests/request-save-script-transports.test.ts (8 tests) 197ms
✓ |unit-core| src/tests/provider-device-runtimes.test.ts (2 tests) 206ms
✓ |unit-core| src/daemon/tests/request-runtime-binding-router.test.ts (2 tests) 262ms
✓ |unit-core| src/daemon/tests/post-gesture-stabilization.test.ts (18 tests) 19ms
✓ |unit-core| src/daemon/tests/request-router-typed-error.test.ts (6 tests) 135ms
✓ |unit-core| src/daemon/tests/request-handler-catalog.test.ts (10 tests) 119ms
✓ |unit-core| src/daemon/tests/request-router-record-runtime-lock.test.ts (3 tests) 138ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-plan.test.ts (13 tests) 33ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-repair-loop.test.ts (15 tests) 26ms
✓ |unit-core| src/daemon/tests/request-router-android-perf.test.ts (1 test) 79ms
✓ |unit-core| src/daemon/tests/request-handler-chain.test.ts (9 tests) 100ms
✓ |unit-core| src/daemon/tests/post-gesture-no-effect-claim.test.ts (7 tests) 26ms
✓ |unit-core| src/tests/limrun-runtime.test.ts (15 tests) 93ms
✓ |unit-core| src/daemon/server/daemon-runtime-idle-reap.test.ts (2 tests) 225ms
✓ |unit-core| src/core/tests/dispatch-scroll.test.ts (10 tests) 339ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-target-verification-runtime.test.ts (26 tests) 127ms
✓ |unit-core| src/daemon/handlers/tests/session-relaunch-close.test.ts (18 tests) 105ms
✓ |unit-core| src/daemon/handlers/tests/session-test-suite.test.ts (16 tests) 128ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-repair-transaction.test.ts (17 tests) 97ms
✓ |unit-core| src/daemon/handlers/tests/session-test-runner.test.ts (9 tests) 207ms
✓ |unit-core| src/daemon/tests/request-router-custom-action-flags.test.ts (3 tests) 62ms
✓ |unit-core| src/daemon/server/daemon-runtime-recording-teardown.test.ts (3 tests) 87ms
✓ |unit-core| src/daemon/tests/request-router-recording-health.test.ts (2 tests) 45ms
✓ |unit-core| src/daemon/handlers/tests/session-close-save-script.test.ts (2 tests) 74ms
✓ |unit-core| src/daemon/tests/request-execution-scope.test.ts (25 tests) 64ms
✓ |unit-core| src/daemon/selector-runtime-backend.test.ts (2 tests) 71ms
✓ |unit-core| src/daemon/handlers/tests/session-open-existing.test.ts (9 tests) 52ms
✓ |unit-core| src/daemon/tests/request-router-replay-env.test.ts (2 tests) 157ms
✓ |unit-core| src/daemon/handlers/tests/session-close-shutdown-platform.test.ts (7 tests) 35ms
✓ |unit-core| src/daemon/tests/request-router-record-flags.test.ts (2 tests) 44ms
✓ |unit-core| src/core/tests/dispatch-interactions.test.ts (14 tests) 74ms
✓ |unit-core| src/daemon/tests/snapshot-custom-actions-platform-guard.test.ts (7 tests) 67ms
✓ |unit-core| src/core/tests/dispatch-type.test.ts (1 test) 79ms
✓ |unit-core| src/daemon/handlers/tests/session-capabilities.test.ts (14 tests) 35ms
✓ |unit-core| src/daemon/handlers/tests/interaction-settle-private-ax-route.test.ts (1 test) 80ms
✓ |unit-core| src/daemon/handlers/tests/session-device-claims.test.ts (9 tests) 91ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-repair-acceptance.test.ts (1 test) 20ms
✓ |unit-core| src/daemon/handlers/tests/interaction-target-evidence.test.ts (9 tests) 24ms
✓ |unit-core| src/daemon/tests/daemon-runtime-app-log.test.ts (3 tests) 67ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-script-source.test.ts (5 tests) 27ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-repair-record-exclusion.test.ts (4 tests) 83ms
✓ |unit-core| src/daemon/handlers/tests/session-push.test.ts (6 tests) 32ms
✓ |unit-core| src/daemon/handlers/tests/session-close-resource-cleanup.test.ts (7 tests) 76ms
✓ |unit-core| src/daemon/handlers/tests/session-appstate-input-perf.test.ts (17 tests) 18ms
✓ |unit-core| src/tests/android-adb-public.test.ts (1 test) 53ms
✓ |unit-core| src/platform-runtime-gateway.test.ts (20 tests) 32ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-maestro-failure.test.ts (9 tests) 31ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-dispatch-selector-miss.test.ts (5 tests) 19ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-repair-empty-tail.test.ts (6 tests) 38ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-failure.test.ts (10 tests) 41ms
✓ |unit-core| src/daemon/handlers/tests/record-runtime-start.test.ts (4 tests) 77ms
✓ |unit-core| src/daemon/handlers/tests/interaction-ios-tap-outcome.test.ts (16 tests) 33ms
✓ |unit-core| src/daemon/handlers/tests/session-reinstall.test.ts (6 tests) 47ms
✓ |unit-core| src/utils/tests/interactors.test.ts (14 tests) 45ms
✓ |unit-core| src/daemon/handlers/tests/session-devices-batch-runtime.test.ts (10 tests) 39ms
✓ |unit-core| src/daemon/handlers/tests/session-push-ref-frame.test.ts (2 tests) 13ms
✓ |unit-core| src/daemon/server/daemon-runtime-lifecycle-shutdown.test.ts (1 test) 76ms
✓ |unit-core| src/daemon/handlers/tests/session-relaunch-guards.test.ts (9 tests) 15ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-response.test.ts (6 tests) 17ms
✓ |unit-core| src/daemon/handlers/tests/session-test-suite-command-video.test.ts (1 test) 21ms
✓ |unit-core| src/daemon/tests/snapshot-state.test.ts (14 tests) 18ms
✓ |unit-core| src/daemon/tests/request-router-android-modal.test.ts (3 tests) 12ms
✓ |unit-core| src/daemon/handlers/tests/session-close-lifecycle-runtime.test.ts (6 tests) 38ms
✓ |unit-core| src/daemon/handlers/tests/session-boot-shutdown.test.ts (14 tests) 39ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-divergence.test.ts (15 tests) 44ms
✓ |unit-core| src/daemon/handlers/tests/session-test-reporter-values.test.ts (4 tests) 33ms
✓ |unit-core| src/daemon/handlers/tests/session-test-reporter-values-maestro.test.ts (2 tests) 25ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-binding.test.ts (2 tests) 20ms
✓ |unit-core| src/daemon/tests/sparse-fallback-screenshot.test.ts (4 tests) 20ms
✓ |unit-core| src/daemon/handlers/tests/session-runtime-command.test.ts (4 tests) 15ms
✓ |unit-core| src/daemon/tests/request-router-cost.test.ts (6 tests) 35ms
✓ |unit-core| src/daemon/handlers/tests/session-install-source-ref-frame.test.ts (3 tests) 37ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-direct-ios.test.ts (6 tests) 42ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-fill.test.ts (6 tests) 27ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-press-admission.test.ts (13 tests) 45ms
✓ |unit-core| src/platforms/android/tests/ui-hierarchy.test.ts (37 tests) 31ms
✓ |unit-core| src/daemon/handlers/tests/session-audio.test.ts (9 tests) 39ms
✓ |unit-core| src/platform-runtime.test.ts (3 tests) 13ms
✓ |unit-core| src/platforms/apple/core/tests/interactions.test.ts (17 tests) 22ms
✓ |unit-core| src/daemon/handlers/tests/session-test-fail-fast.test.ts (1 test) 14ms
✓ |unit-core| src/daemon/tests/deferred-interaction-outcome.test.ts (10 tests) 13ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-android-freshness.test.ts (4 tests) 14ms
✓ |unit-core| src/daemon/handlers/tests/react-native.test.ts (14 tests) 14ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-android-readiness.test.ts (7 tests) 14ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-press.test.ts (8 tests) 14ms
✓ |unit-core| src/daemon/handlers/tests/session-state-boot-warmup.test.ts (1 test) 28ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-payload.test.ts (7 tests) 18ms
✓ |unit-core| src/daemon/tests/screenshot-runtime.test.ts (7 tests) 73ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch.test.ts (7 tests) 18ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-runtime.test.ts (5 tests) 16ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-failure-response.test.ts (6 tests) 28ms
✓ |unit-core| src/daemon/tests/request-router-response-level.test.ts (6 tests) 12ms
✓ |unit-core| src/daemon/tests/snapshot-diff-runtime.test.ts (7 tests) 15ms
✓ |unit-core| src/daemon/handlers/tests/interaction-common.test.ts (5 tests) 21ms
✓ |unit-core| src/daemon/tests/snapshot-quality-latch.test.ts (9 tests) 18ms
✓ |unit-core| src/daemon/handlers/tests/snapshot-scoped-refs.test.ts (3 tests) 12ms
✓ |unit-core| src/daemon/handlers/tests/interaction-gesture-drag.test.ts (2 tests) 13ms
✓ |unit-core| src/platforms/android/tests/touch-helper.test.ts (16 tests) 16ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-divergence-publication.test.ts (11 tests) 12ms
✓ |unit-core| src/daemon/tests/viewport-runtime.test.ts (5 tests) 12ms
✓ |unit-core| src/daemon/tests/request-platform-providers.test.ts (8 tests) 12ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-selector-routes.test.ts (1 test) 15ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-keep-session.test.ts (6 tests) 12ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-artifact-ledger.test.ts (2 tests) 10ms
✓ |unit-core| src/daemon/tests/selector-capture-runtime.test.ts (4 tests) 7ms
✓ |unit-core| src/cli-schema/command-schema-guards.test.ts (5 tests) 11ms
✓ |unit-core| src/core/command-descriptor/tests/parity.test.ts (15 tests) 14ms
✓ |unit-core| src/daemon/handlers/tests/session-inventory-appleos.test.ts (4 tests) 7ms
✓ |unit-core| src/daemon/handlers/snapshot-runtime-route.test.ts (2 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/install-source.test.ts (7 tests) 11ms
✓ |unit-core| src/daemon/snapshot-presentation/ios/transitions.test.ts (4 tests) 9ms
✓ |unit-core| src/daemon/handlers/tests/session-network-runtime-parity.test.ts (13 tests) 9ms
✓ |unit-core| src/platforms/android/tests/ui-hierarchy-scope.test.ts (7 tests) 10ms
✓ |unit-core| src/daemon/handlers/tests/session-command-replay.test.ts (4 tests) 9ms
✓ |unit-core| src/daemon/tests/snapshot-command-runtime.test.ts (2 tests) 7ms
✓ |unit-core| src/daemon/handlers/tests/session-state.test.ts (5 tests) 8ms
✓ |unit-core| src/daemon/handlers/tests/trace-runtime.test.ts (3 tests) 8ms
✓ |unit-core| src/core/tests/snapshot-chrome-android-statusbar.test.ts (5 tests) 8ms
✓ |unit-core| scripts/tests/help-conformance-sample-outputs.test.ts (14 tests) 8ms
✓ |unit-core| src/core/tests/capability-plugin-routing-parity.test.ts (8 tests) 5ms
✓ |unit-core| src/daemon/handlers/tests/session-perf-xctrace-lifecycle.test.ts (3 tests) 7ms
✓ |unit-core| src/daemon/handlers/tests/session-capabilities-install-projection.test.ts (3 tests) 5ms
✓ |unit-core| src/daemon/handlers/tests/session-inventory-harmonyos.test.ts (2 tests) 5ms
✓ |unit-core| src/daemon/handlers/tests/snapshot-capture.test.ts (5 tests) 6ms
✓ |unit-core| src/daemon/handlers/tests/session-open-foreground.test.ts (13 tests) 5ms
✓ |unit-core| src/daemon/server/daemon-runtime-device-claims.test.ts (2 tests) 6ms
✓ |unit-core| src/daemon/server/daemon-runtime-web-cleanup.test.ts (2 tests) 5ms
✓ |unit-core| src/daemon/handlers/tests/session-replay.test.ts (3 tests) 4ms
✓ |unit-core| src/daemon/tests/android-system-dialog-occlusion.test.ts (2 tests) 4ms
✓ |unit-core| src/core/tests/dispatch-viewport.test.ts (1 test) 10ms
✓ |unit-core| src/daemon/tests/interaction-outcome-policy.test.ts (18 tests) 4ms
✓ |unit-core| src/platforms/android/tests/snapshot-content-recovery.test.ts (13 tests) 5ms
✓ |unit-core| src/daemon/tests/direct-ios-selector.test.ts (10 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-test-suite-command-flag-policy.test.ts (6 tests) 4ms
✓ |unit-core| src/core/tests/dispatch-screenshot.test.ts (1 test) 5ms
✓ |unit-core| src/daemon/tests/android-snapshot-freshness.test.ts (14 tests) 5ms
✓ |unit-core| src/core/tests/capabilities.test.ts (11 tests) 8ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-targets.test.ts (11 tests) 6ms
✓ |unit-core| src/daemon/snapshot-presentation/ios/publication-membership.test.ts (3 tests) 4ms
✓ |unit-core| src/daemon/handlers/tests/session-runtime-admission.test.ts (6 tests) 5ms
✓ |unit-core| src/daemon/handlers/tests/session-network.test.ts (2 tests) 4ms
✓ |unit-core| src/daemon/tests/android-system-dialog-ref-frame.test.ts (1 test) 4ms
✓ |unit-core| src/daemon/tests/providers-plugin-routing-parity.test.ts (3 tests) 4ms
✓ |unit-core| src/daemon/handlers/tests/interaction-snapshot-scope.test.ts (1 test) 4ms
✓ |unit-core| src/platforms/android/tests/touch-executor.test.ts (3 tests) 4ms
✓ |unit-core| src/platforms/android/tests/snapshot-helper-capture.test.ts (2 tests) 4ms
✓ |unit-core| src/daemon/tests/interaction-surface-baseline-evidence.test.ts (7 tests) 4ms
✓ |unit-core| src/daemon/tests/snapshot-runtime-binding.test.ts (1 test) 4ms
✓ |unit-core| src/daemon/handlers/tests/session-inventory-apps-runtime.test.ts (1 test) 5ms
✓ |unit-core| src/platform-runtime-operation-host.test.ts (2 tests) 3ms
✓ |unit-core| src/daemon/tests/selector-runtime.test.ts (5 tests) 4ms
✓ |unit-core| scripts/tests/help-conformance-error-recovery-coverage.test.ts (9 tests) 4ms
✓ |unit-core| src/core/tests/dispatch-hover.test.ts (3 tests) 3ms
✓ |unit-core| src/tests/contracts/apple-os-capability-table-parity.test.ts (4 tests) 4ms
✓ |unit-core| src/daemon/handlers/tests/session-device-utils.test.ts (5 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-runtime-port-reverse.test.ts (2 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/interaction-read.test.ts (5 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-test-suite-command-cancellation.test.ts (5 tests) 3ms
✓ |unit-core| src/tests/contracts/platform-plugin-parity.test.ts (7 tests) 3ms
✓ |unit-core| src/daemon/tests/post-gesture-stabilization-verdict.test.ts (7 tests) 4ms
✓ |unit-core| src/daemon/tests/request-handler-chain-provider-scope.test.ts (2 tests) 3ms
✓ |unit-core| src/core/tests/gesture-capabilities.test.ts (4 tests) 3ms
✓ |unit-core| src/daemon/tests/offscreen-target-probe.test.ts (6 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-test-suite-command-nested-flags.test.ts (5 tests) 3ms
✓ |unit-core| src/core/tests/dispatch-target.test.ts (1 test) 2ms
✓ |unit-core| src/daemon/handlers/tests/session-trigger.test.ts (1 test) 3ms
✓ |unit-core| src/daemon/tests/device-claim-conflict.test.ts (4 tests) 2ms
✓ |unit-core| src/platforms/android/tests/snapshot-helper-runtime.test.ts (2 tests) 2ms
✓ |unit-core| src/daemon/wait-current-surface.test.ts (2 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/interaction-flags.test.ts (1 test) 2ms
✓ |unit-core| src/daemon/tests/perf-plugin-routing-parity.test.ts (2 tests) 2ms

Test Files 267 passed (267)
Tests 1869 passed (1869)
Start at 17:43:50
Duration 175.78s (transform 10.20s, setup 3.52s, import 105.58s, tests 183.72s, environment 12ms)

[run] coverage: pnpm run check:coverage-changed --base origin/main
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0

Changed-line coverage gate: PASS

Metric Value
Changed-line coverage (gating, threshold 70%) 139/140 (99.29%)
Changed-branch coverage (non-gating) 136/144 (94.44%)
Changed executable lines excluded (non-gating) 0

Uncovered changed lines:

  • src/platforms/android/ui-hierarchy-visibility.ts: 235

[dedupe] provider-integration — covered by affected LCOV or GitHub CI

[run] command-docs: pnpm run check:command-docs
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0

RUN v4.1.8 /Users/thymikee/Developer/agent-device/.claude/worktrees/issue-1806-fix-verify-713262

✓ |unit-core| src/tests/command-doc-coverage.test.ts (11 tests) 4ms

Test Files 1 passed (1)
Tests 11 passed (11)
Start at 17:46:50
Duration 1.38s (transform 796ms, setup 18ms, import 949ms, tests 4ms, environment 0ms)

check:affected: all runnable checks passed. green on the rebased head (1869 tests). Validation section updated with the rebase facts, and the older 'rebased onto fda81c5' line replaced rather than left stale.

CI is running on f2d52b1. Nothing else outstanding from the last review round — the live positive-dialog evidence and the covered-first unit-only caveat are already in the body.

@thymikee

Copy link
Copy Markdown
Member Author

Re-reviewed exact f2d52b1: code-clean. The shared occlusion result now governs both ANR detection and the reachable Close-app tap; the planted-red regressions and live positive ANR run exercise detection → tap → dismissal/relaunch. The rebase is clean, size is neutral, and all completed exact-head checks pass. Ready for human review. Merge readiness still needs a green Linux Smoke rerun because that lane was cancelled during desktop dependency installation before project tests began.

@thymikee thymikee added the ready-for-human Valid work that needs human implementation, judgment, or maintainer merge label Aug 19, 2026
@thymikee
thymikee merged commit 84e6f9b into main Aug 19, 2026
30 of 31 checks passed
@thymikee
thymikee deleted the claude/1832-c3-residues branch August 19, 2026 16:17
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