Skip to content

Branch naming

autoducks uses a predictable, issue-number-rooted branch naming convention. Every branch traces back to its source issue, and the prefix encodes the issue kind: Features get feature/…, Bugs get fix/….

ContextPatternExample
Feature pipeline branchfeature/{id}-{slug}feature/42-user-auth
Bug pipeline branchfix/{id}-{slug}fix/57-login-crash
Task under a pipeline branch{feature|fix}/{parent_id}-issue-{task_id}-{timestamp}feature/42-issue-43-1751941200
Fix-agent retry branch{feature|fix}/{parent_id}-issue-{task_id}-fix-{timestamp}feature/42-issue-43-fix-1751943000

Task branches inherit the prefix of the pipeline branch they’re cut from. The fix-agent -fix-{timestamp} suffix is unrelated to the fix/ prefix — the former marks a retry attempt, the latter marks a Bug pipeline.

The Maestro’s PR-merged advancement trigger listens on both feature/* and fix/*.

Slugs are generated from the issue title: lowercase, non-alphanumerics to hyphens, collapsed, truncated to 50 characters.

"Add dark mode toggle to settings"feature/42-add-dark-mode-toggle-to-settings

  • Multiple execution attempts never collide.
  • The Fix agent locates partial work from prior attempts via prefix matching (newest wins).
  • Each branch identifies which attempt it belongs to.
main (base_branch)
└── feature/42-my-feature ← pipeline branch (draft PR → integration_branch, human review)
├── feature/42-issue-43-... ← task 1 branch (PR → pipeline branch, auto-merge)
├── feature/42-issue-44-... ← task 2 branch (PR → pipeline branch, auto-merge)
└── feature/42-issue-45-... ← task 3 branch (PR → pipeline branch, auto-merge)

For Bugs, replace feature/42-… with fix/57-… — the shape is identical.

Branch typeCreated byDeleted by
Pipeline branchMaestroClose agent (/close)
Task branchDeveloperMerge policy (GitHub auto-deletes on PR merge)
Fix retry branchFix agentMerge policy

Pipeline branches are not auto-deleted when the final PR merges — GitHub’s delete-on-merge policy handles task and fix branches.