@open-agent-toolkit/cli 0.3.14 → 0.3.16

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 (110) hide show
  1. package/assets/NOTICES.md +48 -0
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/docs/contributing/markdown-features.md +38 -0
  4. package/assets/docs/contributing/smoke-testing.md +20 -13
  5. package/assets/docs/docs-tooling/workflows.md +26 -19
  6. package/assets/docs/getting-started/concepts.md +35 -21
  7. package/assets/docs/provider-sync/commands.md +21 -0
  8. package/assets/docs/provider-sync/manifest-and-drift.md +24 -17
  9. package/assets/docs/reference/cli-reference.md +2 -1
  10. package/assets/docs/reference/configuration.md +10 -2
  11. package/assets/docs/reference/project-state-machine.md +27 -20
  12. package/assets/docs/skills/index.md +1 -0
  13. package/assets/docs/skills/recon.md +8 -5
  14. package/assets/docs/workflows/advanced/autonomy.md +10 -0
  15. package/assets/docs/workflows/advanced/evidence-layers.md +19 -12
  16. package/assets/docs/workflows/advanced/orchestration-model.md +48 -34
  17. package/assets/docs/workflows/advanced/workflow-gates.md +109 -10
  18. package/assets/docs/workflows/approvals-and-automation.md +3 -1
  19. package/assets/docs/workflows/ideas/lifecycle.md +32 -25
  20. package/assets/docs/workflows/projects/closeout/closeout-skills.md +62 -1
  21. package/assets/docs/workflows/projects/execution/implementation-execution.md +67 -33
  22. package/assets/docs/workflows/projects/execution/project-log.md +6 -0
  23. package/assets/docs/workflows/projects/lifecycle.md +119 -63
  24. package/assets/docs/workflows/projects/reviews/index.md +63 -1
  25. package/assets/docs/workflows/projects/reviews/review-flavors.md +30 -23
  26. package/assets/docs/workflows/waves/wave-workflows.md +11 -3
  27. package/assets/public-package-versions.json +4 -4
  28. package/assets/skills/oat-project-autonomous/SKILL.md +1 -1
  29. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +172 -165
  30. package/assets/skills/oat-project-complete-auto/SKILL.md +388 -0
  31. package/assets/skills/oat-project-document/SKILL.md +1 -1
  32. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +172 -165
  33. package/assets/skills/oat-project-implement/SKILL.md +6 -1
  34. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +28 -1
  35. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +172 -165
  36. package/assets/skills/oat-project-implement/references/docs/complexity-review-fallback.md +262 -0
  37. package/assets/skills/oat-project-implement/references/docs/gate-approval-record.md +80 -0
  38. package/assets/skills/oat-project-implement/references/phase-execution.md +18 -0
  39. package/assets/skills/oat-project-lite/SKILL.md +1 -1
  40. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +172 -165
  41. package/assets/skills/oat-project-next/SKILL.md +19 -2
  42. package/assets/skills/oat-project-next/references/docs/gate-approval-record.md +80 -0
  43. package/assets/skills/oat-project-pr-final/SKILL.md +4 -3
  44. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +172 -165
  45. package/assets/skills/oat-project-progress/SKILL.md +15 -1
  46. package/assets/skills/oat-project-progress/references/docs/gate-approval-record.md +80 -0
  47. package/assets/skills/oat-project-quick-start/SKILL.md +31 -3
  48. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +172 -165
  49. package/assets/skills/oat-project-quick-start/references/docs/complexity-review-fallback.md +262 -0
  50. package/assets/skills/oat-project-quick-start/references/docs/gate-approval-record.md +80 -0
  51. package/assets/skills/oat-project-review-receive/SKILL.md +21 -3
  52. package/assets/skills/oat-project-review-receive/references/docs/complexity-review-fallback.md +262 -0
  53. package/assets/skills/oat-wave-execute/SKILL.md +49 -28
  54. package/assets/skills/oat-wave-program/SKILL.md +15 -6
  55. package/assets/skills/oat-wrap-up/SKILL.md +9 -3
  56. package/assets/skills/oat-wrap-up/references/report-template.md +1 -1
  57. package/assets/skills/recon/SKILL.md +1 -1
  58. package/assets/skills/recon/references/packet-contract.md +18 -3
  59. package/assets/skills/recon/scripts/lib/contracts.mjs +16 -2
  60. package/assets/skills/recon/scripts/reconcile-ledger.mjs +20 -10
  61. package/assets/skills/recon/scripts/render-packet.mjs +31 -3
  62. package/assets/skills/recon/scripts/validate-packet.mjs +5 -5
  63. package/assets/templates/docs-app-fuma/app/[[...slug]]/page.tsx +14 -2
  64. package/assets/templates/docs-app-fuma/app/globals.css +1 -0
  65. package/assets/templates/state.md +7 -0
  66. package/dist/commands/config/index.d.ts.map +1 -1
  67. package/dist/commands/config/index.js +13 -0
  68. package/dist/commands/gate/index.d.ts +5 -0
  69. package/dist/commands/gate/index.d.ts.map +1 -1
  70. package/dist/commands/gate/index.js +270 -9
  71. package/dist/commands/shared/frontmatter.d.ts +1 -1
  72. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  73. package/dist/commands/shared/frontmatter.js +1 -0
  74. package/dist/commands/state/generate.d.ts +1 -1
  75. package/dist/commands/state/generate.d.ts.map +1 -1
  76. package/dist/commands/state/generate.js +87 -8
  77. package/dist/commands/sync/apply.d.ts.map +1 -1
  78. package/dist/commands/sync/apply.js +31 -5
  79. package/dist/commands/sync/dry-run.d.ts.map +1 -1
  80. package/dist/commands/sync/dry-run.js +28 -11
  81. package/dist/commands/sync/sync.utils.d.ts +13 -0
  82. package/dist/commands/sync/sync.utils.d.ts.map +1 -1
  83. package/dist/commands/sync/sync.utils.js +21 -1
  84. package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
  85. package/dist/commands/tools/shared/pack-manifest.js +1 -0
  86. package/dist/config/oat-config.d.ts +1 -0
  87. package/dist/config/oat-config.d.ts.map +1 -1
  88. package/dist/config/oat-config.js +3 -0
  89. package/dist/config/resolve.d.ts.map +1 -1
  90. package/dist/config/resolve.js +1 -0
  91. package/dist/drift/detector.js +6 -6
  92. package/dist/engine/compute-plan.d.ts.map +1 -1
  93. package/dist/engine/compute-plan.js +87 -2
  94. package/dist/engine/engine.types.d.ts +10 -1
  95. package/dist/engine/engine.types.d.ts.map +1 -1
  96. package/dist/engine/engine.types.js +4 -0
  97. package/dist/engine/execute-plan.d.ts.map +1 -1
  98. package/dist/engine/execute-plan.js +42 -5
  99. package/dist/engine/managed-copy-hash.d.ts +4 -3
  100. package/dist/engine/managed-copy-hash.d.ts.map +1 -1
  101. package/dist/engine/managed-copy-hash.js +4 -3
  102. package/dist/fs/assets.d.ts.map +1 -1
  103. package/dist/fs/assets.js +7 -1
  104. package/dist/manifest/hash.d.ts +8 -10
  105. package/dist/manifest/hash.d.ts.map +1 -1
  106. package/dist/release/public-package-contract.js +1 -1
  107. package/dist/ui/output.js +1 -1
  108. package/dist/validation/skills.d.ts.map +1 -1
  109. package/dist/validation/skills.js +13 -0
  110. package/package.json +2 -2
@@ -29,25 +29,32 @@ Terms used on this page:
29
29
 
30
30
  ## Default Topology
31
31
 
32
- ```mermaid
33
- flowchart TD
34
- Root["Project root\nlifecycle owner"]
35
- Adapter["Project dispatch adapter"]
36
- Engine["Provider-neutral dispatch engine"]
37
-
38
- Root --> Adapter --> Engine
39
- Engine --> P["Phase implementer\none per phase"]
40
- P --> T1["Planned task commit"]
41
- P --> T2["Planned task commit"]
42
- P -. optional .-> Recon["Recon / specialist / isolated fanout"]
43
-
44
- Root -. independent review lane .-> Adapter
45
- Engine -. exact reviewer route .-> R["Phase reviewer"]
46
- R -->|blocking findings| Root
47
- Root -->|resume bounded fix| P
48
-
49
- Root -. external gate lane .-> G["Configured cross-runtime gate"]
50
- ```
32
+ === "Diagram"
33
+
34
+ ![Default topology: the project root goes through the dispatch adapter and provider-neutral engine to one phase implementer per phase, which makes planned task commits and optionally a recon or specialist fanout; the engine routes an exact phase reviewer whose blocking findings return to the root, which resumes a bounded fix; dashed lanes show independent review and an external cross-runtime gate](/diagrams/orchestration-model-1-default-topology-light.svg)
35
+ ![Default topology: the project root goes through the dispatch adapter and provider-neutral engine to one phase implementer per phase, which makes planned task commits and optionally a recon or specialist fanout; the engine routes an exact phase reviewer whose blocking findings return to the root, which resumes a bounded fix; dashed lanes show independent review and an external cross-runtime gate](/diagrams/orchestration-model-1-default-topology-dark.svg)
36
+
37
+ === "Mermaid source"
38
+
39
+ ```mermaid
40
+ flowchart TD
41
+ Root["Project root\nlifecycle owner"]
42
+ Adapter["Project dispatch adapter"]
43
+ Engine["Provider-neutral dispatch engine"]
44
+
45
+ Root --> Adapter --> Engine
46
+ Engine --> P["Phase implementer\none per phase"]
47
+ P --> T1["Planned task commit"]
48
+ P --> T2["Planned task commit"]
49
+ P -. optional .-> Recon["Recon / specialist / isolated fanout"]
50
+
51
+ Root -. independent review lane .-> Adapter
52
+ Engine -. exact reviewer route .-> R["Phase reviewer"]
53
+ R -->|blocking findings| Root
54
+ Root -->|resume bounded fix| P
55
+
56
+ Root -. external gate lane .-> G["Configured cross-runtime gate"]
57
+ ```
51
58
 
52
59
  The solid implementation lane is mandatory. The dotted nested lane is
53
60
  benefit-driven. A run does not fail merely because the phase agent cannot or
@@ -83,21 +90,28 @@ matrix. The lifecycle workflow remains authoritative for classification,
83
90
  selection judgment, synthesis, and state mutation. The dispatch engine does
84
91
  not edit `plan.md`, `implementation.md`, or project state.
85
92
 
86
- ```mermaid
87
- sequenceDiagram
88
- participant Root as Project root
89
- participant Adapter as Project adapter
90
- participant Engine as Dispatch engine
91
- participant Record as Run record in implementation.md
92
- participant Phase as Phase implementer
93
-
94
- Root->>Adapter: Phase + lifecycle authority
95
- Adapter->>Engine: Provider-neutral dispatch request
96
- Engine-->>Root: Exact route + request ID
97
- Root->>Phase: Phase Scope
98
- Root->>Record: Accepted or blocked-before-start result
99
- Phase-->>Root: Phase report + commits
100
- ```
93
+ === "Diagram"
94
+
95
+ ![Dispatch layers sequence: the project root passes phase and lifecycle authority to the adapter, the adapter sends a provider-neutral request to the engine, the engine returns the exact route and request ID, the root sends the phase scope and records the accepted or blocked result in implementation.md, and the implementer returns its report and commits](/diagrams/orchestration-model-2-dispatch-layers-light.svg)
96
+ ![Dispatch layers sequence: the project root passes phase and lifecycle authority to the adapter, the adapter sends a provider-neutral request to the engine, the engine returns the exact route and request ID, the root sends the phase scope and records the accepted or blocked result in implementation.md, and the implementer returns its report and commits](/diagrams/orchestration-model-2-dispatch-layers-dark.svg)
97
+
98
+ === "Mermaid source"
99
+
100
+ ```mermaid
101
+ sequenceDiagram
102
+ participant Root as Project root
103
+ participant Adapter as Project adapter
104
+ participant Engine as Dispatch engine
105
+ participant Record as Run record in implementation.md
106
+ participant Phase as Phase implementer
107
+
108
+ Root->>Adapter: Phase + lifecycle authority
109
+ Adapter->>Engine: Provider-neutral dispatch request
110
+ Engine-->>Root: Exact route + request ID
111
+ Root->>Phase: Phase Scope
112
+ Root->>Record: Accepted or blocked-before-start result
113
+ Phase-->>Root: Phase report + commits
114
+ ```
101
115
 
102
116
  ## Phase Execution
103
117
 
@@ -247,6 +247,45 @@ Only an artifact with `oat_review_invocation: gate` and the matching
247
247
  review, phase review, or manually produced independent review cannot substitute
248
248
  for it.
249
249
 
250
+ ### Gate approval records
251
+
252
+ Two lifecycle gates persist their outcome in project `state.md` with a shared
253
+ five-field core:
254
+
255
+ | Field | Meaning |
256
+ | -------------------- | ---------------------------------------------------------------------------------------------- |
257
+ | `status` | `allowed` or `blocked` |
258
+ | `disposition` | `passed`, `warned`, `prompt_approved`, or `project_disabled` when allowed; `null` when blocked |
259
+ | `config_fingerprint` | Stable hash of the resolved gate declaration |
260
+ | `reviewed_head` | The commit the gate reviewed, recorded as provenance |
261
+ | `decided_at` | ISO 8601 UTC time of the decision |
262
+
263
+ `oat_implement_exit_gate` keeps its additional closeout fields and writes
264
+ `decided_at` with every allowed or blocked outcome. `oat_quick_start_gate`,
265
+ written by `oat-project-quick-start` for every configured plan-gate outcome,
266
+ carries exactly the core:
267
+
268
+ - a passing gate writes `allowed/passed`, and a `warn` failure writes
269
+ `allowed/warned`;
270
+ - a `prompt` failure the operator explicitly continues past writes
271
+ `allowed/prompt_approved`;
272
+ - a declined or deferred `prompt` (always under `OAT_AUTONOMOUS=1`), a `block`
273
+ still failing at `maxAttempts`, or an operational failure writes `blocked`
274
+ with a `null` disposition;
275
+ - a gate disabled by project override writes `allowed/project_disabled`
276
+ without launching anything; and
277
+ - a gate that is not configured writes no record (implement writes
278
+ `allowed/no_gate` instead).
279
+
280
+ `oat-project-next` and `oat-project-progress` report the quick-start record as
281
+ recorded: status, disposition, `decided_at`, and `config_fingerprint` as
282
+ provenance, or `malformed` when the fields do not form a valid record. They do
283
+ not recompute the fingerprint, because no CLI emits a canonical one for the
284
+ quick-start gate, and they never route on the record: quick plan readiness
285
+ remains the only routing rule for quick plans, and `reviewed_head` is not
286
+ compared with `HEAD` because quick-start commits after the gate. A record
287
+ written before `decided_at` existed is still valid.
288
+
250
289
  ## Review gates
251
290
 
252
291
  `oat gate review` is intentionally stateful. It is equivalent to running
@@ -953,6 +992,12 @@ failures, and receive failures are operational failures rather than validated
953
992
  blocking findings. They remain blocked regardless of `onFailure`; even `warn`
954
993
  cannot turn them into an allowed disposition.
955
994
 
995
+ When `block` still fails after `maxAttempts`, the implementation exit gate and
996
+ the quick-start plan gate run a
997
+ [complexity review](../projects/reviews/index.md#complexity-review-at-budget-exhaustion)
998
+ before escalating, and show it with the accumulated feedback. The operator
999
+ chooses how to proceed, including **simplify**; agents never choose for them.
1000
+
956
1001
  `cross-provider-exec` does fallback only before dispatch, while selecting an
957
1002
  available target. Once a target actually runs, its exit code is the gate result;
958
1003
  OAT does not try another target after a failed review.
@@ -970,9 +1015,11 @@ the budget at the narrowest useful level. The first valid value wins:
970
1015
  All configured values must be integer milliseconds from `1,000` through
971
1016
  `14,400,000`. Invalid persisted values are ignored with a warning and
972
1017
  resolution continues to the next source. Code reviews at `final`, phase
973
- (`pNN`), or phase-range (`pNN-pMM`) scope default to 1,800,000 ms (30 minutes).
974
- Task-scoped code reviews (`pNN-tNN`) and artifact reviews default to 900,000 ms
975
- (15 minutes). Startup output reports both the resolved value and source.
1018
+ (`pNN`), or phase-range (`pNN-pMM`) scope and every artifact review (for
1019
+ example `plan`, `design`, or `discovery`) default to 1,800,000 ms (30 minutes),
1020
+ because they read the full surface. Task-scoped code reviews (`pNN-tNN`)
1021
+ default to 900,000 ms (15 minutes). Startup output reports both the resolved
1022
+ value and source.
976
1023
 
977
1024
  Example migration from the former single environment override:
978
1025
 
@@ -981,7 +1028,7 @@ Example migration from the former single environment override:
981
1028
  "workflow": {
982
1029
  "gateTimeouts": {
983
1030
  "code": 2400000,
984
- "artifact": 900000
1031
+ "artifact": 2400000
985
1032
  },
986
1033
  "gates": {
987
1034
  "execTargets": {
@@ -1048,10 +1095,60 @@ diagnostic because the refusal itself explains why execution stopped.
1048
1095
 
1049
1096
  Before spawn, the gate also writes a transient marker under the system temp
1050
1097
  directory at `oat-gate-runs/<runId>.json`; startup diagnostics print its path.
1051
- The marker records target, runtime, project, review type/scope, start time,
1052
- budget, and budget source. It is deleted at terminal completion. An orphaned
1053
- marker indicates the gate parent itself stopped unexpectedly, but markers are
1054
- diagnostic only and are never used for artifact validation.
1098
+ The marker records target, runtime, project, the resolved project directory
1099
+ (`projectRoot`), the owning gate process ID (`pid`), review type/scope, start
1100
+ time, budget, and budget source. It is deleted at terminal completion. An
1101
+ orphaned marker indicates the gate parent itself stopped unexpectedly. Markers
1102
+ are diagnostic only: they are never used for artifact validation or for
1103
+ duplicate-run detection.
1104
+
1105
+ #### Nested and duplicate runs
1106
+
1107
+ Before launching, `oat gate review` atomically claims its project directory,
1108
+ review type, and review scope (type and scope compare case-insensitively). The
1109
+ claim is a `claim-<hash>.lock` file in the same `oat-gate-runs/` directory,
1110
+ created through an exclusive link, so at most one live gate holds a given
1111
+ project, type, and scope at a time. That holds even when two identical gates
1112
+ start at the same moment. The claim is released when the run ends.
1113
+
1114
+ If the claim is already held by a live process, the new run is rejected
1115
+ without launching a target, writing a marker, or appending a project-log entry.
1116
+ It exits nonzero with `status: review_failed`,
1117
+ `outcome: review_did_not_complete`, and a message naming the holding run, its
1118
+ process ID, and its claim path. This covers a reviewer that launches its own
1119
+ gate for the scope it is reviewing, a second orchestrator launch for a scope
1120
+ already under review, and simultaneous launches. Wait for the live run to
1121
+ finish; remove the named claim only when that process is not a gate. A claim
1122
+ whose owner process is dead, or whose content cannot be parsed, is replaced
1123
+ once and the run proceeds. Recovery and release serialize destructive claim
1124
+ changes with an exclusive `<claim-path>.mutation` directory. Recovery checks
1125
+ ownership again under that guard before removing a stale claim, so a
1126
+ replacement live owner remains protected even when three launches compete.
1127
+ If another mutation holds the guard, the new run refuses to start; retry after
1128
+ it finishes. An interrupted mutation can leave the guard behind. Remove that
1129
+ exact guard directory only after verifying that no gate is still using it;
1130
+ OAT does not automatically reclaim it. Liveness is a process-ID check, so a stale claim
1131
+ whose process ID was reused by an unrelated process still blocks until it is
1132
+ removed.
1133
+
1134
+ The gate exports its run directory to the reviewer child as
1135
+ `OAT_GATE_RUN_MARKER_DIR`, and every gate prefers that variable (when it is an
1136
+ absolute path) over the system temp directory. A nested gate therefore finds
1137
+ its parent's claim even when the reviewer runtime gives tool commands a
1138
+ different `TMPDIR`. Runs in separate checkouts or worktrees resolve to
1139
+ different project directories and never block each other.
1140
+
1141
+ The `ok`/`blocked` envelope and the `review_did_not_complete` envelope (child
1142
+ failure, timeout, refusal, or duplicate rejection) record the decision as
1143
+ `recursion`: `{ "decision": "none" }`,
1144
+ `{ "decision": "rejected", "matchedRunId": "<runId>" }`, or
1145
+ `{ "decision": "unchecked" }` when claim acquisition fails (including an
1146
+ unreadable claim or a held mutation guard). The gate warns, exits nonzero with
1147
+ `status: review_failed` and `outcome: review_did_not_complete`, and does not
1148
+ launch a reviewer, write a run marker, or append a project-log entry. Other envelopes keep
1149
+ their existing shape. JSON mode also writes a `gate-recursion` diagnostic line
1150
+ beside the `gate-run-marker` line; a rejection adds `matchedPid` and
1151
+ `claimPath`.
1055
1152
 
1056
1153
  After a review target times out, OAT re-scans the project reviews for exactly
1057
1154
  one artifact carrying that invocation's `oat_gate_run_id`. A recovered artifact
@@ -1085,6 +1182,7 @@ those artifacts; correct the project/run correlation and start a new gate run.
1085
1182
  | Passing artifact lost receive routing | handoff and `receiveEligible` fixture |
1086
1183
  | Passing review reported as a failed gate after a post-selection error | post-selection recovery cases plus snapshot-replacement, non-gate-marker, and foreign-target controls |
1087
1184
  | Transient index lock turned a completed review into a failed gate | index-lock retry cases plus persistent/transient classification, receipt fixture, and fresh-process recovery control |
1185
+ | A second gate ran for a project and scope already under review | claim unit cases plus running-gate, simultaneous-launch, and differing-`TMPDIR` nested fake-runtime cases |
1088
1186
 
1089
1187
  ## Current limits
1090
1188
 
@@ -1200,8 +1298,9 @@ skip tool-approval prompts, so an unattended reviewer can stall on such a
1200
1298
  prompt. On a trusted machine that runs gates unattended, add your own target
1201
1299
  with the permissions it needs, for example with `--layer user`.
1202
1300
 
1203
- A code review of a whole phase, a phase range, or the final result may run for
1204
- 30 minutes by default; other reviews get 15 minutes. OAT uses the first timeout
1301
+ A code review of a whole phase, a phase range, or the final result, and any
1302
+ artifact review, may run for 30 minutes by default; task-scoped code reviews
1303
+ get 15 minutes. OAT uses the first timeout
1205
1304
  it finds: the command's `--timeout-ms`, then the target's `timeoutMs`, then
1206
1305
  `workflow.gateTimeouts`, then the `OAT_GATE_EXEC_TIMEOUT_MS` environment
1207
1306
  variable, then the built-in default.
@@ -77,6 +77,7 @@ No gate is configured by default.
77
77
  | Final review | 1 reviewer | At most 3 review cycles, then the agent stops and asks you how to proceed |
78
78
  | Review at checkpoints | 1 extra review at each checkpoint before the last, when on | Off unless you answer yes to the auto-review question on the first implementation run or set `workflow.autoReviewAtHillCheckpoints`; autonomous runs always turn it on |
79
79
  | Gate (optional) | 1 reviewer run per gate | `maxAttempts`, 2 runs in total by default |
80
+ | Budget exhausted | 1 read-only complexity review | Runs once when a review cycle cap, the retry limit, or a gate's `maxAttempts` runs out, before the agent asks you how to proceed |
80
81
 
81
82
  OAT does not estimate prices. Cost depends on your provider's pricing and on
82
83
  your _dispatch policy_: the highest model tier OAT may use for subagents.
@@ -92,7 +93,8 @@ or High finding adds 2 runs, a fix and a new review, at most twice per phase, so
92
93
  the phases alone can reach 18. Not counted: the summary, documentation, and pull
93
94
  request steps, the project explainer and project recap, and the optional phase
94
95
  gate review (one extra reviewer run per selected phase). A blocked
95
- implementation gate also reruns the final review before the gate runs again.
96
+ implementation gate also reruns the final review before the gate runs again,
97
+ and any budget that runs out adds one read-only complexity-review run.
96
98
 
97
99
  ## What OAT does without asking
98
100
 
@@ -22,31 +22,38 @@ Each level has its own independent backlog, scratchpad, and active-idea config v
22
22
 
23
23
  Start in the home that matches how formed the thought is. Every home is a fine place to stop. Dashed arrows are optional moves.
24
24
 
25
- ```mermaid
26
- flowchart TD
27
- Q{"How formed is\nthe thought?"}
28
- BS["oat-brainstorm\n(may end inline\nor as a doc)"]
29
- SP["Scratchpad seed\n.oat/ideas/\nscratchpad.md"]
30
- ID["Idea\n.oat/ideas/{idea}/\ndiscovery.md"]
31
- SUM["Summarized idea\n.oat/ideas/{idea}/\nsummary.md"]
32
- BL["Backlog item\n.oat/repo/pjm/\nbacklog/items/"]
33
- PR["Project\n.oat/projects/\n{scope}/{slug}/"]
34
- SPLIT["Parent +\nchild projects"]
35
-
36
- Q -->|unsure| BS
37
- Q -->|seed| SP
38
- Q -->|explore| ID
39
- Q -->|scoped| BL
40
- Q -->|ready| PR
41
- BS -.-> ID
42
- BS -.-> BL
43
- BS -.->|"project(s)"| PR
44
- SP -.->|optional| ID
45
- ID -.->|optional| SUM
46
- SUM -.->|optional| PR
47
- BL -.->|optional| PR
48
- PR -.->|"optional\n(spec-driven)"| SPLIT
49
- ```
25
+ === "Diagram"
26
+
27
+ ![Where a thought starts depending on how formed it is: oat-brainstorm when unsure, a scratchpad seed, an idea, a backlog item, or a project, with optional moves between them and an optional spec-driven split into parent and child projects](/diagrams/ideas-lifecycle-light.svg)
28
+ ![Where a thought starts depending on how formed it is: oat-brainstorm when unsure, a scratchpad seed, an idea, a backlog item, or a project, with optional moves between them and an optional spec-driven split into parent and child projects](/diagrams/ideas-lifecycle-dark.svg)
29
+
30
+ === "Mermaid source"
31
+
32
+ ```mermaid
33
+ flowchart TD
34
+ Q{"How formed is\nthe thought?"}
35
+ BS["oat-brainstorm\n(may end inline\nor as a doc)"]
36
+ SP["Scratchpad seed\n.oat/ideas/\nscratchpad.md"]
37
+ ID["Idea\n.oat/ideas/{idea}/\ndiscovery.md"]
38
+ SUM["Summarized idea\n.oat/ideas/{idea}/\nsummary.md"]
39
+ BL["Backlog item\n.oat/repo/pjm/\nbacklog/items/"]
40
+ PR["Project\n.oat/projects/\n{scope}/{slug}/"]
41
+ SPLIT["Parent +\nchild projects"]
42
+
43
+ Q -->|unsure| BS
44
+ Q -->|seed| SP
45
+ Q -->|explore| ID
46
+ Q -->|scoped| BL
47
+ Q -->|ready| PR
48
+ BS -.-> ID
49
+ BS -.-> BL
50
+ BS -.->|"project(s)"| PR
51
+ SP -.->|optional| ID
52
+ ID -.->|optional| SUM
53
+ SUM -.->|optional| PR
54
+ BL -.->|optional| PR
55
+ PR -.->|"optional\n(spec-driven)"| SPLIT
56
+ ```
50
57
 
51
58
  Where to start:
52
59
 
@@ -21,7 +21,9 @@ When no closeout sequence is stored for the project, finish it in this order:
21
21
  4. Optionally, after you approve the finished work, `oat-project-retro` writes
22
22
  a retrospective, and `oat-project-retro-file` files its tracker items.
23
23
  5. `oat-project-complete` finalizes the project. You can run it before or after
24
- the pull request merges.
24
+ the pull request merges. Wave workflows that complete wrapper projects
25
+ without prompts use the
26
+ [`oat-project-complete-auto`](#oat-project-complete-auto) companion instead.
25
27
 
26
28
  Use `oat-project-pr-progress` instead of the final PR only to share one
27
29
  finished phase while later phases are still in progress. Use
@@ -536,3 +538,62 @@ fakes completion by editing a status field by hand.
536
538
  **Next step:** Confirm the reported completion and PR-update outcomes. Follow
537
539
  any explicit recovery action if the flow stopped. Merge and release remain
538
540
  separate operations under repository policy.
541
+
542
+ ## oat-project-complete-auto
543
+
544
+ The non-interactive companion to `oat-project-complete`. Workflow steps use it
545
+ to complete projects without prompts; a person completing a project uses
546
+ `oat-project-complete`. It decides every completion answer from config and
547
+ recorded project state, refuses whenever an answer would need a human, and
548
+ then follows the interactive skill's current steps.
549
+
550
+ **Invocation:** You do not invoke it. The skill is model-invocable but not
551
+ user-invocable, so it is never offered as a slash command. It runs only when a
552
+ workflow step names it with a `--requested-by` value: `oat-wave-execute`
553
+ closeout step 8 (one wave wrapper, completed before its merge handoff) and the
554
+ `oat-wave-program` program completion checkpoint (a batch of wrappers, after
555
+ your yes). Its `OAT_AUTONOMOUS` lifecycle route refuses until a lifecycle
556
+ skill names the companion, and none does today. An agent never runs it on its
557
+ own initiative, for example to clean up a finished but unarchived project.
558
+
559
+ **Prerequisites:** Needs `workflow.autonomousComplete: true`; without it the
560
+ skill stops with "interactive completion required" and writes nothing (see
561
+ [Configuration](../../../reference/configuration.md)). It also needs an
562
+ installed `oat-project-complete` with its scripts. Each project is then
563
+ preflighted on its own and refused, with the failing check named, when its
564
+ closeout sequence is incomplete, a task is incomplete, the final review has
565
+ not passed, the PR precondition is unmet, blockers are recorded, the project
566
+ log is ambiguous, or a completion question has no recorded answer (for
567
+ example `workflow.archiveOnComplete` unset on a shared or synced project). The
568
+ PR must be merged, or, for a step that completes before the merge, open and
569
+ tracked in the project's state.
570
+
571
+ **What it does without asking:** after every guard passes, it records a
572
+ completion-before-merge exception in `implementation.md` when the PR is still
573
+ open, points the active project at the project, and follows
574
+ `oat-project-complete` with the resolved answers: archive per
575
+ `workflow.archiveOnComplete`, a summary refresh when the summary is missing or
576
+ stale, and no retrospective. It never creates a PR, whatever
577
+ `workflow.createPrOnComplete` says; it updates the description of an existing
578
+ tracked PR as the interactive steps require. The completion commit body
579
+ records the requesting step (for a synced archive, the run report does). In batch mode a refused project stays deferred
580
+ while the others complete.
581
+
582
+ **Example scenario:** An autonomous wave run reaches closeout with the final
583
+ review passed and the wave PR open. Execute's step 8 runs the companion with
584
+ `--completion-before-merge`, which records the exception and completes and
585
+ archives the wrapper before the merge handoff. Had `workflow.autonomousComplete`
586
+ been off, the companion would refuse and the wave would defer the completion
587
+ tail to program close instead.
588
+
589
+ **Expected output:** A run report with one entry per project: `completed`,
590
+ `refused`, or `failed`, the refusing check (`opt-in`, `activation`, or
591
+ `preflight:<n>`), the PR and its state, any exception, the archive decision,
592
+ and the completion commit. The calling workflow records the outcome in its own
593
+ ledger.
594
+
595
+ **Next step:** For a refused project, fix the named check or complete it with
596
+ `oat-project-complete`. If a completion step fails after the project was
597
+ archived, a later companion run refuses because the project directory is gone;
598
+ resume with `oat-project-complete`, whose archive-resume branches finish the
599
+ tail.
@@ -38,21 +38,28 @@ and updates project state.
38
38
 
39
39
  Tasks execute serially in one worktree for the phase.
40
40
 
41
- ```mermaid
42
- flowchart LR
43
- Root["Project root\nlifecycle owner"] --> P["Phase implementer\none per phase"]
44
- P --> T1["Task 1\nbounded commit"]
45
- P --> T2["Task 2\nbounded commit"]
46
- P -. optional benefit-driven .-> N["Recon / specialist child"]
47
-
48
- P --> Report["Phase report\nverification + commits"]
49
- Report --> Root
50
- Root --> Ledger["Commit task ledger\npre-review bookkeeping"]
51
- Ledger --> R["Independent phase reviewer"]
52
- R -->|pass| Book["Review-outcome bookkeeping\n+ next phase"]
53
- R -->|blocking findings| Fix["Resume phase implementer\nbounded fix scope"]
54
- Fix --> R2["Fresh root-owned review round"]
55
- ```
41
+ === "Diagram"
42
+
43
+ ![Phase execution: the project root dispatches one phase implementer, which makes bounded task commits and optionally a recon or specialist child, then reports back; the root commits the task ledger, an independent reviewer passes the phase or sends blocking findings to a resumed implementer for a bounded fix and a fresh review round](/diagrams/implementation-execution-1-quick-look-light.svg)
44
+ ![Phase execution: the project root dispatches one phase implementer, which makes bounded task commits and optionally a recon or specialist child, then reports back; the root commits the task ledger, an independent reviewer passes the phase or sends blocking findings to a resumed implementer for a bounded fix and a fresh review round](/diagrams/implementation-execution-1-quick-look-dark.svg)
45
+
46
+ === "Mermaid source"
47
+
48
+ ```mermaid
49
+ flowchart LR
50
+ Root["Project root\nlifecycle owner"] --> P["Phase implementer\none per phase"]
51
+ P --> T1["Task 1\nbounded commit"]
52
+ P --> T2["Task 2\nbounded commit"]
53
+ P -. optional benefit-driven .-> N["Recon / specialist child"]
54
+
55
+ P --> Report["Phase report\nverification + commits"]
56
+ Report --> Root
57
+ Root --> Ledger["Commit task ledger\npre-review bookkeeping"]
58
+ Ledger --> R["Independent phase reviewer"]
59
+ R -->|pass| Book["Review-outcome bookkeeping\n+ next phase"]
60
+ R -->|blocking findings| Fix["Resume phase implementer\nbounded fix scope"]
61
+ Fix --> R2["Fresh root-owned review round"]
62
+ ```
56
63
 
57
64
  ## Ownership
58
65
 
@@ -67,8 +74,12 @@ The root:
67
74
  cleanliness;
68
75
  - selects and launches the phase reviewer;
69
76
  - owns retry limits, review disposition, worktree fan-in, HiLL checkpoints, and
70
- tracking-artifact commits; and
71
- - runs external phase gates and final closeout.
77
+ tracking-artifact commits;
78
+ - runs external phase gates and final closeout; and
79
+ - logs root judgment: breaks, surprises, workarounds, or notable successes,
80
+ including observations relayed from subagent reports, appended through
81
+ `oat project log append` at the next bookkeeping boundary rather than while
82
+ a child owns the worktree.
72
83
 
73
84
  The root does not implement phase tasks while an accepted phase launch owns
74
85
  that scope.
@@ -101,7 +112,9 @@ once, and directly executes each task in plan order. For every task it:
101
112
  6. verifies the commit, file boundary, tests, and clean worktree.
102
113
 
103
114
  After all tasks, it runs phase-wide verification and returns a compact report.
104
- It does not dispatch the phase reviewer or mutate general project bookkeeping.
115
+ It does not dispatch the phase reviewer, mutate general project bookkeeping,
116
+ or write the project log; phase implementers and other dispatched subagents
117
+ have no logging duties.
105
118
  While it owns the worktree, it may atomically update only the active phase's
106
119
  authoritative `oat_phase_recovery_policy.phase_attempt_usage.<pNN>` entry. The
107
120
  phase returns with a matching committed `completed` or `failed` terminal marker
@@ -443,21 +456,42 @@ The new dispatch record links to the original `request_id` through the existing
443
456
  `continuation_events` field. This is a new fix scope, not replacement of an
444
457
  accepted failed launch and not a new schema version.
445
458
 
446
- ```mermaid
447
- sequenceDiagram
448
- participant Root
449
- participant Phase as Phase implementer
450
- participant Review as Phase reviewer
451
-
452
- Root->>Phase: Phase Scope (request_id=A)
453
- Phase-->>Root: DONE + task commits
454
- Root->>Review: Review phase commit range
455
- Review-->>Root: Critical / High findings
456
- Root->>Phase: Resume A in fix mode
457
- Phase-->>Root: Fix commit + verification
458
- Root->>Review: New independent review round
459
- Review-->>Root: Pass
460
- ```
459
+ === "Diagram"
460
+
461
+ ![Fix continuity sequence: root sends the phase scope with request_id A, the implementer returns DONE with task commits, the reviewer returns Critical or High findings, root resumes request A in fix mode, the implementer returns a fix commit, and a new independent review round passes](/diagrams/implementation-execution-2-fix-continuity-light.svg)
462
+ ![Fix continuity sequence: root sends the phase scope with request_id A, the implementer returns DONE with task commits, the reviewer returns Critical or High findings, root resumes request A in fix mode, the implementer returns a fix commit, and a new independent review round passes](/diagrams/implementation-execution-2-fix-continuity-dark.svg)
463
+
464
+ === "Mermaid source"
465
+
466
+ ```mermaid
467
+ sequenceDiagram
468
+ participant Root
469
+ participant Phase as Phase implementer
470
+ participant Review as Phase reviewer
471
+
472
+ Root->>Phase: Phase Scope (request_id=A)
473
+ Phase-->>Root: DONE + task commits
474
+ Root->>Review: Review phase commit range
475
+ Review-->>Root: Critical / High findings
476
+ Root->>Phase: Resume A in fix mode
477
+ Phase-->>Root: Fix commit + verification
478
+ Root->>Review: New independent review round
479
+ Review-->>Root: Pass
480
+ ```
481
+
482
+ ### Budget exhaustion
483
+
484
+ The bounded loops end at fixed budgets: fix and re-review rounds at
485
+ `oat_orchestration_retry_limit`, phase review gate rounds at the same limit,
486
+ the final review at its three-cycle cap, and the configured exit gate at
487
+ `maxAttempts`. At each of these points the root dispatches one read-only
488
+ [complexity review](../reviews/index.md#complexity-review-at-budget-exhaustion) before
489
+ escalating, saves its report under `reviews/archived/`, and shows a decision
490
+ message with the stop reasons, the verdict, and the recommended disposition.
491
+ The operator chooses: extra cycles, proceed with override, corrective revision,
492
+ or **simplify**. The choice and the report path are recorded in
493
+ `implementation.md`. Agents never select the disposition; under
494
+ `OAT_AUTONOMOUS=1` the run stops with the same content in its boundary report.
461
495
 
462
496
  ## Parallel Phase Groups
463
497
 
@@ -119,6 +119,12 @@ entries without asking agents to edit `project-log.md`:
119
119
  - `oat-project-implement` records accepted subagent dispatches, STOP or park
120
120
  events, phase outcomes, and parallel-group merge results. These entries point
121
121
  to the corresponding `implementation.md` record instead of copying it.
122
+ - The `oat-project-implement` root also appends root-judgment entries when
123
+ breaks, surprises, workarounds, or notable successes surface, including
124
+ observations relayed from subagent reports. An entry that surfaces while a
125
+ child owns the worktree is queued and appended at the next bookkeeping
126
+ boundary. Phase implementers and other dispatched subagents have no logging
127
+ duties.
122
128
  - When `oat-project-implement` or `oat-project-review-provide` receives an
123
129
  artifact-mode review, the root workflow first consumes exactly one
124
130
  `**Reconnaissance:** attempted` or