# Watch readiness

James authorized the Watch follow-up while physical iPhone validation continues. Build 6 adds a watchOS10+ app using the same capture, calibration, session storage and portable analysis code. The Watch records its own torso motion; it is not a wrist remote for a torso-mounted iPhone. Build 14 adds the next physical runtime experiment for James’s Ultra 2 running watchOS27.2. Short physical capture and one exact archive transfer are verified. Speaker audio and sustained off-wrist operation still need confirmation.

The Watch app supports guided calibration with speech and stage haptics, optional automatic recording, fused/combined capture, diagnostics, markers, local save/reopen and a basic analysis summary. Dimming into inactive state preserves capture. Background capture now requires a granted bounded runtime session; otherwise the app saves an interrupted session. Off-wrist sustained recording is not established.

Send to iPhone queues an exact master ZIP through WatchConnectivity. The phone’s Watch screen retains and exports those archives separately from its own sessions. It does not yet unpack them or offer full Watch charts. Original Watch masters remain immutable; completed staging ZIPs are cleaned while pending transfers are preserved. One physical paired-device delivery is verified byte-for-byte; broader transfer recovery remains to be exercised.

The adapter must copy actual Core Motion timestamped quaternion/matrix/Euler attitude, gyro, gravity and user acceleration into the common model; keep raw accelerometer/gyro as independent streams when supported. Preserve heading/magnetic validity or explicit unavailable reasons, hardware/OS/app identifiers, requested intervals, achieved statistics, clock anchors, verified transform convention and calibration samples. Reuse the same immutable master and analysis configuration. Never resample acquisition to match iPhone rows.

Check the installed watchOS SDK and Ultra2 runtime for sensor availability, frame support, optional fields and simultaneous raw/fused behavior. Measure delivered rate/jitter, stationary noise/drift, callback delivery age, writer loss, slow/rapid movement response and foreground/runtime constraints on the real watch. Off-wrist torso mounting and extended execution are unproven; do not add workout/extended-runtime claims without a verified supported use case.

Mount Ultra2 approximately at the same sternum location as the iPhone, record orientation and mount differences, and run the same stationary/drill/roughly50-transition protocol with independent labels. Each device has its own boot clock. Matching timestamp values or simultaneous capture do not synchronize them. Use an explicit common observable event/alignment procedure with quantified uncertainty; distinguish apparent timing differences from sensor/fusion, callback, sound and human response delays. Candidate metrics are comparable only under documented bandwidth, filtering, units and calibration conditions.

Synthetic Watch-platform capture, interrupted save and identical-core analysis passed in the watchOS27 simulator. The Watch screen workflow passed calibration, recording, saving and reopening. SDK availability and signed device builds passed. Evidence and limitations: [watch-companion.md](validation/watch-companion.md). Physical rate/runtime/mounting/clock comparisons remain required. Neither simulator establishes hardware properties.

Build using scheme **RideFormWatch** for a paired Watch, or **RideForm** for an iPhone build embedding the Watch app. Run `./scripts/test-watch.sh` for the installed Watch simulator, or pass a local simulator UUID. Verify speech volume, off-wrist lock/screen behavior and interruption saving before a mounted drill.


## Development installation

A valid signature alone does not authorize a new Watch. The embedded Watch provisioning profile must include its UDID. The initial generic build contained only the phone’s registered device, causing “integrity could not be verified” on the Watch. Opening Xcode27 Device Hub → Add Device → Pair Nearby Device exposed the hidden Developer Mode setting. James enabled it, restarted and paired the Watch. A Watch-targeted build with automatic provisioning/device registration produced a profile containing the Watch; direct installation and launch succeeded. The phone companion was rebuilt with that corrected embedded profile as well. Do not reset or unpair the Watch from its iPhone to solve this signing issue.

## Physical feedback and build 8 — 2026-10-01

Two short physical Ultra 2 diagnostics were recovered directly: 1,375 samples over about 13.79 seconds and 791 samples over about 7.93 seconds, both near 99.6 Hz with no reported writer loss or acquisition gaps. Both were stopped before the stationary protocol's 30 seconds elapsed. They were uncalibrated, so upright/left hand-held posture reports are not verified rider-coordinate measurements. Originals remain on the Watch. Opening the phone receiver delivered one ZIP; all three archive entries match the Watch master byte-for-byte. The other master was recovered directly, but its phone delivery is not established.

The 21:07:22Z calibration log reached ready at 21:08:03Z, with center, left, center return and forward captured and a verified transform convention. James heard initial guidance in AirPods but could not tell whether the left stage succeeded. Missing audio, rather than a failed fit, explains the perceived failure in this particular attempt. Device output contained AudioQueue enqueue (-66632) and audio-client connection (-66748) errors; these do not by themselves identify the root cause.

Build 8 puts Calibrate and Test audio first, moves capture settings to a separate screen, and gives calibration a large stage heading. Watch speech uses the synthesizer's system-managed audio session instead of activating/deactivating the app's media session for each prompt. This is a routing/lifecycle hypothesis pending physical speaker confirmation, not a claim that speaker output is fixed. iPhone speech session behavior is unchanged. New logs capture speech request/start/finish and explicitly label shared app-session route/volume observations; a separate speech session's actual route cannot be inferred from those observations.

Regression checks cover immutable prior audio logs and preventing Test audio from cancelling the final calibration announcement/automatic recording. The latter failed before the guard and passed after it. Watch capture/UI and iPhone lifecycle checks passed. A device-only XCTest speech probe could not establish a test-runner session reliably and was stopped; ordinary device installation and launch succeeded. Human audibility and off-wrist sustained operation remain gates.

James confirmed build 8 Test audio is audible through inserted AirPods and silent after removing them; he accepts AirPods for now. The retrieved audio-check log shows shared app-session BluetoothA2DPOutput at volume 0.4, with request/start/finish. Removal does not establish disconnection, and the separate speech route is not directly measured. Record AirPods as the confirmed working output; do not claim standalone Watch-speaker failure or success. End-to-end audibility of every calibration stage still needs a listening trial.

## Frontmost recording trial — build 9

Build 9 corrects the Watch lifecycle handler: inactive (including display dimming) no longer stops calibration or recording; actual backgrounding still saves an interrupted recording. Session events now preserve ACTIVE, INACTIVE and BACKGROUND transitions for comparison against raw acquisition timestamps. This is a necessary code correction, not yet proof of sustained off-wrist sensor delivery.

James set the Watch's per-app Return to Clock to After 1 hour and prepared wrist detection for off-wrist use. The setting controls frontmost duration, not bright-screen duration. Wake for 70 Seconds does not provide an indefinite awake mode. Wrist Detection controls automatic locking; disabling it also affects health and fall-response features and should be restored after testing. Always On controls presentation and does not itself guarantee sensor execution.

Physical acceptance trial: open build 9 manually without an attached debugger, start Sensor diagnostics, leave the Watch stationary and untouched for ten minutes, allow natural dimming, then Stop & save. Do not press the Crown or cover the screen to dismiss. Ignore movement prompts for this runtime trial; the built-in diagnostic analysis still regards only its first marked stationary interval as stationary. Evaluate continuous timestamps, sample gaps, loss, lifecycle events and total recording coverage. Do not infer success from a timer or an app that remains visible. No device polling during the trial.

Sources: [Apple frontmost app state](https://developer.apple.com/documentation/watchkit/taking-advantage-of-frontmost-app-state), [Always On app states](https://developer.apple.com/documentation/watchos-apps/designing-your-app-for-the-always-on-state/), [display and Return to Clock settings](https://support.apple.com/en-au/guide/watch/apd127ec93ac/watchos), [Wrist Detection effects](https://support.apple.com/en-au/111819).

**Physical result:** The build 9 ten-minute hands-off trial failed. Only 2,405 samples spanning 24.13 seconds were persisted, ending about 8.58 seconds after INACTIVE. The master is incomplete, with no normal END/background/save evidence; foregrounding later did not resume it. No recent app crash report was accessible. The Return to Clock setting plus inactive-handler correction therefore does not establish continuous collection. Preserve this partial recording; sustained off-wrist runtime remains unresolved.


## Bounded runtime experiment — build 14

Settings alone failed the trial above. The app now requests Apple's physical-therapy extended runtime category for stationary guided range-of-motion exercises. The grant is bounded and revocable; actual ten-minute sample coverage and successful save remain unverified. This is not a general-purpose background riding mode.

A remote build 13 launch was explicitly refused: watchOS requires starting the session while active before resigning active. Build 14 exposes **10-minute runtime check**, below Test audio. Tap it on the Watch, leave the Watch still and untouched, allow natural dimming, and let the app stop/save automatically. No calibration is needed. Retain raw acquisition timestamps and the separate RuntimeLogs journal; inspect duration, gaps, writer loss, runtime grant and save completion. A simulator grant is only a test fixture.

Sources: [Apple extended runtime sessions](https://developer.apple.com/documentation/WatchKit/using-extended-runtime-sessions), [background mode categories](https://developer.apple.com/documentation/bundleresources/information-property-list/wkbackgroundmodes).

**Build 14 physical result:** The user-tap check obtained its runtime grant and recorded 60,273 samples over 604.818 seconds, including inactive time, at 99.653 Hz with no timestamp gaps or sequence breaks. Automatic sensor stop succeeded. Saving stalled after finalization began, so the master remains incomplete. Data was recovered without changing the original. Ten-minute acquisition is demonstrated for this trial; reliable end-to-end saving is still a blocker. See [physical evidence](validation/watch-runtime-build14.md).

**Build 16 save candidate:** Saving now uses retained sample timing instead of decoding the full recording; the Watch receipt reads only manifest metadata. Mac replay and core/Watch/iPhone tests pass. Hardware save verification and installation remain pending the device connection; do not count this as a passed physical save gate. See [save investigation](validation/watch-save-finalization.md).
