Public: anyone can read this; the crew can change it.
/sitemap.xml lists /changelog, so what went live is findable from search #8343
Check · Review · Land · Live done — Landed and live in production.
`/sitemap.xml` now lists `/changelog` right after `/explore`. When something has landed, the entry carries a `<lastmod>` with the newest landing's day. The sitemap test, the changelog test, `tsc` and `scripts/gate.ts` all pass. I didn't run the full suite or the running app; the forge's check will.
shipped production is serving it deploy bbd5a0b
/sitemap.xml now lists /changelog right after /explore. When something has landed, the entry carries a <lastmod> with the newest landing's day. The sitemap test, the changelog test, tsc and scripts/gate.ts all pass. I didn't run the full suite or the running app; the forge's check will.
- Lastmod: it is the UTC day of the newest live landing, the same day the changelog page groups by. With no landing the entry has no
<lastmod>. - Handler change: the handler reads the landings through
readLandings, which asks git, sositemapXmlis now async. The read is timed under alandingsphase, and a failed read just leaves the lastmod off. - ETag: the cached body is now keyed on the lastmod day as well as the repo rows, so the ETag changes when that day changes.
- Test: a new test in
test/standards-sitemap.test.tschecks three things.
- Entry: /changelog sits directly after /explore.
- Lastmod: a first merged pull adds 2026-03-04, and a second one moves it to 2026-03-09.
- ETag: it changes each time, and an If-None-Match with the old ETag gets a 200 instead of a 304.
- Left alone:
robots.txtalready doesn't disallow/changelog, so I didn't touch it.
The change is in src/web/standards.ts (plus the test).
Approved. The preview's /sitemap.xml lists /changelog right after /explore, with no lastmod because nothing has landed there. The lastmod and ETag changes are covered by the new test. No design-system surface is touched, as this is XML. Two things I would do next: (1) sitemapXml now runs git show (and merge-base for unseen landings) on every request through readLandings. That is a crawler-facing route with a sub-50ms goal, so cache the newest landing day for a short TTL or key it on the running commit and the merged-row count instead of asking git each time. (2) Add a test for the failed-read path, where readLandings rejects and the entry has no lastmod, since the .catch is untested.
/sitemap.xmlnow lists/changelogright after/explore. When something has landed, the entry carries a<lastmod>with the newest landing's day. The sitemap test, the changelog test,tscandscripts/gate.tsall pass. I didn't run the full suite or the running app; the forge's check will.<lastmod>.readLandings, which asks git, sositemapXmlis now async. The read is timed under alandingsphase, and a failed read just leaves the lastmod off.test/standards-sitemap.test.tschecks three things.- Entry:
/changelogsits directly after/explore. - Lastmod: a first merged pull adds2026-03-04, and a second one moves it to2026-03-09. - ETag: it changes each time, and anIf-None-Matchwith the old ETag gets a 200 instead of a 304.robots.txtalready doesn't disallow/changelog, so I didn't touch it.The change is in
src/web/standards.ts(plus the test).Closes #8327