@open-agent-toolkit/cli 0.1.6 → 0.1.8

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 (34) hide show
  1. package/assets/agents/oat-phase-implementer.md +14 -3
  2. package/assets/agents/oat-reviewer.md +19 -3
  3. package/assets/docs/cli-utilities/configuration.md +33 -1
  4. package/assets/docs/provider-sync/config.md +1 -0
  5. package/assets/docs/reference/oat-directory-structure.md +2 -0
  6. package/assets/docs/workflows/projects/implementation-execution.md +60 -12
  7. package/assets/docs/workflows/projects/lifecycle.md +4 -0
  8. package/assets/public-package-versions.json +4 -4
  9. package/assets/skills/oat-project-implement/SKILL.md +193 -94
  10. package/assets/skills/oat-project-plan/SKILL.md +57 -1
  11. package/assets/skills/oat-project-plan-writing/SKILL.md +6 -2
  12. package/assets/skills/oat-project-quick-start/SKILL.md +57 -1
  13. package/assets/skills/oat-project-review-provide/SKILL.md +9 -1
  14. package/assets/skills/oat-project-review-receive/SKILL.md +21 -1
  15. package/assets/skills/oat-project-summary/SKILL.md +15 -13
  16. package/assets/templates/implementation.md +5 -5
  17. package/assets/templates/plan.md +1 -1
  18. package/assets/templates/state.md +4 -0
  19. package/assets/templates/summary.md +2 -1
  20. package/dist/commands/config/index.d.ts.map +1 -1
  21. package/dist/commands/config/index.js +36 -0
  22. package/dist/commands/project/dispatch-ceiling/index.d.ts +16 -0
  23. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -0
  24. package/dist/commands/project/dispatch-ceiling/index.js +288 -0
  25. package/dist/commands/project/index.d.ts.map +1 -1
  26. package/dist/commands/project/index.js +2 -0
  27. package/dist/config/oat-config.d.ts +7 -0
  28. package/dist/config/oat-config.d.ts.map +1 -1
  29. package/dist/config/oat-config.js +23 -0
  30. package/dist/config/resolve.d.ts.map +1 -1
  31. package/dist/config/resolve.js +4 -0
  32. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  33. package/dist/providers/codex/codec/sync-extension.js +16 -8
  34. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-phase-implementer
3
- version: 1.0.1
3
+ version: 1.0.2
4
4
  description: Implements a single plan phase end-to-end — reads artifacts once, executes tasks sequentially, commits per task, self-reviews, and returns a structured summary. Dispatched by oat-project-implement.
5
5
  tools: Read, Write, Edit, Bash, Grep, Glob
6
6
  color: cyan
@@ -34,10 +34,15 @@ You will be given a "Phase Scope" block including:
34
34
  - **commit_convention**: Commit message format from plan.md (e.g., `feat({scope}): {description}`)
35
35
  - **workflow_mode**: `spec-driven` | `quick` | `import` (default `spec-driven`)
36
36
  - **model_axis**: Optional model dispatch state selected by the orchestrator (`selected:<value>`, `inherited`, `not-applicable`, or `host-auto`)
37
- - **effort_axis**: Optional effort dispatch state selected by the orchestrator (`selected:<value>`, `inherited`, `not-applicable`, or `host-auto`)
37
+ - **effort_axis**: Optional effort dispatch state selected by the orchestrator (`selected:<value>`, `provider-default`, `inherited`, `not-applicable`, or `host-auto`)
38
+ - **dispatch_ceiling**: Optional resolved provider ceiling that capped/selected this dispatch
39
+ - **ceiling_source**: Optional source for the resolved ceiling (`repo config`, `project state`, or `preflight prompt`)
40
+ - **provider_default_effort**: Optional Codex provider default effort, used only to explain base/unpinned fallback dispatches
38
41
  - **dispatch_rationale**: Optional short rationale for the model/effort axis choices
39
42
 
40
- The `model_axis` and `effort_axis` fields describe the dispatch state the orchestrator already chose; they are descriptive context for your report, not actions for you to take. Echo whatever values were provided in your summary under `Model axis` / `Effort axis`. If neither field is in your scope packet, report both as "not provided."
43
+ The `model_axis`, `effort_axis`, `dispatch_ceiling`, `ceiling_source`, and `provider_default_effort` fields describe dispatch state the orchestrator already chose; they are descriptive context for your report, not actions for you to take. Echo whatever values were provided in your summary. If a field is absent, report it as "not provided."
44
+
45
+ For Codex, `provider-default` means the base/unpinned role follows Codex configured/provider default effort. It does not mean OAT inherited the parent session ceiling.
41
46
 
42
47
  If `mode: fix`, the block also includes:
43
48
 
@@ -126,6 +131,9 @@ Report format:
126
131
  **Confidence:** high | medium | low
127
132
  **Model axis:** {model_axis if provided, otherwise "not provided"}
128
133
  **Effort axis:** {effort_axis if provided, otherwise "not provided"}
134
+ **Dispatch ceiling:** {dispatch_ceiling if provided, otherwise "not provided"}
135
+ **Ceiling source:** {ceiling_source if provided, otherwise "not provided"}
136
+ **Provider default effort:** {provider_default_effort if provided, otherwise "not provided"}
129
137
 
130
138
  ### Task Outcomes
131
139
 
@@ -192,6 +200,9 @@ If a fix introduces a regression or doesn't address its finding, either re-fix w
192
200
  **Confidence:** high | medium | low
193
201
  **Model axis:** {model_axis if provided, otherwise "not provided"}
194
202
  **Effort axis:** {effort_axis if provided, otherwise "not provided"}
203
+ **Dispatch ceiling:** {dispatch_ceiling if provided, otherwise "not provided"}
204
+ **Ceiling source:** {ceiling_source if provided, otherwise "not provided"}
205
+ **Provider default effort:** {provider_default_effort if provided, otherwise "not provided"}
195
206
 
196
207
  ### Fix Outcomes
197
208
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-reviewer
3
- version: 1.0.1
3
+ version: 1.0.2
4
4
  description: Unified reviewer for OAT projects - mode-aware verification of requirements/design alignment and code quality. Writes review artifact to disk.
5
5
  tools: Read, Bash, Grep, Glob, Write
6
6
  color: yellow
@@ -32,6 +32,8 @@ Reviews catch issues before they ship:
32
32
 
33
33
  Your review artifact feeds into `oat-project-review-receive`, which converts findings into plan tasks for systematic gap closure.
34
34
 
35
+ Some findings are artifact drift rather than implementation defects. If shipped implementation is defensible but `spec.md`, `design.md`, or `plan.md` is stale, frame the issue as artifact alignment and say which artifact should change. Do not require a code fix solely because the design artifact lagged behind implementation.
36
+
35
37
  ## Inputs
36
38
 
37
39
  You will be given a "Review Scope" block including:
@@ -45,12 +47,19 @@ You will be given a "Review Scope" block including:
45
47
  - **artifact_paths**: Paths to available artifacts (spec/design/plan/implementation/discovery/import reference)
46
48
  - **tasks_in_scope**: Task IDs being reviewed (if task/phase scope)
47
49
  - **model_axis**: Optional model dispatch state selected by the orchestrator (`selected:<value>`, `inherited`, `not-applicable`, or `host-auto`)
48
- - **effort_axis**: Optional effort dispatch state selected by the orchestrator (`selected:<value>`, `inherited`, `not-applicable`, or `host-auto`)
50
+ - **effort_axis**: Optional effort dispatch state selected by the orchestrator (`selected:<value>`, `provider-default`, `inherited`, `not-applicable`, or `host-auto`)
51
+ - **dispatch_ceiling**: Optional resolved provider ceiling that capped/selected this review dispatch
52
+ - **ceiling_source**: Optional source for the resolved ceiling (`repo config`, `project state`, or `preflight prompt`)
53
+ - **provider_default_effort**: Optional Codex provider default effort, used only to explain base/unpinned fallback dispatches
49
54
  - **dispatch_rationale**: Optional short rationale for the model/effort axis choices
50
55
 
51
56
  ## Dispatch Control
52
57
 
53
- Reviews, re-reviews, and review-fix evaluation inherit the parent session's model and effort axes unless the user explicitly requested a review override. In Codex, the orchestrator should omit `model` and `reasoning_effort` overrides when spawning this reviewer; in Claude Code, it should not pass a per-review model override. The review scope should record `model_axis=inherited` and `effort_axis=inherited` on hosts that expose an effort axis (such as Codex), or `effort_axis=not-applicable` on hosts that do not (such as Claude Code). Do not read `plan.md` Dispatch Profile rows to self-select a tier; the orchestrator owns dispatch control.
58
+ The orchestrator owns dispatch control. Do not read `plan.md` Dispatch Profile rows to self-select a tier.
59
+
60
+ For Codex, normal deterministic review dispatch uses pinned reviewer variants (`oat-reviewer-low`, `oat-reviewer-medium`, `oat-reviewer-high`, or `oat-reviewer-xhigh`) selected by the resolved OAT dispatch ceiling. The base `oat-reviewer` role is a provider-default/unpinned fallback; if you are running as the base role, report any provided `provider_default_effort` as context but do not treat it as an OAT ceiling.
61
+
62
+ For Claude Code, review dispatch is model-axis based and the effort axis is `not-applicable`.
54
63
 
55
64
  ## Mode Contract
56
65
 
@@ -161,6 +170,11 @@ For each design decision relevant to scope:
161
170
  - Do endpoints match the design?
162
171
  - Are error responses as specified?
163
172
 
173
+ 4. **Artifact drift classification**
174
+ - If implementation diverges from design/spec/plan, decide whether the implementation is wrong or the artifact is stale.
175
+ - When the implementation is defensible, write the finding as stale-artifact alignment guidance instead of a code defect.
176
+ - Include enough rationale for `oat-project-review-receive` to convert the finding into an artifact-alignment task or explicit deferral.
177
+
164
178
  ### Step 6: Verify Code Quality
165
179
 
166
180
  This step applies to **code reviews** only.
@@ -204,6 +218,7 @@ Group findings by severity:
204
218
  - Missing error handling
205
219
  - Significant maintainability issues
206
220
  - Missing tests for important paths
221
+ - Stale spec/design/plan artifact that conflicts with a defensible implementation and should be aligned before closeout
207
222
 
208
223
  **Minor** (fix if time permits)
209
224
 
@@ -211,6 +226,7 @@ Group findings by severity:
211
226
  - Style issues
212
227
  - Minor refactoring opportunities
213
228
  - Documentation gaps
229
+ - Low-impact artifact wording drift where implementation is defensible and the stale wording is unlikely to mislead near-term work
214
230
 
215
231
  ### Step 8: Write Review Artifact
216
232
 
@@ -158,13 +158,38 @@ oat config get lastPausedProject
158
158
  oat config describe activeIdea
159
159
  ```
160
160
 
161
+ ## Dispatch ceiling resolution
162
+
163
+ `oat config get workflow.dispatchCeiling.<provider>` shows only the effective
164
+ config value. Implementation workflows should use the project-aware resolver
165
+ instead:
166
+
167
+ ```bash
168
+ oat project dispatch-ceiling resolve --provider codex --json
169
+ oat project dispatch-ceiling resolve --provider claude --json
170
+ ```
171
+
172
+ The resolver checks effective config first, then project `state.md`
173
+ `oat_dispatch_ceiling` frontmatter. For Codex it also reports
174
+ `providerDefaultEffort`, which is informational for base/unpinned roles and is
175
+ not treated as the OAT ceiling.
176
+
177
+ For non-interactive preflight checks, use:
178
+
179
+ ```bash
180
+ oat project dispatch-ceiling resolve --provider codex --preflight --non-interactive
181
+ ```
182
+
183
+ If unresolved, the command exits non-zero with the same `BLOCKED:` guidance used
184
+ by `oat-project-implement`.
185
+
161
186
  ## Workflow preferences (`workflow.*`)
162
187
 
163
188
  Workflow preferences let power users answer repetitive confirmation prompts once and have OAT workflow skills respect those answers automatically. They are the highest-value escape hatch from interactive friction when you always make the same choices.
164
189
 
165
190
  ### Preference keys
166
191
 
167
- All eight workflow preference keys live under the `workflow.*` namespace:
192
+ Workflow preference keys live under the `workflow.*` namespace:
168
193
 
169
194
  - `workflow.designMode` — `collaborative`, `selective`, or `draft`. Default design interaction mode. `selective` applies only to full `oat-project-design`; quick-start lightweight design treats it as collaborative because quick-start keeps the smaller collaborative/draft choice.
170
195
  - `workflow.hillCheckpointDefault` — `every` or `final`. Default HiLL checkpoint behavior in `oat-project-implement`: pause after every phase or only after the last phase. When unset, the skill prompts.
@@ -174,6 +199,8 @@ All eight workflow preference keys live under the `workflow.*` namespace:
174
199
  - `workflow.reviewExecutionModel` — `subagent`, `inline`, or `fresh-session`. Default final-review execution model in `oat-project-implement`. `subagent` and `inline` run automatically. `fresh-session` is a soft preference: the skill prints guidance to run the review in another session but still offers escape hatches to `subagent` or `inline` if you change your mind. When unset, the skill prompts.
175
200
  - `workflow.autoReviewAtHillCheckpoints` — boolean. Automatically run the extra lifecycle review when a HiLL checkpoint is reached. This does not control Tier 1 per-phase `oat-reviewer` gates, which run after each phase in Tier 1 regardless of this setting. When unset, the skill prompts.
176
201
  - `workflow.autoNarrowReReviewScope` — boolean. Auto-narrow re-review scope to fix-task commits only in `oat-project-review-provide`. When unset, the skill prompts.
202
+ - `workflow.dispatchCeiling.codex` — `low`, `medium`, `high`, or `xhigh`. Maximum Codex reasoning effort OAT may select through deterministic pinned implementer/reviewer variants. Provider default effort is informational for base/unpinned roles and is not treated as this ceiling.
203
+ - `workflow.dispatchCeiling.claude` — `haiku`, `sonnet`, or `opus`. Maximum Claude model tier OAT may select for provider-native subagent dispatch. Claude has no separate per-dispatch effort axis, so the effort axis remains `not-applicable`.
177
204
 
178
205
  ### Three-layer resolution
179
206
 
@@ -197,14 +224,19 @@ oat config set workflow.reviewExecutionModel subagent --user
197
224
  oat config set workflow.autoReviewAtHillCheckpoints true --user
198
225
  oat config set workflow.autoNarrowReReviewScope true --user
199
226
  oat config set workflow.designMode selective --user
227
+ oat config set workflow.dispatchCeiling.codex high --user
228
+ oat config set workflow.dispatchCeiling.claude sonnet --user
200
229
 
201
230
  # Shared repo: team decision for this repo
202
231
  oat config set workflow.createPrOnComplete false --shared
203
232
  oat config set workflow.designMode collaborative --shared
233
+ oat config set workflow.dispatchCeiling.codex high --shared
234
+ oat config set workflow.dispatchCeiling.claude sonnet --shared
204
235
 
205
236
  # Repo-local: personal override for this repo (default when no flag)
206
237
  oat config set workflow.hillCheckpointDefault every
207
238
  oat config set workflow.designMode draft
239
+ oat config set workflow.dispatchCeiling.codex medium
208
240
  ```
209
241
 
210
242
  Default (no flag) targets `.oat/config.local.json` for workflow keys. Pass at most one of `--user`, `--shared`, or `--local`. Structural keys (`projects.root`, `worktrees.root`, `git.*`, `documentation.*`, `archive.*`, `tools.*`) are still shared-only regardless of flag.
@@ -62,6 +62,7 @@ It is read by:
62
62
  - unset: provider falls back to directory detection.
63
63
  - `defaultStrategy` is used when no provider-specific `strategy` is set.
64
64
  - At runtime, config is normalized so `providers` is always present in memory.
65
+ - Codex project sync also manages generated role variants derived from canonical agents. `oat-phase-implementer-low|medium|high|xhigh` and `oat-reviewer-low|medium|high|xhigh` are managed outputs used by dispatch-ceiling-aware implementation. They should not be adopted as stray roles.
65
66
 
66
67
  ## Recommended management flow
67
68
 
@@ -104,6 +104,8 @@ Current schema keys:
104
104
  | `documentation.requireForProjectCompletion` | `boolean` | `false` | When `true`, OAT project completion gates require documentation to be updated |
105
105
  | `git.defaultBranch` | `string` | `"main"` | Default branch for PR creation. Auto-detected during `oat init` via `gh repo view` or `origin/HEAD`. Used by `oat-project-pr-final` and `oat-project-pr-progress`. |
106
106
  | `workflow.autoReviewAtHillCheckpoints` | `boolean` | unset | When `true`, completing a HiLL checkpoint automatically runs the extra lifecycle review. Does not control Tier 1 per-phase `oat-reviewer` gates. Can be overridden per-project via `oat_auto_review_at_hill_checkpoints` in `plan.md` frontmatter. Legacy `autoReviewAtCheckpoints` remains a fallback. |
107
+ | `workflow.dispatchCeiling.codex` | `string` | unset | Maximum Codex reasoning effort OAT may select through deterministic pinned implementer/reviewer variants (`low`, `medium`, `high`, or `xhigh`). Codex provider default effort is informational for base/unpinned roles and is not treated as this ceiling. |
108
+ | `workflow.dispatchCeiling.claude` | `string` | unset | Maximum Claude model tier OAT may select for provider-native subagent dispatch (`haiku`, `sonnet`, or `opus`). Claude has no separate per-dispatch effort axis. |
107
109
  | `archive.s3Uri` | `string` | - | Base S3 URI for repo-scoped archived project sync, for example `s3://bucket/oat-archive` |
108
110
  | `archive.s3SyncOnComplete` | `boolean` | `false` | When `true`, `oat-project-complete` uploads the archived project to the configured S3 archive after local archive succeeds |
109
111
  | `archive.summaryExportPath` | `string` | - | Repo-relative directory where completion exports `summary.md` as a dated snapshot like `20260401-<project-name>.md` for durable tracked reference |
@@ -12,7 +12,8 @@ This page covers how `oat-project-implement` actually runs a plan: tier selectio
12
12
  - **When to use:** you have a plan ready and want to understand what happens during `oat-project-implement`.
13
13
  - **Unit of dispatch:** one phase at a time (not one task). A phase implementer executes all tasks in the phase, commits per task, and returns a single summary.
14
14
  - **Two tiers, one lock:** capability detection picks Tier 1 (native subagents) or Tier 2 (inline) at start. The tier is locked for the whole run — no mid-run downgrades.
15
- - **Runtime dispatch:** each phase uses the lowest available model/effort/control that can confidently complete the work, unless `plan.md` includes an explicit Dispatch Profile override.
15
+ - **Dispatch ceiling:** implementation resolves an OAT-owned, provider-aware ceiling before work starts. Codex uses effort values (`low`, `medium`, `high`, `xhigh`); Claude uses model tiers (`haiku`, `sonnet`, `opus`).
16
+ - **Runtime dispatch:** each phase uses the lowest available model/effort/control that can confidently complete the work, capped by the resolved dispatch ceiling, unless `plan.md` includes an explicit Dispatch Profile override.
16
17
 
17
18
  ## Execution model
18
19
 
@@ -34,6 +35,41 @@ The selected tier is reported to the user and locked for the remainder of the ru
34
35
  → Selected: Tier 1 — Subagents
35
36
  ```
36
37
 
38
+ ### Dispatch ceiling preflight
39
+
40
+ Before phase work starts, `oat-project-implement` resolves and prints the dispatch ceiling for the current provider.
41
+
42
+ The compiled resolver is the source of truth:
43
+
44
+ ```bash
45
+ oat project dispatch-ceiling resolve --provider codex --preflight --json
46
+ ```
47
+
48
+ Resolution order:
49
+
50
+ 1. `workflow.dispatchCeiling.<provider>` from effective config
51
+ 2. `oat_dispatch_ceiling` in project `state.md` frontmatter
52
+ 3. Interactive implementation preflight prompt
53
+ 4. Non-interactive unresolved state blocks before work starts
54
+
55
+ For Codex, provider default effort is displayed when available but is not treated as the OAT ceiling. Provider default only explains base/unpinned role behavior.
56
+
57
+ ```text
58
+ Codex dispatch ceiling: high
59
+ Source: project state
60
+ Codex provider default effort: medium
61
+ Note: OAT will use pinned subagent variants up to high. Base/unpinned roles resolve through the provider default.
62
+ ```
63
+
64
+ In non-interactive mode, an unresolved ceiling blocks before any implementation work:
65
+
66
+ ```text
67
+ BLOCKED: Codex dispatch ceiling is unresolved in non-interactive mode.
68
+ Set workflow.dispatchCeiling.codex in .oat/config.json or oat_dispatch_ceiling in project state.
69
+ ```
70
+
71
+ Dry-run reports unresolved ceiling and planned behavior without writing project state.
72
+
37
73
  ### Runtime dispatch selection
38
74
 
39
75
  Tier selection decides whether OAT uses native subagents or inline fallback. Runtime dispatch selection is separate: it decides which provider-specific model and effort controls to use for a specific phase when the host exposes those axes.
@@ -46,14 +82,17 @@ The orchestrator considers, in order:
46
82
  2. The phase's files, risk, requirements, and recent review/fix-loop evidence.
47
83
  3. The host's actual control surface by axis.
48
84
 
49
- Model and effort are separate axes. Each axis logs one of four states:
85
+ Model and effort are separate axes. Each axis logs one of these states:
50
86
 
51
87
  - `selected:<value>` — the host exposes the axis and the orchestrator chose a value.
88
+ - `provider-default` — Codex base/unpinned role follows configured/provider default effort.
52
89
  - `inherited` — the host exposes the axis and the orchestrator deliberately defers to the parent session.
53
90
  - `not-applicable` — this host/API has no meaningful per-dispatch concept for that axis.
54
91
  - `host-auto` — exceptional; the host uses that axis internally but the orchestrator cannot read or pin it.
55
92
 
56
- In Codex, the normal model choice is inherited unless the user requested a model override or the phase clearly requires one. Implementation and fix dispatch default to selected effort: classify the phase, choose the lowest sufficient `low`, `medium`, or `high`, and dispatch the matching configured Codex implementer role (`oat-phase-implementer-low`, `oat-phase-implementer-medium`, or `oat-phase-implementer-high`) rather than relying on per-call effort overrides. The base `oat-phase-implementer` role represents inherited effort, which is the parent-session ceiling path, not a neutral default. Use inherited effort only for an explicit user/Dispatch Profile override, when the phase needs the parent-session ceiling and `selected:high` is insufficient, or when selected-effort roles are unavailable. `xhigh` is inherited-only: use it when the parent/orchestrator session is already xhigh, otherwise split/revise the phase or stop for user re-invocation instead of inventing an `xhigh` variant. In Claude Code, subagent model selection is a model axis when available; the separate effort axis is `not-applicable`.
93
+ In Codex, implementation and fix dispatch classify a preferred effort (`low`, `medium`, `high`, or `xhigh`) and select `min(preferred, resolved_ceiling)`. The selected effort maps to the matching pinned role: `oat-phase-implementer-low`, `oat-phase-implementer-medium`, `oat-phase-implementer-high`, or `oat-phase-implementer-xhigh`. Reviewer dispatch uses the reviewer variant matching the resolved ceiling (`oat-reviewer-low|medium|high|xhigh`) for deterministic quality gates. Base/unpinned Codex roles are provider-default fallbacks; they should be logged as `provider-default`, not as inherited parent-session ceiling.
94
+
95
+ In Claude Code, subagent model selection is a model axis when available and is capped by `workflow.dispatchCeiling.claude` or project `oat_dispatch_ceiling`. The separate effort axis is `not-applicable`.
57
96
 
58
97
  Dispatch logs use a consistent structured block so provider behavior is comparable without flattening the model and effort axes:
59
98
 
@@ -67,17 +106,26 @@ Rationale: multi-file integration with mock wiring; sonnet is the lowest suffici
67
106
 
68
107
  OAT Dispatch: Phase p02 implementation
69
108
  Host: Codex
109
+ Preferred effort: high
110
+ Dispatch ceiling: medium
111
+ Selected effort: medium
112
+ Ceiling source: repo config
113
+ Provider default effort: high
70
114
  Model axis: inherited
71
115
  Effort axis: selected:medium
72
116
  Dispatch target: oat-phase-implementer-medium
73
- Rationale: shared TypeScript/config substrate; medium is the lowest sufficient Codex effort.
117
+ Rationale: shared TypeScript/config substrate; high preferred due to integration risk, capped by configured ceiling.
74
118
 
75
119
  OAT Dispatch: Phase p03 review
76
120
  Host: Codex
121
+ Dispatch ceiling: high
122
+ Selected effort: high
123
+ Ceiling source: project state
124
+ Provider default effort: medium
77
125
  Model axis: inherited
78
- Effort axis: inherited
79
- Dispatch target: oat-reviewer
80
- Rationale: reviewer dispatches inherit parent controls by default.
126
+ Effort axis: selected:high
127
+ Dispatch target: oat-reviewer-high
128
+ Rationale: reviewer runs at the configured ceiling for deterministic quality gate behavior.
81
129
 
82
130
  OAT Dispatch: Phase p04 implementation
83
131
  Host: Other
@@ -87,7 +135,7 @@ Dispatch target: host default
87
135
  Rationale: host does not expose readable or pinnable dispatch controls; rationale maps to standard effort.
88
136
  ```
89
137
 
90
- Phase scope packets include implementation `model_axis`, `effort_axis`, and `dispatch_rationale` when the orchestrator has resolved them. Review dispatches inherit the parent session controls unless the user explicitly requests a review override; their review scope should record `model_axis=inherited` and `effort_axis=inherited` on hosts that expose an effort axis (such as Codex), or `effort_axis=not-applicable` on hosts that do not (such as Claude Code).
138
+ Phase and review scope packets include dispatch context when the orchestrator has resolved it: `model_axis`, `effort_axis`, `dispatch_ceiling`, `ceiling_source`, `provider_default_effort`, and `dispatch_rationale`.
91
139
 
92
140
  ### Dispatch Profile overrides
93
141
 
@@ -100,10 +148,10 @@ Add Dispatch Profile rows only when the user has an explicit constraint or prefe
100
148
  For each phase in the plan (whether sequential or inside a parallel group):
101
149
 
102
150
  1. **Select runtime dispatch control** for the phase and log the chosen control plus rationale.
103
- 2. **Dispatch the selected implementer role** with a Phase Scope block (project path, phase id, artifact paths, commit convention, workflow mode, and dispatch context when known). In Codex, `effort_axis=selected:low|medium|high` uses `oat-phase-implementer-low|medium|high`. Inherited effort uses base `oat-phase-implementer` only for an explicit ceiling/override/fallback reason; it should not be used just to avoid choosing a selected effort.
151
+ 2. **Dispatch the selected implementer role** with a Phase Scope block (project path, phase id, artifact paths, commit convention, workflow mode, and dispatch context when known). In Codex, `effort_axis=selected:low|medium|high|xhigh` uses `oat-phase-implementer-low|medium|high|xhigh`. Base `oat-phase-implementer` means provider-default/unpinned fallback.
104
152
  3. **Receive the summary:** `DONE | DONE_WITH_CONCERNS | NEEDS_CONTEXT | BLOCKED`.
105
153
  - `BLOCKED` stops the run and surfaces the blocker to the user.
106
- 4. **Dispatch `oat-reviewer`** with a Review Scope block (phase id, commit range, optional files-changed hint, and inherited review dispatch context). Review dispatches inherit the parent session's model and effort axes unless the user explicitly requested an override. The commit range is authoritative; the file list is only orientation metadata. In Codex, pass this as a self-contained packet with `fork_context: false`, use the base reviewer role without model or effort overrides, and record `model_axis=inherited, effort_axis=inherited` so the reviewer reads git/OAT artifacts directly instead of inheriting the orchestration thread. In Claude Code, do not pass a per-review model override and record `effort_axis=not-applicable` since Claude Code does not expose a per-dispatch effort axis. If the reviewer does not conclude on the first wait, poll once more, then send a concise "return now with current findings" nudge before falling back inline for that phase.
154
+ 4. **Dispatch the selected reviewer role** with a Review Scope block (phase id, commit range, optional files-changed hint, and dispatch context). The commit range is authoritative; the file list is only orientation metadata. In Codex, pass this as a self-contained packet with `fork_context: false` and use the `oat-reviewer-<ceiling>` variant. In Claude Code, cap any selected model by the Claude ceiling and record `effort_axis=not-applicable`. If the reviewer does not conclude on the first wait, poll once more, then send a concise "return now with current findings" nudge before falling back inline for that phase.
107
155
  5. **Parse the verdict:** zero Critical + zero Important findings → `pass`; otherwise `fail`.
108
156
  6. **On fail, run the bounded fix loop** (see below).
109
157
  7. **Update artifacts** (`implementation.md`, `plan.md` review row, `state.md`) and make the mandatory bookkeeping commit.
@@ -126,8 +174,8 @@ Tier is never silently downgraded. If a Tier 1 dispatch has a transient failure,
126
174
 
127
175
  When escalation re-dispatches at a stronger control, the ladder is provider-specific:
128
176
 
129
- - **Codex:** `selected:low selected:medium selected:high`. `high` is the strongest selectable effort variant. Beyond `high`, dispatch uses `effort_axis=inherited` only when the parent session is already `xhigh`; otherwise escalation is exhausted — stop, split the phase, or have the user re-invoke at `xhigh`.
130
- - **Claude Code:** `selected:haiku selected:sonnet selected:opus`. `opus` is directly selectable via the Task `model` parameter — there is no inherited-only restriction.
177
+ - **Codex:** `selected:low -> selected:medium -> selected:high -> selected:xhigh`, capped by the resolved Codex dispatch ceiling.
178
+ - **Claude Code:** `selected:haiku -> selected:sonnet -> selected:opus`, capped by the resolved Claude dispatch ceiling.
131
179
 
132
180
  Escalation re-dispatches still count against the bounded retry budget; escalation changes the dispatch control, it does not grant extra retry attempts.
133
181
 
@@ -136,6 +136,8 @@ flowchart LR
136
136
 
137
137
  During the Design step, `oat-project-design` asks how to work through the document unless a mode was selected by argument, environment, or `workflow.designMode`. The three full-design choices are collaborative, selective collaborative, and draft-and-review.
138
138
 
139
+ Before a plan is marked ready for implementation, planning resolves the current provider's dispatch ceiling from `workflow.dispatchCeiling.<provider>` or project `state.md` frontmatter. If no ceiling is configured and the session is interactive, planning asks once and stores the answer as `oat_dispatch_ceiling`; non-interactive planning leaves it unresolved so implementation preflight can fail before work starts with setup instructions.
140
+
139
141
  ### Quick lane
140
142
 
141
143
  ```mermaid
@@ -150,6 +152,8 @@ flowchart LR
150
152
 
151
153
  Quick lane lightweight design intentionally keeps a smaller collaborative/draft choice. Selective collaborative becomes available only after promotion into the full spec-driven design lane.
152
154
 
155
+ Quick-start follows the same dispatch ceiling rule at the plan boundary: capture it when interactive, persist it to project state, and avoid any mid-implementation ceiling prompt.
156
+
153
157
  ### Import lane
154
158
 
155
159
  ```mermaid
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.1.6",
3
- "docs-config": "0.1.6",
4
- "docs-theme": "0.1.6",
5
- "docs-transforms": "0.1.6"
2
+ "cli": "0.1.8",
3
+ "docs-config": "0.1.8",
4
+ "docs-theme": "0.1.8",
5
+ "docs-transforms": "0.1.8"
6
6
  }