Skip to content

[Frontend][UX] Documented bare-letter shortcuts (H/T/B/I/R, G T, board C/R) have no handler, and Settings has no Keyboard page #1968

Description

@Chris0Jeky

Found by the 2026-08-22 horizon-journey golden run — a 44-capability live end-to-end session against a running instance. Sibling of tracker #1947. Finding H-06.

The defect

The ? keyboard map (HELP · KEYBOARD MAP — The full keystroke ledger) documents bindings that have no
handler anywhere in the codebase
. Every modifier binding works; the bare-letter navigation set does
nothing.

Binding Documented as Actual
H T B I R NAVIGATE · WORKSPACE dead — URL unchanged from Home and from a board, main focused
G T Go to Today · ANYWHERE dead
C / R on a board badge rendered on every board as Capture here C / Review R dead
P Toggle provenance pane · DURING REVIEW observed dead — see below
J/K/H/L, Alt+arrows, space board card nav not exercised (no reliable card-focus entry point without J)

Working: ?, Ctrl+K, Ctrl+;, Ctrl+Shift+C, .

Source trace

  • The documented list: frontend/taskdeck-web/src/components/paper/PaperShortcutsOverlay.vue:32-69H/T/B/I/R at :36-40, G T at :42, P at :52.
  • The only global keyboard handler: frontend/taskdeck-web/src/components/shell/AppShell.vue:135-153 — it registers Ctrl/Cmd+K, Ctrl/Cmd+Shift+C and ?, and nothing else. There is no bare-letter navigation handler and no g-chord state anywhere in src/.
  • Not a Paper gating flag — the handlers do not exist. useKeyboardShortcuts.ts is registered in exactly one place, src/views/BoardView.vue:328 (the legacy board). PaperBoardView.vue registers no keydown listener at all; the C / R badges at PaperBoardView.vue:265-266 are decorative kbd props on PaperHLBtn.
  • P is the exception: it is registered, at src/composables/useReviewKeymap.ts:157-161 (wired at PaperReviewView.vue:1151-1165). Likely explanation for it testing dead, stated as a hypothesis to confirm, not as fact: the whole review keymap is gated enabled: () => !busy.value (PaperReviewView.vue:1164), and the run clicked Request edit on that page earlier — which sets busy and silences every review shortcut at once (see the sibling Request edit issue). If that is right, P needs no new handler, only the lock fixed and re-verification.
  • No Keyboard settings page. The map's footer says "Bindings are remappable · Settings → Keyboard" (PaperShortcutsOverlay.vue:146), but src/router/index.ts:253-291 defines only profile / access / export-import / preferences / appearance / api-keys.

Why it matters

The product presents itself as keyboard-first — letter hints in the sidebar, letter badges on every board,
and a dedicated help dialog billed as "the full keystroke ledger" — while the majority of those hints do
nothing. A help dialog that documents non-existent bindings is worse than no dialog: it costs the user
time proving each one dead, which is exactly what this run spent.

This is the #1949 dead-affordance class applied to keystrokes, which no DOM-based dead-control guard
would catch — the affordance is a kbd glyph and a help-table row, not a button.

Acceptance criteria

  • Every binding shown in the ? map either works or is not shown. No row documents a binding with no handler.
  • If the bare-letter navigation set is implemented: H/T/B/I/R and the G T chord navigate as documented, and are suppressed while a text input, textarea, or contenteditable has focus.
  • Board badge C / R either activate capture / review or lose their kbd glyph — PaperBoardView.vue:265-266 stops advertising a binding that does not exist.
  • P toggles the provenance pane during review, verified after the Request edit lock is fixed; if the lock was the cause, that is recorded on this issue rather than a new handler being added.
  • The map's footer no longer points at a Settings → Keyboard page unless that page exists.
  • Test guard: a spec derives the binding list from PaperShortcutsOverlay.vue's data and asserts each documented binding has a registered handler — so a future doc row without an implementation fails CI. This is the assertion that makes the class of bug non-recurring.
  • Spec: at least one bare-letter navigation binding is exercised through a real dispatched keydown on the rendered shell, asserting the route changed.
  • Spec: the input-focus suppression case is asserted (typing t in the capture box must not navigate to Today).

Refs

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Priority IIThe active direction's next tranche: wedge capabilities, significant defects, near-term hardening.dogfoodingFrom real personal/beta use; evidence-grade product feedback (exempt from intake severity bar).featureUser-facing functionality delivery slices (new capabilities or clear product-surface enhancements).frontendPrimary implementation impact in Vue/TypeScript UI and client runtime.uxDiscoverability, accessibility, interaction model, and user workflow quality.

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions