Public: anyone can read this; the crew can change it.
The reports list is keyboard-first: j/k move between rows, enter opens one #10366
Check · Review · Land · Live done — Landed and live in production.
Each report row on `/reports` now carries `data-nav tabindex="-1"`, so `j`/`k` move between rows, and the empty page has none. The new `test/keys-reports-list.test.ts`, `test/keys.test.ts`, `test/help-keys.test.ts` and the reports timing test passed, with 10 skipped because `ssh-keygen` isn't installed here. `bun scripts/design-lint.ts` is clean and `bun x tsc --noEmit` printed no errors. I didn't…
shipped production is serving it deploy abf00b0
The reports list now moves between rows with j/k, and I've pushed again to get a fresh preview. I haven't confirmed the preview deploys.
I found nothing in the code to fix. The deploy log you sent ends with the forge draining on SIGTERM and "no tests declared, none run", with no error from this change. The change itself is small: nav: true on each report row in src/web/pages/reports.ts.
What I checked locally before pushing:
bun scripts/gate.tspassed.bun x tsc --noEmitwas clean.test/keys-reports-list.test.tspassed, both tests.
Between those checks and the push I merged main into the branch (no rebase, since force-pushing is refused). I ran tsc and that test file again after the merge and they were still clean, but I didn't re-run the gate.
If the preview fails again, the cause is in the deploy. Look at why it reports "no tests declared": forge.json has no app-level test command, and I didn't change it.
Pull description
The reports list (/<owner>/<repo>/reports) is keyboard-first. Each report row is a data-nav summary, so the shell's j/k traversal moves between rows and enter opens one. The empty list draws no data-nav. The change is one line in src/web/pages/reports.ts, plus test/keys-reports-list.test.ts, which checks that three reports give three nav rows and an empty list gives none.
I added no new JavaScript and no dependencies. To try it, open a repository's /reports page and press j and k.
🤖 Generated with Claude Code
The failing check came from main, not from the reports change, and merging main into the branch fixes it. I've pushed the merge as 52274eedb.
My branch changes only src/web/pages/reports.ts and adds test/keys-reports-list.test.ts. The repository page, which the budget test measures, was over its first-view budget (197 words and 29 blocks, against 189 and 28) because the branch was behind main. main has since updated the budget in docs/design/attention-budget.json. After the merge the page measures 197 words and 29 blocks, against budgets of 197 and 29.
I re-ran only test/attention.test.ts and test/keys-reports-list.test.ts, and both pass. bun x tsc --noEmit is clean. I did not run the full suite, scripts/gate.ts or scripts/design-lint.ts; the forge's check will cover the rest on this push.
What the pull does: the reports list takes j and k to move between rows.
What I left out: nothing new in this fix.
To try it: open a repository's /reports page and press j and k.
Clean one-line change using the existing nav option; each report row is a fold summary with data-nav, empty list has none. Test fails without the change and no new markup, JS or dependency. Enter on a focused summary toggles the fold (reports have no page of their own), so the test rightly checks summaries rather than links.
Each report row on
/reportsnow carriesdata-nav tabindex="-1", soj/kmove between rows, and the empty page has none. The newtest/keys-reports-list.test.ts,test/keys.test.ts,test/help-keys.test.tsand the reports timing test passed, with 10 skipped becausessh-keygenisn't installed here.bun scripts/design-lint.tsis clean andbun x tsc --noEmitprinted no errors. I didn't run the new test against the old code to see it fail, though without the change the page has nodata-navand the assertion for three would fail.The change is one line in
src/web/pages/reports.ts, passingnav: trueto the row.<details>with a<summary>). Enter on the focused row opens or closes that report's fold natively, rather than following a link. The forms inside stay reachable by tab. The test therefore asserts onedata-navsummary per row, and no nesteddata-nav, instead of a link to each row's page.To try it, sign in, open
/<owner>/<repo>/reportson a repo with waiting reports, and pressj/k, then Enter.🤖 Generated with Claude Code
Closes #10355