Conversation
There was a problem hiding this comment.
21 issues found across 25 files
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="packages/platform-apple/src/navigation/runtime.ts">
<violation number="1" location="packages/platform-apple/src/navigation/runtime.ts:70">
P3: `appleAppSwitcherFact` bypasses the canonical device-kind gate for watchOS. An Apple `emulator` record therefore gets a platform-leaf refusal instead of `unsupported-device-kind`, making app-switcher’s refusal metadata inconsistent with `home` and `back`; check the kind before the watchOS exception.</violation>
</file>
<file name="packages/platform-apple/src/runtime.test.ts">
<violation number="1" location="packages/platform-apple/src/runtime.test.ts:197">
P3: The new kind-disjunction branches (`device.kind === 'simulator'`) in `expectAppleCaptureAvailability` and `expectAppleSnapshotAvailability`, and the watchOS-Simulator branches in `expectNavigationAndKeyboardFacts`, are never exercised: `leaves.watchos` and every row in the classification test use a watchOS *simulator*, and no test feeds a watchOS physical device into these helpers. The PR's fail-closed guarantee for physical watchOS devices (capture, snapshot, back, home denied) is therefore unasserted here. Add a watchOS-device leaf row (e.g. `appleDevice({ appleOs: 'watchos', kind: 'device' })`) to the classification and navigation tables.</violation>
</file>
<file name="packages/platform-apple/src/inventory-classification.ts">
<violation number="1" location="packages/platform-apple/src/inventory-classification.ts:3">
P2: Adding `watch` to `APPLE_PRODUCT_TYPE_PATTERN` only changes physical-device discovery: `isAppleProductType` is consumed solely by `isSupportedAppleDevicectlDevice`, while the simctl simulator path keys on the runtime string and never reads productType. A connected Apple Watch (productType `Watch…`) now appears in inventory as `kind: 'device'` / `appleOs: 'watchos'` / `iosPhysicalDeviceBackend: 'coredevice'` / `booted: true` — a selectable-looking target whose every use then hits the `UNSUPPORTED_PLATFORM` sentinel, contradicting the PR boundary that physical watchOS devices stay fail-closed. Either exclude watchOS from the devicectl gate (revert this alternation) or pin the new physical-watch inventory behavior with a test.</violation>
<violation number="2" location="packages/platform-apple/src/inventory-classification.ts:6">
P1: `APPLE_WATCH_PATTERN` classifies a user-named iOS simulator such as `Watch` as watchOS. Make simulator classification rely on the watchOS runtime or device-type marker rather than an unconstrained display name, otherwise that simulator loses normal iOS operations.</violation>
</file>
<file name="docs/adr/0019-request-bound-platform-runtime.md">
<violation number="1" location="docs/adr/0019-request-bound-platform-runtime.md:327">
P1: The advertised watchOS Simulator fact set is not gated by the required HID probe. Probe `simctl io ... enumerate` during fact admission, or keep interaction facts unavailable until the probe succeeds.</violation>
<violation number="2" location="docs/adr/0019-request-bound-platform-runtime.md:328">
P1: Physical watchOS is not currently a fail-closed sentinel across the admitted runtime. Gate gesture, directional-fling, viewport, and scroll facts on simulator kind before documenting this cell as unsupported.</violation>
</file>
<file name="packages/platform-apple/src/interactor.ts">
<violation number="1" location="packages/platform-apple/src/interactor.ts:48">
P2: This branch bypasses the provider transport boundary for watchOS simulators. When `runnerProvider` is supplied, local `simctl` and HID operations can still run on the host instead of failing closed like the other Apple interactor methods; reject or explicitly adapt the provider-backed watchOS interactor before returning it.</violation>
</file>
<file name="apple/watch-helper/WatchControl.m">
<violation number="1" location="apple/watch-helper/WatchControl.m:164">
P1: This source uses `isfinite` without importing `<math.h>`, so the Darwin `-Werror` helper build can fail on an undeclared function. Add the standard math header.</violation>
</file>
<file name="docs/adr/0009-apple-platform-consolidation.md">
<violation number="1" location="docs/adr/0009-apple-platform-consolidation.md:79">
P3: Update the implementation-status date when adding this support. Otherwise the ADR presents September work as shipped in August.</violation>
<violation number="2" location="docs/adr/0009-apple-platform-consolidation.md:86">
P2: This boundary omits operations the runtime advertises: watchOS simulators support app deployment, and `networkDump` is available for every Apple device. Name those operations here or gate their facts; otherwise the fail-closed coverage statement is false.</violation>
</file>
<file name="packages/platform-apple/src/watch/watch-helper-cache.ts">
<violation number="1" location="packages/platform-apple/src/watch/watch-helper-cache.ts:29">
P3: This file duplicates the helper-cache orchestration already implemented in `fold-helper-cache.ts`; extract the shared preparation/error-wrapper logic so cache, timeout, and failure-handling fixes cannot drift between helpers.</violation>
</file>
<file name="packages/platform-apple/src/runtime.ts">
<violation number="1" location="packages/platform-apple/src/runtime.ts:285">
P2: These blanket facts re-admit `ensureReady` and `bootTarget` for physical watchOS devices; binding either calls `ensureAppleReady`, which invokes `applePhysical.ensureConnected` for every `device` kind. Gate both on `device.kind === 'simulator'` for watchOS so the physical-watch sentinel remains fail-closed.</violation>
<violation number="2" location="packages/platform-apple/src/runtime.ts:309">
P3: The comment directly above this spread still claims text entry "shares the exact kind cell (parity with the retired `type` bucket, `{ simulator, device }`)", but this change deliberately diverges for watchOS. Update the comment to state that the watch host backend exposes no text-entry route, matching the new test comment.</violation>
</file>
<file name="packages/platform-apple/src/watch/interactor.ts">
<violation number="1" location="packages/platform-apple/src/watch/interactor.ts:74">
P2: WatchOS screenshot requests silently ignore `pixelDensity`, returning raw simctl dimensions instead of the requested output density. Forward the options through the Apple screenshot normalization flow, or reject unsupported options explicitly.</violation>
<violation number="2" location="packages/platform-apple/src/watch/interactor.ts:109">
P2: `scrollWatch` reads only `options.amount` and silently drops `options.pixels` and `options.durationMs`, so `scroll down --pixels 300` always sends the default ±0.5*360 crown ticks. The shared dispatcher passes both fields through untouched (`src/daemon/scroll-runtime.ts:121`) and `scrollResult` (`scroll-runtime.ts:409`) echoes the requested `pixels` back as honored, so the response claims a distance the crown scroll never approximated. Refuse pixel-based scrolls fail-closed (watch crown has no pixel mapping) instead of substituting the default distance.</violation>
<violation number="3" location="packages/platform-apple/src/watch/interactor.ts:110">
P2: Horizontal watch scrolls are reinterpreted as vertical Crown movement. Reject `left` and `right` because this HID backend exposes only vertical Digital Crown scrolling.</violation>
<violation number="4" location="packages/platform-apple/src/watch/interactor.ts:159">
P2: `watchViewport` runs the `simctl io ... enumerate` probe before `ensureBootedSimulator` has a chance to boot the device: `tap`/`pressPoint`/`longPress`/`focus`/`performGesture` all await `pointArgs` (which calls `watchViewport`) while building the helper argv, and only `runWatchHelper` boots. A shutdown watch simulator therefore fails the first point interaction with the misleading 'does not expose a compatible Simulator HID display' error instead of being booted as every other interaction path intends. Boot the device before enumerating.</violation>
<violation number="5" location="packages/platform-apple/src/watch/interactor.ts:207">
P1: WatchOS HID commands fail for simulators selected from a non-default simulator set because the helper cannot resolve that device in its default set. Pass the simulator-set identity through the helper or reject scoped watchOS targets before advertising interaction.</violation>
</file>
<file name="packages/platform-apple/src/snapshot-route.ts">
<violation number="1" location="packages/platform-apple/src/snapshot-route.ts:265">
P2: Admitting watchOS simulators to `isEligible` sends every bridge-failure path (target-resolution-failed, circuit-disabled, stale-target, capture failure) to `fallback(input)`, which resolves to the watch interactor's `snapshot` and throws `UNSUPPORTED_OPERATION` ('watchOS snapshots are served by the isolated Simulator accessibility bridge.'). Since `opensGenerationCircuit` retires the generation after one non-preparing failure, a single transient bridge failure makes every later capture of that app generation throw this admission-style refusal — while `appleSnapshotFact` advertises `captureSnapshot: available` for watchOS simulators. A mechanism failure is being reported as an unsupported operation; type it as a failure with the bridge failure code (and drop the circuit retry on watchOS, where the fallback can never serve) instead of the misleading refusal.</violation>
</file>
<file name="packages/platform-apple/src/snapshot-source/cache.ts">
<violation number="1" location="packages/platform-apple/src/snapshot-source/cache.ts:117">
P3: Any non-iOS runtime string that is not watchOS silently compiles the bridge against `iphonesimulator` (e.g., a tvOS/xrOS identifier reaching the snapshot source), instead of failing closed. Match the `SimRuntime.watchOS-` identifier prefix rather than a free substring so only actual watchOS runtimes select the watchsimulator SDK.</violation>
</file>
<file name="packages/kernel/src/device.ts">
<violation number="1" location="packages/kernel/src/device.ts:274">
P2: `resolveRunnerPlatformNameForAppleOs` still maps `'watchos'` to `'iOS'` through the default branch, and the new comment replaces the old, accurate justification (watchOS was never produced by discovery) with an asserted invariant that is not enforced here. Discovery now genuinely stamps `appleOs: 'watchos'` (see `inventory-classification.ts` `resolveAppleOs`/`isSupportedAppleRuntime`), so a watchOS record reaching any `resolveRunnerPlatformName` caller (`runner-cache-metadata.ts`, `runner-artifact.ts`, `runner-adoption.ts`, `runner-session.ts`, `readRunnerXcodeVersion`, `write-xcuitest-cache-metadata.ts`) would silently build/probe the iOS runner profile instead of failing closed, contradicting the fail-closed boundary this PR documents. Add an explicit `case 'watchos'` that refuses, so the boundary is enforced at the projection instead of assumed in a comment.</violation>
</file>
Tip: instead of fixing issues one by one fix them all with cubic
Re-trigger cubic
| const APPLE_PRODUCT_TYPE_PATTERN = /^(iphone|ipad|ipod|appletv|watch|realitydevice)/i; | ||
| const APPLE_IPAD_PATTERN = /ipad/i; | ||
| const APPLE_VISION_PATTERN = /\b(apple vision|vision pro|xros|visionos|realitydevice)\b/i; | ||
| const APPLE_WATCH_PATTERN = /\b(apple watch|watchos|watch)\b/i; |
There was a problem hiding this comment.
P1: APPLE_WATCH_PATTERN classifies a user-named iOS simulator such as Watch as watchOS. Make simulator classification rely on the watchOS runtime or device-type marker rather than an unconstrained display name, otherwise that simulator loses normal iOS operations.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/platform-apple/src/inventory-classification.ts, line 6:
<comment>`APPLE_WATCH_PATTERN` classifies a user-named iOS simulator such as `Watch` as watchOS. Make simulator classification rely on the watchOS runtime or device-type marker rather than an unconstrained display name, otherwise that simulator loses normal iOS operations.</comment>
<file context>
@@ -1,8 +1,9 @@
+const APPLE_PRODUCT_TYPE_PATTERN = /^(iphone|ipad|ipod|appletv|watch|realitydevice)/i;
const APPLE_IPAD_PATTERN = /ipad/i;
const APPLE_VISION_PATTERN = /\b(apple vision|vision pro|xros|visionos|realitydevice)\b/i;
+const APPLE_WATCH_PATTERN = /\b(apple watch|watchos|watch)\b/i;
const APPLE_MOBILE_LABEL_PATTERN = /\b(iphone|ipad|ipod)\b/i;
const APPLE_TV_PRODUCT_TYPE_PATTERN = /^appletv/i;
</file context>
| fixture matches exactly one family. A loop over six families with one generic `platform: 'apple'` | ||
| device is not leaf coverage. | ||
| visionOS deferred or supported cells, the watchOS Simulator CoreSimulator/host-AX fact set, and the | ||
| physical-watchOS unsupported sentinel. Every fixture matches exactly one family. A loop over six families |
There was a problem hiding this comment.
P1: Physical watchOS is not currently a fail-closed sentinel across the admitted runtime. Gate gesture, directional-fling, viewport, and scroll facts on simulator kind before documenting this cell as unsupported.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At docs/adr/0019-request-bound-platform-runtime.md, line 328:
<comment>Physical watchOS is not currently a fail-closed sentinel across the admitted runtime. Gate gesture, directional-fling, viewport, and scroll facts on simulator kind before documenting this cell as unsupported.</comment>
<file context>
@@ -324,9 +324,9 @@ not make a difficult legacy-supported cell disappear. Behavior changes require a
-fixture matches exactly one family. A loop over six families with one generic `platform: 'apple'`
-device is not leaf coverage.
+visionOS deferred or supported cells, the watchOS Simulator CoreSimulator/host-AX fact set, and the
+physical-watchOS unsupported sentinel. Every fixture matches exactly one family. A loop over six families
+with one generic `platform: 'apple'` device is not leaf coverage.
</file context>
| visionOS deferred or supported cells, and the watchOS unsupported/discovery-absence sentinel. Every | ||
| fixture matches exactly one family. A loop over six families with one generic `platform: 'apple'` | ||
| device is not leaf coverage. | ||
| visionOS deferred or supported cells, the watchOS Simulator CoreSimulator/host-AX fact set, and the |
There was a problem hiding this comment.
P1: The advertised watchOS Simulator fact set is not gated by the required HID probe. Probe simctl io ... enumerate during fact admission, or keep interaction facts unavailable until the probe succeeds.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At docs/adr/0019-request-bound-platform-runtime.md, line 327:
<comment>The advertised watchOS Simulator fact set is not gated by the required HID probe. Probe `simctl io ... enumerate` during fact admission, or keep interaction facts unavailable until the probe succeeds.</comment>
<file context>
@@ -324,9 +324,9 @@ not make a difficult legacy-supported cell disappear. Behavior changes require a
-visionOS deferred or supported cells, and the watchOS unsupported/discovery-absence sentinel. Every
-fixture matches exactly one family. A loop over six families with one generic `platform: 'apple'`
-device is not leaf coverage.
+visionOS deferred or supported cells, the watchOS Simulator CoreSimulator/host-AX fact set, and the
+physical-watchOS unsupported sentinel. Every fixture matches exactly one family. A loop over six families
+with one generic `platform: 'apple'` device is not leaf coverage.
</file context>
| static BOOL readDouble(NSString *value, double minimum, double maximum, double *output) { | ||
| NSScanner *scanner = [NSScanner scannerWithString:value]; | ||
| double number = 0; | ||
| if (![scanner scanDouble:&number] || !scanner.isAtEnd || !isfinite(number) || |
There was a problem hiding this comment.
P1: This source uses isfinite without importing <math.h>, so the Darwin -Werror helper build can fail on an undeclared function. Add the standard math header.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At apple/watch-helper/WatchControl.m, line 164:
<comment>This source uses `isfinite` without importing `<math.h>`, so the Darwin `-Werror` helper build can fail on an undeclared function. Add the standard math header.</comment>
<file context>
@@ -0,0 +1,210 @@
+static BOOL readDouble(NSString *value, double minimum, double maximum, double *output) {
+ NSScanner *scanner = [NSScanner scannerWithString:value];
+ double number = 0;
+ if (![scanner scanDouble:&number] || !scanner.isAtEnd || !isfinite(number) ||
+ number < minimum || number > maximum) return NO;
+ *output = number;
</file context>
| context.signal?.throwIfAborted(); | ||
| await ensureBootedSimulator(device); | ||
| const helper = await ensureWatchHelperBinary({ signal: context.signal }); | ||
| const result = await runAppleToolCommand(helper.path, [device.id, ...args], { |
There was a problem hiding this comment.
P1: WatchOS HID commands fail for simulators selected from a non-default simulator set because the helper cannot resolve that device in its default set. Pass the simulator-set identity through the helper or reject scoped watchOS targets before advertising interaction.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/platform-apple/src/watch/interactor.ts, line 207:
<comment>WatchOS HID commands fail for simulators selected from a non-default simulator set because the helper cannot resolve that device in its default set. Pass the simulator-set identity through the helper or reject scoped watchOS targets before advertising interaction.</comment>
<file context>
@@ -0,0 +1,224 @@
+ context.signal?.throwIfAborted();
+ await ensureBootedSimulator(device);
+ const helper = await ensureWatchHelperBinary({ signal: context.signal });
+ const result = await runAppleToolCommand(helper.path, [device.id, ...args], {
+ signal: context.signal,
+ allowFailure: true,
</file context>
| device: DeviceInfo, | ||
| ): void { | ||
| const available = device.appleOs !== 'watchos'; | ||
| const available = device.appleOs !== 'watchos' || device.kind === 'simulator'; |
There was a problem hiding this comment.
P3: The new kind-disjunction branches (device.kind === 'simulator') in expectAppleCaptureAvailability and expectAppleSnapshotAvailability, and the watchOS-Simulator branches in expectNavigationAndKeyboardFacts, are never exercised: leaves.watchos and every row in the classification test use a watchOS simulator, and no test feeds a watchOS physical device into these helpers. The PR's fail-closed guarantee for physical watchOS devices (capture, snapshot, back, home denied) is therefore unasserted here. Add a watchOS-device leaf row (e.g. appleDevice({ appleOs: 'watchos', kind: 'device' })) to the classification and navigation tables.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/platform-apple/src/runtime.test.ts, line 197:
<comment>The new kind-disjunction branches (`device.kind === 'simulator'`) in `expectAppleCaptureAvailability` and `expectAppleSnapshotAvailability`, and the watchOS-Simulator branches in `expectNavigationAndKeyboardFacts`, are never exercised: `leaves.watchos` and every row in the classification test use a watchOS *simulator*, and no test feeds a watchOS physical device into these helpers. The PR's fail-closed guarantee for physical watchOS devices (capture, snapshot, back, home denied) is therefore unasserted here. Add a watchOS-device leaf row (e.g. `appleDevice({ appleOs: 'watchos', kind: 'device' })`) to the classification and navigation tables.</comment>
<file context>
@@ -190,14 +188,13 @@ function expectApplePerfAvailability(
device: DeviceInfo,
): void {
- const available = device.appleOs !== 'watchos';
+ const available = device.appleOs !== 'watchos' || device.kind === 'simulator';
expect(binding.facts.operations.captureScreenshot.available).toBe(available);
expect(binding.operations.captureScreenshot).toBeTypeOf(available ? 'function' : 'undefined');
</file context>
| plus simulator-deployment evidence. | ||
| its predicates moved into request-bound facts); watchOS Simulator discovery and the isolated | ||
| CoreSimulator runtime for lifecycle, screenshots, host AX snapshots, touch, single-pointer gestures, | ||
| Digital Crown scrolling, and Crown navigation; the physical-watchOS unsupported sentinel; and visionOS |
There was a problem hiding this comment.
P3: Update the implementation-status date when adding this support. Otherwise the ADR presents September work as shipped in August.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At docs/adr/0009-apple-platform-consolidation.md, line 79:
<comment>Update the implementation-status date when adding this support. Otherwise the ADR presents September work as shipped in August.</comment>
<file context>
@@ -68,16 +74,17 @@ Implementation status as of 2026-08:
- plus simulator-deployment evidence.
+ its predicates moved into request-bound facts); watchOS Simulator discovery and the isolated
+ CoreSimulator runtime for lifecycle, screenshots, host AX snapshots, touch, single-pointer gestures,
+ Digital Crown scrolling, and Crown navigation; the physical-watchOS unsupported sentinel; and visionOS
+ profile/build/discovery plus simulator-deployment evidence.
- Decision-only support boundary: visionOS discovery and simulator deployment are supported and
</file context>
| export const WATCH_HELPER_BUILD_TIMEOUT_MS = 30_000; | ||
| const PREPARATION_DEADLINE_MS = COLD_TOOLCHAIN_PROBE_TIMEOUT_MS + WATCH_HELPER_BUILD_TIMEOUT_MS; | ||
|
|
||
| export async function ensureWatchHelperBinary( |
There was a problem hiding this comment.
P3: This file duplicates the helper-cache orchestration already implemented in fold-helper-cache.ts; extract the shared preparation/error-wrapper logic so cache, timeout, and failure-handling fixes cannot drift between helpers.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/platform-apple/src/watch/watch-helper-cache.ts, line 29:
<comment>This file duplicates the helper-cache orchestration already implemented in `fold-helper-cache.ts`; extract the shared preparation/error-wrapper logic so cache, timeout, and failure-handling fixes cannot drift between helpers.</comment>
<file context>
@@ -0,0 +1,131 @@
+export const WATCH_HELPER_BUILD_TIMEOUT_MS = 30_000;
+const PREPARATION_DEADLINE_MS = COLD_TOOLCHAIN_PROBE_TIMEOUT_MS + WATCH_HELPER_BUILD_TIMEOUT_MS;
+
+export async function ensureWatchHelperBinary(
+ input: Readonly<{
+ signal?: AbortSignal;
</file context>
| outputPath: string; | ||
| }>, | ||
| ): readonly string[] { | ||
| const watch = input.runtime?.toLowerCase().includes('watchos') === true; |
There was a problem hiding this comment.
P3: Any non-iOS runtime string that is not watchOS silently compiles the bridge against iphonesimulator (e.g., a tvOS/xrOS identifier reaching the snapshot source), instead of failing closed. Match the SimRuntime.watchOS- identifier prefix rather than a free substring so only actual watchOS runtimes select the watchsimulator SDK.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/platform-apple/src/snapshot-source/cache.ts, line 117:
<comment>Any non-iOS runtime string that is not watchOS silently compiles the bridge against `iphonesimulator` (e.g., a tvOS/xrOS identifier reaching the snapshot source), instead of failing closed. Match the `SimRuntime.watchOS-` identifier prefix rather than a free substring so only actual watchOS runtimes select the watchsimulator SDK.</comment>
<file context>
@@ -107,17 +109,19 @@ export async function ensureSnapshotBridgeBinary(
outputPath: string;
}>,
): readonly string[] {
+ const watch = input.runtime?.toLowerCase().includes('watchos') === true;
return [
'--sdk',
</file context>
| const watch = input.runtime?.toLowerCase().includes('watchos') === true; | |
| const watch = /SimRuntime\.watchOS/i.test(input.runtime ?? ''); |
| // exact kind cell (parity with the retired `type` bucket, `{ simulator, device }`). | ||
| ...typeTextRuntimeOperationFacts({ type: appleFocusFact(device) }), | ||
| ...typeTextRuntimeOperationFacts({ | ||
| type: device.appleOs === 'watchos' ? unavailable : appleFocusFact(device), |
There was a problem hiding this comment.
P3: The comment directly above this spread still claims text entry "shares the exact kind cell (parity with the retired type bucket, { simulator, device })", but this change deliberately diverges for watchOS. Update the comment to state that the watch host backend exposes no text-entry route, matching the new test comment.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. At packages/platform-apple/src/runtime.ts, line 309:
<comment>The comment directly above this spread still claims text entry "shares the exact kind cell (parity with the retired `type` bucket, `{ simulator, device }`)", but this change deliberately diverges for watchOS. Update the comment to state that the watch host backend exposes no text-entry route, matching the new test comment.</comment>
<file context>
@@ -313,13 +305,17 @@ export function createApplePlatformRuntime(host: PlatformRuntimeHost): PlatformR
// exact kind cell (parity with the retired `type` bucket, `{ simulator, device }`).
- ...typeTextRuntimeOperationFacts({ type: appleFocusFact(device) }),
+ ...typeTextRuntimeOperationFacts({
+ type: device.appleOs === 'watchos' ? unavailable : appleFocusFact(device),
+ }),
...touchRuntimeOperationFacts({
</file context>
|
This adds real value (a watchOS Simulator runtime) but at 3995110 it isn't ready to merge, mostly because the physical-watch boundary and the classification it depends on aren't actually enforced.
The
Not blocking: the only test of the new backend ( Is the size of this change proportionate to what it needs to do? The production diff is +641/−60 lines under the usual threshold, but it still touches kernel, discovery, facts and snapshot with roughly a dozen scattered I did not run this on a device, so I can't confirm the HID message layout in CI shows one check reported for this cross-repo PR, and it's green; no failing job overlaps the diff, but the full unit suite, typecheck and the darwin The path to merge is: address the shared-cache duplication, the device-set-aware helper addressing, identifier-only watchOS classification, the physical-watch fact gap, honest scroll-input refusals, and typed bridge failures for watchOS snapshots, then attach the live watchOS Simulator transcript described above. |
|
@csark0812 can you send some demos of how this works? |
Summary
Verification
pnpm format:checkpnpm lintpnpm typecheckpnpm buildpnpm test:unit— 1,414 files; 11,475 passed; 1 skippedpnpm package:npmrelease pipeline components: all Apple runner builds and macOS helper passed; Android assets prepared with API 36;pnpm check:packagepassedRuntime boundary
The backend checks the selected Simulator's
simctl io ... enumerateoutput for a LegacyHID display and derives its pixel geometry and scale before advertising interaction. Text entry, app switcher, orientation, settings, multi-touch, and physical watchOS devices remain unsupported.