Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
9fc4962
feat(pr-pipeline): merge lanes App pull requests through native auto-…
kyle-sexton Oct 23, 2026
9f835fd
feat(pr-pipeline): arm Refs lane pull requests on the gate's link rule
kyle-sexton Oct 23, 2026
1747411
ci(pr-merge): log the API budget at the end of the enable-auto-merge job
kyle-sexton Oct 23, 2026
ba920dd
Merge remote-tracking branch 'origin/main' into feat/native-lane-prs
kyle-sexton Oct 23, 2026
676bfd0
feat(pr-pipeline): hold native arming on the gate's demotion, rung an…
kyle-sexton Oct 23, 2026
b2791d0
fix(pr-pipeline): hold a merge group whose pass no longer binds the l…
kyle-sexton Oct 23, 2026
dda84dd
fix(pr-pipeline): hold native arming on the gate's review-lane evidence
kyle-sexton Oct 23, 2026
18a1bba
fix(pr-pipeline): fit the enable-auto-merge job's new reads inside it…
kyle-sexton Oct 23, 2026
f2445dc
perf(pr-merge): read the lane's room from post-merge-dispatch's report
kyle-sexton Oct 23, 2026
7f9526c
fix(pr-pipeline): disarm armed lane pull requests when the lane's roo…
kyle-sexton Oct 23, 2026
c01ed41
Merge branch 'main' into feat/native-lane-prs
kyle-sexton Oct 23, 2026
62c6679
fix(pr-pipeline): hold the lane's room on a post-merge report the gat…
kyle-sexton Oct 23, 2026
a553dfc
Merge remote-tracking branch 'origin/main' into feat/native-lane-prs
kyle-sexton Oct 23, 2026
10c0940
fix(pr-pipeline): hold native lane merges on the gate's risk score an…
kyle-sexton Oct 23, 2026
39d1971
Merge remote-tracking branch 'origin/main' into feat/native-lane-prs
kyle-sexton Oct 23, 2026
2948665
fix(pr-pipeline): give enable-auto-merge read access to the demotion …
kyle-sexton Oct 23, 2026
d3c8064
fix(pr-pipeline): reuse the post-merge report only where the gate would
kyle-sexton Oct 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions .changes/pr-pipeline/feat-native-lane-refs-arm-5c2e81a4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
bump: minor
---

### Changed

- The `enable-auto-merge` activity arms a lanes App pull request whose issue link the merge gate takes, a plain `Refs: #<n>` issue included, instead of only one whose body opens with `Closes #<issue>`. The link is read with the verdict, through the gate's own rule (`babysit_verify_evidence.py evidence --lane-link`, which runs `babysit_merge_policy._linked_issue`), on the scheduled and hand-started runs only: two or more `Refs:` issues, a `Refs:` line in any other form, a number that is no issue, two closing issues, a closing issue in another repository, and a failed read all leave the pull request unarmed, or disarm it. An event run reads no link, so it never disarms on one.
- The `enable-auto-merge` activity applies the merge gate's run-level refusals, which native auto-merge would otherwise skip. Each scheduled or hand-started run waits for the same run's `post-merge-dispatch` job, which keeps its post-merge report as a one-day artifact, and reads the lane's room from that report (`babysit_verify_evidence.py lane-room`, `babysit_merge_policy.lane_room`). While a demotion record, `merge.rung`, the loop setting or the rung cap holds the lane off, or a lane merge failed its post-merge check, nothing is armed and every armed lanes App pull request is disarmed. At `merge.max-in-flight`, counting the queue's lane entries, the lane's unverified merges and armed pull requests not yet queued, nothing more is armed. A missing report, one the gate would not reuse (`shared_refusal`: older than 30 minutes, as a re-run job reads the run's first report, a demotion record filed or changed since, or a lane merge landed since that it does not count), or a room that cannot be read, holds as a refusal does: nothing is armed and every armed lanes App pull request is disarmed. The report is read whenever `post-merge-dispatch` ran, so a later step of that job failing does not disarm anything. The job now holds `pull-requests: read` for the merge-queue and merge reads.
- In the merge queue, `ci-status` holds a lanes App pull request whose verifier pass no longer binds its live issue link. It reads the counted pass's `verdict.json` (one artifact download) and the closing issues (one GraphQL read), and `merge-holds.mjs` `linkHold` holds unless the body still closes, or with no closing issue still names by a plain `Refs:` line, the one issue the pass judged, linked the same way. This is pr-merge's reader rule (`verify:spec-changed`), so a body edited after arming, such as `Refs: #A` to `Closes #B`, no longer merges on a pass for the old issue. A trusted approval of the head lifts it, as it lifts the verifier hold. `refsIssue` moves to `merge-holds.mjs`, which `resolve-pr.mjs` re-exports.
- `enable-auto-merge` holds a lanes App pull request on the merge gate's risk score: `evidence --lane-reviews` runs `babysit_risk.score` and `holding` over the inputs the gate builds, at the lane room's effective rung. Each of these leaves it unarmed or disarms it: an open CRITICAL security-lane finding or a review not bound to the head (whether or not the lane applied its hold label), a symlink, submodule or other non-regular mode, a high path, the manifest review, the trust gate, and the cost review unless the owner's decision lifts it. The job now also holds `checks: read` for the lanes' annotations.
- `ci-status` fails a lanes App pull request while the lanes kill switch (`CLAUDE_LANES_DISABLED` or `CLAUDE_LANES_REPO_DISABLED`) reads anything but `false`, so one armed before the switch was turned on stops in the merge queue. It reads the vars context and makes no API call. Owner and Dependabot pull requests are not affected.
9 changes: 9 additions & 0 deletions .changes/source-control/feat-native-lane-refs-arm-7d1f3b96.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
bump: minor
---

### Added

- `babysit_verify_evidence.py evidence --lane-link` first reads the pull request's issue link by the pr-merge lane's own rule (`babysit_merge_policy._linked_issue`: one closing issue in this repository, or, with none, the one issue its plain `Refs:` lines name) and adds `ineligible` to its line: null when the lane takes the link, else why not, with refusal `verify:ineligible` and no verdict or config read. A failed read refuses. The verdict read that follows takes the link read's pull request instead of reading it again.
- `babysit_verify_evidence.py lane-room` prints whether the pr-merge lane may merge one more of its own pull requests now (`babysit_merge_policy.lane_room`): the gate's run-level refusals (another authority, a post-merge refusal, the effective rung off, a demotion included) as `refusal`, a failed read, or a post-merge answer the gate would not reuse for its age or a changed demotion record (`shared_refusal`'s checks), as `unreadable`, and otherwise the merges in flight against `merge.max-in-flight`. `InFlight` now carries that count.
- `babysit_verify_evidence.py evidence --lane-reviews --base-sha <sha> --rung <rung>` adds `reviews` to a line whose refusal is null: null when the gate would not hold the pull request on its risk score (`lane_risk_refusal`: `babysit_risk.score` and `holding` over the inputs `babysit_merge.score_unattended` builds for a lane pull request, the cost decision included), else why. A failed read, a moved head, or no rung holds. `lane-room` reports the effective rung as `rung`.
Loading
Loading