2026 03 02_accessibility_closure_bundle_audit_301 - mark-ik/graphshell GitHub Wiki
Date: 2026-03-02
Status: Closure evidence artifact
Scope: G-A-7, G-A-8, G-A-9, G-A-11 from ../research/2026-03-02_ux_integration_research.md.
Related:
../design/accessibility_baseline_checklist.md../implementation_strategy/subsystem_accessibility/SUBSYSTEM_ACCESSIBILITY.md../implementation_strategy/subsystem_focus/focus_and_region_navigation_spec.md
| Gap | Category | Outcome | Evidence type |
|---|---|---|---|
G-A-8 |
Reduced motion | Staged with guardrails | Canonical policy + repeatable validation steps |
G-A-7 |
Contrast | Audited (key explicit-color command surfaces) | Repeatable ratio calculation procedure + recorded outputs |
G-A-9 |
Target size | Audited (key explicit-size command surfaces) | Constant-based size verification + documented exceptions |
G-A-11 |
Keyboard trap | Validated | Deterministic focus-cycle/return-path tests |
Preference-plumbed reduced-motion behavior is staged (not yet fully preference-driven).
- Motion-critical behavior remains under explicit command authority (
GraphTogglePhysics) and does not silently switch command semantics. - Focus and return-path transitions remain deterministic and non-animated by contract (focus/workbench specs), preserving non-pointer accessibility behavior.
- Reduced-motion remains tracked as a first-class closure lane in canonical accessibility artifacts until preference plumbing is completed.
- Verify deterministic physics control path remains explicit and stable through command surfaces (
ActionRegistrypath forGraphTogglePhysics) and does not introduce hidden motion-only routing.
Run this PowerShell snippet from repository root to compute WCAG contrast ratios for explicit-color radial command-surface pairs:
function Convert-ToLinear([double]$c){ $v=$c/255.0; if($v -le 0.04045){ return $v/12.92 } else { return [math]::Pow((($v+0.055)/1.055),2.4) } }
function Get-Luminance($rgb){ return 0.2126*(Convert-ToLinear $rgb[0]) + 0.7152*(Convert-ToLinear $rgb[1]) + 0.0722*(Convert-ToLinear $rgb[2]) }
function Get-Contrast($fg,$bg){ $l1=Get-Luminance $fg; $l2=Get-Luminance $bg; if($l2 -gt $l1){ $tmp=$l1; $l1=$l2; $l2=$tmp }; return ($l1+0.05)/($l2+0.05) }| Pair | Ratio | WCAG 1.4.3 text threshold (4.5:1) | Status |
|---|---|---|---|
| radial enabled text on enabled button | 6.99 | 4.5 | Pass |
| radial disabled text on disabled button (2026-03-02 baseline) | 3.21 | 4.5 | Fail (text); Pass for non-text minimum 3.0 |
| radial hub label on hub fill | 12.78 | 4.5 | Pass |
| radial domain label on domain fill | 10.34 | 4.5 | Pass |
| radial hover-label text on hover-label background | 14.22 | 4.5 | Pass |
| radial page-indicator text on canvas background | 8.55 | 4.5 | Pass |
- Disabled radial command text color was remediated in
render/radial_menu.rsand is now gated by an automated contrast regression test (radial_disabled_text_contrast_meets_wcag_minimum_for_text). - Post-fix measured ratio for disabled text on disabled button is approximately
6.05:1(>=4.5:1) and therefore now passes WCAG 1.4.3 normal text threshold.
- Historical note: disabled-state text contrast in radial surface was previously
3.21:1; this was remediated on 2026-03-04 (see §3.4).
Verify explicit control-size constants in render/radial_menu.rs:
-
COMMAND_BUTTON_RADIUS = 22.0→ diameter44px - WCAG 2.5.8 minimum target size:
24px
| Surface/control | Measured size | Threshold | Status |
|---|---|---|---|
| Radial command button | 44px diameter | 24px | Pass |
| Radial domain button | 52px diameter (radius=26) |
24px | Pass |
- Toolbar/menu controls without explicit size constants remain pending measurement in a follow-on target-size sweep.
Run:
cargo test cycle_focus_region_intent_cycles_graph_node_tool_regions -- --nocapturecargo test close_settings_tool_pane_restores_previous_graph_focus_via_orchestration -- --nocapturecargo test cycle_focus_region_success_does_not_emit_ux_navigation_violation_channel -- --nocapture
All listed tests pass, validating deterministic non-pointer escape/return paths and no-trap navigation behavior in host UI focus routing.
Additional regression coverage now verifies global undo shortcut modal isolation across multiple floating command surfaces:
-
global_shortcut_undo_is_consumed_when_modal_is_active(radial) global_shortcut_undo_is_consumed_when_command_palette_modal_is_activeglobal_shortcut_undo_is_consumed_when_help_panel_modal_is_active-
global_shortcut_undo_is_consumed_when_clear_confirm_modal_is_active(clear-data confirm dialog path)
This path now routes through a unified modal-surface dispatch gate shared with UI overlay state, so clear-confirm dialog activation participates in the same no-trap shortcut isolation contract as command overlays.
All pass and provide evidence that active modal overlays consume non-modal global shortcut handling instead of trapping focus/dispatch in ambiguous paths.
Input-layer shortcut capture behavior is now explicitly covered with tests in input/mod.rs:
collect_actions_suppresses_f6_when_keyboard_is_capturedcollect_actions_allows_f6_when_keyboard_is_not_capturedcollect_actions_keeps_f9_global_when_keyboard_is_capturedcollect_actions_suppresses_f1_when_keyboard_is_capturedcollect_actions_suppresses_f2_when_keyboard_is_capturedcollect_actions_suppresses_f3_when_keyboard_is_captured
This validates that focus-cycling shortcuts are suppressed while text-edit surfaces own keyboard focus, while designated global safety/escape controls remain available.
Keyboard operability coverage now explicitly includes workbar command-surface toggles through input-layer key-detection tests:
collect_actions_maps_f1_to_help_panel_toggle_when_not_capturedcollect_actions_maps_f2_to_command_palette_toggle_when_not_capturedcollect_actions_maps_f3_to_radial_menu_toggle_when_not_captured
Together with existing intent-application tests (test_toggle_help_panel_action, test_toggle_command_palette_action), this provides direct evidence that core workbar command surfaces are keyboard-invokable.
Omnibar submit-dispatch behavior now has explicit helper-level coverage in toolbar_location_panel.rs:
submit_dispatch_triggers_for_focused_entersubmit_dispatch_triggers_for_queued_submitsubmit_dispatch_ignores_enter_after_focus_losssubmit_dispatch_triggers_for_queued_submit_after_focus_losssubmit_dispatch_does_not_trigger_without_enter_or_queue
This confirms keyboard-submit semantics remain deterministic (focused Enter and queued-submit paths dispatch; passive Enter after focus loss does not), reducing no-trap/accidental-submit ambiguity for omnibar workflows.
Clear-data destructive confirmation timing now has explicit unit coverage in dialog_panels.rs:
clear_data_confirm_is_not_armed_without_deadlineclear_data_confirm_is_armed_until_deadline_inclusiveclear_data_confirm_expires_after_deadline_passesnext_clear_data_confirm_deadline_uses_expected_window
This validates deterministic two-step confirmation semantics (arm on first activation, execute only while armed, require re-arm after expiry), which contributes direct error-prevention evidence for destructive dialog actions.
Instructional copy invariants now have explicit regression coverage:
clear_data_confirm_warning_text_includes_instruction_and_timingclear_data_confirm_success_text_describes_completed_actionlocation_input_hint_text_provides_search_and_address_instruction
These tests preserve baseline instruction clarity for destructive dialogs and the omnibar primary text-entry affordance, providing concrete partial evidence for WCAG 3.3.2 mapping while broader multi-surface validation remains pending.
Input-layer shortcut suppression under text capture now explicitly includes character-key shortcuts:
collect_actions_suppresses_character_shortcut_n_when_keyboard_is_capturedcollect_actions_suppresses_character_shortcut_t_when_keyboard_is_capturedcollect_actions_suppresses_character_shortcut_questionmark_when_keyboard_is_captured
This extends keyboard-capture evidence beyond function keys, showing that single-character command shortcuts are not triggered while text-entry controls own keyboard focus.
Dialog clear-confirm input processing now has explicit action-classification regressions:
clear_data_confirm_action_arms_when_no_deadline_is_presentclear_data_confirm_action_executes_when_deadline_is_activeclear_data_confirm_action_rearms_when_deadline_expired
Together with existing omnibar submit-dispatch tests (submit_dispatch_*), this provides concrete evidence that input-side effects are deterministic and state-dependent rather than surprising implicit context changes.
Command-surface disabled precondition guidance now has explicit regressions:
all_disabled_actions_expose_textual_precondition_reason_in_default_contextdisabled_action_reasons_use_actionable_text_not_color_cues
These tests provide partial evidence that disabled-state communication is conveyed via textual/actionable guidance rather than relying on color-only cues, supporting WCAG 1.3.3 and 1.4.1 mapping in command surfaces.
Action label purpose clarity now has targeted regression coverage in action_registry.rs:
test_representative_action_labels_convey_purpose_in_context
The test verifies representative Open/Copy/Connect/Delete/Save/Restore command labels contain explicit purpose terms, providing partial evidence for WCAG 2.4.4 mapping on command surfaces.
Clipboard status/toast wording now has targeted regression coverage in gui_orchestration:
clipboard_success_status_text_is_deterministic_per_copy_kindclipboard_status_messages_describe_outcomes_explicitlyclipboard_status_success_messages_identify_copied_subject
This coverage locks deterministic success mapping (URL/title) and explicit success/warning/error/unavailable wording, providing partial evidence for WCAG 4.1.3 mapping on command-surface status feedback while screen-reader announcement verification remains pending.
Clipboard failure wording now has targeted regression coverage in gui_orchestration:
clipboard_failure_message_prefix_is_stable_and_identifiableclipboard_missing_node_failure_message_is_explicit
This coverage preserves explicit error identification semantics by enforcing a stable failure prefix and concrete missing-node failure wording in clipboard command feedback, providing partial evidence for WCAG 3.3.1 mapping while broader multi-surface error-state audit remains pending.
Clipboard missing-node failure guidance now has targeted regression coverage in gui_orchestration:
clipboard_missing_node_failure_message_includes_recovery_suggestion
The missing-node failure path now includes explicit recovery guidance (select a node and try again), providing partial evidence for WCAG 3.3.3 mapping in command-surface error feedback while broader multi-surface suggestion quality validation remains pending.
- Reduced-motion behavior implemented or explicitly staged with guardrails.
- Contrast/target-size audit artifacts committed.
- Keyboard trap mitigation validated.