---
title: Separate calibration settling from spoken guidance
category: ios
date: 2026-10-01
---

# Calibration settling and spoken guidance

A strict check over an ever-growing neutral capture makes one tap-induced motion spike poison the entire attempt. The reproduced input had one 0.09 rad/s sample followed by five seconds of stationary data; the old 0.08 rad/s policy rejected it. Selecting the last complete 2.5-second interval accepted the same stable tail. Keep rate and quaternion-dispersion bounds, but allow the initial movement to age out. Validate dispersion before leaving neutral rather than reporting a neutral error only after both gestures. Preserve selected raw samples and the collection/fit policy in calibration metadata.

The spoken guide waits for each instruction to finish before collecting the next stage. Sensor timestamps govern motion coverage; host time governs stalled sensor/speech watchdogs. A healthy sensor stream must not refresh the speech deadline. Both snapshot and speech completions carry attempt identity; cancellation, retry, interruption and timeout invalidate old completions. Restore the prior idle-timer state on every terminal path, including manual failure before retry. Automatic recording starts only after successful fitting and the final spoken announcement.

Synthetic coverage establishes these transitions and rejection rules, not the right movement tolerance for a torso mount. Mounted breathing, sign, audibility and repeat-neutral checks remain physical evidence. Do not loosen drift/axis checks just to improve success counts.

The simulator fixture alternates two distinct reference yaws. Unbounded per-test yaw increments eventually approach 180 degrees, at which gravity cannot disambiguate the quaternion direction and a correctly rejected calibration looks like a suite-order failure.

Evidence: `docs/validation/calibration-desktop-update.md`; regression tests in CalibrationTests, CalibrationIntegrationTests and RecordingLifecycleTests.

Return checks need their own realistic fixtures: exact-center synthetic returns hid a 3.4° all-samples gate that rejected small posture offsets. Test offset plus jitter at both center steps and explicit exit/reentry. A reminder must not call the stage-instruction completion handler, which resets stage timing. Preserve the original neutral when accepting a return; widening navigation tolerance must not redefine analysis coordinates. See `docs/validation/return-to-center-fix.md`.

Calibration feedback must be driven by host time since speech completion, not sensor samples or a one-shot return-stage flag. Otherwise a missing stream or a long wait in another stage becomes silent. Keep reminders independent of instruction-completion callbacks, and test both every active stage and an actual stalled gesture through the timer/callback path.

Soft recovery changes lifecycle ownership: a failed fit no longer always means stop sampling or restore the idle timer. Keep these resources until ready/terminal retry/cancel. On generation invalidation, clear pending snapshot state; transport/speech failures must not be mistaken for short gesture evidence. Preserve good neutral evidence through retries and persist separate attempt logs before another hardware test.
