Spec: Hands-Free Bundle — Compose Voice, Gaze, Head Pointer and Switch Inputs Safely¶
| Field | Value |
|---|---|
| ID | spec-eye-handsfree-bundle |
| Status | Proposed |
| Date | 2026-09-22 |
| Modules | feature/config orchestration; daemon status/control; existing component modules |
| Related | ADR-v2-148, ADR-v2-010, ADR-v2-052, ADR-v2-147 |
| Issues | #410 plus safety/permissions/observability/co-design tasks |
Goal¶
Provide one understandable way to enable and operate a hands-free YazSes configuration while reusing existing components rather than creating a parallel pipeline.
Non-goals¶
- no new STT engine;
- no new command dispatcher;
- no second camera loop;
- no hidden cloud service;
- no single mandatory activation modality;
- no claim that every user should use the same gesture/dwell defaults.
Composition¶
A hands-free preset configures ordinary capabilities:
| Role | Candidate |
|---|---|
| Text bandwidth | speech |
| Target/context | gaze |
| Continuous pointer | Head-Pointer |
| Discrete commit | face switch / dwell / EMG / voice |
| Precision fallback | Voice Mouse Grid |
| Feedback | tray/notification/read-back |
| Destructive safety | existing confirmation policy |
Users may enable a subset.
Global state¶
The bundle exposes: - ACTIVE; - PAUSED; - FAULTED.
ACTIVE¶
Component actions allowed subject to their own confidence/safety gates.
PAUSED¶
Continuous pointer/switch actions suppressed. Ordinary non-hands-free dictation may remain usable.
FAULTED¶
A required active component has stale/unavailable state; related actions suppressed until recovery. No automatic replay/re-arm.
Pause / emergency stop¶
Provide at least one control independent of pointer accuracy.
At experimental release, document at least two stop paths where platforms allow it (for example voice and keyboard/tray).
Global pause: - clears dwell progress; - clears pending face gesture state; - suppresses pointer motion/click; - does not delete calibration; - keeps enough sensing/status to explain recovery if privacy/config allows.
Startup order¶
- load/validate config;
- identify enabled components;
- validate optional deps/model;
- establish permissions/backends;
- start shared perception if needed;
- start consumers;
- remain PAUSED/FAULTED rather than partially firing if a critical component is unavailable;
- expose state to tray/status.
Speech-only fallback must remain available when optional camera controls fail, unless the user explicitly configured otherwise.
Shutdown¶
Reverse safely: - suppress actions first; - stop consumers; - release camera source when last consumer; - close pointer backend; - leave ordinary daemon shutdown intact.
Failure matrix¶
| Failure | Required behavior |
|---|---|
| camera unavailable | camera controls unavailable; speech survives |
| head pose stale | pointer stops; no last delta |
| face switch stale | switch stops; no last event |
| pointer backend denied | no pointer actions; gaze/speech may remain |
| display topology change | gaze routing pauses until geometry/calibration valid |
| model unavailable | actionable status; no repeated network loop |
| permission denied | explain exact permission/fallback |
Config ownership¶
handsfree preset does not create duplicate hidden settings.
Implementation can: - set/enable underlying configs; - remember which values were preset vs user-overridden; - expose composed state.
Disabling bundle does not erase calibration.
Doctor/status¶
Must report: - overall state; - camera/perception source state; - head tracking state; - face switch state; - pointer backend; - permissions; - calibration valid/stale; - global pause state; - actionable reason for fault.
No face landmarks/biometric values.
Accessibility UI¶
Settings/docs should expose: - enable/disable; - pause/kill; - recenter; - dwell on/off; - switch mapping; - confidence/threshold advanced controls; - current status; - recalibration.
The first experimental release may be CLI-first only if every required action is documented and an accessible stop path exists. Recommended status requires a usable non-terminal control surface.
Acceptance scenario¶
Without touching a mouse after start: 1. activate/recenter safely; 2. target a text destination; 3. dictate text; 4. move pointer to a large control; 5. commit/select; 6. obscure/lose camera and observe no phantom action; 7. pause; 8. resume/re-arm; 9. request a destructive action and receive confirmation; 10. disable/quit and verify camera/pointer release.
Automated integration uses fakes; live evidence repeats on real hardware.
Release gates¶
Experimental: - all component hermetic tests; - global stop; - permissions/doctor; - one hardware report; - setup/troubleshooting.
Recommended: - multi-environment field evidence; - false activation/click metrics; - accessibility co-design/usability review; - fatigue observations; - risk register blockers resolved.