@open-agent-toolkit/cli 0.3.5 → 0.3.7

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.
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.3.5"
3
+ "oatVersion": "0.3.7"
4
4
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2026-09-24.1",
2
+ "version": "2026-09-25.1",
3
3
  "providers": {
4
4
  "codex": {
5
5
  "economy": {
@@ -142,16 +142,28 @@
142
142
  ]
143
143
  },
144
144
  "balanced": {
145
- "candidates": ["cursor-grok-4.5-high", "gpt-5.6-terra-high"]
145
+ "candidates": [
146
+ "cursor-grok-4.6-medium",
147
+ "gpt-5.6-terra-high",
148
+ "claude-opus-5-5-low"
149
+ ]
146
150
  },
147
151
  "high": {
148
- "candidates": ["gpt-5.6-sol-medium", "gpt-5.6-sol-high"]
152
+ "candidates": [
153
+ "gpt-5.6-sol-medium",
154
+ "claude-opus-5-5-low",
155
+ "gpt-5.6-sol-high",
156
+ "claude-opus-5-5-medium",
157
+ "claude-opus-5-5-high"
158
+ ]
149
159
  },
150
160
  "frontier": {
151
161
  "candidates": [
152
162
  "gpt-5.6-sol-xhigh",
153
163
  "gpt-5.6-sol-max",
154
- "claude-fable-5-thinking-high"
164
+ "claude-opus-5-5-high",
165
+ "claude-opus-5-5-xhigh",
166
+ "claude-fable-5-1-thinking-high"
155
167
  ]
156
168
  }
157
169
  }
@@ -387,14 +387,14 @@ preference. For the full model, see
387
387
 
388
388
  ### Config keys
389
389
 
390
- | Key | Values | Purpose |
391
- | ------------------------------------------------------ | ----------------------------------------------------- | --------------------------------------------------------------------------------------- |
392
- | `workflow.dispatchPolicy.mode` | `managed`, `inherit` | `managed` lets OAT select exact candidates; `inherit` leaves controls to the host |
393
- | `workflow.dispatchPolicy.policy` | `economy`, `balanced`, `high`, `frontier`, `uncapped` | Default named maximum or explicit managed uncapped state |
394
- | `workflow.dispatchCeiling.providers.<provider>` | tier map or legacy bare value | Reusable provider candidate column |
395
- | `workflow.dispatchCeiling.providers.<provider>.<tier>` | `candidates` cell, route, or legacy bare value | One named tier in the provider ladder |
396
- | `workflow.dispatchCeiling.recommendationVersion` | string | Version written by `oat config adopt dispatch-matrix` for recommendation drift tracking |
397
- | `workflow.dispatchCeiling.preset` | `balanced`, `maximum`, `cost-conscious` | Legacy policy setup alias |
390
+ | Key | Values | Purpose |
391
+ | ------------------------------------------------------ | ----------------------------------------------------- | ------------------------------------------------------------------------------------ |
392
+ | `workflow.dispatchPolicy.mode` | `managed`, `inherit` | `managed` lets OAT select exact candidates; `inherit` leaves controls to the host |
393
+ | `workflow.dispatchPolicy.policy` | `economy`, `balanced`, `high`, `frontier`, `uncapped` | Default named maximum or explicit managed uncapped state |
394
+ | `workflow.dispatchCeiling.providers.<provider>` | tier map or legacy bare value | Reusable provider candidate column |
395
+ | `workflow.dispatchCeiling.providers.<provider>.<tier>` | `candidates` cell, route, or legacy bare value | One named tier in the provider ladder |
396
+ | `workflow.dispatchCeiling.recommendationVersion` | string | Bundle version last written by adoption; does not prove the effective ladder matches |
397
+ | `workflow.dispatchCeiling.preset` | `balanced`, `maximum`, `cost-conscious` | Legacy policy setup alias |
398
398
 
399
399
  ### Adopt a complete ladder
400
400
 
@@ -406,14 +406,20 @@ oat config adopt dispatch-matrix --local
406
406
  oat config adopt dispatch-matrix --user
407
407
  ```
408
408
 
409
- Adoption fills missing provider/tier cells and preserves explicit existing
410
- values. Planning shows the complete bundled recommendation before asking for
411
- this scope, then rechecks the effective ladder. If explicit cells still leave
412
- the ladder incomplete, readiness blocks; OAT does not overwrite them.
413
- `workflow.dispatchCeiling.recommendationVersion` describes only the bundled
414
- recommendation that was adopted. Dispatch targets, structured notices, and
415
- runtime disclosure come from the effective ladder after explicit cells have
416
- been preserved.
409
+ Adoption replaces populated cells from the bundled recommendation in the
410
+ chosen scope, fills missing cells, and keeps extra custom tier cells when
411
+ the bundled provider remains a tier map. A bundled provider-level scalar
412
+ replaces the whole provider, including its custom tiers. It warns about
413
+ replaced and removed cells and reports their paths in human and JSON output. Preview with
414
+ `oat config adopt dispatch-matrix --user --dry-run` before writing user defaults.
415
+ Add `--keep-existing` when you want only missing cells filled; a fill-only run
416
+ with no missing cells leaves the config and version unchanged. If it fills
417
+ missing cells while preserving differences, it leaves the version unchanged. Planning uses
418
+ `--keep-existing` after showing the complete bundle and asking for the owning
419
+ scope. If the resulting effective ladder remains incomplete, readiness blocks.
420
+ The version records the bundle last written by adoption, not whether the
421
+ effective ladder matches it. Dispatch targets, structured notices, and runtime
422
+ disclosure come from the effective ladder.
417
423
 
418
424
  A recommended Fable target may require model access from the executing
419
425
  provider. The adopting organization is responsible for confirming its
@@ -463,7 +469,7 @@ even when the reusable ladder is user-owned.
463
469
  },
464
470
  "cursor": {
465
471
  "balanced": {
466
- "candidates": ["cursor-grok-4.5-high", "gpt-5.6-terra-high"]
472
+ "candidates": ["cursor-grok-4.6-medium", "gpt-5.6-terra-high"]
467
473
  }
468
474
  }
469
475
  }
@@ -490,10 +496,10 @@ rungs. A present declaration is authoritative. Host-managed routing through
490
496
  bare effort-pinned alias fails closed when its generation cannot be proven.
491
497
  Model-only Claude aliases remain compatible through the per-call model argument
492
498
  and report `effortAxis: not-applicable` because the Agent API exposes no
493
- per-call effort argument. The recommendation carries 10 Cursor candidates
499
+ per-call effort argument. The recommendation carries 16 Cursor candidates
494
500
  across four tiers, drawn from a materialization
495
- catalogue with 17 catalogued multi-family flat IDs spanning Composer, Claude
496
- (Sonnet, Opus 5.5, and Fable), GPT, and Grok; the two figures differ because some
501
+ catalogue with 26 catalogued multi-family flat IDs spanning Composer, Claude
502
+ (Sonnet, Opus 5.5, Fable 5, and Fable 5.1), GPT, and Grok 4.5 and 4.6; the two figures differ because some
497
503
  approved mappings stay materializable without being recommended. An explicit
498
504
  mapping connects each flat ladder ID to a separate bracket-form frontmatter
499
505
  model; configuration and skills never derive or normalize either form.
@@ -700,7 +706,7 @@ Workflow preference keys live under the `workflow.*` namespace:
700
706
  - `workflow.dispatchCeiling.preset` — legacy compatibility alias (`balanced`, `maximum`, or `cost-conscious`) for capped managed policy setup.
701
707
  - `workflow.dispatchCeiling.providers.<provider>` — dispatch matrix provider column or legacy bare provider target.
702
708
  - `workflow.dispatchCeiling.providers.<provider>.<tier>` — one matrix cell for `economy`, `balanced`, `high`, or `frontier`.
703
- - `workflow.dispatchCeiling.recommendationVersion` — version of the adopted recommended matrix.
709
+ - `workflow.dispatchCeiling.recommendationVersion` — bundle version last written by adoption; not an effective-ladder parity indicator.
704
710
  - `workflow.gates.skills` / `workflow.gates.execTargets` — structured per-skill final gate commands and exec-target registry. Use `oat gate set`, `oat gate target set`, `oat gate review`, and `oat gate cross-provider-exec`; do not use `oat config set` for these objects.
705
711
  - `workflow.gateTimeouts.code` / `workflow.gateTimeouts.artifact` — validated default gate-review budgets in milliseconds. Both resolve through `local > shared > user`.
706
712
 
@@ -66,7 +66,12 @@ The positive Sonnet control resolved, while invalid family and effort controls
66
66
  fell back to defaults. Five Opus 5.5 mappings are now approved for desktop
67
67
  subagents; the CLI result alone does not establish that the same bracket syntax
68
68
  works as a CLI top-level `--model` argument. Likewise, do not add GPT-6
69
- Cursor targets until that runtime lists and verifies them. See [Dispatch Policy](../workflows/projects/dispatch-ceiling.md#cursor-evidence-authority)
69
+ Cursor targets until that runtime lists and verifies them.
70
+
71
+ A 2026-09-25 desktop 3.21.18 probe added Grok 4.6 and Fable 5.1 mappings
72
+ and moved the bundled Cursor ladder to them. The same probe showed Grok 4.7
73
+ resolves only bare flat IDs, never bracket selectors, so it stays out of the
74
+ catalogue; see [Verifying Cursor Pins](verifying-cursor-pins.md). See [Dispatch Policy](../workflows/projects/dispatch-ceiling.md#cursor-evidence-authority)
70
75
  for the distinction between catalog, configured mapping, and runtime identity.
71
76
 
72
77
  ## Change and Validate
@@ -103,11 +108,11 @@ Follow [Contributing Code](code.md) for the current validation and PR workflow.
103
108
 
104
109
  ## Adoption Is Separate
105
110
 
106
- The bundled ladder is a default for missing provider/tier cells. `oat config
107
- adopt dispatch-matrix --shared`, `--local`, or `--user` fills missing cells but
108
- does not replace populated explicit cells, even when its recommendation version
109
- changes. A user who wants the new model ordering must edit those cells or
110
- clear and re-adopt them deliberately. The active project's named ceiling is a
111
- separate policy in its `state.md`; a model update must not silently change it.
111
+ A bundled ladder update does not mutate adopted user or repository config.
112
+ `oat config adopt dispatch-matrix --shared`, `--local`, or `--user` replaces
113
+ bundled cells in the chosen scope, with a warning and a `--dry-run` preview;
114
+ extra custom cells remain. Add `--keep-existing` to fill only missing cells.
115
+ The active project's named ceiling is a separate policy in its `state.md`;
116
+ a model update must not silently change it.
112
117
  See [Dispatch Policy](../workflows/projects/dispatch-ceiling.md#ownership-and-adoption)
113
118
  for config precedence and examples.
@@ -66,6 +66,26 @@ the adjacent redacted summary and 32-event native JSONL records in the OAT
66
66
  repository. Re-run this procedure for a new family or changed
67
67
  provider behavior.
68
68
 
69
+ The 2026-09-25 probe on Cursor 3.21.18 approved Grok 4.6
70
+ (`grok-4.6[effort=...,fast=false]`) and Fable 5.1
71
+ (`claude-fable-5-1[effort=...]`, which always resolves to the `-thinking-`
72
+ flat IDs). It also found a family that ignores bracket selectors entirely:
73
+ every Grok 4.7 bracket spelling tried resolved to `grok-4.7-high-fast`, the
74
+ account default that the unknown-family control also received, while bare
75
+ flat IDs such as `grok-4.7-medium` resolved exactly. Two lessons follow:
76
+
77
+ - **Do not assume a new version keeps its predecessor's selector syntax.**
78
+ Probe the syntax, not just the rungs.
79
+ - **A fallback can look like success.** When the account default belongs to
80
+ the family under test, compare every subject row with the unknown-family
81
+ control and probe non-default rungs. Here even `effort=low,fast=false`
82
+ landed on the high-fast default.
83
+
84
+ Approved mappings are bracket-form only
85
+ (`DR-260718-explicit-cursor-pin-mapping`), so Grok 4.7 has no mapping until
86
+ that decision is revisited. The redacted evidence is in the same fixtures
87
+ directory.
88
+
69
89
  ## Prerequisites
70
90
 
71
91
  - Cursor desktop app, with the repository open as a workspace.
@@ -89,6 +89,10 @@ oat config adopt dispatch-matrix --local
89
89
  oat config adopt dispatch-matrix --user
90
90
  ```
91
91
 
92
+ These commands replace bundled cells in the chosen scope and warn about
93
+ replacements. Add `--dry-run` to preview or `--keep-existing` to fill only
94
+ missing cells.
95
+
92
96
  Project-config candidates materialize into the tracked, version-controlled
93
97
  project `.codex` and `.cursor` views. User-config candidates materialize under
94
98
  `~/.codex` and `~/.cursor`. OAT does not auto-ignore project output or create
@@ -83,7 +83,7 @@ provider-level scalar in that scope or remain shadowed by one at higher
83
83
  precedence. It always tries the next authorized compatible candidate and stops
84
84
  without mutation only when none remains.
85
85
 
86
- The planner runs exactly one matching `oat config adopt dispatch-matrix`
86
+ The planner runs exactly one matching `oat config adopt dispatch-matrix --keep-existing`
87
87
  command, records file-existence and compatibility evidence plus the selected
88
88
  scope, and re-runs dispatch preflight. Existing explicit cells remain unchanged;
89
89
  their provenance does not select the persistence scope. No authorized
@@ -58,29 +58,34 @@ oat config adopt dispatch-matrix --local
58
58
  oat config adopt dispatch-matrix --user
59
59
  ```
60
60
 
61
- Adoption fills missing provider/tier cells and records
62
- `workflow.dispatchCeiling.recommendationVersion`; it does not replace explicit
63
- existing cells. Planning shows the complete recommendation before asking which
64
- scope should own it. If the resulting ladder is still missing or incomplete,
65
- planning remains blocked rather than replacing the user's explicit values.
66
- The recommendation version describes only the bundled recommendation. After
67
- preserving existing cells, OAT resolves the effective ladder and uses that
68
- effective result—not the recommendation version—for dispatch targets and
69
- runtime disclosure.
61
+ Adoption replaces populated cells from the bundled recommendation in the
62
+ chosen scope, fills missing cells, and retains extra custom tiers when the
63
+ bundled provider remains a tier map. A bundled provider-level scalar replaces
64
+ the whole provider, including custom tiers. It warns about replaced or
65
+ removed cells and reports their paths. Use `--dry-run` to preview. For
66
+ fill-only setup, `--keep-existing` preserves populated cells; if it fills
67
+ nothing, both config and version remain unchanged. When it fills missing
68
+ cells but preserves divergent cells, the version also stays unchanged. Planning always uses
69
+ `--keep-existing` after showing the complete recommendation and asking which
70
+ scope should own it. If the resulting effective ladder remains incomplete,
71
+ planning blocks. The version identifies the bundle last written by adoption;
72
+ it does not prove the effective ladder matches it. OAT resolves the effective
73
+ ladder for dispatch targets and runtime disclosure.
70
74
 
71
75
  ### Upgrading to a newer recommendation version
72
76
 
73
- Preservation applies to whole cells, which has a consequence worth stating
74
- plainly: when a new recommendation version adds candidates to a tier you have
75
- already populated, re-running adoption will not give them to you. The existing
76
- cell is kept intact rather than merged candidate by candidate. Removals are not
77
- propagated either.
77
+ A new bundled recommendation does not change an adopted config by itself.
78
+ To update the chosen scope, first preview its affected cells:
78
79
 
79
- To pick up a new version, compare your
80
- `workflow.dispatchCeiling.recommendationVersion` against the bundled version,
81
- then either edit the affected cells by hand or clear them and re-adopt.
80
+ ```bash
81
+ oat config adopt dispatch-matrix --user --dry-run
82
+ ```
83
+
84
+ Run the same command without `--dry-run` to replace bundled cells. Use
85
+ `--shared` or `--local` instead when that scope owns the ladder. Add
86
+ `--keep-existing` to fill only missing cells and preserve existing choices.
82
87
 
83
- Version `2026-09-24.1` is the current bundled recommendation. It prefers
88
+ Version `2026-09-25.1` is the current bundled recommendation. It prefers
84
89
  GPT-6 Luna and Sol in Codex, then Sol xhigh, Astra high, and Astra xhigh in
85
90
  Codex Frontier. Astra's task advantage has not been measured locally; this is
86
91
  an explicit user-directed preference, not acceptance by the separately
@@ -88,11 +93,18 @@ maintained model-selection policy. Opus 5.5 low/medium/high remains in Claude Hi
88
93
  The Claude low option suits bounded intelligent recon in Balanced or High;
89
94
  medium remains the implementation starting point under High. GPT-5.6 targets remain
90
95
  supported for explicit Codex and Cursor configurations. Cursor's preferred
91
- ladder uses existing verified GPT-5.6, Grok, Composer, and Fable mappings;
92
- Cursor Opus 5.5 now has five approved desktop mappings, but the bundled
93
- Cursor preference order remains unchanged. Rerunning adoption preserves any
94
- explicit older cell unchanged. For the complete maintenance
95
- procedure, see [Updating Model Guidance](../../contributing/updating-model-guidance.md).
96
+ ladder interleaves verified GPT-5.6 and Opus 5.5 mappings: Balanced adds
97
+ Opus 5.5 low above Terra high, High orders Sol medium, Opus low, Sol high,
98
+ Opus medium, then Opus high, and Frontier places Opus high and xhigh between
99
+ Sol max and Fable 5.1. Grok 4.6 medium replaces Grok 4.5 high at the bottom of
100
+ Balanced, and Fable 5.1 thinking high replaces Fable 5 as Frontier's terminal
101
+ target. The ordering is an explicit user-directed preference informed by
102
+ vendor benchmarks and the model-selection matrix, not a local workload
103
+ comparison. Grok 4.5 and Fable 5 stay supported for explicit configurations.
104
+ Rerunning adoption replaces the bundled cells in the chosen scope; use
105
+ `--keep-existing` to preserve explicit older cells. For the complete
106
+ maintenance procedure, see
107
+ [Updating Model Guidance](../../contributing/updating-model-guidance.md).
96
108
 
97
109
  The terminal Fable target may require model access from the executing provider.
98
110
  The adopting organization is responsible for confirming its applicable
@@ -244,10 +256,12 @@ The bundled ladder is a curated subset of the supported targets:
244
256
  - **Claude:** `haiku` and Sonnet 5 at Economy/Balanced, Opus 5.5 at High and
245
257
  Frontier, and Fable 5.1 at Frontier.
246
258
  - **Cursor:** the preferred ladder uses approved Composer 2.5, GPT-5.6, Grok
247
- 4.5, and Fable 5 targets. The catalogue maps each flat ladder ID to its
248
- separately verified bracket-form frontmatter model. Opus 5.5 has five
249
- approved effort mappings from a [native desktop probe](../../contributing/verifying-cursor-pins.md);
250
- they are available for explicit selection outside the bundled preference.
259
+ 4.6, Opus 5.5, and Fable 5.1 targets. The catalogue maps each flat ladder ID
260
+ to its separately verified bracket-form frontmatter model. Grok 4.6 (`low`
261
+ through `xhigh`) and Fable 5.1 (`low` through `max`, thinking variants) were
262
+ approved from a 2026-09-25 [native desktop probe](../../contributing/verifying-cursor-pins.md);
263
+ targets outside the ladder remain available for explicit selection. Grok
264
+ 4.7 has no approved mapping because it ignores bracket selectors.
251
265
 
252
266
  The final candidate in a named tier defines that tier's reviewer ceiling. Lower
253
267
  reviewer selection requires a separate reviewed contract; a normal reviewer
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.3.5",
3
- "docs-config": "0.3.5",
4
- "docs-theme": "0.3.5",
5
- "docs-transforms": "0.3.5"
2
+ "cli": "0.3.7",
3
+ "docs-config": "0.3.7",
4
+ "docs-theme": "0.3.7",
5
+ "docs-transforms": "0.3.7"
6
6
  }
@@ -6,7 +6,7 @@ disable-model-invocation: true
6
6
  user-invocable: true
7
7
  allowed-tools: Read, Bash, Glob, Grep, AskUserQuestion
8
8
  metadata:
9
- version: 2.0.0
9
+ version: 2.0.1
10
10
  ---
11
11
 
12
12
  # OAT Doctor
@@ -111,7 +111,7 @@ Each finding is one line with an **area**, a **severity**, a one-line **summary*
111
111
  - `activeProject` or `lastPausedProject` set to a path that does not exist → `error`; fix `oat config set activeProject ''` / `oat config set lastPausedProject ''` (the CLI refuses `unset` for these two lifecycle keys). `activeIdea` set to a missing path → `error`; fix `oat config unset activeIdea --local` (or `--user` for a user-level value).
112
112
  - A set key whose `describe` entry carries `deprecated` → `warning`; summary names the key and its `deprecated.supersededBy`; when `deprecated.legacyValues` is present the finding fires only when the set value is one of those values; fix = the entry's `owningCommand` for the successor.
113
113
  - A key set on a surface that is not one of the surfaces its `describe` entry's `file` names → `warning`; fix `oat config unset <key> --<surface>` then `oat config set <key> <value> --<right surface>`.
114
- - The `dispatch-matrix` recommendation is reported only through the `project:dispatch_matrix` check (command 1, config area); there is no separate rule for it, so one gap is one finding. Its fix is `oat config adopt dispatch-matrix --shared`, and the config dive explains it from `workflow.dispatchCeiling.recommendationVersion` in the dump.
114
+ - The `project:dispatch_matrix` check (command 1, config area) reports target availability, not parity with the bundled recommendation. Do not infer parity from `workflow.dispatchCeiling.recommendationVersion`: it identifies the bundle last written by adoption. In the config dive, `oat config adopt dispatch-matrix --shared --keep-existing` fills missing cells and reports preserved differences; a direct adoption without `--keep-existing` replaces bundled cells in the chosen scope, so preview it with `--dry-run`.
115
115
  - A documented key group with nothing set on any surface → one `info` per group, expanded only in the dive.
116
116
  - Synced project health: `project:synced_tracked_artifacts`, `project:synced_gitignore`, `project:synced_projects`, `project:synced_editor_hint`, and per-project `project:synced_<slug>_<kind>` checks from command 1 → severity from status, summary from the message; report them without treating an absent checkout as proof that no synced project exists (an absent checkout is materialized by `oat project pull`, which the check's message names).
117
117
 
@@ -6,7 +6,7 @@ disable-model-invocation: true
6
6
  user-invocable: true
7
7
  allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion, Task
8
8
  metadata:
9
- version: 1.0.16
9
+ version: 1.0.17
10
10
  ---
11
11
 
12
12
  # Autonomous OAT Project
@@ -375,7 +375,7 @@ provider scalar or is shadowed by one at higher precedence, and block without
375
375
  mutation only when no authorized adoption-compatible scope remains. Existing
376
376
  explicit matrix cells are preserved by adoption; their provenance does not
377
377
  choose the persistence scope. Run exactly one matching
378
- `oat config adopt dispatch-matrix` command and re-run the reviewer preflight.
378
+ `oat config adopt dispatch-matrix --keep-existing` command and re-run the reviewer preflight.
379
379
  Block when the ladder remains incomplete after adoption.
380
380
 
381
381
  At every required artifact or code review:
@@ -7,7 +7,7 @@ disable-model-invocation: true
7
7
  user-invocable: true
8
8
  allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
9
9
  metadata:
10
- version: 1.4.17
10
+ version: 1.4.18
11
11
  ---
12
12
 
13
13
  # Import External Plan
@@ -291,9 +291,9 @@ show the complete bundled recommendation and ask for its owning scope before
291
291
  running exactly one of:
292
292
 
293
293
  ```bash
294
- oat config adopt dispatch-matrix --shared
295
- oat config adopt dispatch-matrix --local
296
- oat config adopt dispatch-matrix --user
294
+ oat config adopt dispatch-matrix --shared --keep-existing
295
+ oat config adopt dispatch-matrix --local --keep-existing
296
+ oat config adopt dispatch-matrix --user --keep-existing
297
297
  ```
298
298
 
299
299
  Adoption preserves explicit cells. Re-run the resolver and completeness check.
@@ -6,7 +6,7 @@ disable-model-invocation: true
6
6
  user-invocable: true
7
7
  allowed-tools: Read, Write, Bash(git:*), Glob, Grep, AskUserQuestion
8
8
  metadata:
9
- version: 1.4.14
9
+ version: 1.4.15
10
10
  ---
11
11
 
12
12
  # Planning Phase
@@ -408,9 +408,9 @@ recommendation and ask the user to choose the owning scope before running
408
408
  exactly one of:
409
409
 
410
410
  ```bash
411
- oat config adopt dispatch-matrix --shared
412
- oat config adopt dispatch-matrix --local
413
- oat config adopt dispatch-matrix --user
411
+ oat config adopt dispatch-matrix --shared --keep-existing
412
+ oat config adopt dispatch-matrix --local --keep-existing
413
+ oat config adopt dispatch-matrix --user --keep-existing
414
414
  ```
415
415
 
416
416
  Adoption fills missing cells but preserves explicit values. Re-run the resolver
@@ -5,7 +5,7 @@ disable-model-invocation: true
5
5
  user-invocable: false
6
6
  allowed-tools: Read, Write, Glob, Grep
7
7
  metadata:
8
- version: 1.2.31
8
+ version: 1.2.33
9
9
  ---
10
10
 
11
11
  # Plan Writing Contract
@@ -119,21 +119,21 @@ Route from the resolver fields, not from hand-inspected config keys:
119
119
  When adoption is required, show the complete bundled recommendation before
120
120
  asking to write anything:
121
121
 
122
- | Provider | Economy | Balanced | High | Frontier |
123
- | --------------- | --------------------------------------------------------- | -------------------------------------------- | ----------------------------------------------------------------- | ---------------------------------------------------------------------- |
124
- | Codex | gpt-6-luna/low, gpt-6-luna/medium, gpt-6-luna/high | gpt-6-luna/xhigh, gpt-6-luna/max | gpt-6-sol/low, gpt-6-sol/medium, gpt-6-sol/high | gpt-6-sol/xhigh, gpt-6-astra/high, gpt-6-astra/xhigh |
125
- | Claude | haiku, claude-sonnet-5/medium | claude-opus-5-5/low | claude-opus-5-5/low, claude-opus-5-5/medium, claude-opus-5-5/high | claude-opus-5-5/xhigh, claude-opus-5-5/max, claude-fable-5-1/high |
126
- | Cursor (opaque) | `composer-2.5`, `gpt-5.6-luna-high`, `gpt-5.6-luna-xhigh` | `cursor-grok-4.5-high`, `gpt-5.6-terra-high` | `gpt-5.6-sol-medium`, `gpt-5.6-sol-high` | `gpt-5.6-sol-xhigh`, `gpt-5.6-sol-max`, `claude-fable-5-thinking-high` |
122
+ | Provider | Economy | Balanced | High | Frontier |
123
+ | --------------- | --------------------------------------------------------- | --------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- |
124
+ | Codex | gpt-6-luna/low, gpt-6-luna/medium, gpt-6-luna/high | gpt-6-luna/xhigh, gpt-6-luna/max | gpt-6-sol/low, gpt-6-sol/medium, gpt-6-sol/high | gpt-6-sol/xhigh, gpt-6-astra/high, gpt-6-astra/xhigh |
125
+ | Claude | haiku, claude-sonnet-5/medium | claude-opus-5-5/low | claude-opus-5-5/low, claude-opus-5-5/medium, claude-opus-5-5/high | claude-opus-5-5/xhigh, claude-opus-5-5/max, claude-fable-5-1/high |
126
+ | Cursor (opaque) | `composer-2.5`, `gpt-5.6-luna-high`, `gpt-5.6-luna-xhigh` | `cursor-grok-4.6-medium`, `gpt-5.6-terra-high`, `claude-opus-5-5-low` | `gpt-5.6-sol-medium`, `claude-opus-5-5-low`, `gpt-5.6-sol-high`, `claude-opus-5-5-medium`, `claude-opus-5-5-high` | `gpt-5.6-sol-xhigh`, `gpt-5.6-sol-max`, `claude-opus-5-5-high`, `claude-opus-5-5-xhigh`, `claude-fable-5-1-thinking-high` |
127
127
 
128
128
  In an interactive run, ask the user to select the owning scope explicitly
129
129
  before any adoption write:
130
130
 
131
131
  1. **Shared repository** - team-owned `.oat/config.json`; run
132
- `oat config adopt dispatch-matrix --shared`.
132
+ `oat config adopt dispatch-matrix --shared --keep-existing`.
133
133
  2. **Repo-local checkout** - personal `.oat/config.local.json`; run
134
- `oat config adopt dispatch-matrix --local`.
134
+ `oat config adopt dispatch-matrix --local --keep-existing`.
135
135
  3. **User** - cross-repository `~/.oat/config.json`; run
136
- `oat config adopt dispatch-matrix --user`.
136
+ `oat config adopt dispatch-matrix --user --keep-existing`.
137
137
  4. **Do not adopt** - leave setup unresolved and block implementation
138
138
  readiness.
139
139
 
@@ -7,7 +7,7 @@ disable-model-invocation: true
7
7
  user-invocable: true
8
8
  allowed-tools: Read, Write, Bash, Glob, Grep, AskUserQuestion
9
9
  metadata:
10
- version: 2.3.15
10
+ version: 2.3.16
11
11
  ---
12
12
 
13
13
  # Quick Start Project
@@ -659,9 +659,9 @@ show the full bundled recommendation and ask the user to select its owning
659
659
  scope before running exactly one command:
660
660
 
661
661
  ```bash
662
- oat config adopt dispatch-matrix --shared
663
- oat config adopt dispatch-matrix --local
664
- oat config adopt dispatch-matrix --user
662
+ oat config adopt dispatch-matrix --shared --keep-existing
663
+ oat config adopt dispatch-matrix --local --keep-existing
664
+ oat config adopt dispatch-matrix --user --keep-existing
665
665
  ```
666
666
 
667
667
  The selected scope owns only the reusable ladders. A project-specific active
@@ -4,7 +4,7 @@ description: Use when delegating work to subagents or choosing a model for a tas
4
4
  compatibility: Self-contained; no OAT installation required.
5
5
  user-invocable: true
6
6
  metadata:
7
- version: 1.0.9
7
+ version: 1.0.10
8
8
  ---
9
9
 
10
10
  # Subagent Orchestration
@@ -1,10 +1,12 @@
1
1
  ---
2
- guidance_version: 2026-09-23
3
- last_verified: 2026-09-23
4
- review_after: 2026-12-22
2
+ guidance_version: 2026-09-25
3
+ last_verified: 2026-09-25
4
+ review_after: 2026-12-24
5
5
  catalog_basis:
6
- Cursor desktop 3.20.14 resolved all five Opus 5.5 effort selectors in native
7
- subagent hooks; GPT-6 Sol/Luna were absent from the observed Cursor catalog
6
+ Cursor desktop 3.21.18 resolved Grok 4.6 and Fable 5.1 effort selectors in
7
+ native subagent hooks, and Grok 4.7 only as bare flat IDs; Cursor desktop
8
+ 3.20.14 resolved all five Opus 5.5 effort selectors; GPT-6 Sol/Luna were
9
+ absent from the observed Cursor catalog
8
10
  ---
9
11
 
10
12
  # Cursor Model Selection
@@ -46,17 +48,18 @@ does not by itself prove lower user-observed elapsed time.
46
48
 
47
49
  Use currently approved exact aliases from the Cursor catalogue. On 2026-09-23,
48
50
  Cursor desktop 3.20.14 resolved all five `claude-opus-5-5[effort=...]`
49
- selectors to corresponding flat IDs in native hooks. See the
50
- probe record at `packages/cli/src/providers/cursor/codec/__fixtures__/README.md`.
51
+ selectors to corresponding flat IDs in native hooks; on 2026-09-25, Cursor
52
+ desktop 3.21.18 did the same for Grok 4.6 and Fable 5.1. See the
53
+ probe records at `packages/cli/src/providers/cursor/codec/__fixtures__/README.md`.
51
54
  GPT-6 Sol/Luna were absent from the observed Cursor catalogue, so their Codex
52
55
  availability does not authorize Cursor routes.
53
56
 
54
57
  | Task class | Default | Economy | Escalation | Floor notes |
55
58
  | ------------------------ | ------------------------------------------------------------------- | -------------------------------------------------- | ----------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
56
59
  | `mechanical-recon` | `composer-2.5` | Same with mechanical verification | `gpt-5.6-luna-high` | Fast aliases select service tier, not capability. |
57
- | `intelligent-recon` | `cursor-grok-4.5-medium` or `gpt-5.6-sol-medium` | `gpt-5.6-terra-high` | `gpt-5.6-sol-high` | Verify silent-miss-prone conclusions. |
58
- | `default-implementation` | `gpt-5.6-sol-medium` | `composer-2.5` for bounded, testable changes | `gpt-5.6-sol-high` | `cursor-grok-4.5-medium` remains an available judgment-heavy alternative. |
59
- | `hard-reasoning` | `gpt-5.6-sol-high` | `cursor-grok-4.5-high` with corroborating evidence | `gpt-5.6-sol-xhigh` | Opus 5.5 high/xhigh are verified cross-family alternatives; qualify task performance separately. |
60
+ | `intelligent-recon` | `cursor-grok-4.6-medium` or `gpt-5.6-sol-medium` | `gpt-5.6-terra-high` | `gpt-5.6-sol-high` | Verify silent-miss-prone conclusions. |
61
+ | `default-implementation` | `gpt-5.6-sol-medium` | `composer-2.5` for bounded, testable changes | `gpt-5.6-sol-high` | `cursor-grok-4.6-medium` or `-high` is the Cursor-native alternative by difficulty. |
62
+ | `hard-reasoning` | `gpt-5.6-sol-high` | `cursor-grok-4.6-high` with corroborating evidence | `gpt-5.6-sol-xhigh` | Opus 5.5 high/xhigh and Fable 5.1 thinking high are verified alternatives; qualify task performance separately. |
60
63
  | `consequential` | An eligible high-effort author with independent cross-family review | No routine economy route | Sol xhigh for a depth bottleneck; max only after evaluation | If independent review cannot be met among approved Cursor mappings, use a separately qualified provider or stop. |
61
64
 
62
65
  ## Current Opus 5.5 Pin Evidence
@@ -71,6 +74,25 @@ agreed for every rung. The Sonnet 5 high positive control resolved to
71
74
  links the adjacent redacted summary and native-event JSONL records containing
72
75
  the exact observations. Recheck live availability before launch.
73
76
 
77
+ ## Current Grok 4.6, Fable 5.1, and Grok 4.7 Pin Evidence
78
+
79
+ Cursor desktop 3.21.18 resolved `grok-4.6[effort=low|medium|high|xhigh,fast=false]`
80
+ to `cursor-grok-4.6-low|medium|high|xhigh` and
81
+ `claude-fable-5-1[effort=low|medium|high|xhigh|max]` to
82
+ `claude-fable-5-1-thinking-low|medium|high|xhigh|max` on 2026-09-25, with the
83
+ subagent Shell `preToolUse.model` agreeing for every rung. Fable 5.1 selectors
84
+ always resolve to thinking variants; its unknown-effort control fell back to
85
+ `claude-fable-5-1-thinking-high`. Sonnet 5 high and Grok 4.5 high positive
86
+ controls reproduced their approved mappings, and the unknown-family control
87
+ fell back to the account default, `grok-4.7-high-fast`.
88
+
89
+ Grok 4.7 has no approved mapping. Every bracket spelling tried
90
+ (`grok-4.7[effort=...]` with and without `fast`, `reasoning=`, and
91
+ `grok-4-7[...]`) fell back to that same account default, which is easy to
92
+ mistake for success because it is itself a Grok 4.7 model. Only bare flat IDs
93
+ such as `grok-4.7-medium` resolved as requested, and the approved catalogue
94
+ does not emit bare IDs. Do not pin Grok 4.7 until a mapping is approved.
95
+
74
96
  ## Historical Opus Cursor Probe Evidence (Retired)
75
97
 
76
98
  The following observations document Cursor 3.12.30 behavior on 2026-07-25.
@@ -133,21 +155,28 @@ and non-thinking variants.
133
155
 
134
156
  ## Broader Cursor Routes
135
157
 
136
- - `cursor-grok-4.5-medium`: primary alternative for intelligent recon and
158
+ - `cursor-grok-4.6-medium`: primary alternative for intelligent recon and
137
159
  general implementation; strong for code exploration, brainstorming, research
138
160
  synthesis, debugging, broad knowledge work, and judgment-heavy tool
139
- workflows.
140
- - `cursor-grok-4.5-high`: economy route for hard reasoning, architecture,
141
- ambiguous debugging, and incident diagnosis.
142
- - `cursor-grok-4.5-low`: simpler tool workflows; prefer `composer-2.5` for
161
+ workflows. Prefer medium to xhigh by default: medium scores higher on
162
+ DeepSWE at lower cost and runtime.
163
+ - `cursor-grok-4.6-high`: economy route for hard reasoning, architecture,
164
+ ambiguous debugging, and incident diagnosis. Use xhigh only after an effort
165
+ comparison shows it helps.
166
+ - `cursor-grok-4.6-low`: simpler tool workflows; prefer `composer-2.5` for
143
167
  highly mechanical work on cost.
168
+ - `cursor-grok-4.5-*`: still approved for explicit configurations, superseded
169
+ by Grok 4.6 in the bundled preference.
144
170
  - Grok is never the sole final authority for a consequential factual, security,
145
171
  incident, or architectural conclusion. Require tool evidence, citations,
146
172
  logs, query results, or file references for load-bearing Grok claims, or
147
173
  pair it with an eligible independent cross-family reviewer.
148
174
  - CursorBench caveat: Cursor disclosed that Cursor repository data entered
149
- Grok 4.5's training mixture. Treat its ranking as evidence of
150
- competitiveness, not proof of superiority over nearby frontier models.
175
+ Grok 4.5's training mixture. Do not carry that caveat onto Grok 4.6, whose
176
+ CursorBench results are current but still harness-specific evidence.
177
+ - `claude-fable-5-1-thinking-high`: eligible specialist for hard reasoning and
178
+ the bundled Frontier terminal target; xhigh only for evaluated long-horizon
179
+ work. Cursor lists Fable as "NO ZDR"; confirm retention eligibility.
151
180
  - `claude-sonnet-5-thinking-high`: strong provider-diversity alternative for
152
181
  normal implementation and agentic work when available.
153
182
  - `gpt-5.4-mini-medium`: economical general tool and coding worker.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,6 @@
1
1
  import { readFile as readFileDefault } from 'node:fs/promises';
2
2
  import { isAbsolute, join } from 'node:path';
3
+ import { isDeepStrictEqual } from 'node:util';
3
4
  import { buildCommandContext } from '../../app/command-context.js';
4
5
  import { normalizeExcludedPaths } from '../instructions/instructions.utils.js';
5
6
  import { resolveProjectsRoot } from '../shared/oat-paths.js';
@@ -2353,6 +2354,14 @@ async function removeConfigPathOnDisk(configPath, path) {
2353
2354
  const { next, removed } = removeConfigPath(parsed, path);
2354
2355
  return removed ? next : null;
2355
2356
  }
2357
+ function warnBeforeReplacingCells(application, options, context) {
2358
+ if (options.dryRun ||
2359
+ context.json ||
2360
+ application.replacedCells.length === 0) {
2361
+ return;
2362
+ }
2363
+ context.logger.warn(`Replacing ${application.replacedCells.length} populated dispatch matrix cells from the bundled recommendation: ${application.replacedCells.join(', ')}.${application.droppedCells.length > 0 ? ` Whole-provider replacements remove: ${application.droppedCells.join(', ')}.` : ''} Use --keep-existing to preserve them or --dry-run to preview.`);
2364
+ }
2356
2365
  async function loadDispatchMatrixRecommendation(dependencies) {
2357
2366
  const assetsRoot = await dependencies.resolveAssetsRoot();
2358
2367
  const assetPath = join(assetsRoot, DISPATCH_MATRIX_RECOMMENDATION_ASSET);
@@ -2392,18 +2401,90 @@ async function validateRecommendationCells(repoRoot, recommendation, dependencie
2392
2401
  }
2393
2402
  }
2394
2403
  }
2395
- function applyDispatchMatrixRecommendation(workflow, recommendation) {
2404
+ function applyDispatchMatrixRecommendation(workflow, recommendation, replace) {
2396
2405
  const existingProviders = workflow?.dispatchCeiling?.providers ?? {};
2397
2406
  const providers = {
2398
2407
  ...recommendation.providers,
2399
2408
  };
2409
+ const filledCells = [];
2410
+ const preservedCells = [];
2411
+ const differingCells = [];
2412
+ const replacedCells = [];
2413
+ const droppedCells = [];
2414
+ for (const [provider, recommendedValue] of Object.entries(recommendation.providers)) {
2415
+ const path = `${DISPATCH_CEILING_PROVIDER_KEY_PREFIX}${provider}`;
2416
+ const existingValue = getOwnKey(existingProviders, provider);
2417
+ if (existingValue === undefined) {
2418
+ if (typeof recommendedValue === 'string') {
2419
+ filledCells.push(path);
2420
+ }
2421
+ else {
2422
+ filledCells.push(...Object.keys(recommendedValue).map((tier) => `${path}.${tier}`));
2423
+ }
2424
+ continue;
2425
+ }
2426
+ if (typeof recommendedValue === 'string' ||
2427
+ typeof existingValue === 'string') {
2428
+ if (!isDeepStrictEqual(existingValue, recommendedValue)) {
2429
+ differingCells.push(path);
2430
+ if (replace) {
2431
+ replacedCells.push(path);
2432
+ if (typeof recommendedValue === 'string' &&
2433
+ typeof existingValue !== 'string') {
2434
+ droppedCells.push(...Object.keys(existingValue).map((tier) => `${path}.${tier}`));
2435
+ }
2436
+ }
2437
+ else {
2438
+ preservedCells.push(path);
2439
+ }
2440
+ }
2441
+ else {
2442
+ preservedCells.push(path);
2443
+ }
2444
+ continue;
2445
+ }
2446
+ for (const [tier, recommendedCell] of Object.entries(recommendedValue)) {
2447
+ const cellPath = `${path}.${tier}`;
2448
+ const existingCell = getOwnKey(existingValue, tier);
2449
+ if (existingCell === undefined) {
2450
+ filledCells.push(cellPath);
2451
+ }
2452
+ else {
2453
+ if (!isDeepStrictEqual(existingCell, recommendedCell)) {
2454
+ differingCells.push(cellPath);
2455
+ if (replace) {
2456
+ replacedCells.push(cellPath);
2457
+ }
2458
+ else {
2459
+ preservedCells.push(cellPath);
2460
+ }
2461
+ }
2462
+ else {
2463
+ preservedCells.push(cellPath);
2464
+ }
2465
+ }
2466
+ }
2467
+ }
2400
2468
  // `existingProviders` is a `normalizeDispatchMatrix` product, which now
2401
2469
  // keeps a provider literally named `__proto__` as an own key, so
2402
2470
  // `Object.entries` yields it here and every access is own-key guarded. The
2403
2471
  // `{ ...recommendation.providers }` spread above is already safe.
2404
2472
  for (const [provider, existingValue] of Object.entries(existingProviders)) {
2405
2473
  const recommendedValue = getOwnKey(recommendation.providers, provider);
2406
- if (recommendedValue &&
2474
+ if (replace &&
2475
+ recommendedValue &&
2476
+ typeof recommendedValue !== 'string' &&
2477
+ typeof existingValue !== 'string') {
2478
+ setOwnKey(providers, provider, {
2479
+ ...existingValue,
2480
+ ...recommendedValue,
2481
+ });
2482
+ }
2483
+ else if (replace && recommendedValue !== undefined) {
2484
+ // A bare provider override is replaced as one configured cell.
2485
+ setOwnKey(providers, provider, recommendedValue);
2486
+ }
2487
+ else if (recommendedValue &&
2407
2488
  typeof recommendedValue !== 'string' &&
2408
2489
  typeof existingValue !== 'string') {
2409
2490
  setOwnKey(providers, provider, {
@@ -2415,13 +2496,31 @@ function applyDispatchMatrixRecommendation(workflow, recommendation) {
2415
2496
  setOwnKey(providers, provider, existingValue);
2416
2497
  }
2417
2498
  }
2499
+ const versionWritten = replace
2500
+ ? filledCells.length > 0 ||
2501
+ replacedCells.length > 0 ||
2502
+ workflow?.dispatchCeiling?.recommendationVersion !==
2503
+ recommendation.version
2504
+ : filledCells.length > 0 && differingCells.length === 0;
2505
+ const writeRequired = filledCells.length > 0 || replacedCells.length > 0 || versionWritten;
2418
2506
  return {
2419
- ...(workflow ?? {}),
2420
- dispatchCeiling: {
2421
- ...workflow?.dispatchCeiling,
2422
- recommendationVersion: recommendation.version,
2423
- providers,
2507
+ workflow: {
2508
+ ...(workflow ?? {}),
2509
+ dispatchCeiling: {
2510
+ ...workflow?.dispatchCeiling,
2511
+ ...(versionWritten
2512
+ ? { recommendationVersion: recommendation.version }
2513
+ : {}),
2514
+ providers,
2515
+ },
2424
2516
  },
2517
+ filledCells,
2518
+ preservedCells,
2519
+ differingCells,
2520
+ replacedCells,
2521
+ droppedCells,
2522
+ versionWritten,
2523
+ writeRequired,
2425
2524
  };
2426
2525
  }
2427
2526
  async function effectiveTerminalReviewerNotices(repoRoot, userConfigDir, dependencies) {
@@ -2443,45 +2542,92 @@ async function adoptDispatchMatrixRecommendation(repoRoot, userConfigDir, option
2443
2542
  if (source === 'user') {
2444
2543
  const userConfig = await dependencies.readUserConfig(userConfigDir);
2445
2544
  await validateRecommendationCells(repoRoot, recommendation, dependencies, context.logger.warn);
2446
- const workflow = applyDispatchMatrixRecommendation(userConfig.workflow, recommendation);
2447
- await dependencies.writeUserConfig(userConfigDir, {
2448
- ...userConfig,
2449
- workflow,
2450
- });
2545
+ const application = applyDispatchMatrixRecommendation(userConfig.workflow, recommendation, options.replace);
2546
+ warnBeforeReplacingCells(application, options, context);
2547
+ if (application.writeRequired && !options.dryRun) {
2548
+ await dependencies.writeUserConfig(userConfigDir, {
2549
+ ...userConfig,
2550
+ workflow: application.workflow,
2551
+ });
2552
+ }
2451
2553
  return {
2452
2554
  key: 'workflow.dispatchCeiling.providers',
2453
2555
  value: recommendation.version,
2454
2556
  source,
2455
- notices: await effectiveTerminalReviewerNotices(repoRoot, userConfigDir, dependencies),
2557
+ versionWritten: application.versionWritten && !options.dryRun,
2558
+ dryRun: options.dryRun,
2559
+ currentVersion: (options.dryRun
2560
+ ? userConfig.workflow?.dispatchCeiling?.recommendationVersion
2561
+ : application.workflow.dispatchCeiling?.recommendationVersion) ??
2562
+ null,
2563
+ filledCells: application.filledCells,
2564
+ preservedCells: application.preservedCells,
2565
+ differingCells: application.differingCells,
2566
+ replacedCells: application.replacedCells,
2567
+ droppedCells: application.droppedCells,
2568
+ notices: options.dryRun
2569
+ ? []
2570
+ : await effectiveTerminalReviewerNotices(repoRoot, userConfigDir, dependencies),
2456
2571
  };
2457
2572
  }
2458
2573
  if (source === 'local') {
2459
2574
  const localConfig = await dependencies.readOatLocalConfig(repoRoot);
2460
2575
  await validateRecommendationCells(repoRoot, recommendation, dependencies, context.logger.warn);
2461
- const workflow = applyDispatchMatrixRecommendation(localConfig.workflow, recommendation);
2462
- await dependencies.writeOatLocalConfig(repoRoot, {
2463
- ...localConfig,
2464
- workflow,
2465
- });
2576
+ const application = applyDispatchMatrixRecommendation(localConfig.workflow, recommendation, options.replace);
2577
+ warnBeforeReplacingCells(application, options, context);
2578
+ if (application.writeRequired && !options.dryRun) {
2579
+ await dependencies.writeOatLocalConfig(repoRoot, {
2580
+ ...localConfig,
2581
+ workflow: application.workflow,
2582
+ });
2583
+ }
2466
2584
  return {
2467
2585
  key: 'workflow.dispatchCeiling.providers',
2468
2586
  value: recommendation.version,
2469
2587
  source,
2470
- notices: await effectiveTerminalReviewerNotices(repoRoot, userConfigDir, dependencies),
2588
+ versionWritten: application.versionWritten && !options.dryRun,
2589
+ dryRun: options.dryRun,
2590
+ currentVersion: (options.dryRun
2591
+ ? localConfig.workflow?.dispatchCeiling?.recommendationVersion
2592
+ : application.workflow.dispatchCeiling?.recommendationVersion) ??
2593
+ null,
2594
+ filledCells: application.filledCells,
2595
+ preservedCells: application.preservedCells,
2596
+ differingCells: application.differingCells,
2597
+ replacedCells: application.replacedCells,
2598
+ droppedCells: application.droppedCells,
2599
+ notices: options.dryRun
2600
+ ? []
2601
+ : await effectiveTerminalReviewerNotices(repoRoot, userConfigDir, dependencies),
2471
2602
  };
2472
2603
  }
2473
2604
  const sharedConfig = await dependencies.readOatConfig(repoRoot);
2474
2605
  await validateRecommendationCells(repoRoot, recommendation, dependencies, context.logger.warn);
2475
- const workflow = applyDispatchMatrixRecommendation(sharedConfig.workflow, recommendation);
2476
- await dependencies.writeOatConfig(repoRoot, {
2477
- ...sharedConfig,
2478
- workflow,
2479
- });
2606
+ const application = applyDispatchMatrixRecommendation(sharedConfig.workflow, recommendation, options.replace);
2607
+ warnBeforeReplacingCells(application, options, context);
2608
+ if (application.writeRequired && !options.dryRun) {
2609
+ await dependencies.writeOatConfig(repoRoot, {
2610
+ ...sharedConfig,
2611
+ workflow: application.workflow,
2612
+ });
2613
+ }
2480
2614
  return {
2481
2615
  key: 'workflow.dispatchCeiling.providers',
2482
2616
  value: recommendation.version,
2483
2617
  source,
2484
- notices: await effectiveTerminalReviewerNotices(repoRoot, userConfigDir, dependencies),
2618
+ versionWritten: application.versionWritten && !options.dryRun,
2619
+ dryRun: options.dryRun,
2620
+ currentVersion: (options.dryRun
2621
+ ? sharedConfig.workflow?.dispatchCeiling?.recommendationVersion
2622
+ : application.workflow.dispatchCeiling?.recommendationVersion) ?? null,
2623
+ filledCells: application.filledCells,
2624
+ preservedCells: application.preservedCells,
2625
+ differingCells: application.differingCells,
2626
+ replacedCells: application.replacedCells,
2627
+ droppedCells: application.droppedCells,
2628
+ notices: options.dryRun
2629
+ ? []
2630
+ : await effectiveTerminalReviewerNotices(repoRoot, userConfigDir, dependencies),
2485
2631
  };
2486
2632
  }
2487
2633
  function formatList(values) {
@@ -2686,10 +2832,40 @@ async function runAdopt(templateArg, options, context, dependencies) {
2686
2832
  context.logger.json({
2687
2833
  status: 'ok',
2688
2834
  ...result,
2835
+ ...jsonWarnings(result.replacedCells.length > 0 && !result.dryRun
2836
+ ? [
2837
+ `Replaced ${result.replacedCells.length} populated dispatch matrix cells from the bundled recommendation.${result.droppedCells.length > 0 ? ` Removed whole-provider tier cells: ${result.droppedCells.join(', ')}.` : ''} Use --keep-existing to preserve them.`,
2838
+ ]
2839
+ : []),
2689
2840
  });
2690
2841
  }
2691
2842
  else {
2692
- context.logger.info(`Adopted dispatch matrix recommendation ${result.value} to ${result.source} config.`);
2843
+ if (result.dryRun) {
2844
+ context.logger.info(`Dry run for ${result.source} config using recommendation ${result.value}: would fill ${result.filledCells.length} cells and replace ${result.replacedCells.length} cells; no config changed.`);
2845
+ }
2846
+ else if (result.versionWritten ||
2847
+ result.filledCells.length > 0 ||
2848
+ result.replacedCells.length > 0) {
2849
+ context.logger.info(`Applied dispatch matrix recommendation ${result.value} to ${result.source} config: filled ${result.filledCells.length} cells and replaced ${result.replacedCells.length} cells.`);
2850
+ }
2851
+ else {
2852
+ context.logger.info(`No missing dispatch matrix cells in ${result.source} config; recommendation version remains ${result.currentVersion ?? 'unset'}.`);
2853
+ }
2854
+ if (result.replacedCells.length > 0) {
2855
+ context.logger.info(`${result.dryRun ? 'Would replace' : 'Replaced'}: ${result.replacedCells.join(', ')}.`);
2856
+ if (result.droppedCells.length > 0) {
2857
+ context.logger.warn(`${result.dryRun ? 'Would remove' : 'Removed'} whole-provider tier cells: ${result.droppedCells.join(', ')}.`);
2858
+ }
2859
+ }
2860
+ else if (result.differingCells.length > 0) {
2861
+ context.logger.warn(`Preserved cells differ from recommendation ${result.value}: ${result.differingCells.join(', ')}. Review and update those cells explicitly if you want the new ladder.`);
2862
+ }
2863
+ if (!result.dryRun &&
2864
+ !result.versionWritten &&
2865
+ result.filledCells.length > 0 &&
2866
+ result.differingCells.length > 0) {
2867
+ context.logger.warn(`Recommendation version remains ${result.currentVersion ?? 'unset'} because preserved cells differ from ${result.value}.`);
2868
+ }
2693
2869
  if (result.notices.length > 0) {
2694
2870
  context.logger.info(formatDispatchNotices(result.notices));
2695
2871
  }
@@ -2843,12 +3019,18 @@ export function createConfigCommand(overrides = {}) {
2843
3019
  .option('--shared', 'Write to the shared repo config (.oat/config.json)')
2844
3020
  .option('--local', 'Write to the repo-local config (.oat/config.local.json)')
2845
3021
  .option('--user', 'Write to the user-level config (~/.oat/config.json)')
2846
- .option('--yes', 'Compatibility flag; adoption always preserves explicit existing cells')
3022
+ .option('--yes', 'Compatibility flag; adoption does not require confirmation')
3023
+ .option('--keep-existing', 'Fill missing cells without replacing populated cells')
3024
+ .option('--dry-run', 'Preview cell changes without writing config')
2847
3025
  .action(async (template, options, command) => {
2848
3026
  const context = dependencies.buildCommandContext(readGlobalOptions(command));
2849
3027
  try {
2850
3028
  const surface = resolveSurfaceFlags(options);
2851
- await runAdopt(template, { surface }, context, dependencies);
3029
+ await runAdopt(template, {
3030
+ surface,
3031
+ replace: !(options.keepExisting ?? false),
3032
+ dryRun: options.dryRun ?? false,
3033
+ }, context, dependencies);
2852
3034
  }
2853
3035
  catch (error) {
2854
3036
  const message = error instanceof Error ? error.message : String(error);
@@ -29,7 +29,7 @@ export interface CursorModelPinMapping {
29
29
  gateEvidence: CursorPinGateEvidence;
30
30
  catalogue: boolean;
31
31
  }
32
- export declare const CURSOR_MODEL_PIN_MAPPINGS: readonly [CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping];
32
+ export declare const CURSOR_MODEL_PIN_MAPPINGS: readonly [CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping, CursorModelPinMapping];
33
33
  export declare const SUPPORTED_CURSOR_ROLE_TARGETS: CursorModelPinMapping[];
34
34
  export declare const SUPPORTED_CURSOR_BASE_ROLES: readonly ['oat-phase-implementer', 'oat-reviewer'];
35
35
  export declare function findCursorModelPinMapping(ladderModelId: string): CursorModelPinMapping | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../../src/providers/cursor/codec/catalog.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAC7B,eAAe,GACf,eAAe,GACf,eAAe,GACf,kBAAkB,CAAC;AAEvB;;;;;;;;;;GAUG;AACH,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,KAAK,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,oBAAoB,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,qBAAqB,CAAC;IACpC,YAAY,EAAE,qBAAqB,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;CACpB;AA+BD,eAAO,MAAM,yBAAyB,8eAsKe,CAAC;AAEtD,eAAO,MAAM,6BAA6B,yBAEzC,CAAC;AAEF,eAAO,MAAM,2BAA2B,YACtC,uBAAuB,EACvB,cAAc,CACN,CAAC;AAEX,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,GACpB,qBAAqB,GAAG,SAAS,CAInC"}
1
+ {"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../../../src/providers/cursor/codec/catalog.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAC7B,eAAe,GACf,eAAe,GACf,eAAe,GACf,kBAAkB,CAAC;AAEvB;;;;;;;;;;GAUG;AACH,MAAM,WAAW,oBAAoB;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,KAAK,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,UAAU,CAAC;IACxB,WAAW,CAAC,EAAE,oBAAoB,CAAC;CACpC;AAED,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,qBAAqB,CAAC;IACpC,YAAY,EAAE,qBAAqB,CAAC;IACpC,SAAS,EAAE,OAAO,CAAC;CACpB;AA+BD,eAAO,MAAM,yBAAyB,6rBA6Se,CAAC;AAEtD,eAAO,MAAM,6BAA6B,yBAEzC,CAAC;AAEF,eAAO,MAAM,2BAA2B,YACtC,uBAAuB,EACvB,cAAc,CACN,CAAC;AAEX,wBAAgB,yBAAyB,CACvC,aAAa,EAAE,MAAM,GACpB,qBAAqB,GAAG,SAAS,CAInC"}
@@ -76,12 +76,93 @@ export const CURSOR_MODEL_PIN_MAPPINGS = [
76
76
  approvedMapping('gpt-5.6-luna-xhigh', 'gpt-5.6-luna[reasoning=xhigh]', 'gpt-reasoning'),
77
77
  approvedMapping('cursor-grok-4.5-high', 'grok-4.5[effort=high,fast=false]', 'grok-effort-fast'),
78
78
  approvedMapping('cursor-grok-4.5-high-fast', 'grok-4.5[effort=high,fast=true]', 'grok-effort-fast', { catalogue: false }),
79
+ approvedMapping('cursor-grok-4.6-low', 'grok-4.6[effort=low,fast=false]', 'grok-effort-fast', {
80
+ probeName: 'zz-pin-probe-grok46-low',
81
+ probeRecord: {
82
+ submittedSelector: 'grok-4.6[effort=low,fast=false]',
83
+ resolvedModel: 'cursor-grok-4.6-low',
84
+ verifiedAt: '2026-09-25',
85
+ evidencePath: 'packages/cli/src/providers/cursor/codec/__fixtures__/README.md',
86
+ },
87
+ }),
88
+ approvedMapping('cursor-grok-4.6-medium', 'grok-4.6[effort=medium,fast=false]', 'grok-effort-fast', {
89
+ probeName: 'zz-pin-probe-grok46-medium',
90
+ probeRecord: {
91
+ submittedSelector: 'grok-4.6[effort=medium,fast=false]',
92
+ resolvedModel: 'cursor-grok-4.6-medium',
93
+ verifiedAt: '2026-09-25',
94
+ evidencePath: 'packages/cli/src/providers/cursor/codec/__fixtures__/README.md',
95
+ },
96
+ }),
97
+ approvedMapping('cursor-grok-4.6-high', 'grok-4.6[effort=high,fast=false]', 'grok-effort-fast', {
98
+ probeName: 'zz-pin-probe-grok46-high',
99
+ probeRecord: {
100
+ submittedSelector: 'grok-4.6[effort=high,fast=false]',
101
+ resolvedModel: 'cursor-grok-4.6-high',
102
+ verifiedAt: '2026-09-25',
103
+ evidencePath: 'packages/cli/src/providers/cursor/codec/__fixtures__/README.md',
104
+ },
105
+ }),
106
+ approvedMapping('cursor-grok-4.6-xhigh', 'grok-4.6[effort=xhigh,fast=false]', 'grok-effort-fast', {
107
+ probeName: 'zz-pin-probe-grok46-xhigh',
108
+ probeRecord: {
109
+ submittedSelector: 'grok-4.6[effort=xhigh,fast=false]',
110
+ resolvedModel: 'cursor-grok-4.6-xhigh',
111
+ verifiedAt: '2026-09-25',
112
+ evidencePath: 'packages/cli/src/providers/cursor/codec/__fixtures__/README.md',
113
+ },
114
+ }),
79
115
  approvedMapping('gpt-5.6-terra-high', 'gpt-5.6-terra[reasoning=high]', 'gpt-reasoning'),
80
116
  approvedMapping('gpt-5.6-sol-medium', 'gpt-5.6-sol[reasoning=medium]', 'gpt-reasoning'),
81
117
  approvedMapping('gpt-5.6-sol-high', 'gpt-5.6-sol[reasoning=high]', 'gpt-reasoning'),
82
118
  approvedMapping('claude-fable-5-thinking-high', 'claude-fable-5[effort=high]', 'claude-effort'),
83
119
  approvedMapping('claude-fable-5-thinking-xhigh', 'claude-fable-5[effort=xhigh]', 'claude-effort'),
84
120
  approvedMapping('claude-fable-5-xhigh', 'claude-fable-5[effort=xhigh]', 'claude-effort', { catalogue: false }),
121
+ approvedMapping('claude-fable-5-1-thinking-low', 'claude-fable-5-1[effort=low]', 'claude-effort', {
122
+ probeName: 'zz-pin-probe-fable51-low',
123
+ probeRecord: {
124
+ submittedSelector: 'claude-fable-5-1[effort=low]',
125
+ resolvedModel: 'claude-fable-5-1-thinking-low',
126
+ verifiedAt: '2026-09-25',
127
+ evidencePath: 'packages/cli/src/providers/cursor/codec/__fixtures__/README.md',
128
+ },
129
+ }),
130
+ approvedMapping('claude-fable-5-1-thinking-medium', 'claude-fable-5-1[effort=medium]', 'claude-effort', {
131
+ probeName: 'zz-pin-probe-fable51-medium',
132
+ probeRecord: {
133
+ submittedSelector: 'claude-fable-5-1[effort=medium]',
134
+ resolvedModel: 'claude-fable-5-1-thinking-medium',
135
+ verifiedAt: '2026-09-25',
136
+ evidencePath: 'packages/cli/src/providers/cursor/codec/__fixtures__/README.md',
137
+ },
138
+ }),
139
+ approvedMapping('claude-fable-5-1-thinking-high', 'claude-fable-5-1[effort=high]', 'claude-effort', {
140
+ probeName: 'zz-pin-probe-fable51-high',
141
+ probeRecord: {
142
+ submittedSelector: 'claude-fable-5-1[effort=high]',
143
+ resolvedModel: 'claude-fable-5-1-thinking-high',
144
+ verifiedAt: '2026-09-25',
145
+ evidencePath: 'packages/cli/src/providers/cursor/codec/__fixtures__/README.md',
146
+ },
147
+ }),
148
+ approvedMapping('claude-fable-5-1-thinking-xhigh', 'claude-fable-5-1[effort=xhigh]', 'claude-effort', {
149
+ probeName: 'zz-pin-probe-fable51-xhigh',
150
+ probeRecord: {
151
+ submittedSelector: 'claude-fable-5-1[effort=xhigh]',
152
+ resolvedModel: 'claude-fable-5-1-thinking-xhigh',
153
+ verifiedAt: '2026-09-25',
154
+ evidencePath: 'packages/cli/src/providers/cursor/codec/__fixtures__/README.md',
155
+ },
156
+ }),
157
+ approvedMapping('claude-fable-5-1-thinking-max', 'claude-fable-5-1[effort=max]', 'claude-effort', {
158
+ probeName: 'zz-pin-probe-fable51-max',
159
+ probeRecord: {
160
+ submittedSelector: 'claude-fable-5-1[effort=max]',
161
+ resolvedModel: 'claude-fable-5-1-thinking-max',
162
+ verifiedAt: '2026-09-25',
163
+ evidencePath: 'packages/cli/src/providers/cursor/codec/__fixtures__/README.md',
164
+ },
165
+ }),
85
166
  approvedMapping('gpt-5.6-sol-xhigh', 'gpt-5.6-sol[reasoning=xhigh]', 'gpt-reasoning'),
86
167
  approvedMapping('gpt-5.6-sol-max', 'gpt-5.6-sol[reasoning=max]', 'gpt-reasoning'),
87
168
  ];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@open-agent-toolkit/cli",
3
- "version": "0.3.5",
3
+ "version": "0.3.7",
4
4
  "private": false,
5
5
  "description": "Open Agent Toolkit CLI",
6
6
  "homepage": "https://github.com/voxmedia/open-agent-toolkit/tree/main/packages/cli",
@@ -34,7 +34,7 @@
34
34
  "ora": "^9.0.0",
35
35
  "yaml": "2.8.2",
36
36
  "zod": "^3.25.76",
37
- "@open-agent-toolkit/control-plane": "0.3.5"
37
+ "@open-agent-toolkit/control-plane": "0.3.7"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/node": "^22.10.0",