# Desktop recovery and spoken calibration — 2026-10-01

## Scope and recovery

James reported repeated neutral failures while handheld over USB and difficulty operating a chest-mounted screen, then authorized autonomous implementation and continuation. Resumed on `feat/ios-v0`. Prior baseline was e993b5c; the old CLI writer remained active despite the desktop reporting its task interrupted. Its process working directory and open task-writer lock identified it precisely. SIGINT did not stop it; SIGTERM left it defunct. Existing changes were preserved. It completed the verified analysis fixes in f16531e before shutdown. No remote push.

Recovered U7 review/diagnostics, clock synchronization, independent tests and U8 acceptance documentation were integrated. Fixed SwiftUI/core `Transition` name ambiguity and optional derivative-window formatting in the unfinished review screen. Review analysis now rejects cancelled/replaced results, prevents overlapping recompute/export requests and caches display decimation off the main actor. Original master data remains immutable.

## Calibration change

- Default calibration policy 2 raises the neutral gyro bound from 0.08 to 0.15 rad/s. Acceleration remains 0.08 g, quaternion RMS dispersion 0.02 rad, maximum deviation 0.05 rad, duration 2.5 seconds, maximum sample gap 0.1 seconds. Saved explicit old thresholds remain honored.
- A rolling actual-time neutral interval lets early tap/mount movement age out. Dispersion is checked before leaving neutral. Selected raw samples and collection settings are saved unchanged.
- Spoken guide waits for instruction completion, counts down, captures neutral, guides LEFT / CENTER / FORWARD / CENTER, and advances on bounded sustained evidence. Manual mode remains available. Stages time out; cancellation/interruption invalidates delayed callbacks and restores the prior idle timer. Optional recording starts after the final success announcement only.
- Speech uses a short playback/spoken-audio session per utterance, releasing other audio afterward. No microphone, notification, Watch, or background audio capability was added. Audio routing, audibility and real torso tolerances remain human checks.

Apple API contract checked against [playback](https://developer.apple.com/documentation/avfaudio/avaudiosession/category-swift.struct/playback), [duckOthers](https://developer.apple.com/documentation/avfaudio/avaudiosession/categoryoptions-swift.struct/duckothers), and [speech completion](https://developer.apple.com/documentation/avfaudio/avspeechsynthesizerdelegate/speechsynthesizer(_:didfinish:)). Speech dispatch/completion is not acoustic-onset evidence.

## Executed verification

- RED: a single initial 0.09 rad/s sample followed by five seconds still rejected in the old solver; its final 2.5 seconds accepted. A ±1° 1 Hz synthetic oscillation rejected. Jittering gestures accepted, showing the gesture stage was not a strict-stillness gate. Scratch probe: `/tmp/rideform-calibration-check`.
- RED regression: new small-oscillation test threw movingNeutral (`/tmp/rideform-calibration-red.log`). New initial-bump recovery integration test failed (`/tmp/rideform-window-red.log`).
- GREEN: 41 portable tests, zero failures (`/tmp/rideform-calibration-core.log`). Includes small oscillation, explicit strict policy replay, drift rejection, diagnostics, analysis and Watch portability.
- GREEN: 29 iOS integration tests, zero failures (`/tmp/rideform-final-app-green.log`). Includes complete hands-free flow, waiting for speech, delayed auto-recording, stale/cancelled callbacks, stalled speech despite healthy samples, manual failure/retry idle restoration, capture/stop/reopen, interrupted and failed-save retries, diagnostics modes, clock contention and exported analysis/master equality.
- Independent numeric checker passed with no failures (`/tmp/rideform-resume-analysis.log`), including the prior symlink-parent, Nyquist and truncated-onset findings.
- Suite-order failure diagnosed: the simulator fixture's unbounded yaw increment eventually approached π, making gravity unable to disambiguate quaternion direction. It now alternates 0.4/0.8 rad references; consecutive captures still differ. The production ambiguity check was preserved.
- Signed physical-device build 0.1 (2) succeeded; strict codesign verification passed with access to the host trust store. Installation succeeded without uninstalling the prior app; device inventory independently confirms version 0.1, build 2. Launch was attempted but iOS rejected it because the phone was locked. Installation is verified; physical launch is not. Receipts: `/tmp/rideform-calibration-device-final.log`, `/tmp/rideform-calibration-install.json`, `/tmp/rideform-calibration-installed-app.json`, `/tmp/rideform-calibration-launch.json`. Profile expires 2026-10-08 15:46:09 UTC.

## Review

Independent Swift/iOS review found and prompted fixes for stale analysis publication, repeated display decimation, stalled speech masked by healthy sensors, and manual failure idle-timer cleanup. Regression coverage now includes the latter two real controller paths. Simplification used reuse, quality and efficiency lenses sequentially under project instructions: kept explicit lifecycle guards, removed unused speech presentation state, and avoided unnecessary abstractions. Final source-review receipt is complete with no outstanding findings: `desktop-review.json` (base f16531e). The later simulator fixture isolation, UI scrolling checks and build-number plumbing were verified by the coordinator. The optional Claude peer failed to connect (ENOTFOUND); no external corroboration is claimed.

## Physical evidence still required

James must confirm speaker/headphone audibility, chest-mounted neutral breathing tolerance, all physical signs and repeat-neutral, matched raw/fused trials, Files/AirDrop, and roughly 50 independently labelled transitions. Handheld and synthetic tests do not establish these. No Watch companion was implemented.

## Final UI receipt

All four UI scenarios passed across the final runs: hands-free calibration/record/save/export/cancel/relaunch and both diagnostic protocols in `/tmp/rideform-final-ui.log`; chart/filter/reopen in `/tmp/rideform-review-ui-text-scroll.log` (1 test, zero failures, TEST SUCCEEDED). The earlier full run had a chart reopen failure caused by choosing an unrelated prior session; the review fixture now uses an isolated simulator repository. Additional visibility checks exposed plot gestures intercepting test scrolling; the final test scrolls from headings and verifies all four headings are hittable. Screenshot attachments: `/tmp/rideform-resume-build/Logs/Test/Test-RideForm-2026.10.01_12-31-01--0500.xcresult`. Plot scrolling and annotation density are retained as usability observations, not hidden by a claim of complete visual polish.
