phronomy 0.26.0 → 0.28.0

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 (557) hide show
  1. checksums.yaml +4 -4
  2. data/.mutant.yml +9 -9
  3. data/CHANGELOG.md +92 -0
  4. data/CONTRIBUTING.md +8 -8
  5. data/README.md +13 -3
  6. data/VERIFY.sh +27 -27
  7. data/benchmark/bench_agent_invoke.rb +26 -47
  8. data/benchmark/bench_context_assembler.rb +17 -15
  9. data/benchmark/bench_regression.rb +1 -1
  10. data/benchmark/bench_tool_schema.rb +1 -1
  11. data/docs/architecture/agent-chat-and-state-ownership.md +153 -0
  12. data/docs/architecture/agent-configuration-and-tool-binding.md +139 -0
  13. data/docs/architecture/agent-context.md +4 -2
  14. data/docs/architecture/agent-transition-ownership.md +13 -0
  15. data/docs/architecture/backend-groups.md +152 -0
  16. data/docs/architecture/before-llm-input.md +9 -3
  17. data/docs/architecture/context-management.md +31 -1
  18. data/docs/architecture/context-preparation-steps.md +90 -0
  19. data/docs/architecture/entry-action-and-team-wording.md +72 -0
  20. data/docs/architecture/execution-abstraction-review.md +88 -0
  21. data/docs/architecture/execution-boundaries.md +28 -0
  22. data/docs/architecture/execution-metadata-and-values.md +86 -0
  23. data/docs/architecture/generator-verifier-ownership.md +111 -0
  24. data/docs/architecture/multi-agent-handoff.md +11 -4
  25. data/docs/architecture/persistence-refactoring-plan.md +50 -0
  26. data/docs/architecture/persistence.md +45 -4
  27. data/docs/architecture/r8-unit1.md +104 -0
  28. data/docs/architecture/r8-unit10.md +72 -0
  29. data/docs/architecture/r8-unit11.md +71 -0
  30. data/docs/architecture/r8-unit12.md +67 -0
  31. data/docs/architecture/r8-unit13.md +61 -0
  32. data/docs/architecture/r8-unit14.md +72 -0
  33. data/docs/architecture/r8-unit15.md +65 -0
  34. data/docs/architecture/r8-unit16.md +54 -0
  35. data/docs/architecture/r8-unit17.md +73 -0
  36. data/docs/architecture/r8-unit18.md +92 -0
  37. data/docs/architecture/r8-unit19.md +61 -0
  38. data/docs/architecture/r8-unit2.md +55 -0
  39. data/docs/architecture/r8-unit20.md +51 -0
  40. data/docs/architecture/r8-unit21.md +79 -0
  41. data/docs/architecture/r8-unit22.md +74 -0
  42. data/docs/architecture/r8-unit23.md +81 -0
  43. data/docs/architecture/r8-unit3.md +130 -0
  44. data/docs/architecture/r8-unit4.md +79 -0
  45. data/docs/architecture/r8-unit5.md +115 -0
  46. data/docs/architecture/r8-unit6.md +71 -0
  47. data/docs/architecture/r8-unit7.md +70 -0
  48. data/docs/architecture/r8-unit8.md +78 -0
  49. data/docs/architecture/r8-unit9.md +73 -0
  50. data/docs/architecture/refactoring-closure.md +343 -0
  51. data/docs/architecture/remaining-refactoring-plan.md +390 -0
  52. data/docs/architecture/rubyllm-2-token-ownership.md +82 -0
  53. data/docs/architecture/storage-execution-boundaries.md +54 -0
  54. data/docs/architecture/tool-schema-recording-gap.md +56 -0
  55. data/docs/architecture/tracing.md +2 -2
  56. data/docs/architecture/workflow-terminal-ownership-design.md +104 -0
  57. data/docs/architecture.md +222 -0
  58. data/docs/decisions/014-unified-persistence-durable-state.md +11 -0
  59. data/docs/decisions/015-tool-public-facade-and-rbs-boundary.md +3 -3
  60. data/docs/decisions/024-event-loop-single-writer-agent-runtime.md +5 -1
  61. data/docs/decisions/025-process-local-agent-ownership-and-runtime-admission.md +13 -3
  62. data/docs/decisions/026-workflow-runtime-admission-and-durable-terminal-barrier.md +5 -1
  63. data/docs/decisions/027-llm-adapter-provider-boundary.md +2 -0
  64. data/docs/decisions/030-agent-handoff-domain-and-durable-responsibility.md +7 -0
  65. data/docs/decisions/031-durable-multi-agent-coordination.md +7 -0
  66. data/docs/decisions/032-storage-backend-composition.md +85 -0
  67. data/docs/decisions/033-domain-persistence-ownership.md +79 -0
  68. data/docs/decisions/034-handoff-runner-coordination-ownership.md +78 -0
  69. data/docs/decisions/035-tool-executor-capability-ownership.md +68 -0
  70. data/docs/decisions/036-context-contract-ownership.md +86 -0
  71. data/docs/decisions/037-common-definition-ownership.md +62 -0
  72. data/docs/decisions/038-responsibility-based-source-layout.md +145 -0
  73. data/docs/decisions/039-runtime-configuration-lifecycle-ownership.md +82 -0
  74. data/docs/decisions/040-configuration-default-composition.md +105 -0
  75. data/docs/decisions/041-feature-owned-identity-registries.md +100 -0
  76. data/docs/decisions/042-feature-owned-execution-state.md +106 -0
  77. data/docs/decisions/043-storage-execution-constraint-notifications.md +75 -0
  78. data/docs/decisions/044-agent-default-and-one-shot-composition.md +106 -0
  79. data/docs/decisions/045-worker-input-restriction-ownership.md +104 -0
  80. data/docs/decisions/046-agent-responsibility-layout-and-shared-records.md +110 -0
  81. data/docs/decisions/047-recovered-execution-continuation-contract.md +116 -0
  82. data/docs/decisions/048-dispatch-preparation-worker-ownership.md +120 -0
  83. data/docs/decisions/049-initial-preparation-worker-ownership.md +111 -0
  84. data/docs/decisions/050-approval-resume-snapshot-and-commit-ownership.md +98 -0
  85. data/docs/decisions/051-execution-outcome-worker-ownership.md +153 -0
  86. data/docs/decisions/052-tool-invocation-restoration-ownership.md +92 -0
  87. data/docs/decisions/053-shared-state-coordination-ownership.md +71 -0
  88. data/docs/decisions/054-workflow-terminal-save-single-owner.md +76 -0
  89. data/docs/decisions/055-terminal-observer-failure-settlement.md +60 -0
  90. data/docs/decisions/056-workflow-terminal-policy-ownership.md +87 -0
  91. data/docs/decisions/057-storage-transaction-boundaries.md +73 -0
  92. data/docs/decisions/058-neutral-storage-primitives.md +83 -0
  93. data/docs/decisions/059-backend-contracts-and-async-clients.md +74 -0
  94. data/docs/decisions/060-runtime-settings-and-application-configuration.md +86 -0
  95. data/docs/decisions/061-persistence-failure-contracts.md +89 -0
  96. data/docs/decisions/062-content-store-service.md +52 -0
  97. data/docs/decisions/063-execution-contracts-and-services.md +88 -0
  98. data/docs/decisions/064-agent-execution-and-multi-agent-responsibility.md +36 -0
  99. data/docs/decisions/065-vector-and-embeddings-common-operations.md +38 -0
  100. data/docs/decisions/066-llm-and-tool-operation-contracts.md +20 -0
  101. data/docs/decisions/067-agent-progress-and-engine-connection.md +29 -0
  102. data/docs/decisions/068-agent-tool-child-progress-and-tool-operation.md +36 -0
  103. data/docs/decisions/README.md +52 -6
  104. data/docs/design/durable-semantic-coordination/IMPLEMENTATION_DESIGN_V2.md +6 -0
  105. data/docs/design/durable-semantic-coordination/IMPLEMENTATION_REPORT.md +6 -0
  106. data/docs/execution-boundaries-preview.md +45 -0
  107. data/docs/features.md +16 -5
  108. data/docs/getting-started.md +11 -8
  109. data/docs/migrations/0.15.md +5 -0
  110. data/docs/migrations/0.22.md +2 -2
  111. data/docs/migrations/durable-semantic-coordination-v2.md +8 -0
  112. data/docs/migrations/handoff-runner-multi-agent.md +37 -0
  113. data/docs/migrations/neutral-storage-spi.md +43 -0
  114. data/docs/migrations/parallel-tool-chat-removal.md +49 -0
  115. data/docs/migrations/persistence-failure-contracts.md +67 -0
  116. data/docs/migrations/r8-unit10.md +36 -0
  117. data/docs/migrations/r8-unit11.md +33 -0
  118. data/docs/migrations/r8-unit12.md +31 -0
  119. data/docs/migrations/r8-unit13.md +36 -0
  120. data/docs/migrations/r8-unit14.md +31 -0
  121. data/docs/migrations/r8-unit15.md +31 -0
  122. data/docs/migrations/r8-unit16.md +26 -0
  123. data/docs/migrations/r8-unit17.md +28 -0
  124. data/docs/migrations/r8-unit18.md +29 -0
  125. data/docs/migrations/r8-unit19.md +28 -0
  126. data/docs/migrations/r8-unit20.md +24 -0
  127. data/docs/migrations/r8-unit21.md +28 -0
  128. data/docs/migrations/r8-unit22.md +29 -0
  129. data/docs/migrations/r8-unit23.md +20 -0
  130. data/docs/migrations/r8-unit4.md +67 -0
  131. data/docs/migrations/r8-unit5.md +75 -0
  132. data/docs/migrations/r8-unit6.md +109 -0
  133. data/docs/migrations/r8-unit7.md +31 -0
  134. data/docs/migrations/r8-unit8.md +33 -0
  135. data/docs/migrations/r8-unit9.md +28 -0
  136. data/docs/migrations/shared-state-multi-agent.md +44 -0
  137. data/docs/migrations/storage-async-client.md +103 -0
  138. data/docs/migrations/storage-backend-composition.md +117 -0
  139. data/docs/migrations/storage-transaction-boundaries.md +74 -0
  140. data/docs/migrations/vector-async-clients.md +110 -0
  141. data/docs/persistence-backends.md +190 -215
  142. data/docs/runtime-and-concurrency.md +142 -32
  143. data/lib/phronomy/agent/admission.rb +78 -0
  144. data/lib/phronomy/{agent_already_exists_error.rb → agent/agent_already_exists_error.rb} +2 -0
  145. data/lib/phronomy/{agent_busy_error.rb → agent/agent_busy_error.rb} +2 -0
  146. data/lib/phronomy/{agent_purged_error.rb → agent/agent_purged_error.rb} +2 -0
  147. data/lib/phronomy/agent/api/agent.rb +17 -0
  148. data/lib/phronomy/{execution_rehydration_required_error.rb → agent/api/execution_rehydration_required_error.rb} +2 -0
  149. data/lib/phronomy/agent/async_event_api.rb +38 -33
  150. data/lib/phronomy/agent/base.rb +106 -294
  151. data/lib/phronomy/agent/before_llm_input.rb +64 -0
  152. data/lib/phronomy/{agent.rb → agent/composition/run_once.rb} +4 -13
  153. data/lib/phronomy/agent/context_candidate_resolver.rb +2 -2
  154. data/lib/phronomy/agent/context_importer.rb +2 -2
  155. data/lib/phronomy/agent/{context_assembler.rb → context_preparation.rb} +157 -288
  156. data/lib/phronomy/agent/control_request.rb +21 -0
  157. data/lib/phronomy/agent/{agent_execution.rb → execution/agent_execution.rb} +8 -4
  158. data/lib/phronomy/agent/{agent_invocation.rb → execution/agent_invocation.rb} +32 -63
  159. data/lib/phronomy/agent/execution/approval_resume_commit.rb +108 -0
  160. data/lib/phronomy/agent/execution/dispatch_preparation.rb +195 -0
  161. data/lib/phronomy/agent/{exact_execution.rb → execution/exact_execution.rb} +43 -23
  162. data/lib/phronomy/agent/{execution_cancellation.rb → execution/execution_cancellation.rb} +8 -5
  163. data/lib/phronomy/agent/execution/execution_coordinator.rb +1744 -0
  164. data/lib/phronomy/agent/execution/execution_failure.rb +30 -0
  165. data/lib/phronomy/agent/execution/execution_metadata.rb +54 -0
  166. data/lib/phronomy/agent/execution/execution_outcome_committer.rb +288 -0
  167. data/lib/phronomy/agent/execution/execution_registry.rb +463 -0
  168. data/lib/phronomy/agent/execution/execution_session_runner.rb +113 -0
  169. data/lib/phronomy/agent/execution/initial_preparation.rb +323 -0
  170. data/lib/phronomy/agent/execution/invocation_actions.rb +368 -0
  171. data/lib/phronomy/agent/execution/invocation_transitions.rb +124 -0
  172. data/lib/phronomy/agent/execution/runtime_record_encoder.rb +210 -0
  173. data/lib/phronomy/agent/execution_change.rb +161 -0
  174. data/lib/phronomy/agent/execution_environment.rb +36 -0
  175. data/lib/phronomy/agent/execution_extension_state.rb +21 -0
  176. data/lib/phronomy/agent/execution_observation.rb +35 -0
  177. data/lib/phronomy/agent/filterable.rb +182 -0
  178. data/lib/phronomy/agent/{handoff_context.rb → handoff/transfer_context.rb} +6 -6
  179. data/lib/phronomy/agent/{handoff_projection.rb → handoff/transfer_projection.rb} +14 -33
  180. data/lib/phronomy/agent/handoff_error.rb +7 -0
  181. data/lib/phronomy/agent/{journal_projection.rb → journal/journal_projection.rb} +4 -0
  182. data/lib/phronomy/agent/{journal_record.rb → journal/journal_record.rb} +3 -3
  183. data/lib/phronomy/agent/{llm_call_record.rb → journal/llm_call_record.rb} +2 -2
  184. data/lib/phronomy/agent/knowledge_item.rb +13 -0
  185. data/lib/phronomy/agent/{agent_root.rb → lifecycle/agent_root.rb} +6 -2
  186. data/lib/phronomy/agent/lifecycle/default_persistence.rb +29 -0
  187. data/lib/phronomy/{engine/runtime/agent_ownership_registry.rb → agent/lifecycle/ownership_registry.rb} +24 -15
  188. data/lib/phronomy/agent/persistence/agent_repository.rb +69 -0
  189. data/lib/phronomy/agent/persistence/cancellation_repository.rb +51 -0
  190. data/lib/phronomy/agent/persistence/codec.rb +338 -0
  191. data/lib/phronomy/agent/persistence/execution_repository.rb +124 -0
  192. data/lib/phronomy/agent/persistence/journal_repository.rb +63 -0
  193. data/lib/phronomy/agent/persistence/records.rb +33 -0
  194. data/lib/phronomy/agent/persistence/retention_repository.rb +70 -0
  195. data/lib/phronomy/agent/persistence/storage_schema.rb +29 -0
  196. data/lib/phronomy/agent/persistence/watermark.rb +29 -0
  197. data/lib/phronomy/agent/recovery/invocation_restorer.rb +124 -0
  198. data/lib/phronomy/agent/{recovery_coordinator → recovery/recovery_coordinator}/continuation.rb +28 -51
  199. data/lib/phronomy/agent/{recovery_coordinator → recovery/recovery_coordinator}/installation.rb +50 -55
  200. data/lib/phronomy/agent/{recovery_coordinator → recovery/recovery_coordinator}/resolution.rb +38 -43
  201. data/lib/phronomy/agent/{recovery_coordinator.rb → recovery/recovery_coordinator.rb} +26 -23
  202. data/lib/phronomy/agent/recovery/recovery_rules.rb +119 -0
  203. data/lib/phronomy/agent/recovery/recovery_support.rb +224 -0
  204. data/lib/phronomy/agent/reserved_execution.rb +16 -0
  205. data/lib/phronomy/agent/retention.rb +17 -0
  206. data/lib/phronomy/agent/runtime_binding/engine_environment.rb +60 -0
  207. data/lib/phronomy/agent/runtime_binding/engine_session_builder.rb +34 -0
  208. data/lib/phronomy/agent/runtime_binding/phase_machine_builder.rb +64 -0
  209. data/lib/phronomy/agent/runtime_binding/tool_session_builder.rb +34 -0
  210. data/lib/phronomy/agent/{ruby_llm_materializer.rb → runtime_input.rb} +19 -39
  211. data/lib/phronomy/agent/saved_context_reader.rb +55 -0
  212. data/lib/phronomy/agent/settings.rb +47 -0
  213. data/lib/phronomy/agent/state_writer.rb +166 -0
  214. data/lib/phronomy/agent/store.rb +253 -0
  215. data/lib/phronomy/{stream_callback_error.rb → agent/stream_callback_error.rb} +2 -0
  216. data/lib/phronomy/agent/{approval_evaluation_request.rb → tool_execution/approval_evaluation_request.rb} +1 -12
  217. data/lib/phronomy/agent/{tool_approval_request.rb → tool_execution/tool_approval_request.rb} +1 -10
  218. data/lib/phronomy/agent/tool_execution/tool_binding.rb +30 -0
  219. data/lib/phronomy/agent/{tool_invocation.rb → tool_execution/tool_invocation.rb} +114 -248
  220. data/lib/phronomy/agent/tool_execution/tool_invocation_actions.rb +107 -0
  221. data/lib/phronomy/agent/tool_execution/tool_invocation_transitions.rb +70 -0
  222. data/lib/phronomy/common/configuration_error.rb +7 -0
  223. data/lib/phronomy/common/error.rb +5 -0
  224. data/lib/phronomy/{agent → common/values}/immutable.rb +9 -1
  225. data/lib/phronomy/common/values/serializable.rb +32 -0
  226. data/lib/phronomy/configuration/runtime_settings.rb +49 -0
  227. data/lib/phronomy/content_store/storage_schema.rb +12 -0
  228. data/lib/phronomy/content_store/stored_contents.rb +44 -0
  229. data/lib/phronomy/context/assembly.rb +202 -0
  230. data/lib/phronomy/{context_budget_exceeded_error.rb → context/budget_exceeded_error.rb} +5 -1
  231. data/lib/phronomy/context/candidate.rb +51 -0
  232. data/lib/phronomy/context/constraint.rb +47 -0
  233. data/lib/phronomy/{agent → context}/context_plan.rb +2 -2
  234. data/lib/phronomy/{agent → context}/context_plan_validator.rb +3 -3
  235. data/lib/phronomy/{agent → context}/context_policy.rb +1 -1
  236. data/lib/phronomy/{agent → context}/context_policy_input.rb +7 -7
  237. data/lib/phronomy/{agent → context}/context_policy_input_builder.rb +1 -1
  238. data/lib/phronomy/context/default_policy.rb +140 -0
  239. data/lib/phronomy/context/final_budget_validator.rb +33 -0
  240. data/lib/phronomy/{agent → context}/llm_input_build_context.rb +2 -2
  241. data/lib/phronomy/{agent → context}/llm_input_manifest.rb +21 -21
  242. data/lib/phronomy/{agent → context}/llm_input_patch.rb +3 -3
  243. data/lib/phronomy/context/manifest_error.rb +10 -0
  244. data/lib/phronomy/context/prompt_template.rb +98 -0
  245. data/lib/phronomy/{vector_store → documents}/loader/base.rb +1 -1
  246. data/lib/phronomy/{vector_store → documents}/loader/csv_loader.rb +2 -2
  247. data/lib/phronomy/{vector_store → documents}/loader/markdown_loader.rb +3 -3
  248. data/lib/phronomy/{vector_store → documents}/loader/plain_text_loader.rb +2 -2
  249. data/lib/phronomy/{vector_store → documents}/splitter/base.rb +1 -1
  250. data/lib/phronomy/{vector_store → documents}/splitter/fixed_size_splitter.rb +2 -2
  251. data/lib/phronomy/{vector_store → documents}/splitter/recursive_splitter.rb +2 -2
  252. data/lib/phronomy/embeddings/async/async_client.rb +44 -0
  253. data/lib/phronomy/embeddings/backends/ruby_llm_embeddings.rb +48 -0
  254. data/lib/phronomy/embeddings/base.rb +43 -0
  255. data/lib/phronomy/embeddings/invalid_result_error.rb +11 -0
  256. data/lib/phronomy/embeddings/transport_error.rb +11 -0
  257. data/lib/phronomy/engine/concurrency/offload_pool.rb +39 -20
  258. data/lib/phronomy/engine/concurrency/pool_registry.rb +47 -12
  259. data/lib/phronomy/{diagnostics.rb → engine/diagnostics.rb} +1 -1
  260. data/lib/phronomy/engine/event_loop.rb +164 -630
  261. data/lib/phronomy/engine/execution_binding.rb +23 -0
  262. data/lib/phronomy/engine/execution_receiver_binding.rb +43 -0
  263. data/lib/phronomy/engine/fsm_protocol.rb +9 -0
  264. data/lib/phronomy/engine/fsm_session.rb +37 -30
  265. data/lib/phronomy/engine/metrics.rb +28 -0
  266. data/lib/phronomy/engine/runtime/timer_queue.rb +1 -1
  267. data/lib/phronomy/engine/runtime.rb +104 -95
  268. data/lib/phronomy/engine/terminal_decision.rb +7 -0
  269. data/lib/phronomy/execution/async_operation.rb +41 -0
  270. data/lib/phronomy/execution/backpressure_error.rb +7 -0
  271. data/lib/phronomy/{blocking.rb → execution/blocking.rb} +2 -2
  272. data/lib/phronomy/execution/cancellation_error.rb +7 -0
  273. data/lib/phronomy/{engine → execution}/concurrency/cancellation_token.rb +5 -1
  274. data/lib/phronomy/{engine → execution}/concurrency/deadline.rb +0 -17
  275. data/lib/phronomy/{engine → execution}/concurrency/physical_completion_task.rb +1 -1
  276. data/lib/phronomy/{engine → execution}/concurrency/result_collector.rb +1 -1
  277. data/lib/phronomy/{engine → execution}/concurrency/result_composition.rb +33 -12
  278. data/lib/phronomy/{engine/concurrency/subscriptions.rb → execution/concurrency/result_subscriptions.rb} +14 -18
  279. data/lib/phronomy/execution/concurrency/subscriptions.rb +25 -0
  280. data/lib/phronomy/execution/concurrency/worker_input_restricted.rb +14 -0
  281. data/lib/phronomy/execution/event_loop_reentrancy_error.rb +8 -0
  282. data/lib/phronomy/{execution.rb → execution/execution.rb} +57 -30
  283. data/lib/phronomy/{execution_cancellation_error.rb → execution/execution_cancellation_error.rb} +2 -0
  284. data/lib/phronomy/execution/execution_receiver.rb +78 -0
  285. data/lib/phronomy/execution/execution_scope_state.rb +35 -0
  286. data/lib/phronomy/{execution_timeout_error.rb → execution/execution_timeout_error.rb} +2 -0
  287. data/lib/phronomy/{invalid_async_entry_action_error.rb → execution/invalid_async_entry_action_error.rb} +2 -0
  288. data/lib/phronomy/{invalid_async_transition_action_error.rb → execution/invalid_async_transition_action_error.rb} +2 -0
  289. data/lib/phronomy/{invalid_async_workflow_action_error.rb → execution/invalid_async_workflow_action_error.rb} +2 -0
  290. data/lib/phronomy/{invocation_context.rb → execution/invocation_context.rb} +0 -15
  291. data/lib/phronomy/execution/invocation_controls.rb +73 -0
  292. data/lib/phronomy/execution/pool_shutdown_error.rb +7 -0
  293. data/lib/phronomy/execution/recursion_limit_error.rb +7 -0
  294. data/lib/phronomy/execution/runnable.rb +24 -0
  295. data/lib/phronomy/execution/runtime_shutdown_error.rb +7 -0
  296. data/lib/phronomy/execution/runtime_shutdown_reentrancy_error.rb +7 -0
  297. data/lib/phronomy/execution/scheduler_reentrancy_error.rb +9 -0
  298. data/lib/phronomy/{engine → execution}/task_result.rb +7 -3
  299. data/lib/phronomy/execution/timeout_error.rb +7 -0
  300. data/lib/phronomy/execution/wait_policy.rb +24 -0
  301. data/lib/phronomy/filter/filter_block_error.rb +14 -0
  302. data/lib/phronomy/generation/generator_verifier/agent_operation.rb +65 -0
  303. data/lib/phronomy/generation/generator_verifier/agent_result_receiver.rb +89 -0
  304. data/lib/phronomy/generation/generator_verifier/default_parser.rb +27 -0
  305. data/lib/phronomy/generation/generator_verifier/pipeline_state.rb +57 -0
  306. data/lib/phronomy/generation/generator_verifier/workflow_builder.rb +112 -0
  307. data/lib/phronomy/generation/generator_verifier.rb +118 -0
  308. data/lib/phronomy/generation/low_confidence_error.rb +14 -0
  309. data/lib/phronomy/llm_adapter/async/async_client.rb +47 -0
  310. data/lib/phronomy/llm_adapter/authentication_error.rb +9 -0
  311. data/lib/phronomy/llm_adapter/backends/ruby_llm.rb +183 -0
  312. data/lib/phronomy/llm_adapter/base.rb +49 -68
  313. data/lib/phronomy/llm_adapter/context_length_error.rb +9 -0
  314. data/lib/phronomy/llm_adapter/invalid_result_error.rb +10 -0
  315. data/lib/phronomy/llm_adapter/message.rb +62 -0
  316. data/lib/phronomy/llm_adapter/rate_limit_error.rb +9 -0
  317. data/lib/phronomy/llm_adapter/request.rb +79 -0
  318. data/lib/phronomy/llm_adapter/response.rb +36 -0
  319. data/lib/phronomy/llm_adapter/stream_chunk.rb +18 -0
  320. data/lib/phronomy/llm_adapter/token_usage.rb +64 -0
  321. data/lib/phronomy/llm_adapter/transport_error.rb +9 -0
  322. data/lib/phronomy/llm_adapter.rb +3 -16
  323. data/lib/phronomy/llm_context_window/token_budget.rb +6 -7
  324. data/lib/phronomy/multi_agent/admission_registry.rb +15 -2
  325. data/lib/phronomy/multi_agent/durable_subagent_coordinator.rb +108 -84
  326. data/lib/phronomy/multi_agent/execution_environment.rb +29 -0
  327. data/lib/phronomy/{agent → multi_agent}/handoff.rb +2 -2
  328. data/lib/phronomy/{agent → multi_agent}/handoff_capability_factory.rb +21 -2
  329. data/lib/phronomy/multi_agent/handoff_participant.rb +79 -0
  330. data/lib/phronomy/{agent → multi_agent}/handoff_policy.rb +1 -1
  331. data/lib/phronomy/multi_agent/handoff_runner.rb +156 -0
  332. data/lib/phronomy/{agent → multi_agent}/handoff_state.rb +2 -2
  333. data/lib/phronomy/multi_agent/orchestrator.rb +61 -75
  334. data/lib/phronomy/multi_agent/persistence/codec.rb +75 -0
  335. data/lib/phronomy/multi_agent/persistence/handoff_state_repository.rb +77 -0
  336. data/lib/phronomy/multi_agent/persistence/records.rb +27 -0
  337. data/lib/phronomy/multi_agent/persistence/storage_schema.rb +21 -0
  338. data/lib/phronomy/multi_agent/persistence/team_execution_repository.rb +124 -0
  339. data/lib/phronomy/multi_agent/persistence/team_repository.rb +69 -0
  340. data/lib/phronomy/multi_agent/reserved_child_admission.rb +88 -0
  341. data/lib/phronomy/multi_agent/runtime_binding/engine_environment.rb +35 -0
  342. data/lib/phronomy/{agent → multi_agent}/shared_state.rb +56 -39
  343. data/lib/phronomy/multi_agent/store.rb +156 -0
  344. data/lib/phronomy/multi_agent/team_coordinator.rb +87 -75
  345. data/lib/phronomy/multi_agent/team_execution.rb +1 -1
  346. data/lib/phronomy/{engine/runtime → multi_agent}/team_ownership_registry.rb +5 -5
  347. data/lib/phronomy/multi_agent/team_root.rb +1 -1
  348. data/lib/phronomy/output_parser/parse_error.rb +7 -0
  349. data/lib/phronomy/persistence/content_repository.rb +26 -0
  350. data/lib/phronomy/persistence/errors.rb +16 -0
  351. data/lib/phronomy/persistence/migration/initial_format_migration.rb +21 -21
  352. data/lib/phronomy/persistence/persistence.rb +23 -0
  353. data/lib/phronomy/persistence/save_outcome.rb +24 -0
  354. data/lib/phronomy/persistence/snapshot_comparison.rb +81 -0
  355. data/lib/phronomy/persistence/storage_boundary.rb +32 -0
  356. data/lib/phronomy/persistence/transaction.rb +86 -0
  357. data/lib/phronomy/persistence_composition/storage_schema.rb +29 -0
  358. data/lib/phronomy/persistence_composition/stores.rb +34 -0
  359. data/lib/phronomy/persistence_composition/unit4_migration.rb +276 -0
  360. data/lib/phronomy/runtime_composition/agent_defaults.rb +11 -0
  361. data/lib/phronomy/runtime_composition/configuration.rb +146 -0
  362. data/lib/phronomy/runtime_composition/configuration_defaults.rb +9 -0
  363. data/lib/phronomy/runtime_composition/evaluation_defaults.rb +7 -0
  364. data/lib/phronomy/runtime_composition/execution_defaults.rb +5 -0
  365. data/lib/phronomy/runtime_composition/generation_defaults.rb +6 -0
  366. data/lib/phronomy/runtime_composition/global_configuration.rb +38 -0
  367. data/lib/phronomy/runtime_composition/global_runtime.rb +19 -0
  368. data/lib/phronomy/runtime_composition/multi_agent_defaults.rb +9 -0
  369. data/lib/phronomy/runtime_composition/workflow_defaults.rb +4 -0
  370. data/lib/phronomy/storage/async/async_client.rb +60 -0
  371. data/lib/phronomy/storage/backend.rb +107 -0
  372. data/lib/phronomy/storage/backends/in_memory.rb +157 -0
  373. data/lib/phronomy/storage/blob_conflict_error.rb +10 -0
  374. data/lib/phronomy/storage/blobs.rb +31 -0
  375. data/lib/phronomy/storage/condition.rb +25 -0
  376. data/lib/phronomy/storage/condition_failed_error.rb +16 -0
  377. data/lib/phronomy/storage/conflict_error.rb +9 -0
  378. data/lib/phronomy/{persistence → storage}/durable_record.rb +12 -12
  379. data/lib/phronomy/storage/entry.rb +33 -0
  380. data/lib/phronomy/storage/guard_ref.rb +13 -0
  381. data/lib/phronomy/storage/not_found_error.rb +9 -0
  382. data/lib/phronomy/storage/record_codec.rb +177 -0
  383. data/lib/phronomy/storage/records.rb +61 -0
  384. data/lib/phronomy/storage/resource.rb +126 -0
  385. data/lib/phronomy/storage/scope.rb +25 -0
  386. data/lib/phronomy/storage/serialization_error.rb +9 -0
  387. data/lib/phronomy/storage/streams.rb +44 -0
  388. data/lib/phronomy/storage/transaction_error.rb +10 -0
  389. data/lib/phronomy/storage/unique_constraint_error.rb +17 -0
  390. data/lib/phronomy/storage/unsupported_backend_error.rb +9 -0
  391. data/lib/phronomy/storage/validation.rb +53 -0
  392. data/lib/phronomy/storage/view.rb +131 -0
  393. data/lib/phronomy/testing/eval/metrics.rb +1 -1
  394. data/lib/phronomy/testing/eval/scorer/llm_judge.rb +19 -3
  395. data/lib/phronomy/testing/persistence_contract/a_content_store.rb +1 -1
  396. data/lib/phronomy/testing/persistence_contract/a_journal_repository.rb +2 -2
  397. data/lib/phronomy/testing/persistence_contract/a_persistence_backend.rb +54 -48
  398. data/lib/phronomy/testing/persistence_contract/a_workflow_state_repository.rb +1 -1
  399. data/lib/phronomy/testing/persistence_contract/an_agent_repository.rb +1 -1
  400. data/lib/phronomy/testing/persistence_contract/an_execution_repository.rb +5 -5
  401. data/lib/phronomy/testing/persistence_contract/coordination_repositories.rb +52 -46
  402. data/lib/phronomy/testing/persistence_contract/neutral_storage_primitives.rb +263 -0
  403. data/lib/phronomy/testing/persistence_contract/storage_transaction_boundaries.rb +124 -0
  404. data/lib/phronomy/testing/persistence_contract.rb +4 -0
  405. data/lib/phronomy/tool/authorization.rb +77 -0
  406. data/lib/phronomy/tool/base.rb +549 -9
  407. data/lib/phronomy/tool/call_request.rb +40 -0
  408. data/lib/phronomy/{agent/tool_definition_set.rb → tool/definition_set.rb} +16 -12
  409. data/lib/phronomy/tool/operation.rb +88 -0
  410. data/lib/phronomy/tool/schema.rb +214 -0
  411. data/lib/phronomy/tool/settings.rb +31 -0
  412. data/lib/phronomy/tool/tool_error.rb +7 -0
  413. data/lib/phronomy/{agent → tool}/tool_executor.rb +10 -7
  414. data/lib/phronomy/tools/agent.rb +22 -90
  415. data/lib/phronomy/tools/mcp.rb +21 -14
  416. data/lib/phronomy/tools/vector_search.rb +4 -4
  417. data/lib/phronomy/tracing/automatic.rb +11 -6
  418. data/lib/phronomy/tracing/base.rb +1 -1
  419. data/lib/phronomy/tracing/observation.rb +37 -0
  420. data/lib/phronomy/tracing/settings.rb +36 -0
  421. data/lib/phronomy/vector_store/{async_backend.rb → async/async_client.rb} +35 -29
  422. data/lib/phronomy/vector_store/{in_memory.rb → backends/in_memory.rb} +12 -10
  423. data/lib/phronomy/vector_store/{pgvector.rb → backends/pgvector.rb} +44 -16
  424. data/lib/phronomy/vector_store/{redis_search.rb → backends/redis_search.rb} +74 -37
  425. data/lib/phronomy/vector_store/base.rb +118 -49
  426. data/lib/phronomy/vector_store/invalid_result_error.rb +12 -0
  427. data/lib/phronomy/vector_store.rb +2 -17
  428. data/lib/phronomy/version.rb +1 -1
  429. data/lib/phronomy/workflow/completion.rb +11 -0
  430. data/lib/phronomy/{workflow.rb → workflow/execution/workflow.rb} +10 -8
  431. data/lib/phronomy/workflow/execution/workflow_action_rules.rb +67 -0
  432. data/lib/phronomy/{workflow_context.rb → workflow/execution/workflow_context.rb} +5 -1
  433. data/lib/phronomy/workflow/execution/workflow_context_ownership_error.rb +7 -0
  434. data/lib/phronomy/workflow/execution/workflow_execution_environment.rb +27 -0
  435. data/lib/phronomy/workflow/execution/workflow_execution_registry.rb +186 -0
  436. data/lib/phronomy/{workflow_runner.rb → workflow/execution/workflow_runner.rb} +145 -115
  437. data/lib/phronomy/workflow/execution/workflow_settings.rb +28 -0
  438. data/lib/phronomy/workflow/persistence/codec.rb +153 -0
  439. data/lib/phronomy/workflow/persistence/state_repository.rb +63 -0
  440. data/lib/phronomy/workflow/persistence/storage_schema.rb +13 -0
  441. data/lib/phronomy/workflow/runtime_binding/workflow_engine_environment.rb +38 -0
  442. data/lib/phronomy/workflow/runtime_binding/workflow_phase_machine_builder.rb +156 -0
  443. data/lib/phronomy/workflow/runtime_binding/workflow_terminal_policy.rb +40 -0
  444. data/lib/phronomy.rb +97 -98
  445. data/scripts/api_snapshot.rb +36 -16
  446. data/scripts/storage_spi_snapshot.rb +36 -0
  447. data/sig/_private/phronomy/agent/settings.rbs +19 -0
  448. data/sig/_private/phronomy/configuration/runtime_settings.rbs +20 -0
  449. data/sig/_private/phronomy/llm_adapter/async/async_client.rbs +10 -0
  450. data/sig/_private/phronomy/multi_agent/store.rbs +8 -0
  451. data/sig/_private/phronomy/persistence/storage_boundary.rbs +7 -0
  452. data/sig/_private/phronomy/tool/settings.rbs +13 -0
  453. data/sig/_private/phronomy/tracing/settings.rbs +15 -0
  454. data/sig/_private/phronomy/workflow/execution/workflow_settings.rbs +13 -0
  455. data/sig/phronomy/agent/admission.rbs +19 -0
  456. data/sig/phronomy/agent/execution_contract.rbs +132 -0
  457. data/sig/phronomy/agent/execution_environment.rbs +20 -0
  458. data/sig/phronomy/agent/store.rbs +73 -0
  459. data/sig/phronomy/agent.rbs +14 -139
  460. data/sig/phronomy/common.rbs +7 -0
  461. data/sig/phronomy/content_store/contracts.rbs +13 -0
  462. data/sig/phronomy/context.rbs +152 -0
  463. data/sig/phronomy/embeddings/async/async_client.rbs +9 -0
  464. data/sig/phronomy/embeddings/base.rbs +17 -0
  465. data/sig/phronomy/engine/concurrency/timer_bindings.rbs +22 -0
  466. data/sig/phronomy/engine/control_bindings.rbs +11 -0
  467. data/sig/phronomy/engine/control_protocols.rbs +23 -0
  468. data/sig/phronomy/engine/execution_binding.rbs +6 -0
  469. data/sig/phronomy/engine/execution_receiver.rbs +15 -0
  470. data/sig/phronomy/engine/observability.rbs +13 -0
  471. data/sig/phronomy/execution/async_operation.rbs +7 -0
  472. data/sig/phronomy/execution/blocking.rbs +5 -0
  473. data/sig/phronomy/execution/concurrency/cancellation_token.rbs +13 -0
  474. data/sig/phronomy/execution/concurrency/deadline.rbs +10 -0
  475. data/sig/phronomy/execution/concurrency/result_composition.rbs +7 -0
  476. data/sig/phronomy/execution/control_protocols.rbs +18 -0
  477. data/sig/phronomy/execution/errors.rbs +7 -0
  478. data/sig/phronomy/execution/execution.rbs +41 -0
  479. data/sig/phronomy/execution/execution_receiver.rbs +40 -0
  480. data/sig/phronomy/execution/execution_scope_state.rbs +9 -0
  481. data/sig/phronomy/execution/invocation_context.rbs +18 -0
  482. data/sig/phronomy/execution/invocation_controls.rbs +13 -0
  483. data/sig/phronomy/execution/task_result.rbs +29 -0
  484. data/sig/phronomy/extensions.rbs +0 -21
  485. data/sig/phronomy/handoff.rbs +12 -4
  486. data/sig/phronomy/llm_adapter/backends/ruby_llm.rbs +6 -0
  487. data/sig/phronomy/llm_adapter/base.rbs +14 -0
  488. data/sig/phronomy/llm_adapter/usage.rbs +14 -0
  489. data/sig/phronomy/llm_adapter/values.rbs +43 -0
  490. data/sig/phronomy/llm_context_window.rbs +10 -0
  491. data/sig/phronomy/multi_agent/reserved_child_admission.rbs +8 -0
  492. data/sig/phronomy/multi_agent/store.rbs +54 -0
  493. data/sig/phronomy/multi_agent.rbs +24 -3
  494. data/sig/phronomy/persistence/errors.rbs +18 -0
  495. data/sig/phronomy/persistence/migration.rbs +13 -0
  496. data/sig/phronomy/persistence/transaction.rbs +19 -0
  497. data/sig/phronomy/persistence.rbs +3 -185
  498. data/sig/phronomy/persistence_composition.rbs +19 -0
  499. data/sig/phronomy/runtime_composition/configuration.rbs +36 -0
  500. data/sig/phronomy/storage/async/async_client.rbs +8 -0
  501. data/sig/phronomy/storage/backends/in_memory.rbs +9 -0
  502. data/sig/phronomy/storage/contracts.rbs +160 -0
  503. data/sig/phronomy/tool.rbs +58 -5
  504. data/sig/phronomy/tracing/observation.rbs +7 -0
  505. data/sig/phronomy/vector_store/async/async_client.rbs +13 -0
  506. data/sig/phronomy/vector_store/base.rbs +23 -0
  507. data/sig/phronomy/workflow/execution/workflow_execution_environment.rbs +14 -0
  508. data/sig/phronomy/workflow/runtime_binding/workflow_terminal_policy.rbs +7 -0
  509. data/sig/phronomy/workflow/store.rbs +8 -0
  510. data/sig/phronomy/workflow.rbs +1 -1
  511. data/sig/phronomy.rbs +0 -49
  512. metadata +462 -130
  513. data/lib/phronomy/agent/agent_invocation_session_builder.rb +0 -584
  514. data/lib/phronomy/agent/concerns/before_llm_input.rb +0 -66
  515. data/lib/phronomy/agent/concerns/error_translation.rb +0 -45
  516. data/lib/phronomy/agent/concerns/filterable.rb +0 -184
  517. data/lib/phronomy/agent/context/capability/base.rb +0 -507
  518. data/lib/phronomy/agent/context/instruction/prompt_template.rb +0 -102
  519. data/lib/phronomy/agent/context_parts/validators/final_budget_validator.rb +0 -37
  520. data/lib/phronomy/agent/context_policies/default.rb +0 -142
  521. data/lib/phronomy/agent/execution_coordinator.rb +0 -3151
  522. data/lib/phronomy/agent/handoff_execution_coordinator.rb +0 -143
  523. data/lib/phronomy/agent/handoff_request.rb +0 -45
  524. data/lib/phronomy/agent/handoff_runner.rb +0 -178
  525. data/lib/phronomy/agent/phase_machine_builder.rb +0 -152
  526. data/lib/phronomy/agent/provider_call_outcome.rb +0 -106
  527. data/lib/phronomy/agent/recovery_support.rb +0 -504
  528. data/lib/phronomy/agent/selection/candidate.rb +0 -53
  529. data/lib/phronomy/agent/selection/constraint.rb +0 -49
  530. data/lib/phronomy/agent/token_budget_resolver.rb +0 -70
  531. data/lib/phronomy/agent/tool_call_intercepted.rb +0 -29
  532. data/lib/phronomy/agent/tool_invocation_session_builder.rb +0 -276
  533. data/lib/phronomy/configuration.rb +0 -59
  534. data/lib/phronomy/engine/concurrency/cancellation_scope.rb +0 -124
  535. data/lib/phronomy/engine/concurrency/operation_binding.rb +0 -43
  536. data/lib/phronomy/generator_verifier.rb +0 -369
  537. data/lib/phronomy/invalid_context_budget_configuration_error.rb +0 -8
  538. data/lib/phronomy/llm_adapter/ruby_llm.rb +0 -47
  539. data/lib/phronomy/metrics.rb +0 -26
  540. data/lib/phronomy/multi_agent/parallel_tool_chat.rb +0 -116
  541. data/lib/phronomy/persistence/durable_codec.rb +0 -706
  542. data/lib/phronomy/persistence/in_memory.rb +0 -690
  543. data/lib/phronomy/persistence/repository_facades.rb +0 -535
  544. data/lib/phronomy/persistence.rb +0 -276
  545. data/lib/phronomy/recovery.rb +0 -186
  546. data/lib/phronomy/ruby_llm_patches.rb +0 -24
  547. data/lib/phronomy/runnable.rb +0 -54
  548. data/lib/phronomy/token_usage.rb +0 -85
  549. data/lib/phronomy/vector_store/embeddings/base.rb +0 -44
  550. data/lib/phronomy/vector_store/embeddings/ruby_llm_embeddings.rb +0 -47
  551. data/lib/phronomy/workflow/phase_machine_builder.rb +0 -205
  552. data/lib/phronomy/workflow_recovery.rb +0 -123
  553. data/sig/phronomy/llm_adapter.rbs +0 -11
  554. data/sig/phronomy/runtime.rbs +0 -76
  555. /data/lib/phronomy/agent/{llm_operation_result.rb → execution/llm_operation_result.rb} +0 -0
  556. /data/lib/phronomy/{canonical_json.rb → common/canonical_json.rb} +0 -0
  557. /data/lib/phronomy/{event.rb → engine/event.rb} +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dd6beeb52633381ff9e249ec18a1dc422234c78e44f479e3549cd3c54591ab04
4
- data.tar.gz: 6528144759933b359d2303b1499b678cbd4eb0c747ca9966f0c6542effb28196
3
+ metadata.gz: f097c81530a33bd631974866ff26a0d2ec8b4793286c6dfa0bb0facaac4fdd83
4
+ data.tar.gz: 80b9980737c80446f660d9a058aa1b898bdcdec452e517764261c386c32a1e78
5
5
  SHA512:
6
- metadata.gz: 307b601d09f6113282eef52f3e547d259e728adf0ba9ac481e3d84dc99583b8510ad779c71e0abee8c78f180b3786d6eacb3fea66723432d93f523e7f4be756a
7
- data.tar.gz: 6aed95a5486eaaa792e25ad4d058ebc804278dfa2bf648f216d120256154f7f1cccba86c056ec5176f98556f16e7b835c7102dd0129da5474f9ce93f221cbae8
6
+ metadata.gz: 2cacf04ecea168021b36835f12901723380a7a908d0173f23b564e9bb67d4f85cf46bf958949fd4257043393234ef5acc7e8d9cecdcf68beac61b0c7ce454084
7
+ data.tar.gz: c7f7b1d9cbcd54d0d0d9bb7583e5587ecadfafa987788f44e8c8abc0f9fa75241092d63a543669b55a6837fc1c2c09c102cf514578b6c266b2c85ff17d2ba2cc
data/.mutant.yml CHANGED
@@ -9,14 +9,14 @@ matcher:
9
9
  subjects:
10
10
  - Phronomy::WorkflowContext
11
11
  - Phronomy::WorkflowRunner
12
- # Phronomy::Tool::Base is a public constant alias to this same Class object.
13
- # Use the implementation canonical name returned by Class#name for Mutant.
14
- - Phronomy::Agent::Context::Capability::Base
12
+ - Phronomy::Tool::Base
13
+ - Phronomy::Tool::Schema
15
14
  - Phronomy::LlmContextWindow::TokenBudget
16
- - Phronomy::Agent::ContextAssembler
17
- - Phronomy::Agent::ContextPolicies::Default
18
- - Phronomy::Agent::ContextPolicyInputBuilder
19
- - Phronomy::Agent::ContextPlanValidator
20
- - Phronomy::Agent::HandoffPolicy
21
- - Phronomy::Agent::HandoffProjection
15
+ - Phronomy::Context::Assembly
16
+ - Phronomy::Agent::ContextPreparation
17
+ - Phronomy::Context::DefaultPolicy
18
+ - Phronomy::Context::ContextPolicyInputBuilder
19
+ - Phronomy::Context::ContextPlanValidator
20
+ - Phronomy::MultiAgent::HandoffPolicy
21
+ - Phronomy::Agent::TransferProjection
22
22
  - Phronomy::VectorStore::InMemory
data/CHANGELOG.md CHANGED
@@ -12,6 +12,98 @@ Release history for 0.14.0 and earlier is archived in
12
12
 
13
13
  ## [Unreleased]
14
14
 
15
+ ### r8 first implementation unit (breaking, unreleased)
16
+
17
+ - Move Context policy/plan/manifest/budget/prompt operations into `Phronomy::Context`.
18
+ Agent retains snapshot, journal and lifecycle ownership. Manifest and execution
19
+ references remain written within the same transaction.
20
+ - Make `Tool::Base` the actual implementation; move common definition and
21
+ authorization operations into Tool. Remove the old Agent Context namespace.
22
+ - Move chat construction and SDK failure translation into the LLM adapter.
23
+ Custom synchronous adapters must implement the expanded construction SPI.
24
+ - Unite execution contracts and services in `execution/`; move FSM values and
25
+ scheduling bindings to Engine, observation to Tracing. Keep result/control
26
+ rules independent of Engine startup. Update Ruby/RBS analysis and diagrams.
27
+ - Remove empty contract-only subdivisions and old API aliases. This unit does
28
+ not complete r8 Persistence, parent admission or all domain FSM separation.
29
+ See [the scope and migration report](docs/architecture/r8-unit1.md).
30
+
31
+ ### Changed
32
+
33
+ - Add public Beta `Storage::AsyncClient#transaction_async` and route 16 existing
34
+ durable Agent/Workflow/coordination execution units through its private submit
35
+ boundary. Preserve transaction/savepoint, result reconciliation and admission
36
+ policy; do not add cancellation or timeout to existing terminal writes.
37
+ - Move StoredContents into `content_store/backends/` without changing its
38
+ constant or behavior. Complete P4; see the
39
+ [Storage client guide](docs/migrations/storage-async-client.md).
40
+ - Preserve transparent text panels and module outlines in generated diagrams.
41
+ Hide arrows into M33/M41/M44 as a display choice; keep their measured source
42
+ dependencies, evidence and complete matrix.
43
+
44
+ - **Beta API receiver migration:** move VectorStore `add_async`, `search_async`,
45
+ `remove_async`, `clear_async` and Embeddings `embed_async` onto the public
46
+ feature-specific `AsyncClient` objects. Synchronous backend methods and
47
+ concrete class names remain unchanged. Remove the inherited async methods
48
+ and `VectorStore::AsyncBackend`; see the
49
+ [migration guide](docs/migrations/vector-async-clients.md).
50
+ - Split VectorStore/Embeddings implementations into collapsed `backends/`
51
+ directories. Synchronous RBS uses structural cancellation; separate client
52
+ signatures retain TaskResult and the full execution token. Complete P3 and
53
+ remove the remaining backend-to-Engine edges from the measured graph.
54
+
55
+ - Separate the synchronous LLMAdapter SPI, RubyLLM implementation and internal
56
+ AsyncClient. Adapter authors implement only `complete` and `stream`; default
57
+ configuration, provider behavior, admission/cancellation and Agent event
58
+ delivery remain unchanged. See
59
+ [ADR-059](docs/decisions/059-backend-contracts-and-async-clients.md).
60
+ - Separate responsibility groups from the diagram's B1-B6 display layers. Add
61
+ the source-derived SVG/matrix generator and Architecture CI boundary gate;
62
+ retain individual module boxes, stable module IDs and the earlier horizontal
63
+ layer layout with topical columns. Separated Contracts belong in B5 beside
64
+ the independent Engine group; clients, implementations and pending mixed
65
+ backends are displayed in B4. Storage/ContentStore migration remains pending.
66
+
67
+ ---
68
+
69
+ ## [0.27.0] - 2026-09-24
70
+
71
+ ### Changed
72
+
73
+ - Separate application Runtime reset and configuration replacement into
74
+ `runtime_composition/global_runtime.rb`. Configuration access no longer owns
75
+ Runtime lifecycle control; the reset API, shutdown ordering, timeout behavior,
76
+ and configuration defaults are unchanged. See
77
+ [ADR-039](docs/decisions/039-runtime-configuration-lifecycle-ownership.md).
78
+ - Group root implementations and entry-point exceptions by responsibility:
79
+ common definitions, Engine/FSM execution contracts, Recovery, Workflow,
80
+ Agent lifecycle contracts, LLM contracts, configuration, and feature APIs.
81
+ Preserve public constant names, API signatures, stored formats, and lifecycle
82
+ loading. Reserve the direct source root for version and namespace/loading
83
+ files; share the three equivalent immutable-copy helpers. See
84
+ [ADR-038](docs/decisions/038-responsibility-based-source-layout.md).
85
+ - Move the shared `Phronomy::Error` base exception to `common/error.rb` and
86
+ define ownership rules for general common definitions. The public constant,
87
+ subclass hierarchies, and rescue behavior are preserved. See
88
+ [ADR-037](docs/decisions/037-common-definition-ownership.md).
89
+ - Group Context Policy and hook contracts, values, Manifest representation,
90
+ and Plan validation under `agent/context_contract/`. Zeitwerk collapses the
91
+ directory so the existing `Phronomy::Agent` constant names, Policy/hook
92
+ protocols, and Manifest format remain unchanged. Agent execution and Context
93
+ assembly retain their existing responsibilities. See
94
+ [ADR-036](docs/decisions/036-context-contract-ownership.md).
95
+ - Move the internal `Phronomy::Agent::ToolExecutor` to
96
+ `Phronomy::Agent::Context::Capability::ToolExecutor`, alongside the default
97
+ Tool invocation contract, without an alias for the old internal constant.
98
+ Public Tool names, `call_async` arguments, execution modes, Runtime routing,
99
+ and Agent-owned authorization/result handling are preserved. See
100
+ [ADR-035](docs/decisions/035-tool-executor-capability-ownership.md).
101
+ - Move `Phronomy::Agent::HandoffRunner` to
102
+ `Phronomy::MultiAgent::HandoffRunner` without a compatibility alias on the
103
+ architecture refactoring branch. Handoff edges and Policy remain in Agent;
104
+ execution, persistence formats, cancellation and recovery behavior are unchanged.
105
+ See [the migration guide](docs/migrations/handoff-runner-multi-agent.md).
106
+
15
107
  ---
16
108
 
17
109
  ## [0.26.0] - 2026-09-14
data/CONTRIBUTING.md CHANGED
@@ -219,14 +219,14 @@ The authoritative subject list is `.mutant.yml`. It currently includes:
219
219
 
220
220
  - `Phronomy::WorkflowContext`
221
221
  - `Phronomy::WorkflowRunner`
222
- - `Phronomy::Agent::Context::Capability::Base`
222
+ - `Phronomy::Tool::Base`
223
223
  - `Phronomy::LlmContextWindow::TokenBudget`
224
- - `Phronomy::Agent::ContextAssembler`
225
- - `Phronomy::Agent::ContextPolicies::Default`
226
- - `Phronomy::Agent::ContextPolicyInputBuilder`
227
- - `Phronomy::Agent::ContextPlanValidator`
228
- - `Phronomy::Agent::HandoffPolicy`
229
- - `Phronomy::Agent::HandoffProjection`
224
+ - `Phronomy::Agent::ContextPreparation`
225
+ - `Phronomy::Context::DefaultPolicy`
226
+ - `Phronomy::Context::ContextPolicyInputBuilder`
227
+ - `Phronomy::Context::ContextPlanValidator`
228
+ - `Phronomy::MultiAgent::HandoffPolicy`
229
+ - `Phronomy::Agent::TransferProjection`
230
230
  - `Phronomy::VectorStore::InMemory`
231
231
 
232
232
  The nightly mutation matrix mirrors this authoritative list so each subject can
@@ -235,7 +235,7 @@ configuration-consistency guard that fails if the nightly subject set diverges
235
235
  from `.mutant.yml`.
236
236
 
237
237
  The Tool mutation subject intentionally uses
238
- `Phronomy::Agent::Context::Capability::Base`, which is the implementation
238
+ `Phronomy::Tool::Base`, which is the implementation
239
239
  canonical name returned by the single Class object's runtime `Class#name`.
240
240
  `Phronomy::Tool::Base` is the public facade constant alias to that same Class
241
241
  object; it is not a second Tool base class.
data/README.md CHANGED
@@ -8,7 +8,11 @@
8
8
 
9
9
  **Phronomy** is a Ruby AI agent framework for stateful Agents, Workflows, Tools,
10
10
  context management, filtering, tracing, and multi-agent coordination. Large Language
11
- Model (LLM) access is provided through [RubyLLM](https://github.com/crmne/ruby_llm).
11
+ Model (LLM) operations use `Phronomy::LLMAdapter`; the default backend uses
12
+ [RubyLLM](https://github.com/crmne/ruby_llm). Custom backends implement the
13
+ [SDK-independent LLM contract](docs/migrations/r8-unit6.md).
14
+ Tool declarations and argument validation belong to `Phronomy::Tool`, independently
15
+ of the selected LLM backend.
12
16
 
13
17
  Phronomy is pre-1.0. Pin to a released gem version for production use rather than
14
18
  tracking `main` directly.
@@ -16,7 +20,7 @@ tracking `main` directly.
16
20
  ## Core concepts
17
21
 
18
22
  - **Agent** — stateful, persistence-backed LLM agent with canonical execution history.
19
- - **Persistence** — unified durable backend for Agent state and Workflow `workflow_states`.
23
+ - **Persistence** — shared atomic scopes with domain-owned Agent/Team stores and Workflow checkpoints.
20
24
  - **Workflow** — state-machine-driven application workflow with explicit events and wait states.
21
25
  - **Tool / Capability** — callable application capability exposed to an Agent; application-defined Tools subclass `Phronomy::Tool::Base`.
22
26
  - **Multi-Agent Handoff** — semantic Source-to-Target responsibility transfer with policy-bounded Context projection and persisted active responsibility and exact Target recovery within one Persistence domain.
@@ -45,6 +49,10 @@ Then run:
45
49
  bundle install
46
50
  ```
47
51
 
52
+ This refactoring branch requires RubyLLM 2.0.x. See the
53
+ [RubyLLM 2 and token-ownership migration](docs/architecture/rubyllm-2-token-ownership.md)
54
+ for removed input-budget overrides and the in-flight Tool-manifest upgrade boundary.
55
+
48
56
  Configure RubyLLM with the provider credentials and transport policy required by
49
57
  your application. Phronomy does not add another LLM transport retry/timeout layer.
50
58
 
@@ -84,7 +92,7 @@ puts result[:output]
84
92
  ```
85
93
 
86
94
  `Phronomy::Tool::Base` is the public authoring name for the existing Tool base
87
- class. The legacy `Phronomy::Agent::Context::Capability::Base` constant remains
95
+ class. The legacy `Phronomy::Tool::Base` constant remains
88
96
  valid for compatibility.
89
97
 
90
98
  For non-blocking top-level use, call `invoke_async` and keep the returned
@@ -151,6 +159,8 @@ contracts, timeout/cancellation semantics, metrics, and callback rules.
151
159
  - [MCP client](docs/mcp-client.md) — Model Context Protocol (MCP) integration and supported schema subset.
152
160
  - [Migration from 0.15-era APIs](docs/migrations/0.15.md).
153
161
  - [0.16 cleanup migration](docs/migrations/0.16.md).
162
+ - [r8 persistence boundary migration](docs/architecture/r8-unit3.md) — domain stores, shared scopes, and removed facade APIs.
163
+ - [Persistence failure contract migration](docs/migrations/persistence-failure-contracts.md) — domain rescue clauses and unchanged raw backend errors.
154
164
  - [0.19 unified Persistence migration](docs/migrations/0.19.md).
155
165
  - [0.22 semantic Multi-Agent Handoff migration](docs/migrations/0.22.md).
156
166
  - [Architecture Decision Records](docs/decisions/) — design rationale and superseding decisions.
data/VERIFY.sh CHANGED
@@ -21,9 +21,9 @@ required_files=(
21
21
  docs/decisions/024-event-loop-single-writer-agent-runtime.md
22
22
  docs/decisions/025-process-local-agent-ownership-and-runtime-admission.md
23
23
  docs/decisions/026-workflow-runtime-admission-and-durable-terminal-barrier.md
24
- lib/phronomy/workflow.rb
25
- lib/phronomy/workflow_context.rb
26
- lib/phronomy/workflow_runner.rb
24
+ lib/phronomy/workflow/execution/workflow.rb
25
+ lib/phronomy/workflow/execution/workflow_context.rb
26
+ lib/phronomy/workflow/execution/workflow_runner.rb
27
27
  lib/phronomy/engine/event_loop.rb
28
28
  lib/phronomy/engine/fsm_session.rb
29
29
  lib/phronomy/persistence/in_memory.rb
@@ -38,16 +38,16 @@ required_files=(
38
38
  spec/phronomy/persistence/initial_format_migration_spec.rb
39
39
  lib/phronomy/testing/persistence_contract/a_workflow_state_repository.rb
40
40
  spec/phronomy/workflow_identity_contract_spec.rb
41
- lib/phronomy/invocation_context.rb
41
+ lib/phronomy/engine/invocation_context.rb
42
42
  lib/phronomy/agent/async_event_api.rb
43
43
  lib/phronomy/agent/execution_coordinator.rb
44
44
  lib/phronomy/agent/journal_record.rb
45
45
  lib/phronomy/agent/context_assembler.rb
46
- lib/phronomy/agent/context_policy.rb
47
- lib/phronomy/agent/context_policy_input.rb
46
+ lib/phronomy/agent/context_contract/context_policy.rb
47
+ lib/phronomy/agent/context_contract/context_policy_input.rb
48
48
  lib/phronomy/agent/context_policy_input_builder.rb
49
- lib/phronomy/agent/context_plan.rb
50
- lib/phronomy/agent/context_plan_validator.rb
49
+ lib/phronomy/agent/context_contract/context_plan.rb
50
+ lib/phronomy/agent/context_contract/context_plan_validator.rb
51
51
  lib/phronomy/agent/context_policies/default.rb
52
52
  spec/phronomy/agent/context_policy_architecture_regression_spec.rb
53
53
  lib/phronomy/agent/agent_invocation.rb
@@ -68,7 +68,7 @@ required_files=(
68
68
  spec/phronomy/workflow/admission_spec.rb
69
69
  spec/phronomy/workflow/live_signal_spec.rb
70
70
  spec/phronomy/workflow/transition_action_spec.rb
71
- lib/phronomy/generator_verifier.rb
71
+ lib/phronomy/generation/generator_verifier.rb
72
72
  spec/phronomy/generator_verifier_spec.rb
73
73
  spec/integration/subgraph_parallel_agent_tool_spec.rb
74
74
  lib/phronomy/tracing/base.rb
@@ -87,11 +87,11 @@ required_files=(
87
87
  spec/phronomy/fault_injection_advanced_spec.rb
88
88
  spec/phronomy/persistence_architecture_regression_spec.rb
89
89
  lib/phronomy/agent/base.rb
90
- lib/phronomy/agent_already_exists_error.rb
91
- lib/phronomy/agent_purged_error.rb
90
+ lib/phronomy/agent/lifecycle_contract/agent_already_exists_error.rb
91
+ lib/phronomy/agent/lifecycle_contract/agent_purged_error.rb
92
92
  lib/phronomy/engine/runtime/agent_ownership_registry.rb
93
93
  lib/phronomy/agent/agent_root.rb
94
- lib/phronomy/agent/llm_input_build_context.rb
94
+ lib/phronomy/agent/context_contract/llm_input_build_context.rb
95
95
  lib/phronomy/agent/shared_state.rb
96
96
  spec/phronomy/agent/base_spec.rb
97
97
  spec/phronomy/agent_spec.rb
@@ -119,9 +119,9 @@ done
119
119
 
120
120
  syntax_files=(
121
121
  spec/phronomy/architecture_governance_spec.rb
122
- lib/phronomy/workflow.rb
123
- lib/phronomy/workflow_context.rb
124
- lib/phronomy/workflow_runner.rb
122
+ lib/phronomy/workflow/execution/workflow.rb
123
+ lib/phronomy/workflow/execution/workflow_context.rb
124
+ lib/phronomy/workflow/execution/workflow_runner.rb
125
125
  lib/phronomy/engine/event_loop.rb
126
126
  lib/phronomy/engine/fsm_session.rb
127
127
  lib/phronomy/persistence/in_memory.rb
@@ -135,16 +135,16 @@ syntax_files=(
135
135
  spec/phronomy/persistence/initial_format_migration_spec.rb
136
136
  lib/phronomy/testing/persistence_contract/a_workflow_state_repository.rb
137
137
  spec/phronomy/workflow_identity_contract_spec.rb
138
- lib/phronomy/invocation_context.rb
138
+ lib/phronomy/engine/invocation_context.rb
139
139
  lib/phronomy/agent/async_event_api.rb
140
140
  lib/phronomy/agent/execution_coordinator.rb
141
141
  lib/phronomy/agent/journal_record.rb
142
142
  lib/phronomy/agent/context_assembler.rb
143
- lib/phronomy/agent/context_policy.rb
144
- lib/phronomy/agent/context_policy_input.rb
143
+ lib/phronomy/agent/context_contract/context_policy.rb
144
+ lib/phronomy/agent/context_contract/context_policy_input.rb
145
145
  lib/phronomy/agent/context_policy_input_builder.rb
146
- lib/phronomy/agent/context_plan.rb
147
- lib/phronomy/agent/context_plan_validator.rb
146
+ lib/phronomy/agent/context_contract/context_plan.rb
147
+ lib/phronomy/agent/context_contract/context_plan_validator.rb
148
148
  lib/phronomy/agent/context_policies/default.rb
149
149
  spec/phronomy/agent/context_policy_architecture_regression_spec.rb
150
150
  lib/phronomy/agent/agent_invocation.rb
@@ -177,7 +177,7 @@ syntax_files=(
177
177
  spec/phronomy/workflow/admission_spec.rb
178
178
  spec/phronomy/workflow/live_signal_spec.rb
179
179
  spec/phronomy/workflow/fsm_session_spec.rb
180
- lib/phronomy/generator_verifier.rb
180
+ lib/phronomy/generation/generator_verifier.rb
181
181
  spec/phronomy/generator_verifier_spec.rb
182
182
  spec/integration/subgraph_parallel_agent_tool_spec.rb
183
183
  spec/phronomy/guarantee_model_spec.rb
@@ -197,11 +197,11 @@ syntax_files=(
197
197
  spec/phronomy/fault_injection_advanced_spec.rb
198
198
  spec/phronomy/persistence_architecture_regression_spec.rb
199
199
  lib/phronomy/agent/base.rb
200
- lib/phronomy/agent_already_exists_error.rb
201
- lib/phronomy/agent_purged_error.rb
200
+ lib/phronomy/agent/lifecycle_contract/agent_already_exists_error.rb
201
+ lib/phronomy/agent/lifecycle_contract/agent_purged_error.rb
202
202
  lib/phronomy/engine/runtime/agent_ownership_registry.rb
203
203
  lib/phronomy/agent/agent_root.rb
204
- lib/phronomy/agent/llm_input_build_context.rb
204
+ lib/phronomy/agent/context_contract/llm_input_build_context.rb
205
205
  lib/phronomy/agent/shared_state.rb
206
206
  lib/phronomy/agent/concerns/before_llm_input.rb
207
207
  lib/phronomy/testing/persistence_contract/an_agent_repository.rb
@@ -322,7 +322,7 @@ bundle exec rspec \
322
322
  spec/integration/multi_agent_handoff_followup_spec.rb
323
323
 
324
324
  echo "== ACS-06 / CG-07 durable format / record-oriented Persistence SPI =="
325
- ruby -c lib/phronomy/persistence.rb >/dev/null
325
+ ruby -c lib/phronomy/persistence/api/persistence.rb >/dev/null
326
326
  ruby -c lib/phronomy/persistence/durable_record.rb >/dev/null
327
327
  ruby -c lib/phronomy/persistence/durable_codec.rb >/dev/null
328
328
  ruby -c lib/phronomy/persistence/repository_facades.rb >/dev/null
@@ -467,7 +467,7 @@ for rel in [
467
467
  if fsm_new_has_id_kwarg(text):
468
468
  raise SystemExit(f"FAIL: {rel} still injects a domain/context ID as FSMSession id")
469
469
 
470
- workflow = pathlib.Path("lib/phronomy/workflow_runner.rb").read_text()
470
+ workflow = pathlib.Path("lib/phronomy/workflow/execution/workflow_runner.rb").read_text()
471
471
  event_loop = pathlib.Path("lib/phronomy/engine/event_loop.rb").read_text()
472
472
  fsm = pathlib.Path("lib/phronomy/engine/fsm_session.rb").read_text()
473
473
 
@@ -487,7 +487,7 @@ for required in ["workflow_terminal_persistence_result", ":persisting_terminal",
487
487
  PY
488
488
 
489
489
  echo "== ACS-13 Workflow admission / durable terminal barrier =="
490
- ruby -c lib/phronomy/workflow_runner.rb >/dev/null
490
+ ruby -c lib/phronomy/workflow/execution/workflow_runner.rb >/dev/null
491
491
  ruby -c lib/phronomy/engine/event_loop.rb >/dev/null
492
492
  ruby -c lib/phronomy/engine/fsm_session.rb >/dev/null
493
493
  ruby -c spec/phronomy/workflow/admission_spec.rb >/dev/null
@@ -5,11 +5,12 @@
5
5
  # Measures the per-invoke cost of the Phronomy::Agent::Base framework path
6
6
  # (context assembly, filter checks, before_llm_input hooks, response handling)
7
7
  # with a fully stubbed LLM. No network calls are made.
8
+ # Each sample invokes a fresh Agent once. Agent construction is outside the
9
+ # measured block; growing conversation history is a different workload.
8
10
  #
9
11
  # Scenarios:
10
12
  # 1. Minimal agent (no tools, no persistent Knowledge) — baseline framework overhead.
11
13
  # 2. Tool-aware agent with a registered stub Tool.
12
- # 3. Agent#stream setup latency (first-chunk time with stubbed stream).
13
14
 
14
15
  require "benchmark"
15
16
  require_relative "../lib/phronomy"
@@ -18,44 +19,21 @@ require_relative "../lib/phronomy"
18
19
  # Shared stubs
19
20
  # ---------------------------------------------------------------------------
20
21
 
21
- BenchAgentMessage = Struct.new(:role, :content, :tool_calls, :tokens) do
22
- def self.assistant(content = "done")
23
- new(:assistant, content, nil,
24
- Struct.new(:input, :output, :cached, :cache_creation).new(5, 5, 0, 0))
25
- end
26
- end
27
-
28
- # A minimal stub Chat that returns a pre-built response immediately.
29
- class BenchStubChat
30
- attr_reader :messages
31
-
22
+ # A stub backend that preserves the adapter's validation/cancellation template.
23
+ class BenchStubLLMAdapter < Phronomy::LLMAdapter::Base
32
24
  def initialize(response)
33
25
  @response = response
34
- @messages = []
35
26
  end
36
27
 
37
- def with_instructions(_) = self
38
- def with_tool(_) = self
39
- def with_temperature(_) = self
40
- def with_cache_instructions(_) = self
41
- def with_output_schema(_) = self
42
- def on_tool_call(&) = self
43
- def before_tool_call(&) = self
44
- def last_message = @response
45
-
46
- def ask(_)
47
- @messages << @response
48
- @response
49
- end
28
+ protected
50
29
 
51
- def stream(*)
52
- yield @response.content if block_given?
30
+ def perform_complete(request, cancellation_token:)
53
31
  @response
54
32
  end
55
33
  end
56
34
 
57
35
  # A stub tool that does nothing but conforms to the Tool::Base interface.
58
- class BenchNullTool < Phronomy::Agent::Context::Capability::Base
36
+ class BenchNullTool < Phronomy::Tool::Base
59
37
  description "No-op benchmark tool"
60
38
  param :x, type: :string, desc: "input"
61
39
 
@@ -68,40 +46,41 @@ end
68
46
  # Agent classes
69
47
  # ---------------------------------------------------------------------------
70
48
 
71
- BENCH_RESP = BenchAgentMessage.assistant("benchmark complete")
72
- BENCH_RESP_CHAT = BenchStubChat.new(BENCH_RESP)
49
+ BENCH_RESP = Phronomy::LLMAdapter::Response.new(
50
+ content: "benchmark complete",
51
+ usage: Phronomy::LLMAdapter::TokenUsage.new(input: 5, output: 5, cached: 0, cache_creation: 0)
52
+ )
73
53
 
74
54
  bench_minimal_class = Class.new(Phronomy::Agent::Base) do
75
55
  agent_definition id: "bench-minimal", version: 1
76
56
  model "stub-model"
77
-
78
- define_method(:build_chat) { |*| BenchStubChat.new(BENCH_RESP) }
79
57
  end
80
58
 
81
59
  bench_tool_class = Class.new(Phronomy::Agent::Base) do
82
60
  agent_definition id: "bench-tool", version: 1
83
61
  model "stub-model"
84
62
  tools(BenchNullTool => nil)
85
-
86
- define_method(:build_chat) { |*| BenchStubChat.new(BENCH_RESP) }
87
63
  end
88
64
 
89
- BENCH_AGENT_MINIMAL = bench_minimal_class.new
90
- BENCH_AGENT_TOOLS = bench_tool_class.new
91
-
92
65
  AGENT_INVOKE_ITERATIONS = 200
93
66
 
94
- puts "=== bench_agent_invoke ==="
95
- Benchmark.bm(50) do |x|
96
- x.report("Agent#invoke — minimal (no tools), #{AGENT_INVOKE_ITERATIONS} iters") do
97
- AGENT_INVOKE_ITERATIONS.times do
98
- BENCH_AGENT_MINIMAL.invoke("ping")
67
+ Phronomy.with_configuration do |config|
68
+ config.llm_adapter = BenchStubLLMAdapter.new(BENCH_RESP)
69
+ bench_agents_minimal = Array.new(AGENT_INVOKE_ITERATIONS) { bench_minimal_class.new }.freeze
70
+ bench_agents_tools = Array.new(AGENT_INVOKE_ITERATIONS) { bench_tool_class.new }.freeze
71
+
72
+ puts "=== bench_agent_invoke ==="
73
+ Benchmark.bm(50) do |x|
74
+ x.report("Agent#invoke — fresh, no tools, #{AGENT_INVOKE_ITERATIONS} iters") do
75
+ bench_agents_minimal.each do |agent|
76
+ agent.invoke("ping")
77
+ end
99
78
  end
100
- end
101
79
 
102
- x.report("Agent#invoke — tool-aware, #{AGENT_INVOKE_ITERATIONS} iters") do
103
- AGENT_INVOKE_ITERATIONS.times do
104
- BENCH_AGENT_TOOLS.invoke("ping")
80
+ x.report("Agent#invoke — fresh, tool-aware, #{AGENT_INVOKE_ITERATIONS} iters") do
81
+ bench_agents_tools.each do |agent|
82
+ agent.invoke("ping")
83
+ end
105
84
  end
106
85
  end
107
86
  end
@@ -14,7 +14,7 @@ module BenchContextAssembler
14
14
  module_function
15
15
 
16
16
  def provenance
17
- Phronomy::Agent::ContextPolicyInput::Provenance.new(origin: :journal)
17
+ Phronomy::Context::ContextPolicyInput::Provenance.new(origin: :journal)
18
18
  end
19
19
 
20
20
  def policy_input(item_count)
@@ -22,13 +22,13 @@ module BenchContextAssembler
22
22
  conversation = []
23
23
  item_count.times do |index|
24
24
  if (index % 10).zero?
25
- knowledge << Phronomy::Agent::ContextPolicyInput::KnowledgeItem.new(
25
+ knowledge << Phronomy::Context::ContextPolicyInput::KnowledgeItem.new(
26
26
  id: "knowledge-#{index}", kind: :knowledge, role: :user,
27
27
  content: "knowledge #{index}", content_format: :text,
28
28
  estimated_tokens: 8, required: false, provenance: provenance, metadata: {}
29
29
  )
30
30
  else
31
- conversation << [Phronomy::Agent::ContextPolicyInput::ConversationItem.new(
31
+ conversation << [Phronomy::Context::ContextPolicyInput::ConversationItem.new(
32
32
  id: "message-#{index}", kind: :external_message, role: :user,
33
33
  content: "message #{index}", content_format: :text,
34
34
  sequence: index, estimated_tokens: 8, required: false,
@@ -38,24 +38,23 @@ module BenchContextAssembler
38
38
  end
39
39
  end
40
40
 
41
- Phronomy::Agent::ContextPolicyInput.new(
41
+ Phronomy::Context::ContextPolicyInput.new(
42
42
  agent_id: "bench-agent", execution_id: "bench-execution",
43
43
  call_sequence: 2, call_mode: :complete,
44
44
  instruction: [], knowledge: knowledge, tools: [], conversation: conversation,
45
45
  token_budget: Phronomy::LlmContextWindow::TokenBudget.new(
46
- context_window: [item_count * 16, 4_096].max,
47
- max_output_tokens: 512
46
+ max_input_tokens: [item_count * 16, 4_096].max
48
47
  ),
49
48
  model_config: {}, previous_manifest: nil, metadata: {}
50
49
  )
51
50
  end
52
51
 
53
52
  def assembler_fixture
54
- persistence = Phronomy::Persistence::InMemory.new
53
+ persistence = Phronomy::PersistenceComposition.in_memory.agent
55
54
  agent_class = Class.new(Phronomy::Agent::Base) do
56
55
  agent_definition id: "bench-manifest-context-assembler", version: 1
57
- model "local-model"
58
- context_window 16_384
56
+ # Resolve capabilities from RubyLLM's bundled registry; no provider call.
57
+ model "gpt-4o-mini"
59
58
  max_output_tokens 1_024
60
59
  instructions "Benchmark instruction"
61
60
  end
@@ -87,9 +86,10 @@ module BenchContextAssembler
87
86
  )
88
87
 
89
88
  [
90
- Phronomy::Agent::ContextAssembler.new(agent: agent, persistence: persistence),
89
+ Phronomy::Agent::ContextPreparation.new(agent: agent, persistence: persistence),
91
90
  root,
92
- execution
91
+ execution,
92
+ persistence
93
93
  ]
94
94
  end
95
95
  end
@@ -98,7 +98,7 @@ puts "Typed Context Policy benchmark"
98
98
  puts "Ruby #{RUBY_VERSION} on #{RUBY_PLATFORM}"
99
99
  puts "=" * 72
100
100
 
101
- policy = Phronomy::Agent::ContextPolicies::Default.instance
101
+ policy = Phronomy::Context::DefaultPolicy.instance
102
102
  policy_inputs = [10, 100, 1_000].to_h do |count|
103
103
  [count, BenchContextAssembler.policy_input(count)]
104
104
  end
@@ -111,15 +111,17 @@ Benchmark.bm(46) do |x|
111
111
  end
112
112
  end
113
113
 
114
- assembler, root, execution = BenchContextAssembler.assembler_fixture
115
- x.report("ContextAssembler prepare/finalize x500") do
114
+ assembler, root, execution, persistence = BenchContextAssembler.assembler_fixture
115
+ x.report("Context prepare/store x500") do
116
116
  500.times do
117
117
  prepared = assembler.prepare_initial(
118
118
  input: "benchmark input",
119
119
  agent_root: root,
120
120
  execution: execution
121
121
  )
122
- assembler.finalize(prepared)
122
+ persistence.transaction do |tx|
123
+ Phronomy::Context::Assembly.new.store(prepared, contents: tx.contents)
124
+ end
123
125
  end
124
126
  end
125
127
  end
@@ -69,7 +69,7 @@ end
69
69
  # ---------------------------------------------------------------------------
70
70
  # Target 3: Tool::Base#params_schema generation (10 params)
71
71
  # ---------------------------------------------------------------------------
72
- tool_class = Class.new(Phronomy::Agent::Context::Capability::Base) do
72
+ tool_class = Class.new(Phronomy::Tool::Base) do
73
73
  description "Test tool with 10 params"
74
74
  param :p1, type: :string, desc: "param 1"
75
75
  param :p2, type: :string, desc: "param 2"
@@ -7,7 +7,7 @@
7
7
  require "benchmark"
8
8
  require_relative "../lib/phronomy"
9
9
 
10
- class BenchTool10Params < Phronomy::Agent::Context::Capability::Base
10
+ class BenchTool10Params < Phronomy::Tool::Base
11
11
  description "A tool with 10 parameters for benchmarking purposes"
12
12
  param :param1, type: :string, desc: "First parameter"
13
13
  param :param2, type: :integer, desc: "Second parameter"