An Effect is an immutable description of a computation. Constructing one performs no work; a runner is required.
This separation is what makes retries, timeouts, dependency injection, and tracing possible — they operate on the description, not on an execution that has already happened.
const program = Effect.sync(() => {
// called === false here — building `program` ran nothing.
// called === true now — the runner walked the description.
Rule of thumb. If a variable holds an Effect.Effect<...>, no work has
happened yet. The work happens at the runner call site. Step 02 grounded
this in Effect.sync; the same is true for every constructor you’ll meet.
Your turn: predict called before runSync (the first stub) and after (the second stub). The expected values are false and true — proof that the runner is what flips the bit.