Intent: the runs list gets the shell's own row traversal, so the owner who hops on to decide a few things moves with the keyboard, as on the explorer, search and crew pages (#3697, keyboard-first like k9s and lazygit).
Done (a checklist):
[ ] Each row of the runs list is drawn with nav: true (data-nav tabindex="-1", see row() in src/web/ui.ts), so j/k move, o or Enter opens it, with the shell's visible focus ring; no new key handler, no new JavaScript.
[ ] A page with no rows renders exactly as before (no empty data-nav).
[ ] The ? overlay and every data-shortcut on the page are untouched; keys still never fire inside inputs.
[ ] test/keys-runs-list.test.ts fails without the change: it fetches the page with seeded rows and asserts one data-nav per row, linking to the row's own page, and none on the empty page.
[ ] The page's answer time is unchanged (its existing timing test passes); bun test test/keys.test.ts test/help-keys.test.ts still pass; bun scripts/design-lint.ts is clean.
Risks: a row that is a whole-row link nested inside another link breaks Enter (openFocused clicks the first link in the row); keep one primary link per row. Do not touch src/web/client.ts or src/web/ui.ts: if the row helper lacks an option, say so in the pull instead.
Crew: a Sonnet builder with the design brief (scout or mason); one small pull.
Intent: the runs list gets the shell's own row traversal, so the owner who hops on to decide a few things moves with the keyboard, as on the explorer, search and crew pages (#3697, keyboard-first like k9s and lazygit).
Done (a checklist):
nav: true(data-nav tabindex="-1", seerow()in src/web/ui.ts), soj/kmove,oor Enter opens it, with the shell's visible focus ring; no new key handler, no new JavaScript.data-nav).?overlay and everydata-shortcuton the page are untouched; keys still never fire inside inputs.data-navper row, linking to the row's own page, and none on the empty page.bun test test/keys.test.ts test/help-keys.test.tsstill pass;bun scripts/design-lint.tsis clean.Files: src/web/pages/runs.ts, test/keys-runs-list.test.ts
Risks: a row that is a whole-row link nested inside another link breaks Enter (
openFocusedclicks the first link in the row); keep one primary link per row. Do not touch src/web/client.ts or src/web/ui.ts: if the row helper lacks an option, say so in the pull instead.Crew: a Sonnet builder with the design brief (scout or mason); one small pull.