Closes out the T-403 cross-pane vim layer. gt/gT bind to the existing
workspace.tab.next/previous commands (also on ctrl+pagedown/up for every
preset), resolved by the focused editor's matcher or a pane's PaneKeyNav —
bare-g sequences stay editor/pane-local (T-404's global matcher only engages
on modified-chord prefixes), so no global-matcher surgery.
- vim.yaml: g t -> command:workspace.tab.next, g shift+t -> .previous
(vim.normal); shares the `g` prefix with `g g` (docStart / nav.top),
distinguished by the final chord.
- PaneKeyNav now EXECUTES non-editor.vim.* command intents (e.g.
workspace.tab.*) instead of swallowing all command intents, so gt/gT work
from a focused pane; editor.vim.* buffer edits stay blocked in panes.
Tests: vim-preset resolution (gt/gT bind, gg intact), PaneKeyNav executes
the command from a pane, and editor.vim.* is never run from a pane. make
test green; analyze + format clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Thiscompletestheex-line.T-405part2(gt/gT)remainstheonlyopenT-403childandstillneedsthebare-gdesigndecision(seeT-405).', 'done', 'low', NULL, NULL, NULL, '2026-06-1203:22:10', '2026-06-1609:56:18', NULL, 'aec7002f9cec6777eafbfdf163d1d4c3', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBKPAZR4XEV8YW3PVR2XJBFC','task','06FBKP67X1Y1FEE9T5R0E5DA9C','workspace tab cycle commands + vim gt/gT','Two halves; the first benefits every preset (the review found NO tab-cycling command exists anywhere — only alt+1..5 direct sidebar-section picks):
PART2(gt/gT)STILLOPEN—andharderthanthecoordinationnoteassumed.T-404landedaglobalmulti-chordmatcher(root_shell),BUTitdeliberatelyonlySTARTSasequenceonaMODIFIEDchord(ctrl+w).Bare-keyprefixes(g)arelefteditor/pane-localonpurpose—otherwisetheglobalmatcherwouldsteal`g`beforetheeditorseesit,breakinggg/dd.Sogt/gT(bareg)CANNOTjustridetheglobalmatcher.Optionsforpart2:(a)theeditor/panematchersgrowgt/gTanddispatchcommand:workspace.tab.*(butthengtonlyworkswhentheeditor/apaneisfocused,notglobally);(b)afocus-agnosticbare-gdisambiguation(gg=localdocStartvsgt=globaltab)—needstheglobalmatchertotentativelygrabbaregANDcoordinatewiththeeditor''smatcher,whichistheexactconflictT-404avoided.Decidebeforebuilding.Thectrl+pagedown/upcommandsalreadygiveeverypresettab-cycling;gt/gTisavim-affordancenicetyontop.', 'done', 'medium', NULL, NULL, NULL, '2026-06-1203:21:31', '2026-06-1610:07:56', NULL, 'e0d10776a3893b8bc3cf5a8e13a2976e', 2) ON CONFLICT(record_id) DO UPDATE SET type=excluded.type, parent_record_id=excluded.parent_record_id, title=excluded.title, description=excluded.description, status=excluded.status, priority=excluded.priority, assigned_to=excluded.assigned_to, team=excluded.team, decision_ref=excluded.decision_ref, updated_at=excluded.updated_at, deleted_at=excluded.deleted_at, hash=excluded.hash, canonical_version=excluded.canonical_version WHERE excluded.updated_at > tickets.updated_at OR (excluded.updated_at = tickets.updated_at AND excluded.hash > tickets.hash);
INSERTINTOtickets(record_id,type,parent_record_id,title,description,status,priority,assigned_to,team,decision_ref,created_at,updated_at,deleted_at,hash,canonical_version)VALUES('06FBKP67X1Y1FEE9T5R0E5DA9C','story',NULL,'vim cross-pane interaction layer — window commands, tab motions, pane-local normal-mode nav','From the 2026-06-12 vim keybind review (user: "we are leaving opportunities on the table" for cross-pane vim interactions). Findings:
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.