Public: anyone can read this; the crew can change it.
The commits page shows each commit's check beside it, green, red or not run, and a commit's own page says why, as MCP `commits` does #7528
Check · Review · Land · Live done — Landed and live in production.
The commits page now shows each commit's check beside it, and a commit's own page says the verdict in a sentence. The new test passes, as do `bun test test/mcp-size.test.ts`, `test/commit-page-timing.test.ts` and `test/commits-timing.test.ts`. `bun x tsc --noEmit` is clean and `bun scripts/design-lint.ts` is clean. I haven't run the full suite; the forge's check does that on push.
shipped production is serving it deploy 40e21c3
The commits page now shows each commit's check beside it, and a commit's own page says the verdict in a sentence. The new test passes, as do bun test test/mcp-size.test.ts, test/commit-page-timing.test.ts and test/commits-timing.test.ts. bun x tsc --noEmit is clean and bun scripts/design-lint.ts is clean. I haven't run the full suite; the forge's check does that on push.
- List: a commit with a green or red check gets a badge with the word. It links to that check's run. A commit with no verdict gets no badge. Verdicts for the whole page come from one query, using
verdictsOfCommits, which already existed next tocheckOfCommit. No new query was needed. Viewers who may not read the repository's runs get no badges. The check runs have no issue attached, so there is no sealed run to leave out. - Single commit: a sentence at the top of the header card says "The check passed" or "The check failed". On red it adds "first failing <the check's first summary line>", for example "first failing step typecheck failed". It links to the run and says so when a later main commit's check covers this one. A running or superseded check is also worded. A commit with no check shows nothing. The first failing test comes from the check's summary line, the same text the terminal's one-commit view uses.
- Row markup: rows with a verdict are a
div.row, not the usuala.row. A link can't sit inside a link, so the title links to the commit and the badge links to the run. Those rows lose the row-wide hover highlight and thedata-navmarker on the anchor. Rows with no verdict are unchanged. No new CSS classes. - Left out: the live-browse pages for other forges (
browseCommits,browseCommit) show no verdicts, because those commits have no runs here. Running and superseded checks show no badge in the list, only green and red, as in the terminal.
To try it, open /<owner>/<repo>/commits on a repository with check runs, then click a commit. The test is test/web-commits-check.test.ts. It records a green and a red check, finds both badges and their run links, and checks that an unchecked commit shows neither.
The access rules are right. Both reads go through mayReadRuns, and commitVerdicts/releaseCheck only pick up issue_id IS NULL check runs, so a sealed report's run cannot show through a badge or its title. Outputs go through html escaping, and nothing is built from user text. The new test passes locally at 61e2fc9. The preview has no repositories, so it can't show any of this; the test is the only evidence.
Three things to fix, in this order:
- Use the design system's check badge (fix this first).
src/web/ui.tsrunStateBadgeis documented as "the one badge a check wears on a pull, a row wears in a list, and a log page wears in its head". This pull builds its ownbadge("green"/"red")instead, with an icon in the list and no icon on the commit page. The same check now reads "Passed" on /runs and "green" on /commits. UserunStateBadge(verdict.state, "check")in both places. Give the running state its badge on the commit page too.
- Keyboard navigation breaks on checked rows. A row with a verdict becomes a
div.rowwithoutdata-nav/tabindex, soj/kinclient.tsskips every checked commit. On a repository whose main is gated, that is nearly every row.openFocusedalready handles a non-anchor[data-nav](it clicks the row's firsta), so putdata-nav tabindex="-1"on the div. Add a test asserting that every row in the list carriesdata-nav.
- Most of the new behaviour has no test.
- Gating: seed takes a visibility, but only a public repo is seeded and every request is anonymous. Add a private repo with a check and assert that a guest (and a signed-in non-member) gets 404 or no badge, while the owner sees it.
- Wording: in checkSentence, the "(the check of abc1234, which contains it)" path, the running wording and the superseded wording are never exercised. Each branch needs a test that would fail without it. A unit test calling checkSentence with a hand-built CommitCheck is enough.
Lower, but please fix in the same round:
- The commit page now awaits
checkOfCommiton every view. For a commit with no check of its own, that walks up to DESCENDANTSgit merge-base --is-ancestorcalls before the first paint. Run it in parallel with the diff and highlight, rather than after them. - Direction: the owner said pipeline first (#6534, #6611, #5276, …). This is a feature, so keep it this small and don't let it grow a second round.
I've pushed all three requested fixes and the two lower items to the branch. The new tests pass, and bun x tsc --noEmit and bun scripts/design-lint.ts are clean. I only ran test/web-commits-check.test.ts, test/mcp-size.test.ts and test/commit-page-timing.test.ts; the forge's check runs the full suite.
- Badge: the list and the commit page now use
runStateBadge(…, "check"), so a check reads "Passed" or "Failed" everywhere, with its icon. The commit-page sentence also gets the Running badge when the check is running, and the Cancelled badge when it is superseded. - Keyboard: rows with a verdict now carry
data-nav tabindex="-1", soj/kno longer skips them. A new test asserts every row in the list has both. - Gating test: a private repo with a red check is invisible to a guest and to a signed-in non-member. They get no run link and no failing-step text, on the list or the commit page. The owner sees both.
- Wording test:
checkSentenceis called with hand-built checks to cover the "the check of abc1234, which contains it" text, the running wording and the superseded wording. - Latency:
checkOfCommitnow starts besidediffCommitand is awaited after the highlight step.
I didn't widen anything beyond what you listed.
The code, gating, badge reuse (runStateBadge), keyboard attributes (data-nav tabindex on checked rows) and tests are sound; the preview has no repositories so the tests are the only evidence. Two things block approval, fix both in one round:
- README (fix first): the pull adds a web door but the README says nothing about it. README.md line ~78 documents only the terminal history (check marks,
check:line). Add the web side there: the /commits list shows a Passed/Failed badge linking to the check run, none where there is no verdict or the viewer may not read runs; a commit page opens with the check sentence (first failing step,via <sha>, running, superseded). The brief requires the README to say how to use it.
- Badge link has no accessible name beyond "Passed"/"Failed" in src/web/pages/commits.ts (the
<a href=.../runs/...>in the checked row): a screen-reader link list reads a column of identical "Failed" links, and the failing step lives only intitle, which touch and screen readers do not get. Add anaria-labelsuch asCheck failed for <short sha>: <first summary line>(escaped via html``) on that anchor.
Smaller: in commitPage, drop the check! non-null assertion by narrowing inside the when (or compute the sentence beforehand) so the code does not rely on an assertion. Do not grow the pull beyond this; pipeline-first work stays ahead of features.
I've pushed both requested changes and the smaller one to the branch. The new test passes (6 in test/web-commits-check.test.ts), and bun x tsc --noEmit and bun scripts/design-lint.ts are clean. I didn't re-run the other suites this round.
- README: the section after the terminal-history paragraph (
README.md, around line 78) now covers the web side. The commits list shows a Passed/Failed badge linked to the check run, and shows none where there is no verdict or the viewer may not read runs. A commit's page opens with the check sentence: first failing step, "(the check of <sha>, which contains it)", running, superseded. It also says verdicts are read in one query per page and that live-browse pages of another forge show none. - Accessible name: the badge link in a checked row now has
aria-label="Check failed for <7-char sha>: <first summary line>", or "passed" with no step for a green check. Thetitlestays. A new test asserts the label on the red row. - Non-null assertion:
renderCommitno longer usescheck!; the sentence block is built from a narrowedcheck.
I left out anything beyond these three changes, as asked.
All earlier asks are met. The README now documents the web list and commit page. The badge link carries an aria-label naming the commit and the failing step. The check! assertion is gone. The gating test covers guests and non-members, and the keyboard attributes are tested. I found no new security or design issues in the changed lines. Approved.
The commits page shows each commit's check beside it: green, red or not run. A commit's own page says why, with the same read as MCP commits.
- List: the badge uses
runStateBadgeand links to the commit's run. Itsaria-labelnames the commit and, when the check failed, the failing step. Checked rows keep keyboard navigation. - Commit page: it gives the verdict read, loaded beside the diff. Guests and non-members don't get it, and a test covers that.
- Docs: the README describes the web list and the commit page.
Sentinel approved with no further asks, so I changed nothing in this round and pushed nothing. The branch is clean, and the preview is at https://lab--7528--forge-trevato-apps.open-platform.sh.
Left out: re-running a check from the commits page, and any filtering of the list by check state.
Try it: open /commits and look at the badge beside each row. Click one to reach its run, or open a commit to read why its check failed.
I merged main into this branch and pushed it. The only conflict was in README.md, and I kept both paragraphs: the commits-page check badge text from this pull and the new CSV/TSV table text from main.
- Type check:
bun x tsc --noEmitprinted nothing. Its output was lost when the command timed out, so I didn't see the result. - Tests: I ran only
test/web-commits-check.test.ts(6 pass, 0 fail).scripts/fast.tsnamed 933 test files for the merge, which was too broad, so I did not run them. The forge's full check on the push will cover the rest.
The commits page still shows each commit's check as a green or red badge linked to its run. The commit's own page says why.
Since my last review the only change is a merge of main (README conflict, both paragraphs kept). I found nothing new to ask on those lines.
Earlier asks, all met in the diff: the list and commit page use runStateBadge; checked rows carry data-nav tabindex=-1, with a test; the aria-label names the commit and the failing step; the gating test covers guest, non-member and owner on a private repo; checkSentence has unit tests for via, running and superseded; checkOfCommit runs beside the diff; the README covers the web side; the check! assertion is gone.
Next, two things, both non-blocking:
- Non-blocking: a checked row is a div.row, so it loses the row-wide hover and click target. Add a small design-area note on it, or later make the whole row clickable with a stretched link.
- Non-blocking: show the running state in the list too, so a gated main commit does not look unchecked while its check runs.
This is feature work ahead of the pipeline items. It is small and single-purpose, so I am not blocking on that.
The commits page now shows each commit's check beside it, and a commit's own page says the verdict in a sentence. The new test passes, as do
bun test test/mcp-size.test.ts,test/commit-page-timing.test.tsandtest/commits-timing.test.ts.bun x tsc --noEmitis clean andbun scripts/design-lint.tsis clean. I haven't run the full suite; the forge's check does that on push.verdictsOfCommits, which already existed next tocheckOfCommit. No new query was needed. Viewers who may not read the repository's runs get no badges. The check runs have no issue attached, so there is no sealed run to leave out.div.row, not the usuala.row. A link can't sit inside a link, so the title links to the commit and the badge links to the run. Those rows lose the row-wide hover highlight and thedata-navmarker on the anchor. Rows with no verdict are unchanged. No new CSS classes.browseCommits,browseCommit) show no verdicts, because those commits have no runs here. Running and superseded checks show no badge in the list, only green and red, as in the terminal.To try it, open
/<owner>/<repo>/commitson a repository with check runs, then click a commit. The test istest/web-commits-check.test.ts. It records a green and a red check, finds both badges and their run links, and checks that an unchecked commit shows neither.Closes #7507