**The brief.** The quote calculator has six **direct** dependency edges — each formula reads exactly two values. Write them down as `(value, dependsOn)` pairs. The workbench derives, from *your* edges, the **dirty set** of every input: everything that must be recomputed, directly or transitively, when that input changes. Six checks are waiting, and they know the graph. The battery ships **red** — the edge list is empty.

The formulas, once more:

subtotal = quantity × unitPrice
discount = subtotal ≥ 1000 ? discountPercent : 0
total    = subtotal × (1 − discount / 100)

Read each formula and list what it reads — nothing more, nothing less. The transitive part is the machine's job (that's the point of the lesson: it should never have been yours).

Your workbench

All six green? Then say out loud what OnQuantityChanged must now do — and notice that the word discount appears nowhere in the subtotal formula it implements. That mismatch is Lesson 2.


Stuck on the third check? Reveal the solution — the six edges and why the threshold is a read like any other.

← Lesson 1 exercises · Lesson 1 — The combinatorial trap

Reconnecting…
The connection to the server was interrupted. Trying to restore it…
Trying again…
The connection could not be restored. Reloading the page…
The server was updated. Reloading the page to pick up the latest version.