When the work doesn’t finish on the first pass.
A directed acyclic graph — the DAG that underlies every Gantt chart — can’t express “do X until Y.” Caladia has two constructs for the iterative parts of real work: decision gates for pass/fail reviews and loops for explicit iteration.
1. Decision gates
A decision gate is a diamond-shaped node with two extra properties:
passProbability— the probability the gate passes on first attempt. A number in [0, 1]. Default 1.0 (always passes) makes a gate behave like a regular activity.failureDelay— the extra duration consumed when the gate fails. Default zero.
A failed gate doesn’t branch the schedule into two paths. It extends the chain: the failure delay is added to the gate’s effective duration on that iteration. Resources stay assigned for the full delay. Mechanically, it’s a single bar in the Gantt with a sampled length — pass on the first try and the bar is its base duration; fail and it grows by the failure delay.
Use gates for binary outcomes that are usually-pass — QA sign-off, design review, regulatory approval. Set passProbability from history (“eight in ten of these passed first time”) or from an expert estimate. Monte Carlo draws pass/fail per iteration; gates with high-impact failure outcomes surface on the tornadoes.
2. Loops
A loop is a wrapper around a selection of nodes. Inside the wrapper the nodes execute as a normal sub-DAG; the wrapper itself decides how many times that sub-DAG runs. The body and the kickout are the two pieces.
The kickout is the condition that ends the loop. Caladia ships four:
maxIterations— run the body up to N times, then exit. The most common kickout: “up to three review cycles, then ship anyway.”timeBudget— run iterations until you’ve burned T duration, then exit even mid-iteration. Useful for time-boxed iterative work (“two weeks of customer-feedback cycles”).convergenceCriterion— run until a numeric threshold is met. Models “keep optimising until the metric is good enough.” The threshold is a planning parameter; the simulation doesn’t literally measure convergence.externalTrigger— run until an outside event stops the loop. Free-text description; treated as “sampled iteration count, unspecified bound.” Use this when the loop ends on a non-time, non-count condition you can’t precisely model.
Monte Carlo samples an iteration count per loop per iteration, respecting the kickout. The Gantt collapses the loop into a single expandable group by default; drill in for per-iteration detail.
maxIterations bounds the worst case.3. Gate or loop — which fits?
The two constructs aren’t interchangeable. Pick based on the shape of the rework.
- Use a gate when failure adds time to the same activity (a sign-off with a fix-and-resubmit step that’s essentially part of the original work). One bar on the Gantt with a sampled length.
- Use a loop when failure means re-running a chain of upstream work. Build → Test → Review, then back to Build when Review fails — multiple distinct activities re-execute. The loop wrapper expresses that.
- Compose them when reality has both: a loop whose Review node is a gate. The gate’s
passProbabilityimplicitly drives the iteration count (failed reviews trigger another loop pass; passes exit). Caladia’s simulation handles the composition — a failed gate inside a loop body extends that iteration and may trigger another.
4. Monte Carlo & iteration uncertainty
Loops add a second layer of uncertainty to Monte Carlo. For each iteration of the simulation, every loop draws its own iteration count from the kickout’s implicit distribution, then samples durations and pass-probabilities within that count. The result: a loop with maxIterations = 5 and a 70% pass-rate gate inside will typically settle around 1–2 iterations but occasionally hit the cap, fattening the right tail.
Two consequences worth knowing:
- Loops often dominate the gap between P50 and P80. The deterministic schedule shows one iteration count (usually the expected value); Monte Carlo’s P80 reflects the “and sometimes it takes four tries” runs.
- The schedule tornado on the Risks tab ranks loop members by their effect on the project finish. If a loop is at the top of the tornado, the iteration count itself is the lever — consider tightening the gate’s pass-probability (improve the review process) or the loop’s maxIterations (commit to a cap).