Development record
A release reservation (abcd reserve rel-vX.Y.Z) holds only merges armed after it: a pull request whose auto-merge was already on, or that already sat in the merge queue, still merges into the default branch mid-cut, from any copy or account, a running drain's included. Today the cutting session has to list and rule on those by hand right after reserving and again before merging the release pull request (commands/reserve.md, /abcd:launch 'Before step 1'), a manual step that is easy to miss on an every-other-day cadence.
issueresolvedminoriss-2610222014550692
A release reservation (abcd reserve rel-vX.Y.Z) holds only merges armed after it: a pull request whose auto-merge was already on, or that already sat in the merge queue, still merges into the default branch mid-cut, from any copy or account, a running drain's included. Today the cutting session has to list and rule on those by hand right after reserving and again before merging the release pull request (commands/reserve.md, /abcd:launch 'Before step 1'), a manual step that is easy to miss on an every-other-day cadence.
Frontmatter
| id | iss-2610222014550692 |
|---|---|
| type | issue |
| lifecycle | resolved |
| severity | minor |
.abcd/work/issues/resolved/iss-2610222014550692-a-release-reservation-abcd-reserve.md
open on GitHub ↗ · commit history ↗
mentions8
- dcn-26102222192895252026-10-22 — A release reservation withdraws every merge already armed or queued on the default branch, and the cutting session keeps one in only by re-arming it with abcd reserve rel-vX.Y.Z --admit <pr>, which records it as admitted (iss-2610222014550692, choice 1A over a --keep list given at reserve time). Grounds: the cut then starts from a frozen branch and every merge into it is a recorded act; a keep list asks for the ruling before the cutter has seen what is armed, and a forgotten keep is a lost merge. Decided by the coordinating session on the product thinker's delegation while the product thinker is away, on the technical facilitator's recommendation.
- dcn-26102222192974872026-10-22 — A withdrawn merge is re-armed in the form it was taken from (auto-merge with its merge method, or a merge-queue entry), pinned with expectedHeadOid to the head it had when withdrawn; one whose head moved, or that was closed or merged meanwhile, is skipped and named on the tombstone and in peers for its owner to re-arm (iss-2610222014550692, choice 3A over re-arming the current head). Grounds: the re-arm then merges exactly the commits its author armed, never commits pushed while the cut held the branch that nobody armed. Decided by the coordinating session on the product thinker's delegation while the product thinker is away, on the technical facilitator's recommendation.
- dcn-26102222192976512026-10-22 — Withdrawn merges are re-armed by the cutting copy when it ends the release reservation (on --release, or on its next abcd act once the tag is on origin), and as a fallback by any copy whose holder is the same person as the reservation's Abcd-Holder, on any machine or account of theirs, when its reservation fetch sees an ended release with withdrawals not yet re-armed; it writes a tombstone, and re-arming is idempotent. A copy of another person never re-arms: it reports the stranded withdrawals on its peers line and in a tombstone note naming the holder (iss-2610222014550692, choice 2A as amended). Grounds: a cut that dies mid-way, as on 2026-10-18, would otherwise strand every withdrawn pull request with nothing pointing at it; and re-arming runs under the re-armer's own GitHub identity, so a second contributor's machine would otherwise arm someone else's pull requests in its own name. Decided by the coordinating session on the product thinker's delegation while the product thinker is away, amending the technical facilitator's recommendation.
- dcn-26102305214884022026-10-23 — Release hold, reading of Q1 (facilitator on delegation, iss-2610222014550692 round 3; reads dcn-2610230328220298): after the tag, or any tombstone, each withdrawal is re-armed by a copy of the person who recorded it (its By, the holder of the reservation commit that first recorded it, as the branch's history and the forge's record of pushes show), not by the reservation's current Abcd-Holder. Grounds: under the letter of Q1, another person's take-over followed by their --release would leave the first holder's withdrawals with nobody able to re-arm them, since a re-arm runs under the re-armer's own GitHub account and only the withdrawer's own copies re-arm. The tag sweep's every-act scope is unchanged.
- dcn-26102308333679842026-10-23 — Release hold (iss-2610222014550692), round 5, ruled by the coordinating facilitator on delegation while the product thinker is away. A person admitting a pull request that another person withdrew, after taking over their release, is refused, with the reason and the remedy named: the withdrawer admits it, or takes the release over themselves. This matches the rule that another person's copy never re-arms, and a refusal can be relaxed later, where an arm made across accounts cannot be undone. Every real disarm abcd makes gets a comment, including a first withdrawal made on a retry and a second one after the owner re-armed by hand. The comment sentences are fixed: re-armed reads 'abcd release hold: the merge of #N is re-armed; the hold for release vX has ended.'; already armed reads 'abcd release hold: the merge of #N is armed; the hold for release vX has ended.'; not re-armed reads 'abcd release hold: the merge of #N is not re-armed; the hold for release vX has ended.' followed by one clause: head moved 'Its head changed while it was held, so its owner needs to re-arm it.', no merge queue 'It can merge now and there is no merge queue, so its owner can merge it.', refused 'GitHub refused to re-arm it five times, so its owner needs to re-arm it.', closed 'It was closed.', merged 'It was merged.'. Any other state posts nothing, and neither does a mismatched node id or a partial withdrawal. The withdrawn and admitted sentences are unchanged. The pull request lists every sentence so the product thinker can review the posted wording before the first real cut posts it. A change to a withdrawal's state counts only when the withdrawer's own push carried it, and a tombstone ends the hold only when the holder pushed it; anything else is reported and not acted on.
- dcn-26102309282719392026-10-23 — The finding in iss-2610230927379322 is deferred out of the release-hold change (iss-2610222014550692), ruled by the coordinating facilitator on delegation while the product thinker is away: the merge hold that abcd land respects still reads any tombstone on a release reservation as the release's end, whoever pushed it, so land and the launch check can disagree about one release. Reason: the land hold already ends when its lease lapses, so it is a time-boxed courtesy; the withdrawal the release-hold change adds is what keeps merges out; and a change to every land check deserves its own review. The same session fixes it as its first work once the release-hold pull request lands, not at a later date.
- dcn-26102310335162932026-10-23 — Release hold (iss-2610222014550692), round 6, ruled by the coordinating facilitator on delegation while the product thinker is away. A person's record on a release reservation is the newest commit the forge's record of pushes shows that person pushed. Commits above it that another login pushed are never read: they are reported, by count and pusher, to the cutter and on peers. If that person's newest push cannot be found or placed, abcd acts on nothing for them (no re-arm, no withdrawal, no admission), names why on a line the cutter sees, and peers shows the same. A renewal over a later commit renews from the person's own newest commit, keeping what it records, admissions included, and the lost-withdrawal window never applies to a person's own record. Rejected alternative: checking each later change entry by entry, which five review rounds showed has to be extended for each new shape of later commit: one entry dropped and re-added as settled, two changes in a row, a change beneath an unreadable commit, a change beneath more commits than the walk reads, a tombstone dated outside the window, and a renewal over another login's tombstone. One rule covers all six, and honest use is unchanged, because a person's own record is always their newest push. The admit refusal's remedy reads: the withdrawer takes the release back with --take-over and admits it; a test runs that remedy end to end.
- iss-2610222359046244abcd build (and abcd reserve) refuses a reservation by naming only the first footprint path that overlaps a live reservation, so a build whose footprint collides with several reservations is refused once per collision: on 2026-10-22/23 the merge gate's build (itd-2610150602547271) was refused in turn on internal/core/implement/loop/land.go (iss-2610120138028442), internal/surface/cli/cli.go (iss-2610171110154902; a second reservation, for an issue filed on the unmerged fix/autonomous-permission-ask-denied branch, held it too, unnamed) and internal/core/landing/config.go (iss-2610222014550692, a directory footprint), each discovered only after the previous one was routed round. <!-- record-lint: forward-looking -->