igniter 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +3 -3
- data/README.md +150 -658
- data/docs/README.md +59 -0
- data/docs/assets/README.md +8 -0
- data/docs/concepts/README.md +18 -0
- data/docs/concepts/igniter.md +119 -0
- data/docs/dev/README.md +48 -0
- data/docs/dev/agent-orchestra-dna.md +271 -0
- data/docs/dev/ai-agents-target-plan.md +178 -0
- data/docs/dev/application-target-plan.md +45 -0
- data/docs/dev/application-web-integration.md +59 -0
- data/docs/dev/application-web-poc-pattern-guide.md +167 -0
- data/docs/dev/architect-supervisor-bootstrap.md +322 -0
- data/docs/dev/architecture.md +20 -0
- data/docs/dev/cluster-target-plan.md +43 -0
- data/docs/dev/contract-persistence-target-plan.md +426 -0
- data/docs/dev/current-runtime-snapshot.md +73 -0
- data/docs/dev/data-ownership.md +29 -0
- data/docs/dev/document-rotation.md +51 -0
- data/docs/dev/embed-target-plan.md +51 -0
- data/docs/dev/igniter-web-dsl-sketch.md +151 -0
- data/docs/dev/igniter-web-target-plan.md +56 -0
- data/docs/dev/mcp-adapter-package-spec.md +81 -0
- data/docs/dev/module-system.md +46 -0
- data/docs/dev/package-map.md +112 -0
- data/docs/guide/README.md +77 -0
- data/docs/guide/ai-and-tools.md +33 -0
- data/docs/guide/api-and-runtime.md +38 -0
- data/docs/guide/app.md +45 -0
- data/docs/guide/application-capsules.md +139 -0
- data/docs/guide/application-showcase-portfolio.md +181 -0
- data/docs/guide/cli.md +70 -0
- data/docs/guide/cluster.md +55 -0
- data/docs/guide/configuration.md +31 -0
- data/docs/guide/contract-class-dsl.md +154 -0
- data/docs/guide/core-runtime-features.md +34 -0
- data/docs/guide/core.md +43 -0
- data/docs/guide/credentials.md +51 -0
- data/docs/guide/deployment-modes.md +63 -0
- data/docs/guide/distributed-workflows.md +21 -0
- data/docs/guide/getting-started.md +49 -0
- data/docs/guide/how-tos.md +33 -0
- data/docs/guide/igniter-lang-foundation.md +133 -0
- data/docs/guide/integrations.md +47 -0
- data/docs/guide/interactive-app-structure.md +91 -0
- data/docs/guide/store-adapters.md +183 -0
- data/docs/research/README.md +131 -0
- data/docs/research/contract-persistence-landing-zone.md +126 -0
- data/docs/research/contract-persistence-organic-model.md +279 -0
- data/docs/research/contract-persistence-organic-model.ru.md +277 -0
- data/docs/research/horizon-protocol.md +180 -0
- data/docs/research/igniter-lang-convergence-report.md +338 -0
- data/docs/research/project-status-horizon-report.md +363 -0
- data/docs/research/vision-handoff-protocol.md +141 -0
- data/docs/research/wizard-type-spec-architecture.md +293 -0
- data/docs/research/wizard-type-spec-research-request.md +134 -0
- data/docs/store/README.md +7 -0
- data/docs/store/convergence-audit.md +901 -0
- data/examples/README.md +152 -344
- data/examples/catalog.rb +1486 -0
- data/examples/cluster/incident_workflow.rb +70 -0
- data/examples/cluster/incidents.rb +63 -0
- data/examples/cluster/mesh_diagnostics.rb +89 -0
- data/examples/cluster/remediation.rb +63 -0
- data/examples/cluster/routing.rb +65 -0
- data/examples/contracts/aggregates.rb +39 -0
- data/examples/contracts/auditing.rb +35 -0
- data/examples/contracts/basic_pricing.rb +31 -0
- data/examples/contracts/branching.rb +36 -0
- data/examples/contracts/build_effect_executor_pack.rb +88 -0
- data/examples/contracts/build_your_own_pack.rb +82 -0
- data/examples/contracts/capabilities.rb +34 -0
- data/examples/contracts/class_callable.rb +45 -0
- data/examples/contracts/class_pricing.rb +32 -0
- data/examples/contracts/collection.rb +44 -0
- data/examples/contracts/commerce.rb +44 -0
- data/examples/contracts/compose_your_own_packs.rb +110 -0
- data/examples/contracts/composition.rb +61 -0
- data/examples/contracts/content_addressing.rb +33 -0
- data/examples/contracts/contractable_service.rb +43 -0
- data/examples/contracts/contractable_shadow.rb +69 -0
- data/examples/contracts/create_pack.rb +105 -0
- data/examples/contracts/dataflow.rb +57 -0
- data/examples/contracts/debug.rb +32 -0
- data/examples/contracts/debug_pack_authoring.rb +31 -0
- data/examples/contracts/diagnostics.rb +33 -0
- data/examples/contracts/differential.rb +97 -0
- data/examples/contracts/effects.rb +34 -0
- data/examples/contracts/embed_class_registration.rb +40 -0
- data/examples/contracts/embed_human_sugar.rb +106 -0
- data/examples/contracts/formula.rb +32 -0
- data/examples/contracts/incremental.rb +44 -0
- data/examples/contracts/introspection.rb +48 -0
- data/examples/contracts/invariants.rb +54 -0
- data/examples/contracts/journal.rb +37 -0
- data/examples/contracts/lang_foundation.rb +37 -0
- data/examples/contracts/mcp.rb +62 -0
- data/examples/contracts/mcp_host.rb +55 -0
- data/examples/contracts/mcp_server.rb +25 -0
- data/examples/contracts/piecewise.rb +30 -0
- data/examples/contracts/provenance.rb +55 -0
- data/examples/contracts/reactive.rb +62 -0
- data/examples/contracts/saga.rb +56 -0
- data/examples/contracts/scale.rb +30 -0
- data/examples/contracts/step_result.rb +58 -0
- data/examples/run.rb +163 -0
- data/lib/igniter/cluster.rb +3 -0
- data/lib/igniter/contract.rb +1 -326
- data/lib/igniter/monorepo_packages.rb +16 -0
- data/lib/igniter/version.rb +1 -1
- data/lib/igniter/web.rb +3 -0
- data/lib/igniter.rb +51 -43
- data/packages/igniter-agents/README.md +44 -0
- data/packages/igniter-agents/lib/igniter/agents/agent_definition.rb +26 -0
- data/packages/igniter-agents/lib/igniter/agents/agent_run.rb +47 -0
- data/packages/igniter-agents/lib/igniter/agents/agent_turn.rb +34 -0
- data/packages/igniter-agents/lib/igniter/agents/runner.rb +56 -0
- data/packages/igniter-agents/lib/igniter/agents/tool_call.rb +26 -0
- data/packages/igniter-agents/lib/igniter/agents/trace_event.rb +24 -0
- data/packages/igniter-agents/lib/igniter/agents.rb +33 -0
- data/packages/igniter-agents/lib/igniter-agents.rb +3 -0
- data/packages/igniter-ai/README.md +42 -0
- data/packages/igniter-ai/lib/igniter/ai/client.rb +18 -0
- data/packages/igniter-ai/lib/igniter/ai/error.rb +14 -0
- data/packages/igniter-ai/lib/igniter/ai/model_request.rb +28 -0
- data/packages/igniter-ai/lib/igniter/ai/model_response.rb +31 -0
- data/packages/igniter-ai/lib/igniter/ai/providers/fake.rb +24 -0
- data/packages/igniter-ai/lib/igniter/ai/providers/openai_responses.rb +100 -0
- data/packages/igniter-ai/lib/igniter/ai/providers/recorded.rb +40 -0
- data/packages/igniter-ai/lib/igniter/ai/usage.rb +32 -0
- data/packages/igniter-ai/lib/igniter/ai.rb +28 -0
- data/packages/igniter-ai/lib/igniter-ai.rb +3 -0
- data/packages/igniter-application/README.md +194 -0
- data/packages/igniter-application/lib/igniter/application/agent_definition.rb +38 -0
- data/packages/igniter-application/lib/igniter/application/agent_registry.rb +33 -0
- data/packages/igniter-application/lib/igniter/application/agent_runtime.rb +29 -0
- data/packages/igniter-application/lib/igniter/application/agents_builder.rb +26 -0
- data/packages/igniter-application/lib/igniter/application/ai_builder.rb +26 -0
- data/packages/igniter-application/lib/igniter/application/ai_provider_definition.rb +59 -0
- data/packages/igniter-application/lib/igniter/application/ai_registry.rb +34 -0
- data/packages/igniter-application/lib/igniter/application/application_assembly_plan.rb +67 -0
- data/packages/igniter-application/lib/igniter/application/application_blueprint.rb +227 -0
- data/packages/igniter-application/lib/igniter/application/application_capsule_report.rb +61 -0
- data/packages/igniter-application/lib/igniter/application/application_composition_report.rb +161 -0
- data/packages/igniter-application/lib/igniter/application/application_handoff_manifest.rb +100 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_commit_readiness.rb +182 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_dry_run_result.rb +190 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_ledger_commit.rb +285 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_ledger_verification.rb +301 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_operation_digest.rb +68 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_plan.rb +200 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_plan_verification.rb +140 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_readiness.rb +226 -0
- data/packages/igniter-application/lib/igniter/application/application_host_activation_receipt.rb +151 -0
- data/packages/igniter-application/lib/igniter/application/application_layout.rb +91 -0
- data/packages/igniter-application/lib/igniter/application/application_load_path.rb +38 -0
- data/packages/igniter-application/lib/igniter/application/application_load_report.rb +74 -0
- data/packages/igniter-application/lib/igniter/application/application_manifest.rb +65 -0
- data/packages/igniter-application/lib/igniter/application/application_structure_entry.rb +58 -0
- data/packages/igniter-application/lib/igniter/application/application_structure_plan.rb +128 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_applied_verification.rb +301 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_apply_plan.rb +167 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_apply_result.rb +321 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_bundle_artifact.rb +160 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_bundle_plan.rb +125 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_bundle_verification.rb +154 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_intake_plan.rb +195 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_inventory.rb +153 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_readiness.rb +260 -0
- data/packages/igniter-application/lib/igniter/application/application_transfer_receipt.rb +179 -0
- data/packages/igniter-application/lib/igniter/application/artifact_reference.rb +39 -0
- data/packages/igniter-application/lib/igniter/application/boot_phase.rb +27 -0
- data/packages/igniter-application/lib/igniter/application/boot_plan.rb +55 -0
- data/packages/igniter-application/lib/igniter/application/boot_report.rb +70 -0
- data/packages/igniter-application/lib/igniter/application/capsule_builder.rb +396 -0
- data/packages/igniter-application/lib/igniter/application/capsule_export.rb +26 -0
- data/packages/igniter-application/lib/igniter/application/capsule_import.rb +38 -0
- data/packages/igniter-application/lib/igniter/application/collection_invoker.rb +54 -0
- data/packages/igniter-application/lib/igniter/application/collection_transport_adapter.rb +37 -0
- data/packages/igniter-application/lib/igniter/application/compose_invoker.rb +51 -0
- data/packages/igniter-application/lib/igniter/application/compose_transport_adapter.rb +34 -0
- data/packages/igniter-application/lib/igniter/application/config.rb +86 -0
- data/packages/igniter-application/lib/igniter/application/config_builder.rb +69 -0
- data/packages/igniter-application/lib/igniter/application/contract_registry.rb +30 -0
- data/packages/igniter-application/lib/igniter/application/credential_definition.rb +65 -0
- data/packages/igniter-application/lib/igniter/application/credential_store.rb +68 -0
- data/packages/igniter-application/lib/igniter/application/embedded_host.rb +23 -0
- data/packages/igniter-application/lib/igniter/application/environment.rb +1071 -0
- data/packages/igniter-application/lib/igniter/application/feature_slice.rb +61 -0
- data/packages/igniter-application/lib/igniter/application/feature_slice_report.rb +43 -0
- data/packages/igniter-application/lib/igniter/application/file_backed_host_activation_ledger_adapter.rb +138 -0
- data/packages/igniter-application/lib/igniter/application/file_backed_installed_capsule_registry.rb +132 -0
- data/packages/igniter-application/lib/igniter/application/flow_declaration.rb +62 -0
- data/packages/igniter-application/lib/igniter/application/flow_event.rb +50 -0
- data/packages/igniter-application/lib/igniter/application/flow_session_snapshot.rb +98 -0
- data/packages/igniter-application/lib/igniter/application/installed_capsule_entry.rb +47 -0
- data/packages/igniter-application/lib/igniter/application/interface.rb +11 -0
- data/packages/igniter-application/lib/igniter/application/kernel.rb +385 -0
- data/packages/igniter-application/lib/igniter/application/lifecycle_plan_step.rb +38 -0
- data/packages/igniter-application/lib/igniter/application/manual_loader.rb +18 -0
- data/packages/igniter-application/lib/igniter/application/manual_scheduler.rb +15 -0
- data/packages/igniter-application/lib/igniter/application/memory_session_store.rb +33 -0
- data/packages/igniter-application/lib/igniter/application/missing_credential_error.rb +23 -0
- data/packages/igniter-application/lib/igniter/application/mount_intent.rb +48 -0
- data/packages/igniter-application/lib/igniter/application/mount_registration.rb +49 -0
- data/packages/igniter-application/lib/igniter/application/pending_action.rb +39 -0
- data/packages/igniter-application/lib/igniter/application/pending_input.rb +45 -0
- data/packages/igniter-application/lib/igniter/application/plan_executor.rb +93 -0
- data/packages/igniter-application/lib/igniter/application/profile.rb +178 -0
- data/packages/igniter-application/lib/igniter/application/provider.rb +19 -0
- data/packages/igniter-application/lib/igniter/application/provider_lifecycle_report.rb +72 -0
- data/packages/igniter-application/lib/igniter/application/provider_lifecycle_result.rb +54 -0
- data/packages/igniter-application/lib/igniter/application/provider_registration.rb +19 -0
- data/packages/igniter-application/lib/igniter/application/rack_host.rb +311 -0
- data/packages/igniter-application/lib/igniter/application/seam_lifecycle_result.rb +62 -0
- data/packages/igniter-application/lib/igniter/application/service_definition.rb +25 -0
- data/packages/igniter-application/lib/igniter/application/service_registry.rb +58 -0
- data/packages/igniter-application/lib/igniter/application/session_entry.rb +46 -0
- data/packages/igniter-application/lib/igniter/application/shutdown_plan.rb +45 -0
- data/packages/igniter-application/lib/igniter/application/shutdown_report.rb +54 -0
- data/packages/igniter-application/lib/igniter/application/snapshot.rb +35 -0
- data/packages/igniter-application/lib/igniter/application/transport_request.rb +40 -0
- data/packages/igniter-application/lib/igniter/application/transport_response.rb +22 -0
- data/packages/igniter-application/lib/igniter/application.rb +354 -0
- data/packages/igniter-application/lib/igniter-application.rb +3 -0
- data/packages/igniter-cluster/README.md +116 -0
- data/packages/igniter-cluster/lib/igniter/cluster/active_incident_set.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/admission_policy.rb +158 -0
- data/packages/igniter-cluster/lib/igniter/cluster/admission_result.rb +47 -0
- data/packages/igniter-cluster/lib/igniter/cluster/capability_catalog.rb +66 -0
- data/packages/igniter-cluster/lib/igniter/cluster/capability_definition.rb +42 -0
- data/packages/igniter-cluster/lib/igniter/cluster/capability_query.rb +162 -0
- data/packages/igniter-cluster/lib/igniter/cluster/capability_router.rb +11 -0
- data/packages/igniter-cluster/lib/igniter/cluster/cluster_diagnostics_executor.rb +184 -0
- data/packages/igniter-cluster/lib/igniter/cluster/cluster_diagnostics_report.rb +49 -0
- data/packages/igniter-cluster/lib/igniter/cluster/cluster_event.rb +34 -0
- data/packages/igniter-cluster/lib/igniter/cluster/cluster_event_log.rb +27 -0
- data/packages/igniter-cluster/lib/igniter/cluster/cluster_incident.rb +42 -0
- data/packages/igniter-cluster/lib/igniter/cluster/decision_explanation.rb +31 -0
- data/packages/igniter-cluster/lib/igniter/cluster/direct_placement.rb +11 -0
- data/packages/igniter-cluster/lib/igniter/cluster/discovery_feed.rb +22 -0
- data/packages/igniter-cluster/lib/igniter/cluster/environment.rb +380 -0
- data/packages/igniter-cluster/lib/igniter/cluster/errors.rb +9 -0
- data/packages/igniter-cluster/lib/igniter/cluster/failover_plan.rb +45 -0
- data/packages/igniter-cluster/lib/igniter/cluster/failover_step.rb +32 -0
- data/packages/igniter-cluster/lib/igniter/cluster/health_policy.rb +124 -0
- data/packages/igniter-cluster/lib/igniter/cluster/incident_action.rb +49 -0
- data/packages/igniter-cluster/lib/igniter/cluster/incident_entry.rb +98 -0
- data/packages/igniter-cluster/lib/igniter/cluster/incident_executor.rb +145 -0
- data/packages/igniter-cluster/lib/igniter/cluster/incident_workflow.rb +64 -0
- data/packages/igniter-cluster/lib/igniter/cluster/kernel.rb +75 -0
- data/packages/igniter-cluster/lib/igniter/cluster/kernel_seams.rb +249 -0
- data/packages/igniter-cluster/lib/igniter/cluster/lease_grant.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/lease_plan.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/lease_policy.rb +96 -0
- data/packages/igniter-cluster/lib/igniter/cluster/membership_delta.rb +36 -0
- data/packages/igniter-cluster/lib/igniter/cluster/membership_feed.rb +24 -0
- data/packages/igniter-cluster/lib/igniter/cluster/membership_projection.rb +45 -0
- data/packages/igniter-cluster/lib/igniter/cluster/membership_snapshot.rb +64 -0
- data/packages/igniter-cluster/lib/igniter/cluster/memory_incident_registry.rb +169 -0
- data/packages/igniter-cluster/lib/igniter/cluster/memory_peer_registry.rb +24 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_admission.rb +24 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_admission_result.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_attempt.rb +51 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_request.rb +71 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_response.rb +28 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_trace.rb +32 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_executor.rb +497 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_membership.rb +89 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_membership_event.rb +32 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_membership_source.rb +49 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_retry_policy.rb +42 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh_trust_policy.rb +131 -0
- data/packages/igniter-cluster/lib/igniter/cluster/operator_timeline.rb +33 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership_claim.rb +30 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership_plan.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership_policy.rb +100 -0
- data/packages/igniter-cluster/lib/igniter/cluster/peer.rb +86 -0
- data/packages/igniter-cluster/lib/igniter/cluster/peer_discovery.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/peer_health.rb +55 -0
- data/packages/igniter-cluster/lib/igniter/cluster/peer_profile.rb +102 -0
- data/packages/igniter-cluster/lib/igniter/cluster/peer_topology.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/peer_view.rb +42 -0
- data/packages/igniter-cluster/lib/igniter/cluster/permissive_admission.rb +11 -0
- data/packages/igniter-cluster/lib/igniter/cluster/placement_decision.rb +38 -0
- data/packages/igniter-cluster/lib/igniter/cluster/placement_policy.rb +131 -0
- data/packages/igniter-cluster/lib/igniter/cluster/plan_action_result.rb +72 -0
- data/packages/igniter-cluster/lib/igniter/cluster/plan_execution_report.rb +57 -0
- data/packages/igniter-cluster/lib/igniter/cluster/plan_executor.rb +314 -0
- data/packages/igniter-cluster/lib/igniter/cluster/policy_admission.rb +18 -0
- data/packages/igniter-cluster/lib/igniter/cluster/policy_placement.rb +69 -0
- data/packages/igniter-cluster/lib/igniter/cluster/policy_router.rb +70 -0
- data/packages/igniter-cluster/lib/igniter/cluster/profile.rb +97 -0
- data/packages/igniter-cluster/lib/igniter/cluster/projection_executor.rb +42 -0
- data/packages/igniter-cluster/lib/igniter/cluster/projection_policy.rb +107 -0
- data/packages/igniter-cluster/lib/igniter/cluster/projection_report.rb +35 -0
- data/packages/igniter-cluster/lib/igniter/cluster/projection_stage.rb +32 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rebalance_move.rb +30 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rebalance_plan.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/recovery_timeline.rb +33 -0
- data/packages/igniter-cluster/lib/igniter/cluster/registry_membership_source.rb +97 -0
- data/packages/igniter-cluster/lib/igniter/cluster/remediation_plan.rb +45 -0
- data/packages/igniter-cluster/lib/igniter/cluster/remediation_policy.rb +119 -0
- data/packages/igniter-cluster/lib/igniter/cluster/remediation_step.rb +44 -0
- data/packages/igniter-cluster/lib/igniter/cluster/route.rb +34 -0
- data/packages/igniter-cluster/lib/igniter/cluster/route_policy.rb +104 -0
- data/packages/igniter-cluster/lib/igniter/cluster/route_request.rb +61 -0
- data/packages/igniter-cluster/lib/igniter/cluster/topology_policy.rb +154 -0
- data/packages/igniter-cluster/lib/igniter/cluster/transport_adapter.rb +53 -0
- data/packages/igniter-cluster/lib/igniter/cluster.rb +108 -0
- data/packages/igniter-cluster/lib/igniter-cluster.rb +3 -0
- data/packages/igniter-contracts/README.md +239 -0
- data/packages/igniter-contracts/lib/igniter/contracts/api.rb +92 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/baseline_pack.rb +141 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/const_pack.rb +29 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/dsl_keyword.rb +21 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/hook_result_policies.rb +47 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/hook_spec.rb +73 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/hook_specs.rb +74 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/kernel.rb +220 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/node_type.rb +26 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/ordered_registry.rb +55 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/pack.rb +13 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/pack_manifest.rb +131 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/path_access.rb +76 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/profile.rb +133 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/project_pack.rb +42 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/registry.rb +57 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly/step_result_pack.rb +42 -0
- data/packages/igniter-contracts/lib/igniter/contracts/assembly.rb +18 -0
- data/packages/igniter-contracts/lib/igniter/contracts/contract.rb +135 -0
- data/packages/igniter-contracts/lib/igniter/contracts/contractable.rb +288 -0
- data/packages/igniter-contracts/lib/igniter/contracts/environment.rb +51 -0
- data/packages/igniter-contracts/lib/igniter/contracts/errors.rb +47 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/baseline_normalizers.rb +23 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/baseline_runtime.rb +55 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/baseline_validators.rb +113 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/builder.rb +43 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/compilation_report.rb +46 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/compiled_graph.rb +21 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/compiler.rb +66 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/const_runtime.rb +15 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/diagnostics.rb +24 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/diagnostics_report.rb +40 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/diagnostics_section.rb +37 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/effect_invocation.rb +26 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/execution_request.rb +28 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/execution_result.rb +32 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/inline_executor.rb +19 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/mutable_named_values.rb +52 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/named_values.rb +48 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/operation.rb +42 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/runtime.rb +43 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result.rb +51 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result_diagnostics.rb +35 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result_runtime.rb +51 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result_validators.rb +44 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/structured_dump.rb +49 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/validation_finding.rb +28 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution/validation_report.rb +46 -0
- data/packages/igniter-contracts/lib/igniter/contracts/execution.rb +28 -0
- data/packages/igniter-contracts/lib/igniter/contracts.rb +54 -0
- data/packages/igniter-contracts/lib/igniter/lang/backend.rb +19 -0
- data/packages/igniter-contracts/lib/igniter/lang/backends/ruby.rb +42 -0
- data/packages/igniter-contracts/lib/igniter/lang/diagnostic_payload.rb +174 -0
- data/packages/igniter-contracts/lib/igniter/lang/metadata_carrier_manifest.rb +112 -0
- data/packages/igniter-contracts/lib/igniter/lang/metadata_manifest.rb +128 -0
- data/packages/igniter-contracts/lib/igniter/lang/receipt_payload.rb +152 -0
- data/packages/igniter-contracts/lib/igniter/lang/schema_compatibility_diagnostic.rb +300 -0
- data/packages/igniter-contracts/lib/igniter/lang/types.rb +84 -0
- data/packages/igniter-contracts/lib/igniter/lang/verification_report.rb +226 -0
- data/packages/igniter-contracts/lib/igniter/lang.rb +27 -0
- data/packages/igniter-contracts/lib/igniter-contracts.rb +3 -0
- data/packages/igniter-embed/README.md +360 -0
- data/packages/igniter-embed/lib/igniter/embed/config.rb +155 -0
- data/packages/igniter-embed/lib/igniter/embed/container.rb +165 -0
- data/packages/igniter-embed/lib/igniter/embed/contract_handle.rb +23 -0
- data/packages/igniter-embed/lib/igniter/embed/contract_naming.rb +38 -0
- data/packages/igniter-embed/lib/igniter/embed/contractable/acceptance.rb +52 -0
- data/packages/igniter-embed/lib/igniter/embed/contractable/adapters.rb +33 -0
- data/packages/igniter-embed/lib/igniter/embed/contractable/config.rb +234 -0
- data/packages/igniter-embed/lib/igniter/embed/contractable/runner.rb +393 -0
- data/packages/igniter-embed/lib/igniter/embed/contractable/sugar_builder.rb +145 -0
- data/packages/igniter-embed/lib/igniter/embed/contractable.rb +29 -0
- data/packages/igniter-embed/lib/igniter/embed/contracts_builder.rb +54 -0
- data/packages/igniter-embed/lib/igniter/embed/errors.rb +14 -0
- data/packages/igniter-embed/lib/igniter/embed/execution_envelope.rb +50 -0
- data/packages/igniter-embed/lib/igniter/embed/host_builder.rb +39 -0
- data/packages/igniter-embed/lib/igniter/embed/rails.rb +21 -0
- data/packages/igniter-embed/lib/igniter/embed/registry.rb +78 -0
- data/packages/igniter-embed/lib/igniter/embed/sugar_expansion.rb +152 -0
- data/packages/igniter-embed/lib/igniter/embed.rb +38 -0
- data/packages/igniter-embed/lib/igniter-embed.rb +3 -0
- data/packages/igniter-extensions/README.md +381 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/aggregate_pack.rb +103 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit/builder.rb +132 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit/event.rb +34 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit/snapshot.rb +44 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit_pack.rb +60 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/branch_pack.rb +199 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/declaration.rb +31 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/error.rb +35 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/policy.rb +20 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/report.rb +47 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/violation.rb +30 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities_pack.rb +146 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/collection_pack.rb +212 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/commerce_pack.rb +91 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/compose_pack.rb +213 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing/cache.rb +59 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing/content_key.rb +63 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing/declaration.rb +47 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing_pack.rb +90 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/profile.rb +196 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/report.rb +85 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/scaffold.rb +461 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/scope.rb +79 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/wizard.rb +269 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/workflow.rb +189 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/workflow_step.rb +51 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/write_result.rb +48 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/write_step.rb +63 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/writer.rb +131 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator_pack.rb +128 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/aggregate_operators.rb +119 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/aggregate_state.rb +60 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/builder.rb +66 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/collection_result.rb +70 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/diff.rb +37 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/item_result.rb +44 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/result.rb +58 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/session.rb +173 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/window_filter.rb +49 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow_pack.rb +66 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/pack_audit.rb +181 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/pack_snapshot.rb +46 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/profile_snapshot.rb +50 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/report.rb +50 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug_pack.rb +115 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/divergence.rb +37 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/formatter.rb +85 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/report.rb +83 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/runner.rb +136 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential_pack.rb +61 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/execution_report_pack.rb +38 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/formatter.rb +60 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/node_state.rb +30 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/result.rb +65 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/session.rb +146 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental_pack.rb +40 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/builder.rb +27 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/cases_report.rb +47 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/error.rb +34 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/invariant.rb +30 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/report.rb +45 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/suite.rb +36 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/violation.rb +39 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants_pack.rb +88 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/journal_pack.rb +55 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/language/formula_pack.rb +185 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/language/piecewise_pack.rb +166 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/language/scale_pack.rb +147 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/lookup_pack.rb +50 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/creator_session.rb +105 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/tool_argument.rb +35 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/tool_definition.rb +33 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/tool_result.rb +28 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp_pack.rb +335 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/builder.rb +80 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/lineage.rb +59 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/node_trace.rb +53 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/text_formatter.rb +62 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance_pack.rb +52 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/builder.rb +43 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/dispatch_result.rb +59 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/engine.rb +79 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/event.rb +36 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/matcher.rb +20 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/plan.rb +58 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/subscription.rb +29 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive_pack.rb +169 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/compensation.rb +25 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/compensation_record.rb +28 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/compensation_set.rb +47 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/formatter.rb +39 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/result.rb +56 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/runner.rb +124 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga_pack.rb +56 -0
- data/packages/igniter-extensions/lib/igniter/extensions/contracts.rb +445 -0
- data/packages/igniter-extensions/lib/igniter/extensions.rb +6 -0
- data/packages/igniter-extensions/lib/igniter-extensions.rb +3 -0
- data/packages/igniter-hub/README.md +25 -0
- data/packages/igniter-hub/lib/igniter/hub/catalog_entry.rb +35 -0
- data/packages/igniter-hub/lib/igniter/hub/local_catalog.rb +51 -0
- data/packages/igniter-hub/lib/igniter/hub.rb +16 -0
- data/packages/igniter-hub/lib/igniter-hub.rb +3 -0
- data/packages/igniter-mcp-adapter/README.md +65 -0
- data/packages/igniter-mcp-adapter/exe/igniter-mcp-adapter +6 -0
- data/packages/igniter-mcp-adapter/lib/igniter/mcp/adapter/host.rb +226 -0
- data/packages/igniter-mcp-adapter/lib/igniter/mcp/adapter/server.rb +148 -0
- data/packages/igniter-mcp-adapter/lib/igniter/mcp/adapter.rb +40 -0
- data/packages/igniter-mcp-adapter/lib/igniter-mcp-adapter.rb +5 -0
- data/packages/igniter-web/README.md +539 -0
- data/packages/igniter-web/lib/igniter/web/api.rb +49 -0
- data/packages/igniter-web/lib/igniter/web/application.rb +99 -0
- data/packages/igniter-web/lib/igniter/web/application_web_mount.rb +162 -0
- data/packages/igniter-web/lib/igniter/web/arbre.rb +41 -0
- data/packages/igniter-web/lib/igniter/web/component.rb +103 -0
- data/packages/igniter-web/lib/igniter/web/components/view_action_node.rb +38 -0
- data/packages/igniter-web/lib/igniter/web/components/view_ask_node.rb +52 -0
- data/packages/igniter-web/lib/igniter/web/components/view_chat_node.rb +34 -0
- data/packages/igniter-web/lib/igniter/web/components/view_compare_node.rb +41 -0
- data/packages/igniter-web/lib/igniter/web/components/view_node.rb +30 -0
- data/packages/igniter-web/lib/igniter/web/components/view_screen.rb +34 -0
- data/packages/igniter-web/lib/igniter/web/components/view_stream_node.rb +32 -0
- data/packages/igniter-web/lib/igniter/web/components/view_zone.rb +26 -0
- data/packages/igniter-web/lib/igniter/web/components.rb +10 -0
- data/packages/igniter-web/lib/igniter/web/composer.rb +84 -0
- data/packages/igniter-web/lib/igniter/web/composition_finding.rb +16 -0
- data/packages/igniter-web/lib/igniter/web/composition_policy.rb +88 -0
- data/packages/igniter-web/lib/igniter/web/composition_preset.rb +131 -0
- data/packages/igniter-web/lib/igniter/web/composition_result.rb +27 -0
- data/packages/igniter-web/lib/igniter/web/flow_interaction_adapter.rb +104 -0
- data/packages/igniter-web/lib/igniter/web/flow_surface_projection.rb +121 -0
- data/packages/igniter-web/lib/igniter/web/interaction_target.rb +50 -0
- data/packages/igniter-web/lib/igniter/web/mount_context.rb +80 -0
- data/packages/igniter-web/lib/igniter/web/page.rb +110 -0
- data/packages/igniter-web/lib/igniter/web/record.rb +54 -0
- data/packages/igniter-web/lib/igniter/web/screen_spec.rb +109 -0
- data/packages/igniter-web/lib/igniter/web/surface_manifest.rb +370 -0
- data/packages/igniter-web/lib/igniter/web/surface_structure.rb +57 -0
- data/packages/igniter-web/lib/igniter/web/view_graph.rb +25 -0
- data/packages/igniter-web/lib/igniter/web/view_graph_renderer.rb +63 -0
- data/packages/igniter-web/lib/igniter/web/view_node.rb +37 -0
- data/packages/igniter-web/lib/igniter/web.rb +107 -0
- data/packages/igniter-web/lib/igniter-web.rb +3 -0
- metadata +547 -308
- data/docs/API_V2.md +0 -537
- data/docs/APPLICATION_V1.md +0 -253
- data/docs/ARCHITECTURE_V2.md +0 -317
- data/docs/BACKLOG.md +0 -166
- data/docs/BRANCHES_V1.md +0 -213
- data/docs/CAPABILITIES_V1.md +0 -207
- data/docs/COLLECTIONS_V1.md +0 -303
- data/docs/CONSENSUS_V1.md +0 -477
- data/docs/CONTENT_ADDRESSING_V1.md +0 -221
- data/docs/DATAFLOW_V1.md +0 -274
- data/docs/DISTRIBUTED_CONTRACTS_V1.md +0 -493
- data/docs/IGNITER_CONCEPTS.md +0 -81
- data/docs/LLM_V1.md +0 -335
- data/docs/MESH_V1.md +0 -732
- data/docs/NODE_CACHE_V1.md +0 -324
- data/docs/PATTERNS.md +0 -411
- data/docs/PROACTIVE_AGENTS_V1.md +0 -293
- data/docs/SERVER_V1.md +0 -512
- data/docs/SKILLS_V1.md +0 -213
- data/docs/STORE_ADAPTERS.md +0 -154
- data/docs/TEMPORAL_V1.md +0 -174
- data/docs/TOOLS_V1.md +0 -347
- data/docs/TRANSCRIPTION_V1.md +0 -403
- data/examples/agents.rb +0 -150
- data/examples/async_store.rb +0 -47
- data/examples/basic_pricing.rb +0 -27
- data/examples/collection.rb +0 -43
- data/examples/collection_partial_failure.rb +0 -50
- data/examples/composition.rb +0 -39
- data/examples/consensus.rb +0 -239
- data/examples/dataflow.rb +0 -308
- data/examples/diagnostics.rb +0 -28
- data/examples/differential.rb +0 -161
- data/examples/distributed_server.rb +0 -94
- data/examples/distributed_workflow.rb +0 -52
- data/examples/effects.rb +0 -184
- data/examples/elocal_webhook.rb +0 -1
- data/examples/incremental.rb +0 -142
- data/examples/invariants.rb +0 -179
- data/examples/llm_tools.rb +0 -237
- data/examples/marketing_ergonomics.rb +0 -57
- data/examples/mesh.rb +0 -239
- data/examples/mesh_discovery.rb +0 -267
- data/examples/mesh_gossip.rb +0 -162
- data/examples/order_pipeline.rb +0 -163
- data/examples/provenance.rb +0 -122
- data/examples/ringcentral_routing.rb +0 -269
- data/examples/saga.rb +0 -110
- data/lib/igniter/agent/mailbox.rb +0 -96
- data/lib/igniter/agent/message.rb +0 -21
- data/lib/igniter/agent/ref.rb +0 -86
- data/lib/igniter/agent/runner.rb +0 -129
- data/lib/igniter/agent/state_holder.rb +0 -23
- data/lib/igniter/agent.rb +0 -155
- data/lib/igniter/agents/ai/alert_agent.rb +0 -111
- data/lib/igniter/agents/ai/chain_agent.rb +0 -127
- data/lib/igniter/agents/ai/critic_agent.rb +0 -163
- data/lib/igniter/agents/ai/evaluator_agent.rb +0 -193
- data/lib/igniter/agents/ai/evolution_agent.rb +0 -286
- data/lib/igniter/agents/ai/health_check_agent.rb +0 -122
- data/lib/igniter/agents/ai/observer_agent.rb +0 -184
- data/lib/igniter/agents/ai/planner_agent.rb +0 -210
- data/lib/igniter/agents/ai/router_agent.rb +0 -131
- data/lib/igniter/agents/ai/self_reflection_agent.rb +0 -175
- data/lib/igniter/agents/observability/metrics_agent.rb +0 -130
- data/lib/igniter/agents/pipeline/batch_processor_agent.rb +0 -131
- data/lib/igniter/agents/proactive_agent.rb +0 -208
- data/lib/igniter/agents/reliability/retry_agent.rb +0 -99
- data/lib/igniter/agents/scheduling/cron_agent.rb +0 -110
- data/lib/igniter/agents.rb +0 -56
- data/lib/igniter/application/app_config.rb +0 -32
- data/lib/igniter/application/autoloader.rb +0 -18
- data/lib/igniter/application/generator.rb +0 -157
- data/lib/igniter/application/scheduler.rb +0 -109
- data/lib/igniter/application/yml_loader.rb +0 -39
- data/lib/igniter/application.rb +0 -174
- data/lib/igniter/capabilities.rb +0 -68
- data/lib/igniter/compiler/compiled_graph.rb +0 -180
- data/lib/igniter/compiler/graph_compiler.rb +0 -70
- data/lib/igniter/compiler/type_resolver.rb +0 -54
- data/lib/igniter/compiler/validation_context.rb +0 -61
- data/lib/igniter/compiler/validation_pipeline.rb +0 -32
- data/lib/igniter/compiler/validator.rb +0 -19
- data/lib/igniter/compiler/validators/await_validator.rb +0 -53
- data/lib/igniter/compiler/validators/callable_validator.rb +0 -125
- data/lib/igniter/compiler/validators/dependencies_validator.rb +0 -241
- data/lib/igniter/compiler/validators/outputs_validator.rb +0 -66
- data/lib/igniter/compiler/validators/remote_validator.rb +0 -60
- data/lib/igniter/compiler/validators/type_compatibility_validator.rb +0 -84
- data/lib/igniter/compiler/validators/uniqueness_validator.rb +0 -60
- data/lib/igniter/compiler.rb +0 -20
- data/lib/igniter/consensus/cluster.rb +0 -183
- data/lib/igniter/consensus/errors.rb +0 -14
- data/lib/igniter/consensus/executors.rb +0 -43
- data/lib/igniter/consensus/node.rb +0 -320
- data/lib/igniter/consensus/read_query.rb +0 -30
- data/lib/igniter/consensus/state_machine.rb +0 -58
- data/lib/igniter/consensus.rb +0 -58
- data/lib/igniter/content_addressing.rb +0 -133
- data/lib/igniter/dataflow/aggregate_operators.rb +0 -147
- data/lib/igniter/dataflow/aggregate_state.rb +0 -77
- data/lib/igniter/dataflow/diff.rb +0 -37
- data/lib/igniter/dataflow/diff_state.rb +0 -81
- data/lib/igniter/dataflow/incremental_collection_result.rb +0 -39
- data/lib/igniter/dataflow/window_filter.rb +0 -48
- data/lib/igniter/dataflow.rb +0 -65
- data/lib/igniter/diagnostics/auditing/report/console_formatter.rb +0 -80
- data/lib/igniter/diagnostics/auditing/report/markdown_formatter.rb +0 -22
- data/lib/igniter/diagnostics/introspection/formatters/mermaid_formatter.rb +0 -58
- data/lib/igniter/diagnostics/introspection/formatters/text_tree_formatter.rb +0 -44
- data/lib/igniter/diagnostics/report.rb +0 -349
- data/lib/igniter/diagnostics.rb +0 -8
- data/lib/igniter/differential/divergence.rb +0 -29
- data/lib/igniter/differential/formatter.rb +0 -96
- data/lib/igniter/differential/report.rb +0 -86
- data/lib/igniter/differential/runner.rb +0 -130
- data/lib/igniter/differential.rb +0 -51
- data/lib/igniter/dsl/contract_builder.rb +0 -495
- data/lib/igniter/dsl/schema_builder.rb +0 -73
- data/lib/igniter/dsl.rb +0 -9
- data/lib/igniter/effect.rb +0 -91
- data/lib/igniter/effect_registry.rb +0 -78
- data/lib/igniter/errors.rb +0 -79
- data/lib/igniter/events/bus.rb +0 -44
- data/lib/igniter/events/event.rb +0 -82
- data/lib/igniter/events.rb +0 -9
- data/lib/igniter/execution_report/builder.rb +0 -54
- data/lib/igniter/execution_report/formatter.rb +0 -50
- data/lib/igniter/execution_report/node_entry.rb +0 -24
- data/lib/igniter/execution_report/report.rb +0 -65
- data/lib/igniter/execution_report.rb +0 -32
- data/lib/igniter/executor.rb +0 -134
- data/lib/igniter/executor_registry.rb +0 -44
- data/lib/igniter/extensions/auditing/timeline.rb +0 -103
- data/lib/igniter/extensions/auditing.rb +0 -10
- data/lib/igniter/extensions/capabilities.rb +0 -39
- data/lib/igniter/extensions/content_addressing.rb +0 -5
- data/lib/igniter/extensions/dataflow.rb +0 -117
- data/lib/igniter/extensions/differential.rb +0 -114
- data/lib/igniter/extensions/execution_report.rb +0 -27
- data/lib/igniter/extensions/incremental.rb +0 -50
- data/lib/igniter/extensions/introspection/graph_formatter.rb +0 -103
- data/lib/igniter/extensions/introspection/plan_formatter.rb +0 -55
- data/lib/igniter/extensions/introspection/runtime_formatter.rb +0 -117
- data/lib/igniter/extensions/introspection.rb +0 -12
- data/lib/igniter/extensions/invariants.rb +0 -116
- data/lib/igniter/extensions/mesh.rb +0 -31
- data/lib/igniter/extensions/provenance.rb +0 -45
- data/lib/igniter/extensions/reactive/engine.rb +0 -83
- data/lib/igniter/extensions/reactive/matcher.rb +0 -21
- data/lib/igniter/extensions/reactive/reaction.rb +0 -18
- data/lib/igniter/extensions/reactive.rb +0 -12
- data/lib/igniter/extensions/saga.rb +0 -74
- data/lib/igniter/extensions.rb +0 -10
- data/lib/igniter/fingerprint.rb +0 -43
- data/lib/igniter/incremental/formatter.rb +0 -81
- data/lib/igniter/incremental/result.rb +0 -69
- data/lib/igniter/incremental/tracker.rb +0 -108
- data/lib/igniter/incremental.rb +0 -50
- data/lib/igniter/integrations/agents.rb +0 -18
- data/lib/igniter/integrations/llm/config.rb +0 -113
- data/lib/igniter/integrations/llm/context.rb +0 -74
- data/lib/igniter/integrations/llm/executor.rb +0 -352
- data/lib/igniter/integrations/llm/providers/anthropic.rb +0 -181
- data/lib/igniter/integrations/llm/providers/base.rb +0 -33
- data/lib/igniter/integrations/llm/providers/ollama.rb +0 -137
- data/lib/igniter/integrations/llm/providers/openai.rb +0 -182
- data/lib/igniter/integrations/llm/transcription/providers/assemblyai.rb +0 -200
- data/lib/igniter/integrations/llm/transcription/providers/base.rb +0 -122
- data/lib/igniter/integrations/llm/transcription/providers/deepgram.rb +0 -162
- data/lib/igniter/integrations/llm/transcription/providers/openai.rb +0 -102
- data/lib/igniter/integrations/llm/transcription/transcriber.rb +0 -145
- data/lib/igniter/integrations/llm/transcription/transcript_result.rb +0 -29
- data/lib/igniter/integrations/llm.rb +0 -95
- data/lib/igniter/integrations/rails/cable_adapter.rb +0 -49
- data/lib/igniter/integrations/rails/contract_job.rb +0 -76
- data/lib/igniter/integrations/rails/generators/contract/contract_generator.rb +0 -22
- data/lib/igniter/integrations/rails/generators/install/install_generator.rb +0 -33
- data/lib/igniter/integrations/rails/railtie.rb +0 -25
- data/lib/igniter/integrations/rails/webhook_concern.rb +0 -49
- data/lib/igniter/integrations/rails.rb +0 -12
- data/lib/igniter/invariant.rb +0 -50
- data/lib/igniter/memory/agent_memory.rb +0 -104
- data/lib/igniter/memory/episode.rb +0 -29
- data/lib/igniter/memory/fact.rb +0 -27
- data/lib/igniter/memory/memorable.rb +0 -90
- data/lib/igniter/memory/reflection_cycle.rb +0 -96
- data/lib/igniter/memory/reflection_record.rb +0 -28
- data/lib/igniter/memory/store.rb +0 -115
- data/lib/igniter/memory/stores/in_memory.rb +0 -136
- data/lib/igniter/memory/stores/sqlite.rb +0 -284
- data/lib/igniter/memory.rb +0 -80
- data/lib/igniter/mesh/announcer.rb +0 -55
- data/lib/igniter/mesh/config.rb +0 -45
- data/lib/igniter/mesh/discovery.rb +0 -39
- data/lib/igniter/mesh/errors.rb +0 -31
- data/lib/igniter/mesh/gossip.rb +0 -47
- data/lib/igniter/mesh/peer.rb +0 -21
- data/lib/igniter/mesh/peer_registry.rb +0 -51
- data/lib/igniter/mesh/poller.rb +0 -77
- data/lib/igniter/mesh/router.rb +0 -109
- data/lib/igniter/mesh.rb +0 -85
- data/lib/igniter/metrics/collector.rb +0 -131
- data/lib/igniter/metrics/prometheus_exporter.rb +0 -104
- data/lib/igniter/metrics/snapshot.rb +0 -8
- data/lib/igniter/metrics.rb +0 -37
- data/lib/igniter/model/aggregate_node.rb +0 -34
- data/lib/igniter/model/await_node.rb +0 -21
- data/lib/igniter/model/branch_node.rb +0 -46
- data/lib/igniter/model/collection_node.rb +0 -32
- data/lib/igniter/model/composition_node.rb +0 -22
- data/lib/igniter/model/compute_node.rb +0 -90
- data/lib/igniter/model/effect_node.rb +0 -37
- data/lib/igniter/model/graph.rb +0 -15
- data/lib/igniter/model/input_node.rb +0 -27
- data/lib/igniter/model/node.rb +0 -22
- data/lib/igniter/model/output_node.rb +0 -41
- data/lib/igniter/model/remote_node.rb +0 -42
- data/lib/igniter/model.rb +0 -18
- data/lib/igniter/node_cache.rb +0 -231
- data/lib/igniter/property_testing/formatter.rb +0 -66
- data/lib/igniter/property_testing/generators.rb +0 -115
- data/lib/igniter/property_testing/result.rb +0 -45
- data/lib/igniter/property_testing/run.rb +0 -43
- data/lib/igniter/property_testing/runner.rb +0 -47
- data/lib/igniter/property_testing.rb +0 -64
- data/lib/igniter/provenance/builder.rb +0 -97
- data/lib/igniter/provenance/lineage.rb +0 -82
- data/lib/igniter/provenance/node_trace.rb +0 -65
- data/lib/igniter/provenance/text_formatter.rb +0 -70
- data/lib/igniter/provenance.rb +0 -29
- data/lib/igniter/registry.rb +0 -67
- data/lib/igniter/replication/bootstrapper.rb +0 -61
- data/lib/igniter/replication/bootstrappers/gem.rb +0 -32
- data/lib/igniter/replication/bootstrappers/git.rb +0 -39
- data/lib/igniter/replication/bootstrappers/tarball.rb +0 -56
- data/lib/igniter/replication/expansion_plan.rb +0 -38
- data/lib/igniter/replication/expansion_planner.rb +0 -142
- data/lib/igniter/replication/manifest.rb +0 -45
- data/lib/igniter/replication/network_topology.rb +0 -123
- data/lib/igniter/replication/node_role.rb +0 -42
- data/lib/igniter/replication/reflective_replication_agent.rb +0 -238
- data/lib/igniter/replication/replication_agent.rb +0 -87
- data/lib/igniter/replication/role_registry.rb +0 -73
- data/lib/igniter/replication/ssh_session.rb +0 -77
- data/lib/igniter/replication.rb +0 -54
- data/lib/igniter/runtime/cache.rb +0 -126
- data/lib/igniter/runtime/collection_result.rb +0 -111
- data/lib/igniter/runtime/deferred_result.rb +0 -40
- data/lib/igniter/runtime/execution.rb +0 -416
- data/lib/igniter/runtime/input_validator.rb +0 -129
- data/lib/igniter/runtime/invalidator.rb +0 -52
- data/lib/igniter/runtime/job_worker.rb +0 -18
- data/lib/igniter/runtime/node_state.rb +0 -56
- data/lib/igniter/runtime/planner.rb +0 -126
- data/lib/igniter/runtime/resolver.rb +0 -758
- data/lib/igniter/runtime/result.rb +0 -117
- data/lib/igniter/runtime/runner_factory.rb +0 -20
- data/lib/igniter/runtime/runners/inline_runner.rb +0 -21
- data/lib/igniter/runtime/runners/store_runner.rb +0 -29
- data/lib/igniter/runtime/runners/thread_pool_runner.rb +0 -37
- data/lib/igniter/runtime/stores/active_record_store.rb +0 -53
- data/lib/igniter/runtime/stores/file_store.rb +0 -91
- data/lib/igniter/runtime/stores/memory_store.rb +0 -93
- data/lib/igniter/runtime/stores/redis_store.rb +0 -93
- data/lib/igniter/runtime.rb +0 -26
- data/lib/igniter/saga/compensation.rb +0 -31
- data/lib/igniter/saga/compensation_record.rb +0 -20
- data/lib/igniter/saga/executor.rb +0 -85
- data/lib/igniter/saga/formatter.rb +0 -49
- data/lib/igniter/saga/result.rb +0 -47
- data/lib/igniter/saga.rb +0 -56
- data/lib/igniter/server/client.rb +0 -166
- data/lib/igniter/server/config.rb +0 -34
- data/lib/igniter/server/handlers/base.rb +0 -105
- data/lib/igniter/server/handlers/contracts_handler.rb +0 -15
- data/lib/igniter/server/handlers/event_handler.rb +0 -32
- data/lib/igniter/server/handlers/execute_handler.rb +0 -43
- data/lib/igniter/server/handlers/health_handler.rb +0 -32
- data/lib/igniter/server/handlers/liveness_handler.rb +0 -20
- data/lib/igniter/server/handlers/manifest_handler.rb +0 -34
- data/lib/igniter/server/handlers/metrics_handler.rb +0 -51
- data/lib/igniter/server/handlers/peers_handler.rb +0 -115
- data/lib/igniter/server/handlers/readiness_handler.rb +0 -47
- data/lib/igniter/server/handlers/status_handler.rb +0 -27
- data/lib/igniter/server/http_server.rb +0 -146
- data/lib/igniter/server/rack_app.rb +0 -35
- data/lib/igniter/server/registry.rb +0 -56
- data/lib/igniter/server/router.rb +0 -108
- data/lib/igniter/server/server_logger.rb +0 -52
- data/lib/igniter/server.rb +0 -73
- data/lib/igniter/skill/feedback.rb +0 -116
- data/lib/igniter/skill/output_schema.rb +0 -110
- data/lib/igniter/skill.rb +0 -218
- data/lib/igniter/stream_loop.rb +0 -80
- data/lib/igniter/supervisor.rb +0 -167
- data/lib/igniter/temporal.rb +0 -84
- data/lib/igniter/tool/discoverable.rb +0 -151
- data/lib/igniter/tool.rb +0 -52
- data/lib/igniter/tool_registry.rb +0 -144
- data/lib/igniter/type_system.rb +0 -44
- /data/docs/{EXECUTION_MODEL_V2.md → dev/execution-model.md} +0 -0
data/README.md
CHANGED
|
@@ -1,724 +1,216 @@
|
|
|
1
1
|
# Igniter
|
|
2
2
|
|
|
3
|
-
Igniter is a Ruby
|
|
4
|
-
|
|
5
|
-
- lazy output resolution and selective cache invalidation
|
|
6
|
-
- typed input validation with defaults and required fields
|
|
7
|
-
- nested contract composition with isolated child executions
|
|
8
|
-
- declarative routing (`branch`) and fan-out (`collection`)
|
|
9
|
-
- distributed workflows: `await` events across process boundaries
|
|
10
|
-
- multi-node deployments via `igniter-server` and the `remote:` DSL
|
|
11
|
-
- LLM compute nodes with Ollama, Anthropic, and OpenAI providers
|
|
12
|
-
- Rails integration: ActiveJob, ActionCable, webhook handlers, generators
|
|
13
|
-
- runtime auditing, diagnostics reports, and reactive side effects
|
|
14
|
-
- graph and runtime introspection (text, Mermaid)
|
|
15
|
-
- ergonomic DSL helpers: `const`, `lookup`, `map`, `project`, `aggregate`, `guard`, `export`, `expose`, `effect`, `on_success`, `scope`, `namespace`
|
|
16
|
-
- `Igniter::Application` — application scaffold with YAML config, autoloading, scheduler, and `igniter-server new` generator
|
|
17
|
-
- capability-based security: declare executor resource requirements, enforce `Policy` at runtime
|
|
18
|
-
- temporal contracts: reproducible historical execution via an explicit `as_of` time input
|
|
19
|
-
- content-addressed computation: `pure` executors cached by input fingerprint across executions and processes
|
|
20
|
-
|
|
21
|
-
## Installation
|
|
3
|
+
Igniter is a pre-v1 Ruby framework for building contracts-native applications,
|
|
4
|
+
companions, and agent-aware systems.
|
|
22
5
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
## Quick Start
|
|
28
|
-
|
|
29
|
-
```ruby
|
|
30
|
-
require "igniter"
|
|
31
|
-
|
|
32
|
-
class PriceContract < Igniter::Contract
|
|
33
|
-
define do
|
|
34
|
-
input :order_total, type: :numeric
|
|
35
|
-
input :country, type: :string
|
|
36
|
-
input :vat_rate, type: :numeric, default: 0.2
|
|
37
|
-
|
|
38
|
-
compute :effective_vat_rate, depends_on: %i[country vat_rate] do |country:, vat_rate:|
|
|
39
|
-
country == "UA" ? vat_rate : 0.0
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
compute :gross_total, depends_on: %i[order_total effective_vat_rate] do |order_total:, effective_vat_rate:|
|
|
43
|
-
order_total * (1 + effective_vat_rate)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
output :gross_total
|
|
47
|
-
end
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
contract = PriceContract.new(order_total: 100, country: "UA")
|
|
51
|
-
contract.result.gross_total # => 120.0
|
|
52
|
-
|
|
53
|
-
contract.update_inputs(order_total: 150)
|
|
54
|
-
contract.result.gross_total # => 180.0
|
|
55
|
-
|
|
56
|
-
contract.diagnostics_text # compact execution summary
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Features
|
|
60
|
-
|
|
61
|
-
- **Contracts**: declare inputs, compute nodes, outputs, and compositions in a validated graph.
|
|
62
|
-
- **Compiler**: validate dependency graphs, types, and cycles before runtime; errors are surfaced at load time.
|
|
63
|
-
- **Runtime**: cache resolved nodes and invalidate only affected downstream nodes on input change.
|
|
64
|
-
- **Typed inputs**: validate types, defaults, and required fields at execution boundaries.
|
|
65
|
-
- **Composition**: execute nested contracts with isolated child executions.
|
|
66
|
-
- **Branch**: declarative routing — select one child contract from ordered cases at runtime.
|
|
67
|
-
- **Collection**: declarative fan-out — run one child contract per item in an array.
|
|
68
|
-
- **Distributed workflows**: `await` external events; resume via `deliver_event`.
|
|
69
|
-
- **igniter-server**: host contracts as a TCP/Rack HTTP service; call remote contracts with the `remote:` DSL.
|
|
70
|
-
- **LLM integration**: compute nodes powered by Ollama, Anthropic, or OpenAI providers.
|
|
71
|
-
- **Rails integration**: Railtie, ActiveJob base class, ActionCable adapter, webhook controller mixin.
|
|
72
|
-
- **Auditing**: collect execution timelines and snapshots.
|
|
73
|
-
- **Diagnostics**: compact text, Markdown, or structured reports for triage.
|
|
74
|
-
- **Reactive**: subscribe declaratively to runtime events with `effect`, `on_success`, `on_failure`.
|
|
75
|
-
- **Introspection**: render graphs as text or Mermaid; inspect runtime state.
|
|
76
|
-
- **Capabilities**: executors declare what resources they need (`:network`, `:database`, …); `Policy` denies them at runtime.
|
|
77
|
-
- **Temporal contracts**: inject `as_of` time input automatically; replay any historical computation with the original timestamp.
|
|
78
|
-
- **Content addressing**: `pure` executors get a universal cache key — identical inputs return a cached result across executions, processes, and deployments.
|
|
79
|
-
- **Incremental dataflow**: `mode: :incremental` on collection nodes — only added/changed items run, unchanged items reuse cached results, removed items are retracted. O(change) not O(total).
|
|
80
|
-
|
|
81
|
-
## Quick Start Recipes
|
|
82
|
-
|
|
83
|
-
Runnable examples live in [`examples/`](examples) and are smoke-tested by `spec/igniter/example_scripts_spec.rb`.
|
|
84
|
-
See [`examples/README.md`](examples/README.md) for a quick index and [`docs/PATTERNS.md`](docs/PATTERNS.md) for composable patterns.
|
|
85
|
-
|
|
86
|
-
### 1. Basic Pricing Contract
|
|
87
|
-
|
|
88
|
-
```ruby
|
|
89
|
-
class PriceContract < Igniter::Contract
|
|
90
|
-
define do
|
|
91
|
-
input :order_total, type: :numeric
|
|
92
|
-
input :country, type: :string
|
|
93
|
-
|
|
94
|
-
compute :vat_rate, depends_on: [:country] do |country:|
|
|
95
|
-
country == "UA" ? 0.2 : 0.0
|
|
96
|
-
end
|
|
97
|
-
|
|
98
|
-
compute :gross_total, depends_on: %i[order_total vat_rate] do |order_total:, vat_rate:|
|
|
99
|
-
order_total * (1 + vat_rate)
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
output :gross_total
|
|
103
|
-
end
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
PriceContract.new(order_total: 100, country: "UA").result.gross_total
|
|
107
|
-
# => 120.0
|
|
108
|
-
```
|
|
109
|
-
|
|
110
|
-
### 2. Nested Composition
|
|
111
|
-
|
|
112
|
-
```ruby
|
|
113
|
-
class CheckoutContract < Igniter::Contract
|
|
114
|
-
define do
|
|
115
|
-
input :order_total, type: :numeric
|
|
116
|
-
input :country, type: :string
|
|
117
|
-
|
|
118
|
-
compose :pricing, contract: PriceContract, inputs: {
|
|
119
|
-
order_total: :order_total,
|
|
120
|
-
country: :country
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
output :pricing
|
|
124
|
-
end
|
|
125
|
-
end
|
|
126
|
-
|
|
127
|
-
CheckoutContract.new(order_total: 100, country: "UA").result.pricing.gross_total
|
|
128
|
-
# => 120.0
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
### 3. Diagnostics and Introspection
|
|
132
|
-
|
|
133
|
-
```ruby
|
|
134
|
-
contract = PriceContract.new(order_total: 100, country: "UA")
|
|
135
|
-
contract.result.gross_total
|
|
136
|
-
|
|
137
|
-
contract.result.states
|
|
138
|
-
contract.result.explain(:gross_total)
|
|
139
|
-
contract.diagnostics.to_h
|
|
140
|
-
contract.diagnostics_text
|
|
141
|
-
contract.diagnostics_markdown
|
|
142
|
-
contract.audit_snapshot
|
|
143
|
-
|
|
144
|
-
PriceContract.graph.to_text
|
|
145
|
-
PriceContract.graph.to_mermaid
|
|
146
|
-
```
|
|
147
|
-
|
|
148
|
-
### 4. Machine-Readable Data
|
|
149
|
-
|
|
150
|
-
```ruby
|
|
151
|
-
contract.result.to_h # => { gross_total: 120.0 }
|
|
152
|
-
contract.result.as_json
|
|
153
|
-
contract.execution.as_json
|
|
154
|
-
contract.events.map(&:as_json)
|
|
155
|
-
```
|
|
156
|
-
|
|
157
|
-
### 5. Async Store and Resume
|
|
158
|
-
|
|
159
|
-
```ruby
|
|
160
|
-
class AsyncQuoteExecutor < Igniter::Executor
|
|
161
|
-
def call(order_total:)
|
|
162
|
-
defer(token: "quote-#{order_total}", payload: { kind: "pricing_quote" })
|
|
163
|
-
end
|
|
164
|
-
end
|
|
165
|
-
|
|
166
|
-
class AsyncPricingContract < Igniter::Contract
|
|
167
|
-
run_with runner: :store
|
|
168
|
-
|
|
169
|
-
define do
|
|
170
|
-
input :order_total, type: :numeric
|
|
171
|
-
compute :quote_total, depends_on: [:order_total], call: AsyncQuoteExecutor
|
|
172
|
-
compute :gross_total, depends_on: [:quote_total] do |quote_total:|
|
|
173
|
-
quote_total * 1.2
|
|
174
|
-
end
|
|
175
|
-
output :gross_total
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
|
|
179
|
-
contract = AsyncPricingContract.new(order_total: 100)
|
|
180
|
-
deferred = contract.result.gross_total
|
|
181
|
-
execution_id = contract.execution.events.execution_id
|
|
182
|
-
|
|
183
|
-
resumed = AsyncPricingContract.resume_from_store(
|
|
184
|
-
execution_id, token: deferred.token, value: 150
|
|
185
|
-
)
|
|
186
|
-
resumed.result.gross_total # => 180.0
|
|
187
|
-
```
|
|
188
|
-
|
|
189
|
-
### 6. Ergonomic DSL
|
|
190
|
-
|
|
191
|
-
```ruby
|
|
192
|
-
class MarketingQuoteContract < Igniter::Contract
|
|
193
|
-
define do
|
|
194
|
-
input :service, type: :string
|
|
195
|
-
input :zip_code, type: :string
|
|
196
|
-
|
|
197
|
-
const :vendor_id, "eLocal"
|
|
198
|
-
|
|
199
|
-
scope :routing do
|
|
200
|
-
map :trade_name, from: :service do |service:|
|
|
201
|
-
%w[heating cooling ventilation].include?(service.downcase) ? "HVAC" : service
|
|
202
|
-
end
|
|
203
|
-
end
|
|
204
|
-
|
|
205
|
-
scope :pricing do
|
|
206
|
-
lookup :trade, with: :trade_name do |trade_name:|
|
|
207
|
-
{ name: trade_name, base_bid: 45.0 }
|
|
208
|
-
end
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
namespace :validation do
|
|
212
|
-
guard :zip_supported, with: :zip_code, in: %w[60601 10001], message: "Unsupported zip"
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
compute :quote, with: %i[vendor_id trade zip_code zip_supported] do |vendor_id:, trade:, zip_code:, zip_supported:|
|
|
216
|
-
zip_supported
|
|
217
|
-
{ vendor_id: vendor_id, trade: trade[:name], zip_code: zip_code, bid: trade[:base_bid] }
|
|
218
|
-
end
|
|
219
|
-
|
|
220
|
-
expose :quote, as: :response
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
on_success :response do |value:, **|
|
|
224
|
-
puts "Persist #{value.inspect}"
|
|
225
|
-
end
|
|
226
|
-
end
|
|
227
|
-
```
|
|
228
|
-
|
|
229
|
-
Matcher-style guard shortcuts:
|
|
230
|
-
|
|
231
|
-
```ruby
|
|
232
|
-
guard :usa_only, with: :country_code, eq: "USA", message: "Unsupported country"
|
|
233
|
-
guard :supported_country, with: :country_code, in: %w[USA CAN], message: "Unsupported country"
|
|
234
|
-
guard :valid_zip, with: :zip_code, matches: /\A\d{5}\z/, message: "Invalid zip"
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### 7. Declarative Branching
|
|
238
|
-
|
|
239
|
-
```ruby
|
|
240
|
-
class DeliveryContract < Igniter::Contract
|
|
241
|
-
define do
|
|
242
|
-
input :country
|
|
243
|
-
input :order_total
|
|
244
|
-
|
|
245
|
-
branch :delivery_strategy, with: :country, inputs: {
|
|
246
|
-
country: :country,
|
|
247
|
-
order_total: :order_total
|
|
248
|
-
} do
|
|
249
|
-
on "US", contract: USDeliveryContract
|
|
250
|
-
on "UA", contract: LocalDeliveryContract
|
|
251
|
-
default contract: DefaultDeliveryContract
|
|
252
|
-
end
|
|
253
|
-
|
|
254
|
-
export :price, :eta, from: :delivery_strategy
|
|
255
|
-
end
|
|
256
|
-
end
|
|
257
|
-
```
|
|
258
|
-
|
|
259
|
-
### 8. Declarative Collections
|
|
260
|
-
|
|
261
|
-
```ruby
|
|
262
|
-
class TechnicianBatchContract < Igniter::Contract
|
|
263
|
-
define do
|
|
264
|
-
input :technician_inputs, type: :array
|
|
265
|
-
|
|
266
|
-
collection :technicians,
|
|
267
|
-
with: :technician_inputs,
|
|
268
|
-
each: TechnicianContract,
|
|
269
|
-
key: :technician_id,
|
|
270
|
-
mode: :collect
|
|
271
|
-
|
|
272
|
-
output :technicians
|
|
273
|
-
end
|
|
274
|
-
end
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
In `mode: :collect`, an execution succeeds overall while items may individually fail:
|
|
278
|
-
|
|
279
|
-
- `result.summary` — collection-level status (`:partial_failure` when any item failed)
|
|
280
|
-
- `result.items_summary` — compact per-item status hash
|
|
281
|
-
- `result.failed_items` — failed-item error details
|
|
282
|
-
- `result.successes` — hash of succeeded items only
|
|
283
|
-
|
|
284
|
-
See [`examples/collection_partial_failure.rb`](examples/collection_partial_failure.rb).
|
|
285
|
-
|
|
286
|
-
### 9. Distributed Contracts
|
|
287
|
-
|
|
288
|
-
Use `await` to suspend execution until an external event arrives. `correlate_by` identifies
|
|
289
|
-
which execution should receive the event, so events can be delivered from any process:
|
|
6
|
+
At the center is a small contract graph kernel: validated inputs, computations,
|
|
7
|
+
effects, outputs, diagnostics, and execution plans. Around that kernel Igniter is
|
|
8
|
+
growing into a platform for:
|
|
290
9
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
await :crm_data, event: :crm_received
|
|
299
|
-
await :billing_data, event: :billing_received
|
|
300
|
-
|
|
301
|
-
aggregate :report, with: %i[crm_data billing_data] do |crm_data:, billing_data:|
|
|
302
|
-
{ crm: crm_data, billing: billing_data }
|
|
303
|
-
end
|
|
304
|
-
|
|
305
|
-
output :report
|
|
306
|
-
end
|
|
307
|
-
|
|
308
|
-
on_success :report do |value:, **|
|
|
309
|
-
puts "Report ready: #{value.inspect}"
|
|
310
|
-
end
|
|
311
|
-
end
|
|
312
|
-
|
|
313
|
-
store = Igniter::Runtime::Stores::MemoryStore.new
|
|
314
|
-
|
|
315
|
-
# Launch — suspends waiting for both events
|
|
316
|
-
execution = LeadWorkflow.start({ request_id: "r1" }, store: store)
|
|
317
|
-
execution.pending? # => true
|
|
10
|
+
- embedding contract behavior into existing applications
|
|
11
|
+
- observing and shadowing legacy services without changing production responses
|
|
12
|
+
- storing immutable facts, histories, receipts, and replayable decisions
|
|
13
|
+
- building companion apps beside existing systems of record
|
|
14
|
+
- exposing operator surfaces, streams, MCP tools, and eventually cluster peers
|
|
15
|
+
- giving AI agents evidence, receipts, and approval boundaries before authority
|
|
318
16
|
|
|
319
|
-
|
|
320
|
-
LeadWorkflow.deliver_event(:crm_received,
|
|
321
|
-
correlation: { request_id: "r1" },
|
|
322
|
-
payload: { company: "Acme Corp", tier: "enterprise" },
|
|
323
|
-
store: store)
|
|
17
|
+
The short version:
|
|
324
18
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
19
|
+
```text
|
|
20
|
+
Contracts
|
|
21
|
+
-> Embed migration bridge
|
|
22
|
+
-> Store / Ledger facts and receipts
|
|
23
|
+
-> Ledger Client protocol boundary
|
|
24
|
+
-> Companion typed Record/History facade
|
|
25
|
+
-> Application + Web operator surfaces
|
|
26
|
+
-> Agents / AI / Cluster / Hub runtime lanes
|
|
330
27
|
```
|
|
331
28
|
|
|
332
|
-
|
|
29
|
+
## Status
|
|
333
30
|
|
|
334
|
-
|
|
31
|
+
Igniter is pre-v1. There is no backward-compatibility promise and no stable
|
|
32
|
+
public API guarantee yet. That is intentional: weak shapes should still be
|
|
33
|
+
replaced quickly while the better architecture is visible.
|
|
335
34
|
|
|
336
|
-
|
|
35
|
+
The project is now large enough to be treated as a framework/platform, but its
|
|
36
|
+
surface is still being actively shaped by real application pressure. Current
|
|
37
|
+
proofs are strongest in:
|
|
337
38
|
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
input :value
|
|
345
|
-
compute :score, depends_on: :value, call: ->(value:) { value * 1.5 }
|
|
346
|
-
output :score
|
|
347
|
-
end
|
|
348
|
-
end
|
|
39
|
+
- contract graph authoring and execution
|
|
40
|
+
- host-local embedding and contractable shadowing
|
|
41
|
+
- Store/Ledger facts, WAL, replay, changefeeds, compaction activity, and
|
|
42
|
+
read-only protocol surfaces
|
|
43
|
+
- application/web package structure and operator-oriented surfaces
|
|
44
|
+
- early agents, AI, hub, and cluster package lanes
|
|
349
45
|
|
|
350
|
-
|
|
351
|
-
|
|
46
|
+
Use package READMEs, runnable examples, and track docs to evaluate current
|
|
47
|
+
capability. Production-grade guarantees and compatibility policy belong after
|
|
48
|
+
v1.
|
|
352
49
|
|
|
353
|
-
|
|
354
|
-
require "igniter/server"
|
|
50
|
+
## Platform Lanes
|
|
355
51
|
|
|
356
|
-
|
|
357
|
-
define do
|
|
358
|
-
input :data
|
|
359
|
-
remote :scored,
|
|
360
|
-
contract: "ScoringContract",
|
|
361
|
-
node: "http://localhost:4568",
|
|
362
|
-
inputs: { value: :data }
|
|
363
|
-
output :scored
|
|
364
|
-
end
|
|
365
|
-
end
|
|
52
|
+
### `igniter-contracts`
|
|
366
53
|
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
```
|
|
54
|
+
The kernel: DSL authoring, graph compilation, runtime execution, diagnostics,
|
|
55
|
+
effects, and the core `Contractable` service protocol used inside contracts.
|
|
370
56
|
|
|
371
|
-
|
|
57
|
+
### `igniter-embed`
|
|
372
58
|
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
igniter-server new my_app
|
|
59
|
+
The migration bridge for existing applications. It registers host-local
|
|
60
|
+
contracts and wraps opaque services with `contractable` observation/shadowing:
|
|
376
61
|
|
|
377
|
-
|
|
378
|
-
|
|
62
|
+
```text
|
|
63
|
+
legacy primary result
|
|
64
|
+
-> returned unchanged
|
|
65
|
+
-> optional candidate/shadow execution
|
|
66
|
+
-> normalized comparison
|
|
67
|
+
-> observation / divergence receipts
|
|
379
68
|
```
|
|
380
69
|
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
```ruby
|
|
384
|
-
require "igniter/server"
|
|
385
|
-
require_relative "contracts"
|
|
386
|
-
Igniter::Server.configure { |c| c.register "ScoringContract", ScoringContract }
|
|
387
|
-
run Igniter::Server.rack_app
|
|
388
|
-
```
|
|
389
|
-
|
|
390
|
-
**REST API:**
|
|
391
|
-
|
|
392
|
-
| Method | Path | Description |
|
|
393
|
-
|--------|------|-------------|
|
|
394
|
-
| `POST` | `/v1/contracts/:name/execute` | Execute a contract synchronously |
|
|
395
|
-
| `POST` | `/v1/contracts/:name/events` | Deliver an event to a distributed contract |
|
|
396
|
-
| `GET` | `/v1/executions/:id` | Poll execution status |
|
|
397
|
-
| `GET` | `/v1/health` | Health check with registered contracts list |
|
|
398
|
-
| `GET` | `/v1/contracts` | List contracts with inputs and outputs |
|
|
70
|
+
This is the safest first path for Rails and other host apps.
|
|
399
71
|
|
|
400
|
-
|
|
72
|
+
### `igniter-ledger`
|
|
401
73
|
|
|
402
|
-
|
|
74
|
+
The Ledger substrate: immutable facts, `Store[T]` and `History[T]` experiments,
|
|
75
|
+
causation, current/time-travel reads, access paths, WAL durability, changefeed,
|
|
76
|
+
Ledger Open Protocol, LedgerServer, compaction lifecycle, and intelligent-ledger
|
|
77
|
+
boundary proofs.
|
|
403
78
|
|
|
404
|
-
|
|
405
|
-
|
|
79
|
+
It is still a POC package, but it is no longer just "persistence research"; it
|
|
80
|
+
is the event memory and receipt substrate for companion systems.
|
|
406
81
|
|
|
407
|
-
|
|
408
|
-
require "igniter/integrations/llm"
|
|
82
|
+
### `igniter-ledger-client`
|
|
409
83
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
end
|
|
84
|
+
The protocol-first client boundary for Ledger users. It owns request/response
|
|
85
|
+
envelopes, transports, errors, and future pooling/retry/backpressure policy
|
|
86
|
+
without embedding the storage engine.
|
|
414
87
|
|
|
415
|
-
|
|
416
|
-
provider :anthropic
|
|
417
|
-
model "claude-haiku-4-5-20251001"
|
|
418
|
-
system_prompt "Classify feedback into: bug_report, feature_request, question."
|
|
88
|
+
### `igniter-companion`
|
|
419
89
|
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
90
|
+
Typed application-facing `Record` / `History` facade over `igniter-ledger`.
|
|
91
|
+
It turns raw facts into ergonomic app objects while applying pressure back onto
|
|
92
|
+
Store capabilities such as scopes, partitions, receipts, manifests, and typed
|
|
93
|
+
storage semantics.
|
|
424
94
|
|
|
425
|
-
|
|
426
|
-
provider :anthropic
|
|
427
|
-
model "claude-haiku-4-5-20251001"
|
|
428
|
-
system_prompt "You are a customer success agent. Write one professional response sentence."
|
|
95
|
+
### `igniter-application`
|
|
429
96
|
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
end
|
|
97
|
+
Contracts-native application runtime: app manifests, providers, services,
|
|
98
|
+
credentials, agents, sessions, snapshots, boot/shutdown plans, and embedded host
|
|
99
|
+
activation paths.
|
|
434
100
|
|
|
435
|
-
|
|
436
|
-
define do
|
|
437
|
-
input :feedback
|
|
101
|
+
### `igniter-web`
|
|
438
102
|
|
|
439
|
-
|
|
440
|
-
|
|
103
|
+
Operator and interaction surfaces: receipt/report views, event streams,
|
|
104
|
+
dashboards, human approval gates, investigation workspaces, and app-local web
|
|
105
|
+
mounts. It is not trying to replace a Rails admin UI.
|
|
441
106
|
|
|
442
|
-
|
|
443
|
-
output :response
|
|
444
|
-
end
|
|
445
|
-
end
|
|
446
|
-
```
|
|
107
|
+
### `igniter-agents` and `igniter-ai`
|
|
447
108
|
|
|
448
|
-
|
|
109
|
+
Agent and AI runtime lanes: runs, turns, traces, serializable state, provider
|
|
110
|
+
registration, and the promotion ladder from observe-only to human-approved
|
|
111
|
+
authority.
|
|
449
112
|
|
|
450
|
-
|
|
451
|
-
class MultiStepExecutor < Igniter::LLM::Executor
|
|
452
|
-
def call(text:, prior_analysis:)
|
|
453
|
-
ctx = Context.empty(system: self.class.system_prompt)
|
|
454
|
-
.append_user("Initial: #{text}")
|
|
455
|
-
.append_assistant(prior_analysis)
|
|
456
|
-
chat(context: ctx)
|
|
457
|
-
end
|
|
458
|
-
end
|
|
459
|
-
```
|
|
113
|
+
### `igniter-cluster` and `igniter-hub`
|
|
460
114
|
|
|
461
|
-
|
|
115
|
+
Distributed and sync lanes: capability-aware peers, ownership, leases, health,
|
|
116
|
+
failover, admission/trust, and hub-style synchronization. These should emerge
|
|
117
|
+
from real partitioned domains rather than "distributed everything".
|
|
462
118
|
|
|
463
|
-
###
|
|
119
|
+
### `igniter-mcp-adapter`
|
|
464
120
|
|
|
465
|
-
|
|
121
|
+
Transport-facing MCP surface for exposing tools, protocol reads, and operator
|
|
122
|
+
introspection.
|
|
466
123
|
|
|
467
|
-
|
|
468
|
-
# Scaffold a new application
|
|
469
|
-
igniter-server new my_app
|
|
470
|
-
cd my_app && bundle install && bin/start
|
|
471
|
-
```
|
|
124
|
+
## Small Contract Example
|
|
472
125
|
|
|
473
126
|
```ruby
|
|
474
|
-
require "igniter
|
|
475
|
-
|
|
476
|
-
class MyApp < Igniter::Application
|
|
477
|
-
config_file "application.yml" # optional YAML base config
|
|
478
|
-
|
|
479
|
-
configure do |c|
|
|
480
|
-
c.port = ENV.fetch("PORT", 4567).to_i
|
|
481
|
-
c.store = Igniter::Runtime::Stores::MemoryStore.new
|
|
482
|
-
end
|
|
483
|
-
|
|
484
|
-
executors_path "executors/" # eager-require all executors
|
|
485
|
-
contracts_path "contracts/" # eager-require all contracts
|
|
127
|
+
require "igniter"
|
|
486
128
|
|
|
487
|
-
|
|
129
|
+
environment = Igniter.with
|
|
488
130
|
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
131
|
+
result = environment.run(inputs: { order_total: 100, country: "UA" }) do
|
|
132
|
+
input :order_total
|
|
133
|
+
input :country
|
|
492
134
|
|
|
493
|
-
|
|
494
|
-
|
|
135
|
+
compute :vat_rate, depends_on: [:country] do |country:|
|
|
136
|
+
country == "UA" ? 0.2 : 0.0
|
|
495
137
|
end
|
|
496
|
-
end
|
|
497
|
-
|
|
498
|
-
MyApp.start # blocking built-in HTTP server
|
|
499
|
-
# or
|
|
500
|
-
MyApp.rack_app # Rack app for Puma / Unicorn
|
|
501
|
-
```
|
|
502
|
-
|
|
503
|
-
**`application.yml`** — base config loaded before the `configure` block (block always wins):
|
|
504
|
-
|
|
505
|
-
```yaml
|
|
506
|
-
server:
|
|
507
|
-
port: 4567
|
|
508
|
-
host: "0.0.0.0"
|
|
509
|
-
log_format: json # text (default) or json
|
|
510
|
-
drain_timeout: 30
|
|
511
|
-
```
|
|
512
|
-
|
|
513
|
-
**Scheduler interval formats:** `30` (seconds), `"30s"`, `"5m"`, `"2h"`, `"1d"`, `{ hours: 1, minutes: 30 }`
|
|
514
|
-
|
|
515
|
-
See [`docs/APPLICATION_V1.md`](docs/APPLICATION_V1.md) for the full reference and companion app example.
|
|
516
|
-
|
|
517
|
-
### 13. Capability-Based Security
|
|
518
|
-
|
|
519
|
-
Declare what external resources an executor needs, then deny specific capabilities at the
|
|
520
|
-
policy level — without touching the executors themselves:
|
|
521
|
-
|
|
522
|
-
```ruby
|
|
523
|
-
require "igniter/capabilities"
|
|
524
|
-
|
|
525
|
-
class DbLookup < Igniter::Executor
|
|
526
|
-
capabilities :database
|
|
527
138
|
|
|
528
|
-
|
|
529
|
-
|
|
139
|
+
compute :gross_total, depends_on: %i[order_total vat_rate] do |order_total:, vat_rate:|
|
|
140
|
+
order_total * (1 + vat_rate)
|
|
530
141
|
end
|
|
531
|
-
end
|
|
532
|
-
|
|
533
|
-
class PureCalc < Igniter::Executor
|
|
534
|
-
pure # shorthand for capabilities(:pure)
|
|
535
|
-
|
|
536
|
-
def call(x:, y:) = x + y
|
|
537
|
-
end
|
|
538
|
-
|
|
539
|
-
# Inspect the graph's surface area before deploying
|
|
540
|
-
MyContract.compiled_graph.required_capabilities
|
|
541
|
-
# => { fetch: [:database], total: [:pure] }
|
|
542
|
-
|
|
543
|
-
# Enforce policy at boot time
|
|
544
|
-
Igniter::Capabilities.policy = Igniter::Capabilities::Policy.new(denied: [:database])
|
|
545
|
-
|
|
546
|
-
MyContract.new(id: 1).resolve_all
|
|
547
|
-
# => CapabilityViolationError: Node 'fetch' uses denied capabilities: database
|
|
548
|
-
```
|
|
549
|
-
|
|
550
|
-
See [`docs/CAPABILITIES_V1.md`](docs/CAPABILITIES_V1.md).
|
|
551
|
-
|
|
552
|
-
### 14. Temporal Contracts
|
|
553
|
-
|
|
554
|
-
Make time an explicit input so every execution is fully reproducible:
|
|
555
142
|
|
|
556
|
-
|
|
557
|
-
require "igniter/temporal"
|
|
558
|
-
|
|
559
|
-
class TaxRateContract < Igniter::Contract
|
|
560
|
-
include Igniter::Temporal
|
|
561
|
-
|
|
562
|
-
define do
|
|
563
|
-
input :country
|
|
564
|
-
# `as_of` is injected automatically (default: Time.now)
|
|
565
|
-
|
|
566
|
-
temporal_compute :rate, depends_on: :country do |country:, as_of:|
|
|
567
|
-
HISTORICAL_RATES.dig(country, as_of.year) || 0.0
|
|
568
|
-
end
|
|
569
|
-
|
|
570
|
-
output :rate
|
|
571
|
-
end
|
|
143
|
+
output :gross_total
|
|
572
144
|
end
|
|
573
145
|
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
# => 0.22
|
|
577
|
-
|
|
578
|
-
# Reproduce the exact 2024 result
|
|
579
|
-
TaxRateContract.new(country: "UA", as_of: Time.new(2024, 1, 1)).result.rate
|
|
580
|
-
# => 0.20
|
|
146
|
+
result.output(:gross_total)
|
|
147
|
+
# => 120.0
|
|
581
148
|
```
|
|
582
149
|
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
### 15. Content-Addressed Computation
|
|
586
|
-
|
|
587
|
-
`pure` executors are cached by a fingerprint of their logic + inputs. Identical computation
|
|
588
|
-
is never repeated — within an execution, across executions, or across processes:
|
|
589
|
-
|
|
590
|
-
```ruby
|
|
591
|
-
require "igniter/extensions/content_addressing"
|
|
592
|
-
|
|
593
|
-
class TaxCalculator < Igniter::Executor
|
|
594
|
-
pure
|
|
595
|
-
fingerprint "tax_calc_v1" # bump to invalidate the cache when logic changes
|
|
596
|
-
|
|
597
|
-
def call(country:, amount:)
|
|
598
|
-
TAX_RATES[country] * amount
|
|
599
|
-
end
|
|
600
|
-
end
|
|
601
|
-
|
|
602
|
-
# First execution — computes and caches
|
|
603
|
-
InvoiceContract.new(country: "UA", amount: 1000).result.tax # computed
|
|
150
|
+
## Companion Direction
|
|
604
151
|
|
|
605
|
-
|
|
606
|
-
InvoiceContract.new(country: "UA", amount: 1000).result.tax # cache hit
|
|
152
|
+
Igniter is being shaped by real application pressure such as Spark CRM:
|
|
607
153
|
|
|
608
|
-
|
|
609
|
-
|
|
154
|
+
```text
|
|
155
|
+
Existing app remains the system of record
|
|
156
|
+
-> Igniter Embed observes/shadows risky services
|
|
157
|
+
-> Igniter Ledger records facts and receipts
|
|
158
|
+
-> Ledger boundaries close semantic decisions
|
|
159
|
+
-> Web/Agents explain, review, and recommend
|
|
610
160
|
```
|
|
611
161
|
|
|
612
|
-
|
|
162
|
+
This is the current strategic pattern: do not rewrite a production app into
|
|
163
|
+
Igniter. Build an Igniter companion beside it, move event-heavy and
|
|
164
|
+
explanation-heavy responsibilities behind explicit facts, receipts, boundaries,
|
|
165
|
+
and approval gates.
|
|
613
166
|
|
|
614
|
-
|
|
167
|
+
## What Is Not Promised Yet
|
|
615
168
|
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
169
|
+
- Stable v1 API compatibility.
|
|
170
|
+
- A production database adapter abstraction.
|
|
171
|
+
- Remote mutating Store operations for compaction/prune/purge.
|
|
172
|
+
- Cluster consensus or deployment guarantees.
|
|
173
|
+
- AI authority without receipts, policies, replay, and human approval paths.
|
|
619
174
|
|
|
620
|
-
|
|
621
|
-
require "igniter/extensions/dataflow"
|
|
175
|
+
## Repository Map
|
|
622
176
|
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
177
|
+
- [docs/](./docs/README.md) — documentation portal
|
|
178
|
+
- [docs/guide/](./docs/guide/README.md) — user-facing guide
|
|
179
|
+
- [docs/concepts/](./docs/concepts/README.md) — mental models and vocabulary
|
|
180
|
+
- [docs/dev/](./docs/dev/README.md) — architecture and package boundaries
|
|
181
|
+
- [examples/](./examples/README.md) — runnable examples
|
|
182
|
+
- [packages/](./packages/README.md) — package list and local package docs
|
|
183
|
+
- [playgrounds/](./playgrounds/README.md) — private/local-first experiments and history
|
|
626
184
|
|
|
627
|
-
|
|
628
|
-
with: :readings,
|
|
629
|
-
each: SensorAnalysis,
|
|
630
|
-
key: :sensor_id,
|
|
631
|
-
mode: :incremental,
|
|
632
|
-
window: { last: 1000 } # bounded memory
|
|
185
|
+
## Package Docs
|
|
633
186
|
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
187
|
+
- [igniter-contracts](./packages/igniter-contracts/README.md)
|
|
188
|
+
- [igniter-extensions](./packages/igniter-extensions/README.md)
|
|
189
|
+
- [igniter-embed](./packages/igniter-embed/README.md)
|
|
190
|
+
- [igniter-ledger](./packages/igniter-ledger/README.md)
|
|
191
|
+
- [igniter-ledger-client](./packages/igniter-ledger-client/README.md)
|
|
192
|
+
- [igniter-companion](./packages/igniter-companion/README.md)
|
|
193
|
+
- [igniter-application](./packages/igniter-application/README.md)
|
|
194
|
+
- [igniter-web](./packages/igniter-web/README.md)
|
|
195
|
+
- [igniter-agents](./packages/igniter-agents/README.md)
|
|
196
|
+
- [igniter-ai](./packages/igniter-ai/README.md)
|
|
197
|
+
- [igniter-cluster](./packages/igniter-cluster/README.md)
|
|
198
|
+
- [igniter-hub](./packages/igniter-hub/README.md)
|
|
199
|
+
- [igniter-mcp-adapter](./packages/igniter-mcp-adapter/README.md)
|
|
637
200
|
|
|
638
|
-
|
|
639
|
-
pipeline.resolve_all # all N items run once
|
|
201
|
+
## Working Principle
|
|
640
202
|
|
|
641
|
-
|
|
642
|
-
pipeline.feed_diff(:readings,
|
|
643
|
-
add: [{ sensor_id: "new-1", value: 10 }],
|
|
644
|
-
update: [{ sensor_id: "tmp-2", value: 90 }],
|
|
645
|
-
remove: ["hum-1"]
|
|
646
|
-
)
|
|
647
|
-
pipeline.resolve_all # only 2 child contracts run (new-1 + tmp-2)
|
|
648
|
-
|
|
649
|
-
diff = pipeline.collection_diff(:processed)
|
|
650
|
-
diff.processed_count # => 2
|
|
651
|
-
diff.unchanged.size # => N - 2
|
|
652
|
-
```
|
|
203
|
+
Igniter evolves through a tight loop:
|
|
653
204
|
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
| `composition.rb` | `ruby examples/composition.rb` | Nested contracts and composed results |
|
|
662
|
-
| `diagnostics.rb` | `ruby examples/diagnostics.rb` | Diagnostics text and machine-readable output |
|
|
663
|
-
| `async_store.rb` | `ruby examples/async_store.rb` | Pending execution, file-backed store, worker-style resume |
|
|
664
|
-
| `marketing_ergonomics.rb` | `ruby examples/marketing_ergonomics.rb` | `const`, `lookup`, `map`, `guard`, `scope`, `namespace`, `expose`, `on_success`, `explain_plan` |
|
|
665
|
-
| `collection.rb` | `ruby examples/collection.rb` | Fan-out, stable item keys, `CollectionResult` |
|
|
666
|
-
| `collection_partial_failure.rb` | `ruby examples/collection_partial_failure.rb` | `:collect` mode, partial failure summary, collection diagnostics |
|
|
667
|
-
| `ringcentral_routing.rb` | `ruby examples/ringcentral_routing.rb` | `branch`, nested `collection`, `project`, `aggregate`, diagnostics |
|
|
668
|
-
| `order_pipeline.rb` | `ruby examples/order_pipeline.rb` | `guard` + `collection` + `branch` + `export` in one flow |
|
|
669
|
-
| `distributed_server.rb` | `ruby examples/distributed_server.rb` | `await`, `correlate_by`, `start`, `deliver_event`, `on_success` |
|
|
670
|
-
| `server/node1.rb` + `node2.rb` | run both, then curl | Two-node igniter-server with `remote:` DSL |
|
|
671
|
-
| `llm/research_agent.rb` | `ruby examples/llm/research_agent.rb` | Multi-step LLM pipeline with Ollama |
|
|
672
|
-
| `llm/tool_use.rb` | `ruby examples/llm/tool_use.rb` | LLM tool declarations, chained LLM nodes, `Context` |
|
|
673
|
-
| `companion/demo.rb` | `ruby examples/companion/demo.rb` | End-to-end voice AI pipeline using `Igniter::Application` |
|
|
674
|
-
| `dataflow.rb` | `ruby examples/dataflow.rb` | Incremental sensor pipeline: `mode: :incremental`, `feed_diff`, sliding window |
|
|
675
|
-
|
|
676
|
-
## Design Docs
|
|
677
|
-
|
|
678
|
-
- [Architecture v2](docs/ARCHITECTURE_V2.md)
|
|
679
|
-
- [Execution Model v2](docs/EXECUTION_MODEL_V2.md)
|
|
680
|
-
- [API Draft v2](docs/API_V2.md)
|
|
681
|
-
- [Patterns](docs/PATTERNS.md)
|
|
682
|
-
- [Branches v1](docs/BRANCHES_V1.md)
|
|
683
|
-
- [Collections v1](docs/COLLECTIONS_V1.md)
|
|
684
|
-
- [Distributed Contracts v1](docs/DISTRIBUTED_CONTRACTS_V1.md)
|
|
685
|
-
- [Store Adapters](docs/STORE_ADAPTERS.md)
|
|
686
|
-
- [igniter-server v1](docs/SERVER_V1.md)
|
|
687
|
-
- [LLM Integration v1](docs/LLM_V1.md)
|
|
688
|
-
- [Application scaffold v1](docs/APPLICATION_V1.md)
|
|
689
|
-
- [Capabilities v1](docs/CAPABILITIES_V1.md)
|
|
690
|
-
- [Temporal Contracts v1](docs/TEMPORAL_V1.md)
|
|
691
|
-
- [Content Addressing v1](docs/CONTENT_ADDRESSING_V1.md)
|
|
692
|
-
- [Incremental Dataflow v1](docs/DATAFLOW_V1.md)
|
|
693
|
-
- [Concepts and Principles](docs/IGNITER_CONCEPTS.md)
|
|
694
|
-
|
|
695
|
-
## Development
|
|
696
|
-
|
|
697
|
-
```bash
|
|
698
|
-
rake # specs + RuboCop
|
|
699
|
-
rake spec # tests only
|
|
700
|
-
rake rubocop # lint only
|
|
701
|
-
rake build # build gem
|
|
205
|
+
```text
|
|
206
|
+
real app pressure
|
|
207
|
+
-> proof-local experiment
|
|
208
|
+
-> receipt-backed package primitive
|
|
209
|
+
-> protocol/read surface
|
|
210
|
+
-> docs compression
|
|
211
|
+
-> next pressure
|
|
702
212
|
```
|
|
703
213
|
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
- pending / deferred node states with snapshot / restore
|
|
708
|
-
- store-backed resume flow (MemoryStore, FileStore)
|
|
709
|
-
- compile-time graph validation, typed inputs, cycle detection
|
|
710
|
-
- composition, branch, collection, guard, scope / namespace
|
|
711
|
-
- distributed workflows: `await`, `correlate_by`, `start`, `deliver_event`
|
|
712
|
-
- igniter-server: TCP server, Rack adapter, CLI, `remote:` DSL
|
|
713
|
-
- LLM compute nodes: Ollama, Anthropic, OpenAI providers
|
|
714
|
-
- Rails integration: Railtie, ActiveJob, ActionCable, webhook controller mixin
|
|
715
|
-
- `Igniter::Application`: YAML config, autoloading, scheduler, generator (`igniter-server new`)
|
|
716
|
-
- auditing, diagnostics, reactive subscriptions, graph introspection
|
|
717
|
-
- capability-based security: `capabilities`, `pure`, `Policy`, `CapabilityViolationError`
|
|
718
|
-
- temporal contracts: `include Igniter::Temporal`, `temporal_compute`, `as_of` input, historical reproduction
|
|
719
|
-
- content-addressed computation: `pure`, `fingerprint`, universal `ContentKey`, pluggable `ContentCache`
|
|
720
|
-
- incremental dataflow: `mode: :incremental`, `window:`, `feed_diff`, `collection_diff`, `DiffState`, `IncrementalCollectionResult`
|
|
721
|
-
|
|
722
|
-
## License
|
|
723
|
-
|
|
724
|
-
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
|
214
|
+
That loop is why some docs live beside packages, some live in public guide/dev
|
|
215
|
+
sections, and older long-form research is compressed into `playgrounds/docs/`
|
|
216
|
+
instead of being used as public onboarding.
|