@open-agent-toolkit/cli 0.1.42 → 0.1.43

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 (31) hide show
  1. package/assets/agents/oat-phase-implementer.md +11 -7
  2. package/assets/agents/oat-reviewer.md +6 -4
  3. package/assets/docs/cli-utilities/configuration.md +51 -35
  4. package/assets/docs/reference/oat-directory-structure.md +26 -24
  5. package/assets/docs/workflows/projects/dispatch-ceiling.md +128 -85
  6. package/assets/docs/workflows/projects/implementation-execution.md +68 -45
  7. package/assets/docs/workflows/projects/index.md +2 -2
  8. package/assets/docs/workflows/projects/lifecycle.md +17 -2
  9. package/assets/public-package-versions.json +4 -4
  10. package/assets/skills/oat-project-implement/SKILL.md +181 -91
  11. package/assets/skills/oat-project-plan/SKILL.md +60 -29
  12. package/assets/skills/oat-project-plan-writing/SKILL.md +10 -10
  13. package/assets/skills/oat-project-quick-start/SKILL.md +60 -29
  14. package/assets/templates/plan.md +4 -4
  15. package/assets/templates/state.md +7 -3
  16. package/dist/commands/config/index.d.ts.map +1 -1
  17. package/dist/commands/config/index.js +66 -3
  18. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  19. package/dist/commands/project/dispatch-ceiling/index.js +296 -49
  20. package/dist/config/dispatch-ceiling-preset.d.ts +37 -1
  21. package/dist/config/dispatch-ceiling-preset.d.ts.map +1 -1
  22. package/dist/config/dispatch-ceiling-preset.js +20 -0
  23. package/dist/config/oat-config.d.ts +10 -1
  24. package/dist/config/oat-config.d.ts.map +1 -1
  25. package/dist/config/oat-config.js +20 -1
  26. package/dist/config/resolve.d.ts.map +1 -1
  27. package/dist/config/resolve.js +4 -0
  28. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  29. package/dist/providers/ceiling/registry.js +6 -1
  30. package/dist/providers/codex/codec/sync-extension.js +1 -1
  31. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-plan-writing
3
- version: 1.2.5
3
+ version: 1.2.6
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
@@ -91,10 +91,10 @@ Runtime routing note:
91
91
 
92
92
  - Keep `oat_ready_for` canonical as `oat-project-implement`.
93
93
  - 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 ceilings are not stored in `plan.md`. Plan-producing skills resolve
95
- them from `workflow.dispatchCeiling.<provider>` or project `state.md`
96
- frontmatter, then persist interactive answers back to `state.md` as
97
- `oat_dispatch_ceiling`.
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`.
98
98
 
99
99
  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
100
 
@@ -109,16 +109,16 @@ If a user-authored override is needed, use this table shape:
109
109
  ```markdown
110
110
  ## Dispatch Profile
111
111
 
112
- | Phase | Claude model | Codex effort | Rationale |
113
- | ----- | ------------------------- | ------------------------------ | ----------------------------- |
114
- | pNN | haiku\|sonnet\|opus\|auto | low\|medium\|high\|xhigh\|auto | why this constraint is needed |
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 |
115
115
  ```
116
116
 
117
117
  Validation rules for explicit rows:
118
118
 
119
119
  - `Phase` must match a real `pNN` phase in the plan.
120
- - `Claude model` must be `haiku`, `sonnet`, `opus`, `auto`, or blank.
121
- - `Codex effort` must be `low`, `medium`, `high`, `xhigh`, `auto`, or blank. In Codex, explicit effort values are preferred controls that `oat-project-implement` caps against the resolved OAT dispatch ceiling and maps to pinned implementer variants when selected. Provider default effort is informational for base/unpinned roles and is not an OAT ceiling.
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.
122
122
  - Blank or `auto` means no explicit constraint for that provider.
123
123
  - `Rationale` is recommended and should explain why runtime selection should not decide on its own.
124
124
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-quick-start
3
- version: 2.1.8
3
+ version: 2.1.9
4
4
  description: Use when a task is small enough for quick mode or rapid iteration is preferred. Scaffolds a lightweight OAT project from discovery directly to a runnable plan, with optional brainstorming and lightweight design.
5
5
  argument-hint: '<project-name> ["project description"]'
6
6
  oat_gateable: true
@@ -467,62 +467,93 @@ Required parallelism pass before finalizing the plan:
467
467
  - Quick mode is not "sequential by default." A quick-start plan is sequential only when the dependency and write-set analysis says it should be.
468
468
  - When a task claims scoped verification, prefer the exact runner invocation that truly scopes to the intended file, test, or target instead of package-level shortcuts that may execute the full suite.
469
469
 
470
- ### Step 3.5: Resolve Dispatch Ceiling Before Implementation Readiness
470
+ ### Step 3.5: Resolve Dispatch Policy Before Implementation Readiness
471
471
 
472
472
  Before moving the quick project to ready-for-implementation, resolve the
473
- dispatch ceiling.
473
+ dispatch policy.
474
474
 
475
475
  Resolution order:
476
476
 
477
- 1. Config keys `workflow.dispatchCeiling.providers.<provider>` via the resolver CLI
478
- 2. Project `state.md` frontmatter key `oat_dispatch_ceiling`
479
- 3. Interactive quick-planning prompt (below)
480
- 4. Leave unresolved for implementation preflight when non-interactive
477
+ 1. Config keys `workflow.dispatchPolicy.mode` / `workflow.dispatchPolicy.policy` via the resolver CLI
478
+ 2. Compatibility config keys `workflow.dispatchCeiling.providers.<provider>`
479
+ 3. Project `state.md` frontmatter key `oat_dispatch_policy`
480
+ 4. Legacy project `state.md` frontmatter key `oat_dispatch_ceiling`
481
+ 5. Interactive quick-planning prompt (below)
482
+ 6. Leave unresolved for implementation preflight when non-interactive
481
483
 
482
- If no ceiling resolves and the session is interactive, present the preset
483
- prompt once before finalizing `plan.md`:
484
+ If no policy resolves and the session is interactive, present the dispatch
485
+ policy prompt once before finalizing `plan.md`:
484
486
 
485
487
  ```text
486
- Set the dispatch ceilingthe maximum subagent tier OAT may use.
488
+ Set the dispatch policyhow OAT should choose subagent model/effort controls.
487
489
 
488
- 1. Balanced (recommended) — Codex: high · Claude: sonnet
489
- 2. Maximum — Codex: xhigh · Claude: opus (reviews always run at this tier)
490
- 3. Cost-conscious — Codex: medium · Claude: sonnet
491
- 4. Advanced set per provider
492
- 5. No ceiling
490
+ Managed capped policies:
491
+ 1. Economy — Codex: medium · Claude: sonnet
492
+ 2. Balanced — Codex: high · Claude: sonnet (recommended)
493
+ 3. High Codex: xhigh · Claude: opus
494
+ 4. Frontier — Codex: xhigh · Claude: fable
493
495
 
494
- OAT applies this where the provider exposes a reliable mechanism (Codex: pinned
495
- variants; Claude: Task model parameter). Other providers may treat it as advisory.
496
+ Managed uncapped:
497
+ 5. Uncapped OAT selects the preferred implementer/fix target without a stored maximum cap.
498
+
499
+ Host defaults:
500
+ 6. Inherit Host Defaults — OAT does not select model/effort controls.
501
+
502
+ OAT applies managed policies where the provider exposes a reliable mechanism
503
+ (Codex: pinned variants; Claude: Task model parameter). Other providers may
504
+ treat managed policies as advisory.
496
505
  ```
497
506
 
498
- **Preset selection** persists `preset` + compiled per-provider values. On
499
- selection, print the exact compiled result (e.g., "Ceiling set: balanced
500
- Codex: high · Claude: sonnet") before proceeding.
507
+ **Managed capped policy selection (options 1-4)** persists `mode: managed`,
508
+ `policy`, and the compiled provider targets. On selection, print the exact
509
+ compiled result (e.g., "Dispatch policy set: balanced → Codex: high · Claude:
510
+ sonnet") before proceeding.
501
511
 
502
- **Advanced (option 4)** prompts for each provider's value individually, then
503
- persists `providers` + `source` only no `preset` key.
512
+ **Uncapped (option 5)** persists explicit managed uncapped state. It does not
513
+ write provider caps, and it must not be represented by leaving dispatch policy
514
+ state absent.
504
515
 
505
- **No ceiling (option 5)** leaves `oat_dispatch_ceiling` unset; implementer
506
- subagents run at provider defaults.
516
+ **Inherit Host Defaults (option 6)** persists explicit inherit/default state.
517
+ Use this only when the user wants OAT to leave implementation, fix, and review
518
+ model/effort controls to the executing host/provider.
507
519
 
508
520
  Persist the answer in `"$PROJECT_PATH/state.md"` frontmatter using the
509
521
  normalized shape:
510
522
 
511
523
  ```yaml
512
- oat_dispatch_ceiling:
513
- preset: balanced # omit when Advanced was chosen
524
+ oat_dispatch_policy:
525
+ mode: managed
526
+ policy: balanced
514
527
  providers:
515
528
  codex: high
516
529
  claude: sonnet
517
530
  source: project-state
518
531
  ```
519
532
 
533
+ For `Uncapped`:
534
+
535
+ ```yaml
536
+ oat_dispatch_policy:
537
+ mode: managed
538
+ policy: uncapped
539
+ source: project-state
540
+ ```
541
+
542
+ For `Inherit Host Defaults`:
543
+
544
+ ```yaml
545
+ oat_dispatch_policy:
546
+ mode: inherit
547
+ source: project-state
548
+ ```
549
+
520
550
  Do not prompt when `OAT_NON_INTERACTIVE=1` or when no user-response channel
521
551
  exists. In that case, leave the value unresolved. `oat-project-implement`
522
- must block before work starts if it still cannot resolve a ceiling.
552
+ must block before work starts if it still cannot resolve a policy.
523
553
 
524
- Do not treat provider default effort as the OAT dispatch ceiling. Provider
525
- default is informational for base/unpinned roles only.
554
+ Do not treat provider default effort as the OAT dispatch policy. Provider
555
+ defaults apply only for explicit inherit/default behavior or base/unpinned
556
+ fallback paths.
526
557
 
527
558
  ### Step 3.6: Run Plan Artifact Review Loop
528
559
 
@@ -57,11 +57,11 @@ _Optional override surface. Use only for explicit user-authored constraints or p
57
57
 
58
58
  Blank or `auto` means there is no explicit constraint for that provider. Do not generate rows by default; a missing phase row uses runtime selection.
59
59
 
60
- | Phase | Claude model | Codex effort | Rationale |
61
- | ----- | ------------------------- | ------------------------------ | ----------------------------- |
62
- | pNN | haiku\|sonnet\|opus\|auto | low\|medium\|high\|xhigh\|auto | why this constraint is needed |
60
+ | Phase | Claude model | Codex effort | Rationale |
61
+ | ----- | -------------------------------- | ------------------------------ | ----------------------------- |
62
+ | pNN | haiku\|sonnet\|opus\|fable\|auto | low\|medium\|high\|xhigh\|auto | why this constraint is needed |
63
63
 
64
- Codex effort values are preferred controls. `oat-project-implement` caps them against the resolved OAT dispatch ceiling and maps selected efforts to pinned implementer variants. Codex provider default effort is informational for base/unpinned roles and is not an OAT ceiling.
64
+ Codex effort values are preferred controls. `oat-project-implement` caps them when a capped managed dispatch policy exists, selects them directly under managed `Uncapped`, and maps selected efforts to pinned implementer variants when available. Codex provider default effort is informational only for explicit inherit/default behavior or base/unpinned fallback paths.
65
65
 
66
66
  ---
67
67
 
@@ -14,10 +14,14 @@ oat_parallel_execution: false
14
14
  oat_phase: { OAT_PHASE } # Current phase: discovery | spec | design | plan | implement | decomposition
15
15
  oat_phase_status: in_progress # Status: in_progress | complete | pr_open
16
16
  # oat_orchestration_retry_limit: 2 # optional; override fix-loop retry limit (range 0-5)
17
- # oat_dispatch_ceiling: # optional project override for provider-aware dispatch ceilings
18
- # provider: codex # codex | claude
19
- # value: high # codex: low|medium|high|xhigh; claude: haiku|sonnet|opus
17
+ # oat_dispatch_policy: # optional project dispatch policy; managed keeps OAT selection active, inherit leaves controls to the host
18
+ # mode: managed # managed | inherit
19
+ # policy: balanced # economy | balanced | high | frontier | uncapped; omit when mode: inherit
20
+ # providers: # present for capped managed policies; omitted for uncapped/inherit
21
+ # codex: high # low|medium|high|xhigh
22
+ # claude: sonnet # haiku|sonnet|opus|fable
20
23
  # source: project-state
24
+ # oat_dispatch_ceiling: # legacy compatibility alias for capped managed provider targets
21
25
  oat_workflow_mode: { OAT_WORKFLOW_MODE } # spec-driven | quick | import
22
26
  oat_workflow_origin: native # native | imported
23
27
  oat_docs_updated: null # null | skipped | complete — documentation sync status
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIhF,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAQhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8DpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAkvCD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CA0GT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAIhF,OAAO,EACL,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAUhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgEpC,UAAU,yBAAyB;IACjC,mBAAmB,EAAE,CACnB,OAAO,EAAE,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC,CAAC,CAAC,KAC/C,cAAc,CAAC;IACpB,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,cAAc,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,kBAAkB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,CAAC,CAAC;IAClE,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,cAAc,KACnB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,cAAc,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC/D,eAAe,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9E,mBAAmB,EAAE,CACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAyzCD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CA0GT"}
@@ -43,6 +43,8 @@ const KEY_ORDER = [
43
43
  'workflow.autoArtifactReview.plan',
44
44
  'workflow.autoArtifactReview.analysis',
45
45
  'workflow.designMode',
46
+ 'workflow.dispatchPolicy.mode',
47
+ 'workflow.dispatchPolicy.policy',
46
48
  'workflow.dispatchCeiling.preset',
47
49
  'workflow.dispatchCeiling.providers.codex',
48
50
  'workflow.dispatchCeiling.providers.claude',
@@ -454,7 +456,29 @@ const CONFIG_CATALOG = [
454
456
  defaultValue: 'unset',
455
457
  mutability: 'read/write',
456
458
  owningCommand: 'oat config set workflow.dispatchCeiling.preset <value>',
457
- description: 'Provider-neutral ceiling preset that compiles to concrete per-provider values at write time. balanced → Codex: high, Claude: sonnet; maximum → Codex: xhigh, Claude: opus; cost-conscious → Codex: medium, Claude: sonnet. Preset provenance only; runtime dispatch reads concrete providers values. Resolution: local > shared > user > default.',
459
+ description: 'Legacy compatibility alias for capped managed dispatch policies. Provider-neutral ceiling preset that compiles to concrete per-provider values at write time. balanced → Codex: high, Claude: sonnet; maximum → Codex: xhigh, Claude: opus; cost-conscious → Codex: medium, Claude: sonnet. Preset provenance only; runtime dispatch reads concrete providers values. Resolution: local > shared > user > default.',
460
+ },
461
+ {
462
+ key: 'workflow.dispatchPolicy.mode',
463
+ group: 'Workflow Preferences (3-layer: local > shared > user)',
464
+ file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
465
+ scope: 'workflow',
466
+ type: 'managed | inherit',
467
+ defaultValue: 'unset',
468
+ mutability: 'read/write',
469
+ owningCommand: 'oat config set workflow.dispatchPolicy.mode <value>',
470
+ description: 'Dispatch policy mode. "managed" means OAT selects model/effort from workflow.dispatchPolicy.policy; "inherit" means OAT leaves dispatch controls to the host/provider defaults. Set workflow.dispatchPolicy.policy to choose a managed policy. Resolution: local > shared > user > default.',
471
+ },
472
+ {
473
+ key: 'workflow.dispatchPolicy.policy',
474
+ group: 'Workflow Preferences (3-layer: local > shared > user)',
475
+ file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
476
+ scope: 'workflow',
477
+ type: 'economy | balanced | high | frontier | uncapped',
478
+ defaultValue: 'unset',
479
+ mutability: 'read/write',
480
+ owningCommand: 'oat config set workflow.dispatchPolicy.policy <value>',
481
+ description: 'Managed dispatch policy. economy, balanced, high, and frontier are capped managed policies; uncapped keeps OAT-managed preferred selection without provider caps. Setting this key writes workflow.dispatchPolicy.mode=managed. Resolution: local > shared > user > default.',
458
482
  },
459
483
  {
460
484
  key: 'workflow.dispatchCeiling.providers.codex',
@@ -472,7 +496,7 @@ const CONFIG_CATALOG = [
472
496
  group: 'Workflow Preferences (3-layer: local > shared > user)',
473
497
  file: '.oat/config.local.json | .oat/config.json | ~/.oat/config.json',
474
498
  scope: 'workflow',
475
- type: 'haiku | sonnet | opus',
499
+ type: 'haiku | sonnet | opus | fable',
476
500
  defaultValue: 'unset',
477
501
  mutability: 'read/write',
478
502
  owningCommand: 'oat config set workflow.dispatchCeiling.providers.claude <value>',
@@ -540,6 +564,14 @@ const WORKFLOW_ENUM_VALUES = {
540
564
  'workflow.postImplementSequence': ['wait', 'summary', 'pr', 'docs-pr'],
541
565
  'workflow.reviewExecutionModel': ['subagent', 'inline', 'fresh-session'],
542
566
  'workflow.designMode': ['collaborative', 'selective', 'draft'],
567
+ 'workflow.dispatchPolicy.mode': ['managed', 'inherit'],
568
+ 'workflow.dispatchPolicy.policy': [
569
+ 'economy',
570
+ 'balanced',
571
+ 'high',
572
+ 'frontier',
573
+ 'uncapped',
574
+ ],
543
575
  'workflow.dispatchCeiling.preset': ['balanced', 'maximum', 'cost-conscious'],
544
576
  'workflow.dispatchCeiling.providers.codex': [
545
577
  'low',
@@ -547,7 +579,12 @@ const WORKFLOW_ENUM_VALUES = {
547
579
  'high',
548
580
  'xhigh',
549
581
  ],
550
- 'workflow.dispatchCeiling.providers.claude': ['haiku', 'sonnet', 'opus'],
582
+ 'workflow.dispatchCeiling.providers.claude': [
583
+ 'haiku',
584
+ 'sonnet',
585
+ 'opus',
586
+ 'fable',
587
+ ],
551
588
  };
552
589
  const WORKFLOW_BOOLEAN_KEYS = new Set([
553
590
  'workflow.archiveOnComplete',
@@ -633,6 +670,32 @@ function parseWorkflowValue(key, rawValue) {
633
670
  }
634
671
  function applyWorkflowValue(workflow, key, value) {
635
672
  const subKey = key.slice('workflow.'.length);
673
+ if (subKey === 'dispatchPolicy.mode') {
674
+ const mode = value;
675
+ if (mode === 'inherit') {
676
+ return {
677
+ ...workflow,
678
+ dispatchPolicy: { mode },
679
+ };
680
+ }
681
+ const policy = workflow.dispatchPolicy?.policy;
682
+ if (!policy) {
683
+ throw new Error('Cannot set workflow.dispatchPolicy.mode to managed without an existing workflow.dispatchPolicy.policy. Set workflow.dispatchPolicy.policy <economy|balanced|high|frontier|uncapped> instead.');
684
+ }
685
+ return {
686
+ ...workflow,
687
+ dispatchPolicy: { mode, policy },
688
+ };
689
+ }
690
+ if (subKey === 'dispatchPolicy.policy') {
691
+ return {
692
+ ...workflow,
693
+ dispatchPolicy: {
694
+ mode: 'managed',
695
+ policy: value,
696
+ },
697
+ };
698
+ }
636
699
  if (subKey === 'dispatchCeiling.preset') {
637
700
  // Presets compile to concrete per-provider values at write time so the
638
701
  // resolver (which reads only providers.*) gets a usable ceiling. The preset
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/dispatch-ceiling/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAEL,KAAK,uBAAuB,EAG7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AASzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,UAAU,2BAA2B;IACnC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC7E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AAknBD,wBAAgB,mCAAmC,CACjD,SAAS,GAAE,OAAO,CAAC,2BAA2B,CAAM,GACnD,OAAO,CAqDT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/commands/project/dispatch-ceiling/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,sBAAsB,CAAC;AAO9B,OAAO,EAKL,KAAK,uBAAuB,EAK7B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AASzB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA6BpC,UAAU,2BAA2B;IACnC,mBAAmB,EAAE,CAAC,OAAO,EAAE,aAAa,KAAK,cAAc,CAAC;IAChE,kBAAkB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACrD,sBAAsB,EAAE,CACtB,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,GAAG,EAAE,MAAM,CAAC,UAAU,KACnB,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,oBAAoB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC7E,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/C,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AA2+BD,wBAAgB,mCAAmC,CACjD,SAAS,GAAE,OAAO,CAAC,2BAA2B,CAAM,GACnD,OAAO,CAqDT"}