How the dependency graph works
Topolog represents your goal as a directed acyclic graph (DAG: the technical name for a graph with no cycles, where every edge points one direction). Nodes are milestones or tasks. Edges express ordering: what must finish before what.

Three node types
- Milestone: a non-atomic node. Status derived from its descendant tasks. Never scheduled directly.
- Task (user): atomic, 1–4 hours, scheduled into your calendar.
- Task (external): a third party gates the work. Tracked, but never consumes your hours.
Status propagation
Status is computed, not stored, except done, which is explicit. A task is active when every incoming edge's source is done; otherwise blocked. A milestone is active if any descendant task is active.
Milestone-edge expansion
The scheduler only understands task→task edges. Before scheduling, Topolog expands milestone-edges into the cross-product of source and target task descendants. The original DAG is never mutated.
Cycles
Cycles are blocked at edge-add time with a brief shake animation and no state change. The DAG invariant is maintained at every moment; there's never a "saved" cyclic state.