Scheduling ========== The dependency graph drives execution ------------------------------------- Milestones, epics and tickets are nodes; ``blocks`` dependencies are edges, at any level (a ticket can block a milestone, a milestone can block a ticket). A ticket is **runnable** when it is in state ``ready`` and every item that blocks it is resolved — ``done``, or ``cancelled`` so that abandoned work never stalls its dependents. Ballet rejects any ``blocks`` edge that would create a cycle. Each dependency change also bumps the project's graph version, so two concurrent additions cannot jointly create a cycle: the second one is re-validated against the updated graph. Dependencies are limited to items of the same project for now. The scheduler keeps a ready queue and starts runs up to the configured concurrency limits (globally, per organization, per project). Anything ready runs in parallel; nothing starts before its prerequisites. The Gantt chart is a forecast ----------------------------- The Gantt chart is the primary human view of a project, computed from the same graph: - **lanes** show which work can proceed in parallel; - **sync points** are milestones and other join nodes where parallel work must converge; - the **critical path** shows which tickets determine the end date; - durations come from estimates first, then from historical run durations of similar tickets. Changing the plan (adding a dependency, re-ordering, splitting a ticket) changes the forecast immediately. The Gantt chart never triggers work by itself — the graph and the ready queue do. This keeps execution correct even when estimates are wrong. Sync points ----------- At a milestone, Ballet can require a human gate before dependent work starts — a natural moment for the human and planner to review direction, update documentation and re-plan.