igniter 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (840) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +3 -3
  3. data/README.md +150 -658
  4. data/docs/README.md +59 -0
  5. data/docs/assets/README.md +8 -0
  6. data/docs/concepts/README.md +18 -0
  7. data/docs/concepts/igniter.md +119 -0
  8. data/docs/dev/README.md +48 -0
  9. data/docs/dev/agent-orchestra-dna.md +271 -0
  10. data/docs/dev/ai-agents-target-plan.md +178 -0
  11. data/docs/dev/application-target-plan.md +45 -0
  12. data/docs/dev/application-web-integration.md +59 -0
  13. data/docs/dev/application-web-poc-pattern-guide.md +167 -0
  14. data/docs/dev/architect-supervisor-bootstrap.md +322 -0
  15. data/docs/dev/architecture.md +20 -0
  16. data/docs/dev/cluster-target-plan.md +43 -0
  17. data/docs/dev/contract-persistence-target-plan.md +426 -0
  18. data/docs/dev/current-runtime-snapshot.md +73 -0
  19. data/docs/dev/data-ownership.md +29 -0
  20. data/docs/dev/document-rotation.md +51 -0
  21. data/docs/dev/embed-target-plan.md +51 -0
  22. data/docs/dev/igniter-web-dsl-sketch.md +151 -0
  23. data/docs/dev/igniter-web-target-plan.md +56 -0
  24. data/docs/dev/mcp-adapter-package-spec.md +81 -0
  25. data/docs/dev/module-system.md +46 -0
  26. data/docs/dev/package-map.md +112 -0
  27. data/docs/guide/README.md +77 -0
  28. data/docs/guide/ai-and-tools.md +33 -0
  29. data/docs/guide/api-and-runtime.md +38 -0
  30. data/docs/guide/app.md +45 -0
  31. data/docs/guide/application-capsules.md +139 -0
  32. data/docs/guide/application-showcase-portfolio.md +181 -0
  33. data/docs/guide/cli.md +70 -0
  34. data/docs/guide/cluster.md +55 -0
  35. data/docs/guide/configuration.md +31 -0
  36. data/docs/guide/contract-class-dsl.md +154 -0
  37. data/docs/guide/core-runtime-features.md +34 -0
  38. data/docs/guide/core.md +43 -0
  39. data/docs/guide/credentials.md +51 -0
  40. data/docs/guide/deployment-modes.md +63 -0
  41. data/docs/guide/distributed-workflows.md +21 -0
  42. data/docs/guide/getting-started.md +49 -0
  43. data/docs/guide/how-tos.md +33 -0
  44. data/docs/guide/igniter-lang-foundation.md +133 -0
  45. data/docs/guide/integrations.md +47 -0
  46. data/docs/guide/interactive-app-structure.md +91 -0
  47. data/docs/guide/store-adapters.md +183 -0
  48. data/docs/research/README.md +131 -0
  49. data/docs/research/contract-persistence-landing-zone.md +126 -0
  50. data/docs/research/contract-persistence-organic-model.md +279 -0
  51. data/docs/research/contract-persistence-organic-model.ru.md +277 -0
  52. data/docs/research/horizon-protocol.md +180 -0
  53. data/docs/research/igniter-lang-convergence-report.md +338 -0
  54. data/docs/research/project-status-horizon-report.md +363 -0
  55. data/docs/research/vision-handoff-protocol.md +141 -0
  56. data/docs/research/wizard-type-spec-architecture.md +293 -0
  57. data/docs/research/wizard-type-spec-research-request.md +134 -0
  58. data/docs/store/README.md +7 -0
  59. data/docs/store/convergence-audit.md +901 -0
  60. data/examples/README.md +152 -344
  61. data/examples/catalog.rb +1486 -0
  62. data/examples/cluster/incident_workflow.rb +70 -0
  63. data/examples/cluster/incidents.rb +63 -0
  64. data/examples/cluster/mesh_diagnostics.rb +89 -0
  65. data/examples/cluster/remediation.rb +63 -0
  66. data/examples/cluster/routing.rb +65 -0
  67. data/examples/contracts/aggregates.rb +39 -0
  68. data/examples/contracts/auditing.rb +35 -0
  69. data/examples/contracts/basic_pricing.rb +31 -0
  70. data/examples/contracts/branching.rb +36 -0
  71. data/examples/contracts/build_effect_executor_pack.rb +88 -0
  72. data/examples/contracts/build_your_own_pack.rb +82 -0
  73. data/examples/contracts/capabilities.rb +34 -0
  74. data/examples/contracts/class_callable.rb +45 -0
  75. data/examples/contracts/class_pricing.rb +32 -0
  76. data/examples/contracts/collection.rb +44 -0
  77. data/examples/contracts/commerce.rb +44 -0
  78. data/examples/contracts/compose_your_own_packs.rb +110 -0
  79. data/examples/contracts/composition.rb +61 -0
  80. data/examples/contracts/content_addressing.rb +33 -0
  81. data/examples/contracts/contractable_service.rb +43 -0
  82. data/examples/contracts/contractable_shadow.rb +69 -0
  83. data/examples/contracts/create_pack.rb +105 -0
  84. data/examples/contracts/dataflow.rb +57 -0
  85. data/examples/contracts/debug.rb +32 -0
  86. data/examples/contracts/debug_pack_authoring.rb +31 -0
  87. data/examples/contracts/diagnostics.rb +33 -0
  88. data/examples/contracts/differential.rb +97 -0
  89. data/examples/contracts/effects.rb +34 -0
  90. data/examples/contracts/embed_class_registration.rb +40 -0
  91. data/examples/contracts/embed_human_sugar.rb +106 -0
  92. data/examples/contracts/formula.rb +32 -0
  93. data/examples/contracts/incremental.rb +44 -0
  94. data/examples/contracts/introspection.rb +48 -0
  95. data/examples/contracts/invariants.rb +54 -0
  96. data/examples/contracts/journal.rb +37 -0
  97. data/examples/contracts/lang_foundation.rb +37 -0
  98. data/examples/contracts/mcp.rb +62 -0
  99. data/examples/contracts/mcp_host.rb +55 -0
  100. data/examples/contracts/mcp_server.rb +25 -0
  101. data/examples/contracts/piecewise.rb +30 -0
  102. data/examples/contracts/provenance.rb +55 -0
  103. data/examples/contracts/reactive.rb +62 -0
  104. data/examples/contracts/saga.rb +56 -0
  105. data/examples/contracts/scale.rb +30 -0
  106. data/examples/contracts/step_result.rb +58 -0
  107. data/examples/run.rb +163 -0
  108. data/lib/igniter/cluster.rb +3 -0
  109. data/lib/igniter/contract.rb +1 -326
  110. data/lib/igniter/monorepo_packages.rb +16 -0
  111. data/lib/igniter/version.rb +1 -1
  112. data/lib/igniter/web.rb +3 -0
  113. data/lib/igniter.rb +51 -43
  114. data/packages/igniter-agents/README.md +44 -0
  115. data/packages/igniter-agents/lib/igniter/agents/agent_definition.rb +26 -0
  116. data/packages/igniter-agents/lib/igniter/agents/agent_run.rb +47 -0
  117. data/packages/igniter-agents/lib/igniter/agents/agent_turn.rb +34 -0
  118. data/packages/igniter-agents/lib/igniter/agents/runner.rb +56 -0
  119. data/packages/igniter-agents/lib/igniter/agents/tool_call.rb +26 -0
  120. data/packages/igniter-agents/lib/igniter/agents/trace_event.rb +24 -0
  121. data/packages/igniter-agents/lib/igniter/agents.rb +33 -0
  122. data/packages/igniter-agents/lib/igniter-agents.rb +3 -0
  123. data/packages/igniter-ai/README.md +42 -0
  124. data/packages/igniter-ai/lib/igniter/ai/client.rb +18 -0
  125. data/packages/igniter-ai/lib/igniter/ai/error.rb +14 -0
  126. data/packages/igniter-ai/lib/igniter/ai/model_request.rb +28 -0
  127. data/packages/igniter-ai/lib/igniter/ai/model_response.rb +31 -0
  128. data/packages/igniter-ai/lib/igniter/ai/providers/fake.rb +24 -0
  129. data/packages/igniter-ai/lib/igniter/ai/providers/openai_responses.rb +100 -0
  130. data/packages/igniter-ai/lib/igniter/ai/providers/recorded.rb +40 -0
  131. data/packages/igniter-ai/lib/igniter/ai/usage.rb +32 -0
  132. data/packages/igniter-ai/lib/igniter/ai.rb +28 -0
  133. data/packages/igniter-ai/lib/igniter-ai.rb +3 -0
  134. data/packages/igniter-application/README.md +194 -0
  135. data/packages/igniter-application/lib/igniter/application/agent_definition.rb +38 -0
  136. data/packages/igniter-application/lib/igniter/application/agent_registry.rb +33 -0
  137. data/packages/igniter-application/lib/igniter/application/agent_runtime.rb +29 -0
  138. data/packages/igniter-application/lib/igniter/application/agents_builder.rb +26 -0
  139. data/packages/igniter-application/lib/igniter/application/ai_builder.rb +26 -0
  140. data/packages/igniter-application/lib/igniter/application/ai_provider_definition.rb +59 -0
  141. data/packages/igniter-application/lib/igniter/application/ai_registry.rb +34 -0
  142. data/packages/igniter-application/lib/igniter/application/application_assembly_plan.rb +67 -0
  143. data/packages/igniter-application/lib/igniter/application/application_blueprint.rb +227 -0
  144. data/packages/igniter-application/lib/igniter/application/application_capsule_report.rb +61 -0
  145. data/packages/igniter-application/lib/igniter/application/application_composition_report.rb +161 -0
  146. data/packages/igniter-application/lib/igniter/application/application_handoff_manifest.rb +100 -0
  147. data/packages/igniter-application/lib/igniter/application/application_host_activation_commit_readiness.rb +182 -0
  148. data/packages/igniter-application/lib/igniter/application/application_host_activation_dry_run_result.rb +190 -0
  149. data/packages/igniter-application/lib/igniter/application/application_host_activation_ledger_commit.rb +285 -0
  150. data/packages/igniter-application/lib/igniter/application/application_host_activation_ledger_verification.rb +301 -0
  151. data/packages/igniter-application/lib/igniter/application/application_host_activation_operation_digest.rb +68 -0
  152. data/packages/igniter-application/lib/igniter/application/application_host_activation_plan.rb +200 -0
  153. data/packages/igniter-application/lib/igniter/application/application_host_activation_plan_verification.rb +140 -0
  154. data/packages/igniter-application/lib/igniter/application/application_host_activation_readiness.rb +226 -0
  155. data/packages/igniter-application/lib/igniter/application/application_host_activation_receipt.rb +151 -0
  156. data/packages/igniter-application/lib/igniter/application/application_layout.rb +91 -0
  157. data/packages/igniter-application/lib/igniter/application/application_load_path.rb +38 -0
  158. data/packages/igniter-application/lib/igniter/application/application_load_report.rb +74 -0
  159. data/packages/igniter-application/lib/igniter/application/application_manifest.rb +65 -0
  160. data/packages/igniter-application/lib/igniter/application/application_structure_entry.rb +58 -0
  161. data/packages/igniter-application/lib/igniter/application/application_structure_plan.rb +128 -0
  162. data/packages/igniter-application/lib/igniter/application/application_transfer_applied_verification.rb +301 -0
  163. data/packages/igniter-application/lib/igniter/application/application_transfer_apply_plan.rb +167 -0
  164. data/packages/igniter-application/lib/igniter/application/application_transfer_apply_result.rb +321 -0
  165. data/packages/igniter-application/lib/igniter/application/application_transfer_bundle_artifact.rb +160 -0
  166. data/packages/igniter-application/lib/igniter/application/application_transfer_bundle_plan.rb +125 -0
  167. data/packages/igniter-application/lib/igniter/application/application_transfer_bundle_verification.rb +154 -0
  168. data/packages/igniter-application/lib/igniter/application/application_transfer_intake_plan.rb +195 -0
  169. data/packages/igniter-application/lib/igniter/application/application_transfer_inventory.rb +153 -0
  170. data/packages/igniter-application/lib/igniter/application/application_transfer_readiness.rb +260 -0
  171. data/packages/igniter-application/lib/igniter/application/application_transfer_receipt.rb +179 -0
  172. data/packages/igniter-application/lib/igniter/application/artifact_reference.rb +39 -0
  173. data/packages/igniter-application/lib/igniter/application/boot_phase.rb +27 -0
  174. data/packages/igniter-application/lib/igniter/application/boot_plan.rb +55 -0
  175. data/packages/igniter-application/lib/igniter/application/boot_report.rb +70 -0
  176. data/packages/igniter-application/lib/igniter/application/capsule_builder.rb +396 -0
  177. data/packages/igniter-application/lib/igniter/application/capsule_export.rb +26 -0
  178. data/packages/igniter-application/lib/igniter/application/capsule_import.rb +38 -0
  179. data/packages/igniter-application/lib/igniter/application/collection_invoker.rb +54 -0
  180. data/packages/igniter-application/lib/igniter/application/collection_transport_adapter.rb +37 -0
  181. data/packages/igniter-application/lib/igniter/application/compose_invoker.rb +51 -0
  182. data/packages/igniter-application/lib/igniter/application/compose_transport_adapter.rb +34 -0
  183. data/packages/igniter-application/lib/igniter/application/config.rb +86 -0
  184. data/packages/igniter-application/lib/igniter/application/config_builder.rb +69 -0
  185. data/packages/igniter-application/lib/igniter/application/contract_registry.rb +30 -0
  186. data/packages/igniter-application/lib/igniter/application/credential_definition.rb +65 -0
  187. data/packages/igniter-application/lib/igniter/application/credential_store.rb +68 -0
  188. data/packages/igniter-application/lib/igniter/application/embedded_host.rb +23 -0
  189. data/packages/igniter-application/lib/igniter/application/environment.rb +1071 -0
  190. data/packages/igniter-application/lib/igniter/application/feature_slice.rb +61 -0
  191. data/packages/igniter-application/lib/igniter/application/feature_slice_report.rb +43 -0
  192. data/packages/igniter-application/lib/igniter/application/file_backed_host_activation_ledger_adapter.rb +138 -0
  193. data/packages/igniter-application/lib/igniter/application/file_backed_installed_capsule_registry.rb +132 -0
  194. data/packages/igniter-application/lib/igniter/application/flow_declaration.rb +62 -0
  195. data/packages/igniter-application/lib/igniter/application/flow_event.rb +50 -0
  196. data/packages/igniter-application/lib/igniter/application/flow_session_snapshot.rb +98 -0
  197. data/packages/igniter-application/lib/igniter/application/installed_capsule_entry.rb +47 -0
  198. data/packages/igniter-application/lib/igniter/application/interface.rb +11 -0
  199. data/packages/igniter-application/lib/igniter/application/kernel.rb +385 -0
  200. data/packages/igniter-application/lib/igniter/application/lifecycle_plan_step.rb +38 -0
  201. data/packages/igniter-application/lib/igniter/application/manual_loader.rb +18 -0
  202. data/packages/igniter-application/lib/igniter/application/manual_scheduler.rb +15 -0
  203. data/packages/igniter-application/lib/igniter/application/memory_session_store.rb +33 -0
  204. data/packages/igniter-application/lib/igniter/application/missing_credential_error.rb +23 -0
  205. data/packages/igniter-application/lib/igniter/application/mount_intent.rb +48 -0
  206. data/packages/igniter-application/lib/igniter/application/mount_registration.rb +49 -0
  207. data/packages/igniter-application/lib/igniter/application/pending_action.rb +39 -0
  208. data/packages/igniter-application/lib/igniter/application/pending_input.rb +45 -0
  209. data/packages/igniter-application/lib/igniter/application/plan_executor.rb +93 -0
  210. data/packages/igniter-application/lib/igniter/application/profile.rb +178 -0
  211. data/packages/igniter-application/lib/igniter/application/provider.rb +19 -0
  212. data/packages/igniter-application/lib/igniter/application/provider_lifecycle_report.rb +72 -0
  213. data/packages/igniter-application/lib/igniter/application/provider_lifecycle_result.rb +54 -0
  214. data/packages/igniter-application/lib/igniter/application/provider_registration.rb +19 -0
  215. data/packages/igniter-application/lib/igniter/application/rack_host.rb +311 -0
  216. data/packages/igniter-application/lib/igniter/application/seam_lifecycle_result.rb +62 -0
  217. data/packages/igniter-application/lib/igniter/application/service_definition.rb +25 -0
  218. data/packages/igniter-application/lib/igniter/application/service_registry.rb +58 -0
  219. data/packages/igniter-application/lib/igniter/application/session_entry.rb +46 -0
  220. data/packages/igniter-application/lib/igniter/application/shutdown_plan.rb +45 -0
  221. data/packages/igniter-application/lib/igniter/application/shutdown_report.rb +54 -0
  222. data/packages/igniter-application/lib/igniter/application/snapshot.rb +35 -0
  223. data/packages/igniter-application/lib/igniter/application/transport_request.rb +40 -0
  224. data/packages/igniter-application/lib/igniter/application/transport_response.rb +22 -0
  225. data/packages/igniter-application/lib/igniter/application.rb +354 -0
  226. data/packages/igniter-application/lib/igniter-application.rb +3 -0
  227. data/packages/igniter-cluster/README.md +116 -0
  228. data/packages/igniter-cluster/lib/igniter/cluster/active_incident_set.rb +40 -0
  229. data/packages/igniter-cluster/lib/igniter/cluster/admission_policy.rb +158 -0
  230. data/packages/igniter-cluster/lib/igniter/cluster/admission_result.rb +47 -0
  231. data/packages/igniter-cluster/lib/igniter/cluster/capability_catalog.rb +66 -0
  232. data/packages/igniter-cluster/lib/igniter/cluster/capability_definition.rb +42 -0
  233. data/packages/igniter-cluster/lib/igniter/cluster/capability_query.rb +162 -0
  234. data/packages/igniter-cluster/lib/igniter/cluster/capability_router.rb +11 -0
  235. data/packages/igniter-cluster/lib/igniter/cluster/cluster_diagnostics_executor.rb +184 -0
  236. data/packages/igniter-cluster/lib/igniter/cluster/cluster_diagnostics_report.rb +49 -0
  237. data/packages/igniter-cluster/lib/igniter/cluster/cluster_event.rb +34 -0
  238. data/packages/igniter-cluster/lib/igniter/cluster/cluster_event_log.rb +27 -0
  239. data/packages/igniter-cluster/lib/igniter/cluster/cluster_incident.rb +42 -0
  240. data/packages/igniter-cluster/lib/igniter/cluster/decision_explanation.rb +31 -0
  241. data/packages/igniter-cluster/lib/igniter/cluster/direct_placement.rb +11 -0
  242. data/packages/igniter-cluster/lib/igniter/cluster/discovery_feed.rb +22 -0
  243. data/packages/igniter-cluster/lib/igniter/cluster/environment.rb +380 -0
  244. data/packages/igniter-cluster/lib/igniter/cluster/errors.rb +9 -0
  245. data/packages/igniter-cluster/lib/igniter/cluster/failover_plan.rb +45 -0
  246. data/packages/igniter-cluster/lib/igniter/cluster/failover_step.rb +32 -0
  247. data/packages/igniter-cluster/lib/igniter/cluster/health_policy.rb +124 -0
  248. data/packages/igniter-cluster/lib/igniter/cluster/incident_action.rb +49 -0
  249. data/packages/igniter-cluster/lib/igniter/cluster/incident_entry.rb +98 -0
  250. data/packages/igniter-cluster/lib/igniter/cluster/incident_executor.rb +145 -0
  251. data/packages/igniter-cluster/lib/igniter/cluster/incident_workflow.rb +64 -0
  252. data/packages/igniter-cluster/lib/igniter/cluster/kernel.rb +75 -0
  253. data/packages/igniter-cluster/lib/igniter/cluster/kernel_seams.rb +249 -0
  254. data/packages/igniter-cluster/lib/igniter/cluster/lease_grant.rb +40 -0
  255. data/packages/igniter-cluster/lib/igniter/cluster/lease_plan.rb +40 -0
  256. data/packages/igniter-cluster/lib/igniter/cluster/lease_policy.rb +96 -0
  257. data/packages/igniter-cluster/lib/igniter/cluster/membership_delta.rb +36 -0
  258. data/packages/igniter-cluster/lib/igniter/cluster/membership_feed.rb +24 -0
  259. data/packages/igniter-cluster/lib/igniter/cluster/membership_projection.rb +45 -0
  260. data/packages/igniter-cluster/lib/igniter/cluster/membership_snapshot.rb +64 -0
  261. data/packages/igniter-cluster/lib/igniter/cluster/memory_incident_registry.rb +169 -0
  262. data/packages/igniter-cluster/lib/igniter/cluster/memory_peer_registry.rb +24 -0
  263. data/packages/igniter-cluster/lib/igniter/cluster/mesh_admission.rb +24 -0
  264. data/packages/igniter-cluster/lib/igniter/cluster/mesh_admission_result.rb +40 -0
  265. data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_attempt.rb +51 -0
  266. data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_request.rb +71 -0
  267. data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_response.rb +28 -0
  268. data/packages/igniter-cluster/lib/igniter/cluster/mesh_execution_trace.rb +32 -0
  269. data/packages/igniter-cluster/lib/igniter/cluster/mesh_executor.rb +497 -0
  270. data/packages/igniter-cluster/lib/igniter/cluster/mesh_membership.rb +89 -0
  271. data/packages/igniter-cluster/lib/igniter/cluster/mesh_membership_event.rb +32 -0
  272. data/packages/igniter-cluster/lib/igniter/cluster/mesh_membership_source.rb +49 -0
  273. data/packages/igniter-cluster/lib/igniter/cluster/mesh_retry_policy.rb +42 -0
  274. data/packages/igniter-cluster/lib/igniter/cluster/mesh_trust_policy.rb +131 -0
  275. data/packages/igniter-cluster/lib/igniter/cluster/operator_timeline.rb +33 -0
  276. data/packages/igniter-cluster/lib/igniter/cluster/ownership_claim.rb +30 -0
  277. data/packages/igniter-cluster/lib/igniter/cluster/ownership_plan.rb +40 -0
  278. data/packages/igniter-cluster/lib/igniter/cluster/ownership_policy.rb +100 -0
  279. data/packages/igniter-cluster/lib/igniter/cluster/peer.rb +86 -0
  280. data/packages/igniter-cluster/lib/igniter/cluster/peer_discovery.rb +62 -0
  281. data/packages/igniter-cluster/lib/igniter/cluster/peer_health.rb +55 -0
  282. data/packages/igniter-cluster/lib/igniter/cluster/peer_profile.rb +102 -0
  283. data/packages/igniter-cluster/lib/igniter/cluster/peer_topology.rb +62 -0
  284. data/packages/igniter-cluster/lib/igniter/cluster/peer_view.rb +42 -0
  285. data/packages/igniter-cluster/lib/igniter/cluster/permissive_admission.rb +11 -0
  286. data/packages/igniter-cluster/lib/igniter/cluster/placement_decision.rb +38 -0
  287. data/packages/igniter-cluster/lib/igniter/cluster/placement_policy.rb +131 -0
  288. data/packages/igniter-cluster/lib/igniter/cluster/plan_action_result.rb +72 -0
  289. data/packages/igniter-cluster/lib/igniter/cluster/plan_execution_report.rb +57 -0
  290. data/packages/igniter-cluster/lib/igniter/cluster/plan_executor.rb +314 -0
  291. data/packages/igniter-cluster/lib/igniter/cluster/policy_admission.rb +18 -0
  292. data/packages/igniter-cluster/lib/igniter/cluster/policy_placement.rb +69 -0
  293. data/packages/igniter-cluster/lib/igniter/cluster/policy_router.rb +70 -0
  294. data/packages/igniter-cluster/lib/igniter/cluster/profile.rb +97 -0
  295. data/packages/igniter-cluster/lib/igniter/cluster/projection_executor.rb +42 -0
  296. data/packages/igniter-cluster/lib/igniter/cluster/projection_policy.rb +107 -0
  297. data/packages/igniter-cluster/lib/igniter/cluster/projection_report.rb +35 -0
  298. data/packages/igniter-cluster/lib/igniter/cluster/projection_stage.rb +32 -0
  299. data/packages/igniter-cluster/lib/igniter/cluster/rebalance_move.rb +30 -0
  300. data/packages/igniter-cluster/lib/igniter/cluster/rebalance_plan.rb +40 -0
  301. data/packages/igniter-cluster/lib/igniter/cluster/recovery_timeline.rb +33 -0
  302. data/packages/igniter-cluster/lib/igniter/cluster/registry_membership_source.rb +97 -0
  303. data/packages/igniter-cluster/lib/igniter/cluster/remediation_plan.rb +45 -0
  304. data/packages/igniter-cluster/lib/igniter/cluster/remediation_policy.rb +119 -0
  305. data/packages/igniter-cluster/lib/igniter/cluster/remediation_step.rb +44 -0
  306. data/packages/igniter-cluster/lib/igniter/cluster/route.rb +34 -0
  307. data/packages/igniter-cluster/lib/igniter/cluster/route_policy.rb +104 -0
  308. data/packages/igniter-cluster/lib/igniter/cluster/route_request.rb +61 -0
  309. data/packages/igniter-cluster/lib/igniter/cluster/topology_policy.rb +154 -0
  310. data/packages/igniter-cluster/lib/igniter/cluster/transport_adapter.rb +53 -0
  311. data/packages/igniter-cluster/lib/igniter/cluster.rb +108 -0
  312. data/packages/igniter-cluster/lib/igniter-cluster.rb +3 -0
  313. data/packages/igniter-contracts/README.md +239 -0
  314. data/packages/igniter-contracts/lib/igniter/contracts/api.rb +92 -0
  315. data/packages/igniter-contracts/lib/igniter/contracts/assembly/baseline_pack.rb +141 -0
  316. data/packages/igniter-contracts/lib/igniter/contracts/assembly/const_pack.rb +29 -0
  317. data/packages/igniter-contracts/lib/igniter/contracts/assembly/dsl_keyword.rb +21 -0
  318. data/packages/igniter-contracts/lib/igniter/contracts/assembly/hook_result_policies.rb +47 -0
  319. data/packages/igniter-contracts/lib/igniter/contracts/assembly/hook_spec.rb +73 -0
  320. data/packages/igniter-contracts/lib/igniter/contracts/assembly/hook_specs.rb +74 -0
  321. data/packages/igniter-contracts/lib/igniter/contracts/assembly/kernel.rb +220 -0
  322. data/packages/igniter-contracts/lib/igniter/contracts/assembly/node_type.rb +26 -0
  323. data/packages/igniter-contracts/lib/igniter/contracts/assembly/ordered_registry.rb +55 -0
  324. data/packages/igniter-contracts/lib/igniter/contracts/assembly/pack.rb +13 -0
  325. data/packages/igniter-contracts/lib/igniter/contracts/assembly/pack_manifest.rb +131 -0
  326. data/packages/igniter-contracts/lib/igniter/contracts/assembly/path_access.rb +76 -0
  327. data/packages/igniter-contracts/lib/igniter/contracts/assembly/profile.rb +133 -0
  328. data/packages/igniter-contracts/lib/igniter/contracts/assembly/project_pack.rb +42 -0
  329. data/packages/igniter-contracts/lib/igniter/contracts/assembly/registry.rb +57 -0
  330. data/packages/igniter-contracts/lib/igniter/contracts/assembly/step_result_pack.rb +42 -0
  331. data/packages/igniter-contracts/lib/igniter/contracts/assembly.rb +18 -0
  332. data/packages/igniter-contracts/lib/igniter/contracts/contract.rb +135 -0
  333. data/packages/igniter-contracts/lib/igniter/contracts/contractable.rb +288 -0
  334. data/packages/igniter-contracts/lib/igniter/contracts/environment.rb +51 -0
  335. data/packages/igniter-contracts/lib/igniter/contracts/errors.rb +47 -0
  336. data/packages/igniter-contracts/lib/igniter/contracts/execution/baseline_normalizers.rb +23 -0
  337. data/packages/igniter-contracts/lib/igniter/contracts/execution/baseline_runtime.rb +55 -0
  338. data/packages/igniter-contracts/lib/igniter/contracts/execution/baseline_validators.rb +113 -0
  339. data/packages/igniter-contracts/lib/igniter/contracts/execution/builder.rb +43 -0
  340. data/packages/igniter-contracts/lib/igniter/contracts/execution/compilation_report.rb +46 -0
  341. data/packages/igniter-contracts/lib/igniter/contracts/execution/compiled_graph.rb +21 -0
  342. data/packages/igniter-contracts/lib/igniter/contracts/execution/compiler.rb +66 -0
  343. data/packages/igniter-contracts/lib/igniter/contracts/execution/const_runtime.rb +15 -0
  344. data/packages/igniter-contracts/lib/igniter/contracts/execution/diagnostics.rb +24 -0
  345. data/packages/igniter-contracts/lib/igniter/contracts/execution/diagnostics_report.rb +40 -0
  346. data/packages/igniter-contracts/lib/igniter/contracts/execution/diagnostics_section.rb +37 -0
  347. data/packages/igniter-contracts/lib/igniter/contracts/execution/effect_invocation.rb +26 -0
  348. data/packages/igniter-contracts/lib/igniter/contracts/execution/execution_request.rb +28 -0
  349. data/packages/igniter-contracts/lib/igniter/contracts/execution/execution_result.rb +32 -0
  350. data/packages/igniter-contracts/lib/igniter/contracts/execution/inline_executor.rb +19 -0
  351. data/packages/igniter-contracts/lib/igniter/contracts/execution/mutable_named_values.rb +52 -0
  352. data/packages/igniter-contracts/lib/igniter/contracts/execution/named_values.rb +48 -0
  353. data/packages/igniter-contracts/lib/igniter/contracts/execution/operation.rb +42 -0
  354. data/packages/igniter-contracts/lib/igniter/contracts/execution/runtime.rb +43 -0
  355. data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result.rb +51 -0
  356. data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result_diagnostics.rb +35 -0
  357. data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result_runtime.rb +51 -0
  358. data/packages/igniter-contracts/lib/igniter/contracts/execution/step_result_validators.rb +44 -0
  359. data/packages/igniter-contracts/lib/igniter/contracts/execution/structured_dump.rb +49 -0
  360. data/packages/igniter-contracts/lib/igniter/contracts/execution/validation_finding.rb +28 -0
  361. data/packages/igniter-contracts/lib/igniter/contracts/execution/validation_report.rb +46 -0
  362. data/packages/igniter-contracts/lib/igniter/contracts/execution.rb +28 -0
  363. data/packages/igniter-contracts/lib/igniter/contracts.rb +54 -0
  364. data/packages/igniter-contracts/lib/igniter/lang/backend.rb +19 -0
  365. data/packages/igniter-contracts/lib/igniter/lang/backends/ruby.rb +42 -0
  366. data/packages/igniter-contracts/lib/igniter/lang/diagnostic_payload.rb +174 -0
  367. data/packages/igniter-contracts/lib/igniter/lang/metadata_carrier_manifest.rb +112 -0
  368. data/packages/igniter-contracts/lib/igniter/lang/metadata_manifest.rb +128 -0
  369. data/packages/igniter-contracts/lib/igniter/lang/receipt_payload.rb +152 -0
  370. data/packages/igniter-contracts/lib/igniter/lang/schema_compatibility_diagnostic.rb +300 -0
  371. data/packages/igniter-contracts/lib/igniter/lang/types.rb +84 -0
  372. data/packages/igniter-contracts/lib/igniter/lang/verification_report.rb +226 -0
  373. data/packages/igniter-contracts/lib/igniter/lang.rb +27 -0
  374. data/packages/igniter-contracts/lib/igniter-contracts.rb +3 -0
  375. data/packages/igniter-embed/README.md +360 -0
  376. data/packages/igniter-embed/lib/igniter/embed/config.rb +155 -0
  377. data/packages/igniter-embed/lib/igniter/embed/container.rb +165 -0
  378. data/packages/igniter-embed/lib/igniter/embed/contract_handle.rb +23 -0
  379. data/packages/igniter-embed/lib/igniter/embed/contract_naming.rb +38 -0
  380. data/packages/igniter-embed/lib/igniter/embed/contractable/acceptance.rb +52 -0
  381. data/packages/igniter-embed/lib/igniter/embed/contractable/adapters.rb +33 -0
  382. data/packages/igniter-embed/lib/igniter/embed/contractable/config.rb +234 -0
  383. data/packages/igniter-embed/lib/igniter/embed/contractable/runner.rb +393 -0
  384. data/packages/igniter-embed/lib/igniter/embed/contractable/sugar_builder.rb +145 -0
  385. data/packages/igniter-embed/lib/igniter/embed/contractable.rb +29 -0
  386. data/packages/igniter-embed/lib/igniter/embed/contracts_builder.rb +54 -0
  387. data/packages/igniter-embed/lib/igniter/embed/errors.rb +14 -0
  388. data/packages/igniter-embed/lib/igniter/embed/execution_envelope.rb +50 -0
  389. data/packages/igniter-embed/lib/igniter/embed/host_builder.rb +39 -0
  390. data/packages/igniter-embed/lib/igniter/embed/rails.rb +21 -0
  391. data/packages/igniter-embed/lib/igniter/embed/registry.rb +78 -0
  392. data/packages/igniter-embed/lib/igniter/embed/sugar_expansion.rb +152 -0
  393. data/packages/igniter-embed/lib/igniter/embed.rb +38 -0
  394. data/packages/igniter-embed/lib/igniter-embed.rb +3 -0
  395. data/packages/igniter-extensions/README.md +381 -0
  396. data/packages/igniter-extensions/lib/igniter/extensions/contracts/aggregate_pack.rb +103 -0
  397. data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit/builder.rb +132 -0
  398. data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit/event.rb +34 -0
  399. data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit/snapshot.rb +44 -0
  400. data/packages/igniter-extensions/lib/igniter/extensions/contracts/audit_pack.rb +60 -0
  401. data/packages/igniter-extensions/lib/igniter/extensions/contracts/branch_pack.rb +199 -0
  402. data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/declaration.rb +31 -0
  403. data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/error.rb +35 -0
  404. data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/policy.rb +20 -0
  405. data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/report.rb +47 -0
  406. data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities/violation.rb +30 -0
  407. data/packages/igniter-extensions/lib/igniter/extensions/contracts/capabilities_pack.rb +146 -0
  408. data/packages/igniter-extensions/lib/igniter/extensions/contracts/collection_pack.rb +212 -0
  409. data/packages/igniter-extensions/lib/igniter/extensions/contracts/commerce_pack.rb +91 -0
  410. data/packages/igniter-extensions/lib/igniter/extensions/contracts/compose_pack.rb +213 -0
  411. data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing/cache.rb +59 -0
  412. data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing/content_key.rb +63 -0
  413. data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing/declaration.rb +47 -0
  414. data/packages/igniter-extensions/lib/igniter/extensions/contracts/content_addressing_pack.rb +90 -0
  415. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/profile.rb +196 -0
  416. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/report.rb +85 -0
  417. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/scaffold.rb +461 -0
  418. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/scope.rb +79 -0
  419. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/wizard.rb +269 -0
  420. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/workflow.rb +189 -0
  421. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/workflow_step.rb +51 -0
  422. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/write_result.rb +48 -0
  423. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/write_step.rb +63 -0
  424. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator/writer.rb +131 -0
  425. data/packages/igniter-extensions/lib/igniter/extensions/contracts/creator_pack.rb +128 -0
  426. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/aggregate_operators.rb +119 -0
  427. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/aggregate_state.rb +60 -0
  428. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/builder.rb +66 -0
  429. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/collection_result.rb +70 -0
  430. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/diff.rb +37 -0
  431. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/item_result.rb +44 -0
  432. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/result.rb +58 -0
  433. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/session.rb +173 -0
  434. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow/window_filter.rb +49 -0
  435. data/packages/igniter-extensions/lib/igniter/extensions/contracts/dataflow_pack.rb +66 -0
  436. data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/pack_audit.rb +181 -0
  437. data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/pack_snapshot.rb +46 -0
  438. data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/profile_snapshot.rb +50 -0
  439. data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug/report.rb +50 -0
  440. data/packages/igniter-extensions/lib/igniter/extensions/contracts/debug_pack.rb +115 -0
  441. data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/divergence.rb +37 -0
  442. data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/formatter.rb +85 -0
  443. data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/report.rb +83 -0
  444. data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential/runner.rb +136 -0
  445. data/packages/igniter-extensions/lib/igniter/extensions/contracts/differential_pack.rb +61 -0
  446. data/packages/igniter-extensions/lib/igniter/extensions/contracts/execution_report_pack.rb +38 -0
  447. data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/formatter.rb +60 -0
  448. data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/node_state.rb +30 -0
  449. data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/result.rb +65 -0
  450. data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental/session.rb +146 -0
  451. data/packages/igniter-extensions/lib/igniter/extensions/contracts/incremental_pack.rb +40 -0
  452. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/builder.rb +27 -0
  453. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/cases_report.rb +47 -0
  454. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/error.rb +34 -0
  455. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/invariant.rb +30 -0
  456. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/report.rb +45 -0
  457. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/suite.rb +36 -0
  458. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants/violation.rb +39 -0
  459. data/packages/igniter-extensions/lib/igniter/extensions/contracts/invariants_pack.rb +88 -0
  460. data/packages/igniter-extensions/lib/igniter/extensions/contracts/journal_pack.rb +55 -0
  461. data/packages/igniter-extensions/lib/igniter/extensions/contracts/language/formula_pack.rb +185 -0
  462. data/packages/igniter-extensions/lib/igniter/extensions/contracts/language/piecewise_pack.rb +166 -0
  463. data/packages/igniter-extensions/lib/igniter/extensions/contracts/language/scale_pack.rb +147 -0
  464. data/packages/igniter-extensions/lib/igniter/extensions/contracts/lookup_pack.rb +50 -0
  465. data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/creator_session.rb +105 -0
  466. data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/tool_argument.rb +35 -0
  467. data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/tool_definition.rb +33 -0
  468. data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp/tool_result.rb +28 -0
  469. data/packages/igniter-extensions/lib/igniter/extensions/contracts/mcp_pack.rb +335 -0
  470. data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/builder.rb +80 -0
  471. data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/lineage.rb +59 -0
  472. data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/node_trace.rb +53 -0
  473. data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance/text_formatter.rb +62 -0
  474. data/packages/igniter-extensions/lib/igniter/extensions/contracts/provenance_pack.rb +52 -0
  475. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/builder.rb +43 -0
  476. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/dispatch_result.rb +59 -0
  477. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/engine.rb +79 -0
  478. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/event.rb +36 -0
  479. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/matcher.rb +20 -0
  480. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/plan.rb +58 -0
  481. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive/subscription.rb +29 -0
  482. data/packages/igniter-extensions/lib/igniter/extensions/contracts/reactive_pack.rb +169 -0
  483. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/compensation.rb +25 -0
  484. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/compensation_record.rb +28 -0
  485. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/compensation_set.rb +47 -0
  486. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/formatter.rb +39 -0
  487. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/result.rb +56 -0
  488. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga/runner.rb +124 -0
  489. data/packages/igniter-extensions/lib/igniter/extensions/contracts/saga_pack.rb +56 -0
  490. data/packages/igniter-extensions/lib/igniter/extensions/contracts.rb +445 -0
  491. data/packages/igniter-extensions/lib/igniter/extensions.rb +6 -0
  492. data/packages/igniter-extensions/lib/igniter-extensions.rb +3 -0
  493. data/packages/igniter-hub/README.md +25 -0
  494. data/packages/igniter-hub/lib/igniter/hub/catalog_entry.rb +35 -0
  495. data/packages/igniter-hub/lib/igniter/hub/local_catalog.rb +51 -0
  496. data/packages/igniter-hub/lib/igniter/hub.rb +16 -0
  497. data/packages/igniter-hub/lib/igniter-hub.rb +3 -0
  498. data/packages/igniter-mcp-adapter/README.md +65 -0
  499. data/packages/igniter-mcp-adapter/exe/igniter-mcp-adapter +6 -0
  500. data/packages/igniter-mcp-adapter/lib/igniter/mcp/adapter/host.rb +226 -0
  501. data/packages/igniter-mcp-adapter/lib/igniter/mcp/adapter/server.rb +148 -0
  502. data/packages/igniter-mcp-adapter/lib/igniter/mcp/adapter.rb +40 -0
  503. data/packages/igniter-mcp-adapter/lib/igniter-mcp-adapter.rb +5 -0
  504. data/packages/igniter-web/README.md +539 -0
  505. data/packages/igniter-web/lib/igniter/web/api.rb +49 -0
  506. data/packages/igniter-web/lib/igniter/web/application.rb +99 -0
  507. data/packages/igniter-web/lib/igniter/web/application_web_mount.rb +162 -0
  508. data/packages/igniter-web/lib/igniter/web/arbre.rb +41 -0
  509. data/packages/igniter-web/lib/igniter/web/component.rb +103 -0
  510. data/packages/igniter-web/lib/igniter/web/components/view_action_node.rb +38 -0
  511. data/packages/igniter-web/lib/igniter/web/components/view_ask_node.rb +52 -0
  512. data/packages/igniter-web/lib/igniter/web/components/view_chat_node.rb +34 -0
  513. data/packages/igniter-web/lib/igniter/web/components/view_compare_node.rb +41 -0
  514. data/packages/igniter-web/lib/igniter/web/components/view_node.rb +30 -0
  515. data/packages/igniter-web/lib/igniter/web/components/view_screen.rb +34 -0
  516. data/packages/igniter-web/lib/igniter/web/components/view_stream_node.rb +32 -0
  517. data/packages/igniter-web/lib/igniter/web/components/view_zone.rb +26 -0
  518. data/packages/igniter-web/lib/igniter/web/components.rb +10 -0
  519. data/packages/igniter-web/lib/igniter/web/composer.rb +84 -0
  520. data/packages/igniter-web/lib/igniter/web/composition_finding.rb +16 -0
  521. data/packages/igniter-web/lib/igniter/web/composition_policy.rb +88 -0
  522. data/packages/igniter-web/lib/igniter/web/composition_preset.rb +131 -0
  523. data/packages/igniter-web/lib/igniter/web/composition_result.rb +27 -0
  524. data/packages/igniter-web/lib/igniter/web/flow_interaction_adapter.rb +104 -0
  525. data/packages/igniter-web/lib/igniter/web/flow_surface_projection.rb +121 -0
  526. data/packages/igniter-web/lib/igniter/web/interaction_target.rb +50 -0
  527. data/packages/igniter-web/lib/igniter/web/mount_context.rb +80 -0
  528. data/packages/igniter-web/lib/igniter/web/page.rb +110 -0
  529. data/packages/igniter-web/lib/igniter/web/record.rb +54 -0
  530. data/packages/igniter-web/lib/igniter/web/screen_spec.rb +109 -0
  531. data/packages/igniter-web/lib/igniter/web/surface_manifest.rb +370 -0
  532. data/packages/igniter-web/lib/igniter/web/surface_structure.rb +57 -0
  533. data/packages/igniter-web/lib/igniter/web/view_graph.rb +25 -0
  534. data/packages/igniter-web/lib/igniter/web/view_graph_renderer.rb +63 -0
  535. data/packages/igniter-web/lib/igniter/web/view_node.rb +37 -0
  536. data/packages/igniter-web/lib/igniter/web.rb +107 -0
  537. data/packages/igniter-web/lib/igniter-web.rb +3 -0
  538. metadata +547 -308
  539. data/docs/API_V2.md +0 -537
  540. data/docs/APPLICATION_V1.md +0 -253
  541. data/docs/ARCHITECTURE_V2.md +0 -317
  542. data/docs/BACKLOG.md +0 -166
  543. data/docs/BRANCHES_V1.md +0 -213
  544. data/docs/CAPABILITIES_V1.md +0 -207
  545. data/docs/COLLECTIONS_V1.md +0 -303
  546. data/docs/CONSENSUS_V1.md +0 -477
  547. data/docs/CONTENT_ADDRESSING_V1.md +0 -221
  548. data/docs/DATAFLOW_V1.md +0 -274
  549. data/docs/DISTRIBUTED_CONTRACTS_V1.md +0 -493
  550. data/docs/IGNITER_CONCEPTS.md +0 -81
  551. data/docs/LLM_V1.md +0 -335
  552. data/docs/MESH_V1.md +0 -732
  553. data/docs/NODE_CACHE_V1.md +0 -324
  554. data/docs/PATTERNS.md +0 -411
  555. data/docs/PROACTIVE_AGENTS_V1.md +0 -293
  556. data/docs/SERVER_V1.md +0 -512
  557. data/docs/SKILLS_V1.md +0 -213
  558. data/docs/STORE_ADAPTERS.md +0 -154
  559. data/docs/TEMPORAL_V1.md +0 -174
  560. data/docs/TOOLS_V1.md +0 -347
  561. data/docs/TRANSCRIPTION_V1.md +0 -403
  562. data/examples/agents.rb +0 -150
  563. data/examples/async_store.rb +0 -47
  564. data/examples/basic_pricing.rb +0 -27
  565. data/examples/collection.rb +0 -43
  566. data/examples/collection_partial_failure.rb +0 -50
  567. data/examples/composition.rb +0 -39
  568. data/examples/consensus.rb +0 -239
  569. data/examples/dataflow.rb +0 -308
  570. data/examples/diagnostics.rb +0 -28
  571. data/examples/differential.rb +0 -161
  572. data/examples/distributed_server.rb +0 -94
  573. data/examples/distributed_workflow.rb +0 -52
  574. data/examples/effects.rb +0 -184
  575. data/examples/elocal_webhook.rb +0 -1
  576. data/examples/incremental.rb +0 -142
  577. data/examples/invariants.rb +0 -179
  578. data/examples/llm_tools.rb +0 -237
  579. data/examples/marketing_ergonomics.rb +0 -57
  580. data/examples/mesh.rb +0 -239
  581. data/examples/mesh_discovery.rb +0 -267
  582. data/examples/mesh_gossip.rb +0 -162
  583. data/examples/order_pipeline.rb +0 -163
  584. data/examples/provenance.rb +0 -122
  585. data/examples/ringcentral_routing.rb +0 -269
  586. data/examples/saga.rb +0 -110
  587. data/lib/igniter/agent/mailbox.rb +0 -96
  588. data/lib/igniter/agent/message.rb +0 -21
  589. data/lib/igniter/agent/ref.rb +0 -86
  590. data/lib/igniter/agent/runner.rb +0 -129
  591. data/lib/igniter/agent/state_holder.rb +0 -23
  592. data/lib/igniter/agent.rb +0 -155
  593. data/lib/igniter/agents/ai/alert_agent.rb +0 -111
  594. data/lib/igniter/agents/ai/chain_agent.rb +0 -127
  595. data/lib/igniter/agents/ai/critic_agent.rb +0 -163
  596. data/lib/igniter/agents/ai/evaluator_agent.rb +0 -193
  597. data/lib/igniter/agents/ai/evolution_agent.rb +0 -286
  598. data/lib/igniter/agents/ai/health_check_agent.rb +0 -122
  599. data/lib/igniter/agents/ai/observer_agent.rb +0 -184
  600. data/lib/igniter/agents/ai/planner_agent.rb +0 -210
  601. data/lib/igniter/agents/ai/router_agent.rb +0 -131
  602. data/lib/igniter/agents/ai/self_reflection_agent.rb +0 -175
  603. data/lib/igniter/agents/observability/metrics_agent.rb +0 -130
  604. data/lib/igniter/agents/pipeline/batch_processor_agent.rb +0 -131
  605. data/lib/igniter/agents/proactive_agent.rb +0 -208
  606. data/lib/igniter/agents/reliability/retry_agent.rb +0 -99
  607. data/lib/igniter/agents/scheduling/cron_agent.rb +0 -110
  608. data/lib/igniter/agents.rb +0 -56
  609. data/lib/igniter/application/app_config.rb +0 -32
  610. data/lib/igniter/application/autoloader.rb +0 -18
  611. data/lib/igniter/application/generator.rb +0 -157
  612. data/lib/igniter/application/scheduler.rb +0 -109
  613. data/lib/igniter/application/yml_loader.rb +0 -39
  614. data/lib/igniter/application.rb +0 -174
  615. data/lib/igniter/capabilities.rb +0 -68
  616. data/lib/igniter/compiler/compiled_graph.rb +0 -180
  617. data/lib/igniter/compiler/graph_compiler.rb +0 -70
  618. data/lib/igniter/compiler/type_resolver.rb +0 -54
  619. data/lib/igniter/compiler/validation_context.rb +0 -61
  620. data/lib/igniter/compiler/validation_pipeline.rb +0 -32
  621. data/lib/igniter/compiler/validator.rb +0 -19
  622. data/lib/igniter/compiler/validators/await_validator.rb +0 -53
  623. data/lib/igniter/compiler/validators/callable_validator.rb +0 -125
  624. data/lib/igniter/compiler/validators/dependencies_validator.rb +0 -241
  625. data/lib/igniter/compiler/validators/outputs_validator.rb +0 -66
  626. data/lib/igniter/compiler/validators/remote_validator.rb +0 -60
  627. data/lib/igniter/compiler/validators/type_compatibility_validator.rb +0 -84
  628. data/lib/igniter/compiler/validators/uniqueness_validator.rb +0 -60
  629. data/lib/igniter/compiler.rb +0 -20
  630. data/lib/igniter/consensus/cluster.rb +0 -183
  631. data/lib/igniter/consensus/errors.rb +0 -14
  632. data/lib/igniter/consensus/executors.rb +0 -43
  633. data/lib/igniter/consensus/node.rb +0 -320
  634. data/lib/igniter/consensus/read_query.rb +0 -30
  635. data/lib/igniter/consensus/state_machine.rb +0 -58
  636. data/lib/igniter/consensus.rb +0 -58
  637. data/lib/igniter/content_addressing.rb +0 -133
  638. data/lib/igniter/dataflow/aggregate_operators.rb +0 -147
  639. data/lib/igniter/dataflow/aggregate_state.rb +0 -77
  640. data/lib/igniter/dataflow/diff.rb +0 -37
  641. data/lib/igniter/dataflow/diff_state.rb +0 -81
  642. data/lib/igniter/dataflow/incremental_collection_result.rb +0 -39
  643. data/lib/igniter/dataflow/window_filter.rb +0 -48
  644. data/lib/igniter/dataflow.rb +0 -65
  645. data/lib/igniter/diagnostics/auditing/report/console_formatter.rb +0 -80
  646. data/lib/igniter/diagnostics/auditing/report/markdown_formatter.rb +0 -22
  647. data/lib/igniter/diagnostics/introspection/formatters/mermaid_formatter.rb +0 -58
  648. data/lib/igniter/diagnostics/introspection/formatters/text_tree_formatter.rb +0 -44
  649. data/lib/igniter/diagnostics/report.rb +0 -349
  650. data/lib/igniter/diagnostics.rb +0 -8
  651. data/lib/igniter/differential/divergence.rb +0 -29
  652. data/lib/igniter/differential/formatter.rb +0 -96
  653. data/lib/igniter/differential/report.rb +0 -86
  654. data/lib/igniter/differential/runner.rb +0 -130
  655. data/lib/igniter/differential.rb +0 -51
  656. data/lib/igniter/dsl/contract_builder.rb +0 -495
  657. data/lib/igniter/dsl/schema_builder.rb +0 -73
  658. data/lib/igniter/dsl.rb +0 -9
  659. data/lib/igniter/effect.rb +0 -91
  660. data/lib/igniter/effect_registry.rb +0 -78
  661. data/lib/igniter/errors.rb +0 -79
  662. data/lib/igniter/events/bus.rb +0 -44
  663. data/lib/igniter/events/event.rb +0 -82
  664. data/lib/igniter/events.rb +0 -9
  665. data/lib/igniter/execution_report/builder.rb +0 -54
  666. data/lib/igniter/execution_report/formatter.rb +0 -50
  667. data/lib/igniter/execution_report/node_entry.rb +0 -24
  668. data/lib/igniter/execution_report/report.rb +0 -65
  669. data/lib/igniter/execution_report.rb +0 -32
  670. data/lib/igniter/executor.rb +0 -134
  671. data/lib/igniter/executor_registry.rb +0 -44
  672. data/lib/igniter/extensions/auditing/timeline.rb +0 -103
  673. data/lib/igniter/extensions/auditing.rb +0 -10
  674. data/lib/igniter/extensions/capabilities.rb +0 -39
  675. data/lib/igniter/extensions/content_addressing.rb +0 -5
  676. data/lib/igniter/extensions/dataflow.rb +0 -117
  677. data/lib/igniter/extensions/differential.rb +0 -114
  678. data/lib/igniter/extensions/execution_report.rb +0 -27
  679. data/lib/igniter/extensions/incremental.rb +0 -50
  680. data/lib/igniter/extensions/introspection/graph_formatter.rb +0 -103
  681. data/lib/igniter/extensions/introspection/plan_formatter.rb +0 -55
  682. data/lib/igniter/extensions/introspection/runtime_formatter.rb +0 -117
  683. data/lib/igniter/extensions/introspection.rb +0 -12
  684. data/lib/igniter/extensions/invariants.rb +0 -116
  685. data/lib/igniter/extensions/mesh.rb +0 -31
  686. data/lib/igniter/extensions/provenance.rb +0 -45
  687. data/lib/igniter/extensions/reactive/engine.rb +0 -83
  688. data/lib/igniter/extensions/reactive/matcher.rb +0 -21
  689. data/lib/igniter/extensions/reactive/reaction.rb +0 -18
  690. data/lib/igniter/extensions/reactive.rb +0 -12
  691. data/lib/igniter/extensions/saga.rb +0 -74
  692. data/lib/igniter/extensions.rb +0 -10
  693. data/lib/igniter/fingerprint.rb +0 -43
  694. data/lib/igniter/incremental/formatter.rb +0 -81
  695. data/lib/igniter/incremental/result.rb +0 -69
  696. data/lib/igniter/incremental/tracker.rb +0 -108
  697. data/lib/igniter/incremental.rb +0 -50
  698. data/lib/igniter/integrations/agents.rb +0 -18
  699. data/lib/igniter/integrations/llm/config.rb +0 -113
  700. data/lib/igniter/integrations/llm/context.rb +0 -74
  701. data/lib/igniter/integrations/llm/executor.rb +0 -352
  702. data/lib/igniter/integrations/llm/providers/anthropic.rb +0 -181
  703. data/lib/igniter/integrations/llm/providers/base.rb +0 -33
  704. data/lib/igniter/integrations/llm/providers/ollama.rb +0 -137
  705. data/lib/igniter/integrations/llm/providers/openai.rb +0 -182
  706. data/lib/igniter/integrations/llm/transcription/providers/assemblyai.rb +0 -200
  707. data/lib/igniter/integrations/llm/transcription/providers/base.rb +0 -122
  708. data/lib/igniter/integrations/llm/transcription/providers/deepgram.rb +0 -162
  709. data/lib/igniter/integrations/llm/transcription/providers/openai.rb +0 -102
  710. data/lib/igniter/integrations/llm/transcription/transcriber.rb +0 -145
  711. data/lib/igniter/integrations/llm/transcription/transcript_result.rb +0 -29
  712. data/lib/igniter/integrations/llm.rb +0 -95
  713. data/lib/igniter/integrations/rails/cable_adapter.rb +0 -49
  714. data/lib/igniter/integrations/rails/contract_job.rb +0 -76
  715. data/lib/igniter/integrations/rails/generators/contract/contract_generator.rb +0 -22
  716. data/lib/igniter/integrations/rails/generators/install/install_generator.rb +0 -33
  717. data/lib/igniter/integrations/rails/railtie.rb +0 -25
  718. data/lib/igniter/integrations/rails/webhook_concern.rb +0 -49
  719. data/lib/igniter/integrations/rails.rb +0 -12
  720. data/lib/igniter/invariant.rb +0 -50
  721. data/lib/igniter/memory/agent_memory.rb +0 -104
  722. data/lib/igniter/memory/episode.rb +0 -29
  723. data/lib/igniter/memory/fact.rb +0 -27
  724. data/lib/igniter/memory/memorable.rb +0 -90
  725. data/lib/igniter/memory/reflection_cycle.rb +0 -96
  726. data/lib/igniter/memory/reflection_record.rb +0 -28
  727. data/lib/igniter/memory/store.rb +0 -115
  728. data/lib/igniter/memory/stores/in_memory.rb +0 -136
  729. data/lib/igniter/memory/stores/sqlite.rb +0 -284
  730. data/lib/igniter/memory.rb +0 -80
  731. data/lib/igniter/mesh/announcer.rb +0 -55
  732. data/lib/igniter/mesh/config.rb +0 -45
  733. data/lib/igniter/mesh/discovery.rb +0 -39
  734. data/lib/igniter/mesh/errors.rb +0 -31
  735. data/lib/igniter/mesh/gossip.rb +0 -47
  736. data/lib/igniter/mesh/peer.rb +0 -21
  737. data/lib/igniter/mesh/peer_registry.rb +0 -51
  738. data/lib/igniter/mesh/poller.rb +0 -77
  739. data/lib/igniter/mesh/router.rb +0 -109
  740. data/lib/igniter/mesh.rb +0 -85
  741. data/lib/igniter/metrics/collector.rb +0 -131
  742. data/lib/igniter/metrics/prometheus_exporter.rb +0 -104
  743. data/lib/igniter/metrics/snapshot.rb +0 -8
  744. data/lib/igniter/metrics.rb +0 -37
  745. data/lib/igniter/model/aggregate_node.rb +0 -34
  746. data/lib/igniter/model/await_node.rb +0 -21
  747. data/lib/igniter/model/branch_node.rb +0 -46
  748. data/lib/igniter/model/collection_node.rb +0 -32
  749. data/lib/igniter/model/composition_node.rb +0 -22
  750. data/lib/igniter/model/compute_node.rb +0 -90
  751. data/lib/igniter/model/effect_node.rb +0 -37
  752. data/lib/igniter/model/graph.rb +0 -15
  753. data/lib/igniter/model/input_node.rb +0 -27
  754. data/lib/igniter/model/node.rb +0 -22
  755. data/lib/igniter/model/output_node.rb +0 -41
  756. data/lib/igniter/model/remote_node.rb +0 -42
  757. data/lib/igniter/model.rb +0 -18
  758. data/lib/igniter/node_cache.rb +0 -231
  759. data/lib/igniter/property_testing/formatter.rb +0 -66
  760. data/lib/igniter/property_testing/generators.rb +0 -115
  761. data/lib/igniter/property_testing/result.rb +0 -45
  762. data/lib/igniter/property_testing/run.rb +0 -43
  763. data/lib/igniter/property_testing/runner.rb +0 -47
  764. data/lib/igniter/property_testing.rb +0 -64
  765. data/lib/igniter/provenance/builder.rb +0 -97
  766. data/lib/igniter/provenance/lineage.rb +0 -82
  767. data/lib/igniter/provenance/node_trace.rb +0 -65
  768. data/lib/igniter/provenance/text_formatter.rb +0 -70
  769. data/lib/igniter/provenance.rb +0 -29
  770. data/lib/igniter/registry.rb +0 -67
  771. data/lib/igniter/replication/bootstrapper.rb +0 -61
  772. data/lib/igniter/replication/bootstrappers/gem.rb +0 -32
  773. data/lib/igniter/replication/bootstrappers/git.rb +0 -39
  774. data/lib/igniter/replication/bootstrappers/tarball.rb +0 -56
  775. data/lib/igniter/replication/expansion_plan.rb +0 -38
  776. data/lib/igniter/replication/expansion_planner.rb +0 -142
  777. data/lib/igniter/replication/manifest.rb +0 -45
  778. data/lib/igniter/replication/network_topology.rb +0 -123
  779. data/lib/igniter/replication/node_role.rb +0 -42
  780. data/lib/igniter/replication/reflective_replication_agent.rb +0 -238
  781. data/lib/igniter/replication/replication_agent.rb +0 -87
  782. data/lib/igniter/replication/role_registry.rb +0 -73
  783. data/lib/igniter/replication/ssh_session.rb +0 -77
  784. data/lib/igniter/replication.rb +0 -54
  785. data/lib/igniter/runtime/cache.rb +0 -126
  786. data/lib/igniter/runtime/collection_result.rb +0 -111
  787. data/lib/igniter/runtime/deferred_result.rb +0 -40
  788. data/lib/igniter/runtime/execution.rb +0 -416
  789. data/lib/igniter/runtime/input_validator.rb +0 -129
  790. data/lib/igniter/runtime/invalidator.rb +0 -52
  791. data/lib/igniter/runtime/job_worker.rb +0 -18
  792. data/lib/igniter/runtime/node_state.rb +0 -56
  793. data/lib/igniter/runtime/planner.rb +0 -126
  794. data/lib/igniter/runtime/resolver.rb +0 -758
  795. data/lib/igniter/runtime/result.rb +0 -117
  796. data/lib/igniter/runtime/runner_factory.rb +0 -20
  797. data/lib/igniter/runtime/runners/inline_runner.rb +0 -21
  798. data/lib/igniter/runtime/runners/store_runner.rb +0 -29
  799. data/lib/igniter/runtime/runners/thread_pool_runner.rb +0 -37
  800. data/lib/igniter/runtime/stores/active_record_store.rb +0 -53
  801. data/lib/igniter/runtime/stores/file_store.rb +0 -91
  802. data/lib/igniter/runtime/stores/memory_store.rb +0 -93
  803. data/lib/igniter/runtime/stores/redis_store.rb +0 -93
  804. data/lib/igniter/runtime.rb +0 -26
  805. data/lib/igniter/saga/compensation.rb +0 -31
  806. data/lib/igniter/saga/compensation_record.rb +0 -20
  807. data/lib/igniter/saga/executor.rb +0 -85
  808. data/lib/igniter/saga/formatter.rb +0 -49
  809. data/lib/igniter/saga/result.rb +0 -47
  810. data/lib/igniter/saga.rb +0 -56
  811. data/lib/igniter/server/client.rb +0 -166
  812. data/lib/igniter/server/config.rb +0 -34
  813. data/lib/igniter/server/handlers/base.rb +0 -105
  814. data/lib/igniter/server/handlers/contracts_handler.rb +0 -15
  815. data/lib/igniter/server/handlers/event_handler.rb +0 -32
  816. data/lib/igniter/server/handlers/execute_handler.rb +0 -43
  817. data/lib/igniter/server/handlers/health_handler.rb +0 -32
  818. data/lib/igniter/server/handlers/liveness_handler.rb +0 -20
  819. data/lib/igniter/server/handlers/manifest_handler.rb +0 -34
  820. data/lib/igniter/server/handlers/metrics_handler.rb +0 -51
  821. data/lib/igniter/server/handlers/peers_handler.rb +0 -115
  822. data/lib/igniter/server/handlers/readiness_handler.rb +0 -47
  823. data/lib/igniter/server/handlers/status_handler.rb +0 -27
  824. data/lib/igniter/server/http_server.rb +0 -146
  825. data/lib/igniter/server/rack_app.rb +0 -35
  826. data/lib/igniter/server/registry.rb +0 -56
  827. data/lib/igniter/server/router.rb +0 -108
  828. data/lib/igniter/server/server_logger.rb +0 -52
  829. data/lib/igniter/server.rb +0 -73
  830. data/lib/igniter/skill/feedback.rb +0 -116
  831. data/lib/igniter/skill/output_schema.rb +0 -110
  832. data/lib/igniter/skill.rb +0 -218
  833. data/lib/igniter/stream_loop.rb +0 -80
  834. data/lib/igniter/supervisor.rb +0 -167
  835. data/lib/igniter/temporal.rb +0 -84
  836. data/lib/igniter/tool/discoverable.rb +0 -151
  837. data/lib/igniter/tool.rb +0 -52
  838. data/lib/igniter/tool_registry.rb +0 -144
  839. data/lib/igniter/type_system.rb +0 -44
  840. /data/docs/{EXECUTION_MODEL_V2.md → dev/execution-model.md} +0 -0
@@ -1,758 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Igniter
4
- module Runtime
5
- class Resolver
6
- def initialize(execution)
7
- @execution = execution
8
- end
9
-
10
- def resolve(node_name)
11
- node = @execution.compiled_graph.fetch_node(node_name)
12
- resolution_status, cached = @execution.cache.begin_resolution(node)
13
- return cached if resolution_status == :cached
14
-
15
- @execution.events.emit(:node_started, node: node, status: :running)
16
-
17
- state = case node.kind
18
- when :input
19
- resolve_input(node)
20
- when :compute
21
- resolve_compute(node)
22
- when :composition
23
- resolve_composition(node)
24
- when :branch
25
- resolve_branch(node)
26
- when :collection
27
- resolve_collection(node)
28
- when :effect
29
- resolve_effect(node)
30
- when :await
31
- resolve_await(node)
32
- when :aggregate
33
- resolve_aggregate(node)
34
- when :remote
35
- resolve_remote(node)
36
- else
37
- raise ResolutionError, "Unsupported node kind: #{node.kind}"
38
- end
39
-
40
- @execution.cache.write(state)
41
- emit_resolution_event(node, state)
42
- state
43
- rescue PendingDependencyError => e
44
- state = NodeState.new(
45
- node: node,
46
- status: :pending,
47
- value: Runtime::DeferredResult.build(
48
- token: e.deferred_result.token,
49
- payload: e.deferred_result.payload,
50
- source_node: e.deferred_result.source_node,
51
- waiting_on: e.deferred_result.waiting_on || node.name
52
- )
53
- )
54
- @execution.cache.write(state)
55
- @execution.events.emit(:node_pending, node: node, status: :pending, payload: pending_payload(state))
56
- state
57
- rescue StandardError => e
58
- state = NodeState.new(node: node, status: :failed, error: normalize_error(e, node))
59
- @execution.cache.write(state)
60
- @execution.events.emit(:node_failed, node: node, status: :failed, payload: { error: state.error.message })
61
- state
62
- end
63
-
64
- private
65
-
66
- def resolve_input(node)
67
- NodeState.new(node: node, status: :succeeded, value: @execution.fetch_input!(node.name))
68
- end
69
-
70
- def resolve_aggregate(node)
71
- unless defined?(Igniter::Dataflow)
72
- raise ResolutionError,
73
- "Aggregate nodes require the dataflow extension. " \
74
- "Add: require 'igniter/extensions/dataflow'"
75
- end
76
-
77
- collection_result = resolve_dependency_value(node.source_collection)
78
- unless collection_result.respond_to?(:diff)
79
- raise ResolutionError,
80
- "Aggregate '#{node.name}' requires an incremental collection. " \
81
- "Ensure '#{node.source_collection}' uses mode: :incremental"
82
- end
83
-
84
- agg_state = @execution.aggregate_state_for(node.name)
85
- agg_state.apply_diff!(collection_result.diff, collection_result)
86
-
87
- NodeState.new(node: node, status: :succeeded, value: agg_state.value)
88
- end
89
-
90
- def resolve_effect(node)
91
- dependencies = node.dependencies.each_with_object({}) do |dep, memo|
92
- memo[dep] = resolve_dependency_value(dep)
93
- end
94
-
95
- value = node.adapter_class.new(
96
- execution: @execution,
97
- contract: @execution.contract_instance
98
- ).call(**dependencies)
99
-
100
- NodeState.new(node: node, status: :succeeded, value: value)
101
- end
102
-
103
- def resolve_await(node)
104
- deferred = Runtime::DeferredResult.build(
105
- payload: { event: node.event_name },
106
- source_node: node.name,
107
- waiting_on: node.name
108
- )
109
- raise PendingDependencyError.new(deferred, "Waiting for external event '#{node.event_name}'")
110
- end
111
-
112
- def resolve_remote(node) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
113
- unless defined?(Igniter::Server::Client)
114
- raise ResolutionError,
115
- "remote: nodes require `require 'igniter/server'` (server integration not loaded)"
116
- end
117
-
118
- url = resolve_remote_url(node)
119
-
120
- inputs = node.input_mapping.each_with_object({}) do |(child_input, dep_name), memo|
121
- memo[child_input] = resolve_dependency_value(dep_name)
122
- end
123
-
124
- client = Igniter::Server::Client.new(url, timeout: node.timeout)
125
- response = client.execute(node.contract_name, inputs: inputs)
126
-
127
- case response[:status]
128
- when :succeeded
129
- NodeState.new(node: node, status: :succeeded, value: response[:outputs])
130
- when :failed
131
- error_message = response.dig(:error, :message) || response.dig(:error, "message")
132
- raise ResolutionError,
133
- "Remote #{node.contract_name}@#{url}: #{error_message}"
134
- else
135
- raise ResolutionError,
136
- "Remote #{node.contract_name}@#{url}: unexpected status '#{response[:status]}'"
137
- end
138
- rescue Igniter::Server::Client::ConnectionError => e
139
- raise ResolutionError, "Cannot reach #{url}: #{e.message}"
140
- end
141
-
142
- # Resolve the target URL for a remote node based on its routing_mode.
143
- # :static → node_url directly
144
- # :capability → Mesh::Router selects an alive peer (raises DeferredCapabilityError if none)
145
- # :pinned → Mesh::Router asserts the peer is alive (raises IncidentError if not)
146
- def resolve_remote_url(node) # rubocop:disable Metrics/MethodLength
147
- case node.routing_mode
148
- when :static
149
- node.node_url
150
- when :capability
151
- unless defined?(Igniter::Mesh)
152
- raise ResolutionError,
153
- "remote :#{node.name} uses capability routing — add `require 'igniter/mesh'`"
154
- end
155
- deferred = Runtime::DeferredResult.build(
156
- payload: { capability: node.capability },
157
- source_node: node.name,
158
- waiting_on: node.name
159
- )
160
- Igniter::Mesh.router.find_peer_for(node.capability, deferred)
161
- when :pinned
162
- unless defined?(Igniter::Mesh)
163
- raise ResolutionError,
164
- "remote :#{node.name} uses pinned routing — add `require 'igniter/mesh'`"
165
- end
166
- Igniter::Mesh.router.resolve_pinned(node.pinned_to)
167
- end
168
- end
169
-
170
- def resolve_compute(node) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/PerceivedComplexity
171
- # Capability policy check — raises CapabilityViolationError if denied.
172
- check_capability_policy!(node)
173
-
174
- # Running state preserves dep_snapshot + value_version from the stale state.
175
- # These are used for memoization (skip recompute) and value backdating.
176
- running_state = @execution.cache.fetch(node.name)
177
- old_dep_snapshot = running_state&.dep_snapshot
178
- old_value = running_state&.value
179
- old_value_version = running_state&.value_version || 0
180
-
181
- # Resolve all dependencies (may recursively recompute upstream nodes).
182
- dependencies = node.dependencies.each_with_object({}) do |dependency_name, memo|
183
- memo[dependency_name] = resolve_dependency_value(dependency_name)
184
- end
185
-
186
- # Build snapshot of current dep value_versions (only regular nodes, not outputs).
187
- current_dep_snapshot = build_dep_snapshot(node)
188
-
189
- # Memoization: if all dep value_versions are unchanged, skip the compute entirely.
190
- if old_dep_snapshot && old_value && old_value_version.positive? &&
191
- dep_snapshot_match?(current_dep_snapshot, old_dep_snapshot)
192
- @execution.events.emit(:node_skipped, node: node, status: :succeeded,
193
- payload: { reason: :deps_unchanged })
194
- return NodeState.new(node: node, status: :succeeded, value: old_value,
195
- value_version: old_value_version,
196
- dep_snapshot: current_dep_snapshot)
197
- end
198
-
199
- # Content-addressed cache: pure executor + same dep values → reuse across executions.
200
- if (content_key = build_content_key(node, dependencies))
201
- cached_value = Igniter::ContentAddressing.cache.fetch(content_key)
202
- if cached_value
203
- @execution.events.emit(:node_content_cache_hit, node: node, status: :succeeded,
204
- payload: { key: content_key.to_s })
205
- return NodeState.new(node: node, status: :succeeded, value: cached_value,
206
- dep_snapshot: current_dep_snapshot)
207
- end
208
- end
209
-
210
- # TTL cache: any compute node + same dep fingerprint → reuse across executions.
211
- ttl_key = build_ttl_cache_key(node, dependencies)
212
- is_coalescing_leader = false
213
-
214
- if ttl_key
215
- if (cached_value = Igniter::NodeCache.cache.fetch(ttl_key))
216
- @execution.events.emit(:node_ttl_cache_hit, node: node, status: :succeeded,
217
- payload: { key: ttl_key.to_s })
218
- return NodeState.new(node: node, status: :succeeded, value: cached_value,
219
- dep_snapshot: current_dep_snapshot)
220
- end
221
-
222
- # Coalescing: if another execution is already computing this node for the same
223
- # inputs, join as a follower instead of duplicating the work.
224
- if node.coalesce? && (lock = Igniter::NodeCache.coalescing_lock)
225
- role, flight = lock.acquire(ttl_key.hex)
226
- if role == :follower
227
- coalesced_value, coalesced_error = lock.wait(flight)
228
- raise coalesced_error if coalesced_error
229
-
230
- # Follower timed out — coalesced_value is nil, fall through to compute independently
231
- unless coalesced_value.nil? && coalesced_error.nil? && !flight.done
232
- @execution.events.emit(:node_coalesced, node: node, status: :succeeded,
233
- payload: { key: ttl_key.to_s })
234
- return NodeState.new(node: node, status: :succeeded, value: coalesced_value,
235
- dep_snapshot: current_dep_snapshot)
236
- end
237
- else
238
- is_coalescing_leader = true
239
- end
240
- end
241
- end
242
-
243
- value = call_compute(node.callable, dependencies)
244
- if deferred_result?(value)
245
- return NodeState.new(node: node, status: :pending,
246
- value: normalize_deferred_result(value, node))
247
- end
248
-
249
- value = normalize_guard_value(node, value)
250
-
251
- # Value backdating: if the output is unchanged, preserve value_version so that
252
- # downstream nodes whose dep_snapshots reference this node won't see it as changed.
253
- if old_value && old_value_version.positive? && value == old_value
254
- @execution.events.emit(:node_backdated, node: node, status: :succeeded,
255
- payload: { reason: :value_unchanged })
256
- store_ttl_result(ttl_key, value, node, is_coalescing_leader)
257
- return NodeState.new(node: node, status: :succeeded, value: value,
258
- value_version: old_value_version,
259
- dep_snapshot: current_dep_snapshot)
260
- end
261
-
262
- # Store in content cache for future executions.
263
- Igniter::ContentAddressing.cache.store(content_key, value) if content_key
264
-
265
- # Store in TTL cache and notify any coalescing followers.
266
- store_ttl_result(ttl_key, value, node, is_coalescing_leader)
267
-
268
- NodeState.new(node: node, status: :succeeded, value: value,
269
- dep_snapshot: current_dep_snapshot)
270
- rescue StandardError => e
271
- # If this execution was the coalescing leader, notify followers of the failure
272
- # so they are unblocked (they will re-raise the error through their own path).
273
- Igniter::NodeCache.coalescing_lock&.finish!(ttl_key&.hex, error: e) if is_coalescing_leader
274
- raise
275
- end
276
-
277
- def call_compute(callable, dependencies)
278
- case callable
279
- when Proc
280
- callable.call(**dependencies)
281
- when Class
282
- call_compute_class(callable, dependencies)
283
- when Symbol, String
284
- @execution.contract_instance.public_send(callable.to_sym, **dependencies)
285
- else
286
- call_compute_object(callable, dependencies)
287
- end
288
- end
289
-
290
- def call_compute_class(callable, dependencies)
291
- if callable <= Igniter::Executor
292
- callable.new(execution: @execution, contract: @execution.contract_instance).call(**dependencies)
293
- elsif callable.respond_to?(:call)
294
- callable.call(**dependencies)
295
- else
296
- raise ResolutionError, "Unsupported callable: #{callable}"
297
- end
298
- end
299
-
300
- def call_compute_object(callable, dependencies)
301
- raise ResolutionError, "Unsupported callable: #{callable.class}" unless callable.respond_to?(:call)
302
-
303
- callable.call(**dependencies)
304
- end
305
-
306
- def resolve_composition(node)
307
- child_inputs = node.input_mapping.each_with_object({}) do |(child_input_name, dependency_name), memo|
308
- memo[child_input_name] = resolve_dependency_value(dependency_name)
309
- end
310
-
311
- child_contract = node.contract_class.new(child_inputs)
312
- child_contract.resolve_all
313
- child_error = child_contract.result.errors.values.first
314
- raise child_error if child_error
315
-
316
- NodeState.new(node: node, status: :succeeded, value: child_contract.result)
317
- end
318
-
319
- def resolve_branch(node)
320
- selector_value = resolve_dependency_value(node.selector_dependency)
321
- selected_case = node.cases.find { |entry| entry[:match] == selector_value }
322
- selected_contract = selected_case ? selected_case[:contract] : node.default_contract
323
- matched_case = selected_case ? selected_case[:match] : :default
324
-
325
- raise BranchSelectionError, "Branch '#{node.name}' has no matching case and no default" unless selected_contract
326
-
327
- context_values = node.context_dependencies.each_with_object({}) do |dependency_name, memo|
328
- memo[dependency_name] = resolve_dependency_value(dependency_name)
329
- end
330
-
331
- child_inputs = if node.input_mapper?
332
- map_branch_inputs(node, selector_value, context_values)
333
- else
334
- node.input_mapping.each_with_object({}) do |(child_input_name, dependency_name), memo|
335
- memo[child_input_name] = resolve_dependency_value(dependency_name)
336
- end
337
- end
338
-
339
- @execution.events.emit(
340
- :branch_selected,
341
- node: node,
342
- status: :succeeded,
343
- payload: {
344
- selector: node.selector_dependency,
345
- selector_value: selector_value,
346
- matched_case: matched_case,
347
- selected_contract: selected_contract.name || "AnonymousContract"
348
- }
349
- )
350
-
351
- child_contract = selected_contract.new(child_inputs)
352
- child_contract.resolve_all
353
- child_error = child_contract.result.errors.values.first
354
- raise child_error if child_error
355
-
356
- NodeState.new(node: node, status: :succeeded, value: child_contract.result)
357
- end
358
-
359
- def map_branch_inputs(node, selector_value, context_values)
360
- mapper = node.input_mapper
361
-
362
- if mapper.is_a?(Symbol) || mapper.is_a?(String)
363
- return @execution.contract_instance.public_send(mapper, selector: selector_value, **context_values)
364
- end
365
-
366
- mapper.call(selector: selector_value, **context_values)
367
- end
368
-
369
- def resolve_collection(node)
370
- return resolve_incremental_collection(node) if node.mode == :incremental
371
-
372
- items = resolve_dependency_value(node.source_dependency)
373
- context_values = node.context_dependencies.each_with_object({}) do |dependency_name, memo|
374
- memo[dependency_name] = resolve_dependency_value(dependency_name)
375
- end
376
- normalized_items = normalize_collection_items(node, items, context_values)
377
- collection_items = {}
378
-
379
- normalized_items.each do |item_inputs|
380
- item_key = extract_collection_key(node, item_inputs)
381
- emit_collection_item_event(:collection_item_started, node, item_key, item_inputs: item_inputs)
382
- child_contract = node.contract_class.new(item_inputs)
383
- begin
384
- child_contract.resolve_all
385
- rescue Igniter::Error
386
- nil
387
- end
388
- child_error = child_contract.execution.cache.values.find(&:failed?)&.error
389
-
390
- if child_error
391
- collection_items[item_key] = Runtime::CollectionResult::Item.new(
392
- key: item_key,
393
- status: :failed,
394
- error: child_error
395
- )
396
- emit_collection_item_event(
397
- :collection_item_failed,
398
- node,
399
- item_key,
400
- error: child_error.message,
401
- error_type: child_error.class.name,
402
- child_execution_id: child_contract.execution.events.execution_id
403
- )
404
- raise child_error if node.mode == :fail_fast
405
- else
406
- collection_items[item_key] = Runtime::CollectionResult::Item.new(
407
- key: item_key,
408
- status: :succeeded,
409
- result: child_contract.result
410
- )
411
- emit_collection_item_event(
412
- :collection_item_succeeded,
413
- node,
414
- item_key,
415
- child_execution_id: child_contract.execution.events.execution_id
416
- )
417
- end
418
- end
419
-
420
- NodeState.new(
421
- node: node,
422
- status: :succeeded,
423
- value: Runtime::CollectionResult.new(items: collection_items, mode: node.mode)
424
- )
425
- end
426
-
427
- def resolve_incremental_collection(node) # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
428
- unless defined?(Igniter::Dataflow)
429
- raise ResolutionError.new(
430
- "Collection '#{node.name}' uses mode: :incremental — " \
431
- "add `require 'igniter/extensions/dataflow'` to activate it",
432
- context: collection_context(node)
433
- )
434
- end
435
-
436
- items = resolve_dependency_value(node.source_dependency)
437
- context_values = node.context_dependencies.each_with_object({}) do |dep_name, memo|
438
- memo[dep_name] = resolve_dependency_value(dep_name)
439
- end
440
-
441
- normalized_items = normalize_collection_items(node, items, context_values)
442
- normalized_items = Igniter::Dataflow::WindowFilter.new(node.window).apply(normalized_items) if node.window
443
-
444
- diff_state = @execution.diff_state_for(node.name)
445
- key_fn = ->(item) { extract_collection_key(node, item) }
446
- diff = diff_state.compute_diff(normalized_items, key_fn)
447
-
448
- collection_items = {}
449
-
450
- # Reuse cached results for unchanged items (no child contract re-run)
451
- diff.unchanged.each do |key|
452
- cached = diff_state.cached_item_for(key)
453
- collection_items[key] = cached if cached
454
- emit_collection_item_event(:collection_item_reused, node, key)
455
- end
456
-
457
- # Retract removed items from the diff state
458
- diff.removed.each { |key| diff_state.retract!(key) }
459
-
460
- # Run child contracts only for added + changed items
461
- to_process = normalized_items.select { |item| diff.added.include?(key_fn.call(item)) || diff.changed.include?(key_fn.call(item)) }
462
-
463
- to_process.each do |item_inputs|
464
- item_key = key_fn.call(item_inputs)
465
- emit_collection_item_event(:collection_item_started, node, item_key, item_inputs: item_inputs)
466
- child_contract = node.contract_class.new(item_inputs)
467
- begin
468
- child_contract.resolve_all
469
- rescue Igniter::Error
470
- nil
471
- end
472
- child_error = child_contract.execution.cache.values.find(&:failed?)&.error
473
-
474
- result_item = if child_error
475
- emit_collection_item_event(:collection_item_failed, node, item_key, error: child_error.message, error_type: child_error.class.name, child_execution_id: child_contract.execution.events.execution_id)
476
- Runtime::CollectionResult::Item.new(key: item_key, status: :failed, error: child_error)
477
- else
478
- emit_collection_item_event(:collection_item_succeeded, node, item_key, child_execution_id: child_contract.execution.events.execution_id)
479
- Runtime::CollectionResult::Item.new(key: item_key, status: :succeeded, result: child_contract.result)
480
- end
481
-
482
- collection_items[item_key] = result_item
483
- diff_state.update!(item_key, item_inputs, result_item)
484
- end
485
-
486
- # Preserve the input array ordering in the result
487
- ordered_items = normalized_items.each_with_object({}) do |item_inputs, memo|
488
- key = key_fn.call(item_inputs)
489
- memo[key] = collection_items[key] if collection_items.key?(key)
490
- end
491
-
492
- NodeState.new(
493
- node: node,
494
- status: :succeeded,
495
- value: Igniter::Dataflow::IncrementalCollectionResult.new(items: ordered_items, diff: diff)
496
- )
497
- end
498
-
499
- def resolve_dependency_value(dependency_name)
500
- if @execution.compiled_graph.node?(dependency_name)
501
- dependency_state = resolve(dependency_name)
502
- raise dependency_state.error if dependency_state.failed?
503
-
504
- if dependency_state.pending?
505
- raise PendingDependencyError.new(dependency_state.value,
506
- context: pending_context(dependency_state.node))
507
- end
508
-
509
- dependency_state.value
510
- elsif @execution.compiled_graph.outputs_by_name.key?(dependency_name.to_sym)
511
- output = @execution.compiled_graph.fetch_output(dependency_name)
512
- value = @execution.send(:resolve_exported_output, output)
513
- raise PendingDependencyError, value if deferred_result?(value)
514
-
515
- value
516
- else
517
- raise ResolutionError, "Unknown dependency: #{dependency_name}"
518
- end
519
- end
520
-
521
- def deferred_result?(value)
522
- value.is_a?(Runtime::DeferredResult)
523
- end
524
-
525
- def normalize_deferred_result(value, node)
526
- Runtime::DeferredResult.build(
527
- token: value.token,
528
- payload: value.payload,
529
- source_node: value.source_node || node.name,
530
- waiting_on: value.waiting_on
531
- )
532
- end
533
-
534
- def emit_resolution_event(node, state)
535
- event_type =
536
- if state.failed?
537
- :node_failed
538
- elsif state.pending?
539
- :node_pending
540
- else
541
- :node_succeeded
542
- end
543
-
544
- payload = state.pending? ? pending_payload(state) : success_payload(node, state)
545
- @execution.events.emit(event_type, node: node, status: state.status, payload: payload)
546
- end
547
-
548
- def emit_collection_item_event(type, node, item_key, payload = {})
549
- @execution.events.emit(
550
- type,
551
- node: node,
552
- payload: payload.merge(item_key: item_key)
553
- )
554
- end
555
-
556
- def pending_payload(state)
557
- return {} unless state.value.is_a?(Runtime::DeferredResult)
558
-
559
- state.value.to_h
560
- end
561
-
562
- def pending_context(node)
563
- {
564
- graph: @execution.compiled_graph.name,
565
- node_id: node.id,
566
- node_name: node.name,
567
- node_path: node.path,
568
- source_location: node.source_location
569
- }
570
- end
571
-
572
- def success_payload(node, state)
573
- return {} unless %i[composition branch].include?(node.kind)
574
- return {} unless state.value.is_a?(Igniter::Runtime::Result)
575
-
576
- {
577
- child_execution_id: state.value.execution.events.execution_id,
578
- child_graph: state.value.execution.compiled_graph.name
579
- }
580
- end
581
-
582
- def normalize_error(error, node)
583
- # Trust any Igniter::Error that already carries node context.
584
- return error if error.is_a?(Igniter::Error) && error.node_name
585
-
586
- # Domain-specific subclasses (IncidentError, DeferredCapabilityError,
587
- # InvariantError, …) carry semantics the caller depends on — preserve
588
- # their type unchanged. Only bare Igniter::ResolutionError instances
589
- # (raised with just a message inside an executor) get enriched.
590
- return error if error.is_a?(Igniter::Error) && !error.instance_of?(Igniter::ResolutionError)
591
-
592
- node_context = {
593
- graph: @execution.compiled_graph.name,
594
- node_id: node.id,
595
- node_name: node.name,
596
- node_path: node.path,
597
- source_location: node.source_location,
598
- execution_id: @execution.events.execution_id
599
- }
600
-
601
- ResolutionError.new(error.message, context: node_context)
602
- end
603
-
604
- # ─── Capabilities ──────────────────────────────────────────────────────────
605
-
606
- def check_capability_policy!(node)
607
- return unless defined?(Igniter::Capabilities) && Igniter::Capabilities.policy
608
- return unless node.callable.is_a?(Class) && node.callable <= Igniter::Executor
609
-
610
- Igniter::Capabilities.policy.check!(node.name, node.callable)
611
- end
612
-
613
- # ─── Content addressing ────────────────────────────────────────────────────
614
-
615
- # Returns a ContentKey for pure executors when content addressing is loaded.
616
- # Returns nil for non-pure executors, Procs, or when the extension is absent.
617
- def build_content_key(node, dep_values)
618
- return unless defined?(Igniter::ContentAddressing)
619
- return unless node.callable.is_a?(Class) && node.callable <= Igniter::Executor
620
- return unless node.callable.pure?
621
-
622
- Igniter::ContentAddressing::ContentKey.compute(node.callable, dep_values)
623
- end
624
-
625
- # ─── TTL cache ─────────────────────────────────────────────────────────────
626
-
627
- # Returns a NodeCache::CacheKey when TTL caching is active for this node.
628
- # Returns nil when NodeCache is not loaded, no backend is configured,
629
- # or the node has no cache_ttl declared.
630
- def build_ttl_cache_key(node, dep_values)
631
- return unless defined?(Igniter::NodeCache)
632
- return unless Igniter::NodeCache.cache
633
- return unless node.respond_to?(:cache_ttl) && node.cache_ttl
634
-
635
- dep_hex = Igniter::NodeCache::Fingerprinter.call(dep_values)
636
- Igniter::NodeCache::CacheKey.new(
637
- @execution.compiled_graph.name,
638
- node.name,
639
- dep_hex
640
- )
641
- end
642
-
643
- # Stores a computed value in the TTL cache and signals any coalescing followers.
644
- def store_ttl_result(ttl_key, value, node, is_leader)
645
- return unless ttl_key
646
-
647
- Igniter::NodeCache.cache.store(ttl_key, value, ttl: node.cache_ttl)
648
- Igniter::NodeCache.coalescing_lock&.finish!(ttl_key.hex, value: value) if is_leader
649
- end
650
-
651
- def build_dep_snapshot(node)
652
- node.dependencies.each_with_object({}) do |dep_name, memo|
653
- next unless @execution.compiled_graph.node?(dep_name)
654
-
655
- dep_state = @execution.cache.fetch(dep_name.to_sym)
656
- memo[dep_name] = dep_state&.value_version
657
- end
658
- end
659
-
660
- def dep_snapshot_match?(current, old)
661
- return false if current.size != old.size
662
-
663
- current.all? { |name, vv| old[name] == vv }
664
- end
665
-
666
- def normalize_guard_value(node, value)
667
- return value unless node.respond_to?(:guard?) && node.guard?
668
- return true if value
669
-
670
- raise ResolutionError.new(
671
- node.metadata[:guard_message] || "Guard '#{node.name}' failed",
672
- context: {
673
- graph: @execution.compiled_graph.name,
674
- node_id: node.id,
675
- node_name: node.name,
676
- node_path: node.path,
677
- source_location: node.source_location
678
- }
679
- )
680
- end
681
-
682
- def normalize_collection_items(node, items, context_values = {})
683
- items = items.to_a if node.input_mapper? && items.is_a?(Hash)
684
-
685
- unless items.is_a?(Array)
686
- raise CollectionInputError.new(
687
- "Collection '#{node.name}' expects an array, got #{items.class}",
688
- context: collection_context(node)
689
- )
690
- end
691
-
692
- mapped_items = if node.input_mapper?
693
- items.map { |item| map_collection_item_inputs(node, item, context_values) }
694
- else
695
- items
696
- end
697
-
698
- mapped_items.each do |item|
699
- next if item.is_a?(Hash)
700
-
701
- raise CollectionInputError.new(
702
- "Collection '#{node.name}' expects item hashes, got #{item.class}",
703
- context: collection_context(node)
704
- )
705
- end
706
-
707
- ensure_unique_collection_keys!(node, mapped_items)
708
- mapped_items.map { |item| item.transform_keys(&:to_sym) }
709
- end
710
-
711
- def map_collection_item_inputs(node, item, context_values)
712
- mapper = node.input_mapper
713
-
714
- if mapper.is_a?(Symbol) || mapper.is_a?(String)
715
- return @execution.contract_instance.public_send(mapper, item: item, **context_values)
716
- end
717
-
718
- mapper.call(item: item, **context_values)
719
- end
720
-
721
- def extract_collection_key(node, item_inputs)
722
- item_inputs.fetch(node.key_name)
723
- rescue KeyError
724
- raise CollectionKeyError.new(
725
- "Collection '#{node.name}' item is missing key '#{node.key_name}'",
726
- context: collection_context(node)
727
- )
728
- end
729
-
730
- def ensure_unique_collection_keys!(node, items)
731
- keys = items.map do |item|
732
- item.fetch(node.key_name) do
733
- raise CollectionKeyError.new("Collection '#{node.name}' item is missing key '#{node.key_name}'",
734
- context: collection_context(node))
735
- end
736
- end
737
-
738
- duplicates = keys.group_by(&:itself).select { |_key, entries| entries.size > 1 }.keys
739
- return if duplicates.empty?
740
-
741
- raise CollectionKeyError.new(
742
- "Collection '#{node.name}' has duplicate keys: #{duplicates.join(", ")}",
743
- context: collection_context(node)
744
- )
745
- end
746
-
747
- def collection_context(node)
748
- {
749
- graph: @execution.compiled_graph.name,
750
- node_id: node.id,
751
- node_name: node.name,
752
- node_path: node.path,
753
- source_location: node.source_location
754
- }
755
- end
756
- end
757
- end
758
- end