@open-agent-toolkit/cli 0.1.40 → 0.1.42
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/agents/oat-phase-implementer.md +2 -2
- package/assets/agents/oat-reviewer.md +10 -8
- package/assets/docs/cli-utilities/backlog-lifecycle.md +61 -0
- package/assets/docs/cli-utilities/config-and-local-state.md +47 -0
- package/assets/docs/cli-utilities/index.md +1 -0
- package/assets/docs/cli-utilities/workflow-gates.md +55 -0
- package/assets/docs/provider-sync/instruction-sync.md +1 -0
- package/assets/docs/reference/cli-reference.md +1 -1
- package/assets/docs/workflows/projects/artifacts.md +22 -0
- package/assets/docs/workflows/projects/hill-checkpoints.md +2 -0
- package/assets/docs/workflows/projects/implementation-execution.md +2 -1
- package/assets/docs/workflows/projects/reviews.md +17 -0
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-pjm-review-backlog/SKILL.md +29 -7
- package/assets/skills/oat-pjm-update-repo-reference/SKILL.md +25 -5
- package/assets/skills/oat-project-implement/SKILL.md +76 -5
- package/assets/skills/oat-project-review-provide/SKILL.md +25 -13
- package/assets/skills/oat-project-review-receive/SKILL.md +20 -10
- package/assets/skills/oat-review-provide/SKILL.md +14 -12
- package/assets/skills/oat-review-provide/references/review-artifact-template.md +1 -1
- package/assets/templates/pjm-agents.md +80 -1
- package/assets/templates/pjm-handoffs-readme.md +21 -0
- package/assets/templates/reference-agents.md +13 -0
- package/assets/templates/repo-agents.md +4 -0
- package/assets/templates/repo-readme.md +35 -0
- package/dist/commands/backlog/archive.d.ts +33 -0
- package/dist/commands/backlog/archive.d.ts.map +1 -0
- package/dist/commands/backlog/archive.js +229 -0
- package/dist/commands/backlog/index.d.ts +2 -0
- package/dist/commands/backlog/index.d.ts.map +1 -1
- package/dist/commands/backlog/index.js +56 -2
- package/dist/commands/backlog/regenerate-index.d.ts +5 -1
- package/dist/commands/backlog/regenerate-index.d.ts.map +1 -1
- package/dist/commands/backlog/regenerate-index.js +7 -1
- package/dist/commands/backlog/shared/item-status.d.ts +13 -0
- package/dist/commands/backlog/shared/item-status.d.ts.map +1 -0
- package/dist/commands/backlog/shared/item-status.js +34 -0
- package/dist/commands/gate/index.d.ts.map +1 -1
- package/dist/commands/gate/index.js +15 -3
- package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
- package/dist/commands/instructions/instructions.utils.js +24 -0
- package/dist/commands/pjm/doctor.d.ts.map +1 -1
- package/dist/commands/pjm/doctor.js +161 -0
- package/dist/commands/pjm/index.d.ts.map +1 -1
- package/dist/commands/pjm/index.js +2 -1
- package/dist/commands/pjm/init.d.ts +2 -1
- package/dist/commands/pjm/init.d.ts.map +1 -1
- package/dist/commands/pjm/init.js +7 -0
- package/dist/commands/review/latest.d.ts.map +1 -1
- package/dist/commands/review/latest.js +5 -2
- package/dist/commands/shared/frontmatter.d.ts +11 -0
- package/dist/commands/shared/frontmatter.d.ts.map +1 -1
- package/dist/commands/shared/frontmatter.js +15 -0
- package/package.json +2 -2
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-phase-implementer
|
|
3
|
-
version: 1.0.
|
|
3
|
+
version: 1.0.3
|
|
4
4
|
description: Implements a single plan phase end-to-end — reads artifacts once, executes tasks sequentially, commits per task, self-reviews, and returns a structured summary. Dispatched by oat-project-implement.
|
|
5
5
|
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
6
6
|
color: cyan
|
|
@@ -46,7 +46,7 @@ For Codex, `provider-default` means the base/unpinned role follows Codex configu
|
|
|
46
46
|
|
|
47
47
|
If `mode: fix`, the block also includes:
|
|
48
48
|
|
|
49
|
-
- **review_artifact**: Path to the review artifact from the reviewer (e.g., `reviews/p02-review-
|
|
49
|
+
- **review_artifact**: Path to the review artifact from the reviewer (e.g., `reviews/p02-review-2026-01-28T140322Z.md`)
|
|
50
50
|
- **findings**: Critical and Important findings list
|
|
51
51
|
- **prior_summary**: Your own prior `implement` run summary (what was previously built)
|
|
52
52
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-reviewer
|
|
3
|
-
version: 1.1.
|
|
3
|
+
version: 1.1.4
|
|
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
|
|
6
6
|
color: yellow
|
|
@@ -287,19 +287,21 @@ Write the review artifact to the specified path.
|
|
|
287
287
|
|
|
288
288
|
**File path format:**
|
|
289
289
|
|
|
290
|
-
-
|
|
291
|
-
- Final review: `{project}/reviews/final-review-YYYY-MM-DD.md`
|
|
292
|
-
- Task review: `{project}/reviews/pNN-tNN-review-YYYY-MM-DD.md`
|
|
293
|
-
- Range review: `{project}/reviews/range-review-YYYY-MM-DD.md`
|
|
290
|
+
Use a seconds-precision **UTC** timestamp token (`YYYY-MM-DDTHHMMSSZ`, from `date -u +%Y-%m-%dT%H%M%SZ` — the `-u` and the trailing `Z` are mandatory) so same-scope, same-day re-reviews never collide and always sort by recency. Never emit a local-time or `Z`-less timestamp: a timezone-less datetime mis-orders artifacts written by agents in different timezones.
|
|
294
291
|
|
|
295
|
-
|
|
292
|
+
- Phase review: `{project}/reviews/pNN-review-YYYY-MM-DDTHHMMSSZ.md`
|
|
293
|
+
- Final review: `{project}/reviews/final-review-YYYY-MM-DDTHHMMSSZ.md`
|
|
294
|
+
- Task review: `{project}/reviews/pNN-tNN-review-YYYY-MM-DDTHHMMSSZ.md`
|
|
295
|
+
- Range review: `{project}/reviews/range-review-YYYY-MM-DDTHHMMSSZ.md`
|
|
296
|
+
|
|
297
|
+
The timestamp token must match the `oat_generated_at` frontmatter for the same run. In the unlikely event a file with that exact second already exists, append `-v2`, `-v3`, etc.
|
|
296
298
|
|
|
297
299
|
**Review artifact template:**
|
|
298
300
|
|
|
299
301
|
````markdown
|
|
300
302
|
---
|
|
301
303
|
oat_generated: true
|
|
302
|
-
oat_generated_at: YYYY-MM-
|
|
304
|
+
oat_generated_at: YYYY-MM-DDTHH:MM:SSZ
|
|
303
305
|
oat_review_scope: { scope }
|
|
304
306
|
oat_review_type: { code|artifact|analysis }
|
|
305
307
|
oat_review_invocation: { manual|auto|gate }
|
|
@@ -308,7 +310,7 @@ oat_project: { project-path }
|
|
|
308
310
|
|
|
309
311
|
# {Code|Artifact|Analysis} Review: {scope}
|
|
310
312
|
|
|
311
|
-
**Reviewed:** YYYY-MM-
|
|
313
|
+
**Reviewed:** YYYY-MM-DDTHH:MM:SSZ
|
|
312
314
|
**Scope:** {scope description}
|
|
313
315
|
**Files reviewed:** {N}
|
|
314
316
|
**Commits:** {range or count}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Backlog Lifecycle
|
|
3
|
+
description: The states a file-backed backlog item moves through, how oat backlog archive closes it out atomically, and how oat pjm doctor catches lifecycle drift.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Backlog Lifecycle
|
|
7
|
+
|
|
8
|
+
The file-backed backlog under `.oat/repo/pjm/backlog/` tracks work as one Markdown file per item. This page describes the lifecycle those items move through, the atomic close-out command that keeps the pieces in sync, and the diagnostics that flag drift when a close-out is done by hand and something is missed.
|
|
9
|
+
|
|
10
|
+
For the flag-by-flag command reference, see [`oat backlog archive`](config-and-local-state.md#oat-backlog-archive). For the two-layer PJM surface that hosts the backlog, see [Tool Packs](tool-packs.md#install-vs-initialize).
|
|
11
|
+
|
|
12
|
+
## Where a backlog item lives
|
|
13
|
+
|
|
14
|
+
- **`items/<id>.md`** - active, file-backed records. Each carries frontmatter with a `status` and an `updated` timestamp.
|
|
15
|
+
- **`archived/<id>.md`** - the resting place for closed-out items, preserving the full item file as history.
|
|
16
|
+
- **`completed.md`** - a newest-first summary log of completed work, one line per entry (`YYYY-MM-DD — BL-YYMMDD-slug — Title — one-line outcome`).
|
|
17
|
+
- **`index.md`** - the human-facing curated overview plus a managed, generated index table rebuilt from item frontmatter.
|
|
18
|
+
|
|
19
|
+
## Item statuses
|
|
20
|
+
|
|
21
|
+
An item's `status` frontmatter field is one of exactly four values:
|
|
22
|
+
|
|
23
|
+
- `open` - captured, not yet started.
|
|
24
|
+
- `in_progress` - actively being worked.
|
|
25
|
+
- `closed` - completed.
|
|
26
|
+
- `wont_do` - abandoned or intentionally declined.
|
|
27
|
+
|
|
28
|
+
`closed` and `wont_do` are the two **terminal** statuses. These are the only valid values — never invent variants like `done`. A terminal item belongs in `archived/`, not `items/`.
|
|
29
|
+
|
|
30
|
+
## Closing out an item
|
|
31
|
+
|
|
32
|
+
When an item reaches a terminal state, close it out with the atomic command rather than editing files by hand:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
# completed work
|
|
36
|
+
oat backlog archive BL-260705-example --summary "shipped the thing"
|
|
37
|
+
|
|
38
|
+
# abandoned work
|
|
39
|
+
oat backlog archive BL-260705-example --wont-do --summary "superseded by BL-260706-other"
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
A single `oat backlog archive` run performs the whole close-out so its parts cannot drift apart:
|
|
43
|
+
|
|
44
|
+
1. Sets the terminal `status` (`closed` by default, `wont_do` with `--wont-do`) and stamps `updated`.
|
|
45
|
+
2. Appends a canonical newest-first entry to `completed.md`. `closed` items always get an entry (with a visible `TODO: summarize outcome` placeholder when `--summary` is omitted, so the gap stays visible); `wont_do` items get one only when you pass `--summary`.
|
|
46
|
+
3. Moves `items/<id>.md` into `archived/` — with `git mv` inside a work tree, or a plain rename outside git.
|
|
47
|
+
4. Regenerates the managed backlog index.
|
|
48
|
+
|
|
49
|
+
The command is safe to re-run: an item already in `archived/` produces a no-op warning with no writes. An out-of-enum current status (for example a hand-set `done`) is a hard error that names the file, lists the valid statuses, and tells you how to recover. See the [command reference](config-and-local-state.md#oat-backlog-archive) for exit codes and the `--json` payload.
|
|
50
|
+
|
|
51
|
+
## Catching lifecycle drift
|
|
52
|
+
|
|
53
|
+
The manual close-out this command replaces is exactly where the two motivating repos drifted — an item was marked closed in frontmatter and summarized in `completed.md` but never moved to `archived/`, and one shipped with the invalid status `done`. `oat pjm doctor` (and therefore `oat doctor`, which aggregates the `pjm:*` checks) now surfaces that drift:
|
|
54
|
+
|
|
55
|
+
- **`pjm:backlog_terminal_in_items`** (fail) - a `closed` or `wont_do` item is still sitting in `items/`. Fix: run `oat backlog archive <id>` to finish the move.
|
|
56
|
+
- **`pjm:backlog_invalid_status`** (fail) - an item carries an out-of-enum or missing `status`. The message lists the offending file paths and the valid statuses.
|
|
57
|
+
- **`pjm:backlog_archived_open`** (warn) - an `open` or `in_progress` item is in `archived/`, which usually means it was archived prematurely.
|
|
58
|
+
- **`pjm:backlog_completed_unarchived`** (warn) - `completed.md` references an item whose file still lives in `items/`.
|
|
59
|
+
- **`pjm:backlog_duplicate_id`** (fail) - the same `<id>.md` exists in both `items/` and `archived/`. `oat backlog archive` refuses to auto-resolve this (it would clobber the archived record), so the duplicate must be reconciled by hand.
|
|
60
|
+
|
|
61
|
+
Doctor reports drift; it never auto-fixes. A human or agent runs `oat backlog archive` (or corrects the status) and re-runs doctor to confirm the backlog is clean again.
|
|
@@ -16,12 +16,59 @@ Use the `oat backlog` group when you want direct CLI support for the file-backed
|
|
|
16
16
|
- `oat backlog init` - scaffold `.oat/repo/pjm/backlog/` with starter files and directories for a fresh repo
|
|
17
17
|
- `oat backlog generate-id <title>` - generate a deterministic `BL-YYMMDD-slug` backlog ID from a title
|
|
18
18
|
- `oat backlog generate-id <title> --created-at <timestamp>` - generate a reproducible ID for a known creation timestamp
|
|
19
|
+
- `oat backlog archive <id>` - atomic close-out: set a terminal status, record the completion in `completed.md`, move the item into `archived/`, and regenerate the index in one step
|
|
19
20
|
- `oat backlog regenerate-index` - rebuild the managed backlog index table from item frontmatter
|
|
20
21
|
|
|
21
22
|
Backlog IDs are deterministic date+slug identifiers (`BL-YYMMDD-slug`) derived from the creation date and title, so two machines or worktrees produce the same ID for the same record without scanning the local checkout. The slug is capped at 30 characters at the last whole-word boundary (with trailing stop-words trimmed), so prefer concise, meaningful titles. Index regeneration is deterministic and safe to re-run when resolving an index merge conflict.
|
|
22
23
|
|
|
23
24
|
Run `oat backlog init` first when the local backlog scaffold does not exist yet in a fresh repo. This command group is primarily used by the `oat-pjm-*` project-management skills, but it is also available directly when you need to inspect or repair backlog metadata by hand.
|
|
24
25
|
|
|
26
|
+
For the end-to-end states an item moves through — and how `oat backlog archive` and `oat pjm doctor` keep the backlog honest — see [Backlog Lifecycle](backlog-lifecycle.md).
|
|
27
|
+
|
|
28
|
+
### `oat backlog archive`
|
|
29
|
+
|
|
30
|
+
`oat backlog archive <id> [--wont-do] [--summary <text>] [--json] [--backlog-root <path>]` performs the full close-out for a backlog item so status flip, completed-log entry, file move, and index regeneration never drift apart.
|
|
31
|
+
|
|
32
|
+
**Arguments and flags:**
|
|
33
|
+
|
|
34
|
+
- `<id>` (required) - the backlog item id (`BL-YYMMDD-slug`); the item file must live under `items/`.
|
|
35
|
+
- `--wont-do` - close the item as `wont_do` instead of the default terminal status `closed`.
|
|
36
|
+
- `--summary <text>` - one-line outcome summary recorded in `completed.md`.
|
|
37
|
+
- `--backlog-root <path>` - override the backlog root (defaults to `.oat/repo/pjm/backlog`).
|
|
38
|
+
- `--json` - emit the machine-readable result payload instead of human log lines.
|
|
39
|
+
|
|
40
|
+
**Behavior:**
|
|
41
|
+
|
|
42
|
+
- 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.
|
|
43
|
+
- Rewrites only the `status:` and `updated:` frontmatter lines (preserving any inline enum comment), then moves the item from `items/` to `archived/` with `git mv` inside a work tree, falling back to a plain rename (with a warning) outside git or if `git mv` fails.
|
|
44
|
+
- `closed` archives always append a canonical newest-first `completed.md` entry (`YYYY-MM-DD — <id> — Title — summary`); when `--summary` is omitted the entry carries a visible `TODO: summarize outcome` placeholder. `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.
|
|
45
|
+
- Regenerates the managed backlog index after the move.
|
|
46
|
+
- Idempotent: re-running on an item already in `archived/` is a no-op warning with no writes.
|
|
47
|
+
|
|
48
|
+
**Exit codes:**
|
|
49
|
+
|
|
50
|
+
- `0` - item archived, or already-archived no-op.
|
|
51
|
+
- `1` - actionable error: unknown id (no file under `items/`) or an out-of-enum current status. The message names the file path, the valid statuses, and the fix.
|
|
52
|
+
- `2` - reserved for unexpected system/runtime failures.
|
|
53
|
+
|
|
54
|
+
**JSON payload (`--json`):**
|
|
55
|
+
|
|
56
|
+
On success the payload is the archive result object:
|
|
57
|
+
|
|
58
|
+
```json
|
|
59
|
+
{
|
|
60
|
+
"id": "BL-260705-example",
|
|
61
|
+
"result": "archived",
|
|
62
|
+
"status": "closed",
|
|
63
|
+
"completedEntry": "written",
|
|
64
|
+
"movedTo": ".oat/repo/pjm/backlog/archived/BL-260705-example.md",
|
|
65
|
+
"indexRegenerated": true,
|
|
66
|
+
"warnings": []
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
`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`. On an actionable failure the payload is `{ "result": "error", "id": "<id>", "message": "<why + fix>" }`.
|
|
71
|
+
|
|
25
72
|
For full project-management repo-reference setup, use [`oat pjm init`](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`.
|
|
26
73
|
|
|
27
74
|
## `oat decision ...`
|
|
@@ -15,6 +15,7 @@ Use this section when you want bootstrap guidance, tool-pack lifecycle details,
|
|
|
15
15
|
- [Tool Packs and Installed Assets](tool-packs.md) - Bundled packs and `oat tools` lifecycle commands.
|
|
16
16
|
- [Configuration](configuration.md) - OAT configuration guidance across shared, local, user, and provider-sync surfaces.
|
|
17
17
|
- [Config and Local State](config-and-local-state.md) - Utility command groups for config, local state, diagnostics, and related inspection flows.
|
|
18
|
+
- [Backlog Lifecycle](backlog-lifecycle.md) - Backlog item states, atomic close-out with `oat backlog archive`, and lifecycle drift detection in `oat pjm doctor`.
|
|
18
19
|
- [Workflow Gates](workflow-gates.md) - Per-skill final commands and cross-runtime review dispatch with `oat gate`.
|
|
19
20
|
|
|
20
21
|
## What Lives Here
|
|
@@ -71,6 +71,61 @@ status when the configured threshold is met. `cross-provider-exec` does not do
|
|
|
71
71
|
that interpretation; for generic prompts it still returns only the child process
|
|
72
72
|
status.
|
|
73
73
|
|
|
74
|
+
`oat-project-implement` uses `oat gate review` per phase when a project opts in
|
|
75
|
+
via the `oat_phase_review_gate` plan frontmatter — a non-pausing gate that runs
|
|
76
|
+
after each selected phase's standard reviewer passes. See
|
|
77
|
+
[Reviews → Phase review gate](../workflows/projects/reviews.md#phase-review-gate)
|
|
78
|
+
for the frontmatter contract and how passing versus blocking gates are
|
|
79
|
+
dispositioned.
|
|
80
|
+
|
|
81
|
+
### Gate completion signal
|
|
82
|
+
|
|
83
|
+
The canonical "how do I know the gate finished" signal is the structured result
|
|
84
|
+
`oat --json gate review` writes to stdout on exit, together with the process
|
|
85
|
+
exit code. Orchestrators should run the gate synchronously and read that
|
|
86
|
+
envelope — do **not** poll the `reviews/` directory for a file to appear or
|
|
87
|
+
watch the provider process's log for liveness. Filesystem and log-liveness
|
|
88
|
+
heuristics are unreliable: a re-gate can momentarily surface a prior round's
|
|
89
|
+
artifact, and a lingering provider side-process says nothing about whether the
|
|
90
|
+
review committed.
|
|
91
|
+
|
|
92
|
+
Every terminal envelope carries a `runId` (unique per gate invocation) and,
|
|
93
|
+
once an artifact exists, its `generatedAt` (the artifact's seconds-precision
|
|
94
|
+
`oat_generated_at`), so a caller can correlate the result to the exact artifact
|
|
95
|
+
and disambiguate re-gate rounds:
|
|
96
|
+
|
|
97
|
+
| `status` | Exit | Meaning |
|
|
98
|
+
| ---------------------------- | ---- | --------------------------------------------------------- |
|
|
99
|
+
| `ok` | 0 | Review completed; gate passed at the threshold. |
|
|
100
|
+
| `blocked` | 1 | Review completed; findings at/above the threshold. |
|
|
101
|
+
| `review_failed` | ≠0 | The provider target exited non-zero; no verdict. |
|
|
102
|
+
| `artifact_validation_failed` | 1 | Provider ran but the review artifact could not be parsed. |
|
|
103
|
+
|
|
104
|
+
`ok` and `blocked` also include `outcome`, `artifactPath`, `counts`, `scope`,
|
|
105
|
+
and `handoff`. Treat any status other than `ok`/`blocked` as an operational
|
|
106
|
+
failure, not a passing gate.
|
|
107
|
+
|
|
108
|
+
**Drive gates through `oat gate review`, not raw provider invocation.** An
|
|
109
|
+
orchestrator that hand-rolls the review (for example, calling
|
|
110
|
+
`codex exec … oat-project-review-provide <scope>` directly) and then watches
|
|
111
|
+
`reviews/` for a file is reimplementing — less reliably — what the CLI already
|
|
112
|
+
does: `oat gate review` snapshots the reviews directory, dispatches the
|
|
113
|
+
provider, and attributes the produced artifact by content hash, so it is immune
|
|
114
|
+
to a stale file lingering from a prior round. It works standalone, not only
|
|
115
|
+
inside the `oat-project-implement` auto-loop — a one-off final review is just:
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
oat --json gate review \
|
|
119
|
+
--project "$PROJECT_PATH" \
|
|
120
|
+
--review-type code \
|
|
121
|
+
--review-scope final \
|
|
122
|
+
--exit-nonzero-on important \
|
|
123
|
+
'Use oat-project-review-provide code final to review the current project'
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Read the resulting envelope and exit code; that is the whole completion
|
|
127
|
+
contract.
|
|
128
|
+
|
|
74
129
|
## Exec targets
|
|
75
130
|
|
|
76
131
|
`oat gate cross-provider-exec` chooses from `workflow.gates.execTargets`.
|
|
@@ -22,6 +22,7 @@ Instruction sync is currently project-only.
|
|
|
22
22
|
- It scans the current repository recursively.
|
|
23
23
|
- It supports nested directories all the way down the tree.
|
|
24
24
|
- It skips provider-irrelevant or local-only roots such as `.git`, `.oat`, `.worktrees`, and `node_modules`.
|
|
25
|
+
- Exception: `.oat/repo/**` is scanned even though the rest of `.oat/` is skipped, so the curated `AGENTS.md` files there (repo root guidance, `pjm/`, `reference/`) get their sibling `CLAUDE.md` shims managed and validated like any other directory. The rest of `.oat/` (`templates/`, `projects/`, `sync/`) stays excluded.
|
|
25
26
|
- It does not scan user-level provider roots such as `~/.claude` in this release.
|
|
26
27
|
|
|
27
28
|
## Canonical Model
|
|
@@ -68,7 +68,7 @@ Notable commands introduced in the current CLI surface:
|
|
|
68
68
|
- `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.
|
|
69
69
|
- `oat project validate-plan --project-path <path>` - validates `oat_plan_parallel_groups` metadata in `plan.md`; exits non-zero on invalid. See [Implementation Execution](../workflows/projects/implementation-execution.md#validating-plan-metadata).
|
|
70
70
|
- `oat project set-mode` — deprecated no-op. Execution mode is no longer user-selectable; emits a deprecation warning and preserves the `--json` contract.
|
|
71
|
-
- `oat gate review <prompt...>` - run a stateful OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings; produced gate reviews use `oat_review_invocation: gate` and still require `oat-project-review-receive` handoff before they are dispositioned.
|
|
71
|
+
- `oat gate review <prompt...>` - run a stateful OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings; produced gate reviews use `oat_review_invocation: gate` and still require `oat-project-review-receive` handoff before they are dispositioned. With `--json`, the result envelope on exit is the canonical completion signal — `status` (`ok` | `blocked` | `review_failed` | `artifact_validation_failed`), `runId`, `generatedAt`, `artifactPath` — so orchestrators should read it rather than poll the filesystem. Runs standalone (e.g. `--review-scope final`), not only inside `oat-project-implement`. See [Workflow Gates → Gate completion signal](../cli-utilities/workflow-gates.md#gate-completion-signal).
|
|
72
72
|
- `oat gate cross-provider-exec <prompt...>` - choose an available exec target while avoiding the current runtime by default, then run the prompt with the chosen target's configured base command and exit with the child status.
|
|
73
73
|
|
|
74
74
|
## `oat config` surface flags
|
|
@@ -57,6 +57,7 @@ See [Project Splitting](splitting.md) for the full parent/child model.
|
|
|
57
57
|
|
|
58
58
|
- `oat_plan_hill_phases` — list of phase IDs to pause at for HiLL checkpoints.
|
|
59
59
|
- `oat_plan_parallel_groups` — declares which phases may execute concurrently in worktrees. See below.
|
|
60
|
+
- `oat_phase_review_gate` — opt-in non-pausing external review gate that runs after a phase's standard reviewer passes. See below.
|
|
60
61
|
|
|
61
62
|
#### oat_plan_parallel_groups
|
|
62
63
|
|
|
@@ -85,6 +86,27 @@ Each inner array is a group of phases that execute concurrently in their own wor
|
|
|
85
86
|
|
|
86
87
|
Before dispatching, `oat-project-implement` invokes `oat project validate-plan --project-path "${PROJECT_PATH}"`. Non-zero exit blocks the run. See [CLI Reference](../../reference/cli-reference.md) and [Implementation Execution](implementation-execution.md) for details.
|
|
87
88
|
|
|
89
|
+
#### oat_phase_review_gate
|
|
90
|
+
|
|
91
|
+
Enable an optional, non-pausing external review gate that runs after each selected phase's standard reviewer passes and its bookkeeping is committed:
|
|
92
|
+
|
|
93
|
+
```yaml
|
|
94
|
+
oat_phase_review_gate:
|
|
95
|
+
enabled: true
|
|
96
|
+
phases: [] # empty or omitted = every implementation phase
|
|
97
|
+
review_type: code
|
|
98
|
+
exit_nonzero_on: important
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Semantics:**
|
|
102
|
+
|
|
103
|
+
- Missing, `null`, or `enabled: false` → disabled (default). `enabled: true` activates the gate.
|
|
104
|
+
- `phases` → optional. Empty or missing runs the gate after every implementation phase; a populated list restricts it to those phase IDs, each of which must exist in the plan body.
|
|
105
|
+
- `review_type` → optional, defaults to `code`. Only `code` is supported for phase gates.
|
|
106
|
+
- `exit_nonzero_on` → optional, defaults to `important`. One of `critical`, `important`, `medium`, `minor`. This is the blocking threshold: findings at or above it stop the phase; sub-threshold findings are dispositioned by the judgment sweep rather than ignored.
|
|
107
|
+
|
|
108
|
+
A malformed gate stops the run before task execution rather than being silently disabled. The gate is independent of HiLL checkpoints and reuses the existing `oat gate review` target config — it does not hardcode a `--target`. See [Reviews → Phase review gate](reviews.md#phase-review-gate) for the runtime behavior and disposition rules.
|
|
109
|
+
|
|
88
110
|
## Reference artifacts
|
|
89
111
|
|
|
90
112
|
- `.oat/templates/*.md`
|
|
@@ -10,6 +10,8 @@ OAT supports two checkpoint classes:
|
|
|
10
10
|
- Workflow phase checkpoints
|
|
11
11
|
- Plan phase checkpoints
|
|
12
12
|
|
|
13
|
+
The [phase review gate](reviews.md#phase-review-gate) (`oat_phase_review_gate`) is a separate, non-pausing mechanism — it does not pause on a passing gate and never modifies the HiLL keys below (`oat_hill_completed`, `oat_plan_hill_phases`).
|
|
14
|
+
|
|
13
15
|
## Workflow checkpoints (`state.md`)
|
|
14
16
|
|
|
15
17
|
Frontmatter keys:
|
|
@@ -187,7 +187,8 @@ For each phase in the plan (whether sequential or inside a parallel group):
|
|
|
187
187
|
5. **Parse the verdict:** zero Critical + zero Important findings → `pass`; otherwise `fail`.
|
|
188
188
|
6. **On fail, run the bounded fix loop** (see below).
|
|
189
189
|
7. **Update artifacts** (`implementation.md`, `plan.md` review row, `state.md`) and make the mandatory bookkeeping commit.
|
|
190
|
-
8. **
|
|
190
|
+
8. **Phase review gate** — when `oat_phase_review_gate` selects the phase, run the optional non-pausing external gate (`oat gate review`) after the step 7 bookkeeping commit and before the HiLL check. A passing gate continues automatically; a blocking gate is received and fixed, reusing the bounded fix loop's `oat_orchestration_retry_limit`. See [Reviews → Phase review gate](reviews.md#phase-review-gate).
|
|
191
|
+
9. **HiLL checkpoint** if the phase id is listed in `oat_plan_hill_phases`.
|
|
191
192
|
|
|
192
193
|
### Bounded fix loop
|
|
193
194
|
|
|
@@ -107,6 +107,23 @@ Auto-triggered reviews use `oat_review_invocation: auto` in the review artifact
|
|
|
107
107
|
|
|
108
108
|
This feature is opt-in and disabled by default. When disabled, the manual `oat-project-review-provide` workflow applies.
|
|
109
109
|
|
|
110
|
+
## Phase review gate
|
|
111
|
+
|
|
112
|
+
The phase review gate is an optional, **non-pausing** external review gate that runs after a phase's standard per-phase reviewer passes and the phase bookkeeping is committed. Where the Tier 1 reviewer is an in-session self-review, the gate calls `oat gate review` against the configured cross-provider target, adding an independent perspective before implementation moves to the next phase. It is enabled per-project through `plan.md` frontmatter (`oat_phase_review_gate`; see [Project Artifacts](artifacts.md#oat_phase_review_gate) for the field shape and validation).
|
|
113
|
+
|
|
114
|
+
It is independent of [HiLL checkpoints](hill-checkpoints.md): a passing gate does not pause, and the gate never touches `oat_hill_completed`, `oat_plan_hill_phases`, or `oat_auto_review_at_hill_checkpoints`.
|
|
115
|
+
|
|
116
|
+
Gate-produced review artifacts use `oat_review_invocation: gate` in frontmatter (the third invocation marker alongside `manual` and `auto`). The gate verdict — controlled by `exit_nonzero_on` (default `important`) — decides whether the **phase stops**; it does not decide whether sub-threshold findings are ignored. Either way the produced artifact is consumed by `oat-project-review-receive`, autonomously and without user prompts, so findings never evaporate:
|
|
117
|
+
|
|
118
|
+
- **Passing gate** (no findings at or above the threshold): receive runs a non-pausing **judgment sweep**. It makes a per-finding decision for each Medium/Minor — defer to final review (the default, recorded so [final review](#phase-and-final-review) resurfaces it), address now (only for small, contained, low-risk fixes, which do **not** re-trigger the standard reviewer or re-gate the phase), or reject with rationale — then archives the artifact. Address-now is an exception, not the norm; if such a fix reveals a Critical/Important concern it escalates to the blocking path.
|
|
119
|
+
- **Blocking gate** (one or more findings at or above the threshold): receive converts findings to fix tasks and implementation re-runs the standard reviewer and the gate for the phase. These block → fix → re-gate rounds are bounded by `oat_orchestration_retry_limit` (default `2`); exhausting the bound stops a sequential run or excludes the phase in a parallel group, matching the standard fix loop's terminal handling.
|
|
120
|
+
|
|
121
|
+
Gate-originated artifacts (`oat_review_invocation: gate`) are excluded from the same-scope review-cycle cap in `oat-project-review-receive`. The cap measures failed fix cycles of the standard review loop, so counting gate artifacts would trip it on artifact volume rather than real fix rounds.
|
|
122
|
+
|
|
123
|
+
When a phase is re-gated multiple times, each round produces a distinct review artifact — filenames and `oat_generated_at` are seconds-precision, so rounds never collide and `oat review latest` resolves the newest. An orchestrator should know a gate finished from the `oat --json gate review` result envelope on process exit (`status`, `runId`, `generatedAt`), not by watching the `reviews/` directory or the provider's log; see [Gate completion signal](../../cli-utilities/workflow-gates.md#gate-completion-signal).
|
|
124
|
+
|
|
125
|
+
This feature is opt-in and disabled by default (missing or `enabled: false`). For a parallel phase group, selected gates run after fan-in and bookkeeping, one per merged phase in plan order.
|
|
126
|
+
|
|
110
127
|
## Auto artifact-review loops
|
|
111
128
|
|
|
112
129
|
Generated planning and analysis artifacts have a separate review loop from code/phase reviews.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-pjm-review-backlog
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.4.0
|
|
4
4
|
description: Use when prioritizing the file-backed repo backlog or evaluating roadmap alignment. Produces value-effort ratings, dependency mapping, and execution recommendations.
|
|
5
5
|
argument-hint: '[backlog-root] [--roadmap=<path>] [--output=<path>]'
|
|
6
6
|
disable-model-invocation: true
|
|
@@ -48,12 +48,13 @@ When executing this skill, provide lightweight progress feedback so the user can
|
|
|
48
48
|
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
49
49
|
|
|
50
50
|
- Before multi-step work, print short step indicators, e.g.:
|
|
51
|
-
- `[1/
|
|
52
|
-
- `[2/
|
|
53
|
-
- `[3/
|
|
54
|
-
- `[4/
|
|
55
|
-
- `[5/
|
|
56
|
-
- `[6/
|
|
51
|
+
- `[1/7] Resolving backlog inputs…`
|
|
52
|
+
- `[2/7] Cataloging backlog items…`
|
|
53
|
+
- `[3/7] Reading codebase context…`
|
|
54
|
+
- `[4/7] Writing review document…`
|
|
55
|
+
- `[5/7] Summarizing recommendations…`
|
|
56
|
+
- `[6/7] (Optional) Priority-alignment walkthrough…` — only print after the operator accepts the offer in Step 9
|
|
57
|
+
- `[7/7] (Optional) Refreshing project kickoff handoffs…` — only print after the operator agrees a kickoff stack in Step 10
|
|
57
58
|
|
|
58
59
|
## Arguments
|
|
59
60
|
|
|
@@ -225,6 +226,26 @@ If the operator declines, stop after the summary. Do not silently write or modif
|
|
|
225
226
|
|
|
226
227
|
When referencing backlog items inside the priority-alignment doc, the **Reference Format Convention** still applies — link to the item file and pair the ID with a human-readable title.
|
|
227
228
|
|
|
229
|
+
### Step 10: Refresh Project Kickoff Handoffs (Optional)
|
|
230
|
+
|
|
231
|
+
When a priority-alignment pass concludes (Step 9), generate or refresh one **kickoff handoff** per item in the agreed kickoff stack. A handoff is a one-shot kickoff prompt — consumable context for turning a backlog item into a project, not durable documentation. The item file and `reference/` remain the source of truth. Handoffs live under `.oat/repo/pjm/handoffs/`; see that directory's `README.md` for the convention (generated by `oat pjm init`).
|
|
232
|
+
|
|
233
|
+
This step mirrors the **Project Kickoff Handoffs** section of the pjm instruction template (`pjm/AGENTS.md`) — follow that section's semantics; do not invent divergent wording. It is **collaborative and human-gated**: kickoff-stack membership, lane count, and ordering are the operator's decisions from Step 9. Present them; do not choose them. Do not generate handoffs for parked or queued items until they are actually next.
|
|
234
|
+
|
|
235
|
+
**When to run:** only after the operator has agreed a kickoff stack in the Step 9 walkthrough. If Step 9 was declined or produced no kickoff stack, skip this step.
|
|
236
|
+
|
|
237
|
+
**For each item in the agreed kickoff stack**, write or refresh `.oat/repo/pjm/handoffs/<BL-id>.md` with:
|
|
238
|
+
|
|
239
|
+
- the backlog item reference — its ID **and** human-readable title **and** path (never a bare ID);
|
|
240
|
+
- the recommended project mode (`oat-project-quick-start` vs `oat-project-new`), including which artifacts (spec/design/plan) to pre-populate from existing research when it exists;
|
|
241
|
+
- authoritative input pointers (research directories, decision records, code paths);
|
|
242
|
+
- repo conventions and verification gates the item file does not restate;
|
|
243
|
+
- a close-out section requiring (a) the **Backlog Lifecycle** — `oat backlog archive <id>` — executed in the same PR that ships the item, and (b) deletion of the handoff file (`git rm`) in that same PR.
|
|
244
|
+
|
|
245
|
+
**Staleness:** if this alignment pass drops an item from the kickoff stack, delete its handoff (`git rm .oat/repo/pjm/handoffs/<BL-id>.md`) in the same pass rather than letting it drift.
|
|
246
|
+
|
|
247
|
+
Every backlog item reference in a handoff — like every reference in review output and alignment docs — pairs the ID with its human-readable title per the **Reference Format Convention**. No bare IDs.
|
|
248
|
+
|
|
228
249
|
## Success Criteria
|
|
229
250
|
|
|
230
251
|
- Every active backlog item file has a value-effort rating with rationale
|
|
@@ -234,4 +255,5 @@ When referencing backlog items inside the priority-alignment doc, the **Referenc
|
|
|
234
255
|
- Output document follows the review template structure
|
|
235
256
|
- Living review is written to `.oat/repo/pjm/backlog/reviews/backlog-and-roadmap-review.md` (unless `--output` is explicitly overridden); dated snapshots, when emitted, live in the same `backlog/reviews/` directory and never under `.oat/repo/reviews/`
|
|
236
257
|
- The operator is offered (but never forced into) a collaborative walkthrough that produces or updates `backlog/reviews/priority-alignment.md`; if the operator accepts, the file is written using the priority-alignment template and includes a Changelog entry for this pass; if the operator declines, no file is created or modified
|
|
258
|
+
- When a priority-alignment pass produces an agreed kickoff stack, one handoff per kickoff-stack item is written or refreshed under `.oat/repo/pjm/handoffs/` (with item reference, recommended mode, input pointers, repo conventions/gates, and a close-out requiring the Backlog Lifecycle executed and the handoff deleted in the same shipping PR); handoffs for reprioritized-out items are deleted in the same pass; kickoff-stack membership, lane count, and ordering remain human decisions the skill presents rather than chooses
|
|
237
259
|
- Every user-facing reference to a backlog item pairs the ID with a human-readable title (per the Reference Format Convention)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-pjm-update-repo-reference
|
|
3
|
-
version: 1.
|
|
3
|
+
version: 1.3.0
|
|
4
4
|
description: Use when repo reference artifacts need updating — roadmap, decision records, backlog status, or completed history. Frequently invoked at project completion, often chained from `oat-project-document`, to ensure active `.oat/repo/pjm/` state and durable `.oat/repo/reference/` records reflect what shipped.
|
|
5
5
|
disable-model-invocation: false
|
|
6
6
|
user-invocable: true
|
|
@@ -69,7 +69,11 @@ For recently completed or in-progress projects, read `discovery.md`, `spec.md`,
|
|
|
69
69
|
Promote notable findings into one of:
|
|
70
70
|
|
|
71
71
|
- Backlog item files under `.oat/repo/pjm/backlog/items/`
|
|
72
|
-
- Completed
|
|
72
|
+
- Completed close-outs via `oat backlog archive <id>` (see Step 4) — the atomic
|
|
73
|
+
command flips the item's `status`, appends the canonical
|
|
74
|
+
`.oat/repo/pjm/backlog/completed.md` entry, moves the item file into
|
|
75
|
+
`archived/`, and regenerates the index in one step. Reserve hand-editing
|
|
76
|
+
`completed.md` for narrative touch-ups the command does not own.
|
|
73
77
|
- Decision records under `.oat/repo/reference/decisions/`, created with
|
|
74
78
|
`oat decision new "<title>"` (delegate to `oat-pjm-decision` for a guided
|
|
75
79
|
capture). Do not hand-author decision files or write into a legacy
|
|
@@ -89,16 +93,32 @@ Update these files as applicable:
|
|
|
89
93
|
4. `.oat/repo/pjm/backlog/items/*.md`
|
|
90
94
|
- Add or update active backlog items as file-backed records.
|
|
91
95
|
5. `.oat/repo/pjm/backlog/completed.md`
|
|
92
|
-
- Keep newest completed summaries first.
|
|
96
|
+
- Keep newest completed summaries first. Prefer letting `oat backlog archive <id>`
|
|
97
|
+
append the canonical entry (see below) over hand-editing.
|
|
93
98
|
6. `.oat/repo/pjm/backlog/archived/*.md`
|
|
94
|
-
-
|
|
99
|
+
- Item files land here automatically when you run `oat backlog archive <id>`.
|
|
100
|
+
Only hand-add or enrich a file here when a completed item needs preserved
|
|
101
|
+
detail the command did not capture.
|
|
95
102
|
7. `.oat/repo/reference/decisions/`
|
|
96
103
|
- Create new decisions with `oat decision new` (see `oat-pjm-decision`); the
|
|
97
104
|
command writes one `DR-YYMMDD-slug` record and regenerates the managed
|
|
98
105
|
decision index. Do not hand-edit `reference/decisions/index.md` inside its
|
|
99
106
|
managed markers.
|
|
100
107
|
|
|
101
|
-
|
|
108
|
+
To close out a completed backlog item, run the atomic close-out command rather
|
|
109
|
+
than moving files by hand:
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
oat backlog archive <id> --summary "one-line outcome"
|
|
113
|
+
# abandoned work: oat backlog archive <id> --wont-do --summary "why"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
This flips the item's `status` to a terminal value (`closed`/`wont_do` — never
|
|
117
|
+
invent variants like `done`), stamps `updated`, appends the canonical
|
|
118
|
+
newest-first `completed.md` entry, moves the item file from `items/` into
|
|
119
|
+
`archived/`, and regenerates the managed index in one step. Only when you edit
|
|
120
|
+
backlog files by hand outside this command (curated overview text, an enriched
|
|
121
|
+
`archived/` record) re-run the index regeneration:
|
|
102
122
|
|
|
103
123
|
```bash
|
|
104
124
|
oat backlog regenerate-index
|