You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(skills): rewrite release-promotion — automated factory, no manual gates
- use_merge_queue: true is unconditional and required, not event-conditional
- action_required on promotion PR checks is expected and normal (org blocks
github-actions[bot] PR runs); merge_group events bypass this
- documents why merge queue is required: gh pr merge --auto is blocked by the
merge queue ruleset, enqueuePullRequest is the only working path
- ruleset updated: main-merge-queue-no-review (id 18008292) replaces
main-review-required-with-renovate-bypass (deleted)
- required_approving_review_count is 0 — promotion is fully automated
- adds DELETE+POST pattern for ruleset management (PATCH returns 404)
- removes all guidance saying use_merge_queue should be conditional
- removes 'preserves human approval gates' from verification (wrong frame)
- ci-reference.md: ruleset table updated, stale required_approving_review_count=1
example corrected to 0
Assisted-by: Claude Sonnet 4.6 via GitHub Copilot
**`action_required` on promotion PR checks is expected.** The org blocks `github-actions[bot]`-triggered `pull_request` workflow runs. `validate` and all other PR checks show `action_required` on every promotion PR — this is normal and not a failure. The merge queue fires `merge_group` events which bypass the bot approval policy and run `validate` cleanly.
248
+
247
249
**e2e change detection:**`e2e` only tests PRs touching `elements/`, `files/`, `patches/`, `Justfile`, or `project.conf`. For all other paths (e.g. workflow pin bumps) the `e2e` job is skipped, which satisfies the required check. The `should-run` job uses `git diff` against the PR base — no `paths:` filter on the trigger.
248
250
249
251
**Critical:** Required status checks must only include checks that fire on `pull_request`. A check that only fires on `merge_group` will permanently block the "Add to merge queue" button.
@@ -1818,8 +1820,8 @@ gh api repos/projectbluefin/dakota/branches/main/protection \
description: Dakota publish and promotion flow from main to testing to stable, including promotion PRs, release gate behavior, and manual recovery. Use when working on promotion workflows, action_required gates, release execution, or stable-cut logic.
3
+
description: Dakota publish and promotion flow from testing to main to stable, including promotion PRs, merge queue wiring, release gate behavior, and manual recovery. Use when working on promote-testing-to-main.yml, action_required on promotion PRs, merge queue setup, branch protection, or stable-cut logic.
2. Weekly human-gated stable cut via `production` Environment (2 approvals)
17
+
18
+
Promotion from `testing` to `main` is **fully automated** — no human approval required at the PR level. The only human gate is the weekly `production` Environment for stable.
17
19
18
20
Do not conflate "publish is healthy" with "stable promotion is healthy".
19
21
@@ -24,7 +26,9 @@ Use when the task mentions:
24
26
-`pr-release-gate.yml`
25
27
-`execute-release.yml`
26
28
- promotion PRs from `auto/promote-testing-to-main`
Classic branch protection on `main`: `required_approving_review_count: 0`.
93
+
94
+
**Never re-add a required review count to classic protection or the ruleset.** It blocks every automated promotion PR permanently — the GHA bot cannot approve its own PRs.
95
+
96
+
## Workflow Configuration
97
+
98
+
`promote-testing-to-main.yml` must always have `use_merge_queue: true`:
| "Release gate is red, so publish is broken." | Different layer. Publish may be healthy while promotion is blocked. |
101
-
| "Let's just add more checks to the promotion PR." | That slows humans and duplicates the real stable gate. |
102
-
| "`action_required` means rerun the same gate." | Usually it means read the gate condition first. |
223
+
| "Let's just add more checks to the promotion PR." | That slows the queue and duplicates the real stable gate. |
224
+
| "`action_required` means rerun the same gate." | It means the org is blocking bot PR runs. Only the merge queue bypasses this. |
225
+
| "`use_merge_queue` only needs to be true for schedule/dispatch." | Wrong. It must always be true. The bot approval block applies to push events too. |
226
+
| "Adding a required review adds safety." | It permanently blocks every automated promotion PR. |
103
227
| "This reusable caller only needs job-level permissions." | Wrong often enough to deserve a scar. Check top-level caller permissions first. |
104
228
105
229
## Red Flags
106
230
231
+
- `use_merge_queue`is conditional on `github.event_name`
232
+
- `required_approving_review_count`is greater than 0 in ruleset or classic protection
233
+
- The ruleset is missing the `merge_queue` rule type
107
234
- editing stable-promotion logic while the real failure is earlier publish plumbing
108
235
- adding full e2e to the promotion PR path
109
-
- rerunning arbitrary nearby workflows instead of the owning stage
110
-
- ignoring `auto/promote-testing-to-main` PR state and debugging the wrong branch
236
+
- rerunning `action_required` workflow runs — they cannot be rerun, they are bot-blocked
111
237
112
238
## Verification
113
239
114
-
-[ ]You identified the exact promotion stage that is failing
115
-
-[ ]You checked open promotion PR state before editing YAML
116
-
-[ ]Reusable caller permissions were validated if the gate did not start
117
-
-[ ]You did not collapse publish, promotion, and stable release into one mental model
118
-
-[ ]Any change preserves the factory's intended human approval gates
240
+
- [ ] `use_merge_queue: true` unconditionally in `promote-testing-to-main.yml`
241
+
- [ ] Ruleset `main-merge-queue-no-review` exists and has `merge_queue` rule
242
+
- [ ] Classic branch protection `required_approving_review_count` is 0
243
+
- [ ] `run_e2e: false` unchanged in the caller
244
+
- [ ] Promotion PR enqueued and merged without any human interaction
119
245
- [ ] Weekly cadence remains Tuesday `04:00 UTC`
120
-
-[ ]`workflow_dispatch` still supports the same enqueue path as the scheduled run
121
-
-[ ]`run_e2e: false` stayed unchanged in the caller
246
+
- [ ] You did not collapse publish, promotion, and stable release into one mental model
122
247
123
248
## Lessons Learned
124
249
125
-
### release/blocked after CI-only push to testing is expected (2026-06-22)
250
+
### release/blocked after CI-only push to testing is expected
126
251
127
252
When a paths-ignored push (e.g. `.github/workflows/**` change) advances the `testing`
128
253
HEAD, the promote gate runs against the new SHA and finds no CI results for it.
129
254
The gate correctly sets `release/blocked` — the SHA has never been built.
130
255
131
-
**This is not a pipeline failure.** Do not re-trigger or debug. The resolution is:
132
-
133
-
1. The BST build for the prior SHA (triggered by the image-affecting push) completes.
256
+
This is not a pipeline failure. The resolution is automatic:
0 commit comments