# Effects — pure core + algebraic effects ## Pure core language + algebraic effects The default is total, pure functions. Effects are declared as a set in the function type: `(Int) -> Int ![IO]`. The effect set is a flat, unordered, closed set of effect names, unified by set-equality — there is no effect row variable; a signature lists exactly the effects its body may perform. The schema-level effect-set field on `Type::Fn` is documented in [Data model](../contracts/0002-data-model.md); what is currently in scope vs. excluded lives in [scope boundaries](../contracts/0010-scope-boundaries.md). In the MVP only the effect `IO` is wired up (its sole op is `io/print_str`). `Diverge` (for non-termination) is reserved as an effect name but is unimplemented — no op, no codegen, no checker injection — in the same sense the refinements layer is reserved as a future extension without present-day surface (see [scope boundaries](../contracts/0010-scope-boundaries.md)). This is the most important LLM property: when I read a function, I can trust its signature without reading the body.