Purity contracts and call classification.
Emits three relations:
pure_contract(func, mod, name, arity)— the functions a module declared pure with@pure true(seeArgus.Purity). Read out of the beam's attribute chunk, so the contract is taken from the artifact rather than the source.impure_call(id, caller, api, category)— a call to something with a known observable effect.unknown_call(id, caller, api)— a call the effect model has no opinion about.
The classification lives in Elixir (Argus.Purity.Effects) rather than in
Datalog for two reasons. It is a large table that wants unit tests and
doctests, and expressing it as rules would mean either hundreds of facts
or string surgery — and string surgery in these rules is what produced the
partial-functor unsoundness fixed in schema v9.