@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,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-plan-writing
3
- version: 1.2.6
3
+ version: 1.2.8
4
4
  description: Use when authoring or mutating plan.md in any OAT workflow. Defines canonical format invariants — stable task IDs, required sections, review table rules, and resume guardrails.
5
5
  disable-model-invocation: true
6
6
  user-invocable: false
@@ -23,6 +23,227 @@ This is a sub-phase indicator; the calling skill owns the top-level banner.
23
23
 
24
24
  - When invoked by a calling skill, print the sub-banner immediately before plan authoring begins.
25
25
 
26
+ ## Managed Dispatch Readiness and Review Contract
27
+
28
+ All plan-producing workflows and their artifact reviews use this contract:
29
+ spec-driven planning, quick-start, imported plans, and provider-plan-via-import.
30
+ The contract runs before a plan becomes implementation-ready and immediately
31
+ before each artifact review dispatch.
32
+
33
+ 1. Resolve the active provider through the CLI source of truth. For artifact
34
+ review, always request the reviewer contract:
35
+
36
+ ```bash
37
+ oat project dispatch-ceiling resolve --provider "$ACTIVE_PROVIDER" --role reviewer --preflight --json
38
+ ```
39
+
40
+ ### Complete Dispatch Ladder Adoption Contract
41
+
42
+ Before any plan becomes implementation-ready, inspect the effective
43
+ `workflow.dispatchCeiling.providers` value and compare its ordered candidate
44
+ ladders with the bundled
45
+ `packages/cli/config/dispatch-matrix-recommendation.json` source (or the
46
+ installed bundle's `config/dispatch-matrix-recommendation.json` asset). A
47
+ complete custom ladder is allowed, but every supported provider must have valid
48
+ ordered `candidates` cells through the named project ceiling. A legacy scalar,
49
+ single fallback route, missing tier, empty candidates array, or malformed
50
+ ordering is not a complete ladder.
51
+
52
+ When the effective ladder is missing or incomplete, show the complete bundled
53
+ recommendation before asking to write anything:
54
+
55
+ | Provider | Economy | Balanced | High | Frontier |
56
+ | --------------- | -------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | -------------------------------------- |
57
+ | Codex | Luna/low, Luna/medium, Luna/high | Luna/xhigh, Terra/low, Terra/medium, Terra/high, Terra/xhigh | Sol/low, Sol/medium, Sol/high | Sol/xhigh, Sol/max |
58
+ | Claude | haiku, sonnet | sonnet | opus | fable |
59
+ | Cursor (opaque) | `gpt-5.6-luna-low`, `gpt-5.6-luna-medium`, `gpt-5.6-luna-high` | `gpt-5.6-luna-xhigh`, `gpt-5.6-terra-low`, `gpt-5.6-terra-medium`, `gpt-5.6-terra-high`, `gpt-5.6-terra-xhigh` | `gpt-5.6-sol-low`, `gpt-5.6-sol-medium`, `gpt-5.6-sol-high` | `gpt-5.6-sol-xhigh`, `gpt-5.6-sol-max` |
60
+
61
+ Ask the user to select the owning scope explicitly before any adoption write:
62
+
63
+ 1. **Shared repository** - team-owned `.oat/config.json`; run
64
+ `oat config adopt dispatch-matrix --shared`.
65
+ 2. **Repo-local checkout** - personal `.oat/config.local.json`; run
66
+ `oat config adopt dispatch-matrix --local`.
67
+ 3. **User** - cross-repository `~/.oat/config.json`; run
68
+ `oat config adopt dispatch-matrix --user`.
69
+ 4. **Do not adopt** - leave setup unresolved and block implementation
70
+ readiness.
71
+
72
+ The selected ownership scope owns only the reusable ladder. The active
73
+ project's named ceiling is a separate project-state constraint. A
74
+ project-specific active policy or ceiling must not be written to user
75
+ `~/.oat/config.json`.
76
+
77
+ Adoption preserves explicit cells. Re-run the resolver and re-check the full
78
+ ladder after adoption. If preserved legacy or partial cells still leave the
79
+ ladder incomplete or missing, identify those cells and block; do not overwrite,
80
+ infer, or mark the plan implementation-ready. In non-interactive mode, an
81
+ incomplete or missing ladder blocks readiness without choosing an ownership
82
+ scope.
83
+
84
+ ### Reviewer Ceiling Contract
85
+
86
+ A managed active-provider result is runnable only when the resolver returns
87
+ concrete native dispatch controls or an explicit deferred cross-harness target.
88
+ Otherwise treat the active-provider reviewer contract as unresolved.
89
+ Reviewer resolution uses the final candidate of the configured review ceiling:
90
+ call `--role reviewer` without an ephemeral implementer candidate request.
91
+ Do not select a lower candidate for artifact, phase, project, or final review
92
+ unless a separate reviewed contract explicitly authorizes reviewer lowering and
93
+ defines its bounds. A `## Dispatch Profile` row alone is not such a contract.
94
+
95
+ Bind every concrete managed reviewer target to the actual provider
96
+ invocation before probing generic reviewer availability or selecting an
97
+ execution tier. That target takes precedence over every availability, tier,
98
+ timeout, and inline fallback.
99
+ A concrete managed Codex target takes precedence over tier availability.
100
+
101
+ - Codex: use the exact registered reviewer variant returned by
102
+ `providers.codex.dispatchArgs.variant` when the host can select that role.
103
+ If the exact role is unavailable or the current host cannot select it,
104
+ launch a fresh Codex child with the resolver target's explicit model,
105
+ reasoning effort, and canonical role instructions from
106
+ `.agents/agents/oat-reviewer.md`. If the fresh child cannot preserve the
107
+ target, use only a verified-equivalent inline route or block the review.
108
+ - Claude: require a non-empty `providers.claude.dispatchArgs.model` and put
109
+ that exact value in the actual provider invocation as its `model` argument.
110
+ - Cursor: treat `providers.cursor.dispatchArgs.model` as opaque and put that
111
+ exact, unnormalized string in the actual provider invocation as its `model`
112
+ argument.
113
+
114
+ Build the actual host invocation payload before declaring the target enforced.
115
+ On timeout, retry, or artifact rewrite/re-dispatch, reuse the same exact role or
116
+ complete provider payload, including the exact model argument. If the host
117
+ cannot apply the required role or model argument, fail closed or block unless
118
+ the guarded inline-equivalence rule below applies. Never continue through a
119
+ generic tier fallback.
120
+
121
+ Workflow correctness must not require provider restart or hot reload.
122
+ Runtime materialization may be best effort, but it is not the correctness
123
+ boundary. Never use a managed base role because an exact target is missing or
124
+ unavailable in the current session. Base Codex roles are allowed only for
125
+ explicit inherit/default behavior and the documented managed-uncapped reviewer
126
+ fallback.
127
+
128
+ Inline review of a concrete managed target is permitted only after verifying
129
+ equivalent current-host model and effort controls. Otherwise inline or base
130
+ execution is limited to explicit inherit/default behavior or the documented
131
+ managed-uncapped reviewer fallback.
132
+
133
+ The Auto Artifact-Review Loop below consumes this reviewer dispatch contract.
134
+ Tier selection happens only after the target-preserving route is known and
135
+ changes execution mechanics, not the resolved model/effort contract.
136
+
137
+ ## Shared Phase-Review Setup Contract
138
+
139
+ Every plan-producing workflow invokes this procedure after the complete plan
140
+ has stable phase IDs and before the plan artifact review begins. The calling
141
+ skill owns the prompt and the write to `plan.md`; this section owns the shared
142
+ eligibility, preservation, validation, and non-interactive behavior.
143
+
144
+ ### 1. Preserve explicit plan state
145
+
146
+ Inspect `plan.md` frontmatter before probing configuration. If an explicit
147
+ existing `oat_phase_review_gate` key is present, preserve the complete value
148
+ unchanged. Do not probe targets, prompt, or mutate the setting. This applies to
149
+ enabled, disabled, resumed, and imported explicit values. Report:
150
+
151
+ ```text
152
+ Phase review: preserved existing oat_phase_review_gate setting.
153
+ ```
154
+
155
+ Implementation preflight remains responsible for rejecting a malformed
156
+ explicit value. Planning must not silently repair, replace, or disable it.
157
+
158
+ ### 2. Probe qualifying targets
159
+
160
+ When no explicit setting exists, run the canonical read-only probe:
161
+
162
+ ```bash
163
+ oat gate target list --json
164
+ ```
165
+
166
+ If `oat` is not available directly, use the repository source CLI with the
167
+ same arguments. Do not select or execute a reviewer during this probe. A target
168
+ qualifies only when all three JSON fields are literal booleans with these
169
+ values:
170
+
171
+ ```text
172
+ target.explicitlyConfigured === true
173
+ target.enabled === true
174
+ target.available === true
175
+ ```
176
+
177
+ Built-in-only, disabled, unavailable, missing, or malformed entries do not
178
+ qualify. Never infer qualification from target origin, runtime, invocation
179
+ metadata, command text, or a merely non-empty target list.
180
+
181
+ If the probe fails, emit exactly this concise warning and continue planning
182
+ without adding the setting:
183
+
184
+ ```text
185
+ Warning: phase review target probe failed; phase review remains disabled.
186
+ ```
187
+
188
+ If no qualifying target exists, emit:
189
+
190
+ ```text
191
+ Phase review: disabled (no qualifying target); phase review remains disabled.
192
+ ```
193
+
194
+ Do not invent enablement in either branch.
195
+
196
+ ### 3. Offer the canonical choice
197
+
198
+ When at least one target qualifies and an interactive user-response channel is
199
+ available, offer exactly these outcomes:
200
+
201
+ 1. **All phases** - enable review for every implementation phase.
202
+ 2. **Selected phases** - enable review only for chosen stable phase IDs.
203
+ 3. **Disabled** - leave phase review disabled.
204
+
205
+ For all phases, write the existing plan frontmatter shape:
206
+
207
+ ```yaml
208
+ oat_phase_review_gate:
209
+ enabled: true
210
+ phases: []
211
+ review_type: code
212
+ exit_nonzero_on: important
213
+ ```
214
+
215
+ For selected phases, use the same shape with `phases` populated. Validate the
216
+ selected phase IDs against the actual stable phase IDs in the finished plan.
217
+ Reject unknown IDs and re-prompt instead of persisting them; de-duplicate valid
218
+ IDs and serialize them in plan order, regardless of selection order. Require at
219
+ least one valid phase for this choice.
220
+
221
+ If the user declines or chooses Disabled, do not add
222
+ `oat_phase_review_gate`; emit:
223
+
224
+ ```text
225
+ Phase review: disabled (user declined); phase review remains disabled.
226
+ ```
227
+
228
+ ### 4. Handle non-interactive planning
229
+
230
+ Non-interactive mode includes `OAT_NON_INTERACTIVE=1` and any environment with
231
+ no user-response channel. Never prompt in this mode. Even when the probe finds
232
+ a qualifying target, do not guess all phases or selected phases and do not
233
+ invent enablement. Leave the setting absent and emit:
234
+
235
+ ```text
236
+ Phase review: disabled (non-interactive; no selection recorded); phase review remains disabled.
237
+ ```
238
+
239
+ ### 5. Keep review gates independent from HiLL
240
+
241
+ This setup is independent from HiLL checkpoints. It must not read or change
242
+ `oat_plan_hill_phases`, `oat_auto_review_at_hill_checkpoints`, or
243
+ `oat_hill_completed`. The qualifying target only controls whether the setup
244
+ choice is offered; normal lifecycle gate commands remain provider-neutral.
245
+ They must not add a provider/model `--target` argument.
246
+
26
247
  ## Auto Artifact-Review Loop
27
248
 
28
249
  This is the canonical contract for bounded automated reviews of generated OAT artifacts. Calling skills own the concrete edits, progress indicators, and commits; this section defines the shared loop they must follow.
@@ -45,10 +266,11 @@ Use this loop after an artifact has been written and before the calling skill ha
45
266
  - The bound controls rewrite/re-dispatch cycles after the initial review. A bound of `0` still permits the initial structured review, then surfaces residual findings without retrying.
46
267
 
47
268
  3. **Dispatch `oat-reviewer` in structured mode**
48
- - Tier 1: use the configured `oat-reviewer` subagent when available and authorized.
49
- - Tier 2: if Tier 1 is unavailable or declined, run the same reviewer prompt inline with the same payload and checklist.
269
+ - When the resolver returned a concrete managed Codex target, use its exact registered reviewer or a fresh child pinned to the same model, effort, and canonical instructions. If neither is possible, run inline only with verified equivalent current-host controls; otherwise block.
270
+ - When the resolver returned a concrete managed Claude or Cursor target, require `providers.claude.dispatchArgs.model` or `providers.cursor.dispatchArgs.model` respectively and pass that exact value in the actual provider invocation's `model` argument. Cursor values are opaque and must not be normalized. If the host cannot apply the model argument, fail closed unless inline execution has verified equivalent controls.
271
+ - For explicit inherit/default behavior or the documented managed-uncapped reviewer fallback, Tier 1 uses the configured `oat-reviewer` subagent when available and authorized; Tier 2 may run the same reviewer prompt inline.
50
272
  - Always set `oat_output_mode: structured`; the loop consumes `StructuredFindings` in-memory and the reviewer writes no artifact.
51
- - Do not downgrade the checklist when falling back inline. The fallback changes only execution tier, not review requirements.
273
+ - Do not downgrade the resolved target or checklist when changing execution mechanics.
52
274
 
53
275
  4. **Apply or offer fixes by severity**
54
276
  - If the structured review is clean, proceed to outcome recording.
@@ -57,7 +279,7 @@ Use this loop after an artifact has been written and before the calling skill ha
57
279
  - If a finding cannot be fixed within the artifact boundary, preserve it as residual and surface it before handoff.
58
280
 
59
281
  5. **Rewrite and re-dispatch within the bound**
60
- - After applying fixes, rewrite the artifact and re-dispatch `oat-reviewer` with the same target payload.
282
+ - After applying fixes, rewrite the artifact and re-dispatch `oat-reviewer` with the same complete target payload, including the exact Claude or Cursor `dispatchArgs.model` argument.
61
283
  - Each rewrite/re-dispatch cycle consumes one retry.
62
284
  - Stop when the reviewer returns no findings or when the retry bound is exhausted.
63
285
 
@@ -91,16 +313,22 @@ Runtime routing note:
91
313
 
92
314
  - Keep `oat_ready_for` canonical as `oat-project-implement`.
93
315
  - Declare parallelism via `oat_plan_parallel_groups` in plan.md frontmatter (empty = sequential; nested arrays of phase IDs = parallel groups). `oat-project-implement` reads this field to choose sequential vs worktree-isolated parallel execution.
94
- - Dispatch policies are not stored in `plan.md`. Plan-producing skills resolve
95
- them from `workflow.dispatchPolicy.*`, compatibility
96
- `workflow.dispatchCeiling.*` keys, or project `state.md` frontmatter, then
97
- persist interactive answers back to `state.md` as `oat_dispatch_policy`.
316
+ - Reusable candidate ladders are config-owned and are never copied into
317
+ `plan.md` or project state. Plan-producing skills resolve them from
318
+ `workflow.dispatchCeiling.*`.
319
+ - Project dispatch policy is a named maximum constraint. Persist interactive
320
+ project answers to `state.md` as `oat_dispatch_policy`; never copy
321
+ compiled provider/model targets into that project policy.
98
322
 
99
323
  Additional frontmatter keys (`oat_phase`, `oat_phase_status`, `oat_blockers`, `oat_last_updated`, `oat_generated`, `oat_template`, `oat_import_reference`, `oat_import_source_path`, `oat_import_provider`) are set by calling skills as needed.
100
324
 
101
325
  ### Dispatch Profile Overrides
102
326
 
103
- `## Dispatch Profile` is optional and should be omitted by default. Runtime selection chooses the lowest available tier/model/effort that can confidently complete each phase.
327
+ `## Dispatch Profile` is optional and should be omitted by default. A profile
328
+ may narrow a phase to a named ceiling at or below the project ceiling. The
329
+ named ceiling is a maximum candidate tier, not an exact model-family or effort
330
+ preference; the later coordinator chooses exact task targets from the complete
331
+ configured ladder.
104
332
 
105
333
  Only include the section when the user has explicit constraints or preferences. Routine hand-tuning can be worse than runtime selection because the orchestrator has fresher phase context and host capability information at dispatch time.
106
334
 
@@ -109,16 +337,19 @@ If a user-authored override is needed, use this table shape:
109
337
  ```markdown
110
338
  ## Dispatch Profile
111
339
 
112
- | Phase | Claude model | Codex effort | Rationale |
113
- | ----- | -------------------------------- | ------------------------------ | ----------------------------- |
114
- | pNN | haiku\|sonnet\|opus\|fable\|auto | low\|medium\|high\|xhigh\|auto | why this constraint is needed |
340
+ | Phase | Named ceiling | Rationale |
341
+ | ----- | --------------------------------------- | ----------------------------- |
342
+ | pNN | economy\|balanced\|high\|frontier\|auto | why this constraint is needed |
115
343
  ```
116
344
 
117
345
  Validation rules for explicit rows:
118
346
 
119
347
  - `Phase` must match a real `pNN` phase in the plan.
120
- - `Claude model` must be `haiku`, `sonnet`, `opus`, `fable`, `auto`, or blank.
121
- - `Codex effort` must be `low`, `medium`, `high`, `xhigh`, `auto`, or blank. In Codex, explicit effort values are preferred controls. `oat-project-implement` caps them when a capped managed policy exists, selects them directly under managed `Uncapped`, and maps selected efforts to pinned implementer variants when available. Provider default effort is informational only for explicit inherit/default behavior or base/unpinned fallback paths.
348
+ - `Named ceiling` must be `economy`, `balanced`, `high`, `frontier`,
349
+ `auto`, or blank, and it must not exceed the project named ceiling.
350
+ - Under a `High` ceiling, configured candidates from `Economy`, `Balanced`, and
351
+ `High` remain eligible and available; the row does not pin Sol, a Claude
352
+ family, a Cursor string, or an effort value.
122
353
  - Blank or `auto` means no explicit constraint for that provider.
123
354
  - `Rationale` is recommended and should explain why runtime selection should not decide on its own.
124
355