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