@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
package/assets/NOTICES.md CHANGED
@@ -154,3 +154,51 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
154
154
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
155
155
  SOFTWARE.
156
156
  ```
157
+
158
+ ## tkstang/skills
159
+
160
+ **Source:** https://github.com/tkstang/skills/tree/main/skills/complexity-review
161
+ **License:** MIT
162
+ **Version referenced:** `complexity-review` 1.0.2 (commit `8767bce4819a2cae1a9f257de650a5ed0ae0afc1`)
163
+
164
+ ### `complexity-review` skill
165
+
166
+ Source files: `skills/complexity-review/SKILL.md` and
167
+ `skills/complexity-review/references/evidence-guide.md`.
168
+
169
+ Passages adapted and condensed into `.agents/docs/complexity-review-fallback.md`:
170
+ the core premise, contract restatement, simplest viable baseline, machinery
171
+ inventory, deletion test, evidence and recommendation scales, ledger columns,
172
+ verdict criteria, report sections, and reviewer stance. The OAT version adds
173
+ the budget-exhaustion triggers, the installed-skill probe, the read-only
174
+ dispatch contract, the REQUIRES-OPERATOR, open-finding, and disposition
175
+ sections, and the decision-message record.
176
+
177
+ Consumer OAT skills: `oat-project-implement`, `oat-project-quick-start`, and
178
+ `oat-project-review-receive` (each vendors the doc under `references/docs/`).
179
+
180
+ ### Upstream MIT license
181
+
182
+ ```text
183
+ MIT License
184
+
185
+ Copyright (c) 2026 Thomas Stang
186
+
187
+ Permission is hereby granted, free of charge, to any person obtaining a copy
188
+ of this software and associated documentation files (the "Software"), to deal
189
+ in the Software without restriction, including without limitation the rights
190
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
191
+ copies of the Software, and to permit persons to whom the Software is
192
+ furnished to do so, subject to the following conditions:
193
+
194
+ The above copyright notice and this permission notice shall be included in all
195
+ copies or substantial portions of the Software.
196
+
197
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
198
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
199
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
200
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
201
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
202
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
203
+ SOFTWARE.
204
+ ```
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.3.14"
3
+ "oatVersion": "0.3.16"
4
4
  }
@@ -62,6 +62,44 @@ Fenced code blocks with `mermaid` are rendered as diagrams.
62
62
  A[Read docs tree] --> B[Generate index]
63
63
  ```
64
64
 
65
+ Rendered Mermaid diagrams use the site palette. Click or tap one to open it
66
+ full screen at a legible size; on a phone, pan to see the rest. Press Escape,
67
+ the close button, or click again to close it.
68
+
69
+ ## Images and Diagram SVGs
70
+
71
+ Every Markdown image opens in a zoom view when clicked. SVG images open full
72
+ screen at a legible size, like Mermaid diagrams. Put images under
73
+ `public/` and link them with a root-relative path such as
74
+ `/diagrams/name.svg`; the site adds its base path.
75
+
76
+ Name a pair of files `<name>-light.<ext>` and `<name>-dark.<ext>` to show one
77
+ image per site theme. Place both images together; each is shown only in its
78
+ theme.
79
+
80
+ A diagram that needs to read well, especially on a phone, gets a hand-drawn SVG
81
+ pair next to its Mermaid source. Mermaid stays the source of truth: when you
82
+ change the Mermaid, update both SVGs in the same change.
83
+
84
+ === "Syntax"
85
+
86
+ ````text
87
+ === "Diagram"
88
+
89
+ ![What the diagram shows](/diagrams/name-light.svg)
90
+ ![What the diagram shows](/diagrams/name-dark.svg)
91
+
92
+ === "Mermaid source"
93
+
94
+ ```mermaid
95
+ flowchart LR
96
+ A[Read docs tree] --> B[Generate index]
97
+ ```
98
+ ````
99
+
100
+ The alt text describes what the diagram shows and claims nothing the Mermaid
101
+ does not.
102
+
65
103
  ## Tabs
66
104
 
67
105
  Tab groups use the existing tab transform syntax:
@@ -22,19 +22,26 @@ outcome of any particular run.
22
22
 
23
23
  ## Data flow
24
24
 
25
- ```mermaid
26
- flowchart TD
27
- F["Fixture template\ntools/smoke/fixture/"] --> PRE["Preflight\ninstall + auth + fixture + local oat"]
28
- PRE -->|blocked| STOP["Exit before provisioning"]
29
- PRE -->|ready| PREP["Prepare / provision\ndisposable worktree + isolated config + manifest"]
30
- PREP --> DRIVE["Drive\nper-harness protocol"]
31
- DRIVE --> AUTO["Automated: runner launches provider"]
32
- DRIVE --> OP["Operator: printed command + prompt"]
33
- AUTO --> COLLECT["Collect\nevidence bundle + report"]
34
- OP --> COLLECT
35
- COLLECT --> CLEAN["Cleanup\nmanifest-scoped"]
36
- COLLECT -.->|--keep| SKIP["Cleanup skipped"]
37
- ```
25
+ === "Diagram"
26
+
27
+ ![Smoke-test flow: fixture template, preflight (exit before provisioning if blocked), prepare and provision, drive automatically or by an operator, collect evidence, then manifest-scoped cleanup, skipped with --keep](/diagrams/smoke-testing-light.svg)
28
+ ![Smoke-test flow: fixture template, preflight (exit before provisioning if blocked), prepare and provision, drive automatically or by an operator, collect evidence, then manifest-scoped cleanup, skipped with --keep](/diagrams/smoke-testing-dark.svg)
29
+
30
+ === "Mermaid source"
31
+
32
+ ```mermaid
33
+ flowchart TD
34
+ F["Fixture template\ntools/smoke/fixture/"] --> PRE["Preflight\ninstall + auth + fixture + local oat"]
35
+ PRE -->|blocked| STOP["Exit before provisioning"]
36
+ PRE -->|ready| PREP["Prepare / provision\ndisposable worktree + isolated config + manifest"]
37
+ PREP --> DRIVE["Drive\nper-harness protocol"]
38
+ DRIVE --> AUTO["Automated: runner launches provider"]
39
+ DRIVE --> OP["Operator: printed command + prompt"]
40
+ AUTO --> COLLECT["Collect\nevidence bundle + report"]
41
+ OP --> COLLECT
42
+ COLLECT --> CLEAN["Cleanup\nmanifest-scoped"]
43
+ COLLECT -.->|--keep| SKIP["Cleanup skipped"]
44
+ ```
38
45
 
39
46
  Collection runs even when the drive stage fails, so a broken run still produces
40
47
  an evidence bundle before cleanup reclaims its resources.
@@ -66,25 +66,32 @@ skills.
66
66
 
67
67
  Diagram: bootstrap once, then analyze, approve and apply only agreed improvements.
68
68
 
69
- ```mermaid
70
- flowchart TD
71
- SETUP["Bootstrap once\nConfirm inputs, then oat docs init"]
72
- MD["Markdown\nValidate files and config"]
73
- APP["Docs app\nInstall and verify build"]
74
- AN["Analyze\nRead docs, write findings"]
75
- PLAN["Plan from findings\nNo docs writes yet"]
76
- Q{"Approve changes?"}
77
- APPLY["Apply approved items\nNew branch, verify, offer PR"]
78
- STOP["Skip all\nNo docs changed"]
79
- SETUP --> MD
80
- SETUP --> APP
81
- MD -.-> AN
82
- APP -.-> AN
83
- AN --> PLAN
84
- PLAN --> Q
85
- Q -->|"approved"| APPLY
86
- Q -->|"all skipped"| STOP
87
- ```
69
+ === "Diagram"
70
+
71
+ ![Bootstrap once with oat docs init into plain Markdown or a docs app, then analyze, plan, and either apply approved changes or stop when all are skipped](/diagrams/docs-workflows-light.svg)
72
+ ![Bootstrap once with oat docs init into plain Markdown or a docs app, then analyze, plan, and either apply approved changes or stop when all are skipped](/diagrams/docs-workflows-dark.svg)
73
+
74
+ === "Mermaid source"
75
+
76
+ ```mermaid
77
+ flowchart TD
78
+ SETUP["Bootstrap once\nConfirm inputs, then oat docs init"]
79
+ MD["Markdown\nValidate files and config"]
80
+ APP["Docs app\nInstall and verify build"]
81
+ AN["Analyze\nRead docs, write findings"]
82
+ PLAN["Plan from findings\nNo docs writes yet"]
83
+ Q{"Approve changes?"}
84
+ APPLY["Apply approved items\nNew branch, verify, offer PR"]
85
+ STOP["Skip all\nNo docs changed"]
86
+ SETUP --> MD
87
+ SETUP --> APP
88
+ MD -.-> AN
89
+ APP -.-> AN
90
+ AN --> PLAN
91
+ PLAN --> Q
92
+ Q -->|"approved"| APPLY
93
+ Q -->|"all skipped"| STOP
94
+ ```
88
95
 
89
96
  - **Setup, once.** `oat-docs-bootstrap` checks the repo without writing, asks
90
97
  you to confirm its inputs, then runs `oat docs init`. Plain Markdown setup validates authored files,
@@ -9,17 +9,24 @@ OAT combines a provider-sync layer, reusable skills and CLI tooling, and an opti
9
9
 
10
10
  ## Choose What to Adopt
11
11
 
12
- ```mermaid
13
- flowchart LR
14
- GOAL["What do you\nneed first?"] --> SYNC["Align coding tools\nProvider Sync"]
15
- GOAL --> SKILLS["Help with one task\nReusable Skills"]
16
- GOAL --> WORK["Resume longer work\nWorkflows"]
17
- GOAL --> DOCS["Maintain documentation\nMarkdown or a docs site"]
18
- SYNC -.-> LATER["Add another path\nwhenever useful"]
19
- SKILLS -.-> LATER
20
- WORK -.-> LATER
21
- DOCS -.-> LATER
22
- ```
12
+ === "Diagram"
13
+
14
+ ![Four independent starting points: align coding tools with Provider Sync, help with one task with reusable skills, resume longer work with workflows, or maintain documentation; add another path whenever useful](/diagrams/adoption-paths-light.svg)
15
+ ![Four independent starting points: align coding tools with Provider Sync, help with one task with reusable skills, resume longer work with workflows, or maintain documentation; add another path whenever useful](/diagrams/adoption-paths-dark.svg)
16
+
17
+ === "Mermaid source"
18
+
19
+ ```mermaid
20
+ flowchart LR
21
+ GOAL["What do you\nneed first?"] --> SYNC["Align coding tools\nProvider Sync"]
22
+ GOAL --> SKILLS["Help with one task\nReusable Skills"]
23
+ GOAL --> WORK["Resume longer work\nWorkflows"]
24
+ GOAL --> DOCS["Maintain documentation\nMarkdown or a docs site"]
25
+ SYNC -.-> LATER["Add another path\nwhenever useful"]
26
+ SKILLS -.-> LATER
27
+ WORK -.-> LATER
28
+ DOCS -.-> LATER
29
+ ```
23
30
 
24
31
  - **Provider Sync:** `oat init --scope project`, choose providers, then `oat sync --scope project`.
25
32
  - **Reusable skills:** `oat tools install --scope user`; no repository initialization is needed.
@@ -36,16 +43,23 @@ Continue with [Provider Sync](../provider-sync/index.md), [Tool Packs](tool-pack
36
43
 
37
44
  OAT keeps canonical assets in repo-controlled locations and projects provider-specific views from that source of truth. The canonical form is what you edit and review directly; provider views are synchronized outputs that let Claude Code, Cursor, Copilot, Gemini, and Codex consume the same intent in their native layouts.
38
45
 
39
- ```mermaid
40
- flowchart LR
41
- SKILLS[".agents/skills/"] --> OAT["oat sync"]
42
- AGENTS[".agents/agents/"] --> OAT
43
- RULES[".agents/rules/"] --> OAT
44
- OAT --> CLAUDE[".claude/"]
45
- OAT --> CURSOR[".cursor/"]
46
- OAT --> COPILOT[".github/"]
47
- OAT --> CODEX[".codex/"]
48
- ```
46
+ === "Diagram"
47
+
48
+ ![Canonical skills, agents and rules in .agents/ flow through oat sync into provider views under .claude/, .cursor/, .github/ and .codex/](/diagrams/provider-views-light.svg)
49
+ ![Canonical skills, agents and rules in .agents/ flow through oat sync into provider views under .claude/, .cursor/, .github/ and .codex/](/diagrams/provider-views-dark.svg)
50
+
51
+ === "Mermaid source"
52
+
53
+ ```mermaid
54
+ flowchart LR
55
+ SKILLS[".agents/skills/"] --> OAT["oat sync"]
56
+ AGENTS[".agents/agents/"] --> OAT
57
+ RULES[".agents/rules/"] --> OAT
58
+ OAT --> CLAUDE[".claude/"]
59
+ OAT --> CURSOR[".cursor/"]
60
+ OAT --> COPILOT[".github/"]
61
+ OAT --> CODEX[".codex/"]
62
+ ```
49
63
 
50
64
  Gemini CLI is a native read-only consumer; OAT does not generate a `.gemini/` view through sync.
51
65
 
@@ -98,6 +98,27 @@ Key behavior:
98
98
  failures, but skew present — apply reports
99
99
  `Manifest version refreshed; no content changes required.` instead of
100
100
  `No changes required.`, so a manifest write is never described as a no-op.
101
+ - A faithful copy-strategy entry whose manifest row records a stale
102
+ `contentHash` (a pre-framing legacy digest or a tampered value) is planned as
103
+ `skip` with the reason
104
+ `already in sync; restamp stale manifest content hash`, and `--json` plan
105
+ entries carry the verified digest as `restampContentHash`. Apply writes that
106
+ digest, so the next run is a no-op. Only a row that tracks the same provider
107
+ path that sync checked is restamped. Dry-run then reports
108
+ `Run without --dry-run to restamp N stale manifest content hashes.` instead
109
+ of `No changes to apply.`. Apply reports
110
+ `Manifest content hash restamped for N entries; no content changes required.`
111
+ (combined with the version-refresh sentence when both happen), or
112
+ `Manifest content hash restamped for N entries.` beside a partial failure.
113
+ - A copy-strategy canonical skill directory without `SKILL.md`, or agent
114
+ directory without `AGENT.md`, is planned as an `error` operation whose reason
115
+ names the missing file, instead of a copy that never verifies and is retried
116
+ on every run. It changes nothing and is not a planned operation; other
117
+ entries still sync. Apply reports it as a failed result (`status: failed`
118
+ with a `failure` in `--json` `operationResults`) and exits 1. Dry-run lists
119
+ it, warns `N entry cannot sync until its configuration error is fixed.`,
120
+ counts it in `summary.failed`, and still exits 0. Symlink strategy is
121
+ unaffected.
101
122
 
102
123
  `oat sync` is not the only command that replaces a manifest's producer version.
103
124
  `oat init`, `oat remove skill`, and `oat status` each capture the manifest's
@@ -15,23 +15,30 @@ This page explains how OAT remembers what it manages and how it distinguishes cl
15
15
 
16
16
  Diagram: canonical assets produce provider views and a manifest; status reports what changed and how to resolve it.
17
17
 
18
- ```mermaid
19
- flowchart TD
20
- CANON["Canonical assets\nEdit .agents/"]
21
- SYNC["oat sync\nGenerate views"]
22
- VIEWS["Provider views"]
23
- MANIFEST["Sync manifest"]
24
- STATUS["oat status\nInspect before resolving"]
25
- TRACKED["Tracked views\nin_sync / drifted / missing"]
26
- STRAY["Unmanaged files\nstray"]
27
- CANON --> SYNC
28
- SYNC --> VIEWS
29
- SYNC --> MANIFEST
30
- MANIFEST --> STATUS
31
- VIEWS --> STATUS
32
- STATUS --> TRACKED
33
- STATUS --> STRAY
34
- ```
18
+ === "Diagram"
19
+
20
+ ![You edit canonical assets in .agents/; oat sync generates provider views and the sync manifest; oat status reads both and reports tracked views as in_sync, drifted or missing, and unmanaged files as stray](/diagrams/sync-and-drift-light.svg)
21
+ ![You edit canonical assets in .agents/; oat sync generates provider views and the sync manifest; oat status reads both and reports tracked views as in_sync, drifted or missing, and unmanaged files as stray](/diagrams/sync-and-drift-dark.svg)
22
+
23
+ === "Mermaid source"
24
+
25
+ ```mermaid
26
+ flowchart TD
27
+ CANON["Canonical assets\nEdit .agents/"]
28
+ SYNC["oat sync\nGenerate views"]
29
+ VIEWS["Provider views"]
30
+ MANIFEST["Sync manifest"]
31
+ STATUS["oat status\nInspect before resolving"]
32
+ TRACKED["Tracked views\nin_sync / drifted / missing"]
33
+ STRAY["Unmanaged files\nstray"]
34
+ CANON --> SYNC
35
+ SYNC --> VIEWS
36
+ SYNC --> MANIFEST
37
+ MANIFEST --> STATUS
38
+ VIEWS --> STATUS
39
+ STATUS --> TRACKED
40
+ STATUS --> STRAY
41
+ ```
35
42
 
36
43
  - **What you edit.** Only the canonical files under `.agents/` (skills, agents,
37
44
  rules). `oat sync` reads them and writes provider views as symlinks or copies
@@ -162,7 +162,7 @@ Notable commands introduced in the current CLI surface:
162
162
  - `oat project validate-plan --project-path <path>` - validates `oat_plan_parallel_groups` metadata in `plan.md`; exits non-zero on invalid. Lite plans must contain exactly one phase, declare no parallel groups, and give every Validation Criteria bullet either a backticked command or a `manual:` instruction. See [Implementation Execution](../workflows/projects/execution/implementation-execution.md#parallel-phase-groups).
163
163
  - `oat project log append|check|synthesize|rollup` - manage the optional append-only project observation log: append validated judgment or structural entries, inspect grammar and synthesis status, complete end-of-run synthesis, and roll observations into `summary.md` plus the configured repository ledger. See [Project Log](../workflows/projects/execution/project-log.md).
164
164
  - `oat project set-mode` — deprecated no-op. Execution mode is no longer user-selectable; emits a deprecation warning and preserves the `--json` contract.
165
- - `oat gate review <prompt...>` - run a stateful, headless OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings. `--timeout-ms <milliseconds>` overrides target, `workflow.gateTimeouts`, environment, and scope defaults; accepted values are 1,000–14,400,000. Final/phase/range code reviews default to 30 minutes, while task code and artifact reviews default to 15 minutes. With `--json`, the result envelope on exit is the canonical completion signal: `status` is `ok` | `blocked` | `review_failed` | `artifact_missing` | `artifact_validation_failed` | `targeting_correlation_failed`, alongside `runId`, `generatedAt`, and `artifactPath` when available. `artifact_missing` means an accepted child exited cleanly without an artifact; fix synchronous review/artifact completion and start a new run, without review-receive or same-run remediation. For `targeting_correlation_failed`, correct the project declaration or artifact routing and start a new run; do not run review-receive even if an artifact path is present. For `artifact_validation_failed`, correct the artifact and rerun the gate until it revalidates as `ok` or `blocked`. Invoke `oat-project-review-receive` only when all three conditions hold: `status` is `ok` or `blocked`, `receiveEligible` is `true`, and `handoff` is non-null. `review_failed` may include structured `refusal`, `noOutputProduced`, and metadata-only `activityEvidence`; these diagnostic fields never make a run receive-eligible. After a timeout, a validated run-correlated artifact returns the ordinary `ok` or `blocked` envelope with additive `lateCompletion: true`. When post-selection work fails after the reviewer already committed a run-correlated artifact, the gate re-validates that selected snapshot through the same eligibility path rather than re-parsing whatever the path now holds, never re-dispatching, and returns the ordinary `ok` or `blocked` envelope with additive `postSelectionRecovery: true`; the artifact must still be present and unchanged for re-validation to succeed. When nothing recovers, `review_failed` names the failing sub-step in `postSelection.step` and its cause in `postSelection.code`. Duplicate run-ID matches or a changed artifact with a mismatched run ID retain `targeting_correlation_failed` and `receiveEligible: false`. Orchestrators should read the structured result rather than poll the filesystem. See [Workflow Gates](../workflows/advanced/workflow-gates.md).
165
+ - `oat gate review <prompt...>` - run a stateful, headless OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings. `--timeout-ms <milliseconds>` overrides target, `workflow.gateTimeouts`, environment, and scope defaults; accepted values are 1,000–14,400,000. Final/phase/range code reviews and artifact reviews default to 30 minutes, while task code reviews default to 15 minutes. With `--json`, the result envelope on exit is the canonical completion signal: `status` is `ok` | `blocked` | `review_failed` | `artifact_missing` | `artifact_validation_failed` | `targeting_correlation_failed`, alongside `runId`, `generatedAt`, and `artifactPath` when available. `artifact_missing` means an accepted child exited cleanly without an artifact; fix synchronous review/artifact completion and start a new run, without review-receive or same-run remediation. For `targeting_correlation_failed`, correct the project declaration or artifact routing and start a new run; do not run review-receive even if an artifact path is present. For `artifact_validation_failed`, correct the artifact and rerun the gate until it revalidates as `ok` or `blocked`. Invoke `oat-project-review-receive` only when all three conditions hold: `status` is `ok` or `blocked`, `receiveEligible` is `true`, and `handoff` is non-null. `review_failed` may include structured `refusal`, `noOutputProduced`, and metadata-only `activityEvidence`; these diagnostic fields never make a run receive-eligible. After a timeout, a validated run-correlated artifact returns the ordinary `ok` or `blocked` envelope with additive `lateCompletion: true`. When post-selection work fails after the reviewer already committed a run-correlated artifact, the gate re-validates that selected snapshot through the same eligibility path rather than re-parsing whatever the path now holds, never re-dispatching, and returns the ordinary `ok` or `blocked` envelope with additive `postSelectionRecovery: true`; the artifact must still be present and unchanged for re-validation to succeed. When nothing recovers, `review_failed` names the failing sub-step in `postSelection.step` and its cause in `postSelection.code`. Duplicate run-ID matches or a changed artifact with a mismatched run ID retain `targeting_correlation_failed` and `receiveEligible: false`. Orchestrators should read the structured result rather than poll the filesystem. See [Workflow Gates](../workflows/advanced/workflow-gates.md).
166
166
  - `oat gate route --expect-runtime <runtime> --expect-model <model> --can-await <true|false> --json` - return the headless child route (`inline`, `delegate-sync`, or `refuse`) from provider-marker and model evidence. Ambiguous or contradictory evidence never routes inline.
167
167
  - `oat gate exec <prompt...>` / `oat gate cross-provider-exec <prompt...>` - run a generic target prompt. `--timeout-ms` uses the same validated CLI override; untyped runs otherwise retain the legacy default path.
168
168
  - `oat gate target set <id> --invocation-model <model|provider-default> --invocation-reasoning-effort <effort|provider-default>` - persist optional configured invocation metadata alongside an exec target without inferring it from the target command.
@@ -203,6 +203,7 @@ The `workflow.*` namespace holds user-facing workflow preferences that let you a
203
203
  - `workflow.hillCheckpointDefault` (`every` | `final`) — default HiLL checkpoint behavior in `oat-project-implement`
204
204
  - `workflow.archiveOnComplete` (`boolean`) — skip the archive prompt in `oat-project-complete`
205
205
  - `workflow.createPrOnComplete` (`boolean`) — skip the "Open a PR?" prompt in `oat-project-complete`
206
+ - `workflow.autonomousComplete` (`boolean`, default `false`) — standing opt-in for the non-interactive `oat-project-complete-auto` companion; when `false` it stops with "interactive completion required"
206
207
  - `workflow.postImplementSequence` (legacy `wait` | `summary` | `pr` | `docs-pr`, or structured `{preApproval, postApproval}` arrays) — approval-aware post-implementation chaining
207
208
  - `workflow.reviewExecutionModel` (`subagent` | `inline` | `fresh-session`) — default final-review execution model
208
209
  - `workflow.autoReviewAtHillCheckpoints` (`boolean`) — auto-run the extra lifecycle review at HiLL checkpoints
@@ -272,7 +272,13 @@ packaged `assets/` directory next to the installed CLI. Setting a non-empty
272
272
  required bundle directory is empty in the packed tarball.
273
273
  - Produce a matching bundle with `bash packages/cli/scripts/bundle-assets.sh`
274
274
  while `OAT_ASSETS_DIR` points at the target directory (the script already
275
- honors the variable as its destination).
275
+ honors the variable as its destination). Because publishing replaces the
276
+ destination, the script accepts an override destination only when it is
277
+ absent, an empty directory, or a previous bundle (a directory holding
278
+ `bundle-metadata.json`); it refuses anything else, including a directory it
279
+ cannot list. The default `packages/cli/assets` destination is exempt. The
280
+ script also stops before copying when an inventory lookup comes back empty,
281
+ absolute, climbing with `..`, or naming the repository root.
276
282
 
277
283
  This is primarily a test-isolation and packaging seam; day-to-day use of the CLI
278
284
  does not need it.
@@ -294,7 +300,7 @@ must be integer milliseconds from `1,000` through `14,400,000`.
294
300
  "workflow": {
295
301
  "gateTimeouts": {
296
302
  "code": 2400000,
297
- "artifact": 900000
303
+ "artifact": 2400000
298
304
  },
299
305
  "gates": {
300
306
  "execTargets": {
@@ -712,6 +718,7 @@ Workflow preference keys live under the `workflow.*` namespace:
712
718
  - `workflow.hillCheckpointDefault` — `every` or `final`. Default HiLL checkpoint behavior in `oat-project-implement` (a HiLL, or human-in-the-loop, checkpoint is a stop for your review): pause after every phase or only after the last phase. When unset, the skill prompts. See [Choosing a checkpoint default](#choosing-a-checkpoint-default).
713
719
  - `workflow.archiveOnComplete` — boolean. Skip the "Archive after completion?" prompt in `oat-project-complete`. When unset, the skill prompts.
714
720
  - `workflow.createPrOnComplete` — boolean. Skip the "Open a PR?" prompt in `oat-project-complete`; when true, completion auto-triggers PR creation. When unset, the skill prompts.
721
+ - `workflow.autonomousComplete` — boolean, default `false`. Standing opt-in for `oat-project-complete-auto`, the non-interactive completion companion that runs only when a workflow names it as a step (today `oat-wave-execute` closeout step 8 and the `oat-wave-program` completion checkpoint). Its `OAT_AUTONOMOUS` lifecycle route refuses until a lifecycle skill names the companion, and none does today. When `false`, the companion stops with "interactive completion required" and writes nothing. The interactive `oat-project-complete` is unaffected.
715
722
  - `workflow.postImplementSequence` — legacy `wait`, `summary`, `pr`, or `docs-pr`, or `{ "preApproval": [...], "postApproval": [...] }`. Legacy values remain strings and keep their existing mappings. Structured arrays contain ordered, globally unique `summary`, `document`, `pr`, and `retro` steps. `retro` is post-approval only: a structured value containing it in `preApproval` is rejected. Pre-approval steps run after final review and before final HiLL approval; post-approval steps run only after that approval. Plain retrieval keeps legacy strings and prints structured values as compact JSON; `--json` returns the raw value.
716
723
  - `workflow.retro.filing.repo` — `issues`, `backlog`, or `none`; unset by default. Selects the repo-lane filing destination.
717
724
  - `workflow.retro.filing.upstream` — `issues` or `none`; unset by default. Selects the upstream-lane filing destination.
@@ -889,6 +896,7 @@ Other preferences **depend on per-repo configuration** to be safe. These should
889
896
  - `workflow.archiveOnComplete` — correctness depends on the repo's `archive.s3Uri` / `archive.s3SyncOnComplete` being configured. A user-level `true` would try to archive in repos that aren't set up for it.
890
897
  - `workflow.postImplementSequence` — correctness depends on `documentation.requireForProjectCompletion`. Setting `pr` at user level would foot-gun you in any repo that requires docs, because completion would later block on the docs gate while the PR is already open.
891
898
  - `workflow.createPrOnComplete` — this key is almost always redundant with `postImplementSequence`-driven flows. When it's meaningful, its correctness depends on the same per-repo docs and PR gates. Prefer shared scope, or omit it entirely and rely on `postImplementSequence: pr` or `docs-pr` to handle PR creation at the end of implement.
899
+ - `workflow.autonomousComplete` — authorizes unattended completion, which archives with the repo's `workflow.archiveOnComplete` and `archive.*` settings. It never creates a PR: it reads and reports `workflow.createPrOnComplete` without acting on it, and only updates the description of an already tracked PR. A user-level `true` would authorize autonomous completion in every repo, including ones whose archive settings were never chosen for it. Set it with `--shared` (or `--local` for one checkout) in each repo whose completion settings you have reviewed.
892
900
 
893
901
  **Cross-repo foot-gun example:** If you set `workflow.createPrOnComplete: true --user`, it applies to every repo you work on. In a repo with `documentation.requireForProjectCompletion: true` and `postImplementSequence: pr` (no docs step), running `oat-project-complete` would try to auto-create a PR, then immediately hit the docs gate and block you — leaving you with an open PR and a stuck completion. Your user-level preference silently asserted something that only holds in a specific shared-config shape.
894
902
 
@@ -15,26 +15,33 @@ This page is the compact contract for how project lifecycle state and review sta
15
15
 
16
16
  ## State Transition Map
17
17
 
18
- ```mermaid
19
- flowchart TD
20
- D["Discovery in progress"] --> RS["Ready for spec"]
21
- RS --> S["Spec in progress"] --> RD["Ready for design"]
22
- RD --> G["Design in progress"] --> RP["Ready for plan"]
23
- RP --> P["Plan in progress"] --> RI["Ready for implement"]
24
- RI --> I["Implement in progress"] --> IC["Implement complete"]
25
- IC --> PRO["PR open (pr_open)"]
26
- PRO --> REV["Revise (in_progress)"]
27
- REV --> PRO
28
- PRO --> C["Complete"]
29
-
30
- I --> RV["Review received"]
31
- RV --> FA["Fixes added"]
32
- FA --> FC["Fixes completed"]
33
- FC --> PASSED["Review passed"]
34
- PASSED --> I
35
-
36
- LITE["Lite: batched interview\n(no discovery/spec/design)"] -. entry point .-> P
37
- ```
18
+ === "Diagram"
19
+
20
+ ![Project state machine: discovery, spec, design, plan and implementation phases, then PR open and complete; a review loop returns to implementation, a revise loop runs from PR open and back, and lite enters at planning](/diagrams/project-state-machine-light.svg)
21
+ ![Project state machine: discovery, spec, design, plan and implementation phases, then PR open and complete; a review loop returns to implementation, a revise loop runs from PR open and back, and lite enters at planning](/diagrams/project-state-machine-dark.svg)
22
+
23
+ === "Mermaid source"
24
+
25
+ ```mermaid
26
+ flowchart TD
27
+ D["Discovery in progress"] --> RS["Ready for spec"]
28
+ RS --> S["Spec in progress"] --> RD["Ready for design"]
29
+ RD --> G["Design in progress"] --> RP["Ready for plan"]
30
+ RP --> P["Plan in progress"] --> RI["Ready for implement"]
31
+ RI --> I["Implement in progress"] --> IC["Implement complete"]
32
+ IC --> PRO["PR open (pr_open)"]
33
+ PRO --> REV["Revise (in_progress)"]
34
+ REV --> PRO
35
+ PRO --> C["Complete"]
36
+
37
+ I --> RV["Review received"]
38
+ RV --> FA["Fixes added"]
39
+ FA --> FC["Fixes completed"]
40
+ FC --> PASSED["Review passed"]
41
+ PASSED --> I
42
+
43
+ LITE["Lite: batched interview\n(no discovery/spec/design)"] -. entry point .-> P
44
+ ```
38
45
 
39
46
  The solid chain is the spec-driven progression. Lite enters at **Plan in
40
47
  progress** and never sets `oat_phase` to `discovery`, `spec`, or `design`;
@@ -145,6 +145,7 @@ for policy, storage, approval, and recovery details.
145
145
  - `oat-explainer-kit`
146
146
  - `oat-wrap-up`
147
147
  - `oat-project-complete`
148
+ - `oat-project-complete-auto`
148
149
  - `oat-wave-program`
149
150
  - `oat-wave-execute`
150
151
 
@@ -303,11 +303,14 @@ downgrades. Every claim a review kept below `verified` (an unresolved issue
303
303
  scoped to it or global to its review, a coverage finding that names it, or a
304
304
  non-affirming disposition) is listed under Review Downgrades with the review's
305
305
  own text, even when it is not a key claim, so a `complete` packet cannot hide a
306
- downgraded claim. A claim that a required review left without a disposition stays
307
- `unresolved`. Any claim below `verified` that an incorporated assurance review,
308
- core or thorough, listed in its brief but left without a disposition is listed
309
- there as not reviewed by that review; a claim outside a review's brief is never
310
- reported as its omission. A review's
306
+ downgraded claim. The required reviews are semantic, adversarial, and coverage,
307
+ plus redundant verification when the run achieves `thorough`; contradiction
308
+ resolution is never required. A claim that any required review left without a
309
+ disposition stays `unresolved`, so the run publishes an honest packet instead of
310
+ failing validation. Any claim below `verified` that an incorporated assurance
311
+ review, core or thorough, listed in its brief but left without a disposition is
312
+ listed there as not reviewed by that review; a claim outside a required review's
313
+ brief is listed as outside its brief, never as that review's omission. A review's
311
314
  `unresolvedIssues` entry may name the claim IDs it affects or apply to the
312
315
  whole review; a legacy plain-string entry is read as review-wide. A material
313
316
  coverage gap does not fail publication by itself: the claims it affects stay
@@ -75,6 +75,16 @@ A boundary is a successful fail-closed outcome, not permission to continue with
75
75
  a guessed answer. The run reports what stopped, the evidence, and the operator
76
76
  action needed to resume.
77
77
 
78
+ When a review or gate budget runs out (a review-cycle cap, the orchestration
79
+ retry limit, or a gate's `maxAttempts`), the run first dispatches the
80
+ [complexity review](../projects/reviews/index.md#complexity-review-at-budget-exhaustion)
81
+ and includes its decision-message content in the boundary report. The run never
82
+ selects the disposition, including **simplify**: the operator chooses when
83
+ resuming. A quick-start plan gate outcome is persisted as
84
+ `oat_quick_start_gate` (see
85
+ [Gate approval records](workflow-gates.md#gate-approval-records)); a failed
86
+ `prompt` gate is recorded as `blocked`, never as approved.
87
+
78
88
  The canonical autonomy contract and exhaustive gate inventory
79
89
  (`.agents/docs/autonomy-contract.md`, vendored into each consuming skill at
80
90
  `references/docs/autonomy-contract.md`) map each prompt to its autonomous
@@ -19,21 +19,28 @@ never gates a conclusion on its own.
19
19
 
20
20
  ## Layer map
21
21
 
22
- ```mermaid
23
- flowchart TD
24
- L1["Layer 1 — Policy resolution\nnamed ceiling · candidates · capped/uncapped mode"]
25
- L2["Layer 2 — Launcher-owned configured invocation\nroute · target/model/effort axes · selection reason ·\ncandidates considered · launch acceptance"]
26
- L3["Layer 3 — Runtime-observed identity (optional)\nproducer + model, only under trusted provenance"]
22
+ === "Diagram"
27
23
 
28
- L1 --> L2 --> L3
24
+ ![Three evidence layers: policy resolution, launcher-owned configured invocation, and optional runtime-observed identity; assertions check layers 1 and 2 and only record layer 3, which resolves to reported or not-reported](/diagrams/evidence-layers-light.svg)
25
+ ![Three evidence layers: policy resolution, launcher-owned configured invocation, and optional runtime-observed identity; assertions check layers 1 and 2 and only record layer 3, which resolves to reported or not-reported](/diagrams/evidence-layers-dark.svg)
29
26
 
30
- A["Assertions"] -->|assert on| L1
31
- A -->|assert on| L2
32
- A -.->|record only| L3
27
+ === "Mermaid source"
33
28
 
34
- L3 --> R["reported\n(both present + trusted provenance)"]
35
- L3 --> NR["not-reported\n(anything else normalizes here)"]
36
- ```
29
+ ```mermaid
30
+ flowchart TD
31
+ L1["Layer 1 — Policy resolution\nnamed ceiling · candidates · capped/uncapped mode"]
32
+ L2["Layer 2 — Launcher-owned configured invocation\nroute · target/model/effort axes · selection reason ·\ncandidates considered · launch acceptance"]
33
+ L3["Layer 3 — Runtime-observed identity (optional)\nproducer + model, only under trusted provenance"]
34
+
35
+ L1 --> L2 --> L3
36
+
37
+ A["Assertions"] -->|assert on| L1
38
+ A -->|assert on| L2
39
+ A -.->|record only| L3
40
+
41
+ L3 --> R["reported\n(both present + trusted provenance)"]
42
+ L3 --> NR["not-reported\n(anything else normalizes here)"]
43
+ ```
37
44
 
38
45
  Assertions bind to Layers 1 and 2. Layer 3 is recorded as `reported` or
39
46
  `not-reported`; its absence never invalidates Layer 2.