Public: anyone can read this; the crew can change it.
The /releases page speaks the home page's language #9758
Check · Review · Land · Live done — Landed and live in production.
`/releases` now lists releases as rows instead of a table inside a card. I didn't have `keep_plan` available, so the plan isn't on the issue. `tsc --noEmit`, `design-lint`, `test/releases-page.test.ts` and `test/releases-timing.test.ts` all pass, and the branch is pushed. I didn't run the whole suite or look at the page at 390 px.
shipped production is serving it deploy f21b126
/releases now lists releases as rows instead of a table inside a card. I didn't have keep_plan available, so the plan isn't on the issue. tsc --noEmit, design-lint, test/releases-page.test.ts and test/releases-timing.test.ts all pass, and the branch is pushed. I didn't run the whole suite or look at the page at 390 px.
What changed
- Rows:
src/web/pages/releases.tsrenders onelist setting-listofrow()s, the same shared list as/changelog. Each row's title is the short sha with itsliveandpreflight failedbadges. The meta line reads#7 · landed <time> · healthy since <time>, and the "healthy since" part appears only on the live release. - One link: a release that has a pull links its whole row to that pull. A release with no pull, or whose repository was deleted, shows
#nas plain text, or nothing when there is no pull. - No JavaScript needed: Roll back stays a plain
POSTform. It sits in the row'safterslot, outside the link, so it still works with JavaScript off. - Empty state: it is one muted line, not a card.
- Phone fit: the list uses the existing
setting-listrule, so the phone wrapping that #9350 relies on is untouched. I didn't read #9350's pull, so I haven't checked how it will merge with this file. - Docs:
docs/design/areas/changelog.mdhas a "Releases as rows" section. There is no new class. - Release keeper panel: the panel above the list is still a card. It is shared with other pages and wasn't in scope.
Tests
- New test:
test/releases-page.test.tsasserts the list has no table and no card, that the pull row is a single<a class="row">, and that Roll back stays a form. I did not run it against the old markup. The card assertion first failed because it scanned the keeper panel's card, so I narrowed it to the list. That hit is the only evidence the test can fail. - Edited test: two assertions in
test/releases-timing.test.tsmatched the old<td>markup. I changed them to match the new rows. The behaviour they check is unchanged: one repository read, a linked pull, and an unlinked#777for the deleted repository.
I made no changes in response to this, and nothing new is pushed.
The deploy log shows the preview didn't fail. It reads ready, serving and done at https://lab--9758--forge-trevato-apps.open-platform.sh. The "no tests declared, none run" line doesn't point at my change. The preview deploy runs bun run src/main.ts with no test step, and forge.json declares no app.test. Tests run as check.fast, check.run and check.verify instead. I didn't edit forge.json.
Before I pushed, tsc --noEmit, design-lint, test/releases-page.test.ts and test/releases-timing.test.ts passed. I didn't run scripts/gate.ts or scripts/fast.ts, so the forge's check on the push is the first run of those.
If the forge needs a test declared for previews, say so and I'll add it. I'd rather not guess at the config.
The releases page now renders as rows in the home page's style instead of a table in a card. Only the commit message changed in this push.
The check failed because the gate wants a Try: line in a commit message when a pull touches src/web/pages/releases.ts. No commit had one. I added an empty commit with that line, since I can't force-push to rewrite the earlier commit. bun scripts/gate.ts printed no errors here after the commit. I didn't re-run tsc or the tests, because no code changed.
Try: open /releases on the preview at https://lab--9758--forge-trevato-apps.open-platform.sh and check that the rows match the home page's list style.
🤖 Generated with Claude Code
Rows, no table or card, Roll back as a plain form outside the link, no new class, docs in changelog.md, no README change: all good. One gap: behaviour this change adds or moves has no test that would fail without it (empty state, healthy-since on the live row). Fix first: add those tests (below). Box 5 not fully confirmed by me: I did not run the suites.
This pull's /releases page now has the two missing tests, and its empty state again opens with "No releases yet", as the TUI screen and docs do.
- Empty state: The line now reads "No releases yet. A pull landed on the forge's own repository is recorded here." The new test renders
/releaseson a forge with no releases. It asserts that muted line, with no list and no card after the keeper panel. - Meta line: A new test asserts that "healthy since" appears on the live row only. It also asserts that a release with a pull shows "#7 · " and links to the pull, and that one without a pull has neither.
- Test fix: My first empty-state assertion failed because the apostrophe is HTML-escaped to
'and the keeper panel is itself a card. The test now compares the unescaped line and looks only past the keeper panel. The page was right.
bun x tsc --noEmit and bun scripts/design-lint.ts are clean. test/releases-page.test.ts passes (11 tests). I did not run the full suite; the forge's check does that on push.
To try it, open /releases on the preview. As an admin with no releases you see the one muted line.
🤖 Generated with Claude Code
Rows in one list setting-list, no table or card, the sha row is the one link to its pull, Roll back is a plain POST form in the after slot outside the link (works with JS off), empty state is one muted line, no new class, docs in changelog.md, no README change, TUI screen already exists. Tests cover the row shape, the healthy-since meta and the empty state. Caveats: I could not open the forge screenshots from my sandbox and the preview answered 303 to my token, so the phone fit is judged from source: it reuses setting-list, which #9350 relies on. Next two things: 1) check the 390px look once the preview is signed in, especially the Roll back button beside a long meta line; 2) the keeper panel above the list is still a card, so make it rows in a follow-up.
/releasesnow lists releases as rows instead of a table inside a card. I didn't havekeep_planavailable, so the plan isn't on the issue.tsc --noEmit,design-lint,test/releases-page.test.tsandtest/releases-timing.test.tsall pass, and the branch is pushed. I didn't run the whole suite or look at the page at 390 px.What changed
src/web/pages/releases.tsrenders onelist setting-listofrow()s, the same shared list as/changelog. Each row's title is the short sha with itsliveandpreflight failedbadges. The meta line reads#7 · landed <time> · healthy since <time>, and the "healthy since" part appears only on the live release.#nas plain text, or nothing when there is no pull.POSTform. It sits in the row'safterslot, outside the link, so it still works with JavaScript off.setting-listrule, so the phone wrapping that #9350 relies on is untouched. I didn't read #9350's pull, so I haven't checked how it will merge with this file.docs/design/areas/changelog.mdhas a "Releases as rows" section. There is no new class.Tests
test/releases-page.test.tsasserts the list has no table and no card, that the pull row is a single<a class="row">, and that Roll back stays a form. I did not run it against the old markup. The card assertion first failed because it scanned the keeper panel's card, so I narrowed it to the list. That hit is the only evidence the test can fail.test/releases-timing.test.tsmatched the old<td>markup. I changed them to match the new rows. The behaviour they check is unchanged: one repository read, a linked pull, and an unlinked#777for the deleted repository.Closes #9753