import { Effect } from "effect"
const audit: Array<string> = []
const program = Effect.sync(() => {
Effect.flatMap(() => Effect.sync(() => { audit.push("step-b") })),
// audit is still empty — no runner has touched `program` yet.
// audit === ["step-a", "step-b"]
pipe and flatMap compose two descriptions into a larger description. That larger value is still inert — nothing runs until a runner touches it at the edge.
A program made of a hundred composed Effects is just one bigger description; one runSync walks the whole tree.
Your turn: assert the audit array is empty after composing but before running, then assert it has both steps after the runner fires.