@open-agent-toolkit/cli 0.1.43 → 0.1.46

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 (94) hide show
  1. package/assets/agents/oat-reviewer.md +2 -2
  2. package/assets/config/dispatch-matrix-recommendation.json +23 -0
  3. package/assets/docs/cli-utilities/config-and-local-state.md +7 -0
  4. package/assets/docs/cli-utilities/configuration.md +104 -25
  5. package/assets/docs/cli-utilities/workflow-gates.md +79 -16
  6. package/assets/docs/contributing/code.md +10 -4
  7. package/assets/docs/contributing/hooks-and-safety.md +23 -0
  8. package/assets/docs/provider-sync/config.md +5 -1
  9. package/assets/docs/provider-sync/manifest-and-drift.md +6 -1
  10. package/assets/docs/provider-sync/providers.md +6 -3
  11. package/assets/docs/provider-sync/scope-and-surface.md +2 -1
  12. package/assets/docs/reference/oat-directory-structure.md +2 -2
  13. package/assets/docs/workflows/projects/dispatch-ceiling.md +110 -27
  14. package/assets/docs/workflows/projects/implementation-execution.md +20 -13
  15. package/assets/public-package-versions.json +4 -4
  16. package/assets/skills/oat-project-implement/SKILL.md +155 -58
  17. package/assets/skills/oat-project-plan/SKILL.md +22 -3
  18. package/assets/skills/oat-project-quick-start/SKILL.md +54 -23
  19. package/assets/templates/state.md +5 -0
  20. package/dist/commands/config/index.d.ts +6 -0
  21. package/dist/commands/config/index.d.ts.map +1 -1
  22. package/dist/commands/config/index.js +429 -20
  23. package/dist/commands/doctor/index.d.ts +6 -1
  24. package/dist/commands/doctor/index.d.ts.map +1 -1
  25. package/dist/commands/doctor/index.js +209 -19
  26. package/dist/commands/gate/index.d.ts +39 -2
  27. package/dist/commands/gate/index.d.ts.map +1 -1
  28. package/dist/commands/gate/index.js +343 -30
  29. package/dist/commands/internal/cursor-current-target.d.ts +37 -0
  30. package/dist/commands/internal/cursor-current-target.d.ts.map +1 -0
  31. package/dist/commands/internal/cursor-current-target.js +228 -0
  32. package/dist/commands/internal/index.d.ts.map +1 -1
  33. package/dist/commands/internal/index.js +2 -0
  34. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  35. package/dist/commands/project/dispatch-ceiling/index.js +487 -17
  36. package/dist/commands/providers/codex/index.d.ts +4 -0
  37. package/dist/commands/providers/codex/index.d.ts.map +1 -0
  38. package/dist/commands/providers/codex/index.js +7 -0
  39. package/dist/commands/providers/codex/materialize.d.ts +5 -0
  40. package/dist/commands/providers/codex/materialize.d.ts.map +1 -0
  41. package/dist/commands/providers/codex/materialize.js +152 -0
  42. package/dist/commands/providers/index.d.ts +2 -2
  43. package/dist/commands/providers/index.d.ts.map +1 -1
  44. package/dist/commands/providers/index.js +4 -2
  45. package/dist/commands/providers/providers.types.d.ts +23 -0
  46. package/dist/commands/providers/providers.types.d.ts.map +1 -1
  47. package/dist/commands/shared/codex-strays.d.ts.map +1 -1
  48. package/dist/commands/shared/codex-strays.js +11 -1
  49. package/dist/commands/status/index.d.ts +4 -1
  50. package/dist/commands/status/index.d.ts.map +1 -1
  51. package/dist/commands/status/index.js +1 -1
  52. package/dist/commands/sync/index.d.ts.map +1 -1
  53. package/dist/commands/sync/index.js +1 -1
  54. package/dist/commands/sync/sync.types.d.ts +4 -1
  55. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  56. package/dist/config/dispatch-ceiling-preset.d.ts +4 -0
  57. package/dist/config/dispatch-ceiling-preset.d.ts.map +1 -1
  58. package/dist/config/dispatch-ceiling-preset.js +3 -0
  59. package/dist/config/dispatch-policy-options.d.ts +20 -0
  60. package/dist/config/dispatch-policy-options.d.ts.map +1 -0
  61. package/dist/config/dispatch-policy-options.js +96 -0
  62. package/dist/config/oat-config.d.ts +21 -5
  63. package/dist/config/oat-config.d.ts.map +1 -1
  64. package/dist/config/oat-config.js +118 -10
  65. package/dist/config/resolve.js +12 -0
  66. package/dist/manifest/manifest.types.d.ts +12 -12
  67. package/dist/providers/ceiling/registry.d.ts +7 -5
  68. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  69. package/dist/providers/ceiling/registry.js +32 -5
  70. package/dist/providers/codex/codec/config-merge.d.ts +6 -0
  71. package/dist/providers/codex/codec/config-merge.d.ts.map +1 -1
  72. package/dist/providers/codex/codec/config-merge.js +7 -0
  73. package/dist/providers/codex/codec/materialize.d.ts +16 -0
  74. package/dist/providers/codex/codec/materialize.d.ts.map +1 -0
  75. package/dist/providers/codex/codec/materialize.js +57 -0
  76. package/dist/providers/codex/codec/shared.d.ts +1 -0
  77. package/dist/providers/codex/codec/shared.d.ts.map +1 -1
  78. package/dist/providers/codex/codec/shared.js +9 -1
  79. package/dist/providers/codex/codec/sync-extension.d.ts +7 -1
  80. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  81. package/dist/providers/codex/codec/sync-extension.js +183 -46
  82. package/dist/providers/identity/availability.d.ts +45 -0
  83. package/dist/providers/identity/availability.d.ts.map +1 -0
  84. package/dist/providers/identity/availability.js +353 -0
  85. package/dist/providers/identity/family.d.ts +13 -0
  86. package/dist/providers/identity/family.d.ts.map +1 -0
  87. package/dist/providers/identity/family.js +32 -0
  88. package/dist/providers/identity/provenance.d.ts +21 -0
  89. package/dist/providers/identity/provenance.d.ts.map +1 -0
  90. package/dist/providers/identity/provenance.js +65 -0
  91. package/dist/providers/identity/stamp.d.ts +35 -0
  92. package/dist/providers/identity/stamp.d.ts.map +1 -0
  93. package/dist/providers/identity/stamp.js +171 -0
  94. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Dispatch Policy
3
- description: 'How OAT dispatch policy works: managed capped tiers, managed Uncapped, Inherit Host Defaults, legacy dispatch-ceiling compatibility, and provider-specific enforcement.'
3
+ description: 'How OAT dispatch policy works: managed tiers, dispatch matrix cells, ordered routes, producer provenance, legacy compatibility, and provider-specific enforcement.'
4
4
  ---
5
5
 
6
6
  # Dispatch Policy
@@ -21,20 +21,27 @@ dispatch policy terminology.
21
21
  For raw config keys see [Configuration](../../cli-utilities/configuration.md);
22
22
  for execution-time behavior see [Implementation Execution](implementation-execution.md).
23
23
 
24
+ Multi-family providers such as Cursor use the same abstract policy names, but
25
+ their concrete model values come from a dispatch matrix under
26
+ `workflow.dispatchCeiling.providers.*`. A matrix cell can be a single value, a
27
+ per-tier value, or an ordered route for escalation.
28
+
24
29
  ## Policy Choices
25
30
 
26
- | Policy | Mode | Codex target | Claude target | Meaning |
27
- | ----------------------- | ------- | ------------ | ------------- | -------------------------------------------- |
28
- | `Economy` | managed | `medium` | `sonnet` | Lower-cost managed cap |
29
- | `Balanced` | managed | `high` | `sonnet` | Default managed cap |
30
- | `High` | managed | `xhigh` | `opus` | High-capability managed cap |
31
- | `Frontier` | managed | `xhigh` | `fable` | Top managed tier currently exposed by OAT |
32
- | `Uncapped` | managed | none | none | OAT selects preferred controls without a cap |
33
- | `Inherit Host Defaults` | inherit | none | none | OAT does not select model/effort controls |
31
+ | Policy | Mode | Codex cap | Claude target | Meaning |
32
+ | ----------------------- | ------- | --------- | ------------- | -------------------------------------------- |
33
+ | `Economy` | managed | `medium` | `sonnet` | Lower-cost managed cap |
34
+ | `Balanced` | managed | `high` | `sonnet` | Default managed cap |
35
+ | `High` | managed | `xhigh` | `opus` | High-capability managed cap |
36
+ | `Frontier` | managed | `xhigh` | `fable` | Top managed tier currently exposed by OAT |
37
+ | `Uncapped` | managed | none | none | OAT selects preferred controls without a cap |
38
+ | `Inherit Host Defaults` | inherit | none | none | OAT does not select model/effort controls |
34
39
 
35
40
  `Uncapped` is explicit managed state. It is not represented by omitting policy
36
41
  state. Existing projects with absent legacy ceiling state remain unresolved or
37
- legacy-compatible; they do not silently become managed `Uncapped`.
42
+ legacy-compatible; they do not silently become managed `Uncapped`. `Unresolved`
43
+ is a deferral state for planning/preflight only. Implementation preflight must
44
+ resolve a managed policy or inherit/default mode before work starts.
38
45
 
39
46
  ## Config Shapes
40
47
 
@@ -85,13 +92,55 @@ oat_dispatch_policy:
85
92
  Legacy compatibility keys remain readable:
86
93
 
87
94
  - `workflow.dispatchCeiling.preset`
88
- - `workflow.dispatchCeiling.providers.codex`
89
- - `workflow.dispatchCeiling.providers.claude`
95
+ - `workflow.dispatchCeiling.providers.<provider>`
96
+ - `workflow.dispatchCeiling.providers.<provider>.<tier>`
90
97
  - `oat_dispatch_ceiling`
91
98
 
92
99
  Legacy preset names map into the managed ladder: `cost-conscious` maps to
93
100
  `Economy`, `balanced` maps to `Balanced`, and `maximum` maps to `High`.
94
101
 
102
+ ## Dispatch Matrix
103
+
104
+ The dispatch matrix maps the abstract policy rung (`economy`, `balanced`,
105
+ `high`, `frontier`) to concrete provider controls. Existing bare Codex and
106
+ Claude values remain valid, and multi-family providers can use tier cells:
107
+
108
+ ```bash
109
+ oat config adopt dispatch-matrix --shared
110
+ oat config set workflow.dispatchCeiling.providers.cursor.balanced composer-2.5 --shared
111
+ oat config set workflow.dispatchCeiling.providers.cursor.high gpt-5.5-xhigh --shared
112
+ ```
113
+
114
+ For ordered escalation, write a route in config JSON. The resolver selects the
115
+ floor entry at escalation level `0` and advances by route entry when the
116
+ implementation/fix loop escalates:
117
+
118
+ ```json
119
+ {
120
+ "workflow": {
121
+ "dispatchCeiling": {
122
+ "providers": {
123
+ "cursor": {
124
+ "high": [
125
+ "composer-2.5",
126
+ { "harness": "cursor", "model": "gpt-5.5-xhigh" }
127
+ ],
128
+ "frontier": [
129
+ { "harness": "cursor", "model": "gpt-5.5-xhigh" },
130
+ { "harness": "cursor", "model": "fable-5" }
131
+ ]
132
+ }
133
+ }
134
+ }
135
+ }
136
+ }
137
+ ```
138
+
139
+ Project `state.md` may carry only sparse project-specific matrix overrides
140
+ under `oat_dispatch_policy.matrix`. The full reusable matrix belongs in user,
141
+ shared, or local config so switching harnesses mid-project re-resolves the same
142
+ abstract policy through the active provider column.
143
+
95
144
  ## How Resolution Works
96
145
 
97
146
  Before dispatching a subagent, the orchestrator calls:
@@ -105,6 +154,7 @@ For implementer or fix dispatch, pass the preferred runtime control:
105
154
  ```bash
106
155
  oat project dispatch-ceiling resolve --provider codex --role implementer --preferred high --json
107
156
  oat project dispatch-ceiling resolve --provider claude --role implementer --preferred opus --json
157
+ oat project dispatch-ceiling resolve --provider cursor --role implementer --preferred high --escalation-level 0 --json
108
158
  ```
109
159
 
110
160
  The resolver returns the resolved policy, optional cap, source, provider default
@@ -114,6 +164,9 @@ Selection modes:
114
164
 
115
165
  - `capped` - implementer/fix dispatch selects `min(preferred, cap)`.
116
166
  - `uncapped` - implementer/fix dispatch selects the preferred value.
167
+ - `matrix-pinned` - a matrix cell supplied the selected provider value.
168
+ - `prompt-persisted` - an interactive prompt filled a missing cell and persisted it.
169
+ - `escalation-target` - an ordered route entry supplied the selected target.
117
170
  - `review-target` - reviewer dispatch targets a configured cap when one exists.
118
171
  - `no-review-target` - managed uncapped reviewer dispatch has no configured
119
172
  target and falls back to the base/unpinned reviewer.
@@ -122,23 +175,53 @@ Selection modes:
122
175
 
123
176
  ## Provider Behavior
124
177
 
125
- | | Codex | Claude Code | Unsupported provider |
126
- | ----------------- | ------------------------------------------- | --------------------------------------- | -------------------- |
127
- | Managed mechanism | Pinned role variants | Task `model` argument | None |
128
- | Axis | effort (`low < medium < high < xhigh`) | model (`haiku < sonnet < opus < fable`) | None |
129
- | Capped policy | selected pinned variant up to cap | selected Task model up to cap | advisory/unsupported |
130
- | Uncapped | preferred pinned variant, no cap | preferred Task model, no cap | advisory/unsupported |
131
- | Inherit/default | base/unpinned role follows provider default | omit `model` | normal behavior |
132
-
133
- Codex uses pinned variants because per-call effort controls were unreliable in
134
- dogfooding. For managed `Uncapped`, OAT still selects the preferred pinned
135
- variant; the dispatching host should verify whether upward effort selection is
136
- actually honored in the current session.
178
+ | | Codex | Claude Code | Cursor / model-arg providers | Unsupported provider |
179
+ | ----------------- | ----------------------------------------------------- | --------------------------------------- | ---------------------------- | -------------------- |
180
+ | Managed mechanism | Materialized roles with explicit `model` and `effort` | Task `model` argument | Task/CLI `model` argument | None |
181
+ | Axis | model plus effort (`low < medium < high < xhigh`) | model (`haiku < sonnet < opus < fable`) | opaque model slug | None |
182
+ | Capped policy | materialized target selected up to cap | selected Task model up to cap | selected matrix cell | advisory/unsupported |
183
+ | Uncapped | preferred materialized target, no cap | preferred Task model, no cap | preferred matrix cell | advisory/unsupported |
184
+ | Inherit/default | base/unpinned role follows provider default | omit `model` | omit model selection | normal behavior |
185
+
186
+ Codex uses materialized roles because per-call model/effort controls were
187
+ unreliable in dogfooding. The resolver compiles an explicit model+effort target
188
+ into a role name such as `oat-phase-implementer-gpt-5-6-terra-xhigh`, and the
189
+ Codex spawn payload uses that role as `agent_type`. For managed `Uncapped`, OAT
190
+ still selects the preferred materialized target. If the Codex preferred value is
191
+ an effort rather than a matrix tier, OAT looks up the highest managed tier that
192
+ compiles to that effort before resolving the matrix target; for example,
193
+ `--preferred xhigh` resolves through the `frontier` matrix cell. The dispatching
194
+ host should verify whether upward effort selection is actually honored in the
195
+ current session. The old effort-only Codex pins are not the managed dispatch
196
+ contract for new projects.
137
197
 
138
198
  Claude Code uses the per-call Task `model` argument. It has no OAT-managed
139
199
  per-dispatch effort axis, so dispatch logs use `effort_axis=not-applicable`.
140
200
  `Frontier` maps to Claude `fable`.
141
201
 
202
+ Cursor and other model-arg providers use matrix values as opaque slugs. OAT
203
+ validates availability with provider oracles when possible, but tier semantics
204
+ come from the configured matrix, not from a built-in model catalog. For Cursor,
205
+ that validation checks subagent Task eligibility, not just broad catalog
206
+ visibility, because a slug can appear in `cursor-agent models` and still be
207
+ rejected for subagent dispatch.
208
+
209
+ ## Producer Provenance
210
+
211
+ Dispatch notes use a parseable single-line stamp so later gates can identify
212
+ the producer family:
213
+
214
+ ```text
215
+ Dispatch: scope=p06 action=implementation role=implementer producer=gpt-5.5-xhigh provenance=declared model_axis=selected:gpt-5.5-xhigh effort_axis=not-applicable dispatch_policy=high dispatch_ceiling=xhigh target=cursor
216
+ ```
217
+
218
+ `producer` is the resolved model slug when OAT knows it, otherwise `unknown`.
219
+ `provenance` is one of `declared`, `observed`, `inferred`, or `unknown`.
220
+ Concrete same-harness model arguments can be declared. Codex materialized
221
+ model+effort roles declare `model_axis=selected:<model>` and
222
+ `effort_axis=selected:<effort>` from resolver output, but producer identity
223
+ remains `unknown` unless an observed or inferred model identity is available.
224
+
142
225
  ## Implementer, Fix, and Reviewer Behavior
143
226
 
144
227
  For implementer and fix dispatches:
@@ -164,9 +247,9 @@ say `provider-default`.
164
247
  Examples:
165
248
 
166
249
  ```text
167
- Dispatch policy: balanced; selected=high; cap=high (codex, enforced — variant oat-phase-implementer-high)
168
- Dispatch policy: high; selected=xhigh; cap=xhigh (codex, enforced — variant oat-reviewer-xhigh)
169
- Dispatch policy: uncapped; selected=xhigh; cap=none (codex, enforced — variant oat-phase-implementer-xhigh)
250
+ Dispatch policy: balanced; selected=high; cap=high (codex, enforced — variant oat-phase-implementer-gpt-5-6-terra-high)
251
+ Dispatch policy: high; selected=xhigh; cap=xhigh (codex, enforced — variant oat-reviewer-gpt-5-6-terra-xhigh)
252
+ Dispatch policy: uncapped; selected=xhigh; cap=none (codex, enforced — variant oat-phase-implementer-gpt-5-6-sol-xhigh)
170
253
  Dispatch policy: inherit host defaults; selected=none; cap=none (codex, advisory — base role follows provider default)
171
254
  Dispatch policy: frontier; selected=fable; cap=fable (claude, enforced — Task model arg)
172
255
  ```
@@ -70,16 +70,16 @@ Runtime dispatch reads the resolved policy and provider-specific selection only.
70
70
  For Codex, provider default effort is displayed when available but is not treated as managed `Uncapped` or as a cap. Provider defaults apply only to explicit inherit/default behavior or base/unpinned fallback paths.
71
71
 
72
72
  ```text
73
- Dispatch policy: balanced (codex, managed capped — pinned-variant)
73
+ Dispatch policy: balanced (codex, managed capped — materialized-role)
74
74
  Resolved cap: high
75
75
  Source: project state
76
76
  Provider default effort: medium
77
- Note: OAT will use pinned subagent variants up to high. Base/unpinned roles resolve through the provider default only on fallback paths.
77
+ Note: OAT will use resolver-returned materialized Codex role names up to high. Base/unpinned roles resolve through the provider default only on fallback paths.
78
78
  ```
79
79
 
80
80
  **Enforcement modes** (from resolver):
81
81
 
82
- - `enforced` — the adapter compiled concrete dispatch args and the provider accepted them (Codex: pinned variants; Claude: Task `model` parameter).
82
+ - `enforced` — the adapter compiled concrete dispatch args and the provider accepted them (Codex: materialized model+effort roles; Claude: Task `model` parameter).
83
83
  - `advisory` — the provider is supported but no value resolved, or an upgrade request was not honored by the provider.
84
84
  - `unsupported` — the provider has no registered adapter; the policy is informational only. Dispatch follows provider behavior.
85
85
 
@@ -112,7 +112,14 @@ Model and effort are separate axes. Each axis logs one of these states:
112
112
  - `not-applicable` — this host/API has no meaningful per-dispatch concept for that axis.
113
113
  - `host-auto` — exceptional; the host uses that axis internally but the orchestrator cannot read or pin it.
114
114
 
115
- In Codex, implementation and fix dispatch classify a preferred effort (`low`, `medium`, `high`, or `xhigh`) and pass it to `oat project dispatch-ceiling resolve --provider codex --role implementer --preferred <effort>`. For capped managed policies, the resolver selects `min(preferred, resolved_cap)` and returns the matching pinned role. For managed `Uncapped`, the resolver selects the preferred pinned role with no cap. For inherit/default mode, it returns no pinned role and OAT uses the base/unpinned role. Reviewer dispatch targets the configured cap only when a capped managed policy exists; managed `Uncapped` and inherit/default use base `oat-reviewer` fallback.
115
+ In Codex, implementation and fix dispatch classify a preferred effort (`low`, `medium`, `high`, or `xhigh`) and pass it to `oat project dispatch-ceiling resolve --provider codex --role implementer --preferred <effort>`. For capped managed policies, the resolver selects `min(preferred, resolved_cap)` and returns a materialized role name compiled from an explicit model+effort target. For managed `Uncapped`, the resolver selects the preferred materialized role with no cap. For inherit/default mode, it returns no materialized role and OAT uses the base/unpinned role. Reviewer dispatch targets the configured cap only when a capped managed policy exists; managed `Uncapped` and inherit/default use base `oat-reviewer` fallback.
116
+
117
+ Because Codex preferred values are effort names while dispatch matrix cells are
118
+ keyed by OAT tiers, managed `Uncapped` maps preferred efforts through the
119
+ managed tier table before resolving matrix targets. For example, `xhigh` maps to
120
+ the highest matching tier, `frontier`, so `--preferred xhigh` can resolve a
121
+ `frontier` Codex matrix target such as
122
+ `oat-phase-implementer-gpt-5-6-sol-xhigh`.
116
123
 
117
124
  In Claude Code, implementation and fix dispatch classify a preferred model tier (`haiku`, `sonnet`, `opus`, or `fable`) and pass it to `oat project dispatch-ceiling resolve --provider claude --role implementer --preferred <model> --orchestrator-tier <current-orchestrator-tier>`. Capped policies select `min(preferred, resolved_cap)`, managed `Uncapped` selects the preferred model, and inherit/default omits `model`. Reviewer dispatch passes a `model` only when the resolver returns one. The separate effort axis is `not-applicable`.
118
125
 
@@ -135,9 +142,9 @@ Selected effort: medium
135
142
  Policy source: repo config
136
143
  Provider default effort: high
137
144
  Selection mode: capped
138
- Model axis: inherited
145
+ Model axis: selected:gpt-5.6-terra
139
146
  Effort axis: selected:medium
140
- Dispatch target: oat-phase-implementer-medium
147
+ Dispatch target: oat-phase-implementer-gpt-5-6-terra-medium
141
148
  Rationale: shared TypeScript/config substrate; high preferred due to integration risk, capped by configured policy.
142
149
 
143
150
  OAT Dispatch: Phase p03 review
@@ -148,9 +155,9 @@ Selected effort: xhigh
148
155
  Policy source: project state
149
156
  Provider default effort: medium
150
157
  Selection mode: review-target
151
- Model axis: inherited
158
+ Model axis: selected:gpt-5.6-terra
152
159
  Effort axis: selected:xhigh
153
- Dispatch target: oat-reviewer-xhigh
160
+ Dispatch target: oat-reviewer-gpt-5-6-terra-xhigh
154
161
  Rationale: reviewer runs at the configured policy cap for deterministic quality gate behavior.
155
162
 
156
163
  OAT Dispatch: Phase p03 implementation
@@ -162,10 +169,10 @@ Selected effort: xhigh
162
169
  Policy source: project state
163
170
  Provider default effort: medium
164
171
  Selection mode: uncapped
165
- Model axis: inherited
172
+ Model axis: selected:gpt-5.6-sol
166
173
  Effort axis: selected:xhigh
167
- Dispatch target: oat-phase-implementer-xhigh
168
- Rationale: high-risk phase; managed uncapped policy allows the preferred pinned variant.
174
+ Dispatch target: oat-phase-implementer-gpt-5-6-sol-xhigh
175
+ Rationale: high-risk phase; managed uncapped policy allows the preferred materialized target.
169
176
 
170
177
  OAT Dispatch: Phase p04 implementation
171
178
  Host: Other
@@ -203,10 +210,10 @@ Add Dispatch Profile rows only when the user has an explicit constraint or prefe
203
210
  For each phase in the plan (whether sequential or inside a parallel group):
204
211
 
205
212
  1. **Select runtime dispatch control** for the phase and log the chosen control plus rationale.
206
- 2. **Dispatch the selected implementer role** with a Phase Scope block (project path, phase id, artifact paths, commit convention, workflow mode, and dispatch context when known). In Codex, `effort_axis=selected:low|medium|high|xhigh` uses `oat-phase-implementer-low|medium|high|xhigh`. Base `oat-phase-implementer` means provider-default/unpinned fallback.
213
+ 2. **Dispatch the selected implementer role** with a Phase Scope block (project path, phase id, artifact paths, commit convention, workflow mode, and dispatch context when known). In Codex, selected model+effort axes use the resolver-returned materialized role name, such as `oat-phase-implementer-gpt-5-6-terra-xhigh`. Base `oat-phase-implementer` means provider-default/unpinned fallback.
207
214
  3. **Receive the summary:** `DONE | DONE_WITH_CONCERNS | NEEDS_CONTEXT | BLOCKED`.
208
215
  - `BLOCKED` stops the run and surfaces the blocker to the user.
209
- 4. **Dispatch the selected reviewer role** with a Review Scope block (phase id, commit range, optional files-changed hint, and dispatch context). The commit range is authoritative; the file list is only orientation metadata. In Codex, pass this as a self-contained packet with `fork_context: false`; use an `oat-reviewer-<value>` variant only for capped managed policies, and use base `oat-reviewer` for managed `Uncapped` or inherit/default. In Claude Code, pass a review `model` only when the resolver returns one and always record `effort_axis=not-applicable`. If the reviewer does not conclude on the first wait, poll once more, then send a concise "return now with current findings" nudge before falling back inline for that phase.
216
+ 4. **Dispatch the selected reviewer role** with a Review Scope block (phase id, commit range, optional files-changed hint, and dispatch context). The commit range is authoritative; the file list is only orientation metadata. In Codex, pass this as a self-contained packet with `fork_context: false`; use the resolver-returned materialized reviewer role only for capped managed policies, and use base `oat-reviewer` for managed `Uncapped` or inherit/default. In Claude Code, pass a review `model` only when the resolver returns one and always record `effort_axis=not-applicable`. If the reviewer does not conclude on the first wait, poll once more, then send a concise "return now with current findings" nudge before falling back inline for that phase.
210
217
  5. **Parse the verdict:** zero Critical + zero Important findings → `pass`; otherwise `fail`.
211
218
  6. **On fail, run the bounded fix loop** (see below).
212
219
  7. **Update artifacts** (`implementation.md`, `plan.md` review row, `state.md`) and make the mandatory bookkeeping commit.
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.1.43",
3
- "docs-config": "0.1.43",
4
- "docs-theme": "0.1.43",
5
- "docs-transforms": "0.1.43"
2
+ "cli": "0.1.46",
3
+ "docs-config": "0.1.46",
4
+ "docs-theme": "0.1.46",
5
+ "docs-transforms": "0.1.46"
6
6
  }