igniter 0.4.5 → 0.5.1
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 +164 -409
- data/bin/igniter-stack +94 -0
- data/docs/README.md +62 -0
- data/examples/README.md +74 -312
- data/examples/agent_orchestration.rb +76 -0
- data/examples/agents.rb +2 -1
- data/examples/catalog.rb +412 -0
- data/examples/consensus.rb +241 -0
- data/examples/dataflow.rb +309 -0
- data/examples/distributed_workflow.rb +1 -1
- data/examples/effects.rb +10 -9
- data/examples/elocal_webhook.rb +1 -0
- data/examples/incremental.rb +4 -3
- data/examples/introspection.rb +49 -0
- data/examples/invariants.rb +4 -3
- data/examples/llm_tools.rb +237 -0
- data/examples/mesh.rb +241 -0
- data/examples/mesh_discovery.rb +287 -0
- data/examples/mesh_gossip.rb +164 -0
- data/examples/reactive_auditing.rb +50 -0
- data/examples/ringcentral_routing.rb +1 -1
- data/examples/run.rb +163 -0
- data/lib/igniter/monorepo_packages.rb +17 -0
- data/lib/igniter/stack.rb +5 -0
- data/lib/igniter.rb +48 -15
- data/packages/igniter-agents/README.md +22 -0
- data/{lib → packages/igniter-agents/lib}/igniter/agent/ref.rb +1 -0
- data/{lib → packages/igniter-agents/lib}/igniter/agent/runner.rb +12 -0
- data/{lib → packages/igniter-agents/lib}/igniter/agent.rb +6 -0
- data/packages/igniter-agents/lib/igniter/agents/observability/metrics_agent.rb +130 -0
- data/packages/igniter-agents/lib/igniter/agents/pipeline/batch_processor_agent.rb +131 -0
- data/packages/igniter-agents/lib/igniter/agents/proactive/alert_agent.rb +111 -0
- data/packages/igniter-agents/lib/igniter/agents/proactive/health_check_agent.rb +122 -0
- data/packages/igniter-agents/lib/igniter/agents/proactive_agent.rb +208 -0
- data/packages/igniter-agents/lib/igniter/agents/reliability/retry_agent.rb +99 -0
- data/packages/igniter-agents/lib/igniter/agents/scheduling/cron_agent.rb +110 -0
- data/packages/igniter-agents/lib/igniter/agents.rb +23 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/chain_agent.rb +129 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/critic_agent.rb +165 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/evaluator_agent.rb +195 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/evolution_agent.rb +288 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/observer_agent.rb +186 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/planner_agent.rb +212 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/router_agent.rb +133 -0
- data/packages/igniter-agents/lib/igniter/ai/agents/self_reflection_agent.rb +177 -0
- data/packages/igniter-agents/lib/igniter/ai/agents.rb +25 -0
- data/{lib → packages/igniter-agents/lib}/igniter/registry.rb +2 -0
- data/packages/igniter-agents/lib/igniter/runtime/registry_agent_adapter.rb +102 -0
- data/{lib → packages/igniter-agents/lib}/igniter/supervisor.rb +3 -0
- data/packages/igniter-agents/lib/igniter-agents.rb +7 -0
- data/packages/igniter-ai/README.md +20 -0
- data/packages/igniter-ai/lib/igniter/ai/config.rb +113 -0
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/context.rb +2 -2
- data/packages/igniter-ai/lib/igniter/ai/executor.rb +352 -0
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/anthropic.rb +42 -9
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/base.rb +1 -1
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/ollama.rb +4 -4
- data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/openai.rb +39 -10
- data/packages/igniter-ai/lib/igniter/ai/skill/feedback.rb +116 -0
- data/packages/igniter-ai/lib/igniter/ai/skill/output_schema.rb +110 -0
- data/packages/igniter-ai/lib/igniter/ai/skill/runtime_contract.rb +87 -0
- data/packages/igniter-ai/lib/igniter/ai/skill.rb +107 -0
- data/packages/igniter-ai/lib/igniter/ai/tool_registry.rb +79 -0
- data/packages/igniter-ai/lib/igniter/ai/transcription/providers/assemblyai.rb +200 -0
- data/packages/igniter-ai/lib/igniter/ai/transcription/providers/base.rb +122 -0
- data/packages/igniter-ai/lib/igniter/ai/transcription/providers/deepgram.rb +162 -0
- data/packages/igniter-ai/lib/igniter/ai/transcription/providers/openai.rb +102 -0
- data/packages/igniter-ai/lib/igniter/ai/transcription/transcriber.rb +145 -0
- data/packages/igniter-ai/lib/igniter/ai/transcription/transcript_result.rb +29 -0
- data/packages/igniter-ai/lib/igniter/ai.rb +98 -0
- data/packages/igniter-ai/lib/igniter-ai.rb +3 -0
- data/packages/igniter-app/README.md +19 -0
- data/packages/igniter-app/lib/igniter/app/app_config.rb +43 -0
- data/packages/igniter-app/lib/igniter/app/app_host.rb +56 -0
- data/packages/igniter-app/lib/igniter/app/app_host_config.rb +27 -0
- data/packages/igniter-app/lib/igniter/app/app_host_pack.rb +13 -0
- data/packages/igniter-app/lib/igniter/app/autoloader.rb +18 -0
- data/packages/igniter-app/lib/igniter/app/cluster_app_host.rb +95 -0
- data/packages/igniter-app/lib/igniter/app/cluster_app_host_config.rb +78 -0
- data/packages/igniter-app/lib/igniter/app/credentials/config_loader.rb +152 -0
- data/packages/igniter-app/lib/igniter/app/credentials/credential.rb +48 -0
- data/packages/igniter-app/lib/igniter/app/credentials/credential_policy.rb +38 -0
- data/packages/igniter-app/lib/igniter/app/credentials/events/credential_event.rb +179 -0
- data/packages/igniter-app/lib/igniter/app/credentials/events.rb +12 -0
- data/packages/igniter-app/lib/igniter/app/credentials/lease_request.rb +153 -0
- data/packages/igniter-app/lib/igniter/app/credentials/policies/ephemeral_lease_policy.rb +35 -0
- data/packages/igniter-app/lib/igniter/app/credentials/policies/local_only_policy.rb +33 -0
- data/packages/igniter-app/lib/igniter/app/credentials/policies.rb +13 -0
- data/packages/igniter-app/lib/igniter/app/credentials/store.rb +21 -0
- data/packages/igniter-app/lib/igniter/app/credentials/stores/file_store.rb +114 -0
- data/packages/igniter-app/lib/igniter/app/credentials/trail.rb +254 -0
- data/packages/igniter-app/lib/igniter/app/credentials.rb +20 -0
- data/packages/igniter-app/lib/igniter/app/dev_output_sync.rb +4 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/app_host_contributor.rb +71 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/cluster_app_host_contributor.rb +97 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/credential_contributor.rb +66 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/evolution_contributor.rb +74 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/ignite_contributor.rb +121 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/loader_contributor.rb +68 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/orchestration_contributor.rb +200 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/runtime_contributor.rb +68 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/scheduler_contributor.rb +72 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics/sdk_contributor.rb +284 -0
- data/packages/igniter-app/lib/igniter/app/diagnostics.rb +62 -0
- data/packages/igniter-app/lib/igniter/app/evolution/approval_decision.rb +115 -0
- data/packages/igniter-app/lib/igniter/app/evolution/approval_request.rb +36 -0
- data/packages/igniter-app/lib/igniter/app/evolution/plan.rb +72 -0
- data/packages/igniter-app/lib/igniter/app/evolution/planner.rb +85 -0
- data/packages/igniter-app/lib/igniter/app/evolution/result.rb +45 -0
- data/packages/igniter-app/lib/igniter/app/evolution/runner.rb +102 -0
- data/packages/igniter-app/lib/igniter/app/evolution/store.rb +21 -0
- data/packages/igniter-app/lib/igniter/app/evolution/stores/file_store.rb +241 -0
- data/packages/igniter-app/lib/igniter/app/evolution/trail.rb +108 -0
- data/packages/igniter-app/lib/igniter/app/evolution.rb +11 -0
- data/packages/igniter-app/lib/igniter/app/filesystem_loader_adapter.rb +21 -0
- data/packages/igniter-app/lib/igniter/app/generator.rb +636 -0
- data/packages/igniter-app/lib/igniter/app/generators/cluster.rb +1367 -0
- data/packages/igniter-app/lib/igniter/app/generators/dashboard.rb +152 -0
- data/packages/igniter-app/lib/igniter/app/generators/playground.rb +1227 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/README.md.erb +37 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/app.rb.erb +19 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/contexts/home_context.rb.erb +54 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/frontend/application.js.erb +3 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/spec/dashboard_app_spec.rb.erb +79 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/support/stack_overview.rb.erb +23 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/handlers/home_handler.rb.erb +27 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/home_page.arb.erb +44 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/home_page.rb.erb +56 -0
- data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/layout.arb.erb +17 -0
- data/packages/igniter-app/lib/igniter/app/host_adapter.rb +26 -0
- data/packages/igniter-app/lib/igniter/app/host_config.rb +40 -0
- data/packages/igniter-app/lib/igniter/app/host_registry.rb +43 -0
- data/packages/igniter-app/lib/igniter/app/loader_adapter.rb +15 -0
- data/packages/igniter-app/lib/igniter/app/loader_pack.rb +8 -0
- data/packages/igniter-app/lib/igniter/app/loader_registry.rb +39 -0
- data/packages/igniter-app/lib/igniter/app/observability/operator_action_handler.rb +147 -0
- data/packages/igniter-app/lib/igniter/app/observability/operator_console_handler.rb +747 -0
- data/packages/igniter-app/lib/igniter/app/observability/operator_overview_handler.rb +350 -0
- data/packages/igniter-app/lib/igniter/app/observability.rb +5 -0
- data/packages/igniter-app/lib/igniter/app/observability_pack.rb +71 -0
- data/packages/igniter-app/lib/igniter/app/operator/dispatcher.rb +40 -0
- data/packages/igniter-app/lib/igniter/app/operator/handler_registry.rb +40 -0
- data/packages/igniter-app/lib/igniter/app/operator/handler_result.rb +67 -0
- data/packages/igniter-app/lib/igniter/app/operator/handlers/base.rb +79 -0
- data/packages/igniter-app/lib/igniter/app/operator/handlers/ignite_handler.rb +108 -0
- data/packages/igniter-app/lib/igniter/app/operator/handlers/orchestration_handler.rb +33 -0
- data/packages/igniter-app/lib/igniter/app/operator/handlers.rb +5 -0
- data/packages/igniter-app/lib/igniter/app/operator/lifecycle_contract.rb +55 -0
- data/packages/igniter-app/lib/igniter/app/operator/policy.rb +157 -0
- data/packages/igniter-app/lib/igniter/app/operator.rb +17 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/action_result_builder.rb +65 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/followup_request.rb +36 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/handler_registry.rb +58 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/handlers.rb +106 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/inbox.rb +283 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/inbox_query.rb +293 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/lane_registry.rb +100 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/operator_query.rb +449 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/plan.rb +68 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/planner.rb +89 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/policies.rb +125 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/policy_registry.rb +63 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/result.rb +43 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/routing_registry.rb +43 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/runner.rb +50 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/runtime_event_query.rb +205 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/runtime_overview_builder.rb +286 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/runtime_query_overview_builder.rb +20 -0
- data/packages/igniter-app/lib/igniter/app/orchestration/runtime_result_builder.rb +23 -0
- data/packages/igniter-app/lib/igniter/app/orchestration.rb +113 -0
- data/packages/igniter-app/lib/igniter/app/runtime.rb +4 -0
- data/packages/igniter-app/lib/igniter/app/runtime_context.rb +101 -0
- data/packages/igniter-app/lib/igniter/app/runtime_pack.rb +16 -0
- data/packages/igniter-app/lib/igniter/app/scaffold_pack.rb +6 -0
- data/packages/igniter-app/lib/igniter/app/scheduler.rb +109 -0
- data/packages/igniter-app/lib/igniter/app/scheduler_adapter.rb +17 -0
- data/packages/igniter-app/lib/igniter/app/scheduler_pack.rb +8 -0
- data/packages/igniter-app/lib/igniter/app/scheduler_registry.rb +39 -0
- data/packages/igniter-app/lib/igniter/app/stack.rb +1726 -0
- data/packages/igniter-app/lib/igniter/app/stack_pack.rb +3 -0
- data/packages/igniter-app/lib/igniter/app/threaded_scheduler_adapter.rb +35 -0
- data/packages/igniter-app/lib/igniter/app/yml_loader.rb +43 -0
- data/packages/igniter-app/lib/igniter/app.rb +2367 -0
- data/packages/igniter-app/lib/igniter/ignite/bootstrap_agent.rb +334 -0
- data/packages/igniter-app/lib/igniter/ignite/bootstrap_target.rb +79 -0
- data/packages/igniter-app/lib/igniter/ignite/deployment_intent.rb +82 -0
- data/packages/igniter-app/lib/igniter/ignite/ignition_agent.rb +1011 -0
- data/packages/igniter-app/lib/igniter/ignite/ignition_plan.rb +83 -0
- data/packages/igniter-app/lib/igniter/ignite/ignition_report.rb +144 -0
- data/packages/igniter-app/lib/igniter/ignite/store.rb +19 -0
- data/packages/igniter-app/lib/igniter/ignite/stores/file_store.rb +112 -0
- data/packages/igniter-app/lib/igniter/ignite/trail.rb +215 -0
- data/packages/igniter-app/lib/igniter/ignite.rb +11 -0
- data/packages/igniter-app/lib/igniter-app.rb +5 -0
- data/packages/igniter-cluster/README.md +9 -0
- data/packages/igniter-cluster/lib/igniter/cluster/agent_route_resolver.rb +58 -0
- data/packages/igniter-cluster/lib/igniter/cluster/consensus/cluster.rb +187 -0
- data/packages/igniter-cluster/lib/igniter/cluster/consensus/errors.rb +16 -0
- data/packages/igniter-cluster/lib/igniter/cluster/consensus/executors.rb +45 -0
- data/packages/igniter-cluster/lib/igniter/cluster/consensus/node.rb +322 -0
- data/packages/igniter-cluster/lib/igniter/cluster/consensus/read_query.rb +32 -0
- data/packages/igniter-cluster/lib/igniter/cluster/consensus/state_machine.rb +60 -0
- data/packages/igniter-cluster/lib/igniter/cluster/consensus.rb +18 -0
- data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/governance_contributor.rb +90 -0
- data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/identity_contributor.rb +98 -0
- data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/routing_contributor.rb +674 -0
- data/packages/igniter-cluster/lib/igniter/cluster/diagnostics.rb +24 -0
- data/packages/igniter-cluster/lib/igniter/cluster/events/envelope.rb +136 -0
- data/packages/igniter-cluster/lib/igniter/cluster/events/hook_support.rb +33 -0
- data/packages/igniter-cluster/lib/igniter/cluster/events/log.rb +102 -0
- data/packages/igniter-cluster/lib/igniter/cluster/events/projection_feed.rb +98 -0
- data/packages/igniter-cluster/lib/igniter/cluster/events/read_model_projector.rb +32 -0
- data/packages/igniter-cluster/lib/igniter/cluster/events.rb +131 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_decision.rb +41 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_policy.rb +66 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_queue.rb +88 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_request.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_workflow.rb +214 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/checkpoint.rb +141 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/compaction_record.rb +33 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/stores/checkpoint_store.rb +89 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/stores/file_store.rb +249 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance/trail.rb +164 -0
- data/packages/igniter-cluster/lib/igniter/cluster/governance.rb +12 -0
- data/packages/igniter-cluster/lib/igniter/cluster/identity/capability_attestation.rb +114 -0
- data/packages/igniter-cluster/lib/igniter/cluster/identity/manifest.rb +139 -0
- data/packages/igniter-cluster/lib/igniter/cluster/identity/node_identity.rb +106 -0
- data/packages/igniter-cluster/lib/igniter/cluster/identity.rb +5 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/announcer.rb +88 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/checkpoint_gossip.rb +60 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/config.rb +146 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/discovery.rb +44 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/errors.rb +36 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/gossip.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/mesh_ql.rb +470 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/node_observation.rb +281 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/observation_query.rb +284 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer.rb +51 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_capacity_report.rb +42 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_identity_envelope.rb +158 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_metadata.rb +122 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_registry.rb +81 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_decision.rb +64 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_planner.rb +154 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_policy.rb +103 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/poller.rb +92 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/rebalance_plan.rb +66 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/rebalance_planner.rb +153 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/repair_loop.rb +169 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/router.rb +306 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/workload_signal.rb +46 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh/workload_tracker.rb +215 -0
- data/packages/igniter-cluster/lib/igniter/cluster/mesh.rb +452 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership/claim.rb +69 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership/errors.rb +19 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership/owner_client.rb +76 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership/registry.rb +98 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership/resolver.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/ownership.rb +81 -0
- data/packages/igniter-cluster/lib/igniter/cluster/projection_store.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/chunk.rb +49 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/fanout_retriever.rb +93 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/knowledge_shard.rb +140 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/net_http_adapter.rb +85 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/ranker.rb +46 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/retrieval_query.rb +30 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag/retrieval_result.rb +77 -0
- data/packages/igniter-cluster/lib/igniter/cluster/rag.rb +38 -0
- data/packages/igniter-cluster/lib/igniter/cluster/remote_adapter.rb +101 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrapper.rb +63 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrappers/gem.rb +39 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrappers/git.rb +46 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrappers/tarball.rb +62 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/capability_query.rb +675 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/expansion_plan.rb +40 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/expansion_planner.rb +154 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/manifest.rb +47 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/network_topology.rb +150 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/node_profile.rb +134 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/reflective_replication_agent.rb +259 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/replication_agent.rb +89 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication/ssh_session.rb +79 -0
- data/packages/igniter-cluster/lib/igniter/cluster/replication.rb +38 -0
- data/packages/igniter-cluster/lib/igniter/cluster/routed_agent_adapter.rb +79 -0
- data/packages/igniter-cluster/lib/igniter/cluster/routing_plan_executor.rb +427 -0
- data/packages/igniter-cluster/lib/igniter/cluster/routing_plan_result.rb +38 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_plan.rb +34 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_planner.rb +76 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_result.rb +34 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_runner.rb +125 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/trust_assessment.rb +37 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/trust_store.rb +58 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust/verifier.rb +80 -0
- data/packages/igniter-cluster/lib/igniter/cluster/trust.rb +9 -0
- data/packages/igniter-cluster/lib/igniter/cluster.rb +71 -0
- data/packages/igniter-cluster/lib/igniter-cluster.rb +3 -0
- data/packages/igniter-core/README.md +21 -0
- data/packages/igniter-core/lib/igniter/core/capabilities.rb +70 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/compiled_graph.rb +40 -2
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validation_pipeline.rb +1 -0
- data/packages/igniter-core/lib/igniter/core/compiler/validators/agent_validator.rb +142 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/dependencies_validator.rb +90 -3
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/remote_validator.rb +2 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler.rb +1 -0
- data/packages/igniter-core/lib/igniter/core/content_addressing.rb +133 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/contract.rb +88 -6
- data/packages/igniter-core/lib/igniter/core/dataflow/aggregate_operators.rb +147 -0
- data/packages/igniter-core/lib/igniter/core/dataflow/aggregate_state.rb +77 -0
- data/packages/igniter-core/lib/igniter/core/dataflow/diff.rb +37 -0
- data/packages/igniter-core/lib/igniter/core/dataflow/diff_state.rb +81 -0
- data/packages/igniter-core/lib/igniter/core/dataflow/incremental_collection_result.rb +39 -0
- data/packages/igniter-core/lib/igniter/core/dataflow/window_filter.rb +48 -0
- data/packages/igniter-core/lib/igniter/core/dataflow.rb +65 -0
- data/packages/igniter-core/lib/igniter/core/diagnostics/agent_contributor.rb +241 -0
- data/packages/igniter-core/lib/igniter/core/diagnostics/capability_contributor.rb +162 -0
- data/packages/igniter-core/lib/igniter/core/diagnostics/orchestration_contributor.rb +75 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/report.rb +81 -6
- data/packages/igniter-core/lib/igniter/core/diagnostics.rb +58 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dsl/contract_builder.rb +230 -9
- data/packages/igniter-core/lib/igniter/core/dto/record.rb +189 -0
- data/packages/igniter-core/lib/igniter/core/dto.rb +8 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/effect.rb +4 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/errors.rb +26 -3
- data/packages/igniter-core/lib/igniter/core/executor.rb +134 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/introspection/graph_formatter.rb +32 -1
- data/packages/igniter-core/lib/igniter/core/extensions/introspection/plan_formatter.rb +85 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/introspection/runtime_formatter.rb +26 -0
- data/packages/igniter-core/lib/igniter/core/extensions/invariants.rb +70 -0
- data/packages/igniter-core/lib/igniter/core/fingerprint.rb +43 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental.rb +4 -4
- data/packages/igniter-core/lib/igniter/core/memory/agent_memory.rb +104 -0
- data/packages/igniter-core/lib/igniter/core/memory/episode.rb +29 -0
- data/packages/igniter-core/lib/igniter/core/memory/fact.rb +27 -0
- data/packages/igniter-core/lib/igniter/core/memory/memorable.rb +90 -0
- data/packages/igniter-core/lib/igniter/core/memory/reflection_cycle.rb +96 -0
- data/packages/igniter-core/lib/igniter/core/memory/reflection_record.rb +28 -0
- data/packages/igniter-core/lib/igniter/core/memory/store.rb +115 -0
- data/packages/igniter-core/lib/igniter/core/memory/stores/in_memory.rb +136 -0
- data/packages/igniter-core/lib/igniter/core/memory/stores/sqlite.rb +286 -0
- data/packages/igniter-core/lib/igniter/core/memory.rb +80 -0
- data/packages/igniter-core/lib/igniter/core/metrics/collector.rb +131 -0
- data/packages/igniter-core/lib/igniter/core/metrics/prometheus_exporter.rb +104 -0
- data/packages/igniter-core/lib/igniter/core/metrics/snapshot.rb +8 -0
- data/packages/igniter-core/lib/igniter/core/metrics.rb +37 -0
- data/packages/igniter-core/lib/igniter/core/model/agent_interaction_contract.rb +172 -0
- data/packages/igniter-core/lib/igniter/core/model/agent_node.rb +86 -0
- data/packages/igniter-core/lib/igniter/core/model/aggregate_node.rb +34 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/branch_node.rb +37 -1
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/collection_node.rb +3 -2
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/compute_node.rb +13 -0
- data/packages/igniter-core/lib/igniter/core/model/remote_node.rb +91 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model.rb +2 -0
- data/packages/igniter-core/lib/igniter/core/node_cache.rb +231 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing.rb +8 -8
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/builder.rb +30 -1
- data/packages/igniter-core/lib/igniter/core/runtime/agent_adapter.rb +41 -0
- data/packages/igniter-core/lib/igniter/core/runtime/agent_result_contract.rb +91 -0
- data/packages/igniter-core/lib/igniter/core/runtime/agent_route.rb +60 -0
- data/packages/igniter-core/lib/igniter/core/runtime/agent_route_resolver.rb +26 -0
- data/packages/igniter-core/lib/igniter/core/runtime/agent_session.rb +922 -0
- data/packages/igniter-core/lib/igniter/core/runtime/agent_session_query.rb +379 -0
- data/packages/igniter-core/lib/igniter/core/runtime/agent_transport.rb +30 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/cache.rb +6 -3
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/deferred_result.rb +27 -1
- data/packages/igniter-core/lib/igniter/core/runtime/execution.rb +913 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/input_validator.rb +6 -2
- data/packages/igniter-core/lib/igniter/core/runtime/job_worker.rb +39 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/node_state.rb +4 -2
- data/packages/igniter-core/lib/igniter/core/runtime/orchestration_overview.rb +213 -0
- data/packages/igniter-core/lib/igniter/core/runtime/orchestration_runtime_state.rb +176 -0
- data/packages/igniter-core/lib/igniter/core/runtime/orchestration_transition_query.rb +208 -0
- data/packages/igniter-core/lib/igniter/core/runtime/planner.rb +301 -0
- data/packages/igniter-core/lib/igniter/core/runtime/proxy_agent_adapter.rb +124 -0
- data/packages/igniter-core/lib/igniter/core/runtime/remote_adapter.rb +26 -0
- data/packages/igniter-core/lib/igniter/core/runtime/resolver.rb +951 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/result.rb +2 -0
- data/packages/igniter-core/lib/igniter/core/runtime/stores/redis_store.rb +93 -0
- data/packages/igniter-core/lib/igniter/core/runtime/stores/sqlite_store.rb +155 -0
- data/packages/igniter-core/lib/igniter/core/runtime/stream_result.rb +171 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime.rb +15 -0
- data/packages/igniter-core/lib/igniter/core/temporal.rb +84 -0
- data/packages/igniter-core/lib/igniter/core/tool/discoverable.rb +151 -0
- data/packages/igniter-core/lib/igniter/core/tool.rb +56 -0
- data/{lib/igniter → packages/igniter-core/lib/igniter/core}/version.rb +1 -1
- data/packages/igniter-core/lib/igniter/core.rb +23 -0
- data/packages/igniter-core/lib/igniter-core.rb +3 -0
- data/packages/igniter-extensions/README.md +21 -0
- data/packages/igniter-extensions/lib/igniter/extensions/auditing.rb +3 -0
- data/packages/igniter-extensions/lib/igniter/extensions/capabilities.rb +39 -0
- data/packages/igniter-extensions/lib/igniter/extensions/content_addressing.rb +5 -0
- data/packages/igniter-extensions/lib/igniter/extensions/dataflow.rb +117 -0
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/differential.rb +1 -1
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/execution_report.rb +1 -1
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/incremental.rb +1 -1
- data/packages/igniter-extensions/lib/igniter/extensions/introspection.rb +3 -0
- data/packages/igniter-extensions/lib/igniter/extensions/invariants.rb +3 -0
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/provenance.rb +1 -1
- data/packages/igniter-extensions/lib/igniter/extensions/reactive.rb +3 -0
- data/{lib → packages/igniter-extensions/lib}/igniter/extensions/saga.rb +1 -1
- data/packages/igniter-extensions/lib/igniter/extensions.rb +8 -0
- data/packages/igniter-extensions/lib/igniter-extensions.rb +3 -0
- data/packages/igniter-frontend/README.md +224 -0
- data/packages/igniter-frontend/lib/igniter/frontend/app.rb +90 -0
- data/packages/igniter-frontend/lib/igniter/frontend/app_access.rb +36 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/component.rb +120 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/action_group.rb +53 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/badge.rb +91 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/boolean.rb +53 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/breadcrumbs.rb +71 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/card.rb +114 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/conversation_panel.rb +61 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/datetime.rb +42 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/display_value_support.rb +38 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/empty_state.rb +39 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/event_list.rb +44 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/filters.rb +183 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/indicator.rb +59 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/json_panel.rb +36 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/key_value_list.rb +40 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/loading_state.rb +43 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/metric_grid.rb +37 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/number.rb +53 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/page_header.rb +53 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/pagination.rb +143 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/panel.rb +67 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/percentage.rb +79 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/resource_list.rb +38 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/scenario_card.rb +48 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/shell_columns.rb +67 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/sidebar_shell.rb +106 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/table_with.rb +203 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/tabs.rb +147 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/viz.rb +185 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/page.rb +74 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/raw_text_node.rb +40 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre/template_page.rb +243 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre.rb +48 -0
- data/packages/igniter-frontend/lib/igniter/frontend/arbre_page.rb +7 -0
- data/packages/igniter-frontend/lib/igniter/frontend/assets.rb +101 -0
- data/packages/igniter-frontend/lib/igniter/frontend/builder.rb +124 -0
- data/packages/igniter-frontend/lib/igniter/frontend/component.rb +24 -0
- data/packages/igniter-frontend/lib/igniter/frontend/components.rb +7 -0
- data/packages/igniter-frontend/lib/igniter/frontend/context.rb +53 -0
- data/packages/igniter-frontend/lib/igniter/frontend/form_builder.rb +63 -0
- data/packages/igniter-frontend/lib/igniter/frontend/handler.rb +92 -0
- data/packages/igniter-frontend/lib/igniter/frontend/javascript.rb +353 -0
- data/packages/igniter-frontend/lib/igniter/frontend/page.rb +24 -0
- data/packages/igniter-frontend/lib/igniter/frontend/request.rb +61 -0
- data/packages/igniter-frontend/lib/igniter/frontend/response.rb +67 -0
- data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime/adapters.rb +226 -0
- data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime/presets.rb +147 -0
- data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime.rb +259 -0
- data/packages/igniter-frontend/lib/igniter/frontend/tailwind/surfaces.rb +1074 -0
- data/packages/igniter-frontend/lib/igniter/frontend/tailwind/ui.rb +1438 -0
- data/packages/igniter-frontend/lib/igniter/frontend/tailwind.rb +180 -0
- data/packages/igniter-frontend/lib/igniter/frontend/version.rb +9 -0
- data/packages/igniter-frontend/lib/igniter/frontend.rb +35 -0
- data/packages/igniter-frontend/lib/igniter-frontend.rb +3 -0
- data/packages/igniter-rails/README.md +96 -0
- data/packages/igniter-rails/lib/igniter/plugins/rails/generators/contract/templates/contract.rb.tt +22 -0
- data/packages/igniter-rails/lib/igniter/plugins/rails/generators/install/templates/igniter.rb.tt +16 -0
- data/packages/igniter-rails/lib/igniter-rails.rb +3 -0
- data/packages/igniter-schema-rendering/README.md +27 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/page.rb +35 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/patcher.rb +47 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/renderer.rb +268 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/schema.rb +172 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/store.rb +53 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_normalizer.rb +117 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_processor.rb +91 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_validator.rb +62 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/version.rb +9 -0
- data/packages/igniter-schema-rendering/lib/igniter/schema_rendering.rb +20 -0
- data/packages/igniter-schema-rendering/lib/igniter-schema-rendering.rb +3 -0
- data/packages/igniter-sdk/README.md +25 -0
- data/packages/igniter-sdk/lib/igniter/sdk/channels/base.rb +84 -0
- data/packages/igniter-sdk/lib/igniter/sdk/channels/delivery_result.rb +61 -0
- data/packages/igniter-sdk/lib/igniter/sdk/channels/message.rb +101 -0
- data/packages/igniter-sdk/lib/igniter/sdk/channels/telegram.rb +161 -0
- data/packages/igniter-sdk/lib/igniter/sdk/channels/webhook.rb +213 -0
- data/packages/igniter-sdk/lib/igniter/sdk/channels.rb +17 -0
- data/packages/igniter-sdk/lib/igniter/sdk/data/store.rb +31 -0
- data/packages/igniter-sdk/lib/igniter/sdk/data/stores/file.rb +113 -0
- data/packages/igniter-sdk/lib/igniter/sdk/data/stores/in_memory.rb +63 -0
- data/packages/igniter-sdk/lib/igniter/sdk/data/stores/sqlite.rb +144 -0
- data/packages/igniter-sdk/lib/igniter/sdk/data.rb +34 -0
- data/packages/igniter-sdk/lib/igniter/sdk/tools/agent_bootstrap_tool.rb +151 -0
- data/packages/igniter-sdk/lib/igniter/sdk/tools/local_workflow_selector_tool.rb +269 -0
- data/packages/igniter-sdk/lib/igniter/sdk/tools/system_discovery_tool.rb +198 -0
- data/packages/igniter-sdk/lib/igniter/sdk/tools.rb +9 -0
- data/packages/igniter-sdk/lib/igniter/sdk.rb +86 -0
- data/packages/igniter-sdk/lib/igniter-sdk.rb +3 -0
- data/packages/igniter-server/README.md +9 -0
- data/packages/igniter-server/lib/igniter/server/agent_session_store.rb +98 -0
- data/packages/igniter-server/lib/igniter/server/agent_transport.rb +95 -0
- data/packages/igniter-server/lib/igniter/server/app_host.rb +3 -0
- data/packages/igniter-server/lib/igniter/server/client.rb +256 -0
- data/packages/igniter-server/lib/igniter/server/config.rb +70 -0
- data/packages/igniter-server/lib/igniter/server/handlers/agent_message_handler.rb +107 -0
- data/packages/igniter-server/lib/igniter/server/handlers/agent_session_handler.rb +125 -0
- data/{lib → packages/igniter-server/lib}/igniter/server/handlers/event_handler.rb +4 -0
- data/{lib → packages/igniter-server/lib}/igniter/server/handlers/execute_handler.rb +6 -0
- data/packages/igniter-server/lib/igniter/server/handlers/liveness_handler.rb +20 -0
- data/packages/igniter-server/lib/igniter/server/handlers/manifest_handler.rb +77 -0
- data/packages/igniter-server/lib/igniter/server/handlers/metrics_handler.rb +51 -0
- data/packages/igniter-server/lib/igniter/server/handlers/peers_handler.rb +136 -0
- data/packages/igniter-server/lib/igniter/server/handlers/readiness_handler.rb +47 -0
- data/packages/igniter-server/lib/igniter/server/http_server.rb +222 -0
- data/{lib → packages/igniter-server/lib}/igniter/server/rack_app.rb +27 -2
- data/packages/igniter-server/lib/igniter/server/remote_adapter.rb +27 -0
- data/packages/igniter-server/lib/igniter/server/router.rb +291 -0
- data/packages/igniter-server/lib/igniter/server/server_logger.rb +54 -0
- data/packages/igniter-server/lib/igniter/server.rb +130 -0
- data/packages/igniter-server/lib/igniter-server.rb +3 -0
- metadata +638 -168
- data/docs/API_V2.md +0 -537
- data/docs/ARCHITECTURE_V2.md +0 -317
- data/docs/BACKLOG.md +0 -166
- data/docs/BRANCHES_V1.md +0 -213
- data/docs/COLLECTIONS_V1.md +0 -303
- data/docs/DISTRIBUTED_CONTRACTS_V1.md +0 -493
- data/docs/EXECUTION_MODEL_V2.md +0 -324
- data/docs/IGNITER_CONCEPTS.md +0 -81
- data/docs/LLM_V1.md +0 -335
- data/docs/PATTERNS.md +0 -411
- data/docs/SERVER_V1.md +0 -313
- data/docs/STORE_ADAPTERS.md +0 -126
- data/lib/igniter/diagnostics.rb +0 -8
- data/lib/igniter/executor.rb +0 -74
- data/lib/igniter/extensions/introspection/plan_formatter.rb +0 -55
- data/lib/igniter/extensions/invariants.rb +0 -116
- data/lib/igniter/integrations/agents.rb +0 -18
- data/lib/igniter/integrations/llm/config.rb +0 -69
- data/lib/igniter/integrations/llm/executor.rb +0 -159
- data/lib/igniter/integrations/llm.rb +0 -59
- data/lib/igniter/model/remote_node.rb +0 -26
- data/lib/igniter/runtime/execution.rb +0 -398
- data/lib/igniter/runtime/job_worker.rb +0 -18
- data/lib/igniter/runtime/planner.rb +0 -126
- data/lib/igniter/runtime/resolver.rb +0 -520
- data/lib/igniter/runtime/stores/redis_store.rb +0 -56
- data/lib/igniter/server/client.rb +0 -123
- data/lib/igniter/server/config.rb +0 -27
- data/lib/igniter/server/http_server.rb +0 -109
- data/lib/igniter/server/router.rb +0 -75
- data/lib/igniter/server.rb +0 -67
- /data/{lib → packages/igniter-agents/lib}/igniter/agent/mailbox.rb +0 -0
- /data/{lib → packages/igniter-agents/lib}/igniter/agent/message.rb +0 -0
- /data/{lib → packages/igniter-agents/lib}/igniter/agent/state_holder.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/graph_compiler.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/type_resolver.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validation_context.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/await_validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/callable_validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/outputs_validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/type_compatibility_validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/uniqueness_validator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/auditing/report/console_formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/auditing/report/markdown_formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/introspection/formatters/mermaid_formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/introspection/formatters/text_tree_formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/divergence.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/report.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/runner.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dsl/schema_builder.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dsl.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/effect_registry.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/events/bus.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/events/event.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/events.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/builder.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/node_entry.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/report.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/executor_registry.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/auditing/timeline.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/auditing.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/introspection.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive/engine.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive/matcher.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive/reaction.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental/formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental/result.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental/tracker.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/invariant.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/await_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/composition_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/effect_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/graph.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/input_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/output_node.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/generators.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/result.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/run.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/runner.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/lineage.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/node_trace.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/text_formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/collection_result.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/invalidator.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runner_factory.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runners/inline_runner.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runners/store_runner.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runners/thread_pool_runner.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/active_record_store.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/file_store.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/memory_store.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/compensation.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/compensation_record.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/executor.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/formatter.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/result.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/stream_loop.rb +0 -0
- /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/type_system.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/cable_adapter.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/contract_job.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/generators/contract/contract_generator.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/generators/install/install_generator.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/railtie.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/webhook_concern.rb +0 -0
- /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/base.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/contracts_handler.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/health_handler.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/status_handler.rb +0 -0
- /data/{lib → packages/igniter-server/lib}/igniter/server/registry.rb +0 -0
data/docs/ARCHITECTURE_V2.md
DELETED
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
# Igniter v2 Architecture
|
|
2
|
-
|
|
3
|
-
## Goal
|
|
4
|
-
|
|
5
|
-
Igniter v2 is a Ruby library for describing business logic as a validated dependency graph and executing that graph with:
|
|
6
|
-
|
|
7
|
-
- deterministic resolution
|
|
8
|
-
- lazy evaluation
|
|
9
|
-
- selective invalidation
|
|
10
|
-
- transparent events
|
|
11
|
-
- optional extensions built on top of the event stream
|
|
12
|
-
|
|
13
|
-
The core design principle is strict separation between:
|
|
14
|
-
|
|
15
|
-
- model time: describing the graph
|
|
16
|
-
- compile time: validating and freezing the graph
|
|
17
|
-
- runtime: resolving the graph against inputs
|
|
18
|
-
|
|
19
|
-
## Design Principles
|
|
20
|
-
|
|
21
|
-
1. Small, hard core.
|
|
22
|
-
The kernel should be minimal, strict, and easy to test.
|
|
23
|
-
|
|
24
|
-
2. Compile first, execute second.
|
|
25
|
-
No runtime should deal with half-built DSL objects.
|
|
26
|
-
|
|
27
|
-
3. Explicit data flow.
|
|
28
|
-
Dependencies, output exposure, and composition mappings are always declared.
|
|
29
|
-
|
|
30
|
-
4. Extensions over hooks.
|
|
31
|
-
Auditing, reactions, tracing, and introspection consume runtime events instead of being deeply embedded in execution.
|
|
32
|
-
|
|
33
|
-
5. Stable identities.
|
|
34
|
-
Nodes should have stable `id`, `path`, and `kind`. Runtime logic must not depend on Ruby object identity alone.
|
|
35
|
-
|
|
36
|
-
## Layered Architecture
|
|
37
|
-
|
|
38
|
-
### 1. `Igniter::Model`
|
|
39
|
-
|
|
40
|
-
Pure compile-time domain objects. No lazy execution, no caching, no observers.
|
|
41
|
-
|
|
42
|
-
Primary objects:
|
|
43
|
-
|
|
44
|
-
- `Igniter::Model::Graph`
|
|
45
|
-
- `Igniter::Model::Node`
|
|
46
|
-
- `Igniter::Model::InputNode`
|
|
47
|
-
- `Igniter::Model::ComputeNode`
|
|
48
|
-
- `Igniter::Model::OutputNode`
|
|
49
|
-
- `Igniter::Model::CompositionNode`
|
|
50
|
-
- `Igniter::Model::Dependency`
|
|
51
|
-
|
|
52
|
-
Responsibilities:
|
|
53
|
-
|
|
54
|
-
- represent graph topology
|
|
55
|
-
- store node metadata
|
|
56
|
-
- store dependency declarations
|
|
57
|
-
- store source location metadata for diagnostics
|
|
58
|
-
- expose graph traversal primitives
|
|
59
|
-
|
|
60
|
-
Constraints:
|
|
61
|
-
|
|
62
|
-
- immutable after compilation
|
|
63
|
-
- no implicit mutation during runtime
|
|
64
|
-
|
|
65
|
-
### 2. `Igniter::Compiler`
|
|
66
|
-
|
|
67
|
-
Transforms draft model definitions into a validated `CompiledGraph`.
|
|
68
|
-
|
|
69
|
-
Primary objects:
|
|
70
|
-
|
|
71
|
-
- `Igniter::Compiler::GraphCompiler`
|
|
72
|
-
- `Igniter::Compiler::CompiledGraph`
|
|
73
|
-
- `Igniter::Compiler::Validator`
|
|
74
|
-
- `Igniter::Compiler::ResolutionPlan`
|
|
75
|
-
|
|
76
|
-
Responsibilities:
|
|
77
|
-
|
|
78
|
-
- validate node uniqueness
|
|
79
|
-
- validate paths and namespaces
|
|
80
|
-
- validate dependency references
|
|
81
|
-
- detect cycles
|
|
82
|
-
- validate composition mappings
|
|
83
|
-
- compute topological order
|
|
84
|
-
- freeze the result
|
|
85
|
-
|
|
86
|
-
Compiler output:
|
|
87
|
-
|
|
88
|
-
- stable node registry by id and path
|
|
89
|
-
- dependency index
|
|
90
|
-
- reverse dependency index
|
|
91
|
-
- topological resolution plan
|
|
92
|
-
- output registry
|
|
93
|
-
|
|
94
|
-
### 3. `Igniter::Runtime`
|
|
95
|
-
|
|
96
|
-
Executes a compiled graph for one input set.
|
|
97
|
-
|
|
98
|
-
Primary objects:
|
|
99
|
-
|
|
100
|
-
- `Igniter::Runtime::Execution`
|
|
101
|
-
- `Igniter::Runtime::Resolver`
|
|
102
|
-
- `Igniter::Runtime::Cache`
|
|
103
|
-
- `Igniter::Runtime::Invalidator`
|
|
104
|
-
- `Igniter::Runtime::NodeState`
|
|
105
|
-
- `Igniter::Runtime::Result`
|
|
106
|
-
- `Igniter::Runtime::ExecutorRegistry`
|
|
107
|
-
|
|
108
|
-
Responsibilities:
|
|
109
|
-
|
|
110
|
-
- hold input values
|
|
111
|
-
- resolve requested outputs or nodes
|
|
112
|
-
- cache node states
|
|
113
|
-
- invalidate downstream nodes on input changes
|
|
114
|
-
- emit lifecycle events
|
|
115
|
-
- expose execution result
|
|
116
|
-
|
|
117
|
-
Non-responsibilities:
|
|
118
|
-
|
|
119
|
-
- graph validation
|
|
120
|
-
- DSL parsing
|
|
121
|
-
- auditing persistence
|
|
122
|
-
- reactive policy decisions
|
|
123
|
-
|
|
124
|
-
### 4. `Igniter::DSL`
|
|
125
|
-
|
|
126
|
-
Thin syntax layer that produces a graph draft or a builder input for the compiler.
|
|
127
|
-
|
|
128
|
-
Primary objects:
|
|
129
|
-
|
|
130
|
-
- `Igniter::DSL::Contract`
|
|
131
|
-
- `Igniter::DSL::Builder`
|
|
132
|
-
- `Igniter::DSL::Reference`
|
|
133
|
-
|
|
134
|
-
Responsibilities:
|
|
135
|
-
|
|
136
|
-
- provide ergonomic declaration syntax
|
|
137
|
-
- map user declarations to model/compiler input
|
|
138
|
-
- attach source-location metadata for errors
|
|
139
|
-
|
|
140
|
-
Rules:
|
|
141
|
-
|
|
142
|
-
- DSL must not contain execution logic
|
|
143
|
-
- DSL must not decide invalidation or cache behavior
|
|
144
|
-
- DSL should prefer explicit references over `method_missing`
|
|
145
|
-
|
|
146
|
-
### 5. `Igniter::Events`
|
|
147
|
-
|
|
148
|
-
Canonical runtime event schema.
|
|
149
|
-
|
|
150
|
-
Primary objects:
|
|
151
|
-
|
|
152
|
-
- `Igniter::Events::Event`
|
|
153
|
-
- `Igniter::Events::Bus`
|
|
154
|
-
- `Igniter::Events::Subscriber`
|
|
155
|
-
|
|
156
|
-
Responsibilities:
|
|
157
|
-
|
|
158
|
-
- publish structured execution events
|
|
159
|
-
- provide extension point for diagnostics and reactive features
|
|
160
|
-
|
|
161
|
-
### 6. `Igniter::Extensions`
|
|
162
|
-
|
|
163
|
-
Optional packages built on top of the event stream and compiled/runtime APIs.
|
|
164
|
-
|
|
165
|
-
Initial extension namespaces:
|
|
166
|
-
|
|
167
|
-
- `Igniter::Extensions::Auditing`
|
|
168
|
-
- `Igniter::Extensions::Reactive`
|
|
169
|
-
- `Igniter::Extensions::Introspection`
|
|
170
|
-
|
|
171
|
-
## Runtime Boundaries
|
|
172
|
-
|
|
173
|
-
The runtime is split by responsibility:
|
|
174
|
-
|
|
175
|
-
- `Execution`: public session object
|
|
176
|
-
- `Resolver`: resolves one node using dependencies
|
|
177
|
-
- `Cache`: stores `NodeState` by node id
|
|
178
|
-
- `Invalidator`: marks downstream nodes stale
|
|
179
|
-
- `Result`: output facade for callers
|
|
180
|
-
- `Bus`: emits execution events
|
|
181
|
-
|
|
182
|
-
This is deliberate. The old shape concentrated orchestration, state mutation, notifications, and invalidation in one class. In v2, each concern gets a dedicated object.
|
|
183
|
-
|
|
184
|
-
## Node Model
|
|
185
|
-
|
|
186
|
-
Every compiled node should have:
|
|
187
|
-
|
|
188
|
-
- `id`
|
|
189
|
-
- `kind`
|
|
190
|
-
- `name`
|
|
191
|
-
- `path`
|
|
192
|
-
- `dependencies`
|
|
193
|
-
- `metadata`
|
|
194
|
-
|
|
195
|
-
Candidate node kinds for v2:
|
|
196
|
-
|
|
197
|
-
- `:input`
|
|
198
|
-
- `:compute`
|
|
199
|
-
- `:output`
|
|
200
|
-
- `:composition`
|
|
201
|
-
|
|
202
|
-
Optional later kinds:
|
|
203
|
-
|
|
204
|
-
- `:constant`
|
|
205
|
-
- `:projection`
|
|
206
|
-
- `:group`
|
|
207
|
-
|
|
208
|
-
### Why reduce node kinds
|
|
209
|
-
|
|
210
|
-
The kernel should start with the smallest set that explains the execution model clearly. Extra node kinds should be added only when they materially simplify the model rather than encode DSL convenience.
|
|
211
|
-
|
|
212
|
-
## Composition Strategy
|
|
213
|
-
|
|
214
|
-
Composition is a first-class node kind.
|
|
215
|
-
|
|
216
|
-
A composition node:
|
|
217
|
-
|
|
218
|
-
- references another compiled contract
|
|
219
|
-
- defines an input mapping from parent execution to child execution
|
|
220
|
-
- returns either a child `Result` or a collection of child `Result` objects
|
|
221
|
-
|
|
222
|
-
Composition rules:
|
|
223
|
-
|
|
224
|
-
- parent and child graphs are independently compiled
|
|
225
|
-
- child execution has its own cache and event stream
|
|
226
|
-
- parent events may carry child execution correlation metadata
|
|
227
|
-
|
|
228
|
-
## Extension Strategy
|
|
229
|
-
|
|
230
|
-
Extensions must subscribe to events and read runtime state through stable APIs.
|
|
231
|
-
|
|
232
|
-
Examples:
|
|
233
|
-
|
|
234
|
-
- auditing stores a timeline of events and snapshots
|
|
235
|
-
- reactive runs side effects in response to selected events
|
|
236
|
-
- introspection formats compiled graphs and runtime state
|
|
237
|
-
|
|
238
|
-
The kernel should not know persistence formats, storage adapters, or replay UIs.
|
|
239
|
-
|
|
240
|
-
## Error Model
|
|
241
|
-
|
|
242
|
-
Errors should be typed and predictable.
|
|
243
|
-
|
|
244
|
-
Primary families:
|
|
245
|
-
|
|
246
|
-
- `Igniter::CompileError`
|
|
247
|
-
- `Igniter::ValidationError`
|
|
248
|
-
- `Igniter::CycleError`
|
|
249
|
-
- `Igniter::InputError`
|
|
250
|
-
- `Igniter::ResolutionError`
|
|
251
|
-
- `Igniter::CompositionError`
|
|
252
|
-
|
|
253
|
-
Compile errors should include source metadata when available:
|
|
254
|
-
|
|
255
|
-
- contract class
|
|
256
|
-
- node path
|
|
257
|
-
- line number
|
|
258
|
-
- declaration snippet or declaration type
|
|
259
|
-
|
|
260
|
-
## Packaging Rules
|
|
261
|
-
|
|
262
|
-
The public surface should be intentionally small:
|
|
263
|
-
|
|
264
|
-
- `require "igniter"`
|
|
265
|
-
- `Igniter::Contract`
|
|
266
|
-
- `Igniter.compile`
|
|
267
|
-
- `Igniter.execute`
|
|
268
|
-
|
|
269
|
-
Autoloading must be optional convenience, not a hard dependency for correctness.
|
|
270
|
-
|
|
271
|
-
The gem must be valid and packageable without:
|
|
272
|
-
|
|
273
|
-
- a `.git` directory
|
|
274
|
-
- Rails
|
|
275
|
-
- optional extensions
|
|
276
|
-
|
|
277
|
-
## Initial Directory Shape
|
|
278
|
-
|
|
279
|
-
```text
|
|
280
|
-
lib/
|
|
281
|
-
igniter.rb
|
|
282
|
-
igniter/
|
|
283
|
-
version.rb
|
|
284
|
-
errors.rb
|
|
285
|
-
contract.rb
|
|
286
|
-
model/
|
|
287
|
-
compiler/
|
|
288
|
-
runtime/
|
|
289
|
-
events/
|
|
290
|
-
dsl/
|
|
291
|
-
extensions/
|
|
292
|
-
auditing/
|
|
293
|
-
reactive/
|
|
294
|
-
introspection/
|
|
295
|
-
spec/
|
|
296
|
-
compiler/
|
|
297
|
-
runtime/
|
|
298
|
-
integration/
|
|
299
|
-
docs/
|
|
300
|
-
ARCHITECTURE_V2.md
|
|
301
|
-
EXECUTION_MODEL_V2.md
|
|
302
|
-
API_V2.md
|
|
303
|
-
```
|
|
304
|
-
|
|
305
|
-
## Non-Goals for the First Rewrite
|
|
306
|
-
|
|
307
|
-
These should not block the first working kernel:
|
|
308
|
-
|
|
309
|
-
- Rails integration
|
|
310
|
-
- persistence adapters
|
|
311
|
-
- replay UI
|
|
312
|
-
- async execution
|
|
313
|
-
- distributed execution
|
|
314
|
-
- type inference
|
|
315
|
-
- speculative optimization
|
|
316
|
-
|
|
317
|
-
The first target is a strict, reliable, inspectable synchronous engine.
|
data/docs/BACKLOG.md
DELETED
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
# Igniter Backlog
|
|
2
|
-
|
|
3
|
-
This file is a lightweight backlog for ideas that are worth preserving before they turn into active implementation work.
|
|
4
|
-
|
|
5
|
-
## Collections v1
|
|
6
|
-
|
|
7
|
-
Status: idea
|
|
8
|
-
Priority: high
|
|
9
|
-
|
|
10
|
-
Problem:
|
|
11
|
-
|
|
12
|
-
- Real orchestration often needs fan-out over a list of homogeneous items.
|
|
13
|
-
- Without a collection primitive, users will hide loops inside `compute` nodes.
|
|
14
|
-
- That reduces graph transparency and makes diagnostics, invalidation, and async execution weaker.
|
|
15
|
-
|
|
16
|
-
Example direction:
|
|
17
|
-
|
|
18
|
-
```ruby
|
|
19
|
-
collection :technicians,
|
|
20
|
-
depends_on: :technician_inputs,
|
|
21
|
-
each: TechnicianContract,
|
|
22
|
-
key: :technician_id,
|
|
23
|
-
mode: :collect
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Likely semantics:
|
|
27
|
-
|
|
28
|
-
- `depends_on:` should resolve to an array of item input hashes
|
|
29
|
-
- `each:` should point to a child contract or executor-like collection worker
|
|
30
|
-
- `key:` should provide stable item identity for invalidation, resume, and diagnostics
|
|
31
|
-
- `mode:` should control failure semantics, for example `:collect` vs `:fail_fast`
|
|
32
|
-
|
|
33
|
-
Why it matters:
|
|
34
|
-
|
|
35
|
-
- enables explicit fan-out/fan-in in the graph model
|
|
36
|
-
- fits naturally with `thread_pool` execution
|
|
37
|
-
- creates a path toward item-level async/pending/resume
|
|
38
|
-
- improves diagnostics over collection workflows
|
|
39
|
-
|
|
40
|
-
Open design questions:
|
|
41
|
-
|
|
42
|
-
- result shape: array, keyed hash, or dedicated `CollectionResult`
|
|
43
|
-
- compile-time validation for item schema and key extraction
|
|
44
|
-
- per-item invalidation and snapshot/restore behavior
|
|
45
|
-
- item-level events and auditing model
|
|
46
|
-
- parent failure semantics when some items fail or remain pending
|
|
47
|
-
|
|
48
|
-
Suggested implementation order:
|
|
49
|
-
|
|
50
|
-
1. write a short design doc for Collections v1
|
|
51
|
-
2. define graph/model/runtime semantics
|
|
52
|
-
3. add compile-time validators
|
|
53
|
-
4. add a minimal synchronous implementation
|
|
54
|
-
5. extend to parallel runner
|
|
55
|
-
6. later extend to pending/store-backed item execution
|
|
56
|
-
|
|
57
|
-
## Conditional Branches v1
|
|
58
|
-
|
|
59
|
-
Status: idea
|
|
60
|
-
Priority: high
|
|
61
|
-
|
|
62
|
-
Problem:
|
|
63
|
-
|
|
64
|
-
- Real orchestration often needs explicit conditional routing.
|
|
65
|
-
- Without a branching primitive, users push control flow into `compute` blocks or executors.
|
|
66
|
-
- That hides workflow structure and weakens diagnostics and introspection.
|
|
67
|
-
|
|
68
|
-
Example direction:
|
|
69
|
-
|
|
70
|
-
```ruby
|
|
71
|
-
branch :delivery_strategy, depends_on: :country do
|
|
72
|
-
on "US", contract: USDeliveryContract
|
|
73
|
-
on "UA", contract: LocalDeliveryContract
|
|
74
|
-
else contract: DefaultDeliveryContract
|
|
75
|
-
end
|
|
76
|
-
```
|
|
77
|
-
|
|
78
|
-
Why it matters:
|
|
79
|
-
|
|
80
|
-
- makes control flow explicit in the graph
|
|
81
|
-
- keeps routing logic out of generic `compute` nodes
|
|
82
|
-
- improves explainability by showing which branch was selected
|
|
83
|
-
- fits future schema/UI-driven graph composition
|
|
84
|
-
|
|
85
|
-
Likely semantics:
|
|
86
|
-
|
|
87
|
-
- `depends_on:` resolves the selector input
|
|
88
|
-
- one branch is selected at runtime based on ordered matching
|
|
89
|
-
- the selected branch behaves like a composition-like node
|
|
90
|
-
- diagnostics and events should include which branch matched
|
|
91
|
-
|
|
92
|
-
Open design questions:
|
|
93
|
-
|
|
94
|
-
- exact-match only vs predicate-based matching
|
|
95
|
-
- whether `else` is required or optional
|
|
96
|
-
- compatibility of outputs across different branches
|
|
97
|
-
- how branch nodes appear in plans, graphs, and runtime state
|
|
98
|
-
- whether branches select contracts only or also arbitrary nodes/executors
|
|
99
|
-
|
|
100
|
-
Suggested implementation order:
|
|
101
|
-
|
|
102
|
-
1. write a short design doc for Branches v1
|
|
103
|
-
2. define graph/model/runtime semantics
|
|
104
|
-
3. add compile-time validation for branch definitions
|
|
105
|
-
4. implement a minimal contract-branching version
|
|
106
|
-
5. add introspection and diagnostics for selected branch visibility
|
|
107
|
-
6. later extend to schema-driven graph builders
|
|
108
|
-
|
|
109
|
-
## Namespaces / Scopes v1
|
|
110
|
-
|
|
111
|
-
Status: idea
|
|
112
|
-
Priority: medium
|
|
113
|
-
|
|
114
|
-
Problem:
|
|
115
|
-
|
|
116
|
-
- Larger contracts need a way to group related nodes without extracting every subgraph into a separate top-level contract.
|
|
117
|
-
- Without grouping, large orchestration graphs become flat and harder to scan.
|
|
118
|
-
- Users may want a local container for related calculations before deciding whether the logic deserves a standalone contract.
|
|
119
|
-
|
|
120
|
-
Example direction:
|
|
121
|
-
|
|
122
|
-
```ruby
|
|
123
|
-
scope :availability do
|
|
124
|
-
lookup :vendor, depends_on: %i[trade vendor_id], call: LookupVendor
|
|
125
|
-
lookup :zip_code, depends_on: [:zip_code_raw], call: LookupZipCode
|
|
126
|
-
compute :geo_bids, depends_on: %i[zip_code vendor], call: LookupGeoBids
|
|
127
|
-
compute :availability, depends_on: %i[vendor zip_code], call: CalculateAvailability
|
|
128
|
-
end
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
Possible extended direction:
|
|
132
|
-
|
|
133
|
-
```ruby
|
|
134
|
-
namespace :availability do
|
|
135
|
-
input :vendor_id
|
|
136
|
-
input :zip_code_raw
|
|
137
|
-
|
|
138
|
-
compute :vendor, ...
|
|
139
|
-
compute :availability, ...
|
|
140
|
-
|
|
141
|
-
output :availability
|
|
142
|
-
end
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
Why it matters:
|
|
146
|
-
|
|
147
|
-
- improves readability of larger contracts
|
|
148
|
-
- creates a middle layer between a flat graph and full contract composition
|
|
149
|
-
- may provide a path toward inline-contract semantics
|
|
150
|
-
- could improve future graph visualization and schema editing UX
|
|
151
|
-
|
|
152
|
-
Open design questions:
|
|
153
|
-
|
|
154
|
-
- purely visual grouping vs real runtime/model boundary
|
|
155
|
-
- whether scoped nodes get path prefixes like `availability.vendor`
|
|
156
|
-
- whether scopes can define local inputs/outputs
|
|
157
|
-
- how scopes differ from composition and when users should prefer one over the other
|
|
158
|
-
- whether inline contracts should compile into the same graph or nested child executions
|
|
159
|
-
|
|
160
|
-
Suggested implementation order:
|
|
161
|
-
|
|
162
|
-
1. write a short design note comparing scopes vs composition
|
|
163
|
-
2. decide whether v1 is visual/logical grouping only or a true subgraph primitive
|
|
164
|
-
3. define path, output, and introspection semantics
|
|
165
|
-
4. implement minimal grouping support
|
|
166
|
-
5. later evaluate inline-contract execution semantics
|
data/docs/BRANCHES_V1.md
DELETED
|
@@ -1,213 +0,0 @@
|
|
|
1
|
-
# Branches v1
|
|
2
|
-
|
|
3
|
-
## Goal
|
|
4
|
-
|
|
5
|
-
`branch` introduces explicit conditional routing as a graph primitive.
|
|
6
|
-
|
|
7
|
-
The feature should make control flow:
|
|
8
|
-
|
|
9
|
-
- declarative
|
|
10
|
-
- visible at compile time
|
|
11
|
-
- visible in graph introspection
|
|
12
|
-
- visible in runtime diagnostics and events
|
|
13
|
-
|
|
14
|
-
It should avoid pushing routing logic into generic `compute` blocks or executors.
|
|
15
|
-
|
|
16
|
-
## DSL
|
|
17
|
-
|
|
18
|
-
### Basic form
|
|
19
|
-
|
|
20
|
-
```ruby
|
|
21
|
-
branch :delivery_strategy, with: :country do
|
|
22
|
-
on "US", contract: USDeliveryContract
|
|
23
|
-
on "UA", contract: LocalDeliveryContract
|
|
24
|
-
default contract: DefaultDeliveryContract
|
|
25
|
-
end
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### Exporting outputs
|
|
29
|
-
|
|
30
|
-
```ruby
|
|
31
|
-
branch :delivery_strategy, with: :country do
|
|
32
|
-
on "US", contract: USDeliveryContract
|
|
33
|
-
on "UA", contract: LocalDeliveryContract
|
|
34
|
-
default contract: DefaultDeliveryContract
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
export :price, :eta, from: :delivery_strategy
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
### Nested result
|
|
41
|
-
|
|
42
|
-
```ruby
|
|
43
|
-
output :delivery_strategy
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
This should return a child result object, similar to composition.
|
|
47
|
-
|
|
48
|
-
## Why `default` and not `else`
|
|
49
|
-
|
|
50
|
-
`default` is preferred because:
|
|
51
|
-
|
|
52
|
-
- it is valid Ruby DSL syntax
|
|
53
|
-
- it is not a reserved keyword
|
|
54
|
-
- it reads clearly as a fallback branch
|
|
55
|
-
- it serializes more cleanly into schema-driven representations
|
|
56
|
-
|
|
57
|
-
## Scope of v1
|
|
58
|
-
|
|
59
|
-
Branches v1 should stay intentionally narrow.
|
|
60
|
-
|
|
61
|
-
Supported:
|
|
62
|
-
|
|
63
|
-
- exact-match branch selection
|
|
64
|
-
- one selector dependency
|
|
65
|
-
- child contracts as branch targets
|
|
66
|
-
- explicit fallback through `default`
|
|
67
|
-
- branch result as a composition-like nested result
|
|
68
|
-
- `export` from the selected branch
|
|
69
|
-
|
|
70
|
-
Not supported in v1:
|
|
71
|
-
|
|
72
|
-
- predicate lambdas
|
|
73
|
-
- regex or set matching
|
|
74
|
-
- multiple selectors
|
|
75
|
-
- executor targets
|
|
76
|
-
- node-level arbitrary targets
|
|
77
|
-
- implicit output merging
|
|
78
|
-
|
|
79
|
-
## Runtime Semantics
|
|
80
|
-
|
|
81
|
-
1. Resolve the selector dependency.
|
|
82
|
-
2. Match the selector value against declared `on` cases in order.
|
|
83
|
-
3. If no case matches, use `default`.
|
|
84
|
-
4. Instantiate and resolve the selected child contract.
|
|
85
|
-
5. Mark the branch node as succeeded only after the selected child contract succeeds.
|
|
86
|
-
|
|
87
|
-
If the selected child contract fails, the branch node fails.
|
|
88
|
-
|
|
89
|
-
Unselected branches must not execute.
|
|
90
|
-
|
|
91
|
-
## Compile-Time Validation
|
|
92
|
-
|
|
93
|
-
The compiler should validate:
|
|
94
|
-
|
|
95
|
-
- branch name uniqueness
|
|
96
|
-
- selector dependency existence
|
|
97
|
-
- at least one `on` case
|
|
98
|
-
- exactly one `default`
|
|
99
|
-
- unique case values within the branch
|
|
100
|
-
- each case has a valid contract
|
|
101
|
-
- the default has a valid contract
|
|
102
|
-
- exported outputs exist across all possible branch contracts
|
|
103
|
-
|
|
104
|
-
The last point is important:
|
|
105
|
-
|
|
106
|
-
If the contract exports `price` from a branch, then every possible branch contract must expose `price`.
|
|
107
|
-
|
|
108
|
-
## Result Semantics
|
|
109
|
-
|
|
110
|
-
The branch node should behave similarly to composition:
|
|
111
|
-
|
|
112
|
-
- nested result available via `output :branch_name`
|
|
113
|
-
- child outputs re-exportable through `export`
|
|
114
|
-
|
|
115
|
-
This keeps branch consistent with the existing composition mental model.
|
|
116
|
-
|
|
117
|
-
## Graph Model
|
|
118
|
-
|
|
119
|
-
Branches v1 should introduce a dedicated node kind:
|
|
120
|
-
|
|
121
|
-
- `:branch`
|
|
122
|
-
|
|
123
|
-
Suggested internal shape:
|
|
124
|
-
|
|
125
|
-
```ruby
|
|
126
|
-
BranchNode.new(
|
|
127
|
-
name: :delivery_strategy,
|
|
128
|
-
selector: :country,
|
|
129
|
-
cases: [
|
|
130
|
-
{ match: "US", contract: USDeliveryContract },
|
|
131
|
-
{ match: "UA", contract: LocalDeliveryContract }
|
|
132
|
-
],
|
|
133
|
-
default_contract: DefaultDeliveryContract
|
|
134
|
-
)
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
This should not be modeled as a normal compute node.
|
|
138
|
-
|
|
139
|
-
## Events
|
|
140
|
-
|
|
141
|
-
Branches v1 should add a specific runtime event:
|
|
142
|
-
|
|
143
|
-
- `branch_selected`
|
|
144
|
-
|
|
145
|
-
Suggested payload:
|
|
146
|
-
|
|
147
|
-
```ruby
|
|
148
|
-
{
|
|
149
|
-
selector: :country,
|
|
150
|
-
selector_value: "US",
|
|
151
|
-
matched_case: "US",
|
|
152
|
-
selected_contract: "USDeliveryContract"
|
|
153
|
-
}
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
This should improve observability and diagnostics without forcing users to infer branch choice from child execution state.
|
|
157
|
-
|
|
158
|
-
## Introspection
|
|
159
|
-
|
|
160
|
-
### Graph text / Mermaid
|
|
161
|
-
|
|
162
|
-
Branch nodes should render distinctly from compute and composition nodes.
|
|
163
|
-
|
|
164
|
-
The graph should show:
|
|
165
|
-
|
|
166
|
-
- selector dependency
|
|
167
|
-
- available branch cases
|
|
168
|
-
- default contract
|
|
169
|
-
|
|
170
|
-
### Plan
|
|
171
|
-
|
|
172
|
-
Before execution:
|
|
173
|
-
|
|
174
|
-
- branch node is blocked on selector resolution
|
|
175
|
-
- available branches are visible as candidates
|
|
176
|
-
|
|
177
|
-
After execution:
|
|
178
|
-
|
|
179
|
-
- selected branch is visible in runtime state or diagnostics
|
|
180
|
-
|
|
181
|
-
### Diagnostics
|
|
182
|
-
|
|
183
|
-
Diagnostics should surface:
|
|
184
|
-
|
|
185
|
-
- selector value
|
|
186
|
-
- selected branch case
|
|
187
|
-
- selected child contract
|
|
188
|
-
|
|
189
|
-
## Error Model
|
|
190
|
-
|
|
191
|
-
Suggested runtime error:
|
|
192
|
-
|
|
193
|
-
- `Igniter::BranchSelectionError`
|
|
194
|
-
|
|
195
|
-
Used for:
|
|
196
|
-
|
|
197
|
-
- invalid branch configuration reaching runtime
|
|
198
|
-
- missing match if a branch somehow has no `default`
|
|
199
|
-
|
|
200
|
-
In a well-validated graph, this error should be rare.
|
|
201
|
-
|
|
202
|
-
## Future Extensions
|
|
203
|
-
|
|
204
|
-
Possible later additions:
|
|
205
|
-
|
|
206
|
-
- `in:` matching
|
|
207
|
-
- `matches:` matching
|
|
208
|
-
- predicate matching
|
|
209
|
-
- branch-to-executor targets
|
|
210
|
-
- schema-driven branch authoring
|
|
211
|
-
- branch-aware collections
|
|
212
|
-
|
|
213
|
-
These should not be part of v1.
|