Skip to content

backlog-burndown: cleanup leaves an abandoned group's claim and its pushed remote branch standing #1274

Open

Description

@ptr727

backlog-burndown says its cleanup step exists to stop an abandoned group's worktree holding "a live claim that would collide with the very group the next round re-forms for the same issue". For the ordinary abandoned group, the procedure as written does not reach that outcome.

  • "Cleanup Is the Orchestrator's" covers "the finished ones and the abandoned ones", and gates the abandoned path on "confirm the branch carries no commit that is not already on develop". An abandoned group is by definition one that lost an adjudication after doing work, so any commit it made fails that check, cleanup "stops there", and the worktree plus its live claim stay standing. Nothing says what releases the claim in that case.
  • "with no remote branch to delete where none was pushed" leaves the pushed-abandoned case undisposed. "Grouping and File Claims" explicitly contemplates one ("Where the loser has already opened a pull request, say whether it closes or waits"), and "The Round" step 6 cleans only merged remote branches. The remote branch survives while its claim comment is released, and the next round's "A branch no claim comment covers still has to yield a file set" then reads it as an unknown set that "collides with every group", which is a stop the run inflicts on itself.
  • "the worktree and branch go the same way a merged group's do" points at the git branch -D a merged group uses under git-commit-conventions' narrow post-squash exception, and that exception "never applies to develop, an unmerged branch, an unresolved pull request, or a branch with uncommitted work". An abandoned branch has no merged pull request, so "the same way" points at a forbidden command. git branch -d is what the section's own no-unmerged-commit check licenses, and the section never says so.
  • "its claim comment released" names no action and no actor. Everywhere else the durable record is maintained by writing, and a claim comment cannot be un-posted.
  • "finished" means merged in "The Round" step 6 and work-complete-but-unmerged in "Bounding the Wait on a Worker". Cleaning up on the second sense is the case "Cleanup Is the Orchestrator's" stops on.
  • drive-pr step 4 requires the head SHA be captured before the merge, for the verify-then-delete. This skill's override leaves the merge with the worker and the verify with the orchestrator, so the capture has no owner: nothing tells the worker to report that value or the orchestrator where to read it back.

Raised by the local-strict-review passes on the pull request that added this skill, and deferred there under that skill's own review-round budget.

Activity

  1. added
    proseA defect in rule or procedure text
    on Sep 4, 2026
  2. ptr727 commented on Sep 9, 2026

    @ptr727
    OwnerAuthor

    Carried forward from #1405, closed as a duplicate of this issue. It raised this issue's second and fourth bullets (the pushed-abandoned remote branch left standing, and the claim release naming no action) independently, from a different reviewer: qodo on ptr727/PlexCleaner#954, which carried the Skills tree into that repository and so gave backlog-burndown/SKILL.md its first review by a reviewer that had not seen it before. It was checked against the hub source and holds. Found during the #1399 fleet resync pilot; another instance of #1138.

    It carries a proposed remedy for the pushed-abandoned case that this issue does not, and the reasoning for why the merged path's check cannot simply be reused:

    The merged disposition cannot be borrowed. It verifies the remote tip against the pull request's headRefOid before git push origin --delete. An abandoned group has no merged pull request, so there is no headRefOid to read, which is the same reason the no-merge substitute exists at all. It needs its own remote identity check rather than a borrowed one.

    The local half already states the right test, and it extends to the remote directly. Confirm the remote tip equals the local branch tip, and that the branch carries no commit not already on develop. Both hold and the remote branch is safe to delete on the same evidence the local one is. Either fails and cleanup stops for the maintainer, exactly as the local check already does, since past that point deletion discards work.

    On the claim comment. The dead-worker-re-dispatched path says the claim comment is "released with the worktree". The abandoned path says to update the claim comment when a file set grows, and never says the claim is released when the group is abandoned. A released branch with a standing claim comment defers overlapping groups just as effectively as a standing branch does, so the disposition needs to name the claim release explicitly rather than leave it to be inferred from a neighbouring path.

    Scope. backlog-burndown/SKILL.md owns the fix. qodo also pointed at drive-pr/SKILL.md's post-merge cleanup, which is the merged path and is not implicated: it has a headRefOid and uses it.

  3. ptr727 commented on Oct 17, 2026

    @ptr727
    OwnerAuthor

    Re-measured against develop after #3188. Resolved: the abandoned group's branch is now deleted with git branch -d <exact-branch>, which refuses rather than discards, and a pushed remote branch is reported to the maintainer. The SHA-capture step is moot for a merged group, since pr_review.py cleanup reads headRefOid itself. Still open: "Its claim comment is released" names no action and no actor, and the "finished" ambiguity remains.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    proseA defect in rule or procedure textskillsAgent skill

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions