phronomy 0.15.1 → 0.17.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 (97) hide show
  1. checksums.yaml +4 -4
  2. data/.mutant.yml +8 -9
  3. data/CHANGELOG.md +159 -28
  4. data/CONTRIBUTING.md +28 -16
  5. data/README.md +400 -143
  6. data/benchmark/baseline.json +2 -3
  7. data/benchmark/bench_agent_invoke.rb +7 -4
  8. data/benchmark/bench_context_assembler.rb +134 -34
  9. data/benchmark/bench_regression.rb +3 -19
  10. data/benchmark/bench_tool_schema.rb +2 -34
  11. data/docs/decisions/005-static-knowledge-class-level-cache.md +12 -1
  12. data/docs/decisions/010-cooperative-first-concurrency.md +7 -0
  13. data/docs/decisions/011-build-context-as-single-llm-input-authority.md +40 -1
  14. data/docs/decisions/012-canonical-execution-log-and-context-policy.md +69 -0
  15. data/docs/decisions/013-journal-backed-knowledge-as-context-candidates.md +122 -0
  16. data/lib/phronomy/agent/activation_registry.rb +28 -0
  17. data/lib/phronomy/agent/agent_execution.rb +97 -0
  18. data/lib/phronomy/agent/agent_execution_activation.rb +172 -0
  19. data/lib/phronomy/agent/agent_invocation.rb +44 -46
  20. data/lib/phronomy/agent/agent_invocation_session_builder.rb +206 -104
  21. data/lib/phronomy/agent/agent_root.rb +66 -0
  22. data/lib/phronomy/agent/async_event_api.rb +55 -475
  23. data/lib/phronomy/agent/base.rb +351 -514
  24. data/lib/phronomy/agent/concerns/before_llm_input.rb +66 -0
  25. data/lib/phronomy/agent/context/capability/base.rb +166 -297
  26. data/lib/phronomy/agent/context_assembler.rb +357 -0
  27. data/lib/phronomy/agent/context_candidate.rb +47 -0
  28. data/lib/phronomy/agent/context_candidate_resolver.rb +65 -0
  29. data/lib/phronomy/agent/context_importer.rb +217 -0
  30. data/lib/phronomy/agent/context_parts/budget/token_budget_packer.rb +53 -0
  31. data/lib/phronomy/agent/context_parts/requirements/required_context_resolver.rb +56 -0
  32. data/lib/phronomy/agent/context_parts/selectors/recent_first_selector.rb +30 -0
  33. data/lib/phronomy/agent/context_parts/unit_builders/dependency_aware_unit_builder.rb +118 -0
  34. data/lib/phronomy/agent/context_parts/validators/final_budget_validator.rb +37 -0
  35. data/lib/phronomy/agent/context_plan.rb +25 -0
  36. data/lib/phronomy/agent/context_plan_validator.rb +134 -0
  37. data/lib/phronomy/agent/context_policies/default.rb +53 -0
  38. data/lib/phronomy/agent/context_policy.rb +15 -0
  39. data/lib/phronomy/agent/context_policy_descriptor.rb +49 -0
  40. data/lib/phronomy/agent/context_policy_registry.rb +46 -0
  41. data/lib/phronomy/agent/context_request.rb +35 -0
  42. data/lib/phronomy/agent/context_selection_unit.rb +38 -0
  43. data/lib/phronomy/agent/derived_content_spec.rb +34 -0
  44. data/lib/phronomy/agent/execution_coordinator.rb +1122 -0
  45. data/lib/phronomy/agent/immutable.rb +31 -0
  46. data/lib/phronomy/agent/journal_projection.rb +60 -0
  47. data/lib/phronomy/agent/journal_record.rb +67 -0
  48. data/lib/phronomy/agent/llm_call_record.rb +51 -0
  49. data/lib/phronomy/agent/llm_input_build_context.rb +17 -0
  50. data/lib/phronomy/agent/llm_input_manifest.rb +103 -0
  51. data/lib/phronomy/agent/llm_input_patch.rb +21 -0
  52. data/lib/phronomy/agent/phase_machine_builder.rb +12 -0
  53. data/lib/phronomy/agent/provider_call_outcome.rb +90 -0
  54. data/lib/phronomy/agent/ruby_llm_materializer.rb +189 -0
  55. data/lib/phronomy/agent/shared_state.rb +46 -138
  56. data/lib/phronomy/agent/token_budget_resolver.rb +70 -0
  57. data/lib/phronomy/agent/tool_call_intercepted.rb +11 -4
  58. data/lib/phronomy/agent/tool_definition_set.rb +55 -0
  59. data/lib/phronomy/agent/tool_invocation.rb +108 -314
  60. data/lib/phronomy/agent.rb +10 -16
  61. data/lib/phronomy/agent_busy_error.rb +5 -0
  62. data/lib/phronomy/canonical_json.rb +136 -0
  63. data/lib/phronomy/configuration.rb +17 -155
  64. data/lib/phronomy/content_store/base.rb +51 -0
  65. data/lib/phronomy/context_budget_exceeded_error.rb +8 -0
  66. data/lib/phronomy/engine/concurrency/cancellation_token.rb +7 -80
  67. data/lib/phronomy/engine/event_loop.rb +3 -0
  68. data/lib/phronomy/engine/runtime.rb +15 -230
  69. data/lib/phronomy/engine/task_group.rb +30 -102
  70. data/lib/phronomy/execution_rehydration_required_error.rb +5 -0
  71. data/lib/phronomy/invalid_context_budget_configuration_error.rb +8 -0
  72. data/lib/phronomy/llm_context_window/token_budget.rb +8 -79
  73. data/lib/phronomy/multi_agent/orchestrator.rb +153 -204
  74. data/lib/phronomy/multi_agent/parallel_tool_chat.rb +7 -5
  75. data/lib/phronomy/multi_agent/team_coordinator.rb +46 -133
  76. data/lib/phronomy/persistence/in_memory.rb +247 -0
  77. data/lib/phronomy/persistence.rb +39 -0
  78. data/lib/phronomy/tools/agent.rb +14 -36
  79. data/lib/phronomy/vector_store/in_memory.rb +2 -2
  80. data/lib/phronomy/version.rb +1 -1
  81. data/lib/phronomy.rb +9 -115
  82. data/scripts/add_to_h_to_token_doubles.rb +33 -0
  83. data/scripts/add_to_h_unnamed_doubles.rb +27 -0
  84. data/scripts/api_snapshot.rb +1 -12
  85. data/scripts/migrate_spec_agent_definition.rb +108 -0
  86. data/scripts/migrate_spec_agent_definition_pass2.rb +53 -0
  87. data/scripts/migrate_spec_inline_pass3.rb +24 -0
  88. metadata +54 -13
  89. data/lib/phronomy/agent/agent_invocation_registry.rb +0 -75
  90. data/lib/phronomy/agent/before_completion_context.rb +0 -47
  91. data/lib/phronomy/agent/concerns/before_completion.rb +0 -111
  92. data/lib/phronomy/agent/context/knowledge/base.rb +0 -58
  93. data/lib/phronomy/agent/context/knowledge/entity_knowledge.rb +0 -102
  94. data/lib/phronomy/agent/context/knowledge/static_knowledge.rb +0 -58
  95. data/lib/phronomy/knowledge_source.rb +0 -12
  96. data/lib/phronomy/llm_context_window/assembler.rb +0 -191
  97. data/lib/phronomy/llm_context_window/context_version_cache.rb +0 -52
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 98b90b892fcd752aa84d1a00d033bb627df70d143145502f044e5288c7b124a4
4
- data.tar.gz: c1e37fa68d782d5f506a83e019594e2f77efeb7d37e8f46c8b57286d8b8c9eaa
3
+ metadata.gz: d3af942022237dc3396d6a658f4f1b9be12f03eb0f718ebea81525822f756308
4
+ data.tar.gz: c046a9670fb3e1e55640f5072ac6c04399edbdfdfc4b2238caefde135fc1a2e5
5
5
  SHA512:
6
- metadata.gz: e8a62f9eb2d0971a0faa91d822a9ecff39b495242514dd5144f442c8bcfba85edd84a3e22738df17447604f8c6201169df1f0b308035ad8a5e50603ad379da5b
7
- data.tar.gz: bcb09d22cf850b447e49e13d022cf760c6b4628fe3df6ea744f91738e1085fea6218bee4ce96c4caf0b6f8a8c07f2900bc7f243ed374cc71c940869f64856ea1
6
+ metadata.gz: f52c37ff47e703de492742a2753870c4e3b4ee63ef58ab0e875afcef1488bef95f6c2f0b96e19181d1fe0f7ec28b15a9f4581f18ce0685eff28ca773eabc3aa1
7
+ data.tar.gz: 9cdd430036ff931dedc3548005d448f1173bfe135d7eaed8b737f01bf44e23d3467c9ef96a6a0d64d8c6005d1f48b3d57f71e39bb5c9df109fd6230ae784c64a
data/.mutant.yml CHANGED
@@ -1,22 +1,21 @@
1
1
  ---
2
- # Mutant configuration for Phronomy (opensource project)
3
- # See: https://github.com/mbj/mutant
4
-
5
2
  usage: opensource
6
-
7
3
  integration: rspec
8
-
9
4
  includes:
10
5
  - lib
11
-
12
6
  requires:
13
7
  - phronomy
14
-
15
8
  matcher:
16
9
  subjects:
17
10
  - Phronomy::WorkflowContext
18
11
  - Phronomy::WorkflowRunner
19
12
  - Phronomy::Tool::Base
20
- - Phronomy::Context::TokenBudget
21
- - Phronomy::Context::TokenEstimator
13
+ - Phronomy::LlmContextWindow::TokenBudget
14
+ - Phronomy::Agent::ContextAssembler
15
+ - Phronomy::Agent::ContextPolicies::Default
16
+ - Phronomy::Agent::ContextParts::UnitBuilders::DependencyAwareUnitBuilder
17
+ - Phronomy::Agent::ContextParts::Requirements::RequiredContextResolver
18
+ - Phronomy::Agent::ContextParts::Selectors::RecentFirstSelector
19
+ - Phronomy::Agent::ContextParts::Budget::TokenBudgetPacker
20
+ - Phronomy::Agent::ContextPlanValidator
22
21
  - Phronomy::VectorStore::InMemory
data/CHANGELOG.md CHANGED
@@ -9,20 +9,100 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
9
9
 
10
10
  ## [Unreleased]
11
11
 
12
- ### Changed
12
+ ### Agent Context / Knowledge cleanup
13
+
14
+ #### Added
15
+
16
+ - Journal-backed persistent Agent Knowledge via creation-time `knowledge:` and
17
+ post-creation `Agent#add_knowledge`.
18
+ - `Agent#clear_knowledge!` for logical Knowledge invalidation without deleting
19
+ append-only Journal history.
20
+ - ADR-013, defining persistent Knowledge as optional Context candidates selected
21
+ through the Manifest-first Context Policy pipeline.
22
+
23
+ #### Changed
24
+
25
+ - Persistent Knowledge and `before_llm_input` segment candidates now participate
26
+ in Context Policy and token-budget selection instead of being injected as
27
+ mandatory system context.
28
+ - `clear_transcript!`, `clear_knowledge!`, and `reset_context!` now have distinct
29
+ transcript/Knowledge lifecycle semantics.
30
+ - Active Context tests, integration fixtures, benchmarks, mutation subjects,
31
+ design documents, and API snapshots now describe the canonical
32
+ Journal -> ContextCandidate -> Context Policy -> Manifest architecture.
33
+
34
+ #### Removed
35
+
36
+ - `Phronomy::KnowledgeSource`, `Knowledge::Base`, `StaticKnowledge`, and
37
+ `EntityKnowledge`.
38
+ - `static_knowledge*`, `add_knowledge_source`, `instance_knowledge_chunks`,
39
+ `Knowledge#static?`, `StaticKnowledge#source`, and the class-level static
40
+ Knowledge cache/fetch abstraction.
41
+ - `Agent#clear_memory!` and `AgentRoot#memory_generation`.
42
+ - Remaining no-op ContextVersionCache tests, fake legacy-import Context tests,
43
+ obsolete Memory/context integration helpers, legacy `:llm_message` benchmark
44
+ categories, and stale Agent `messages:` test-double signatures.
45
+
46
+ ### Phase 3 cleanup
47
+
48
+ #### Changed
49
+
50
+ - Active documentation, compatibility snapshots, benchmarks, integration fixtures,
51
+ and mutation targets now describe the Manifest-first Context architecture.
52
+ - The Context benchmark now measures `Agent::ContextAssembler` and
53
+ `ContextPolicies::Default` instead of the removed legacy Assembler.
54
+ - ADR-011 is marked Superseded by ADR-012; its historical analysis is retained.
55
+
56
+ #### Removed
57
+
58
+ - Remaining active compatibility references to `context_overhead`,
59
+ `LlmContextWindow::Assembler`, `ContextVersionCache`, Tool
60
+ `on_error :return_empty`, `force_kill:`, `runtime_backend :cooperative`,
61
+ the `Runtime.instance=` setter, tools-splat registration, and wall-clock
62
+ `CancellationToken.new(deadline:)`.
63
+ - Obsolete legacy Assembler / ContextVersionCache executable specs.
13
64
 
14
- - Refactor: `Agent::AsyncEventApi` is now the single implementation of
15
- `invoke`, `invoke_async`, `stream`, `stream_async`, and their session
16
- lifecycle helpers (`_start_invocation`, `_handle_agent_completion`,
17
- `_register_tool_invocation_session`, `_start_approval_resume`). The
18
- duplicate definitions in `Agent::Base` have been removed. No public
19
- behavior change is intended.
20
- - Remove `faraday` and `event_stream_parser` from gemspec declared
21
- dependencies; both are transitive dependencies of `ruby_llm` and are
22
- not used directly by phronomy.
65
+
66
+ ---
67
+
68
+ ## [0.16.0] - 2026-08-08
23
69
 
24
70
  ### Added
25
71
 
72
+ - Stateful Agent identity and persistence:
73
+ - Every concrete Agent definition declares a stable `agent_definition id:, version:`.
74
+ - Every Agent instance has a stable `agent_id`.
75
+ - `Agent::Base.create` creates a persistent Agent instance.
76
+ - `Agent::Base.load` restores an Agent from a shared Persistence backend.
77
+ - `Agent#agent_root`, `#transcript`, `#clear_transcript!`, `#clear_memory!`,
78
+ `#reset_context!`, `#close!`, and `#purge!` provide explicit state lifecycle operations.
79
+
80
+ - Persistence-backed Agent execution state:
81
+ - Agent executions have stable `execution_id` values and are persisted separately from the owning Agent.
82
+ - Suspended approval executions remain represented in Persistence.
83
+ - Resuming after process loss still requires future durable activation rehydration support.
84
+
85
+ - Canonical Complete Execution Log:
86
+ - Phronomy records observed logical execution facts in an append-only Agent Journal.
87
+ - Provider assistant responses preserve assistant content and all Tool Calls as one logical assistant message.
88
+ - Raw Tool return values and the Tool-role messages sent back to the LLM are represented as separate execution facts.
89
+
90
+ - Per-LLM-call canonical Manifests:
91
+ - Each LLM Call is assembled from a canonical Manifest.
92
+ - The Manifest records the logical input selected for that specific LLM Call.
93
+ - Runtime RubyLLM messages are materialized from the Manifest rather than treated as the source of truth.
94
+
95
+ - Context Policy domain:
96
+ - Context candidates are selected from canonical history without deleting the underlying Journal.
97
+ - Tool Call / Tool message protocol dependencies are selected atomically.
98
+ - Required context is validated independently from optional historical context.
99
+ - `ContextBudgetExceededError` is raised when required context cannot fit in the available model budget.
100
+
101
+ - Context import for stateful Agents:
102
+ - Existing user / assistant / Tool history can be supplied through Agent creation context.
103
+ - Imported assistant messages retain their original logical message boundary and Tool Calls.
104
+ - Invalid Tool protocol histories are rejected instead of being guessed or repaired.
105
+
26
106
  - `Workflow#signal(thread_id:, event:, payload:)` for FIFO delivery to a live
27
107
  Workflow FSMSession.
28
108
  - Workflow transition `action:` callbacks, executed after source exit callbacks
@@ -42,27 +122,49 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
42
122
  - EventLoop emits a rate-limited warning when its shared event queue reaches
43
123
  1,000 pending entries. Events are observed only; they are not dropped.
44
124
 
45
- ### Removed
125
+ ### Changed
46
126
 
47
- - Implicit awaiting of Task-returning Workflow/Agent/Tool entry actions and the
48
- Workflow `action_timeout:` DSL. Entry actions are synchronous RTC callbacks.
49
- - The duplicate caller-thread `WorkflowRunner#run_workflow` execution path.
50
- - Agent-wide automatic replay: `Agent::Base.retry_policy` and the `Retryable`
51
- concern. A failed AgentInvocation is no longer started again by Phronomy.
52
- - Agent-class `invoke_timeout`. Callers that need a root deadline should pass an
53
- `InvocationContext` with `deadline:` or `cancellation_token:`.
54
- - Phronomy LLM operation timeout `config[:llm_timeout]`; configure RubyLLM's
55
- `request_timeout` instead.
56
- - Generic Tool retry DSL (`retry_on`, `retry_policies`) and
57
- `config[:tool_timeout]`; Tool/client implementations own their transport policy.
58
- - `max_parallel_tools` from Agent, AgentInvocation, ParallelToolChat, and
59
- InvocationContext.
60
- - Unused `InvocationContext#provider_limits`.
61
- - `Configuration#stream_queue_max_size`, which no longer affected the
62
- Runtime-owned EventLoop streaming path.
127
+ - Agent instances are now always stateful and Persistence-backed.
63
128
 
64
- ### Changed
129
+ - Conversation history ownership has moved from the caller to the Agent:
130
+ callers no longer need to pass the previous `messages` array back on every invocation.
131
+ Completed invocation results may still expose `result[:messages]` as a materialized
132
+ transcript projection.
133
+
134
+ - `agent_definition id:, version:` is required for concrete Agent definitions.
135
+ Loading persisted Agent state validates the stored definition identity and version
136
+ against the runtime Agent class.
137
+
138
+ - Context-window management is now Manifest-first:
139
+ canonical Agent history is retained in the Journal while each LLM Call receives
140
+ only the context selected for its Manifest.
141
+
142
+ - Context pruning no longer means deleting or mutating historical Agent messages.
143
+ Context Policy omission affects only the current LLM Call input.
65
144
 
145
+ - Tool execution results and Tool protocol messages are no longer treated as the
146
+ same value. The raw Tool return value is retained as an execution fact while the
147
+ exact Tool-role message remains independently available for LLM context assembly.
148
+
149
+ - `thread_id` is an execution/correlation identifier rather than the owner of
150
+ conversation state. Persistent Agent identity is defined by `agent_id`.
151
+
152
+ - `context_overhead` is retained only for the legacy `build_context` path.
153
+ Manifest-first context assembly accounts for actual mandatory context instead of
154
+ reserving this value as Tool/system-prompt overhead.
155
+
156
+ - Phronomy now requires `ruby_llm >= 1.15, < 2` so Provider assistant messages can
157
+ be captured before Agent-owned Tool execution begins.
158
+
159
+ - Refactor: `Agent::AsyncEventApi` is now the single implementation of
160
+ `invoke`, `invoke_async`, `stream`, `stream_async`, and their session
161
+ lifecycle helpers (`_start_invocation`, `_handle_agent_completion`,
162
+ `_register_tool_invocation_session`, `_start_approval_resume`). The
163
+ duplicate definitions in `Agent::Base` have been removed. No public
164
+ behavior change is intended.
165
+ - Remove `faraday` and `event_stream_parser` from gemspec declared
166
+ dependencies; both are transitive dependencies of `ruby_llm` and are
167
+ not used directly by phronomy.
66
168
  - `Workflow#invoke`, `#invoke_async`, and `#stream` now share context
67
169
  preparation, StateStore load/save, EventLoop registration, and FSMSession
68
170
  execution.
@@ -81,6 +183,35 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
81
183
  bounded workers and queues remain the coarse process-protection boundary.
82
184
  - Caller-provided deadline and cancellation-token propagation is unchanged.
83
185
 
186
+ ### Removed
187
+
188
+ - Caller-managed `messages:` continuation from the Agent invocation API.
189
+ Stateful Agent history is now obtained from the Agent's persisted Journal.
190
+
191
+ - `Agent::Base#trim_messages` and the legacy Agent-level message-trimming model.
192
+ Context selection is performed by the Context Policy / Manifest assembly path.
193
+
194
+ - The assumption that `build_context` and the legacy `LlmContextWindow::Assembler`
195
+ are the long-term single authority for LLM input. ADR-012 defines the replacement
196
+ Journal / Context Policy / Manifest architecture.
197
+
198
+ - Implicit awaiting of Task-returning Workflow/Agent/Tool entry actions and the
199
+ Workflow `action_timeout:` DSL. Entry actions are synchronous RTC callbacks.
200
+ - The duplicate caller-thread `WorkflowRunner#run_workflow` execution path.
201
+ - Agent-wide automatic replay: `Agent::Base.retry_policy` and the `Retryable`
202
+ concern. A failed AgentInvocation is no longer started again by Phronomy.
203
+ - Agent-class `invoke_timeout`. Callers that need a root deadline should pass an
204
+ `InvocationContext` with `deadline:` or `cancellation_token:`.
205
+ - Phronomy LLM operation timeout `config[:llm_timeout]`; configure RubyLLM's
206
+ `request_timeout` instead.
207
+ - Generic Tool retry DSL (`retry_on`, `retry_policies`) and
208
+ `config[:tool_timeout]`; Tool/client implementations own their transport policy.
209
+ - `max_parallel_tools` from Agent, AgentInvocation, ParallelToolChat, and
210
+ InvocationContext.
211
+ - Unused `InvocationContext#provider_limits`.
212
+ - `Configuration#stream_queue_max_size`, which no longer affected the
213
+ Runtime-owned EventLoop streaming path.
214
+
84
215
  ### Fixed
85
216
 
86
217
  - `Agent#approve` now rejects EventLoop re-entry instead of synchronously waiting
data/CONTRIBUTING.md CHANGED
@@ -58,15 +58,20 @@ When adding, removing, or renaming a public method or class:
58
58
 
59
59
  Key design decisions are documented as ADRs in
60
60
  [docs/decisions/](docs/decisions/). Read these before making significant changes
61
- to the threading model, caching strategy, or public API shape.
61
+ to the threading model, persistence/context authority, or public API shape.
62
+
63
+ For Agent Context work, ADR-012 and ADR-013 define the current Journal,
64
+ Manifest, Context Policy and persistent Knowledge model.
62
65
 
63
66
  ---
64
67
 
65
68
  ## Mutation Testing
66
69
 
67
- Phronomy uses [mutant](https://github.com/mbj/mutant) to verify that each test
68
- actually detects real code changes. Mutation tests are **not** part of the
69
- required CI gate (they are slow), but run nightly via `.github/workflows/nightly-mutation.yml`.
70
+ Phronomy uses [mutant](https://github.com/mbj/mutant) to verify that tests detect
71
+ real code changes. Mutation tests are not part of the required CI gate. The
72
+ repository contains `.github/workflows/nightly-mutation.yml` for mutation-run
73
+ automation; whether that workflow is enabled is an operational choice and is
74
+ not a normal pull-request requirement.
70
75
 
71
76
  ### Run mutation tests locally
72
77
 
@@ -78,18 +83,25 @@ bash scripts/run_mutation.sh
78
83
  bash scripts/run_mutation.sh "Phronomy::WorkflowContext"
79
84
  ```
80
85
 
81
- ### Coverage targets
82
-
83
- | Subject | Baseline | Target |
84
- |---|---|---|
85
- | `Phronomy::WorkflowContext` | 84.85% | ≥ 80% |
86
- | `Phronomy::WorkflowRunner` | — | ≥ 80% |
87
- | `Phronomy::Tool::Base` | 55.74% | ≥ 80% |
88
- | `Phronomy::Context::TokenBudget` | — | ≥ 80% |
89
- | `Phronomy::VectorStore::InMemory` | — | ≥ 80% |
90
-
91
- When you add or modify tests for a covered subject, run mutation tests to confirm
92
- the score does not regress.
86
+ ### Covered subjects
87
+
88
+ The authoritative subject list is `.mutant.yml`. It currently includes:
89
+
90
+ - `Phronomy::WorkflowContext`
91
+ - `Phronomy::WorkflowRunner`
92
+ - `Phronomy::Tool::Base`
93
+ - `Phronomy::LlmContextWindow::TokenBudget`
94
+ - `Phronomy::Agent::ContextAssembler`
95
+ - `Phronomy::Agent::ContextPolicies::Default`
96
+ - `Phronomy::Agent::ContextParts::UnitBuilders::DependencyAwareUnitBuilder`
97
+ - `Phronomy::Agent::ContextParts::Requirements::RequiredContextResolver`
98
+ - `Phronomy::Agent::ContextParts::Selectors::RecentFirstSelector`
99
+ - `Phronomy::Agent::ContextParts::Budget::TokenBudgetPacker`
100
+ - `Phronomy::Agent::ContextPlanValidator`
101
+ - `Phronomy::VectorStore::InMemory`
102
+
103
+ When you add or modify tests for a covered subject, run mutation tests locally
104
+ when practical and investigate meaningful score regressions.
93
105
 
94
106
  ---
95
107