@open-agent-toolkit/cli 0.1.45 → 0.1.48

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 (112) hide show
  1. package/assets/agents/oat-phase-implementer.md +202 -191
  2. package/assets/agents/oat-reviewer.md +12 -2
  3. package/assets/config/dispatch-matrix-recommendation.json +120 -13
  4. package/assets/docs/cli-utilities/config-and-local-state.md +7 -0
  5. package/assets/docs/cli-utilities/configuration.md +183 -84
  6. package/assets/docs/cli-utilities/workflow-gates.md +161 -27
  7. package/assets/docs/contributing/skills.md +14 -8
  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 +42 -5
  11. package/assets/docs/provider-sync/scope-and-surface.md +3 -2
  12. package/assets/docs/reference/cli-reference.md +3 -1
  13. package/assets/docs/reference/oat-directory-structure.md +27 -26
  14. package/assets/docs/workflows/projects/artifacts.md +31 -1
  15. package/assets/docs/workflows/projects/dispatch-ceiling.md +235 -174
  16. package/assets/docs/workflows/projects/implementation-execution.md +283 -253
  17. package/assets/docs/workflows/projects/lifecycle.md +26 -5
  18. package/assets/docs/workflows/projects/reviews.md +27 -2
  19. package/assets/migration/pjm-restructure.md +1 -1
  20. package/assets/public-package-versions.json +4 -4
  21. package/assets/skills/oat-project-implement/SKILL.md +347 -178
  22. package/assets/skills/oat-project-import-plan/SKILL.md +173 -16
  23. package/assets/skills/oat-project-next/SKILL.md +2 -2
  24. package/assets/skills/oat-project-plan/SKILL.md +122 -92
  25. package/assets/skills/oat-project-plan-writing/SKILL.md +246 -15
  26. package/assets/skills/oat-project-quick-start/SKILL.md +156 -94
  27. package/assets/skills/oat-project-review-provide/SKILL.md +94 -22
  28. package/dist/commands/config/index.d.ts +2 -2
  29. package/dist/commands/config/index.d.ts.map +1 -1
  30. package/dist/commands/config/index.js +129 -53
  31. package/dist/commands/doctor/index.d.ts +2 -2
  32. package/dist/commands/doctor/index.d.ts.map +1 -1
  33. package/dist/commands/doctor/index.js +102 -31
  34. package/dist/commands/gate/index.d.ts +7 -1
  35. package/dist/commands/gate/index.d.ts.map +1 -1
  36. package/dist/commands/gate/index.js +544 -67
  37. package/dist/commands/gate/review-verdict.d.ts +16 -0
  38. package/dist/commands/gate/review-verdict.d.ts.map +1 -1
  39. package/dist/commands/gate/review-verdict.js +72 -9
  40. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  41. package/dist/commands/project/dispatch-ceiling/index.js +586 -23
  42. package/dist/commands/providers/codex/index.d.ts +4 -0
  43. package/dist/commands/providers/codex/index.d.ts.map +1 -0
  44. package/dist/commands/providers/codex/index.js +7 -0
  45. package/dist/commands/providers/codex/materialize.d.ts +5 -0
  46. package/dist/commands/providers/codex/materialize.d.ts.map +1 -0
  47. package/dist/commands/providers/codex/materialize.js +157 -0
  48. package/dist/commands/providers/index.d.ts +2 -2
  49. package/dist/commands/providers/index.d.ts.map +1 -1
  50. package/dist/commands/providers/index.js +4 -2
  51. package/dist/commands/providers/providers.types.d.ts +23 -0
  52. package/dist/commands/providers/providers.types.d.ts.map +1 -1
  53. package/dist/commands/shared/codex-strays.d.ts.map +1 -1
  54. package/dist/commands/shared/codex-strays.js +11 -1
  55. package/dist/commands/shared/frontmatter.d.ts +4 -0
  56. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  57. package/dist/commands/shared/frontmatter.js +23 -0
  58. package/dist/commands/status/index.d.ts +5 -1
  59. package/dist/commands/status/index.d.ts.map +1 -1
  60. package/dist/commands/status/index.js +10 -4
  61. package/dist/commands/sync/index.d.ts.map +1 -1
  62. package/dist/commands/sync/index.js +10 -3
  63. package/dist/commands/sync/sync.types.d.ts +5 -1
  64. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  65. package/dist/config/dispatch-ceiling-preset.d.ts +4 -0
  66. package/dist/config/dispatch-ceiling-preset.d.ts.map +1 -1
  67. package/dist/config/dispatch-ceiling-preset.js +3 -0
  68. package/dist/config/dispatch-policy-options.d.ts +20 -0
  69. package/dist/config/dispatch-policy-options.d.ts.map +1 -0
  70. package/dist/config/dispatch-policy-options.js +96 -0
  71. package/dist/config/oat-config.d.ts +25 -2
  72. package/dist/config/oat-config.d.ts.map +1 -1
  73. package/dist/config/oat-config.js +154 -24
  74. package/dist/config/resolve.d.ts +8 -0
  75. package/dist/config/resolve.d.ts.map +1 -1
  76. package/dist/config/resolve.js +66 -2
  77. package/dist/engine/index.d.ts +1 -1
  78. package/dist/engine/index.d.ts.map +1 -1
  79. package/dist/engine/index.js +1 -1
  80. package/dist/engine/scanner.d.ts +1 -0
  81. package/dist/engine/scanner.d.ts.map +1 -1
  82. package/dist/engine/scanner.js +17 -1
  83. package/dist/fs/paths.d.ts +4 -0
  84. package/dist/fs/paths.d.ts.map +1 -1
  85. package/dist/fs/paths.js +18 -1
  86. package/dist/providers/ceiling/registry.d.ts +8 -5
  87. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  88. package/dist/providers/ceiling/registry.js +25 -7
  89. package/dist/providers/codex/codec/catalog.d.ts +14 -0
  90. package/dist/providers/codex/codec/catalog.d.ts.map +1 -0
  91. package/dist/providers/codex/codec/catalog.js +21 -0
  92. package/dist/providers/codex/codec/config-merge.d.ts +6 -0
  93. package/dist/providers/codex/codec/config-merge.d.ts.map +1 -1
  94. package/dist/providers/codex/codec/config-merge.js +7 -0
  95. package/dist/providers/codex/codec/materialize.d.ts +16 -0
  96. package/dist/providers/codex/codec/materialize.d.ts.map +1 -0
  97. package/dist/providers/codex/codec/materialize.js +58 -0
  98. package/dist/providers/codex/codec/shared.d.ts +20 -0
  99. package/dist/providers/codex/codec/shared.d.ts.map +1 -1
  100. package/dist/providers/codex/codec/shared.js +107 -6
  101. package/dist/providers/codex/codec/sync-extension.d.ts +7 -1
  102. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  103. package/dist/providers/codex/codec/sync-extension.js +299 -52
  104. package/dist/providers/identity/availability.d.ts +24 -1
  105. package/dist/providers/identity/availability.d.ts.map +1 -1
  106. package/dist/providers/identity/availability.js +253 -19
  107. package/dist/providers/identity/stamp.d.ts.map +1 -1
  108. package/dist/providers/identity/stamp.js +4 -0
  109. package/dist/shared/types.d.ts +1 -0
  110. package/dist/shared/types.d.ts.map +1 -1
  111. package/dist/shared/types.js +4 -0
  112. package/package.json +2 -2
@@ -1,23 +1,130 @@
1
1
  {
2
- "version": "2026-07-07.1",
2
+ "version": "2026-07-10.2",
3
3
  "providers": {
4
4
  "codex": {
5
- "economy": "low",
6
- "balanced": "medium",
7
- "high": "high",
8
- "frontier": "xhigh"
5
+ "economy": {
6
+ "candidates": [
7
+ {
8
+ "harness": "codex",
9
+ "model": "gpt-5.6-luna",
10
+ "effort": "low"
11
+ },
12
+ {
13
+ "harness": "codex",
14
+ "model": "gpt-5.6-luna",
15
+ "effort": "medium"
16
+ },
17
+ {
18
+ "harness": "codex",
19
+ "model": "gpt-5.6-luna",
20
+ "effort": "high"
21
+ }
22
+ ]
23
+ },
24
+ "balanced": {
25
+ "candidates": [
26
+ {
27
+ "harness": "codex",
28
+ "model": "gpt-5.6-luna",
29
+ "effort": "xhigh"
30
+ },
31
+ {
32
+ "harness": "codex",
33
+ "model": "gpt-5.6-terra",
34
+ "effort": "low"
35
+ },
36
+ {
37
+ "harness": "codex",
38
+ "model": "gpt-5.6-terra",
39
+ "effort": "medium"
40
+ },
41
+ {
42
+ "harness": "codex",
43
+ "model": "gpt-5.6-terra",
44
+ "effort": "high"
45
+ },
46
+ {
47
+ "harness": "codex",
48
+ "model": "gpt-5.6-terra",
49
+ "effort": "xhigh"
50
+ }
51
+ ]
52
+ },
53
+ "high": {
54
+ "candidates": [
55
+ {
56
+ "harness": "codex",
57
+ "model": "gpt-5.6-sol",
58
+ "effort": "low"
59
+ },
60
+ {
61
+ "harness": "codex",
62
+ "model": "gpt-5.6-sol",
63
+ "effort": "medium"
64
+ },
65
+ {
66
+ "harness": "codex",
67
+ "model": "gpt-5.6-sol",
68
+ "effort": "high"
69
+ }
70
+ ]
71
+ },
72
+ "frontier": {
73
+ "candidates": [
74
+ {
75
+ "harness": "codex",
76
+ "model": "gpt-5.6-sol",
77
+ "effort": "xhigh"
78
+ },
79
+ {
80
+ "harness": "codex",
81
+ "model": "gpt-5.6-sol",
82
+ "effort": "max"
83
+ }
84
+ ]
85
+ }
9
86
  },
10
87
  "claude": {
11
- "economy": "haiku",
12
- "balanced": "sonnet",
13
- "high": "opus",
14
- "frontier": "fable"
88
+ "economy": {
89
+ "candidates": ["haiku", "sonnet"]
90
+ },
91
+ "balanced": {
92
+ "candidates": ["sonnet"]
93
+ },
94
+ "high": {
95
+ "candidates": ["opus"]
96
+ },
97
+ "frontier": {
98
+ "candidates": ["fable"]
99
+ }
15
100
  },
16
101
  "cursor": {
17
- "economy": "composer-2.5",
18
- "balanced": "composer-2.5-fast",
19
- "high": "gpt-5.5-high",
20
- "frontier": "fable-5"
102
+ "economy": {
103
+ "candidates": [
104
+ "gpt-5.6-luna-low",
105
+ "gpt-5.6-luna-medium",
106
+ "gpt-5.6-luna-high"
107
+ ]
108
+ },
109
+ "balanced": {
110
+ "candidates": [
111
+ "gpt-5.6-luna-xhigh",
112
+ "gpt-5.6-terra-low",
113
+ "gpt-5.6-terra-medium",
114
+ "gpt-5.6-terra-high",
115
+ "gpt-5.6-terra-xhigh"
116
+ ]
117
+ },
118
+ "high": {
119
+ "candidates": [
120
+ "gpt-5.6-sol-low",
121
+ "gpt-5.6-sol-medium",
122
+ "gpt-5.6-sol-high"
123
+ ]
124
+ },
125
+ "frontier": {
126
+ "candidates": ["gpt-5.6-sol-xhigh", "gpt-5.6-sol-max"]
127
+ }
21
128
  }
22
129
  }
23
130
  }
@@ -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`
@@ -170,64 +170,86 @@ oat config describe activeIdea
170
170
 
171
171
  ## Dispatch policy resolution
172
172
 
173
- Dispatch policy is the workflow setting that tells OAT whether to manage
174
- subagent model/effort selection and, if so, which managed policy to use.
173
+ Dispatch configuration has two layers:
175
174
 
176
- For the full conceptual model - managed capped tiers, dispatch matrix cells,
177
- managed `Uncapped`, `Inherit Host Defaults`, and provider-specific enforcement - see
175
+ 1. A reusable ordered candidate ladder owned by user, shared, or repo-local
176
+ config.
177
+ 2. A project or phase named ceiling that acts as a maximum over that ladder.
178
+
179
+ A named ceiling is a maximum constraint, not an exact model-family or effort
180
+ preference. For the full model, see
178
181
  [Dispatch Policy](../workflows/projects/dispatch-ceiling.md).
179
182
 
180
183
  ### Config keys
181
184
 
182
- Preferred keys:
185
+ | Key | Values | Purpose |
186
+ | ------------------------------------------------------ | ----------------------------------------------------- | --------------------------------------------------------------------------------------- |
187
+ | `workflow.dispatchPolicy.mode` | `managed`, `inherit` | `managed` lets OAT select exact candidates; `inherit` leaves controls to the host |
188
+ | `workflow.dispatchPolicy.policy` | `economy`, `balanced`, `high`, `frontier`, `uncapped` | Default named maximum or explicit managed uncapped state |
189
+ | `workflow.dispatchCeiling.providers.<provider>` | tier map or legacy bare value | Reusable provider candidate column |
190
+ | `workflow.dispatchCeiling.providers.<provider>.<tier>` | `candidates` cell, route, or legacy bare value | One named tier in the provider ladder |
191
+ | `workflow.dispatchCeiling.recommendationVersion` | string | Version written by `oat config adopt dispatch-matrix` for recommendation drift tracking |
192
+ | `workflow.dispatchCeiling.preset` | `balanced`, `maximum`, `cost-conscious` | Legacy policy setup alias |
183
193
 
184
- | Key | Values | Purpose |
185
- | -------------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------- |
186
- | `workflow.dispatchPolicy.mode` | `managed`, `inherit` | `managed` lets OAT select controls; `inherit` leaves controls to the host/provider |
187
- | `workflow.dispatchPolicy.policy` | `economy`, `balanced`, `high`, `frontier`, `uncapped` | Managed policy. Setting this key writes `mode=managed` |
194
+ ### Adopt a complete ladder
188
195
 
189
- Managed policies compile to:
196
+ Choose the owning scope explicitly:
190
197
 
191
- | Policy | Codex | Claude |
192
- | ---------- | -------- | -------- |
193
- | `economy` | `medium` | `sonnet` |
194
- | `balanced` | `high` | `sonnet` |
195
- | `high` | `xhigh` | `opus` |
196
- | `frontier` | `xhigh` | `fable` |
197
- | `uncapped` | none | none |
198
+ ```bash
199
+ oat config adopt dispatch-matrix --shared
200
+ oat config adopt dispatch-matrix --local
201
+ oat config adopt dispatch-matrix --user
202
+ ```
198
203
 
199
- Dispatch matrix and legacy compatibility keys:
204
+ Adoption fills missing provider/tier cells and preserves explicit existing
205
+ values. Planning shows the complete bundled recommendation before asking for
206
+ this scope, then rechecks the effective ladder. If explicit cells still leave
207
+ the ladder incomplete, readiness blocks; OAT does not overwrite them.
200
208
 
201
- | Key | Values | Purpose |
202
- | ------------------------------------------------------ | --------------------------------------- | -------------------------------------------------------------------------------------- |
203
- | `workflow.dispatchCeiling.preset` | `balanced`, `maximum`, `cost-conscious` | Legacy preset alias; `maximum` maps to `high`, `cost-conscious` to `economy` |
204
- | `workflow.dispatchCeiling.providers.<provider>` | bare value or tier map | Provider column; bare Codex/Claude values remain legacy capped targets |
205
- | `workflow.dispatchCeiling.providers.<provider>.<tier>` | bare value or ordered route | One matrix cell for `economy`, `balanced`, `high`, or `frontier` |
206
- | `workflow.dispatchCeiling.recommendationVersion` | string | Version stamp written by `oat config adopt dispatch-matrix`; used for drift visibility |
209
+ Scope determines ownership and Codex materialization:
207
210
 
208
- Examples:
211
+ - `--shared` and `--local` are project configuration sources. Their configured
212
+ Codex candidates materialize into the tracked project `.codex` view.
213
+ - `--user` writes reusable personal defaults to `~/.oat/config.json`; those
214
+ Codex candidates materialize under `~/.codex`.
215
+ - Active-project sparse candidates also materialize into the tracked project
216
+ view.
209
217
 
210
- ```bash
211
- oat config adopt dispatch-matrix --shared
212
- oat config set workflow.dispatchCeiling.providers.cursor.balanced composer-2.5 --shared
213
- oat config set workflow.dispatchCeiling.providers.codex high --shared
214
- oat config set workflow.dispatchCeiling.providers.claude opus --shared
215
- ```
218
+ Project-generated provider views remain visible to version control. OAT does
219
+ not auto-ignore them. A project-specific active policy or ceiling must not be
220
+ written into user `~/.oat/config.json`; store it in that project's `state.md`
221
+ even when the reusable ladder is user-owned.
216
222
 
217
- For ordered routes, edit the config JSON so a tier cell is an array. Route
218
- entries are either bare slugs or objects with `harness`, `model`, and optional
219
- `effort`:
223
+ ### Ordered candidate cells
220
224
 
221
225
  ```json
222
226
  {
223
227
  "workflow": {
224
228
  "dispatchCeiling": {
225
229
  "providers": {
230
+ "codex": {
231
+ "balanced": {
232
+ "candidates": [
233
+ {
234
+ "harness": "codex",
235
+ "model": "gpt-5.6-terra",
236
+ "effort": "low"
237
+ },
238
+ {
239
+ "harness": "codex",
240
+ "model": "gpt-5.6-terra",
241
+ "effort": "medium"
242
+ }
243
+ ]
244
+ }
245
+ },
246
+ "claude": {
247
+ "balanced": { "candidates": ["sonnet"] }
248
+ },
226
249
  "cursor": {
227
- "high": [
228
- "composer-2.5",
229
- { "harness": "cursor", "model": "gpt-5.5-xhigh" }
230
- ]
250
+ "balanced": {
251
+ "candidates": ["opaque:model/lower [v1]", "opaque:model/high [v2]"]
252
+ }
231
253
  }
232
254
  }
233
255
  }
@@ -235,71 +257,148 @@ entries are either bare slugs or objects with `harness`, `model`, and optional
235
257
  }
236
258
  ```
237
259
 
238
- `Uncapped` is explicit managed state. Do not represent it by leaving policy
239
- state absent. To request no OAT model/effort selection, set:
260
+ The bundled recommendation covers 13 Codex model/effort combinations: Luna and
261
+ Terra at `low`, `medium`, `high`, and `xhigh`, plus Sol at those efforts and
262
+ `max`. Claude covers `haiku`, `sonnet`, `opus`, and `fable`. Cursor covers 13
263
+ opaque configured strings. Cursor spelling never supplies capability metadata;
264
+ the configured candidate position owns the tier meaning.
240
265
 
241
- ```bash
242
- oat config set workflow.dispatchPolicy.mode inherit
266
+ The corresponding pinned Codex variant catalogue includes
267
+ `gpt-5.6-luna-high`, `gpt-5.6-terra-xhigh`, `gpt-5.6-sol-high`, and
268
+ `gpt-5.6-sol-max`. Configuration selects from that materialized catalogue; it
269
+ does not construct an unregistered role during dispatch.
270
+
271
+ The final candidate in a named tier defines that tier's reviewer ceiling. For
272
+ implementation and fix tasks, all candidates from the lowest tier through the
273
+ named maximum remain eligible. Under High, that includes Economy, Balanced, and
274
+ High candidates.
275
+
276
+ ### Record the project maximum
277
+
278
+ Project state stores the named maximum without compiled provider pins:
279
+
280
+ ```yaml
281
+ oat_dispatch_policy:
282
+ mode: managed
283
+ policy: high
284
+ source: project-state
285
+ ```
286
+
287
+ An optional phase `Dispatch Profile` row may narrow the maximum. Blank or
288
+ `auto` uses the project value. `Uncapped` and inherit/default remain explicit
289
+ modes:
290
+
291
+ ```yaml
292
+ oat_dispatch_policy:
293
+ mode: managed
294
+ policy: uncapped
295
+ source: project-state
243
296
  ```
244
297
 
245
- ### How enforcement works
298
+ ```yaml
299
+ oat_dispatch_policy:
300
+ mode: inherit
301
+ source: project-state
302
+ ```
246
303
 
247
- OAT applies managed policies where the provider exposes a reliable mechanism.
248
- Providers without an adapter receive them as advisory/unsupported.
304
+ ### Exact task resolution
249
305
 
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` |
306
+ The project-aware resolver remains the source of truth. Preflight reads layered
307
+ config and project state without mutating either:
256
308
 
257
- Codex uses effort (`low < medium < high < xhigh`) and pinned OAT role variants.
258
- Claude uses Task `model` (`haiku < sonnet < opus < fable`) and keeps
259
- `effort_axis=not-applicable`. Cursor and other model-arg providers use opaque
260
- matrix slugs; OAT validates availability when a provider oracle is available,
261
- but the configured matrix owns tier meaning.
309
+ ```bash
310
+ oat project dispatch-ceiling resolve --provider codex --preflight --json
311
+ ```
262
312
 
263
- **Verify-on-upgrade:** when the requested tier exceeds the current orchestrator
264
- tier (an upgrade request), the resolver sets `verifyOnDispatch: true`. The skill
265
- confirms the actual model used after dispatch. If the provider did not honor the
266
- upgrade, the enforcement log reads `advisory — provider did not honor upgrade;
267
- ran <tier>` instead of `enforced`.
313
+ For each managed capped task, the phase coordinator supplies the recorded
314
+ project or narrower phase maximum plus one exact configured candidate:
268
315
 
269
- ### Legacy compatibility
316
+ ```bash
317
+ oat project dispatch-ceiling resolve \
318
+ --provider codex \
319
+ --role implementer \
320
+ --ceiling-tier high \
321
+ --candidate-model gpt-5.6-terra \
322
+ --candidate-effort medium \
323
+ --json
324
+
325
+ oat project dispatch-ceiling resolve \
326
+ --provider claude \
327
+ --role implementer \
328
+ --ceiling-tier high \
329
+ --candidate-model sonnet \
330
+ --json
331
+
332
+ oat project dispatch-ceiling resolve \
333
+ --provider cursor \
334
+ --role implementer \
335
+ --ceiling-tier high \
336
+ --candidate-model 'opaque:model/lower [v1]' \
337
+ --json
338
+ ```
270
339
 
271
- The command group and docs path still use `dispatch-ceiling` for compatibility.
272
- Legacy `workflow.dispatchCeiling.*` config and project `oat_dispatch_ceiling`
273
- frontmatter remain readable as capped managed policy input. Absent legacy state
274
- does not mean managed `Uncapped`.
340
+ `--ceiling-tier` is invocation-only. It accepts `economy`, `balanced`, `high`,
341
+ or `frontier`, overrides layered active-policy ceilings for that call, and never
342
+ writes user, shared, local, or project configuration. JSON reports top-level
343
+ `source: invocation`; `providers.<provider>.cellSource` still identifies the
344
+ config layer that owns the selected candidate.
275
345
 
276
- ### Using the resolver
346
+ The resolver fails closed when a candidate is missing, above the maximum,
347
+ ambiguous, malformed, or cannot compile exact provider controls. `--preferred`
348
+ remains compatibility behavior for legacy scalar ceilings and managed
349
+ `Uncapped`; it is not the exact managed task-worker path.
277
350
 
278
- Implementation workflows should use the project-aware resolver rather than
279
- reading config keys directly:
351
+ ### Provider enforcement and materialization
352
+
353
+ | Provider | Exact task mechanism |
354
+ | -------- | ---------------------------------------------------------------------------------------------------- |
355
+ | Codex | `providers.codex.dispatchArgs.variant` as `agent_type`, or a fresh child pinned to model plus effort |
356
+ | Claude | `providers.claude.dispatchArgs.model` as the actual Task `model` |
357
+ | Cursor | `providers.cursor.dispatchArgs.model` byte-for-byte as the actual opaque invocation model |
358
+
359
+ Project sync materializes the supported Codex catalogue and every configured
360
+ project-owned candidate for both `oat-phase-implementer` and `oat-reviewer`.
361
+ User sync materializes user-owned candidates under `~/.codex`:
280
362
 
281
363
  ```bash
282
- oat project dispatch-ceiling resolve --provider codex --json
283
- oat project dispatch-ceiling resolve --provider codex --role implementer --preferred medium --json
284
- oat project dispatch-ceiling resolve --provider claude --role implementer --preferred sonnet --orchestrator-tier sonnet --json
285
- oat project dispatch-ceiling resolve --provider claude --orchestrator-tier sonnet --json
286
- oat project dispatch-ceiling resolve --provider cursor --role implementer --preferred high --escalation-level 0 --json
364
+ oat sync --scope project
365
+ oat sync --scope user
366
+ oat sync --scope all
287
367
  ```
288
368
 
289
- The resolver checks effective config first, then project `state.md`
290
- `oat_dispatch_policy` frontmatter, including sparse `matrix` overrides, then
291
- legacy `oat_dispatch_ceiling`. For Codex it also reports
292
- `providerDefaultEffort`, which is informational only for explicit
293
- inherit/default behavior or base/unpinned fallback paths.
369
+ Generated roles carry `supported-catalogue`, `project-config`, or `user-config`
370
+ ownership. Cleanup reconciles only the current owner. Materialization is best
371
+ effort at sync boundaries; the exact fresh-child route means workflow
372
+ correctness does not require provider restart or hot reload.
373
+
374
+ Reviewer resolution uses the final candidate at the configured review ceiling.
375
+ Codex selects the exact reviewer variant; Claude and Cursor pass the resolver's
376
+ exact model argument. Timeout retries preserve the same complete payload. A
377
+ lower reviewer candidate requires a separate reviewed contract.
378
+
379
+ Tier 2 remains target-preserving. Inline review is permitted only when the host
380
+ has verified equivalent current-host controls for explicit inherit,
381
+ managed-uncapped, or base-role behavior. Capped managed reviews still require
382
+ the exact registered role, pinned child, or resolver-returned model argument.
383
+
384
+ ### Legacy compatibility
385
+
386
+ The command and docs path retain `dispatch-ceiling` for compatibility. Legacy
387
+ bare provider values, `workflow.dispatchCeiling.preset`, project
388
+ `oat_dispatch_ceiling`, and `--preferred` remain readable during migration.
389
+ Absent policy state does not mean managed `Uncapped`.
294
390
 
295
- For non-interactive preflight checks, use:
391
+ For non-interactive preflight checks:
296
392
 
297
393
  ```bash
298
- oat project dispatch-ceiling resolve --provider codex --preflight --non-interactive
394
+ oat project dispatch-ceiling resolve \
395
+ --provider codex \
396
+ --preflight \
397
+ --non-interactive
299
398
  ```
300
399
 
301
- If unresolved, the command exits non-zero with the same `BLOCKED:` guidance used
302
- by `oat-project-implement`.
400
+ An unresolved or incomplete managed ladder exits nonzero and blocks before
401
+ implementation work.
303
402
 
304
403
  ## Workflow preferences (`workflow.*`)
305
404
 
@@ -320,7 +419,7 @@ Workflow preference keys live under the `workflow.*` namespace:
320
419
  - `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
420
  - `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
421
  - `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.
422
+ - `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
423
  - `workflow.dispatchCeiling.preset` — legacy compatibility alias (`balanced`, `maximum`, or `cost-conscious`) for capped managed policy setup.
325
424
  - `workflow.dispatchCeiling.providers.<provider>` — dispatch matrix provider column or legacy bare provider target.
326
425
  - `workflow.dispatchCeiling.providers.<provider>.<tier>` — one matrix cell for `economy`, `balanced`, `high`, or `frontier`.