@open-agent-toolkit/cli 0.1.45 → 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 (69) hide show
  1. package/assets/agents/oat-reviewer.md +2 -2
  2. package/assets/docs/cli-utilities/config-and-local-state.md +7 -0
  3. package/assets/docs/cli-utilities/configuration.md +51 -11
  4. package/assets/docs/provider-sync/config.md +5 -1
  5. package/assets/docs/provider-sync/manifest-and-drift.md +6 -1
  6. package/assets/docs/provider-sync/providers.md +6 -3
  7. package/assets/docs/provider-sync/scope-and-surface.md +2 -1
  8. package/assets/docs/reference/oat-directory-structure.md +2 -2
  9. package/assets/docs/workflows/projects/dispatch-ceiling.md +41 -28
  10. package/assets/docs/workflows/projects/implementation-execution.md +20 -13
  11. package/assets/public-package-versions.json +4 -4
  12. package/assets/skills/oat-project-implement/SKILL.md +114 -59
  13. package/assets/skills/oat-project-quick-start/SKILL.md +32 -20
  14. package/dist/commands/config/index.d.ts +2 -2
  15. package/dist/commands/config/index.d.ts.map +1 -1
  16. package/dist/commands/config/index.js +71 -20
  17. package/dist/commands/doctor/index.d.ts +2 -2
  18. package/dist/commands/doctor/index.d.ts.map +1 -1
  19. package/dist/commands/doctor/index.js +83 -27
  20. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  21. package/dist/commands/project/dispatch-ceiling/index.js +137 -10
  22. package/dist/commands/providers/codex/index.d.ts +4 -0
  23. package/dist/commands/providers/codex/index.d.ts.map +1 -0
  24. package/dist/commands/providers/codex/index.js +7 -0
  25. package/dist/commands/providers/codex/materialize.d.ts +5 -0
  26. package/dist/commands/providers/codex/materialize.d.ts.map +1 -0
  27. package/dist/commands/providers/codex/materialize.js +152 -0
  28. package/dist/commands/providers/index.d.ts +2 -2
  29. package/dist/commands/providers/index.d.ts.map +1 -1
  30. package/dist/commands/providers/index.js +4 -2
  31. package/dist/commands/providers/providers.types.d.ts +23 -0
  32. package/dist/commands/providers/providers.types.d.ts.map +1 -1
  33. package/dist/commands/shared/codex-strays.d.ts.map +1 -1
  34. package/dist/commands/shared/codex-strays.js +11 -1
  35. package/dist/commands/status/index.d.ts +4 -1
  36. package/dist/commands/status/index.d.ts.map +1 -1
  37. package/dist/commands/status/index.js +1 -1
  38. package/dist/commands/sync/index.d.ts.map +1 -1
  39. package/dist/commands/sync/index.js +1 -1
  40. package/dist/commands/sync/sync.types.d.ts +4 -1
  41. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  42. package/dist/config/dispatch-ceiling-preset.d.ts +4 -0
  43. package/dist/config/dispatch-ceiling-preset.d.ts.map +1 -1
  44. package/dist/config/dispatch-ceiling-preset.js +3 -0
  45. package/dist/config/dispatch-policy-options.d.ts +20 -0
  46. package/dist/config/dispatch-policy-options.d.ts.map +1 -0
  47. package/dist/config/dispatch-policy-options.js +96 -0
  48. package/dist/config/oat-config.d.ts +6 -0
  49. package/dist/config/oat-config.d.ts.map +1 -1
  50. package/dist/config/oat-config.js +15 -0
  51. package/dist/providers/ceiling/registry.d.ts +7 -5
  52. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  53. package/dist/providers/ceiling/registry.js +16 -5
  54. package/dist/providers/codex/codec/config-merge.d.ts +6 -0
  55. package/dist/providers/codex/codec/config-merge.d.ts.map +1 -1
  56. package/dist/providers/codex/codec/config-merge.js +7 -0
  57. package/dist/providers/codex/codec/materialize.d.ts +16 -0
  58. package/dist/providers/codex/codec/materialize.d.ts.map +1 -0
  59. package/dist/providers/codex/codec/materialize.js +57 -0
  60. package/dist/providers/codex/codec/shared.d.ts +1 -0
  61. package/dist/providers/codex/codec/shared.d.ts.map +1 -1
  62. package/dist/providers/codex/codec/shared.js +9 -1
  63. package/dist/providers/codex/codec/sync-extension.d.ts +7 -1
  64. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  65. package/dist/providers/codex/codec/sync-extension.js +183 -46
  66. package/dist/providers/identity/availability.d.ts +24 -1
  67. package/dist/providers/identity/availability.d.ts.map +1 -1
  68. package/dist/providers/identity/availability.js +253 -19
  69. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-reviewer
3
- version: 1.1.4
3
+ version: 1.1.5
4
4
  description: Unified reviewer for OAT projects - mode-aware verification of requirements/design alignment and code quality. Writes a review artifact to disk by default, or returns structured findings in-memory when dispatched in structured-output mode.
5
5
  tools: Read, Bash, Grep, Glob, Write
6
6
  color: yellow
@@ -68,7 +68,7 @@ You will be given a "Review Scope" block including:
68
68
 
69
69
  The orchestrator owns dispatch control. Do not read `plan.md` Dispatch Profile rows to self-select a tier.
70
70
 
71
- For Codex, deterministic review dispatch under a capped managed policy uses pinned reviewer variants (`oat-reviewer-low`, `oat-reviewer-medium`, `oat-reviewer-high`, or `oat-reviewer-xhigh`) selected by the resolved OAT dispatch policy cap. Managed `Uncapped` and inherit/default policies have no reviewer target, so the base `oat-reviewer` role is used as a provider-default/unpinned fallback. If you are running as the base role, report any provided `provider_default_effort` as context but do not treat it as managed uncapped selection or an OAT cap.
71
+ For Codex, deterministic review dispatch under a capped managed policy uses the materialized Codex role name returned by `providers.codex.dispatchArgs.variant`; the orchestrator also supplies `providers.codex.selection.target` context when available and should derive `model_axis` and `effort_axis` from resolver output. Managed `Uncapped` and inherit/default policies have no reviewer target, so the base `oat-reviewer` role is used only when the resolver returns no `dispatchArgs.variant`, as a provider-default/unpinned fallback. If you are running as the base role, report any provided `provider_default_effort` as context but do not treat it as managed uncapped selection or an OAT cap. Use base `oat-reviewer` only when the resolver returns no `dispatchArgs.variant`.
72
72
 
73
73
  For Claude Code, review dispatch is model-axis based and the effort axis is `not-applicable`.
74
74
 
@@ -113,6 +113,13 @@ Use `oat config` for repo runtime config inspection and supported key mutation.
113
113
 
114
114
  Use `oat config dump --json` when you need the whole resolved config in one machine-readable response rather than a single key or a human-oriented list view.
115
115
 
116
+ Dispatch policy keys are part of this surface, but provider-specific generation
117
+ still belongs to provider commands. Use `oat config describe
118
+ workflow.dispatchPolicy.policy` to inspect capped managed, managed uncapped,
119
+ inherit/default, and unresolved behavior; use `oat providers codex materialize`
120
+ or `oat sync --scope project` to create materialized Codex roles from explicit
121
+ model+effort targets.
122
+
116
123
  Archive lifecycle settings live here as shared repo config:
117
124
 
118
125
  - `archive.s3Uri`
@@ -235,30 +235,70 @@ entries are either bare slugs or objects with `harness`, `model`, and optional
235
235
  }
236
236
  ```
237
237
 
238
- `Uncapped` is explicit managed state. Do not represent it by leaving policy
239
- state absent. To request no OAT model/effort selection, set:
238
+ `Uncapped` is explicit managed state: OAT still selects the preferred
239
+ provider-specific dispatch target, but does not apply a maximum cap. Do not
240
+ represent it by leaving policy state absent. To request no OAT model/effort
241
+ selection, set:
240
242
 
241
243
  ```bash
242
244
  oat config set workflow.dispatchPolicy.mode inherit
243
245
  ```
244
246
 
247
+ If no managed policy, legacy cap, or inherit/default mode resolves during an
248
+ implementation preflight, the policy remains unresolved. Interactive
249
+ implementation may ask once and persist a choice; non-interactive
250
+ implementation blocks rather than silently falling back to host defaults.
251
+
245
252
  ### How enforcement works
246
253
 
247
254
  OAT applies managed policies where the provider exposes a reliable mechanism.
248
255
  Providers without an adapter receive them as advisory/unsupported.
249
256
 
250
- | Provider | Mechanism | Enforcement mode |
251
- | -------- | ------------------------- | ------------------------------- |
252
- | Codex | Pinned role variants | `enforced` |
253
- | Claude | Task `model` parameter | `enforced` |
254
- | Cursor | `--model` argument | `enforced` when a cell resolves |
255
- | Others | None (informational only) | `advisory` / `unsupported` |
257
+ | Provider | Mechanism | Enforcement mode |
258
+ | -------- | ------------------------------------ | ------------------------------- |
259
+ | Codex | Materialized model+effort role names | `enforced` |
260
+ | Claude | Task `model` parameter | `enforced` |
261
+ | Cursor | `--model` argument / Task `model` | `enforced` when a cell resolves |
262
+ | Others | None (informational only) | `advisory` / `unsupported` |
263
+
264
+ Codex managed dispatch compiles an explicit `model` plus reasoning `effort`
265
+ target into a materialized OAT role name, for example
266
+ `oat-phase-implementer-gpt-5-6-terra-xhigh`. OAT-managed Codex roles are not
267
+ the old hard-coded effort-only pins; they come from resolver targets, dispatch
268
+ matrix cells, or an explicit materialization command. Base roles such as
269
+ `oat-phase-implementer` and `oat-reviewer` are fallback paths that follow the
270
+ provider default effort when inherit/default behavior is selected or no
271
+ materialized target resolves.
256
272
 
257
- Codex uses effort (`low < medium < high < xhigh`) and pinned OAT role variants.
258
273
  Claude uses Task `model` (`haiku < sonnet < opus < fable`) and keeps
259
274
  `effort_axis=not-applicable`. Cursor and other model-arg providers use opaque
260
275
  matrix slugs; OAT validates availability when a provider oracle is available,
261
- but the configured matrix owns tier meaning.
276
+ but the configured matrix owns tier meaning. For Cursor subagents, validation
277
+ checks the model can actually be used by Task subagent dispatch, not just that
278
+ the broad `cursor-agent models` catalog lists the slug.
279
+
280
+ ### Codex role materialization
281
+
282
+ Use `oat providers codex materialize` when you need to materialize one
283
+ canonical agent as a Codex role outside a full sync run:
284
+
285
+ ```bash
286
+ oat providers codex materialize oat-reviewer --model gpt-5.6-terra --effort xhigh --dry-run
287
+ oat providers codex materialize oat-phase-implementer --model gpt-5.6-terra --effort high
288
+ ```
289
+
290
+ Required inputs are the canonical agent name, `--model <model-id>`, and
291
+ `--effort <reasoning-effort>`. The command defaults to project scope, reads
292
+ `.agents/agents/<agent-name>.md`, writes `.codex/agents/<role>.toml`, and
293
+ upserts `.codex/config.toml` unless `--dry-run` is present. `--agent-path` can
294
+ point at a specific canonical agent markdown file, and `--role-name` can
295
+ override the generated role name.
296
+
297
+ Normal project sync also materializes Codex roles for configured matrix targets:
298
+
299
+ ```bash
300
+ oat sync --scope project
301
+ ```
262
302
 
263
303
  **Verify-on-upgrade:** when the requested tier exceeds the current orchestrator
264
304
  tier (an upgrade request), the resolver sets `verifyOnDispatch: true`. The skill
@@ -320,7 +360,7 @@ Workflow preference keys live under the `workflow.*` namespace:
320
360
  - `workflow.autoArtifactReview.plan` — boolean, default `true`. Automatically run the bounded artifact-review loop for generated `plan.md` files before implementation handoff. Set to `false` only when you intentionally want to skip the plan artifact review.
321
361
  - `workflow.autoArtifactReview.analysis` — boolean, default `true`. Automatically run the bounded accuracy-review loop for generated docs and agent-instructions analysis artifacts before the matching apply workflow consumes them.
322
362
  - `workflow.dispatchPolicy.mode` — `managed` or `inherit`. `managed` means OAT selects model/effort controls from `workflow.dispatchPolicy.policy`; `inherit` means OAT leaves controls to host/provider defaults.
323
- - `workflow.dispatchPolicy.policy` — `economy`, `balanced`, `high`, `frontier`, or `uncapped`. `economy` through `frontier` are capped managed policies; `uncapped` keeps OAT-managed preferred selection without provider caps.
363
+ - `workflow.dispatchPolicy.policy` — `economy`, `balanced`, `high`, `frontier`, or `uncapped`. `economy` through `frontier` are capped managed policies; `uncapped` keeps OAT-managed preferred selection without provider caps. It is distinct from `workflow.dispatchPolicy.mode=inherit`, which leaves controls to the host/provider.
324
364
  - `workflow.dispatchCeiling.preset` — legacy compatibility alias (`balanced`, `maximum`, or `cost-conscious`) for capped managed policy setup.
325
365
  - `workflow.dispatchCeiling.providers.<provider>` — dispatch matrix provider column or legacy bare provider target.
326
366
  - `workflow.dispatchCeiling.providers.<provider>.<tier>` — one matrix cell for `economy`, `balanced`, `high`, or `frontier`.
@@ -95,7 +95,11 @@ canonical `.agents/skills` inventory.
95
95
  - unset: provider falls back to directory detection.
96
96
  - `defaultStrategy` is used when no provider-specific `strategy` is set.
97
97
  - At runtime, config is normalized so `providers` is always present in memory.
98
- - Codex project sync also manages generated role variants derived from canonical agents. `oat-phase-implementer-low|medium|high|xhigh` and `oat-reviewer-low|medium|high|xhigh` are managed outputs used by dispatch-ceiling-aware implementation. They should not be adopted as stray roles.
98
+ - Codex project sync also manages generated materialized roles derived from
99
+ canonical agents and explicit model+effort targets. Dispatch-aware roles such
100
+ as `oat-phase-implementer-gpt-5-6-terra-xhigh` and
101
+ `oat-reviewer-gpt-5-6-terra-xhigh` are managed outputs and should not be
102
+ adopted as stray roles.
99
103
 
100
104
  ## Recommended management flow
101
105
 
@@ -69,7 +69,12 @@ After adoption, `oat sync` regenerates the managed provider copies from the cano
69
69
 
70
70
  ### Generated provider roles
71
71
 
72
- Some Codex roles are **generated-derived** produced by the Codex sync extension rather than mapped 1:1 from a canonical `.agents/agents/*.md` file. The effort-specific implementer variants (`oat-phase-implementer-low`, `oat-phase-implementer-medium`, `oat-phase-implementer-high`) are the current example.
72
+ Some Codex roles are **generated-derived** - produced by the Codex sync
73
+ extension rather than mapped 1:1 from a canonical `.agents/agents/*.md` file.
74
+ Materialized dispatch roles are the current example: a matrix target or
75
+ `oat providers codex materialize` command supplies a canonical agent, model, and
76
+ reasoning effort, and OAT writes a role such as
77
+ `oat-phase-implementer-gpt-5-6-terra-xhigh`.
73
78
 
74
79
  `oat status` and `oat init` treat any role listed in the Codex extension plan's `managedRoles` set as managed, so generated variants are **not** reported as `stray` and are **not** offered for adoption — even though they have no canonical `.agents` source. A genuinely orphaned Codex role (no canonical source and not in `managedRoles`) is still flagged.
75
80
 
@@ -18,6 +18,8 @@ description: 'Provider-specific path mappings for Claude, Cursor, Copilot, Gemin
18
18
  - Project: `.agents/skills` -> `.cursor/skills`, `.agents/agents` -> `.cursor/agents`, `.agents/rules` -> `.cursor/rules`
19
19
  - User: `~/.agents/skills` -> `~/.cursor/skills`, `~/.agents/agents` -> `~/.cursor/agents`
20
20
  - Subagent invocation in Cursor is prompt-driven (`/name` or natural mention), not `subagent_type`
21
+ - OAT-controlled Cursor dispatch uses the generic `.cursor/agents/<name>.md` file plus the Task-level `model` argument selected from the dispatch matrix. A `model` frontmatter value is only a default/fallback mechanism.
22
+ - Cursor model validation checks whether the selected model is eligible for subagent Task dispatch; the broad `cursor-agent models` catalog alone is not enough proof.
21
23
  - Rule files render as `.cursor/rules/*.mdc`
22
24
 
23
25
  === "Copilot"
@@ -42,9 +44,10 @@ description: 'Provider-specific path mappings for Claude, Cursor, Copilot, Gemin
42
44
  - `.codex/agents/<role>.toml`
43
45
  - `.codex/config.toml` (`[features] multi_agent = true`, `[agents.<role>]` upserts)
44
46
  - Codex role files include OAT managed provenance headers and are regenerated by `oat sync --scope project`
45
- - The Codex sync extension also generates effort-specific implementer role variants `oat-phase-implementer-low`, `oat-phase-implementer-medium`, `oat-phase-implementer-high`, each setting `model_reasoning_effort` — alongside the canonical-derived roles; the base `oat-phase-implementer` role represents inherited effort. These generated variants are managed by `oat sync` and are not treated as strays (see Manifest and Drift Generated provider roles)
47
+ - The Codex sync extension also generates materialized roles from explicit model+effort targets, such as `oat-phase-implementer-gpt-5-6-terra-xhigh` or `oat-reviewer-gpt-5-6-terra-xhigh`, alongside canonical-derived base roles. These generated variants are managed by `oat sync` and are not treated as strays (see Manifest and Drift -> Generated provider roles)
48
+ - A single role can be materialized directly with `oat providers codex materialize <agent-name> --model <model-id> --effort <reasoning-effort>`; `--agent-path` selects a specific canonical markdown agent, `--role-name` overrides the generated role name, and `--scope user` writes a one-off user-scope role.
46
49
  - Aggregate Codex config drift metadata (`aggregateConfigHash`) is emitted in sync/status codex extension output and intentionally not stored as a separate manifest row
47
- - User-scope Codex role generation (`~/.codex`) remains deferred
50
+ - User-scope Codex role generation via provider sync (`~/.codex`) remains deferred
48
51
  - Codex multi-agent dispatch uses config-defined roles (`[agents.<name>]`) and `agent_type`
49
52
  - Codex subagent workflows require `[features] multi_agent = true` in active Codex config layers
50
53
 
@@ -53,7 +56,7 @@ description: 'Provider-specific path mappings for Claude, Cursor, Copilot, Gemin
53
56
  - Project scope: skills + agents + rules
54
57
  - User scope: skills + agents (provider mappings vary by adapter)
55
58
  - Rules are project-scoped only in this release
56
- - Codex user-scope role generation under `~/.codex` remains deferred in this release
59
+ - Codex user-scope role generation under `~/.codex` via provider sync remains deferred in this release; direct one-off materialization can use `--scope user`
57
60
 
58
61
  ## Adoption model
59
62
 
@@ -34,6 +34,7 @@ Rules are currently project-scoped canonical content. Unlike skills and agents,
34
34
  - `oat providers list`
35
35
  - `oat providers inspect`
36
36
  - `oat providers set`
37
+ - `oat providers codex materialize`
37
38
 
38
39
  ## Adjacent CLI commands (commonly used with provider interop)
39
40
 
@@ -46,7 +47,7 @@ Rules are currently project-scoped canonical content. Unlike skills and agents,
46
47
  - Project provider enablement is stored in `.oat/sync/config.json` (`providers.<name>.enabled`).
47
48
  - `oat init --scope project` (interactive) prompts for supported providers and persists explicit true/false values.
48
49
  - `oat sync --scope project` uses config-aware provider activation and can prompt to remediate detected mismatches.
49
- - Codex project-scope subagent sync is generated output (`.codex/agents/*.toml` + `.codex/config.toml`) computed at command layer after path-mapping sync. Generated Codex roles including the effort-specific implementer variants are tracked as managed by `oat status` and `oat init`, not as strays.
50
+ - Codex project-scope subagent sync is generated output (`.codex/agents/*.toml` + `.codex/config.toml`) computed at command layer after path-mapping sync. Generated Codex roles - including materialized model+effort implementer and reviewer variants - are tracked as managed by `oat status` and `oat init`, not as strays.
50
51
  - Codex aggregate config drift is reported via sync/status extension metadata (`aggregateConfigHash`); it is not persisted as a separate manifest schema entry.
51
52
  - Codex user-scope role generation remains intentionally deferred in this release.
52
53
 
@@ -107,9 +107,9 @@ Current schema keys:
107
107
  | `git.defaultBranch` | `string` | `"main"` | Default branch for PR creation. Auto-detected during `oat init` via `gh repo view` or `origin/HEAD`. Used by `oat-project-pr-final` and `oat-project-pr-progress`. |
108
108
  | `workflow.autoReviewAtHillCheckpoints` | `boolean` | unset | When `true`, completing a HiLL checkpoint automatically runs the extra lifecycle review. Does not control Tier 1 per-phase `oat-reviewer` gates. Can be overridden per-project via `oat_auto_review_at_hill_checkpoints` in `plan.md` frontmatter. Legacy `autoReviewAtCheckpoints` remains a fallback. |
109
109
  | `workflow.dispatchPolicy.mode` | `string` | unset | Dispatch policy mode: `managed` lets OAT select model/effort controls; `inherit` leaves controls to the host/provider defaults. |
110
- | `workflow.dispatchPolicy.policy` | `string` | unset | Managed dispatch policy: `economy`, `balanced`, `high`, `frontier`, or `uncapped`. Capped policies compile to provider targets; `uncapped` keeps OAT-managed preferred selection without provider caps. |
110
+ | `workflow.dispatchPolicy.policy` | `string` | unset | Managed dispatch policy: `economy`, `balanced`, `high`, `frontier`, or `uncapped`. Capped policies compile to provider targets; `uncapped` keeps OAT-managed preferred selection without provider caps. `inherit` mode is separate and leaves controls to the host/provider. |
111
111
  | `workflow.dispatchCeiling.preset` | `string` | unset | Legacy compatibility preset for capped managed policy setup (`balanced`, `maximum`, `cost-conscious`). `maximum` maps to `high`; `cost-conscious` maps to `economy`. |
112
- | `workflow.dispatchCeiling.providers.codex` | `string` | unset | Legacy concrete Codex capped target (`low`, `medium`, `high`, or `xhigh`). Codex provider default effort is informational only for explicit inherit/default behavior or base/unpinned fallback paths. |
112
+ | `workflow.dispatchCeiling.providers.codex` | `string` | unset | Legacy concrete Codex capped target (`low`, `medium`, `high`, or `xhigh`). New managed Codex dispatch resolves explicit model+effort targets to materialized role names; provider default effort is informational only for explicit inherit/default behavior or base/unpinned fallback paths. |
113
113
  | `workflow.dispatchCeiling.providers.claude` | `string` | unset | Legacy concrete Claude capped target (`haiku`, `sonnet`, `opus`, or `fable`). Claude has no separate per-dispatch effort axis. The flat keys `workflow.dispatchCeiling.codex` and `workflow.dispatchCeiling.claude` were removed (no migration). |
114
114
  | `workflow.gates.skills` | `object` | unset | Per-skill final gate config keyed by skill name. Managed with `oat gate set/unset`; gate-aware skills declare `oat_gateable: true`. |
115
115
  | `workflow.gates.execTargets` | `object` | built-ins | Cross-runtime exec target registry keyed by opaque target id. Managed with `oat gate target set/unset`; built-ins cover Codex, Claude, and Cursor defaults. |
@@ -28,18 +28,20 @@ per-tier value, or an ordered route for escalation.
28
28
 
29
29
  ## Policy Choices
30
30
 
31
- | Policy | Mode | Codex target | 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 |
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 |
39
39
 
40
40
  `Uncapped` is explicit managed state. It is not represented by omitting policy
41
41
  state. Existing projects with absent legacy ceiling state remain unresolved or
42
- 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.
43
45
 
44
46
  ## Config Shapes
45
47
 
@@ -173,18 +175,25 @@ Selection modes:
173
175
 
174
176
  ## Provider Behavior
175
177
 
176
- | | Codex | Claude Code | Cursor / model-arg providers | Unsupported provider |
177
- | ----------------- | ------------------------------------------- | --------------------------------------- | ---------------------------- | -------------------- |
178
- | Managed mechanism | Pinned role variants | Task `model` argument | `--model` argument | None |
179
- | Axis | effort (`low < medium < high < xhigh`) | model (`haiku < sonnet < opus < fable`) | opaque model slug | None |
180
- | Capped policy | selected pinned variant up to cap | selected Task model up to cap | selected matrix cell | advisory/unsupported |
181
- | Uncapped | preferred pinned variant, no cap | preferred Task model, no cap | preferred matrix cell | advisory/unsupported |
182
- | Inherit/default | base/unpinned role follows provider default | omit `model` | omit `--model` | normal behavior |
183
-
184
- Codex uses pinned variants because per-call effort controls were unreliable in
185
- dogfooding. For managed `Uncapped`, OAT still selects the preferred pinned
186
- variant; the dispatching host should verify whether upward effort selection is
187
- 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.
188
197
 
189
198
  Claude Code uses the per-call Task `model` argument. It has no OAT-managed
190
199
  per-dispatch effort axis, so dispatch logs use `effort_axis=not-applicable`.
@@ -192,7 +201,10 @@ per-dispatch effort axis, so dispatch logs use `effort_axis=not-applicable`.
192
201
 
193
202
  Cursor and other model-arg providers use matrix values as opaque slugs. OAT
194
203
  validates availability with provider oracles when possible, but tier semantics
195
- come from the configured matrix, not from a built-in model catalog.
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.
196
208
 
197
209
  ## Producer Provenance
198
210
 
@@ -205,9 +217,10 @@ Dispatch: scope=p06 action=implementation role=implementer producer=gpt-5.5-xhig
205
217
 
206
218
  `producer` is the resolved model slug when OAT knows it, otherwise `unknown`.
207
219
  `provenance` is one of `declared`, `observed`, `inferred`, or `unknown`.
208
- Concrete same-harness model arguments can be declared. Codex pinned effort
209
- variants declare effort, not concrete producer identity, unless an observed or
210
- inferred model is available.
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.
211
224
 
212
225
  ## Implementer, Fix, and Reviewer Behavior
213
226
 
@@ -234,9 +247,9 @@ say `provider-default`.
234
247
  Examples:
235
248
 
236
249
  ```text
237
- Dispatch policy: balanced; selected=high; cap=high (codex, enforced — variant oat-phase-implementer-high)
238
- Dispatch policy: high; selected=xhigh; cap=xhigh (codex, enforced — variant oat-reviewer-xhigh)
239
- 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)
240
253
  Dispatch policy: inherit host defaults; selected=none; cap=none (codex, advisory — base role follows provider default)
241
254
  Dispatch policy: frontier; selected=fable; cap=fable (claude, enforced — Task model arg)
242
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.45",
3
- "docs-config": "0.1.45",
4
- "docs-theme": "0.1.45",
5
- "docs-transforms": "0.1.45"
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
  }