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.
Files changed (638) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -3
  3. data/README.md +164 -409
  4. data/bin/igniter-stack +94 -0
  5. data/docs/README.md +62 -0
  6. data/examples/README.md +74 -312
  7. data/examples/agent_orchestration.rb +76 -0
  8. data/examples/agents.rb +2 -1
  9. data/examples/catalog.rb +412 -0
  10. data/examples/consensus.rb +241 -0
  11. data/examples/dataflow.rb +309 -0
  12. data/examples/distributed_workflow.rb +1 -1
  13. data/examples/effects.rb +10 -9
  14. data/examples/elocal_webhook.rb +1 -0
  15. data/examples/incremental.rb +4 -3
  16. data/examples/introspection.rb +49 -0
  17. data/examples/invariants.rb +4 -3
  18. data/examples/llm_tools.rb +237 -0
  19. data/examples/mesh.rb +241 -0
  20. data/examples/mesh_discovery.rb +287 -0
  21. data/examples/mesh_gossip.rb +164 -0
  22. data/examples/reactive_auditing.rb +50 -0
  23. data/examples/ringcentral_routing.rb +1 -1
  24. data/examples/run.rb +163 -0
  25. data/lib/igniter/monorepo_packages.rb +17 -0
  26. data/lib/igniter/stack.rb +5 -0
  27. data/lib/igniter.rb +48 -15
  28. data/packages/igniter-agents/README.md +22 -0
  29. data/{lib → packages/igniter-agents/lib}/igniter/agent/ref.rb +1 -0
  30. data/{lib → packages/igniter-agents/lib}/igniter/agent/runner.rb +12 -0
  31. data/{lib → packages/igniter-agents/lib}/igniter/agent.rb +6 -0
  32. data/packages/igniter-agents/lib/igniter/agents/observability/metrics_agent.rb +130 -0
  33. data/packages/igniter-agents/lib/igniter/agents/pipeline/batch_processor_agent.rb +131 -0
  34. data/packages/igniter-agents/lib/igniter/agents/proactive/alert_agent.rb +111 -0
  35. data/packages/igniter-agents/lib/igniter/agents/proactive/health_check_agent.rb +122 -0
  36. data/packages/igniter-agents/lib/igniter/agents/proactive_agent.rb +208 -0
  37. data/packages/igniter-agents/lib/igniter/agents/reliability/retry_agent.rb +99 -0
  38. data/packages/igniter-agents/lib/igniter/agents/scheduling/cron_agent.rb +110 -0
  39. data/packages/igniter-agents/lib/igniter/agents.rb +23 -0
  40. data/packages/igniter-agents/lib/igniter/ai/agents/chain_agent.rb +129 -0
  41. data/packages/igniter-agents/lib/igniter/ai/agents/critic_agent.rb +165 -0
  42. data/packages/igniter-agents/lib/igniter/ai/agents/evaluator_agent.rb +195 -0
  43. data/packages/igniter-agents/lib/igniter/ai/agents/evolution_agent.rb +288 -0
  44. data/packages/igniter-agents/lib/igniter/ai/agents/observer_agent.rb +186 -0
  45. data/packages/igniter-agents/lib/igniter/ai/agents/planner_agent.rb +212 -0
  46. data/packages/igniter-agents/lib/igniter/ai/agents/router_agent.rb +133 -0
  47. data/packages/igniter-agents/lib/igniter/ai/agents/self_reflection_agent.rb +177 -0
  48. data/packages/igniter-agents/lib/igniter/ai/agents.rb +25 -0
  49. data/{lib → packages/igniter-agents/lib}/igniter/registry.rb +2 -0
  50. data/packages/igniter-agents/lib/igniter/runtime/registry_agent_adapter.rb +102 -0
  51. data/{lib → packages/igniter-agents/lib}/igniter/supervisor.rb +3 -0
  52. data/packages/igniter-agents/lib/igniter-agents.rb +7 -0
  53. data/packages/igniter-ai/README.md +20 -0
  54. data/packages/igniter-ai/lib/igniter/ai/config.rb +113 -0
  55. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/context.rb +2 -2
  56. data/packages/igniter-ai/lib/igniter/ai/executor.rb +352 -0
  57. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/anthropic.rb +42 -9
  58. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/base.rb +1 -1
  59. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/ollama.rb +4 -4
  60. data/{lib/igniter/integrations/llm → packages/igniter-ai/lib/igniter/ai}/providers/openai.rb +39 -10
  61. data/packages/igniter-ai/lib/igniter/ai/skill/feedback.rb +116 -0
  62. data/packages/igniter-ai/lib/igniter/ai/skill/output_schema.rb +110 -0
  63. data/packages/igniter-ai/lib/igniter/ai/skill/runtime_contract.rb +87 -0
  64. data/packages/igniter-ai/lib/igniter/ai/skill.rb +107 -0
  65. data/packages/igniter-ai/lib/igniter/ai/tool_registry.rb +79 -0
  66. data/packages/igniter-ai/lib/igniter/ai/transcription/providers/assemblyai.rb +200 -0
  67. data/packages/igniter-ai/lib/igniter/ai/transcription/providers/base.rb +122 -0
  68. data/packages/igniter-ai/lib/igniter/ai/transcription/providers/deepgram.rb +162 -0
  69. data/packages/igniter-ai/lib/igniter/ai/transcription/providers/openai.rb +102 -0
  70. data/packages/igniter-ai/lib/igniter/ai/transcription/transcriber.rb +145 -0
  71. data/packages/igniter-ai/lib/igniter/ai/transcription/transcript_result.rb +29 -0
  72. data/packages/igniter-ai/lib/igniter/ai.rb +98 -0
  73. data/packages/igniter-ai/lib/igniter-ai.rb +3 -0
  74. data/packages/igniter-app/README.md +19 -0
  75. data/packages/igniter-app/lib/igniter/app/app_config.rb +43 -0
  76. data/packages/igniter-app/lib/igniter/app/app_host.rb +56 -0
  77. data/packages/igniter-app/lib/igniter/app/app_host_config.rb +27 -0
  78. data/packages/igniter-app/lib/igniter/app/app_host_pack.rb +13 -0
  79. data/packages/igniter-app/lib/igniter/app/autoloader.rb +18 -0
  80. data/packages/igniter-app/lib/igniter/app/cluster_app_host.rb +95 -0
  81. data/packages/igniter-app/lib/igniter/app/cluster_app_host_config.rb +78 -0
  82. data/packages/igniter-app/lib/igniter/app/credentials/config_loader.rb +152 -0
  83. data/packages/igniter-app/lib/igniter/app/credentials/credential.rb +48 -0
  84. data/packages/igniter-app/lib/igniter/app/credentials/credential_policy.rb +38 -0
  85. data/packages/igniter-app/lib/igniter/app/credentials/events/credential_event.rb +179 -0
  86. data/packages/igniter-app/lib/igniter/app/credentials/events.rb +12 -0
  87. data/packages/igniter-app/lib/igniter/app/credentials/lease_request.rb +153 -0
  88. data/packages/igniter-app/lib/igniter/app/credentials/policies/ephemeral_lease_policy.rb +35 -0
  89. data/packages/igniter-app/lib/igniter/app/credentials/policies/local_only_policy.rb +33 -0
  90. data/packages/igniter-app/lib/igniter/app/credentials/policies.rb +13 -0
  91. data/packages/igniter-app/lib/igniter/app/credentials/store.rb +21 -0
  92. data/packages/igniter-app/lib/igniter/app/credentials/stores/file_store.rb +114 -0
  93. data/packages/igniter-app/lib/igniter/app/credentials/trail.rb +254 -0
  94. data/packages/igniter-app/lib/igniter/app/credentials.rb +20 -0
  95. data/packages/igniter-app/lib/igniter/app/dev_output_sync.rb +4 -0
  96. data/packages/igniter-app/lib/igniter/app/diagnostics/app_host_contributor.rb +71 -0
  97. data/packages/igniter-app/lib/igniter/app/diagnostics/cluster_app_host_contributor.rb +97 -0
  98. data/packages/igniter-app/lib/igniter/app/diagnostics/credential_contributor.rb +66 -0
  99. data/packages/igniter-app/lib/igniter/app/diagnostics/evolution_contributor.rb +74 -0
  100. data/packages/igniter-app/lib/igniter/app/diagnostics/ignite_contributor.rb +121 -0
  101. data/packages/igniter-app/lib/igniter/app/diagnostics/loader_contributor.rb +68 -0
  102. data/packages/igniter-app/lib/igniter/app/diagnostics/orchestration_contributor.rb +200 -0
  103. data/packages/igniter-app/lib/igniter/app/diagnostics/runtime_contributor.rb +68 -0
  104. data/packages/igniter-app/lib/igniter/app/diagnostics/scheduler_contributor.rb +72 -0
  105. data/packages/igniter-app/lib/igniter/app/diagnostics/sdk_contributor.rb +284 -0
  106. data/packages/igniter-app/lib/igniter/app/diagnostics.rb +62 -0
  107. data/packages/igniter-app/lib/igniter/app/evolution/approval_decision.rb +115 -0
  108. data/packages/igniter-app/lib/igniter/app/evolution/approval_request.rb +36 -0
  109. data/packages/igniter-app/lib/igniter/app/evolution/plan.rb +72 -0
  110. data/packages/igniter-app/lib/igniter/app/evolution/planner.rb +85 -0
  111. data/packages/igniter-app/lib/igniter/app/evolution/result.rb +45 -0
  112. data/packages/igniter-app/lib/igniter/app/evolution/runner.rb +102 -0
  113. data/packages/igniter-app/lib/igniter/app/evolution/store.rb +21 -0
  114. data/packages/igniter-app/lib/igniter/app/evolution/stores/file_store.rb +241 -0
  115. data/packages/igniter-app/lib/igniter/app/evolution/trail.rb +108 -0
  116. data/packages/igniter-app/lib/igniter/app/evolution.rb +11 -0
  117. data/packages/igniter-app/lib/igniter/app/filesystem_loader_adapter.rb +21 -0
  118. data/packages/igniter-app/lib/igniter/app/generator.rb +636 -0
  119. data/packages/igniter-app/lib/igniter/app/generators/cluster.rb +1367 -0
  120. data/packages/igniter-app/lib/igniter/app/generators/dashboard.rb +152 -0
  121. data/packages/igniter-app/lib/igniter/app/generators/playground.rb +1227 -0
  122. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/README.md.erb +37 -0
  123. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/app.rb.erb +19 -0
  124. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/contexts/home_context.rb.erb +54 -0
  125. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/frontend/application.js.erb +3 -0
  126. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/spec/dashboard_app_spec.rb.erb +79 -0
  127. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/support/stack_overview.rb.erb +23 -0
  128. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/handlers/home_handler.rb.erb +27 -0
  129. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/home_page.arb.erb +44 -0
  130. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/home_page.rb.erb +56 -0
  131. data/packages/igniter-app/lib/igniter/app/generators/templates/dashboard/web/views/layout.arb.erb +17 -0
  132. data/packages/igniter-app/lib/igniter/app/host_adapter.rb +26 -0
  133. data/packages/igniter-app/lib/igniter/app/host_config.rb +40 -0
  134. data/packages/igniter-app/lib/igniter/app/host_registry.rb +43 -0
  135. data/packages/igniter-app/lib/igniter/app/loader_adapter.rb +15 -0
  136. data/packages/igniter-app/lib/igniter/app/loader_pack.rb +8 -0
  137. data/packages/igniter-app/lib/igniter/app/loader_registry.rb +39 -0
  138. data/packages/igniter-app/lib/igniter/app/observability/operator_action_handler.rb +147 -0
  139. data/packages/igniter-app/lib/igniter/app/observability/operator_console_handler.rb +747 -0
  140. data/packages/igniter-app/lib/igniter/app/observability/operator_overview_handler.rb +350 -0
  141. data/packages/igniter-app/lib/igniter/app/observability.rb +5 -0
  142. data/packages/igniter-app/lib/igniter/app/observability_pack.rb +71 -0
  143. data/packages/igniter-app/lib/igniter/app/operator/dispatcher.rb +40 -0
  144. data/packages/igniter-app/lib/igniter/app/operator/handler_registry.rb +40 -0
  145. data/packages/igniter-app/lib/igniter/app/operator/handler_result.rb +67 -0
  146. data/packages/igniter-app/lib/igniter/app/operator/handlers/base.rb +79 -0
  147. data/packages/igniter-app/lib/igniter/app/operator/handlers/ignite_handler.rb +108 -0
  148. data/packages/igniter-app/lib/igniter/app/operator/handlers/orchestration_handler.rb +33 -0
  149. data/packages/igniter-app/lib/igniter/app/operator/handlers.rb +5 -0
  150. data/packages/igniter-app/lib/igniter/app/operator/lifecycle_contract.rb +55 -0
  151. data/packages/igniter-app/lib/igniter/app/operator/policy.rb +157 -0
  152. data/packages/igniter-app/lib/igniter/app/operator.rb +17 -0
  153. data/packages/igniter-app/lib/igniter/app/orchestration/action_result_builder.rb +65 -0
  154. data/packages/igniter-app/lib/igniter/app/orchestration/followup_request.rb +36 -0
  155. data/packages/igniter-app/lib/igniter/app/orchestration/handler_registry.rb +58 -0
  156. data/packages/igniter-app/lib/igniter/app/orchestration/handlers.rb +106 -0
  157. data/packages/igniter-app/lib/igniter/app/orchestration/inbox.rb +283 -0
  158. data/packages/igniter-app/lib/igniter/app/orchestration/inbox_query.rb +293 -0
  159. data/packages/igniter-app/lib/igniter/app/orchestration/lane_registry.rb +100 -0
  160. data/packages/igniter-app/lib/igniter/app/orchestration/operator_query.rb +449 -0
  161. data/packages/igniter-app/lib/igniter/app/orchestration/plan.rb +68 -0
  162. data/packages/igniter-app/lib/igniter/app/orchestration/planner.rb +89 -0
  163. data/packages/igniter-app/lib/igniter/app/orchestration/policies.rb +125 -0
  164. data/packages/igniter-app/lib/igniter/app/orchestration/policy_registry.rb +63 -0
  165. data/packages/igniter-app/lib/igniter/app/orchestration/result.rb +43 -0
  166. data/packages/igniter-app/lib/igniter/app/orchestration/routing_registry.rb +43 -0
  167. data/packages/igniter-app/lib/igniter/app/orchestration/runner.rb +50 -0
  168. data/packages/igniter-app/lib/igniter/app/orchestration/runtime_event_query.rb +205 -0
  169. data/packages/igniter-app/lib/igniter/app/orchestration/runtime_overview_builder.rb +286 -0
  170. data/packages/igniter-app/lib/igniter/app/orchestration/runtime_query_overview_builder.rb +20 -0
  171. data/packages/igniter-app/lib/igniter/app/orchestration/runtime_result_builder.rb +23 -0
  172. data/packages/igniter-app/lib/igniter/app/orchestration.rb +113 -0
  173. data/packages/igniter-app/lib/igniter/app/runtime.rb +4 -0
  174. data/packages/igniter-app/lib/igniter/app/runtime_context.rb +101 -0
  175. data/packages/igniter-app/lib/igniter/app/runtime_pack.rb +16 -0
  176. data/packages/igniter-app/lib/igniter/app/scaffold_pack.rb +6 -0
  177. data/packages/igniter-app/lib/igniter/app/scheduler.rb +109 -0
  178. data/packages/igniter-app/lib/igniter/app/scheduler_adapter.rb +17 -0
  179. data/packages/igniter-app/lib/igniter/app/scheduler_pack.rb +8 -0
  180. data/packages/igniter-app/lib/igniter/app/scheduler_registry.rb +39 -0
  181. data/packages/igniter-app/lib/igniter/app/stack.rb +1726 -0
  182. data/packages/igniter-app/lib/igniter/app/stack_pack.rb +3 -0
  183. data/packages/igniter-app/lib/igniter/app/threaded_scheduler_adapter.rb +35 -0
  184. data/packages/igniter-app/lib/igniter/app/yml_loader.rb +43 -0
  185. data/packages/igniter-app/lib/igniter/app.rb +2367 -0
  186. data/packages/igniter-app/lib/igniter/ignite/bootstrap_agent.rb +334 -0
  187. data/packages/igniter-app/lib/igniter/ignite/bootstrap_target.rb +79 -0
  188. data/packages/igniter-app/lib/igniter/ignite/deployment_intent.rb +82 -0
  189. data/packages/igniter-app/lib/igniter/ignite/ignition_agent.rb +1011 -0
  190. data/packages/igniter-app/lib/igniter/ignite/ignition_plan.rb +83 -0
  191. data/packages/igniter-app/lib/igniter/ignite/ignition_report.rb +144 -0
  192. data/packages/igniter-app/lib/igniter/ignite/store.rb +19 -0
  193. data/packages/igniter-app/lib/igniter/ignite/stores/file_store.rb +112 -0
  194. data/packages/igniter-app/lib/igniter/ignite/trail.rb +215 -0
  195. data/packages/igniter-app/lib/igniter/ignite.rb +11 -0
  196. data/packages/igniter-app/lib/igniter-app.rb +5 -0
  197. data/packages/igniter-cluster/README.md +9 -0
  198. data/packages/igniter-cluster/lib/igniter/cluster/agent_route_resolver.rb +58 -0
  199. data/packages/igniter-cluster/lib/igniter/cluster/consensus/cluster.rb +187 -0
  200. data/packages/igniter-cluster/lib/igniter/cluster/consensus/errors.rb +16 -0
  201. data/packages/igniter-cluster/lib/igniter/cluster/consensus/executors.rb +45 -0
  202. data/packages/igniter-cluster/lib/igniter/cluster/consensus/node.rb +322 -0
  203. data/packages/igniter-cluster/lib/igniter/cluster/consensus/read_query.rb +32 -0
  204. data/packages/igniter-cluster/lib/igniter/cluster/consensus/state_machine.rb +60 -0
  205. data/packages/igniter-cluster/lib/igniter/cluster/consensus.rb +18 -0
  206. data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/governance_contributor.rb +90 -0
  207. data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/identity_contributor.rb +98 -0
  208. data/packages/igniter-cluster/lib/igniter/cluster/diagnostics/routing_contributor.rb +674 -0
  209. data/packages/igniter-cluster/lib/igniter/cluster/diagnostics.rb +24 -0
  210. data/packages/igniter-cluster/lib/igniter/cluster/events/envelope.rb +136 -0
  211. data/packages/igniter-cluster/lib/igniter/cluster/events/hook_support.rb +33 -0
  212. data/packages/igniter-cluster/lib/igniter/cluster/events/log.rb +102 -0
  213. data/packages/igniter-cluster/lib/igniter/cluster/events/projection_feed.rb +98 -0
  214. data/packages/igniter-cluster/lib/igniter/cluster/events/read_model_projector.rb +32 -0
  215. data/packages/igniter-cluster/lib/igniter/cluster/events.rb +131 -0
  216. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_decision.rb +41 -0
  217. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_policy.rb +66 -0
  218. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_queue.rb +88 -0
  219. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_request.rb +62 -0
  220. data/packages/igniter-cluster/lib/igniter/cluster/governance/admission_workflow.rb +214 -0
  221. data/packages/igniter-cluster/lib/igniter/cluster/governance/checkpoint.rb +141 -0
  222. data/packages/igniter-cluster/lib/igniter/cluster/governance/compaction_record.rb +33 -0
  223. data/packages/igniter-cluster/lib/igniter/cluster/governance/stores/checkpoint_store.rb +89 -0
  224. data/packages/igniter-cluster/lib/igniter/cluster/governance/stores/file_store.rb +249 -0
  225. data/packages/igniter-cluster/lib/igniter/cluster/governance/trail.rb +164 -0
  226. data/packages/igniter-cluster/lib/igniter/cluster/governance.rb +12 -0
  227. data/packages/igniter-cluster/lib/igniter/cluster/identity/capability_attestation.rb +114 -0
  228. data/packages/igniter-cluster/lib/igniter/cluster/identity/manifest.rb +139 -0
  229. data/packages/igniter-cluster/lib/igniter/cluster/identity/node_identity.rb +106 -0
  230. data/packages/igniter-cluster/lib/igniter/cluster/identity.rb +5 -0
  231. data/packages/igniter-cluster/lib/igniter/cluster/mesh/announcer.rb +88 -0
  232. data/packages/igniter-cluster/lib/igniter/cluster/mesh/checkpoint_gossip.rb +60 -0
  233. data/packages/igniter-cluster/lib/igniter/cluster/mesh/config.rb +146 -0
  234. data/packages/igniter-cluster/lib/igniter/cluster/mesh/discovery.rb +44 -0
  235. data/packages/igniter-cluster/lib/igniter/cluster/mesh/errors.rb +36 -0
  236. data/packages/igniter-cluster/lib/igniter/cluster/mesh/gossip.rb +62 -0
  237. data/packages/igniter-cluster/lib/igniter/cluster/mesh/mesh_ql.rb +470 -0
  238. data/packages/igniter-cluster/lib/igniter/cluster/mesh/node_observation.rb +281 -0
  239. data/packages/igniter-cluster/lib/igniter/cluster/mesh/observation_query.rb +284 -0
  240. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer.rb +51 -0
  241. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_capacity_report.rb +42 -0
  242. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_identity_envelope.rb +158 -0
  243. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_metadata.rb +122 -0
  244. data/packages/igniter-cluster/lib/igniter/cluster/mesh/peer_registry.rb +81 -0
  245. data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_decision.rb +64 -0
  246. data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_planner.rb +154 -0
  247. data/packages/igniter-cluster/lib/igniter/cluster/mesh/placement_policy.rb +103 -0
  248. data/packages/igniter-cluster/lib/igniter/cluster/mesh/poller.rb +92 -0
  249. data/packages/igniter-cluster/lib/igniter/cluster/mesh/rebalance_plan.rb +66 -0
  250. data/packages/igniter-cluster/lib/igniter/cluster/mesh/rebalance_planner.rb +153 -0
  251. data/packages/igniter-cluster/lib/igniter/cluster/mesh/repair_loop.rb +169 -0
  252. data/packages/igniter-cluster/lib/igniter/cluster/mesh/router.rb +306 -0
  253. data/packages/igniter-cluster/lib/igniter/cluster/mesh/workload_signal.rb +46 -0
  254. data/packages/igniter-cluster/lib/igniter/cluster/mesh/workload_tracker.rb +215 -0
  255. data/packages/igniter-cluster/lib/igniter/cluster/mesh.rb +452 -0
  256. data/packages/igniter-cluster/lib/igniter/cluster/ownership/claim.rb +69 -0
  257. data/packages/igniter-cluster/lib/igniter/cluster/ownership/errors.rb +19 -0
  258. data/packages/igniter-cluster/lib/igniter/cluster/ownership/owner_client.rb +76 -0
  259. data/packages/igniter-cluster/lib/igniter/cluster/ownership/registry.rb +98 -0
  260. data/packages/igniter-cluster/lib/igniter/cluster/ownership/resolver.rb +62 -0
  261. data/packages/igniter-cluster/lib/igniter/cluster/ownership.rb +81 -0
  262. data/packages/igniter-cluster/lib/igniter/cluster/projection_store.rb +62 -0
  263. data/packages/igniter-cluster/lib/igniter/cluster/rag/chunk.rb +49 -0
  264. data/packages/igniter-cluster/lib/igniter/cluster/rag/fanout_retriever.rb +93 -0
  265. data/packages/igniter-cluster/lib/igniter/cluster/rag/knowledge_shard.rb +140 -0
  266. data/packages/igniter-cluster/lib/igniter/cluster/rag/net_http_adapter.rb +85 -0
  267. data/packages/igniter-cluster/lib/igniter/cluster/rag/ranker.rb +46 -0
  268. data/packages/igniter-cluster/lib/igniter/cluster/rag/retrieval_query.rb +30 -0
  269. data/packages/igniter-cluster/lib/igniter/cluster/rag/retrieval_result.rb +77 -0
  270. data/packages/igniter-cluster/lib/igniter/cluster/rag.rb +38 -0
  271. data/packages/igniter-cluster/lib/igniter/cluster/remote_adapter.rb +101 -0
  272. data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrapper.rb +63 -0
  273. data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrappers/gem.rb +39 -0
  274. data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrappers/git.rb +46 -0
  275. data/packages/igniter-cluster/lib/igniter/cluster/replication/bootstrappers/tarball.rb +62 -0
  276. data/packages/igniter-cluster/lib/igniter/cluster/replication/capability_query.rb +675 -0
  277. data/packages/igniter-cluster/lib/igniter/cluster/replication/expansion_plan.rb +40 -0
  278. data/packages/igniter-cluster/lib/igniter/cluster/replication/expansion_planner.rb +154 -0
  279. data/packages/igniter-cluster/lib/igniter/cluster/replication/manifest.rb +47 -0
  280. data/packages/igniter-cluster/lib/igniter/cluster/replication/network_topology.rb +150 -0
  281. data/packages/igniter-cluster/lib/igniter/cluster/replication/node_profile.rb +134 -0
  282. data/packages/igniter-cluster/lib/igniter/cluster/replication/reflective_replication_agent.rb +259 -0
  283. data/packages/igniter-cluster/lib/igniter/cluster/replication/replication_agent.rb +89 -0
  284. data/packages/igniter-cluster/lib/igniter/cluster/replication/ssh_session.rb +79 -0
  285. data/packages/igniter-cluster/lib/igniter/cluster/replication.rb +38 -0
  286. data/packages/igniter-cluster/lib/igniter/cluster/routed_agent_adapter.rb +79 -0
  287. data/packages/igniter-cluster/lib/igniter/cluster/routing_plan_executor.rb +427 -0
  288. data/packages/igniter-cluster/lib/igniter/cluster/routing_plan_result.rb +38 -0
  289. data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_plan.rb +34 -0
  290. data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_planner.rb +76 -0
  291. data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_result.rb +34 -0
  292. data/packages/igniter-cluster/lib/igniter/cluster/trust/admission_runner.rb +125 -0
  293. data/packages/igniter-cluster/lib/igniter/cluster/trust/trust_assessment.rb +37 -0
  294. data/packages/igniter-cluster/lib/igniter/cluster/trust/trust_store.rb +58 -0
  295. data/packages/igniter-cluster/lib/igniter/cluster/trust/verifier.rb +80 -0
  296. data/packages/igniter-cluster/lib/igniter/cluster/trust.rb +9 -0
  297. data/packages/igniter-cluster/lib/igniter/cluster.rb +71 -0
  298. data/packages/igniter-cluster/lib/igniter-cluster.rb +3 -0
  299. data/packages/igniter-core/README.md +21 -0
  300. data/packages/igniter-core/lib/igniter/core/capabilities.rb +70 -0
  301. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/compiled_graph.rb +40 -2
  302. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validation_pipeline.rb +1 -0
  303. data/packages/igniter-core/lib/igniter/core/compiler/validators/agent_validator.rb +142 -0
  304. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/dependencies_validator.rb +90 -3
  305. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/remote_validator.rb +2 -0
  306. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler.rb +1 -0
  307. data/packages/igniter-core/lib/igniter/core/content_addressing.rb +133 -0
  308. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/contract.rb +88 -6
  309. data/packages/igniter-core/lib/igniter/core/dataflow/aggregate_operators.rb +147 -0
  310. data/packages/igniter-core/lib/igniter/core/dataflow/aggregate_state.rb +77 -0
  311. data/packages/igniter-core/lib/igniter/core/dataflow/diff.rb +37 -0
  312. data/packages/igniter-core/lib/igniter/core/dataflow/diff_state.rb +81 -0
  313. data/packages/igniter-core/lib/igniter/core/dataflow/incremental_collection_result.rb +39 -0
  314. data/packages/igniter-core/lib/igniter/core/dataflow/window_filter.rb +48 -0
  315. data/packages/igniter-core/lib/igniter/core/dataflow.rb +65 -0
  316. data/packages/igniter-core/lib/igniter/core/diagnostics/agent_contributor.rb +241 -0
  317. data/packages/igniter-core/lib/igniter/core/diagnostics/capability_contributor.rb +162 -0
  318. data/packages/igniter-core/lib/igniter/core/diagnostics/orchestration_contributor.rb +75 -0
  319. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/report.rb +81 -6
  320. data/packages/igniter-core/lib/igniter/core/diagnostics.rb +58 -0
  321. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dsl/contract_builder.rb +230 -9
  322. data/packages/igniter-core/lib/igniter/core/dto/record.rb +189 -0
  323. data/packages/igniter-core/lib/igniter/core/dto.rb +8 -0
  324. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/effect.rb +4 -0
  325. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/errors.rb +26 -3
  326. data/packages/igniter-core/lib/igniter/core/executor.rb +134 -0
  327. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/introspection/graph_formatter.rb +32 -1
  328. data/packages/igniter-core/lib/igniter/core/extensions/introspection/plan_formatter.rb +85 -0
  329. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/introspection/runtime_formatter.rb +26 -0
  330. data/packages/igniter-core/lib/igniter/core/extensions/invariants.rb +70 -0
  331. data/packages/igniter-core/lib/igniter/core/fingerprint.rb +43 -0
  332. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental.rb +4 -4
  333. data/packages/igniter-core/lib/igniter/core/memory/agent_memory.rb +104 -0
  334. data/packages/igniter-core/lib/igniter/core/memory/episode.rb +29 -0
  335. data/packages/igniter-core/lib/igniter/core/memory/fact.rb +27 -0
  336. data/packages/igniter-core/lib/igniter/core/memory/memorable.rb +90 -0
  337. data/packages/igniter-core/lib/igniter/core/memory/reflection_cycle.rb +96 -0
  338. data/packages/igniter-core/lib/igniter/core/memory/reflection_record.rb +28 -0
  339. data/packages/igniter-core/lib/igniter/core/memory/store.rb +115 -0
  340. data/packages/igniter-core/lib/igniter/core/memory/stores/in_memory.rb +136 -0
  341. data/packages/igniter-core/lib/igniter/core/memory/stores/sqlite.rb +286 -0
  342. data/packages/igniter-core/lib/igniter/core/memory.rb +80 -0
  343. data/packages/igniter-core/lib/igniter/core/metrics/collector.rb +131 -0
  344. data/packages/igniter-core/lib/igniter/core/metrics/prometheus_exporter.rb +104 -0
  345. data/packages/igniter-core/lib/igniter/core/metrics/snapshot.rb +8 -0
  346. data/packages/igniter-core/lib/igniter/core/metrics.rb +37 -0
  347. data/packages/igniter-core/lib/igniter/core/model/agent_interaction_contract.rb +172 -0
  348. data/packages/igniter-core/lib/igniter/core/model/agent_node.rb +86 -0
  349. data/packages/igniter-core/lib/igniter/core/model/aggregate_node.rb +34 -0
  350. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/branch_node.rb +37 -1
  351. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/collection_node.rb +3 -2
  352. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/compute_node.rb +13 -0
  353. data/packages/igniter-core/lib/igniter/core/model/remote_node.rb +91 -0
  354. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model.rb +2 -0
  355. data/packages/igniter-core/lib/igniter/core/node_cache.rb +231 -0
  356. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing.rb +8 -8
  357. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/builder.rb +30 -1
  358. data/packages/igniter-core/lib/igniter/core/runtime/agent_adapter.rb +41 -0
  359. data/packages/igniter-core/lib/igniter/core/runtime/agent_result_contract.rb +91 -0
  360. data/packages/igniter-core/lib/igniter/core/runtime/agent_route.rb +60 -0
  361. data/packages/igniter-core/lib/igniter/core/runtime/agent_route_resolver.rb +26 -0
  362. data/packages/igniter-core/lib/igniter/core/runtime/agent_session.rb +922 -0
  363. data/packages/igniter-core/lib/igniter/core/runtime/agent_session_query.rb +379 -0
  364. data/packages/igniter-core/lib/igniter/core/runtime/agent_transport.rb +30 -0
  365. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/cache.rb +6 -3
  366. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/deferred_result.rb +27 -1
  367. data/packages/igniter-core/lib/igniter/core/runtime/execution.rb +913 -0
  368. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/input_validator.rb +6 -2
  369. data/packages/igniter-core/lib/igniter/core/runtime/job_worker.rb +39 -0
  370. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/node_state.rb +4 -2
  371. data/packages/igniter-core/lib/igniter/core/runtime/orchestration_overview.rb +213 -0
  372. data/packages/igniter-core/lib/igniter/core/runtime/orchestration_runtime_state.rb +176 -0
  373. data/packages/igniter-core/lib/igniter/core/runtime/orchestration_transition_query.rb +208 -0
  374. data/packages/igniter-core/lib/igniter/core/runtime/planner.rb +301 -0
  375. data/packages/igniter-core/lib/igniter/core/runtime/proxy_agent_adapter.rb +124 -0
  376. data/packages/igniter-core/lib/igniter/core/runtime/remote_adapter.rb +26 -0
  377. data/packages/igniter-core/lib/igniter/core/runtime/resolver.rb +951 -0
  378. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/result.rb +2 -0
  379. data/packages/igniter-core/lib/igniter/core/runtime/stores/redis_store.rb +93 -0
  380. data/packages/igniter-core/lib/igniter/core/runtime/stores/sqlite_store.rb +155 -0
  381. data/packages/igniter-core/lib/igniter/core/runtime/stream_result.rb +171 -0
  382. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime.rb +15 -0
  383. data/packages/igniter-core/lib/igniter/core/temporal.rb +84 -0
  384. data/packages/igniter-core/lib/igniter/core/tool/discoverable.rb +151 -0
  385. data/packages/igniter-core/lib/igniter/core/tool.rb +56 -0
  386. data/{lib/igniter → packages/igniter-core/lib/igniter/core}/version.rb +1 -1
  387. data/packages/igniter-core/lib/igniter/core.rb +23 -0
  388. data/packages/igniter-core/lib/igniter-core.rb +3 -0
  389. data/packages/igniter-extensions/README.md +21 -0
  390. data/packages/igniter-extensions/lib/igniter/extensions/auditing.rb +3 -0
  391. data/packages/igniter-extensions/lib/igniter/extensions/capabilities.rb +39 -0
  392. data/packages/igniter-extensions/lib/igniter/extensions/content_addressing.rb +5 -0
  393. data/packages/igniter-extensions/lib/igniter/extensions/dataflow.rb +117 -0
  394. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/differential.rb +1 -1
  395. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/execution_report.rb +1 -1
  396. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/incremental.rb +1 -1
  397. data/packages/igniter-extensions/lib/igniter/extensions/introspection.rb +3 -0
  398. data/packages/igniter-extensions/lib/igniter/extensions/invariants.rb +3 -0
  399. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/provenance.rb +1 -1
  400. data/packages/igniter-extensions/lib/igniter/extensions/reactive.rb +3 -0
  401. data/{lib → packages/igniter-extensions/lib}/igniter/extensions/saga.rb +1 -1
  402. data/packages/igniter-extensions/lib/igniter/extensions.rb +8 -0
  403. data/packages/igniter-extensions/lib/igniter-extensions.rb +3 -0
  404. data/packages/igniter-frontend/README.md +224 -0
  405. data/packages/igniter-frontend/lib/igniter/frontend/app.rb +90 -0
  406. data/packages/igniter-frontend/lib/igniter/frontend/app_access.rb +36 -0
  407. data/packages/igniter-frontend/lib/igniter/frontend/arbre/component.rb +120 -0
  408. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/action_group.rb +53 -0
  409. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/badge.rb +91 -0
  410. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/boolean.rb +53 -0
  411. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/breadcrumbs.rb +71 -0
  412. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/card.rb +114 -0
  413. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/conversation_panel.rb +61 -0
  414. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/datetime.rb +42 -0
  415. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/display_value_support.rb +38 -0
  416. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/empty_state.rb +39 -0
  417. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/event_list.rb +44 -0
  418. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/filters.rb +183 -0
  419. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/indicator.rb +59 -0
  420. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/json_panel.rb +36 -0
  421. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/key_value_list.rb +40 -0
  422. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/loading_state.rb +43 -0
  423. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/metric_grid.rb +37 -0
  424. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/number.rb +53 -0
  425. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/page_header.rb +53 -0
  426. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/pagination.rb +143 -0
  427. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/panel.rb +67 -0
  428. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/percentage.rb +79 -0
  429. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/resource_list.rb +38 -0
  430. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/scenario_card.rb +48 -0
  431. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/shell_columns.rb +67 -0
  432. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/sidebar_shell.rb +106 -0
  433. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/table_with.rb +203 -0
  434. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/tabs.rb +147 -0
  435. data/packages/igniter-frontend/lib/igniter/frontend/arbre/components/viz.rb +185 -0
  436. data/packages/igniter-frontend/lib/igniter/frontend/arbre/page.rb +74 -0
  437. data/packages/igniter-frontend/lib/igniter/frontend/arbre/raw_text_node.rb +40 -0
  438. data/packages/igniter-frontend/lib/igniter/frontend/arbre/template_page.rb +243 -0
  439. data/packages/igniter-frontend/lib/igniter/frontend/arbre.rb +48 -0
  440. data/packages/igniter-frontend/lib/igniter/frontend/arbre_page.rb +7 -0
  441. data/packages/igniter-frontend/lib/igniter/frontend/assets.rb +101 -0
  442. data/packages/igniter-frontend/lib/igniter/frontend/builder.rb +124 -0
  443. data/packages/igniter-frontend/lib/igniter/frontend/component.rb +24 -0
  444. data/packages/igniter-frontend/lib/igniter/frontend/components.rb +7 -0
  445. data/packages/igniter-frontend/lib/igniter/frontend/context.rb +53 -0
  446. data/packages/igniter-frontend/lib/igniter/frontend/form_builder.rb +63 -0
  447. data/packages/igniter-frontend/lib/igniter/frontend/handler.rb +92 -0
  448. data/packages/igniter-frontend/lib/igniter/frontend/javascript.rb +353 -0
  449. data/packages/igniter-frontend/lib/igniter/frontend/page.rb +24 -0
  450. data/packages/igniter-frontend/lib/igniter/frontend/request.rb +61 -0
  451. data/packages/igniter-frontend/lib/igniter/frontend/response.rb +67 -0
  452. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime/adapters.rb +226 -0
  453. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime/presets.rb +147 -0
  454. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/realtime.rb +259 -0
  455. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/surfaces.rb +1074 -0
  456. data/packages/igniter-frontend/lib/igniter/frontend/tailwind/ui.rb +1438 -0
  457. data/packages/igniter-frontend/lib/igniter/frontend/tailwind.rb +180 -0
  458. data/packages/igniter-frontend/lib/igniter/frontend/version.rb +9 -0
  459. data/packages/igniter-frontend/lib/igniter/frontend.rb +35 -0
  460. data/packages/igniter-frontend/lib/igniter-frontend.rb +3 -0
  461. data/packages/igniter-rails/README.md +96 -0
  462. data/packages/igniter-rails/lib/igniter/plugins/rails/generators/contract/templates/contract.rb.tt +22 -0
  463. data/packages/igniter-rails/lib/igniter/plugins/rails/generators/install/templates/igniter.rb.tt +16 -0
  464. data/packages/igniter-rails/lib/igniter-rails.rb +3 -0
  465. data/packages/igniter-schema-rendering/README.md +27 -0
  466. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/page.rb +35 -0
  467. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/patcher.rb +47 -0
  468. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/renderer.rb +268 -0
  469. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/schema.rb +172 -0
  470. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/store.rb +53 -0
  471. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_normalizer.rb +117 -0
  472. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_processor.rb +91 -0
  473. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/submission_validator.rb +62 -0
  474. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering/version.rb +9 -0
  475. data/packages/igniter-schema-rendering/lib/igniter/schema_rendering.rb +20 -0
  476. data/packages/igniter-schema-rendering/lib/igniter-schema-rendering.rb +3 -0
  477. data/packages/igniter-sdk/README.md +25 -0
  478. data/packages/igniter-sdk/lib/igniter/sdk/channels/base.rb +84 -0
  479. data/packages/igniter-sdk/lib/igniter/sdk/channels/delivery_result.rb +61 -0
  480. data/packages/igniter-sdk/lib/igniter/sdk/channels/message.rb +101 -0
  481. data/packages/igniter-sdk/lib/igniter/sdk/channels/telegram.rb +161 -0
  482. data/packages/igniter-sdk/lib/igniter/sdk/channels/webhook.rb +213 -0
  483. data/packages/igniter-sdk/lib/igniter/sdk/channels.rb +17 -0
  484. data/packages/igniter-sdk/lib/igniter/sdk/data/store.rb +31 -0
  485. data/packages/igniter-sdk/lib/igniter/sdk/data/stores/file.rb +113 -0
  486. data/packages/igniter-sdk/lib/igniter/sdk/data/stores/in_memory.rb +63 -0
  487. data/packages/igniter-sdk/lib/igniter/sdk/data/stores/sqlite.rb +144 -0
  488. data/packages/igniter-sdk/lib/igniter/sdk/data.rb +34 -0
  489. data/packages/igniter-sdk/lib/igniter/sdk/tools/agent_bootstrap_tool.rb +151 -0
  490. data/packages/igniter-sdk/lib/igniter/sdk/tools/local_workflow_selector_tool.rb +269 -0
  491. data/packages/igniter-sdk/lib/igniter/sdk/tools/system_discovery_tool.rb +198 -0
  492. data/packages/igniter-sdk/lib/igniter/sdk/tools.rb +9 -0
  493. data/packages/igniter-sdk/lib/igniter/sdk.rb +86 -0
  494. data/packages/igniter-sdk/lib/igniter-sdk.rb +3 -0
  495. data/packages/igniter-server/README.md +9 -0
  496. data/packages/igniter-server/lib/igniter/server/agent_session_store.rb +98 -0
  497. data/packages/igniter-server/lib/igniter/server/agent_transport.rb +95 -0
  498. data/packages/igniter-server/lib/igniter/server/app_host.rb +3 -0
  499. data/packages/igniter-server/lib/igniter/server/client.rb +256 -0
  500. data/packages/igniter-server/lib/igniter/server/config.rb +70 -0
  501. data/packages/igniter-server/lib/igniter/server/handlers/agent_message_handler.rb +107 -0
  502. data/packages/igniter-server/lib/igniter/server/handlers/agent_session_handler.rb +125 -0
  503. data/{lib → packages/igniter-server/lib}/igniter/server/handlers/event_handler.rb +4 -0
  504. data/{lib → packages/igniter-server/lib}/igniter/server/handlers/execute_handler.rb +6 -0
  505. data/packages/igniter-server/lib/igniter/server/handlers/liveness_handler.rb +20 -0
  506. data/packages/igniter-server/lib/igniter/server/handlers/manifest_handler.rb +77 -0
  507. data/packages/igniter-server/lib/igniter/server/handlers/metrics_handler.rb +51 -0
  508. data/packages/igniter-server/lib/igniter/server/handlers/peers_handler.rb +136 -0
  509. data/packages/igniter-server/lib/igniter/server/handlers/readiness_handler.rb +47 -0
  510. data/packages/igniter-server/lib/igniter/server/http_server.rb +222 -0
  511. data/{lib → packages/igniter-server/lib}/igniter/server/rack_app.rb +27 -2
  512. data/packages/igniter-server/lib/igniter/server/remote_adapter.rb +27 -0
  513. data/packages/igniter-server/lib/igniter/server/router.rb +291 -0
  514. data/packages/igniter-server/lib/igniter/server/server_logger.rb +54 -0
  515. data/packages/igniter-server/lib/igniter/server.rb +130 -0
  516. data/packages/igniter-server/lib/igniter-server.rb +3 -0
  517. metadata +638 -168
  518. data/docs/API_V2.md +0 -537
  519. data/docs/ARCHITECTURE_V2.md +0 -317
  520. data/docs/BACKLOG.md +0 -166
  521. data/docs/BRANCHES_V1.md +0 -213
  522. data/docs/COLLECTIONS_V1.md +0 -303
  523. data/docs/DISTRIBUTED_CONTRACTS_V1.md +0 -493
  524. data/docs/EXECUTION_MODEL_V2.md +0 -324
  525. data/docs/IGNITER_CONCEPTS.md +0 -81
  526. data/docs/LLM_V1.md +0 -335
  527. data/docs/PATTERNS.md +0 -411
  528. data/docs/SERVER_V1.md +0 -313
  529. data/docs/STORE_ADAPTERS.md +0 -126
  530. data/lib/igniter/diagnostics.rb +0 -8
  531. data/lib/igniter/executor.rb +0 -74
  532. data/lib/igniter/extensions/introspection/plan_formatter.rb +0 -55
  533. data/lib/igniter/extensions/invariants.rb +0 -116
  534. data/lib/igniter/integrations/agents.rb +0 -18
  535. data/lib/igniter/integrations/llm/config.rb +0 -69
  536. data/lib/igniter/integrations/llm/executor.rb +0 -159
  537. data/lib/igniter/integrations/llm.rb +0 -59
  538. data/lib/igniter/model/remote_node.rb +0 -26
  539. data/lib/igniter/runtime/execution.rb +0 -398
  540. data/lib/igniter/runtime/job_worker.rb +0 -18
  541. data/lib/igniter/runtime/planner.rb +0 -126
  542. data/lib/igniter/runtime/resolver.rb +0 -520
  543. data/lib/igniter/runtime/stores/redis_store.rb +0 -56
  544. data/lib/igniter/server/client.rb +0 -123
  545. data/lib/igniter/server/config.rb +0 -27
  546. data/lib/igniter/server/http_server.rb +0 -109
  547. data/lib/igniter/server/router.rb +0 -75
  548. data/lib/igniter/server.rb +0 -67
  549. /data/{lib → packages/igniter-agents/lib}/igniter/agent/mailbox.rb +0 -0
  550. /data/{lib → packages/igniter-agents/lib}/igniter/agent/message.rb +0 -0
  551. /data/{lib → packages/igniter-agents/lib}/igniter/agent/state_holder.rb +0 -0
  552. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/graph_compiler.rb +0 -0
  553. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/type_resolver.rb +0 -0
  554. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validation_context.rb +0 -0
  555. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validator.rb +0 -0
  556. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/await_validator.rb +0 -0
  557. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/callable_validator.rb +0 -0
  558. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/outputs_validator.rb +0 -0
  559. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/type_compatibility_validator.rb +0 -0
  560. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/compiler/validators/uniqueness_validator.rb +0 -0
  561. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/auditing/report/console_formatter.rb +0 -0
  562. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/auditing/report/markdown_formatter.rb +0 -0
  563. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/introspection/formatters/mermaid_formatter.rb +0 -0
  564. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/diagnostics/introspection/formatters/text_tree_formatter.rb +0 -0
  565. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/divergence.rb +0 -0
  566. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/formatter.rb +0 -0
  567. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/report.rb +0 -0
  568. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential/runner.rb +0 -0
  569. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/differential.rb +0 -0
  570. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dsl/schema_builder.rb +0 -0
  571. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/dsl.rb +0 -0
  572. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/effect_registry.rb +0 -0
  573. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/events/bus.rb +0 -0
  574. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/events/event.rb +0 -0
  575. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/events.rb +0 -0
  576. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/builder.rb +0 -0
  577. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/formatter.rb +0 -0
  578. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/node_entry.rb +0 -0
  579. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report/report.rb +0 -0
  580. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/execution_report.rb +0 -0
  581. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/executor_registry.rb +0 -0
  582. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/auditing/timeline.rb +0 -0
  583. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/auditing.rb +0 -0
  584. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/introspection.rb +0 -0
  585. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive/engine.rb +0 -0
  586. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive/matcher.rb +0 -0
  587. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive/reaction.rb +0 -0
  588. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions/reactive.rb +0 -0
  589. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/extensions.rb +0 -0
  590. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental/formatter.rb +0 -0
  591. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental/result.rb +0 -0
  592. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/incremental/tracker.rb +0 -0
  593. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/invariant.rb +0 -0
  594. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/await_node.rb +0 -0
  595. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/composition_node.rb +0 -0
  596. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/effect_node.rb +0 -0
  597. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/graph.rb +0 -0
  598. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/input_node.rb +0 -0
  599. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/node.rb +0 -0
  600. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/model/output_node.rb +0 -0
  601. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/formatter.rb +0 -0
  602. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/generators.rb +0 -0
  603. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/result.rb +0 -0
  604. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/run.rb +0 -0
  605. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/property_testing/runner.rb +0 -0
  606. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/lineage.rb +0 -0
  607. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/node_trace.rb +0 -0
  608. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance/text_formatter.rb +0 -0
  609. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/provenance.rb +0 -0
  610. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/collection_result.rb +0 -0
  611. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/invalidator.rb +0 -0
  612. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runner_factory.rb +0 -0
  613. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runners/inline_runner.rb +0 -0
  614. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runners/store_runner.rb +0 -0
  615. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/runners/thread_pool_runner.rb +0 -0
  616. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/active_record_store.rb +0 -0
  617. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/file_store.rb +0 -0
  618. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/runtime/stores/memory_store.rb +0 -0
  619. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/compensation.rb +0 -0
  620. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/compensation_record.rb +0 -0
  621. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/executor.rb +0 -0
  622. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/formatter.rb +0 -0
  623. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga/result.rb +0 -0
  624. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/saga.rb +0 -0
  625. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/stream_loop.rb +0 -0
  626. /data/{lib/igniter → packages/igniter-core/lib/igniter/core}/type_system.rb +0 -0
  627. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/cable_adapter.rb +0 -0
  628. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/contract_job.rb +0 -0
  629. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/generators/contract/contract_generator.rb +0 -0
  630. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/generators/install/install_generator.rb +0 -0
  631. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/railtie.rb +0 -0
  632. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails/webhook_concern.rb +0 -0
  633. /data/{lib/igniter/integrations → packages/igniter-rails/lib/igniter/plugins}/rails.rb +0 -0
  634. /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/base.rb +0 -0
  635. /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/contracts_handler.rb +0 -0
  636. /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/health_handler.rb +0 -0
  637. /data/{lib → packages/igniter-server/lib}/igniter/server/handlers/status_handler.rb +0 -0
  638. /data/{lib → packages/igniter-server/lib}/igniter/server/registry.rb +0 -0
data/README.md CHANGED
@@ -1,87 +1,41 @@
1
1
  # Igniter
2
2
 
3
- Igniter is a Ruby gem for expressing business logic as a validated dependency graph and executing that graph with:
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`
3
+ Igniter is a Ruby framework for building business logic as validated dependency graphs.
16
4
 
17
- ## Installation
5
+ At the center is a small, strict idea:
18
6
 
19
- ```ruby
20
- gem "igniter"
21
- ```
7
+ - describe dependencies explicitly
8
+ - validate the graph before runtime
9
+ - resolve only what is needed
10
+ - keep the runtime observable
22
11
 
23
- ## Quick Start
12
+ From there, Igniter scales by layers instead of by reinvention:
24
13
 
25
- ```ruby
26
- require "igniter"
14
+ - **Core** for contracts, compilation, execution, diagnostics
15
+ - **App** for a single-node runtime/profile
16
+ - **Cluster** for capability-based distributed execution
17
+ - **SDK** for optional packs such as AI, channels, tools, and data
27
18
 
28
- class PriceContract < Igniter::Contract
29
- define do
30
- input :order_total, type: :numeric
31
- input :country, type: :string
32
- input :vat_rate, type: :numeric, default: 0.2
19
+ This README is an entrypoint, not the full reference. The reference now lives in
20
+ [`docs/`](./docs/README.md), organized into [`guide`](./docs/guide/README.md),
21
+ [`concepts`](./docs/concepts/README.md), [`current`](./docs/current/README.md),
22
+ and [`dev`](./docs/dev/README.md).
33
23
 
34
- compute :effective_vat_rate, depends_on: %i[country vat_rate] do |country:, vat_rate:|
35
- country == "UA" ? vat_rate : 0.0
36
- end
37
-
38
- compute :gross_total, depends_on: %i[order_total effective_vat_rate] do |order_total:, effective_vat_rate:|
39
- order_total * (1 + effective_vat_rate)
40
- end
24
+ ## Why Igniter
41
25
 
42
- output :gross_total
43
- end
44
- end
26
+ Igniter is useful when your domain logic wants more structure than “service objects everywhere” but less ceremony than a full workflow engine.
45
27
 
46
- contract = PriceContract.new(order_total: 100, country: "UA")
47
- contract.result.gross_total # => 120.0
28
+ You define a graph of inputs, computations, branches, collections, compositions, and outputs. Igniter compiles that graph, validates it, and gives you a runtime that is lazy, inspectable, and capable of growing from embedded usage to app hosting and then to a cluster.
48
29
 
49
- contract.update_inputs(order_total: 150)
50
- contract.result.gross_total # => 180.0
51
-
52
- contract.diagnostics_text # compact execution summary
53
- ```
54
-
55
- ## Features
56
-
57
- - **Contracts**: declare inputs, compute nodes, outputs, and compositions in a validated graph.
58
- - **Compiler**: validate dependency graphs, types, and cycles before runtime; errors are surfaced at load time.
59
- - **Runtime**: cache resolved nodes and invalidate only affected downstream nodes on input change.
60
- - **Typed inputs**: validate types, defaults, and required fields at execution boundaries.
61
- - **Composition**: execute nested contracts with isolated child executions.
62
- - **Branch**: declarative routing — select one child contract from ordered cases at runtime.
63
- - **Collection**: declarative fan-out — run one child contract per item in an array.
64
- - **Distributed workflows**: `await` external events; resume via `deliver_event`.
65
- - **igniter-server**: host contracts as a TCP/Rack HTTP service; call remote contracts with the `remote:` DSL.
66
- - **LLM integration**: compute nodes powered by Ollama, Anthropic, or OpenAI providers.
67
- - **Rails integration**: Railtie, ActiveJob base class, ActionCable adapter, webhook controller mixin.
68
- - **Auditing**: collect execution timelines and snapshots.
69
- - **Diagnostics**: compact text, Markdown, or structured reports for triage.
70
- - **Reactive**: subscribe declaratively to runtime events with `effect`, `on_success`, `on_failure`.
71
- - **Introspection**: render graphs as text or Mermaid; inspect runtime state.
72
-
73
- ## Quick Start Recipes
74
-
75
- Runnable examples live in [`examples/`](examples) and are smoke-tested by `spec/igniter/example_scripts_spec.rb`.
76
- See [`examples/README.md`](examples/README.md) for a quick index and [`docs/PATTERNS.md`](docs/PATTERNS.md) for composable patterns.
77
-
78
- ### 1. Basic Pricing Contract
30
+ ## A Tiny Example
79
31
 
80
32
  ```ruby
33
+ require "igniter"
34
+
81
35
  class PriceContract < Igniter::Contract
82
36
  define do
83
37
  input :order_total, type: :numeric
84
- input :country, type: :string
38
+ input :country, type: :string
85
39
 
86
40
  compute :vat_rate, depends_on: [:country] do |country:|
87
41
  country == "UA" ? 0.2 : 0.0
@@ -95,413 +49,214 @@ class PriceContract < Igniter::Contract
95
49
  end
96
50
  end
97
51
 
98
- PriceContract.new(order_total: 100, country: "UA").result.gross_total
99
- # => 120.0
100
- ```
101
-
102
- ### 2. Nested Composition
103
-
104
- ```ruby
105
- class CheckoutContract < Igniter::Contract
106
- define do
107
- input :order_total, type: :numeric
108
- input :country, type: :string
109
-
110
- compose :pricing, contract: PriceContract, inputs: {
111
- order_total: :order_total,
112
- country: :country
113
- }
114
-
115
- output :pricing
116
- end
117
- end
118
-
119
- CheckoutContract.new(order_total: 100, country: "UA").result.pricing.gross_total
120
- # => 120.0
121
- ```
122
-
123
- ### 3. Diagnostics and Introspection
124
-
125
- ```ruby
126
52
  contract = PriceContract.new(order_total: 100, country: "UA")
127
53
  contract.result.gross_total
54
+ # => 120.0
55
+ ```
128
56
 
129
- contract.result.states
130
- contract.result.explain(:gross_total)
131
- contract.diagnostics.to_h
132
- contract.diagnostics_text
133
- contract.diagnostics_markdown
134
- contract.audit_snapshot
57
+ ## One Real Example
135
58
 
136
- PriceContract.graph.to_text
137
- PriceContract.graph.to_mermaid
138
- ```
59
+ Imagine a post-call analysis pipeline for a call center.
139
60
 
140
- ### 4. Machine-Readable Data
61
+ The business task is simple to describe:
141
62
 
142
- ```ruby
143
- contract.result.to_h # => { gross_total: 120.0 }
144
- contract.result.as_json
145
- contract.execution.as_json
146
- contract.events.map(&:as_json)
147
- ```
63
+ - take a recording
64
+ - transcribe it
65
+ - extract structured facts
66
+ - score the call
67
+ - prepare CRM updates and supervisor follow-up
148
68
 
149
- ### 5. Async Store and Resume
69
+ In Igniter, that stays one explicit graph:
150
70
 
151
71
  ```ruby
152
- class AsyncQuoteExecutor < Igniter::Executor
153
- def call(order_total:)
154
- defer(token: "quote-#{order_total}", payload: { kind: "pricing_quote" })
155
- end
156
- end
157
-
158
- class AsyncPricingContract < Igniter::Contract
159
- run_with runner: :store
72
+ require "igniter/cluster"
160
73
 
74
+ class PostCallAnalysisContract < Igniter::Contract
161
75
  define do
162
- input :order_total, type: :numeric
163
- compute :quote_total, depends_on: [:order_total], call: AsyncQuoteExecutor
164
- compute :gross_total, depends_on: [:quote_total] do |quote_total:|
165
- quote_total * 1.2
76
+ input :call_id, type: :string
77
+ input :audio_url, type: :string
78
+ input :recorded_at, type: :string
79
+
80
+ remote :transcript,
81
+ contract: "TranscribeCall",
82
+ query: { all_of: [:audio_transcription], tags: [:gpu] },
83
+ inputs: { audio_url: :audio_url }
84
+
85
+ remote :analysis,
86
+ contract: "AnalyzeCall",
87
+ query: { all_of: [:llm_inference] },
88
+ inputs: {
89
+ call_id: :call_id,
90
+ transcript: :transcript,
91
+ recorded_at: :recorded_at
92
+ }
93
+
94
+ compute :crm_patch, depends_on: [:analysis] do |analysis:|
95
+ {
96
+ disposition: analysis[:disposition],
97
+ sentiment: analysis[:sentiment],
98
+ next_action: analysis[:next_action],
99
+ escalation_required: analysis[:escalation_required]
100
+ }
166
101
  end
167
- output :gross_total
102
+
103
+ output :analysis
104
+ output :crm_patch
168
105
  end
169
106
  end
170
-
171
- contract = AsyncPricingContract.new(order_total: 100)
172
- deferred = contract.result.gross_total
173
- execution_id = contract.execution.events.execution_id
174
-
175
- resumed = AsyncPricingContract.resume_from_store(
176
- execution_id, token: deferred.token, value: 150
177
- )
178
- resumed.result.gross_total # => 180.0
179
107
  ```
180
108
 
181
- ### 6. Ergonomic DSL
109
+ Why this is interesting:
182
110
 
183
- ```ruby
184
- class MarketingQuoteContract < Igniter::Contract
185
- define do
186
- input :service, type: :string
187
- input :zip_code, type: :string
111
+ - the domain flow is still one contract, not a pile of queue handlers
112
+ - transcription and analysis can land on different nodes with different capabilities
113
+ - the cluster routes by capabilities, not by hard-coded machine roles
114
+ - if one matching node disappears, the network can select another suitable peer without changing the contract
188
115
 
189
- const :vendor_id, "eLocal"
116
+ That is the general Igniter idea: keep the business graph stable, let the runtime grow from local execution to a capability-driven cluster.
190
117
 
191
- scope :routing do
192
- map :trade_name, from: :service do |service:|
193
- %w[heating cooling ventilation].include?(service.downcase) ? "HVAC" : service
194
- end
195
- end
118
+ ## The Levels
196
119
 
197
- scope :pricing do
198
- lookup :trade, with: :trade_name do |trade_name:|
199
- { name: trade_name, base_bid: 45.0 }
200
- end
201
- end
120
+ ### 1. Core
202
121
 
203
- namespace :validation do
204
- guard :zip_supported, with: :zip_code, in: %w[60601 10001], message: "Unsupported zip"
205
- end
122
+ Start here if you want the kernel:
206
123
 
207
- compute :quote, with: %i[vendor_id trade zip_code zip_supported] do |vendor_id:, trade:, zip_code:, zip_supported:|
208
- zip_supported
209
- { vendor_id: vendor_id, trade: trade[:name], zip_code: zip_code, bid: trade[:base_bid] }
210
- end
124
+ - contract DSL
125
+ - compiler and graph validation
126
+ - lazy runtime and invalidation
127
+ - diagnostics, events, introspection
211
128
 
212
- expose :quote, as: :response
213
- end
129
+ Read:
214
130
 
215
- on_success :response do |value:, **|
216
- puts "Persist #{value.inspect}"
217
- end
218
- end
219
- ```
131
+ - [`docs/guide/core.md`](./docs/guide/core.md)
220
132
 
221
- Matcher-style guard shortcuts:
133
+ ### 2. App
222
134
 
223
- ```ruby
224
- guard :usa_only, with: :country_code, eq: "USA", message: "Unsupported country"
225
- guard :supported_country, with: :country_code, in: %w[USA CAN], message: "Unsupported country"
226
- guard :valid_zip, with: :zip_code, matches: /\A\d{5}\z/, message: "Invalid zip"
227
- ```
228
-
229
- ### 7. Declarative Branching
230
-
231
- ```ruby
232
- class DeliveryContract < Igniter::Contract
233
- define do
234
- input :country
235
- input :order_total
236
-
237
- branch :delivery_strategy, with: :country, inputs: {
238
- country: :country,
239
- order_total: :order_total
240
- } do
241
- on "US", contract: USDeliveryContract
242
- on "UA", contract: LocalDeliveryContract
243
- default contract: DefaultDeliveryContract
244
- end
245
-
246
- export :price, :eta, from: :delivery_strategy
247
- end
248
- end
249
- ```
250
-
251
- ### 8. Declarative Collections
135
+ Use this when you want Igniter to be the runtime shape of an application:
252
136
 
253
- ```ruby
254
- class TechnicianBatchContract < Igniter::Contract
255
- define do
256
- input :technician_inputs, type: :array
137
+ - app profile
138
+ - host/loader/scheduler seams
139
+ - stack-style project layout
140
+ - app diagnostics and evolution/governance layers
257
141
 
258
- collection :technicians,
259
- with: :technician_inputs,
260
- each: TechnicianContract,
261
- key: :technician_id,
262
- mode: :collect
263
-
264
- output :technicians
265
- end
266
- end
267
- ```
142
+ Read:
268
143
 
269
- In `mode: :collect`, an execution succeeds overall while items may individually fail:
144
+ - [`docs/guide/app.md`](./docs/guide/app.md)
270
145
 
271
- - `result.summary` — collection-level status (`:partial_failure` when any item failed)
272
- - `result.items_summary` — compact per-item status hash
273
- - `result.failed_items` — failed-item error details
274
- - `result.successes` — hash of succeeded items only
146
+ ### 3. Cluster
275
147
 
276
- See [`examples/collection_partial_failure.rb`](examples/collection_partial_failure.rb).
148
+ Use this when execution stops being single-node:
277
149
 
278
- ### 9. Distributed Contracts
150
+ - mesh and gossip
151
+ - capability-based routing
152
+ - replication and distributed coordination
153
+ - resilience and decentralized runtime concerns
279
154
 
280
- Use `await` to suspend execution until an external event arrives. `correlate_by` identifies
281
- which execution should receive the event, so events can be delivered from any process:
155
+ Read:
282
156
 
283
- ```ruby
284
- class LeadWorkflow < Igniter::Contract
285
- correlate_by :request_id
157
+ - [`docs/guide/cluster.md`](./docs/guide/cluster.md)
286
158
 
287
- define do
288
- input :request_id
159
+ ### 4. SDK
289
160
 
290
- await :crm_data, event: :crm_received
291
- await :billing_data, event: :billing_received
161
+ Use SDK packs when the kernel needs optional capabilities:
292
162
 
293
- aggregate :report, with: %i[crm_data billing_data] do |crm_data:, billing_data:|
294
- { crm: crm_data, billing: billing_data }
295
- end
163
+ - AI
164
+ - channels
165
+ - tools
166
+ - skills
167
+ - data and app-facing capability packs
296
168
 
297
- output :report
298
- end
169
+ Read:
299
170
 
300
- on_success :report do |value:, **|
301
- puts "Report ready: #{value.inspect}"
302
- end
303
- end
171
+ - [`docs/guide/sdk.md`](./docs/guide/sdk.md)
304
172
 
305
- store = Igniter::Runtime::Stores::MemoryStore.new
173
+ ## Suggested Reading Paths
306
174
 
307
- # Launch suspends waiting for both events
308
- execution = LeadWorkflow.start({ request_id: "r1" }, store: store)
309
- execution.pending? # => true
175
+ If you are new to Igniter:
310
176
 
311
- # Deliver events from any process or webhook handler
312
- LeadWorkflow.deliver_event(:crm_received,
313
- correlation: { request_id: "r1" },
314
- payload: { company: "Acme Corp", tier: "enterprise" },
315
- store: store)
177
+ 1. Read [`docs/guide/`](./docs/guide/README.md)
178
+ 2. Read [`docs/concepts/`](./docs/concepts/README.md)
179
+ 3. Run one or two scripts from [`examples/README.md`](./examples/README.md)
316
180
 
317
- LeadWorkflow.deliver_event(:billing_received,
318
- correlation: { request_id: "r1" },
319
- payload: { mrr: 500 },
320
- store: store)
321
- # => prints "Report ready: { crm: ..., billing: ... }"
322
- ```
181
+ If you want to work on Igniter itself:
323
182
 
324
- See [`examples/distributed_server.rb`](examples/distributed_server.rb) and [`docs/DISTRIBUTED_CONTRACTS_V1.md`](docs/DISTRIBUTED_CONTRACTS_V1.md).
183
+ 1. Read [`docs/dev/`](./docs/dev/README.md)
184
+ 2. Read [`docs/dev/architecture-index.md`](./docs/dev/architecture-index.md)
185
+ 3. Then move to the relevant package or layer index
325
186
 
326
- ### 10. igniter-server
187
+ If you want the standard app shape:
327
188
 
328
- Host contracts as an HTTP service and call them from another graph with the `remote:` DSL:
189
+ 1. Read [`docs/guide/`](./docs/guide/README.md)
190
+ 2. Read [`docs/guide/app.md`](./docs/guide/app.md)
191
+ 3. Read [`docs/guide/cli.md`](./docs/guide/cli.md)
192
+ 4. Explore [`examples/companion/README.md`](./examples/companion/README.md)
329
193
 
330
- ```ruby
331
- # --- Service node on port 4568 ---
332
- require "igniter/server"
194
+ If you want distributed ideas:
333
195
 
334
- class ScoringContract < Igniter::Contract
335
- define do
336
- input :value
337
- compute :score, depends_on: :value, call: ->(value:) { value * 1.5 }
338
- output :score
339
- end
340
- end
196
+ 1. Read [`docs/guide/`](./docs/guide/README.md)
197
+ 2. Read [`docs/guide/cluster.md`](./docs/guide/cluster.md)
198
+ 3. Run cluster-oriented scripts from [`examples/README.md`](./examples/README.md)
341
199
 
342
- Igniter::Server.configure { |c| c.port = 4568; c.register "ScoringContract", ScoringContract }
343
- Igniter::Server.start
200
+ If you are iterating on ideas locally:
344
201
 
345
- # --- Orchestrator on port 4567 ---
346
- require "igniter/server"
202
+ - keep public learning material in [`examples/`](./examples/README.md)
203
+ - keep local-first experiments in [`playgrounds/`](./playgrounds/README.md)
347
204
 
348
- class PipelineContract < Igniter::Contract
349
- define do
350
- input :data
351
- remote :scored,
352
- contract: "ScoringContract",
353
- node: "http://localhost:4568",
354
- inputs: { value: :data }
355
- output :scored
356
- end
357
- end
205
+ ## Documentation Layout
358
206
 
359
- Igniter::Server.configure { |c| c.port = 4567; c.register "PipelineContract", PipelineContract }
360
- Igniter::Server.start
361
- ```
207
+ - [`docs/guide/`](./docs/guide/README.md) user-facing docs: getting started, API, how-tos, configuration
208
+ - [`docs/concepts/`](./docs/concepts/README.md) — durable mental models and patterns
209
+ - [`docs/current/`](./docs/current/README.md) — current-state notes and near-term direction
210
+ - [`docs/dev/`](./docs/dev/README.md) — internal docs: architecture, package boundaries, migration plans, backlog
211
+ - [`packages/*/README.md`](./packages/igniter-core/README.md) — package-local quick reference owned by each gem
212
+ - [`docs/`](./docs/README.md) — top-level docs portal that routes between sections
362
213
 
363
- **CLI:**
214
+ If you want to scaffold a new stack quickly:
364
215
 
365
216
  ```bash
366
- igniter-server start --port 4568 --require ./contracts.rb
217
+ bin/igniter-stack new my_app
218
+ bin/igniter-stack new my_hub --profile dashboard
219
+ bin/igniter-stack new mesh_lab --profile cluster
220
+ bin/igniter-stack new playgrounds/home-lab --profile playground
367
221
  ```
368
222
 
369
- **Rack / Puma (`config.ru`):**
223
+ ## Installation
370
224
 
371
225
  ```ruby
372
- require "igniter/server"
373
- require_relative "contracts"
374
- Igniter::Server.configure { |c| c.register "ScoringContract", ScoringContract }
375
- run Igniter::Server.rack_app
226
+ gem "igniter"
376
227
  ```
377
228
 
378
- **REST API:**
379
-
380
- | Method | Path | Description |
381
- |--------|------|-------------|
382
- | `POST` | `/v1/contracts/:name/execute` | Execute a contract synchronously |
383
- | `POST` | `/v1/contracts/:name/events` | Deliver an event to a distributed contract |
384
- | `GET` | `/v1/executions/:id` | Poll execution status |
385
- | `GET` | `/v1/health` | Health check with registered contracts list |
386
- | `GET` | `/v1/contracts` | List contracts with inputs and outputs |
387
-
388
- See [`docs/SERVER_V1.md`](docs/SERVER_V1.md) for the full API reference, deployment patterns, and security notes.
389
-
390
- ### 11. LLM Integration
391
-
392
- Use language models as first-class compute nodes. Supported providers: Ollama (local, zero API cost),
393
- Anthropic (Claude), OpenAI (and compatible APIs: Groq, Mistral, Azure OpenAI):
394
-
395
- ```ruby
396
- require "igniter/integrations/llm"
397
-
398
- Igniter::LLM.configure do |c|
399
- c.default_provider = :anthropic
400
- c.anthropic.api_key = ENV["ANTHROPIC_API_KEY"]
401
- end
402
-
403
- class ClassifyExecutor < Igniter::LLM::Executor
404
- provider :anthropic
405
- model "claude-haiku-4-5-20251001"
406
- system_prompt "Classify feedback into: bug_report, feature_request, question."
407
-
408
- def call(feedback:)
409
- complete("Classify: #{feedback}")
410
- end
411
- end
412
-
413
- class DraftResponseExecutor < Igniter::LLM::Executor
414
- provider :anthropic
415
- model "claude-haiku-4-5-20251001"
416
- system_prompt "You are a customer success agent. Write one professional response sentence."
229
+ ## Public Entry Points
417
230
 
418
- def call(feedback:, category:)
419
- complete("Feedback: #{feedback}\nCategory: #{category}\nDraft a response.")
420
- end
421
- end
422
-
423
- class FeedbackTriageContract < Igniter::Contract
424
- define do
425
- input :feedback
426
-
427
- compute :category, depends_on: :feedback, with: ClassifyExecutor
428
- compute :response, depends_on: %i[feedback category], with: DraftResponseExecutor
429
-
430
- output :category
431
- output :response
432
- end
433
- end
434
- ```
435
-
436
- Multi-step reasoning with conversation history:
231
+ | Need | Require |
232
+ |------|---------|
233
+ | Core contracts/runtime | `require "igniter"` |
234
+ | Contract/tool kernel | `require "igniter/core"` |
235
+ | Actor runtime and built-in agents | `require "igniter/agent"` or `require "igniter/agents"` |
236
+ | SDK registry | `require "igniter/sdk"` |
237
+ | App runtime/profile | `require "igniter/app"` |
238
+ | Cluster runtime | `require "igniter/cluster"` |
437
239
 
438
- ```ruby
439
- class MultiStepExecutor < Igniter::LLM::Executor
440
- def call(text:, prior_analysis:)
441
- ctx = Context.empty(system: self.class.system_prompt)
442
- .append_user("Initial: #{text}")
443
- .append_assistant(prior_analysis)
444
- chat(context: ctx)
445
- end
446
- end
447
- ```
240
+ The fuller map lives in [`docs/guide/README.md`](./docs/guide/README.md).
448
241
 
449
- See [`examples/llm/research_agent.rb`](examples/llm/research_agent.rb), [`examples/llm/tool_use.rb`](examples/llm/tool_use.rb), and [`docs/LLM_V1.md`](docs/LLM_V1.md).
450
-
451
- ## Examples
452
-
453
- | Example | Run | Shows |
454
- |---------|-----|-------|
455
- | `basic_pricing.rb` | `ruby examples/basic_pricing.rb` | Basic contract, lazy resolution, input updates |
456
- | `composition.rb` | `ruby examples/composition.rb` | Nested contracts and composed results |
457
- | `diagnostics.rb` | `ruby examples/diagnostics.rb` | Diagnostics text and machine-readable output |
458
- | `async_store.rb` | `ruby examples/async_store.rb` | Pending execution, file-backed store, worker-style resume |
459
- | `marketing_ergonomics.rb` | `ruby examples/marketing_ergonomics.rb` | `const`, `lookup`, `map`, `guard`, `scope`, `namespace`, `expose`, `on_success`, `explain_plan` |
460
- | `collection.rb` | `ruby examples/collection.rb` | Fan-out, stable item keys, `CollectionResult` |
461
- | `collection_partial_failure.rb` | `ruby examples/collection_partial_failure.rb` | `:collect` mode, partial failure summary, collection diagnostics |
462
- | `ringcentral_routing.rb` | `ruby examples/ringcentral_routing.rb` | `branch`, nested `collection`, `project`, `aggregate`, diagnostics |
463
- | `order_pipeline.rb` | `ruby examples/order_pipeline.rb` | `guard` + `collection` + `branch` + `export` in one flow |
464
- | `distributed_server.rb` | `ruby examples/distributed_server.rb` | `await`, `correlate_by`, `start`, `deliver_event`, `on_success` |
465
- | `server/node1.rb` + `node2.rb` | run both, then curl | Two-node igniter-server with `remote:` DSL |
466
- | `llm/research_agent.rb` | `ruby examples/llm/research_agent.rb` | Multi-step LLM pipeline with Ollama |
467
- | `llm/tool_use.rb` | `ruby examples/llm/tool_use.rb` | LLM tool declarations, chained LLM nodes, `Context` |
468
-
469
- ## Design Docs
470
-
471
- - [Architecture v2](docs/ARCHITECTURE_V2.md)
472
- - [Execution Model v2](docs/EXECUTION_MODEL_V2.md)
473
- - [API Draft v2](docs/API_V2.md)
474
- - [Patterns](docs/PATTERNS.md)
475
- - [Branches v1](docs/BRANCHES_V1.md)
476
- - [Collections v1](docs/COLLECTIONS_V1.md)
477
- - [Distributed Contracts v1](docs/DISTRIBUTED_CONTRACTS_V1.md)
478
- - [Store Adapters](docs/STORE_ADAPTERS.md)
479
- - [igniter-server v1](docs/SERVER_V1.md)
480
- - [LLM Integration v1](docs/LLM_V1.md)
481
- - [Concepts and Principles](docs/IGNITER_CONCEPTS.md)
482
-
483
- ## Development
242
+ ## Repository Landmarks
484
243
 
485
- ```bash
486
- rake # specs + RuboCop
487
- rake spec # tests only
488
- rake rubocop # lint only
489
- rake build # build gem
490
- ```
244
+ - [`docs/`](./docs/README.md) — structured documentation portal
245
+ - [`docs/guide/`](./docs/guide/README.md) user-facing docs
246
+ - [`docs/dev/`](./docs/dev/README.md) contributor-facing docs
247
+ - [`examples/`](./examples/README.md) public runnable examples
248
+ - [`examples/companion/`](./examples/companion/README.md) canonical stack-style demo
249
+ - [`playgrounds/`](./playgrounds/README.md) — local-first experiments such as home-lab work
491
250
 
492
- Current feature baseline:
251
+ ## Status
493
252
 
494
- - synchronous runtime + parallel thread-pool runner
495
- - pending / deferred node states with snapshot / restore
496
- - store-backed resume flow (MemoryStore, FileStore)
497
- - compile-time graph validation, typed inputs, cycle detection
498
- - composition, branch, collection, guard, scope / namespace
499
- - distributed workflows: `await`, `correlate_by`, `start`, `deliver_event`
500
- - igniter-server: TCP server, Rack adapter, CLI, `remote:` DSL
501
- - LLM compute nodes: Ollama, Anthropic, OpenAI providers
502
- - Rails integration: Railtie, ActiveJob, ActionCable, webhook controller mixin
503
- - auditing, diagnostics, reactive subscriptions, graph introspection
253
+ Igniter is intentionally being shaped as layered infrastructure:
504
254
 
505
- ## License
255
+ - keep `core` small and strict
256
+ - let `app` and `cluster` grow above it
257
+ - move reusable optional capabilities into `sdk`
258
+ - keep user docs in `docs/guide/`
259
+ - keep internal architecture and planning docs in `docs/dev/`
260
+ - keep package-local quick reference next to each package README
506
261
 
507
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
262
+ For the full documentation map, start at [`docs/README.md`](./docs/README.md).