@open-agent-toolkit/cli 0.1.46 → 0.1.48

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 (82) hide show
  1. package/assets/agents/oat-phase-implementer.md +202 -191
  2. package/assets/agents/oat-reviewer.md +11 -1
  3. package/assets/config/dispatch-matrix-recommendation.json +120 -13
  4. package/assets/docs/cli-utilities/configuration.md +172 -113
  5. package/assets/docs/cli-utilities/workflow-gates.md +161 -27
  6. package/assets/docs/contributing/skills.md +14 -8
  7. package/assets/docs/provider-sync/providers.md +41 -7
  8. package/assets/docs/provider-sync/scope-and-surface.md +2 -2
  9. package/assets/docs/reference/cli-reference.md +3 -1
  10. package/assets/docs/reference/oat-directory-structure.md +27 -26
  11. package/assets/docs/workflows/projects/artifacts.md +31 -1
  12. package/assets/docs/workflows/projects/dispatch-ceiling.md +235 -187
  13. package/assets/docs/workflows/projects/implementation-execution.md +283 -260
  14. package/assets/docs/workflows/projects/lifecycle.md +26 -5
  15. package/assets/docs/workflows/projects/reviews.md +27 -2
  16. package/assets/migration/pjm-restructure.md +1 -1
  17. package/assets/public-package-versions.json +4 -4
  18. package/assets/skills/oat-project-implement/SKILL.md +247 -133
  19. package/assets/skills/oat-project-import-plan/SKILL.md +173 -16
  20. package/assets/skills/oat-project-next/SKILL.md +2 -2
  21. package/assets/skills/oat-project-plan/SKILL.md +122 -92
  22. package/assets/skills/oat-project-plan-writing/SKILL.md +246 -15
  23. package/assets/skills/oat-project-quick-start/SKILL.md +157 -107
  24. package/assets/skills/oat-project-review-provide/SKILL.md +94 -22
  25. package/dist/commands/config/index.d.ts.map +1 -1
  26. package/dist/commands/config/index.js +64 -39
  27. package/dist/commands/doctor/index.d.ts.map +1 -1
  28. package/dist/commands/doctor/index.js +21 -6
  29. package/dist/commands/gate/index.d.ts +7 -1
  30. package/dist/commands/gate/index.d.ts.map +1 -1
  31. package/dist/commands/gate/index.js +544 -67
  32. package/dist/commands/gate/review-verdict.d.ts +16 -0
  33. package/dist/commands/gate/review-verdict.d.ts.map +1 -1
  34. package/dist/commands/gate/review-verdict.js +72 -9
  35. package/dist/commands/project/dispatch-ceiling/index.d.ts.map +1 -1
  36. package/dist/commands/project/dispatch-ceiling/index.js +452 -16
  37. package/dist/commands/providers/codex/materialize.d.ts.map +1 -1
  38. package/dist/commands/providers/codex/materialize.js +6 -1
  39. package/dist/commands/shared/frontmatter.d.ts +4 -0
  40. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  41. package/dist/commands/shared/frontmatter.js +23 -0
  42. package/dist/commands/status/index.d.ts +1 -0
  43. package/dist/commands/status/index.d.ts.map +1 -1
  44. package/dist/commands/status/index.js +10 -4
  45. package/dist/commands/sync/index.d.ts.map +1 -1
  46. package/dist/commands/sync/index.js +10 -3
  47. package/dist/commands/sync/sync.types.d.ts +1 -0
  48. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  49. package/dist/config/oat-config.d.ts +19 -2
  50. package/dist/config/oat-config.d.ts.map +1 -1
  51. package/dist/config/oat-config.js +139 -24
  52. package/dist/config/resolve.d.ts +8 -0
  53. package/dist/config/resolve.d.ts.map +1 -1
  54. package/dist/config/resolve.js +66 -2
  55. package/dist/engine/index.d.ts +1 -1
  56. package/dist/engine/index.d.ts.map +1 -1
  57. package/dist/engine/index.js +1 -1
  58. package/dist/engine/scanner.d.ts +1 -0
  59. package/dist/engine/scanner.d.ts.map +1 -1
  60. package/dist/engine/scanner.js +17 -1
  61. package/dist/fs/paths.d.ts +4 -0
  62. package/dist/fs/paths.d.ts.map +1 -1
  63. package/dist/fs/paths.js +18 -1
  64. package/dist/providers/ceiling/registry.d.ts +1 -0
  65. package/dist/providers/ceiling/registry.d.ts.map +1 -1
  66. package/dist/providers/ceiling/registry.js +12 -5
  67. package/dist/providers/codex/codec/catalog.d.ts +14 -0
  68. package/dist/providers/codex/codec/catalog.d.ts.map +1 -0
  69. package/dist/providers/codex/codec/catalog.js +21 -0
  70. package/dist/providers/codex/codec/materialize.d.ts.map +1 -1
  71. package/dist/providers/codex/codec/materialize.js +6 -5
  72. package/dist/providers/codex/codec/shared.d.ts +19 -0
  73. package/dist/providers/codex/codec/shared.d.ts.map +1 -1
  74. package/dist/providers/codex/codec/shared.js +98 -5
  75. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  76. package/dist/providers/codex/codec/sync-extension.js +142 -32
  77. package/dist/providers/identity/stamp.d.ts.map +1 -1
  78. package/dist/providers/identity/stamp.js +4 -0
  79. package/dist/shared/types.d.ts +1 -0
  80. package/dist/shared/types.d.ts.map +1 -1
  81. package/dist/shared/types.js +4 -0
  82. package/package.json +2 -2
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-quick-start
3
- version: 2.1.11
3
+ version: 2.1.13
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
@@ -434,20 +434,54 @@ git add "$PROJECT_PATH/discovery.md" "$PROJECT_PATH/state.md"
434
434
  git diff --cached --quiet || git commit -m "chore(oat): complete quick-start discovery for {project-name}"
435
435
  ```
436
436
 
437
+ ### Step 2.9: Snapshot Explicit Phase-Review Setting Before Plan Rewrite
438
+
439
+ Before any template-based create, update, replacement, or normalization of
440
+ `"$PROJECT_PATH/plan.md"`, inspect the existing plan frontmatter and snapshot:
441
+
442
+ 1. The key presence of `oat_phase_review_gate` as a separate boolean. Presence
443
+ is not truthiness: an explicit key is authoritative regardless of validity or
444
+ value.
445
+ 2. When the key is present, the complete explicit value as the exact YAML
446
+ frontmatter entry, including its full nested mapping or scalar form. Preserve
447
+ enabled, disabled, selected-phase, `null`, and malformed-for-contract values
448
+ verbatim; do not normalize, validate, or reconstruct the value while taking
449
+ the snapshot.
450
+
451
+ This snapshot protects a resumed explicit value from the template rewrite. Its
452
+ explicit presence must not trigger a target probe or re-prompt, even when the
453
+ preserved value is `null` or malformed for the phase-review contract.
454
+
437
455
  ### Step 3: Generate Plan Directly
438
456
 
439
457
  Create/update `"$PROJECT_PATH/plan.md"` from `.oat/templates/plan.md`.
440
458
 
459
+ Restore the exact snapshot into the resulting `plan.md` frontmatter as part of
460
+ the first resulting plan write, before any later frontmatter rewrite and before
461
+ Step 3.55 invokes the shared setup contract. Carry the snapshot losslessly
462
+ through every subsequent plan update. When the key was explicitly present, its
463
+ complete value must still be present exactly as captured; do not probe,
464
+ re-prompt, validate, or replace it here. When the key was absent, do not invent
465
+ one before the shared setup contract runs.
466
+
441
467
  Required frontmatter updates:
442
468
 
443
- - `oat_status: complete`
444
- - `oat_ready_for: oat-project-implement`
469
+ - `oat_status: in_progress`
470
+ - `oat_ready_for: null`
445
471
  - `oat_phase: plan`
446
- - `oat_phase_status: complete`
472
+ - `oat_phase_status: in_progress`
447
473
  - `oat_plan_source: quick`
448
474
  - `oat_import_reference: null`
449
475
  - `oat_import_source_path: null`
450
476
  - `oat_import_provider: null`
477
+ - `oat_template: true`
478
+
479
+ These values are the interruption-safe pre-review state. Here,
480
+ `oat_template: true` marks the generated plan as still owned by the current
481
+ planning workflow even after its substantive content has been written. If the
482
+ skill pauses, is interrupted, or cannot resolve dispatch before Step 3.7,
483
+ persist and commit this state. `oat-project-next` must route it back to the
484
+ current planning workflow and cannot advance it to implementation.
451
485
 
452
486
  Plan requirements — apply `oat-project-plan-writing` canonical format invariants:
453
487
 
@@ -470,124 +504,96 @@ Required parallelism pass before finalizing the plan:
470
504
  ### Step 3.5: Resolve Dispatch Policy Before Implementation Readiness
471
505
 
472
506
  Before moving the quick project to ready-for-implementation, resolve the
473
- dispatch policy.
507
+ complete dispatch ladder and the project named ceiling.
474
508
 
475
- Resolution order:
509
+ Invoke the `Complete Dispatch Ladder Adoption Contract` from
510
+ `oat-project-plan-writing`. If the effective ladder is missing or incomplete,
511
+ show the full bundled recommendation and ask the user to select its owning
512
+ scope before running exactly one command:
476
513
 
477
- 1. Config keys `workflow.dispatchPolicy.mode` / `workflow.dispatchPolicy.policy` via the resolver CLI
478
- 2. Layered dispatch matrix / compatibility config under `workflow.dispatchCeiling.providers.<provider>` and `workflow.dispatchCeiling.providers.<provider>.<tier>`
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
514
+ ```bash
515
+ oat config adopt dispatch-matrix --shared
516
+ oat config adopt dispatch-matrix --local
517
+ oat config adopt dispatch-matrix --user
518
+ ```
519
+
520
+ The selected scope owns only the reusable ladders. A project-specific active
521
+ policy or ceiling must not be written to user `~/.oat/config.json`.
522
+ Adoption preserves explicit cells, so re-run the resolver and completeness
523
+ check. An incomplete or missing ladder after adoption blocks readiness; do not
524
+ overwrite explicit cells or silently infer a fallback. Non-interactive setup
525
+ also blocks on a missing or incomplete ladder.
526
+
527
+ Then resolve the named ceiling in this order:
483
528
 
484
- If no policy resolves and the session is interactive, present the dispatch
485
- policy prompt once before finalizing `plan.md`:
529
+ 1. Project `state.md` frontmatter `oat_dispatch_policy`
530
+ 2. Legacy project `oat_dispatch_ceiling`
531
+ 3. Config `workflow.dispatchPolicy.*` as a proposed starting value
532
+ 4. Interactive quick-planning prompt
533
+ 5. Unresolved non-interactive state blocks implementation readiness
486
534
 
487
- Generate the choice text from canonical CLI metadata immediately before
488
- presenting it:
535
+ Generate the canonical prompt with:
489
536
 
490
537
  ```bash
491
538
  oat project dispatch-ceiling choices --format markdown
492
539
  ```
493
540
 
494
- Do not hand-type the dispatch policy menu or omit canonical choices. If the CLI
495
- is unavailable in this environment, derive the same labels and descriptions from
496
- `packages/cli/src/config/dispatch-policy-options.ts`; include every managed
497
- policy returned by `VALID_MANAGED_DISPATCH_POLICIES` plus `Uncapped`, `Inherit
498
- Host Defaults`, and `Leave Unresolved`.
499
-
500
- At minimum, preserve these semantics in any fallback text:
501
-
502
- - `Uncapped`: OAT still manages dispatch selection, but stores no maximum cap.
503
- It is not host/default behavior and must not be represented by absent policy
504
- state.
505
- - `Inherit Host Defaults`: OAT does not choose model or effort controls; the
506
- executing host/provider owns implementation, fix, and review defaults.
507
- - `Leave Unresolved`: planning/preflight deferral only. It records no runtime
508
- policy. Implementation preflight must block until a policy resolves.
509
-
510
- OAT applies managed policies where the provider exposes a reliable mechanism
511
- (Codex: pinned variants; Claude: Task model parameter). Other providers may
512
- treat managed policies as advisory until their provider column has a resolvable
513
- matrix cell.
514
-
515
- For multi-family providers such as Cursor, these options choose the abstract
516
- policy rung; concrete model values live in the dispatch matrix under
517
- `workflow.dispatchCeiling.providers.*`. If the user wants OAT's recommended
518
- starting matrix, offer `oat config adopt dispatch-matrix` for the chosen config
519
- layer before finalizing `plan.md`.
520
-
521
- **Managed capped policy selection** persists `mode: managed`,
522
- `policy`, and the compiled provider targets. On selection, print the exact
523
- compiled result (e.g., "Dispatch policy set: balanced → Codex: high · Claude:
524
- sonnet") before proceeding.
525
-
526
- If the resolver reports that the selected policy has a missing matrix cell for
527
- the active provider/tier, run prompt-and-persist once before final review:
528
-
529
- 1. Ask for the exact provider value for the missing cell, using the provider's
530
- native vocabulary (for example, `composer-2.5`, `gpt-5.5-xhigh`, `opus`, or
531
- `xhigh`), or an ordered route when escalation needs multiple targets.
532
- 2. Persist the answer to the selected config layer with
533
- `workflow.dispatchCeiling.providers.<provider>.<tier>`. Use project
534
- `state.md` only for sparse project-specific matrix overrides.
535
- 3. Re-run the resolver. Do not silently treat a missing cell as uncapped,
536
- inherited, or provider-default behavior.
537
-
538
- **Uncapped** persists explicit managed uncapped state. OAT still manages
539
- dispatch selection. It does not write provider caps, and it must not be
540
- represented by leaving dispatch policy state absent.
541
-
542
- **Inherit Host Defaults** persists explicit inherit/default state. Use this only
543
- when the user wants OAT to leave implementation, fix, and review model/effort
544
- controls to the executing host/provider. OAT does not choose model or effort in
545
- this mode.
546
-
547
- **Leave Unresolved** leaves dispatch policy unset for implementation preflight.
548
- Use this only when non-interactive planning cannot choose a policy yet.
549
- Implementation preflight must block until a policy resolves.
550
-
551
- Persist the answer in `"$PROJECT_PATH/state.md"` frontmatter using the
552
- normalized shape:
541
+ Do not hand-type the dispatch policy menu.
542
+ `Uncapped`: OAT still manages dispatch selection. It has no named maximum.
543
+ `Inherit Host Defaults`: OAT does not choose model or effort.
544
+ `Leave Unresolved` is a planning deferral.
545
+ Implementation preflight must block until a runnable ceiling resolves.
553
546
 
554
- ```yaml
555
- oat_dispatch_policy:
556
- mode: managed
557
- policy: balanced
558
- providers:
559
- codex: high
560
- claude: sonnet
561
- source: project-state
562
- ```
563
-
564
- For `Uncapped`:
547
+ The menu includes every named tier plus `Uncapped`, `Inherit Host
548
+ Defaults`, and `Leave Unresolved`. A named tier is a maximum, never an
549
+ enduring exact model-family or effort preference. A named `High` ceiling
550
+ keeps lower configured `Economy`, `Balanced`, and `High` candidates
551
+ available at or below that maximum. An optional phase Dispatch Profile may
552
+ narrow the maximum.
565
553
 
566
554
  ```yaml
567
555
  oat_dispatch_policy:
568
556
  mode: managed
569
- policy: uncapped
557
+ policy: high
570
558
  source: project-state
571
559
  ```
572
560
 
573
- For `Inherit Host Defaults`:
561
+ Persist the active project ceiling only in `"$PROJECT_PATH/state.md"`. Do not
562
+ copy compiled provider targets into this shape or user config. `Uncapped` and
563
+ `Inherit Host Defaults` remain explicit modes; `Leave Unresolved` and
564
+ non-interactive unresolved state are not implementation-ready.
574
565
 
575
- ```yaml
576
- oat_dispatch_policy:
577
- mode: inherit
578
- source: project-state
579
- ```
566
+ ### Step 3.55: Configure Optional Phase Review
567
+
568
+ After the generated quick plan has stable phase IDs and before Step 3.6 starts
569
+ the plan artifact review, invoke the `Shared Phase-Review Setup Contract` from
570
+ `oat-project-plan-writing`.
580
571
 
581
- Do not prompt when `OAT_NON_INTERACTIVE=1` or when no user-response channel
582
- exists. In that case, leave the value unresolved. `oat-project-implement`
583
- must block before work starts if it still cannot resolve a policy.
572
+ If `plan.md` already contains an explicit `oat_phase_review_gate`, preserve it
573
+ through the shared contract without probing, prompting, or mutation. Otherwise
574
+ let the contract probe qualifying targets and offer all phases, selected
575
+ phases, or disabled. If the probe fails, no target qualifies, or the user
576
+ declines, leave phase review disabled and continue with the contract's concise
577
+ status output.
584
578
 
585
- Do not treat provider default effort as the OAT dispatch policy. Provider
586
- defaults apply only for explicit inherit/default behavior or base/unpinned
587
- fallback paths.
579
+ This phase-review setup is independent from HiLL checkpoints. Do not read or
580
+ change HiLL fields here, and do not add a provider/model `--target` to any
581
+ lifecycle command.
588
582
 
589
583
  ### Step 3.6: Run Plan Artifact Review Loop
590
584
 
585
+ Before dispatching the artifact reviewer, invoke the `Managed Dispatch
586
+ Readiness and Review Contract` from `oat-project-plan-writing`:
587
+
588
+ ```bash
589
+ oat project dispatch-ceiling resolve --provider "$ACTIVE_PROVIDER" --role reviewer --preflight --json
590
+ ```
591
+
592
+ If managed resolution or the complete ladder is unresolved, return to Step
593
+ 3.5, adopt the recommendation in the selected ownership scope, and re-run the
594
+ resolver. Do not hand the quick plan to implementation while either contract is
595
+ unresolved.
596
+
591
597
  Invoke the shared `Auto Artifact-Review Loop` from `oat-project-plan-writing` with target `plan` before syncing project state or handing off to implementation.
592
598
 
593
599
  Required payload:
@@ -602,11 +608,44 @@ Apply the shared loop exactly:
602
608
 
603
609
  - Resolve `workflow.autoArtifactReview.plan`; only an explicit `false` skips the loop.
604
610
  - Resolve `oat_orchestration_retry_limit` from project state, defaulting to `2`.
605
- - Dispatch `oat-reviewer` in structured mode using Tier 1 subagent when available and Tier 2 inline fallback otherwise.
611
+ - For a concrete managed target, dispatch the exact registered reviewer role. If the host cannot select it, launch a fresh Codex child pinned to the resolved model and reasoning effort with the canonical reviewer instructions.
612
+ - For Claude or Cursor, pass the exact resolver-returned
613
+ `providers.<provider>.dispatchArgs.model` as the actual invocation's model
614
+ argument. Preserve the same complete payload on timeout and retry; Cursor
615
+ strings remain opaque.
616
+ - Run inline only with verified equivalent current-host model and effort controls, or for explicit inherit/default behavior or the managed-uncapped reviewer exception. If none applies, fail closed before artifact review.
617
+ - If the reviewer times out or does not conclude, poll and nudge once, then retry the same exact role or pinned child within the retry bound. If that target-preserving retry still fails, fail closed; never downgrade the review to inline.
606
618
  - Apply Critical and Important artifact-local fixes when unambiguous; offer Medium and Minor fixes instead of silently applying them.
607
619
  - Re-dispatch after rewrites until clean or the retry bound is exhausted.
608
620
  - Update the `plan` artifact row in the `## Reviews` table to `passed` when clean. If residual findings remain, preserve the row and surface the residual findings before downstream handoff.
609
621
 
622
+ ### Step 3.7: Record Review Disposition and Mark Plan Complete
623
+
624
+ Before changing readiness, durably record the review outcome in `plan.md`:
625
+
626
+ - When review ran, update the `plan` review row in the `## Reviews` section to
627
+ the outcome reached by Step 3.6. Use `passed` only for a clean result. If
628
+ residual findings remain, retain their actual non-passed status and add a
629
+ concise residual-finding disposition in the same section.
630
+ - When `workflow.autoArtifactReview.plan` is explicitly `false`, record the
631
+ explicit skip in the `## Reviews` section as
632
+ `Plan artifact review: skipped (workflow.autoArtifactReview.plan=false)`.
633
+ Do not claim that the plan passed review.
634
+
635
+ The review row or explicit skip must be written to `plan.md`; chat or status
636
+ output alone is not durable. Only after that write succeeds, atomically update
637
+ the plan frontmatter:
638
+
639
+ - `oat_status: complete`
640
+ - `oat_ready_for: oat-project-implement`
641
+ - `oat_phase_status: complete`
642
+ - `oat_template: false`
643
+
644
+ If dispatch remains unresolved, review execution fails closed, or the outcome
645
+ cannot be recorded, leave the Step 3 pre-review values unchanged and commit
646
+ them before stopping. Never expose a partially reviewed quick plan to
647
+ `oat-project-implement`.
648
+
610
649
  ### Step 4: Sync Project State
611
650
 
612
651
  Update `"$PROJECT_PATH/state.md"`:
@@ -666,18 +705,29 @@ Before reporting this skill as complete, run the configured gate as the final st
666
705
 
667
706
  If the command returns JSON `null`, no gate is configured; the skill is complete.
668
707
 
669
- 2. If a gate config is returned, run its `command` exactly as configured. Capture stdout, stderr, and the exit code. A zero exit code means the gate passed and the skill is complete.
708
+ 2. Export the resolved project path into the command shell:
709
+
710
+ ```bash
711
+ export PROJECT_PATH
712
+ ```
713
+
714
+ If the resolved command invokes `oat gate review`, the configured review command must already include `--project "$PROJECT_PATH"` and must not include `--target <id>`. A valid reusable shape is `oat gate review --project "$PROJECT_PATH" ...`. If the declaration is missing, stop and migrate the stored gate command; do not inject or append arguments at execution time.
715
+
716
+ 3. Execute the resolved command exactly as configured. Capture stdout, stderr, the exit code, and the structured JSON result. A zero exit code means the review passed its threshold, but it does not by itself authorize artifact receipt or complete the handoff.
670
717
 
671
- 3. Review-artifact handoff:
672
- - If the gate reports a produced review artifact, the host must run `oat-project-review-receive` to receive and disposition that artifact before treating the review as consumed.
673
- - This applies to `oat gate review ...` outputs regardless of whether the gate ultimately exits zero or nonzero; the command output owns the exact artifact path, and receive-review owns disposition and archival.
718
+ 4. Review-artifact handoff:
719
+ - Parse the structured gate result. An exit code or artifact path alone never authorizes `oat-project-review-receive`.
720
+ - Invoke receive only when all three conditions hold: `status` is `ok` or `blocked`, the envelope explicitly sets `receiveEligible: true`, and a non-null `handoff` confirms the artifact was corroborated.
721
+ - `receiveEligible: false` is a hard stop even when `artifactPath` is present. Never receive `targeting_correlation_failed`; correct the project/run routing and run a new gate.
722
+ - Keep `artifact_validation_failed` outside receive until the artifact is corrected and the gate successfully revalidates it. Treat `review_failed`, unknown statuses, null handoffs, and contradictory eligibility fields as operational failures.
723
+ - `blocked` exits nonzero but is receive-eligible; `ok` exits zero and still requires durable receive disposition. Route by structured status and eligibility, not by exit code.
674
724
 
675
- 4. If the command exits nonzero, use `description` to orient the next steps and handle `onFailure`:
725
+ 5. If the command exits nonzero, use `description` to orient the next steps and handle `onFailure`:
676
726
  - `block`: read gate feedback, remediate, and re-run the gate up to `maxAttempts` attempts (default `2`). If attempts are exhausted, escalate to the human with accumulated feedback and append that feedback to `implementation.md`. Treat a launch failure, missing CLI, or no eligible runtime as escalation-biased and do not spend it as a remediation attempt.
677
727
  - `prompt`: surface the gate failure and ask the human how to proceed.
678
728
  - `warn`: record the gate failure and continue.
679
729
 
680
- 5. Runtime selection note (V1): the step runs the gate `command` as-is and reads no OAT runtime env var. By default, `oat gate review` and `oat gate cross-provider-exec` resolve the current host from built-in `hostDetectionCommand`s and avoid the same runtime when no exact target is supplied. Reusable lifecycle skill-gate commands should normally omit `--target <id>` so independent review stays provider-neutral. Use explicit targets only for manual/debug commands or deliberate local/user-specific overrides; do not hardcode provider/model targets in bundled skill guidance or shared lifecycle gate examples.
730
+ 6. Runtime selection note (V1): the step runs the gate `command` as-is and reads no OAT runtime env var. By default, `oat gate review` and `oat gate cross-provider-exec` resolve the current host from built-in `hostDetectionCommand`s and avoid the same runtime when no exact target is supplied. Reusable lifecycle skill-gate commands must not include `--target <id>` so independent review stays provider-neutral. Use explicit targets only for manual/debug commands or deliberate local/user-specific overrides; do not hardcode provider/model targets in bundled skill guidance or shared lifecycle gate examples.
681
731
 
682
732
  ### Step 7: Output Next Action
683
733
 
@@ -700,4 +750,4 @@ Report:
700
750
  - ✅ `plan.md` records the plan artifact review row unless `workflow.autoArtifactReview.plan` was explicitly disabled.
701
751
  - ✅ `implementation.md` is initialized for resumable execution.
702
752
  - ✅ Changed quick-start artifacts are committed before handoff or pause; `.oat/state.md` is refreshed locally when available.
703
- - ✅ Configured gate has run, and any produced review artifact has been handed off to `oat-project-review-receive` before it is treated as consumed.
753
+ - ✅ Configured gate has run, and only a corroborated, receive-eligible artifact has been handed off to `oat-project-review-receive` before it is treated as consumed.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-review-provide
3
- version: 1.3.10
3
+ version: 1.3.12
4
4
  description: Use when the user explicitly asks to review an OAT project — e.g. "review project", "review the project", "run project review", or confirms a previously offered review. Do NOT auto-invoke on completed work alone. Resolves a project review scope and offers before running.
5
5
  disable-model-invocation: false
6
6
  user-invocable: true
@@ -31,7 +31,7 @@ Before acting, verify that there is an active OAT project or a user-provided rev
31
31
 
32
32
  When the invocation is manual, summarize the inferred review type and scope, then ask before running the review.
33
33
 
34
- **Gate-originated mode:** If the request context says the review is gate-originated, set `REVIEW_INVOCATION=gate`, honor any provided review type/scope arguments, and run without interactive confirmation prompts. The gate session is already the explicit authorization boundary. If subagent dispatch is unavailable, run the review inline in the current gate session instead of handing off to a fresh session.
34
+ **Gate-originated mode:** If the request context says the review is gate-originated, set `REVIEW_INVOCATION=gate`, honor any provided review type/scope arguments, and run without interactive confirmation prompts. The gate session is already the explicit authorization boundary, but it does not waive dispatch controls. Resolve the reviewer target and use the exact registered role or explicitly pinned fresh child. Inline gate review is allowed only with verified equivalent current-host model and effort controls or a documented base-role exception; otherwise fail closed.
35
35
 
36
36
  ## Mode Assertion
37
37
 
@@ -428,23 +428,30 @@ Proceed with review?
428
428
 
429
429
  If `REVIEW_INVOCATION=gate`, print the same scope summary but do not ask `Proceed with review?`; continue directly.
430
430
 
431
- ### Step 4.1: Dispatch Profile Override Advisory (Artifact Plan Only)
431
+ ### Step 4.1: Dispatch Profile Ceiling Advisory (Artifact Plan Only)
432
432
 
433
- When reviewing `artifact plan`, apply this Dispatch Profile override advisory:
433
+ When reviewing `artifact plan`, apply this Dispatch Profile named-ceiling
434
+ advisory:
434
435
 
435
436
  - A missing `## Dispatch Profile` section is normal and must not be flagged.
436
437
  - Important findings:
437
438
  - invalid phase ID that does not match a real plan phase
438
- - unknown active-provider tier value
439
- - low-tier override for multi-file integration, architecture, or review-heavy work
440
- - low-tier override with missing or generic rationale
439
+ - unknown named ceiling or a phase ceiling above the project ceiling
440
+ - wording that pins an exact provider model, family, effort, or role instead
441
+ of a named maximum
442
+ - low named ceiling for multi-file integration, architecture, or review-heavy
443
+ work
444
+ - low named ceiling with missing or generic rationale
441
445
  - Medium findings:
442
446
  - malformed but recoverable Dispatch Profile table structure
443
- - mid-tier override for architecture-heavy work without convincing rationale
447
+ - mid-tier ceiling for architecture-heavy work without convincing rationale
444
448
  - Minor findings:
445
449
  - rationale is present but weakly tied to phase scope
446
450
 
447
- Include this advisory in the Review Scope metadata for artifact plan reviews so the reviewer evaluates explicit override rows without treating omitted rows as a gap.
451
+ Include this advisory in the Review Scope metadata for artifact plan reviews so
452
+ the reviewer evaluates explicit ceiling rows without treating omitted rows as a
453
+ gap. A named ceiling is a maximum; lower configured candidates remain eligible
454
+ for later task selection.
448
455
 
449
456
  ### Step 4.5: Gather Deferred Findings Ledger (Final Scope Only)
450
457
 
@@ -510,6 +517,56 @@ Build the "Review Scope" metadata for the reviewer:
510
517
 
511
518
  ### Step 6: Execute Review (3-Tier Capability Model)
512
519
 
520
+ **Step 6.0: Resolve the managed reviewer target**
521
+
522
+ Before capability-tier selection, resolve the same reviewer contract used by
523
+ plan artifact review and implementation phase/final review:
524
+
525
+ ```bash
526
+ oat project dispatch-ceiling resolve --provider "$ACTIVE_PROVIDER" --role reviewer --preflight --json
527
+ ```
528
+
529
+ The reviewer resolver selects the final candidate of the configured review
530
+ ceiling. Do not supply ephemeral implementer candidate requests for artifact,
531
+ phase, project, or final review. A lower candidate is allowed only when a
532
+ separate reviewed contract explicitly authorizes reviewer lowering and defines
533
+ its bounds; a Dispatch Profile row does not authorize it.
534
+
535
+ Resolve every concrete managed reviewer target before probing generic subagent
536
+ availability or selecting Tier 1/Tier 2/Tier 3. The concrete target takes
537
+ precedence over all availability, preference, timeout, fresh-session, and gate
538
+ fallbacks.
539
+ A concrete managed Codex target takes precedence over tier availability.
540
+ Build the actual provider invocation before reporting the target as enforced:
541
+
542
+ - Codex uses the exact registered reviewer role or variant from
543
+ `providers.codex.dispatchArgs.variant` when selectable. If the current host
544
+ cannot select it, launch a fresh Codex child with the resolver target's
545
+ explicit model, reasoning effort, canonical role instructions from
546
+ `.agents/agents/oat-reviewer.md`, and the same Review Scope payload.
547
+ If that fresh child is unavailable, use only a verified-equivalent inline
548
+ route or block the review.
549
+ - Claude requires a non-empty `providers.claude.dispatchArgs.model`; the actual
550
+ provider invocation must include that exact value as its `model` argument.
551
+ - Cursor requires a non-empty `providers.cursor.dispatchArgs.model`; the actual
552
+ provider invocation must include that exact opaque string as its `model`
553
+ argument without normalization.
554
+
555
+ Managed incomplete resolver results, including a missing or incomplete
556
+ candidate ladder, fail closed before review. Route interactive repair through
557
+ the planning workflow's `Complete Dispatch Ladder Adoption Contract`; do not
558
+ invent a reviewer target.
559
+
560
+ On timeout or retry, reuse the same exact role or complete invocation payload,
561
+ including the Claude or Cursor model argument. If the host cannot apply a
562
+ required role or model argument, fail closed or block unless inline execution
563
+ has verified equivalent current-host controls.
564
+ Workflow correctness must not require provider restart or hot reload.
565
+ Never use a managed base role because a target is missing or unavailable; a
566
+ managed base role is forbidden except for
567
+ explicit inherit/default behavior or the documented managed-uncapped reviewer
568
+ fallback.
569
+
513
570
  **Step 6a: Probe Subagent Availability**
514
571
 
515
572
  Before selecting a tier, announce the probe and its result so the user can see what's happening:
@@ -526,8 +583,7 @@ Detection logic:
526
583
  - If the host is Cursor, invoke `oat-reviewer` using Cursor-native explicit invocation (`/oat-reviewer`) or natural mention, and resolve from `.cursor/agents/oat-reviewer.md` (or `.claude/agents/oat-reviewer.md` compatibility path).
527
584
  - If the host is Codex multi-agent, verify Codex requirements first:
528
585
  - `[features] multi_agent = true` is enabled in active Codex config.
529
- - If explicit role pinning is desired, `agent_type` must be a built-in role (`default`/`worker`/`explorer`) or a custom role declared under `[agents.<name>]`.
530
- - Codex may also auto-select and spawn agents without explicit role pinning.
586
+ - For a concrete managed target, `agent_type` must be the exact custom role declared under `[agents.<name>]`; built-in roles and auto-selection are not equivalent fallbacks.
531
587
  - If the current Codex host requires explicit user authorization before calling `spawn_agent`, do not mark `oat-reviewer` as unresolved. Announce `authorization required` and ask one concise confirmation question before selecting Tier 2 or Tier 3:
532
588
 
533
589
  ```
@@ -535,12 +591,12 @@ Detection logic:
535
591
  ```
536
592
 
537
593
  - If the user authorizes delegation and Codex role prerequisites are satisfied, use **Tier 1**.
538
- - If the user declines delegation, continue with the existing Tier 2 / Tier 3 fallback flow.
594
+ - If the user declines delegation, continue only through a target-preserving pinned-child or guarded inline route. Otherwise block.
539
595
 
540
596
  - If the runtime can dispatch reviewer work (`subagent_type` in Claude Code, Cursor invocation via `/name` or natural mention, or Codex multi-agent spawn/auto-spawn) → **Tier 1**.
541
- - If the Task tool is not available or subagent dispatch is not supported **Tier 2**.
542
- - If user explicitly requests inline or confirms they are already in a fresh session **Tier 3**.
543
- - If `REVIEW_INVOCATION=gate` and Tier 1 is unavailable, skip Tier 2 and use **Tier 3** inline. Do not return fresh-session instructions from a gate invocation.
597
+ - If the Task tool is not available or subagent dispatch is not supported, use **Tier 2** only after applying the target-first contract.
598
+ - If the user explicitly requests inline or confirms they are already in a fresh session, use **Tier 3** only when the guarded inline route is valid.
599
+ - Gate-originated review skips fresh-session handoff instructions and immediately uses the first target-preserving route available from Step 6.0. If none exists, fail closed.
544
600
 
545
601
  **Step 6b: Tier 1 — Subagent (if available)**
546
602
 
@@ -549,9 +605,9 @@ First, pre-compute the review artifact path using Step 7 naming conventions so i
549
605
  Then spawn the reviewer:
550
606
 
551
607
  - Use provider-appropriate dispatch:
552
- - Claude Code: Task tool with `subagent_type: "oat-reviewer"` (resolves from `.claude/agents/oat-reviewer.md`).
553
- - Cursor: explicit invocation `/oat-reviewer` (or natural mention) with agent resolved from `.cursor/agents/oat-reviewer.md` or `.claude/agents/oat-reviewer.md` compatibility path.
554
- - Codex style: ask Codex to spawn agent(s) for review work and wait for all results; optionally pin `agent_type` when a specific built-in/custom role is required.
608
+ - Claude Code: Task tool with `subagent_type: "oat-reviewer"` (resolves from `.claude/agents/oat-reviewer.md`). For a concrete managed target, the payload must also contain `model: providers.claude.dispatchArgs.model` with the resolver-returned value.
609
+ - Cursor: explicit invocation `/oat-reviewer` (or natural mention) with agent resolved from `.cursor/agents/oat-reviewer.md` or `.claude/agents/oat-reviewer.md` compatibility path. For a concrete managed target, the invocation must also contain `model: providers.cursor.dispatchArgs.model` with the exact opaque resolver-returned string.
610
+ - Codex style: for a concrete managed target, spawn the exact resolver-returned `agent_type`; if it cannot be selected, use the explicitly pinned fresh-child route from Step 6.0. Generic auto-selection is permitted only for the documented base-role exceptions.
555
611
  - Pass the Review Scope metadata block from Step 5 as the prompt
556
612
  - Include the pre-computed artifact path for the subagent to write to
557
613
  - **If a worktree was resolved in Step 1.5:** include the worktree path in the prompt so the subagent writes the artifact to the worktree directory, not the current session's working directory
@@ -566,12 +622,12 @@ After the subagent completes:
566
622
 
567
623
  **Step 6c: Tier 2 — Fresh Session (recommended fallback)**
568
624
 
569
- If subagent not available:
625
+ If target-preserving subagent dispatch is not available:
570
626
 
571
627
  - If user is already in a fresh session (confirmed), proceed to Tier 3.
572
628
  - If Codex reported `authorization required` and the user approved delegation, do **not** use Tier 2. Return to Tier 1 and delegate to `oat-reviewer`.
573
629
  - If user prefers fresh session: provide instructions and exit.
574
- - If `REVIEW_INVOCATION=gate`: do not provide fresh-session instructions; run Tier 3 inline instead.
630
+ - Gate-originated review does not return fresh-session instructions; it uses the guarded route selected in Step 6.0 or fails closed.
575
631
 
576
632
  Instructions for fresh session:
577
633
 
@@ -585,7 +641,13 @@ To run review in a fresh session:
585
641
 
586
642
  **Step 6d: Tier 3 — Inline Reset (fallback)**
587
643
 
588
- If user insists on inline review in current session:
644
+ If the user requests inline review, first verify equivalent current-host model
645
+ and effort controls. Inline is also allowed for explicit inherit/default or the
646
+ documented managed-uncapped reviewer behavior. User preference alone does not
647
+ override a concrete managed target; if the guard fails, use the exact/pinned
648
+ route or block.
649
+
650
+ When inline is allowed:
589
651
 
590
652
  - Run "reset protocol":
591
653
  1. Re-read required artifacts for current workflow mode from scratch
@@ -649,6 +711,13 @@ oat_review_scope: { scope }
649
711
  oat_review_type: { code|artifact }
650
712
  oat_review_invocation: { manual|auto|gate }
651
713
  oat_project: { PROJECT_PATH }
714
+ # Gate-only: copy the exact prompt-provided fields below.
715
+ oat_gate_run_id: { gate run id }
716
+ oat_gate_target: { configured target id }
717
+ oat_gate_runtime: { configured runtime }
718
+ oat_invocation_model: { configured model|provider-default|unknown }
719
+ oat_invocation_reasoning_effort: { configured effort|provider-default|unknown }
720
+ oat_invocation_source: { exec-target-config|unknown }
652
721
  ---
653
722
 
654
723
  # {Code|Artifact} Review: {scope}
@@ -669,6 +738,8 @@ When `oat-project-implement` spawns this skill for auto-review at checkpoints, i
669
738
 
670
739
  When `oat gate review` invokes this skill, it includes gate-originated context instructing the reviewer to write `oat_review_invocation: gate`. Honor that instruction in the artifact frontmatter.
671
740
 
741
+ The gate prompt also supplies exact values for `oat_gate_run_id`, `oat_gate_target`, `oat_gate_runtime`, `oat_invocation_model`, `oat_invocation_reasoning_effort`, and `oat_invocation_source`. Copy all six values verbatim for gate-originated artifacts. These fields record OAT's configured invocation; do not derive them from `baseCommand`, the target id, model self-identification, or surrounding dispatch prose. Optional observed/self-reported identity is separate and non-authoritative.
742
+
672
743
  For all other invocations (user-triggered, fresh session), use `manual`.
673
744
 
674
745
  Gate parsing contract:
@@ -784,7 +855,8 @@ For best review quality, run in a fresh session:
784
855
  2. Run the oat-project-review-provide skill with: code {scope}
785
856
  3. Return here and run the oat-project-review-receive skill
786
857
 
787
- Or say "inline" to run review in current session (less reliable).
858
+ Or say "inline" to request review in the current session; the managed-target
859
+ guard still applies.
788
860
 
789
861
  ```
790
862
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAQzC,OAAO,EAIL,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAehB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkFpC,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,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AA65DD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAwKT"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/commands/config/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,mBAAmB,EAAE,KAAK,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEhF,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAQzC,OAAO,EAML,KAAK,SAAS,EACd,KAAK,cAAc,EAGnB,KAAK,UAAU,EAgBhB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEL,KAAK,cAAc,EAEpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,yBAAyB,EAC/B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkFpC,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,iBAAiB,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5C,aAAa,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACzE,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,yBAAyB,KAC/B,OAAO,CAAC,8BAA8B,CAAC,CAAC;IAC7C,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;CAC/B;AA45DD,wBAAgB,mBAAmB,CACjC,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,OAAO,CAsKT"}