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

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

    Status
    Pending

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions