@open-agent-toolkit/cli 0.1.59 → 0.1.62

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.
@@ -2,40 +2,55 @@
2
2
 
3
3
  This reference preserves the route-specific implementation contract. Load it only when the entry skill routes execution here.
4
4
 
5
+ The shared dispatch engine (`oat-dispatch-subagents`) and the project adapter
6
+ (`oat-project-dispatch-subagents`) own capability probing, catalog
7
+ observation, route selection, accepted-launch terminality, continuation,
8
+ recovery, and the structured dispatch record. This reference adds only the
9
+ implement-workflow specifics: tier selection, dispatch-policy preflight,
10
+ resolver invocation shapes, and the logs this workflow must emit. Where this
11
+ reference and the shared skills appear to overlap, the shared skills are
12
+ canonical.
13
+
5
14
  ### Step 0.5: Capability Detection and Tier Selection
6
15
 
7
- **Mandatory target-first order:** Complete Dispatch Policy Preflight and resolve
8
- the concrete managed Codex target before probing generic agent availability or
9
- locking Tier 1/Tier 2. A concrete target takes precedence over tier selection:
10
- first send the exact registered role through native dispatch. Only a native
11
- role-selection rejection permits an explicitly pinned fresh Codex child. If
12
- neither exact route is possible, inline execution is allowed only with verified
13
- equivalent current-host model and effort controls; otherwise block before work
14
- starts. Explicit inherit/default and documented managed-uncapped reviewer
15
- behavior remain the only base-role exceptions.
16
-
17
- For a concrete managed Codex role, first send the resolver-returned Codex
18
- variant through the native spawn API as `agent_type`. Spawn acceptance plus the
19
- constructed launcher payload is configured invocation evidence; independent
20
- runtime telemetry or agent self-report is not required. Launch a fresh Codex
21
- child pinned to the resolver-returned model and effort with canonical role
22
- instructions only after a native role-selection rejection as defined below. If
23
- that fresh child cannot be launched, fail closed and block; never substitute
24
- the coordinator or base role.
16
+ **Mandatory target-first order:** Complete Dispatch Policy Preflight and
17
+ resolve the concrete managed target before probing generic agent availability
18
+ or locking Tier 1/Tier 2. A concrete target takes precedence over tier
19
+ selection: first send the exact registered role through native dispatch. For
20
+ Codex, the resolver-returned Codex variant must first be sent through the
21
+ native spawn API as native `agent_type`; spawn acceptance plus the constructed
22
+ launcher payload is configured invocation evidence, and independent runtime
23
+ telemetry or agent self-report is not required. Launch a fresh Codex child
24
+ pinned to the resolver target's explicit model, reasoning effort, and
25
+ canonical role instructions from `.agents/agents/oat-phase-implementer.md` or
26
+ `.agents/agents/oat-reviewer.md` only after a native role-selection rejection
27
+ as defined below.
28
+ If that fresh child cannot be launched, fail closed and block; never
29
+ substitute a base or coordinator role for a managed phase target. Inline
30
+ execution is allowed only with verified equivalent current-host model and
31
+ effort controls. Explicit inherit/default behavior and the documented
32
+ managed-uncapped reviewer fallback remain the only base-role exceptions.
25
33
 
26
34
  Use base `oat-phase-implementer` only for the allowed exceptions above:
27
- explicit inherit/default behavior. It is never a managed phase-target fallback.
28
-
29
- Detect whether native subagent dispatch is available. The detection logic follows the same pattern used by `oat-project-review-provide` but produces a two-tier outcome (no fresh-session tier — this skill runs autonomously and cannot block on user-initiated fresh sessions mid-run).
30
-
31
- Detection logic:
35
+ explicit inherit/default behavior. It is never a managed phase-target
36
+ fallback.
32
37
 
33
- - If the host is Claude Code, check Task-tool availability with `subagent_type: "oat-phase-implementer"` and `subagent_type: "oat-reviewer"`. Available → Tier 1.
34
- - If the host is Cursor, use Cursor-native invocation. Available → Tier 1.
35
- - If the host is Codex multi-agent, verify `[features] multi_agent = true` and whether `spawn_agent` requires explicit authorization.
36
- - Codex Tier 1 dispatches for `oat-phase-implementer` and `oat-reviewer` must use self-contained scope packets and fresh context. Do not rely on forked full-thread context when pinning a specialized OAT role.
38
+ Detection logic (two-tier outcome this skill runs autonomously and cannot
39
+ block on user-initiated fresh sessions mid-run):
40
+
41
+ - Claude Code: check Task-tool availability with
42
+ `subagent_type: "oat-phase-implementer"` and
43
+ `subagent_type: "oat-reviewer"`. Available → Tier 1.
44
+ - Cursor: use Cursor-native invocation. Available → Tier 1.
45
+ - Codex multi-agent: verify `[features] multi_agent = true` and whether
46
+ `spawn_agent` requires explicit authorization. Root→phase dispatch requires
47
+ depth 1 only; nested depth matters only when an optional child is actually
48
+ launched. Tier 1 dispatches must use self-contained scope packets and fresh
49
+ context; do not rely on forked full-thread context when pinning a
50
+ specialized OAT role.
37
51
  - Available without auth → Tier 1.
38
- - Available with auth required → fail closed. You MUST ask the user once at skill start before selecting Tier 2 or starting implementation work:
52
+ - Available with auth required → fail closed. Ask the user once at skill
53
+ start before selecting Tier 2 or starting implementation work:
39
54
 
40
55
  ```
41
56
  This OAT implementation skill normally delegates phase implementation and review to subagents. Authorize subagent delegation for this run?
@@ -43,23 +58,33 @@ Detection logic:
43
58
  Yes authorizes both oat-phase-implementer and oat-reviewer across every phase in this run.
44
59
  ```
45
60
 
46
- - Approved → Tier 1.
47
- - Declined → Tier 2.
61
+ Approved → Tier 1. Declined → Tier 2.
48
62
 
49
63
  - If the host does not resolve either generic agent, first attempt the exact
50
64
  registered role natively for any concrete managed target. Use the explicitly
51
- pinned fresh-child route only after a native role-selection rejection. Select
52
- Tier 2 only when inline execution is allowed by the target-first rule above.
53
-
54
- **Approval scope rule:** this Tier selection applies to both phase implementation and checkpoint review. Do not infer a mixed mode from conversational emphasis on review checkpoints. If the user has not explicitly approved Tier 1 for the run, stay Tier 2 throughout. Mixed mode is only valid when the user explicitly requests it.
55
-
56
- **Codex fail-closed rule:** after this skill is invoked, "user did not separately ask for subagents" is not a valid Tier 2 reason. If Codex can spawn agents but requires explicit user authorization, the implementation MUST NOT continue until the delegation question above is answered. Tier 2 is allowed only when:
65
+ pinned fresh-child route only after a native role-selection rejection.
66
+ Select Tier 2 only when inline execution is allowed by the target-first rule
67
+ above.
68
+
69
+ **Approval scope rule:** this Tier selection applies to both phase
70
+ implementation and checkpoint review. Do not infer a mixed mode from
71
+ conversational emphasis on review checkpoints. If the user has not explicitly
72
+ approved Tier 1 for the run, stay Tier 2 throughout. Mixed mode is only valid
73
+ when the user explicitly requests it.
74
+
75
+ **Codex fail-closed rule:** after this skill is invoked, "user did not
76
+ separately ask for subagents" is not a valid Tier 2 reason. If Codex can spawn
77
+ agents but requires explicit user authorization, the implementation MUST NOT
78
+ continue until the delegation question above is answered. Tier 2 is allowed
79
+ only when:
57
80
 
58
81
  - `user declined delegation`
59
82
  - `spawn_agent unavailable`
60
83
  - `required agent role unresolved`
61
84
 
62
- Report the selected tier to the user:
85
+ **Hard pre-work guard:** report the selected tier before any code edit, test
86
+ run, or implementation commit. If Tier 2 is selected, the reason must be one
87
+ of the three allowed Tier 2 reasons above:
63
88
 
64
89
  ```
65
90
  [preflight] Checking subagent availability…
@@ -68,44 +93,41 @@ Report the selected tier to the user:
68
93
  → Reason: {authorized | available without auth | user declined delegation | spawn_agent unavailable | required agent role unresolved}
69
94
  ```
70
95
 
71
- Do not print `[0/N]` for this preflight step. The implementation denominator is not established by capability detection; use the literal `[preflight]` label above.
72
-
73
- **Hard pre-work guard:** before any code edit, test run, or implementation commit, print the selected tier and reason. If Tier 2 is selected, the reason must be one of the three allowed Tier 2 reasons above. Do not run tests, edit files, or create implementation commits until Step 0.5 has completed and the tier report has been printed.
74
-
75
- **Tier is locked for the remainder of the run only after the dispatch target is
76
- resolved.** Subsequent phase-implementer, optional nested, fix-continuation,
77
- and review dispatches use the same tier. Tier controls mechanics only: every
78
- managed phase implementer resolves one exact target beneath the recorded
79
- project or phase named maximum. No mid-run downgrade is allowed.
80
-
81
- **Recovery if Step 0.5 was skipped:** If implementation work has already started inline before completing Step 0.5, STOP immediately. Preserve any work in progress, complete or revert to a clean task boundary, and re-run Step 0.5 before continuing. Do not silently continue in Tier 2.
82
-
83
- **Codex authorization example:**
84
-
85
- ```
86
- User invokes: $oat-project-implement
87
- Detected: Codex multi-agent support available; explicit authorization required.
88
- Expected: ask "This OAT implementation skill normally delegates phase implementation and review to subagents. Authorize subagent delegation for this run?"
89
- If approved: Selected: Tier 1 Subagents
90
- Forbidden: Selected: Tier 2 Inline because the user did not separately mention subagents.
91
- ```
92
-
93
- **Native role-selection rejection:** This means the native host explicitly
94
- reports that the requested `agent_type` is unsupported, unknown, unregistered,
95
- or rejected before the child or agent starts. Missing runtime telemetry,
96
- missing agent self-report, a timeout after spawn acceptance, or any terminal
97
- result from an accepted child including `BLOCKED` is not role
98
- unavailability and is not a native role-selection rejection. Self-report is
96
+ Do not print `[0/N]` for this preflight step. The implementation denominator
97
+ is not established by capability detection; use the literal `[preflight]`
98
+ label above.
99
+
100
+ **Tier lock:** tier is locked for the remainder of the run only after the
101
+ dispatch target is resolved. Subsequent phase-implementer, optional nested,
102
+ fix-continuation, and review dispatches use the same tier. Tier controls
103
+ mechanics only: every managed phase implementer resolves one exact target
104
+ beneath the recorded project or phase named maximum. No mid-run downgrade is
105
+ allowed.
106
+
107
+ **Recovery if Step 0.5 was skipped:** if implementation work has already
108
+ started inline before completing Step 0.5, STOP immediately. Preserve any work
109
+ in progress, complete or revert to a clean task boundary, and re-run Step 0.5
110
+ before continuing. Do not silently continue in Tier 2.
111
+
112
+ **Native role-selection rejection:** the native host explicitly reports that
113
+ the requested `agent_type` is unsupported, unknown, unregistered, or rejected
114
+ before the child or agent starts. Missing runtime telemetry, missing agent
115
+ self-report, a timeout after spawn acceptance, or any terminal result from an
116
+ accepted child — including `BLOCKED` — is not role unavailability and is not a
117
+ native role-selection rejection. If an accepted native reviewer remains
118
+ active, poll, nudge, or continue only through its existing handle; a
119
+ terminal timeout records review failure and stops or escalates
120
+ without another launch.
121
+ Accepted-launch terminality and recovery semantics are owned by the shared
122
+ dispatch engine. A new launch is eligible only when the original attempt
123
+ received explicit pre-start rejection before any child started. Self-report is
99
124
  optional diagnostic data and cannot populate or overwrite launcher-owned
100
- `target`, `model_axis`, or `effort_axis` fields. An accepted child cannot
101
- trigger a fresh pinned-child, CLI fallback, or second launch on the same route.
102
- If an accepted native reviewer remains active, poll, nudge, or continue only
103
- through its existing handle. A terminal timeout records review failure and
104
- stops or escalates without another launch. A new launch is eligible only when
105
- the original attempt received explicit pre-start rejection before any child
106
- started.
125
+ `target`, `model_axis`, or `effort_axis` fields.
107
126
 
108
- **Legacy state migration:** If `state.md` contains `oat_execution_mode: subagent-driven`, silently ignore it. On the next bookkeeping write, remove that key. Do not redirect to `oat-project-subagent-implement` — that skill is deprecated.
127
+ **Legacy state migration:** if `state.md` contains
128
+ `oat_execution_mode: subagent-driven`, silently ignore it and remove the key
129
+ on the next bookkeeping write. Do not redirect to
130
+ `oat-project-subagent-implement` — that skill is deprecated.
109
131
 
110
132
  ### Dispatch Policy Preflight
111
133
 
@@ -120,11 +142,8 @@ policy:
120
142
  oat project dispatch-ceiling resolve --provider <active-provider> --preflight --report-scope implementation-preflight --report-action implementation --json
121
143
  ```
122
144
 
123
- If `oat` is not in PATH, use:
124
-
125
- ```bash
126
- pnpm run cli -- project dispatch-ceiling resolve --provider <active-provider> --preflight --report-scope implementation-preflight --report-action implementation --json
127
- ```
145
+ If `oat` is not in PATH, run the same command through
146
+ `pnpm run cli -- project dispatch-ceiling resolve …` with identical flags.
128
147
 
129
148
  Resolution order:
130
149
 
@@ -135,48 +154,15 @@ Resolution order:
135
154
  5. Interactive implementation preflight prompt (below)
136
155
  6. Non-interactive unresolved: block before work starts
137
156
 
138
- **JSON response shape** (from `--json`):
139
-
140
- ```json
141
- {
142
- "status": "resolved",
143
- "provider": "codex",
144
- "value": "high",
145
- "policyMode": "managed",
146
- "policy": "balanced",
147
- "source": "project-state",
148
- "preset": "balanced",
149
- "unresolved": false,
150
- "providerDefaultEffort": "medium",
151
- "providers": {
152
- "codex": {
153
- "value": "high",
154
- "mode": "enforced",
155
- "mechanism": "pinned-variant",
156
- "dispatchArgs": {
157
- "variant": "oat-phase-implementer-gpt-5-6-terra-high"
158
- },
159
- "verifyOnDispatch": false,
160
- "selection": {
161
- "role": "implementer",
162
- "preferredValue": null,
163
- "selectedValue": "high",
164
- "capped": false,
165
- "selectionMode": "capped",
166
- "policyMode": "managed",
167
- "policy": "balanced"
168
- }
169
- }
170
- }
171
- }
172
- ```
173
-
174
- Read `providers.<active-provider>` for the concrete dispatch controls. The
175
- `dispatchArgs` field carries the provider-specific argument to pass through
176
- (Codex: `variant` name; Claude: `model` string). For implementer/fix dispatch,
157
+ Read `providers.<active-provider>` from the `--json` response for the concrete
158
+ dispatch controls. `dispatchArgs` carries the provider-specific argument to
159
+ pass through (Codex: `variant` name; Claude: `model` string; Cursor: opaque
160
+ `model` string). `selection` carries `role`, `selectedValue`, `capped`,
161
+ `selectionMode`, and policy fields; `selection.target` and an optional
162
+ `providers.<provider>.target` carry route data. For implementer/fix dispatch,
177
163
  pass `--preferred <preferred-effort>` and use `selection.selectedValue` as the
178
164
  selected axis value when it is present. Never re-derive these from the policy
179
- label or a ceiling-only variant - the resolver is the single compilation/join
165
+ label or a ceiling-only variant the resolver is the single compilation/join
180
166
  point.
181
167
 
182
168
  Print before phase work:
@@ -190,20 +176,19 @@ Note: OAT will use resolver-returned materialized Codex role names up to high. B
190
176
  ```
191
177
 
192
178
  If no policy resolves and the session is interactive, present the dispatch
193
- policy prompt once before starting work:
194
-
195
- Print the unresolved-policy heading, then generate the choice text from
196
- canonical CLI metadata immediately before presenting it:
179
+ policy prompt once before starting work. Print the unresolved-policy heading,
180
+ then generate the choice text from canonical CLI metadata immediately before
181
+ presenting it:
197
182
 
198
183
  ```bash
199
184
  oat project dispatch-ceiling choices --format markdown
200
185
  ```
201
186
 
202
- Do not hand-type the dispatch policy menu or omit canonical choices. If the CLI
203
- is unavailable in this environment, derive the same labels and descriptions from
204
- `packages/cli/src/config/dispatch-policy-options.ts`; include every managed
205
- policy returned by `VALID_MANAGED_DISPATCH_POLICIES` plus `Uncapped`, `Inherit
206
- Host Defaults`, and `Leave Unresolved`.
187
+ Do not hand-type the dispatch policy menu or omit canonical choices. If the
188
+ CLI is unavailable in this environment, derive the same labels and
189
+ descriptions from `packages/cli/src/config/dispatch-policy-options.ts`;
190
+ include every managed policy returned by `VALID_MANAGED_DISPATCH_POLICIES`
191
+ plus `Uncapped`, `Inherit Host Defaults`, and `Leave Unresolved`.
207
192
 
208
193
  At minimum, preserve these semantics in any fallback text:
209
194
 
@@ -213,8 +198,8 @@ At minimum, preserve these semantics in any fallback text:
213
198
  - `Inherit Host Defaults`: OAT does not choose model or effort controls; the
214
199
  executing host/provider owns implementation, fix, and review defaults.
215
200
  - `Leave Unresolved`: planning/preflight deferral only. It records no runtime
216
- policy and is not a runnable implementation setting. Implementation preflight
217
- must block until a policy resolves.
201
+ policy and is not a runnable implementation setting.
202
+ Implementation preflight must block until a policy resolves.
218
203
 
219
204
  OAT applies managed policies where the provider exposes a reliable mechanism
220
205
  (Codex: pinned variants; Claude: Task model parameter). Other providers may
@@ -225,19 +210,6 @@ maximum `policy`, and `source`. The named maximum leaves lower configured
225
210
  candidates eligible; do not copy compiled provider/model targets into project
226
211
  state. On selection, print the named maximum before proceeding.
227
212
 
228
- **Uncapped** persists explicit managed uncapped state. OAT still manages
229
- dispatch selection. It does not write provider caps, and it must not be
230
- represented by leaving dispatch policy state absent.
231
-
232
- **Inherit Host Defaults** persists explicit inherit/default state. Use this only
233
- when the user wants OAT to leave implementation, fix, and review model/effort
234
- controls to the executing host/provider. OAT does not choose model or effort in
235
- this mode.
236
-
237
- **Leave Unresolved** records no runtime policy for implementation. Stop before
238
- phase work and report the unresolved state; Implementation preflight must block
239
- until a policy resolves.
240
-
241
213
  Persist in project `state.md` frontmatter using the normalized shape:
242
214
 
243
215
  ```yaml
@@ -247,31 +219,17 @@ oat_dispatch_policy:
247
219
  source: project-state
248
220
  ```
249
221
 
250
- For `Uncapped`:
251
-
252
- ```yaml
253
- oat_dispatch_policy:
254
- mode: managed
255
- policy: uncapped
256
- source: project-state
257
- ```
258
-
259
- For `Inherit Host Defaults`:
260
-
261
- ```yaml
262
- oat_dispatch_policy:
263
- mode: inherit
264
- source: project-state
265
- ```
222
+ For `Uncapped`, persist `policy: uncapped` in the same shape — OAT still
223
+ manages dispatch selection with no stored cap; never represent uncapped by
224
+ leaving policy state absent. For `Inherit Host Defaults`, persist
225
+ `mode: inherit` with `source` and no `policy` key — OAT does not choose model
226
+ or effort in this mode. `Leave Unresolved` records no runtime policy: stop
227
+ before phase work and report the unresolved state.
266
228
 
267
229
  If no policy resolves and `OAT_NON_INTERACTIVE=1` or no user-response channel
268
- exists, rerun the resolver with non-interactive behavior and stop before work
230
+ exists, rerun the resolver with `--non-interactive` and stop before work
269
231
  starts if it blocks:
270
232
 
271
- ```bash
272
- oat project dispatch-ceiling resolve --provider <active-provider> --preflight --non-interactive --report-scope implementation-preflight --report-action implementation
273
- ```
274
-
275
233
  ```text
276
234
  BLOCKED: Codex dispatch policy is unresolved in non-interactive mode.
277
235
  Set workflow.dispatchPolicy.mode/workflow.dispatchPolicy.policy, workflow.dispatchCeiling.providers.codex, oat_dispatch_policy, or legacy oat_dispatch_ceiling.
@@ -286,16 +244,13 @@ Before each phase-implementer, optional nested, fix-continuation, or review
286
244
  dispatch, choose and log runtime controls. Resolve these controls before
287
245
  applying Tier 1/Tier 2 mechanics. A phase target applies to the phase
288
246
  implementer, which directly owns its planned tasks. Optional children resolve
289
- their own exact bounded target beneath the phase ceiling. Inline execution must
290
- preserve equivalent controls or use a documented exception.
291
-
292
- Use these inputs:
247
+ their own exact bounded target beneath the phase ceiling. Inline execution
248
+ must preserve equivalent controls or use a documented exception.
293
249
 
294
- - resolved dispatch policy, source, and provider-specific selection
295
- - phase ID and the current bounded phase or optional-child scope
296
- - optional `## Dispatch Profile` row in `plan.md`
297
- - host-exposed provider controls, by axis
298
- - prior outcomes for the phase, including review results and failed retries
250
+ Inputs: the resolved dispatch policy, source, and provider-specific
251
+ selection; the phase ID and current bounded phase or optional-child scope; any
252
+ `## Dispatch Profile` row in `plan.md`; host-exposed provider controls by
253
+ axis; and prior phase outcomes, including review results and failed retries.
299
254
 
300
255
  Route selection is part of runtime dispatch selection when the resolver returns
301
256
  an ordered matrix route:
@@ -351,22 +306,18 @@ Axis states:
351
306
 
352
307
  Codex rules:
353
308
 
354
- **Managed Codex execution invariant:** When the resolver returns a model+effort
355
- target, the resolver-returned Codex variant from
356
- `providers.codex.dispatchArgs.variant` must first be sent through the native
357
- spawn API as `agent_type`. Spawn acceptance plus the launcher payload is
358
- configured invocation evidence with launcher-selected/config-declared
359
- provenance. If and only if the host returns a native role-selection rejection,
360
- launch a fresh Codex child with the resolver target's explicit model, reasoning
361
- effort, and canonical role instructions from
362
- `.agents/agents/oat-phase-implementer.md` or
363
- `.agents/agents/oat-reviewer.md`. Missing runtime telemetry or agent self-report
364
- is not role unavailability, and an accepted child result such as `BLOCKED`
365
- cannot trigger fallback. Workflow correctness must not require provider restart
366
- or hot reload. A managed base role is forbidden when a concrete target was
367
- requested; never silently downgrade to it. Base roles remain valid only for
368
- explicit inherit/default behavior and the documented managed-uncapped reviewer
369
- fallback.
309
+ The Step 0.5 target-first order is the managed Codex execution invariant:
310
+ send the resolver-returned variant first through the native spawn API as
311
+ native `agent_type` spawn acceptance plus the constructed launcher payload
312
+ is configured invocation evidence with launcher-selected/config-declared
313
+ provenance, without independent runtime telemetry or agent self-report.
314
+ If and only if the host returns a native role-selection rejection,
315
+ launch a fresh Codex child with the resolver target's explicit
316
+ model, reasoning effort, and canonical role instructions; otherwise fail
317
+ closed and block. Missing runtime telemetry or agent self-report is not role
318
+ unavailability, and an accepted child result such as `BLOCKED` cannot trigger
319
+ fallback. A managed base role is forbidden when a concrete target was
320
+ requested; never silently downgrade to it.
370
321
 
371
322
  1. Codex effort order is `low < medium < high < xhigh < max`.
372
323
  2. Classify preferred effort from scope:
@@ -390,7 +341,15 @@ fallback.
390
341
  - Capped managed policy: reviewer targets the configured cap for deterministic quality gate behavior.
391
342
  - Managed `Uncapped`: no reviewer target exists; use base/unpinned reviewer fallback and log `selectionMode=no-review-target`, `selectedValue=null`, and `effort_axis=provider-default`.
392
343
  - Inherit/default: no reviewer target exists; use base/unpinned reviewer fallback and log `selectionMode=inherit-default`, `selectedValue=null`, and `effort_axis=provider-default`.
393
- 8. Codex payload-first assertion applies whenever the resolver returns a materialized model+effort target. If `providers.codex.dispatchArgs.variant` is present, the actual `spawn_agent` payload MUST first use it as native `agent_type`; when that variant came from a Codex model+effort target, log `model_axis=selected:<model>` and `effort_axis=selected:<effort>` from resolver output and the constructed launcher payload. Spawn acceptance is sufficient configured invocation evidence. Missing telemetry or self-report does not make the variant unusable. If native role selection explicitly rejects the variant, use the explicitly pinned fresh-child route or block. Use the base role and log provider-default only for explicit inherit/default behavior or the documented managed-uncapped reviewer exception. Always derive `model_axis` and `effort_axis` from resolver output, not from legacy role-name parsing or agent self-report.
344
+ 8. When `providers.codex.dispatchArgs.variant` is present, the actual
345
+ `spawn_agent` payload MUST first use it as native `agent_type`; when that
346
+ variant came from a Codex model+effort target, log
347
+ `model_axis=selected:<model>` and `effort_axis=selected:<effort>` from
348
+ resolver output and the constructed launcher payload. Materialized
349
+ model+effort variants retain selected controls while keeping runtime
350
+ identity not-reported unless independent evidence exists. Always
351
+ derive `model_axis` and `effort_axis` from resolver output, not from
352
+ legacy role-name parsing or agent self-report.
394
353
  9. Do not use top-level per-call `reasoning_effort` as the standard OAT selected-effort path; dogfooding showed that path can be inconsistent.
395
354
 
396
355
  Claude rules:
@@ -447,9 +406,7 @@ Payload-first invariant:
447
406
  `Dispatch: scope=<phase-or-task> action=<implementation|fix|review> role=<implementer|fix|reviewer> producer=<slug|unknown> provenance=<declared|observed|inferred|unknown> model_axis=<axis> effort_axis=<axis> dispatch_policy=<policy|unknown> dispatch_ceiling=<value|none> target=<target|unknown>`.
448
407
  Populate the report from the completed resolver and actual host arguments.
449
408
  Only independently observed or otherwise supported runtime evidence may
450
- populate runtime producer identity. Codex materialized model+effort variants
451
- retain selected model/effort controls while keeping runtime identity
452
- not-reported unless evidence exists. Do not write prose-only, hand-built, or
409
+ populate runtime producer identity. Do not write prose-only, hand-built, or
453
410
  legacy comma-separated stamp forms.
454
411
 
455
412
  Human-facing dispatch display rules:
@@ -459,14 +416,11 @@ Human-facing dispatch display rules:
459
416
  audit fields for the formal stamp, not the primary status. Put unknown
460
417
  producer/provenance only in `Dispatch stamp:` or in a low-priority note after
461
418
  the route and runtime confirmation.
462
- - Separate requested controls from configured defaults. For example, a Codex
463
- materialized role may request `model_axis=selected:<model>` and
464
- `effort_axis=selected:<effort>` while the provider default effort remains a
465
- separate fallback/default fact.
466
- - Separate configured policy/cap from runtime confirmation. A resolver payload
467
- can declare a target before the host has confirmed it; an observed mismatch
468
- must be called out as `Runtime confirmation: mismatch:<detail>` and handled as
469
- an orchestration deviation.
419
+ - Separate requested controls from configured defaults, and configured
420
+ policy/cap from runtime confirmation. A resolver payload can declare a
421
+ target before the host has confirmed it; an observed mismatch must be called
422
+ out as `Runtime confirmation: mismatch:<detail>` and handled as an
423
+ orchestration deviation.
470
424
  - Keep the `Dispatch stamp: Dispatch: ...` line parseable and grammar-stable.
471
425
  Do not move display-only prose into the formal stamp.
472
426
 
@@ -494,121 +448,18 @@ Dispatch stamp: Dispatch: scope=<phase-or-task> action=<implementation|fix|revie
494
448
  Rationale: {short rationale grounded in phase scope and any policy cap/uncapped/default behavior}
495
449
  ```
496
450
 
497
- Codex capped example:
498
-
499
- ```text
500
- OAT Dispatch: Phase p02 implementation
501
- Host: Codex
502
- Route: codex/implementer/gpt-5.6-sol/medium; level=0
503
- Requested controls: model=gpt-5.6-sol, effort=medium, target=oat-phase-implementer-gpt-5-6-sol-medium
504
- Configured defaults: provider default effort=high
505
- Runtime confirmation: declared:gpt-5.6-sol/medium
506
- Preferred effort: high
507
- OAT Dispatch Tier: economy
508
- Resolved cap: medium
509
- Selected effort: medium
510
- Policy source: repo config
511
- Provider default effort: high
512
- Selection mode: capped
513
- Model axis: selected:gpt-5.6-sol
514
- Effort axis: selected:medium
515
- Dispatch target: oat-phase-implementer-gpt-5-6-sol-medium
516
- Rationale: normal multi-file implementation; high preferred due to integration risk, capped by configured policy.
517
- ```
518
-
519
- Codex uncapped implementer example:
520
-
521
- ```text
522
- OAT Dispatch: Phase p02 implementation
523
- Host: Codex
524
- Route: codex/implementer/gpt-5.6-terra/xhigh; level=0
525
- Requested controls: model=gpt-5.6-terra, effort=xhigh, target=oat-phase-implementer-gpt-5-6-terra-xhigh
526
- Configured defaults: provider default effort=medium
527
- Runtime confirmation: declared:gpt-5.6-terra/xhigh
528
- Preferred effort: xhigh
529
- OAT Dispatch Tier: uncapped
530
- Resolved cap: none
531
- Selected effort: xhigh
532
- Policy source: project state
533
- Provider default effort: medium
534
- Selection mode: uncapped
535
- Model axis: selected:gpt-5.6-terra
536
- Effort axis: selected:xhigh
537
- Dispatch target: oat-phase-implementer-gpt-5-6-terra-xhigh
538
- Rationale: high-risk phase; managed uncapped policy allows the preferred pinned variant. Actual host support for upward effort selection must be verified by the dispatching host.
539
- ```
540
-
541
- Codex capped reviewer example:
542
-
543
- ```text
544
- OAT Dispatch: Phase p02 review
545
- Host: Codex
546
- Route: codex/reviewer/gpt-5.6-terra/xhigh; level=0
547
- Requested controls: model=gpt-5.6-terra, effort=xhigh, target=oat-reviewer-gpt-5-6-terra-xhigh
548
- Configured defaults: provider default effort=medium
549
- Runtime confirmation: declared:gpt-5.6-terra/xhigh
550
- Preferred effort: high
551
- OAT Dispatch Tier: high
552
- Resolved cap: xhigh
553
- Selected effort: xhigh
554
- Policy source: project state
555
- Provider default effort: medium
556
- Selection mode: review-target
557
- Model axis: selected:gpt-5.6-terra
558
- Effort axis: selected:xhigh
559
- Dispatch target: oat-reviewer-gpt-5-6-terra-xhigh
560
- Rationale: reviewer runs at the configured policy cap for deterministic quality gate behavior.
561
- ```
562
-
563
- Codex inherit/default fallback example:
564
-
565
- ```text
566
- OAT Dispatch: Phase p02 review
567
- Host: Codex
568
- Route: none; level=none
569
- Requested controls: model=none, effort=provider-default, target=oat-reviewer
570
- Configured defaults: provider default effort=medium
571
- Runtime confirmation: not-observable
572
- Preferred effort: provider-default
573
- OAT Dispatch Tier: inherit host defaults
574
- Resolved cap: none
575
- Selected effort: provider-default
576
- Policy source: project state
577
- Provider default effort: medium
578
- Selection mode: inherit-default
579
- Model axis: inherited
580
- Effort axis: provider-default
581
- Dispatch target: oat-reviewer
582
- Rationale: explicit inherit/default policy; base unpinned role follows Codex provider default.
583
- ```
584
-
585
- Generic sidecar/explorer dispatch:
451
+ For an explicit inherit/default fallback (for example a base `oat-reviewer`
452
+ under inherit policy), the log reads `Route: none; level=none`,
453
+ `Runtime confirmation: not-observable`, `Selection mode: inherit-default`,
454
+ `Model axis: inherited`, and `Effort axis: provider-default`, with requested
455
+ controls empty and the provider default effort shown as a separate fact.
586
456
 
587
- - Built-in or generic sidecars such as `explorer` are not OAT-managed implementer, reviewer, or fix roles.
588
- - If a sidecar spawn payload does not explicitly pin a reliable effort/model control, log `Preferred effort: provider-default`, `Selected effort: provider-default`, and `Effort axis: provider-default`.
589
- - Do not classify a generic sidecar as `Preferred effort: low|medium|high|xhigh|max` unless the actual host invocation contains the corresponding reliable selection. If the host has no reliable effort control for that sidecar, use provider-default wording instead.
590
- - Sidecar outputs are advisory context only. Implementation work and review/fix gates still follow the OAT-managed dispatch rules above.
591
-
592
- Codex generic explorer example:
593
-
594
- ```text
595
- OAT Dispatch: p02-t10 sidecar exploration
596
- Host: Codex
597
- Route: sidecar/explorer; level=none
598
- Requested controls: model=none, effort=provider-default, target=explorer
599
- Configured defaults: provider default effort=xhigh
600
- Runtime confirmation: not-observable
601
- Preferred effort: provider-default
602
- OAT Dispatch Tier: high
603
- Resolved cap: xhigh
604
- Selected effort: provider-default
605
- Policy source: project state
606
- Provider default effort: xhigh
607
- Model axis: inherited
608
- Effort axis: provider-default
609
- Dispatch target: explorer
610
- Rationale: read-only sidecar exploration; generic explorer payload does not pin an OAT-managed effort variant.
611
- ```
457
+ Generic sidecar/explorer dispatch: built-in sidecars such as `explorer` are
458
+ not OAT-managed implementer, reviewer, or fix roles, and their outputs are
459
+ advisory context only. Unless the actual spawn payload pins a reliable
460
+ effort/model control, log `Preferred effort: provider-default`,
461
+ `Selected effort: provider-default`, and `Effort axis: provider-default` —
462
+ never a classified effort level the host invocation does not contain.
612
463
 
613
464
  Include resolved dispatch context in scope packets when known:
614
465
 
@@ -650,12 +501,8 @@ Dispatch policy: {policy}; selected={selected value | none}; cap={value | none}
650
501
 
651
502
  ```text
652
503
  Dispatch policy: balanced; selected=xhigh; cap=xhigh (codex, enforced — variant oat-phase-implementer-gpt-5-6-terra-xhigh)
653
- Dispatch policy: high; selected=high; cap=high (codex, enforced — variant oat-reviewer-gpt-5-6-sol-high)
654
- Dispatch policy: frontier; selected=max; cap=max (codex, enforced — variant oat-reviewer-gpt-5-6-sol-max)
655
- Dispatch policy: uncapped; selected=xhigh; cap=none (codex, enforced — variant oat-phase-implementer-gpt-5-6-terra-xhigh)
656
504
  Dispatch policy: inherit host defaults; selected=none; cap=none (codex, advisory — base role follows provider default)
657
505
  Dispatch policy: balanced; selected=sonnet; cap=sonnet (claude, enforced — Task model arg)
658
- Dispatch policy: frontier; selected=fable; cap=fable (claude, enforced — Task model arg)
659
506
  Cursor opaque model-string example: Dispatch policy: frontier; selected=gpt-5.6-sol-max; cap=gpt-5.6-sol-max (cursor, enforced — model arg gpt-5.6-sol-max)
660
507
  Dispatch policy: unresolved; selected=none; cap=none (codex, advisory — policy set but no value resolved)
661
508
  ```