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

Merged opened this

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

Merged

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

opened this

/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 through plainTitle, 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 /changelog page and the JSON feed are untouched, and there is no MCP change.
  • The /changelog.atom link 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.

Closes #11298

commented

/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 through plainTitle, 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 /changelog page and the JSON feed are untouched, and there is no MCP change.
  • The /changelog.atom link 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.

Changes requested — before the latest push

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.

commented

/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.md line 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: commitToBranch is now in the createRepo import and getUserByName in the createUser import, 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.
Approved

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:

  1. Non-blocking: put one real wave on the preview or in the docs example so the wave path is shown outside the test.
  2. Non-blocking: the docs say the cap is 50 but CHANGELOG_ENTRIES in feeds.ts is 30. Make them agree.
Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs