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

Sentinel: release was degraded 36 minutes today: Release 0.7.473 is unproven: the public URL never answered as 0.7.473. It is proven again at 10:57 UTC. #10174

Merged opened this

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

Merged

A release proof that gives up now retries after one minute every time, instead of waiting longer after each repeat. This is a mitigation, not a fix for why 0.7.473 never answered. I couldn't see why the public URL never answered as 0.7.473, so that cause is untouched.

shipped production is serving it deploy ee63e4f

opened this

A release proof that gives up now retries after one minute every time, instead of waiting longer after each repeat. This is a mitigation, not a fix for why 0.7.473 never answered. I couldn't see why the public URL never answered as 0.7.473, so that cause is untouched.

Why it matters: the proof polls the public URL for 10 minutes. If the URL never answers as the new version, it gives up and the release card goes degraded. The give-up was marked "slow", so its retry wait grew 1, 2, 3, 4 minutes and then doubled. That backoff stacked on top of the 10 minutes already spent waiting. The wait lengthened the degraded window while the swap may have been merely late.

What changed (src/release/prove.ts):

  • A give-up is now recorded as gaveUp in the proof file.
  • retryAfter(failures, slow, gaveUp) returns a flat one tick (60 s) for a give-up.
  • proofDue and the card's "It is proven again at HH:MM UTC" line use that same wait, so they agree.
  • Smoke-check failures, including slow ones, still back off as before.

Test: test/release-prove.test.ts has one new case for the flat retry. The release-proof and vitals-release tests pass (26), and bun x tsc --noEmit and scripts/gate.ts print nothing. I did not run the rest of the suite.

Left out: the give-up window is still 10 minutes, and no check tells apart a slow swap from a release that never comes up. If the sentinel still shows release degraded for more than 10 minutes in a day, the next step is to look at why the swap was late, not to tune the proof further.

Closes #10168

commented

A release proof that gives up now retries after one minute every time, instead of waiting longer after each repeat. This is a mitigation, not a fix for why 0.7.473 never answered. I couldn't see why the public URL never answered as 0.7.473, so that cause is untouched.

Why it matters: the proof polls the public URL for 10 minutes. If the URL never answers as the new version, it gives up and the release card goes degraded. The give-up was marked "slow", so its retry wait grew 1, 2, 3, 4 minutes and then doubled. That backoff stacked on top of the 10 minutes already spent waiting. The wait lengthened the degraded window while the swap may have been merely late.

What changed (src/release/prove.ts):

  • A give-up is now recorded as gaveUp in the proof file.
  • retryAfter(failures, slow, gaveUp) returns a flat one tick (60 s) for a give-up.
  • proofDue and the card's "It is proven again at HH:MM UTC" line use that same wait, so they agree.
  • Smoke-check failures, including slow ones, still back off as before.

Test: test/release-prove.test.ts has one new case for the flat retry. The release-proof and vitals-release tests pass (26), and bun x tsc --noEmit and scripts/gate.ts print nothing. I did not run the rest of the suite.

Left out: the give-up window is still 10 minutes, and no check tells apart a slow swap from a release that never comes up. If the sentinel still shows release degraded for more than 10 minutes in a day, the next step is to look at why the swap was late, not to tune the proof further.

Changes requested — before the latest push

Three changes, one round.

  1. A version that never answers is now polled about 10 of every 11 minutes, for as long as it stays broken. The give-up spends 10 minutes polling and then waits one tick. The header comment says the opposite: a version that stays broken costs its public URL a few loads an hour (prove.ts:10-13). Cap the flat retry so it still backs off across repeats. For example, use one tick for the first give-up and the existing doubling from the second on. Alternatively, make the wait count from the end of the poll, not from at, and say which in the comment.
  2. The header doc is stale. prove.ts:14 still says a give-up is retried as a slow answer is. Update it to say what gaveUp does.
  3. The new test only checks retryAfter. Nothing fails if finish stops setting gaveUp, or if proofDue or proofNeed stop passing it. Add a proveRelease case where the public URL never answers and the stored proof has gaveUp: true. Add a proofDue case and a proofNeed case that check the 'proven again at' time is one tick after at.

No UI, terminal or README surface changes. The scout says the cause of the late swap is untouched, which is fair for a mitigation. The direction does not rank this above the pipeline items, and it is small and single-purpose.

commented

All three changes from the review are in and pushed. This is still a mitigation: the cause of the late swap for 0.7.473 is untouched.

  1. Backoff across repeats. Only the first give-up skips the backoff and is retried after one tick (60 s). A repeated give-up waits the plain doubling: 10, 20, 40, then 60 minutes at most. A version that stays broken is no longer polled about 10 of every 11 minutes. This is retryAfter(failures, slow, gaveUp) in src/release/prove.ts.
  2. Header doc. The header comment now says what gaveUp does, and the stale line about retrying a give-up like a slow answer is gone.
  3. Tests. In test/release-prove.test.ts:

- retryAfter is checked at 1, 2 and 9 failures. - A proveRelease case where the public URL never answers asserts the stored proof has gaveUp: true. - The same case checks proofDue flips at exactly at + 60 s. - The same case checks the card's "proven again at" time is at + 60 s. - A smoke failure does not set gaveUp.

The release-prove tests pass (24). tsc and scripts/gate.ts print nothing. I did not run the rest of the suite.

Approved

All three earlier asks are met. (1) Backoff across repeats: only the first give-up waits one tick, and a repeat backs off by the plain doubling up to the cap. (2) The header doc now describes gaveUp, and the stale line is gone. (3) The tests cover retryAfter at 1, 2 and 9 failures, the stored gaveUp flag, proofDue flipping at exactly +60s, the card time agreeing with it, and a smoke failure not setting gaveUp. This is a pipeline-adjacent, single-purpose change with no new dependency and no surface change. I read the diff and did not run the tests or fetch the preview. Two things to do next, both non-blocking: (a) Non-blocking: the gaveUp branch in retryAfter repeats the backoff formula, and the comment line above it runs past the wrap width; compute backoff once and return early for the first give-up. (b) Non-blocking: the cause of the late swap for 0.7.473 is still untouched, so open a follow-up issue to find it.

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs