# ggen_igniter v26.9.8 - Table of Contents ## Pages - [docs/ — Diátaxis-organized, evidence-sourced only](claude.md) - [Documentation Audit](documentation_audit.md) - [ggen_igniter Documentation](readme-1.md) - [ADR-0001: Oxigraph as the Default SPARQL Query Engine](0001-oxigraph-default-query-engine.md) - [ADR-0002: Ash and Phoenix Remain Optional, Consumer-Side Integrations](0002-ash-phoenix-optional-consumer-side.md) - [ADR-0003: Plain Reactor (not Ash.Reactor) for the Target Coordination Pipeline](0003-plain-reactor-for-coordination.md) - [ADR-0004: Reconciliation Manifest Keyed by (template_path, out_template) Recipe Identity](0004-manifest-keyed-by-recipe-identity.md) - [ADR-0005: Receipt as an Independent, Append-Only Attempt History Distinct from the Manifest](0005-receipt-independent-of-manifest.md) - [ADR-0006: Marker-Based Line Splice for Injection, Deferring Real AST-Based Mutation](0006-marker-based-injection-not-ast-patch.md) - [ADR-0007: mix ggen_igniter.sync Always Attempts the Reactor Pipeline (Receipts on Every Run), Gated Only by Delegatability](0007-sync-always-attempts-receipts.md) - [ADR-0008: Evidence-Ranked Multi-Engine Registry for --engine Comparison Mode](0008-evidence-ranked-multi-engine-registry.md) - [ADR-001: Reactor as the Coordination Kernel](adr-001-reactor-coordination-kernel.md) - [ADR-002: Igniter & Structured Elixir Mutation Boundaries](adr-002-igniter-structured-elixir-mutation.md) - [ADR-003: ggen Semantic Compilation Integration](adr-003-ggen-semantic-compilation.md) - [ADR-004: Ash Framework Optional Integration Boundary](adr-004-ash-optional-integration.md) - [ADR-005: Manifest Manufacturing Ownership & Stale Detection](adr-005-manifest-manufacturing-ownership.md) - [ADR-006: Single Actuation Boundary & Deferred Execution](adr-006-actuation-single-boundary.md) - [ADR-007: Compensation Restores State While Preserving Evidence](adr-007-compensation-restores-state-preserves-evidence.md) - [ADR-008: CLI as a Thin Adapter over the Kernel](adr-008-cli-as-adapter.md) - [Architecture Decision Records](readme-2.md) - [Component Boundaries & Ownership](component-boundaries.md) - [Control Plane Architecture: Controller vs CLI Adapter](control-plane.md) - [System Architecture Overview](overview-3.md) - [Reconciliation Lifecycle & Mathematical Formalism](reconciliation-lifecycle.md) - [State Model & Knowledge Projection](state-model.md) - [Gaps to fill for v26.9.1](gaps-to-fill-v26-9-1.md) - [Archive](readme-4.md) - [ash_tier_matrix_pack — sh_after:/--allow-sh harness for the Tier-1 Ash task matrix](readme-5.md) - [ADVERSARIAL.md — Consolidated Adversarial Verification](adversarial-6.md) - [Authority Manifest — ggen_igniter factory cell](authority.md) - [ggen/ggen_igniter Sync-Receipt Parity Note](ggen-parity-note.md) - [Adversarial Verification: 01 — Recently-Claimed Edits On Disk](01_edits_on_disk.md) - [Adversarial Verification: Mutation Testing (Domain 02)](02_mutation_testing.md) - [Adversarial Verification: Mock / Placeholder / Scaffolding Discipline](03_mock_placeholder_grep.md) - [Adversarial Verification — Domain: Unreachable Branches & Stale/Renamed Identifiers](04_unreachable_stale_refs.md) - [Adversarial Verification — Domain: Process Exit Codes & Real Subprocess Correctness](05_exit_codes.md) - [Adversarial Verification 06: Clean Fresh Consumer](06_clean_consumer.md) - [Adversarial Verification: Idempotency (Domain 07)](07_idempotency.md) - [Adversarial Verification: doctor break/fix/no-op cycle](08_doctor_break_fix_noop.md) - [Adversarial Verification 09: Destructive Semantic Evolution](09_destructive_evolution.md) - [Adversarial Verification: Package Contents & Optional-Dependency Behavior](10_package_contents.md) - [Capability Matrix — ggen_igniter (Agent 1 pass, 2026-08-27T21:2x-22:0xZ)](capability_matrix.md) - [Self-Dogfood: docs/architecture/adr/README.md's ADR Index Table](dogfood-self.md) - [ReconcileReactor Step Dependency Graph](reactor-graph.md) - [Red-team: mutation before admission/manifest-stale-check?](redteam-actuation-before-admission.md) - [Red-team: same-real-output-path concurrency, run via the real Reactor path](redteam-concurrency-nondeterminism.md) - [Red-team finding: competing coordinators for production reconciliation](redteam-coordination-bypass.md) - [Redteam Doc-vs-Source Contradiction Review](redteam-doc-contradiction.md) - [Red-Team: Receipt Invariant (ActuationOccurred => ReceiptExists)](redteam-receipt-gaps.md) - [Red-team verification: stale-artifact leakage under --on-stale's real default](redteam-stale-artifact-leakage.md) - [Version Check — Agent 1](version_check.md) - [Zach Daniel / Chris McCord Acceptance Review — ggen_igniter (Agent 9)](zach_chris_acceptance.md) - [Adding a Pack](adding-a-pack.md) - [Adding a Step to ReconcileReactor](adding-a-reactor-step.md) - [Architecture Rules](architecture-rules.md) - [Testing](testing.md) - [Glossary](glossary.md) - [Documentation Index](index-7.md) - [Generating Ash Actions](actions.md) - [Generating Ash Domains](domains.md) - [Ash Integration Overview](overview-8.md) - [Ash Reactor vs. ggen_igniter Manufacturing Pipelines](reactor.md) - [Generating Ash Resources](resources.md) - [Pack Format & Marketplace Integration](packs-9.md) - [The Planning Boundary: Knowledge to ManufacturingPlan](planning-boundary.md) - [Semantic Compilation Pipeline](semantic-compilation.md) - [AST Mutation & Code Injection](ast-mutation.md) - [Project Actuation: Igniter Integration & Task Composition](project-actuation.md) - [Write-Safety Guarantees & Decision Tables](safety.md) - [Phoenix LiveView Integration](liveview.md) - [Phoenix Integration Overview](overview-10.md) - [Fortune5-Ready Bundle Installer (ggen_igniter side) v26.9.1 — Overview](00-overview-11.md) - [01-SCHEMA-DISPATCH-ALIGNMENT](01-schema-dispatch-alignment.md) - [02-GGEN-TOML-TOML-IO](02-ggen-toml-toml-io.md) - [03-BUNDLE-MANIFEST-AND-MERGE](03-bundle-manifest-and-merge.md) - [Real ggen sync run shellout and gate verification](04-sync-shellout-and-verify.md) - [mix ggen_igniter.fortune5_ready — assembled task and Chicago-style end-to-end test](05-fortune5-ready-mix-task-and-e2e-test.md) - [Known limitations and explicit non-goals for the fortune5-ready installer](06-known-limitations-and-non-goals.md) - [Parity Validation: ggen_igniter vs. real ggen core](parity-validation.md) - [Book-Library Ash Validation Fixture v26.9.8 — Overview](00-overview-12.md) - [Book library-domain Ash fixture (ggen_igniter v26.9.8)](01-book-case-study-fixture.md) - [Ash Task Validation Matrix — v26.9.8](02-ash-task-validation-matrix.md) - [sh_after:/--allow-sh harness for the Tier-1 Ash task matrix](03-sh-after-allow-sh-harness.md) - [Idempotency verification methodology — book-library Ash fixture](04-idempotency-verification-methodology.md) - [Tier-2 Ash Task Deferral and xaas Case-Study Cutover Criteria v26.9.8](05-tier2-deferral-and-xaas-cutover.md) - [OCEL v2 projection of the ticket-03/04 Ash validation harness — GGEN-1908](06-ocel-beam4pm-projection.md) - [Ash Manufacture Path — composed Igniter task supersedes the shell-out matrix](07-ash-manufacture-path.md) - [Adversarial Review — the Ash Manufacturing Path (v26.9.8)](08-review-manufacture-path.md) - [Dry-run receipt: Tier-1 Ash task matrix harness (tickets 01/02/03)](dry-run-receipt.md) - [Adversarial review — Ash/Igniter maintainer lens (v26.9.8)](review-ash-maintainer-lens.md) - [GgenIgniter.Controller](controller.md) - [Debugging ggen_igniter](debugging.md) - [Failure Recovery: Receipts, Standings, Compensation](failure-recovery.md) - [Runtime Topology](runtime.md) - [mix ggen_igniter.doctor](doctor.md) - [Engine selection: --engine oxigraph|sparql|qlever](engines.md) - [CLI Reference](index-13.md) - [GgenIgniter.Lock](lock.md) - [Packs: --pack, --pack-dir, and --pack NAME:TEMPLATE](packs-14.md) - [mix ggen_igniter.plan](plan.md) - [mix ggen_igniter.replay](replay.md) - [mix ggen_igniter.sync](sync.md) - [Docker-based downstream-consumer validation (mix e2e in a container)](docker-e2e.md) - [Object-Centric Event Log (OCEL 2.0)](ocel.md) - [Durable Process Receipts](receipts.md) - [State Reconstruction, Compensation & Evidence Recovery](recovery.md) - [Standing: Process & Audit Taxonomies](standing.md) - [Telemetry & Event Sinks](telemetry.md) - [Compensation: compensate/4 vs undo/4, With Real Source Citations](compensation.md) - [Reactor Concurrency: What Actually Runs in Parallel](concurrency-15.md) - [Reactor Failure Semantics: The Four Standings](failure-semantics.md) - [Reactor Coordination Overview](overview-16.md) - [Reactor Steps: Real Dependency Graph and Per-Step Contract](steps.md) - [Destructive Evolution Handling](destructive-evolution.md) - [Idempotency and Write Safety](idempotency.md) - [Reconciliation Manifest](manifest.md) - [Stale Artifacts and --on-stale Policy](stale-artifacts.md) - [Status](status.md) - [Adversarial & Destructive Verification](adversarial-17.md) - [Chicago-School Testing Discipline](chicago.md) - [Concurrency & Parallel Execution Safety](concurrency-18.md) - [Definition of Done & Quality Verification](definition-of-done.md) - [End-to-End Lifecycle Verification](e2e-lifecycle.md) - [Failure Injection & Recovery Verification](failure-injection.md) - [Building and Running Your First Pack](first-pack.md) - [Understanding the Reconciliation Lifecycle](first-reconciliation.md) - [Getting Started with GgenIgniter](getting-started.md) - [The Reactor Coordination Path](reactor-path.md) - [ggen_igniter v26.9.1 Requirements Document](v26-9-1-requirements.md) - [GgenIgniter](readme-19.md) - [Changelog](changelog.md) ## Modules - [GgenIgniter.Actuate](GgenIgniter.Actuate.md): Writes a rendered source string to a file, with write-safety guards modeled on the real Rust ggen's `ggen-engine/src/write.rs` decision table (idempotent no-op detection, `unless_exists`, `skip_if`). - [GgenIgniter.Application](GgenIgniter.Application.md): Starts the real Finch HTTP pool `GgenIgniter.Finch` (used by `Tesla.Adapter.Finch`, configured in `config/config.exs`, for real HTTP calls made by `GgenIgniter.Query.Qlever` and `gno`'s `SPARQL.Client`) as part of the OTP application boot -- so any real `mix ggen_igniter.sync --engine qlever` invocation (a fresh process, not the test suite's own) has it available too. - [GgenIgniter.ArtifactIdentity](GgenIgniter.ArtifactIdentity.md): A real, first-class ARTIFACT IDENTITY primitive: turns a `(base_dir, raw_path)` pair -- an arbitrary, possibly-relative, possibly-alias-laden path string as it appears in a `%GgenIgniter.PendingActuation{}`'s `target`, a `GgenIgniter.Manifest` entry's `outputs` key, or a `GgenIgniter.Receipt`'s `files` entry -- into one CANONICAL identity string, so two lexically different raw strings that resolve to the same real on-disk location are recognized as the SAME identity everywhere this pipeline reasons about "is this the same output." - [GgenIgniter.Bundle](GgenIgniter.Bundle.md): Loads and merges the fortune5-ready pack bundle (`priv/bundles/fortune5_ready.json`), per `docs/jira/v26.9.1/03-BUNDLE-MANIFEST-AND-MERGE.md` (GGEN-1801 manifest, GGEN-1803 dedupe merge). - [GgenIgniter.Bundle.Pack](GgenIgniter.Bundle.Pack.md): One pack entry inside a loaded bundle -- mirrors one element of `priv/bundles/fortune5_ready.json`'s `"packs"` array. - [GgenIgniter.Controller](GgenIgniter.Controller.md): A persistent, BEAM-native reconciliation controller: a real `GenServer` that holds live reconciliation state IN THIS PROCESS across multiple `reconcile/2` calls -- in contrast to `mix ggen_igniter.sync`'s per-invocation model, where every run is a fresh OS process with zero in-memory continuity to the previous run (any "what did the last run do" question can only be answered by re-reading disk, because there is no process to ask). - [GgenIgniter.Discovery.Examples.Event](GgenIgniter.Discovery.Examples.Event.md): Minimal real canonical event struct used as the dogfood target for `incremental-discovery-pack` and `sensor-sink-pack` -- mirrors the shape of ex4pm's canonical `Ex4pm.Event` (`activity`, `object_ids`, `timestamp`, `id`, `attributes`) closely enough that the ported discovery/sink logic needs no struct-shape translation, without this repo depending on ex4pm itself. A real consumer (e.g. beam4pm) points `dfg:eventModule`/ `ss:eventModule` at its own canonical event struct instead. - [GgenIgniter.Discovery.Examples.IncrementalDfg](GgenIgniter.Discovery.Examples.IncrementalDfg.md): Real incremental (streaming) directly-follows-graph discovery. - [GgenIgniter.DoctorFixes](GgenIgniter.DoctorFixes.md): Real, reusable implementations of the project-hygiene fixes that `mix ggen_igniter.doctor --fix` applies to the CURRENT project (the real consumer app `doctor` is invoked inside -- not a scaffolded test harness). - [GgenIgniter.DoctorFixes.Rule](GgenIgniter.DoctorFixes.Rule.md): Data shape of one declarative doctor reconciliation rule: a `(Predicate, Transformation, Verification)` triple, per `GgenIgniter.DoctorFixes`'s moduledoc. Every field is a real, single-argument function over a `project_dir` -- no captured mutable state, no `File.cwd!()`/`Mix.Project` reads baked in, so a `Rule` is as testable against a throwaway temp directory as any of the plain functions it replaces. - [GgenIgniter.Engine](GgenIgniter.Engine.md): Behaviour every `--engine NAME` implementation satisfies, so `Mix.Tasks.GgenIgniter.Sync` dispatches through a lookup table (`GgenIgniter.Engine.registry/0`) instead of hardcoded, string-pattern-matched function clauses (`run_queries("sparql", ...)`, `run_queries("qlever", ...)`, etc.). Adding a new engine means adding one module + one registry entry, not editing the sync task's dispatch logic. - [GgenIgniter.Engine.Oxigraph](GgenIgniter.Engine.Oxigraph.md): Adapts `GgenIgniter.Query.Oxigraph` (real, native oxigraph NIF) to `GgenIgniter.Engine`. - [GgenIgniter.Engine.Qlever](GgenIgniter.Engine.Qlever.md): Adapts `GgenIgniter.Query.Qlever` (real, remote QLever HTTP) to `GgenIgniter.Engine`. - [GgenIgniter.Engine.Sparql](GgenIgniter.Engine.Sparql.md): Adapts `GgenIgniter.Query.run/2` (the `sparql` hex package) to `GgenIgniter.Engine`. - [GgenIgniter.EngineComparisonReport](GgenIgniter.EngineComparisonReport.md): The runtime, per-invocation, N-way surfacing mechanism ADR-0008 introduces -- NOT a new correctness oracle. `pairwise_agreement/1` restates, over real rows returned from a real run, exactly the row-set/row-order/error-shape distinction classes `test/ggen_igniter_cross_engine_equivalence_properties_test.exs` and `test/ggen_igniter_engine_parity_test.exs` already establish statically - [GgenIgniter.EngineComparisonReport.CandidateResult](GgenIgniter.EngineComparisonReport.CandidateResult.md): One engine's real outcome from one `GgenIgniter.EngineRegistry.run_all/4` fan-out -- see the parent module's moduledoc for the field contract. - [GgenIgniter.EngineRegistry](GgenIgniter.EngineRegistry.md): ADR-0008's orchestration layer *over* `GgenIgniter.Engine.fetch!/1`, not a replacement for it. Single-engine callers (the default, unchanged path through `lib/mix/tasks/ggen_igniter.sync.ex`'s `run_via_reactor/3` -> `dispatch_reactor_reconcile/2` -> `GgenIgniter.Reactors.ReconcileReactor`'s own internal `target_opts[:engine] || "oxigraph"` -> `Engine.fetch!/1` resolution) never touch this module at all -- it exists only for the `--engine` comma-separated/`"all"` comparison-mode path. - [GgenIgniter.Frontmatter](GgenIgniter.Frontmatter.md): Elixir shape mirroring the real Rust `ggen::Frontmatter` struct 1:1 (`~/ggen/crates/ggen-engine/src/template.rs:40-175`, ggen v26.8.24). - [GgenIgniter.Frontmatter.FreezePolicy](GgenIgniter.Frontmatter.FreezePolicy.md): Mirrors Rust `enum FreezePolicy { Never, Always, Checksum }` (`template.rs:326-328`). - [GgenIgniter.Frontmatter.MatchRule](GgenIgniter.Frontmatter.MatchRule.md): Mirrors Rust `MatchRule` (`template.rs:189-200`). - [GgenIgniter.Frontmatter.MatchSpec](GgenIgniter.Frontmatter.MatchSpec.md): Mirrors Rust's `#[serde(untagged)] enum MatchSpec { Literal(String), Structured(MatchRule) }` (`template.rs:184-187`). An Elixir "untagged enum" is a tagged tuple here (`{:literal, string}` / `{:structured, match_rule}`) since Elixir has no untagged-union deserialization primitive to mirror directly -- the tag is added, not removed, information. - [GgenIgniter.FrontmatterConfig](GgenIgniter.FrontmatterConfig.md): Mirrors Rust `ggen_engine::config::GgenConfig` (`~/ggen/crates/ggen-engine/src/config.rs:45-52`) -- the `[templates].dir` per-file frontmatter `ggen.toml` schema, the schema real consumers (beam4pm) actually use today. - [GgenIgniter.FrontmatterPackRef](GgenIgniter.FrontmatterPackRef.md): Mirrors Rust `ggen_engine::config::PackRef` (`~/ggen/crates/ggen-engine/src/config.rs`) -- the untagged `Path { path, extra_ontologies, lock } | Git { git, version, subdir }` enum used by `GgenIgniter.FrontmatterConfig`'s `[packs]` table-of-tables entries. - [GgenIgniter.GateVerify](GgenIgniter.GateVerify.md): GGEN-1806 (`docs/jira/v26.9.1/04-SYNC-SHELLOUT-AND-VERIFY.md`): post-sync, per-gate SPARQL verification. "Sync succeeded" (`GgenIgniter.SyncShellout`'s `{:ok, output}`) and "the pack's own contract holds" are separate, independently observable outcomes -- mirroring `lib/mix/tasks/ggen_igniter.doctor.ex`'s `check_hex_publish_readiness/0` precedent of not conflating subprocess success with the actual property being checked. - [GgenIgniter.GgenToml.IO](GgenIgniter.GgenToml.IO.md): Real `ggen.toml` file I/O over `GgenIgniter.SchemaDispatch`'s typed dual-schema structs (`GgenIgniter.FrontmatterConfig` / `GgenIgniter.ProjectConfig`). Closes the gap this repo's `mix.exs` declared (`{:toml, "~> 0.7"}`) but never used for real `Toml.decode/1` calls in `lib/` -- see `docs/jira/v26.9.1/02-GGEN-TOML-TOML-IO.md`. - [GgenIgniter.Injection](GgenIgniter.Injection.md): Shared frontmatter-`inject:`-to-`GgenIgniter.Actuate.inject_content!/5` conversion logic, extracted so `Mix.Tasks.GgenIgniter.Sync` (the original, standalone pipeline) and `GgenIgniter.Reactors.ReconcileReactor` (the opt-in Reactor pipeline) share exactly ONE real implementation instead of two independently-drifting copies -- see this module's functions' individual docs for the full mapping table (originally authored inline in `Mix.Tasks.GgenIgniter.Sync`, moved here verbatim, behavior unchanged). - [GgenIgniter.Lock](GgenIgniter.Lock.md): A real, file-based cross-process lock used by `mix ggen_igniter.sync` (see `Mix.Tasks.GgenIgniter.Sync`'s AR-9 correction, 2026-08-27) to serialize concurrent mutating invocations against the same target project. Per the PRD's FR-5 (see `Mix.Tasks.GgenIgniter.Plan`'s moduledoc, "Read-only, no lock"), only verbs that mutate a target project's filesystem (`mix ggen_igniter.sync`, `mix ggen_igniter.replay`) acquire this lock -- `mix ggen_igniter.doctor` and `mix ggen_igniter.plan` are both read-only and must never call `acquire/2`. - [GgenIgniter.Manifest](GgenIgniter.Manifest.md): The RECONCILIATION MANIFEST: turns `mix ggen_igniter.sync` from a stateless generator into a stateful reconciler that knows what it previously wrote, so a rename/removal in the ontology produces a mechanically DETECTABLE stale output instead of a silently orphaned file on disk. - [GgenIgniter.Native.GraphNif](GgenIgniter.Native.GraphNif.md): Rustler NIF loader for `native/ggen_graph_nif` (the crate wraps the real `OxigraphEngine` from `~/ggen/crates/ggen-graph-wasm`'s `oxigraph-engine` feature). See `GgenIgniter.Query.Oxigraph` for the consumer-facing wrapper with the same `[map()]` row-list contract as the other query engines. - [GgenIgniter.Ontology](GgenIgniter.Ontology.md): Loads an ontology file into an in-memory RDF.Graph via the `rdf` library, dispatching on file extension. Real IO/parsing, no fixture stubbing. Supported formats: - `.ttl` -> `RDF.Turtle.read_file!/1` (fallback for unrecognized extensions) - `.nt` -> `RDF.NTriples.read_file!/1` - `.nq` -> `RDF.NQuads.read_file!/1` - [GgenIgniter.Pack](GgenIgniter.Pack.md): Resolves the `priv/ggen//` convention (or an explicit `--pack-dir`) into sane defaults for `--ontology`/`--query`/`--template`, per the pack convention design - [GgenIgniter.PackManifest](GgenIgniter.PackManifest.md): Mirrors Rust's marketplace registry `Pack` struct (`~/ggen/crates/ggen-marketplace/src/packs_registry/types.rs:6-52`). - [GgenIgniter.PackManifest.PackDependency](GgenIgniter.PackManifest.PackDependency.md): Mirrors Rust `PackDependency` (`~/ggen/crates/ggen-marketplace/src/packs_registry/types.rs:65-70`). - [GgenIgniter.PackManifest.PackTemplate](GgenIgniter.PackManifest.PackTemplate.md): Placeholder mirror of Rust `PackTemplate` (referenced by `types.rs:6-52` but not itself read in this pass). - [GgenIgniter.PackRef](GgenIgniter.PackRef.md): Mirrors Rust `ggen_config::manifest::PackRef` (`~/ggen/crates/ggen-config/src/manifest/types.rs:54-69`) -- the `ggen.toml [[packs]]` reference entry. - [GgenIgniter.PackageToml](GgenIgniter.PackageToml.md): Mirrors Rust `PackageToml` (`ggen-config/src/manifest/types.rs:77-84`) -- the local `package.toml` reader. - [GgenIgniter.PackageToml.PackSection](GgenIgniter.PackageToml.PackSection.md): Mirrors Rust `PackSection` (`ggen-config/src/manifest/types.rs:88-94`). - [GgenIgniter.PendingActuation](GgenIgniter.PendingActuation.md): The reconciliation pipeline's real intermediate representation: what the `:render`/`:plan` phase of `GgenIgniter.Reactors.ReconcileReactor` actually produces is NOT a bare rendered-text string -- it is a `%PendingActuation{}` per intended output, describing the FULL intended delta (identity, prior vs. desired content hash, the exact operation, ownership, provenance, and how to revert it) so the `:admit` step can reason about (and refuse) the entire planned change set BEFORE a single byte is written, and the `:actuate` step can execute each item by its `operation` field directly instead of re-deriving "create vs. replace vs. delete" from scratch. - [GgenIgniter.ProjectConfig](GgenIgniter.ProjectConfig.md): Mirrors Rust `GgenManifest`, the `ggen.toml` root config struct (`~/ggen/crates/ggen-config/src/manifest/types.rs:171-265`, confirmed against the real, current `~/ggen/ggen.toml` example). - [GgenIgniter.ProjectConfig.GenerationConfig](GgenIgniter.ProjectConfig.GenerationConfig.md): Mirrors Rust `GenerationConfig` -- `ggen.toml [generation]` (`manifest/types.rs:367-384`). - [GgenIgniter.ProjectConfig.GenerationRule](GgenIgniter.ProjectConfig.GenerationRule.md): Mirrors Rust `GenerationRule` -- `ggen.toml [[generation.rules]]` (`manifest/types.rs:...`). - [GgenIgniter.ProjectConfig.InferenceConfig](GgenIgniter.ProjectConfig.InferenceConfig.md): Mirrors Rust `InferenceConfig` -- `ggen.toml [inference]` (`manifest/types.rs:331-343`). - [GgenIgniter.ProjectConfig.InferenceRule](GgenIgniter.ProjectConfig.InferenceRule.md): Mirrors Rust `InferenceRule` -- `ggen.toml [[inference.rules]]` (`manifest/types.rs:345-365`). - [GgenIgniter.ProjectConfig.Law](GgenIgniter.ProjectConfig.Law.md): Mirrors Rust `Law` (`manifest/types.rs:...` near `GgenManifest`). - [GgenIgniter.ProjectConfig.OntologyConfig](GgenIgniter.ProjectConfig.OntologyConfig.md): Mirrors Rust `OntologyConfig` -- `ggen.toml [ontology]`/`[ontology.prefixes]` (`manifest/types.rs:307-329`). - [GgenIgniter.ProjectConfig.ProjectSection](GgenIgniter.ProjectConfig.ProjectSection.md): Mirrors Rust `ProjectConfig` -- `ggen.toml [project]` (`manifest/types.rs:280-305`). - [GgenIgniter.ProjectConfig.QuerySource](GgenIgniter.ProjectConfig.QuerySource.md): Mirrors Rust `#[serde(untagged)] enum QuerySource { Pack{..}, File{..}, Inline{..} }`. As with `GgenIgniter.Frontmatter.MatchSpec`, represented as a tagged tuple since Elixir has no untagged-union deserialization primitive. - [GgenIgniter.ProjectConfig.TemplateSource](GgenIgniter.ProjectConfig.TemplateSource.md): Mirrors Rust `#[serde(untagged)] enum TemplateSource { Pack{..}, File{..}, Inline{..}, Git{..}, Package{..} }`. - [GgenIgniter.ProjectConfig.ValidationConfig](GgenIgniter.ProjectConfig.ValidationConfig.md): Mirrors Rust `ValidationConfig` -- `ggen.toml [validation]` (`manifest/types.rs:553-609`). - [GgenIgniter.ProjectConfig.ValidationRule](GgenIgniter.ProjectConfig.ValidationRule.md): Mirrors Rust `ValidationRule` (`manifest/types.rs:611-637`) -- the closest typed shape to a "gate" in the real Rust codebase. - [GgenIgniter.Query](GgenIgniter.Query.md): Executes a SPARQL SELECT query against an in-memory RDF.Graph via the `sparql` library and reshapes results into plain maps keyed by column name (mirroring the row shape ggen's own Tera templates already consume). - [GgenIgniter.Query.Oxigraph](GgenIgniter.Query.Oxigraph.md): Runs SPARQL queries via a real, native oxigraph engine (a Rustler NIF over `~/ggen/crates/ggen-graph-wasm`'s `OxigraphEngine`, `native/ggen_graph_nif`) instead of the pure-Elixir `sparql` hex package used by `GgenIgniter.Query.run/2`. - [GgenIgniter.Query.Qlever](GgenIgniter.Query.Qlever.md): Alternate `GgenIgniter.Query`-shaped engine backed by a real QLever SPARQL endpoint, via `gno`'s `Gno.Store.Adapters.Qlever` adapter for endpoint resolution and `SPARQL.Client` (both real, hex-published deps -- rdf-elixir's own `sparql_client`) for protocol execution. - [GgenIgniter.Reactors.CompensationTelemetryMiddleware](GgenIgniter.Reactors.CompensationTelemetryMiddleware.md): A real `Reactor.Middleware` (behaviour confirmed by reading `deps/reactor/lib/reactor/middleware.ex` directly, not guessed) that counts compensation/undo lifecycle events for `GgenIgniter.Reactors.ReconcileReactor` runs into a real, named, public ETS table (`@table`, `:ggen_igniter_compensation_counters`) -- Chicago-style: real ETS state, read back via `counters/0`, never an interaction-based "was `event/3` called" assertion. - [GgenIgniter.Reactors.Examples.ExpenseApprovalReactor](GgenIgniter.Reactors.Examples.ExpenseApprovalReactor.md): Manufactured example Reactor demonstrating the full plain-Reactor DSL surface documented at https://reactor.hexdocs.pm/reactor-cheatsheet.html — the same primitives `GgenIgniter.Reactors.ReconcileReactor` itself uses in production. - [GgenIgniter.Reactors.Examples.ReceiptSubReactor](GgenIgniter.Reactors.Examples.ReceiptSubReactor.md): Hand-authored (not ggen-manufactured) real sub-Reactor, composed into `GgenIgniter.Reactors.Examples.ExpenseApprovalReactor` via `compose/2` — demonstrates `Reactor.compose/2` embedding one real Reactor inside another, per `Reactor.Dsl.Compose`. - [GgenIgniter.Reactors.Examples.RefundLedger](GgenIgniter.Reactors.Examples.RefundLedger.md): Hand-authored (not ggen-manufactured) real, test-observable Agent-backed ledger recording every real refund issued by `GgenIgniter.Reactors.Examples.Support.refund/2` — a genuine collaborator with real process state (per this repo's Chicago-testing discipline: not a mock, a real `Agent` other tests can assert against), so tests can prove the generated Reactor's `compensate`/`undo` steps actually ran. - [GgenIgniter.Reactors.Examples.Support](GgenIgniter.Reactors.Examples.Support.md): Hand-authored (not ggen-manufactured) real collaborator functions backing the ontology-generated `GgenIgniter.Reactors.Examples.ExpenseApprovalReactor` practice/dogfood example. Deliberately simple, deterministic, real logic (no external I/O, no mocks) so `test/ggen_igniter_expense_approval_reactor_test.exs` can exercise the generated Reactor's real `run`/`compensate`/`undo` paths per this repo's Chicago-testing discipline — a real collaborator, not a stub standing in for one. - [GgenIgniter.Reactors.Examples.Support.Charge](GgenIgniter.Reactors.Examples.Support.Charge.md): A minimal in-memory charge record for the example domain. - [GgenIgniter.Reactors.Examples.Support.User](GgenIgniter.Reactors.Examples.Support.User.md): A minimal in-memory user record for the example domain. - [GgenIgniter.Reactors.ReconcileReactor](GgenIgniter.Reactors.ReconcileReactor.md): The real Reactor coordination pipeline for `ggen_igniter`'s reconciliation spine: observe -> load -> resolve -> query -> render -> admit -> actuate -> verify -> finalize evidence. `use Reactor` (plain `Reactor`, NOT `Ash.Reactor` -- `ggen_igniter` must stay usable without Ash as a mandatory runtime dependency). - [GgenIgniter.Receipt](GgenIgniter.Receipt.md): CONSTRUCTION NOTE (2026-08-27): at the time this module was written, a concurrent workflow was tasked with building THIS file plus `lib/ggen_igniter/reactors/reconcile_reactor.ex` and `lib/ggen_igniter/telemetry/ocel_emitter.ex`. This repo was polled for their existence 6 times (~90 seconds, per the concurrency protocol given) and none had appeared yet -- only a forward-referencing comment in `mix.exs` evidenced the other workflow had started. This module is therefore this session's own from-scratch, best-effort construction, not a correction to pre-existing code. If the concurrent workflow's real version lands later, reconcile the two (do not silently prefer either) -- `standing`'s four required atoms and the append-only-jsonl-per-admitted- attempt contract below are the two load-bearing requirements a merged version must keep. - [GgenIgniter.Reconcile](GgenIgniter.Reconcile.md): The one real reconciliation pipeline implementation: `Ontology.load!/1` -> engine `prepare!/2` + `run/2` -> `Render.render/2` -> `Actuate.write_file!/3` (or `Actuate.eval_code!/2` under `mode: eval`). - [GgenIgniter.Refactors.SafeRename](GgenIgniter.Refactors.SafeRename.md): A local, non-vendored-dependency-patching route around two real, confirmed defects in `Igniter.Refactors.Rename.rename_function/4` (`deps/igniter`, v0.8.3, `lib/igniter/refactors/rename.ex`) -- reproduced and cited exactly in `test/ggen_igniter_upstream_rename_blocker_test.exs` - [GgenIgniter.Render](GgenIgniter.Render.md): Renders an EEx template string against query-result bindings into a final source-code string. Stdlib EEx, not a Tera/Liquid port -- see pack.toml for why. - [GgenIgniter.Render.Tera](GgenIgniter.Render.Tera.md): A real, hand-rolled Tera-compatible template renderer. - [GgenIgniter.SchemaDispatch](GgenIgniter.SchemaDispatch.md): The single shared classifier + dispatch point deciding which of `ggen.toml`'s two independently-defined schemas a project uses, mirroring `ggen_config::classify_ggen_toml` (`~/ggen/crates/ggen-config/src/config_schema.rs`) and `ggen-engine`'s `schema_dispatch::load` (`~/ggen/crates/ggen-engine/src/schema_dispatch.rs`). - [GgenIgniter.ShellHook](GgenIgniter.ShellHook.md): Real subprocess execution for a template's `sh_before:`/`sh_after:` frontmatter fields (`GgenIgniter.Frontmatter.sh_before`/`sh_after`) -- the one function this module exists for is `run/3`. - [GgenIgniter.Stream.Examples.SensorSink](GgenIgniter.Stream.Examples.SensorSink.md): Real threshold-crossing abstraction from raw numeric sensor samples into canonical `%Event{}` observations. - [GgenIgniter.SyncShellout](GgenIgniter.SyncShellout.md): GGEN-1805 (`docs/jira/v26.9.1/04-SYNC-SHELLOUT-AND-VERIFY.md`): a real `System.cmd/3` shellout to an external `ggen sync run` binary, modeled on the three existing subprocess-check patterns in `lib/mix/tasks/ggen_igniter.doctor.ex` (`check_git_status/0`, `check_nif_compiles/0`, `check_hex_publish_readiness/0`) -- an explicit `cd:` argument (never implicit `File.cwd!()`, per `check_nif_compiles/0`'s `ggen_igniter_root/0` precedent), `stderr_to_stdout: true`, a typed `{:ok, output} | {:error, {exit_code, output}}` return (never a bare raise or boolean), and a `rescue` clause converting a raised `ErlangError` (binary not on `PATH`, the same failure mode `check_git_status/0` already handles for `git`) into the same error shape with a distinguishable `:enoent` sentinel exit code, rather than crashing the caller. - [GgenIgniter.SyncVerify](GgenIgniter.SyncVerify.md): Orchestrates GGEN-1805 (`GgenIgniter.SyncShellout`) and GGEN-1806 (`GgenIgniter.GateVerify`) into the single pipeline `docs/jira/v26.9.1/04-SYNC-SHELLOUT-AND-VERIFY.md` describes: shell out to a real `ggen sync run`, and only on a real exit-0 success, run the pack's own gate queries against the regenerated ontology. - [GgenIgniter.Telemetry.Ocel2Export](GgenIgniter.Telemetry.Ocel2Export.md): Serializes ggen_igniter's in-memory OCEL-shaped events into a real **OCEL 2.0 JSON** document that `beam4pm`'s importer accepts as-is. - [GgenIgniter.Telemetry.OcelEmitter](GgenIgniter.Telemetry.OcelEmitter.md): CONSTRUCTION NOTE (2026-08-27): at the time this module was written, a concurrent workflow was tasked with building `lib/ggen_igniter/receipt.ex`, `lib/ggen_igniter/reactors/reconcile_reactor.ex`, and this file (`lib/ggen_igniter/telemetry/ocel_emitter.ex`). This repo was polled for their existence 6 times (roughly 90 seconds, per the concurrency protocol given) and none of the three had appeared -- only a forward-referencing comment in `mix.exs` (`{:reactor, "~> 1.0"}`'s dependency note) evidenced that the other workflow had *started*. This module is therefore this session's own from-scratch, best-effort construction, not a correction to pre-existing code. If the concurrent workflow's real version lands later, reconcile the two rather than silently preferring either. - [GgenIgniter.WriteOutcome](GgenIgniter.WriteOutcome.md): Mirrors Rust `enum WriteOutcome { Written, Skipped(String), Injected }` (`~/ggen/crates/ggen-engine/src/write.rs:50-58`), and the `FM-WRITE-NNN` error-code convention (`write.rs:67-79,` `error.rs:194-197`). - Exceptions - [GgenIgniter.GgenToml.IO.Error](GgenIgniter.GgenToml.IO.Error.md) ## Mix Tasks - [mix ggen_igniter.doctor](Mix.Tasks.GgenIgniter.Doctor.md): Diagnostic task: `mix ggen_igniter.doctor [--pack NAME | --pack-dir DIR] [--engine sparql|qlever] [--store-id ID] [--fix] [--strict]`. - [mix ggen_igniter.fortune5_ready](Mix.Tasks.GgenIgniter.Fortune5Ready.md): GGEN-1807 (`docs/jira/v26.9.1/05-FORTUNE5-READY-MIX-TASK-AND-E2E-TEST.md`): assembles tickets 01-04 into one real, runnable `mix ggen_igniter.fortune5_ready [--path DIR] [--pack-dir DIR] [--bundle NAME] [--yes]` task, modeled directly on `lib/mix/tasks/ggen_igniter.install.ex`'s real structure (`use Igniter.Mix.Task`, the `"--help" in argv` early-exit precedent, and the defensive-probe-before-acting pattern that `install.ex`'s `deps_probe/1` demonstrates). - [mix ggen_igniter.install](Mix.Tasks.GgenIgniter.Install.md): Installer task: `mix ggen_igniter.install [--domain Module.Name] [--otp-app name] [--yes]`. - [mix ggen_igniter.ocel.seal](Mix.Tasks.GgenIgniter.Ocel.Seal.md): Appends an outcome event to an OCEL 2.0 log written by a composed manufacture task, based on what the caller OBSERVED after the run. - [mix ggen_igniter.plan](Mix.Tasks.GgenIgniter.Plan.md): Read-only admission preview: `mix ggen_igniter.plan --template path.eex [--pack NAME | --pack-dir DIR] --query name=path.rq (repeatable) [--engine oxigraph|sparql|qlever] [--store-id ID] [--json]`. - [mix ggen_igniter.replay](Mix.Tasks.GgenIgniter.Replay.md): Diagnostic task: `mix ggen_igniter.replay [--verify-only] [--json] [--manifest-dir DIR]`. - [mix ggen_igniter.sync](Mix.Tasks.GgenIgniter.Sync.md): CLI entrypoint: `mix ggen_igniter.sync --ontology path.ttl --query name=path.rq (repeatable) --template path.eex --out path.ex`. - [mix ggen_igniter.verify](Mix.Tasks.GgenIgniter.Verify.md): Runs a pack's fail-CLOSED checks against its ontology: the inverted companion queries in `/verify/*.unbound.rq` and the per-gate cardinality contract in `/verify/cardinality.json`.