@open-agent-toolkit/cli 0.1.46 → 0.1.50

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 (98) hide show
  1. package/assets/agents/oat-phase-implementer.md +202 -191
  2. package/assets/agents/oat-reviewer.md +11 -1
  3. package/assets/config/dispatch-matrix-recommendation.json +120 -13
  4. package/assets/docs/cli-utilities/configuration.md +213 -113
  5. package/assets/docs/cli-utilities/workflow-gates.md +178 -27
  6. package/assets/docs/contributing/skills.md +14 -8
  7. package/assets/docs/provider-sync/providers.md +46 -8
  8. package/assets/docs/provider-sync/scope-and-surface.md +2 -2
  9. package/assets/docs/reference/cli-reference.md +3 -1
  10. package/assets/docs/reference/oat-directory-structure.md +27 -26
  11. package/assets/docs/workflows/projects/artifacts.md +31 -1
  12. package/assets/docs/workflows/projects/dispatch-ceiling.md +297 -197
  13. package/assets/docs/workflows/projects/implementation-execution.md +306 -249
  14. package/assets/docs/workflows/projects/lifecycle.md +26 -5
  15. package/assets/docs/workflows/projects/reviews.md +27 -2
  16. package/assets/migration/pjm-restructure.md +1 -1
  17. package/assets/public-package-versions.json +4 -4
  18. package/assets/skills/oat-project-implement/SKILL.md +290 -149
  19. package/assets/skills/oat-project-import-plan/SKILL.md +173 -16
  20. package/assets/skills/oat-project-next/SKILL.md +2 -2
  21. package/assets/skills/oat-project-plan/SKILL.md +122 -92
  22. package/assets/skills/oat-project-plan-writing/SKILL.md +246 -15
  23. package/assets/skills/oat-project-quick-start/SKILL.md +157 -107
  24. package/assets/skills/oat-project-review-provide/SKILL.md +110 -22
  25. package/assets/skills/oat-project-review-provide-remote/SKILL.md +28 -1
  26. package/dist/commands/config/index.d.ts +3 -0
  27. package/dist/commands/config/index.d.ts.map +1 -1
  28. package/dist/commands/config/index.js +92 -125
  29. package/dist/commands/doctor/index.d.ts +3 -0
  30. package/dist/commands/doctor/index.d.ts.map +1 -1
  31. package/dist/commands/doctor/index.js +57 -95
  32. package/dist/commands/gate/index.d.ts +7 -1
  33. package/dist/commands/gate/index.d.ts.map +1 -1
  34. package/dist/commands/gate/index.js +615 -67
  35. package/dist/commands/gate/review-verdict.d.ts +16 -0
  36. package/dist/commands/gate/review-verdict.d.ts.map +1 -1
  37. package/dist/commands/gate/review-verdict.js +72 -9
  38. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  39. package/dist/commands/project/dispatch-ceiling/index.js +567 -99
  40. package/dist/commands/providers/codex/materialize.d.ts.map +1 -1
  41. package/dist/commands/providers/codex/materialize.js +6 -1
  42. package/dist/commands/shared/frontmatter.d.ts +4 -0
  43. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  44. package/dist/commands/shared/frontmatter.js +23 -0
  45. package/dist/commands/status/index.d.ts +1 -0
  46. package/dist/commands/status/index.d.ts.map +1 -1
  47. package/dist/commands/status/index.js +10 -4
  48. package/dist/commands/sync/index.d.ts.map +1 -1
  49. package/dist/commands/sync/index.js +10 -3
  50. package/dist/commands/sync/sync.types.d.ts +1 -0
  51. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  52. package/dist/config/dispatch-matrix.d.ts +59 -0
  53. package/dist/config/dispatch-matrix.d.ts.map +1 -0
  54. package/dist/config/dispatch-matrix.js +264 -0
  55. package/dist/config/oat-config.d.ts +9 -18
  56. package/dist/config/oat-config.d.ts.map +1 -1
  57. package/dist/config/oat-config.js +99 -120
  58. package/dist/config/resolve.d.ts +8 -0
  59. package/dist/config/resolve.d.ts.map +1 -1
  60. package/dist/config/resolve.js +66 -1
  61. package/dist/engine/index.d.ts +1 -1
  62. package/dist/engine/index.d.ts.map +1 -1
  63. package/dist/engine/index.js +1 -1
  64. package/dist/engine/scanner.d.ts +1 -0
  65. package/dist/engine/scanner.d.ts.map +1 -1
  66. package/dist/engine/scanner.js +17 -1
  67. package/dist/fs/paths.d.ts +4 -0
  68. package/dist/fs/paths.d.ts.map +1 -1
  69. package/dist/fs/paths.js +18 -1
  70. package/dist/providers/ceiling/registry.d.ts +1 -0
  71. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  72. package/dist/providers/ceiling/registry.js +12 -5
  73. package/dist/providers/codex/codec/catalog.d.ts +14 -0
  74. package/dist/providers/codex/codec/catalog.d.ts.map +1 -0
  75. package/dist/providers/codex/codec/catalog.js +21 -0
  76. package/dist/providers/codex/codec/materialize.d.ts.map +1 -1
  77. package/dist/providers/codex/codec/materialize.js +6 -5
  78. package/dist/providers/codex/codec/shared.d.ts +19 -0
  79. package/dist/providers/codex/codec/shared.d.ts.map +1 -1
  80. package/dist/providers/codex/codec/shared.js +98 -5
  81. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  82. package/dist/providers/codex/codec/sync-extension.js +142 -32
  83. package/dist/providers/identity/availability.d.ts +12 -0
  84. package/dist/providers/identity/availability.d.ts.map +1 -1
  85. package/dist/providers/identity/availability.js +72 -29
  86. package/dist/providers/identity/dispatch-report.d.ts +124 -0
  87. package/dist/providers/identity/dispatch-report.d.ts.map +1 -0
  88. package/dist/providers/identity/dispatch-report.js +285 -0
  89. package/dist/providers/identity/dispatch-validation.d.ts +28 -0
  90. package/dist/providers/identity/dispatch-validation.d.ts.map +1 -0
  91. package/dist/providers/identity/dispatch-validation.js +149 -0
  92. package/dist/providers/identity/stamp.d.ts +2 -0
  93. package/dist/providers/identity/stamp.d.ts.map +1 -1
  94. package/dist/providers/identity/stamp.js +7 -1
  95. package/dist/shared/types.d.ts +1 -0
  96. package/dist/shared/types.d.ts.map +1 -1
  97. package/dist/shared/types.js +4 -0
  98. 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
  }
@@ -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,111 +257,189 @@ entries are either bare slugs or objects with `harness`, `model`, and optional
235
257
  }
236
258
  ```
237
259
 
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:
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.
242
265
 
243
- ```bash
244
- oat config set workflow.dispatchPolicy.mode inherit
245
- ```
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.
246
270
 
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.
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.
251
275
 
252
- ### How enforcement works
276
+ ### Record the project maximum
253
277
 
254
- OAT applies managed policies where the provider exposes a reliable mechanism.
255
- Providers without an adapter receive them as advisory/unsupported.
278
+ Project state stores the named maximum without compiled provider pins:
256
279
 
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` |
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:
263
290
 
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.
291
+ ```yaml
292
+ oat_dispatch_policy:
293
+ mode: managed
294
+ policy: uncapped
295
+ source: project-state
296
+ ```
272
297
 
273
- Claude uses Task `model` (`haiku < sonnet < opus < fable`) and keeps
274
- `effort_axis=not-applicable`. Cursor and other model-arg providers use opaque
275
- matrix slugs; OAT validates availability when a provider oracle is available,
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.
298
+ ```yaml
299
+ oat_dispatch_policy:
300
+ mode: inherit
301
+ source: project-state
302
+ ```
279
303
 
280
- ### Codex role materialization
304
+ ### Exact task resolution
281
305
 
282
- Use `oat providers codex materialize` when you need to materialize one
283
- canonical agent as a Codex role outside a full sync run:
306
+ The project-aware resolver remains the source of truth. Preflight reads layered
307
+ config and project state without mutating either:
284
308
 
285
309
  ```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
310
+ oat project dispatch-ceiling resolve --provider codex --preflight --json
288
311
  ```
289
312
 
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:
313
+ For each managed capped task, the phase coordinator supplies the recorded
314
+ project or narrower phase maximum plus one exact configured candidate:
298
315
 
299
316
  ```bash
300
- oat sync --scope project
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
301
338
  ```
302
339
 
303
- **Verify-on-upgrade:** when the requested tier exceeds the current orchestrator
304
- tier (an upgrade request), the resolver sets `verifyOnDispatch: true`. The skill
305
- confirms the actual model used after dispatch. If the provider did not honor the
306
- upgrade, the enforcement log reads `advisory — provider did not honor upgrade;
307
- ran <tier>` instead of `enforced`.
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.
308
345
 
309
- ### Legacy compatibility
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.
310
350
 
311
- The command group and docs path still use `dispatch-ceiling` for compatibility.
312
- Legacy `workflow.dispatchCeiling.*` config and project `oat_dispatch_ceiling`
313
- frontmatter remain readable as capped managed policy input. Absent legacy state
314
- does not mean managed `Uncapped`.
351
+ ### Provider enforcement and materialization
315
352
 
316
- ### Using the resolver
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 |
317
358
 
318
- Implementation workflows should use the project-aware resolver rather than
319
- reading config keys directly:
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`:
320
362
 
321
363
  ```bash
322
- oat project dispatch-ceiling resolve --provider codex --json
323
- oat project dispatch-ceiling resolve --provider codex --role implementer --preferred medium --json
324
- oat project dispatch-ceiling resolve --provider claude --role implementer --preferred sonnet --orchestrator-tier sonnet --json
325
- oat project dispatch-ceiling resolve --provider claude --orchestrator-tier sonnet --json
326
- 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
327
367
  ```
328
368
 
329
- The resolver checks effective config first, then project `state.md`
330
- `oat_dispatch_policy` frontmatter, including sparse `matrix` overrides, then
331
- legacy `oat_dispatch_ceiling`. For Codex it also reports
332
- `providerDefaultEffort`, which is informational only for explicit
333
- 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
+ ### Cursor validation pass and live evidence
385
+
386
+ Config adoption and doctor validate Cursor candidates with one command-scoped
387
+ pass context. Duplicate references to the same byte-for-byte candidate share
388
+ one Task/subagent probe. If a decisive probe is unavailable, the pass resolves
389
+ the broad catalog once, with at most one `--list-models` fallback. The cache
390
+ ends with that adopt or doctor command; it is not process-global and has no
391
+ TTL.
392
+
393
+ A correlated Task start/completion pair that preserves the exact model argument
394
+ and returns the sentinel establishes that the argument is eligible for that
395
+ account and client. A structured rejection or exact allow-list exclusion can
396
+ establish `unknown-value`. Neither result identifies the backend runtime model:
397
+ `runtimeIdentity` remains `not-reported` unless trusted Cursor telemetry or
398
+ Cursor support confirms it. Parent prose and broad catalog presence are
399
+ diagnostic-only, so OAT preserves `unvalidated` when launcher evidence is
400
+ absent instead of inferring capability from candidate spelling.
401
+
402
+ The [dated GPT-5.6 Cursor verification evidence](https://github.com/voxmedia/open-agent-toolkit/blob/main/.oat/repo/reference/project-summaries/20260711-cursor-gpt-5-6-subagent-verification.md)
403
+ preserves the original text-mode pass and a versioned stream-JSON second pass.
404
+ The second pass ran a dynamic positive control and deliberate invalid control
405
+ before candidates. Both parent runs completed without a Task event, making the
406
+ controls inconclusive; the stop rule therefore executed zero of the 13
407
+ recommended candidates and did not execute exploratory
408
+ `gpt-5.6-sol-high-fast`. The recommendation remains unchanged and candidate
409
+ eligibility remains unresolved.
410
+
411
+ The tracked artifact's structured second-pass block contains only allowlisted
412
+ event structure, derived outcomes, sanitized auth-presence context, and
413
+ non-reversible identifier hashes. Exact request/session/tool-call IDs and
414
+ credential-redacted unprojected streams from that pass stay under gitignored
415
+ `.oat/projects/local/` storage for possible Cursor support diagnosis.
416
+
417
+ The same public artifact intentionally retains the sanitized historical v1
418
+ text-mode record for provenance. That older section includes command arguments
419
+ and prompts, stdout and stderr, exit and duration data, and capture-environment
420
+ details such as user-specific binary paths; it is not limited to the structured
421
+ second-pass allowlist. Re-run after a Cursor client rollout exposes Task in
422
+ headless mode or Cursor support confirms the private requests; review the open
423
+ verification item by 2026-08-08.
424
+
425
+ ### Legacy compatibility
426
+
427
+ The command and docs path retain `dispatch-ceiling` for compatibility. Legacy
428
+ bare provider values, `workflow.dispatchCeiling.preset`, project
429
+ `oat_dispatch_ceiling`, and `--preferred` remain readable during migration.
430
+ Absent policy state does not mean managed `Uncapped`.
334
431
 
335
- For non-interactive preflight checks, use:
432
+ For non-interactive preflight checks:
336
433
 
337
434
  ```bash
338
- oat project dispatch-ceiling resolve --provider codex --preflight --non-interactive
435
+ oat project dispatch-ceiling resolve \
436
+ --provider codex \
437
+ --preflight \
438
+ --non-interactive
339
439
  ```
340
440
 
341
- If unresolved, the command exits non-zero with the same `BLOCKED:` guidance used
342
- by `oat-project-implement`.
441
+ An unresolved or incomplete managed ladder exits nonzero and blocks before
442
+ implementation work.
343
443
 
344
444
  ## Workflow preferences (`workflow.*`)
345
445