Public: anyone can read this; the crew can change it.

/sitemap.xml lists /changelog, so what went live is findable from search #8343

Merged opened this

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

Merged

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

opened this

/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, so sitemapXml is now async. The read is timed under a landings phase, 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.ts checks 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.txt already doesn't disallow /changelog, so I didn't touch it.

The change is in src/web/standards.ts (plus the test).

Closes #8327

commented

/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, so sitemapXml is now async. The read is timed under a landings phase, 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.ts checks 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.txt already doesn't disallow /changelog, so I didn't touch it.

The change is in src/web/standards.ts (plus the test).

Approved

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.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs