d68f003000
CI / Change detection (push) Has been cancelled
CI / Version drift (push) Has been cancelled
CI / Lint (push) Has been cancelled
CI / Workflow RLM cache (push) Has been cancelled
CI / Test (macos-latest) (push) Has been cancelled
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / npm wrapper smoke (push) Has been cancelled
CI / Mobile runtime smoke (push) Has been cancelled
CI / Workflow lint (push) Has been cancelled
CI / Documentation (push) Has been cancelled
Web Frontend / Lint & Type Check (push) Failing after 1s
Auto-close harvested PRs / close (push) Failing after 1s
cargo-deny / cargo-deny (bans licenses sources) (push) Failing after 1s
Security audit / cargo-audit (push) Failing after 1s
Sync to CNB / sync (push) Failing after 1s
cargo-deny / cargo-deny (advisories) (push) Failing after 3s
Web Frontend / Deploy to Cloudflare (push) Has been cancelled
7.6 KiB
7.6 KiB
Hotbar QA Matrix
This matrix is the v0.8.66 release gate for #3401. It ties the shipped Hotbar MVP to repeatable checks instead of treating isolated unit tests as sufficient coverage.
Support Level
| Source | Support level | Release statement |
|---|---|---|
| Built-in app actions | Supported | Default slots dispatch existing app paths through AppAction or in-app state mutation. |
| Slash commands | Supported | Argument-free and optional-argument commands dispatch through commands::execute; required-argument commands prefill the composer. |
| MCP tools/resources/prompts | Deferred | Visible through the command palette/MCP manager only until argument and approval gates are wired. |
| Skills | Deferred | Visible through command palette and slash skill activation; direct Hotbar binding is deferred until activation receipts are wired. |
| Plugins | Deferred | Visible through /plugins; direct Hotbar binding is deferred until plugin approval gates are wired. |
Config States
| Scenario | Expected behavior | Evidence |
|---|---|---|
| No hotbar config | Default slots resolve to the shipped eight-slot bar. | crates/config/src/tests.rs::hotbar_defaults_when_config_is_absent |
| Empty hotbar config | hotbar = [] disables all default slots. |
crates/config/src/tests.rs::hotbar_empty_array_disables_default_slots; crates/tui/src/config_persistence.rs::persist_hotbar_bindings_writes_empty_array_to_disable_defaults |
| Partial config | Missing slots render empty without filling from defaults. | crates/tui/src/tui/sidebar.rs::hotbar_panel_slots_handle_empty_partial_and_unknown_config |
| Unknown actions | Unknown configured actions stay visible as unknown instead of being dropped silently. | crates/config/src/tests.rs::hotbar_validation_warns_without_dropping_unknown_actions; crates/tui/src/tui/sidebar.rs::hotbar_panel_slots_handle_empty_partial_and_unknown_config |
| Custom labels | Configured labels render and persist with bindings. | crates/tui/src/tui/hotbar/actions.rs::recommended_hotbar_bindings_serialize_action_ids_and_labels; crates/tui/src/tui/ui/tests.rs::hotbar_setup_save_persists_bindings_to_config_path |
| Workspace overlay | Project config does not replace user-owned Hotbar bindings. | crates/config/src/tests.rs::project_merge_does_not_replace_user_hotbar_bindings |
| Legacy/user config path | Fresh setup writes the primary config path; existing comments survive replacement. | crates/tui/src/config_persistence.rs::persist_hotbar_bindings_writes_primary_config_path_for_fresh_installs; crates/tui/src/config_persistence.rs::persist_hotbar_bindings_preserves_comments_and_replaces_existing_tables |
| Failed persistence | Live config and config file remain unchanged and an error is surfaced. | crates/tui/src/tui/ui/tests.rs::hotbar_setup_save_error_leaves_live_config_and_file_unchanged |
UI States
| Scenario | Expected behavior | Evidence |
|---|---|---|
| Normal TUI/composer | Alt-1 through Alt-8 dispatch configured slots; bare digits remain text input. |
crates/tui/src/tui/ui/tests.rs::hotbar_alt_digit_fires_from_composer_and_sidebar_states; crates/tui/src/tui/ui/tests.rs::hotbar_bare_digit_inserts_text_even_when_composer_empty |
| Hidden/sidebar focus states | Hotbar dispatch is still available from hidden, auto, pinned, and focused sidebar states. | crates/tui/src/tui/ui/tests.rs::hotbar_alt_digit_fires_from_composer_and_sidebar_states |
| Narrow sidebar | Hotbar panel keeps fixed two-row layout and bounded hover/status text. | crates/tui/src/tui/sidebar.rs::hotbar_panel_lines_keep_two_fixed_rows_and_hover_status; docs/evidence/terminal-visual-regression-matrix.md |
| Modal/overlay open | Modal, approval, picker, decision-card, and onboarding states block Hotbar numeric ownership. | crates/tui/src/tui/ui/tests.rs::hotbar_digits_are_blocked_while_modal_or_onboarding_is_active; crates/tui/src/tui/ui/tests.rs::hotbar_alt_digit_is_blocked_while_inline_selectors_are_open; crates/tui/src/tui/ui/tests.rs::hotbar_alt_digit_is_blocked_while_decision_card_is_active |
| Setup wizard open/save | Setup lists supported source categories, updates draft bindings, saves, and persists. | crates/tui/src/tui/hotbar/setup.rs::wizard_sources_follow_registered_action_categories; crates/tui/src/tui/hotbar/setup.rs::wizard_save_emits_bindings_but_escape_only_closes; crates/tui/src/tui/ui/tests.rs::hotbar_setup_save_persists_bindings_to_config_path |
| Restart/re-dispatch | Persisted bindings parse back into config and resolve through the same dispatch path. | crates/config/src/tests.rs::hotbar_tables_parse_and_round_trip; crates/tui/src/tui/ui/tests.rs::hotbar_dispatches_bound_slot_and_ignores_empty_slot |
Dispatch Outcomes
| Outcome | Expected behavior | Evidence |
|---|---|---|
| Handled in-app | Local UI/state actions mutate app state and mark redraw when needed. | crates/tui/src/tui/hotbar/actions.rs::sidebar_toggle_reports_visibility_and_dispatches; crates/tui/src/tui/hotbar/actions.rs::trust_toggle_reports_trust_state_and_dispatches |
AppAction return |
Actions that must be handled by the event loop return the existing AppAction. |
crates/tui/src/tui/hotbar/actions.rs::compact_action_emits_existing_app_action; crates/tui/src/tui/ui/tests.rs::hotbar_dispatches_bound_slot_and_ignores_empty_slot |
| Composer prefill | Required-argument slash commands prefill the composer instead of firing empty args. | crates/tui/src/tui/hotbar/actions.rs::slash_hotbar_action_prefills_required_argument_command |
| Disabled reason | Disabled actions are excluded from recommendations and report a reason if manually bound. | crates/tui/src/tui/hotbar/actions.rs::hotbar_recommendations_exclude_disabled_actions; crates/tui/src/tui/ui/tests.rs::hotbar_bound_disabled_action_reports_reason_without_dispatching |
| Unknown action | Unknown configured action is visible and does not dispatch. | crates/tui/src/tui/sidebar.rs::hotbar_panel_slots_handle_empty_partial_and_unknown_config; crates/tui/src/tui/ui.rs::dispatch_hotbar_slot |
| Approval-gated/deferred source | Source is explicitly deferred and must not register bindable actions before gates exist. | crates/tui/src/tui/hotbar/actions.rs::source_descriptors_cover_dispatch_boundaries; crates/tui/src/tui/hotbar/actions.rs::deferred_sources_cannot_register_dispatchable_actions |
Release Smoke Checklist
Run before claiming Hotbar MVP readiness:
cargo test -p codewhale-config hotbar -- --nocapturecargo test -p codewhale-tui --bin codewhale-tui --locked hotbar::actions -- --nocapturecargo test -p codewhale-tui --bin codewhale-tui --locked hotbar_setup -- --nocapturecargo test -p codewhale-tui --bin codewhale-tui --locked hotbar_panel -- --nocapturecargo test -p codewhale-tui --bin codewhale-tui --locked hotbar_alt_digit -- --nocapturecargo test -p codewhale-tui --bin codewhale-tui --locked hotbar_dispatch -- --nocapture
Manual pass, if a release candidate binary is available:
- Start with no
[hotbar]config and verify the default eight slots render in the sidebar with visibleAlt1throughAlt8accelerator labels. - Open
/hotbar, bind a slash command, save, restart, and verify the binding persists. - Press
Alt-1throughAlt-8from composer/sidebar states and verify onlyAltchords dispatch. - Open command palette, slash menu, setup wizard, decision card, and an approval modal; verify Hotbar digits are blocked while those surfaces own input.
- Confirm MCP, skill, and plugin entries remain discoverable through their existing command-palette or slash-command paths and are not offered as direct Hotbar bindable actions.