0.1.0 (2026-08-21)
Initial release.
Enact.run/3,Enact.dry_run/3,Enact.subject/3, andEnact.authorized/3— theload → authorize → cast → validate → resolve → execute → after_commitpipeline with actor enforcement, the closed error taxonomy, and telemetry events.subject/3returns the loaded record;authorized/3returns:ok. Both are load + authorize only (locator params, no body). Atom-keyed params are stringified at the boundary (values untouched; atom+string collision at the same level raises)Enact.ActionandEnact.InputSchemabehaviours;Enact.Actorprotocol.authorize/1is required (an open write is a writtentrue); optional callbacks are declared via@optional_callbacks- Usage rules: params are the invocation payload; persistable fields are
not passed via
assigns: - Phoenix guide: application callers use context one-liners that forward
to
Enact.run/3/dry_run/3/subject/3/authorized/3 Enact.Delegates— opt-inusethat generates those one-liners (create_contact/2,create_contact_dry_run/2,create_contact_subject/2,create_contact_authorized/2) fromactions: [CreateContact, ...]- Presence-based change detection:
Enact.provided?/2andEnact.updates/2 Enact.Resolve— scalar and batch reference resolution with enumeration-resistant error renderingEnact.Validations(check/2,unique/3) andEnact.Guardrails(mechanical input-schema invariants)Enact.Previewwith a confirmation digest binding action, mode, locator params (params keys not in the input schema), and the canonical updates map;subjectis the loaded record for old → new diffsEnact.InputSchema.cast_input/4— casting with JSON API empty-string semantics derived from field types (keep_empty_strings:option)partial_embeds/1input-schema manifest — partial-object PATCH semantics for declaredembeds_onefields, with presence-faithful updates, previews, and confirmation digestsEnact.merged/4— the result-state view of a partial embed, shared by merged-result validation rules and the execute-side mergeEnact.Testhelpers for host-app suites, including theassert_rejects_empty_strings/3behavioral probe