Eye / camera control traceability matrix¶
This is the one-page map from decision -> spec -> issue -> verification.
Core architecture¶
| Area | Decision | Spec | Implementation issues | Evidence / gate |
|---|---|---|---|---|
| Gaze routes context, not caret | ADR-v2-010 | design/specs/glance-type.md | existing live code + #397–#399 | gaze routing tests + #104 |
| Shared webcam/model owner | ADR-v2-145 | design/specs/eye-shared-perception.md | #393–#396 | one-open lifecycle tests |
| Pointer output boundary | ADR-v2-146 | design/specs/eye-pointer-output.md | #400–#403 | shared sink contract + platform smoke |
| Head-Pointer runtime | ADR-v2-052 + ADR-v2-146 | design/specs/eye-head-pointer-runtime.md | #404–#405 | fake trace + hardware acceptance |
| Face gesture is a switch | ADR-v2-147 | design/specs/eye-face-switch.md | #406–#409 | false activations/hour |
| Gesture composition | ADR-v2-043 + ADR-v2-147 | design/specs/eye-face-switch.md | #408 | chord resolver tests |
| Hands-free is composition | ADR-v2-148 | design/specs/eye-handsfree-bundle.md | #410 + #416 + #417 | end-to-end scenario |
| Calibration topology | ADR-v2-149 | design/specs/eye-implicit-calibration.md | #397–#398 + #415 | invalidation/rollback tests |
| Dedicated tracker seam | future ADR only if study warrants | DEDICATED_TRACKER_STUDY.md (research note, no implementation) | #412 | API/licensing study |
| Grounded semantic targets | ADR-v2-151 (Proposed) | design/specs/eye-grounded-targets.md | #441–#445 | pure resolver + semantic coverage + wrong-target/abstention |
Cross-cutting implementation gaps¶
The original #392–#412 split covered the feature path but not all production obligations. The programme also tracks:
| Gap | Why it is separate | Required result |
|---|---|---|
| Camera permissions + packaging | OS/package permissions can make correct code unreachable | #414 — explicit permission matrix + package behavior |
| Multi-monitor/HiDPI/topology | gaze coordinates and calibration can silently become wrong | #415 — canonical coordinate space + invalidation |
| Observability | assistive sensor failure must be diagnosable without logs full of biometric detail | #416 — doctor/status state |
| Global pause/kill/watchdog | continuous pointer/switch input needs an immediate escape | #417 — one safety control across consumers |
| Wayland gaze target semantics | pointer portal does not automatically solve "which window receives dictation" | #418 — documented supported/fallback behavior |
| Accessibility co-design | synthetic tests do not establish usability/fatigue/defaults | #419 — structured review protocol + evidence |
These gaps receive dedicated issues in milestone #10.
Dependency graph¶
DESIGN / GOVERNANCE
ADR-v2-145 shared perception
|
+--> #393 signal contracts
-> #394 source lifecycle
-> #395 multi-signal MediaPipe
-> #396 migrate gaze
+-> #397 click capture -> #398 safe apply
+-> #399 measurement
+-> Wayland target semantics
+-> topology/HiDPI validation
ADR-v2-146 pointer boundary
|
+--> #400 PointerSink
+-> #401 X11
+-> #402 macOS/Windows
+-> #403 Wayland portal
|
+----> #404 Head-Pointer runtime -> #405 UX/recovery
ADR-v2-147 face-switch intent
|
+--> #406 detector -> #407 activation adapter
+-> #408 Gesture Chords
+-> #409 false-activation harness
permission + observability + global safety
\ | /
+----------- #410 hands-free bundle
|
#411 field acceptance
|
#419 co-design
|
experimental -> recommendation gate
ADR-v2-151 grounded target resolution
|
+--> #441 contracts
-> #442 pure resolver
+-> #443 gaze/deixis integration
+-> #445 evaluation harness
|
+--> #444 live semantic-source coverage (human/platform evidence)
#412 dedicated tracker study is parallel/future
Status rules¶
When code lands, update all of: - this matrix; - README.md status table; - relevant spec status; - docs/features.md; - feature registry wiring status when applicable; - issue state.
A merge that updates code but leaves a capability listed as DESIGNED/CORE is incomplete planning work.
Verification ownership¶
| Verification | Runs in CI? | Needs human/device? |
|---|---|---|
| Pure detector/state machine | yes | no |
| Fake MediaPipe adapter | yes | no |
| Pointer protocol contract | yes | no |
| Portal D-Bus protocol fake | yes | no |
| Feature reachability | yes | no |
| No-camera when disabled | yes | no |
| No raw-frame persistence | yes/static | no |
| Camera permission prompt | no | yes |
| Real pointer movement | no | yes |
| False activation/hour | harness yes; measurement no | yes |
| Fatigue/usability | no | yes |
| Cross-device recommendation | no | multiple humans/devices |
Release proof bundle¶
Before an experimental release, one issue/PR should be able to link: 1. merged ADR/spec; 2. implementation PR; 3. narrow CI; 4. privacy/permission result; 5. at least one hardware report; 6. setup/troubleshooting docs.
Before recommended status, add: 7. multi-environment field evidence; 8. false-activation/error metrics; 9. accessibility review; 10. resolved/accepted risk register.
Evaluation traceability¶
| Evidence need | Contract | Issues | Output |
|---|---|---|---|
| Metric/result semantics | METRICS.md | #421 | versioned result schema |
| Standard non-sensitive tasks | EVALUATION.md | #422 | deterministic task fixtures |
| Local privacy-safe capture | DATA_SHARING.md | #423 | local validated JSON |
| Cross-OS automated evidence | E0–E2 | #424 | CI artifacts |
| Cross-machine hardware QA | E3/E4 | #428–#436 + #438–#440 | public community QA reports |
| Test-retest stability | E6 | #437 | 3 session artifacts |
| Human-study design/ethics | PAPER_EVIDENCE.md | #425 | frozen protocol + determination |
| Research analysis | METRICS.md | #426 | reproducible tables/figures |
| Tester/participant wording | DATA_SHARING.md | #427 | reviewed public/research materials |
| Beginner instruction usability | BEGINNER_TESTING.md | #449 | first-time-reader review |
| Slot readiness / matrix registry | VALIDATION_OPERATIONS.md | #454 | validated PLANNED/READY registry |
| Coverage dashboard | VALIDATION_OPERATIONS.md | #455 | generated engineering coverage view |
| Contributor task-finder integration | campaign inventory contract | #456 | READY eye slots discoverable as no-code measurement tasks |
Community QA rows are not automatically eligible for participant-level paper analysis.
Acceptance traceability — #411 and #419¶
The two human-study issues each carry an acceptance list. This table links every item to its issue, the validation slots that will collect it, and the pure test that guards what can be guarded without a person. It records links, not outcomes: no row says an item has been met, because for the "needs a person" column that is not something a repository file can say (README.md explains why this directory keeps no status snapshot). A test checks that every slot id, test and criterion named here still exists; a dash means there is none yet, and the test accepts a dash only because tests/test_eye_acceptance_consistency.py also checks the row has an issue.
T0-* and similar in the slots column is a glob over the ids in validation-slots.json; it must match at least one.
| ID | Acceptance item | Issue | Registry slots | Pure test | Needs a person |
|---|---|---|---|---|---|
| H1 | Per environment: OS/session, camera, lighting, display/scale, viewing distance, feature config, duration, failures, CPU/FPS, privacy check | #411 | T0-* | tests/test_eye_acceptance_consistency.py::test_every_field_the_test_plan_asks_a_tester_to_report_has_a_form_field | yes |
| H2 | Gaze wrong-window, fallback and drift | #411 | T1-* | tests/test_eye_acceptance_consistency.py::test_the_emitted_keys_are_documented_with_their_units_and_the_protocol_maps_onto_them | yes |
| H3 | Head-Pointer overshoot and accidental clicks | #411 | — | tests/test_headpointer_controller.py::test_a_stale_sample_never_moves_the_pointer_again | yes |
| H4 | Face-switch misses and false activations per hour | #411 | — | tests/test_face_switch_replay.py::test_speech_and_everyday_movement_do_not_fire_the_default | yes |
| H5 | Wayland portal consent and recovery | #411 | T0-GNOME-*, T0-KDE-* | tests/test_pointer_consent.py::test_before_the_dialog_is_answered_the_sink_says_pending_and_negotiates_nothing | yes |
| H6 | Never request face/video, diagnosis, typed content or identity | #411 | T0-* | tests/test_eye_eval_privacy.py::test_the_serialised_document_names_no_forbidden_token | no |
| H7 | Hardware evidence stays separate from hermetic CI evidence | #411 | — | tests/test_eye_eval_schema.py::test_community_qa_cannot_declare_itself_research_grade | no |
| H8 | Replicate each OS and session on two machines (A/B), test/retest | #411 | T0-*, T5-*, T1-ANY-REPEAT | tests/test_eye_validation_slots.py::test_the_registry_agrees_with_the_prose_matrix_issue_for_issue | yes |
| H9 | Track FAIL and BLOCKED, not only the machines that worked | #411 | — | tests/test_eye_validation_dashboard.py::test_a_failed_cell_is_reported_evidence_and_never_missing_evidence | no |
| H10 | Open later packs only where the capability is reachable | #411 | T1-* | tests/test_eye_acceptance_consistency.py::test_every_cell_the_run_where_table_names_is_registered_or_disclosed_as_a_gap | no |
| A1 | Start, pause and stop without precise pointer use | #419 | — | tests/test_handsfree_stopword.py::test_the_match_is_equality_on_the_whole_utterance_not_a_search | yes |
| A2 | Recover from camera loss | #419 | — | tests/test_handsfree_e2e_fake_scenario.py::test_the_hands_free_workflow_end_to_end_on_fakes | yes |
| A3 | Normal speaking does not disturb Head-Pointer or collide with the face switch | #419 | — | tests/test_face_switch_replay.py::test_speech_and_everyday_movement_do_not_fire_the_default | yes |
| A4 | How often a false action occurs | #419 | — | tests/test_eye_acceptance_consistency.py::test_the_emitted_keys_are_documented_with_their_units_and_the_protocol_maps_onto_them | yes |
| A5 | Dwell time tolerable or frustrating; which fallback is usable | #419 | — | — | yes |
| A6 | Neck and visual fatigue over a session | #419 | — | tests/test_eye_acceptance_consistency.py::test_the_protocol_requirements_quote_text_that_exists_and_name_only_gaps_that_exist | yes |
| A7 | Minimum report: completion, errors, duration, before/after comfort rating, own-words comments | #419 | — | tests/test_eye_acceptance_consistency.py::test_the_protocol_requirements_quote_text_that_exists_and_name_only_gaps_that_exist | yes |
| A8 | No face/video, no diagnosis, no private content, consent for any quote, negatives kept | #419 | — | tests/test_eye_eval_privacy.py::test_the_serialised_document_names_no_forbidden_token | no |
| A9 | Exit: several environments and people, unresolved severe risks documented | #419 | — | tests/test_eye_validation_slots.py::test_no_slot_is_ready_because_no_slot_has_been_validated_by_a_human | yes |
| A10 | Report people, sessions, computers, OS/session, cameras, scaling, exposure separately | #419 | — | tests/test_eye_validation_dashboard.py::test_the_page_states_that_hosts_and_repeat_sessions_are_different_units | yes |
| A11 | Co-design outside #425 stays out of participant-level analysis | #419 | — | tests/test_eye_eval_schema.py::test_community_qa_cannot_declare_itself_research_grade | no |
| A12 | Do not recommend a hands-free default before the evidence | #419 | — | tests/test_eye_acceptance_consistency.py::test_no_camera_feature_is_on_in_a_default_install | no |