Repository navigation
Description
Tracker for .agents/skills/merge-and-release/SKILL.md. Filed under #1315's roll-up of the open prose backlog: every finding a bundle issue enumerated against this unit is listed here once, one line each, naming the issue it came from, and the bundle is closed as a duplicate of this tracker so the finding is not lost and the bundle stops being a unit of work. A new pre-existing finding on this unit gathers here per pr-review-conduct's Merge Gate, numbering continuing this list. This tracker closes when the unit is rewritten and each line below is settled or superseded.
-
Post-merge cleanup reads the remote tip, then deletes remote and local branches in separate unconditional steps, so a push between the read and the delete is not caught by either delete. (drive-pr and merge-and-release branch cleanup is not compare-and-delete #943)
-
Two git fetch origin main steps have no stated behavior on fetch failure, so a later step can read a stale releaseTrigger or install stale hub Skills from whatever origin/main last resolved to. (5 carried-skill defects surfaced by a downstream PR review (shell-codestyle, repo-worktree, standup-a-repo, merge-and-release) #1089)
-
Step 6's run-correlation polling says to poll 'within a bounded interval' with no duration, cadence or attempt limit, so a missing or delayed run has no timeout distinct from its eventual conclusion. (5 carried-skill defects surfaced by a downstream PR review (shell-codestyle, repo-worktree, standup-a-repo, merge-and-release) #1089)
-
Both skills capture headRefOid before merging but their gh pr merge invocations do not pass it, so a branch changed after the Merge Gate check can merge with a head other than the one reviewed. (7 more carried-content defects from a downstream PR review (merge-and-release, python-codestyle, GOVERNANCE.md, WORKFLOW.md) #1092)
-
No stated behavior for an invalid releaseTrigger: the rule dispatches publish-release.yml for every value except none, so null, empty or unsupported still triggers a dispatch instead of stopping. (7 more carried-content defects from a downstream PR review (merge-and-release, python-codestyle, GOVERNANCE.md, WORKFLOW.md) #1092)
-
The run-correlation phase requires a bounded gh run list interval but names no duration or poll count, so a run that never appears has no defined exit. (19 Carried-Content Defects From Downstream PR Reviews (guard, resync, drive-pr, git-commit, pr-review, promotion recipe, AUDIT.md, GOVERNANCE.md, merge-bot stub) #1113)
-
Already filed (5 carried-skill defects surfaced by a downstream PR review (shell-codestyle, repo-worktree, standup-a-repo, merge-and-release) #1089 f5), confirmed again: run-discovery polling states neither a maximum duration nor an interval. (6 carried-content defects from a downstream PR review (dotnet/python-codestyle, local-strict-review, operational-vs-release-workflow) #1121)
-
A missing releaseTrigger makes the jq return null and step 5 dispatches for every value except none, so it fails open on null and on a typo. (CodeRabbit findings against the carried skills tree, raised on a downstream carry #1131)
-
The headRefOid check and the subsequent git branch -D / git push origin --delete are not a compare-and-swap, so the tip can move between them. (CodeRabbit findings against the carried skills tree, raised on a downstream carry #1131)
-
Step 5's
git show | jqpipeline sets nopipefailand captures the two stages together, so agit showfailure hands jq empty stdin and the command exits 0 with empty output, the outcome the same sentence forbids. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
Step 8's worktree sweep names no property distinguishing a drive-pr branch from any other merged-to-
developbranch, so another live task's deliberately kept branch and worktree pass every check and aregit worktree removed andgit branch -D'd. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
gh pr merge [number]brackets a placeholder every other command angle-brackets, and gh resolves an omitted number to the current branch's PR, so the optional reading merges a different PR rather than erroring. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
Step 7's
git checkout mainnames no checkout, and "this checkout" is unresolved against step 5's hub checkout and the session's own tree, so following it in the session tree switches that tree off its branch. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
Step 6 matches a run on
createdAtagainst the dispatch time, which no earlier step records. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
Step 6 names no bounded-wait mechanism for the two hosts it says must be covered, macOS without coreutils and native Windows. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477)
-
Step 2 requires a hub checkout and never says how to obtain one, in the very clause addressing a reader in a downstream repo. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477)
-
Step 2 invokes
scripts/pr_review.pybare where step 7 usespython3, which fails on native Windows, a host step 6 names as one the procedure must run on. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
Step 8's first bullet prescribes actions with no command form and presumes a promotion worktree exists, where step 1 stops and reports for its analogous case. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477)
-
Step 7's "confirm
--reportnow reads current" names a stringskills_install.pynever emits, and the first--reportis expected to exit 1, which a reader treating non-zero as failure stops on. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477, wording depends on skills_install.py --report Reads Stale After a Correct merge-and-release, Because It Compares Commit Identity Rather Than Skill Content #1400) -
Step 7's stated reason for
checkoutoverswitch, that the fleet's git floor is undeclared, is false againstdocs/host-setup.md, which declares it asnone. The conclusion survives, the premise does not. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
Step 8's
headRepositoryrationale describes a different-repository PR that a repo-scopedgh pr listcannot return; what the field actually rejects is a fork head. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
The Skills preflight's pathspecs are cwd-relative with no
git -Cand no stated root, so run from a subdirectory it prints nothing and passes vacuously however dirty those paths are. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
Step 7 verifies the install stamp against
mainwhile step 8 fast-forwards the same clone todevelop, so in the hub step 8 invalidates step 7's confirmation by design. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477, wording depends on skills_install.py --report Reads Stale After a Correct merge-and-release, Because It Compares Commit Identity Rather Than Skill Content #1400) -
Step 6's closing instruction reports "the tag or version it produced", which the
gh run watch --exit-statusit supplies does not report. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
--ref developis stated unconditionally, and KiCadLibrary's publisher fails fast on a dispatch from a non-default branch, producing a failed run rather than a prerelease. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477, removed by Migrate MediaTools to the plan-job publisher so its registry entry records reality #1478) -
Step 6's mid-dispatch ref-change report fires on the ordinary case:
gh run listreturns history, so every poll before the new run registers has the shape "list non-empty, nothing matches", during the window the preceding sentence says to keep polling through. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
Step 6's
developcorrelation value names no source and no moment, so a localgit rev-parse developlagging origin yields a non-matchingheadShaand, per line 26, a false ref-change report. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
The Skills preflight is scoped to two paths while the
git checkout mainandgit merge --ff-onlyit guards are whole-tree, so a modified tracked file elsewhere passes it and then rides across the branch switch or aborts the checkout. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
Step 5's
<repo-name>is never defined and is not theowner/repospelling the surrounding commands use. It must be the registry's case-sensitive.name, and another spelling takes the deliberate error path and halts the step for a repository that is fine. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
The quoting-safety rule binds "every placeholder below" while the placeholders it must govern appear above it in the same bullet. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477)
-
Step 8's exactly-one
gh pr list --headguard aborts on the case the same bullet calls normal and expected, and the query carries no--base, so thebaseRefNamecheck it prescribes is unreachable whenever it would matter. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
The
--exit-code2 diagnosis, an interrupted run that deleted the remote before the local, is backwards for the only cleanup path the unit defines, which deletes local first and remote last. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
The remote and local tip-match preconditions state no disposition when a tip does not match, in a unit that spells out "stop and report rather than guessing" for every other inconclusive case. Distinct from line 9, which covers the race rather than what to do when the check fails. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477, see Decide whether merge-and-release's branch cleanup should use compare-and-delete #946)
-
Step 4 confirms the merge with no command, no source for the merge commit's SHA, and no fetch before it, so it fails on a merge that did land. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477)
-
Step 1's "identify the open develop -> main promotion PR" gives no command, in a unit that legislates exactly-one selection and fail-loud-on-a-non-1-count twice elsewhere. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477)
-
Step 6 carries no "when the chosen scope includes a release" guard of its own, so a merge-only run polls for a dispatch nobody made and ends in its bounded-interval stop as though a release had failed. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477)
-
"Stop and report" carries two different outcomes in one unit: step 2's ends the procedure, step 8 says steps 5 through 7's do not, and step 7's preflight stop is absent from that enumeration. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477)
-
Step 6's concurrent-run warning names a different-event collision that its own
--event workflow_dispatchfilter already excludes; the collision that produces more than one candidate is a second dispatch run on the same branch. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
git worktree removeis prescribed without--, alone among the unit's commands, though it supports it and the unit states an explicit exception only forgit rev-parse. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477) -
Step 8's sweep and step 4's tip check run against a clone of the target repository that the unit never establishes; for any non-hub target,
originin the one checkout it does establish is the hub. (merge-and-release's Procedure section holds 33 verified defects across four whole-unit passes #1477, see Decide whether merge-and-release's branch cleanup should use compare-and-delete #946 question 3)
Provenance of lines 10-40
Four whole-unit passes read this unit at four digests during #1476, which touched one sentence of step 5. All 33 findings they raised were pre-existing, none introduced by that change, and 31 of them are listed above.
Two were dropped as already tracked, and are re-confirmed rather than re-listed. The // fallback resolving to null and routing into a dispatch is lines 5 and 8. The unspecified polling bound is lines 3, 6 and 7. That one defect now has three lines and a fourth confirmation, which is itself the argument for settling the unit rather than continuing to record it.
What the distribution says. Each pass found roughly ten findings the previous had not, at four different digests of the same text. The failures cluster into four classes rather than scattering: a selection the unit does not legislate (lines 35, 29), a precondition with no stated disposition (33, 37), a checkout with no antecedent (13, 16, 40, and the mechanism behind 22 and 28), and a rationale sentence that has drifted from the command beside it (20, 21, 24, 26, 32, 38). Fixing the classes is what stops the next pass finding ten more, which is why this tracker's closing condition is a rewrite rather than a patch series.
Three lines need a decision before any wording can be written, beyond those already waiting on #946, #1400 and #1478: line 11 (nothing identifies a drive-pr branch, and the sweep destroys work when it is wrong), line 28 (the preflight's two-path scope is deliberate and justified in the text, so widening it is a design change rather than a correction), and line 37 (whether step 7's preflight stop ends the procedure is genuinely unresolved).
Activity
[-]Tracker: `.agents/skills/merge-and-release/SKILL.md`[/-][+]Tracker: `.agents/skills/merge-and-release/SKILL.md > The Procedure`[/+]ptr727 commentedon Oct 23, 2026
Closed under the maintainer's decision (ptr727, 2026-10-23) on #3391: the backlog keeps real bugs with a stated failure, features the maintainer wants, and open decisions. A finding the review loop filed on code or text a change did not touch, a refactor or consolidation chore, a tracker, a wording item, or a guard shape no session has produced is closed rather than worked. Reopen with the input and the wrong result if this issue states one.