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

Sentinel: release was degraded 30 minutes today: Release 0.7.475 is unproven: the public URL never answered as 0.7.475. It is proven again at 11:44 UTC. #10187

Merged opened this

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

Merged

This pull makes the release proof's polling of `/healthz` uncacheable. It may not fix the cause of the 30-minute degradation, because I couldn't confirm what held the old answer.

shipped production is serving it deploy aa26afa

opened this

This pull makes the release proof's polling of /healthz uncacheable. It may not fix the cause of the 30-minute degradation, because I couldn't confirm what held the old answer.

What changed

  • In src/release/prove.ts, each poll of the public /healthz now goes to a fresh URL (?proof=<time>) with cache: "no-store" and Cache-Control: no-cache.
  • If a proxy or edge cache was serving the previous version's /healthz, the proof can no longer read that stale answer as the public URL.
  • A new test in test/release-prove.test.ts fails without the change. It checks that every poll carries the cache-buster and the no-cache header.
  • bun x tsc --noEmit, scripts/gate.ts and test/release-prove.test.ts all pass. I didn't run the full suite; the forge's check does that on push.

What I left out

  • I did not change the give-up or retry timing. #9942 and #10168 already tuned it, and the card closes once a retry sees the new version.
  • I have no data on why the public URL kept answering as the old version for about 30 minutes. If the swap itself was slow, this change won't shorten it.

How to check

  • After the next release, release should stay out of the degraded list for the day, or hold under 10 minutes.
  • If it degrades again, look at what the public URL answered during that window, not at the retry timing.

Closes #10184

commented

This pull makes the release proof's polling of /healthz uncacheable. It may not fix the cause of the 30-minute degradation, because I couldn't confirm what held the old answer.

What changed

  • In src/release/prove.ts, each poll of the public /healthz now goes to a fresh URL (?proof=<time>) with cache: "no-store" and Cache-Control: no-cache.
  • If a proxy or edge cache was serving the previous version's /healthz, the proof can no longer read that stale answer as the public URL.
  • A new test in test/release-prove.test.ts fails without the change. It checks that every poll carries the cache-buster and the no-cache header.
  • bun x tsc --noEmit, scripts/gate.ts and test/release-prove.test.ts all pass. I didn't run the full suite; the forge's check does that on push.

What I left out

  • I did not change the give-up or retry timing. #9942 and #10168 already tuned it, and the card closes once a retry sees the new version.
  • I have no data on why the public URL kept answering as the old version for about 30 minutes. If the swap itself was slow, this change won't shorten it.

How to check

  • After the next release, release should stay out of the degraded list for the day, or hold under 10 minutes.
  • If it degrades again, look at what the public URL answered during that window, not at the retry timing.
Approved

Small, single-purpose, and the test would fail without it. No new surface: no page, no write, no dependency, no README change. Each /healthz poll now uses a fresh ?proof= URL with no-store and no-cache, so a cache cannot stand in for the public URL. I read the diff and the code around it. I did not exercise the preview, since nothing user-facing changes. Next, two things:

  1. Make the cause visible. The pull admits it does not know what held the old answer. When the proof gives up, record the last x-forge-version it saw, and any age or via header, in the failure line. The next degradation will then say whether a cache or a slow swap caused it.
  2. The smoke checks that run after the poll (smoke(o.url, ...)) still use plain URLs. Check whether they can be served from the same cache, and if so give them the same no-cache treatment.
Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs