Milestones and goals
Use a milestone when a set of work has a date or a purpose of its own: a beta, a release, the end of a quarter. A milestone gathers epics and tickets from anywhere in the tree without moving them, gives them an order, a target date and a goal, and tells you how far along it is and whether the goal is met.
The example turns the password reset epic from Plans become tickets (APP-1) and the flaky test filed on The pickup queue (APP-10) into an "Account recovery beta" due on 30 October.
1. Turn milestones on
Milestones are a kind of ticket, and a new workspace does not have the kind yet. Add it once:
staple kinds add milestone --label Milestone
2. Create the milestone with its goal
The goal is a list of criteria: what must be true for the milestone to count as
reached. --from-epic makes an epic its first member. --preview shows what would
happen and writes nothing:
staple milestone new "Account recovery beta" --from-epic APP-1 --target 2026-10-30 \
--criteria "A user can reset a forgotten password from the email link;Reset tokens expire after 30 minutes;The user guide documents the flow" \
--preview
would create Account recovery beta (milestone, target 2026-10-30)
+ member APP-1 at 1
hierarchy changes: none
Run it again without --preview to create it (MCP create_milestone). It becomes
APP-11. Dates are calendar days in UTC; --start sets an optional start day, and
staple milestone set changes dates and criteria later.
3. Add work from anywhere
staple milestone add APP-11 APP-10 # MCP add_milestone_member
staple milestone mv APP-10 --at 1 # first in line: MCP move_milestone_member
Joining a milestone changes nothing about a ticket: it keeps its epic, its
dependencies and its status. The epic's tickets come along with it, and tickets you add
to the epic later join the milestone too. A ticket belongs directly to at most one
milestone; staple milestone mv <ref> --to <milestone> moves it to another.
4. Put it in the queue
staple queue add APP-11 --at 1
A milestone in the pickup queue takes one place and expands to its members in the order you gave them. Reorder the members and agents feel it on their next ask.
5. Mark each criterion with evidence
staple never decides on its own that a criterion is met. An agent or a person marks it
and says why (MCP mark_milestone_criterion):
staple milestone criterion APP-11 2 --met --evidence APP-2 -m "The expiry test passes"
staple milestone criterion APP-11 3 --met --evidence APP-5
Evidence is a ticket (APP-2), a document on a ticket (APP-2:plan) or plain text.
A ticket counts only while it is done, so a mark made early waits for the work (below).
If that ticket is reopened, the criterion reads unknown until it is done again. If
the criterion is reworded, mark it again. Use --unmet with a note to record what is
missing.
6. See where it stands
staple milestone show APP-11 # MCP get_milestone
APP-11 · Account recovery beta
state active · status backlog · target 2026-10-30 · start none · revision 3
progress 2/6 33% · 6 leaves
pace no_estimate: 2/6 leaves done; nothing open is estimated, 31 day(s) to 2026-10-30. (labor 2h, remaining —, partly planned)
goal 1/3 met
1. unknown A user can reset a forgotten password from the email link
2. met Reset tokens expire after 30 minutes [APP-2]
3. unknown The user guide documents the flow [APP-5] (marked met, but its evidence does not hold yet: APP-5 is backlog, not done)
members
1. APP-10 backlog Login test is flaky on CI · bug
2. APP-1 backlog Password reset · epic
next APP-10 (member 1)
- progress counts the tickets that do the work, each once; epics are not counted on top of their tickets, and cancelled work leaves the count.
- pace compares the open work's estimates with the days left. Estimate the open
tickets to get
on_trackorbehindinstead ofno_estimate. - state is
planned,active,overdue(the day after the target),doneorcancelled. - next is the ticket an agent would take first inside this milestone.
staple milestone ls lists every open milestone on one line each. In the web UI, the
Milestones view shows the same, and a milestone's detail shows the goal with its
evidence.
7. Sign it off
A milestone closes itself when the last of its work is done, the way an epic does. To sign it off yourself first, gate it:
staple gate APP-11 --owner VP
The gate holds the milestone's close until you approve it. Unlike a gate on an epic, it does not hold the members: agents keep working them.
Leave this step out if you plan an autopilot goal run over the milestone: the run opens its own gate for you. A gate you open yourself stops a goal run; approve it, then start a new run.
Next
- Autopilot runs: let an agent work the milestone until its goal is met.
- The pickup queue: how milestones and epics share one order.