@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.
Files changed (120) hide show
  1. package/assets/agents/oat-phase-implementer.md +27 -4
  2. package/assets/agents/oat-reviewer.md +25 -14
  3. package/assets/bundle-metadata.json +1 -1
  4. package/assets/docs/cli-utilities/config-and-local-state.md +1 -0
  5. package/assets/docs/cli-utilities/configuration.md +10 -8
  6. package/assets/docs/cli-utilities/project-log.md +16 -0
  7. package/assets/docs/cli-utilities/workflow-gates.md +127 -19
  8. package/assets/docs/provider-sync/commands.md +3 -0
  9. package/assets/docs/provider-sync/instruction-sync.md +107 -0
  10. package/assets/docs/reference/cli-reference.md +26 -9
  11. package/assets/docs/reference/oat-directory-structure.md +33 -31
  12. package/assets/docs/workflows/ideas/index.md +1 -1
  13. package/assets/docs/workflows/index.md +1 -0
  14. package/assets/docs/workflows/projects/artifacts.md +24 -3
  15. package/assets/docs/workflows/projects/hill-checkpoints.md +21 -0
  16. package/assets/docs/workflows/projects/implementation-execution.md +5 -0
  17. package/assets/docs/workflows/projects/lifecycle.md +169 -7
  18. package/assets/docs/workflows/projects/picking-up-projects.md +14 -0
  19. package/assets/docs/workflows/projects/pr-flow.md +2 -0
  20. package/assets/docs/workflows/projects/reviews.md +1 -1
  21. package/assets/docs/workflows/projects/state-machine.md +20 -0
  22. package/assets/docs/workflows/skills/explainer-kit.md +10 -4
  23. package/assets/docs/workflows/skills/index.md +2 -1
  24. package/assets/docs/workflows/skills/repo-improve.md +15 -1
  25. package/assets/public-package-versions.json +4 -4
  26. package/assets/skills/oat-brainstorm/SKILL.md +61 -12
  27. package/assets/skills/oat-docs/SKILL.md +13 -8
  28. package/assets/skills/oat-doctor/SKILL.md +3 -3
  29. package/assets/skills/oat-explainer-kit/SKILL.md +14 -1
  30. package/assets/skills/oat-explainer-kit/references/config-contract.md +12 -0
  31. package/assets/skills/oat-explainer-kit/references/lifecycle-contract.md +57 -10
  32. package/assets/skills/oat-explainer-kit/scripts/check-terminal-outcome.mjs +28 -5
  33. package/assets/skills/oat-explainer-kit/scripts/probe-recap-seams.mjs +371 -0
  34. package/assets/skills/oat-explainer-kit/scripts/resolve-intent.mjs +123 -1
  35. package/assets/skills/oat-pjm-review-backlog/SKILL.md +2 -2
  36. package/assets/skills/oat-project-autonomous/SKILL.md +23 -9
  37. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +164 -150
  38. package/assets/skills/oat-project-capture/SKILL.md +2 -2
  39. package/assets/skills/oat-project-complete/SKILL.md +134 -4
  40. package/assets/skills/oat-project-discover/SKILL.md +6 -5
  41. package/assets/skills/oat-project-document/SKILL.md +11 -1
  42. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +164 -150
  43. package/assets/skills/oat-project-implement/SKILL.md +3 -3
  44. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +144 -21
  45. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +164 -150
  46. package/assets/skills/oat-project-implement/references/phase-execution.md +16 -1
  47. package/assets/skills/oat-project-implement/references/plan-and-resume.md +19 -1
  48. package/assets/skills/oat-project-import-plan/SKILL.md +47 -3
  49. package/assets/skills/oat-project-lite/SKILL.md +467 -0
  50. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +331 -0
  51. package/assets/skills/oat-project-next/SKILL.md +75 -16
  52. package/assets/skills/oat-project-plan/SKILL.md +44 -6
  53. package/assets/skills/oat-project-plan-writing/SKILL.md +6 -3
  54. package/assets/skills/oat-project-pr-final/SKILL.md +33 -7
  55. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +164 -150
  56. package/assets/skills/oat-project-pr-progress/SKILL.md +3 -3
  57. package/assets/skills/oat-project-progress/SKILL.md +27 -5
  58. package/assets/skills/oat-project-promote-spec-driven/SKILL.md +3 -1
  59. package/assets/skills/oat-project-quick-start/SKILL.md +264 -4
  60. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +164 -150
  61. package/assets/skills/oat-project-review-provide/SKILL.md +25 -6
  62. package/assets/skills/oat-project-summary/SKILL.md +61 -26
  63. package/assets/skills/oat-repo-improve/SKILL.md +40 -5
  64. package/assets/skills/oat-repo-improve/references/plan-template.md +84 -7
  65. package/assets/templates/plan-lite.md +165 -0
  66. package/assets/templates/plan.md +1 -1
  67. package/assets/templates/state.md +1 -1
  68. package/dist/commands/config/index.d.ts +1 -0
  69. package/dist/commands/config/index.d.ts.map +1 -1
  70. package/dist/commands/config/index.js +401 -18
  71. package/dist/commands/gate/index.d.ts +3 -1
  72. package/dist/commands/gate/index.d.ts.map +1 -1
  73. package/dist/commands/gate/index.js +699 -211
  74. package/dist/commands/init/tools/shared/skill-script-references.d.ts +126 -0
  75. package/dist/commands/init/tools/shared/skill-script-references.d.ts.map +1 -0
  76. package/dist/commands/init/tools/shared/skill-script-references.js +311 -0
  77. package/dist/commands/instructions/instructions.types.d.ts +63 -0
  78. package/dist/commands/instructions/instructions.types.d.ts.map +1 -1
  79. package/dist/commands/instructions/instructions.utils.d.ts +51 -2
  80. package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
  81. package/dist/commands/instructions/instructions.utils.js +201 -4
  82. package/dist/commands/instructions/sync/sync.d.ts.map +1 -1
  83. package/dist/commands/instructions/sync/sync.js +12 -1
  84. package/dist/commands/instructions/validate/validate.d.ts.map +1 -1
  85. package/dist/commands/instructions/validate/validate.js +12 -1
  86. package/dist/commands/project/index.d.ts.map +1 -1
  87. package/dist/commands/project/index.js +2 -0
  88. package/dist/commands/project/log/append.d.ts +195 -0
  89. package/dist/commands/project/log/append.d.ts.map +1 -1
  90. package/dist/commands/project/log/append.js +1034 -11
  91. package/dist/commands/project/new/index.d.ts +3 -2
  92. package/dist/commands/project/new/index.d.ts.map +1 -1
  93. package/dist/commands/project/new/index.js +2 -1
  94. package/dist/commands/project/new/scaffold.d.ts +5 -3
  95. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  96. package/dist/commands/project/new/scaffold.js +38 -10
  97. package/dist/commands/project/promote/index.d.ts +2 -0
  98. package/dist/commands/project/promote/index.d.ts.map +1 -0
  99. package/dist/commands/project/promote/index.js +1 -0
  100. package/dist/commands/project/promote/promote.d.ts +47 -0
  101. package/dist/commands/project/promote/promote.d.ts.map +1 -0
  102. package/dist/commands/project/promote/promote.js +322 -0
  103. package/dist/commands/project/split/run.d.ts.map +1 -1
  104. package/dist/commands/project/split/run.js +8 -1
  105. package/dist/commands/project/validate-plan/index.d.ts.map +1 -1
  106. package/dist/commands/project/validate-plan/index.js +25 -1
  107. package/dist/commands/project/validate-plan/validate-plan.d.ts +8 -0
  108. package/dist/commands/project/validate-plan/validate-plan.d.ts.map +1 -1
  109. package/dist/commands/project/validate-plan/validate-plan.js +49 -0
  110. package/dist/commands/shared/frontmatter.d.ts +1 -1
  111. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  112. package/dist/commands/shared/frontmatter.js +1 -0
  113. package/dist/commands/state/generate.d.ts.map +1 -1
  114. package/dist/commands/state/generate.js +23 -0
  115. package/dist/commands/tools/shared/pack-manifest.d.ts.map +1 -1
  116. package/dist/commands/tools/shared/pack-manifest.js +2 -0
  117. package/dist/config/oat-config.d.ts +41 -0
  118. package/dist/config/oat-config.d.ts.map +1 -1
  119. package/dist/config/oat-config.js +111 -0
  120. 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. Without `--scope`, creation uses
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` supports mutually exclusive surface flags that control which config file receives the write:
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: 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`.
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.requireForProjectCompletion` | `boolean` | `false` | When `true`, OAT project completion gates require documentation to be updated |
126
- | `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`. |
127
- | `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. |
128
- | `workflow.dispatchPolicy.mode` | `string` | unset | Dispatch policy mode: `managed` lets OAT select model/effort controls; `inherit` leaves controls to the host/provider defaults. |
129
- | `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. |
130
- | `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`. |
131
- | `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. |
132
- | `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. |
133
- | `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. |
134
- | `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`. |
135
- | `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. |
136
- | `archive.s3Uri` | `string` | - | Base S3 URI for repo-scoped archived project sync, for example `s3://bucket/oat-archive` |
137
- | `archive.s3SyncOnComplete` | `boolean` | `false` | When `true`, `oat-project-complete` uploads the archived project to the configured S3 archive after local archive succeeds |
138
- | `archive.summaryExportPath` | `string` | - | Repo-relative directory where completion exports `summary.md` as a dated snapshot like `20260401-<project-name>.md` for durable tracked reference |
139
- | `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/` |
140
- | `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. |
141
- | `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. |
142
-
143
- All `documentation.*` keys are managed via `oat config get/set` and are set automatically by `oat docs init`.
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
- - `spec.md` and `design.md` are required in spec-driven mode, optional in quick/import mode. Quick mode offers a lightweight `design.md` (architecture, components, testing strategy) at a post-discovery decision point.
55
- - `plan.md` remains canonical execution artifact across all modes.
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. The target probe qualifies only
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 a mode (`quick` vs `spec-driven`) with the user, runs `oat project new <slug> --mode <mode>` to scaffold the project, and writes the new project's `discovery.md` directly from the brainstorming payload — Initial Request, Solution Space with approaches considered, Chosen Direction, Key Decisions, Open Questions. It writes `discovery.md` only (never a partial `design.md`), so the design phase keeps its full collaborative cadence and consumes the brainstorm's architectural intent from discovery's Solution Space and Chosen Direction sections during approach reaffirmation. The dispatcher stops with a pointer to `oat-project-quick-start` or `oat-project-design` — it deliberately does not auto-chain into the next phase, so the user makes that transition consciously.
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 the Spec-Driven and Quick lanes, not a new lane: the resulting project follows the normal lane it was scaffolded into. The brainstorm-as-seed step is what changes — the user arrives at `oat-project-quick-start` (or `oat-project-design`) with discovery already populated rather than starting from a blank discovery template.
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 synthesized brainstorming content back into the most-specific upstream artifact (`design.md` if it exists, otherwise `discovery.md`), commit immediately, and print a handoff prompt for the right plan-authoring skill (`oat-project-plan` for spec-driven, `oat-project-quick-start` for quick, `oat-project-revise` when an open PR exists). 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.
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.