Skip to content

fix(daemon): stop branch-named daemon before replacement - #2015

Merged
thymikee merged 3 commits into
tier4/daemon-client-fingerprintfrom
fix/1545-daemon-reuse
Aug 25, 2026
Merged

fix(daemon): stop branch-named daemon before replacement#2015
thymikee merged 3 commits into
tier4/daemon-client-fingerprintfrom
fix/1545-daemon-reuse

Conversation

@thymikee

@thymikee thymikee commented Aug 24, 2026

Copy link
Copy Markdown
Member

Summary

Closes #1545.

Git-worktree daemon processes are now recognized by their daemon entry path instead of requiring agent-device in the checkout path. This lets the existing platform-neutral daemon-client reuse/takeover path recognize a daemon launched from a branch-named worktree; when replacement is warranted, it can stop the predecessor instead of leaving an invisible daemon holding the old session state and leases.

Process ownership and reaping now require an explicit process-start-time identity slot and fail closed when metadata omits that identity. Missing identity can therefore remove stale metadata but cannot authorize a signal. This PR does not touch or duplicate #2004's in-flight dev code-signature cache/identity seam.

This PR is rebased onto the current open #2004 dependency, tier4/daemon-client-fingerprint at 44e80ea1704ef6eca79ee999eb3ee4d83503c08a.

Scope is seven touched files: the daemon-process ownership predicate, pure and real-child regression tests, the existing daemon-client process fixture, the file-size ratchet pin, the existing web-smoke cleanup call's explicit identity slot, and serialized subprocess-test registration. No platform implementation, code-signature calculation/cache, CLI surface, docs, or skills changed. The duplicate legacy takeover test was removed from the over-budget daemon-client test file because the dedicated daemon-process takeover suite now owns the stronger real-child proof.

Validation

  • Coverage failure addressed: the previous Coverage (1) job failed only the file-size ratchet after src/utils/__tests__/daemon-client.test.ts grew to 1922 lines. The redundant duplicate test was removed, the file is now 1873 lines, and its ratchet pin was lowered from 1910 to the exact measured size.
  • Planted-red evidence: temporarily removing the fail-closed identity guard made the new real-child test fail (true !== false) at isAgentDeviceDaemonProcess(pid, undefined); restoring the guard made it pass. This proves the missing-identity regression test has a reachable violation.
  • Focused green evidence: pnpm exec vitest run --project unit-core --project subprocess-stub scripts/__tests__/test-file-size-ratchet.test.ts src/utils/__tests__/daemon-client.test.ts src/daemon/__tests__/daemon-process.test.ts src/daemon/__tests__/daemon-process-takeover.test.ts passed 47/47 tests, including exact-start-time takeover, omitted-start-time child-preservation, and the ratchet.
  • Final local gate: elevated pnpm check:affected --run passed all runnable checks, including format, lint, typecheck, layering, fallow, build, package, 92 integration-node tests (9 live-device tests skipped), 7 macOS coverage tests, 458 Vitest files / 3,914 tests, and all structural/model gates. An earlier sandboxed attempt stopped at the known ps subprocess EPERM; the same gate passed with process access.
  • macOS host smoke evidence remains: two default pnpm ad session list --json invocations reused one daemon state directory and one matching worktree daemon process. The exact historical code-signature-mismatch/session-loss repro was not reproduced on this host; no live device or app session was used.
  • The requested claude -p adversarial review was attempted against the final diff, but the CLI reported Not logged in, so no external review result is claimed. A bounded local audit checked every ownership/signal call path, explicit identity propagation, path normalization/quoting, nearest negatives, real-child behavior, and perf(daemon): revalidate the source code-signature cache by stat instead of rereading the graph #2004 seam ownership.

Residual gaps are the GitHub-authoritative native/device/provider lanes and the exact OS-specific process-table repro not being available in this environment. The previous CI failure was isolated to the file-size ratchet above; the corrected head is being pushed for GitHub to rerun. This PR is not merged.

@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown

Size Report

Metric Base Current Diff
JS raw 2.42 MB 2.42 MB -62 B
JS gzip 811.2 kB 811.2 kB -31 B
npm tarball 935.8 kB 935.7 kB -14 B
npm unpacked 3.25 MB 3.25 MB -62 B

npm unpacked components

Component Base Current Diff
JS / dist source 2.58 MB 2.57 MB -62 B
Apple runner source/project 570.6 kB 570.6 kB 0 B
macOS helper source 54.5 kB 54.5 kB 0 B
Android helper artifacts 0 B 0 B 0 B
Other package files 45.2 kB 45.2 kB 0 B

Startup median (7 runs, lower is better):

Scenario Base Current Diff
CLI --version 30.0 ms 29.9 ms -0.1 ms
CLI --help 84.0 ms 84.9 ms +0.9 ms

Top changed chunks: no changes in the largest emitted chunks.

Top changed packed files

Packed file Base Current Diff
dist/src/daemon-process.js 704 B 642 B -62 B

@thymikee

Copy link
Copy Markdown
Member Author

Code review is clean at 0b143a8e1d29d2470fc2b058ee02dfeba5c37ec8. The changed matcher is on the real daemon replacement route, PID/start-time fencing is preserved, and the real-child regression is non-vacuous: restoring the old checkout-name predicate fails while the exact implementation passes. The size impact is negligible.

Not ready for human merge yet: the iOS smoke lane is red on unrelated smoke:form-input / TEXT_INPUT_COMMIT_NOT_OBSERVED, and the PR is stacked on conflicted #2004. Re-run/classify the iOS lane and retarget/rebase after #2004 lands.

@thymikee

Copy link
Copy Markdown
Member Author

The new iOS smoke rerun is green and all current checks pass, but re-reviewing unchanged head 0b143a8e1d29d2470fc2b058ee02dfeba5c37ec8 found one ownership-safety blocker.

P1 — missing process identity fails open during takeover. isAgentDeviceDaemonProcess(pid, expectedStartTime?) validates start time only when metadata supplies it. Both daemon and lock readers accept metadata without processStartTime, and startup cleanup / clean:daemon can then signal any live process whose argv ends in an agent-device daemon entry path. This PR deliberately broadens that path match from project-named checkouts to every branch-named worktree, so a stale PID reused by another checkout daemon can now be terminated without the PID/start-time fence the code comment says is always present.

Make start time mandatory for process ownership and reaping: missing identity must fail closed, allowing stale metadata removal but no signal. Add a real-child regression with omitted processStartTime proving the child remains alive, alongside the existing exact-start-time takeover proof.

Separately, #2015 remains stacked on conflicting #2004. After this finding is fixed, #2004 must land/rebase and #2015 must be retargeted or rebased before merge. No readiness label applied.

@thymikee

Copy link
Copy Markdown
Member Author

Still not ready at unchanged head 0b143a8e. The missing-processStartTime P1 remains unresolved: takeover can still signal a path-matching process without the required PID/start-time fence, so missing identity must fail closed and needs the omitted-start-time real-child regression. The stacked base #2004 moved to 1213ac6a; #2015 is now conflicting and its displayed diff is polluted by the old base chain. Fix the P1, then rebase onto the new #2004 head before renewed review.

@thymikee
thymikee force-pushed the fix/1545-daemon-reuse branch from 0b143a8 to d124858 Compare August 25, 2026 12:49
@thymikee

Copy link
Copy Markdown
Member Author

Addressed the ownership-safety P1 and rebased onto the current #2004 head.

  • isAgentDeviceDaemonProcess and stopProcessForTakeover now require an explicit process-start-time identity slot and fail closed when it is undefined; no signal is sent without the fence.
  • Added a real-child regression proving a branch-named daemon remains alive when processStartTime is omitted, alongside the exact-start-time replacement proof.
  • The planted-red version failed at the omitted-identity assertion; focused daemon/client coverage is 44/44.
  • Final elevated pnpm check:affected --run passed all runnable checks (457 Vitest files / 3,911 tests; 92 integration-node tests with 9 live-device skips).

Current head: d1248581b55f3d1592fc835e3e6b7f1139951a0d; CI is running.

@thymikee

Copy link
Copy Markdown
Member Author

Addressed the ownership-safety P1 and rebased onto the current #2004 head.\n\n- and now require an explicit process-start-time identity slot and fail closed when it is undefined; no signal is sent without the fence.\n- Added a real-child regression proving a branch-named daemon remains alive when is omitted, alongside the exact-start-time replacement proof.\n- The planted-red version failed at the omitted-identity assertion; focused daemon/client coverage is 44/44.\n- Final elevated [WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
check:affected — diff origin/main...HEAD
Fail-open: selecting the full check set.
! vitest.config.ts [workflow-tooling] — workflow/tooling change can alter any gate
Selected 56 check(s):

  • format: Formatting (oxfmt)
  • lint: Lint (oxlint)
  • typecheck: Typecheck (tsc)
  • test-app-typecheck: Expo test app typecheck (GitHub-authoritative; not run locally)
  • layering: Import-direction layering guard
  • di-seams: Test-only DI seam guard
  • fallow: Fallow code-quality audit
  • mcp-metadata: MCP registry metadata sync
  • build: Build (tsdown + declarations)
  • package: Published package (publint, attw, clean-install resolution)
  • integration-node: Node integration smoke
  • macos-coverage: macOS command coverage manifest
  • vitest-related: Tests related by Vitest module graph
  • unit: Unit + smoke suite
  • unit-ci: CI unit suite under coverage (GitHub-authoritative; not run locally)
  • coverage: Changed-line coverage (GitHub-authoritative; not run locally)
  • provider-integration: Provider-backed integration suite
  • integration-progress: Integration architecture-progress gate
  • swift-runner-ios: Swift runner build (iOS) (GitHub-authoritative; not run locally)
  • swift-runner-macos: Swift runner build (macOS) (GitHub-authoritative; not run locally)
  • android-helpers: Android helper builds (snapshot + IME) (GitHub-authoritative; not run locally)
  • macos-helper: macOS helper build (GitHub-authoritative; not run locally)
  • web-smoke: Live web platform smoke (GitHub-authoritative; not run locally)
  • replay-compat: Replay-compat corpus provenance (released blobs)
  • daemon-wire-compat: Daemon RPC wire surface vs. last released tag
  • affected-selector: Affected-check selector model
  • gate-manifest: Gate manifest — every gate owned and wired
  • gate-manifest-model: Gate manifest model
  • depgraph: Dependency graph report agrees with the gate
  • tmpdir-leaks: Leaked test tmpdir detector
  • tmpdir-leaks-model: TMPDIR redirection model
  • coverage-model: Changed-line coverage model
  • wire-compat-model: Wire-compat rules model
  • production-exports: Production-unused exports
  • bundle-owner-files: Bundle owner-file manifest
  • freerange: Numeric range audit (GitHub-authoritative; not run locally)
  • fixture-cache: Trusted fixture-artifact selection
  • fixture-fallback: Fixture-app cache-failure fallback
  • command-docs: Command reference doc coverage
  • agent-guidance: Agent guidance ownership and context budgets
  • xctest-selection: Runner XCTest selection and package-source boundary
  • maestro-conformance: Maestro conformance fixtures
  • maestro-differential: Maestro differential oracle (GitHub-authoritative; not run locally)
  • maestro-regenerate: Maestro fixture regeneration is a no-op (GitHub-authoritative; not run locally)
  • fuzz-parsers: Parser fuzz invariants (GitHub-authoritative; not run locally)
  • mutation: Mutation sweep (GitHub-authoritative; not run locally)
  • mutation-affected: Affected mutation shard selection (GitHub-authoritative; not run locally)
  • mutation-check: Mutation score for an existing report (GitHub-authoritative; not run locally)
  • mutation-model: Mutation harness self-test
  • concurrency-torture: Session/lease/lock torture sweep (GitHub-authoritative; not run locally)
  • replay-ios: iOS simulator replay suite (GitHub-authoritative; not run locally)
  • replay-ios-device: iOS physical device replay suite (GitHub-authoritative; not run locally)
  • replay-macos: macOS replay suite (GitHub-authoritative; not run locally)
  • replay-linux: Linux replay suite (GitHub-authoritative; not run locally)
  • linux-command-evidence: Linux command evidence suite (GitHub-authoritative; not run locally)
  • replay-android: Android replay suite (GitHub-authoritative; not run locally)

[skip] test-app-typecheck — GitHub-authoritative (jobs: Test App Build Cache / Resolve native fingerprint)

[skip] unit-ci — GitHub-authoritative (jobs: Coverage, Coverage Report, Integration Tests)

[skip] coverage — GitHub-authoritative (jobs: Coverage Report)

[skip] swift-runner-ios — GitHub-authoritative (jobs: Conformance Differential / iOS Conformance Differential, XCTest Nightly / iOS Runner Full XCTest Suite, iOS / Smoke Tests)

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

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

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

[skip] web-smoke — GitHub-authoritative (jobs: Integration Tests, Typecheck & Package)

[skip] freerange — GitHub-authoritative (jobs: Repo Guards)

[skip] maestro-differential — GitHub-authoritative (jobs: Conformance Differential / iOS Conformance Differential)

[skip] maestro-regenerate — GitHub-authoritative (jobs: Conformance Regenerate Verify / Regenerate & Verify Fixtures)

[skip] fuzz-parsers — GitHub-authoritative (jobs: Replay Nightly / Parser Fuzz Lane)

[skip] mutation — GitHub-authoritative (jobs: Mutation Affected / Mutants (${{ matrix.name }}), Mutation Weekly / Mutants (${{ matrix.name }}))

[skip] mutation-affected — GitHub-authoritative (jobs: Mutation Affected / Select affected kernels)

[skip] mutation-check — GitHub-authoritative (jobs: Mutation Weekly / Mutation score report)

[skip] concurrency-torture — GitHub-authoritative (jobs: Concurrency Torture Nightly / Session/lease/lock torture sweep, Integration Tests)

[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] linux-command-evidence — 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 271ms on 3141 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.881042ms)
✔ registryAliasTokens is not fooled by an unrelated alias string elsewhere in the file (0.0765ms)
✔ importsAliasResolver is true only for a real VALUE import of the resolver (0.11ms)
✔ importsAliasResolver is false for a type-only import (0.047375ms)
✔ importsAliasResolver is false when the import is missing or from the wrong module (0.07275ms)
✔ aliasResolverLocalName resolves the LOCAL binding, following an as alias (0.052167ms)
✔ aliasResolverLocalName is null when there is no matching value import (0.046625ms)
✔ helpTargetBindingName reads the binding resolveSimpleHelpTarget produces (0.1275ms)
✔ helpTargetBindingName is null when the fast path no longer produces one (1.316125ms)
✔ countLocalBindings counts value declarations only, not the import or type positions (0.961458ms)
✔ usageTextDelegationFailure accepts the real composition, by local name (1.643833ms)
✔ usageTextDelegationFailure rejects a raw call, with no wrapping resolver call (0.292333ms)
✔ usageTextDelegationFailure rejects a present-but-unused import (0.17ms)
✔ usageTextDelegationFailure rejects an import used only unrelated to buildCommandUsageText (0.146917ms)
✔ usageTextDelegationFailure rejects a decoy wrapped call beside a raw shipped call (0.170917ms)
✔ usageTextDelegationFailure rejects the resolver applied to anything but the help target (0.117083ms)
✔ usageTextDelegationFailure rejects a local shadow of the imported resolver (0.0715ms)
✔ usageTextDelegationFailure rejects an ambiguous second help-target binding (0.547584ms)
✔ usageTextDelegationFailure reports a fast path that no longer builds usage text at all (0.180792ms)
✔ localAliasLiterals reports every requested token present as a string literal (0.0795ms)
✔ localAliasLiterals ignores tokens that only appear as identifiers, not string literals (0.038875ms)
✔ localAliasLiterals reports nothing when the fixed bin.ts delegates and holds no literals (0.041916ms)
✔ the real tree imports the resolver, calls it into buildCommandUsageText, holds no local alias literals, and passes R12 (5.524334ms)
✔ every catalogued rule is registered, and nothing else is (0.749709ms)
✔ every registered rule is callable, so no entry is a stale reference (0.107667ms)
✔ contracts rejects host process and timer mechanics (3.513833ms)
✔ contracts policy ignores type vocabulary, prose, tests, and capture-kit mechanics (2.089708ms)
✔ network traffic vocabulary cannot grow parser implementation inside contracts (1.961167ms)
✔ daemon modularity baseline records the measured R7 ownership pressure (0.364125ms)
✔ external daemon/types.ts importer membership changes require the baseline to change (0.762667ms)
✔ planned logical modules start with zero forbidden imports (0.153667ms)
✔ replay-test rejects request-global and engine-internal imports (0.473333ms)
✔ replay-test may still import its own files inside the package (0.130542ms)
✔ replay-test carries no recorded migration imports (0.1055ms)
✔ internal trees reject deep imports globally, including from daemon (0.108125ms)
✔ R9 records zone ceilings and keeps engine files outside the largest component (0.122166ms)
✔ R10 zone overflow lists the whole zone so the joining member is visible (0.147041ms)
✔ R9 rejects a baseline left above the measured cycle (0.118583ms)
✔ readNamedExports collects re-export and direct-declaration forms, resolving aliases (2.763666ms)
✔ readNamedExports never reports the original name behind an as alias (0.13425ms)
✔ readNamedExports resolves export * as ns to its one real bound name (0.061708ms)
✔ readNamedExports rejects a bare export * re-export (0.185333ms)
✔ readNamedExports rejects a default export (0.091958ms)
✔ readNamedExports reports export { default as x } as the named symbol x (0.055875ms)
✔ readNamedExports collects a local export { … } list with no from (0.392917ms)
✔ readNamedExports collects every declarator of a multi-declarator export (0.079334ms)
✔ parseImports distinguishes value, type-only, dynamic, and value re-export edges (2.100333ms)
✔ value cycles fail while type-only and dynamic cycles stay outside the graph (0.410584ms)
✔ back-edge identities follow the documented target spine (9.711625ms)
✔ neutral ownership zones reject value imports into higher layers (0.160875ms)
✔ a relative import resolves within its own workspace package src/, but not past it (1.830166ms)
✔ type-only edges are ranked by R6 and ignored by R5, and vice versa (0.653792ms)
✔ ranked and unranked zones are disjoint and both non-empty (0.18425ms)
✔ classifyZone separates the ranked spine from intentionally-unranked zones (0.15375ms)
✔ every production zone is deliberately classified as ranked or unranked (828.548875ms)
✔ listSourceFiles includes root-level src/.ts production files (214.976125ms)
✔ SessionState field names come from the declaration, not a hand-kept list (0.198583ms)
✔ session-state writes are found by field, and non-daemon or undeclared names are not (1.121959ms)
✔ every assignment form is a write, including the ones a regex forgets (0.182917ms)
✔ a computed session write is reported rather than silently unattributed (0.06675ms)
✔ every declared session-state owner is a real file path under src/daemon (0.230833ms)
✔ a session write counts through an aliased binding, not only one named session (0.255792ms)
✔ every SessionState field is classified exactly once (0.396292ms)
✔ classification drift is reported in all three directions (0.170542ms)
✔ largestTypeCycleSize counts type-only cycles and ignores dynamic ones (0.233041ms)
✔ specifier sites carry 1-based lines for static and dynamic imports (0.999875ms)
✔ readWorkspacePackages reads tracked manifests only (1302.063125ms)
✔ every workspace package façade names its exports explicitly (no bare export *) (261.464459ms)
✔ every façade re-exports its sources exhaustively (no silent narrowing) (128.510958ms)
✔ double-quoted and re-export routes into packages are not invisible to R11 (0.447291ms)
✔ a package file importing root src is a violation (0.095709ms)
✔ intra-package relative imports hold (0.066625ms)
✔ an exported package self-reference holds while a deep self-import fails (0.150042ms)
✔ a cross-package import needs a workspace:
declaration and an exported subpath (0.108042ms)
✔ a root src file tunnelling into packages//src relatively is a violation (0.15ms)
✔ a scripts/ file gets no relative route into a package either (0.076167ms)
✔ root workspace specifiers need a root workspace:
entry and an exported subpath (0.07725ms)
✔ the real tree parses, declares, and passes R11 (626.922209ms)
✔ Node resolution enforces the exports map at runtime (3.373333ms)
✔ the inventory substrate has six private lazy packages and one exact composition root (2.26425ms)
✔ capture-kit and platform workspace packages are R11-owned unranked zones (0.135875ms)
✔ untracked production TypeScript makes committed-state evidence fail closed (0.706833ms)
✔ family packages are exact, private, and expose only their root facade (8.538459ms)
✔ composition policy does not pin local platform-module identifier spelling (0.530042ms)
✔ only src/platform-runtime.ts may import a concrete platform package (1.896458ms)
✔ contracts never depend on a concrete platform package in production or tests (8.435667ms)
✔ platform packages cannot escape to root, daemon, siblings, or raw process primitives (4.720042ms)
✔ platform packages may use capture-kit but no unrelated workspace implementation package (1.496542ms)
✔ package-owned tests may import their own public facade (0.462875ms)
✔ platform facades cannot evaluate mechanics eagerly (2.823458ms)
✔ composition policy does not infer host authority from function or class names (0.496959ms)
✔ composition keeps platform implementation loaders behind selected use (2.495792ms)
✔ implementation-loader detection ignores comments, strings, and deferred function bodies (0.592625ms)
✔ composition imports are category-based for future contracts and host adapters (0.784416ms)
✔ Node resolves only each platform package root facade (2.140667ms)
✔ committed-state discovery rejects untracked production and ignores untracked manifests (1772.443166ms)
✔ facade dynamic imports must be nested in deferred functions (1.150417ms)
✔ platform production cannot acquire ambient filesystem, OS, process, or network authority (0.684959ms)
✔ platform facades cannot probe injected host capabilities at module evaluation (0.364167ms)
✔ Apple production must route xcrun availability and execution through appleTools (0.265667ms)
✔ Apple xcrun routing guard ignores comments, strings, and non-xcrun generic commands (3.339667ms)
✔ syntax checks ignore comments and strings and allow deferred imports and host use (0.176625ms)
✔ R16 rejects native mechanics in the daemon record owner without scanning prose (19.9825ms)
✔ R16 rejects child termination and platform branching in daemon record owners (1.1585ms)
✔ R16 requires the real registry normalization path to assert the record use join (1.10075ms)
✔ the layering rules currently in tree carry no unallowed collision (5.266333ms)
✔ a collision nobody allowed fails, whichever order it lands in (0.443375ms)
✔ an allowance expires with the collision it allows (0.157333ms)
✔ reintroducing the transitional collision is rejected once the allowance is gone (0.4685ms)
✔ one rule declaring its id from several call sites is not a collision (0.236916ms)
✔ devices keeps one gateway-owned handler route through an aliased import (0.916875ms)
✔ devices rejects a missing handler module (0.141083ms)
✔ devices rejects a handler that imports but never calls the inventory gateway (0.120458ms)
✔ devices rejects a handler that never imports the inventory gateway (0.086084ms)
✔ devices does not accept a call through a binding that shadows the imported alias (0.103791ms)
✔ session state scan catches planted app-log record construction outside its owner (0.289708ms)
✔ source-executed syntax scan rejects using declarations but ignores prose (0.121959ms)
✔ appstate handler rejects legacy platform imports and calls (0.135084ms)
✔ appstate handler is green after legacy dispatch is removed (0.069666ms)
✔ lifecycle route proofs accept one shared admission per descriptor operation (0.811166ms)
✔ planted red: lifecycle route proof rejects a duplicate admission and legacy local dispatch (0.155667ms)
✔ planted red: lifecycle route proof rejects a handler that calls the raw gateway ports (0.609958ms)
✔ planted red: close cutover rejects a legacy dispatch projection (0.850916ms)
✔ planted red: lifecycle route proof rejects a shared admission with two facts inspections (0.31925ms)
✔ lifecycle durable proof rejects a generic capture-kit lifecycle role and an unfenced IME mutation (0.117708ms)
✔ planted red: lifecycle durable proof rejects a gateway that names a platform durable owner (0.042166ms)
✔ planted red: lifecycle durable proof rejects unevidenced Android startup recovery (0.038708ms)
✔ the parametrized gate goes red on a planted row across every generalized column (3.230917ms)
✔ the planted row is green once the command has exactly one execution path (0.483125ms)
✔ rows are independent: one command going red leaves the others alone (0.323875ms)
✔ planted red: an incomplete row fails instead of enforcing nothing (0.089083ms)
✔ planted red: a row that retires nothing is rejected (0.057708ms)
✔ planted red: an empty singular-execution claim is rejected (0.059208ms)
✔ planted red: a named-operation row that enforces no operation is rejected (0.046542ms)
✔ planted red: a named-operation row that enforces only some operations is rejected (0.054875ms)
✔ planted red: a row that enforces an operation it does not name is rejected (0.059625ms)
✔ planted red: duplicate operations on either side are rejected (0.083583ms)
✔ planted red: every named operation declares its lexical owner (0.057542ms)
✔ unrelated daemon calls neither satisfy nor duplicate an owner-scoped operation (0.207875ms)
✔ a pattern-only row may prove singularity through its route alone (0.084208ms)
✔ planted red: a durable row without a lifecycle proof is rejected (0.087041ms)
✔ planted red: a request-scoped row claiming durable machinery is rejected (0.057958ms)
✔ every shipped row states its claims (0.145209ms)
✔ a data-only retirement is a stated claim, so a row needs no invented identifier (0.032875ms)
✔ planted red: a row claiming a static command set that does not exist is rejected (0.145625ms)
✔ planted red: a claimed static command set that still lists the command is rejected (0.085ms)
✔ a claimed static command set that exists and dropped the command passes (0.106542ms)
✔ R20 boot rejects the superseded root readiness adapter (3.625917ms)
✔ R20 boot operation singularity is scoped to the session-state handler (1.975875ms)
✔ R32 snapshot rejects legacy admission and dispatcher projection (4.086792ms)
✔ devices rejects an exact legacy inventory module path (1.387875ms)
✔ devices rejects executable legacy imports and identifiers (1.238209ms)
✔ devices rejects dynamic imports and re-exports of legacy inventory modules (1.880417ms)
✔ devices ignores comments, strings, and similarly named non-route modules (0.945708ms)
✔ legacy logs scan catches a planted provider route and plugin facet (0.884667ms)
✔ legacy logs scan ignores retired names in comments and string data (0.734917ms)
✔ legacy logs scan retains type-import and computed executable route coverage (0.705583ms)
✔ legacy logs scan catches planted capability and dual-admission routes (3.059542ms)
✔ legacy logs scan follows declaration roles after files move (1.45175ms)
✔ R14 violations retain their exact source line (0.183125ms)
✔ logs narrowing scan catches planted assertions, non-null repair, and bracket access (1.078292ms)
✔ logs keeps the broader non-null scan over every daemon runtime operation (0.453375ms)
✔ network cutover scan catches planted legacy execution and dual admission (1.617166ms)
✔ network cutover scan rejects a retired implementation by committed path (0.752875ms)
✔ network cutover scan ignores retired names in comments and string data (0.849917ms)
✔ network narrowing scan catches planted casts, non-null repair, and bracket access (0.858708ms)
✔ network route scan rejects planted neither and duplicate routes (0.912916ms)
✔ R16 catches a planted legacy recording backend, admission, and plugin facet (1.999416ms)
✔ R16 excludes trace-only mechanics from the record cutover scan (1.266667ms)
✔ R16 rejects the retired recording-provider scope while allowing the focused transport (1.318917ms)
✔ R16 rejects proof repair for a narrowed screen-recording operation (0.7455ms)
✔ the four application-lifecycle descriptors each carry an independent durable cutover row (0.07025ms)
✔ the cutover table rejects a duplicate rule id (0.110667ms)
✔ every daemon-routed migrated descriptor has exactly one cutover row (0.065125ms)
✔ every import form that reaches the engine is refused (0.742166ms)
✔ the owner holds the engine, and the root façade stays open to everyone (0.536833ms)
✔ a missing engine door fails the gate instead of silencing it (0.1285ms)
✔ the refusal names the owner and the entries that replace the bypass (0.073709ms)
✔ the snapshot facet cannot import daemon assembly (849.022834ms)
✔ the boundary reports a facet module that reaches back into the daemon (0.155292ms)
✔ R2 commands-floor closes the four zones below the command surface, whatever the kind (0.656167ms)
✔ R3 platforms-seam closes static value imports and opens the three declared seam owners (0.127375ms)
✔ every policy carries a hint, and the lead names the kind it rejected (0.107208ms)
✔ a policy states its scope with exactly one of to or exceptTo (0.048083ms)
ℹ tests 184
ℹ suites 0
ℹ pass 184
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 2974.860333
Layering guard: OK — 1413 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 34 SessionState fields are classified and every write is inside its declared owner (R7); the largest type-level cycle is 25 files (R9); R10 pins R7 at 22 writer-owned fields / 26 owner claims, R9 at 25 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 108 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, find, get, is, focus, type, back, home, orientation, tv-remote, keyboard, click, press, fill, longpress, hover, viewport, screenshot, wait, gesture, scroll, swipe) keeps exactly one platform-execution path; and bin.ts imports normalizeCliCommandAlias, actually passes it into buildCommandUsageText, and holds no local alias literals (R12).

[run] di-seams: pnpm run check:di-seams
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ findSeamMatches finds an unapproved optional typeof property with its line number (0.879208ms)
✔ findSeamMatches ignores a required (non-optional) field (0.079083ms)
✔ findSeamMatches finds a bare optional function parameter, not just object-type fields (0.085ms)
✔ findSeamMatches finds a declaration whose ?: and typeof land on different lines (0.061375ms)
✔ findSeamMatches attaches an immediately-preceding di-seam-approved comment (0.085875ms)
✔ findSeamMatches joins a multi-line di-seam-approved comment block into one reason (0.072917ms)
✔ findSeamMatches does not treat a marker on an earlier, unrelated field as approving this one (0.061792ms)
✔ findSeamMatches requires the marker text itself, not just a nearby comment (0.06775ms)
✔ findSeamMatches rejects a di-seam-approved marker with no reason text (0.06775ms)
✔ findSeamMatches rejects a di-seam-approved marker whose reason is only whitespace (0.096959ms)
✔ checkSeams flags a declaration whose only marker has no reason text (0.077958ms)
✔ checkSeams passes an approved match and flags an unapproved one (0.060666ms)
✔ checkSeams flags a second, unmarked occurrence of an approved field/target pair (0.058875ms)
✔ checkSeams stays passing when unrelated code is inserted above an approved declaration (0.084792ms)
ℹ tests 14
ℹ suites 0
ℹ pass 14
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 81.265458
DI-seam guard: OK — 982 production src/ files scanned, 7 approved seam(s) found, no unapproved seams.

[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

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

[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.14 powered by rolldown v1.2.5
ℹ config file: /Users/thymikee/.codex/worktrees/572f/agent-device/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 332 files
ℹ dist/src/internal/daemon.js 106.88 kB │ gzip: 32.14 kB
ℹ dist/src/internal/companion-tunnel.js 8.38 kB │ gzip: 3.22 kB
ℹ dist/src/internal/bin.js 1.73 kB │ gzip: 0.74 kB
ℹ dist/src/android-adb.js 1.66 kB │ gzip: 0.73 kB
ℹ dist/src/ai-sdk.js 1.38 kB │ gzip: 0.78 kB
ℹ dist/src/internal/png-worker.js 1.10 kB │ gzip: 0.55 kB
ℹ dist/src/limrun.js 0.96 kB │ gzip: 0.36 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 233.55 kB │ gzip: 67.42 kB
ℹ dist/src/registry.js 153.16 kB │ gzip: 46.17 kB
ℹ dist/src/cli-help.js 89.39 kB │ gzip: 30.50 kB
ℹ dist/src/device-claim-conflict.js 88.76 kB │ gzip: 26.84 kB
ℹ dist/src/sdk-batch-runner.js 78.22 kB │ gzip: 19.63 kB
ℹ dist/src/runtime.js 63.91 kB │ gzip: 19.70 kB
ℹ dist/src/src2.js 48.84 kB │ gzip: 14.62 kB
ℹ dist/src/session-store.js 48.21 kB │ gzip: 15.16 kB
ℹ dist/src/runtime4.js 46.05 kB │ gzip: 12.20 kB
ℹ dist/src/app-inventory-contract.js 44.48 kB │ gzip: 14.83 kB
ℹ dist/src/daemon-client-lifecycle.js 42.24 kB │ gzip: 13.48 kB
ℹ dist/src/runner-disposal.js 41.34 kB │ gzip: 13.32 kB
ℹ dist/src/runtime2.js 41.00 kB │ gzip: 11.95 kB
ℹ dist/src/session-snapshot.js 38.82 kB │ gzip: 12.38 kB
ℹ dist/src/interaction.js 36.97 kB │ gzip: 10.94 kB
ℹ dist/src/runner-client.js 36.28 kB │ gzip: 10.98 kB
ℹ dist/src/png-worker-contract.js 30.33 kB │ gzip: 9.34 kB
ℹ dist/src/snapshot.js 29.38 kB │ gzip: 9.37 kB
ℹ dist/src/cli.js 27.43 kB │ gzip: 9.04 kB
ℹ dist/src/snapshot-helper-session.js 24.82 kB │ gzip: 7.66 kB
ℹ dist/src/src4.js 23.66 kB │ gzip: 7.16 kB
ℹ dist/src/connection.js 23.00 kB │ gzip: 7.33 kB
ℹ dist/src/apps.js 22.85 kB │ gzip: 7.53 kB
ℹ dist/src/physical-device-control.js 22.34 kB │ gzip: 7.24 kB
ℹ dist/src/perf.js 22.34 kB │ gzip: 7.27 kB
ℹ dist/src/output.js 22.29 kB │ gzip: 7.93 kB
ℹ dist/src/selector-runtime.js 22.09 kB │ gzip: 7.17 kB
ℹ dist/src/sdk-android-adb.js 21.73 kB │ gzip: 7.62 kB
ℹ dist/src/script.js 20.77 kB │ gzip: 6.48 kB
ℹ dist/src/command-tools.js 19.56 kB │ gzip: 7.05 kB
ℹ dist/src/connection-runtime.js 19.33 kB │ gzip: 6.25 kB
ℹ dist/src/screen-recording-resource-recovery.js 19.26 kB │ gzip: 5.92 kB
ℹ dist/src/src3.js 19.22 kB │ gzip: 6.18 kB
ℹ dist/src/src.js 18.98 kB │ gzip: 6.26 kB
ℹ dist/src/reporting.js 18.19 kB │ gzip: 6.31 kB
ℹ dist/src/agent-browser-provider.js 17.86 kB │ gzip: 6.50 kB
ℹ dist/src/platform-runtime-operation-host.js 17.63 kB │ gzip: 5.28 kB
ℹ dist/src/agent-device-client.js 17.25 kB │ gzip: 5.86 kB
ℹ dist/src/runtime6.js 16.88 kB │ gzip: 5.32 kB
ℹ dist/src/android.js 16.71 kB │ gzip: 6.24 kB
ℹ dist/src/app-log-runtime2.js 16.20 kB │ gzip: 5.11 kB
ℹ dist/src/interactor.js 15.21 kB │ gzip: 5.13 kB
ℹ dist/src/debug-symbols.js 14.25 kB │ gzip: 5.35 kB
ℹ dist/src/screenshot-runtime.js 14.12 kB │ gzip: 5.26 kB
ℹ dist/src/client-metro.js 14.10 kB │ gzip: 5.13 kB
ℹ dist/src/platform-runtime.js 11.66 kB │ gzip: 3.66 kB
ℹ dist/src/sdk-contracts.js 10.96 kB │ gzip: 4.44 kB
ℹ dist/src/install-source2.js 10.91 kB │ gzip: 4.09 kB
ℹ dist/src/dispatch.js 10.72 kB │ gzip: 4.13 kB
ℹ dist/src/agent-browser-tool.js 9.96 kB │ gzip: 3.74 kB
ℹ dist/src/replay.js 9.41 kB │ gzip: 3.22 kB
ℹ dist/src/platform-runtime2.js 9.41 kB │ gzip: 2.61 kB
ℹ dist/src/runtime9.js 9.05 kB │ gzip: 3.04 kB
ℹ dist/src/script-source-bundle.js 8.65 kB │ gzip: 3.30 kB
ℹ dist/src/auth-session.js 8.49 kB │ gzip: 2.93 kB
ℹ dist/src/video.js 8.28 kB │ gzip: 3.44 kB
ℹ dist/src/snapshot-runtime.js 8.26 kB │ gzip: 2.83 kB
ℹ dist/src/byte-limit-stream.js 8.15 kB │ gzip: 2.94 kB
ℹ dist/src/server.js 7.88 kB │ gzip: 3.37 kB
ℹ dist/src/proxy.js 7.78 kB │ gzip: 3.12 kB
ℹ dist/src/ime-lifecycle.js 7.41 kB │ gzip: 2.48 kB
ℹ dist/src/input-actions.js 7.33 kB │ gzip: 2.79 kB
ℹ dist/src/runner-lease.js 7.23 kB │ gzip: 2.84 kB
ℹ dist/src/find.js 7.21 kB │ gzip: 2.96 kB
ℹ dist/src/keyboard-runtime.js 7.09 kB │ gzip: 1.84 kB
ℹ dist/src/app-lifecycle.js 7.08 kB │ gzip: 2.64 kB
ℹ dist/src/command-schema.js 7.08 kB │ gzip: 2.77 kB
ℹ dist/src/snapshot2.js 7.05 kB │ gzip: 2.45 kB
ℹ dist/src/record-runtime.js 7.03 kB │ gzip: 2.48 kB
ℹ dist/src/inventory.js 7.01 kB │ gzip: 2.87 kB
ℹ dist/src/snapshot-runtime-binding.js 6.65 kB │ gzip: 2.23 kB
ℹ dist/src/interactors.js 6.52 kB │ gzip: 2.19 kB
ℹ dist/src/harmonyos.js 6.47 kB │ gzip: 2.61 kB
ℹ dist/src/app-resolution.js 6.26 kB │ gzip: 2.53 kB
ℹ dist/src/client-metro-companion.js 6.22 kB │ gzip: 2.20 kB
ℹ dist/src/gesture-plan.js 6.09 kB │ gzip: 2.28 kB
ℹ dist/src/linux.js 5.89 kB │ gzip: 2.10 kB
ℹ dist/src/platform-runtime-app-log-process.js 5.82 kB │ gzip: 2.30 kB
ℹ dist/src/fill-verification.js 5.78 kB │ gzip: 2.11 kB
ℹ dist/src/sdk-device.js 5.66 kB │ gzip: 2.10 kB
ℹ dist/src/cli-config.js 5.20 kB │ gzip: 2.34 kB
ℹ dist/src/snapshot-chrome.js 5.14 kB │ gzip: 1.73 kB
ℹ dist/src/platform-runtime-runtime-hints.js 5.08 kB │ gzip: 2.14 kB
ℹ dist/src/snapshot-lines.js 5.02 kB │ gzip: 2.00 kB
ℹ dist/src/runtime7.js 4.99 kB │ gzip: 1.77 kB
ℹ dist/src/helper-package-install.js 4.96 kB │ gzip: 1.98 kB
ℹ dist/src/snapshot3.js 4.95 kB │ gzip: 2.24 kB
ℹ dist/src/platform-runtime-screen-recording-apple-simulator-host.js 4.94 kB │ gzip: 1.96 kB
ℹ dist/src/inventory2.js 4.87 kB │ gzip: 1.98 kB
ℹ dist/src/capture.js 4.71 kB │ gzip: 1.61 kB
ℹ dist/src/parser.js 4.69 kB │ gzip: 1.69 kB
ℹ dist/src/application-lifecycle-interaction.js 4.60 kB │ gzip: 1.62 kB
ℹ dist/src/helper.js 4.48 kB │ gzip: 1.96 kB
ℹ dist/src/react-native-overlay.js 4.44 kB │ gzip: 1.92 kB
ℹ dist/src/artifact-tracking.js 4.32 kB │ gzip: 1.72 kB
ℹ dist/src/tool-provider.js 4.20 kB │ gzip: 1.70 kB
ℹ dist/src/android-system-chrome.js 4.18 kB │ gzip: 1.69 kB
ℹ dist/src/png-resize.js 4.11 kB │ gzip: 1.83 kB
ℹ dist/src/device-input-state.js 4.02 kB │ gzip: 1.65 kB
ℹ dist/src/alert-detection.js 3.98 kB │ gzip: 1.61 kB
ℹ dist/src/daemon.js 3.83 kB │ gzip: 1.53 kB
ℹ dist/src/runtime8.js 3.82 kB │ gzip: 1.37 kB
ℹ dist/src/boot-diagnostics.js 3.76 kB │ gzip: 1.51 kB
ℹ dist/src/platform-runtime-screen-recording-android-host.js 3.76 kB │ gzip: 1.50 kB
ℹ dist/src/device-claim-inspection.js 3.75 kB │ gzip: 1.54 kB
ℹ dist/src/interaction-runtime.js 3.70 kB │ gzip: 1.54 kB
ℹ dist/src/lease.js 3.67 kB │ gzip: 1.51 kB
ℹ dist/src/mobile-snapshot-semantics.js 3.67 kB │ gzip: 1.46 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.33 kB
ℹ dist/src/platform-runtime-screen-recording-finalizer-host.js 3.37 kB │ gzip: 1.45 kB
ℹ dist/src/touch-runtime.js 3.34 kB │ gzip: 1.25 kB
ℹ dist/src/simulator.js 3.24 kB │ gzip: 1.45 kB
ℹ dist/src/session-target-evidence.js 3.23 kB │ gzip: 1.28 kB
ℹ dist/src/retry.js 3.17 kB │ gzip: 1.17 kB
ℹ dist/src/platform-runtime-open-target.js 3.10 kB │ gzip: 1.30 kB
ℹ dist/src/scroll-gesture.js 3.06 kB │ gzip: 1.21 kB
ℹ dist/src/snapshot-diagnostics.js 2.81 kB │ gzip: 1.12 kB
ℹ dist/src/app-lifecycle2.js 2.80 kB │ gzip: 1.30 kB
ℹ dist/src/manifest.js 2.67 kB │ gzip: 1.22 kB
ℹ dist/src/platform-runtime-unavailable.js 2.65 kB │ gzip: 1.08 kB
ℹ dist/src/sdk-remote-config.js 2.63 kB │ gzip: 0.85 kB
ℹ dist/src/update-check.js 2.63 kB │ gzip: 1.25 kB
ℹ dist/src/interaction-positionals.js 2.59 kB │ gzip: 1.15 kB
ℹ dist/src/host-process.js 2.52 kB │ gzip: 1.05 kB
ℹ dist/src/platform-runtime-screen-recording-apple-runner-transport.js 2.40 kB │ gzip: 0.99 kB
ℹ dist/src/app-log-reconnect.js 2.40 kB │ gzip: 1.00 kB
ℹ dist/src/lease-scope.js 2.38 kB │ gzip: 0.64 kB
ℹ dist/src/emulator-lifecycle.js 2.29 kB │ gzip: 1.01 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.05 kB
ℹ dist/src/limrun-runtime-dependencies.js 2.22 kB │ gzip: 0.95 kB
ℹ dist/src/interaction-common.js 2.12 kB │ gzip: 0.98 kB
ℹ dist/src/verdict.js 2.06 kB │ gzip: 0.75 kB
ℹ dist/src/device2.js 2.04 kB │ gzip: 0.91 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/code-signature-cache.js 1.94 kB │ gzip: 0.93 kB
ℹ dist/src/ime-recovery-marker.js 1.92 kB │ gzip: 0.91 kB
ℹ dist/src/settings.js 1.90 kB │ gzip: 0.82 kB
ℹ dist/src/verified-file.js 1.85 kB │ gzip: 0.89 kB
ℹ dist/src/record-trace.js 1.81 kB │ gzip: 0.82 kB
ℹ dist/src/app-deployment-resolution.js 1.79 kB │ gzip: 0.94 kB
ℹ dist/src/snapshot-desktop-surface.js 1.78 kB │ gzip: 0.90 kB
ℹ dist/src/http-health.js 1.71 kB │ gzip: 0.82 kB
ℹ dist/src/inventory3.js 1.71 kB │ gzip: 0.91 kB
ℹ dist/src/app-helpers.js 1.66 kB │ gzip: 0.80 kB
ℹ dist/src/remote-config2.js 1.65 kB │ gzip: 0.77 kB
ℹ dist/src/session-runtime-admission.js 1.62 kB │ gzip: 0.84 kB
ℹ dist/src/daemon-shutdown-report.js 1.57 kB │ gzip: 0.64 kB
ℹ dist/src/request-cancellation.js 1.52 kB │ gzip: 0.70 kB
ℹ dist/src/sdk-io.js 1.48 kB │ gzip: 0.77 kB
ℹ dist/src/android-input-ownership.js 1.44 kB │ gzip: 0.60 kB
ℹ dist/src/code-signature.js 1.42 kB │ gzip: 0.73 kB
ℹ dist/src/tv-remote.js 1.42 kB │ gzip: 0.59 kB
ℹ dist/src/process-lock.js 1.41 kB │ gzip: 0.75 kB
ℹ dist/src/inventory5.js 1.40 kB │ gzip: 0.83 kB
ℹ dist/src/screenshot-result.js 1.35 kB │ gzip: 0.49 kB
ℹ dist/src/tool-provider3.js 1.34 kB │ gzip: 0.62 kB
ℹ dist/src/type-text-runtime.js 1.34 kB │ gzip: 0.75 kB
ℹ dist/src/config.js 1.30 kB │ gzip: 0.63 kB
ℹ dist/src/auth.js 1.28 kB │ gzip: 0.59 kB
ℹ dist/src/screen-recording-live-handle.js 1.21 kB │ gzip: 0.61 kB
ℹ dist/src/web.js 1.19 kB │ gzip: 0.59 kB
ℹ dist/src/cancel.js 1.18 kB │ gzip: 0.65 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/app-parsers.js 1.17 kB │ gzip: 0.61 kB
ℹ dist/src/url.js 1.14 kB │ gzip: 0.52 kB
ℹ dist/src/screenshot-density.js 1.13 kB │ gzip: 0.64 kB
ℹ dist/src/lease-context.js 1.12 kB │ gzip: 0.45 kB
ℹ dist/src/device-inventory-context.js 1.11 kB │ gzip: 0.57 kB
ℹ dist/src/sdk.js 1.10 kB │ gzip: 0.60 kB
ℹ dist/src/compatibility-policy.js 1.09 kB │ gzip: 0.47 kB
ℹ dist/src/runtime-admission.js 1.06 kB │ gzip: 0.53 kB
ℹ dist/src/async-lifecycle.js 1.02 kB │ gzip: 0.46 kB
ℹ dist/src/back-mode.js 0.99 kB │ gzip: 0.50 kB
ℹ dist/src/runtime5.js 0.99 kB │ gzip: 0.51 kB
ℹ dist/src/gesture-admission.js 0.94 kB │ gzip: 0.53 kB
ℹ dist/src/apple-multitouch-support.js 0.94 kB │ gzip: 0.50 kB
ℹ dist/src/generic.js 0.92 kB │ gzip: 0.50 kB
ℹ dist/src/generic-settle.js 0.88 kB │ gzip: 0.44 kB
ℹ dist/src/hdc.js 0.88 kB │ gzip: 0.54 kB
ℹ dist/src/device-ready.js 0.87 kB │ gzip: 0.47 kB
ℹ dist/src/app-state.js 0.87 kB │ gzip: 0.48 kB
ℹ dist/src/device.js 0.86 kB │ gzip: 0.43 kB
ℹ dist/src/device-rotation.js 0.86 kB │ gzip: 0.40 kB
ℹ dist/src/application-lifecycle-runtime.js 0.85 kB │ gzip: 0.36 kB
ℹ dist/src/error-candidates.js 0.82 kB │ gzip: 0.42 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/platform-runtime-screen-recording-apple-transport.js 0.75 kB │ gzip: 0.46 kB
ℹ dist/src/scroll-command.js 0.72 kB │ gzip: 0.42 kB
ℹ dist/src/observability.js 0.72 kB │ gzip: 0.38 kB
ℹ dist/src/interactor-operation-catalog.js 0.72 kB │ gzip: 0.36 kB
ℹ dist/src/runtime3.js 0.70 kB │ gzip: 0.42 kB
ℹ dist/src/runner-provider.js 0.70 kB │ gzip: 0.38 kB
ℹ dist/src/atomic-file.js 0.70 kB │ gzip: 0.43 kB
ℹ dist/src/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/interaction-snapshot.js 0.65 kB │ gzip: 0.37 kB
ℹ dist/src/owner-identity.js 0.65 kB │ gzip: 0.36 kB
ℹ dist/src/daemon-process.js 0.64 kB │ gzip: 0.39 kB
ℹ dist/src/snapshot-scope.js 0.63 kB │ gzip: 0.39 kB
ℹ dist/src/ttl-memo.js 0.62 kB │ gzip: 0.36 kB
ℹ dist/src/entities.js 0.60 kB │ gzip: 0.35 kB
ℹ dist/src/version.js 0.60 kB │ gzip: 0.37 kB
ℹ dist/src/audio-probe.js 0.60 kB │ gzip: 0.37 kB
ℹ dist/src/open-target.js 0.59 kB │ gzip: 0.38 kB
ℹ dist/src/app-resolution-cache.js 0.55 kB │ gzip: 0.35 kB
ℹ dist/src/simctl.js 0.52 kB │ gzip: 0.29 kB
ℹ dist/src/scroll-indicator.js 0.50 kB │ gzip: 0.32 kB
ℹ dist/src/platform-runtime-network-web-transport.js 0.49 kB │ gzip: 0.31 kB
ℹ dist/src/location-coordinates.js 0.48 kB │ gzip: 0.31 kB
ℹ dist/src/android-snapshot-quality.js 0.48 kB │ gzip: 0.28 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/apple-runner-options.js 0.43 kB │ gzip: 0.23 kB
ℹ dist/src/logcat.js 0.43 kB │ gzip: 0.31 kB
ℹ dist/src/screen-recording-completion.js 0.40 kB │ gzip: 0.23 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/screen-recording-options.js 0.38 kB │ gzip: 0.26 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/provider.js 0.37 kB │ gzip: 0.22 kB
ℹ dist/src/snapshot-private-evidence.js 0.36 kB │ gzip: 0.20 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/adb.js 0.35 kB │ gzip: 0.26 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/status-markers.js 0.30 kB │ gzip: 0.23 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/device-isolation.js 0.28 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/app-inventory.js 0.26 kB │ gzip: 0.21 kB
ℹ dist/src/command-surface.js 0.25 kB │ gzip: 0.19 kB
ℹ dist/src/prepare-kind.js 0.25 kB │ gzip: 0.21 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/startup-recovery-fence.js 0.21 kB │ gzip: 0.16 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/success-text.js 0.20 kB │ gzip: 0.14 kB
ℹ dist/src/process-entry.js 0.19 kB │ gzip: 0.16 kB
ℹ dist/src/touch-reference-frame.js 0.19 kB │ gzip: 0.16 kB
ℹ dist/src/handler-utils.js 0.19 kB │ gzip: 0.15 kB
ℹ dist/src/interactor-types.js 0.18 kB │ gzip: 0.14 kB
ℹ dist/src/shared.js 0.18 kB │ gzip: 0.17 kB
ℹ dist/src/cli-grammar.js 0.18 kB │ gzip: 0.17 kB
ℹ dist/src/launch-console.js 0.18 kB │ gzip: 0.14 kB
ℹ dist/src/runner-selector-query.js 0.17 kB │ gzip: 0.16 kB
ℹ dist/src/timing-safe-equal.js 0.17 kB │ gzip: 0.14 kB
ℹ dist/src/metro2.js 0.17 kB │ gzip: 0.13 kB
ℹ dist/src/snapshot-helper.js 0.17 kB │ gzip: 0.14 kB
ℹ dist/src/config2.js 0.16 kB │ gzip: 0.13 kB
ℹ dist/src/method-scope.js 0.16 kB │ gzip: 0.14 kB
ℹ dist/src/app-log-probe.js 0.14 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/apple-os-display-names.js 0.12 kB │ gzip: 0.10 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/keyboard-actions.js 0.10 kB │ gzip: 0.10 kB
ℹ dist/src/doctor-progress.js 0.08 kB │ gzip: 0.09 kB
ℹ dist/src/perf-utils.js 0.08 kB │ gzip: 0.09 kB
ℹ dist/src/alert-contract.js 0.08 kB │ gzip: 0.10 kB
ℹ dist/src/timeouts.js 0.07 kB │ gzip: 0.09 kB
ℹ dist/src/screen-recording-runtime.js 0.04 kB │ gzip: 0.06 kB
ℹ dist/src/app-log-runtime.js 0.03 kB │ gzip: 0.05 kB
ℹ dist/src/gesture-plan-types.js 0.03 kB │ gzip: 0.05 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 56.08 kB │ gzip: 14.11 kB
ℹ dist/src/sdk-selectors.d.ts 29.61 kB │ gzip: 9.10 kB
ℹ dist/src/sdk-contracts.d.ts 18.09 kB │ gzip: 6.37 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
ℹ 331 files, total: 2.57 MB
✔ Build complete in 1813ms

[run] package: pnpm run check:package
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
Packing and verifying agent-device in /private/var/folders/65/fz9_2bsj6fzgct46vx226s8c0000gn/T/agent-device-package-m9ReRG
Linted the tarball with publint and attw.
Verified the dependency closure: @limrun/api, ai, ipaddr.js, tar-stream, undici, yaml, yauzl.
Imported all 13 published entry points from a clean install.
Ran the published CLI 0.20.10 on Node 26.1.0.
The package npm would publish is sound.

[run] integration-node: pnpm run test:integration:node
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ Android coverage report persists the manifest rollup and executed tier (3.214041ms)
✔ exitAfterFlush (the #1596 fix) delivers the full write before the process exits (69.473291ms)
✔ the CLI success entrypoint flushes a complete JSON envelope before exit 0 (82.019541ms)
✔ the real source CLI flushes a complete successful snapshot response before exit 0 (232.50325ms)
✔ recognizes known free names when TypeScript prints a relative snippet path (0.235834ms)
✔ every fenced ```ts snippet in client-api.md compiles against agent-device's real exports (1782.041458ms)
✔ rejects an unrecognized free identifier instead of silently stubbing it (e.g. a typo of client) (221.886583ms)
✔ the leak oracle CLI refuses an after-close checkpoint that names no session (240.983875ms)
✔ the leak oracle CLI reads an exact daemon-owned process record (217.492459ms)
✔ daemon replace mid-command returns a structured, parseable error and exits normally (1485.295334ms)
✔ installed package exposes Node APIs and packaged companion tunnel entrypoint (2507.579458ms)
✔ a dead session (SESSION_NOT_FOUND) skips cleanup without error, on any step (0.156625ms)
✔ the known mic-permission appless response stops retrying immediately (0.077042ms)
✔ a different INVALID_ARGS still fails after exhausting retries (0.781083ms)
✔ a different INVALID_ARGS message on the mic-permission step still fails after retries (0.322958ms)
✔ sessionOpen=true, final sessionExists=false: cleanup is never invoked (0.131959ms)
✔ sessionOpen=true, final sessionExists=true: cleanup is invoked (the live path) (0.059791ms)
✔ an existing offscreen element scrolls until the visibility probe passes (0.1315ms)
✔ a stalled capture retries without scrolling or consuming an attempt (0.064959ms)
✔ compiled Limrun subpath preserves its downstream type surface (271.831916ms)
﹣ recording tap overlay on iOS simulator (0.043917ms) # set AGENT_DEVICE_RECORDING_E2E=1 to run live recording overlay tests
﹣ recording scroll overlay on iOS simulator (0.021708ms) # set AGENT_DEVICE_RECORDING_E2E=1 to run live recording overlay tests
﹣ recording back-swipe overlay on iOS simulator (0.024125ms) # set AGENT_DEVICE_RECORDING_E2E=1 to run live recording overlay tests
﹣ recording tap overlay on Android emulator (0.01575ms) # set AGENT_DEVICE_RECORDING_E2E=1 to run live recording overlay tests
﹣ recording scroll overlay on Android emulator (0.0155ms) # set AGENT_DEVICE_RECORDING_E2E=1 to run live recording overlay tests
✔ separate CLI processes do not adopt and overwrite the ambient remote session (516.029625ms)
✔ Android emulator coverage exhaustively classifies the public catalog (0.126792ms)
✔ Android coverage report summary accounts for every manifest classification (0.061709ms)
✔ Android live command ownership is structural and exhaustive (0.229917ms)
✔ Android app scenarios declare deterministic starting surfaces and IME modes (0.101959ms)
✔ Android permission recovery waits for the asynchronous native prompt (0.02625ms)
✔ Android emulator scenarios can be selected as an ordered subset (0.288375ms)
✔ Android emulator coverage completeness is scoped to the executed subset (0.760667ms)
✔ Android command-contract declarations are unique and exhaustive (0.059667ms)
✔ Android behavior patterns are owned by live fixture journeys (0.084584ms)
✔ Android catalog denials exclude fact-owned runtime commands (0.041084ms)
﹣ live Android emulator fixture E2E (0.014667ms) # Set AGENT_DEVICE_ANDROID_E2E=1 with fixture APK path/id and emulator serial to run.
✔ clean-xcuitest ios removes only transient root entries and reports preserved cache entries (32.703708ms)
✔ clean-xcuitest ios reports a no-op when only preserved entries remain (30.978708ms)
✔ clean-xcuitest macos skips a missing derived directory (30.460875ms)
✔ clean-xcuitest macos removes the entire platform directory when present (30.724084ms)
✔ clean-xcuitest reports cleanup failures directly (31.051625ms)
✔ cli --help returns usage (355.477042ms)
✔ cli --version prints semver and exits 0 (60.941708ms)
✔ cli -V prints semver and exits 0 (66.347ms)
✔ cli without command prints usage and exits 1 (177.827958ms)
✔ clean daemon script stops a live daemon before removing metadata (953.715ms)
✔ daemon HTTP transport starts from CLI and accepts a command RPC (757.957834ms)
✔ iOS runner status transport stays visible while command execution remains serial (303.770959ms)
✔ iOS simulator coverage exhaustively classifies the public catalog (0.115666ms)
✔ live command claims are owned by executable scenarios (0.553834ms)
✔ mobile behavior patterns are owned by live scenarios or executable workflows (0.551375ms)
✔ non-live owners name concrete executable repository evidence (1.815458ms)
✔ fixture identifier coverage rejects direct-selector drift (0.2455ms)
✔ live iOS scenarios reference fixture identifiers that exist (2.756041ms)
✔ capability classifications match executable simulator behavior (0.164042ms)
✔ fixture replay gestures fit the smallest supported iPhone viewport (2.341667ms)
✔ drag replay fixtures use parseable source and destination selectors (0.649167ms)
✔ fixture navigation uses edge-aware traversal without losing direct swipe evidence (0.105708ms)
✔ fixture navigation establishes the home route before selecting Catalog (0.092208ms)
✔ event timeline coverage follows cursors beyond the first page (0.148875ms)
✔ event timeline coverage rejects malformed and non-advancing pages (0.1775ms)
✔ event timeline coverage fails fast on runaway pagination (0.256291ms)
﹣ live iOS simulator fixture E2E (0.019042ms) # Set AGENT_DEVICE_IOS_E2E=1 with fixture path/id and simulator UDID to run.
✔ snapshot backend conformance checks each backend contract independently (0.358583ms)
✔ snapshot backend conformance rejects every promised control invariant (0.46825ms)
✔ backend forcing stays in the test-owned daemon transport seam (0.059875ms)
✔ Linux coverage exhaustively classifies the public catalog (0.072667ms)
✔ Linux coverage report has the expected classification counts (0.028209ms)
✔ Linux live claims reference commands in the existing smoke replay (0.511ms)
✔ Linux command-evidence claims name every executable lane command (0.635583ms)
✔ Linux contract claims name existing executable evidence (1.14625ms)
✔ Linux capability denials match the owning descriptor matrix (0.781292ms)
✔ Linux known gaps use one grouped tracking issue (0.036625ms)
✔ macOS coverage exhaustively classifies the public catalog (0.086625ms)
✔ macOS coverage report counts every manifest classification (0.028542ms)
✔ macOS live claims reference commands in existing executable scenarios (0.745625ms)
✔ macOS non-live evidence owners name existing executable repository evidence (1.969875ms)
✔ macOS capability-denial rows match the owning capability matrix (0.092958ms)
✔ macOS known gaps use one grouped tracking issue (0.045167ms)
✔ macOS coverage report persists the manifest rollup and live command list (1.035792ms)
✔ connect prepares Metro and open reuses bridged runtime for remote daemon (55.213333ms)
✔ built CLI provider flow closes active generated session before disconnect cleanup (413.233875ms)
✔ tvOS coverage exhaustively classifies the public catalog (0.109458ms)
✔ tvOS coverage report has the expected classification counts (0.03975ms)
✔ tvOS contract claims name existing executable evidence (1.775792ms)
✔ tvOS provider contract claims only commands executed by the existing scenario (0.067333ms)
✔ tvOS capability denials match the mechanical capability matrix (0.094375ms)
✔ tvOS gesture contract preserves the typed multi-touch denial (22.866375ms)
✔ tvOS known gaps use one grouped tracking issue (0.064625ms)
✔ web coverage exhaustively classifies the public catalog (0.091208ms)
✔ web coverage report has the expected classification counts (0.03ms)
✔ web live claims reference commands in the existing smoke scenario (1.931208ms)
✔ web contract claims name existing executable evidence (2.913083ms)
✔ web capability denials match the mechanical capability matrix (0.096542ms)
✔ web known gaps use one grouped tracking issue (0.067334ms)
✔ web coverage report persists the manifest rollup and live command list (0.834041ms)
✔ web coverage report survives a failed close cleanup (0.42075ms)
✔ web cleanup error is preserved when report writing also fails (0.518167ms)
﹣ live web platform e2e smoke (0.025375ms) # Set AGENT_DEVICE_WEB_E2E=1 to run the managed web backend smoke.
﹣ live web platform e2e daemon-shutdown browser cleanup (0.018083ms) # Set AGENT_DEVICE_WEB_E2E=1 to run the managed web backend smoke.
ℹ tests 101
ℹ suites 0
ℹ pass 92
ℹ fail 0
ℹ cancelled 0
ℹ skipped 9
ℹ todo 0
ℹ duration_ms 11255.842125

[run] macos-coverage: pnpm run test:integration:macos-coverage
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ macOS coverage exhaustively classifies the public catalog (0.676083ms)
✔ macOS coverage report counts every manifest classification (0.072875ms)
✔ macOS live claims reference commands in existing executable scenarios (0.415708ms)
✔ macOS non-live evidence owners name existing executable repository evidence (1.250792ms)
✔ macOS capability-denial rows match the owning capability matrix (0.236417ms)
✔ macOS known gaps use one grouped tracking issue (0.06475ms)
✔ macOS coverage report persists the manifest rollup and live command list (1.991833ms)
ℹ tests 7
ℹ suites 0
ℹ pass 7
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 114.657667

[run] vitest-related: pnpm exec vitest related --run --passWithNoTests --maxWorkers=2 packages/contracts/src/facades/divergence.ts packages/contracts/src/replay-divergence.test.ts packages/contracts/src/replay-divergence.ts src/tests/eager-closure-budgets.ts src/daemon/tests/code-signature-cache.test.ts src/daemon/tests/daemon-process-takeover.test.ts src/daemon/tests/daemon-process.test.ts src/daemon/client/tests/daemon-launch-spec.test.ts src/daemon/client/daemon-client-lifecycle.ts src/daemon/client/daemon-launch-spec.ts src/daemon/code-signature-cache.ts src/daemon/code-signature.ts src/daemon/daemon-process.ts src/daemon/session-replay-coordinator.ts src/utils/tests/daemon-client.test.ts src/utils/tests/version.test.ts src/utils/version.ts test/integration/smoke-web-platform.test.ts vitest.config.ts
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0

RUN v4.1.11 /Users/thymikee/.codex/worktrees/572f/agent-device

✓ |interaction-contract| test/integration/interaction-contract/coordinate.contract.test.ts (6 tests) 3196ms
✓ coordinate errorTaxonomy: backend failure surfaces as a normalized daemon error 1435ms
✓ coordinate responseConstruction: daemon press x y response carries the canonical point field set 887ms
✓ coordinate resolutionDisclosure: inapplicable — no resolution field is attached 841ms
✓ |interaction-contract| test/integration/interaction-contract/maestro-fallback.contract.test.ts (4 tests) 3487ms
✓ maestro-non-hittable-fallback responseConstruction: fallback tap response carries the canonical field set and fallback markers 1123ms
✓ runtime fill the coordinate fallback did not execute keeps its resolution disclosure 763ms
✓ Maestro fill of a non-hittable input resolves through the runtime path 774ms
✓ maestro-non-hittable-fallback offscreen: runner rejects an element without a tappable frame 826ms
✓ |interaction-contract| test/integration/interaction-contract/interaction-response-shape.contract.test.ts (10 tests) 8197ms
✓ interaction response shape: press @ref uses the canonical ref envelope 1317ms
✓ interaction response shape: fill @ref uses the canonical ref envelope 807ms
✓ interaction response shape: longpress @ref uses the canonical ref envelope 875ms
✓ interaction response shape: press selector uses the canonical selector envelope 702ms
✓ interaction response shape: fill selector uses the canonical selector envelope 878ms
✓ interaction response shape: longpress selector uses the canonical selector envelope 766ms
✓ interaction response shape: press point uses the canonical point envelope 755ms
✓ interaction response shape: fill point uses the canonical point envelope 675ms
✓ interaction response shape: type tolerates a zero-sized runner reference frame 713ms
✓ interaction response shape: longpress point uses the canonical point envelope 708ms
✓ |interaction-contract| test/integration/interaction-contract/maestro-direct-selector.contract.test.ts (1 test) 951ms
✓ maestro-direct-selector responseConstruction and resolutionDisclosure: allowed fallback not taken keeps direct-iOS resolution 951ms
✓ |interaction-contract| test/integration/interaction-contract/runtime-ref.contract.test.ts (11 tests) 992ms
✓ runtime-ref responseConstruction: daemon press @ref response carries the canonical ref field set 954ms
✓ |interaction-contract| test/integration/interaction-contract/runtime-selector.contract.test.ts (14 tests) 1047ms
✓ runtime-selector responseConstruction: daemon press response carries the canonical selector field set 1009ms
✓ |interaction-contract| test/integration/interaction-contract/native-ref.contract.test.ts (8 tests) 35ms
✓ |output-economy| test/output-economy/output-economy.baseline.test.ts (14 tests) 4ms
✓ |interaction-contract| test/integration/interaction-contract/target-drag.contract.test.ts (6 tests) 846ms
✓ target-drag responseConstruction: daemon response carries the canonical dual-target gesture shape 839ms
✓ |output-economy| test/output-economy/routine-workflow.test.ts (7 tests) 4ms
✓ |provider-integration| test/integration/provider-scenarios/android-lifecycle.test.ts (12 tests) 9171ms
✓ Provider-backed integration Android Settings flow uses scripted ADB provider 7009ms
✓ Provider-backed integration Android text provider handles Unicode without shell input text 619ms
✓ |provider-integration| test/integration/provider-scenarios/android-test-suite.test.ts (7 tests) 13736ms
✓ Provider-backed integration Android replay test suite covers retries and fail-fast flags 907ms
✓ Provider-backed integration Android Maestro refreshes action geometry and preserves authored swipe points 1217ms
✓ Provider-backed integration Android Maestro replay test suite discovers YAML flows in directories 1132ms
✓ Provider-backed integration Android Maestro types after tapOn inputText without trailing Enter 1096ms
✓ Provider-backed integration Android Maestro preserves authored inputText then pressKey Enter 1069ms
✓ Provider-backed integration Android Maestro executes runFlow conditions and retry batches at runtime 663ms
✓ Provider-backed integration Android Maestro optional tap misses without touching the device 7653ms
✓ |provider-integration| test/integration/provider-scenarios/active-session-script-publication.test.ts (8 tests) 6536ms
✓ provider route publishes and replays an open-to-destination script with a live handoff 504ms
✓ replaying a published script against a reshuffled screen fails closed instead of false-passing the guard 1969ms
✓ parameterized fill publishes only ${VAR} and replay resolves it immediately before fill 1910ms
#1398: a read-only wait recorded after a parameterized fill never re-serializes an app-rendered echo, and cannot serve as the destination guard 969ms
✓ |provider-integration| test/integration/provider-scenarios/doctor.test.ts (9 tests) 4590ms
✓ Provider-backed integration doctor infers Android RN/Metro readiness through daemon route without resolving a default device 842ms
✓ Provider-backed integration doctor runs predictably for supported platform selectors 1426ms
✓ Provider-backed integration doctor probes Metro when runtime metadata exists outside an RN project 1647ms
✓ |provider-integration| test/integration/provider-scenarios/interaction-direct-selector-fallback.test.ts (4 tests) 3087ms
✓ Provider-backed iOS selector wait accepts the owner observation and strips selectorChain 995ms
✓ Provider-backed iOS selector wait falls through to capture after an owner miss 698ms
✓ Provider-backed integration maestro replay dispatch keeps runner AMBIGUOUS_MATCH without fallback 716ms
✓ Provider-backed integration maestro replay dispatch keeps runner ELEMENT_OFFSCREEN without fallback 678ms
✓ |provider-integration| test/integration/provider-scenarios/apple-platform-output-guard.test.ts (3 tests) 6238ms
✓ macOS Apple session never emits the internal apple platform on the wire 1023ms
✓ iOS-simulator Apple session never emits the internal apple platform on the wire 5214ms
✓ |provider-integration| test/integration/provider-scenarios/settle-observation.test.ts (4 tests) 3488ms
✓ Provider-backed integration press --settle returns the settled diff and fresh refs 965ms
✓ Provider-backed integration never-settled press --settle does not issue diff refs 993ms
✓ Provider-backed integration modal-dismiss press --settle attaches the unchanged interactive tail 726ms
✓ Provider-backed integration fill --settle summoning the keyboard still attaches the unchanged interactive tail 804ms
✓ |provider-integration| test/integration/provider-scenarios/cloud-webdriver-ios-text-entry.test.ts (4 tests) 4205ms
✓ cloud iOS fill refuses, without typing, when nothing takes focus 2006ms
✓ cloud iOS fill sends no keys when a keyboard-up tap misses the second field 2005ms
✓ |provider-integration| test/integration/provider-scenarios/ios-lifecycle.test.ts (3 tests) 3059ms
✓ Provider-backed integration iOS Settings flow uses scripted simctl and runner providers 2072ms
✓ Provider-backed integration iOS regular snapshot preserves fixed bottom tabs after scroll content 710ms
✓ |provider-integration| test/integration/provider-scenarios/macos-recording.test.ts (3 tests) 2869ms
✓ Provider-backed integration macOS recording uses focused exact runner authority 586ms
✓ Provider-backed integration macOS recording rejects an invalid MP4 before artifact publication 2165ms
✓ |provider-integration| test/integration/provider-scenarios/record-trace-android-copy.test.ts (1 test) 2649ms
✓ Provider-backed integration Android record stop retries the pull until in-place moov finalization lands 2648ms
✓ |provider-integration| test/integration/provider-scenarios/stale-ref-warning.test.ts (2 tests) 1579ms
✓ Provider-backed integration iOS @refs reject after a selector press replaces the tree 852ms
✓ Provider-backed iOS press rejects a stale ref after navigation 727ms
✓ |provider-integration| test/integration/provider-scenarios/ios-record-trace.test.ts (2 tests) 1345ms
✓ Provider-backed integration iOS simulator recording flow uses the focused Apple transport 1254ms
✓ |provider-integration| test/integration/provider-scenarios/tvos-remote.test.ts (1 test) 1259ms
✓ Provider-backed integration tvOS remote flow maps navigation commands to runner remote presses 1258ms
✓ |provider-integration| test/integration/provider-scenarios/versioned-refs.test.ts (1 test) 963ms
✓ Provider-backed integration rejects stale pinned @refs and accepts current pins 962ms
✓ |provider-integration| test/integration/provider-scenarios/android-recording.test.ts (5 tests) 1506ms
✓ Provider-backed integration Android record start and stop use the composed scoped runtime 782ms
✓ Provider-backed integration Android record stop reattaches a matching durable descriptor 632ms
✓ |provider-integration| test/integration/provider-scenarios/interaction-verify.test.ts (1 test) 930ms
✓ Provider-backed integration press --verify returns post-action evidence digest 929ms
✓ |provider-integration| test/integration/provider-scenarios/session-close-leak-oracle.test.ts (1 test) 793ms
✓ Provider-backed integration closing a recording session leaves no unfinalized capture handle 792ms
✓ |provider-integration| test/integration/provider-scenarios/record-trace-android-liveness.test.ts (1 test) 649ms
✓ Provider-backed integration Android record stop finishes an artifact after a dead-pid reattach 649ms
✓ |provider-integration| test/integration/provider-scenarios/android-find.test.ts (1 test) 649ms
✓ Provider-backed integration Android find flow covers refs, wait, ambiguity, and first/last selection 648ms
✓ |provider-integration| test/integration/provider-scenarios/cloud-webdriver-runtime.test.ts (6 tests) 634ms
✓ |provider-integration| test/integration/provider-scenarios/web-desktop.test.ts (1 test) 651ms
✓ Provider-backed integration web desktop flow uses semantic web provider calls 650ms
✓ |provider-integration| test/integration/provider-scenarios/replay-repair-abort-close.test.ts (1 test) 549ms
✓ Provider-backed integration: repair close paths (abort, plain close, committed) 548ms
✓ |provider-integration| test/integration/provider-scenarios/linux-desktop.test.ts (1 test) 654ms
✓ Provider-backed integration Linux desktop flow uses semantic desktop and input providers 653ms
✓ |provider-integration| test/integration/provider-scenarios/macos-desktop.test.ts (2 tests) 505ms
✓ |provider-integration| test/integration/provider-scenarios/no-record-recorder-routes.test.ts (1 test) 506ms
✓ --no-record keeps gesture/back/home out of a recorded session script 505ms
✓ |provider-integration| test/integration/provider-scenarios/apple-app-log-runtime-provider.test.ts (1 test) 63ms
✓ |provider-integration| test/integration/provider-scenarios/replay-repair-record-exclusion.test.ts (1 test) 269ms
✓ |provider-integration| test/integration/provider-scenarios/daemon-command-policy.test.ts (1 test) 95ms
✓ |provider-integration| test/integration/provider-scenarios/provider-failures.test.ts (1 test) 201ms
✓ |provider-integration| test/integration/provider-scenarios/web-provider.test.ts (1 test) 91ms
✓ |provider-integration| test/integration/provider-scenarios/ios-alert-settings.test.ts (1 test) 151ms
✓ |provider-integration| test/integration/provider-scenarios/provider-ios-runner-transport.test.ts (3 tests) 124ms
✓ |provider-integration| test/integration/provider-scenarios/provider-ios-selector-runtime.test.ts (1 test) 94ms
✓ |provider-integration| test/integration/provider-scenarios/provider-device-runtime.test.ts (4 tests) 113ms
✓ |provider-integration| test/integration/provider-scenarios/vega-tv-remote.test.ts (1 test) 85ms
✓ |provider-integration| test/integration/provider-scenarios/network-runtime-provider.test.ts (1 test) 104ms
✓ |provider-integration| test/integration/provider-scenarios/stale-provider-runtime-admission.test.ts (3 tests) 46ms
✓ |provider-integration| test/integration/provider-scenarios/daemon-http-server.test.ts (10 tests) 85ms
✓ |provider-integration| test/integration/provider-scenarios/remote-daemon-client.test.ts (6 tests) 47ms
✓ |provider-integration| test/integration/provider-scenarios/batch-flags.test.ts (1 test) 53ms
✓ |provider-integration| test/integration/provider-scenarios/remote-proxy-artifact-tenant.test.ts (1 test) 31ms
✓ |provider-integration| test/integration/provider-scenarios/android-tv-remote.test.ts (1 test) 30ms
✓ |provider-integration| test/integration/provider-scenarios/daemon-http-disconnect.test.ts (3 tests) 16ms
✓ |provider-integration| test/integration/provider-scenarios/daemon-http-resumable-upload.test.ts (1 test) 30ms
✓ |provider-integration| test/integration/provider-scenarios/daemon-http-boundary-cancellation.test.ts (4 tests) 13ms
✓ |provider-integration| test/integration/provider-scenarios/cloud-webdriver-provider-regressions.test.ts (5 tests) 11ms
✓ |provider-integration| test/integration/provider-scenarios/daemon-lifecycle.test.ts (1 test) 3ms
✓ |provider-integration| test/integration/provider-scenarios/cloud-webdriver-provider-adapters.test.ts (5 tests) 11ms
✓ |provider-integration| test/integration/provider-scenarios/provider-command-dispatch.test.ts (2 tests) 2ms
✓ |provider-integration| test/integration/provider-scenarios/android-recording-provider-fixtures.test.ts (1 test) 2ms
✓ |unit-core| src/tests/client-metro.test.ts (20 tests) 5433ms
✓ prepareMetroRuntime starts Metro, bridges through proxy, and writes runtime file when requested 582ms
✓ prepareMetroRuntime starts Re.Pack with rspack-start for rspack.config.ts 563ms
✓ prepareMetroRuntime starts Re.Pack with webpack-start for webpack.config.js 559ms
✓ prepareMetroRuntime maps kind=expo to the virtual-metro-entry bundle URL 558ms
✓ prepareMetroRuntime keeps index.bundle for non-expo kinds 558ms
✓ prepareMetroRuntime detects the package manager from an ancestor lockfile in a monorepo 842ms
✓ metro reload targets the dev server bound by metro prepare in the same session 561ms
✓ metro prepare --kind expo keeps a prefixed public base URL for session reload 568ms
✓ |unit-core| scripts/tests/help-conformance-bench.test.ts (32 tests) 3685ms
✓ |unit-core| src/daemon/handlers/tests/snapshot-handler.test.ts (47 tests) 9301ms
✓ snapshot warns when Android freshness retries still return the previous route 1255ms
✓ diff snapshot carries stale-tree warnings for recent Android presses 1255ms
✓ captureSnapshot lazily retries pending no-change touch before returning fresh state 505ms
✓ captureSnapshot does not retry when a tap change appears after a short delay 502ms
✓ captureSnapshot retries pending tap outcome before post-gesture stabilization 704ms
✓ alert accept adds a scoped-snapshot hint after retrying alert-not-found failures 2109ms
✓ alert dismiss retries on "no alert" message 604ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-maestro.test.ts (43 tests) 3556ms
✓ |unit-core| src/platforms/apple/core/tests/perf.test.ts (24 tests) 4051ms
✓ sampleAppleFramePerf retries transient kperf lock failures 1505ms
✓ startAppleXctracePerfCapture attaches to an active iOS simulator app process 505ms
✓ startAppleXctracePerfCapture retries transient kperf lock failures 2005ms
✓ |unit-core| src/tests/eager-closure-budgets.test.ts (235 tests) 2803ms
✓ discovery is recursive and reads TRACKED files only 626ms
✓ an untracked PACKAGE contributes no entry surface, however its manifest reads 624ms
✓ a dirty manifest naming an UNTRACKED target contributes no entry surface 628ms
✓ |unit-core| src/platforms/android/tests/text-input.test.ts (16 tests) 3032ms
✓ fillAndroid uses chunk-safe shell input and retries when verification still fails 504ms
✓ fillAndroid keeps delayed typing in typed-input mode 505ms
✓ fillAndroid tolerates delayed React Native text verification 506ms
✓ fillAndroid keeps delayed typing in typed-input mode 503ms
✓ fillAndroid tolerates delayed React Native text verification 503ms
✓ fillAndroid tolerates delayed React Native text verification 503ms
✓ |unit-core| src/recording/tests/recording-scripts.test.ts (4 tests) 1849ms
✓ recording trim Swift script typechecks 694ms
✓ recording overlay Swift script typechecks 557ms
✓ |unit-core| src/platforms/android/tests/text-input-fill.test.ts (19 tests) 2696ms
✓ fillAndroid delegates target replacement to provider-native text injection 503ms
✓ fillAndroid returns target-bound unconfirmed evidence when an input mask reformats text 504ms
✓ fillAndroid waits for settled app text before reporting success 502ms
✓ fillAndroid accepts matching-length masked password verification 503ms
✓ fillAndroid runs the whole attempt on one warm daemon-session helper 523ms
✓ |unit-core| src/platforms/android/tests/snapshot.test.ts (48 tests) 2092ms
✓ snapshotAndroid does not start one-shot capture when session retirement is unconfirmed 2004ms
✓ |unit-core| src/tests/platform-runtime-runtime-hints.test.ts (15 tests) 3993ms
✓ applyRuntimeHintValues writes debug_http_host to the RN default-preferences file React Native actually reads 548ms
✓ clearRuntimeHintValues deletes iOS simulator React Native defaults 524ms
✓ |unit-core| src/platforms/android/tests/touch-helper-session.test.ts (11 tests) 2040ms
✓ touch helper does not run one-shot while snapshot retirement is unconfirmed 2017ms
✓ |unit-core| src/platforms/android/tests/fill-verification.test.ts (4 tests) 2049ms
✓ daemon-session verification samples reuse one warm helper session 521ms
✓ command-scoped verification samples release the helper after every sample 513ms
✓ verification samples re-read the hierarchy instead of sharing one capture 507ms
✓ the pre-action target read shares the daemon-session helper with the samples 506ms
✓ |unit-core| src/platforms/apple/core/tests/runner-client.test.ts (63 tests) 2060ms
✓ |unit-core| src/platforms/apple/core/tests/runner-command-retry.test.ts (38 tests) 1561ms
✓ a request pays for at most one runner recycle, then fails fast with a preserved-session hint 573ms
✓ a failed replacement boot does not consume the request recycle budget 574ms
✓ |unit-core| src/daemon/tests/wait-runtime.test.ts (19 tests) 1524ms
✓ |unit-core| src/tests/daemon-entrypoint.test.ts (5 tests) 1328ms
✓ daemon entrypoint publishes HTTP metadata and cleans up on shutdown 818ms
✓ |unit-core| src/daemon/tests/device-claim-admission.test.ts (10 tests) 1234ms
✓ a foreign live claim refuses the command before it can reach device operations 533ms
✓ |unit-core| src/platform-runtime-screen-recording-apple-simulator-host.test.ts (11 tests) 1034ms
✓ |unit-core| src/daemon/handlers/tests/session-open-runtime.test.ts (7 tests) 1022ms
✓ open applies stored runtime launchUrl and reports runtime hints 613ms
✓ |unit-core| src/tests/cli-diagnostics.test.ts (13 tests) 838ms
✓ cli debug log tail starts at the current daemon log end 504ms
✓ |unit-core| src/daemon/handlers/tests/session-boot-shutdown-device-claims.test.ts (4 tests) 879ms
✓ |unit-core| src/core/tests/dispatch-trigger-app-event.test.ts (9 tests) 1057ms
✓ |unit-core| src/daemon/handlers/tests/session-open-execution-runtime.test.ts (6 tests) 659ms
✓ |unit-core| src/platforms/apple/core/tests/apps.test.ts (47 tests) 842ms
✓ |unit-core| src/daemon/handlers/tests/find.test.ts (28 tests) 632ms
✓ |unit-core| src/daemon/tests/request-router-open.test.ts (12 tests) 831ms
✓ fresh open uses app-aware device selection for advisory locking and dispatch 601ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime.test.ts (20 tests) 630ms
✓ |unit-core| src/daemon/handlers/tests/wait-landmark-recording.test.ts (5 tests) 613ms
✓ a replayed wait with a landmark guard refuses at the deadline when only impostors matched 602ms
✓ |unit-core| src/platforms/apple/core/tests/runner-session.test.ts (73 tests) 535ms
✓ |unit-core| src/daemon/handlers/tests/session-observability.test.ts (17 tests) 518ms
✓ |unit-core| src/platforms/android/tests/text-input-test-ime.test.ts (2 tests) 514ms
✓ fillAndroid clears then commits non-ASCII text through the test IME and verifies it 512ms
✓ |unit-core| src/daemon/handlers/tests/system-surface-disclosure.test.ts (8 tests) 519ms
✓ |unit-core| src/daemon/client/tests/daemon-client-timeout-route.test.ts (4 tests) 494ms
✓ |unit-core| src/utils/tests/daemon-client.test.ts (39 tests) 485ms
✓ |unit-core| src/daemon/handlers/tests/session-close-error-precedence.test.ts (5 tests) 455ms
✓ |unit-core| src/daemon/tests/request-router-screenshot.test.ts (16 tests) 479ms
✓ |unit-core| src/daemon/tests/request-router-android-snapshot-helper.test.ts (2 tests) 348ms
✓ |unit-core| src/daemon/tests/request-router-lock-policy.test.ts (9 tests) 417ms
✓ |unit-core| src/provider-webdriver.test.ts (1 test) 305ms
✓ |unit-core| src/tests/cli-config.test.ts (28 tests) 196ms
✓ |unit-core| src/daemon/tests/http-server-artifacts.test.ts (6 tests) 251ms
✓ |unit-core| src/utils/tests/daemon-client-lifecycle.test.ts (22 tests) 295ms
✓ |unit-core| src/daemon/client/tests/boundary-fault-transport.test.ts (16 tests) 267ms
✓ |unit-core| src/daemon/handlers/tests/session-teardown-resources.test.ts (12 tests) 189ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-direct-ios-eligibility.test.ts (4 tests) 215ms
✓ |unit-core| src/commands/tests/command-explain.test.ts (25 tests) 188ms
✓ |unit-core| src/daemon/handlers/tests/record-runtime-stop-recovery.test.ts (5 tests) 145ms
✓ |unit-core| src/platforms/android/tests/app-helpers.test.ts (3 tests) 267ms
✓ |unit-core| src/daemon/handlers/tests/interaction-settle.test.ts (9 tests) 186ms
✓ |unit-core| src/daemon/handlers/tests/session-logs.test.ts (15 tests) 153ms
✓ |unit-core| src/daemon/tests/generic-settle.test.ts (7 tests) 192ms
✓ |unit-core| scripts/fuzz/validation-arbitraries-maestro.test.ts (7 tests) 159ms
✓ |unit-core| src/daemon/client/tests/daemon-launch-spec.test.ts (4 tests) 134ms
✓ |unit-core| src/daemon/handlers/tests/session-open-url-prewarm.test.ts (16 tests) 156ms
✓ |unit-core| src/sdk/limrun-runtime-dependencies.test.ts (2 tests) 141ms
✓ |unit-core| src/platforms/android/tests/ime-lifecycle.test.ts (15 tests) 153ms
✓ |unit-core| src/platforms/apple/core/tests/runner-cache-probe.test.ts (2 tests) 131ms
✓ |unit-core| test/wire-compat/wire-compat.test.ts (6 tests) 120ms
Installed: com.example.demo
Installed: com.example.demo
Installed: com.example.demo
Installed: com.example.demo
/tmp/screenshot.png
✓ |unit-core| scripts/fuzz/validation-arbitraries-cli.test.ts (15 tests) 108ms
Opened: MenuBarApp
Opened: Agent Device Tester
✓ |unit-core| src/tests/cli-client-commands.test.ts (30 tests) 117ms
✓ |unit-core| src/daemon/tests/request-router-record-runtime-lock.test.ts (3 tests) 100ms
✓ |unit-core| src/tests/cli-diff.test.ts (13 tests) 114ms
✓ |unit-core| src/tests/provider-device-runtimes.test.ts (2 tests) 94ms
✓ |unit-core| src/daemon/tests/request-router-replay-scope.test.ts (4 tests) 93ms
✓ |unit-core| src/tests/cli-network.test.ts (21 tests) 90ms
{
"success": true,
"data": {
"connected": true,
"session": "adc-status-metro",
"tenant": "acme",
"runId": "run-123",
"leaseAllocated": false,
"leaseBackend": "android-instance",
"platform": "android",
"remoteConfig": "/tmp/agent-device-test-run-25283-963pCP/agent-device-connection-status-metro-A3ozlG/remote.json",
"remoteConfigHash": "77632ad36bdd9d19beb42d20f7dff559cb880fd4597afc3bfaf57d2f4f0b967d",
"daemonBaseUrlFingerprint": "cd7ab9656667",
"liveSession": {
"status": "not-created"
},
"verification": {
"status": "configured",
"service": "remote provider",
"message": "Remote connection profile loaded. Access is checked by the first remote command."
},
"nextSteps": [
"agent-device open --relaunch --session adc-status-metro"
],
"metro": {
"prepared": false
},
"leasePreparation": {
"status": "deferred",
"nextSteps": [
"agent-device install-from-source --platform ios|android --session adc-status-metro",
"agent-device open --relaunch --session adc-status-metro",
"agent-device snapshot -i --session adc-status-metro",
"agent-device devices --session adc-status-metro"
],
"message": "No live device session has been created. Run a device command when ready to allocate or refresh the lease."
},
"runtimePreparation": {
"status": "deferred",
"nextStep": "agent-device metro prepare --remote-config /tmp/agent-device-test-run-25283-963pCP/agent-device-connection-status-metro-A3ozlG/remote.json --session adc-status-metro",
"message": "Metro runtime is not prepared yet; it will be prepared automatically on first open, or run "agent-device metro prepare --remote-config /tmp/agent-device-test-run-25283-963pCP/agent-device-connection-status-metro-A3ozlG/remote.json --session adc-status-metro" to inspect it before launch."
},
"connectedAt": "2026-08-25T12:53:33.522Z",
"updatedAt": "2026-08-25T12:53:33.522Z"
}
}
✓ |unit-core| src/tests/remote-connection.test.ts (50 tests) 98ms
✓ |unit-core| src/daemon/tests/request-handler-catalog.test.ts (10 tests) 87ms
✓ |unit-core| src/daemon/tests/request-save-script-transports.test.ts (8 tests) 99ms
✓ |unit-core| src/daemon/tests/daemon-process-takeover.test.ts (2 tests) 87ms
✓ |unit-core| src/daemon/tests/request-router-typed-error.test.ts (6 tests) 77ms
✓ |unit-core| src/daemon/handlers/tests/session-close-save-script.test.ts (2 tests) 67ms
✓ |unit-core| src/daemon/server/daemon-runtime-recording-teardown.test.ts (3 tests) 88ms
✓ |unit-core| src/tests/cli-help.test.ts (28 tests) 74ms
✓ |unit-core| src/tests/cli-config-trust.test.ts (19 tests) 58ms
✓ |unit-core| src/commands/management/output.test.ts (11 tests) 72ms
✓ |unit-core| src/daemon/handlers/tests/session-test-runner.test.ts (9 tests) 79ms
✓ |unit-core| src/daemon/handlers/tests/session-test-suite.test.ts (17 tests) 75ms
✓ |unit-core| src/daemon/tests/request-runtime-binding-router.test.ts (2 tests) 69ms
✓ |unit-core| src/daemon/tests/request-handler-chain.test.ts (9 tests) 86ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-repair-transaction.test.ts (17 tests) 47ms
✓ |unit-core| src/daemon/tests/gesture-admission-parity.test.ts (4 tests) 52ms
✓ |unit-core| src/tests/limrun-runtime.test.ts (15 tests) 58ms
✓ |unit-core| src/daemon/handlers/tests/session-relaunch-close.test.ts (18 tests) 63ms
✓ |unit-core| src/daemon/tests/request-execution-scope.test.ts (25 tests) 59ms
✓ |unit-core| src/tests/cloud-connect-profile.test.ts (19 tests) 55ms
✓ |unit-core| src/daemon/tests/request-router-events.test.ts (7 tests) 64ms
✓ |unit-core| src/daemon/tests/request-router-replay-env.test.ts (2 tests) 63ms
✓ |unit-core| src/platforms/apple/core/tests/runner-adoption.test.ts (14 tests) 51ms
✓ |unit-core| src/daemon/tests/daemon-runtime-app-log.test.ts (3 tests) 34ms
✓ |unit-core| src/daemon/tests/request-router-android-perf.test.ts (1 test) 58ms
✓ |unit-core| src/daemon/tests/request-router-repair-expired.test.ts (5 tests) 59ms
✓ |unit-core| src/platforms/apple/core/tests/app-install.test.ts (1 test) 54ms
✓ |unit-core| src/ai-sdk/tests/index.test.ts (6 tests) 62ms
✓ |unit-core| src/daemon/handlers/tests/record-runtime-start.test.ts (4 tests) 29ms
✓ |unit-core| src/daemon/selector-runtime-backend.test.ts (2 tests) 50ms
✓ |unit-core| src/core/tests/dispatch-keyboard.test.ts (2 tests) 46ms
✓ |unit-core| src/daemon/tests/device-claim-reconciliation.test.ts (2 tests) 35ms
✓ |unit-core| src/daemon/handlers/tests/interaction-settle-private-ax-route.test.ts (1 test) 49ms
✓ |unit-core| src/core/tests/dispatch-orientation.test.ts (2 tests) 47ms
✓ |unit-core| src/core/tests/dispatch-tv-remote.test.ts (2 tests) 51ms
✓ |unit-core| src/platforms/apple/core/tests/runner-xctestrun.test.ts (18 tests) 46ms
✓ |unit-core| src/tests/client.test.ts (47 tests) 51ms
✓ |unit-core| src/tests/cli-exit-paths.test.ts (6 tests) 42ms
✓ |unit-core| src/tests/cli-remote-diagnostics.test.ts (4 tests) 41ms
✓ |unit-core| src/daemon/handlers/tests/session-device-claims.test.ts (9 tests) 38ms
✓ |unit-core| src/daemon/tests/code-signature-cache.test.ts (18 tests) 39ms
✓ |unit-core| src/tests/daemon-proxy.test.ts (5 tests) 38ms
✓ |unit-core| src/tests/cli-replay-script-sources.test.ts (3 tests) 41ms
✓ |unit-core| src/daemon/server/daemon-runtime-idle-reap.test.ts (2 tests) 41ms
✓ |unit-core| src/daemon/tests/request-router-recording-health.test.ts (2 tests) 36ms
✓ |unit-core| src/daemon/tests/request-diagnostics-http.test.ts (5 tests) 34ms
✓ |unit-core| src/cli-schema/cli-help-topics.test.ts (23 tests) 36ms
✓ |unit-core| src/cli-schema/cli-help-command-usage.test.ts (42 tests) 31ms
✓ |unit-core| src/platforms/apple/core/tests/runner-request-cancellation.test.ts (3 tests) 39ms
✓ |unit-core| src/platforms/apple/core/tests/runner-recovery-wiring.test.ts (5 tests) 30ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-repair-record-exclusion.test.ts (4 tests) 30ms
✓ |unit-core| src/mcp/tests/router.test.ts (16 tests) 27ms
✓ |unit-core| src/daemon/handlers/tests/session-open-existing.test.ts (9 tests) 34ms
✓ |unit-core| src/daemon/handlers/tests/session-reinstall.test.ts (6 tests) 30ms
✓ |unit-core| src/cli-schema/cli-help-overview.test.ts (3 tests) 33ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-target-verification-runtime.test.ts (26 tests) 29ms
✓ |unit-core| src/daemon/handlers/tests/interaction-ios-tap-outcome.test.ts (16 tests) 29ms
✓ |unit-core| src/core/tests/dispatch-back.test.ts (1 test) 33ms
✓ |unit-core| src/daemon/tests/snapshot-custom-actions-platform-guard.test.ts (7 tests) 25ms
✓ |unit-core| src/daemon/tests/request-router-record-flags.test.ts (2 tests) 27ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-failure.test.ts (10 tests) 25ms
✓ |unit-core| src/platforms/apple/core/tests/runner-command-recovery.test.ts (7 tests) 28ms
✓ |unit-core| src/tests/cli-perf.test.ts (22 tests) 28ms
✓ |unit-core| src/daemon/handlers/tests/session-close-lifecycle-runtime.test.ts (6 tests) 24ms
✓ |unit-core| src/daemon/tests/request-router-custom-action-flags.test.ts (3 tests) 32ms
✓ |unit-core| src/utils/tests/perf-args.test.ts (2 tests) 29ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-maestro-failure.test.ts (9 tests) 26ms
✓ |unit-core| src/daemon/handlers/tests/session-close-resource-cleanup.test.ts (7 tests) 27ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-plan.test.ts (13 tests) 34ms
✓ |unit-core| src/daemon/handlers/tests/session-capabilities.test.ts (14 tests) 25ms
✓ |unit-core| src/daemon/server/daemon-runtime-lifecycle-shutdown.test.ts (1 test) 25ms
✓ |unit-core| src/commands/batch/cli.test.ts (18 tests) 27ms
✓ |unit-core| src/daemon/handlers/tests/session-close-shutdown-platform.test.ts (7 tests) 32ms
✓ |unit-core| src/daemon/handlers/tests/session-devices-batch-runtime.test.ts (11 tests) 31ms
✓ |unit-core| src/daemon/tests/http-server-rpc-validation.test.ts (3 tests) 25ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-repair-empty-tail.test.ts (6 tests) 27ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-repair-loop.test.ts (15 tests) 26ms
✓ |unit-core| src/platform-runtime-gateway.test.ts (20 tests) 22ms
✓ |unit-core| src/daemon/handlers/tests/session-boot-shutdown.test.ts (14 tests) 42ms
✓ |unit-core| src/utils/tests/interactors.test.ts (14 tests) 27ms
✓ |unit-core| src/daemon/handlers/tests/interaction-target-evidence.test.ts (9 tests) 21ms
✓ |unit-core| src/daemon/handlers/tests/session-test-reporter-values.test.ts (4 tests) 23ms
✓ |unit-core| src/daemon/handlers/tests/session-test-reporter-values-maestro.test.ts (2 tests) 28ms
✓ |unit-core| src/tests/cli-device-status.test.ts (4 tests) 36ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-press-admission.test.ts (13 tests) 37ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-divergence.test.ts (13 tests) 26ms
✓ |unit-core| src/daemon/handlers/tests/interaction.test.ts (16 tests) 19ms
✓ |unit-core| src/tests/cli-debug-symbols.test.ts (3 tests) 41ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-script-source.test.ts (5 tests) 18ms
✓ |unit-core| src/daemon/handlers/tests/session-test-suite-infrastructure.test.ts (2 tests) 20ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch.test.ts (12 tests) 16ms
✓ |unit-core| src/daemon/handlers/tests/session-push.test.ts (6 tests) 18ms
✓ |unit-core| src/recording/tests/overlay.test.ts (5 tests) 16ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-dispatch-selector-miss.test.ts (5 tests) 16ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-response.test.ts (7 tests) 29ms
✓ |unit-core| src/tests/android-adb-public.test.ts (1 test) 17ms
✓ |unit-core| src/daemon/handlers/tests/interaction-common.test.ts (5 tests) 13ms
✓ |unit-core| src/daemon/client/tests/boundary-fault-acceptance.test.ts (6 tests) 16ms
✓ |unit-core| src/platforms/apple/core/tests/screenshot.test.ts (17 tests) 19ms
✓ |unit-core| src/cli-schema/cli-help-examples.test.ts (3 tests) 13ms
✓ |unit-core| src/daemon/handlers/tests/session-relaunch-guards.test.ts (9 tests) 16ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-repair-acceptance.test.ts (1 test) 15ms
✓ |unit-core| src/tests/cloud-connect-auth.test.ts (2 tests) 17ms
✓ |unit-core| src/daemon/handlers/tests/session-runtime-command.test.ts (4 tests) 14ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-payload.test.ts (7 tests) 15ms
✓ |unit-core| src/daemon/tests/request-router-android-modal.test.ts (3 tests) 12ms
✓ |unit-core| src/platforms/android/tests/snapshot-helper.test.ts (24 tests) 17ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-press.test.ts (8 tests) 12ms
✓ |unit-core| src/daemon/tests/sparse-fallback-screenshot.test.ts (4 tests) 14ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-binding.test.ts (2 tests) 13ms
✓ |unit-core| src/platforms/android/tests/snapshot-occlusion-context.test.ts (1 test) 6ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-fill.test.ts (6 tests) 13ms
✓ |unit-core| src/mcp/tests/command-tools.test.ts (46 tests) 13ms
✓ |unit-core| src/daemon/handlers/tests/react-native.test.ts (14 tests) 11ms
✓ |unit-core| src/daemon/handlers/tests/session-install-source-ref-frame.test.ts (3 tests) 13ms
✓ |unit-core| src/daemon/tests/post-gesture-no-effect-claim.test.ts (7 tests) 12ms
✓ |unit-core| src/daemon/handlers/tests/session-push-ref-frame.test.ts (2 tests) 13ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-android-readiness.test.ts (7 tests) 12ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-android-freshness.test.ts (4 tests) 13ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-runtime.test.ts (5 tests) 13ms
✓ |unit-core| src/daemon/handlers/tests/session-appstate-input-perf.test.ts (14 tests) 13ms
✓ |unit-core| src/tests/cli-close.test.ts (6 tests) 17ms
✓ |unit-core| src/daemon/tests/request-router-response-level.test.ts (6 tests) 12ms
✓ |unit-core| src/daemon/tests/post-gesture-stabilization.test.ts (18 tests) 13ms
✓ |unit-core| src/daemon/tests/snapshot-diff-runtime.test.ts (7 tests) 12ms
✓ |unit-core| src/mcp/tests/command-tools-parity.test.ts (3 tests) 7ms
✓ |unit-core| src/daemon/tests/snapshot-quality-latch.test.ts (10 tests) 12ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-failure-response.test.ts (6 tests) 12ms
✓ |unit-core| src/daemon/handlers/tests/session-test-suite-command-video.test.ts (1 test) 11ms
✓ |unit-core| src/daemon/handlers/tests/session-state-boot-warmup.test.ts (1 test) 13ms
✓ |unit-core| src/daemon/tests/request-router-cost.test.ts (6 tests) 12ms
✓ |unit-core| src/utils/tests/output.test.ts (48 tests) 13ms
✓ |unit-core| src/daemon/tests/wait-conditional-selector.test.ts (4 tests) 12ms
✓ |unit-core| src/daemon/tests/focus-runtime.test.ts (6 tests) 10ms
✓ |unit-core| src/daemon/tests/is-runtime.test.ts (7 tests) 28ms
✓ |unit-core| src/daemon/handlers/tests/session-command-replay.test.ts (6 tests) 11ms
✓ |unit-core| src/daemon/tests/tv-remote-runtime.test.ts (8 tests) 10ms
✓ |unit-core| src/platforms/apple/core/tests/runner-startup-transport.test.ts (10 tests) 11ms
✓ |unit-core| src/daemon/handlers/tests/session-test-fail-fast.test.ts (1 test) 11ms
✓ |unit-core| src/daemon/handlers/tests/snapshot-scoped-refs.test.ts (3 tests) 10ms
✓ |unit-core| src/daemon/tests/viewport-runtime.test.ts (5 tests) 10ms
✓ |unit-core| src/tests/cli-record-flag-delivery.test.ts (4 tests) 10ms
✓ |unit-core| src/platforms/android/tests/touch-helper.test.ts (16 tests) 9ms
✓ |unit-core| src/daemon/tests/orientation-runtime.test.ts (6 tests) 10ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-divergence-android-occlusion.test.ts (2 tests) 10ms
✓ |unit-core| src/core/command-descriptor/tests/parity.test.ts (15 tests) 10ms
✓ |unit-core| src/daemon/handlers/tests/interaction-gesture-drag.test.ts (2 tests) 10ms
✓ |unit-core| src/daemon/handlers/tests/session-audio.test.ts (9 tests) 12ms
✓ |unit-core| src/daemon/tests/back-runtime.test.ts (4 tests) 10ms
✓ |unit-core| src/tests/cli-react-devtools-session.test.ts (2 tests) 12ms
✓ |unit-core| src/daemon/tests/screenshot-runtime.test.ts (7 tests) 14ms
✓ |unit-core| src/tests/cli-auth-diagnostics.test.ts (1 test) 10ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-divergence-publication.test.ts (11 tests) 9ms
✓ |unit-core| src/cli-schema/command-schema-guards.test.ts (5 tests) 9ms
✓ |unit-core| src/tests/cli-agent-cdp-session.test.ts (1 test) 8ms
✓ |unit-core| src/daemon/tests/home-runtime.test.ts (3 tests) 9ms
✓ |unit-core| src/tests/cli-session-state-dir.test.ts (2 tests) 9ms
✓ |unit-core| src/commands/management/app.test.ts (7 tests) 8ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-keep-session.test.ts (6 tests) 9ms
✓ |unit-core| src/daemon/handlers/tests/snapshot-alert-android-occlusion.test.ts (2 tests) 10ms
✓ |unit-core| src/daemon/tests/device-ready.test.ts (7 tests) 7ms
✓ |unit-core| src/daemon/handlers/tests/find-single-bind.test.ts (2 tests) 15ms
✓ |unit-core| src/platforms/apple/core/tests/app-launch-close.test.ts (5 tests) 9ms
✓ |unit-core| src/daemon/handlers/tests/install-source.test.ts (7 tests) 10ms
✓ |unit-core| src/daemon/tests/request-router-artifacts-web.test.ts (1 test) 10ms
✓ |unit-core| src/daemon/handlers/tests/session-network-runtime-parity.test.ts (13 tests) 9ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-direct-ios.test.ts (3 tests) 7ms
✓ |unit-core| src/platform-runtime.test.ts (3 tests) 7ms
✓ |unit-core| src/tests/cli-clipboard.test.ts (2 tests) 9ms
✓ |unit-core| src/platforms/android/tests/snapshot-capture-failure-reason.test.ts (5 tests) 8ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-selector-routes.test.ts (1 test) 7ms
✓ |unit-core| src/daemon/server/daemon-runtime-web-close-teardown.test.ts (5 tests) 10ms
✓ |unit-core| src/daemon/handlers/tests/interaction-type-android-readiness.test.ts (1 test) 7ms
✓ |unit-core| src/daemon/server/daemon-session-lease-finalizer.test.ts (3 tests) 8ms
✓ |unit-core| src/daemon/tests/provider-lease-expiry.test.ts (4 tests) 9ms
✓ |unit-core| src/platforms/android/tests/snapshot-quality.test.ts (3 tests) 6ms
✓ |unit-core| src/daemon/handlers/tests/session-selector-dispatch.test.ts (4 tests) 6ms
✓ |unit-core| src/tests/cli-logs.test.ts (1 test) 8ms
✓ |unit-core| src/daemon/tests/deferred-interaction-outcome.test.ts (10 tests) 8ms
✓ |unit-core| src/cli/parser/tests/args-parse-session.test.ts (47 tests) 7ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-runtime-artifact-ledger.test.ts (2 tests) 8ms
✓ |unit-core| src/daemon/tests/daemon-stop.test.ts (7 tests) 8ms
✓ |unit-core| src/platforms/apple/core/tests/interactions.test.ts (21 tests) 8ms
✓ |unit-core| src/cli/parser/tests/maestro-support-matrix.test.ts (3 tests) 12ms
✓ |unit-core| src/cli/parser/tests/command-suggestions.test.ts (22 tests) 7ms
✓ |unit-core| src/daemon/tests/request-platform-providers.test.ts (8 tests) 6ms
✓ |unit-core| scripts/tests/help-conformance-sample-outputs.test.ts (14 tests) 6ms
✓ |unit-core| src/daemon/handlers/tests/trace-runtime.test.ts (4 tests) 7ms
✓ |unit-core| src/platforms/apple/core/tests/runner-transport.test.ts (6 tests) 6ms
✓ |unit-core| src/commands/tests/command-surface-metadata.test.ts (13 tests) 6ms
✓ |unit-core| src/daemon/tests/selector-capture-binding.test.ts (10 tests) 6ms
✓ |unit-core| packages/contracts/src/replay-divergence.test.ts (48 tests) 6ms
✓ |unit-core| src/core/tests/dispatch-resolve.test.ts (24 tests) 6ms
✓ |unit-core| src/platforms/apple/core/tests/app-resolution-deep-link.test.ts (3 tests) 6ms
✓ |unit-core| src/daemon/tests/selector-capture-runtime.test.ts (4 tests) 5ms
✓ |unit-core| src/daemon/tests/keyboard-runtime.test.ts (15 tests) 6ms
✓ |unit-core| src/core/command-descriptor/tests/post-action-observation.test.ts (9 tests) 6ms
✓ |unit-core| src/daemon/handlers/tests/session-state.test.ts (5 tests) 7ms
✓ |unit-core| src/daemon/ios-app-session-hint.test.ts (17 tests) 6ms
✓ |unit-core| src/daemon/handlers/tests/session-perf-xctrace-lifecycle.test.ts (3 tests) 6ms
✓ |unit-core| src/platforms/apple/core/tests/physical-device-control.test.ts (5 tests) 5ms
✓ |unit-core| src/platforms/apple/core/tests/screenshot-density.test.ts (1 test) 5ms
✓ |unit-core| src/daemon/tests/lease-lifecycle.test.ts (6 tests) 7ms
✓ |unit-core| src/daemon/handlers/tests/session-doctor-warmup.test.ts (5 tests) 5ms
✓ |unit-core| src/daemon/tests/snapshot-command-runtime.test.ts (2 tests) 5ms
✓ |unit-core| src/platforms/android/tests/snapshot-clickability.test.ts (2 tests) 6ms
✓ |unit-core| src/commands/management/session.test.ts (6 tests) 5ms
✓ |unit-core| src/cli/parser/tests/args-validation.test.ts (19 tests) 6ms
✓ |unit-core| src/daemon/tests/config.test.ts (3 tests) 4ms
✓ |unit-core| src/daemon/tests/scroll-runtime.test.ts (10 tests) 6ms
✓ |unit-core| src/daemon/handlers/tests/session-capabilities-install-projection.test.ts (3 tests) 5ms
✓ |unit-core| src/commands/system/index.test.ts (18 tests) 5ms
✓ |unit-core| src/daemon/tests/type-text-runtime.test.ts (4 tests) 5ms
✓ |unit-core| src/platforms/apple/core/tests/runner-disposal.test.ts (5 tests) 5ms
✓ |unit-core| src/platforms/apple/tests/interactor-runner-provider.test.ts (9 tests) 5ms
✓ |unit-core| src/cli/parser/tests/args-parse-interaction.test.ts (33 tests) 5ms
✓ |unit-core| src/commands/capture/index.test.ts (13 tests) 5ms
✓ |unit-core| src/daemon/tests/android-system-dialog-occlusion.test.ts (3 tests) 5ms
✓ |unit-core| src/daemon/handlers/tests/session-open-foreground.test.ts (13 tests) 6ms
✓ |unit-core| src/daemon/server/daemon-runtime-device-claims.test.ts (2 tests) 6ms
✓ |unit-core| src/daemon/handlers/tests/session-inventory-harmonyos.test.ts (2 tests) 5ms
✓ |unit-core| src/daemon/tests/daemon-shutdown-report.test.ts (3 tests) 13ms
✓ |unit-core| src/platforms/android/tests/ime-helper.test.ts (5 tests) 7ms
✓ |unit-core| src/platform-runtime-screen-recording-apple-runner-transport.test.ts (5 tests) 5ms
✓ |unit-core| src/cli/commands/tests/daemon.test.ts (3 tests) 5ms
✓ |unit-core| src/daemon/handlers/tests/session-doctor-web.test.ts (2 tests) 5ms
✓ |unit-core| src/tests/cli-grammar.test.ts (10 tests) 4ms
✓ |unit-core| src/tests/command-doc-coverage.test.ts (11 tests) 4ms
✓ |unit-core| src/mcp/tests/tool-ref-pins.test.ts (23 tests) 4ms
✓ |unit-core| src/daemon/handlers/tests/snapshot-capture.test.ts (5 tests) 4ms
✓ |unit-core| src/mcp/tests/protocol-era.test.ts (12 tests) 3ms
✓ |unit-core| src/daemon/tests/interaction-outcome-policy.test.ts (18 tests) 4ms
✓ |unit-core| src/daemon/tests/lease-registry.test.ts (14 tests) 4ms
✓ |unit-core| src/utils/tests/version.test.ts (4 tests) 4ms
✓ |unit-core| src/daemon/handlers/tests/session-doctor-app-runtime.test.ts (2 tests) 4ms
✓ |unit-core| src/daemon/wait-current-surface.test.ts (3 tests) 4ms
✓ |unit-core| src/daemon/handlers/tests/interaction-touch-targets.test.ts (11 tests) 3ms
✓ |unit-core| src/daemon/server/daemon-runtime-web-cleanup.test.ts (2 tests) 4ms
✓ |unit-core| src/daemon/handlers/tests/session-runtime-admission.test.ts (6 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-test-suite-command-flag-policy.test.ts (6 tests) 4ms
✓ |unit-core| src/daemon/handlers/tests/session-doctor-toolchain.test.ts (7 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-inventory-appleos.test.ts (4 tests) 3ms
✓ |unit-core| src/core/tests/dispatch-viewport.test.ts (1 test) 4ms
✓ |unit-core| src/core/tests/dispatch-screenshot.test.ts (1 test) 4ms
✓ |unit-core| src/daemon/tests/android-system-dialog-ref-frame.test.ts (1 test) 3ms
✓ |unit-core| src/replay/test/tests/progress.test.ts (8 tests) 4ms
✓ |unit-core| src/platforms/android/tests/input-actions.test.ts (8 tests) 3ms
✓ |unit-core| src/core/tests/capability-plugin-routing-parity.test.ts (8 tests) 3ms
✓ |unit-core| src/tests/platform-runtime-android-application-tools.test.ts (7 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-replay.test.ts (3 tests) 3ms
✓ |unit-core| src/cli/commands/tests/screenshot.test.ts (2 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-network.test.ts (2 tests) 3ms
✓ |unit-core| src/daemon/tests/android-system-dialog.test.ts (1 test) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-doctor-device.test.ts (1 test) 4ms
✓ |unit-core| src/core/interactors/android.test.ts (3 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/interaction-snapshot-scope.test.ts (1 test) 3ms
✓ |unit-core| src/platforms/apple/core/tests/app-resolution.test.ts (10 tests) 3ms
✓ |unit-core| src/daemon/tests/providers-plugin-routing-parity.test.ts (3 tests) 3ms
✓ |unit-core| src/cli/commands/tests/generic.test.ts (1 test) 3ms
✓ |unit-core| scripts/tests/help-conformance-error-recovery-coverage.test.ts (9 tests) 3ms
✓ |unit-core| src/platform-runtime-apple-deployment-executor.test.ts (2 tests) 3ms
✓ |unit-core| src/core/command-descriptor/tests/focus-runtime-execution.test.ts (3 tests) 3ms
✓ |unit-core| src/daemon/tests/interaction-surface-baseline-evidence.test.ts (7 tests) 3ms
✓ |unit-core| src/replay/test/tests/reporters-default.test.ts (4 tests) 3ms
✓ |unit-core| src/cli-schema/option-schema.test.ts (8 tests) 3ms
✓ |unit-core| src/platforms/apple/core/tests/runner-client-relaunch.test.ts (2 tests) 3ms
✓ |unit-core| src/platforms/android/tests/touch-executor.test.ts (3 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-replay-resume.test.ts (14 tests) 3ms
✓ |unit-core| src/daemon/tests/post-gesture-stabilization-verdict.test.ts (7 tests) 3ms
✓ |unit-core| src/commands/capture/output.test.ts (4 tests) 4ms
✓ |unit-core| src/daemon/handlers/snapshot-runtime-route.test.ts (2 tests) 3ms
✓ |unit-core| src/tests/daemon-client-progress.test.ts (5 tests) 3ms
✓ |unit-core| src/daemon/tests/snapshot-runtime-binding.test.ts (1 test) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-device-utils.test.ts (5 tests) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-inventory-apps-runtime.test.ts (1 test) 3ms
✓ |unit-core| src/daemon/handlers/tests/session-open-target.test.ts (5 tests) 3ms
✓ |unit-core| src/tests/contracts-schema-public.test.ts (7 tests) 3ms
✓ |unit-core| src/mcp/tests/tool-error.test.ts (4 tests) 2ms
✓ |unit-core| src/daemon/handlers/tests/session-runtime-port-reverse.test.ts (2 tests) 3ms
✓ |unit-core| src/core/command-descriptor/tests/type-runtime-execution.test.ts (3 tests) 3ms
✓ |unit-core| scripts/fuzz/validation-case.test.ts (6 tests) 2ms
✓ |unit-core| src/daemon/tests/selector-runtime.test.ts (5 tests) 3ms
✓ |unit-core| src/replay/test/reporters/tests/registry.test.ts (6 tests) 3ms
✓ |unit-core| src/tests/contracts/apple-os-capability-table-parity.test.ts (4 tests) 3ms
✓ |unit-core| src/daemon/tests/direct-ios-selector.test.ts (10 tests) 3ms
✓ |unit-core| src/mcp/tests/server-validation.test.ts (8 tests) 3ms
✓ |unit-core| src/platforms/apple/tests/screenshot-backend.test.ts (1 test) 2ms
✓ |unit-core| src/daemon/tests/request-recording-health.test.ts (1 test) 3ms
✓ |unit-core| src/daemon/tests/offscreen-target-probe.test.ts (6 tests) 2ms
✓ |unit-core| src/core/tests/capabilities.test.ts (11 tests) 2ms
✓ |unit-core| src/platform-runtime-operation-host.test.ts (2 tests) 3ms
✓ |unit-core| src/cli-schema/cli-help-alias-fast-path.test.ts (3 tests) 3ms
✓ |unit-core| src/platform-runtime-screen-recording-apple-runner-host.test.ts (2 tests) 2ms
✓ |unit-core| src/tests/contracts/platform-plugin-parity.test.ts (7 tests) 2ms
✓ |unit-core| src/platform-runtime-screen-recording-apple-host.test.ts (2 tests) 2ms
✓ |unit-core| src/platforms/apple/core/tests/runner-selector-query.test.ts (1 test) 2ms
✓ |unit-core| src/daemon/handlers/tests/session-test-suite-command-cancellation.test.ts (5 tests) 2ms
✓ |unit-core| src/daemon/tests/device-claim-conflict.test.ts (4 tests) 2ms
✓ |unit-core| src/daemon/tests/request-handler-chain-provider-scope.test.ts (2 tests) 2ms
✓ |unit-core| src/core/command-descriptor/tests/find-runtime-execution.test.ts (2 tests) 2ms
✓ |unit-core| src/daemon/handlers/tests/session-open-surface.test.ts (5 tests) 2ms
✓ |unit-core| src/tests/hermetic-env-setup.test.ts (6 tests) 2ms
✓ |unit-core| src/utils/tests/output-error.test.ts (1 test) 2ms
✓ |unit-core| src/platforms/android/tests/ime-helper-security.test.ts (2 tests) 2ms
✓ |unit-core| src/tests/is-argument-surface-parity.test.ts (2 tests) 2ms
✓ |unit-core| src/daemon/handlers/tests/session-test-suite-command-nested-flags.test.ts (5 tests) 2ms
✓ |unit-core| src/platforms/apple/core/tests/physical-device-screenshot.test.ts (3 tests) 2ms
✓ |unit-core| src/daemon/handlers/tests/session-trigger.test.ts (1 test) 2ms
✓ |unit-core| src/daemon/handlers/tests/session-test-infrastructure.test.ts (9 tests) 2ms
✓ |unit-core| src/platforms/apple/core/tests/runner-process-launch.test.ts (2 tests) 2ms
✓ |unit-core| src/tests/agent-device-client-auth.test.ts (1 test) 2ms
✓ |unit-core| src/daemon/handlers/tests/session-doctor-android.test.ts (4 tests) 2ms
✓ |unit-core| scripts/tests/help-conformance-topic-coverage.test.ts (4 tests) 2ms
✓ |unit-core| src/utils/tests/snapshot-unchanged-output.test.ts (3 tests) 2ms
✓ |unit-core| src/platforms/apple/tests/watchos-sentinel.test.ts (2 tests) 2ms
✓ |unit-core| src/platforms/android/tests/ime-lifecycle-race.test.ts (1 test) 2ms
✓ |unit-core| src/platform-runtime-screen-recording-finalizer-host.test.ts (1 test) 2ms
✓ |unit-core| src/platforms/apple/core/tests/app-launch-url.test.ts (1 test) 2ms
✓ |unit-core| src/platform-runtime-screen-recording-host.test.ts (1 test) 5ms
✓ |unit-core| src/daemon/handlers/tests/interaction-flags.test.ts (1 test) 2ms
✓ |unit-core| src/ai-sdk/tests/missing-peer-dependency.test.ts (1 test) 2ms
✓ |unit-core| scripts/fuzz/validation-arbitraries.test.ts (2 tests) 2ms
✓ |unit-core| src/tests/proxy-command.test.ts (2 tests) 2ms
✓ |unit-core| src/daemon/tests/perf-plugin-routing-parity.test.ts (2 tests) 2ms
✓ |unit-core| src/commands/tests/command-flags.test.ts (1 test) 2ms
✓ |unit-core| src/core/tests/dispatch-target.test.ts (1 test) 2ms
✓ |unit-core| src/commands/capture/snapshot.test.ts (1 test) 2ms
✓ |unit-core| src/daemon/tests/daemon-process.test.ts (3 tests) 2ms
✓ |unit-core| src/cli/commands/tests/client-backed.test.ts (1 test) 1ms
✓ |fuzz-worker| scripts/fuzz/corpus-replay.test.ts (11 tests) 1381ms

Test Files 457 passed (457)
Tests 3911 passed (3911)
Start at 14:51:50
Duration 141.92s (transform 5.06s, setup 3.38s, import 69.36s, tests 172.89s, environment 19ms)

[dedupe] unit — covered by related tests or GitHub CI

[dedupe] provider-integration — covered by related tests or GitHub CI

[run] integration-progress: pnpm run test:integration:progress:check
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
Provider-backed integration status

Measure Value
Handler unit test files 140
Handler unit test LOC 45829
Handler unit tests 987
Handler files with vi.mock 72
Provider scenario files 54
Provider scenario LOC 14951
Provider scenario tests 158
Provider scenario support files 25
Provider scenario support LOC 4760
Provider scenario / handler LOC 32.6%
Public commands covered by provider-backed integration 54/54
Public commands missing provider-backed integration coverage 0
Device-observable workflow flags covered by provider-backed integration 67/67
Device-observable workflow flags missing provider-backed integration coverage 0
Public CLI flags intentionally outside provider-backed integration 91
Public CLI flags unclassified by progress script 0
Coverage summary not available; run pnpm test:coverage first

Mock-heavy handler unit tests

Tests LOC File
47 2311 src/daemon/handlers/tests/snapshot-handler.test.ts
43 2025 src/daemon/handlers/tests/session-replay-runtime-maestro.test.ts
17 1209 src/daemon/handlers/tests/session-replay-repair-transaction.test.ts
28 1203 src/daemon/handlers/tests/find.test.ts
26 1184 src/daemon/handlers/tests/session-replay-target-verification-runtime.test.ts
13 1138 src/daemon/handlers/tests/session-replay-divergence.test.ts
17 951 src/daemon/handlers/tests/session-observability.test.ts
17 900 src/daemon/handlers/tests/session-test-suite.test.ts
14 885 src/daemon/handlers/tests/react-native.test.ts
16 790 src/daemon/handlers/tests/interaction.test.ts
6 716 src/daemon/handlers/tests/session-replay-repair-empty-tail.test.ts
16 713 src/daemon/handlers/tests/interaction-ios-tap-outcome.test.ts

Public CLI flag coverage outside provider-backed integration

Bucket Flags Coverage owner
config, output, diagnostics, and transport config, remoteConfig, stateDir, daemonBaseUrl, daemonAuthToken, daemonTransport, daemonServerMode, remote, tenant, sessionIsolation, runId, leaseId, leaseBackend, json, help, version, verbose, cost, responseLevel args/CLI transport/auth tests
remote connection and session-lock policy force, noLogin, sessionLock connection/runtime/request policy tests
cloud artifact provider lookup provider, providerSessionId, providerApp, providerOsVersion, providerProject, providerBuild, providerSessionName, providerDeviceOrientation, providerGeoLocation, providerTimezone, providerLanguage, providerLocale, providerNetworkProfile, providerCustomNetwork, providerNoResignApp, awsProjectArn, awsDeviceArn, awsAppArn, awsRegion, awsInteractionMode cloud provider profile, artifact provider, CLI output, and cloud WebDriver provider scenario tests
Metro and React Native runtime preparation metroHost, metroPort, metroProjectRoot, metroKind, metroPublicBaseUrl, metroProxyBaseUrl, metroBearerToken, metroPreparePort, metroListenHost, metroStatusHost, metroStartupTimeoutMs, metroProbeTimeoutMs, metroRuntimeFile, metroNoReuseExisting, metroNoInstallDeps, bundleUrl, launchUrl Metro companion integration and parser tests
Apple launch and perf artifact options deviceHub, kind, launchArgs, perfTemplate, iosXctestrunFile, iosXctestDerivedDataPath, iosXctestEnvDir iOS platform, observability command, and parser tests
parser/client-only command flags artifact, dsym, githubActionsArtifact, snapshotDiff, snapshotForceFull, baseline, threshold, reporter, reportJunit, replayMaestro, recordVideo, shardAll, shardSplit, searchPath, stepsFile, proxyHost, proxyPort, stale args, CLI, debug-symbols, screenshot-diff, and batch tests
daemon lifecycle control clean daemon CLI lifecycle tests
platform boot fallback without provider seam headless, testIme handler and Android platform unit tests
open foreground auto-resolution (RFC prototype) foreground daemon session-open-foreground handler unit tests
Apple simulator screenshot rendering options screenshotNormalizeStatusBar, screenshotPixelDensity iOS platform and screenshot-diff runtime tests
Apple simulator private-AX capture options snapshotCustomActions runner XCTest unit, snapshot-lines, and snapshot-quality tests

Provider transcript pressure

Contract surface References Files
Android ADB provider 64 13
Apple runner provider 166 16
Apple simctl/devicectl provider 59 16
Apple macOS helper provider 28 4
Apple macOS host provider 68 10
Linux semantic desktop provider 44 8
Linux semantic accessibility/clipboard/screenshot provider 97 18
Linux semantic input provider 35 7
Linux generic tool provider 13 5
Web semantic provider 30 3
Recording provider 1 1

[run] replay-compat: pnpm run check:replay-compat
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
Verified 10 mined replay-compat scripts against their released blobs across 7 tags (14 derived entries are digest-pinned).

[run] daemon-wire-compat: pnpm run check:daemon-wire-compat
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
Daemon RPC wire surface checked against v0.20.10 (protocol unchanged): 170 declarations, 5 changed, 0 removed, 1 added.

[run] affected-selector: pnpm run check:affected:test
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ a TypeScript-only Apple change selects the iOS and macOS lanes without a Swift build (1.440667ms)
✔ a Swift runner change selects both builds and every Apple lane (0.099ms)
✔ an iOS replay script and the iOS smoke files own the iOS lanes (0.176416ms)
✔ the macOS coverage manifest selects its executable gate and macOS replay lane (0.07825ms)
✔ shared runtime surface owns every device lane (0.125791ms)
✔ another family owns only its own lanes, so an Android-only change carries no iOS check (0.193292ms)
✔ the fixture app owns the mobile lanes whichever subtree changes (0.08075ms)
✔ unit tests under src/ and packages/*/src own no lane (0.081542ms)
✔ a mixed tree is shared, and two Apple leaves are still Apple (0.065125ms)
✔ the surface never narrows a file the selector could not otherwise place (0.090958ms)
✔ a golden table owns the parity unit test and both runner builds (0.068625ms)
✔ a tooling change beside an Android-only change still fails open to the full set (0.087458ms)
✔ reports in sync when the installed snapshot byte-matches the checked-out lockfile (1.306167ms)
✔ reports stale when the installed snapshot content differs from the checked-out lockfile (0.491791ms)
✔ reports install-missing when a source checkout has no installed snapshot (0.231708ms)
✔ reports install-missing for a fresh worktree that has no node_modules directory at all (0.277875ms)
✔ reports no-source-checkout when there is no pnpm-lock.yaml (0.211834ms)
✔ reports no-source-checkout even when an installed snapshot exists without a lockfile (0.281125ms)
✔ checks each worktree against its own lockfile state (1.905041ms)
✔ production source selects static/build gates and delegates tests to Vitest (1.2575ms)
✔ platform source additionally selects provider-integration (0.147292ms)
✔ unit test files delegate affected-test discovery to Vitest (0.07625ms)
✔ Vitest owns project and support-module relationships through one check (0.215625ms)
✔ root node-integration support modules select the node integration suite (0.065958ms)
✔ android-adb stub test delegates project ownership to Vitest (0.069ms)
✔ Swift runner change selects both XCUITest platform builds (0.372583ms)
✔ a runner XCTest source also selects the test-list and package-source check (0.084917ms)
✔ Android helper change selects the android-helpers build (0.078708ms)
✔ MCP metadata change selects the mcp-metadata check (0.086667ms)
✔ public package surface change selects the build and the published-package gate via exports (0.0895ms)
✔ docs-only change selects no checks and records the docs paths (0.067792ms)
✔ agent guidance owns its focused contract instead of disappearing as docs-only (0.508958ms)
✔ test app source selects root lint and format plus its isolated typecheck (0.126167ms)
✔ unknown path fails open to the full check set (0.060083ms)
✔ a non-.ts fixture under an owned root fails open (format alone is not ownership) (0.056333ms)
✔ a frozen replay-compat corpus script selects the unit lane and the provenance verifier (0.045708ms)
✔ a replay-compat manifest edit selects the provenance verifier (0.266709ms)
✔ skills guidance change is docs-only (0.068541ms)
✔ workspace package source selects static gates, fallow, layering, and the build (0.111958ms)
✔ a workspace package manifest fails open — it rewires resolution globally (0.033459ms)
✔ workflow/tooling and selector implementation changes fail open (0.043041ms)
✔ a fail-open path in a mixed changeset forces the full set (0.041083ms)
✔ empty changeset selects nothing (0.023917ms)
✔ catalog covers exactly the CheckId universe (0.097875ms)
✔ every catalog command resolves against the real package scripts (0.300708ms)
✔ a missing package script makes command resolution throw (0.143083ms)
✔ unit and coverage checks preserve their package-script owners (0.037083ms)
✔ vitest-related delegates changed paths to Vitest instead of modeling projects (0.031333ms)
✔ catalog resolves against the real package.json (0.129959ms)
✔ platform package source selects runtime contracts, provider scenarios, and coverage (0.937958ms)

[skip] web-smoke — GitHub-authoritative (jobs: Integration Tests, Typecheck & Package)

[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] linux-command-evidence — 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

[run] lint: pnpm run lint

check:affected: lint failed.

[skip] web-smoke — GitHub-authoritative (jobs: Integration Tests, Typecheck & Package)

[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] linux-command-evidence — 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

[run] lint: pnpm run lint

[run] typecheck: pnpm run typecheck

[run] layering: pnpm run check:layering

[run] fallow: pnpm run check:fallow --base origin/main

[run] build: pnpm run build

[run] vitest-related: pnpm exec vitest related --run --passWithNoTests --maxWorkers=2 packages/selectors/src/index.ts packages/selectors/src/index.test.ts

check:affected: all runnable checks passed.

[skip] test-app-typecheck — GitHub-authoritative (jobs: Test App Build Cache / Resolve native fingerprint)

[skip] unit-ci — GitHub-authoritative (jobs: Coverage, Coverage Report, Integration Tests)

[skip] coverage — GitHub-authoritative (jobs: Coverage Report)

[skip] swift-runner-ios — GitHub-authoritative (jobs: Conformance Differential / iOS Conformance Differential, XCTest Nightly / iOS Runner Full XCTest Suite, iOS / Smoke Tests)

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

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

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

[skip] web-smoke — GitHub-authoritative (jobs: Integration Tests, Typecheck & Package)

[skip] freerange — GitHub-authoritative (jobs: Repo Guards)

[skip] maestro-differential — GitHub-authoritative (jobs: Conformance Differential / iOS Conformance Differential)

[skip] maestro-regenerate — GitHub-authoritative (jobs: Conformance Regenerate Verify / Regenerate & Verify Fixtures)

[skip] fuzz-parsers — GitHub-authoritative (jobs: Replay Nightly / Parser Fuzz Lane)

[skip] mutation — GitHub-authoritative (jobs: Mutation Affected / Mutants (${{ matrix.name }}), Mutation Weekly / Mutants (${{ matrix.name }}))

[skip] mutation-affected — GitHub-authoritative (jobs: Mutation Affected / Select affected kernels)

[skip] mutation-check — GitHub-authoritative (jobs: Mutation Weekly / Mutation score report)

[skip] concurrency-torture — GitHub-authoritative (jobs: Concurrency Torture Nightly / Session/lease/lock torture sweep, Integration Tests)

[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] linux-command-evidence — 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

[run] lint: pnpm run lint

[run] typecheck: pnpm run typecheck

[run] layering: pnpm run check:layering

[run] di-seams: pnpm run check:di-seams

[run] fallow: pnpm run check:fallow --base origin/main

[run] mcp-metadata: pnpm run check:mcp-metadata

[run] build: pnpm run build

[run] package: pnpm run check:package

[run] integration-node: pnpm run test:integration:node

[run] macos-coverage: pnpm run test:integration:macos-coverage

[run] vitest-related: pnpm exec vitest related --run --passWithNoTests --maxWorkers=2

[dedupe] unit — covered by related tests or GitHub CI

[dedupe] provider-integration — covered by related tests or GitHub CI

[run] integration-progress: pnpm run test:integration:progress:check

[run] replay-compat: pnpm run check:replay-compat

[run] daemon-wire-compat: pnpm run check:daemon-wire-compat

[run] affected-selector: pnpm run check:affected:test

[run] gate-manifest: pnpm run check:gate-manifest

[run] gate-manifest-model: pnpm run check:gate-manifest:test

[run] depgraph: pnpm run depgraph:test

[run] tmpdir-leaks: pnpm run check:tmpdir-leaks

[run] tmpdir-leaks-model: pnpm run check:tmpdir-leaks:test

[run] coverage-model: pnpm run check:coverage-changed:test

[run] wire-compat-model: pnpm run check:daemon-wire-compat:test

[run] production-exports: pnpm run check:production-exports

[run] bundle-owner-files: pnpm run check:bundle-owner-files

[run] fixture-cache: pnpm run test:fixture-cache

[run] fixture-fallback: pnpm run test:fixture-fallback

[run] command-docs: pnpm run check:command-docs

[run] agent-guidance: pnpm run check:agent-guidance

[run] xctest-selection: pnpm run check:xctest-selection

[run] maestro-conformance: pnpm run maestro:conformance

[run] mutation-model: pnpm run mutation:test

check:affected: all runnable checks passed.

[skip] test-app-typecheck — GitHub-authoritative (jobs: Test App Build Cache / Resolve native fingerprint)

[skip] unit-ci — GitHub-authoritative (jobs: Coverage, Coverage Report, Integration Tests)

[skip] coverage — GitHub-authoritative (jobs: Coverage Report)

[skip] swift-runner-ios — GitHub-authoritative (jobs: Conformance Differential / iOS Conformance Differential, XCTest Nightly / iOS Runner Full XCTest Suite, iOS / Smoke Tests)

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

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

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

[skip] web-smoke — GitHub-authoritative (jobs: Integration Tests, Typecheck & Package)

[skip] freerange — GitHub-authoritative (jobs: Repo Guards)

[skip] maestro-differential — GitHub-authoritative (jobs: Conformance Differential / iOS Conformance Differential)

[skip] maestro-regenerate — GitHub-authoritative (jobs: Conformance Regenerate Verify / Regenerate & Verify Fixtures)

[skip] fuzz-parsers — GitHub-authoritative (jobs: Replay Nightly / Parser Fuzz Lane)

[skip] mutation — GitHub-authoritative (jobs: Mutation Affected / Mutants (${{ matrix.name }}), Mutation Weekly / Mutants (${{ matrix.name }}))

[skip] mutation-affected — GitHub-authoritative (jobs: Mutation Affected / Select affected kernels)

[skip] mutation-check — GitHub-authoritative (jobs: Mutation Weekly / Mutation score report)

[skip] concurrency-torture — GitHub-authoritative (jobs: Concurrency Torture Nightly / Session/lease/lock torture sweep, Integration Tests)

[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] linux-command-evidence — 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

[run] lint: pnpm run lint

[run] typecheck: pnpm run typecheck

[run] layering: pnpm run check:layering

[run] di-seams: pnpm run check:di-seams

[run] fallow: pnpm run check:fallow --base origin/main

[run] mcp-metadata: pnpm run check:mcp-metadata

[run] build: pnpm run build

[run] package: pnpm run check:package

[run] integration-node: pnpm run test:integration:node

[run] macos-coverage: pnpm run test:integration:macos-coverage

[run] vitest-related: pnpm exec vitest related --run --passWithNoTests --maxWorkers=2

[dedupe] unit — covered by related tests or GitHub CI

[dedupe] provider-integration — covered by related tests or GitHub CI

[run] integration-progress: pnpm run test:integration:progress:check

[run] replay-compat: pnpm run check:replay-compat

[run] daemon-wire-compat: pnpm run check:daemon-wire-compat

[run] affected-selector: pnpm run check:affected:test

[run] gate-manifest: pnpm run check:gate-manifest

[run] gate-manifest-model: pnpm run check:gate-manifest:test

[run] depgraph: pnpm run depgraph:test

[run] tmpdir-leaks: pnpm run check:tmpdir-leaks

[run] tmpdir-leaks-model: pnpm run check:tmpdir-leaks:test

[run] coverage-model: pnpm run check:coverage-changed:test

[run] wire-compat-model: pnpm run check:daemon-wire-compat:test

[run] production-exports: pnpm run check:production-exports

[run] bundle-owner-files: pnpm run check:bundle-owner-files

[run] fixture-cache: pnpm run test:fixture-cache

[run] fixture-fallback: pnpm run test:fixture-fallback

[run] command-docs: pnpm run check:command-docs

[run] agent-guidance: pnpm run check:agent-guidance

[run] xctest-selection: pnpm run check:xctest-selection

[run] maestro-conformance: pnpm run maestro:conformance

[run] mutation-model: pnpm run mutation:test

check:affected: all runnable checks passed.

check:affected: node_modules does not match this worktree's pnpm-lock.yaml
(node_modules/.pnpm/lock.yaml disagrees with pnpm-lock.yaml)
Worktree: .
Run pnpm install --frozen-lockfile in this worktree, then retry.

check:affected: node_modules does not match this worktree's pnpm-lock.yaml
(no node_modules/.pnpm/lock.yaml found — this checkout was never installed)
Worktree: .
Run pnpm install --frozen-lockfile in this worktree, then retry.

[skip] web-smoke — GitHub-authoritative (jobs: Integration Tests, Typecheck & Package)

[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] linux-command-evidence — 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

[run] lint: pnpm run lint

[run] typecheck: pnpm run typecheck

[run] layering: pnpm run check:layering

[run] fallow: pnpm run check:fallow --base origin/main

[run] build: pnpm run build

[run] vitest-related: pnpm exec vitest related --run --passWithNoTests --maxWorkers=2

check:affected: all runnable checks passed.

[skip] web-smoke — GitHub-authoritative (jobs: Integration Tests, Typecheck & Package)

[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] linux-command-evidence — 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

[run] lint: pnpm run lint

[run] typecheck: pnpm run typecheck

[run] layering: pnpm run check:layering

[run] fallow: pnpm run check:fallow --base origin/main

[run] build: pnpm run build

[run] vitest-related: pnpm exec vitest related --run --passWithNoTests --maxWorkers=2

check:affected: all runnable checks passed.
✔ readChangedFiles surfaces committed, staged, unstaged, untracked, and both rename paths (1736.009958ms)
✔ readChangedFiles unions staged and unstaged so a net diff cannot hide a file (1431.957917ms)
✔ readChangedFiles excludes repository-owned host-local workspace roots (1274.610458ms)
✔ runChecks runs local checks in order and stops on the first failure (146.562792ms)
✔ runChecks passes the selector change set to Vitest related (112.513625ms)
✔ runChecks skips GitHub-authoritative checks and passes when locals succeed (114.4155ms)
✔ runChecks leaves coverage to CI and runs capped related tests once (105.018583ms)
✔ runChecks fails fast on a stale install before running format or any other check (0.186541ms)
✔ runChecks fails fast when node_modules was never installed in this checkout (0.136791ms)
✔ runChecks does not block when there is no source checkout to compare against (93.6695ms)
✔ runChecks proceeds normally when the install is in sync (77.399209ms)
✔ runChecks names the real cause on stderr instead of surfacing as an unrelated failure (0.26875ms)
ℹ tests 62
ℹ suites 0
ℹ pass 62
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 5449.686541

[run] gate-manifest: pnpm run check:gate-manifest
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
gate manifest: ok — 50 checks wired across 28 lanes, manual-only: replay-android, replay-ios, replay-ios-device.

[run] gate-manifest-model: pnpm run check:gate-manifest:test
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ the live tree is green — every planted failure below is a real difference (219.893042ms)
✔ deleting the lane that runs a gate reports exactly that gate, naming the runner (178.653ms)
✔ a docs-only change still reaches the command-reference gate (#1420) (175.624417ms)
✔ a path filter that excludes a category fails, though the check still runs somewhere (178.765375ms)
✔ a Vitest project no check runs is reported, and so is a suite script (363.991583ms)
✔ a test:* script that is a suite by name, not by shape, needs an owner (159.449542ms)
✔ a parked check selected by a path is exempt from path-coverage only while declared (276.158667ms)
✔ the live tree is green (222.618ms)
✔ a structural gate id must exist in CHECK_CATALOG (180.254958ms)
✔ raw shell text cannot declare ownership (189.061625ms)
✔ reusable workflows fail closed because their action declarations are hidden (177.286791ms)
✔ every manual-only declaration names a registered check no qualifying lane owns (1.345333ms)
✔ deleting a manual-only declaration reports its check as unowned (140.340458ms)
✔ deleting a parked job fails instead of reading as still parked (183.265ms)
✔ a parked lane re-triggered by push fails even though push does not qualify (164.083917ms)
✔ a parked lane that loses workflow_dispatch entirely fails (159.962667ms)
✔ a parked lane back on a schedule fails until its declaration is deleted (157.769625ms)
✔ a parked lane that stops declaring its gate fails unless the gate is opaque (158.446875ms)
✔ unknown assertion kinds remain visible in the report (0.223208ms)
✔ an env prefix does not hide the command behind it (0.788ms)
✔ a filtered Vitest run does not credit the whole project (0.365292ms)
✔ a bare Vitest run spans every configured project (0.087208ms)
✔ a negated --project subtracts from the configured set, so the skipped one is not credited (0.07425ms)
✔ the two halves of test:coverage:ci together still own every project (0.073583ms)
✔ aggregates expand transitively, so a lane running the aggregate owns its parts (0.062417ms)
node --test globs expand against the tree, which is how test:smoke is owned (0.4935ms)
✔ the live ios.yml paths-ignore agrees with the selector over every tracked path (79.454042ms)
✔ the routed lane derives its needs from its declared gate plus the sampled checks (0.124875ms)
✔ ignoring an Apple-owned tree is reported with the checks the selector routes it to (71.11325ms)
✔ ignoring a tooling glob is reported as fail-open, even under .github/ (63.0165ms)
✔ a .github path ignored by exact name stays the workflow’s own call (62.866083ms)
✔ the exemption cannot name an action the lane itself runs (246.922333ms)
✔ the exemption cannot name a support file of an action the lane runs (176.392125ms)
✔ an unowned path under an ignored root asks for an owner, not for the entry’s removal (56.106083ms)
✔ dropping a family root from the ignore list fails the routing claim for that tree (56.03975ms)
✔ dropping the unit-test ignore fails the routing claim for a unit test (56.594ms)
✔ a routed lane that loses its pull_request trigger, or its job, is reported (0.153083ms)
✔ a registered gate resolves to its package script (0.594ms)
✔ lane-specific flags are forwarded verbatim, with or without a -- separator (0.070208ms)
✔ a lane supplying --base replaces the default rather than passing it twice (0.057208ms)
✔ an unknown gate fails loudly and lists what is registered (0.297833ms)
✔ a registered check whose script was renamed away fails instead of silently skipping (0.080667ms)
✔ the canonical action binds and runs a structural gate without optional arguments (360.618041ms)
✔ a command repeating a script body verbatim credits that script (0.455959ms)
✔ path filters use GitHub glob semantics (0.215291ms)
✔ lanes carry the workflow spelling the catalog used, and only real triggers qualify (0.08625ms)
✔ a workflow_dispatch-only lane owns nothing, however many gates it declares (1.6145ms)
✔ trigger kinds survive the model, not just whether they qualify (1.047083ms)
✔ a gate invoked from inside a composite action belongs to the calling lane (0.062333ms)
✔ a composite action cycle is a loud error, not an empty step list (2.129417ms)
✔ nesting deeper than the old cutoff is followed rather than silently dropped (3.49ms)
ℹ tests 51
ℹ suites 0
ℹ pass 51
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 2486.493125

[run] depgraph: pnpm run depgraph:test
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ collectDependents separates direct importers from transitive ones (9.716084ms)
✔ collectDependents ignores type-only and dynamic dependents, which are counted separately (0.199709ms)
✔ zoneBreakdown and rankByFanIn order by weight, then name (0.186583ms)
✔ commandsReaching follows the dynamic import a route uses to load its handler (0.186083ms)
✔ guaranteeRowsForFile matches module-qualified cells only, on the whole path (0.082625ms)
✔ bounded lists disclose what they hid (0.108375ms)
✔ every daemon route in the real route table resolves to a handler entry (0.9505ms)
✔ the real guarantee matrix contributes module-qualified rows (0.142125ms)
✔ a flag keeps its value whichever side of the path it is on (0.503375ms)
✔ parseInvocation rejects a missing path, a second path, and a non-positive limit (0.372959ms)
✔ text output bounds every list and says what it hid (0.23575ms)
✔ blast radius over the real tree agrees with check:affected and stays under 10s (494.170208ms)
✔ collapseEdges keeps one edge per pair at the strongest kind (7.249ms)
✔ flags only value edges whose target is already reachable at distance >= 2 (0.305ms)
✔ a type-only shortcut is never flagged against a value path (0.557291ms)
✔ collectCycles separates gate-rejected value cycles from type-only and dynamic loops (0.391125ms)
✔ buildGraph reports zone membership, degrees, and cross-zone edge counts (0.350292ms)
✔ the report's inversion count reproduces the gate's TYPE_INVERSION_BASELINE (450.707917ms)
✔ no tracked TypeScript source contains a raw NUL byte (314.2075ms)
✔ build.ts writes the default path and a summary consistent with the JSON (907.520625ms)
✔ build.ts honours --out and reports the path it wrote (912.966084ms)
✔ build.ts falls back to the default path when --out has no value (825.924ms)
ℹ tests 22
ℹ suites 0
ℹ pass 22
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 3780.574666

[run] tmpdir-leaks: pnpm run check:tmpdir-leaks
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
No abandoned agent-device-test-run-* directories found in /tmp.

[run] tmpdir-leaks-model: pnpm run check:tmpdir-leaks:test
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ a directory owned by a still-running process is not reported as a leak (1.104625ms)
✔ a directory whose owning process has exited is reported as a leak (0.404542ms)
✔ a concurrent run from another worktree does not fail the check for this one (0.431209ms)
✔ a mix of active and abandoned directories reports only the abandoned one (1.611416ms)
✔ a directory with no parseable pid is conservatively reported as a leak (0.538959ms)
✔ non-matching directories and files are ignored (0.503417ms)
✔ pruning removes only abandoned directories and returns their names (1.015208ms)
✔ pruning nothing is a no-op that reports nothing (0.419333ms)
✔ a directory whose owner is dead but which some live process still holds as TMPDIR is not a leak (0.605417ms)
✔ a consumer is identified by the run directory its TMPDIR sits inside, at any depth (0.115583ms)
✔ the wrapper redirects a node --test child TMPDIR and removes it after the run (532.464917ms)
✔ the wrapper still cleans up and forwards a nonzero exit code when the child fails (419.169791ms)
✔ the wrapper keeps AGENT_DEVICE_SWIFT_CACHE_DIR outside the disposable TMPDIR (501.565333ms)
✔ the wrapper isolates advisory device claims inside its disposable run directory (423.192042ms)
✔ every node --test package.json script routes through scripts/node-test-tmpdir.ts (0.792125ms)
✔ the wrapper prunes a run directory abandoned by an earlier killed run and keeps a live one (437.341416ms)
✔ a run whose owner alone was killed keeps its directory while a child still uses it, and loses it once the child exits (1128.332875ms)
✔ the Swift toolchain wrapper removes its TMPDIR after success (204.823417ms)
✔ the Swift toolchain wrapper cleans up and forwards a failure (108.582292ms)
✔ the Swift toolchain wrapper keeps TMPDIR until a signaled child exits (405.606ms)
✔ the Swift toolchain wrapper keeps TMPDIR until signaled descendants exit (355.958334ms)
✔ Apple build lanes route toolchain commands through the cleanup wrapper (0.7675ms)
✔ the configured Vitest lifecycle redirects worker TMPDIR and removes it after the run (672.902708ms)
✔ global setup prunes a run directory abandoned by an earlier killed run and keeps a live one (673.527083ms)
ℹ tests 24
ℹ suites 0
ℹ pass 24
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 3538.120333

[run] coverage-model: pnpm run check:coverage-changed:test
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ normalizePath strips root, b/ and ./ prefixes and posixifies (0.412416ms)
✔ parseLcov reads DA hits and BRDA taken, treating "-" as not taken (0.463417ms)
✔ parseUnifiedDiff numbers added lines per hunk and ignores deleted lines (0.261875ms)
✔ parseUnifiedDiff marks deleted files and keeps rename destinations (0.503666ms)
✔ source/test classification matches the coverage include glob (0.187042ms)
✔ ignoredLineSet handles next, next N and start/stop ranges (0.183208ms)
✔ gate fails when changed-line coverage is below threshold and lists offenders (0.196ms)
✔ workspace package source counts toward the gate like root source (0.090459ms)
✔ non-executable added lines (absent from DA) never enter the denominator (0.075125ms)
✔ deleted files and docs-only changes are a trivial pass with null pct (0.083833ms)
✔ waiver forces a pass but still reports the numbers (0.061958ms)
✔ includable source absent from lcov counts as excluded-path code lines (0.089208ms)
✔ changed line suppressed by an ignore directive is tallied, not gated (0.093667ms)
✔ threshold constant is the single source of truth (0.027375ms)
✔ passes and prints n/a for a docs-only change without touching coverage (1163.328458ms)
✔ reads a large stacked diff beyond the subprocess default buffer (1209.991416ms)
✔ fails when a changed source line is uncovered and names that line (1154.448125ms)
✔ fails when a changed workspace package line is uncovered and names that line (1226.564ms)
✔ waiver env keeps the job green, still reporting numbers to the job summary (1182.790042ms)
✔ errors when the lcov report is missing rather than silently passing (1146.0015ms)
ℹ tests 20
ℹ suites 0
ℹ pass 20
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 7176.448166

[run] wire-compat-model: pnpm run check:daemon-wire-compat:test
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ an unchanged wire surface passes (0.632459ms)
✔ a changed wire declaration without a bump or ack fails, naming the symbol (0.153917ms)
✔ the same change passes once the protocol version is bumped (0.057334ms)
✔ the same change passes with a compatible-change ack at the new digest (0.062416ms)
✔ an ack pinned to a superseded digest does not cover the next change (0.065375ms)
✔ an ack with an empty rationale does not count as an ack (0.059167ms)
✔ a removed wire declaration fails even when acked, because only a bump covers it (0.06275ms)
✔ a removed wire declaration passes with a bump (0.276208ms)
✔ a newly added wire declaration is additive and needs nothing (0.066833ms)
ℹ tests 9
ℹ suites 0
ℹ pass 9
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 75.887833

[run] production-exports: pnpm run check:production-exports
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
── Unused Code ─────────────────────────────────────

● Unused exports (33)
packages/maestro/src/internal/conformance-value-coercion.ts (5)
:3 asRecord
:9 str
:13 bool
:18 numLike
:28 dropUndefined
src/platforms/web/agent-browser-lifecycle.ts (4)
:10 agentBrowserChromeLaunchMarker (re-export)
:13 matchAgentBrowserChromeProcess (re-export)
:15 summarizeAgentBrowserProcesses (re-export)
:16 summarizeManagedAgentBrowserProcesses (re-export)
packages/maestro/src/internal/conformance-selector-projection.ts (3)
:27 canonicalizeUpstreamPoint
:40 canonicalizeAgentPoint
:73 canonicalizeAgentTarget
scripts/fuzz/validation-arbitraries-cli.ts (3)
:71 validationSurfaceBuildCount
:324 generatableCliSurface
:333 CLI_MUTATION_NAMES
src/daemon/apple-runner-options.ts (2)
:39 buildAppleRunnerSessionOptions
:82 createAppleRunnerCacheColdBootPrewarmForOpen
src/platforms/apple/core/apps.ts (2)
:9 installIosInstallablePath (re-export)
:11 pushIosNotification (re-export)
packages/maestro/src/internal/runtime-target-ranking.ts
:77 selectMaestroPositionMatches
scripts/fuzz/envelope.ts
:105 NON_GENERATING_MODULES
scripts/fuzz/validation-arbitraries-maestro.ts
:98 MAESTRO_MUTATION_NAMES
scripts/help-conformance-case-checks.mjs
:33 KNOWN_EXPECTATIONS
... and 10 more in 10 files (--format json for full list)
Exported symbols with no known consumers — https://docs.fallow.tools/explanations/dead-code#unused-exports
To auto-fix: fallow fix --dry-run
To suppress: // fallow-ignore-next-line unused-exports

[run] bundle-owner-files: pnpm run check:bundle-owner-files
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
Verified the ownerFiles key and 49 owner-file paths are absent from 302 production bundles.

[run] fixture-cache: pnpm run test:fixture-cache
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ producer, consumers, upload, and concurrency use the canonical platform-scoped artifact name (7.88625ms)
✔ Android smoke consumes the restored APK through catalog fixture E2E (63.211125ms)
✔ Android APK locator emits an exact APK path and package id, and rejects collisions or malformed artifacts (839.466042ms)
✔ Android APK repack signs the output and preserves its package id (1266.087292ms)
✔ producer maps each platform to its resolved lookup and matrix artifact name (446.563875ms)
✔ artifact name resolver scopes both platforms and rejects invalid output (1565.883625ms)
✔ same-name artifact from an untrusted repository cannot suppress a trusted candidate (0.324834ms)
✔ same-name artifact from another workflow falls back instead of being executed (0.144084ms)
✔ same-repository artifact from an unrelated feature head is rejected (0.123584ms)
✔ default-branch producer artifacts remain reusable across native-equivalent heads (0.143083ms)
✔ producer state is derived only from the trusted exact-head workflow run (0.218584ms)
ℹ tests 11
ℹ suites 0
ℹ pass 11
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 4246.131167

[run] fixture-fallback: pnpm run test:fixture-fallback
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ producer, consumers, upload, and concurrency use the canonical platform-scoped artifact name (7.887792ms)
✔ Android smoke consumes the restored APK through catalog fixture E2E (67.967625ms)
✔ Android APK locator emits an exact APK path and package id, and rejects collisions or malformed artifacts (767.170583ms)
✔ Android APK repack signs the output and preserves its package id (900.105417ms)
✔ producer maps each platform to its resolved lookup and matrix artifact name (324.85975ms)
✔ artifact name resolver scopes both platforms and rejects invalid output (1536.559208ms)
✔ same-name artifact from an untrusted repository cannot suppress a trusted candidate (0.180375ms)
✔ same-name artifact from another workflow falls back instead of being executed (0.076916ms)
✔ same-repository artifact from an unrelated feature head is rejected (0.06175ms)
✔ default-branch producer artifacts remain reusable across native-equivalent heads (0.07475ms)
✔ producer state is derived only from the trusted exact-head workflow run (0.107291ms)
ℹ tests 11
ℹ suites 0
ℹ pass 11
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 3659.9165
--- ios fetch step output ---
::warning::Could not query the build cache for fingerprint.deadbeefcafe.ios; building inline.
fingerprint.deadbeefcafe.ios not in the cache after the configured wait; building inline.
--- exit code: 0 ---
--- android fetch step output ---
::warning::Could not query the build cache for fingerprint.deadbeefcafe.android; building inline.
fingerprint.deadbeefcafe.android not in the cache after the configured wait; building inline.
--- exit code: 0 ---
PASS: platform-scoped build-cache lookup failures degrade to inline builds.
PASS: queued, failed, and absent producers exit the wait path early.

[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.11 /Users/thymikee/.codex/worktrees/572f/agent-device

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

Test Files 1 passed (1)
Tests 11 passed (11)
Start at 14:55:19
Duration 967ms (transform 447ms, setup 16ms, import 550ms, tests 4ms, environment 0ms)

[run] agent-guidance: pnpm run check:agent-guidance
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ high-traffic guidance stays within its reviewed context budget (2.415459ms)
✔ task guidance stays focused instead of growing another handbook (3.406625ms)
✔ CONTEXT.md remains a glossary rather than an architecture or workflow document (0.661333ms)
✔ the AGENTS.md task router points only at files that exist (1.348208ms)
ℹ tests 4
ℹ suites 0
ℹ pass 4
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 75.28675

[run] xctest-selection: pnpm run check:xctest-selection
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
xctest selection: 209 declared AgentDeviceRunnerUITests methods — host lane (.github/workflows/macos.yml, macOS, every PR) reaches 183, PR list (.github/workflows/ios.yml, iOS Simulator, every PR) selects 74, nightly (.github/workflows/xctest-nightly.yml, iOS Simulator) reaches 207; 0 reachable by no lane; RunnerTests/testCommand skipped everywhere.

[run] maestro-conformance: pnpm run maestro:conformance
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ agent-device JSON distinguishes infrastructure from behavioral failures (0.406167ms)
✔ agent-device execution accepts a CLI path containing spaces (37.283542ms)
✔ a tap that latches early holds the settle invariant (0.485167ms)
✔ a tap that burns the full settle budget violates the invariant (bug class 4) (0.09075ms)
✔ the invariant reports the slowest matching step, not the first (0.051875ms)
✔ a trace with no matching step reports no-data rather than passing silently (0.039917ms)
✔ start events and steps without a duration are ignored (0.048667ms)
✔ readTrace parses ndjson and skips blank/corrupt lines (0.593583ms)
✔ readTrace on a missing file returns no events (0.27225ms)
✔ bug class 4 has a machine-checkable invariant, not just outcome parity (0.069459ms)
✔ the settle detector reaches its tap without an unrelated setup command (3.660625ms)
✔ the settle flow guard rejects a changed tap target or inserted scroll (1.585583ms)
✔ a tap that actually retried holds the retry invariant (0.0895ms)
✔ a tap that never retried violates the invariant (catches a vacuous scenario) (0.048958ms)
✔ a trace whose taps record no metric reports no-data rather than passing (0.041709ms)
✔ the retry scenario is active and carries the invariant that makes it mean something (0.054917ms)
✔ the retry scenario is not waived by a divergence declaration (0.030666ms)
✔ the retry flow drives the inert surface, not a live screen (0.464208ms)
✔ no device scenario claims to prove percent truncation (bug class 1) (0.0815ms)
✔ a swipe with endpoint-hold in resultTiming holds the gesture execution profile invariant (0.1195ms)
✔ a swipe with timed-pan violates the endpoint-hold invariant (0.048334ms)
✔ a trace with no executionProfile reports no-data (0.028ms)
✔ percent-swipe asserts the endpoint-hold execution profile in its engine-side invariant (0.037583ms)
✔ writes the typed differential report envelope (1.157334ms)
✔ every differential scenario references an existing corpus flow with a unique id (0.474333ms)
✔ the settle-loop bug class (4) is covered by a differential scenario (0.068625ms)
✔ --trace-root is accepted so engine-side invariants can be evaluated (0.065417ms)
✔ no differential scenario points at the parse-only layer-1 corpus (0.26075ms)
✔ every knownDivergence carries a tracking issue (0.0645ms)
▶ knownDivergence signature matching
✔ matches the declared failure exactly (0.106125ms)
✔ upstream also failing is NOT covered by the waiver (0.050167ms)
✔ our engine unexpectedly passing is NOT covered (declaration is stale) (0.048959ms)
✔ a different invariant outcome is NOT covered (0.051ms)
✔ a new invariant appearing is NOT covered (0.069584ms)
✔ every declaration states its expected signature (0.060667ms)
✔ knownDivergence signature matching (0.547333ms)
✔ an ordinary Maestro process failure cannot satisfy a behavioral waiver (59.662334ms)
✔ every device flow targets the fixture app the workflow installs (6.718792ms)
✔ --only selects a single scenario and rejects unknown ids (0.170834ms)
✔ runner arg parsing honors dry-run and platform (0.037459ms)
✔ fixture content is sealed against hand editing (1.805084ms)
✔ vendored upstream corpus content matches its manifest sha256 (4.61925ms)
✔ the seal rejects an edited capture (proof the check has teeth) (0.359542ms)
✔ fixtures pin the reviewed upstream Maestro artifacts (0.464084ms)
✔ layer 1: upstream-rejected flows that agent accepts must be declared as we-are-lenient (17.563708ms)
✔ layer 1: we-are-lenient flows preserve unresolved ${VAR} tokens in the agent canonical model (7.835416ms)
✔ layer 1: every divergence is declared (no silent drift) (5.992542ms)
✔ layer 1: no stale divergence declarations (6.177083ms)
✔ layer 2: generated semantic vectors match live engine constants (2.184875ms)
✔ coverage: every supported command is fixture-backed or explicitly unverified (5.696375ms)
✔ bug class 1: decimal percentage coordinates are rejected (not rounded) (5.260416ms)
✔ bug class 2: a target swipe without a direction is rejected (6.385542ms)
✔ bug class 3: the retry cap matches the upstream MAX_RETRIES_ALLOWED constant (6.127292ms)
✔ bug class 4: settle default parses identically; ordering is a layer-3 differential (5.481416ms)
✔ generated fixtures use the repository JSON format (62.021792ms)
ℹ tests 54
ℹ suites 1
ℹ pass 54
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 240.018416

[run] mutation-model: pnpm run mutation:test
[WARN] This project is configured to use 11.17.0 of pnpm. Your current pnpm is v11.21.0
✔ stryker mutate globs mirror the kernel-module registry (0.678375ms)
✔ stryker owns no pass/fail threshold — the lane never gates on a score (0.543791ms)
✔ the config content hash is stable and content-addressed (0.314917ms)
✔ the envelope carries schema, commit, tool/config provenance, duration and result (11.216208ms)
✔ a lane that produced no report is recorded as a failed run (0.096792ms)
✔ a crashed run still writes an envelope naming the stage it died in (1286.315542ms)
✔ merging shard reports ignores the envelope sitting beside them (463.293875ms)
✔ an incomplete shard set fails instead of scoring the missing module as zero (375.479584ms)
✔ a short shard set publishes the shards that did report, then fails (534.424333ms)
✔ a malformed invocation still writes an envelope (476.107167ms)
✔ --fail-envelope declares a step that failed before the sweep (512.053958ms)
✔ --fail-envelope keeps a failure the run already reported (662.155459ms)
✔ --fail-envelope downgrades a passing envelope when a later step fails (1135.66225ms)
✔ both mutation lanes record an envelope for failures before the sweep (0.237166ms)
✔ both mutation lanes publish the envelope (0.148042ms)
✔ every enumerated kernel path exists (0.431541ms)
✔ changed sources map onto the module that owns them (0.13575ms)
✔ affected selection is deduplicated and registry-ordered (0.31775ms)
✔ mutate globs default to every module and narrow on request (0.0725ms)
✔ the shard matrix slices only the modules that declare shards (0.163291ms)
✔ a kernel test is reachable only under root or package src (0.0955ms)
✔ a kernel is owned by the mirrored test that imports it directly (800.971833ms)
✔ a kernel is owned by tests that reach it indirectly (61.194417ms)
✔ ownership is complete: every test reaching a kernel owns it (1899.1235ms)
✔ non-kernel sources and non-tests are not owned (0.123417ms)
✔ derived selection unions source ownership with test reachability (20.746ms)
✔ the table carries score, killed, survived, total and timeouts per kernel (27.576375ms)
✔ statuses outside the score (Ignored, CompileError, RuntimeError) leave the denominator (0.092625ms)
✔ a kernel with no surviving mutants lists no detail section (0.097667ms)
✔ a lane-tooling diff selects real mutants (2646.821208ms)
✔ a kernel diff selects nothing — only a harness diff spends mutants (1782.5465ms)
✔ a docs-only diff selects nothing (0.068417ms)
✔ mutate globs expand to real kernel sources and exclude selector tests (5.841583ms)
✔ the thread-hostile exclusion is derived from imports, not listed (1434.1105ms)
✔ the weekly sweep shards exactly the registry matrix (1.777209ms)
✔ the weekly sweep merges the shards into one score table (0.339292ms)
✔ no mutation shard is allowed to exceed the 30-minute budget (0.228542ms)
✔ the affected lane triggers on exactly the lane sources that can select mutants (0.261709ms)
✔ Stryker aliases every exported workspace subpath exactly (1171.530916ms)
ℹ tests 39
ℹ suites 0
ℹ pass 39
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 6103.794875

check:affected: all runnable checks passed. passed all runnable checks (457 Vitest files / 3,911 tests; 92 integration-node tests with 9 live-device skips).\n\nCurrent head: ; CI is running.

@thymikee
thymikee force-pushed the fix/1545-daemon-reuse branch from d124858 to 26ef934 Compare August 25, 2026 13:04
@thymikee

Copy link
Copy Markdown
Member Author

Coverage (1) failed only because the file-size ratchet caught src/utils/__tests__/daemon-client.test.ts growing to 1922 lines. I removed the redundant duplicate takeover test from that legacy file, kept the stronger real-child proof in the dedicated daemon-process takeover suite, and lowered the exact ratchet pin to 1873.

The focused suite now passes 47/47, and the elevated pnpm check:affected --run gate passes all runnable checks. Pushed corrected head 26ef934398a656ebb8bffa3dc9cbd8c5b77991b; CI can rerun on that head. I am not watching CI continuously per request.

@thymikee

Copy link
Copy Markdown
Member Author

Re-reviewed 26ef934. The prior process-start-time ownership blocker is correctly fixed: missing identity now fails closed, exact start time is re-read before path admission, and the real-child regression proves no signal is sent without identity. The earlier Coverage failure was owner-action test-size debt and this head removes the duplicated takeover test.

P1 — the web shutdown smoke's guaranteed cleanup can no longer stop its daemon. test/integration/smoke-web-platform.test.ts promises that finally kills a daemon which survived SIGTERM, but cleanupWebShutdownSmoke passes expectedStartTime: undefined to the newly fail-closed stopProcessForTakeover. That makes daemon cleanup a guaranteed no-op precisely when the assertion under test fails, leaking the daemon on the CI host. Capture readProcessStartTime(daemonPid) when the PID is recorded, carry the exact identity into cleanup, and prove cleanup kills a surviving matching daemon while refusing reused/mismatched identity.

Current CI is rerunning after the size fix. No ready-for-human label until the cleanup ownership hole is fixed and the exact head is green.

@thymikee thymikee added the ready-for-human Valid work that needs human implementation, judgment, or maintainer merge label Aug 25, 2026
@thymikee

Copy link
Copy Markdown
Member Author

Re-reviewed exact head 3dfb4ac5922c7f35414119350f263e97ecde7a89: clean. The web shutdown lane now captures the daemon’s exact PID/start-time identity before SIGTERM and carries it into failure cleanup, so stopProcessForTakeover can reap only that process lifetime. The planted-red subprocess regression uses an IPC readiness handshake, proves SIGTERM was observed and ignored, then proves escalation reaps the child; the stale-lifetime regression confirms a reused PID identity remains untouched. Browser/server cleanup and AggregateError precedence are unchanged. Focused smoke and takeover tests pass; pnpm check:affected --run passed every runnable gate (458 files / 3,915 related tests). Ready for human review; fresh CI is queued.

@thymikee
thymikee merged commit 52ac5da into main Aug 25, 2026
18 checks passed
@thymikee
thymikee deleted the fix/1545-daemon-reuse branch August 25, 2026 13:42
@github-actions

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

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Per-worktree dev state-dir spawns a fresh daemon per CLI invocation

1 participant