# Statifier v2.0.0 - Table of Contents > A W3C SCXML-conformant statecharts engine for Elixir ## Pages - [Statifier](readme.md) - [Changelog](changelog.md) - Guides - [Architecture](architecture.md) - [Datamodel](datamodel.md) - [Extending Statifier: <invoke> handlers](extending.md) - [Persistence](persistence.md) - [Durable Timers: Delayed Sends That Outlive the Process](durable-timers.md) - [Observability](observability.md) - [OpenTelemetry](opentelemetry.md) - [Testing your own charts](testing-charts.md) - [Chart patterns: external-resource verdicts](chart-patterns.md) - [Family reference: what the sibling repos copy from here](family-reference.md) - Architecture Decision Records - [Architecture Decision Records](adr-index.md) - [ADR-0001: Record architecture decisions](0001-record-architecture-decisions.md) - [ADR-0002: Port the W3C SCXML algorithm literally (Appendix D)](0002-literal-w3c-appendix-d-port.md) - [ADR-0003: Pure functional core returning effects](0003-pure-core-with-effects.md) - [ADR-0004: Predicator is the datamodel; no ECMAScript, no Elixir eval](0004-predicator-as-the-datamodel.md) - [ADR-0005: Store the full configuration; intern states to integer indexes](0005-full-configuration-and-interned-state-indexes.md) - [ADR-0006: Reuse the v1 conformance corpus and regression ratchet; commit a generator](0006-reuse-conformance-corpus-and-regression-ratchet.md) - [ADR-0007: Beads for issue tracking](0007-beads-for-issue-tracking.md) - [ADR-0008: UXID for generated identifiers](0008-uxid-for-identifiers.md) - [ADR-0009: ex_quality is the quality gate](0009-ex-quality-as-quality-gate.md) - [ADR-0010: Parallel development via worktrees, coordinated through beads](0010-worktree-parallel-development.md) - [ADR-0011: Quality gate config is not agent-editable](0011-quality-gate-config-not-agent-editable.md) - [ADR-0012: Debuggability is designed into the core](0012-debuggability-designed-into-the-core.md) - [ADR-0013: Archive the v1 statifier repo in place](0013-archive-v1-statifier-repo-in-place.md) - [ADR-0014: Expression-level spans are part of the retained-location constraint](0014-expression-spans-in-cond-diagnostics.md) - [ADR-0015: Skill mechanics live in scripts, judgment lives in prose](0015-skill-mechanics-in-scripts.md) - [ADR-0016: The wurk skills live in their own repo; this repo gates its extensions](0016-wurk-skills-out-of-repo-extensions-gated.md) - [ADR-0017: Judgment is not scriptable, scoped to the wurk extension surface](0017-judgment-not-scriptable-in-wurk-extensions.md) - [ADR-0018: Process artifacts are not code comments](0018-no-process-jargon-in-code-comments.md) - [ADR-0019: A round budget bounds the macrostep fold](0019-macrostep-round-budget.md) - [ADR-0020: A round ordinal joins the step counters](0020-round-ordinal-joins-the-step-counters.md) - [ADR-0021: A failed donedata content expr yields no data](0021-donedata-content-expr-failure-yields-no-data.md) - [ADR-0022: A parallel is never the LCCA; SCION's contrary tests leave the corpus](0022-parallel-is-never-the-lcca.md) - [ADR-0023: Numeric-type gaps are fixed in predicator, never coerced at the boundary](0023-numeric-type-fixes-upstream-not-boundary-coercion.md) - [ADR-0024: <data src> is never fetched](0024-data-src-is-never-fetched.md) - [ADR-0025: Cross-repo tracker authority and the mirror obligation](0025-cross-repo-tracker-authority-and-mirrors.md) - [ADR-0026: <script> bodies are predicator statement programs](0026-script-as-predicator-statement-programs.md) - [ADR-0027: Embedder-placed session runtime with a named registry](0027-embedder-placed-session-runtime.md) - [ADR-0028: Executable-content blocks thread one context and bind/3 each write](0028-executable-content-blocks-thread-one-context.md) - [ADR-0029: Session.interpret/2 stays public; replay records four inputs](0029-session-interpret-stays-public.md) - [ADR-0030: In/1 becomes a provider; the built context still is not a MachineState field](0030-in1-becomes-a-provider-context-stays-off-machinestate.md) - [ADR-0031: A failed invoke argument evaluation aborts the invocation](0031-invoke-argument-failure-aborts-the-invocation.md) - [ADR-0032: The round budget spans the invoke pass's re-entry](0032-round-budget-spans-the-invoke-re-entry.md) - [ADR-0033: The validator gets a warning tier](0033-validator-warning-tier.md) - [ADR-0034: Replay re-drives the core, not a live session](0034-replay-re-drives-the-core-not-a-live-session.md) - [ADR-0035: The send id is send_<n> off a new machine_state.send_counter](0035-send-id-is-a-machinestate-counter.md) - [ADR-0036: A failed <send> argument discards the message](0036-send-argument-failure-discards-the-message.md) - [ADR-0037: Unbound is spelled :undefined at the writer; nil means null](0037-unbound-spelled-undefined-at-the-writer.md) - [ADR-0038: <invoke>'s source resolves at the session boundary, never inside the library](0038-invoke-source-resolves-at-the-session-boundary.md) - [ADR-0039: Session-detected send failures re-enter the core](0039-session-detected-send-failures-re-enter-the-core.md) - [ADR-0040: Session telemetry event contract](0040-session-telemetry-event-contract.md) - [ADR-0041: <content> markup lowers to a source slice, compiled at invoke time](0041-content-markup-lowers-to-a-source-slice.md) - [ADR-0042: Invoke content markup compiles under the relaxed namespace rule](0042-invoke-content-compiles-under-the-relaxed-namespace-rule.md) - [ADR-0043: Attribute values normalize per XML 1.0 3.3.3, guided by the raw source](0043-attribute-values-normalize-per-xml-3-3-3.md) - [ADR-0044: Re-entry effects defer to the outer batch](0044-re-entry-effects-defer-to-the-outer-batch.md) - [ADR-0045: Character data folds line breaks per XML 1.0 2.11, guided by the raw source](0045-character-data-folds-line-breaks-per-xml-2-11.md) - [ADR-0046: Every core effect carries round](0046-round-on-every-core-effect.md) - [ADR-0047: Static send target/type invalidity rejects in the core](0047-send-static-target-type-invalidity-rejects-in-the-core.md) - [ADR-0048: Send reachability is judged in the core against a route snapshot](0048-send-reachability-judged-against-a-route-snapshot.md) - [ADR-0049: Late subscribers catch up by replaying the recording](0049-late-subscriber-catch-up-via-recording.md) - [ADR-0050: Invoked children inherit the parent's observers by opt-in](0050-invoked-children-inherit-observation-by-opt-in.md) - [ADR-0051: Invoke handlers are registered per session](0051-invoke-handlers-are-registered-per-session.md) - [ADR-0052: Chart identity and position serialization](0052-chart-identity-and-position-serialization.md) - [ADR-0053: The chart-author test helpers ship in lib/ under Statifier.Testing](0053-chart-test-helpers-ship-in-lib-under-statifier-testing.md) - [ADR-0054: Durable timers consume the effect vocabulary](0054-durable-timers-consume-the-effect-vocabulary.md) - [ADR-0055: Non-self delayed-send routes stay the library's](0055-non-self-delayed-send-routes-stay-the-librarys.md) - [ADR-0056: After a renumbering, pointer citations move and history stands](0056-renumbered-adr-citations-pointers-move-history-stands.md) - [ADR-0057: Recording identity and serialization](0057-recording-identity-and-serialization.md) - [ADR-0058: ADR number collisions fail the gate via a tree-local numbering invariant](0058-adr-number-collisions-fail-the-gate-tree-locally.md) - [ADR-0059: A per-execution ordinal joins the durable-timer effects](0059-per-execution-ordinal-on-durable-timer-effects.md) - [ADR-0060: Resuming a session from a persisted position](0060-resuming-a-session-from-a-persisted-position.md) - [ADR-0061: Consumers pin main SHAs under a documented contract until 2.0.0](0061-sha-pinning-contract-until-2-0-0.md) - [ADR-0062: The OpenTelemetry bridge is a separate package, opentelemetry_statifier](0062-opentelemetry-bridge-is-a-separate-package.md) - [ADR-0063: An opaque caller context rides external events and the durable-timer effects](0063-caller-context-on-external-events-and-durable-timer-effects.md) - [ADR-0064: The position blob drops the per-drive snapshot fields](0064-position-blob-drops-the-per-drive-snapshot-fields.md) - [ADR-0065: A handler conformance case joins the Statifier.Testing surface](0065-handler-conformance-case-in-statifier-testing.md) - [ADR-0066: Publishes 2.0.0 to Hex, ending the SHA-pinning contract](0066-publishes-2-0-0-ending-the-sha-pinning-contract.md) ## Modules - [Mix.Statifier.AdrGuard](Mix.Statifier.AdrGuard.md): Flags likely violations of the mechanically-checkable ADRs in `docs/adr/`. - [Mix.Statifier.AdrJudge](Mix.Statifier.AdrJudge.md): Judges the current branch's diff against a registry of judged ADRs, each carrying its own path scope, ADR text, and failure vocabulary, using two independent model calls per ADR: one proposes violations, a second is prompted to refute each one. Only a proposed violation the refute pass fails to overturn becomes a finding - a single pass reporting whatever it first notices is exactly what the adversarial-verification requirement on this check rules out, because a false positive here blocks a commit (CLAUDE.md: "never go green by weakening the check" means the fix for a bad finding has to be "the check was wrong," not "disable the check" - so the bar to reach gate-failure status is higher than an FYI). - [Mix.Statifier.GateGuard](Mix.Statifier.GateGuard.md): Finds changes to the quality gate's own configuration that no one has justified in writing. - [Mix.Statifier.RegressionRegistry](Mix.Statifier.RegressionRegistry.md): Reads and writes `test/passing_tests.json`, the regression ratchet registry. - [Statifier](Statifier.md): The public entry point for statifier-ex. - [Statifier.Chart](Statifier.Chart.md): The versioned binary contract for a *chart* - a `Statifier.Machine.t()` reduced to the inputs that reproduce it: its SCXML source, the persisted subset of the options it was compiled with, and its `Statifier.Machine.Identity.t()`. No compiled term is written - `from_binary/1` rebuilds a `Machine.t()` by recompiling the stored source with the stored options through `Statifier.compile/2`, the same pipeline any other caller runs, rather than by deserializing compiler output directly. - [Statifier.Compiler](Statifier.Compiler.md): The fourth arrow of the parser pipeline: a validated `%Statifier.Document{}` in, `{:ok, %Statifier.Machine{}} | {:error, [Statifier.Compiler.Error.t()]}` out (`docs/architecture.md:47-51`). Nothing downstream of this pass ever sees a `%Statifier.Document{}` again - the interpreter accepts only a `Machine` (`docs/architecture.md` principle 4). - [Statifier.Compiler.Error](Statifier.Compiler.Error.md): The compiler's own error shape: `{reason, message, location}`, character-identical in style to `Statifier.Lowering.Error` (`lib/statifier/lowering/error.ex:21-36`). - [Statifier.Compiler.Expressions](Statifier.Compiler.Expressions.md): The expression-compilation seam: compiles raw predicator source - a `cond`, an `expr`, or a `` text body - into the single `Machine.expr()` sum type, on its own, before either of its two consumers (the transition pass's transitions, the executable-content pass's content/donedata) so neither lands a raw-string field and changes its type afterwards. - [Statifier.Document](Statifier.Document.md): The typed parse target: what lowering produces, and what the validator and the Machine compiler consume. - [Statifier.Document.Assign](Statifier.Document.Assign.md): An `` executable-content element: spec 5.4's deep-path datamodel write. - [Statifier.Document.Block](Statifier.Document.Block.md): One `` or `` element: an ordered list of executable content plus the location of the element that contains it. - [Statifier.Document.Cancel](Statifier.Document.Cancel.md): A `` element: spec 6.3's instruction to cancel a delayed ``. - [Statifier.Document.Content](Statifier.Document.Content.md): A `` element: static text, an `expr`, markup, or (representably, if not validly) any combination. - [Statifier.Document.Data](Statifier.Document.Data.md): A `` element: an `id`, and at most one of `expr`, `src`, or child text as its value source. - [Statifier.Document.Datamodel](Statifier.Document.Datamodel.md): A `` element: an ordered list of `` children. - [Statifier.Document.Donedata](Statifier.Document.Donedata.md): A `` element: the optional payload a `:final` state's `done.state.*` event carries (spec 5.7). - [Statifier.Document.Foreach](Statifier.Document.Foreach.md): A `` executable-content element (spec 4.6): iterates over an array, binding `item` (and, optionally, `index`) in the datamodel for each element, then running its own child content once per iteration. - [Statifier.Document.If](Statifier.Document.If.md): An `` executable-content element (spec 4.3): the partitioned form of ``/``/``, quoting spec 4.3.2 exactly - [Statifier.Document.If.Branch](Statifier.Document.If.Branch.md): One partition of an `` - the executable content between one partitioning tag (``, ``, or ``) and the next, per `Statifier.Document.If`'s moduledoc. - [Statifier.Document.Initial](Statifier.Document.Initial.md): An `` element: spec 3.6's way to name a compound state's default entry point via a `` rather than an `initial` attribute. - [Statifier.Document.Invoke](Statifier.Document.Invoke.md): An `` element: spec 6.4's instruction to create an instance of an external service. - [Statifier.Document.Log](Statifier.Document.Log.md): A `` executable-content element: spec 4.7's diagnostic output point. - [Statifier.Document.Param](Statifier.Document.Param.md): A `` element under ``: spec 5.7's key-value alternative to ``. - [Statifier.Document.Raise](Statifier.Document.Raise.md): A `` executable-content element: spec 4.2's way to enqueue an internal event. - [Statifier.Document.Script](Statifier.Document.Script.md): A `