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.
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-42listsHHome,TToday,BBoards,IInbox,RReview, andG TGo to Today. No single-key navigation handler exists anywhere insrc/— the only global keydown listener isAppShell.vue:136-152, which handles exactly three bindings:Ctrl/Cmd+K,Ctrl/Cmd+Shift+C, and?. There is nog-prefix chord handler at all. Six of the seven Navigate rows are fiction.(
H,J,K,Ldo work on the board canvas viaBoardView.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 TduplicatesTeven as designedTwo 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.tshas 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+Crenders 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 documentsN(create card) andF(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 byBoardView), anduseReviewKeymap.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:
KeyboardShortcutsHelp.vueor reduce it to a consumer of the registry; deleteuseShortcutContext.tsunless it is about to be adopted (if it is, say so on this issue and keep it).H/J/K/Lcollision with board-canvas movement), or remove those rows. Removing is the honest short fix and can ship first.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 PaperDand Space bindings, and bareTwithoutG 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 (
⌘vsCtrl) 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.