Skip to content

Keystroke ledger documents shortcuts that don't exist, omits ones that do, and there are three divergent shortcut systems #2007

Description

@Chris0Jeky

What happened (live dogfooding, 2026-08-23)

Opened "The full keystroke ledger" (? overlay) and audited every row against the code. Most of the Navigate column does not exist. The overlay is a hand-maintained array with no link to the handlers it describes, and it has drifted from the app it documents.

Findings

1. Shortcuts that are advertised but not implemented

src/components/paper/PaperShortcutsOverlay.vue:36-42 lists H Home, T Today, B Boards, I Inbox, R Review, and G T Go to Today. No single-key navigation handler exists anywhere in src/ — the only global keydown listener is AppShell.vue:136-152, which handles exactly three bindings: Ctrl/Cmd+K, Ctrl/Cmd+Shift+C, and ?. There is no g-prefix chord handler at all. Six of the seven Navigate rows are fiction.

(H, J, K, L do work on the board canvas via BoardView.vue — and the Boards column correctly documents them. The Navigate column claims the same letters do something else globally, which is both untrue and, if implemented, would collide.)

2. G T duplicates T even as designed

Two rows in one column for the same destination, one of them a chord. Whichever survives, it should be one row.

3. A real shortcut is missing from the ledger

D = Defer 1h is registered (useReviewKeymap.ts:159) and is shown in the Review screen's own "Decide with keys" panel — but the ledger's Capture & Review column omits it. So the ledger is both over- and under-inclusive.

4. "Bindings are remappable · Settings → Keyboard" is false

Footer at PaperShortcutsOverlay.vue:146. There is no keyboard settings route — src/router/index.ts has profile, access, export-import, preferences, appearance, and api-keys, and nothing else. No remapping store or persisted binding exists anywhere in the frontend. This tells the user a feature exists and sends them to a page that isn't there.

5. Layout: the widest chip overflows its column and collides with the label

The row grid is grid-template-columns: 56px 1fr auto (PaperShortcutsOverlay.vue:224). Ctrl/Cmd+Shift+C renders far wider than 56px, so the chip overruns the label track and the text "Quick capture" is drawn on top of it — visible in the attached screenshot. Any adaptive notation (see #2008) will make this worse before it makes it better; the kbd track needs to be content-sized with the label wrapping instead.

6. There are three divergent shortcut systems in the tree

  • src/components/paper/PaperShortcutsOverlay.vue — the Paper ledger (this issue).
  • src/components/KeyboardShortcutsHelp.vue — a second, legacy help dialog with its own hardcoded list that disagrees with the first: it documents N (create card) and F (toggle filter panel), which the ledger never mentions, and omits everything in Capture & Review.
  • src/composables/useShortcutContext.ts — a whole context-stack shortcut dispatcher (useContextualShortcuts, getActiveShortcuts, getAllShortcuts) that is dead code: grep finds no consumer outside the file itself and its tests.

Meanwhile the bindings that actually run are spread across AppShell.vue (inline handler), useKeyboardShortcuts.ts (used by BoardView), and useReviewKeymap.ts — none of which the help surfaces read from.

Fix shape

The root problem is that the help text is a literal array, so it can never be wrong at build time. Suggested direction:

  • One shortcut registry module as the single source of truth: canonical binding descriptor, label, scope, and platform notation per entry.
  • Both the dispatchers and the help overlay read from that registry — a shortcut that is not registered cannot be displayed, and a registered one cannot be forgotten.
  • Delete KeyboardShortcutsHelp.vue or reduce it to a consumer of the registry; delete useShortcutContext.ts unless it is about to be adopted (if it is, say so on this issue and keep it).
  • Decide the Navigate column: either implement global single-key navigation (with a text-entry guard and a resolution for the H/J/K/L collision with board-canvas movement), or remove those rows. Removing is the honest short fix and can ship first.
  • Remove or implement "Settings → Keyboard". Removing the sentence is a one-line change and should not wait on remapping being built.
  • Fix the row grid so a wide chip sizes to content and the label wraps.

Remaining acceptance (D-5 reconciliation, 2026-09-09)

Delivered acceptance: PR #2615 supplied registry truth checks, chip-track sizing and one reachable help surface per skin. The current registry/help tests cover flag-gated newAutomation, the Paper D and Space bindings, and bare T without G T; the footer no longer promises a nonexistent remapping page. These were rechecked by the #2819 shortcut suite. No new human browser-layout acceptance is claimed here.

The recorded 2026-09-06 D-5(e/f) ruling makes this issue the owner of dispatcher deletion, retains it in v0.3 and removes its v0.4 pointer. #1276 now points here; #2236 no longer defers this work. The original August audit above is historical context.

Evidence

Screenshot of the ledger showing the Ctrl/Cmd+Shift+C / "Quick capture" collision, plus the nib and palette chips, 2026-08-23.

Related

#2008 covers modifier-glyph notation ( vs Ctrl) across all surfaces — separable from this, but a shortcut registry is the natural home for both fixes and they should probably land in that order.

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.bugSomething isn't workingdogfoodingFrom real personal/beta use; evidence-grade product feedback (exempt from intake severity bar).frontendPrimary implementation impact in Vue/TypeScript UI and client runtime.tech-debtDebt cleanup or deferred engineering quality work with limited product-surface change.uiVisual design, theming, and component presentation work.uxDiscoverability, accessibility, interaction model, and user workflow quality.

    Projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions