Step 01 showed that throwing hides failure from the type system. The fix is to return failure as a value.
A plain TypeScript Result type makes the idea concrete; Effect<A, E, R> extends it with laziness, composition, and dependency tracking. This step is about the type, the constructors and runners follow in step 05.