@open-agent-toolkit/cli 0.1.50 → 0.1.52

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 (42) hide show
  1. package/assets/agents/oat-phase-implementer.md +16 -5
  2. package/assets/docs/cli-utilities/configuration.md +1 -1
  3. package/assets/docs/cli-utilities/workflow-gates.md +1 -1
  4. package/assets/docs/provider-sync/commands.md +29 -1
  5. package/assets/docs/provider-sync/providers.md +13 -4
  6. package/assets/docs/provider-sync/scope-and-surface.md +13 -0
  7. package/assets/docs/reference/cli-reference.md +2 -2
  8. package/assets/docs/workflows/projects/hill-checkpoints.md +1 -1
  9. package/assets/docs/workflows/projects/implementation-execution.md +34 -3
  10. package/assets/docs/workflows/projects/lifecycle.md +9 -0
  11. package/assets/docs/workflows/projects/reviews.md +18 -1
  12. package/assets/public-package-versions.json +4 -4
  13. package/assets/skills/oat-agent-instructions-analyze/references/docs/provider-reference.md +8 -2
  14. package/assets/skills/oat-agent-instructions-apply/references/docs/provider-reference.md +8 -2
  15. package/assets/skills/oat-project-implement/SKILL.md +196 -67
  16. package/assets/skills/oat-project-import-plan/SKILL.md +6 -6
  17. package/assets/skills/oat-project-next/SKILL.md +8 -1
  18. package/assets/skills/oat-project-plan/SKILL.md +6 -6
  19. package/assets/skills/oat-project-plan-writing/SKILL.md +13 -10
  20. package/assets/skills/oat-project-pr-final/SKILL.md +8 -1
  21. package/assets/skills/oat-project-quick-start/SKILL.md +5 -5
  22. package/assets/skills/oat-project-review-provide/SKILL.md +27 -9
  23. package/dist/commands/config/index.d.ts.map +1 -1
  24. package/dist/commands/config/index.js +34 -9
  25. package/dist/commands/doctor/index.d.ts.map +1 -1
  26. package/dist/commands/doctor/index.js +148 -85
  27. package/dist/commands/gate/index.js +1 -1
  28. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  29. package/dist/commands/project/dispatch-ceiling/index.js +80 -0
  30. package/dist/commands/providers/codex/materialize.d.ts.map +1 -1
  31. package/dist/commands/providers/codex/materialize.js +31 -15
  32. package/dist/config/oat-config.d.ts +9 -1
  33. package/dist/config/oat-config.d.ts.map +1 -1
  34. package/dist/config/oat-config.js +55 -4
  35. package/dist/config/resolve.d.ts.map +1 -1
  36. package/dist/config/resolve.js +7 -3
  37. package/dist/providers/codex/codec/config-merge.d.ts +8 -2
  38. package/dist/providers/codex/codec/config-merge.d.ts.map +1 -1
  39. package/dist/providers/codex/codec/config-merge.js +17 -2
  40. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  41. package/dist/providers/codex/codec/sync-extension.js +14 -4
  42. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-implement
3
- version: 2.0.34
3
+ version: 2.0.36
4
4
  description: Use when plan.md is ready for execution. Dispatches phase coordinators that select one exact target-pinned worker per task; supports bounded fix loops and plan-declared worktree-isolated parallel phases.
5
5
  oat_gateable: true
6
6
  argument-hint: '[--retry-limit <N>] [--dry-run]'
@@ -107,16 +107,21 @@ PROJECTS_ROOT="${PROJECTS_ROOT%/}"
107
107
  **Mandatory target-first order:** Complete Dispatch Policy Preflight and resolve
108
108
  the concrete managed Codex target before probing generic agent availability or
109
109
  locking Tier 1/Tier 2. A concrete target takes precedence over tier selection:
110
- use the exact registered role, or an explicitly pinned fresh Codex child when
111
- that role is unavailable. If neither route is possible, inline execution is
112
- allowed only with verified equivalent current-host model and effort controls;
113
- otherwise block before work starts. Explicit inherit/default and documented
114
- managed-uncapped reviewer behavior remain the only base-role exceptions.
115
-
116
- When a concrete managed Codex role is unavailable or the host cannot select
117
- it, launch a fresh Codex child pinned to the resolver-returned model and effort
118
- with canonical role instructions. If that fresh child cannot be launched, fail
119
- closed and block; never substitute the coordinator or base role.
110
+ first send the exact registered role through native dispatch. Only a native
111
+ role-selection rejection permits an explicitly pinned fresh Codex child. If
112
+ neither exact route is possible, inline execution is allowed only with verified
113
+ equivalent current-host model and effort controls; otherwise block before work
114
+ starts. Explicit inherit/default and documented managed-uncapped reviewer
115
+ behavior remain the only base-role exceptions.
116
+
117
+ For a concrete managed Codex role, first send the resolver-returned Codex
118
+ variant through the native spawn API as `agent_type`. Spawn acceptance plus the
119
+ constructed launcher payload is configured invocation evidence; independent
120
+ runtime telemetry or agent self-report is not required. Launch a fresh Codex
121
+ child pinned to the resolver-returned model and effort with canonical role
122
+ instructions only after a native role-selection rejection as defined below. If
123
+ that fresh child cannot be launched, fail closed and block; never substitute
124
+ the coordinator or base role.
120
125
 
121
126
  Use base `oat-phase-implementer` only for the allowed exceptions above:
122
127
  explicit inherit/default behavior. It is never a managed task-worker fallback.
@@ -142,9 +147,9 @@ Detection logic:
142
147
  - Declined → Tier 2.
143
148
 
144
149
  - If the host does not resolve either generic agent, first attempt the exact
145
- registered role or explicitly pinned fresh-child route for any concrete
146
- managed target. Select Tier 2 only when inline execution is allowed by the
147
- target-first rule above.
150
+ registered role natively for any concrete managed target. Use the explicitly
151
+ pinned fresh-child route only after a native role-selection rejection. Select
152
+ Tier 2 only when inline execution is allowed by the target-first rule above.
148
153
 
149
154
  **Approval scope rule:** this Tier selection applies to both phase implementation and checkpoint review. Do not infer a mixed mode from conversational emphasis on review checkpoints. If the user has not explicitly approved Tier 1 for the run, stay Tier 2 throughout. Mixed mode is only valid when the user explicitly requests it.
150
155
 
@@ -181,6 +186,20 @@ If approved: Selected: Tier 1 — Subagents
181
186
  Forbidden: Selected: Tier 2 — Inline because the user did not separately mention subagents.
182
187
  ```
183
188
 
189
+ **Native role-selection rejection:** This means the native host explicitly
190
+ reports that the requested `agent_type` is unsupported, unknown, unregistered,
191
+ or rejected before the child or agent starts. Missing runtime telemetry,
192
+ missing agent self-report, a timeout after spawn acceptance, or any terminal
193
+ result from an accepted child — including `BLOCKED` — is not role
194
+ unavailability and is not a native role-selection rejection. Self-report is
195
+ optional diagnostic data and cannot populate or overwrite launcher-owned
196
+ `target`, `model_axis`, or `effort_axis` fields. An accepted child cannot
197
+ trigger the fresh pinned-child or CLI fallback. If an accepted native reviewer
198
+ later times out, retry the same already-selected native `agent_type` route. The
199
+ fresh pinned-child route is eligible only when the original native attempt
200
+ received explicit pre-start role-selection rejection; a timeout after native
201
+ spawn acceptance never changes routes.
202
+
184
203
  **Legacy state migration:** If `state.md` contains `oat_execution_mode: subagent-driven`, silently ignore it. On the next bookkeeping write, remove that key. Do not redirect to `oat-project-subagent-implement` — that skill is deprecated.
185
204
 
186
205
  ### Dispatch Policy Preflight
@@ -427,14 +446,19 @@ Axis states:
427
446
  Codex rules:
428
447
 
429
448
  **Managed Codex execution invariant:** When the resolver returns a model+effort
430
- target, prefer the exact registered role or variant from
431
- `providers.codex.dispatchArgs.variant`. If the current host cannot select that
432
- exact registered target, launch a fresh Codex child with the resolver target's
433
- explicit model, reasoning effort, and canonical role instructions from
449
+ target, the resolver-returned Codex variant from
450
+ `providers.codex.dispatchArgs.variant` must first be sent through the native
451
+ spawn API as `agent_type`. Spawn acceptance plus the launcher payload is
452
+ configured invocation evidence with launcher-selected/config-declared
453
+ provenance. If and only if the host returns a native role-selection rejection,
454
+ launch a fresh Codex child with the resolver target's explicit model, reasoning
455
+ effort, and canonical role instructions from
434
456
  `.agents/agents/oat-phase-implementer.md` or
435
- `.agents/agents/oat-reviewer.md`. Workflow correctness must not require provider
436
- restart or hot reload. A managed base role is forbidden when a concrete target
437
- was requested; never silently downgrade to it. Base roles remain valid only for
457
+ `.agents/agents/oat-reviewer.md`. Missing runtime telemetry or agent self-report
458
+ is not role unavailability, and an accepted child result such as `BLOCKED`
459
+ cannot trigger fallback. Workflow correctness must not require provider restart
460
+ or hot reload. A managed base role is forbidden when a concrete target was
461
+ requested; never silently downgrade to it. Base roles remain valid only for
438
462
  explicit inherit/default behavior and the documented managed-uncapped reviewer
439
463
  fallback.
440
464
 
@@ -453,7 +477,7 @@ fallback.
453
477
  - Capped managed policy: reviewer targets the configured cap for deterministic quality gate behavior.
454
478
  - Managed `Uncapped`: no reviewer target exists; use base/unpinned reviewer fallback and log `selectionMode=no-review-target`, `selectedValue=null`, and `effort_axis=provider-default`.
455
479
  - Inherit/default: no reviewer target exists; use base/unpinned reviewer fallback and log `selectionMode=inherit-default`, `selectedValue=null`, and `effort_axis=provider-default`.
456
- 8. Codex payload-first assertion applies whenever the resolver returns a materialized model+effort target. If `providers.codex.dispatchArgs.variant` is present, the actual `spawn_agent` payload MUST use it as `agent_type`; when that variant came from a Codex model+effort target, log `model_axis=selected:<model>` and `effort_axis=selected:<effort>` from resolver output. If a concrete managed target has no usable variant, use the explicitly pinned fresh-child route or block. Use the base role and log provider-default only for explicit inherit/default behavior or the documented managed-uncapped reviewer exception. Always derive `model_axis` and `effort_axis` from resolver output, not from legacy role-name parsing.
480
+ 8. Codex payload-first assertion applies whenever the resolver returns a materialized model+effort target. If `providers.codex.dispatchArgs.variant` is present, the actual `spawn_agent` payload MUST first use it as native `agent_type`; when that variant came from a Codex model+effort target, log `model_axis=selected:<model>` and `effort_axis=selected:<effort>` from resolver output and the constructed launcher payload. Spawn acceptance is sufficient configured invocation evidence. Missing telemetry or self-report does not make the variant unusable. If native role selection explicitly rejects the variant, use the explicitly pinned fresh-child route or block. Use the base role and log provider-default only for explicit inherit/default behavior or the documented managed-uncapped reviewer exception. Always derive `model_axis` and `effort_axis` from resolver output, not from legacy role-name parsing or agent self-report.
457
481
  9. Do not use top-level per-call `reasoning_effort` as the standard OAT selected-effort path; dogfooding showed that path can be inconsistent.
458
482
 
459
483
  Claude rules:
@@ -486,6 +510,11 @@ Payload-first invariant:
486
510
 
487
511
  - Build the actual host dispatch argument map before logging.
488
512
  - Do not emit `selected:<value>` unless the host invocation contains the corresponding role/model selection.
513
+ - For every coordinator, task-worker, fix, and review launch, record `target`,
514
+ `model_axis`, and `effort_axis` from resolver output and the actual launcher
515
+ payload after payload construction.
516
+ - Those fields are launcher-owned. Agent self-report cannot populate or
517
+ overwrite them; it may only be retained separately as optional diagnostics.
489
518
  - Derive `Dispatch target` and `Effort axis` / `Model axis` from the payload.
490
519
  - After the payload is built, append the compatibility stamp returned from
491
520
  `formatDispatchStamp(dispatchReport)` to Dispatch Notes for every
@@ -1068,10 +1097,15 @@ coordinator_target: {resolver-selected coordinator target}
1068
1097
 
1069
1098
  Tier 1 uses the already resolved exact coordinator role/model payload and sends
1070
1099
  the Phase Scope. A concrete Codex coordinator uses
1071
- `providers.codex.dispatchArgs.variant`; when the registered role cannot be
1072
- selected, use the fresh child pinned to the resolver's model and effort with
1073
- canonical coordinator instructions. Claude and Cursor coordinator calls pass
1074
- their exact resolver model argument.
1100
+ `providers.codex.dispatchArgs.variant` first as native `agent_type`. After the
1101
+ host accepts the spawn, record the coordinator `target`, `model_axis`, and
1102
+ `effort_axis` from resolver output and that constructed launcher payload; do not
1103
+ wait for or accept a coordinator self-report as proof. Only an actual native
1104
+ role-selection rejection permits the fresh child pinned to the resolver's model
1105
+ and effort with canonical coordinator instructions. An accepted coordinator
1106
+ that later returns `BLOCKED` has produced a coordinator outcome and cannot
1107
+ trigger fallback. Claude and Cursor coordinator calls pass their exact resolver
1108
+ model argument.
1075
1109
 
1076
1110
  Tier 2 may run the coordinator instructions in the current context only when
1077
1111
  that context can still dispatch every exact task worker. Tier 2 never permits
@@ -1104,14 +1138,19 @@ For each task in dependency order, the coordinator must:
1104
1138
  is read-only and must never persist its override.
1105
1139
 
1106
1140
  3. Build the actual provider invocation before logging:
1107
- - Codex uses `providers.codex.dispatchArgs.variant` as `agent_type`, or the
1108
- exact fresh pinned-child model/effort route when native role selection is
1109
- unavailable.
1141
+ - Codex first uses `providers.codex.dispatchArgs.variant` as native
1142
+ `agent_type`. Spawn acceptance establishes the configured invocation; only
1143
+ a native role-selection rejection permits the exact fresh pinned-child
1144
+ model/effort route.
1110
1145
  - Claude passes `providers.claude.dispatchArgs.model` as the actual Task
1111
1146
  `model`.
1112
1147
  - Cursor passes `providers.cursor.dispatchArgs.model` byte-for-byte as the
1113
1148
  actual invocation model. Treat the string as opaque and never normalize or
1114
1149
  infer capability from it.
1150
+ - After construction, record the task-worker `target`, `model_axis`, and
1151
+ `effort_axis` from resolver output and the launcher payload. Missing worker
1152
+ telemetry or self-report is not unavailability, and self-report cannot
1153
+ replace those launcher-owned values.
1115
1154
  4. Send one bounded Task Scope, never the full phase task list:
1116
1155
 
1117
1156
  ```yaml
@@ -1162,8 +1201,8 @@ After the implementer returns DONE (or DONE_WITH_CONCERNS without correctness co
1162
1201
  **Dispatch:**
1163
1202
 
1164
1203
  - Use the same tier that was selected at start.
1165
- - For Codex with a capped managed policy, dispatch the materialized reviewer role returned in `providers.codex.dispatchArgs.variant` for deterministic quality gates.
1166
- - If that exact registered reviewer role is not selectable in the current host session, launch a fresh Codex child with explicit model, reasoning effort, and canonical role instructions from `.agents/agents/oat-reviewer.md`; never substitute the managed base role and never require restart/hot reload.
1204
+ - For Codex with a capped managed policy, first dispatch the materialized reviewer role returned in `providers.codex.dispatchArgs.variant` as native `agent_type` for deterministic quality gates. After spawn acceptance, record the review `target`, `model_axis`, and `effort_axis` from resolver output and the constructed launcher payload; reviewer self-report cannot populate or overwrite them.
1205
+ - Only if the exact registered reviewer role receives a native role-selection rejection may the launcher start a fresh Codex child with explicit model, reasoning effort, and canonical role instructions from `.agents/agents/oat-reviewer.md`; never substitute the managed base role and never require restart/hot reload. Missing reviewer telemetry or self-report is not a rejection, and an accepted reviewer that later returns `BLOCKED` cannot trigger fallback.
1167
1206
  - For Codex with managed `Uncapped` or inherit/default mode, no reviewer target exists; use base `oat-reviewer`, log `effort_axis=provider-default`, and explain that the base role follows the provider default.
1168
1207
  - For Claude Code with a capped managed policy, require `providers.claude.dispatchArgs.model` and pass that exact value as the review `model`; managed `Uncapped` or inherit/default mode omits `model` because no reviewer target exists. Always keep `effort_axis=not-applicable`.
1169
1208
  - For Cursor with a concrete managed reviewer target, require `providers.cursor.dispatchArgs.model` and pass that exact opaque, unnormalized string as the actual review invocation's `model` argument.
@@ -1192,7 +1231,7 @@ After the implementer returns DONE (or DONE_WITH_CONCERNS without correctness co
1192
1231
  - For Codex Tier 1 dispatches, send the Review Scope block as a self-contained packet and keep fresh context (`fork_context: false`). The reviewer is expected to reconstruct context from git state and the OAT artifacts listed above.
1193
1232
  - For Codex Tier 1 review dispatches, use the materialized Codex role name from `providers.codex.dispatchArgs.variant` only when the resolver returns a reviewer variant for a capped managed policy. A Codex materialized reviewer role selected from a model+effort target must carry `model_axis=selected:<model>` and `effort_axis=selected:<effort>` from resolver output. Use base `oat-reviewer` only when the resolver returns no `dispatchArgs.variant` for managed `Uncapped`, inherit/default mode, or provider-default fallback, and log `effort_axis=provider-default`. For Claude Code, pass `model: providers.claude.dispatchArgs.model` for a concrete managed reviewer and never pass a per-review effort override. For Cursor, pass `model: providers.cursor.dispatchArgs.model` byte-for-byte for a concrete managed reviewer.
1194
1233
  - Treat the commit range as authoritative for review scope. `files_changed` is optional orientation metadata only.
1195
- - If a reviewer does not return a terminal result on the first wait, poll once more. If it still has not concluded, send one concise nudge to return immediately with current findings. If the reviewer still does not conclude, treat the target-preserving review dispatch as failed for this phase. Retry the same exact role, pinned fresh-child route, or complete Claude/Cursor invocation payload within the retry bound, preserving the exact model argument; never downgrade a timed-out managed reviewer to unpinned inline execution.
1234
+ - If a reviewer does not return a terminal result on the first wait, poll once more. If it still has not concluded, send one concise nudge to return immediately with current findings. If the reviewer still does not conclude, treat the target-preserving review dispatch as failed for this phase. When the original native reviewer spawn was accepted, retry the same already-selected native `agent_type` route within the retry bound; do not switch that timed-out reviewer to a fresh pinned child. The fresh pinned-child route is eligible only when the original native attempt received explicit pre-start role-selection rejection. Retry an already-selected pinned fresh-child route or complete Claude/Cursor invocation payload without changing routes, preserving the exact model argument; never downgrade a timed-out managed reviewer to unpinned inline execution.
1196
1235
 
1197
1236
  - Tier 2: read `.agents/agents/oat-reviewer.md` and review inline only with verified equivalent current-host model and effort controls, explicit inherit/default behavior, or the documented managed-uncapped reviewer behavior. Otherwise block.
1198
1237
 
@@ -1202,6 +1241,9 @@ Parse the reviewer's confirmation for verdict + finding severities. Map to pass
1202
1241
 
1203
1242
  - **pass:** zero Critical and zero Important findings.
1204
1243
  - **fail:** one or more Critical or Important findings.
1244
+ - **blocked:** An accepted reviewer `BLOCKED` terminal blocks this phase review.
1245
+ It does not invoke fallback and must not be interpreted as a pass due to
1246
+ absent findings. Stop and surface the review target and blocker reason.
1205
1247
 
1206
1248
  Medium / Minor findings do not block the phase but are recorded.
1207
1249
 
@@ -1212,7 +1254,7 @@ On reviewer verdict `fail`, run a bounded fix loop.
1212
1254
  1. Read `oat_orchestration_retry_limit` from `state.md` frontmatter (default: `2`, range 0–5).
1213
1255
  2. For each retry (up to the limit):
1214
1256
  a. Convert Critical/Important findings into bounded fix scopes associated with one planned task/file boundary at a time. Do not hand one worker the full phase finding list.
1215
- b. Reuse the phase coordinator in `fix` mode. It selects an exact candidate under the same project or phase named ceiling with `--ceiling-tier`, then emits one Task Scope per bounded fix. Codex uses `providers.codex.dispatchArgs.variant`; Claude and Cursor pass their exact `providers.<provider>.dispatchArgs.model` value on the actual invocation. Every fix worker writes the formal `Dispatch: scope=<phase-or-task> action=fix role=fix producer=<slug|unknown> provenance=<declared|observed|inferred|unknown> model_axis=<axis> effort_axis=<axis> dispatch_policy=<policy|unknown> dispatch_ceiling=<value|none> target=<target|unknown>` stamp before execution.
1257
+ b. Reuse the phase coordinator in `fix` mode. It selects an exact candidate under the same project or phase named ceiling with `--ceiling-tier`, then emits one Task Scope per bounded fix. Codex first uses `providers.codex.dispatchArgs.variant` as native `agent_type`; only a native role-selection rejection permits the exact fresh-child fallback. Claude and Cursor pass their exact `providers.<provider>.dispatchArgs.model` value on the actual invocation. After constructing the launcher payload, record the fix `target`, `model_axis`, and `effort_axis` from that payload and resolver output. Missing fix-worker telemetry or self-report is not unavailability, and an accepted fix worker — including one that returns `BLOCKED` — cannot trigger fallback. Every fix worker writes the formal `Dispatch: scope=<phase-or-task> action=fix role=fix producer=<slug|unknown> provenance=<declared|observed|inferred|unknown> model_axis=<axis> effort_axis=<axis> dispatch_policy=<policy|unknown> dispatch_ceiling=<value|none> target=<target|unknown>` stamp before execution.
1216
1258
  c. Receive and verify each fix result and commit. The coordinator must not apply fixes itself, and Tier 2 does not authorize inline task edits.
1217
1259
  d. Re-dispatch the reviewer with the updated commit range.
1218
1260
  e. Parse the new verdict.
@@ -1409,7 +1451,7 @@ git add {PROJECT_PATH}/implementation.md {PROJECT_PATH}/state.md {PROJECT_PATH}/
1409
1451
  git commit -m "chore(oat): bookkeeping after {pNN} {pass|fail}"
1410
1452
  ```
1411
1453
 
1412
- Then run the optional external phase review gate for the completed phase when `oat_phase_review_gate` selects it. After the gate passes or is skipped, check HiLL checkpoint if the phase ID is in `oat_plan_hill_phases`, pause for user approval before continuing.
1454
+ Then run the optional external phase review gate for the completed phase when `oat_phase_review_gate` selects it. After the gate passes or is skipped, check the HiLL checkpoint. A non-final checkpoint pauses at this boundary; defer a final-phase checkpoint to **Final HiLL Closeout Sequence** after final verification, final review, and any configured pre-approval steps succeed.
1413
1455
 
1414
1456
  ### Step 8: Check Plan Phase Completion
1415
1457
 
@@ -1453,12 +1495,20 @@ Before pausing at a checkpoint, check if auto-review is enabled:
1453
1495
 
1454
1496
  3. If disabled: skip directly to the checkpoint pause.
1455
1497
 
1456
- When pausing:
1498
+ When pausing at a non-final checkpoint:
1457
1499
 
1458
1500
  - Output phase summary (tasks completed, commits made)
1459
1501
  - Ask user: "Phase {N} ({phase_name}) complete. Continue to next phase?"
1460
1502
  - Wait for user approval before proceeding to next plan phase
1461
1503
 
1504
+ **Final checkpoint deferral:** If the current phase is the final implementation
1505
+ phase and it is configured as a HiLL checkpoint, do not ask the generic
1506
+ "Continue to next phase?" question. Final checkpoint auto-review above still
1507
+ runs exactly as written, including `oat-project-review-provide code final` and
1508
+ its no-duplicate-final-review rule. Then continue through Steps 9–14. Final
1509
+ approval occurs only in **Final HiLL Closeout Sequence**, after final review and
1510
+ the stored pre-approval sequence complete.
1511
+
1462
1512
  **Restart safety (required):**
1463
1513
 
1464
1514
  - At the end of each task and at each phase boundary, ensure `implementation.md` is persisted and internally consistent:
@@ -1499,7 +1549,7 @@ Do not use `git add -A` or glob patterns. Only commit the three project artifact
1499
1549
  **Note on HiLL types:**
1500
1550
 
1501
1551
  - **Workflow HiLL** (`oat_hill_checkpoints` in state.md): Gates between workflow phases (discovery → spec → design → plan → implement). Checked by oat-project-progress router.
1502
- - **Plan phase checkpoints** (`oat_plan_hill_phases` in plan.md): Gates at plan phase boundaries during implementation. `[]` means pause after every phase; a populated array pauses only after listed phases. The field may be absent only before the first implementation-run confirmation. Listed phases are where you stop AFTER completing them.
1552
+ - **Plan phase checkpoints** (`oat_plan_hill_phases` in plan.md): Gates at plan phase boundaries during implementation. `[]` means pause after every phase; a populated array pauses only after listed phases. The field may be absent only before the first implementation-run confirmation. Listed phases are where you stop AFTER completing them. A checkpoint on the final implementation phase is deferred to final closeout so final verification, final review, and configured pre-approval work finish before explicit approval.
1503
1553
  - **Phase review gate** (`oat_phase_review_gate` in plan.md): Optional non-pausing external review gate after a completed phase passes the standard reviewer. Missing/disabled means skip; `phases: []` means gate every implementation phase. Passing gates continue automatically; blocking gates are received/fixed before execution proceeds.
1504
1554
 
1505
1555
  **Revision phase completion handling:**
@@ -1655,6 +1705,10 @@ All must pass before proceeding.
1655
1705
 
1656
1706
  **At the final plan phase boundary, a code review is required before PR.**
1657
1707
 
1708
+ An accepted reviewer `BLOCKED` terminal blocks final review. It does not invoke
1709
+ fallback and must not be interpreted as a pass due to absent findings. Stop and
1710
+ surface the review target and blocker reason.
1711
+
1658
1712
  Before requesting final review, ensure the latest project-artifact bookkeeping is already committed. Review should evaluate the implementation state as it actually stands on the branch, not a half-tracked working tree.
1659
1713
 
1660
1714
  Check if final review already completed (preferred source of truth: plan.md Reviews table):
@@ -1669,10 +1723,12 @@ echo "$FINAL_ROW"
1669
1723
  - Example row:
1670
1724
  - `| final | code | passed | 2026-01-28 | reviews/final-review-2026-01-28T140322Z.md |`
1671
1725
  - Check:
1726
+
1672
1727
  ```bash
1673
1728
  echo "$FINAL_ROW" | grep -qE "^\\|\\s*final\\s*\\|.*\\|\\s*passed\\s*\\|" && echo "passed"
1674
1729
  ```
1675
- - Skip to Step 15 (PR prompt)
1730
+
1731
+ - Continue to Step 15 (final closeout)
1676
1732
 
1677
1733
  **If final review is not marked `passed`:**
1678
1734
 
@@ -1681,13 +1737,22 @@ echo "$FINAL_ROW"
1681
1737
  **Workflow preference check (before prompting):**
1682
1738
 
1683
1739
  First resolve the final reviewer target with the same target-first contract as
1684
- per-phase review. A concrete managed Codex target must use its exact registered
1685
- reviewer or an explicitly pinned fresh child. A concrete managed Claude or
1686
- Cursor target must put `providers.claude.dispatchArgs.model` or
1740
+ per-phase review. A concrete managed Codex target must first send its exact
1741
+ registered reviewer as native `agent_type`; only a native role-selection
1742
+ rejection permits an explicitly pinned fresh child. Spawn acceptance plus the
1743
+ launcher payload supplies configured invocation evidence, so missing telemetry,
1744
+ missing self-report, or a later `BLOCKED` result cannot trigger fallback. Record
1745
+ the final review `target`, `model_axis`, and `effort_axis` from resolver output
1746
+ and the constructed launcher payload, never from reviewer self-report. A
1747
+ concrete managed Claude or Cursor target must put
1748
+ `providers.claude.dispatchArgs.model` or
1687
1749
  `providers.cursor.dispatchArgs.model` respectively into the actual provider
1688
1750
  invocation as the exact `model` argument; Cursor strings remain opaque. On
1689
- timeout or retry, preserve the same exact role or complete invocation payload,
1690
- including the model argument. If the host cannot apply the required role or
1751
+ timeout or retry, preserve the already-selected route as well as its complete
1752
+ invocation payload: an accepted native reviewer retries the same native
1753
+ `agent_type`, while a fresh pinned-child route is eligible only when the
1754
+ original native attempt received explicit pre-start role-selection rejection.
1755
+ Preserve the exact model argument. If the host cannot apply the required role or
1691
1756
  model argument, fail closed or block unless verified equivalent current-host
1692
1757
  controls permit inline execution. The preference below chooses only among
1693
1758
  routes that preserve that target; it cannot authorize generic inline or base
@@ -1752,36 +1817,100 @@ To run in a separate session use: oat-project-review-provide code final
1752
1817
 
1753
1818
  **After final review is marked `passed`:**
1754
1819
 
1755
- - Update `"$PROJECT_PATH/state.md"` frontmatter:
1756
- - `oat_phase: implement`
1757
- - `oat_phase_status: complete`
1758
- - `oat_project_state_updated: "{ISO 8601 UTC timestamp}"`
1759
- - Append `"implement"` to `oat_hill_completed` (only if configured as a HiLL gate)
1760
- - Update state content to "Implementation complete".
1761
- - Update `"$PROJECT_PATH/plan.md"`:
1762
- - Set the `final` review row status to `passed` (if not already)
1763
- - Ensure `## Implementation Complete` totals reflect any review fix tasks that were added
1764
- - Update `"$PROJECT_PATH/implementation.md"`:
1765
- - Ensure `oat_current_task_id: null`
1766
- - Ensure the "Review Received" section reflects completed fixes and points to the next action (PR) rather than "execute fix tasks"
1820
+ - Record the passed final review and keep the project in implementation closeout.
1821
+ - Do not append `"implement"` to `oat_hill_completed`, set
1822
+ `oat_phase_status: complete`, or offer the normal next-step prompt yet.
1823
+ - Continue to **Final HiLL Closeout Sequence**.
1767
1824
 
1768
- ### Step 15: Prompt for Next Steps
1825
+ ### Step 15: Final HiLL Closeout Sequence
1769
1826
 
1770
- After final review passes (no Critical/Important findings):
1827
+ The final-closeout orchestrator owns this sequence after the rebased phase
1828
+ coordinator has finished. Do not move lifecycle sequencing into task workers or
1829
+ weaken exact target selection for child dispatches.
1771
1830
 
1772
- **Workflow preference check (before prompting):**
1831
+ Identify the final implementation phase from the plan. A final HiLL checkpoint
1832
+ exists when `oat_plan_hill_phases` is `[]` (every phase) or when it explicitly
1833
+ contains that final phase ID. Defer only a checkpoint on the final implementation
1834
+ phase; non-final checkpoint behavior remains unchanged.
1773
1835
 
1774
- ```bash
1775
- POST_IMPL=$(oat config get workflow.postImplementSequence 2>/dev/null || true)
1776
- ```
1836
+ Run final verification (Step 13). Final review must be `passed` before any
1837
+ pre-approval dispatch. If final checkpoint auto-review is enabled, Step 8 has
1838
+ already run `oat-project-review-provide code final`; do not run a duplicate
1839
+ final review here.
1840
+
1841
+ Read the effective `workflow.postImplementSequence` once. For a configured
1842
+ legacy or structured preference, normalize legacy values before snapshotting:
1843
+ `wait` → `{ preApproval: [], postApproval: [] }`, `summary` →
1844
+ `{ preApproval: ["summary"], postApproval: [] }`, `pr` → `{ preApproval:
1845
+ ["summary", "pr"], postApproval: [] }`, and `docs-pr` → `{ preApproval:
1846
+ ["summary", "document", "pr"], postApproval: [] }`.
1777
1847
 
1778
- - **If `POST_IMPL` is `wait`:** Print `Post-implementation: wait (from workflow.postImplementSequence). Run follow-up skills manually when ready.` Exit without auto-chaining.
1779
- - **If `POST_IMPL` is `summary`:** Print `Post-implementation: summary (from workflow.postImplementSequence).` Invoke `oat-project-summary`. Stop after summary completes.
1780
- - **If `POST_IMPL` is `pr`:** Print `Post-implementation: pr (from workflow.postImplementSequence).` Invoke `oat-project-pr-final` (which auto-generates `summary.md` as part of its flow).
1781
- - **If `POST_IMPL` is `docs-pr`:** Print `Post-implementation: docs-pr (from workflow.postImplementSequence).` Invoke `oat-project-document` then `oat-project-pr-final` (summary included via pr-final).
1782
- - **If unset or invalid:** Fall through to the standard prompt below.
1848
+ Persist this immutable state before dispatching a child:
1849
+
1850
+ ```yaml
1851
+ oat_post_implement_sequence:
1852
+ status: pre_approval # pre_approval | awaiting_approval | post_approval | failed | complete
1853
+ final_phase: pNN
1854
+ pre_approval: [summary, document, pr]
1855
+ pre_approval_completed: []
1856
+ approval: pending # pending | approved | not_required
1857
+ post_approval: []
1858
+ post_approval_completed: []
1859
+ failure: null
1860
+ ```
1783
1861
 
1784
- **Rationale:** `oat-project-pr-final` already auto-generates/refreshes `summary.md` as part of its flow, so `pr` and `docs-pr` do not need a separate summary step. The `summary` value exists as a standalone option for the rare case where you want just the summary without PR.
1862
+ The snapshot is immutable for this closeout: never re-resolve
1863
+ `workflow.postImplementSequence` while it is incomplete. Iterate
1864
+ `pre_approval` and `post_approval` in their stored array order; do not sort or
1865
+ substitute a vocabulary order. Resume from the first incomplete stored step,
1866
+ including a partially completed noncanonical order.
1867
+
1868
+ For every pending `summary`, `document`, or `pr`, dispatch respectively
1869
+ `oat-project-summary`, `oat-project-document`, or `oat-project-pr-final`.
1870
+ Every `summary`, `document`, and `pr` child receives the authoritative snapshot
1871
+ and must merge state updates without replacing `oat_post_implement_sequence`.
1872
+ Re-read and verify the snapshot after every child returns before recording step
1873
+ success. If a child removed or altered it, restore the authoritative snapshot,
1874
+ record that step as failed, and stop with the boundary, failed step, and exact
1875
+ resume command: `oat-project-implement`.
1876
+
1877
+ Commit each completed step before dispatching the next step. On failure, persist
1878
+ `status: failed`, the boundary, the failed step, and concise recovery context.
1879
+ A pre-approval failure leaves `approval: pending`; a post-approval failure
1880
+ retains `approval: approved`. Fail fast with the boundary, failed step, and
1881
+ exact resume command: `oat-project-implement`.
1882
+
1883
+ 1. Dispatch incomplete `pre_approval` steps in stored order.
1884
+ 2. When they succeed and a final checkpoint exists, commit `status:
1885
+ awaiting_approval` with `approval: pending` before asking for final HiLL
1886
+ approval.
1887
+ 3. Record explicit approval as `approval: approved` and `status: post_approval`
1888
+ before any post-approval dispatch. Then dispatch incomplete `post_approval`
1889
+ steps in stored order.
1890
+ 4. A decline or defer keeps `status: awaiting_approval` and `approval: pending`;
1891
+ record neither approval nor failure and run no post-approval step. State the
1892
+ boundary and exact resume command: `oat-project-implement`.
1893
+ 5. If no final checkpoint exists, commit `approval: not_required` before
1894
+ post-approval dispatch. `approval: not_required` is valid only when no final
1895
+ checkpoint exists.
1896
+ 6. After all stored steps finish, commit `status: complete`. Only then complete
1897
+ implementation state, append the configured final HiLL completion, and
1898
+ continue to the existing next-step behavior.
1899
+
1900
+ If the preference is unset, do not create a sequence snapshot. When the
1901
+ preference is unset, retain the existing next-step prompt only after final
1902
+ approval when a final checkpoint is configured.
1903
+
1904
+ ### Step 16: Prompt for Next Steps
1905
+
1906
+ Run the standard next-step prompt only when
1907
+ `workflow.postImplementSequence` was unset and no sequence snapshot was
1908
+ created. It occurs after final approval when a final checkpoint is configured.
1909
+ A configured legacy or structured preference has already completed through
1910
+ **Final HiLL Closeout Sequence**; do not re-dispatch its steps here. When the
1911
+ completed snapshot came from configured `wait`, print
1912
+ `Post-implementation: wait (from workflow.postImplementSequence). Run
1913
+ follow-up skills manually when ready.` and exit without auto-chaining.
1785
1914
 
1786
1915
  **Standard prompt (when preference is unset):**
1787
1916
 
@@ -1814,7 +1943,7 @@ Do not route directly to `oat-project-complete`. The `pr_open` status set by pr-
1814
1943
 
1815
1944
  Tell user: "Run the skills individually when ready: oat-project-summary → oat-project-document → oat-project-pr-final"
1816
1945
 
1817
- ### Step 16: Output Summary
1946
+ ### Step 17: Output Summary
1818
1947
 
1819
1948
  ```
1820
1949
  Implementation complete for {project-name}.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-import-plan
3
- version: 1.4.4
3
+ version: 1.4.5
4
4
  description: Use when you have an external markdown plan to execute with OAT. Preserves the source plan and normalizes it into canonical plan.md format.
5
5
  argument-hint: '<path-to-plan.md> [--provider codex|cursor|claude] [--project <name>]'
6
6
  oat_gateable: true
@@ -16,7 +16,7 @@ Import a markdown plan from an external coding provider and normalize it into OA
16
16
  Provider native plan mode uses this same path: provider-plan-via-import
17
17
  preserves the provider plan first, and provider plan dispatch readiness
18
18
  inherits the same import workflow contract below, including complete ladder
19
- adoption, the project named ceiling, the `Shared Phase-Review Setup Contract`,
19
+ adoption, the project named ceiling, the `Shared Phase Gate Review Setup Contract`,
20
20
  and the rule that readiness and completion follow only after a durable review
21
21
  disposition. It does not add a separate provider-plan prompt.
22
22
 
@@ -277,10 +277,10 @@ maximum. Use the canonical
277
277
  project ceiling resolves. `Uncapped` and `Inherit Host Defaults` remain
278
278
  explicit modes; `Leave Unresolved` is not implementation-ready.
279
279
 
280
- ### Step 4.25: Configure Optional Phase Review
280
+ ### Step 4.25: Configure Optional Phase Gate Review
281
281
 
282
282
  After normalization has produced stable phase IDs and before Step 4.5 starts
283
- the import-aware plan artifact review, invoke the `Shared Phase-Review Setup
283
+ the import-aware plan artifact review, invoke the `Shared Phase Gate Review Setup
284
284
  Contract` from `oat-project-plan-writing`. Provider native plan mode uses this
285
285
  same import step and inherits its result.
286
286
 
@@ -289,10 +289,10 @@ through the shared contract without probing, prompting, or mutation. Resumed or
289
289
  imported explicit values remain authoritative without re-prompting. Otherwise
290
290
  let the contract probe qualifying targets and offer all phases, selected
291
291
  phases, or disabled. If the probe fails, no target qualifies, or the user
292
- declines, leave phase review disabled and continue with the contract's concise
292
+ declines, leave Phase gate review disabled and continue with the contract's concise
293
293
  status output.
294
294
 
295
- This phase-review setup is independent from HiLL checkpoints. Do not read or
295
+ This Phase gate review setup is independent from HiLL checkpoints. Do not read or
296
296
  change HiLL fields here, and do not add a provider/model `--target` to any
297
297
  lifecycle command.
298
298
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-next
3
- version: 1.0.6
3
+ version: 1.0.7
4
4
  description: Use when continuing work on the active OAT project. Reads project state, determines the next lifecycle action, and invokes the appropriate skill automatically.
5
5
  disable-model-invocation: true
6
6
  user-invocable: true
@@ -259,6 +259,13 @@ Entry condition: `oat_phase == "implement"` AND (`oat_phase_status == "complete"
259
259
 
260
260
  Apply the following checks in priority order. Stop at the first match:
261
261
 
262
+ **5.0: Incomplete approval-aware post-implementation sequence**
263
+
264
+ Before every other post-implementation route, inspect `oat_post_implement_sequence`
265
+ in project state. When the snapshot exists and is incomplete, route to
266
+ `oat-project-implement`. This applies even when `oat_phase_status` is `pr_open`
267
+ or a summary exists. A completed snapshot falls through to the normal router.
268
+
262
269
  **5.1: Incomplete revision tasks**
263
270
 
264
271
  Grep plan.md for `p-revN` phases. If any `p-revN` tasks exist with status != completed in implementation.md:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-plan
3
- version: 1.3.12
3
+ version: 1.3.13
4
4
  description: Use when design.md is complete and executable implementation tasks are needed. Breaks design into bite-sized TDD tasks in canonical plan.md format.
5
5
  oat_gateable: true
6
6
  disable-model-invocation: true
@@ -203,7 +203,7 @@ oat_template: false
203
203
 
204
204
  When Overwrite restored an explicit phase-review snapshot, keep that exact
205
205
  entry in this first rewritten frontmatter. Do not let the generic frontmatter
206
- update remove or replace it. The shared phase-review setup in Step 12.25 must
206
+ update remove or replace it. The shared Phase gate review setup in Step 12.25 must
207
207
  observe the restored key and preserve it without probing, prompting, or
208
208
  mutation. When the key was absent from the overwritten plan, do not invent it
209
209
  before the shared setup contract runs.
@@ -417,20 +417,20 @@ Ask: "Does this breakdown make sense? Any tasks missing?"
417
417
 
418
418
  Iterate until user confirms.
419
419
 
420
- ### Step 12.25: Configure Optional Phase Review
420
+ ### Step 12.25: Configure Optional Phase Gate Review
421
421
 
422
422
  After the confirmed plan has stable phase IDs and before Step 12.5 starts the
423
- plan artifact review, invoke the `Shared Phase-Review Setup Contract` from
423
+ plan artifact review, invoke the `Shared Phase Gate Review Setup Contract` from
424
424
  `oat-project-plan-writing`.
425
425
 
426
426
  If `plan.md` already contains an explicit `oat_phase_review_gate`, preserve it
427
427
  through the shared contract without probing, prompting, or mutation. Otherwise
428
428
  let the contract probe qualifying targets and offer all phases, selected
429
429
  phases, or disabled. If the probe fails, no target qualifies, or the user
430
- declines, leave phase review disabled and continue with the contract's concise
430
+ declines, leave Phase gate review disabled and continue with the contract's concise
431
431
  status output.
432
432
 
433
- This phase-review setup is independent from HiLL checkpoints. Do not read or
433
+ This Phase gate review setup is independent from HiLL checkpoints. Do not read or
434
434
  change HiLL fields here, and do not add a provider/model `--target` to any
435
435
  lifecycle command.
436
436
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-plan-writing
3
- version: 1.2.8
3
+ version: 1.2.9
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
@@ -134,7 +134,7 @@ The Auto Artifact-Review Loop below consumes this reviewer dispatch contract.
134
134
  Tier selection happens only after the target-preserving route is known and
135
135
  changes execution mechanics, not the resolved model/effort contract.
136
136
 
137
- ## Shared Phase-Review Setup Contract
137
+ ## Shared Phase Gate Review Setup Contract
138
138
 
139
139
  Every plan-producing workflow invokes this procedure after the complete plan
140
140
  has stable phase IDs and before the plan artifact review begins. The calling
@@ -149,7 +149,7 @@ unchanged. Do not probe targets, prompt, or mutate the setting. This applies to
149
149
  enabled, disabled, resumed, and imported explicit values. Report:
150
150
 
151
151
  ```text
152
- Phase review: preserved existing oat_phase_review_gate setting.
152
+ Phase gate review: preserved existing oat_phase_review_gate setting.
153
153
  ```
154
154
 
155
155
  Implementation preflight remains responsible for rejecting a malformed
@@ -182,13 +182,13 @@ If the probe fails, emit exactly this concise warning and continue planning
182
182
  without adding the setting:
183
183
 
184
184
  ```text
185
- Warning: phase review target probe failed; phase review remains disabled.
185
+ Warning: Phase gate review target probe failed; Phase gate review remains disabled.
186
186
  ```
187
187
 
188
188
  If no qualifying target exists, emit:
189
189
 
190
190
  ```text
191
- Phase review: disabled (no qualifying target); phase review remains disabled.
191
+ Phase gate review: disabled (no qualifying target); Phase gate review remains disabled.
192
192
  ```
193
193
 
194
194
  Do not invent enablement in either branch.
@@ -198,9 +198,12 @@ Do not invent enablement in either branch.
198
198
  When at least one target qualifies and an interactive user-response channel is
199
199
  available, offer exactly these outcomes:
200
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.
201
+ 1. **All phases** - enable the independent Phase gate review after every implementation phase.
202
+ 2. **Selected phases** - enable the independent Phase gate review only after chosen stable phase IDs.
203
+ 3. **Disabled** - leave Phase gate review disabled.
204
+
205
+ Phase gate review is non-pausing when it passes and is distinct from both HiLL
206
+ approval and final artifact review.
204
207
 
205
208
  For all phases, write the existing plan frontmatter shape:
206
209
 
@@ -222,7 +225,7 @@ If the user declines or chooses Disabled, do not add
222
225
  `oat_phase_review_gate`; emit:
223
226
 
224
227
  ```text
225
- Phase review: disabled (user declined); phase review remains disabled.
228
+ Phase gate review: disabled (user declined); Phase gate review remains disabled.
226
229
  ```
227
230
 
228
231
  ### 4. Handle non-interactive planning
@@ -233,7 +236,7 @@ a qualifying target, do not guess all phases or selected phases and do not
233
236
  invent enablement. Leave the setting absent and emit:
234
237
 
235
238
  ```text
236
- Phase review: disabled (non-interactive; no selection recorded); phase review remains disabled.
239
+ Phase gate review: disabled (non-interactive; no selection recorded); Phase gate review remains disabled.
237
240
  ```
238
241
 
239
242
  ### 5. Keep review gates independent from HiLL