Part of #76 (Phase 3). Remeasured 2026-10-03 on master at fe40d17: 258 passing files stop at Effect.Console, 43 at Effect, and 4 at Test.Assert — 305 files, by first blocking stage. No passing file blocks on Prelude, because stdlib/lib/Prelude.purs exists and resolves; its missing surface is latent rather than a first blocker, which is why #94 measures 0 by this convention.
We already have the runtime: WASI.Console wraps wasi:cli/stdout/stderr, and WASI-02/03 are Verified with execution tests. What is missing is the module surface the corpus expects.
Do
Effect and Effect.Console as a source-level surface over the existing WASI console, exporting log, logShow, warn, error and the Effect type the corpus imports.
- Keep
WASI.Console as the platform layer and have Effect.Console be a thin binding over it, so the WASI capability gates stay in one place.
Test.Assert over the same execution model: assert, assertEqual, assertThrows, assertFailure. A failing assertion must be observable as a non-zero exit, so passing assertion files score cleanly.
Note on DEC-11
docs/decision/DEC-11-primitive-ffi-stdlib-wrappers.md fixes the wrapper-versus-raw-import split. Effect.Console is a wrapper; the raw import stays inside WASI.Console. Do not collapse them.
Acceptance
Effect, Effect.Console, and Test.Assert exist, execute under Wasmtime, and the 305 blocked files drop toward zero.
Part of #76 (Phase 3). Remeasured 2026-10-03 on
masteratfe40d17: 258passingfiles stop atEffect.Console, 43 atEffect, and 4 atTest.Assert— 305 files, by first blocking stage. Nopassingfile blocks onPrelude, becausestdlib/lib/Prelude.pursexists and resolves; its missing surface is latent rather than a first blocker, which is why #94 measures 0 by this convention.We already have the runtime:
WASI.Consolewrapswasi:cli/stdout/stderr, and WASI-02/03 areVerifiedwith execution tests. What is missing is the module surface the corpus expects.Do
EffectandEffect.Consoleas a source-level surface over the existing WASI console, exportinglog,logShow,warn,errorand theEffecttype the corpus imports.WASI.Consoleas the platform layer and haveEffect.Consolebe a thin binding over it, so the WASI capability gates stay in one place.Test.Assertover the same execution model:assert,assertEqual,assertThrows,assertFailure. A failing assertion must be observable as a non-zero exit, sopassingassertion files score cleanly.Note on DEC-11
docs/decision/DEC-11-primitive-ffi-stdlib-wrappers.mdfixes the wrapper-versus-raw-import split.Effect.Consoleis a wrapper; the raw import stays insideWASI.Console. Do not collapse them.Acceptance
Effect,Effect.Console, andTest.Assertexist, execute under Wasmtime, and the 305 blocked files drop toward zero.