@open-agent-toolkit/cli 0.2.59 → 0.2.63
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 +27 -4
- package/assets/agents/oat-reviewer.md +25 -14
- package/assets/bundle-metadata.json +1 -1
- package/assets/docs/cli-utilities/config-and-local-state.md +1 -0
- package/assets/docs/cli-utilities/configuration.md +10 -8
- package/assets/docs/cli-utilities/project-log.md +16 -0
- package/assets/docs/cli-utilities/workflow-gates.md +127 -19
- package/assets/docs/provider-sync/commands.md +3 -0
- package/assets/docs/provider-sync/instruction-sync.md +107 -0
- package/assets/docs/reference/cli-reference.md +26 -9
- package/assets/docs/reference/oat-directory-structure.md +33 -31
- package/assets/docs/workflows/ideas/index.md +1 -1
- package/assets/docs/workflows/index.md +1 -0
- package/assets/docs/workflows/projects/artifacts.md +24 -3
- package/assets/docs/workflows/projects/hill-checkpoints.md +21 -0
- package/assets/docs/workflows/projects/implementation-execution.md +5 -0
- package/assets/docs/workflows/projects/lifecycle.md +169 -7
- package/assets/docs/workflows/projects/picking-up-projects.md +14 -0
- package/assets/docs/workflows/projects/pr-flow.md +2 -0
- package/assets/docs/workflows/projects/reviews.md +1 -1
- package/assets/docs/workflows/projects/state-machine.md +20 -0
- package/assets/docs/workflows/skills/explainer-kit.md +10 -4
- package/assets/docs/workflows/skills/index.md +2 -1
- package/assets/docs/workflows/skills/repo-improve.md +15 -1
- package/assets/public-package-versions.json +4 -4
- package/assets/skills/oat-brainstorm/SKILL.md +61 -12
- package/assets/skills/oat-docs/SKILL.md +13 -8
- package/assets/skills/oat-doctor/SKILL.md +3 -3
- package/assets/skills/oat-explainer-kit/SKILL.md +14 -1
- package/assets/skills/oat-explainer-kit/references/config-contract.md +12 -0
- package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +57 -10
- package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +28 -5
- package/assets/skills/oat-explainer-kit/scripts/probe-recap-seams.mjs +371 -0
- package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +123 -1
- package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
- package/assets/skills/oat-project-autonomous/SKILL.md +23 -9
- package/assets/skills/oat-project-autonomous/references/gate-inventory.md +164 -150
- package/assets/skills/oat-project-capture/SKILL.md +2 -2
- package/assets/skills/oat-project-complete/SKILL.md +134 -4
- package/assets/skills/oat-project-discover/SKILL.md +6 -5
- package/assets/skills/oat-project-document/SKILL.md +11 -1
- package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +164 -150
- package/assets/skills/oat-project-implement/SKILL.md +3 -3
- package/assets/skills/oat-project-implement/references/completion-and-closeout.md +144 -21
- package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +164 -150
- package/assets/skills/oat-project-implement/references/phase-execution.md +16 -1
- package/assets/skills/oat-project-implement/references/plan-and-resume.md +19 -1
- package/assets/skills/oat-project-import-plan/SKILL.md +47 -3
- package/assets/skills/oat-project-lite/SKILL.md +467 -0
- package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +331 -0
- package/assets/skills/oat-project-next/SKILL.md +75 -16
- package/assets/skills/oat-project-plan/SKILL.md +44 -6
- package/assets/skills/oat-project-plan-writing/SKILL.md +6 -3
- package/assets/skills/oat-project-pr-final/SKILL.md +33 -7
- package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +164 -150
- package/assets/skills/oat-project-pr-progress/SKILL.md +3 -3
- package/assets/skills/oat-project-progress/SKILL.md +27 -5
- package/assets/skills/oat-project-promote-spec-driven/SKILL.md +3 -1
- package/assets/skills/oat-project-quick-start/SKILL.md +264 -4
- package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +164 -150
- package/assets/skills/oat-project-review-provide/SKILL.md +25 -6
- package/assets/skills/oat-project-summary/SKILL.md +61 -26
- package/assets/skills/oat-repo-improve/SKILL.md +40 -5
- package/assets/skills/oat-repo-improve/references/plan-template.md +84 -7
- package/assets/templates/plan-lite.md +165 -0
- package/assets/templates/plan.md +1 -1
- package/assets/templates/state.md +1 -1
- package/dist/commands/config/index.d.ts +1 -0
- package/dist/commands/config/index.d.ts.map +1 -1
- package/dist/commands/config/index.js +401 -18
- package/dist/commands/gate/index.d.ts +3 -1
- package/dist/commands/gate/index.d.ts.map +1 -1
- package/dist/commands/gate/index.js +699 -211
- package/dist/commands/init/tools/shared/skill-script-references.d.ts +126 -0
- package/dist/commands/init/tools/shared/skill-script-references.d.ts.map +1 -0
- package/dist/commands/init/tools/shared/skill-script-references.js +311 -0
- package/dist/commands/instructions/instructions.types.d.ts +63 -0
- package/dist/commands/instructions/instructions.types.d.ts.map +1 -1
- package/dist/commands/instructions/instructions.utils.d.ts +51 -2
- package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
- package/dist/commands/instructions/instructions.utils.js +201 -4
- package/dist/commands/instructions/sync/sync.d.ts.map +1 -1
- package/dist/commands/instructions/sync/sync.js +12 -1
- package/dist/commands/instructions/validate/validate.d.ts.map +1 -1
- package/dist/commands/instructions/validate/validate.js +12 -1
- 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 +195 -0
- package/dist/commands/project/log/append.d.ts.map +1 -1
- package/dist/commands/project/log/append.js +1034 -11
- package/dist/commands/project/new/index.d.ts +3 -2
- package/dist/commands/project/new/index.d.ts.map +1 -1
- package/dist/commands/project/new/index.js +2 -1
- package/dist/commands/project/new/scaffold.d.ts +5 -3
- package/dist/commands/project/new/scaffold.d.ts.map +1 -1
- package/dist/commands/project/new/scaffold.js +38 -10
- package/dist/commands/project/promote/index.d.ts +2 -0
- package/dist/commands/project/promote/index.d.ts.map +1 -0
- package/dist/commands/project/promote/index.js +1 -0
- package/dist/commands/project/promote/promote.d.ts +47 -0
- package/dist/commands/project/promote/promote.d.ts.map +1 -0
- package/dist/commands/project/promote/promote.js +322 -0
- package/dist/commands/project/split/run.d.ts.map +1 -1
- package/dist/commands/project/split/run.js +8 -1
- package/dist/commands/project/validate-plan/index.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/index.js +25 -1
- package/dist/commands/project/validate-plan/validate-plan.d.ts +8 -0
- package/dist/commands/project/validate-plan/validate-plan.d.ts.map +1 -1
- package/dist/commands/project/validate-plan/validate-plan.js +49 -0
- package/dist/commands/shared/frontmatter.d.ts +1 -1
- package/dist/commands/shared/frontmatter.d.ts.map +1 -1
- package/dist/commands/shared/frontmatter.js +1 -0
- package/dist/commands/state/generate.d.ts.map +1 -1
- package/dist/commands/state/generate.js +23 -0
- package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
- package/dist/commands/tools/shared/pack-manifest.js +2 -0
- package/dist/config/oat-config.d.ts +41 -0
- package/dist/config/oat-config.d.ts.map +1 -1
- package/dist/config/oat-config.js +111 -0
- package/package.json +2 -2
|
@@ -56,8 +56,14 @@ The first practical expansion path is to keep improving the existing owners: [Do
|
|
|
56
56
|
|
|
57
57
|
Notable commands introduced in the current CLI surface:
|
|
58
58
|
|
|
59
|
-
- `oat project new <slug> --scope shared|local|synced [--force]` - create a
|
|
60
|
-
project in an explicit scope.
|
|
59
|
+
- `oat project new <slug> [--mode spec-driven|quick|import|lite] --scope shared|local|synced [--force]` - create a
|
|
60
|
+
project in an explicit scope. `--mode` selects the workflow mode and therefore
|
|
61
|
+
which artifacts are scaffolded; it defaults to `spec-driven`. Use `quick` for a
|
|
62
|
+
bounded feature with clear requirements, `import` to normalize an externally
|
|
63
|
+
authored plan, and `lite` for a single-sitting change that scaffolds only
|
|
64
|
+
`plan.md`, `state.md`, and `implementation.md`. See
|
|
65
|
+
[Lifecycle](../workflows/projects/lifecycle.md) for the per-lane flow. Without
|
|
66
|
+
`--scope`, creation uses
|
|
61
67
|
`projects.defaultScope`, which defaults to `synced`. Project slugs are
|
|
62
68
|
unique across all scopes by default, including recorded or remotely
|
|
63
69
|
published synced projects. `--force` deliberately permits a duplicate; use
|
|
@@ -133,16 +139,17 @@ Notable commands introduced in the current CLI surface:
|
|
|
133
139
|
- `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.
|
|
134
140
|
- `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.
|
|
135
141
|
- `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.
|
|
142
|
+
- `oat project promote <project-path> --to quick [--json]` - promote an authored lite project to quick mode. 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`. It refuses unsupported targets, non-lite or unreadable projects, an existing lite-plan reference, invalid authored sections, unresolved scope, unavailable templates, failed writes, or failed persistence. JSON output is `{ status: "promoted" | "refused", reason, files }`; `reason` is the stable categorical contract and refused results exit non-zero.
|
|
136
143
|
- `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`.
|
|
137
144
|
- `oat project list --json` - summary state for tracked projects under the configured projects root
|
|
138
145
|
- `oat project complete-state <project-path>` - apply the canonical completed-state mutation to a project's `state.md`; used by `oat-project-complete` during lifecycle closeout
|
|
139
146
|
- `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 stages the selected complete package into `.oat/repo/reference/project-recaps/<YYYYMMDD-project-slug>/`, verifies every manifest-declared immutable file byte, then atomically installs the export before deleting the active project. Existing destinations, incomplete legacy hash coverage, stale bytes, path escapes, and recipe mismatches fail without removing the active project. 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. Legacy complete records receive a cleanup diagnosis rather than pull/open guidance. 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.
|
|
140
147
|
- `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.
|
|
141
148
|
- `oat project dispatch record --event-file <json-file-or-dash> [--project <project-path>]` - validate one generic dispatch record plus its namespaced OAT evidence event, and persist it into the project's append-only `dispatch/` journal. Omit `--project` to validate without persisting. Revision 1 is `dispatch/<request-id>.json` and every later revision is `dispatch/<request-id>@<NNNN>.json`; superseded revisions are never replaced or removed. The command validates and records 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 persisted, 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/projects/evidence-layers.md).
|
|
142
|
-
- `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#parallel-phase-groups).
|
|
149
|
+
- `oat project validate-plan --project-path <path>` - validates `oat_plan_parallel_groups` metadata in `plan.md`; exits non-zero on invalid. Lite plans must contain exactly one phase, declare no parallel groups, and give every Validation Criteria bullet either a backticked command or a `manual:` instruction. See [Implementation Execution](../workflows/projects/implementation-execution.md#parallel-phase-groups).
|
|
143
150
|
- `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](../cli-utilities/project-log.md).
|
|
144
151
|
- `oat project set-mode` — deprecated no-op. Execution mode is no longer user-selectable; emits a deprecation warning and preserves the `--json` contract.
|
|
145
|
-
- `oat gate review <prompt...>` - run a stateful, headless OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings. `--timeout-ms <milliseconds>` overrides target, `workflow.gateTimeouts`, environment, and scope defaults; accepted values are 1,000–14,400,000. Final/phase/range code reviews default to 30 minutes, while task code and artifact reviews default to 15 minutes. With `--json`, the result envelope on exit is the canonical completion signal: `status` is `ok` | `blocked` | `review_failed` | `artifact_missing` | `artifact_validation_failed` | `targeting_correlation_failed`, alongside `runId`, `generatedAt`, and `artifactPath` when available. `artifact_missing` means an accepted child exited cleanly without an artifact; fix synchronous review/artifact completion and start a new run, without review-receive or same-run remediation. For `targeting_correlation_failed`, correct the project declaration or artifact routing and start a new run; do not run review-receive even if an artifact path is present. For `artifact_validation_failed`, correct the artifact and rerun the gate until it revalidates as `ok` or `blocked`. Invoke `oat-project-review-receive` only when all three conditions hold: `status` is `ok` or `blocked`, `receiveEligible` is `true`, and `handoff` is non-null. `review_failed` may include structured `refusal`, `noOutputProduced`, and metadata-only `activityEvidence`; these diagnostic fields never make a run receive-eligible. After a timeout, a validated run-correlated artifact returns the ordinary `ok` or `blocked` envelope with additive `lateCompletion: true`. 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](../cli-utilities/workflow-gates.md).
|
|
152
|
+
- `oat gate review <prompt...>` - run a stateful, headless OAT review through the target registry, parse the produced review artifact, and exit nonzero for configured blocking findings. `--timeout-ms <milliseconds>` overrides target, `workflow.gateTimeouts`, environment, and scope defaults; accepted values are 1,000–14,400,000. Final/phase/range code reviews default to 30 minutes, while task code and artifact reviews default to 15 minutes. With `--json`, the result envelope on exit is the canonical completion signal: `status` is `ok` | `blocked` | `review_failed` | `artifact_missing` | `artifact_validation_failed` | `targeting_correlation_failed`, alongside `runId`, `generatedAt`, and `artifactPath` when available. `artifact_missing` means an accepted child exited cleanly without an artifact; fix synchronous review/artifact completion and start a new run, without review-receive or same-run remediation. For `targeting_correlation_failed`, correct the project declaration or artifact routing and start a new run; do not run review-receive even if an artifact path is present. For `artifact_validation_failed`, correct the artifact and rerun the gate until it revalidates as `ok` or `blocked`. Invoke `oat-project-review-receive` only when all three conditions hold: `status` is `ok` or `blocked`, `receiveEligible` is `true`, and `handoff` is non-null. `review_failed` may include structured `refusal`, `noOutputProduced`, and metadata-only `activityEvidence`; these diagnostic fields never make a run receive-eligible. After a timeout, a validated run-correlated artifact returns the ordinary `ok` or `blocked` envelope with additive `lateCompletion: true`. When post-selection work fails after the reviewer already committed a run-correlated artifact, the gate re-validates that selected snapshot through the same eligibility path rather than re-parsing whatever the path now holds, never re-dispatching, and returns the ordinary `ok` or `blocked` envelope with additive `postSelectionRecovery: true`; the artifact must still be present and unchanged for re-validation to succeed. When nothing recovers, `review_failed` names the failing sub-step in `postSelection.step` and its cause in `postSelection.code`. Duplicate run-ID matches or a changed artifact with a mismatched run ID retain `targeting_correlation_failed` and `receiveEligible: false`. Orchestrators should read the structured result rather than poll the filesystem. See [Workflow Gates](../cli-utilities/workflow-gates.md).
|
|
146
153
|
- `oat gate route --expect-runtime <runtime> --expect-model <model> --can-await <true|false> --json` - return the headless child route (`inline`, `delegate-sync`, or `refuse`) from provider-marker and model evidence. Ambiguous or contradictory evidence never routes inline.
|
|
147
154
|
- `oat gate exec <prompt...>` / `oat gate cross-provider-exec <prompt...>` - run a generic target prompt. `--timeout-ms` uses the same validated CLI override; untyped runs otherwise retain the legacy default path.
|
|
148
155
|
- `oat gate target set <id> --invocation-model <model|provider-default> --invocation-reasoning-effort <effort|provider-default>` - persist optional configured invocation metadata alongside an exec target without inferring it from the target command.
|
|
@@ -152,15 +159,25 @@ Notable commands introduced in the current CLI surface:
|
|
|
152
159
|
|
|
153
160
|
## `oat config` surface flags
|
|
154
161
|
|
|
155
|
-
`oat config set`
|
|
162
|
+
`oat config set` and `oat config unset` support the same mutually exclusive surface flags, which control the config file the write or removal lands in:
|
|
156
163
|
|
|
157
|
-
- `--shared` — write to `.oat/config.json` (committed team repo settings)
|
|
158
|
-
- `--local` — write to `.oat/config.local.json` (per-developer repo state, gitignored)
|
|
159
|
-
- `--user` — write to `~/.oat/config.json` (user-level fallback, applies across all repos)
|
|
164
|
+
- `--shared` — write to or remove from `.oat/config.json` (committed team repo settings)
|
|
165
|
+
- `--local` — write to or remove from `.oat/config.local.json` (per-developer repo state, gitignored)
|
|
166
|
+
- `--user` — write to or remove from `~/.oat/config.json` (user-level fallback, applies across all repos)
|
|
160
167
|
|
|
161
168
|
When no flag is passed, the CLI picks a sensible default per key type: structural keys (`projects.root`, `documentation.*`, etc.) go to shared, state keys (`activeProject`, etc.) go to local, workflow preferences (`workflow.*`) go to local. Pass at most one flag — the command rejects multiple surface flags.
|
|
162
169
|
|
|
163
|
-
Per-key restrictions apply
|
|
170
|
+
Per-key restrictions apply identically to `set` and `unset`: structural keys can only be written at shared scope, most state keys can only be written at local scope (`activeIdea` is the exception — it accepts both local and user), and workflow preference keys accept any non-auto surface. Legacy `autoReviewAtCheckpoints` remains shared-only; prefer `workflow.autoReviewAtHillCheckpoints`.
|
|
171
|
+
|
|
172
|
+
`oat config unset <key>` removes the key from the selected surface and prunes any parent object it empties, so the resolved value falls back through the remaining surfaces to the built-in default. Removing a key the surface does not hold is not an error: it reports an already-unset outcome and exits 0. With `--json` the envelope adds a `removed` boolean, which is the machine-readable way to tell a real removal from an already-unset no-op, since both exit 0. A stored value that fails validation is still removed, matching `oat config set`, which repairs the same file.
|
|
173
|
+
|
|
174
|
+
`unset` refuses five classes of key, each with exit code 1:
|
|
175
|
+
|
|
176
|
+
- **Unknown keys**, including keys OAT reads but does not expose in the `oat config` catalog (`documentation.index`). These are not removable by any `oat config` command.
|
|
177
|
+
- **Lifecycle state** (`activeProject`, `lastPausedProject`) — cleared with `oat config set <key> ''` instead.
|
|
178
|
+
- **Pack intent** (`tools.*`) — removed with `oat tools remove --pack <pack> --scope project`, which also removes the installed pack files. Clearing the intent alone would leave them behind.
|
|
179
|
+
- **Aggregate read views** (`workflow.dispatchCeiling`, `workflow.dispatchCeiling.providers`) — these are assembled for `get` from the leaf keys and are not stored as such. Unset `workflow.dispatchCeiling.preset` or `workflow.dispatchCeiling.providers.<provider>` instead.
|
|
180
|
+
- **Environment-shadowed keys with nothing stored on the target surface** — when `OAT_PROJECTS_ROOT`, `OAT_PROJECTS_DEFAULT_SCOPE`, or `OAT_WORKTREES_ROOT` supplies the effective value and the surface holds nothing to remove, clear the environment variable in your shell. When the surface _does_ hold a stored value, `unset` removes it (as `set` would rewrite it) and warns that the override still supplies the effective value.
|
|
164
181
|
|
|
165
182
|
## `workflow.*` preference keys
|
|
166
183
|
|
|
@@ -110,37 +110,38 @@ Legacy `.oat/active-project` / `.oat/projects-root` / `.oat/active-idea` files m
|
|
|
110
110
|
|
|
111
111
|
Current schema keys:
|
|
112
112
|
|
|
113
|
-
| Key | Type | Default | Description
|
|
114
|
-
| ---------------------------------------------------------- | -------------------------- | ------------------------ |
|
|
115
|
-
| `version` | `number` | `1` | Schema version
|
|
116
|
-
| `worktrees.root` | `string` | `".worktrees"` | Root directory for git worktrees (repo-relative or absolute)
|
|
117
|
-
| `projects.root` | `string` | `".oat/projects/shared"` | Default root directory for OAT projects
|
|
118
|
-
| `projects.defaultScope` | `string` | `"synced"` | Scope used by project creation when `--scope` is omitted: `shared`, `local`, or `synced`. Environment override: `OAT_PROJECTS_DEFAULT_SCOPE`.
|
|
119
|
-
| `localPaths` | `string[]` | - | Gitignored directories to sync between main repo and worktrees. Supports glob patterns. Managed via `oat local add/remove`.
|
|
120
|
-
| `documentation.root` | `string` | - | Docs **app root** — the directory `oat docs init` scaffolds (e.g., `apps/docs`). Authored pages live under `<root>/docs`. See [Documentation path resolution](#documentation-path-resolution).
|
|
121
|
-
| `documentation.tooling` | `string` | - | Documentation framework identifier (`mkdocs` or `fumadocs`)
|
|
122
|
-
| `documentation.config` | `string` | - | Path to the documentation framework config file (e.g., `mkdocs.yml`, `next.config.js`)
|
|
123
|
-
| `documentation.index` | `string` | - | Path to the docs surface entry point: the generated app-root manifest `<root>/index.md` for Fumadocs, `mkdocs.yml` for MkDocs. Set by `oat docs init`. `oat docs generate-index` writes it only for the Fumadocs manifest transition and never for MkDocs.
|
|
124
|
-
| `documentation.excludes` | `string[]` | - | Globs, relative to the docs directory, that `oat docs generate-index` leaves out of the generated index. See [Excluding pages from the generated index](#excluding-pages-from-the-generated-index).
|
|
125
|
-
| `documentation.
|
|
126
|
-
| `
|
|
127
|
-
| `
|
|
128
|
-
| `workflow.
|
|
129
|
-
| `workflow.dispatchPolicy.
|
|
130
|
-
| `workflow.
|
|
131
|
-
| `workflow.dispatchCeiling.
|
|
132
|
-
| `workflow.dispatchCeiling.providers.<provider
|
|
133
|
-
| `workflow.dispatchCeiling.providers
|
|
134
|
-
| `workflow.
|
|
135
|
-
| `workflow.gates.
|
|
136
|
-
| `
|
|
137
|
-
| `archive.
|
|
138
|
-
| `archive.
|
|
139
|
-
| `archive.
|
|
140
|
-
| `archive.
|
|
141
|
-
| `archive.
|
|
142
|
-
|
|
143
|
-
|
|
113
|
+
| Key | Type | Default | Description |
|
|
114
|
+
| ---------------------------------------------------------- | -------------------------- | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
115
|
+
| `version` | `number` | `1` | Schema version |
|
|
116
|
+
| `worktrees.root` | `string` | `".worktrees"` | Root directory for git worktrees (repo-relative or absolute) |
|
|
117
|
+
| `projects.root` | `string` | `".oat/projects/shared"` | Default root directory for OAT projects |
|
|
118
|
+
| `projects.defaultScope` | `string` | `"synced"` | Scope used by project creation when `--scope` is omitted: `shared`, `local`, or `synced`. Environment override: `OAT_PROJECTS_DEFAULT_SCOPE`. |
|
|
119
|
+
| `localPaths` | `string[]` | - | Gitignored directories to sync between main repo and worktrees. Supports glob patterns. Managed via `oat local add/remove`. |
|
|
120
|
+
| `documentation.root` | `string` | - | Docs **app root** — the directory `oat docs init` scaffolds (e.g., `apps/docs`). Authored pages live under `<root>/docs`. See [Documentation path resolution](#documentation-path-resolution). |
|
|
121
|
+
| `documentation.tooling` | `string` | - | Documentation framework identifier (`mkdocs` or `fumadocs`) |
|
|
122
|
+
| `documentation.config` | `string` | - | Path to the documentation framework config file (e.g., `mkdocs.yml`, `next.config.js`) |
|
|
123
|
+
| `documentation.index` | `string` | - | Path to the docs surface entry point: the generated app-root manifest `<root>/index.md` for Fumadocs, `mkdocs.yml` for MkDocs. Set by `oat docs init`. `oat docs generate-index` writes it only for the Fumadocs manifest transition and never for MkDocs. |
|
|
124
|
+
| `documentation.excludes` | `string[]` | - | Globs, relative to the docs directory, that `oat docs generate-index` leaves out of the generated index. See [Excluding pages from the generated index](#excluding-pages-from-the-generated-index). |
|
|
125
|
+
| `documentation.instructionPointerExcludes` | `string[]` | - | Repo-relative directories `oat instructions sync`/`validate` must not treat as pointer sites, additive to the documentation content root they skip by default. Normalized and de-duplicated; a malformed value (non-array, or an empty or non-string entry) is rejected with exit code `2`. Set as one comma-separated value with `oat config set`; absolute paths and paths escaping the repository are refused. See [Instruction Sync](../provider-sync/instruction-sync.md#documentation-trees). |
|
|
126
|
+
| `documentation.requireForProjectCompletion` | `boolean` | `false` | When `true`, OAT project completion gates require documentation to be updated |
|
|
127
|
+
| `git.defaultBranch` | `string` | `"main"` | Default branch for PR creation. Auto-detected during `oat init` via `gh repo view` or `origin/HEAD`. Used by `oat-project-pr-final` and `oat-project-pr-progress`. |
|
|
128
|
+
| `workflow.autoReviewAtHillCheckpoints` | `boolean` | unset | When `true`, completing a HiLL checkpoint automatically runs the extra lifecycle review. Does not control Tier 1 per-phase `oat-reviewer` gates. Can be overridden per-project via `oat_auto_review_at_hill_checkpoints` in `plan.md` frontmatter. Legacy `autoReviewAtCheckpoints` remains a fallback. |
|
|
129
|
+
| `workflow.dispatchPolicy.mode` | `string` | unset | Dispatch policy mode: `managed` lets OAT select model/effort controls; `inherit` leaves controls to the host/provider defaults. |
|
|
130
|
+
| `workflow.dispatchPolicy.policy` | `string` | unset | Managed dispatch policy: `economy`, `balanced`, `high`, `frontier`, or `uncapped`. Capped policies compile to provider targets; `uncapped` keeps OAT-managed preferred selection without provider caps. `inherit` mode is separate and leaves controls to the host/provider. |
|
|
131
|
+
| `workflow.dispatchCeiling.preset` | `string` | unset | Legacy compatibility preset for capped managed policy setup (`balanced`, `maximum`, `cost-conscious`). `maximum` maps to `high`; `cost-conscious` maps to `economy`. |
|
|
132
|
+
| `workflow.dispatchCeiling.providers.<provider>` | `object` or legacy scalar | unset | Reusable provider candidate ladder. The canonical shape maps `economy`, `balanced`, `high`, and `frontier` to ordered candidate cells; project and phase state record only a named maximum over that ladder. |
|
|
133
|
+
| `workflow.dispatchCeiling.providers.<provider>.<tier>` | `{ candidates: [...] }` | unset | One ordered candidate cell. Codex entries carry exact `model` plus `effort` and resolve to materialized roles; Claude entries carry a model; Cursor strings remain opaque and pass to Cursor byte-for-byte. The final candidate defines that tier's reviewer ceiling. |
|
|
134
|
+
| `workflow.dispatchCeiling.providers.{codex,claude,cursor}` | `string`, route, or target | unset | Legacy compatibility input normalized to a one-candidate ladder. New configuration should use tiered candidate cells. The flat keys `workflow.dispatchCeiling.codex` and `workflow.dispatchCeiling.claude` were removed without migration. |
|
|
135
|
+
| `workflow.gates.skills` | `object` | unset | Per-skill final gate config keyed by skill name. Managed with `oat gate set/unset`; gate-aware skills declare `oat_gateable: true`. |
|
|
136
|
+
| `workflow.gates.execTargets` | `object` | built-ins | Cross-runtime exec target registry keyed by opaque target id. Managed with `oat gate target set/unset`; built-ins cover Codex, Claude, and Cursor defaults. |
|
|
137
|
+
| `archive.s3Uri` | `string` | - | Base S3 URI for repo-scoped archived project sync, for example `s3://bucket/oat-archive` |
|
|
138
|
+
| `archive.s3SyncOnComplete` | `boolean` | `false` | When `true`, `oat-project-complete` uploads the archived project to the configured S3 archive after local archive succeeds |
|
|
139
|
+
| `archive.summaryExportPath` | `string` | - | Repo-relative directory where completion exports `summary.md` as a dated snapshot like `20260401-<project-name>.md` for durable tracked reference |
|
|
140
|
+
| `archive.wrapUpExportPath` | `string` | - | Repo-relative directory where `oat-wrap-up` writes dated reports like `20260413-wrap-up-past-week.md`; when unset, the skill falls back to `.oat/repo/reference/wrap-ups/` |
|
|
141
|
+
| `archive.awsProfile` | `string` | - | Optional AWS named profile forwarded as `AWS_PROFILE` to every `aws` invocation in archive flows (`oat-project-complete` S3 sync, `oat repo archive sync`). Overrides ambient shell `AWS_PROFILE` / `AWS_DEFAULT_PROFILE` when set. |
|
|
142
|
+
| `archive.awsRegion` | `string` | - | Optional AWS region forwarded as `AWS_REGION` to every `aws` invocation in archive flows. Overrides ambient shell `AWS_REGION` / `AWS_DEFAULT_REGION` when set. |
|
|
143
|
+
|
|
144
|
+
Most `documentation.*` keys are managed via `oat config get/set` and are set automatically by `oat docs init`. One has no `oat config set` entry and is edited directly in `.oat/config.json`: `documentation.index`, which `oat docs init` still seeds for you.
|
|
144
145
|
The `git.defaultBranch` key is auto-detected during `oat init` and can be overridden via `oat config set git.defaultBranch <branch>`.
|
|
145
146
|
Archive settings are managed via `oat config get/set`, and `oat config describe archive.s3Uri` (or the other archive keys) shows the lifecycle and ownership details from the CLI.
|
|
146
147
|
Workflow gate objects are structured config and are managed with `oat gate`, not the scalar `oat config set` surface. See [Workflow Gates](../cli-utilities/workflow-gates.md).
|
|
@@ -305,6 +306,7 @@ Not all workflow modes require every artifact:
|
|
|
305
306
|
- `spec-driven`: discovery + spec + design + plan + implementation
|
|
306
307
|
- `quick`: discovery + plan + implementation (spec/design optional)
|
|
307
308
|
- `import`: imported plan + implementation (spec/design optional)
|
|
309
|
+
- `lite`: single-phase plan + implementation (summary/documentation optional at closeout)
|
|
308
310
|
|
|
309
311
|
## `.oat/repo/` structure
|
|
310
312
|
|
|
@@ -37,4 +37,4 @@ If the thought is still pre-shape — you don't know whether it should land as a
|
|
|
37
37
|
|
|
38
38
|
## Promotion Path
|
|
39
39
|
|
|
40
|
-
When an idea becomes concrete, summarize it and then start a tracked OAT project in quick or spec-driven mode depending on design risk.
|
|
40
|
+
When an idea becomes concrete, summarize it and then start a tracked OAT project in lite, quick, or spec-driven mode depending on scope and design risk. Lite suits a single-sitting change and seeds `plan.md` directly; quick and spec-driven seed `discovery.md` instead.
|
|
@@ -44,6 +44,7 @@ Stay with direct CLI usage when:
|
|
|
44
44
|
## Workflow Modes In Practice
|
|
45
45
|
|
|
46
46
|
- CLI only: direct commands, no tracked project artifacts
|
|
47
|
+
- Lite mode: a batched interview and one approval produce a single-phase `plan.md` for a single-sitting change
|
|
47
48
|
- Quick mode: tracked work with a lighter upfront planning path
|
|
48
49
|
- Spec-driven mode: explicit discovery, requirements, design, and plan artifacts
|
|
49
50
|
- Import mode: an externally-authored plan imported into OAT for tracked execution
|
|
@@ -50,9 +50,30 @@ 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`) for routing.
|
|
54
|
-
- `
|
|
55
|
-
|
|
53
|
+
- `state.md` includes workflow mode metadata (`spec-driven`, `quick`, `import`, `lite`) for routing.
|
|
54
|
+
- `plan.md` remains the canonical execution artifact across all modes.
|
|
55
|
+
|
|
56
|
+
| Mode | Core authored artifacts | Optional artifacts |
|
|
57
|
+
| ------------- | -------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ |
|
|
58
|
+
| `spec-driven` | `discovery.md`, `spec.md`, `design.md`, `plan.md` | - |
|
|
59
|
+
| `quick` | `discovery.md`, `plan.md` | Lightweight `design.md`, `spec.md` |
|
|
60
|
+
| `import` | `references/imported-plan.md`, `plan.md` | `spec.md`, `design.md` |
|
|
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
|
+
|
|
63
|
+
Every Lite plan keeps Summary, Decisions, Assumptions, Out of Scope, and
|
|
64
|
+
Validation Criteria. User-visible changes add numbered, testable Product
|
|
65
|
+
Behavior. Changes that cross module boundaries, alter data or state formats,
|
|
66
|
+
or change a contract consumed by another surface add Technical Design. That
|
|
67
|
+
section covers current operation, proposed changes, and data flow when data or
|
|
68
|
+
state crosses a boundary. The Decisions section records the selected shape and
|
|
69
|
+
why it fits.
|
|
70
|
+
|
|
71
|
+
Each Lite task also records an implementation and proof strategy: the risk it
|
|
72
|
+
covers, why the evidence is proportionate, and the exact command or manual
|
|
73
|
+
proof. Strategies may be test-first, characterization-first,
|
|
74
|
+
implementation-then-regression, static/build, or manual/visual. Static or build
|
|
75
|
+
checks alone fit only changes that cannot affect runtime behavior; every
|
|
76
|
+
behavioral change needs evidence that fails without the change.
|
|
56
77
|
|
|
57
78
|
## Supporting artifacts
|
|
58
79
|
|
|
@@ -38,6 +38,27 @@ Semantics:
|
|
|
38
38
|
- Empty list: checkpoint after every phase boundary, but only after implementation has confirmed the choice and written `oat_plan_hill_phases: []` into `plan.md`.
|
|
39
39
|
- Explicit list: checkpoint only after completing the named phases (`p01`, `p04`, etc).
|
|
40
40
|
|
|
41
|
+
### Lite checkpoint bypass
|
|
42
|
+
|
|
43
|
+
Lite projects have no HiLL checkpoints. `oat-project-implement` resolves
|
|
44
|
+
`oat_workflow_mode` from project state before any checkpoint field read, and
|
|
45
|
+
when the mode is `lite` it resolves checkpoint state as `none` without reading
|
|
46
|
+
or interpreting `oat_plan_hill_phases`. An empty list cannot represent lite's
|
|
47
|
+
policy, because for every other mode an empty list means "checkpoint after every
|
|
48
|
+
phase". `oat-project-implement`'s Lite checkpoint bypass writes:
|
|
49
|
+
|
|
50
|
+
```yaml
|
|
51
|
+
oat_auto_review_at_hill_checkpoints: false # lite: no checkpoints
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The workflow preference prompt, the standard checkpoint prompt, and the
|
|
55
|
+
auto-review preference prompt are all skipped in both interactive and autonomous
|
|
56
|
+
runs. Only HiLL approval pauses are absent — the root-owned per-phase review and
|
|
57
|
+
the final review remain required.
|
|
58
|
+
|
|
59
|
+
The rest of this section applies to `spec-driven`, `quick`, and `import`
|
|
60
|
+
projects.
|
|
61
|
+
|
|
41
62
|
On the first implementation run, `oat-project-implement` must summarize every plan phase, state the total phase count and final phase ID, and then ask an explicit three-option checkpoint question:
|
|
42
63
|
|
|
43
64
|
- Stop after each phase
|
|
@@ -426,6 +426,11 @@ For a plan-declared parallel group, the root:
|
|
|
426
426
|
Containment, ownership, base, or fixture-readiness failure in smoke mode aborts
|
|
427
427
|
the run. It never authorizes replacement or sequential degradation.
|
|
428
428
|
|
|
429
|
+
Lite plans never take this path. A lite `plan.md` must contain exactly one phase
|
|
430
|
+
and declare no parallel groups, so lite implementation is always sequential;
|
|
431
|
+
`oat project validate-plan` enforces both rules. Work that needs more than one
|
|
432
|
+
phase should promote to quick rather than declare a parallel group.
|
|
433
|
+
|
|
429
434
|
## Synced projects in worktrees
|
|
430
435
|
|
|
431
436
|
A tracked `.oat/projects/synced/<project>.json` record lets every repository
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Lifecycle
|
|
3
|
-
description: 'End-to-end phase flow from discovery through completion: spec-driven, quick, and import paths.'
|
|
3
|
+
description: 'End-to-end phase flow from discovery through completion: spec-driven, quick, lite, and import paths.'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Lifecycle
|
|
@@ -27,9 +27,9 @@ Full spec-driven design supports three interaction modes: collaborative, selecti
|
|
|
27
27
|
|
|
28
28
|
## Quick Look
|
|
29
29
|
|
|
30
|
-
- What it does: explains the end-to-end lifecycle for tracked OAT projects, including alternate quick and import lanes.
|
|
30
|
+
- What it does: explains the end-to-end lifecycle for tracked OAT projects, including alternate quick, lite, and import lanes.
|
|
31
31
|
- When to use it: when you need the actual project execution model, not just a high-level overview of workflow mode.
|
|
32
|
-
- Primary entry points: `oat-project-new`, `oat-project-quick-start`, `oat-project-import-plan`, `oat-project-implement`
|
|
32
|
+
- Primary entry points: `oat-project-new`, `oat-project-quick-start`, `oat-project-lite`, `oat-project-import-plan`, `oat-project-implement`
|
|
33
33
|
|
|
34
34
|
## Lifecycle Map
|
|
35
35
|
|
|
@@ -42,6 +42,10 @@ flowchart LR
|
|
|
42
42
|
DOC --> C["Complete"]
|
|
43
43
|
```
|
|
44
44
|
|
|
45
|
+
This map shows the spec-driven default. The quick, lite, import, and capture
|
|
46
|
+
lanes each skip part of it — see [Lane diagrams](#lane-diagrams) below. Lite in
|
|
47
|
+
particular has no discovery, spec, or design step at all.
|
|
48
|
+
|
|
45
49
|
## Post-implementation flow
|
|
46
50
|
|
|
47
51
|
Implementation closeout has one authoritative order:
|
|
@@ -73,6 +77,37 @@ After implementation closeout finishes:
|
|
|
73
77
|
- After revision tasks complete, state returns to `pr_open`
|
|
74
78
|
5. **Complete** (`oat-project-complete`) — accepts any phase status (`pr_open`, `complete`, `in_progress`), auto-refreshes `summary.md` before closeout when needed, and archives when selected by the workflow preference or completion prompt
|
|
75
79
|
|
|
80
|
+
### Project-recap gate (non-lite)
|
|
81
|
+
|
|
82
|
+
The final-closeout orchestrator owns one project-recap gate. It runs after the
|
|
83
|
+
final code review has passed and after any configured pre-approval summary and
|
|
84
|
+
documentation steps, but before final HiLL approval. It neither replaces nor
|
|
85
|
+
repeats the final review, and the stored order of the other pre-approval steps
|
|
86
|
+
is preserved.
|
|
87
|
+
|
|
88
|
+
Recap intent resolves through `oat-explainer-kit`. A fresh `project-recap`
|
|
89
|
+
manifest for the current completed implementation is reused rather than
|
|
90
|
+
regenerated — fresh means it names recipe `project-recap`, belongs to this
|
|
91
|
+
project, has a terminal outcome, and its recorded source hashes match the
|
|
92
|
+
current approved inputs. A present-but-incomplete, wrong-recipe, or stale
|
|
93
|
+
manifest does not qualify.
|
|
94
|
+
|
|
95
|
+
Recap outcomes are reported, not blocking: `failed` and `built-not-durable` are
|
|
96
|
+
recorded as warnings and never block final approval, completion reporting, or
|
|
97
|
+
later PR steps. The selected or attempted outcome and run path are included in
|
|
98
|
+
the implementation completion report, and `summary.md` carries a single
|
|
99
|
+
`Explainer Outcome` section when it exists.
|
|
100
|
+
|
|
101
|
+
**Lite skips this gate entirely.** Lite sets `PROJECT_RECAP_REACHABLE=false` and
|
|
102
|
+
does not resolve recap intent, inspect recap runs, invoke `oat-explainer-kit`,
|
|
103
|
+
or run the terminal-outcome guard. It proceeds from the required reviews through
|
|
104
|
+
its stored optional steps to `pr` and sequence completion.
|
|
105
|
+
|
|
106
|
+
Lite mode collapses the default pre-approval sequence to PR creation only.
|
|
107
|
+
`oat-project-pr-final` builds the body directly from the lite plan and
|
|
108
|
+
`implementation.md`; summary and documentation remain explicit lite opt-ins,
|
|
109
|
+
and retro is not added to the lite closeout sequence.
|
|
110
|
+
|
|
76
111
|
### Completion archive behavior
|
|
77
112
|
|
|
78
113
|
On completion, OAT treats archive handling as an explicit closeout choice:
|
|
@@ -106,6 +141,51 @@ On completion, OAT treats archive handling as an explicit closeout choice:
|
|
|
106
141
|
ref. `oat project prune` is a separate destructive choice that removes
|
|
107
142
|
terminal ref reachability but preserves local and S3 archive snapshots.
|
|
108
143
|
|
|
144
|
+
### Absorbed-project retirement sweep
|
|
145
|
+
|
|
146
|
+
Retiring a project that a later project absorbed is a semantic claim, not a
|
|
147
|
+
filesystem operation. Deleting or archiving the old scaffold does not make the
|
|
148
|
+
roadmap stop promising its work, so completion checks the claim against the
|
|
149
|
+
prose that still makes it.
|
|
150
|
+
|
|
151
|
+
When a quick project consolidates earlier scaffolds, quick-start records
|
|
152
|
+
`absorbed_projects` and `absorbed_backlog_ids` in that project's `state.md`
|
|
153
|
+
frontmatter. Those two fields are the only inputs the sweep takes.
|
|
154
|
+
|
|
155
|
+
Recording them is a quick-mode step today. A lite project that consolidates
|
|
156
|
+
earlier scaffolds records nothing, so the sweep finds no inputs and degrades to
|
|
157
|
+
its recorded note rather than checking that project's surfaces.
|
|
158
|
+
|
|
159
|
+
Inside the project-log completion gate — after the log status probe and before
|
|
160
|
+
the roll-up and seal — completion searches the active planning surfaces for each
|
|
161
|
+
absorbed slug and backlog ID, and for future-oriented ownership language tied to
|
|
162
|
+
them:
|
|
163
|
+
|
|
164
|
+
- `.oat/repo/pjm/roadmap.md` (the Now/Next/Later lanes and the sequencing map)
|
|
165
|
+
- `.oat/repo/pjm/current-state.md`
|
|
166
|
+
- the Curated Overview in `.oat/repo/pjm/backlog/index.md`
|
|
167
|
+
- the scope-nested `state.md` of projects that are still active, under the
|
|
168
|
+
configured projects root, skipping the `archived` tree and any project already
|
|
169
|
+
recorded as complete
|
|
170
|
+
|
|
171
|
+
The sweep is advisory. A raw match is never a hard block on closeout: each hit
|
|
172
|
+
becomes a named finding carrying a recorded disposition: fixed in the same run,
|
|
173
|
+
accepted as historical with a reason, or — in an autonomous run — recorded as
|
|
174
|
+
`deferred advisory`. Prose that clearly describes
|
|
175
|
+
past state is exempt, so a dated history entry, a retro, a decision record, or a
|
|
176
|
+
changelog line reads as evidence rather than a stale claim.
|
|
177
|
+
|
|
178
|
+
Placement is the point. Dispositions are appended to the project log before the
|
|
179
|
+
roll-up, so the roll-up summarizes them and the completion seal remains the
|
|
180
|
+
final entry — no project-log append ever follows the seal. Three variations
|
|
181
|
+
change where and how the dispositions are recorded: an autonomous run records
|
|
182
|
+
each finding as a `deferred advisory` warning and continues, a project with no log reports them in the
|
|
183
|
+
final completion summary, and a resumed completion whose log already
|
|
184
|
+
carries a seal runs report-only and appends nothing.
|
|
185
|
+
|
|
186
|
+
Repositories that never adopted PJM skip the sweep with a one-line note. A
|
|
187
|
+
missing planning surface degrades the sweep, never the closeout.
|
|
188
|
+
|
|
109
189
|
### Phase status: `pr_open`
|
|
110
190
|
|
|
111
191
|
After `oat-project-pr-final` runs, `state.md` shows `oat_phase_status: pr_open`. This signals:
|
|
@@ -167,7 +247,9 @@ When `workflow.autoReviewAtHillCheckpoints` is enabled or `plan.md` frontmatter
|
|
|
167
247
|
### Phase-review setup during planning
|
|
168
248
|
|
|
169
249
|
Spec-driven, quick, and import planning run one shared setup after stable phase
|
|
170
|
-
IDs exist and before the plan artifact review.
|
|
250
|
+
IDs exist and before the plan artifact review. Lite omits this planning-time
|
|
251
|
+
setup and prompt, while its built-in implementation phase and final reviews
|
|
252
|
+
remain required. The target probe qualifies only
|
|
171
253
|
an explicitly configured, enabled, and available review target, then offers all
|
|
172
254
|
phases, selected phases, or disabled. Existing explicit
|
|
173
255
|
`oat_phase_review_gate` values are preserved unchanged without re-prompting.
|
|
@@ -214,6 +296,13 @@ See [Implementation Execution](implementation-execution.md) for the full executi
|
|
|
214
296
|
4. `oat-project-review-provide` / `oat-project-pr-final`
|
|
215
297
|
5. Optional `oat-project-promote-spec-driven` to backfill spec-driven lifecycle artifacts in-place
|
|
216
298
|
|
|
299
|
+
### Lite lane diagram
|
|
300
|
+
|
|
301
|
+
1. `oat-project-lite` runs one batched interview, authors a single-phase `plan.md` with validation criteria, and pauses once for approval
|
|
302
|
+
2. Implement: `oat-project-implement` runs the single phase without HiLL checkpoint prompts
|
|
303
|
+
3. Pass the mandatory final review, then route directly to `oat-project-pr-final`
|
|
304
|
+
4. Optional `oat project promote <project-path> --to quick` when the work no longer fits one sitting
|
|
305
|
+
|
|
217
306
|
### Import lane diagram
|
|
218
307
|
|
|
219
308
|
1. `oat-project-import-plan` (checks inherited git state before import scaffolding so sync-generated or unrelated dirty files do not silently roll into project bookkeeping)
|
|
@@ -269,6 +358,75 @@ still read as compatibility capped-policy input, but new quick-start selections
|
|
|
269
358
|
should use the dispatch-policy names, including explicit `Uncapped` and
|
|
270
359
|
`Inherit Host Defaults`.
|
|
271
360
|
|
|
361
|
+
### Lite lane
|
|
362
|
+
|
|
363
|
+
```mermaid
|
|
364
|
+
flowchart LR
|
|
365
|
+
L["Lite interview\n(one batched round)"] --> P["Single-phase plan\n(one approval)"]
|
|
366
|
+
P --> I["Implement (oat-project-implement)"]
|
|
367
|
+
I --> R["Final review"] --> PR["PR (default closeout)"]
|
|
368
|
+
P -->|Scope grows| Q["Promote to Quick"]
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
Lite keeps planning and validation in `plan.md`. The interview selects a
|
|
372
|
+
`minimal`, `product`, `technical`, or `both` content shape and records the
|
|
373
|
+
rationale. Product Behavior is required for user-visible changes; Technical
|
|
374
|
+
Design is required for cross-module, data/state-format, or consumed-contract
|
|
375
|
+
changes. It has no separate discovery, spec, or design artifact, skips
|
|
376
|
+
implementation HiLL prompts, and routes a passed final review directly to PR
|
|
377
|
+
creation. Summary and documentation run only when enabled through the
|
|
378
|
+
lite-specific post-implementation sequence.
|
|
379
|
+
|
|
380
|
+
Each task chooses evidence proportionate to its risk instead of requiring one
|
|
381
|
+
test-first recipe. Behavioral changes need a proof that fails without the
|
|
382
|
+
change; refactors default to characterization-first when existing coverage is
|
|
383
|
+
insufficient; documentation-only work may use formatting, link, spelling, or
|
|
384
|
+
build checks. UI changes require visual proof. In autonomous runs, available
|
|
385
|
+
computer-use capability performs that proof; otherwise execution stops at an
|
|
386
|
+
explicit proof boundary.
|
|
387
|
+
|
|
388
|
+
### Promoting a lite project to quick
|
|
389
|
+
|
|
390
|
+
When lite work outgrows one sitting, `oat project promote <project-path> --to quick`
|
|
391
|
+
converts it in place. Each artifact has a different fate: the authored lite plan
|
|
392
|
+
is **moved** to `references/lite-plan.md`, a new `discovery.md` is **derived**
|
|
393
|
+
from its five core sections plus any adaptive Product Behavior and Technical
|
|
394
|
+
Design, a **fresh** quick template takes over the `plan.md` path, and `state.md`
|
|
395
|
+
is **rewritten** to quick mode.
|
|
396
|
+
|
|
397
|
+
```mermaid
|
|
398
|
+
flowchart LR
|
|
399
|
+
subgraph Before
|
|
400
|
+
LPLAN["plan.md\nfive core sections plus adaptive\nProduct Behavior / Technical Design"]
|
|
401
|
+
LSTATE["state.md\noat_workflow_mode: lite"]
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
CMD["oat project promote\n--to quick"]
|
|
405
|
+
|
|
406
|
+
subgraph After
|
|
407
|
+
DISC["discovery.md\nderived from the lite plan\noat_ready_for: oat-project-quick-start"]
|
|
408
|
+
REF["references/lite-plan.md\noriginal lite plan, preserved"]
|
|
409
|
+
QPLAN["plan.md\nfresh quick-start template"]
|
|
410
|
+
QSTATE["state.md\noat_workflow_mode: quick\noat_phase: discovery (complete)\noat_ready_for: oat-project-quick-start"]
|
|
411
|
+
end
|
|
412
|
+
|
|
413
|
+
LPLAN --> CMD
|
|
414
|
+
LSTATE --> CMD
|
|
415
|
+
CMD -->|derive| DISC
|
|
416
|
+
CMD -->|move| REF
|
|
417
|
+
CMD -->|scaffold| QPLAN
|
|
418
|
+
CMD -->|rewrite| QSTATE
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
The project slug, directory, and branch are untouched, so history and any open
|
|
422
|
+
work continue uninterrupted. `oat_ready_for` is stamped on **both** `discovery.md`
|
|
423
|
+
and `state.md`; the quick-start recommender reads artifact readiness, so
|
|
424
|
+
consumers must preserve both. Promotion refuses rather than half-applying: a
|
|
425
|
+
non-lite project, an existing `references/lite-plan.md`, invalid authored
|
|
426
|
+
sections, an unresolved scope, or an unreadable template each return a stable
|
|
427
|
+
categorical `reason` and exit non-zero. See
|
|
428
|
+
[CLI Reference](../../reference/cli-reference.md) for the full refusal contract.
|
|
429
|
+
|
|
272
430
|
### Import lane
|
|
273
431
|
|
|
274
432
|
```mermaid
|
|
@@ -304,6 +462,10 @@ Quick lane progression:
|
|
|
304
462
|
|
|
305
463
|
`discovery.md` -> [`design.md` (optional lightweight)] -> `plan.md` -> `implementation.md`
|
|
306
464
|
|
|
465
|
+
Lite lane progression:
|
|
466
|
+
|
|
467
|
+
`plan.md` -> `implementation.md` -> `pr/*.md` (`summary.md` and documentation are opt-in)
|
|
468
|
+
|
|
307
469
|
Import lane progression:
|
|
308
470
|
|
|
309
471
|
`references/imported-plan.md` -> `plan.md` -> `implementation.md` (`spec.md`/`design.md` optional)
|
|
@@ -360,15 +522,15 @@ actionable `oat pjm init` stop instead of scaffolding implicitly. See
|
|
|
360
522
|
|
|
361
523
|
### Seeding a new project from a brainstorm
|
|
362
524
|
|
|
363
|
-
When the brainstorming destination is "promote to a new OAT project", the dispatcher confirms a project slug and
|
|
525
|
+
When the brainstorming destination is "promote to a new OAT project", the dispatcher confirms a project slug and one of three modes: `lite`, `quick`, or `spec-driven`. For Quick and Spec-Driven projects, it runs `oat project new <slug> --mode <mode>` and writes `discovery.md` directly from the brainstorming payload — Initial Request, Solution Space with approaches considered, Chosen Direction, Key Decisions, and Open Questions. It writes only `discovery.md` (never a partial `design.md`), then points to `oat-project-quick-start` or `oat-project-design` without auto-chaining. For Lite projects, it instead seeds the five sections in `plan.md`, leaves `discovery.md` and `design.md` absent, and points to `oat-project-lite`.
|
|
364
526
|
|
|
365
|
-
This is a parallel entry path into
|
|
527
|
+
This is a parallel entry path into all three lanes, not a new lane. Quick and Spec-Driven users arrive at `oat-project-quick-start` or `oat-project-design` with discovery already populated; Lite users arrive at `oat-project-lite` with the single-phase plan already seeded.
|
|
366
528
|
|
|
367
529
|
### Folding back into an active project
|
|
368
530
|
|
|
369
531
|
When `oat-brainstorm` fires while a project is active, it offers a 3-way picker before any pack-filtered destination shows up:
|
|
370
532
|
|
|
371
|
-
- **Related to the project** → fold the
|
|
533
|
+
- **Related to the project** → for Lite, fold the synthesis into `plan.md` immediately above `## Phase 1` and hand off to `oat-project-lite`; for Quick and Spec-Driven, use the most-specific upstream artifact (`design.md` if it exists, otherwise `discovery.md`) and hand off to `oat-project-quick-start` or `oat-project-plan`. Any mode with an open PR hands off to `oat-project-revise`. The fold-back commit is safety-gated: a preflight `git status --porcelain -- "$ARTIFACT_PATH"` checks for dirty state, staging is exactly `git add -- "$ARTIFACT_PATH"` (never `-A`, never globs), and the handoff prompt only prints after the scoped commit succeeds.
|
|
372
534
|
- **Independent of the project** → the active project is acknowledged but doesn't constrain the picker; brainstorm routes through its standard pack-filtered terminal-state options (new project, backlog item, idea, doc-to-path, inline).
|
|
373
535
|
- **Related but supplementary** → write a brainstorming reference file at `.oat/projects/<scope>/<project>/brainstorming/YYYY-MM-DD-<topic>.md`, alongside `pr/` and `reviews/`. No lifecycle artifact is touched.
|
|
374
536
|
|
|
@@ -36,6 +36,20 @@ its parent is reported and skipped rather than adopted.
|
|
|
36
36
|
After adoption, set or open the project through the normal lifecycle command
|
|
37
37
|
you are using. Arrival-aware project skills pull before reading its artifacts.
|
|
38
38
|
|
|
39
|
+
An adopted quick-workflow project whose `plan.md` is not implementation-ready
|
|
40
|
+
resumes through `oat-project-quick-start`, which continues it in place without
|
|
41
|
+
re-scaffolding, rather than through `oat-project-implement`. `oat-project-plan`,
|
|
42
|
+
`oat-project-progress`, and `oat-project-next` all route by the single **quick
|
|
43
|
+
plan readiness** predicate that `oat-project-quick-start` defines; readiness is
|
|
44
|
+
never inferred from the presence of tasks alone.
|
|
45
|
+
|
|
46
|
+
`oat project status` and `oat project list` apply the same predicate. For a
|
|
47
|
+
quick project at the `plan` phase they recommend `oat-project-quick-start`, with
|
|
48
|
+
the unmet clause in the reason, until the plan carries ready frontmatter, a
|
|
49
|
+
durable `## Reviews` disposition, and a substantive task; only then do they
|
|
50
|
+
recommend `oat-project-implement`. Recommendations for lite, spec-driven, and
|
|
51
|
+
import projects are unchanged, because the predicate is quick-workflow policy.
|
|
52
|
+
|
|
39
53
|
## What travels
|
|
40
54
|
|
|
41
55
|
- The project ref carries the complete active artifact tree and its history.
|