Browse docs
On this page
loops & decision gates

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.

a loop with maxIterations = 3 Build 4 d Test 2 d Review iterate on Review fail Monte Carlo samples an iteration count per run, up to 3.
The dashed boundary is the loop. Build → Test → Review runs; if Review fails, the body repeats; 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 passProbability implicitly 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).