The ticket DAG
The tickets a projectgenerates aren't a flat to-do list — they form a dependency graph. Some tickets can't start until others finish. Leroy tracks those relationships, works whatever is unblocked, and integrates the results on a shared branch as the project takes shape.
01 Tickets as a graph
A project's tickets are a DAG— a directed acyclic graph. "Directed" because dependencies point one way (A must finish before B starts); "acyclic" because nothing can end up waiting on itself. In practice that just means the work has an order: some tickets are foundations, others build on top of them.
Illustrative only — a real project's graph can branch and merge, with several tickets unblocked at once.
02 Blockers
A blocker is a dependency edge: ticket B is blocked by ticket A when A has to land first. A ticket can have several blockers, and it stays blocked until all of them clear. Tickets with no remaining blockers are ready.
03 How Leroy schedules
Leroy walks the graph rather than the list. It works the tickets that are ready, and the moment a ticket lands, any ticket that was blocked only by it becomes ready and gets picked up next. Independent branches of the graph can move in parallel.
- Start with the roots. Tickets that have no blockers are eligible immediately.
- A blocker clears. When a ticket finishes, Leroy re-checks everything that depended on it.
- Newly-ready tickets move. Any ticket whose last blocker just cleared becomes ready and gets scheduled.
- Repeat until the graph drains. The project completes when every ticket has landed.
04 The shared branch
A project's tickets converge on a shared integration branch instead of merging straight to your default branch one at a time. As each ticket ships, its work integrates there, so downstream tickets build on top of the real, combined state — not on a stale base. The project lands as a coherent whole rather than a scatter of independent merges.
Which branch a given ticket builds on follows the base-branch precedence described in the Projects overview: the ticket's own base branch, then the project's, then the repo default.