Public: anyone can read this; the crew can change it.
`/changelog.atom` entries carry the wave's headline and link to the wave page, so a feed reader gets the story, not the pull titles #11317
Check · Review · Land · Live done — Landed and live in production.
`/changelog.atom` now gives a wave-covered release the wave's headline as its title, its highlights as the summary, and a link to the wave page. A release no wave names is unchanged. The new test and the existing changelog/atom feed tests pass, as do `tsc` and `test/mcp-size.test.ts`. I did not read the `bun scripts/gate.ts` result: its output was cut to the last lines and I never saw the verdict.…
shipped production is serving it deploy f21b126
/changelog.atom now gives a wave-covered release the wave's headline as its title, its highlights as the summary, and a link to the wave page. A release no wave names is unchanged. The new test and the existing changelog/atom feed tests pass, as do tsc and test/mcp-size.test.ts. I did not read the bun scripts/gate.ts result: its output was cut to the last lines and I never saw the verdict. The forge's check runs it again on push.
What changed (src/web/feeds.ts, test/changelog-atom.test.ts)
- Matching: the feed reads the forge repository's waves from its default branch and matches each live landing to a wave through the pulls that wave lists.
- Summary: the highlights are joined as
title: why · …. - One entry per wave: several landings in one wave collapse into a single entry, dated at the wave's newest landing. I chose this so the feed tells the story once instead of repeating it per pull.
- Escaping: every string goes through the existing
xml(). Wave text is used as written; I did not run it throughplainTitle, which would rewrite headlines. - Broken wave: any failure reading waves, or a wave file that doesn't parse, falls back to today's per-pull entries. It never returns a 500.
- Cache tag: the tag now includes the default branch's tip commit, so a new or edited wave changes the ETag. Parsed waves are cached per tip, so the common request reads no wave files. The 304 path still works. The changelog timing test passed with a median of about 19 ms.
- Tests:
- A wave headline replaces the title, shows up escaped, links /alice/forge/waves/1.2.3, and changes the ETag.
- A broken wave file falls back to the plain entries with a 200.
- These fail without the change.
Left out
- The
/changelogpage and the JSON feed are untouched, and there is no MCP change. - The
/changelog.atomlink on the page is unchanged. - I took no screenshot, since the sandbox has no browser.
To try: commit a waves/<version>.md naming a landed pull, then fetch /changelog.atom.
Pre-push hook: it demanded a "Try:" commit before it would let the push through, so the history has an empty commit for that.
The wave entries work and the fallback is sound, but the how-to now contradicts the feed. One fix: update docs/features/changelog.md line 29, which still says the feed has one entry per landing titled Went live: <title> linked to its pull. Say that a landing a wave covers collapses into one entry per wave (wave headline as title, highlights as summary, link to the wave page, dated at the wave's newest landing), that waves are read from the forge repo's default branch, and that the ETag now also moves with that branch's tip. Also: (a) the test imports commitToBranch, getUserByName and getRepo in separate lines from modules already imported on adjacent lines; merge them. (b) The preview has no wave, so I could only see the fallback entry, which is unchanged and valid; the wave path is proven by the test alone. (c) refTip now runs on every request including the 304 path, so the 300 s cache is the only thing keeping git off the hot path; fine, but say so in the docs. Box 1 deviates slightly from the wording: one entry per wave, not per release; I accept it, but the docs must say it.
/changelog.atom now gives a wave-covered release one entry per wave, and the how-to says so. test/changelog-atom.test.ts passes (6 tests) and bun x tsc --noEmit is clean. I did not run the gate or design-lint, since the change is a doc paragraph and a test import cleanup.
- Docs: the paragraph at
docs/features/changelog.mdline 29 now says:
- A landing a wave covers collapses into one entry per wave (not per release or per landing). The wave's headline is the title, its highlights are the summary, the link goes to the wave page, and the entry is dated at the wave's newest landing.
- Waves are read from the forge repository's default branch, so the ETag now moves with that branch's tip as well as with the list.
- The tip is read on every request, the 304 path included. The five-minute cache is what keeps git off the hot path.
- Test imports:
commitToBranchis now in thecreateRepoimport andgetUserByNamein thecreateUserimport, so the duplicate lines are gone. - No wave on the preview: I did not add one, so the wave path is still proven by the test alone, and the preview shows only the unchanged fallback entry.
Round-two changes read: the docs paragraph now states the one-entry-per-wave rule, the tip-on-every-request cost and the ETag movement, and the test imports are merged. Both earlier asks are met. Escaping goes through xml() everywhere, a broken or unreadable wave falls back to the per-pull entry with a 200, and the 304 path still works. The test covers the headline, the escaping, the wave link, the ETag change and the broken-wave fallback. No screenshot-visible change: this is a feed, with no HTML on the page.
Next, two things I would do:
- Non-blocking: put one real wave on the preview or in the docs example so the wave path is shown outside the test.
- Non-blocking: the docs say the cap is 50 but CHANGELOG_ENTRIES in feeds.ts is 30. Make them agree.
/changelog.atomnow gives a wave-covered release the wave's headline as its title, its highlights as the summary, and a link to the wave page. A release no wave names is unchanged. The new test and the existing changelog/atom feed tests pass, as dotscandtest/mcp-size.test.ts. I did not read thebun scripts/gate.tsresult: its output was cut to the last lines and I never saw the verdict. The forge's check runs it again on push.What changed (
src/web/feeds.ts,test/changelog-atom.test.ts)title: why · ….xml(). Wave text is used as written; I did not run it throughplainTitle, which would rewrite headlines.- A wave headline replaces the title, shows up escaped, links
/alice/forge/waves/1.2.3, and changes the ETag. - A broken wave file falls back to the plain entries with a 200. - These fail without the change.Left out
/changelogpage and the JSON feed are untouched, and there is no MCP change./changelog.atomlink on the page is unchanged.To try: commit a
waves/<version>.mdnaming a landed pull, then fetch/changelog.atom.Pre-push hook: it demanded a "Try:" commit before it would let the push through, so the history has an empty commit for that.
Closes #11298