# U8 automated evidence (provisional)

Prepared 2026-10-01. This report separates synthetic software evidence from the pending iPhone 16 Pro garage experiment. U8 acceptance is **not complete**. No mounting, physical sign, roughly 50-transition, matched movement, independent-label, or acoustic-latency result is claimed.

## Added checks

`Tests/RideFormAppTests/EndToEndSessionTests.swift` exercises the simulator-only MotionCapture fixture boundary, real SessionRepository writer, capture stop barrier and asynchronous disk finalization. It reloads through a new repository, checks exact fused/raw samples (including independent raw timestamps), all events/cue times, calibration source samples/configuration, stream counts/losses and sampling counts. Analysis writes a separate sidecar and verifies input identity/configuration. Two exports are independently read using a test ZIP local-header parser and Foundation JSONDecoder, with byte equality for every master member; CSV timestamps/receipt values are independently parsed. Repeated exports and analysis must preserve all original master bytes and identity. This covers the automatable portion of U8.1; review here means saved-data analysis, while the existing UI workflow provides the rendered user path.

Additional controller tests create a real conflicting `manifest.json` directory and exercise finalization failure → retained writer → repaired filesystem → retry; periodic checkpoint failure → interrupted stop → save error → retry with persistent warning; and invalidated attitude convention → interrupted master/diagnostic → required recalibration. They use existing simulator APIs, no production fault hooks. Test results await the coordinator's authoritative app run.

`Packages/RideFormCore/Tests/RideFormCoreTests/WatchPortabilityTests.swift` persists an explicitly synthetic `apple_watch` session, reloads, analyzes, exports, independently decodes the exported manifest and compares trace/configuration/transitions against the equivalent iPhone-format input. Platform attribution changes the hash, while identical measurements produce identical metrics. No Watch UI or Core Motion import is needed.

`testOptInPhysicalForegroundSamplingArtifacts` compiles only for physical iOS and skips unless `RIDEFORM_PHYSICAL_DESK_SMOKE=1`. If deliberately run, it records three 30-second fused-only and three combined foreground trials, retains Documents masters/exports, verifies accepted/written/loss counts and attaches paths. It does not supply torso mounting, controlled movement labels, noise conclusions, a matched protocol conclusion, or garage acceptance. It has not been run as of this report.

## Executed isolated checks

- Snapshot: `/tmp/rideform-u8-core/Packages/RideFormCore`; independent scratch/cache directories.
- `DEVELOPER_DIR=/Applications/Xcode-beta.app/Contents/Developer CLANG_MODULE_CACHE_PATH=/tmp/rideform-u8-core/clang-cache SWIFTPM_MODULECACHE_OVERRIDE=/tmp/rideform-u8-core/module-cache swift test --disable-sandbox --package-path /tmp/rideform-u8-core/Packages/RideFormCore --scratch-path /tmp/rideform-u8-core/build --filter WatchPortabilityTests`: **1 test passed, 0 failures**, 2026-10-01 11:52 local. Log `/tmp/rideform-u8-core/watch-tests.log`. Initial invocation without `--disable-sandbox` failed before compiling because nested sandbox-exec was prohibited; this was tooling failure, not a red assertion.
- Entire snapshot core: `DEVELOPER_DIR=/Applications/Xcode-beta.app/Contents/Developer xcrun --sdk watchos swiftc -typecheck -module-name RideFormCore -target arm64_32-apple-watchos10.0 -sdk /Applications/Xcode-beta.app/Contents/Developer/Platforms/WatchOS.platform/Developer/SDKs/WatchOS.sdk -module-cache-path /tmp/rideform-u8-core/watch-module-cache /tmp/rideform-u8-core/Packages/RideFormCore/Sources/RideFormCore/*.swift`: **exit 0**. Log `/tmp/rideform-u8-core/watch-sdk-typecheck.log`. This establishes SDK compilation portability only, not Watch target installation/runtime or Ultra 2 support.
- `zsh -n scripts/test-ios.sh`: **exit 0**. Both new Swift test files also pass `xcrun swiftc -frontend -parse`; this syntax check does not resolve app types. The script accepts a first simulator UDID or `RIDEFORM_SIMULATOR_ID`, uses Xcode-beta when present, and forwards remaining xcodebuild arguments. Full app execution belongs to the coordinator.

No artificial failing test/mutation was introduced; newly added app checks remain pending until the authoritative run records results. Snapshot core evidence predates later concurrent analysis fixes and must be supplemented by the final source run.

## Pending scenario gates

| Scenario | Current evidence | Remaining gate |
|---|---|---|
| U8.1 | Persist/reload/export/independent parser tests added; portable Watch test passed | Authoritative app run; physical relaunch/review/Files or AirDrop/reopen |
| U8.2 | Raw rows retained; uncertain/missed detection accounting protocol required | Approximately 50 observed iPhone transitions and independent labels; all deliberate movements accounted for |
| U8.3 | Saved Watch fixture passed; complete core watchOS 10 typecheck passed | Actual Watch target/Ultra 2 runtime and hardware are future work |
| U8.4 | Independent streams, explicit clocks/receipt/cue times, complete metadata and analysis configuration preserved | Real stationary/drill datasets, labeled comparisons, KTD9 matched trials; physical and acoustic latency remain unmeasured |

U7 diagnostics review and final integration were still in progress when this report was created. Main acceptance remains provisional until those results and the hardware gates are recorded.

## Final coordinator verification

The authoritative 41-test core and 29-test app runs passed, including the end-to-end artifact/export and fault recovery tests described above. Build 0.1 (2) installed successfully on the iPhone; launch was blocked by its lock screen. See `calibration-desktop-update.md` for receipts and UI checks. U8.1’s automated gate is complete; its physical export/reopen gate and the other hardware gates remain pending.
