How cycles are prevented
Tree refuses to create cycles in the project graph. The constraint is enforced at the data model level, before any operation takes effect.
Tree refuses to create cycles in the project graph. The constraint is enforced at the data model level: any operation that would result in a node depending on itself, directly or transitively, is blocked before it takes effect.
What a cycle would mean
A cycle would mean that task A depends on task B, and task B depends on task A (directly), or task A depends on task B which depends on task C which depends on task A (transitively).
In either case, no node in the cycle can ever become available, since each one is waiting for another node in the cycle to complete. Cycles produce permanent locks with no resolution.
When the check runs
The check runs whenever a new edge is added or an existing edge is redirected. Tree traces forward from the new edge's destination to see whether the path leads back to the new edge's source.
If it does, the operation is rejected. The user sees an error explaining that the change would create a cycle, with the offending path highlighted.
What users actually wanted
When users try to create a cycle, the underlying need is usually one of three things.
- Mutual dependency. Two tasks each need information from the other. The fix is to introduce an intermediate node that represents the shared information, with both original tasks depending on it.
- Iterative work. A piece of work needs multiple rounds of review and refinement. The fix is to model each round as a separate node, with sequential rather than circular dependencies.
- Conceptual loop. The team is thinking about the work in a way that doesn't actually have a cycle, but the chosen task structure makes it look like one. The fix is to decompose the tasks differently.
Why the constraint exists
The DAG constraint is what allows the rest of Tree's mechanics to work. Topological sort, available tier computation, completion cascading, and critical path analysis all require an acyclic graph. The constraint isn't arbitrary; it's the precondition for everything else.
Related
LAST UPDATED · 2026-05-11


