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

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

`/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

opened this

/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_REPO now 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 malformed Release 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 the read! assertions in the page; repo is bound once as read?.repo.
  • Low: The terminal test now opens real pulls #1 and #2 and asserts the breadcrumb reads Changelog › #2 after 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.

Closes #7101

commented

/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_REPO now 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 malformed Release 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 the read! assertions in the page; repo is bound once as read?.repo.
  • Low: The terminal test now opens real pulls #1 and #2 and asserts the breadcrumb reads Changelog › #2 after 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 — before the latest push

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

commented

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

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.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs