@open-agent-toolkit/cli 0.3.15 → 0.3.17
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.
- package/assets/NOTICES.md +48 -0
- package/assets/agents/oat-phase-implementer.md +26 -6
- package/assets/agents/oat-reviewer.md +51 -1
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/contributing/documentation.md +4 -0
- package/assets/docs/contributing/skills.md +3 -1
- package/assets/docs/getting-started/bootstrap.md +1 -1
- package/assets/docs/getting-started/index.md +0 -4
- package/assets/docs/getting-started/tool-packs.md +0 -7
- package/assets/docs/provider-sync/commands.md +21 -0
- package/assets/docs/reference/cli-reference.md +44 -2
- package/assets/docs/reference/config-and-local-state.md +11 -2
- package/assets/docs/reference/configuration.md +10 -2
- package/assets/docs/reference/project-artifacts.md +43 -8
- package/assets/docs/skills/index.md +1 -0
- package/assets/docs/skills/recon.md +8 -5
- package/assets/docs/skills/repo-improve.md +9 -7
- package/assets/docs/workflows/advanced/autonomy.md +50 -0
- package/assets/docs/workflows/advanced/workflow-gates.md +109 -10
- package/assets/docs/workflows/approvals-and-automation.md +3 -1
- package/assets/docs/workflows/backlog-and-planning/backlog-lifecycle.md +25 -24
- package/assets/docs/workflows/backlog-and-planning/remote-project-management.md +0 -7
- package/assets/docs/workflows/ideas/lifecycle.md +2 -7
- package/assets/docs/workflows/projects/closeout/closeout-skills.md +62 -1
- package/assets/docs/workflows/projects/execution/implementation-execution.md +23 -3
- package/assets/docs/workflows/projects/execution/project-log.md +6 -0
- package/assets/docs/workflows/projects/lifecycle.md +7 -0
- package/assets/docs/workflows/projects/reviews/index.md +63 -1
- package/assets/docs/workflows/projects/reviews/review-flavors.md +8 -0
- package/assets/docs/workflows/waves/wave-workflows.md +11 -3
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-agent-instructions-apply/SKILL.md +14 -4
- package/assets/skills/oat-brainstorm/SKILL.md +17 -13
- package/assets/skills/oat-docs-apply/SKILL.md +13 -3
- package/assets/skills/oat-doctor/SKILL.md +11 -1
- package/assets/skills/oat-explainer-kit/SKILL.md +1 -1
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +6 -3
- package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
- package/assets/skills/oat-pjm-update-repo-reference/SKILL.md +28 -3
- package/assets/skills/oat-project-autonomous/SKILL.md +60 -5
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +210 -165
- package/assets/skills/oat-project-capture/SKILL.md +7 -3
- package/assets/skills/oat-project-complete/SKILL.md +39 -34
- package/assets/skills/oat-project-complete/scripts/execute-synced-archive-entry.mjs +106 -28
- package/assets/skills/oat-project-complete/scripts/parse-synced-archive-resume-fields.mjs +30 -3
- package/assets/skills/oat-project-complete-auto/SKILL.md +388 -0
- package/assets/skills/oat-project-design/SKILL.md +12 -9
- package/assets/skills/oat-project-discover/SKILL.md +8 -4
- package/assets/skills/oat-project-document/SKILL.md +14 -5
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-implement/SKILL.md +6 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +34 -7
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-implement/references/docs/complexity-review-fallback.md +262 -0
- package/assets/skills/oat-project-implement/references/docs/gate-approval-record.md +80 -0
- package/assets/skills/oat-project-implement/references/phase-execution.md +38 -6
- package/assets/skills/oat-project-import-plan/SKILL.md +20 -6
- package/assets/skills/oat-project-lite/SKILL.md +7 -5
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-new/SKILL.md +6 -2
- package/assets/skills/oat-project-next/SKILL.md +19 -2
- package/assets/skills/oat-project-next/references/docs/gate-approval-record.md +80 -0
- package/assets/skills/oat-project-plan/SKILL.md +14 -6
- package/assets/skills/oat-project-pr-final/SKILL.md +4 -3
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-progress/SKILL.md +27 -1
- package/assets/skills/oat-project-progress/references/docs/gate-approval-record.md +80 -0
- package/assets/skills/oat-project-promote-spec-driven/SKILL.md +7 -3
- package/assets/skills/oat-project-quick-start/SKILL.md +47 -14
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +210 -165
- package/assets/skills/oat-project-quick-start/references/docs/complexity-review-fallback.md +262 -0
- package/assets/skills/oat-project-quick-start/references/docs/gate-approval-record.md +80 -0
- package/assets/skills/oat-project-reconcile/SKILL.md +8 -4
- package/assets/skills/oat-project-retro/SKILL.md +1 -1
- package/assets/skills/oat-project-retro/references/apply-procedure.md +6 -6
- package/assets/skills/oat-project-retro-file/SKILL.md +7 -3
- package/assets/skills/oat-project-review-provide/SKILL.md +23 -4
- package/assets/skills/oat-project-review-provide-remote/SKILL.md +19 -1
- package/assets/skills/oat-project-review-receive/SKILL.md +57 -14
- package/assets/skills/oat-project-review-receive/references/docs/complexity-review-fallback.md +262 -0
- package/assets/skills/oat-project-review-receive-remote/SKILL.md +7 -3
- package/assets/skills/oat-project-revise/SKILL.md +13 -5
- package/assets/skills/oat-project-spec/SKILL.md +8 -4
- package/assets/skills/oat-project-summary/SKILL.md +11 -7
- package/assets/skills/oat-repo-knowledge-index/SKILL.md +54 -20
- package/assets/skills/oat-repo-knowledge-index/scripts/refresh-owned.mjs +118 -0
- package/assets/skills/oat-review-provide/SKILL.md +7 -3
- package/assets/skills/oat-review-receive-remote/SKILL.md +14 -4
- package/assets/skills/oat-wave-execute/SKILL.md +72 -38
- package/assets/skills/oat-wave-execute/assets/wrapper-plan-template.md +16 -2
- package/assets/skills/oat-wave-program/SKILL.md +15 -6
- package/assets/skills/oat-worktree-bootstrap-auto/SKILL.md +45 -17
- package/assets/skills/oat-wrap-up/SKILL.md +9 -3
- package/assets/skills/oat-wrap-up/references/report-template.md +1 -1
- package/assets/skills/recon/SKILL.md +1 -1
- package/assets/skills/recon/references/packet-contract.md +18 -3
- package/assets/skills/recon/scripts/lib/contracts.mjs +16 -2
- package/assets/skills/recon/scripts/reconcile-ledger.mjs +20 -10
- package/assets/skills/recon/scripts/render-packet.mjs +31 -3
- package/assets/skills/recon/scripts/validate-packet.mjs +5 -5
- package/assets/templates/pjm-agents.md +38 -8
- package/assets/templates/repo-agents.md +5 -0
- package/assets/templates/repo-readme.md +5 -0
- package/assets/templates/state.md +7 -0
- package/dist/commands/backlog/archive.d.ts +3 -0
- package/dist/commands/backlog/archive.d.ts.map +1 -1
- package/dist/commands/backlog/archive.js +63 -26
- package/dist/commands/backlog/index.d.ts.map +1 -1
- package/dist/commands/backlog/index.js +3 -0
- package/dist/commands/backlog/rewrite-references.d.ts +5 -0
- package/dist/commands/backlog/rewrite-references.d.ts.map +1 -1
- package/dist/commands/backlog/rewrite-references.js +39 -1
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +13 -0
- package/dist/commands/gate/index.d.ts +5 -0
- package/dist/commands/gate/index.d.ts.map +1 -1
- package/dist/commands/gate/index.js +270 -9
- package/dist/commands/init/index.d.ts.map +1 -1
- package/dist/commands/init/index.js +1 -0
- package/dist/commands/internal/commit-paths.d.ts +3 -0
- package/dist/commands/internal/commit-paths.d.ts.map +1 -0
- package/dist/commands/internal/commit-paths.js +31 -0
- package/dist/commands/internal/index.d.ts.map +1 -1
- package/dist/commands/internal/index.js +2 -0
- package/dist/commands/pjm/init.d.ts.map +1 -1
- package/dist/commands/pjm/init.js +37 -8
- package/dist/commands/project/archive/archive-utils.d.ts +6 -3
- package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
- package/dist/commands/project/archive/archive-utils.js +510 -104
- package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
- package/dist/commands/project/archive/push-runner.js +1 -0
- package/dist/commands/project/log/append.d.ts +2 -3
- package/dist/commands/project/log/append.d.ts.map +1 -1
- package/dist/commands/project/log/append.js +55 -101
- package/dist/commands/project/migrate/index.d.ts +1 -2
- package/dist/commands/project/migrate/index.d.ts.map +1 -1
- package/dist/commands/project/migrate/index.js +8 -2
- package/dist/commands/project/new/scaffold.d.ts.map +1 -1
- package/dist/commands/project/new/scaffold.js +4 -4
- package/dist/commands/project/promote/promote.d.ts +8 -0
- package/dist/commands/project/promote/promote.d.ts.map +1 -1
- package/dist/commands/project/promote/promote.js +37 -6
- package/dist/commands/project/status.d.ts.map +1 -1
- package/dist/commands/project/status.js +3 -0
- package/dist/commands/project/sync/ref-sync.d.ts +12 -1
- package/dist/commands/project/sync/ref-sync.d.ts.map +1 -1
- package/dist/commands/project/sync/ref-sync.js +347 -23
- package/dist/commands/shared/exact-path-commit.d.ts +32 -0
- package/dist/commands/shared/exact-path-commit.d.ts.map +1 -0
- package/dist/commands/shared/exact-path-commit.js +691 -0
- package/dist/commands/shared/frontmatter.d.ts +1 -1
- package/dist/commands/shared/frontmatter.d.ts.map +1 -1
- package/dist/commands/shared/frontmatter.js +1 -0
- package/dist/commands/state/generate.d.ts +1 -1
- package/dist/commands/state/generate.d.ts.map +1 -1
- package/dist/commands/state/generate.js +87 -8
- package/dist/commands/sync/apply.d.ts.map +1 -1
- package/dist/commands/sync/apply.js +31 -5
- package/dist/commands/sync/dry-run.d.ts.map +1 -1
- package/dist/commands/sync/dry-run.js +28 -11
- package/dist/commands/sync/sync.utils.d.ts +13 -0
- package/dist/commands/sync/sync.utils.d.ts.map +1 -1
- package/dist/commands/sync/sync.utils.js +21 -1
- package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-manifest.js +1 -0
- package/dist/config/oat-config.d.ts +1 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +3 -0
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +1 -0
- package/dist/drift/detector.js +6 -6
- package/dist/engine/compute-plan.d.ts.map +1 -1
- package/dist/engine/compute-plan.js +87 -2
- package/dist/engine/engine.types.d.ts +10 -1
- package/dist/engine/engine.types.d.ts.map +1 -1
- package/dist/engine/engine.types.js +4 -0
- package/dist/engine/execute-plan.d.ts.map +1 -1
- package/dist/engine/execute-plan.js +42 -5
- package/dist/engine/managed-copy-hash.d.ts +4 -3
- package/dist/engine/managed-copy-hash.d.ts.map +1 -1
- package/dist/engine/managed-copy-hash.js +4 -3
- package/dist/fs/assets.d.ts.map +1 -1
- package/dist/fs/assets.js +7 -1
- package/dist/manifest/hash.d.ts +8 -10
- package/dist/manifest/hash.d.ts.map +1 -1
- package/dist/ui/output.js +1 -1
- package/dist/validation/skills.d.ts.map +1 -1
- package/dist/validation/skills.js +151 -11
- package/package.json +3 -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,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-phase-implementer
|
|
3
|
-
version: 1.1.
|
|
3
|
+
version: 1.1.7
|
|
4
4
|
description: Implements one plan phase end-to-end, commits each task separately, self-checks between tasks, and handles bounded review fixes when resumed by oat-project-implement.
|
|
5
5
|
tools: Read, Write, Edit, Bash, Grep, Glob, Task
|
|
6
6
|
color: cyan
|
|
@@ -142,11 +142,23 @@ replaces every task and phase verification command below.
|
|
|
142
142
|
Artifact and recovery-ledger bookkeeping commits must first resolve scope with
|
|
143
143
|
`oat project scope "$PROJECT_PATH" --format value`. A `synced` project uses
|
|
144
144
|
`oat project push` with the original bookkeeping message; other scopes keep the
|
|
145
|
-
|
|
145
|
+
shared `oat internal commit-paths --identity "$COMMIT_IDENTITY" --message "$BOOKKEEPING_MESSAGE" -- "${BOOKKEEPING_OWNED_FILES[@]}"` command with exact producer-owned files. Set a unique operation identity before the first attempt and retain it and the literal file list through retries. Scope resolution fails
|
|
146
146
|
closed. A nonzero project-push exit stops bookkeeping until the reported
|
|
147
147
|
recovery is resolved and the push is retried. Planned code task commits such as
|
|
148
148
|
`feat(pNN-tNN)` are unchanged.
|
|
149
149
|
|
|
150
|
+
## Recovery Capacity Disclosure
|
|
151
|
+
|
|
152
|
+
Report the supplied effective phase limit, prior durable usage, remaining
|
|
153
|
+
capacity and reconciled pending attempt in phase progress and boundary reports.
|
|
154
|
+
The root owns policy resolution and its source/override disclosure; use the
|
|
155
|
+
brief and authoritative `state.md` ledger, never a guessed local counter.
|
|
156
|
+
Capacity is not permission: failed-attempt terminality, eligibility/proof,
|
|
157
|
+
exact-target continuity and repository authority still apply when allowance
|
|
158
|
+
remains. Recovery events, warnings and route retries are distinct from reserved
|
|
159
|
+
attempt usage. Do not interpret remaining capacity as continue-after-failure
|
|
160
|
+
authority.
|
|
161
|
+
|
|
150
162
|
## Prevention and Post-Commit Recovery
|
|
151
163
|
|
|
152
164
|
Prevention is the first recovery control. Before every planned task commit:
|
|
@@ -431,11 +443,19 @@ For every task:
|
|
|
431
443
|
prevention does not consume a recovery attempt.
|
|
432
444
|
6. Self-review requirements, behavioral tests, scope, and accidental changes.
|
|
433
445
|
7. Fix any issue before committing.
|
|
434
|
-
8. Create exactly one task commit using `commit_convention
|
|
446
|
+
8. Create exactly one task commit using `commit_convention` through the shared
|
|
447
|
+
`oat internal commit-paths --identity "${ORIGINAL_REQUEST_ID}:${TASK_ID}" --message "$TASK_COMMIT_MESSAGE" -- "${TASK_OWNED_FILES[@]}"` primitive.
|
|
448
|
+
Before task edits, initialize `TASK_OWNED_FILES=()` and append each exact
|
|
449
|
+
created, modified or removed file at its producer, including both rename
|
|
450
|
+
sides. Retain the list and request/task identity for retries; never discover
|
|
451
|
+
ownership from the staged index or pass directory pathspecs. Verify the
|
|
452
|
+
command's help first; if missing, stop and update the CLI with no alternate
|
|
453
|
+
Git commit route. A blocked/failed result stops with its receipt/diagnostic.
|
|
435
454
|
In a smoke child, source preflight owns repository-wide hook validation and
|
|
436
|
-
the child intentionally has no dependency install.
|
|
437
|
-
|
|
438
|
-
|
|
455
|
+
the child intentionally has no dependency install. Keep that launcher-owned
|
|
456
|
+
hook policy on the same primitive using per-process
|
|
457
|
+
`env GIT_CONFIG_COUNT=1 GIT_CONFIG_KEY_0=core.hooksPath GIT_CONFIG_VALUE_0=/dev/null oat internal commit-paths ...`;
|
|
458
|
+
do not mutate Git config or use `--no-verify`. Ordinary tasks keep hooks enabled.
|
|
439
459
|
9. Verify:
|
|
440
460
|
- HEAD is exactly one commit after `PRE_TASK_HEAD`;
|
|
441
461
|
- the commit changes only files in the effective task boundary, which is
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-reviewer
|
|
3
|
-
version: 1.2.
|
|
3
|
+
version: 1.2.11
|
|
4
4
|
description: Unified reviewer for OAT projects - mode-aware verification of requirements/design alignment and code quality. Writes a review artifact to disk by default, or returns structured findings in-memory when dispatched in structured-output mode.
|
|
5
5
|
tools: Read, Bash, Grep, Glob, Write, Task
|
|
6
6
|
color: yellow
|
|
@@ -201,6 +201,49 @@ Strategy`, check whether the evidence matches the declared strategy, covers
|
|
|
201
201
|
- Code that doesn't map to any requirement
|
|
202
202
|
- If significant: add to High findings (potential scope creep)
|
|
203
203
|
|
|
204
|
+
### Step 3.5: Probe Changed Consequential Boundaries
|
|
205
|
+
|
|
206
|
+
For code reviews, inventory the changed trust, input, size and limit boundaries
|
|
207
|
+
within the resolved review scope. For each boundary, name a credible failure
|
|
208
|
+
and a focused probe with an independent expected outcome. Include assurance
|
|
209
|
+
contracts expressed in executable guidance when that guidance is the changed
|
|
210
|
+
public boundary. Do not manufacture a probe for unchanged behavior or a
|
|
211
|
+
merely cosmetic edit.
|
|
212
|
+
|
|
213
|
+
Run applicable focused probes within existing containment and write authority;
|
|
214
|
+
preserve review independence and never mutate product files to repair a
|
|
215
|
+
finding. Record the exact command, input or fixture/artifact provenance,
|
|
216
|
+
expected categorical result, observed categorical result and any concrete
|
|
217
|
+
execution limitation. A passing suite alone cannot substantiate a changed
|
|
218
|
+
consequential guarantee. Inspect a failing control that exercises the claimed
|
|
219
|
+
bad state and an accepted control that shows the valid state still works.
|
|
220
|
+
|
|
221
|
+
When execution is unavailable, independently read and inspect implementer
|
|
222
|
+
probe artifacts, exact commands, the recorded failing and accepted controls,
|
|
223
|
+
and their correspondence to the reviewed code and immutable revision. Exact
|
|
224
|
+
commands, artifact provenance and the limitation must be recorded. This may
|
|
225
|
+
satisfy the evidence obligation when the controls credibly substantiate the
|
|
226
|
+
guarantee; an unsupported implementer assertion is insufficient. A limitation
|
|
227
|
+
by itself is not evidence of correctness.
|
|
228
|
+
|
|
229
|
+
Missing consequential evidence requires a blocking finding under the existing
|
|
230
|
+
severity model. Use the
|
|
231
|
+
existing Critical/High severity model for the guarantee's risk, name the
|
|
232
|
+
unresolved claim and smallest missing proof, and do not report that guarantee
|
|
233
|
+
as accepted. Do not add a new severity, gate status or acceptance exception.
|
|
234
|
+
|
|
235
|
+
| Evidence case | Review disposition |
|
|
236
|
+
| -------------------------------------------------------------- | -------------------------------------------------------------------------- |
|
|
237
|
+
| Consequential guarantee, absent evidence | Blocking finding; guarantee unresolved |
|
|
238
|
+
| Inspected failing + accepted controls, reviewer cannot execute | Eligible evidence when independently verified; record execution limitation |
|
|
239
|
+
| Unsupported implementer assertion | Blocking finding; assertion cannot substantiate the guarantee |
|
|
240
|
+
| Docs-only, no credible changed boundary | No manufactured probe obligation; use conservation review |
|
|
241
|
+
|
|
242
|
+
Keep scope proportional: no new harness, broad testing campaign or
|
|
243
|
+
model-efficacy claim. Docs-only changes with no credible changed boundary have
|
|
244
|
+
no manufactured probe obligation. Preserve containment, independence,
|
|
245
|
+
dispatch controls and the existing output schemas.
|
|
246
|
+
|
|
204
247
|
### Step 4: Verify Artifact Quality
|
|
205
248
|
|
|
206
249
|
This step applies to **artifact reviews** only.
|
|
@@ -487,6 +530,10 @@ worker claims, and root-inline coverage}
|
|
|
487
530
|
|
|
488
531
|
## Verification Commands
|
|
489
532
|
|
|
533
|
+
{Changed-boundary probes: exact commands, input/artifact provenance,
|
|
534
|
+
expected/observed categorical outcomes and limitations; distinguish executed
|
|
535
|
+
commands, suggested reruns and independently inspected evidence.}
|
|
536
|
+
|
|
490
537
|
Run these to verify the implementation:
|
|
491
538
|
|
|
492
539
|
```bash
|
|
@@ -559,6 +606,9 @@ interface StructuredFindings {
|
|
|
559
606
|
- `severity` MUST be one of the four enum values, mapped from the same Critical/High/Medium/Low buckets as Step 7.
|
|
560
607
|
- `file` and `line` MUST both be set or both be `null`. A finding with a concrete location sets both; a reviewer-level finding without a specific location sets both to `null` and is conveyed via the `summary` / its own `body`, not as an inline location.
|
|
561
608
|
- `id` prefixes follow the existing convention (`C`/`H`/`M`/`L`) and are stable within a single dispatch — no renumbering.
|
|
609
|
+
- Use existing `summary` and finding bodies for compact probe results and limitations,
|
|
610
|
+
including independently inspected control provenance. Keep exact repeatable
|
|
611
|
+
commands in `verification_commands`; add no fields to `StructuredFindings`.
|
|
562
612
|
- `verification_commands` carries what Step 8's "Verification Commands" section would have carried, as an array of command strings.
|
|
563
613
|
|
|
564
614
|
Default behavior is unaffected: when `oat_output_mode` is absent or set to anything other than `structured`, follow Steps 8-9 and write the artifact exactly as before. Analysis reviews MUST honor `oat_output_mode: structured` whenever supplied by an auto-review loop: return the `StructuredFindings` object and write no artifact.
|
|
@@ -52,6 +52,10 @@ Documentation should ship with the code it explains. This page covers the core d
|
|
|
52
52
|
## Authoring Expectations
|
|
53
53
|
|
|
54
54
|
- Keep docs aligned with the current repo behavior and current command surface.
|
|
55
|
+
- Give each Markdown or MDX page exactly one document H1. `pnpm docs:validate`
|
|
56
|
+
reports the file and count when a page has zero or multiple H1s. ATX and
|
|
57
|
+
Setext headings count, including headings inside blockquotes or lists;
|
|
58
|
+
frontmatter and fenced code do not.
|
|
55
59
|
- Prefer cross-links over duplicated conceptual content.
|
|
56
60
|
- Use `oat-docs-authoring` for targeted OAT/Fumadocs docs edits; it delegates
|
|
57
61
|
universal page-quality guidance to `authoring-docs` and keeps local
|
|
@@ -238,7 +238,9 @@ the bundle strips — requires bumping that skill's `metadata.version` in the
|
|
|
238
238
|
same PR, one bump per changed skill in the final PR diff, even if the skill was
|
|
239
239
|
edited multiple times on the branch. A change to a skill's `scripts/` or
|
|
240
240
|
`references/` therefore needs the bump just as an edit to `SKILL.md` does: both
|
|
241
|
-
ship to every `oat tools install` consumer.
|
|
241
|
+
ship to every `oat tools install` consumer. Changes under `.agents/docs/`
|
|
242
|
+
also require a bump for every skill that vendors the changed document through
|
|
243
|
+
a file or directory symlink, because bundling follows those links. Changing a canonical agent role
|
|
242
244
|
under `.agents/agents/*.md` requires bumping that file's top-level `version:`;
|
|
243
245
|
agent roles deliberately keep the top-level field, so the gate accepts either
|
|
244
246
|
declaration shape and never demands `metadata.version` of them. The gate reads
|
|
@@ -50,7 +50,7 @@ After core initialization completes, `oat init` can enter an interactive guided
|
|
|
50
50
|
- after placement is chosen, repository `AGENTS.md` guidance is a separate opt-in. Accepting creates the root file with the managed `OAT tools` section when it is absent, and appends that section to an existing file or contained symlink target that lacks it, with one append-only write. An existing file is never replaced: when the section exists but differs, OAT prints a repository-relative, copy-pasteable managed-block patch instead. Declining leaves `AGENTS.md` unchanged
|
|
51
51
|
- installing `project-management` installs the capability only. Adopting it for this repository is a third, separate choice made with `oat pjm init` — see [Install vs. initialize](tool-packs.md#install-vs-initialize)
|
|
52
52
|
2. **Local paths** — multi-select from default gitignored artifact paths (analysis, PR, reviews, ideas). Pre-existing paths are pre-checked; only new paths are added.
|
|
53
|
-
3. **Documentation** — detect or enter docs metadata for the repo when documentation exists.
|
|
53
|
+
3. **Documentation** — detect or enter docs metadata for the repo when documentation exists. For existing plain documentation, choose **Plain Markdown** in the manual tooling menu and enter its docs root. Guided setup saves `documentation.tooling: "markdown"` and the normalized `documentation.root` while preserving the other documentation/config settings. Fumadocs remains the manual menu default; MkDocs, Docusaurus, VitePress and Nextra remain available. This choice does not add automatic Markdown detection or scaffold a framework.
|
|
54
54
|
4. **Provider sync** — sync provider project views via `oat sync --scope project`.
|
|
55
55
|
5. **Summary** — reports what was configured: active providers, tool packs status, local paths added/existing, and provider sync status. Includes suggested next steps.
|
|
56
56
|
|
|
@@ -55,10 +55,6 @@ view is the file or link that tool reads.
|
|
|
55
55
|
available it falls back to the best available reviewer, which can be from the
|
|
56
56
|
same family, and only records a warning. See
|
|
57
57
|
[How independent the reviewer must be](../workflows/advanced/workflow-gates.md#how-independent-the-reviewer-must-be).
|
|
58
|
-
- **Re-running `oat pjm init` removes remote settings.** It replaces the `pjm`
|
|
59
|
-
section of `.oat/config.json` and deletes any `pjm.remote` settings, so back
|
|
60
|
-
the file up first. See
|
|
61
|
-
[Remote Project Management](../workflows/backlog-and-planning/remote-project-management.md#prerequisite).
|
|
62
58
|
- **Ad-hoc reviews run in the agent you invoke them in.** `oat-review-provide`
|
|
63
59
|
cannot send a review to a different model; to get another model's review,
|
|
64
60
|
run the skill in that model's coding tool. See
|
|
@@ -1294,10 +1294,3 @@ that: later pack updates and `oat tools remove` leave them alone.
|
|
|
1294
1294
|
loads; OAT does not resolve that for you.
|
|
1295
1295
|
|
|
1296
1296
|
Installing any pack never gives OAT permission to publish to an issue tracker.
|
|
1297
|
-
|
|
1298
|
-
> [!WARNING]
|
|
1299
|
-
> Rerunning `oat pjm init` or `oat pjm migrate --apply` deletes the `pjm.remote`
|
|
1300
|
-
> settings from `.oat/config.json`, so every remote setting silently returns to
|
|
1301
|
-
> its default. Afterwards, check `git diff .oat/config.json` and restore the
|
|
1302
|
-
> settings you need with `oat config set` (shared remote storage is restored
|
|
1303
|
-
> with `oat pjm remote storage shared`) before doing more remote work.
|
|
@@ -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
|
|
@@ -37,6 +37,47 @@ Each full command reference should include:
|
|
|
37
37
|
|
|
38
38
|
The first practical expansion path is to keep improving the existing owners: [Docs App Commands](../docs-tooling/commands.md), [Provider Interop Commands](../provider-sync/commands.md), [Config and Local State](config-and-local-state.md), [Tool Packs](../getting-started/tool-packs.md), [Workflow & Projects](../workflows/projects/index.md), and [Repository PR Comment Analysis](repository-pr-comments.md).
|
|
39
39
|
|
|
40
|
+
## Exact-path maintenance commits
|
|
41
|
+
|
|
42
|
+
`oat internal commit-paths --identity <operation> --message <message> -- <files...>`
|
|
43
|
+
commits an explicit list of owned files with enabled Git hooks. Include tracked
|
|
44
|
+
removals and both names of a rename. Directories, untracked missing paths,
|
|
45
|
+
unmerged entries and paths outside the repository are rejected; the command
|
|
46
|
+
does not discover ownership or expand directory/glob pathspecs. Unrelated staged
|
|
47
|
+
entries and worktree bytes remain preserved, including partially staged files.
|
|
48
|
+
On success, owned index/worktree bytes match the hook-final commit.
|
|
49
|
+
|
|
50
|
+
Choose a unique identity before the first attempt and retain the identity,
|
|
51
|
+
message and literal path list for retries. With global `--json`, outcomes are
|
|
52
|
+
`committed`, `already-matching`, `nothing`, `blocked` or `failed`.
|
|
53
|
+
Success exits 0, `blocked` exits 1 and `failed` exits 2. A blocked result can
|
|
54
|
+
name a verified commit whose owned-index publication still needs repair; do not
|
|
55
|
+
claim settlement until a matching retry succeeds. Ignored receipts under the
|
|
56
|
+
Git directory verify the exact identity, commit, tree and paths before reuse.
|
|
57
|
+
Lock inspection/retry is bounded and never deletes another writer's lock.
|
|
58
|
+
|
|
59
|
+
If the command is unavailable, stop and update the CLI; there is no broad Git
|
|
60
|
+
commit fallback. Synced project artifacts still use `oat project push` after
|
|
61
|
+
successful scope resolution. During development, run the current source entry:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
pnpm --silent run cli -- internal commit-paths --identity "$COMMIT_IDENTITY" --message "$COMMIT_MESSAGE" -- "${OWNED_FILES[@]}"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
A `dist` invocation requires a fresh build after the latest CLI source changes.
|
|
68
|
+
|
|
69
|
+
For `oat backlog archive --json`, use the complete returned `affectedPaths`
|
|
70
|
+
array as the archive-owned list, converting absolute paths to literal
|
|
71
|
+
repository-relative files against the same repository root. Union per-item
|
|
72
|
+
results, append an owned
|
|
73
|
+
handoff's filesystem deletion, and format only existing supported text with
|
|
74
|
+
the repository command before the helper commit. Include both old/new item
|
|
75
|
+
paths and every ledger/index/reference output; never stage only the old
|
|
76
|
+
missing name. A settled noop may return no paths and needs no commit. Pending
|
|
77
|
+
Git retries include prior outputs only with HEAD ownership evidence, while
|
|
78
|
+
no-Git retries report current-pass mutations. See [Backlog
|
|
79
|
+
Lifecycle](../workflows/backlog-and-planning/backlog-lifecycle.md).
|
|
80
|
+
|
|
40
81
|
## Command Groups
|
|
41
82
|
|
|
42
83
|
| Command group | What it covers | Go deeper |
|
|
@@ -155,14 +196,14 @@ Notable commands introduced in the current CLI surface:
|
|
|
155
196
|
- `oat project list --json` - summary state for tracked projects under the configured projects root
|
|
156
197
|
- `oat project closeout-check <project-path> [--autonomous] [--json]` - read-only check of the closeout invariant: a closeout that must snapshot its post-implementation sequence cannot reach terminal completion until its `oat_post_implement_sequence` snapshot exists, every stored step is recorded complete, approval is recorded, and the snapshot reached `status: complete`. A snapshot is required when the effective layered `workflow.postImplementSequence` is configured, when the closeout is autonomous (`--autonomous`, or `OAT_AUTONOMOUS=1` in the environment even without the flag), or when `oat_workflow_mode` is `lite`. Once a snapshot exists its recorded state is authoritative and current configuration is not consulted. JSON output reports `status` (`complete`, `not_required`, or `incomplete`), the missing `invariant` (`snapshot_missing`, `snapshot_malformed`, `sequence_failed`, `pre_approval_step_pending`, `approval_pending`, `post_approval_step_pending`, or `sequence_not_complete`), `route` (`oat-project-implement` when incomplete), `nextOwner` (the next stored step and its skill, or the approval), and the evaluated `inputs`. An incomplete or malformed result exits 1.
|
|
157
198
|
- `oat project complete-state <project-path> [--archived] [--autonomous]` - apply the canonical completed-state mutation to a project's `state.md`; used by `oat-project-complete` during lifecycle closeout. It first evaluates the same closeout invariant as `oat project closeout-check` and refuses, with the same message and without writing, a configured, autonomous, or lite closeout whose snapshot is absent, malformed, or incomplete. A project whose implementation finished before closeout snapshots existed recovers by running `oat-project-implement`, which persists the snapshot (`completion-and-closeout.md` Step 15) and completes its stored steps; there is no override flag. An unconfigured, interactive, non-lite closeout without a snapshot completes as before.
|
|
158
|
-
- `oat project archive [project-path] [--project-recap-run <project-relative-path>] [--no-commit]` - archive a tracked project through the same local move, summary export, and configured S3 upload path used by completion. When omitted, the project path falls back to the active project. The optional recap path must identify a `project-recap` run inside the project's `explainers/` directory. Archive
|
|
199
|
+
- `oat project archive [project-path] [--project-recap-run <project-relative-path>] [--no-commit]` - archive a tracked project through the same local move, summary export, and configured S3 upload path used by completion. When omitted, the project path falls back to the active project. The optional recap path must identify a `project-recap` run inside the project's `explainers/` directory. Archive verifies the complete selected package and every immutable file byte, then atomically exports one self-contained `.oat/repo/reference/project-recaps/<YYYYMMDD-project-slug>.html` page before deleting the active project. The full original package remains in the archived project. JSON `projectRecapExport` identifies `runId`, `page.sourceRelativePath`, `page.originalSha256`, `page.exportedSha256`, `verifiedArtifactCount`, and the flat `exportRoot`. No tracked sidecar is created. Matching dated pages are adopted on retry; conflicting destinations, incomplete inventory coverage, stale bytes, path escapes, and recipe mismatches fail without removing the active project. Summary and PR links point to the tracked page. For synced projects, a configured S3 upload must succeed before terminal cleanup. Successful closeout makes `refs/oat/completed/<project>` authoritative, deletes the tracked JSON record and nested checkout, and leaves archive metadata sufficient for an idempotent recordless retry. With `--json`, the terminal receipt reports `completedRef`, `verifiedSourceSha`, whether `activeAliasDisposition` was `retained` or `removed`, whether `recordRetired` completed, and the parent `lifecycleCommit`. `--no-commit` is a manual/library-only option: for a synced project it still removes the checkout but deliberately leaves `lifecycleCommit` null. Never pass it through `oat-project-complete`, which requires that receipt.
|
|
159
200
|
- `oat repo archive sync [project-name]` - hydrate archived project snapshots from the configured repo-scoped S3 archive into `.oat/projects/archived/`. The old `oat project archive sync` path remains as a deprecated shim.
|
|
160
201
|
- `oat project dispatch record --event-file <json-file-or-dash>` - validate one generic dispatch record plus its namespaced OAT evidence event and print the result with `status: validated-only`. The command writes nothing; launches are recorded in the calling workflow's run record. Managed, effort-pinned Claude launches run it before launch: the input carries `claudeLaunch` with the real resolver result, generated definition, and proposed payload, plus `recordBase` and `event`. The command validates their agreement and derives the configured invocation fields; callers cannot copy those fields into `recordBase`. One validation run reports every violation across `claudeLaunch`, `recordBase`, and `event` in a single error message, one `stage path: message` line each; the `recordBase` cross-field rules run even when a required field is missing, checks that need a value that failed to parse are skipped and named on a final line, secret-shaped values and absolute paths are scrubbed from the message, and the exit code stays 1. A validated input per role is published at `.agents/skills/oat-dispatch-subagents/references/managed-claude-example.json`. The command validates evidence only — it never launches a provider. A `runtime-observation` event may carry either a finished `observation` or the provider `metadata` envelope (`provider`, `observedAt`, `entries`) to normalize, but not both. `entries` may be raw provider output: they are projected through the owning parser's allowlist, are never echoed in the output, and both forms have their `match` derived from the record's configured invocation rather than trusted from the caller, with the observation's `provider` bound to the record's. With `--json`, the result adds `runtimeIdentity` with separate `configured` and `observed` objects plus a `match` of `matching`, `mismatching`, `not-comparable`, or `null`; observation is corroboration only and never overrides configured invocation. Error output is redacted on a best-effort basis; absolute paths in identity fields are rejected outright, while some prose forms (colon-prefixed, URL routes) can survive. See [Evidence Layers](../workflows/advanced/evidence-layers.md).
|
|
161
202
|
- `oat project dispatch canonical-role --role <name> --request-id <id> --skill-dir <dir> [--json]` - resolve a canonical role through the loaded, user (`$HOME/.agents`), and project (`<repo>/.agents`) tiers and print the `canonical-role-resolution` event that `oat project dispatch record` accepts unchanged: redacted `canonicalPath` and `selectedPath` in the form `<loaded|user|project>/agents/<name>.md`, the role's `contentDigest`, and `candidateMisses`. `--skill-dir` is required because the loaded tier is derived from the loaded skill's directory; a missing or invalid directory exits 1 with a redacted error. An unknown role prints `missing` evidence with its recovery commands. Read-only; the dependency is the `workflows` pack.
|
|
162
203
|
- `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
204
|
- `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
205
|
- `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
|
|
206
|
+
- `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
207
|
- `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
208
|
- `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
209
|
- `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 +244,7 @@ The `workflow.*` namespace holds user-facing workflow preferences that let you a
|
|
|
203
244
|
- `workflow.hillCheckpointDefault` (`every` | `final`) — default HiLL checkpoint behavior in `oat-project-implement`
|
|
204
245
|
- `workflow.archiveOnComplete` (`boolean`) — skip the archive prompt in `oat-project-complete`
|
|
205
246
|
- `workflow.createPrOnComplete` (`boolean`) — skip the "Open a PR?" prompt in `oat-project-complete`
|
|
247
|
+
- `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
248
|
- `workflow.postImplementSequence` (legacy `wait` | `summary` | `pr` | `docs-pr`, or structured `{preApproval, postApproval}` arrays) — approval-aware post-implementation chaining
|
|
207
249
|
- `workflow.reviewExecutionModel` (`subagent` | `inline` | `fresh-session`) — default final-review execution model
|
|
208
250
|
- `workflow.autoReviewAtHillCheckpoints` (`boolean`) — auto-run the extra lifecycle review at HiLL checkpoints
|
|
@@ -50,7 +50,7 @@ The command validates all inputs before creating the scaffold or writing an item
|
|
|
50
50
|
|
|
51
51
|
- Validates the item's current `status` against the enum (`open | in_progress | closed | wont_do`); an out-of-enum value such as `done` is a hard error with a fix hint. Archiving is legal from any valid status — a `closed` item still in `items/` just gets its move finished.
|
|
52
52
|
- For the default `closed` path, validates and trims a nonblank `--summary` before any file or index mutation. The `wont_do` path may omit the summary and completion-ledger entry.
|
|
53
|
-
- Rewrites only the `status:` and `updated:` frontmatter lines (preserving any inline enum comment), then moves the item from `items/` to `archived/` with
|
|
53
|
+
- Rewrites only the `status:` and `updated:` frontmatter lines (preserving any inline enum comment), then moves the item from `items/` to `archived/` with a filesystem rename. Archive leaves the Git index unchanged on initial archive and retry; callers own formatting, staging and committing the complete operation.
|
|
54
54
|
- `closed` archives append a canonical newest-first `completed.md` entry (`YYYY-MM-DD — <id> — Title — summary`). `wont_do` archives append an entry only when `--summary` is provided. A missing `completed.md` is scaffolded from the starter template; a missing `## Completed Items` heading is scaffolded with a warning.
|
|
55
55
|
- Rewrites inbound references to the moved file across Markdown under `.oat/repo/**` — tracked and untracked files that Git does not ignore, or every `.md` file outside a Git work tree — (external plans, decision records, other backlog items): relative links, `.oat/repo`-relative and repository-root path strings (including `oat_external_plan_sources` frontmatter) that resolve to `items/<id>.md` now point at `archived/<id>.md`, and the moved item's own relative links (inline links with any title form, and reference-style definitions; never footnotes or prose) are rebased when their target exists, so they keep resolving. An inline code span whose whole content is a path to the item (optionally with an `#anchor`), such as an external plan's `Source artifact or scope` citation, is rewritten; any other code span or fenced code block that mentions `items/<id>.md` is left as written with a warning, so recorded commands keep their meaning. Only references that resolve to the item's former `items/<id>.md` path change, and a link that already resolves to a different existing file is never repointed; URLs are never touched, and symlinked Markdown files are skipped so nothing outside `.oat/repo` is read or written. Each rewritten file is reported; a reference that names `items/<id>.md` but cannot be resolved is left untouched with a warning.
|
|
56
56
|
- Regenerates the managed backlog index after the move.
|
|
@@ -77,11 +77,18 @@ On success the payload is the archive result object:
|
|
|
77
77
|
"rewrittenReferences": [
|
|
78
78
|
".oat/repo/reference/external-plans/2026-07-05-example-plan.md"
|
|
79
79
|
],
|
|
80
|
+
"affectedPaths": [
|
|
81
|
+
"/repo/.oat/repo/pjm/backlog/items/BL-260705-example.md",
|
|
82
|
+
"/repo/.oat/repo/pjm/backlog/archived/BL-260705-example.md",
|
|
83
|
+
"/repo/.oat/repo/pjm/backlog/completed.md",
|
|
84
|
+
"/repo/.oat/repo/pjm/backlog/index.md",
|
|
85
|
+
"/repo/.oat/repo/reference/external-plans/2026-07-05-example-plan.md"
|
|
86
|
+
],
|
|
80
87
|
"warnings": []
|
|
81
88
|
}
|
|
82
89
|
```
|
|
83
90
|
|
|
84
|
-
`result` is `archived` or `noop` (already archived); `completedEntry` is `written`, `scaffolded`, or `skipped` (e.g. a `wont_do` archive without `--summary`); `movedTo` is the destination path or `null`; `rewrittenReferences` lists the repository-relative Markdown files whose references to the moved item were rewritten (on a no-op this lists anything the retried rewrite changed, and the human output prints each file on both paths). On an actionable failure the payload is `{ "result": "error", "id": "<id>", "message": "<why + fix>" }`.
|
|
91
|
+
`result` is `archived` or `noop` (already archived); `completedEntry` is `written`, `scaffolded`, or `skipped` (e.g. a `wont_do` archive without `--summary`); `movedTo` is the destination path or `null`; `rewrittenReferences` lists the repository-relative Markdown files whose references to the moved item were rewritten (on a no-op this lists anything the retried rewrite changed, and the human output prints each file on both paths). `affectedPaths` is the deduplicated, normalized absolute operation path list: old item path (a tracked deletion), archived destination, index, completed ledger when written, and rewritten references. Retries report actual current-pass changes. In Git, a retry also reports prior uncommitted outputs only when HEAD still contains the old item and lacks the destination: the item move, a newly inserted ledger entry, a removed index entry, and references whose HEAD bytes still resolve to the old item. Existing archived links and unrelated edits in already-settled files are not claimed. Without Git history, retries report current-pass mutations only. A `wont_do` archive without an entry does not claim unrelated ledger changes. Capture each successful JSON result, deduplicate the union of `affectedPaths`, add any owned handoff filesystem deletion, and format existing affected text using the repository command. Pass that complete literal list to `oat internal commit-paths` with enabled hooks and a unique retained operation identity; stop on unavailable or blocked/failed helper, preserve unrelated staged/unstaged work, and never stage only the missing old path. An empty settled-noop list requires no commit. On an actionable failure the payload is `{ "result": "error", "id": "<id>", "message": "<why + fix>" }`.
|
|
85
92
|
|
|
86
93
|
For full project-management repo-reference setup, use [`oat pjm init`](../getting-started/tool-packs.md#install-vs-initialize). It scaffolds the two-layer PJM surface (`pjm/current-state.md`, `pjm/roadmap.md`, `reference/decisions/`, and AGENTS guides) and delegates the backlog sub-surface to `oat backlog init`.
|
|
87
94
|
|
|
@@ -209,6 +216,8 @@ with `oat pjm init` as the recovery instead of treating absent
|
|
|
209
216
|
`.oat/repo/pjm/` files as drift. See
|
|
210
217
|
[Install vs. initialize](../getting-started/tool-packs.md#install-vs-initialize).
|
|
211
218
|
|
|
219
|
+
`oat pjm init` and `oat pjm migrate` update only their adoption markers; they preserve `pjm.remote` and other existing, unowned configuration fields.
|
|
220
|
+
|
|
212
221
|
Workflow automation preferences are also visible through `oat config` and can be set at local, shared, or user scope. Notable review-loop keys:
|
|
213
222
|
|
|
214
223
|
- `workflow.autoArtifactReview.plan` - default-on bounded artifact review for generated `plan.md` files before implementation handoff
|
|
@@ -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":
|
|
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
|
|
|
@@ -75,6 +75,34 @@ implementation-then-regression, static/build, or manual/visual. Static or build
|
|
|
75
75
|
checks alone fit only changes that cannot affect runtime behavior; every
|
|
76
76
|
behavioral change needs evidence that fails without the change.
|
|
77
77
|
|
|
78
|
+
## Blockers in state.md
|
|
79
|
+
|
|
80
|
+
`oat_blockers` accepts legacy reason strings and structured workflow records:
|
|
81
|
+
|
|
82
|
+
```yaml
|
|
83
|
+
oat_blockers:
|
|
84
|
+
- task_id: p01-t03
|
|
85
|
+
reason: Waiting on API contract
|
|
86
|
+
since: '2026-10-03'
|
|
87
|
+
- waiting on review
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
The control plane exposes `ProjectBlocker` as
|
|
91
|
+
`string | { task_id: string; reason: string; since: string }`.
|
|
92
|
+
`oat project status --json` preserves the three literal fields. Human status
|
|
93
|
+
shows the task, reason and date for records, and the reason for legacy strings.
|
|
94
|
+
`--field project.blockers` emits JSON; `--shell BLOCKERS=project.blockers`
|
|
95
|
+
emits a shell-quoted JSON assignment. Select a single field such as
|
|
96
|
+
`--field project.blockers.0.reason` to read a structured reason alone.
|
|
97
|
+
|
|
98
|
+
Empty lists remain empty. Mixed lists retain entries in order, with
|
|
99
|
+
legacy string normalization unchanged. Records missing any nonempty string
|
|
100
|
+
field, nested lists and non-string scalars become diagnostic legacy strings:
|
|
101
|
+
`Malformed blocker entry: <JSON>`. They remain visible to blocker checks and
|
|
102
|
+
human output without `[object Object]` coercion. The parser also accepts
|
|
103
|
+
JSON-encoded blocker lists for compatibility. These representations do not change workflow recommendations
|
|
104
|
+
or the state refresh command's existing raw-frontmatter handling.
|
|
105
|
+
|
|
78
106
|
## Supporting artifacts
|
|
79
107
|
|
|
80
108
|
- `summary.md`: generated by `oat-project-summary` — re-runnable, tracks its own state via frontmatter for incremental updates after revisions
|
|
@@ -99,9 +127,12 @@ different retention contracts:
|
|
|
99
127
|
the tracked branch with the active project tree. It remains only in the local
|
|
100
128
|
archived project.
|
|
101
129
|
- A selected final `project-recap` is a durable completion record. Before a
|
|
102
|
-
shared project is removed, archive
|
|
103
|
-
|
|
104
|
-
|
|
130
|
+
shared project is removed, archive verifies the complete selected run and
|
|
131
|
+
exports one self-contained HTML page to
|
|
132
|
+
`.oat/repo/reference/project-recaps/<YYYYMMDD-project-slug>.html`. The
|
|
133
|
+
report identifies the run, original page/hash, exported hash, and verified
|
|
134
|
+
artifact count. The full original run, manifest, source, and QA evidence
|
|
135
|
+
remain in the archived project. Summary
|
|
105
136
|
and PR links use this export, never the gitignored local archive. Lifecycle
|
|
106
137
|
callers identify the selected project-relative run with:
|
|
107
138
|
|
|
@@ -110,12 +141,16 @@ different retention contracts:
|
|
|
110
141
|
--project-recap-run explainers/<recap-slug>
|
|
111
142
|
```
|
|
112
143
|
|
|
113
|
-
The archive exports at most one selected recap
|
|
114
|
-
|
|
144
|
+
The archive exports at most one selected recap page, with local assets embedded
|
|
145
|
+
and unavailable project-source links removed. It adopts a byte-identical dated
|
|
146
|
+
page on retry and refuses a differing existing destination without overwriting
|
|
147
|
+
it. It creates no tracked manifest, fact-base, QA, or hash sidecar and requires the selected path to stay under the project's
|
|
115
148
|
`explainers/` directory with a `project-recap` manifest. Verification checks
|
|
116
|
-
the manifest's exact inventory
|
|
117
|
-
|
|
118
|
-
|
|
149
|
+
the manifest version's exact inventory and raw immutable file-byte hashes before
|
|
150
|
+
deleting the active project. Direct CLI archive also accepts legacy v1 recaps:
|
|
151
|
+
the v1 contract verifies canonical fact-base and resolved-theme JSON identities
|
|
152
|
+
and build-record run/outcome agreement. The v2 contract additionally requires
|
|
153
|
+
ledger and QA evidence coverage. Project completion selects v2 recap runs.
|
|
119
154
|
|
|
120
155
|
Both `built` and `built-needs-review` are complete, archivable outcomes.
|
|
121
156
|
`built-needs-review` means the browser rung was unavailable or found an issue;
|
|
@@ -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.
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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
|