Skip to content

docs(gotcha 36): approve a parked ramp before merging anything else - #401

Merged
oddharsh merged 1 commit into
mainfrom
docs/gotcha-36-ramp-race
Aug 15, 2026
Merged

docs(gotcha 36): approve a parked ramp before merging anything else#401
oddharsh merged 1 commit into
mainfrom
docs/gotcha-36-ramp-race

Conversation

@oddharsh

Copy link
Copy Markdown
Owner

Shipping the covers fix found a race the concurrency block in ramp.yml does not describe.

The gap

That block explains that a newer ramp cancels a pending one, which reads as a queueing rule about runs that have not started. It also cancels a ramp that is mid-flight because you just approved it, and the merge doing the cancelling can be entirely unrelated.

Measured 2026-08-15:

run 31862702940 approved, moving traffic
successor entered the group 12:13:35Z
31862702940 cancelled 12:13:54Z, 19s later

It reported completed/cancelled having already reached 100%. Traffic landed, the run looks failed, and both are true. That combination is the confusing part.

What it can actually cost

The changelog. The D1 INSERT runs only after the last step hits 100%, so a cancellation lands squarely on the one step that has nothing to retry it.

Here it cost nothing because no checkpoint was staged, and that was luck rather than design. A release carrying a changelog entry would have gone to 100% and silently logged nothing, which is gotcha 24's failure arriving through a different door: checkpoints:check catches it on the next PR, long after the ramp read as done.

The rule

Ordering does not save you, and neither does approving first: the successor ramp arrives whenever Workers Builds finishes, which is minutes after a merge and nothing you control. The rule is about the window rather than the sequence. Let a parked ramp finish before merging, and if a merge has already gone in, expect the cancellation and confirm with pnpm run deploy:promote -- --status rather than reading the run's conclusion.

Docs only. 277/277 contract tests pass.

This PR is deliberately not being merged until the in-flight ramp settles, which is the rule it documents.

Shipping the covers fix found a race the concurrency block does not
describe. That block explains that a newer ramp cancels a pending one,
which reads as a queueing rule about runs that have not started yet. It
also cancels a ramp that is mid-flight because you just approved it, and
the merge doing the cancelling can be entirely unrelated.

Measured: run 31862702940 was approved and moving traffic; the next
merge's ramp entered the group at 12:13:35Z and 31862702940 was cancelled
at 12:13:54Z. It reported completed/cancelled having already reached 100%,
so traffic landed and the run looks failed and both are true.

What it can cost is the changelog. The D1 INSERT runs only after the last
step hits 100%, so a cancellation lands on the one step with nothing to
retry it. Here it cost nothing because no checkpoint was staged, which was
luck. A release carrying an entry would have gone to 100% and logged
nothing, which is gotcha 24 arriving through a different door.

Ordering does not save you and neither does approving first, since the
successor ramp arrives whenever Workers Builds finishes. The rule is about
the window rather than the sequence.
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Aug 15, 2026

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

Status Name Latest Commit Updated (UTC)
✅ Deployment successful!
View logs
aadhar-sh d1a7d95 Aug 15 2026, 12:19 PM

@oddharsh
oddharsh merged commit 45175f1 into main Aug 15, 2026
6 of 7 checks passed
@oddharsh
oddharsh deleted the docs/gotcha-36-ramp-race branch August 15, 2026 12:20
oddharsh added a commit that referenced this pull request Aug 16, 2026
…verse (#416)

This gotcha claimed twice that the Copilot check fails on every diff, and one of
those claims went in a few hours ago as the general lesson. It is wrong. The run
always fires; whether it REQUESTS A MODEL depends on the diff.

The job prints a file exclusion list on every run, covering js, json, mjs, ts,
py, rs, yaml, yml, html, xml, go, java, c/cpp, rb and more. `.md`, `.sh` and
`.css` are NOT on it. So a docs diff survives the filter and gets a
`claude-opus-4.6` request, while a pure JavaScript diff is filtered to nothing
and the run exits clean.

Both paths print `Sessions disabled: not supported for code scanning yet`, which
this session initially read as the discriminator and is not; the discriminating
line is `Creating copilot-sdk session with model`, which only the failing path
reaches.

Correlates 12 of 12: the five runs of 2026-08-15 (#399 jpg/json and #402 js/mjs
passed; #398, #400 and #401 all carried md and failed), plus all seven earlier
failures checked backwards. #313 is the "CSS-only" diff this gotcha already
singles out, and css is not on the list either. #351's note here called its
entire diff a `${{ }}` move in workflow files; it touched md and mjs too, and
the md is what drew the request.

The prose-only argument is unchanged in conclusion and inverted in mechanism: a
docs PR reddens this because markdown is one of the few things the detector
still looks at, rather than because the agent choked on prose. The entitlement
root cause is untouched.

Records the method failure too, since it is the transferable part. Nine entries
were built by pattern-matching outcomes across PRs without once reading which
files each diff touched, and "fails on everything" was an artifact of that
sample. One uncollected column explained the whole shape.

Co-authored-by: Aadharsh Pannirselvam <19518661+oddharsh@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant