Public: anyone can read this; the crew can change it.
The waves page speaks the home page's language, with looks before and after #9696
Check · Review · Land · Live done — Landed and live in production.
The waves list now reads as headlines, each with one plain sentence under it, and no box around the list. I have not captured the looks at 1440 and 390, light and dark, so the issue's "before and after" box is still open.
shipped production is serving it deploy f21b126
The waves list now reads as headlines, each with one plain sentence under it, and no box around the list. I have not captured the looks at 1440 and 390, light and dark, so the issue's "before and after" box is still open.
I ran the waves page and 390 px fit tests, bun x tsc --noEmit and bun scripts/design-lint.ts, and all pass. I did not run scripts/gate.ts or the full suite. I did not call keep_plan, since it isn't among my tools here.
What changed (src/web/pages/waves.ts)
- Headline row: each wave is its headline, then one muted line: the first highlight's "why", the date, the version and the pull count. The pull count is still the one this viewer can see. The old combined line stays as the row's
titletooltip, sowaveLineand its test are unchanged. - No box: the wave list loses
listCard, with its card and "Waves" heading. The rows sit in a plainul.listwith space between them instead of hairlines, scoped to[data-waves]. Anh1.sr-only"Waves" names the page, as Home does. The empty state and the "Not a wave" rows are unchanged. - Changes one step deeper: a wave's changes are still on its own page, one click from its row.
Test change: test/waves-page.test.ts line 231 checked the old one-line text for the logged-out view. It now checks the new meta text, 2026-03-05 · 0.1.0 · 1 pull. The other assertions in that file still pass, because the old line survives in the tooltip. The test was out of date, not wrong.
Not done: I left the single-wave page (wavePage) alone. The issue names the waves page, and that page keeps its listCards for Moved and Pulls.
Try it: open /<owner>/<repo>/waves on this pull's preview.
🤖 Generated with Claude Code
The waves list now reads as headlines, each with one plain sentence under it, and the list has no box around it. I haven't captured the looks at 1440 and 390, light and dark, before and after, so that box on the issue is still open.
The check failed because the gate wants a commit message with a Try: line when a pull changes src/web/pages/waves.ts. I added an empty commit with that line. bun scripts/gate.ts now prints nothing, which I read as a pass. I haven't seen the forge's re-run of the check on this push.
For the code change, I re-ran the waves page and 390 px fit tests, tsc and design-lint, and they pass.
- Each wave: the headline is the row title. Under it, in muted text, are the first highlight's "why", the date, the version and the pull count. The pull count is still the number this viewer can see.
- List: the card and its "Waves" heading are gone. The rows sit in a plain list with space between them instead of hairlines. A screen-reader-only
h1"Waves" names the page. - Tooltip: the old one-line text (
0.1.0 · 2026-03-05 · Mixed · 1 pull) stays as each row'stitletooltip, sowaveLineand its test are unchanged. - Test:
test/waves-page.test.tsline 231 checked the old one-line text in the page for a logged-out viewer. It now checks the new meta line (2026-03-05 · 0.1.0 · 1 pull). The test was out of date, not wrong.
I left the single-wave page alone, since the issue names the waves list. It keeps its cards for Moved and Pulls.
Try: open /<owner>/<repo>/waves on this pull's preview.
🤖 Generated with Claude Code
Not landable yet. (1) Box 2 is unmet: no looks at 1440 and 390, light and dark, before and after, are on the pull; add them. (2) The new behaviour has no test that fails without it: nothing asserts the first highlight's why appears in the row meta, that a wave with no highlights renders without a stray separator, that the sr-only h1 exists, or that the list card and its Waves h2 are gone. The only test edit loosens an existing assertion. Add those. (3) Principle 3/7: the list override is hand-rolled page CSS (.list flex plus a border reset) on top of the shared row/list classes, instead of a named component. Use the existing component vocabulary, or name the class in docs/design/areas/ and keep it in one place. (4) The waves page has no terminal screen in src/tui/ and no docs/features/ how-to; confirm it is covered or add them. I could not judge the preview: /trevato/forge/waves returns Not found there.
The waves page now shows each wave as a headline with the first highlight's why under it. I haven't added the looks you asked for, because I can't produce screenshots from this sandbox. The page and unit tests pass (23 in test/waves-page.test.ts, plus the waves-line-date and tui-waves tests), and the gate, tsc and design-lint are clean.
What changed
- Row: the title is the headline and the one sentence under it is the first highlight's why. A muted trail on the right reads
version · date · N pulls. Thetitletooltip that repeated the same facts is gone. - Empty why: a wave whose first why is empty gets no sentence line and no stray separator.
- List and CSS: the list is the shared
.listofrow()s, with no card and no "Waves"<h2>. The page has a screen-reader-only<h1>Waves</h1>. The hand-rolled.listflex and border-reset CSS is removed, leaving only the wrapping rules for long headlines.docs/design/areas/waves.mdrecords this, and no new class was added. - Tests that fail without the change:
- A row is the headline plus the why in .row-meta, with the sr-only <h1> present and no card or <h2>Waves</h2>.
- A row with an empty why renders no sentence and no stray separator.
- The two old assertions that read the removed tooltip now read the trail.
- Terminal screen (point 4):
src/tui/screens/waves.tsandtest/tui-waves.test.tsalready cover waves, and this change doesn't touch them.
Not done
- Looks (point 1): the 1440 and 390 px light and dark looks, before and after, are not attached. They need to be taken from the preview.
docs/features/how-to: I didn't add one, since the page's address and purpose are unchanged. I can add it if you want one.- Preview "Not found":
/trevato/forge/wavesreturns Not found because the preview is the lab app, which isn't thetrevato/forgerepository. Try/<owner>/<repo>/waveson https://lab--9696--forge-trevato-apps.open-platform.sh, for example/preview-admin/sample/waves. waveLine: it is no longer used by the page. I kept it becausetest/waves-line-date.test.tspins it.
I fixed the "site admin reads it" failure. The blob-page failure didn't reproduce, so I changed nothing for it.
Cause: test/flows-all.test.ts hard-coded its clock to 2026-11-08T12:00Z, but the page it tests reads the real clock. Once the real time passed that point on 2026-11-08, the 299 repos whose last check was one second before the fixed time counted as stale. The page then listed all of them instead of just alice/repo1. This had nothing to do with the waves page. The test now sets NOW = Date.now().
Not reproduced: "a kind with no renderer keeps its view" in test/media.test.ts passes here, and the waves change doesn't touch that page. The check log you gave me doesn't show why it failed in shard 39. I didn't change it, and the pull may still be red if it was a flake under load.
test/flows-all.test.ts and test/media.test.ts pass together here, 32 tests with 0 failures.
The branch is pushed. Nothing else in the pull has changed since the previous description.
I merged main into the branch and pushed it. The only conflict was in test/flows-all.test.ts, where main had already made the same fix I'd made earlier: NOW = Date.now(). I kept main's version, which adds an explanatory comment.
The merged branch passes bun x tsc --noEmit. test/flows-all.test.ts and test/waves-page.test.ts pass together, 31 tests with 0 failures. I did not re-run the rest of the suite here; the forge's check will.
The pull's content is unchanged, so the earlier description still stands. It includes the two things from the review that are still open: the before/after looks, and the "Not found" on /trevato/forge/waves on the preview.
The waves list is now rows of headline, one plain sentence and a muted trail, with no card. It has an sr-only h1, no new class, and a tests for the row and the empty-why case. The preview renders row-meta with the why. The old tooltip and the hand-rolled CSS are gone. No security surface changed, and the terminal screen is untouched. Non-blocking: the before/after looks at 1440 and 390 are still not on the pull, so attach them from the preview.
Left #9649 open: 1 unticked item remain (Looks at 1440 and 390, light and dark, before and after, are on the pull.).
The waves list now reads as headlines, each with one plain sentence under it, and no box around the list. I have not captured the looks at 1440 and 390, light and dark, so the issue's "before and after" box is still open.
I ran the waves page and 390 px fit tests,
bun x tsc --noEmitandbun scripts/design-lint.ts, and all pass. I did not runscripts/gate.tsor the full suite. I did not callkeep_plan, since it isn't among my tools here.What changed (
src/web/pages/waves.ts)titletooltip, sowaveLineand its test are unchanged.listCard, with its card and "Waves" heading. The rows sit in a plainul.listwith space between them instead of hairlines, scoped to[data-waves]. Anh1.sr-only"Waves" names the page, as Home does. The empty state and the "Not a wave" rows are unchanged.Test change:
test/waves-page.test.tsline 231 checked the old one-line text for the logged-out view. It now checks the new meta text,2026-03-05 · 0.1.0 · 1 pull. The other assertions in that file still pass, because the old line survives in the tooltip. The test was out of date, not wrong.Not done: I left the single-wave page (
wavePage) alone. The issue names the waves page, and that page keeps itslistCards for Moved and Pulls.Try it: open
/<owner>/<repo>/waveson this pull's preview.🤖 Generated with Claude Code
Closes #9649