# 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.
