Plan branches
Try out a sprint reshuffle before your team sees it. A plan branch is a named staging area for planning changes: you switch to the branch, move tasks between sprints and change priorities as usual, and every edit is recorded on the branch instead of changing the live plan. Review the full before / after diff on the Compare page, then merge everything in one click, cherry-pick individual changes, or discard the branch.
What it does
- Stages planning changes without touching the live plan ("main"). Today that covers a task's priority and its sprint membership (adding a task to a sprint, removing it from one).
- A branch is an overlay of staged changes, not a copy of the plan. Creating one is instant and stores nothing but the changes you stage.
- Shows a persistent amber banner while a branch is active, so nobody mistakes staged edits for live ones.
- The Compare page lists every staged change with its on-main and on-branch value side by side, and flags conflicts where main has moved since you staged.
- Merge applies every change that still cleanly applies, in a single transaction, and reports the rest as conflicts instead of silently overwriting a teammate's newer edit.
- Cherry-pick applies a single staged change to main without merging the whole branch.
- Discard drops the branch; nothing lands on main.
- Live updates: when a teammate stages a change on the same branch, merges it, or discards it, your view refreshes on its own.
Branch scope
When you create a branch you pick its scope:
- Workspace-wide: the branch can stage changes on any task in any project you have access to. Useful for a cross-project reshuffle.
- This project only: the branch is bounded to the currently open project. Staging a change on a task outside that project is rejected.
Workspace-wide branches show a small workspace tag in the branch
picker so you can tell the two apart.
Roles
- Creating a branch, staging changes, merging, cherry-picking, and discarding all require the member role (on the workspace, and on the project for a project-scoped branch).
- A guest can view project-scoped branches on projects they belong to, but cannot see workspace-wide branches at all.
Switching branches
The branch picker lives in the sprint detail page header, next to the sprint name. It reads Main when you are on the live plan and turns amber with the branch name when a branch is active. Open it to switch between Main and any open branch, or to create a new one.
Your active branch is remembered per workspace in your browser, so navigating around the app keeps you on the branch until you switch back to Main. Other people are not affected: a branch is only "active" for the people who have selected it.
While a branch is active, an amber banner sits at the top of the sprint page: "Viewing branch: <name>. Changes here are staged, not live on main." The banner carries the three branch actions: Compare, Merge, and Discard.
Staging changes
With a branch active, use the normal editing surfaces:
- Priority: change a task's priority from its priority dropdown, for example in the task detail panel. Instead of updating the task, a "Staged on branch" toast confirms the change was recorded on the branch.
- Sprint membership: in the task detail panel, add the task to a sprint or remove it from one. Again the change stages instead of applying.
Each staged change records the value it saw at staging time as its baseline. That baseline is what makes conflict detection work later.
Everything else you edit while a branch is active (state, assignees, dates, description, and so on) still applies directly to main. See "Current limits" below.
Compare
Click Compare in the banner (or open
/{workspace}/plan-branches/{id}/compare) to see the branch's full
diff. Each staged change is a row with:
- The change type (Priority, Add to sprint, Remove from sprint) and the task it touches.
- On main: the value the branch recorded when you staged.
- On branch: the value the branch wants to apply.
- A Cherry-pick action to apply just that change now.
Rows are flagged in two ways:
- Conflict: main changed since branch snapshot (red): someone edited the same field on main after you staged, so the branch's baseline no longer matches. Merging will skip this change rather than overwrite their edit.
- Already applied to main (green): the change was cherry-picked earlier, or landed in a previous merge.
The page updates live: if a teammate on the same branch stages another change while you are looking, it appears without a refresh.
Merge
Merge (in the banner, or Merge all on the Compare page) applies the branch to main:
- Every pending change is re-checked against main's current value. A change applies only if main still matches the baseline recorded at staging time.
- All changes that cleanly apply land in a single transaction.
- Changes that do not apply are reported as conflicts: either the field drifted on main, or the task was deleted in the meantime.
- The branch closes as merged either way. Merging and discarding are one-way; a merged branch cannot be reopened.
If there were conflicts, the app tells you how many and points you at the Compare page, where the merged branch remains readable as a record. A conflicted change never applies automatically; if you still want it, make that edit on main by hand.
Cherry-pick
On the Compare page, each pending change has a Cherry-pick button that applies just that change to main immediately, using the same baseline check as a merge. The branch stays open, the row flips to "Already applied to main", and the remaining changes are untouched. If main no longer matches the recorded baseline, the cherry-pick reports a conflict and applies nothing.
Discard
Discard (in the banner or on the Compare page) closes the branch without applying anything. The staged changes never land on main, and a discard cannot be undone.
Tutorial: your first plan branch
- Open a sprint: pick a project, open Sprints, and click into a sprint. The branch picker (a branch icon reading Main) sits in the header next to the sprint name.
- Open the branch picker and choose New branch.
- Name it (for example
Q3 Reshuffle), optionally add a description, pick a scope (Workspace-wide or This project only), and click Create branch. The picker turns amber and the branch banner appears: changes are now staged, not live. - Open a task in the sprint and change its priority. A "Staged on branch" toast confirms it was recorded on the branch; the task on main is unchanged.
- In the same task's detail panel, remove it from the sprint (or add it to a different one). That stages too.
- Click Compare in the banner. Each change shows its on-main and on-branch value; any row where main moved underneath you is flagged as a conflict.
- Apply the plan: click Merge to land every change that still cleanly applies, or Cherry-pick a single row to apply just that one. If the reshuffle was a dead end, click Discard instead.
Endpoints
For automation:
GET /workspaces/{slug}/plan-branches/
POST /workspaces/{slug}/plan-branches/
GET /workspaces/{slug}/plan-branches/{id}/
POST /workspaces/{slug}/plan-branches/{id}/ops/
GET /workspaces/{slug}/plan-branches/{id}/compare/
POST /workspaces/{slug}/plan-branches/{id}/merge/
POST /workspaces/{slug}/plan-branches/{id}/ops/{opID}/cherry-pick/
POST /workspaces/{slug}/plan-branches/{id}/discard/
Merge and cherry-pick return the applied change ids plus a conflicts
list, each conflict with a reason (drift or issue missing).
Current limits
- Staging covers priority and sprint membership. Any other edit made while a branch is active (state, assignees, dates, estimates, description) applies directly to main.
- Views do not overlay staged changes. Boards, lists, and sprint views keep showing main's values while you are on a branch; the Compare page is the only place staged changes are visible until you merge.
- One active branch at a time per workspace, per browser. Switching workspaces switches to that workspace's own remembered branch.
- A merge closes the branch even when some changes conflict. Conflicted changes stay listed on the merged branch's Compare page for reference, but have to be redone on main by hand.
- The branch picker currently lives on the sprint detail page. You can stage from the task detail panel while a branch is active, but other pages do not yet offer the picker.
Related
- Monte Carlo forecasts: after merging a reshuffle, the sprint's forecast band recomputes from the new scope.
- Time Machine: complementary direction of travel. A plan branch stages future changes before they land; Time Machine restores a task to a prior day after changes landed.