@open-agent-toolkit/cli 0.3.19 → 0.3.20
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/README.md +2 -1
- package/assets/agents/oat-phase-implementer.md +26 -3
- package/assets/agents/oat-reviewer.md +8 -3
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/reference/cli-reference.md +12 -7
- package/assets/docs/reference/oat-directory-structure.md +1 -0
- package/assets/docs/reference/project-artifacts.md +56 -1
- package/assets/docs/reference/project-state-machine.md +41 -7
- package/assets/docs/skills/brainstorm.md +3 -2
- package/assets/docs/skills/index.md +13 -10
- package/assets/docs/workflows/advanced/autonomy.md +3 -1
- package/assets/docs/workflows/advanced/dispatch-ceiling.md +2 -2
- package/assets/docs/workflows/advanced/workflow-gates.md +17 -4
- package/assets/docs/workflows/approvals-and-automation.md +21 -10
- package/assets/docs/workflows/choose-workflow.md +17 -9
- package/assets/docs/workflows/ideas/index.md +1 -1
- package/assets/docs/workflows/ideas/lifecycle.md +3 -2
- package/assets/docs/workflows/projects/closeout/closeout-skills.md +80 -7
- package/assets/docs/workflows/projects/closeout/pr-flow.md +7 -1
- package/assets/docs/workflows/projects/execution/execution-skills.md +16 -3
- package/assets/docs/workflows/projects/execution/implementation-execution.md +1 -1
- package/assets/docs/workflows/projects/execution/picking-up-projects.md +11 -1
- package/assets/docs/workflows/projects/lifecycle.md +108 -9
- package/assets/docs/workflows/projects/planning/hill-checkpoints.md +6 -6
- package/assets/docs/workflows/projects/planning/planning-skills.md +9 -7
- package/assets/docs/workflows/projects/planning/starting-projects.md +57 -11
- package/assets/docs/workflows/projects/reviews/index.md +22 -1
- package/assets/docs/workflows/projects/reviews/review-flavors.md +5 -3
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-brainstorm/SKILL.md +34 -9
- package/assets/skills/oat-brainstorm/references/destinations.md +6 -3
- package/assets/skills/oat-docs/SKILL.md +7 -3
- package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
- package/assets/skills/oat-project-autonomous/SKILL.md +9 -3
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +151 -132
- package/assets/skills/oat-project-brief/SKILL.md +1 -1
- package/assets/skills/oat-project-brief/references/brief-contract.md +458 -9
- package/assets/skills/oat-project-brief/references/docs/autonomy-contract.md +151 -132
- package/assets/skills/oat-project-brief/references/docs/gate-approval-record.md +9 -0
- package/assets/skills/oat-project-capture/SKILL.md +2 -2
- package/assets/skills/oat-project-complete/SKILL.md +14 -5
- package/assets/skills/oat-project-discover/SKILL.md +3 -2
- package/assets/skills/oat-project-document/SKILL.md +12 -6
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +151 -132
- package/assets/skills/oat-project-goal/SKILL.md +697 -0
- package/assets/skills/oat-project-goal/references/docs/autonomy-contract.md +412 -0
- package/assets/skills/oat-project-goal/references/docs/gate-approval-record.md +93 -0
- package/assets/skills/oat-project-implement/SKILL.md +1 -1
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +67 -0
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +151 -132
- package/assets/skills/oat-project-implement/references/docs/gate-approval-record.md +9 -0
- package/assets/skills/oat-project-implement/references/phase-execution.md +10 -3
- package/assets/skills/oat-project-implement/references/plan-and-resume.md +28 -1
- package/assets/skills/oat-project-lite/SKILL.md +1 -1
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +151 -132
- package/assets/skills/oat-project-new/SKILL.md +3 -3
- package/assets/skills/oat-project-next/SKILL.md +45 -15
- package/assets/skills/oat-project-next/references/docs/gate-approval-record.md +9 -0
- package/assets/skills/oat-project-plan/SKILL.md +14 -3
- package/assets/skills/oat-project-plan-writing/SKILL.md +6 -4
- package/assets/skills/oat-project-pr-final/SKILL.md +51 -1
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +151 -132
- package/assets/skills/oat-project-pr-progress/SKILL.md +97 -3
- package/assets/skills/oat-project-progress/SKILL.md +38 -5
- package/assets/skills/oat-project-progress/references/docs/gate-approval-record.md +9 -0
- package/assets/skills/oat-project-quick-start/SKILL.md +14 -9
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +151 -132
- package/assets/skills/oat-project-quick-start/references/docs/gate-approval-record.md +9 -0
- package/assets/skills/oat-project-reconcile/SKILL.md +31 -2
- package/assets/skills/oat-project-review-provide/SKILL.md +79 -13
- package/assets/skills/oat-project-review-receive/SKILL.md +70 -1
- package/assets/skills/oat-project-revise/SKILL.md +25 -1
- package/assets/skills/oat-project-summary/SKILL.md +60 -5
- package/assets/skills/oat-wave-execute/SKILL.md +2 -2
- package/assets/templates/state.md +1 -1
- package/dist/commands/project/closeout-check/closeout-invariant.d.ts +119 -3
- package/dist/commands/project/closeout-check/closeout-invariant.d.ts.map +1 -1
- package/dist/commands/project/closeout-check/closeout-invariant.js +454 -2
- package/dist/commands/project/closeout-check/index.d.ts +21 -3
- package/dist/commands/project/closeout-check/index.d.ts.map +1 -1
- package/dist/commands/project/closeout-check/index.js +190 -4
- package/dist/commands/project/complete-state/index.d.ts +2 -1
- package/dist/commands/project/complete-state/index.d.ts.map +1 -1
- package/dist/commands/project/complete-state/index.js +7 -1
- package/dist/commands/project/delivery/check.d.ts +66 -0
- package/dist/commands/project/delivery/check.d.ts.map +1 -0
- package/dist/commands/project/delivery/check.js +232 -0
- package/dist/commands/project/delivery/evidence.d.ts +171 -0
- package/dist/commands/project/delivery/evidence.d.ts.map +1 -0
- package/dist/commands/project/delivery/evidence.js +902 -0
- package/dist/commands/project/delivery/index.d.ts +7 -0
- package/dist/commands/project/delivery/index.d.ts.map +1 -0
- package/dist/commands/project/delivery/index.js +13 -0
- package/dist/commands/project/delivery/refresh.d.ts +110 -0
- package/dist/commands/project/delivery/refresh.d.ts.map +1 -0
- package/dist/commands/project/delivery/refresh.js +441 -0
- package/dist/commands/project/index.d.ts.map +1 -1
- package/dist/commands/project/index.js +2 -0
- package/dist/commands/project/log/append.d.ts +6 -0
- package/dist/commands/project/log/append.d.ts.map +1 -1
- package/dist/commands/project/log/append.js +6 -1
- package/dist/commands/project/new/scaffold.d.ts.map +1 -1
- package/dist/commands/project/new/scaffold.js +47 -1
- package/dist/commands/project/promote/promote.d.ts +15 -1
- package/dist/commands/project/promote/promote.d.ts.map +1 -1
- package/dist/commands/project/promote/promote.js +99 -15
- package/dist/commands/project/validate-plan/index.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/index.js +10 -0
- package/dist/commands/project/validate-plan/profiles.d.ts +19 -4
- package/dist/commands/project/validate-plan/profiles.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/profiles.js +153 -2
- 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.map +1 -1
- package/dist/commands/state/generate.js +35 -4
- package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-manifest.js +1 -0
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -62,7 +62,8 @@ Use these commands when you want structured runtime/project state out of the CLI
|
|
|
62
62
|
- `oat config dump --json` - emit merged OAT config with per-key source attribution
|
|
63
63
|
- `oat project status --json` - emit the active project's full parsed control-plane state
|
|
64
64
|
- `oat project list --json` - emit summary state for tracked projects under the configured projects root
|
|
65
|
-
- `oat project closeout-check <project-path> --json` - report whether a configured, autonomous, or lite closeout's `oat_post_implement_sequence` snapshot permits terminal completion, and which step or
|
|
65
|
+
- `oat project closeout-check <project-path> --json` - report whether a configured, autonomous, or lite closeout's `oat_post_implement_sequence` snapshot permits terminal completion and, for a goal project, whether the declaration, outcome audit, and delivery coverage boundary holds, and which step, approval, or skill owns it next (read-only)
|
|
66
|
+
- `oat project delivery check --project <path> --subject <mNN|dNN> --json` - read-only goal delivery evidence report for a milestone or registered delivery (`status: ok`, or `undeliverable` with exit 1)
|
|
66
67
|
- `oat project complete-state <project-path>` - emit the canonical completed lifecycle shape into a tracked project's `state.md`; refuses the same incomplete closeout `closeout-check` reports
|
|
67
68
|
|
|
68
69
|
## Requirements
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-phase-implementer
|
|
3
|
-
version: 1.1.
|
|
3
|
+
version: 1.1.9
|
|
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
|
|
@@ -29,7 +29,7 @@ The root supplies:
|
|
|
29
29
|
- `mode`: `implement`, `fix`, or `recover`;
|
|
30
30
|
- `artifact_paths`: available plan, design, spec, discovery, implementation,
|
|
31
31
|
and imported-plan paths;
|
|
32
|
-
- `workflow_mode`: `spec-driven`, `quick`, `import`, `lite`, or `
|
|
32
|
+
- `workflow_mode`: `spec-driven`, `quick`, `import`, `lite`, `brief`, or `goal`;
|
|
33
33
|
- `commit_convention`: exact task/fix commit convention;
|
|
34
34
|
- `phase_base_head`: root-recorded HEAD before phase dispatch;
|
|
35
35
|
- `worktree`: assigned phase worktree or orchestration checkout;
|
|
@@ -132,10 +132,13 @@ Read each required artifact once at phase start:
|
|
|
132
132
|
`implementation.md`; and sections 3, 6, 7, and 10 of
|
|
133
133
|
`oat-project-brief/references/brief-contract.md`. Discovery, spec, and design
|
|
134
134
|
are absent by design.
|
|
135
|
+
- `goal`: everything `brief` reads, plus the `## Milestones` table and
|
|
136
|
+
section 12 of the brief contract. The Phase Scope names the milestone,
|
|
137
|
+
recovery, or terminal scope the phase belongs to.
|
|
135
138
|
|
|
136
139
|
Extract all phase tasks, dependency order, file boundaries, verification
|
|
137
140
|
commands, commit messages, and phase-wide verification before editing. In
|
|
138
|
-
`brief`
|
|
141
|
+
`brief` and `goal` modes there are no planned tasks to extract: extract the phase's Intent,
|
|
139
142
|
its Exit evidence as the phase-wide verification, and the Phase Scope's commit
|
|
140
143
|
convention, and follow `## Brief Mode` below.
|
|
141
144
|
|
|
@@ -424,6 +427,25 @@ belongs to a revision phase the root appends.
|
|
|
424
427
|
the Task column with its terminal status and commit, and add
|
|
425
428
|
`**Phase anchors:** {anchor_base}..{head}` below the header fields.
|
|
426
429
|
|
|
430
|
+
## Goal Mode
|
|
431
|
+
|
|
432
|
+
This section applies only when `workflow_mode` is `goal`. Every `## Brief Mode`
|
|
433
|
+
rule applies unchanged, and section 12 of the brief contract wins where this
|
|
434
|
+
section restates it.
|
|
435
|
+
|
|
436
|
+
- **Scope.** Execute only the dispatched phase. Its milestone, recovery, or
|
|
437
|
+
terminal scope is context, never permission to touch another milestone's
|
|
438
|
+
phases.
|
|
439
|
+
- **Root-owned goal records.** Never write `oat_milestone`,
|
|
440
|
+
`oat_milestone_status`, `oat_goal_status`, `oat_goal_outcome_audit`,
|
|
441
|
+
`oat_goal_recovery`, `oat_milestone_gates`, `oat_deliveries`, or the
|
|
442
|
+
`## Milestones` table. Milestone closeout, the exit-gate carrier, recovery
|
|
443
|
+
stages, delivery registration, and the declaration are root and skill
|
|
444
|
+
transitions, not phase work.
|
|
445
|
+
- **Recovery phases.** A recovery scope's phase (often a `p-revN` that
|
|
446
|
+
corrects an older milestone's phase) follows the brief late-fix and revision
|
|
447
|
+
rules; report its head like any sequential phase.
|
|
448
|
+
|
|
427
449
|
## Mode: Implement
|
|
428
450
|
|
|
429
451
|
### 1. Verify Phase Base
|
|
@@ -562,6 +584,7 @@ After all task commits:
|
|
|
562
584
|
- `import`: `plan.md` and the imported plan, plus design/spec when present;
|
|
563
585
|
- `brief`: the phase's Intent and Exit evidence plus the brief's Outcomes,
|
|
564
586
|
Constraints and Out of Scope, and Decisions;
|
|
587
|
+
- `goal`: as `brief`, within the dispatched milestone's scope;
|
|
565
588
|
- confirm no task boundary or dependency was missed; and
|
|
566
589
|
- report Medium/Low concerns without launching a reviewer.
|
|
567
590
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: oat-reviewer
|
|
3
|
-
version: 1.2.
|
|
3
|
+
version: 1.2.13
|
|
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
|
|
@@ -50,10 +50,10 @@ You will be given a "Review Scope" block including:
|
|
|
50
50
|
- **commits/range**: Git commits or SHA range for changed files. For code review, this is the authoritative review surface.
|
|
51
51
|
- **files_changed**: Optional orientation hint listing files believed to be modified in scope. If this disagrees with the commit range, trust the commit range.
|
|
52
52
|
- **analysis_artifact**: For `type: analysis`, path to the severity-rated analysis artifact to fact-check.
|
|
53
|
-
- **workflow_mode**: `spec-driven` | `quick` | `import` | `lite` | `brief` (default to `spec-driven` if absent)
|
|
53
|
+
- **workflow_mode**: `spec-driven` | `quick` | `import` | `lite` | `brief` | `goal` (default to `spec-driven` if absent)
|
|
54
54
|
- **artifact_paths**: Paths to available artifacts (spec/design/plan/implementation/discovery/import reference)
|
|
55
55
|
- **tasks_in_scope**: Task IDs being reviewed (if task/phase scope). In `brief` mode these are the execution-record IDs under the phases in scope; they label commits and never narrow the range.
|
|
56
|
-
- **Brief anchor record**: For `brief` code reviews, the caller supplies `oat_review_requested_scope`, `oat_review_phase_ids` (ordered), `oat_review_base_sha`, `oat_review_scope_source` (`anchors` | `merge-base-range` | `explicit` | `merge-base` | `narrowed`), and, when they apply, `oat_review_fallback_reason`, `oat_review_integration_commits`, and `oat_review_narrowed_from`. Copy them verbatim into artifact frontmatter (Step 8).
|
|
56
|
+
- **Brief anchor record**: For `brief` code reviews, the caller supplies `oat_review_requested_scope`, `oat_review_phase_ids` (ordered), `oat_review_base_sha`, `oat_review_scope_source` (`anchors` | `merge-base-range` | `explicit` | `merge-base` | `narrowed`), and, when they apply, `oat_review_fallback_reason`, `oat_review_integration_commits`, and `oat_review_narrowed_from`. Copy them verbatim into artifact frontmatter (Step 8). In `goal` mode the same record applies; for an integrated milestone or delivery review `oat_review_requested_scope` is the milestone or delivery ID (`mNN` or `mNN/dNN`) and `oat_review_phase_ids` is the explicit ordered phase set.
|
|
57
57
|
- **oat_output_mode**: Optional output-sink selector. Absent (or any value other than `structured`) means **artifact mode** — write the review artifact to disk per Step 8. `structured` means **structured-output mode** — return a `StructuredFindings` object in-memory and write NO artifact file (see **Structured-Output Mode**). This key parallels the existing `oat_review_invocation` dispatch-payload naming.
|
|
58
58
|
- **oat_review_invocation**: Optional provenance selector for artifact-mode reviews. Use `manual`, `auto`, or `gate`; default to `manual` when absent.
|
|
59
59
|
- **Code-review provenance**: For artifact-mode code reviews, resolve the authoritative range head with `git rev-parse <authoritative-range-head>^{commit}` and record the resulting full 40-character commit SHA as `oat_review_head_sha`. If the review is narrowed, also record the resolved range, prior artifact path, and prior reviewed head supplied by the caller.
|
|
@@ -131,6 +131,7 @@ Use workflow mode to determine required evidence:
|
|
|
131
131
|
- **import**: `plan.md` is expected (`references/imported-plan.md` preferred; `spec.md`/`design.md` optional).
|
|
132
132
|
- **lite**: `plan.md` and `implementation.md` are expected; discovery, spec, and design are absent by design.
|
|
133
133
|
- **brief**: `plan.md` (a Project Brief) and `implementation.md` (the per-phase journal) are expected; discovery, spec, and design are absent by design. `oat-project-brief/references/brief-contract.md` defines the brief sections, phase grammar, journal markers, and anchor rules, and the caller supplies it with the Review Scope.
|
|
134
|
+
- **goal**: as **brief**, plus the canonical `## Milestones` table in `plan.md` and the goal state in `state.md`; section 12 of the brief contract defines milestones, explicit review scopes, the delivery registry, and the terminal audit.
|
|
134
135
|
|
|
135
136
|
Do not mark missing optional artifacts as findings.
|
|
136
137
|
If required artifacts for the mode are unexpectedly missing, record a workflow contract gap.
|
|
@@ -166,6 +167,8 @@ Only review files/changes within the provided scope.
|
|
|
166
167
|
|
|
167
168
|
In `brief` mode the authoritative code-review range comes from the recorded phase anchors: `Base..Head` for one phase, or the first selected base through the last selected phase's head for a range or `final`. Commit-message `(pNN-` matches only label which commits belong to which phase and never narrow the range. When `oat_review_scope_source` is `merge-base-range`, review the entire supplied range. If an anchor is missing, does not exist, or contradicts the ordering rules in brief contract section 10, record a workflow contract gap rather than narrowing silently. Treat the listed integration commits as inside the range.
|
|
168
169
|
|
|
170
|
+
In `goal` mode an integrated milestone or delivery review judges exactly the explicit ordered phase set in `oat_review_phase_ids`, never a first–last expansion. The Git range may be wider: commits of phases outside the set that the Review Scope lists under `Intervening changes:` are context, not scope, so do not record findings against them and do not treat them as covered. A parallel group member's pre-fan-in review is member evidence only; integrated delivery evidence comes from the integration heads.
|
|
171
|
+
|
|
169
172
|
Do NOT:
|
|
170
173
|
|
|
171
174
|
- Review unrelated work outside the scope
|
|
@@ -183,6 +186,7 @@ For each requirement in scope, use the best available requirement source by mode
|
|
|
183
186
|
- `import`: normalized `plan.md` + `references/imported-plan.md` (if present)
|
|
184
187
|
- `lite`: the requirements contract in `plan.md`: Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria. Also use Product Behavior and/or Technical Design when selected by the recorded `minimal`, `product`, `technical`, or `both` content shape.
|
|
185
188
|
- `brief`: each phase in scope's `**Intent:**` and `**Exit evidence:**` lines plus the brief's Outcomes, Constraints and Out of Scope, and Decisions. A `final` review also audits every numbered Outcome against its observed evidence in the journal; an Outcome with neither evidence nor a recorded deferral is a finding. Execution records are evidence of committed work, not requirements.
|
|
189
|
+
- `goal`: as `brief`, scoped to the milestone or delivery set under review. A plan (artifact) review of a goal brief or amendment also checks the `## Milestones` table against brief contract section 12.1: every executable phase in exactly one milestone, phase IDs never reused, and no frozen delivery phase moved or removed.
|
|
186
190
|
|
|
187
191
|
Then verify:
|
|
188
192
|
|
|
@@ -290,6 +294,7 @@ Treat the artifact as a product deliverable. Verify it is:
|
|
|
290
294
|
- Task atomicity and verifiability: each task is independently committable, has bounded file scope, and has executable verification intent. Require a proportionate implementation and proof strategy only when the applicable workflow plan contract declares it; otherwise review the task's existing verification commands and evidence.
|
|
291
295
|
- Coverage of design/discovery: every in-scope design component or discovery decision is mapped to at least one task or explicitly deferred/out of scope.
|
|
292
296
|
- Parallelism-claim sanity: any parallel phase group or parallelism statement is consistent with declared file boundaries and dependency order.
|
|
297
|
+
- **Goal plan review** follows the brief plan review below, except that `## Milestones` holds the canonical table (brief contract section 12.1) instead of being empty, and an amendment review judges the named milestone's appended phases and any changed Outcomes, Decisions, or authority.
|
|
293
298
|
- **Brief plan review** replaces the task-oriented items above with the brief section list: Goal; numbered Outcomes, each naming its intended evidence; Approach (optional `### Design`); Constraints and Out of Scope; Decisions with rationale and rejected alternatives; Known Unknowns, each with the phase that settles it; Delivery endpoint and authority; an empty `## Milestones` section; `## Phase pNN:` blocks with non-empty Intent and Exit evidence, a `**Provisional:**` value of `yes` or `no`, and a concrete first phase; Parallelism; Reviews (preserved rows); Implementation Complete; References. Stable, never-reused phase IDs in document order replace stable task IDs. There is no task requirement; `### Task` headings in a brief are a finding, because execution records belong in the journal. Check that every Outcome is reachable through some phase's Exit evidence and that any declared parallel group passes the independence test in brief contract section 6.
|
|
294
299
|
|
|
295
300
|
6. **Necessary**
|
|
@@ -100,15 +100,18 @@ Lifecycle](../workflows/backlog-and-planning/backlog-lifecycle.md).
|
|
|
100
100
|
|
|
101
101
|
Notable commands introduced in the current CLI surface:
|
|
102
102
|
|
|
103
|
-
- `oat project new <slug> [--mode spec-driven|quick|import|lite|brief] --scope shared|local|synced [--force]` - create a
|
|
103
|
+
- `oat project new <slug> [--mode spec-driven|quick|import|lite|brief|goal] --scope shared|local|synced [--force]` - create a
|
|
104
104
|
project in an explicit scope. `--mode` selects the workflow mode and therefore
|
|
105
105
|
which artifacts are scaffolded; it defaults to `spec-driven`. Use `quick` for a
|
|
106
106
|
bounded feature with clear requirements, `import` to normalize an externally
|
|
107
107
|
authored plan, `lite` for a single-sitting change that scaffolds only
|
|
108
108
|
`plan.md`, `state.md`, and `implementation.md`, and `brief` for one delivery
|
|
109
109
|
planned as a Project Brief, which scaffolds the `plan-brief` and
|
|
110
|
-
`implementation-brief` templates plus `references/research
|
|
111
|
-
|
|
110
|
+
`implementation-brief` templates plus `references/research/`, and `goal` for
|
|
111
|
+
an outcome delivered in milestones, which scaffolds the same files with
|
|
112
|
+
`oat_plan_source: goal` and the canonical `| Milestone | Phases |` table
|
|
113
|
+
header. Start brief and goal projects with `oat-project-brief` or
|
|
114
|
+
`oat-project-goal`, which run this command themselves. See
|
|
112
115
|
[Lifecycle](../workflows/projects/lifecycle.md) for the per-lane flow. Without
|
|
113
116
|
`--scope`, creation uses
|
|
114
117
|
`projects.defaultScope`, which defaults to `synced`. Project slugs are
|
|
@@ -193,17 +196,19 @@ Notable commands introduced in the current CLI surface:
|
|
|
193
196
|
- `oat project status --field <path>` - print one arbitrary dot-path field from the same status payload, e.g. `project.workflowMode` or `project.timestamps.stateUpdated`. Missing/null fields print `null`; object and array fields print compact JSON.
|
|
194
197
|
- `oat project status --project-path <path>` - read from a repo-relative or absolute project path instead of `.oat/config.local.json`'s active project pointer. Combine it with `--field` or `--shell` when a skill has already resolved the target project path.
|
|
195
198
|
- `oat project status --shell NAME=path ...` - print shell-safe assignments for one or more fields from one status read, e.g. `WORKFLOW_MODE='quick'`. This is the preferred multi-field read API for skills. See [Writing Skills → Reading project state](../contributing/skills.md#reading-project-state) for examples and the `npx`-backed `oat` shim contract.
|
|
196
|
-
- `oat project promote <project-path> --to quick [--json]` - promote an authored lite or
|
|
199
|
+
- `oat project promote <project-path> --to quick [--json]` - promote an authored lite, brief, or settled goal project to quick mode. For a lite project, the command derives `discovery.md` from the lite plan's Summary, Decisions, Assumptions, Out of Scope, and Validation Criteria; carries Product Behavior into Success Criteria and Technical Design into a carried-forward discovery section when those adaptive sections are present; preserves the original as `references/lite-plan.md`; and scaffolds a fresh quick `plan.md`. For a brief project, it migrates each phase by state: accepted phases keep their completed execution records as quick tasks or get one synthesized `Accepted via phase evidence` task against the phase's `**Head:**`, active phases keep their completed records, and pending or provisional phases stay taskless and are listed in `oat_promotion_pending_phases` (quick plan readiness stays false until that list is empty); it renders the brief's sections into `discovery.md`, archives the original as `references/brief-archive.md`, and sets `oat_promoted_from` to the source mode (`brief`, or `goal` for a goal project). There is no reverse direction. A goal project promotes like a brief, but only at a settled delivery boundary: the active milestone is `delivered`, every `oat_deliveries` entry is `at_endpoint` or `superseded`, and no `oat_goal_recovery` is pending; otherwise it refuses with `goal-milestone-active`, `goal-recovery-pending`, or `goal-delivery-unsettled` (with a `deliveries` array naming the unsettled entries; an empty registry is also unsettled), and its archive appends the delivery history after the original brief. It refuses unsupported targets, projects that are neither lite, brief, nor goal, unreadable projects, an existing lite-plan reference, invalid authored sections, an existing brief archive (`brief-archive-exists`), an extracted journal phase (`extracted-phases`), a brief with no parseable phases (`invalid-brief-plan`), an accepted brief phase with no completed record and no `**Head:**` anchor (`missing-phase-head`), unresolved scope, unavailable templates, failed writes, or failed persistence. JSON output is `{ status: "promoted" | "refused", reason, files }`, plus an optional `phases` array naming the refused phases when `reason` is `missing-phase-head`; `reason` is the stable categorical contract and refused results exit non-zero.
|
|
197
200
|
- `oat template resolve <name> [--output <path>] [--json]` - resolve a template in repository (`<repo>/.oat/templates/`), user (`~/.oat/templates/`), then bundled order and report `name`, `found`, `tier` (`repository` | `user` | `bundle`), and `path`. `path` is set only for the repository and user tiers; it is `null` for the bundled tier, so callers never depend on a package-manager path. `<name>` accepts `plan` or `plan.md` and rejects path separators and `..`. `--output <path>` copies the resolved content to that file, replacing an existing file, and does not create missing parent directories; JSON output adds the absolute `output` path. A template missing from every tier exits 1 with `found: false`. Lifecycle skills use `--output` to copy their artifact templates, so a user-scope-only install works without a repository `.oat/templates/` directory.
|
|
198
201
|
- `oat review latest --json` - find the newest review artifact by `oat_generated_at`, scanning the active or specified project's `reviews/` and `reviews/archived/` directories plus ad-hoc review locations. Same-time candidates use target priority, then lifecycle recency (`final` > higher phase/task > lower phase/task). The JSON contract returns `path`, `scope`, `generatedAt`, `kind` (`project` or `adhoc`), `archived`, and `actionable`, with `null` values when no review exists. Archived project reviews remain discoverable as history but return `actionable: false`.
|
|
199
202
|
- `oat project list --json` - summary state for tracked projects under the configured projects root
|
|
200
|
-
- `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.
|
|
201
|
-
- `oat project
|
|
203
|
+
- `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. For a goal project (`oat_workflow_mode: goal`) the goal boundary is checked first and read-only: it requires `oat_goal_status: declared_met`, a valid exhaustive `oat_goal_outcome_audit`, resolved extractions, a successful `gh pr view` observation of every terminal delivery member, and delivery coverage of every accepted phase (each in a terminal delivery's effective scope with a passed, fresh integrated review and its persisted `exit_gate`); refusals report `goal_inputs_unreadable`, `goal_not_declared`, `goal_audit_invalid`, `goal_extraction_unresolved`, `goal_observation_failed`, or `goal_coverage_incomplete`, and `nextOwner` is `{ kind: "goal", skill, reasons }`, where each reason is `{ code, message, subject? }` and `skill` is the owner of the first reason: for example `not-declared` and `audit-invalid` route to `oat-project-goal`, `review-not-fresh` to `oat-project-review-provide`, `exit-carrier-not-fresh` to `oat-project-implement`, delivery and endpoint reasons such as `endpoint-unmet` to `oat-project-pr-progress`, and `phase-uncovered` to `oat-project-pr-final`. A goal snapshot may record its `pr` step as satisfied by delivery coverage (`satisfied_by: { pr: delivery-coverage }`) only once `pr` is in the completed prefix.
|
|
204
|
+
- `oat project delivery refresh --project <path> [--json]` - goal only. Observes every registered delivery member with `gh pr view <url> --json state,headRefOid,baseRefOid` and persists, in `state.md`, only the observations (`observed_head`, `observed_base`, member `status`), the delivery `status` (`open` or `at_endpoint`), the first observed `endpoint_attainment`, and derived staleness (`integrated_review.disposition: stale`, the milestone exit carrier's `freshness: stale` with `freshness_reason`). It never rewrites a reviewed revision, a member base, or the first endpoint attainment, never writes `oat_milestone_status` or `oat_goal_recovery`, and never manufactures a passed review or a fresh carrier. `oat-project-pr-progress` and `oat-project-goal` run it before registration and re-alignment.
|
|
205
|
+
- `oat project delivery check --project <path> --subject <mNN|dNN> [--json]` - goal only, read-only. Reports whether a milestone (before registration, against the branch head) or a registered delivery (against its observed member revisions) is deliverable: a passed integrated review that is still fresh under the bookkeeping-successor rule and an allowed, fresh milestone exit carrier (reported as `exit.source: milestone-carrier`; the closeout boundary judges each delivery's persisted `exit_gate` instead). Evidence reviewed at R covers a later head only when every intervening commit changes permitted bookkeeping in this project's tracking files (`state.md`, `plan.md`, `implementation.md`, `project-log.md`, `summary.md`) and review artifacts (including those of deliveries sharing the same member pull request); any change to `summary.md` is bookkeeping because it is derived memory, never the authority for the brief's content; code changes, edits to approved brief content, and a substantive change followed by its revert fail. JSON output carries `status` (`ok` or `undeliverable`), the subject, its ordered `scope`, `publishedHeads`, `review`, `exit`, and `deliverable`; an undeliverable subject exits 1 with the full report. A stale `review` or `exit` result carries a `reason` that starts with a code, such as `review-missing`, `review-scope-narrow`, `member-unobserved`, `base-changed`, `bound-revision-mismatch` (a bound revision differs from its member's set-once `reviewed_head`), `subject-changed`, `configuration-changed`, or a bookkeeping-successor failure: `missing-revision`, `missing-object`, `not-ancestor`, `inspection-failed`, `disallowed-path`, or `substantive-change`.
|
|
206
|
+
- `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. A goal project is also refused, without writing, by the goal boundary that `closeout-check` describes.
|
|
202
207
|
- `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.
|
|
203
208
|
- `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.
|
|
204
209
|
- `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).
|
|
205
210
|
- `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.
|
|
206
|
-
- `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. Brief plans (`oat_workflow_mode: brief`) are validated with the brief profile: phases need non-empty `**Intent:**` and `**Exit evidence:**`, a `**Provisional:**` value of `yes` or `no`, unique IDs, and a concrete first phase; `### Task` headings in a brief are reported as a warning, and taskless parallel groups are valid. See [Implementation Execution](../workflows/projects/execution/implementation-execution.md#parallel-phase-groups).
|
|
211
|
+
- `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. Brief plans (`oat_workflow_mode: brief`) are validated with the brief profile: phases need non-empty `**Intent:**` and `**Exit evidence:**`, a `**Provisional:**` value of `yes` or `no`, unique IDs, and a concrete first phase; `### Task` headings in a brief are reported as a warning, and taskless parallel groups are valid. Goal plans add the goal profile: `oat_plan_source: goal`, a valid `## Milestones` table (`goal-milestones-missing`, `goal-milestones-malformed`, `goal-duplicate-milestone`, `goal-milestone-empty`, `goal-milestone-unknown-phase`, `goal-phase-in-multiple-milestones`, `goal-phase-without-milestone`), no parallel group spanning milestones (`goal-group-crosses-milestone`), canonical persisted phase IDs (`goal-noncanonical-phase-id`), and no change to a shipped milestone or a registered delivery's frozen scope (`goal-shipped-milestone-changed`, `goal-delivered-scope-changed`); phases the journal marks `extracted` need no milestone. See [Implementation Execution](../workflows/projects/execution/implementation-execution.md#parallel-phase-groups).
|
|
207
212
|
- `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).
|
|
208
213
|
- `oat project set-mode` — deprecated no-op. Execution mode is no longer user-selectable; emits a deprecation warning and preserves the `--json` contract.
|
|
209
214
|
- `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).
|
|
@@ -323,6 +323,7 @@ Not all workflow modes require every artifact:
|
|
|
323
323
|
- `import`: imported plan + implementation (spec/design optional)
|
|
324
324
|
- `lite`: single-phase plan + implementation (summary/documentation optional at closeout)
|
|
325
325
|
- `brief`: Project Brief in `plan.md` + per-phase journal in `implementation.md` (`references/research/` scaffolded; no discovery, spec, or design)
|
|
326
|
+
- `goal`: the brief artifact set, with a `## Milestones` table in `plan.md` and the milestone state, gate carriers, delivery registry and outcome audit in `state.md`
|
|
326
327
|
|
|
327
328
|
## `.oat/repo/` structure
|
|
328
329
|
|
|
@@ -50,7 +50,7 @@ archive metadata own terminal reachability and retry identity.
|
|
|
50
50
|
|
|
51
51
|
Mode-sensitive notes:
|
|
52
52
|
|
|
53
|
-
- `state.md` includes workflow mode metadata (`spec-driven`, `quick`, `import`, `lite`, `brief`) for routing.
|
|
53
|
+
- `state.md` includes workflow mode metadata (`spec-driven`, `quick`, `import`, `lite`, `brief`, `goal`) for routing.
|
|
54
54
|
- `plan.md` remains the canonical execution artifact across all modes.
|
|
55
55
|
|
|
56
56
|
| Mode | Core authored artifacts | Optional artifacts |
|
|
@@ -60,6 +60,7 @@ Mode-sensitive notes:
|
|
|
60
60
|
| `import` | `references/imported-plan.md`, `plan.md` | `spec.md`, `design.md` |
|
|
61
61
|
| `lite` | Single-phase `plan.md` with Summary, Decisions, Assumptions, Out of Scope, Validation Criteria, and an explicit adaptive content shape | `summary.md` and documentation at closeout |
|
|
62
62
|
| `brief` | `plan.md` as a Project Brief (phases with Intent and Exit evidence) and `implementation.md` as the per-phase journal | `references/research/`, `project-log.md` |
|
|
63
|
+
| `goal` | The brief artifacts, with a `## Milestones` table in `plan.md` and the goal fields in `state.md` | `references/research/`, `project-log.md` |
|
|
63
64
|
|
|
64
65
|
Every Lite plan keeps Summary, Decisions, Assumptions, Out of Scope, and
|
|
65
66
|
Validation Criteria. User-visible changes add numbered, testable Product
|
|
@@ -91,6 +92,60 @@ line per numbered Outcome. When a brief artifact gate is configured,
|
|
|
91
92
|
`state.md` records its outcome as `oat_brief_gate`, with the same core fields
|
|
92
93
|
as `oat_quick_start_gate`.
|
|
93
94
|
|
|
95
|
+
In goal mode, `plan.md` is the same Project Brief with a filled
|
|
96
|
+
`## Milestones` table: one `| Milestone | Phases |` row per milestone listing
|
|
97
|
+
its ordered phase IDs, every phase (revision phases included) in exactly one
|
|
98
|
+
milestone. Later milestones are appended at re-alignment, and a phase frozen in
|
|
99
|
+
a registered delivery is never removed or reassigned. `state.md` adds the
|
|
100
|
+
goal fields:
|
|
101
|
+
|
|
102
|
+
- `oat_milestone` and `oat_milestone_status` (`aligning`, `implementing`,
|
|
103
|
+
`reviewing`, `delivering`, `delivered`), the active milestone;
|
|
104
|
+
- `oat_goal_status` (`active` or `declared_met`) and
|
|
105
|
+
`oat_goal_outcome_audit`, the exhaustive per-phase and per-outcome audit
|
|
106
|
+
written at the terminal declaration;
|
|
107
|
+
- `oat_goal_recovery`, the record of an interrupted recovery, which may target
|
|
108
|
+
an older milestone without moving the active one;
|
|
109
|
+
- `oat_milestone_gates`, one `plan` and one `exit` gate carrier per
|
|
110
|
+
milestone; and
|
|
111
|
+
- `oat_deliveries`, the delivery registry: one entry per delivery (`dNN`) with
|
|
112
|
+
its milestone, frozen phase scope, agreed endpoint, status, member pull
|
|
113
|
+
requests and their observed revisions, the integrated review it was
|
|
114
|
+
delivered on, its exit-gate binding and the first observed endpoint
|
|
115
|
+
attainment. A delivery's `status` is `registering`, `open`, `at_endpoint`,
|
|
116
|
+
or `superseded`, and its agreed `endpoint` is `open` or `merged`. A
|
|
117
|
+
replacement delivery names its one direct predecessor in `covers_scope_of`,
|
|
118
|
+
and the predecessor's `superseded_by` points back; only a delivery that never
|
|
119
|
+
reached its agreed endpoint may be replaced. A correction of a delivery that
|
|
120
|
+
did reach it is additive (`corrects_delivery_id`, new phase IDs, no inherited
|
|
121
|
+
coverage). `oat_pr_status` and `oat_pr_url` project the latest member pull
|
|
122
|
+
request.
|
|
123
|
+
|
|
124
|
+
Delivery evidence stays fresh across later commits that change only bookkeeping:
|
|
125
|
+
`state.md`, `plan.md` (outside its approved content), `implementation.md`,
|
|
126
|
+
`project-log.md` appends, `summary.md`, and the review artifacts of the
|
|
127
|
+
delivery and of any delivery sharing its pull request.
|
|
128
|
+
|
|
129
|
+
A delivery's evidence identity is set once: its `exit_gate`, its
|
|
130
|
+
`integrated_review` identity (`artifact`, `scope`, `bound_revisions`), and each
|
|
131
|
+
member's `reviewed_head`. They change only in a commit that records a new
|
|
132
|
+
review artifact of that delivery, one its own `## Reviews` rows name and never
|
|
133
|
+
a sharing delivery's; any other change to them is not bookkeeping. A bound
|
|
134
|
+
revision that disagrees with its member's `reviewed_head` is not fresh
|
|
135
|
+
(`bound-revision-mismatch`).
|
|
136
|
+
|
|
137
|
+
`oat project delivery refresh` writes only observations and derived staleness
|
|
138
|
+
into `oat_deliveries` and the milestone carriers. The terminal declaration is
|
|
139
|
+
recorded as one `**Goal declared met:**` line in the journal's Final Summary.
|
|
140
|
+
|
|
141
|
+
Extraction of goal work into another project is manual. A phase moved to a
|
|
142
|
+
linked project gets `**Extracted to:** <slug>` in the brief and the marker pair
|
|
143
|
+
`**Status:** extracted` / `**Extracted to:** <slug>` in the journal, and the
|
|
144
|
+
child project records `oat_extracted_from: <goal slug>` in its `state.md`. The
|
|
145
|
+
brief and journal targets must match. The outcome audit requires the child to
|
|
146
|
+
be complete or its outstanding obligation to carry an approved deferral, and
|
|
147
|
+
promotion of the goal to quick refuses any extracted phase.
|
|
148
|
+
|
|
94
149
|
## Blockers in state.md
|
|
95
150
|
|
|
96
151
|
`oat_blockers` accepts legacy reason strings and structured workflow records:
|
|
@@ -17,8 +17,8 @@ This page is the compact contract for how project lifecycle state and review sta
|
|
|
17
17
|
|
|
18
18
|
=== "Diagram"
|
|
19
19
|
|
|
20
|
-

|
|
21
|
+

|
|
22
22
|
|
|
23
23
|
=== "Mermaid source"
|
|
24
24
|
|
|
@@ -41,12 +41,14 @@ This page is the compact contract for how project lifecycle state and review sta
|
|
|
41
41
|
PASSED --> I
|
|
42
42
|
|
|
43
43
|
LITE["Lite: batched interview\n(no discovery/spec/design)"] -. entry point .-> P
|
|
44
|
-
BRIEF["Brief:
|
|
44
|
+
BRIEF["Brief or goal: interview\n(one Project Brief)"] -. entry point .-> P
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
The solid chain is the spec-driven progression. Lite and
|
|
48
|
-
in progress** and never set `oat_phase` to `discovery`, `spec`, or
|
|
49
|
-
quick and import projects also skip part of the leading chain.
|
|
47
|
+
The solid chain is the spec-driven progression. Lite, brief and goal enter at
|
|
48
|
+
**Plan in progress** and never set `oat_phase` to `discovery`, `spec`, or
|
|
49
|
+
`design`; quick and import projects also skip part of the leading chain. Goal
|
|
50
|
+
adds a milestone state machine inside implementation, described under
|
|
51
|
+
[Goal progression](#goal-progression).
|
|
50
52
|
|
|
51
53
|
## Phase status values
|
|
52
54
|
|
|
@@ -107,6 +109,38 @@ A brief project can move to the quick chain with `oat project promote
|
|
|
107
109
|
`oat_promotion_pending_phases` lists phases that still need tasks. See
|
|
108
110
|
[Lifecycle](../workflows/projects/lifecycle.md#promoting-a-brief-project-to-quick).
|
|
109
111
|
|
|
112
|
+
### Goal progression
|
|
113
|
+
|
|
114
|
+
A goal project runs the brief chain once per milestone. `oat_phase` and
|
|
115
|
+
`oat_phase_status` keep their meaning; the milestone loop lives in its own
|
|
116
|
+
`state.md` fields, owned as follows:
|
|
117
|
+
|
|
118
|
+
| `oat_milestone_status` | Meaning | Next owner and transition |
|
|
119
|
+
| ---------------------- | -------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
120
|
+
| `aligning` | The next milestone is being planned or awaits activation | `oat-project-goal` activates it (`implementing`) after review, its `plan` carrier, approval, and the previous delivery observed at its agreed endpoint |
|
|
121
|
+
| `implementing` | The milestone's phase-units are executing | Implement's milestone closeout runs the `exit` gate and writes `reviewing` |
|
|
122
|
+
| `reviewing` | The exit carrier is fresh; the integrated review is next | `oat-project-review-receive` writes `delivering` on a clean receive of the integrated review, or `implementing` when fixes are queued |
|
|
123
|
+
| `delivering` | A passed, fresh integrated review and exit carrier | `oat-project-pr-progress` registers the delivery (`dNN`) and writes `delivered`; stale evidence sends it back to `reviewing`; `oat-project-review-receive` returns it to `implementing` when a delivery-time review queues fixes |
|
|
124
|
+
| `delivered` | The delivery is registered, open and review-ready | `oat-project-goal` re-aligns (`aligning` for the next milestone) once the delivery reaches its endpoint, or records the terminal declaration; `oat-project-pr-progress` returns it to `reviewing` when `oat-project-goal` hands back a stale delivery whose integrated review or exit carrier is no longer fresh |
|
|
125
|
+
|
|
126
|
+
`oat_goal_status` is `active` until the user declares the goal met
|
|
127
|
+
(`declared_met`) with an exhaustive `oat_goal_outcome_audit`. Recovery of an
|
|
128
|
+
older milestone's delivery is recorded in `oat_goal_recovery` and never moves
|
|
129
|
+
`oat_milestone` or its status. `oat-project-revise` may return the active
|
|
130
|
+
milestone from `delivered` or `delivering` to `implementing` for inline
|
|
131
|
+
feedback. The router reads only these persisted fields; delivery freshness
|
|
132
|
+
comes from `oat project delivery refresh` and `oat project delivery check`.
|
|
133
|
+
|
|
134
|
+
`delivered` and the registry's `at_endpoint` are different: `delivered` means
|
|
135
|
+
the pull request is registered and open, `at_endpoint` means it has reached
|
|
136
|
+
the agreed endpoint (`open` or `merged`). Re-alignment may draft and approve
|
|
137
|
+
the next milestone while a `merged` endpoint is pending, but activation waits
|
|
138
|
+
for it. Terminal closeout (`oat project closeout-check`,
|
|
139
|
+
`oat project complete-state`) requires the declaration, the audit and delivery
|
|
140
|
+
coverage of every accepted phase. A goal project can move to quick at a settled
|
|
141
|
+
delivery boundary; see
|
|
142
|
+
[Lifecycle](../workflows/projects/lifecycle.md#promoting-a-goal-project-to-quick).
|
|
143
|
+
|
|
110
144
|
## Review progression
|
|
111
145
|
|
|
112
146
|
In `plan.md` Reviews table:
|
|
@@ -120,5 +154,5 @@ Do not move to the next lifecycle state if review/state artifacts indicate unres
|
|
|
120
154
|
## Reference artifacts
|
|
121
155
|
|
|
122
156
|
- `.oat/projects/<scope>/<project>/state.md`
|
|
123
|
-
- `.oat/projects/<scope>/<project>/plan.md` (`## Reviews`)
|
|
157
|
+
- `.oat/projects/<scope>/<project>/plan.md` (`## Reviews`, and `## Milestones` for goal)
|
|
124
158
|
- `.oat/projects/<scope>/<project>/implementation.md`
|
|
@@ -47,8 +47,9 @@ instead). Saving a brainstorming reference file under the active project also
|
|
|
47
47
|
commits or pushes that file. Promoting to a new project runs
|
|
48
48
|
`oat project new`, which scaffolds the project and makes it your active
|
|
49
49
|
project, and then writes a completed `discovery.md` (or, for a lite project,
|
|
50
|
-
fills in its `plan.md`; for a brief project, writes a research note
|
|
51
|
-
`references/research/` and leaves the brief to `oat-project-brief`
|
|
50
|
+
fills in its `plan.md`; for a brief or goal project, writes a research note
|
|
51
|
+
under `references/research/` and leaves the brief to `oat-project-brief` or
|
|
52
|
+
`oat-project-goal`). Capturing a new idea also sets it as your active
|
|
52
53
|
idea in local OAT config. Each destination is confirmed before anything is
|
|
53
54
|
written.
|
|
54
55
|
|
|
@@ -42,7 +42,7 @@ make only the changes you approve.
|
|
|
42
42
|
|
|
43
43
|
## Key Skills by Use Case
|
|
44
44
|
|
|
45
|
-
- Start a new tracked project: `oat-project-new`, `oat-project-quick-start`,
|
|
45
|
+
- Start a new tracked project: `oat-project-new`, `oat-project-quick-start`, `oat-project-lite` for a single-sitting change with one batched interview and one approval (quick start accepts a project name plus optional description; if you omit the description it should ask before discovery begins), `oat-project-brief` for one delivery agreed in conversation, or `oat-project-goal` for an outcome delivered in milestones
|
|
46
46
|
- Resume an existing project: `oat-project-open` to select it,
|
|
47
47
|
`oat-project-progress` to see where it stands, then `oat-project-next` to
|
|
48
48
|
continue. See
|
|
@@ -118,6 +118,8 @@ for policy, storage, approval, and recovery details.
|
|
|
118
118
|
- `oat-project-new`
|
|
119
119
|
- `oat-project-quick-start`
|
|
120
120
|
- `oat-project-lite`
|
|
121
|
+
- `oat-project-brief`
|
|
122
|
+
- `oat-project-goal`
|
|
121
123
|
- `oat-project-import-plan`
|
|
122
124
|
- `oat-project-promote-spec-driven`
|
|
123
125
|
- `oat-project-open`
|
|
@@ -305,15 +307,16 @@ Visibility reports source metadata: “user” is `user-invocable` and “model
|
|
|
305
307
|
|
|
306
308
|
### Project entry
|
|
307
309
|
|
|
308
|
-
| Skill | Description
|
|
309
|
-
| -------------------------------------------------------------------------------------------------------- |
|
|
310
|
-
| [`oat-project-brief`](../workflows/projects/planning/starting-projects.md#oat-project-brief) | Use when one delivery needs a design-aligned interview, a single approved Project Brief with phases of intent and exit evidence instead of planned tasks, and resumable OAT implementation.
|
|
311
|
-
| [`oat-project-capture`](../workflows/projects/planning/starting-projects.md#oat-project-capture) | Use when work happened outside the OAT project workflow and needs retroactive project tracking. Creates a full project from an existing branch and conversation context.
|
|
312
|
-
| [`oat-project-
|
|
313
|
-
| [`oat-project-
|
|
314
|
-
| [`oat-project-
|
|
315
|
-
| [`oat-project-
|
|
316
|
-
| [`oat-project-
|
|
310
|
+
| Skill | Description | Visibility | Needs an active project? |
|
|
311
|
+
| -------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | ------------------------ |
|
|
312
|
+
| [`oat-project-brief`](../workflows/projects/planning/starting-projects.md#oat-project-brief) | Use when one delivery needs a design-aligned interview, a single approved Project Brief with phases of intent and exit evidence instead of planned tasks, and resumable OAT implementation. | user: true; model disabled: true | No |
|
|
313
|
+
| [`oat-project-capture`](../workflows/projects/planning/starting-projects.md#oat-project-capture) | Use when work happened outside the OAT project workflow and needs retroactive project tracking. Creates a full project from an existing branch and conversation context. | user: true; model disabled: true | No |
|
|
314
|
+
| [`oat-project-goal`](../workflows/projects/planning/starting-projects.md#oat-project-goal) | Use when an outcome needs several deliveries over time - one approved Project Brief with a Milestones table, a milestone loop of activation, delivery and re-alignment, and a terminal declaration audited against the brief's outcomes. | user: true; model disabled: true | No |
|
|
315
|
+
| [`oat-project-import-plan`](../workflows/projects/planning/starting-projects.md#oat-project-import-plan) | Use when you have an external markdown plan to execute with OAT. Preserves the source plan and normalizes it into canonical plan.md format. | user: true; model disabled: true | No |
|
|
316
|
+
| [`oat-project-lite`](../workflows/projects/planning/starting-projects.md#oat-project-lite) | Use when a single-sitting change needs a critical interview, an approved single-phase plan, and resumable OAT implementation with minimal ceremony. | user: true; model disabled: true | No |
|
|
317
|
+
| [`oat-project-new`](../workflows/projects/planning/starting-projects.md#oat-project-new) | Use when starting a spec-driven OAT project from scratch. Scaffolds a new project under PROJECTS_ROOT and sets it active. | user: true; model disabled: true | No |
|
|
318
|
+
| [`oat-project-quick-start`](../workflows/projects/planning/starting-projects.md#oat-project-quick-start) | Use when a task is small enough for quick mode or rapid iteration is preferred. Scaffolds a lightweight OAT project from discovery directly to a runnable plan, with optional brainstorming and lightweight design. | user: true; model disabled: true | No |
|
|
319
|
+
| [`oat-project-split`](../workflows/projects/planning/starting-projects.md#oat-project-split) | Use when a discovery or brainstorm should split one broad scope into coordinated OAT child projects. | user: true; model disabled: true | No |
|
|
317
320
|
|
|
318
321
|
### Project execution
|
|
319
322
|
|
|
@@ -337,7 +337,9 @@ and a dispatch policy is already configured. You authorize the bounded
|
|
|
337
337
|
resumable-export goal through a final PR without ordinary mid-run approval
|
|
338
338
|
pauses. Autonomous entry chooses
|
|
339
339
|
lite, brief, quick, or spec-driven review density from the actual uncertainty and
|
|
340
|
-
invokes its owning creation skill.
|
|
340
|
+
invokes its owning creation skill. It never selects goal: each milestone's
|
|
341
|
+
approval and the final declaration need a person, so an existing goal project
|
|
342
|
+
stops at a product-judgment boundary instead of running unattended. If an export-filter project is already
|
|
341
343
|
active, the second example explicitly resumes its earliest incomplete step
|
|
342
344
|
instead of replaying finished phases.
|
|
343
345
|
|
|
@@ -22,8 +22,8 @@ constraints:
|
|
|
22
22
|
agents to implement and review each phase, or no cap, or leaving model choice
|
|
23
23
|
to the provider; and deciding where the list of candidate models (the
|
|
24
24
|
_ladder_) is stored.
|
|
25
|
-
- **Who needs it:** anyone starting a quick, spec-driven, lite,
|
|
26
|
-
project, because planning asks you to choose a policy; and team leads who
|
|
25
|
+
- **Who needs it:** anyone starting a quick, spec-driven, lite, brief, goal,
|
|
26
|
+
or imported project, because planning asks you to choose a policy; and team leads who
|
|
27
27
|
manage model cost.
|
|
28
28
|
- **Know first:** there is no default policy, and a policy set in any config
|
|
29
29
|
file overrides the one each project chose. A tier is a cap: phase agents may
|
|
@@ -98,7 +98,7 @@ string, and the lifecycle executes it unchanged; OAT does not inject, reorder,
|
|
|
98
98
|
or rewrite its shell arguments.
|
|
99
99
|
|
|
100
100
|
`oat-project-plan`, `oat-project-implement`, `oat-project-quick-start`,
|
|
101
|
-
`oat-project-lite`, `oat-project-brief`, and `oat-project-import-plan` are currently gate-aware. Gate awareness is declared
|
|
101
|
+
`oat-project-lite`, `oat-project-brief`, `oat-project-goal`, and `oat-project-import-plan` are currently gate-aware. Gate awareness is declared
|
|
102
102
|
in skill frontmatter with `oat_gateable: true`, and
|
|
103
103
|
`oat internal validate-oat-skills` warns when config targets a missing or
|
|
104
104
|
non-gateable skill.
|
|
@@ -282,6 +282,19 @@ committed brief, carries exactly the same core with the same outcome rules. It
|
|
|
282
282
|
is provenance only: no route reads it back, and the brief's single approval
|
|
283
283
|
still follows the gate.
|
|
284
284
|
|
|
285
|
+
A goal project records its gate outcomes per milestone instead, in
|
|
286
|
+
`oat_milestone_gates`, and never in `oat_brief_gate`. The configured
|
|
287
|
+
`oat-project-goal` gate on the brief or a milestone amendment becomes that
|
|
288
|
+
milestone's `plan` carrier, `oat_milestone_gates[mNN].plan`, written with
|
|
289
|
+
`status: allowed` only after the artifact review, the gate, and your approval;
|
|
290
|
+
for a re-alignment amendment it is the only approval evidence. The implement
|
|
291
|
+
exit gate at milestone closeout writes `oat_milestone_gates[mNN].exit` (never
|
|
292
|
+
`oat_implement_exit_gate`, which goal uses only at terminal closeout). It runs
|
|
293
|
+
before the milestone's integrated review and runs again after queued fixes.
|
|
294
|
+
`oat project delivery check` reports the exit carrier's freshness, and
|
|
295
|
+
`oat project delivery refresh` marks it stale when delivery evidence no longer
|
|
296
|
+
holds.
|
|
297
|
+
|
|
285
298
|
`oat-project-next` and `oat-project-progress` report the quick-start record
|
|
286
299
|
(and `oat-project-progress` the brief record) as recorded: status, disposition, `decided_at`, and `config_fingerprint` as
|
|
287
300
|
provenance, or `malformed` when the fields do not form a valid record. They do
|
|
@@ -845,7 +858,7 @@ oat gate set oat-project-implement \
|
|
|
845
858
|
```
|
|
846
859
|
|
|
847
860
|
Apply the same command shape to `oat-project-plan`,
|
|
848
|
-
`oat-project-quick-start`, `oat-project-lite`, `oat-project-brief`, and `oat-project-import-plan` when those lifecycle
|
|
861
|
+
`oat-project-quick-start`, `oat-project-lite`, `oat-project-brief`, `oat-project-goal`, and `oat-project-import-plan` when those lifecycle
|
|
849
862
|
skills have configured review gates. Do not add `--target`; explicit targets
|
|
850
863
|
remain manual/debug or deliberate local/user-specific overrides.
|
|
851
864
|
|
|
@@ -1239,8 +1252,8 @@ as a failed gate, never as a pass.
|
|
|
1239
1252
|
|
|
1240
1253
|
How the skills handle that case differs:
|
|
1241
1254
|
|
|
1242
|
-
- `oat-project-implement`, `oat-project-lite`,
|
|
1243
|
-
`onFailure` says, so even a `warn` gate does not let them continue.
|
|
1255
|
+
- `oat-project-implement`, `oat-project-lite`, `oat-project-brief`, and
|
|
1256
|
+
`oat-project-goal` keep it blocked whatever `onFailure` says, so even a `warn` gate does not let them continue.
|
|
1244
1257
|
- `oat-project-plan`, `oat-project-quick-start`, and `oat-project-import-plan`
|
|
1245
1258
|
apply your `onFailure` setting to any failed gate run, including one where no
|
|
1246
1259
|
review happened. With `block`, they retry and then hand the problem to you,
|