The publisher creates <task>/milestone-<n> only at publish time (publish.py, checkout_new_branch from the current HEAD). Until then the executor works on whatever is checked out, normally main. On the live run the executor committed its work itself, so the commit landed on local main, and the milestone branch was cut from there afterwards. Local main then diverges from origin/main, and a later milestone's branch is cut from wherever HEAD happens to be.
Expected: check out a fresh milestone branch from origin/<base> when a milestone starts executing, so all work, committed or not, lands on it and local main stays equal to the remote. Publishing then only commits any leftovers, pushes, and opens the PR.
Test: start a milestone, have the fake executor commit, and check that the commit is on the milestone branch and not on main.
Found on the first live end-to-end run.
The publisher creates `<task>/milestone-<n>` only at publish time (`publish.py`, `checkout_new_branch` from the current HEAD). Until then the executor works on whatever is checked out, normally `main`. On the live run the executor committed its work itself, so the commit landed on local `main`, and the milestone branch was cut from there afterwards. Local `main` then diverges from `origin/main`, and a later milestone's branch is cut from wherever HEAD happens to be.
**Expected:** check out a fresh milestone branch from `origin/<base>` when a milestone starts executing, so all work, committed or not, lands on it and local `main` stays equal to the remote. Publishing then only commits any leftovers, pushes, and opens the PR.
**Test:** start a milestone, have the fake executor commit, and check that the commit is on the milestone branch and not on `main`.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Found on the first live end-to-end run.
The publisher creates
<task>/milestone-<n>only at publish time (publish.py,checkout_new_branchfrom the current HEAD). Until then the executor works on whatever is checked out, normallymain. On the live run the executor committed its work itself, so the commit landed on localmain, and the milestone branch was cut from there afterwards. Localmainthen diverges fromorigin/main, and a later milestone's branch is cut from wherever HEAD happens to be.Expected: check out a fresh milestone branch from
origin/<base>when a milestone starts executing, so all work, committed or not, lands on it and localmainstays equal to the remote. Publishing then only commits any leftovers, pushes, and opens the PR.Test: start a milestone, have the fake executor commit, and check that the commit is on the milestone branch and not on
main.🤖 Generated with Claude Code