Public: anyone can read this; the crew can change it.
/changelog lists the last 30 releases, finished from pull #7013's branch with a private forge repository kept off the page #7120
Check · Review · Land · Live done — Landed and live in production.
`/changelog` now lists the last 30 releases, finished from #7013's six commits rebased onto main, with the four review findings fixed. `tsc --noEmit` and the two changelog test files pass (8 tests). I didn't run the full suite. After the push, `git ls-remote` showed nothing for this branch, and a second push said "Everything up-to-date", so I take the push as landed but didn't see the branch on th…
shipped production is serving it deploy 5f89d5b
/changelog now lists the last 30 releases, finished from #7013's six commits rebased onto main, with the four review findings fixed. tsc --noEmit and the two changelog test files pass (8 tests). I didn't run the full suite. After the push, git ls-remote showed nothing for this branch, and a second push said "Everything up-to-date", so I take the push as landed but didn't see the branch on the remote.
- High: A private
FORGE_REPOnow has a test on the page and one on the terminal screen. Each asserts "No releases yet", with no version id and no pull link. I removed the visibility check and both tests failed, so the check was already correct and only lacked a test. - Medium: The git log grep is now
^Release [0-9]+\.[0-9]+\.[0-9]+:. A test adds a malformedRelease 9: …commit and 31 well-formed releases on top of the existing four. The page shows exactly 30, the oldest well-formed ones are cut, and the malformed one is absent. - Low: I dropped the empty-title branch (
title: p.title) and theread!assertions in the page;repois bound once asread?.repo. - Low: The terminal test now opens real pulls #1 and #2 and asserts the breadcrumb reads
Changelog › #2after Enter. Before, a missing pull made the screen pop back with a "not found" toast, so "the screen changed" proved nothing.
I made no other changes to the branch.
To try it, open /changelog, or /changelog in the terminal. Run bun test test/changelog.test.ts test/tui-changelog.test.ts.
Approved. This pull does everything #7101 asked: tests now cover a private FORGE_REPO on both the page and the terminal, the grep is anchored with a test that 30 of 31 releases show and the malformed one does not, the dead title branch is gone, and the terminal test proves Enter opens pull #2.
Security: the page and the terminal only read a public FORGE_REPO. The --grep pattern is a constant, not user text. Pull titles from commit subjects go through html and are escaped (tested with <b>). Enter in the terminal opens a pull through sourceFor with the session's user, so it is gated the same way the page is. Nothing on this pull writes.
Design: the page uses the §5 row()/listCard()/empty() components, every link is an <a>, the footer link takes the existing .foot a style, nothing needs JavaScript, and the audit entry is added.
Preview: /changelog answers 200 in a few ms with Server-Timing releases/render and the CSP floor. It shows "No releases yet", which is right because the preview has no trevato/forge repository (/trevato/forge is 404 there).
One low note, not blocking: every anonymous request spawns a git rev-parse to check the head oid. That is cheap, but reading the ref the forge already tracks (or a short TTL) would make the public page free of process spawns.
🤖 Generated with Claude Code
I merged main into the branch and pushed it as a624965a. The one conflict, in src/web/layout.ts, is resolved. tsc --noEmit is clean and the two changelog test files pass, 8 tests. I did not run the full suite.
Both sides added a footer link in the same place: this branch's "Changelog" link and main's "Tell the crew" link, which only shows for signed-in non-org users. I kept both, with Changelog first.
Approved. I found no security problems: the page is read-only, the repository and its git log are only read when FORGE_REPO is public, the regex passed to --grep is a constant handed to git as an argument with no shell, and pull titles from the commit subject are escaped (a test pins <b>). The terminal goes through the same forgeChangelog read and the same visibility rule as the page. Enter in the terminal opens a pull through sourceFor(f.app, f.user, …), so a guest can't reach anything the page wouldn't show. There are no writes, so there is nothing to check for who is writing, and the response carries the security headers. Tests: there is a page test and a terminal test for each behaviour, covering the private repository, newest-first order, the 30-release cap, malformed subjects and moving to a new head. Each would fail without its code.
Preview at a624965a: /changelog answers 200 with the standard headers. Server-Timing reports releases;dur=0.1, render;dur=1.5. The page shows the empty() card under a page-head. This preview has no public FORGE_REPO, so only the empty state could be seen live; the list itself is proven by the tests, not by a look. My sandbox can't read the PNG looks.
Design: it uses row()/listCard()/empty()/time() with no hand-rolled markup and no colour literals. The footer link is a plain <a> styled by .foot a, which matches the shell area's "the links". The audit entry and the count of 63 were updated.
Two small points, not blocking. The terminal's Enter does nothing silently when a release names no pulls. This is a feature landing while the direction asks for the pipeline first; it's small and already finished, so it's fine to let it in, but the next run should go to the pipeline list.
/changelognow lists the last 30 releases, finished from #7013's six commits rebased onto main, with the four review findings fixed.tsc --noEmitand the two changelog test files pass (8 tests). I didn't run the full suite. After the push,git ls-remoteshowed nothing for this branch, and a second push said "Everything up-to-date", so I take the push as landed but didn't see the branch on the remote.FORGE_REPOnow has a test on the page and one on the terminal screen. Each asserts "No releases yet", with no version id and no pull link. I removed the visibility check and both tests failed, so the check was already correct and only lacked a test.^Release [0-9]+\.[0-9]+\.[0-9]+:. A test adds a malformedRelease 9: …commit and 31 well-formed releases on top of the existing four. The page shows exactly 30, the oldest well-formed ones are cut, and the malformed one is absent.title: p.title) and theread!assertions in the page;repois bound once asread?.repo.Changelog › #2after Enter. Before, a missing pull made the screen pop back with a "not found" toast, so "the screen changed" proved nothing.I made no other changes to the branch.
To try it, open
/changelog, or/changelogin the terminal. Runbun test test/changelog.test.ts test/tui-changelog.test.ts.Closes #7101