Skip to content

Commit b36d3e8

Browse files
committed
Merge remote-tracking branch 'origin/codex/merged-release-admission-20260622' into codex/land-pr55
2 parents f8e1d5d + de24eb9 commit b36d3e8

28 files changed

Lines changed: 1263 additions & 215 deletions

File tree

.mergequeue.example.toml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ registry_title = "DeployBot delivery registry"
4444
thread_active_hours = 72
4545
ci_workflows = ["CI"]
4646
deploy_workflows = ["Deploy"]
47+
batch_settle_seconds = 0
4748
repair_hold_minutes = 60
4849
hold_merges_while_releasing = true
4950
repair_branch_prefix = "deploybot/repair"
@@ -52,10 +53,10 @@ merge_to_live_target_minutes = 10
5253
auto_promote = true
5354
intent_scope = "head" # safest: a trusted source agent refreshes replacement heads
5455
pause_on_failure = true
55-
# verified (default, safest) holds new merges until the cumulative release is
56-
# live. ci-passed admits the next batch as soon as exact-main CI passes and lets
57-
# deploy and health checks keep following, trading blast radius for throughput.
58-
release_admission = "verified"
56+
# merged (default) admits independent ready work immediately after the previous
57+
# merge. ci-passed waits for exact-main CI; verified waits until production is
58+
# live. Every mode pauses future merges when a later release failure is observed.
59+
release_admission = "merged"
5960
# Receives best-effort events, including retryable thread-deployed messages.
6061
# webhook_url_env = "DEPLOYBOT_WEBHOOK_URL"
6162

README.md

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,11 @@ integration PRs, follows `main` through production, and pauses after failures.
1111

1212
## Install
1313

14-
Install the reviewed `v0.2.24` source commit directly from GitHub:
14+
Install the reviewed `v0.2.25` source commit directly from GitHub:
1515

1616
```bash
1717
python3 -m pip install \
18-
'deploybot-merge-queue[mcp] @ git+https://github.com/Forward-Future/DeployBot.git@73004ea7c9dcb81e7f1281c0687aea0897d1571d'
18+
'deploybot-merge-queue[mcp] @ git+https://github.com/Forward-Future/DeployBot.git@12c6c03aa76a553fa4068279baa29e90a30bbeb1'
1919
deploybot init
2020
```
2121

@@ -90,12 +90,15 @@ completions, and completed external check suites. Keep its `workflows` list
9090
aligned with `pipeline.ci_workflows`. A five-minute scheduled reconciliation
9191
rereads all durable state in case GitHub concurrency coalesces the last pending
9292
event in a burst. The privileged worker never checks out or executes
93-
pull-request code. The Action follows releases by default so the same serialized
94-
worker can dispatch deployment when GitHub suppresses the `workflow_run` event
95-
for token-dispatched CI. Pin the Action to the full reviewed release commit:
93+
pull-request code. The Action advances releases to the configured admission
94+
gate. In the default `merged` mode it returns after each healthy observation,
95+
leaving completion to later release events and keeping the serialized merge
96+
worker free. It can still dispatch deployment when GitHub suppresses the
97+
`workflow_run` event for token-dispatched CI. Pin the Action to the full reviewed
98+
release commit:
9699

97100
```yaml
98-
- uses: Forward-Future/DeployBot@73004ea7c9dcb81e7f1281c0687aea0897d1571d
101+
- uses: Forward-Future/DeployBot@12c6c03aa76a553fa4068279baa29e90a30bbeb1
99102
```
100103
101104
The Action uses GitHub's built-in workflow token. GitHub intentionally does not
@@ -141,6 +144,13 @@ workflow name, base branch, head SHA, event, status, and conclusion to match the
141144
expected successful exact-main CI run. The deployment must still pull the
142145
current base branch and stop if it no longer equals `ci_sha`.
143146

147+
The deployment workflow must also acquire the repository's shared deployment
148+
lock, fetch the base branch again after acquiring it, and coalesce superseded
149+
requests onto that newest integrated SHA. It must never deploy an older SHA after
150+
a newer one, and it keeps the lock through production health verification. These
151+
release rules are unchanged by `release_admission = "merged"`; only merge
152+
admission becomes asynchronous.
153+
144154
The workflow bot and each person allowed to request deployment must be
145155
explicitly listed:
146156

@@ -172,11 +182,11 @@ work, and creates integration PRs when configured. New batches contain at most
172182
`integration.max_batch_size` entries; later FIFO work remains in the next batch.
173183
A larger indivisible source-overlap or dependency closure is the sole exception:
174184
it ships alone, never mixed with unrelated work.
175-
After any merge, admission stays closed until the cumulative exact-main release
176-
is verified live, preventing newer merges from starving an older deployment.
177-
Set `pipeline.release_admission = "ci-passed"` to reopen admission as soon as
178-
exact-main CI is green—deploy and health checks keep following in the
179-
background—when higher merge throughput is worth a larger failure blast radius.
185+
By default, `pipeline.release_admission = "merged"`: after one healthy merge,
186+
DeployBot immediately admits the next independent ready PR or batch. Exact-main
187+
CI, deployment, and health checks keep tracking asynchronously, and a later real
188+
failure pauses future merges. Use `ci-passed` to wait for exact-main CI before
189+
admitting more work, or `verified` to wait until the cumulative revision is live.
180190
Draft status and incomplete
181191
checks or reviews remain waiting states; they do not create a repair latch. A
182192
conflict, failed gate, unresolved review, manual block, or stale authorized head
@@ -269,7 +279,7 @@ ending the PR-opening-thread response.
269279
[pipeline]
270280
ci_workflows = ["CI"]
271281
deploy_workflows = ["Deploy"]
272-
batch_settle_seconds = 15
282+
batch_settle_seconds = 0
273283
ci_failure_grace_seconds = 90
274284
promotion_workers = 4
275285
hold_merges_while_releasing = true
@@ -279,7 +289,7 @@ merge_to_live_target_minutes = 10
279289
auto_promote = true
280290
intent_scope = "head"
281291
pause_on_failure = true
282-
release_admission = "verified" # or "ci-passed" for higher merge throughput
292+
release_admission = "merged" # or "ci-passed" / "verified" for stricter admission
283293
284294
[[pipeline.verifications]]
285295
name = "Login"

action.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ inputs:
66
required: false
77
default: .mergequeue.toml
88
follow:
9-
description: Follow cumulative main through CI and deployment
9+
description: Advance cumulative main to the configured release-admission gate
1010
required: false
1111
default: "true"
1212
dispatch_ci:

adapters/claude-code/.claude-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "deploybot",
3-
"version": "0.2.24",
3+
"version": "0.2.25",
44
"description": "DeployBot: a provider-neutral GitHub merge queue for coding agents",
55
"author": {
66
"name": "DeployBot contributors"

adapters/claude-code/.mcp.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"command": "uvx",
55
"args": [
66
"--from",
7-
"deploybot-merge-queue[mcp] @ git+https://github.com/Forward-Future/DeployBot.git@73004ea7c9dcb81e7f1281c0687aea0897d1571d",
7+
"deploybot-merge-queue[mcp] @ git+https://github.com/Forward-Future/DeployBot.git@12c6c03aa76a553fa4068279baa29e90a30bbeb1",
88
"deploybot-mcp"
99
]
1010
}

adapters/claude-code/skills/deploybot/SKILL.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,10 @@ Merge independent ready pull requests back-to-back. Route source-overlap groups
8787
through `create_integration_pull_request`; when policy mode is `all`, validate
8888
the entire frozen batch through that cumulative PR. Never invent a conflict
8989
resolution. Return the repair packet to its source thread, then call `resume`
90-
after its new exact head passes. Finish with `follow_release`, following newer
91-
cumulative base heads until CI, deployment, and configured health checks verify.
90+
after its new exact head passes. Keep release tracking event-driven: in
91+
`release_admission = "merged"` mode, admit independent ready work immediately
92+
after a healthy merge while later events continue CI, deployment, and health
93+
tracking. Scheduled reconciliation is a fallback, not the normal promotion path.
9294

9395
Genuine repair blocks may hold overlapping ready work for the configured bounded
9496
repair window, but they remain merge-ineligible until the trusted source agent
@@ -123,9 +125,10 @@ named thread already owns that failed SHA; wait for that repair and never create
123125
a competing PR. The owner is encoded in the atomic branch ref, so a registry
124126
write failure is recovered by calling the same tool again.
125127

126-
New batches are FIFO-bounded by `integration.max_batch_size`, and a merged batch
127-
closes admission until its cumulative main revision is verified live. Do not
128-
override either boundary for later work. Never execute merged PR code inside
128+
New batches are FIFO-bounded by `integration.max_batch_size`. Honor the configured
129+
release-admission gate: `merged` permits the next independent batch immediately,
130+
while `ci-passed` and `verified` impose stricter release fences. A later observed
131+
release failure pauses future merges in every mode. Never execute merged PR code inside
129132
the privileged coordinator; generated-artifact conflicts go to the elected
130133
repair owner for a normal reviewed rebuild. When PR-authored checks are
131134
required, use a GitHub App installation token, list its bot login in

adapters/claude-code/skills/manage-merge-queue/SKILL.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,18 @@ poll or merge an unlabeled PR.
2626
Use `pipeline_status` and `react_to_delivery_event` for bursts. Skip blockers,
2727
honor dependencies, route overlap or cumulative validation through
2828
`create_integration_pull_request`, return repair packets to the source thread,
29-
and use `resume_pull_request` after fresh review. Finish with `follow_release`;
30-
a failed CI or deployment pauses the pipeline until verified recovery.
29+
and use `resume_pull_request` after fresh review. In `release_admission =
30+
"merged"` mode, admit independent ready work immediately after merge while
31+
later events track CI and deployment; a later failure pauses the pipeline.
3132

3233
A genuine repair remains merge-ineligible, but DeployBot may temporarily hold
3334
overlapping ready work for the configured bounded repair window so concurrent
3435
merges do not repeatedly invalidate the replacement head.
3536

3637
Before creating an exact-main recovery, call `claim_release_repair`; only the
3738
returned `owned` thread may use the deterministic repair branch. Respect the
38-
maximum batch size and keep new merges closed while an earlier release is
39-
unfinished.
39+
maximum batch size and the selected `merged`, `ci-passed`, or `verified`
40+
release-admission fence.
4041

4142
Immediately before asking the user to `unpause` or take another repair action,
4243
call `pipeline_status` again. Never show a stale pause prompt when durable state

adapters/codex/agent-merge-queue/.codex-plugin/plugin.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "deploybot",
3-
"version": "0.2.24",
3+
"version": "0.2.25",
44
"description": "Coordinate exact-head pull requests through verified deployment and thread notification",
55
"author": {
66
"name": "DeployBot contributors"

adapters/codex/agent-merge-queue/skills/deploybot/SKILL.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,10 @@ Merge independent ready pull requests back-to-back. Route source-overlap groups
8181
through `deploybot integrate`; when policy mode is `all`, validate the entire
8282
frozen batch through that cumulative PR. Never invent a conflict resolution.
8383
Return the repair packet to its source thread, then run `deploybot resume` after
84-
its new exact head passes. Finish with `deploybot follow --json`, following
85-
newer cumulative base heads until CI, deployment, and configured health checks
86-
verify.
84+
its new exact head passes. Keep release tracking event-driven: in
85+
`release_admission = "merged"` mode, admit independent ready work immediately
86+
after a healthy merge while later events continue CI, deployment, and health
87+
tracking. Scheduled reconciliation is a fallback, not the normal promotion path.
8788

8889
Genuine repair blocks may hold overlapping ready work for the configured bounded
8990
repair window, but they remain merge-ineligible until the trusted source agent
@@ -118,9 +119,10 @@ named thread already owns that failed SHA; wait for that repair and never create
118119
a competing PR. The owner is encoded in the atomic branch ref, so a registry
119120
write failure is recovered by calling the same tool again.
120121

121-
New batches are FIFO-bounded by `integration.max_batch_size`, and a merged batch
122-
closes admission until its cumulative main revision is verified live. Do not
123-
override either boundary for later work. Never execute merged PR code inside
122+
New batches are FIFO-bounded by `integration.max_batch_size`. Honor the configured
123+
release-admission gate: `merged` permits the next independent batch immediately,
124+
while `ci-passed` and `verified` impose stricter release fences. A later observed
125+
release failure pauses future merges in every mode. Never execute merged PR code inside
124126
the privileged coordinator; generated-artifact conflicts go to the elected
125127
repair owner for a normal reviewed rebuild. When PR-authored checks are
126128
required, use a GitHub App installation token, list its bot login in

adapters/codex/agent-merge-queue/skills/manage-merge-queue/SKILL.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,18 @@ Run `deploybot status --json` before a burst and `deploybot react` to coordinate
2727
it. Merge independent ready PRs back-to-back, skip blocked work, honor explicit
2828
dependencies, and use `deploybot integrate` for overlaps or a cumulative batch
2929
gate. Return repair packets to their source thread and run `deploybot resume`
30-
after fresh review. Finish with `deploybot follow --json`; a failed CI or
31-
deployment pauses the pipeline until verified recovery.
30+
after fresh review. In `release_admission = "merged"` mode, admit independent
31+
ready work immediately after merge while later events track CI and deployment;
32+
a later failure pauses the pipeline.
3233

3334
A genuine repair remains merge-ineligible, but DeployBot may temporarily hold
3435
overlapping ready work for the configured bounded repair window so concurrent
3536
merges do not repeatedly invalidate the replacement head.
3637

3738
Before creating an exact-main recovery, run `deploybot claim-release-repair`;
3839
only the returned `owned` thread may use the deterministic repair branch. Respect the
39-
maximum batch size and keep new merges closed while an earlier release is
40-
unfinished.
40+
maximum batch size and the selected `merged`, `ci-passed`, or `verified`
41+
release-admission fence.
4142

4243
Immediately before asking the user to `unpause` or take another repair action,
4344
run `deploybot status --json` again. Never show a stale pause prompt when

0 commit comments

Comments
 (0)