@open-agent-toolkit/cli 0.3.9 → 0.3.11

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 (193) hide show
  1. package/README.md +2 -1
  2. package/assets/bundle-metadata.json +1 -1
  3. package/assets/config/dispatch-matrix-recommendation.json +6 -6
  4. package/assets/docs/cli-utilities/configuration.md +12 -8
  5. package/assets/docs/cli-utilities/meta.json +13 -0
  6. package/assets/docs/cli-utilities/tool-packs.md +8 -2
  7. package/assets/docs/cli-utilities/workflow-gates.md +14 -1
  8. package/assets/docs/contributing/code.md +8 -2
  9. package/assets/docs/contributing/documentation.md +7 -1
  10. package/assets/docs/contributing/meta.json +15 -0
  11. package/assets/docs/contributing/updating-model-guidance.md +34 -6
  12. package/assets/docs/contributing/verifying-cursor-pins.md +38 -9
  13. package/assets/docs/docs-tooling/add-docs-to-a-repo.md +14 -5
  14. package/assets/docs/docs-tooling/commands.md +26 -8
  15. package/assets/docs/docs-tooling/meta.json +4 -0
  16. package/assets/docs/docs-tooling/workflows.md +2 -2
  17. package/assets/docs/guide/meta.json +4 -0
  18. package/assets/docs/meta.json +14 -0
  19. package/assets/docs/provider-sync/instruction-sync.md +8 -0
  20. package/assets/docs/provider-sync/meta.json +11 -0
  21. package/assets/docs/provider-sync/providers.md +4 -4
  22. package/assets/docs/provider-sync/scope-and-surface.md +3 -4
  23. package/assets/docs/reference/cli-reference.md +5 -2
  24. package/assets/docs/reference/docs-index-contract.md +22 -6
  25. package/assets/docs/reference/file-locations.md +7 -2
  26. package/assets/docs/reference/index.md +1 -1
  27. package/assets/docs/reference/meta.json +10 -0
  28. package/assets/docs/reference/troubleshooting.md +41 -6
  29. package/assets/docs/workflows/ideas/meta.json +4 -0
  30. package/assets/docs/workflows/meta.json +4 -0
  31. package/assets/docs/workflows/projects/cursor-cloud.md +8 -3
  32. package/assets/docs/workflows/projects/dispatch-ceiling.md +21 -14
  33. package/assets/docs/workflows/projects/evidence-layers.md +6 -8
  34. package/assets/docs/workflows/projects/implementation-execution.md +34 -5
  35. package/assets/docs/workflows/projects/lifecycle.md +7 -1
  36. package/assets/docs/workflows/projects/meta.json +25 -0
  37. package/assets/docs/workflows/projects/orchestration-model.md +5 -6
  38. package/assets/docs/workflows/skills/meta.json +10 -0
  39. package/assets/docs/workflows/skills/recon.md +28 -3
  40. package/assets/public-package-versions.json +4 -4
  41. package/assets/skills/oat-cursor-cloud-projects/SKILL.md +30 -16
  42. package/assets/skills/oat-dispatch-subagents/SKILL.md +4 -12
  43. package/assets/skills/oat-dispatch-subagents/references/managed-claude-example.json +1 -1
  44. package/assets/skills/oat-dispatch-subagents/references/provider-codex.md +51 -0
  45. package/assets/skills/oat-dispatch-subagents/references/provider-cursor.md +5 -2
  46. package/assets/skills/oat-dispatch-subagents/references/record-schema.md +8 -7
  47. package/assets/skills/oat-docs-analyze/SKILL.md +28 -3
  48. package/assets/skills/oat-docs-apply/SKILL.md +3 -3
  49. package/assets/skills/oat-docs-authoring/SKILL.md +1 -1
  50. package/assets/skills/oat-docs-authoring/references/oat-fumadocs-contract.md +5 -2
  51. package/assets/skills/oat-docs-bootstrap/SKILL.md +4 -3
  52. package/assets/skills/oat-docs-bootstrap/assets/AGENTS.md.template +3 -3
  53. package/assets/skills/oat-pjm-decision/SKILL.md +3 -2
  54. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +4 -4
  55. package/assets/skills/oat-project-complete/SKILL.md +47 -2
  56. package/assets/skills/oat-project-design/SKILL.md +10 -6
  57. package/assets/skills/oat-project-discover/SKILL.md +3 -3
  58. package/assets/skills/oat-project-dispatch-subagents/SKILL.md +3 -10
  59. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +4 -4
  60. package/assets/skills/oat-project-implement/SKILL.md +1 -1
  61. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +135 -3
  62. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +8 -10
  63. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +4 -4
  64. package/assets/skills/oat-project-implement/references/plan-and-resume.md +1 -1
  65. package/assets/skills/oat-project-import-plan/SKILL.md +3 -3
  66. package/assets/skills/oat-project-lite/references/docs/autonomy-contract.md +4 -4
  67. package/assets/skills/oat-project-new/SKILL.md +3 -3
  68. package/assets/skills/oat-project-next/SKILL.md +50 -7
  69. package/assets/skills/oat-project-plan/SKILL.md +4 -4
  70. package/assets/skills/oat-project-plan-writing/SKILL.md +4 -4
  71. package/assets/skills/oat-project-pr-final/SKILL.md +11 -1
  72. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +4 -4
  73. package/assets/skills/oat-project-promote-spec-driven/SKILL.md +2 -2
  74. package/assets/skills/oat-project-quick-start/SKILL.md +12 -8
  75. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +4 -4
  76. package/assets/skills/oat-project-retro/SKILL.md +6 -3
  77. package/assets/skills/oat-project-review-provide/SKILL.md +2 -2
  78. package/assets/skills/oat-project-review-provide-remote/SKILL.md +2 -2
  79. package/assets/skills/oat-project-spec/SKILL.md +3 -3
  80. package/assets/skills/oat-project-summary/SKILL.md +22 -3
  81. package/assets/skills/oat-repo-improve/SKILL.md +2 -2
  82. package/assets/skills/recon/SKILL.md +24 -3
  83. package/assets/skills/recon/references/packet-contract.md +36 -6
  84. package/assets/skills/recon/references/profiles.md +3 -0
  85. package/assets/skills/recon/references/worker-contract.md +16 -3
  86. package/assets/skills/recon/scripts/create-review-brief.mjs +17 -86
  87. package/assets/skills/recon/scripts/lib/contracts.mjs +158 -41
  88. package/assets/skills/recon/scripts/lib/review-binding.mjs +123 -0
  89. package/assets/skills/recon/scripts/lib/routing.mjs +5 -2
  90. package/assets/skills/recon/scripts/reconcile-ledger.mjs +18 -7
  91. package/assets/skills/recon/scripts/render-packet.mjs +93 -1
  92. package/assets/skills/recon/scripts/validate-packet.mjs +119 -88
  93. package/assets/skills/subagent-orchestration/SKILL.md +1 -1
  94. package/assets/skills/subagent-orchestration/references/evidence-and-refresh.md +20 -8
  95. package/assets/skills/subagent-orchestration/references/provider-claude.md +25 -12
  96. package/assets/skills/subagent-orchestration/references/provider-codex.md +27 -18
  97. package/assets/skills/subagent-orchestration/references/provider-cursor.md +40 -10
  98. package/assets/templates/state.md +1 -0
  99. package/dist/commands/backlog/new.d.ts +2 -2
  100. package/dist/commands/backlog/new.d.ts.map +1 -1
  101. package/dist/commands/backlog/new.js +2 -2
  102. package/dist/commands/decision/new.d.ts +2 -2
  103. package/dist/commands/decision/new.d.ts.map +1 -1
  104. package/dist/commands/decision/new.js +2 -2
  105. package/dist/commands/docs/nav/contents.d.ts +9 -0
  106. package/dist/commands/docs/nav/contents.d.ts.map +1 -1
  107. package/dist/commands/docs/nav/contents.js +7 -2
  108. package/dist/commands/docs/nav/fumadocs.d.ts +51 -0
  109. package/dist/commands/docs/nav/fumadocs.d.ts.map +1 -0
  110. package/dist/commands/docs/nav/fumadocs.js +301 -0
  111. package/dist/commands/docs/nav/sync.d.ts +31 -1
  112. package/dist/commands/docs/nav/sync.d.ts.map +1 -1
  113. package/dist/commands/docs/nav/sync.js +163 -6
  114. package/dist/commands/index.d.ts.map +1 -1
  115. package/dist/commands/index.js +2 -0
  116. package/dist/commands/instructions/instructions.utils.d.ts +19 -0
  117. package/dist/commands/instructions/instructions.utils.d.ts.map +1 -1
  118. package/dist/commands/instructions/instructions.utils.js +89 -17
  119. package/dist/commands/instructions/sync/sync.d.ts.map +1 -1
  120. package/dist/commands/instructions/sync/sync.js +49 -2
  121. package/dist/commands/pjm/init.d.ts.map +1 -1
  122. package/dist/commands/pjm/init.js +2 -2
  123. package/dist/commands/project/closeout-check/closeout-invariant.d.ts +97 -0
  124. package/dist/commands/project/closeout-check/closeout-invariant.d.ts.map +1 -0
  125. package/dist/commands/project/closeout-check/closeout-invariant.js +301 -0
  126. package/dist/commands/project/closeout-check/index.d.ts +38 -0
  127. package/dist/commands/project/closeout-check/index.d.ts.map +1 -0
  128. package/dist/commands/project/closeout-check/index.js +117 -0
  129. package/dist/commands/project/complete-state/index.d.ts +4 -0
  130. package/dist/commands/project/complete-state/index.d.ts.map +1 -1
  131. package/dist/commands/project/complete-state/index.js +11 -13
  132. package/dist/commands/project/dispatch/index.d.ts.map +1 -1
  133. package/dist/commands/project/dispatch/index.js +6 -30
  134. package/dist/commands/project/dispatch/record.d.ts +9 -18
  135. package/dist/commands/project/dispatch/record.d.ts.map +1 -1
  136. package/dist/commands/project/dispatch/record.js +15 -212
  137. package/dist/commands/project/index.d.ts.map +1 -1
  138. package/dist/commands/project/index.js +2 -0
  139. package/dist/commands/project/new/scaffold.d.ts +0 -1
  140. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  141. package/dist/commands/project/new/scaffold.js +19 -20
  142. package/dist/commands/project/promote/promote.d.ts +2 -2
  143. package/dist/commands/project/promote/promote.d.ts.map +1 -1
  144. package/dist/commands/project/promote/promote.js +13 -11
  145. package/dist/commands/shared/frontmatter.d.ts +21 -0
  146. package/dist/commands/shared/frontmatter.d.ts.map +1 -1
  147. package/dist/commands/shared/frontmatter.js +70 -4
  148. package/dist/commands/shared/template-source.d.ts +29 -0
  149. package/dist/commands/shared/template-source.d.ts.map +1 -0
  150. package/dist/commands/{pjm → shared}/template-source.js +24 -7
  151. package/dist/commands/state/generate.js +2 -2
  152. package/dist/commands/template/index.d.ts +10 -0
  153. package/dist/commands/template/index.d.ts.map +1 -0
  154. package/dist/commands/template/index.js +87 -0
  155. package/dist/commands/template/resolve.d.ts +31 -0
  156. package/dist/commands/template/resolve.d.ts.map +1 -0
  157. package/dist/commands/template/resolve.js +86 -0
  158. package/dist/fs/io.d.ts +0 -41
  159. package/dist/fs/io.d.ts.map +1 -1
  160. package/dist/fs/io.js +2 -414
  161. package/dist/providers/claude/dispatch-envelope.d.ts.map +1 -1
  162. package/dist/providers/claude/dispatch-envelope.js +1 -0
  163. package/dist/providers/claude/targets.d.ts +1 -0
  164. package/dist/providers/claude/targets.d.ts.map +1 -1
  165. package/dist/providers/claude/targets.js +3 -1
  166. package/dist/providers/codex/codec/shared.d.ts +3 -0
  167. package/dist/providers/codex/codec/shared.d.ts.map +1 -1
  168. package/dist/providers/codex/codec/shared.js +4 -0
  169. package/dist/providers/cursor/codec/catalog.d.ts +2 -2
  170. package/dist/providers/cursor/codec/catalog.d.ts.map +1 -1
  171. package/dist/providers/cursor/codec/catalog.js +45 -0
  172. package/dist/providers/cursor/codec/mapping-validation.d.ts +4 -0
  173. package/dist/providers/cursor/codec/mapping-validation.d.ts.map +1 -0
  174. package/dist/providers/cursor/codec/mapping-validation.js +25 -0
  175. package/dist/providers/cursor/codec/materialize.d.ts.map +1 -1
  176. package/dist/providers/cursor/codec/materialize.js +2 -11
  177. package/dist/providers/cursor/codec/sync-extension.d.ts.map +1 -1
  178. package/dist/providers/cursor/codec/sync-extension.js +2 -11
  179. package/dist/providers/identity/absolute-paths.d.ts +4 -13
  180. package/dist/providers/identity/absolute-paths.d.ts.map +1 -1
  181. package/dist/providers/identity/absolute-paths.js +4 -17
  182. package/dist/providers/identity/generic-dispatch-record.d.ts +1 -1
  183. package/dist/providers/identity/generic-dispatch-record.js +2 -2
  184. package/dist/providers/identity/oat-dispatch-record.d.ts +4 -357
  185. package/dist/providers/identity/oat-dispatch-record.d.ts.map +1 -1
  186. package/dist/providers/identity/oat-dispatch-record.js +4 -236
  187. package/dist/release/public-package-contract.d.ts.map +1 -1
  188. package/dist/release/public-package-contract.js +12 -4
  189. package/dist/validation/skills.d.ts.map +1 -1
  190. package/dist/validation/skills.js +32 -6
  191. package/package.json +2 -2
  192. package/dist/commands/pjm/template-source.d.ts +0 -14
  193. package/dist/commands/pjm/template-source.d.ts.map +0 -1
@@ -53,6 +53,7 @@ The first practical expansion path is to keep improving the existing owners: [Do
53
53
  | `oat docs ...` | Docs app bootstrap, migration, index generation, nav sync, and docs workflow entrypoints. | [Docs Tooling Commands](../docs-tooling/commands.md) |
54
54
  | `oat status` / `oat sync` / `oat providers ...` | Provider sync, drift inspection, provider configuration, and adoption behavior. | [Provider Sync](../provider-sync/index.md) |
55
55
  | `oat project ...` / `oat cleanup ...` | Project scaffolding, active-project status inspection, tracked-project listing, plan validation, archive creation, and project/artifact cleanup commands. | [Workflow & Projects](../workflows/projects/index.md) |
56
+ | `oat template resolve` | Resolve a lifecycle template in repository, user, then bundle order and optionally copy it into place. | [File Locations](file-locations.md) |
56
57
  | `oat review ...` | Review artifact discovery helpers, including latest-review resolution for project and ad-hoc review flows. | [Reviews](../workflows/projects/reviews.md) |
57
58
  | `oat repo ...` | Repository-level workflows such as archive sync and PR-comment analysis. | [Repository Analysis](../workflows/projects/repo-analysis.md) |
58
59
 
@@ -149,12 +150,14 @@ Notable commands introduced in the current CLI surface:
149
150
  - `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.
150
151
  - `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.
151
152
  - `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.
153
+ - `oat template resolve <name> [--output <path>] [--json]` - resolve a template in repository (`<repo>/.oat/templates/`), user (`~/.oat/templates/`), then bundled order and report `name`, `found`, `tier` (`repository` | `user` | `bundle`), and `path`. `path` is set only for the repository and user tiers; it is `null` for the bundled tier, so callers never depend on a package-manager path. `<name>` accepts `plan` or `plan.md` and rejects path separators and `..`. `--output <path>` copies the resolved content to that file, replacing an existing file, and does not create missing parent directories; JSON output adds the absolute `output` path. A template missing from every tier exits 1 with `found: false`. Lifecycle skills use `--output` to copy their artifact templates, so a user-scope-only install works without a repository `.oat/templates/` directory.
152
154
  - `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`.
153
155
  - `oat project list --json` - summary state for tracked projects under the configured projects root
154
- - `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
156
+ - `oat project closeout-check <project-path> [--autonomous] [--json]` - read-only check of the closeout invariant: a closeout that must snapshot its post-implementation sequence cannot reach terminal completion until its `oat_post_implement_sequence` snapshot exists, every stored step is recorded complete, approval is recorded, and the snapshot reached `status: complete`. A snapshot is required when the effective layered `workflow.postImplementSequence` is configured, when the closeout is autonomous (`--autonomous`, or `OAT_AUTONOMOUS=1` in the environment even without the flag), or when `oat_workflow_mode` is `lite`. Once a snapshot exists its recorded state is authoritative and current configuration is not consulted. JSON output reports `status` (`complete`, `not_required`, or `incomplete`), the missing `invariant` (`snapshot_missing`, `snapshot_malformed`, `sequence_failed`, `pre_approval_step_pending`, `approval_pending`, `post_approval_step_pending`, or `sequence_not_complete`), `route` (`oat-project-implement` when incomplete), `nextOwner` (the next stored step and its skill, or the approval), and the evaluated `inputs`. An incomplete or malformed result exits 1.
157
+ - `oat project complete-state <project-path> [--archived] [--autonomous]` - apply the canonical completed-state mutation to a project's `state.md`; used by `oat-project-complete` during lifecycle closeout. It first evaluates the same closeout invariant as `oat project closeout-check` and refuses, with the same message and without writing, a configured, autonomous, or lite closeout whose snapshot is absent, malformed, or incomplete. A project whose implementation finished before closeout snapshots existed recovers by running `oat-project-implement`, which persists the snapshot (`completion-and-closeout.md` Step 15) and completes its stored steps; there is no override flag. An unconfigured, interactive, non-lite closeout without a snapshot completes as before.
155
158
  - `oat project archive [project-path] [--project-recap-run <project-relative-path>] [--no-commit]` - archive a tracked project through the same local move, summary export, and configured S3 upload path used by completion. When omitted, the project path falls back to the active project. The optional recap path must identify a `project-recap` run inside the project's `explainers/` directory. Archive stages the selected complete package into `.oat/repo/reference/project-recaps/<YYYYMMDD-project-slug>/`, verifies every manifest-declared file byte, then atomically installs the export before deleting the active project. Existing destinations, incomplete inventory 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. 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.
156
159
  - `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.
157
- - `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 (optional; no lifecycle skill requires persistence). Omit `--project` to validate without persisting. Managed, effort-pinned Claude launches use the validation-only form before launch: the input carries `claudeLaunch` with the real resolver result, generated definition, and proposed payload, plus `recordBase` and `event`. The command validates their agreement and derives the configured invocation fields; callers cannot copy those fields into `recordBase`. One validation run reports every violation across `claudeLaunch`, `recordBase`, and `event` in a single error message, one `stage path: message` line each; the `recordBase` cross-field rules run even when a required field is missing, checks that need a value that failed to parse are skipped and named on a final line, secret-shaped values and absolute paths are scrubbed from the message, and the exit code stays 1. A validated input per role is published at `.agents/skills/oat-dispatch-subagents/references/managed-claude-example.json`. 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).
160
+ - `oat project dispatch record --event-file <json-file-or-dash>` - validate one generic dispatch record plus its namespaced OAT evidence event and print the result with `status: validated-only`. The command writes nothing; launches are recorded in the calling workflow's run record. Managed, effort-pinned Claude launches run it before launch: the input carries `claudeLaunch` with the real resolver result, generated definition, and proposed payload, plus `recordBase` and `event`. The command validates their agreement and derives the configured invocation fields; callers cannot copy those fields into `recordBase`. One validation run reports every violation across `claudeLaunch`, `recordBase`, and `event` in a single error message, one `stage path: message` line each; the `recordBase` cross-field rules run even when a required field is missing, checks that need a value that failed to parse are skipped and named on a final line, secret-shaped values and absolute paths are scrubbed from the message, and the exit code stays 1. A validated input per role is published at `.agents/skills/oat-dispatch-subagents/references/managed-claude-example.json`. The command validates evidence only — it never launches a provider. A `runtime-observation` event may carry either a finished `observation` or the provider `metadata` envelope (`provider`, `observedAt`, `entries`) to normalize, but not both. `entries` may be raw provider output: they are projected through the owning parser's allowlist, are never echoed in the output, and both forms have their `match` derived from the record's configured invocation rather than trusted from the caller, with the observation's `provider` bound to the record's. With `--json`, the result adds `runtimeIdentity` with separate `configured` and `observed` objects plus a `match` of `matching`, `mismatching`, `not-comparable`, or `null`; observation is corroboration only and never overrides configured invocation. Error output is redacted on a best-effort basis; absolute paths in identity fields are rejected outright, while some prose forms (colon-prefixed, URL routes) can survive. See [Evidence Layers](../workflows/projects/evidence-layers.md).
158
161
  - `oat project dispatch canonical-role --role <name> --request-id <id> --skill-dir <dir> [--json]` - resolve a canonical role through the loaded, user (`$HOME/.agents`), and project (`<repo>/.agents`) tiers and print the `canonical-role-resolution` event that `oat project dispatch record` accepts unchanged: redacted `canonicalPath` and `selectedPath` in the form `<loaded|user|project>/agents/<name>.md`, the role's `contentDigest`, and `candidateMisses`. `--skill-dir` is required because the loaded tier is derived from the loaded skill's directory; a missing or invalid directory exits 1 with a redacted error. An unknown role prints `missing` evidence with its recovery commands. Read-only; the dependency is the `workflows` pack.
159
162
  - `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).
160
163
  - `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).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  title: Docs Index Contract
3
- description: 'Docs source contract: authored index.md maps, generated Fumadocs manifests, and MkDocs nav sync.'
3
+ description: 'Docs source contract: authored index.md maps, generated Fumadocs manifests and meta.json navigation, and MkDocs nav sync.'
4
4
  ---
5
5
 
6
6
  # Docs Index Contract
@@ -15,7 +15,7 @@ OAT docs navigation starts from authored `docs/**/index.md` files. Each `## Cont
15
15
  - Every `## Contents` link should use a `.md`-suffixed relative target, including child directory links such as `subdir/index.md`.
16
16
  - Do not hand-edit generated navigation or generated root-index artifacts.
17
17
  - For Fumadocs, refresh or freshness-check the generated app-root manifest after adding, removing, or renaming Markdown files. Compare that manifest against authored `## Contents` maps for drift; reordering `## Contents` does not reorder the generated manifest's file-tree sort.
18
- - For MkDocs, run `oat docs nav sync` after adding, removing, renaming, or reordering pages. It regenerates `mkdocs.yml` from authored `## Contents` maps and preserves the order declared in each local map.
18
+ - Run `oat docs nav sync` after adding, removing, renaming, or reordering pages. It regenerates the framework's navigation from authored `## Contents` maps and preserves the order declared in each local map: the `nav:` block in `mkdocs.yml` for MkDocs, and one `meta.json` per docs directory for Fumadocs.
19
19
 
20
20
  ## `## Contents` format
21
21
 
@@ -37,7 +37,7 @@ Notes:
37
37
 
38
38
  ## Fumadocs Generation
39
39
 
40
- For this Fumadocs app, rendered page routing and sidebar data come from the Fumadocs file/source pipeline over `apps/oat-docs/docs`. The generated root manifest, `apps/oat-docs/index.md`, is an inventory for agents and tooling; it is not the rendered sidebar/page-tree source.
40
+ For this Fumadocs app, rendered page routing comes from the Fumadocs file/source pipeline over `apps/oat-docs/docs`, and the sidebar order comes from the committed `meta.json` files that `oat docs nav sync` writes (see [Fumadocs Nav Sync](#fumadocs-nav-sync)). The generated root manifest, `apps/oat-docs/index.md`, is an inventory for agents and tooling; it is not the rendered sidebar/page-tree source.
41
41
 
42
42
  `oat docs generate-index` walks the Markdown file tree under `docs/` and writes the app-root generated manifest. The app scripts run:
43
43
 
@@ -46,7 +46,7 @@ fumadocs-mdx
46
46
  pnpm -w run cli:source -- docs generate-index --docs-dir apps/oat-docs/docs --output apps/oat-docs/index.md
47
47
  ```
48
48
 
49
- `oat docs generate-index` rewrites the generated root manifest from the docs source tree. It is the command to use after adding, removing, or retiring pages in this Fumadocs app. Do not use `oat docs nav sync` as the Fumadocs regeneration step.
49
+ `oat docs generate-index` rewrites the generated root manifest from the docs source tree. Run it after adding, removing, or retiring pages in this Fumadocs app, and run `oat docs nav sync` as well so the sidebar's `meta.json` files follow the same change. The two commands produce different artifacts: `generate-index` writes the agent-facing inventory and `nav sync` writes the sidebar navigation.
50
50
 
51
51
  Fumadocs generated behavior:
52
52
 
@@ -54,6 +54,22 @@ Fumadocs generated behavior:
54
54
  - Reordering a `## Contents` block does not reorder the generated manifest's file-tree sort.
55
55
  - Generated manifests should carry an autogen warning and are rewritten by `predev` / `prebuild`.
56
56
 
57
+ ## Fumadocs Nav Sync
58
+
59
+ In a Fumadocs app (detected by its `source.config.ts`), `oat docs nav sync --target-dir <docs-app-dir>` writes one `meta.json` beside every docs directory `index.md`. The files are generated and committed; edit the `## Contents` map, not the `meta.json`.
60
+
61
+ Fumadocs generated behavior:
62
+
63
+ - `pages` follows the order of the directory's `## Contents` links. The root list starts with `index`; a child directory appears by its folder name, and its own `index.md` becomes that folder's landing page. A folder whose `meta.json` keeps `root: true` also lists `index` first, because Fumadocs gives a root folder no implicit landing page.
64
+ - Navigation is strict: there is no `"..."` rest entry. A page or folder that no `## Contents` map lists stays out of the sidebar, and the command reports it by path in its human output and in `--json` (`unlisted`). Add the page to its directory's `## Contents` map to show it.
65
+ - A `## Contents` link to a page in another directory is written as a Fumadocs link entry such as `[Writing Skills](/contributing/skills)`, so each page belongs to exactly one folder.
66
+ - The folder `title` comes from the `index.md` frontmatter `title`, falling back to its first `#` heading.
67
+ - Keys nav sync does not own, such as `icon` or `defaultOpen`, are kept.
68
+ - Existing files are compared by meaning, not bytes, so a second run with no docs changes writes nothing, even after a formatter rewrites the files.
69
+ - `.md` and `.mdx` pages can both be listed; each appears in `pages` by its file name without the extension.
70
+
71
+ `oat docs nav sync --check` computes the same result and writes nothing. It exits 1 when a `meta.json` file would change or a page or folder is unlisted, and names each one. In this app, `prebuild` runs it, so `pnpm build:docs` fails until the `## Contents` maps and the committed `meta.json` files agree.
72
+
57
73
  ## MkDocs Nav Sync
58
74
 
59
75
  MkDocs apps use `oat docs nav sync --target-dir <docs-app-dir>` to walk the docs tree from `docs/index.md` downward and regenerate the `nav:` block in `mkdocs.yml` from discovered directory `index.md` files.
@@ -69,7 +85,7 @@ MkDocs generated behavior:
69
85
 
70
86
  - Edit authored files under `docs/`, especially the nearest `index.md` and `## Contents`.
71
87
  - Do not hand-edit a Fumadocs app-root generated `index.md`; regenerate it from the docs source tree.
72
- - Do not hand-maintain MkDocs `nav:` entries when the local workflow uses `oat docs nav sync`.
88
+ - Do not hand-maintain MkDocs `nav:` entries or Fumadocs `meta.json` `pages` lists when the local workflow uses `oat docs nav sync`.
73
89
  - If a Fumadocs generated manifest lists pages that are missing from authored `## Contents`, treat that as authored-source drift or intentional generator-inventory behavior to verify before relying on the generated file as navigation evidence.
74
90
 
75
91
  ## Authoring guidance
@@ -77,7 +93,7 @@ MkDocs generated behavior:
77
93
  - Use `index.md` as the local discovery surface for humans and agents.
78
94
  - Add a short topic description next to each link so agents can choose the right file without opening every page.
79
95
  - Update `## Contents` whenever you add, remove, rename, or reorder docs files in a directory.
80
- - Regenerate the framework-specific artifact after structural changes: `generate-index` for Fumadocs root manifests, `nav sync` for MkDocs `mkdocs.yml`.
96
+ - Regenerate the framework-specific artifacts after structural changes: `nav sync` for MkDocs `mkdocs.yml` and Fumadocs `meta.json` navigation, plus `generate-index` for Fumadocs root manifests.
81
97
  - Refresh or freshness-check the generated artifact before committing structural docs changes.
82
98
 
83
99
  ## If You Are Trying To...
@@ -38,7 +38,12 @@ columns are ordinary states.
38
38
 
39
39
  Project-scope templates under `.oat/templates/` are owner overrides that OAT
40
40
  seeds once and never rewrites; the managed default lives at user scope and in
41
- the bundle. PJM templates resolve repository → user → bundle.
41
+ the bundle. Project lifecycle and PJM templates resolve repository → user →
42
+ bundle. Run `oat template resolve <name>` to see which tier supplies one, or
43
+ add `--output <path>` to copy it. Idea templates under `ideas/` are different:
44
+ the ideas skills select `.oat/templates/ideas/` or `~/.oat/templates/ideas/` by
45
+ the ideas scope, and `oat template resolve` does not search nested
46
+ directories.
42
47
 
43
48
  Pack intent is stored per scope:
44
49
 
@@ -172,7 +177,7 @@ Archive sync surfaces:
172
177
  - `packages/cli/src/commands/docs/init/` — scaffold a docs app (Fumadocs or MkDocs)
173
178
  - `packages/cli/src/commands/docs/migrate/` — convert MkDocs admonitions to GFM callouts
174
179
  - `packages/cli/src/commands/docs/index-generate/` — generate a docs index from markdown files
175
- - `packages/cli/src/commands/docs/nav/` — regenerate mkdocs.yml nav from index.md sections
180
+ - `packages/cli/src/commands/docs/nav/` — regenerate mkdocs.yml nav or Fumadocs meta.json from index.md sections
176
181
  - `packages/cli/src/commands/instructions/`
177
182
  - `packages/cli/src/commands/project/`
178
183
  - `packages/cli/src/commands/internal/`
@@ -13,7 +13,7 @@ Contributor how-to material now lives under `contributing/`, and user-facing rou
13
13
 
14
14
  - [CLI Reference](cli-reference.md) - Shallow map of the OAT command surface with links to owning sections.
15
15
  - [File Locations](file-locations.md) - Where core OAT files, assets, and artifacts live.
16
- - [Docs Index Contract](docs-index-contract.md) - Authored `index.md` maps, `.md` links, generated Fumadocs manifests, and MkDocs nav sync boundaries.
16
+ - [Docs Index Contract](docs-index-contract.md) - Authored `index.md` maps, `.md` links, generated Fumadocs manifests, and MkDocs and Fumadocs nav sync boundaries.
17
17
  - [OAT Directory Structure](oat-directory-structure.md) - Canonical `.oat/` tree map and the role of each major directory.
18
18
  - [Troubleshooting](troubleshooting.md) - Common issues, diagnostics, and remediation guidance.
19
19
 
@@ -0,0 +1,10 @@
1
+ {
2
+ "title": "Reference",
3
+ "pages": [
4
+ "cli-reference",
5
+ "file-locations",
6
+ "docs-index-contract",
7
+ "oat-directory-structure",
8
+ "troubleshooting"
9
+ ]
10
+ }
@@ -97,6 +97,27 @@ Use [Instruction Sync](../provider-sync/instruction-sync.md) for the full strate
97
97
  - Per-pack install commands no longer accept the previously inert `--force`
98
98
  option.
99
99
 
100
+ ## A skill fails with `unknown command 'template'` or `'closeout-check'`
101
+
102
+ Lifecycle skills from OAT 0.3.11 copy their templates with
103
+ `oat template resolve` and check closeout with `oat project closeout-check`.
104
+ An older `oat` on `PATH` rejects both:
105
+
106
+ ```text
107
+ error: unknown command 'template'
108
+ error: unknown command 'closeout-check'
109
+ ```
110
+
111
+ `oat-project-complete` treats a failed closeout check as an incomplete
112
+ closeout, so with an older CLI it stops and routes back to
113
+ `oat-project-implement` even when every closeout step is done. This happens
114
+ when the skills a host loads are newer than the CLI, for example repository
115
+ skills from a newer checkout run against an older global CLI.
116
+
117
+ Check `oat --version`. Install `@open-agent-toolkit/cli` 0.3.11 or later, then
118
+ refresh the installed skills to that CLI's bundle with
119
+ `oat tools update --all`.
120
+
100
121
  ## `sync` reports an unsafe provider parent
101
122
 
102
123
  Errors containing `Unsafe provider parent`, `symbolic links are not allowed in
@@ -200,7 +221,13 @@ OAT could not read the canonical managed-pack inventory. `oat status` keeps the
200
221
  rest of the report available and returns `packs.availability.status` as
201
222
  `unavailable` in JSON, with an empty `packs.states` array and a structured
202
223
  diagnostic. `oat doctor` emits the same condition as a warning instead of
203
- stopping its other checks. Reported project and home paths remain redacted.
224
+ stopping its other checks.
225
+
226
+ The diagnostic message redacts only the roots that are part of the run: the
227
+ project root becomes a relative path (or `.`) when project scope is checked,
228
+ and the home root becomes `~` when user scope is checked. Redaction is a literal
229
+ replacement of those exact root paths, so a path outside them, such as a global
230
+ bundle path in an assets error, stays absolute in the message.
204
231
 
205
232
  Rebuild the CLI workspace, then rerun the command named in the diagnostic:
206
233
 
@@ -269,16 +296,24 @@ oat pjm init
269
296
  scaffold — rerun `oat pjm init`), or `none`. `oat pjm init` records
270
297
  `pjm.initialized` in `.oat/config.json` after verifying the canonical scaffold.
271
298
 
272
- ## A PJM template change is not taking effect
299
+ ## A template change is not taking effect
300
+
301
+ Project lifecycle and PJM templates resolve repository → user → bundle, first
302
+ match wins (idea templates follow the ideas scope instead). A repository
303
+ template under `.oat/templates/` is an owner override that pack updates never
304
+ rewrite, so it shadows the managed user default. Check which tier supplies a
305
+ template:
273
306
 
274
- PJM templates resolve repository → user → bundle, first match wins. A
275
- repository template under `.oat/templates/` is an owner override that pack
276
- updates never rewrite, so it shadows the managed user default.
307
+ ```bash
308
+ oat template resolve plan
309
+ ```
277
310
 
278
311
  Delete the repository copy to fall back to the managed default, or update the
279
- managed default itself:
312
+ managed default itself (`workflows` owns the project lifecycle templates,
313
+ `project-management` the PJM templates):
280
314
 
281
315
  ```bash
316
+ oat tools update --pack workflows --scope user
282
317
  oat tools update --pack project-management --scope user
283
318
  ```
284
319
 
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "Ideas Workflow",
3
+ "pages": ["lifecycle"]
4
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "title": "Agentic Workflows",
3
+ "pages": ["ideas", "projects", "wave-workflows", "skills"]
4
+ }
@@ -95,9 +95,14 @@ dispatch records, prompts, logs, or the VM image.
95
95
  ## User-scope asset precedence
96
96
 
97
97
  In provisioned cloud environments, the user-scope installation is the execution
98
- source for every OAT asset class: skills, templates, and scripts. The user tier
99
- is refreshed from the published package during environment setup; repository
100
- copies are compatibility context, not an override.
98
+ source for skills and scripts. The user tier is refreshed from the published
99
+ package during environment setup; repository copies of skills and scripts are
100
+ compatibility context, not an override.
101
+
102
+ Templates are the exception. They resolve repository, then user, then bundled,
103
+ the same order as everywhere else, because a repository template is an owner
104
+ override. Agents resolve and copy them with `oat template resolve <name>
105
+ --output <destination>` rather than reading `~/.oat/templates/` directly.
101
106
 
102
107
  For skills, compare frontmatter versions as a freshness check:
103
108
 
@@ -85,13 +85,15 @@ Run the same command without `--dry-run` to replace bundled cells. Use
85
85
  `--shared` or `--local` instead when that scope owns the ladder. Add
86
86
  `--keep-existing` to fill only missing cells and preserve existing choices.
87
87
 
88
- Version `2026-09-25.1` is the current bundled recommendation. It prefers
89
- GPT-6 Luna and Sol in Codex, then Sol xhigh, Astra high, and Astra xhigh in
88
+ Version `2026-10-01.1` is the current bundled recommendation. It prefers
89
+ GPT-6 Luna and GPT-6.1 Sol in Codex, then Sol 6.1 xhigh, Astra high, and Astra xhigh in
90
90
  Codex Frontier. Astra's task advantage has not been measured locally; this is
91
91
  an explicit user-directed preference, not acceptance by the separately
92
- maintained model-selection policy. Opus 5.5 low/medium/high remains in Claude High.
92
+ maintained model-selection policy. Sonnet 5.5 medium replaces Sonnet 5 medium
93
+ in Claude Economy; the older generation stays supported for explicit cells.
94
+ Opus 5.5 low/medium/high remains in Claude High.
93
95
  The Claude low option suits bounded intelligent recon in Balanced or High;
94
- medium remains the implementation starting point under High. GPT-5.6 targets remain
96
+ medium remains the implementation starting point under High. GPT-6 Sol and GPT-5.6 targets remain
95
97
  supported for explicit Codex and Cursor configurations. Cursor's preferred
96
98
  ladder interleaves verified GPT-5.6 and Opus 5.5 mappings: Balanced adds
97
99
  Opus 5.5 low above Terra high, High orders Sol medium, Opus low, Sol high,
@@ -249,19 +251,23 @@ oat_dispatch_policy:
249
251
  The bundled ladder is a curated subset of the supported targets:
250
252
 
251
253
  - **Codex:** GPT-6 Luna at `low` through `max` across Economy and Balanced;
252
- GPT-6 Sol at `low` through `high` in High and `xhigh` in Frontier; then
254
+ GPT-6.1 Sol at `low` through `high` in High and `xhigh` in Frontier; then
253
255
  GPT-6 Astra at `high` and `xhigh` in Frontier. Astra and Sol remain supported
254
- at `low`, `medium`, `high`, `xhigh`, and `max`, while GPT-5.6 variants remain
256
+ at `low`, `medium`, `high`, `xhigh`, and `max`, while GPT-6 Sol and GPT-5.6 variants remain
255
257
  available outside this preferred ladder.
256
- - **Claude:** `haiku` and Sonnet 5 at Economy/Balanced, Opus 5.5 at High and
257
- Frontier, and Fable 5.1 at Frontier.
258
+ - **Claude:** `haiku` and Sonnet 5.5 medium at Economy; Opus 5.5 low at
259
+ Balanced, low/medium/high at High, and xhigh/max at Frontier; Fable 5.1
260
+ high ends Frontier. Sonnet 5 remains supported for explicit configurations.
258
261
  - **Cursor:** the preferred ladder uses approved Composer 2.5, GPT-5.6, Grok
259
262
  4.6, Opus 5.5, and Fable 5.1 targets. The catalogue maps each flat ladder ID
260
- to its separately verified bracket-form frontmatter model. Grok 4.6 (`low`
263
+ to its separately verified frontmatter model. Sonnet 5.5 exact-ID pins
264
+ remain supported outside the ladder; existing families keep their bracket
265
+ selectors. Grok 4.6 (`low`
261
266
  through `xhigh`) and Fable 5.1 (`low` through `max`, thinking variants) were
262
267
  approved from a 2026-09-25 [native desktop probe](../../contributing/verifying-cursor-pins.md);
263
268
  targets outside the ladder remain available for explicit selection. Grok
264
- 4.7 has no approved mapping because it ignores bracket selectors.
269
+ 4.7 stays outside the shipped catalogue pending its own approved mapping
270
+ and per-pin evidence; exact-ID support does not admit arbitrary CLI IDs.
265
271
 
266
272
  The final candidate in a named tier defines that tier's reviewer ceiling. Lower
267
273
  reviewer selection requires a separate reviewed contract; a normal reviewer
@@ -363,9 +369,9 @@ branch replaces, rather than supplements, preferred selection.
363
369
 
364
370
  An effort-pinned Claude candidate must establish the exact generation and that
365
371
  generation's supported effort. Current directly recognized generations include
366
- `claude-fable-5-1`, `claude-fable-5`, `claude-opus-5-5`, `claude-sonnet-5`,
372
+ `claude-fable-5-1`, `claude-fable-5`, `claude-opus-5-5`, `claude-sonnet-5-5`, `claude-sonnet-5`,
367
373
  `claude-opus-4-7`, `claude-opus-4-6`, and `claude-sonnet-4-6`.
368
- Opus 5.5 supports `low`, `medium`, `high`, `xhigh`, and `max`; consult the
374
+ Opus 5.5 and Sonnet 5.5 support `low`, `medium`, `high`, `xhigh`, and `max`; consult the
369
375
  [updating guide](../../contributing/updating-model-guidance.md) before adding
370
376
  further generations or rungs. Retired Opus 5.0 and 4.8 are no longer directly
371
377
  recognized for effort-pinned dispatch.
@@ -413,8 +419,9 @@ Cursor selection, pin mapping, catalogue availability, and runtime identity are
413
419
  separate evidence layers:
414
420
 
415
421
  - The candidate ladder and resolver use an opaque flat ID.
416
- - The materialized definition uses the mapping's explicit bracket-form
417
- frontmatter model.
422
+ - The materialized definition uses the mapping's explicit frontmatter model,
423
+ either a verified bracket selector or a separately verified exact ID.
424
+ Sonnet 5.5 uses exact IDs; existing families keep their bracket mappings.
418
425
  - Mapping-specific native-launch evidence authorizes the shipped mapping data.
419
426
  An approved mapping may carry a probe record whose `submittedSelector` must
420
427
  equal the mapping's `frontmatterModel` and whose `resolvedModel` must equal
@@ -77,14 +77,12 @@ section.
77
77
 
78
78
  For project-aware work, the calling workflow records each launch in its run
79
79
  record in `implementation.md` (request ID, `Dispatch:` stamp, launch status,
80
- terminal outcome). Persisting one generic record per request under the
81
- project's `dispatch/` directory with `oat project dispatch record` is optional
82
- and off by default; no lifecycle skill or command consumes those files. Managed
83
- effort-pinned Claude launches still pass the real resolver result, generated
84
- definition, and proposed payload through the command without `--project`
85
- before launch. That validation-only call derives the configured invocation and
86
- does not persist a journal file. When a host opts in, the generic snake-case
87
- fields remain authoritative. A namespaced `oat` block adds
80
+ terminal outcome); that run record is the only launch record.
81
+ `oat project dispatch record` validates a generic record and writes nothing.
82
+ Managed effort-pinned Claude launches pass the real resolver result, generated
83
+ definition, and proposed payload through it before launch, and that
84
+ validation-only call derives the configured invocation. In a validated record
85
+ the generic snake-case fields remain authoritative. A namespaced `oat` block adds
88
86
  only canonical-role identity, proven pre-start rejection, fallback linkage,
89
87
  and optional runtime observation. `oat project dispatch canonical-role`
90
88
  prints the canonical-role-resolution event read-only, so callers do not
@@ -76,10 +76,10 @@ that scope.
76
76
  Before a native launch, the root constructs and redacts the complete generic
77
77
  dispatch record and OAT role event. When the host returns, it writes the
78
78
  request ID, the `Dispatch:` stamp, and the accepted or `blocked-before-start`
79
- result into the run record in `implementation.md`; persisting a per-dispatch
80
- file with `oat project dispatch record` is optional and off by default. Before
81
- an effort-pinned managed Claude launch, the root must still run that command
82
- without `--project` as a validation-only boundary. It supplies the real
79
+ result into the run record in `implementation.md`, the only launch record.
80
+ Before an effort-pinned managed Claude launch, the root must run
81
+ `oat project dispatch record`, which writes nothing, as a validation-only
82
+ boundary. It supplies the real
83
83
  resolver result, generated definition, and proposed launch payload, and launches
84
84
  only the payload returned by the accepted envelope. An accepted launch closes
85
85
  replacement. Only an explicit rejection proving no child started permits one
@@ -319,6 +319,32 @@ and start a new gate generation. Beyond the version's own exclusion set, no
319
319
  implementation or closeout output path is excluded from the comparison. Legacy unqualified fingerprints retain the older
320
320
  fail-closed descendant-path behavior and are not migrated in place.
321
321
 
322
+ There is no automatic test-only freshness exception. An operator can instead
323
+ waive named stale-making descendants of an `effective-delta-v1` or
324
+ `effective-delta-v2` generation (`DR-260927-operator-waiver-for-test-only`).
325
+ Each waiver is appended to `oat_implement_exit_gate.waivers` with who waived,
326
+ the reason, the covered `from_commit..to_commit` range, the effective-delta
327
+ fingerprint at the range end (in the generation's own version), and a UTC
328
+ timestamp. A waiver never rewrites `reviewed_head`, the implementation
329
+ fingerprint, `freshness_head`, or the freshness fingerprint, and an earlier
330
+ waiver is never edited. Agents write a waiver only on an explicit operator
331
+ instruction. Under `OAT_AUTONOMOUS=1` an attempted waiver write is refused,
332
+ and a run that finds a stale generation persists `stale` and starts a new gate
333
+ run instead of pausing. A waived generation stays fresh only while nothing
334
+ substantive lands after the covered range, under both versions; a malformed or
335
+ unverifiable waiver fails closed as stale. The project summary and the final PR
336
+ description's Verification section list every waiver.
337
+
338
+ The waiver is offered where staleness is found. Before an interactive
339
+ `oat-project-implement` run persists an allowed generation as `stale` because
340
+ of descendant commits no waiver covers, it lists those commits and asks the
341
+ operator to waive that range or start a new gate run; it persists `stale` only
342
+ when the operator declines. An autonomous run never offers a waiver and starts
343
+ a new gate run. An operator may also record a waiver before resuming
344
+ implementation, for example after `oat-project-next` reports stale state, by
345
+ giving the range, name, and reason in the instruction that resumes
346
+ `oat-project-implement`.
347
+
322
348
  This narrow merge-only exemption relies on fresh repository CI, automated
323
349
  review such as Bugbot, and lifecycle self-review to cover integration risk.
324
350
  Those checks do not substitute for the semantic gate on the full
@@ -389,8 +415,11 @@ Provider controls remain exact: Codex uses
389
415
  `providers.claude.dispatchArgs.variant` for an effort-pinned target and
390
416
  `providers.claude.dispatchArgs.model` only for a legacy model-only target; and
391
417
  Cursor uses `providers.cursor.dispatchArgs.variant`. Cursor launches that exact
392
- resolver-selected native agent type first; the flat ID and bracket-form pin
418
+ resolver-selected native agent type first; the flat ID and frontmatter pin
393
419
  remain inside the explicit mapping and are never normalized by workflow prose.
420
+ A mapping may retain a verified bracket-form selector or use a separately
421
+ verified exact ID, as Sonnet 5.5 does. Exact IDs require an approved mapping
422
+ and native probe evidence; catalog presence alone never enables pass-through.
394
423
  The launcher records this selection as `configured`, while runtime identity
395
424
  remains `not-reported` without independent observation. Only a pre-start native
396
425
  role-selection rejection permits another target-preserving route.
@@ -65,6 +65,12 @@ allowed and fresh disposition before pre-approval work starts. A
65
65
  not inferred from missing state, and a null, missing, or unrecognized resolver
66
66
  result fails closed as unresolved instead.
67
67
 
68
+ A later substantive change makes an allowed result stale, test-only changes
69
+ included. Only an operator can keep it fresh, by recording an append-only
70
+ exit-gate waiver for the exact commits; agents never issue one. An autonomous
71
+ run that finds a stale result persists `stale` and starts a new gate run; it
72
+ refuses only an attempted waiver write. The summary and PR description list every waiver.
73
+
68
74
  After implementation closeout finishes:
69
75
 
70
76
  1. **Summary** (`oat-project-summary`) — generates `summary.md` as institutional memory from project artifacts; PR-final and completion will auto-refresh it if you have not already run it or if it is stale
@@ -75,7 +81,7 @@ After implementation closeout finishes:
75
81
  - GitHub PR feedback delegates to `oat-project-review-receive-remote`
76
82
  - Review artifacts delegate to `oat-project-review-receive`
77
83
  - After revision tasks complete, state returns to `pr_open`
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
84
+ 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. Before any completion write it runs the read-only `oat project closeout-check`: a configured, autonomous, or lite closeout whose `oat_post_implement_sequence` snapshot is missing, malformed, or incomplete stops and routes back to `oat-project-implement`, and `oat project complete-state` refuses the same state. There is no override; see the [CLI reference](../../reference/cli-reference.md).
79
85
 
80
86
  ### Project-recap gate (non-lite)
81
87
 
@@ -0,0 +1,25 @@
1
+ {
2
+ "title": "Workflow & Projects",
3
+ "pages": [
4
+ "lifecycle",
5
+ "retro",
6
+ "autonomy",
7
+ "cursor-cloud",
8
+ "design-modes",
9
+ "hill-checkpoints",
10
+ "dispatch-ceiling",
11
+ "orchestration-model",
12
+ "review-flavors",
13
+ "evidence-layers",
14
+ "programmatic-execution",
15
+ "artifacts",
16
+ "implementation-execution",
17
+ "reviewing-oat-prs",
18
+ "picking-up-projects",
19
+ "splitting",
20
+ "state-machine",
21
+ "reviews",
22
+ "pr-flow",
23
+ "repo-analysis"
24
+ ]
25
+ }
@@ -76,14 +76,14 @@ sequenceDiagram
76
76
  participant Root as Project root
77
77
  participant Adapter as Project adapter
78
78
  participant Engine as Dispatch engine
79
- participant Journal as Project dispatch journal
79
+ participant Record as Run record in implementation.md
80
80
  participant Phase as Phase implementer
81
81
 
82
82
  Root->>Adapter: Phase + lifecycle authority
83
83
  Adapter->>Engine: Provider-neutral dispatch request
84
84
  Engine-->>Root: Exact route + request ID
85
85
  Root->>Phase: Phase Scope
86
- Root->>Journal: Accepted or blocked-before-start record
86
+ Root->>Record: Accepted or blocked-before-start result
87
87
  Phase-->>Root: Phase report + commits
88
88
  ```
89
89
 
@@ -125,10 +125,9 @@ launch.
125
125
  The launcher constructs and redacts the complete generic record plus the
126
126
  namespaced OAT role event before it calls the native host. When the host
127
127
  returns, the calling workflow writes the accepted or `blocked-before-start`
128
- state into its run record in `implementation.md`. Persisting a per-dispatch
129
- file with `oat project dispatch record` is optional and off by default; the
130
- command is a recorder only and never launches a provider or changes selection
131
- authority.
128
+ state into its run record in `implementation.md`, the only launch record.
129
+ `oat project dispatch record` validates a record and writes nothing; it never
130
+ launches a provider or changes selection authority.
132
131
 
133
132
  An accepted handle owns the scope and closes replacement. One fresh fallback
134
133
  record is legal only when the native wrapper proves no child started, links the
@@ -0,0 +1,10 @@
1
+ {
2
+ "title": "Skills",
3
+ "pages": [
4
+ "[Writing Skills](/contributing/skills)",
5
+ "[Docs Workflows](/docs-tooling/workflows)",
6
+ "explainer-kit",
7
+ "repo-improve",
8
+ "recon"
9
+ ]
10
+ }
@@ -275,6 +275,12 @@ them. Adversarial reviewers receive the declared scope, questions, and
275
275
  provisional statements. Neither pass receives gatherer reasoning, synthesis
276
276
  prose, dossier paths, or earlier review conclusions.
277
277
 
278
+ Review briefs come only from the production brief generator. The packet
279
+ validator rebuilds every brief from the prior claim ledger and manifest with
280
+ that same generator and rejects any difference with `REVIEW_BRIEF_MISMATCH`, so
281
+ a brief carrying an injected claim, note, or source fails publication. A
282
+ review's dispositions must also be unique members of its brief's claims.
283
+
278
284
  Each lane receives one explicit authority envelope and one unique output path.
279
285
  Its enforcement is recorded as:
280
286
 
@@ -293,8 +299,17 @@ operation.
293
299
  A structurally valid run can publish an honest `partial` packet. The manifest
294
300
  and `packet.md` then identify the requested and achieved profiles, failed or
295
301
  omitted passes, material gaps, affected claims, and required assurance
296
- downgrades. A run may be partial even when it achieved the requested profile if
297
- a material evidence gap remains. The achieved profile is derived from the
302
+ downgrades. Every claim a review kept below `verified` (an unresolved issue
303
+ scoped to it or global to its review, a coverage finding that names it, or a
304
+ non-affirming disposition) is listed under Review Downgrades with the review's
305
+ own text, even when it is not a key claim, so a `complete` packet cannot hide a
306
+ downgraded claim. A claim that a required review left without a disposition stays
307
+ `unresolved` and is listed there as not reviewed. A review's
308
+ `unresolvedIssues` entry may name the claim IDs it affects or apply to the
309
+ whole review; a legacy plain-string entry is read as review-wide. A material
310
+ coverage gap does not fail publication by itself: the claims it affects stay
311
+ below `verified` and the run publishes as an honest `partial`. A run may be partial even when it achieved the requested
312
+ profile if a material evidence gap remains. The achieved profile is derived from the
298
313
  complete typed artifacts in the packet; each required pass without a complete
299
314
  result needs a material `PASS_FAILED` or `PASS_OMITTED` gap. Each approved lane
300
315
  must likewise have a complete artifact or a material outcome gap carrying its
@@ -310,7 +325,17 @@ honest `partial` packet at that achieved profile.
310
325
 
311
326
  Status updates and the final handoff label each failure as `worker`,
312
327
  `provider/dispatch`, `contract validation`, or `source availability`, and
313
- say whether every accepted lane reached a terminal result. Workers that
328
+ say whether every accepted lane reached a terminal result.
329
+
330
+ A launch the provider rejects before any child is accepted, such as a Codex
331
+ agent-limit rejection, is a `provider/dispatch` failure, never a worker
332
+ failure, and every accepted artifact is kept. The approved `retryLimit` counts
333
+ these pre-acceptance admission retries per lane, and the controller makes at
334
+ most one per lane, so the approval preview's worst case is two attempts per
335
+ lane. The default of 0 allows none. If admission still fails, recon uses an
336
+ alternate route only when it was already approved; otherwise it stops with a
337
+ partial run and asks for a continuation amendment. An accepted lane is never
338
+ rerun to free capacity. Workers that
314
339
  completed are never reported as failed because the controller could not
315
340
  publish.
316
341
 
@@ -1,6 +1,6 @@
1
1
  {
2
- "cli": "0.3.9",
3
- "docs-config": "0.3.9",
4
- "docs-theme": "0.3.9",
5
- "docs-transforms": "0.3.9"
2
+ "cli": "0.3.11",
3
+ "docs-config": "0.3.11",
4
+ "docs-theme": "0.3.11",
5
+ "docs-transforms": "0.3.11"
6
6
  }