Effect replaces the hidden side-channel with an explicit type parameter.
import { Effect } from "effect"
// ┌─── Effect<number, ParseError, never>
declare const parseAge: (input: string) => Effect.Effect<number, ParseError>
number, the success value.
ParseError, the typed expected error.
never, no required dependencies (covered in step 21).
Callers must handle the error (or propagate it), and the compiler enforces both. Step 03 introduces the type.
Step 05 introduces the constructors.
Your turn: replace the three stubs with Effect.succeed / Effect.fail so the preview parser returns its result as a value. The first assertion runs the happy path; the second asserts the failure surfaces in Exit, not as a throw.