Skip to content

Make the merge the release, and every check the thing that stands in front of it - #78

Merged
JaspervdM80 merged 2 commits into
mainfrom
claude/pr-deployment-workflow-139xnj
Aug 12, 2026
Merged

Make the merge the release, and every check the thing that stands in front of it#78
JaspervdM80 merged 2 commits into
mainfrom
claude/pr-deployment-workflow-139xnj

Conversation

@JaspervdM80

Copy link
Copy Markdown
Owner

The gates were at the wrong end. A pull request landed on one green check while
Coverage, Playwright and Visual check only reported, and then the release was
held a second time by a reviewer on the production environment — so merging
proposed a deploy that somebody still had to approve.

Move the weight forward. main's ruleset now requires all four checks and that
the branch is up to date with main, and fly-deploy.yml deploys the merge commit
with no gate job and nothing to approve. The two are a pair: nothing re-runs on
main any more, so what the pull request proved is the last word on what reaches
the volume, and the branch cannot have gone stale underneath it.

Requiring Coverage is safe because its floor is on the lines a change touched —
a pull request with no coverable line in it measures nothing and passes rather
than wedging. Requiring the browser jobs costs a flake blocking a merge; the
answer is re-running the job, since bypass_actors is still empty.

ci.yml loses the workflow_call trigger and the three guards that opted the
advisory jobs out of it, having no caller left.

The production environment stays for its secret and its branch policy, which is
what keeps FLY_API_TOKEN out of reach of a workflow on a feature branch. Only
its reviewer box is emptied, and deployment.md says how to tick it again for a
release worth sitting on.

Also written down, since a merge is now a release: the five routes by which
another account could ever come to press that button, all five of which start
with an invite, an app, or a key added here — and the second ruleset to add on
the day one of them is.

Two settings have to be applied by hand, as ever: re-import the ruleset under
its new name, and untick Required reviewers on the production environment.

Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01XsfcX5Qc2aFq59gVYtmnB4

claude added 2 commits August 12, 2026 07:51
…front of it

The gates were at the wrong end. A pull request landed on one green check while
Coverage, Playwright and Visual check only reported, and then the release was
held a second time by a reviewer on the production environment — so merging
proposed a deploy that somebody still had to approve.

Move the weight forward. `main`'s ruleset now requires all four checks and that
the branch is up to date with main, and fly-deploy.yml deploys the merge commit
with no gate job and nothing to approve. The two are a pair: nothing re-runs on
main any more, so what the pull request proved is the last word on what reaches
the volume, and the branch cannot have gone stale underneath it.

Requiring Coverage is safe because its floor is on the lines a change touched —
a pull request with no coverable line in it measures nothing and passes rather
than wedging. Requiring the browser jobs costs a flake blocking a merge; the
answer is re-running the job, since bypass_actors is still empty.

ci.yml loses the workflow_call trigger and the three guards that opted the
advisory jobs out of it, having no caller left.

The production environment stays for its secret and its branch policy, which is
what keeps FLY_API_TOKEN out of reach of a workflow on a feature branch. Only
its reviewer box is emptied, and deployment.md says how to tick it again for a
release worth sitting on.

Also written down, since a merge is now a release: the five routes by which
another account could ever come to press that button, all five of which start
with an invite, an app, or a key added here — and the second ruleset to add on
the day one of them is.

Two settings have to be applied by hand, as ever: re-import the ruleset under
its new name, and untick Required reviewers on the production environment.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XsfcX5Qc2aFq59gVYtmnB4
Two review passes over the previous commit found the workflows and the ruleset
sound and the documentation half a design behind. Four files still described the
gate that commit deleted, and three claims inside the prose it rewrote argued
with themselves.

Retire the gate properly. testing.md led with the deploy job depending on the
test run, and then offered a push deploying straight to production as the bad
old days — which is the design again, so it now says what actually stands
between a merge and the volume: the Docker build and the smoke check. The three
one-line versions of the same claim, in CLAUDE.md, README.md and
project_overview.md, become the tests gating the merge, which is what they do.

Then the contradictions. `pull_request` is not the only event reporting these
checks — workflow_dispatch reports the same four contexts and can unlock a merge
on its own, off the branch tip rather than the merge ref, which matters because
the paragraph making the claim then recommends it as the escape hatch. "Two
things could put a release on the volume" was followed by three of them; the
approval that went was a mitigation, not a route. And the Actions-token row of
the new access table named the wrong prerequisite and the wrong backstop: it
takes contents: write, not the create-and-approve setting, a workflow on a branch
never has to be merged to run, and what actually holds is the ruleset binding
GITHUB_TOKEN like anybody else.

Said out loud too that disabling the ruleset costs more than it did. It used to
skip one check and leave the commit built and tested on main regardless; now it
merges, deploys and migrates an unbuilt commit.

The one behaviour change is on the manual route, which lost the gate job and the
reviewer in the same commit and kept nothing. A dispatch now takes a confirm
input that has to read "deploy". The push arm of the condition is untouched and
tests the ref alone, so a merged pull request still releases with nothing to
fill in.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XsfcX5Qc2aFq59gVYtmnB4
@JaspervdM80
JaspervdM80 merged commit 86a5738 into main Aug 12, 2026
4 checks passed
@JaspervdM80
JaspervdM80 deleted the claude/pr-deployment-workflow-139xnj branch August 12, 2026 09:17
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.

2 participants