@open-agent-toolkit/cli 0.2.40 → 0.2.45

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 (213) hide show
  1. package/assets/agents/oat-codebase-mapper.md +15 -3
  2. package/assets/agents/oat-phase-implementer.md +34 -9
  3. package/assets/agents/oat-reviewer.md +2 -2
  4. package/assets/bundle-metadata.json +1 -1
  5. package/assets/docs/cli-utilities/configuration.md +11 -1
  6. package/assets/docs/cli-utilities/tool-packs.md +8 -0
  7. package/assets/docs/contributing/skills.md +67 -14
  8. package/assets/docs/quickstart.md +9 -0
  9. package/assets/docs/reference/cli-reference.md +56 -1
  10. package/assets/docs/reference/file-locations.md +18 -1
  11. package/assets/docs/reference/oat-directory-structure.md +20 -4
  12. package/assets/docs/workflows/projects/artifacts.md +27 -1
  13. package/assets/docs/workflows/projects/implementation-execution.md +22 -0
  14. package/assets/docs/workflows/projects/index.md +6 -0
  15. package/assets/docs/workflows/projects/lifecycle.md +19 -5
  16. package/assets/docs/workflows/projects/picking-up-projects.md +75 -0
  17. package/assets/docs/workflows/projects/pr-flow.md +22 -1
  18. package/assets/docs/workflows/projects/reviewing-oat-prs.md +60 -0
  19. package/assets/public-package-versions.json +4 -4
  20. package/assets/skills/analyze/SKILL.md +13 -5
  21. package/assets/skills/compare/SKILL.md +11 -2
  22. package/assets/skills/oat-brainstorm/SKILL.md +135 -32
  23. package/assets/skills/oat-brainstorm/references/destinations.md +9 -6
  24. package/assets/skills/oat-cursor-cloud-projects/SKILL.md +11 -1
  25. package/assets/skills/oat-dispatch-subagents/SKILL.md +19 -6
  26. package/assets/skills/oat-doctor/SKILL.md +8 -1
  27. package/assets/skills/oat-project-autonomous/SKILL.md +45 -1
  28. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +8 -8
  29. package/assets/skills/oat-project-capture/SKILL.md +29 -9
  30. package/assets/skills/oat-project-complete/SKILL.md +610 -38
  31. package/assets/skills/oat-project-complete/scripts/parse-completion-retry-fields.mjs +265 -0
  32. package/assets/skills/oat-project-complete/scripts/recover-completion-receipts.mjs +764 -0
  33. package/assets/skills/oat-project-complete/scripts/resolve-completion-retry.mjs +134 -0
  34. package/assets/skills/oat-project-complete/scripts/validate-nonarchive-lifecycle-receipt.mjs +160 -0
  35. package/assets/skills/oat-project-design/SKILL.md +33 -9
  36. package/assets/skills/oat-project-discover/SKILL.md +16 -3
  37. package/assets/skills/oat-project-document/SKILL.md +10 -4
  38. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +8 -8
  39. package/assets/skills/oat-project-implement/SKILL.md +14 -3
  40. package/assets/skills/oat-project-implement/references/completion-and-closeout.md +18 -6
  41. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +8 -8
  42. package/assets/skills/oat-project-implement/references/phase-execution.md +9 -3
  43. package/assets/skills/oat-project-implement/references/plan-and-resume.md +3 -0
  44. package/assets/skills/oat-project-import-plan/SKILL.md +15 -9
  45. package/assets/skills/oat-project-new/SKILL.md +7 -5
  46. package/assets/skills/oat-project-next/SKILL.md +32 -10
  47. package/assets/skills/oat-project-plan/SKILL.md +18 -3
  48. package/assets/skills/oat-project-pr-final/SKILL.md +23 -2
  49. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +8 -8
  50. package/assets/skills/oat-project-pr-progress/SKILL.md +23 -2
  51. package/assets/skills/oat-project-progress/SKILL.md +23 -9
  52. package/assets/skills/oat-project-promote-spec-driven/SKILL.md +20 -2
  53. package/assets/skills/oat-project-quick-start/SKILL.md +48 -18
  54. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +8 -8
  55. package/assets/skills/oat-project-reconcile/SKILL.md +14 -10
  56. package/assets/skills/oat-project-retro/SKILL.md +3 -3
  57. package/assets/skills/oat-project-retro/references/apply-procedure.md +102 -6
  58. package/assets/skills/oat-project-retro-file/SKILL.md +57 -6
  59. package/assets/skills/oat-project-review-provide/SKILL.md +56 -6
  60. package/assets/skills/oat-project-review-receive/SKILL.md +16 -7
  61. package/assets/skills/oat-project-review-receive-remote/SKILL.md +9 -3
  62. package/assets/skills/oat-project-revise/SKILL.md +12 -3
  63. package/assets/skills/oat-project-spec/SKILL.md +16 -3
  64. package/assets/skills/oat-project-summary/SKILL.md +113 -13
  65. package/assets/skills/oat-repo-improve/SKILL.md +18 -7
  66. package/assets/skills/oat-review-provide-remote/SKILL.md +11 -2
  67. package/assets/skills/oat-wave-execute/SKILL.md +34 -2
  68. package/assets/skills/oat-worktree-bootstrap/SKILL.md +13 -1
  69. package/assets/skills/oat-worktree-bootstrap-auto/SKILL.md +13 -1
  70. package/dist/commands/config/index.d.ts +1 -0
  71. package/dist/commands/config/index.d.ts.map +1 -1
  72. package/dist/commands/config/index.js +30 -2
  73. package/dist/commands/doctor/index.d.ts +2 -0
  74. package/dist/commands/doctor/index.d.ts.map +1 -1
  75. package/dist/commands/doctor/index.js +27 -3
  76. package/dist/commands/doctor/synced-projects.d.ts +12 -0
  77. package/dist/commands/doctor/synced-projects.d.ts.map +1 -0
  78. package/dist/commands/doctor/synced-projects.js +208 -0
  79. package/dist/commands/init/gitattributes.d.ts +4 -0
  80. package/dist/commands/init/gitattributes.d.ts.map +1 -0
  81. package/dist/commands/init/gitattributes.js +12 -0
  82. package/dist/commands/init/gitignore.d.ts +8 -1
  83. package/dist/commands/init/gitignore.d.ts.map +1 -1
  84. package/dist/commands/init/gitignore.js +146 -41
  85. package/dist/commands/init/index.d.ts +2 -0
  86. package/dist/commands/init/index.d.ts.map +1 -1
  87. package/dist/commands/init/index.js +3 -0
  88. package/dist/commands/init/managed-block.d.ts +10 -0
  89. package/dist/commands/init/managed-block.d.ts.map +1 -0
  90. package/dist/commands/init/managed-block.js +40 -0
  91. package/dist/commands/init/tools/workflows/install-workflows.js +1 -1
  92. package/dist/commands/local/index.d.ts.map +1 -1
  93. package/dist/commands/local/index.js +5 -1
  94. package/dist/commands/local/sync.d.ts +4 -0
  95. package/dist/commands/local/sync.d.ts.map +1 -1
  96. package/dist/commands/local/sync.js +123 -2
  97. package/dist/commands/pjm/adoption.d.ts +2 -0
  98. package/dist/commands/pjm/adoption.d.ts.map +1 -1
  99. package/dist/commands/pjm/adoption.js +1 -1
  100. package/dist/commands/project/archive/archive-utils.d.ts +24 -0
  101. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  102. package/dist/commands/project/archive/archive-utils.js +349 -22
  103. package/dist/commands/project/archive/index.d.ts.map +1 -1
  104. package/dist/commands/project/archive/index.js +1 -0
  105. package/dist/commands/project/archive/push-runner.d.ts +5 -1
  106. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  107. package/dist/commands/project/archive/push-runner.js +33 -4
  108. package/dist/commands/project/complete-state/index.d.ts.map +1 -1
  109. package/dist/commands/project/complete-state/index.js +3 -1
  110. package/dist/commands/project/index.d.ts.map +1 -1
  111. package/dist/commands/project/index.js +12 -0
  112. package/dist/commands/project/links/compute.d.ts +9 -0
  113. package/dist/commands/project/links/compute.d.ts.map +1 -0
  114. package/dist/commands/project/links/compute.js +27 -0
  115. package/dist/commands/project/links/index.d.ts +17 -0
  116. package/dist/commands/project/links/index.d.ts.map +1 -0
  117. package/dist/commands/project/links/index.js +72 -0
  118. package/dist/commands/project/links/refresh.d.ts +26 -0
  119. package/dist/commands/project/links/refresh.d.ts.map +1 -0
  120. package/dist/commands/project/links/refresh.js +92 -0
  121. package/dist/commands/project/links/render.d.ts +24 -0
  122. package/dist/commands/project/links/render.d.ts.map +1 -0
  123. package/dist/commands/project/links/render.js +68 -0
  124. package/dist/commands/project/list.d.ts +5 -0
  125. package/dist/commands/project/list.d.ts.map +1 -1
  126. package/dist/commands/project/list.js +182 -9
  127. package/dist/commands/project/migrate/index.d.ts +22 -0
  128. package/dist/commands/project/migrate/index.d.ts.map +1 -0
  129. package/dist/commands/project/migrate/index.js +79 -0
  130. package/dist/commands/project/new/index.d.ts +2 -0
  131. package/dist/commands/project/new/index.d.ts.map +1 -1
  132. package/dist/commands/project/new/index.js +14 -2
  133. package/dist/commands/project/new/scaffold.d.ts +22 -1
  134. package/dist/commands/project/new/scaffold.d.ts.map +1 -1
  135. package/dist/commands/project/new/scaffold.js +287 -69
  136. package/dist/commands/project/open/index.d.ts +16 -0
  137. package/dist/commands/project/open/index.d.ts.map +1 -1
  138. package/dist/commands/project/open/index.js +151 -19
  139. package/dist/commands/project/pause/index.d.ts +8 -0
  140. package/dist/commands/project/pause/index.d.ts.map +1 -1
  141. package/dist/commands/project/pause/index.js +129 -19
  142. package/dist/commands/project/prune/index.d.ts +21 -0
  143. package/dist/commands/project/prune/index.d.ts.map +1 -0
  144. package/dist/commands/project/prune/index.js +95 -0
  145. package/dist/commands/project/pull/index.d.ts +28 -0
  146. package/dist/commands/project/pull/index.d.ts.map +1 -0
  147. package/dist/commands/project/pull/index.js +157 -0
  148. package/dist/commands/project/push/index.d.ts +22 -0
  149. package/dist/commands/project/push/index.d.ts.map +1 -0
  150. package/dist/commands/project/push/index.js +100 -0
  151. package/dist/commands/project/scope/index.d.ts +17 -0
  152. package/dist/commands/project/scope/index.d.ts.map +1 -0
  153. package/dist/commands/project/scope/index.js +107 -0
  154. package/dist/commands/project/split/run.d.ts +4 -0
  155. package/dist/commands/project/split/run.d.ts.map +1 -1
  156. package/dist/commands/project/split/run.js +48 -10
  157. package/dist/commands/project/sync/git.d.ts +18 -0
  158. package/dist/commands/project/sync/git.d.ts.map +1 -0
  159. package/dist/commands/project/sync/git.js +60 -0
  160. package/dist/commands/project/sync/record.d.ts +22 -0
  161. package/dist/commands/project/sync/record.d.ts.map +1 -0
  162. package/dist/commands/project/sync/record.js +133 -0
  163. package/dist/commands/project/sync/ref-sync.d.ts +120 -0
  164. package/dist/commands/project/sync/ref-sync.d.ts.map +1 -0
  165. package/dist/commands/project/sync/ref-sync.js +962 -0
  166. package/dist/commands/project/sync/resolve-target.d.ts +27 -0
  167. package/dist/commands/project/sync/resolve-target.d.ts.map +1 -0
  168. package/dist/commands/project/sync/resolve-target.js +159 -0
  169. package/dist/commands/shared/oat-paths.d.ts +4 -1
  170. package/dist/commands/shared/oat-paths.d.ts.map +1 -1
  171. package/dist/commands/shared/oat-paths.js +2 -2
  172. package/dist/commands/shared/project-scope.d.ts +23 -0
  173. package/dist/commands/shared/project-scope.d.ts.map +1 -0
  174. package/dist/commands/shared/project-scope.js +106 -0
  175. package/dist/commands/tools/migrate/index.js +1 -1
  176. package/dist/commands/tools/shared/pack-inventory.d.ts.map +1 -1
  177. package/dist/commands/tools/shared/pack-inventory.js +11 -0
  178. package/dist/commands/tools/shared/pack-lifecycle.js +1 -1
  179. package/dist/commands/tools/shared/pack-reconcile.d.ts.map +1 -1
  180. package/dist/commands/tools/shared/pack-reconcile.js +4 -1
  181. package/dist/commands/tools/update/index.d.ts.map +1 -1
  182. package/dist/commands/tools/update/index.js +20 -10
  183. package/dist/commands/tools/update/update-tools.d.ts +2 -0
  184. package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
  185. package/dist/config/oat-config.d.ts +6 -3
  186. package/dist/config/oat-config.d.ts.map +1 -1
  187. package/dist/config/oat-config.js +41 -7
  188. package/dist/config/resolve.d.ts.map +1 -1
  189. package/dist/config/resolve.js +2 -1
  190. package/dist/fs/io.d.ts +2 -1
  191. package/dist/fs/io.d.ts.map +1 -1
  192. package/dist/fs/io.js +5 -2
  193. package/dist/projects/split/finalize.d.ts.map +1 -1
  194. package/dist/projects/split/finalize.js +55 -2
  195. package/dist/projects/split/resume.d.ts +3 -0
  196. package/dist/projects/split/resume.d.ts.map +1 -1
  197. package/dist/projects/split/resume.js +34 -7
  198. package/dist/projects/split/seed-children.d.ts.map +1 -1
  199. package/dist/projects/split/seed-children.js +6 -0
  200. package/dist/projects/split/write-parent.d.ts +7 -0
  201. package/dist/projects/split/write-parent.d.ts.map +1 -1
  202. package/dist/projects/split/write-parent.js +7 -4
  203. package/dist/release/public-package-contract.d.ts.map +1 -1
  204. package/dist/release/public-package-contract.js +1 -0
  205. package/dist/validation/skills.d.ts.map +1 -1
  206. package/dist/validation/skills.js +434 -0
  207. package/package.json +4 -4
  208. package/dist/__tests__/skills/split-flow-fixtures.d.ts +0 -50
  209. package/dist/__tests__/skills/split-flow-fixtures.d.ts.map +0 -1
  210. package/dist/__tests__/skills/split-flow-fixtures.js +0 -161
  211. package/dist/commands/__tests__/helpers.d.ts +0 -12
  212. package/dist/commands/__tests__/helpers.d.ts.map +0 -1
  213. package/dist/commands/__tests__/helpers.js +0 -36
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-codebase-mapper
3
- version: 1.0.0
3
+ version: 1.0.1
4
4
  description: Explores codebase and writes structured analysis documents. Spawned by oat-repo-knowledge-index with a focus area (tech, arch, quality, concerns). Writes documents directly to reduce orchestrator context load.
5
5
  tools: Read, Bash, Grep, Glob, Write
6
6
  color: cyan
@@ -221,7 +221,19 @@ oat_warning: 'GENERATED FILE - Do not edit manually. Regenerate with oat-repo-kn
221
221
  3. If something is not found, use "Not detected" or "Not applicable"
222
222
  4. Always include file paths with backticks
223
223
 
224
- Use templates from `.agents/skills/oat-repo-knowledge-index/references/templates/`.
224
+ This agent is materialized into provider-specific views, so no portable
225
+ loaded-agent root exists. Resolve the template owner from installed scope
226
+ instead: independently probe each required `<name>/SKILL.md` in order,
227
+ `${HOME}/.agents/skills` then `<repo-root>/.agents/skills`. Bind the first
228
+ match for `oat-repo-knowledge-index` to its own
229
+ `${KNOWLEDGE_INDEX_SKILLS_ROOT}`; never ambient discovery. On a miss, name the
230
+ skill, stop before writing any document instead of inventing a format, and give
231
+ its intended-scope recovery command:
232
+ `oat tools install workflows --scope <user|project>` or
233
+ `oat tools update --pack workflows --scope <user|project>`.
234
+
235
+ Use templates from
236
+ `${KNOWLEDGE_INDEX_SKILLS_ROOT}/oat-repo-knowledge-index/references/templates/`.
225
237
 
226
238
  Use the Write tool to create each document.
227
239
 
@@ -254,7 +266,7 @@ Ready for orchestrator summary.
254
266
 
255
267
  **NO RECOMMENDATIONS.** No “recommended setup” or “consider using X” in knowledge docs. Capture gaps as current-state issues in `concerns.md` only.
256
268
 
257
- **USE THE TEMPLATES.** Fill in the template structure from `.agents/skills/oat-repo-knowledge-index/references/templates/`. Don't invent your own format.
269
+ **USE THE TEMPLATES.** Fill in the template structure from `${KNOWLEDGE_INDEX_SKILLS_ROOT}/oat-repo-knowledge-index/references/templates/`. Don't invent your own format.
258
270
 
259
271
  **INCLUDE FRONTMATTER.** Every generated document must have frontmatter with oat_generated: true and both SHA fields.
260
272
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-phase-implementer
3
- version: 1.0.11
3
+ version: 1.1.1
4
4
  description: Implements one plan phase end-to-end, commits each task separately, self-checks between tasks, and handles bounded review fixes when resumed by oat-project-implement.
5
5
  tools: Read, Write, Edit, Bash, Grep, Glob, Task
6
6
  color: cyan
@@ -70,16 +70,31 @@ task.
70
70
 
71
71
  Nested dispatch is optional and justified only by a clear benefit such as
72
72
  read-only reconnaissance, independent analysis lanes, safely isolated fanout,
73
- or genuinely specialized implementation. Before any optional child launch,
74
- read and follow:
75
-
76
- 1. `.agents/skills/oat-project-dispatch-subagents/SKILL.md`;
77
- 2. `.agents/skills/oat-dispatch-subagents/SKILL.md`; and
78
- 3. `.agents/skills/subagent-orchestration/references/model-selection-principles.md`;
73
+ or genuinely specialized implementation.
74
+
75
+ This agent is materialized into provider-specific views, so no portable
76
+ loaded-agent root exists. Resolve every required sibling skill from installed
77
+ scope instead: independently probe each required `<name>/SKILL.md` in order,
78
+ `${HOME}/.agents/skills` then `<repo-root>/.agents/skills`. Bind each first
79
+ match to its own root: `${PROJECT_DISPATCH_SKILLS_ROOT}` for
80
+ `oat-project-dispatch-subagents`, `${DISPATCH_SKILLS_ROOT}` for
81
+ `oat-dispatch-subagents`, and `${ORCHESTRATION_SKILLS_ROOT}` for
82
+ `subagent-orchestration`; never ambient discovery. On a miss, name the skill,
83
+ stop the optional launch and implement the task directly, and give its
84
+ intended-scope recovery command:
85
+
86
+ - `oat-project-dispatch-subagents`: `oat tools install workflows --scope <user|project>` or `oat tools update --pack workflows --scope <user|project>`.
87
+ - `oat-dispatch-subagents` or `subagent-orchestration`: `oat tools install utility --scope <user|project>` or `oat tools update --pack utility --scope <user|project>`.
88
+
89
+ Before any optional child launch, read and follow:
90
+
91
+ 1. `${PROJECT_DISPATCH_SKILLS_ROOT}/oat-project-dispatch-subagents/SKILL.md`;
92
+ 2. `${DISPATCH_SKILLS_ROOT}/oat-dispatch-subagents/SKILL.md`; and
93
+ 3. `${ORCHESTRATION_SKILLS_ROOT}/subagent-orchestration/references/model-selection-principles.md`;
79
94
  4. read exactly one active-provider selection reference from
80
- `.agents/skills/subagent-orchestration/references/`; and
95
+ `${ORCHESTRATION_SKILLS_ROOT}/subagent-orchestration/references/`; and
81
96
  5. read the matching mechanics reference from
82
- `.agents/skills/oat-dispatch-subagents/references/`.
97
+ `${DISPATCH_SKILLS_ROOT}/oat-dispatch-subagents/references/`.
83
98
 
84
99
  Every optional launch must have a bounded objective, explicit read/write
85
100
  authority, exact target at or below the phase ceiling, verification/output
@@ -116,6 +131,16 @@ After formatting, run the repository's applicable gate set over the produced
116
131
  diff, explicitly including artifact writes. This supplements rather than
117
132
  replaces every task and phase verification command below.
118
133
 
134
+ ## Synced-Scope Bookkeeping
135
+
136
+ Artifact and recovery-ledger bookkeeping commits must first resolve scope with
137
+ `oat project scope "$PROJECT_PATH" --format value`. A `synced` project uses
138
+ `oat project push` with the original bookkeeping message; other scopes keep the
139
+ existing scoped `git add` and `git commit` commands. Scope resolution fails
140
+ closed. A nonzero project-push exit stops bookkeeping until the reported
141
+ recovery is resolved and the push is retried. Planned code task commits such as
142
+ `feat(pNN-tNN)` are unchanged.
143
+
119
144
  ## Prevention and Post-Commit Recovery
120
145
 
121
146
  Prevention is the first recovery control. Before every planned task commit:
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-reviewer
3
- version: 1.2.0
3
+ version: 1.2.1
4
4
  description: Unified reviewer for OAT projects - mode-aware verification of requirements/design alignment and code quality. Writes a review artifact to disk by default, or returns structured findings in-memory when dispatched in structured-output mode.
5
5
  tools: Read, Bash, Grep, Glob, Write, Task
6
6
  color: yellow
@@ -81,7 +81,7 @@ The primary reviewer must establish the authoritative scope before considering d
81
81
  When delegation is eligible:
82
82
 
83
83
  1. Use one bounded, read-only, non-recursive reconnaissance round with disjoint lane scopes. This is a one-level fan-out limit: lane workers must not spawn additional workers.
84
- 2. Before launching any lane, read `.agents/skills/oat-dispatch-subagents/SKILL.md` and `.agents/skills/subagent-orchestration/references/model-selection-principles.md`. Resolve the active provider, then read exactly one matching selection reference under `.agents/skills/subagent-orchestration/references/` and one matching mechanics reference under `.agents/skills/oat-dispatch-subagents/references/`. Reviewer-local reconnaissance must not read or load `.agents/skills/oat-project-dispatch-subagents/SKILL.md`; that adapter is reserved for project lifecycle phase/task policy.
84
+ 2. Before launching any lane, resolve the required sibling skills from installed scope: this agent is materialized into provider-specific views, so no portable loaded-agent root exists. Independently probe each required `<name>/SKILL.md` in order, `${HOME}/.agents/skills` then `<repo-root>/.agents/skills`, and bind each first match to its own root: `${DISPATCH_SKILLS_ROOT}` for `oat-dispatch-subagents` and `${ORCHESTRATION_SKILLS_ROOT}` for `subagent-orchestration`; never ambient discovery. On a miss, name the skill, stop the reconnaissance launch and review inline, and give its intended-scope recovery command: `oat tools install utility --scope <user|project>` or `oat tools update --pack utility --scope <user|project>`. Then read `${DISPATCH_SKILLS_ROOT}/oat-dispatch-subagents/SKILL.md` and `${ORCHESTRATION_SKILLS_ROOT}/subagent-orchestration/references/model-selection-principles.md`. Resolve the active provider, then read exactly one matching selection reference under `${ORCHESTRATION_SKILLS_ROOT}/subagent-orchestration/references/` and one matching mechanics reference under `${DISPATCH_SKILLS_ROOT}/oat-dispatch-subagents/references/`. Reviewer-local reconnaissance must not read or load the `oat-project-dispatch-subagents` adapter; that adapter is reserved for project lifecycle phase/task policy.
85
85
  3. Map every lane worker to the shared `recon` role class (`role.class: recon`); role authority stays read-only and advisory. Assign the independent `task_class`, `classification_source: caller`, and non-empty `classification_reason` fields after understanding the artifacts and diff. These task-class fields are required for reviewer-local reconnaissance even though the generic dispatch contract keeps them optional for other callers.
86
86
  4. Classify each lane as `mechanical-recon`, `intelligent-recon`, `default-implementation`, `hard-reasoning`, or `consequential`. Use the stronger floor when uncertain. Classification proceeds from deterministic verification to silent-miss risk, then dispersed context, ambiguity, and consequence; file count alone never justifies escalation.
87
87
  - `mechanical-recon`: deterministic inventories, parity checks, and test/lint/format/build execution whose misses are visible and cheaply checked.
@@ -1,4 +1,4 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "oatVersion": "0.2.40"
3
+ "oatVersion": "0.2.45"
4
4
  }
@@ -76,7 +76,17 @@ Earlier CLI versions returned `config.json` / `config.local.json` / `env` / `def
76
76
 
77
77
  Common keys in `.oat/config.json`:
78
78
 
79
- - `projects.root` — where tracked projects live
79
+ - `projects.root` — shared-scope project root. Relative values resolve from the
80
+ repository root; absolute values remain absolute. OAT derives the `local`
81
+ and `synced` roots as sibling directories named `local` and `synced` under
82
+ this root's parent, so a custom value relocates all three scope roots as one
83
+ layout. Synced project creation requires the derived `synced` root to resolve
84
+ inside the repository; an external absolute root remains usable for `shared`
85
+ and `local` projects but is rejected before any synced checkout, ref, record,
86
+ active pointer, or Git index mutation.
87
+ - `projects.defaultScope` — scope used by project creation when `--scope` is
88
+ omitted (`synced` by default). `OAT_PROJECTS_DEFAULT_SCOPE` overrides the
89
+ configured value for the current process.
80
90
  - `worktrees.root` — where OAT-managed worktrees live
81
91
  - `git.defaultBranch` — base branch fallback for PR workflows
82
92
  - `documentation.root`, `documentation.tooling`, `documentation.config` — docs-surface ownership
@@ -84,6 +84,14 @@ Lifecycle skills resolve each required sibling independently from the loaded
84
84
  scope, then user scope, then project scope. This makes mixed-scope placement a
85
85
  supported execution path rather than relying on one frozen skills root.
86
86
 
87
+ Materialized **agents** from any pack that ships them (`workflows` here,
88
+ `research` elsewhere) use a two-step order instead — user scope, then project
89
+ scope — because no provider exposes a stable loaded-agent source directory to
90
+ derive a loaded scope from. They still bind each dependency independently and
91
+ still fail closed with the owning pack's install or update command. See
92
+ [Writing Skills → Portable sibling reads](../contributing/skills.md#portable-sibling-reads-skills-and-agents)
93
+ for the full contract.
94
+
87
95
  The packs remain independently installable. If the workflows adapter is
88
96
  present without the utility contracts, it fails closed and reports the missing
89
97
  dependency instead of inventing a fallback route. Non-project analytical
@@ -24,32 +24,85 @@ Skill behavior is defined by frontmatter plus the process contract in each `SKIL
24
24
  - Define a pre-work capability and authorization gate for skills that delegate to subagents, workers, or reviewers.
25
25
  - Keep output obligations explicit so downstream skills and users know what changed.
26
26
 
27
- ## Portable sibling-skill reads
27
+ ## Portable sibling reads (skills and agents)
28
28
 
29
- Executable instructions must not assume the skill is running from a repository
30
- checkout. Before a skill or one of its operational reference files reads a
31
- sibling `SKILL.md`, resolve a `${SKILLS_ROOT}` in this order:
29
+ Executable instructions must not assume the asset is running from a repository
30
+ checkout. The rule is not skill-specific: it applies to every Markdown asset
31
+ shipped by a pack whose `defaultScope` is `user`, which today means both
32
+ canonical skills under `.agents/skills` and canonical agents under
33
+ `.agents/agents`. The scanned surface is derived from `PACK_MANIFEST` rather
34
+ than a hand-maintained list, so adding a skill or agent to a user-default pack
35
+ puts it under the contract automatically.
36
+
37
+ The contract covers a cross-asset read of a sibling `SKILL.md` and of any file
38
+ or directory at or below a sibling's `references/`.
39
+
40
+ ### Loaded skills resolve in three steps
41
+
42
+ Before a skill or one of its operational reference files reads a sibling,
43
+ resolve a `${SKILLS_ROOT}` in this order:
32
44
 
33
45
  1. Derive `${SKILL_DIR}/..` from the directory containing the currently loaded
34
46
  `SKILL.md`, when the provider exposes that path.
35
47
  2. Try the user-scope root at `${HOME}/.agents/skills`.
36
48
  3. Fall back to the project-scope root at `<repo-root>/.agents/skills`.
37
49
 
38
- Probe each candidate for `<sibling>/SKILL.md` and use the first match. If none
50
+ Probe each candidate for the exact target and use the first match. If none
39
51
  exists, name the missing sibling, give an actionable install or update command,
40
52
  and stop that workflow branch instead of improvising the sibling's process.
41
53
 
42
- When a caller needs multiple sibling skills, resolve and bind each sibling
43
- independently. Do not freeze one `${SKILLS_ROOT}` and assume every dependency is
44
- installed there: a workflows adapter may be at project scope while its utility
45
- contracts are at user scope. A missing-sibling recovery must name the owning
46
- pack and intended scope, using `oat tools install <pack> --scope <user|project>`
47
- or `oat tools update --pack <pack> --scope <user|project>` as appropriate.
54
+ ### Materialized agents resolve in two steps
55
+
56
+ Canonical agents are materialized into provider-specific views — Codex receives
57
+ agent content as developer instructions, while Claude and Cursor use distinct
58
+ provider directories. No stable loaded-agent source path exists across those
59
+ providers, so an agent must not invent a `${SKILL_DIR}`-style loaded-agent
60
+ candidate. Agents resolve installed scope only:
61
+
62
+ 1. Try the user-scope root at `${HOME}/.agents/skills`.
63
+ 2. Fall back to the project-scope root at `<repo-root>/.agents/skills`.
64
+
65
+ User scope comes first because the packs that own these dependencies default
66
+ there; project scope remains a real fallback for project installations.
67
+
68
+ ### Bind every dependency independently
69
+
70
+ When a caller needs multiple siblings, resolve and bind each one to its own
71
+ root variable. Do not freeze a single `${SKILLS_ROOT}` and assume every
72
+ dependency is installed there: a workflows adapter may be at project scope
73
+ while its utility contracts are at user scope. Validate the exact target file
74
+ before acting on it, and never substitute ambient discovery for a bound root.
75
+
76
+ Follow-on reads inside an already-bound sibling root — for example a second
77
+ reference file under a root that an earlier read established and validated —
78
+ are local reads rather than new cross-asset reads. They are only acceptable
79
+ when the anchoring read comes first.
80
+
81
+ ### Fail closed with pack-specific recovery
82
+
83
+ A missing-sibling recovery must name the missing target, its owning pack, and
84
+ the intended scope, using `oat tools install <pack> --scope <user|project>` or
85
+ `oat tools update --pack <pack> --scope <user|project>` as appropriate. Do not
86
+ degrade to a partially guided path, and do not continue past the missing
87
+ dependency.
88
+
89
+ ### The ratchet allows only exact historical baselines
48
90
 
49
91
  Do not use a bare `.agents/skills/<sibling>/SKILL.md`, `./.agents/...`, or
50
- `../.agents/...` path for an executable read. Historical examples may retain
51
- those spellings only when they are non-executable and explicitly baselined by
52
- the bundled-docs contract test.
92
+ `../.agents/...` path for an executable read in any user-default skill or
93
+ agent. The bundled-docs contract test enforces this over the whole
94
+ manifest-derived surface and reports each violation as exact
95
+ `source -> target` evidence.
96
+
97
+ The only exemption is a pinned historical baseline: non-executable evidence
98
+ such as a dogfood transcript or a fixture README, recorded by exact source
99
+ file, target skill, and target path. There is no wildcard, directory-wide, or
100
+ skill-wide allowance, and no temporary migration allowlist — executable debt is
101
+ fixed at the caller instead of being exempted. The same assertions run against
102
+ the bundled CLI copies of both skills and agents, and the sync contract test
103
+ re-checks the roles it materializes for Codex, so a canonical fix must survive
104
+ bundling and Codex sync as well. No test yet gates the generated `.claude` or
105
+ `.cursor` agent views, so regenerate and spot-check those by hand.
53
106
 
54
107
  ## Contract components
55
108
 
@@ -9,6 +9,15 @@ Use this page to choose the OAT path that matches what you are actually trying t
9
9
 
10
10
  This page is intentionally lightweight. It is not the full command manual. Once you choose a path, continue into the owning section for the deeper operational detail.
11
11
 
12
+ ## Prerequisites
13
+
14
+ - Node.js 22.17 or newer
15
+ - Git 2.31 or newer
16
+
17
+ OAT does not run an up-front Git version check. Git compatibility is evaluated
18
+ best-effort by each command, and a missing or unsupported Git operation exits as
19
+ a system error.
20
+
12
21
  ## Choose a Path
13
22
 
14
23
  ### Provider Sync
@@ -56,6 +56,61 @@ 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
61
+ `projects.defaultScope`, which defaults to `synced`. Project slugs are
62
+ unique across all scopes by default, including recorded or remotely
63
+ published synced projects. `--force` deliberately permits a duplicate; use
64
+ an explicit project path with `project open` or `project pause` whenever a
65
+ slug is ambiguous across scopes.
66
+ - `oat project scope [project] --format value|json` - resolve a project's
67
+ storage scope without inspecting its path manually.
68
+ - `oat project push [project] [--message <message>]` - commit pending synced
69
+ artifacts, reconcile with the exact project ref on `origin`, publish it, and
70
+ refresh an open PR's artifact-links block. Use `--no-refresh-pr` to skip the
71
+ PR edit. With `--json`, success returns `status` (`pushed` or `up-to-date`),
72
+ the full project-ref `sha`, the retained `ref`, and optional `prRefresh`;
73
+ conflict and rejected outcomes return their corresponding `status` and exit
74
+ nonzero.
75
+ - `oat project pull [project] [--no-commit]` - fetch and materialize or update a synced
76
+ checkout. Resolve a rebase conflict and run `pull --continue`, or use
77
+ `pull --abort` to return to the pre-pull state. Coordination children are
78
+ pulled by default; `--no-children` limits the operation to the selected
79
+ project. When pull adopts a remote project with no local discovery record,
80
+ `--no-commit` leaves the new record uncommitted for the caller to persist.
81
+ With `--json`, the receipt includes `status`, `sha`, and `ref`, plus
82
+ `conflicts` when applicable and per-child results when coordination children
83
+ were requested.
84
+ - `oat project links [project] --format markdown|json` - render SHA-pinned
85
+ links for the linkable artifacts on the project ref. On GitHub origins the
86
+ artifacts become full-SHA blob links; other hosts degrade to the retained ref
87
+ and short SHA without guessing a web URL. `--durable-summary <path>` accepts
88
+ only a path contained in the repository, normalizes it repository-relative,
89
+ and renders it as a code span rather than a guessed remote link.
90
+ - `oat project pause [project]` - persist the pause state and clear the active
91
+ project pointer. If synced publication is declined or fails after the pause
92
+ commit is created, that clean commit is retained; address the publication
93
+ failure and rerun `pause` to publish it.
94
+ - `oat project prune [project] [--force] [--no-commit]` - remove every
95
+ checkout, the local and remote project refs, and the tracked record. When the
96
+ project is omitted, the active project is used. This is the explicit
97
+ destructive operation; `--force` may discard dirty or unpushed artifacts,
98
+ while `--no-commit` leaves the parent-record deletion for a library caller to
99
+ commit. If remote deletion succeeds but local checkout removal fails, the
100
+ local ref, record, and checkouts are retained. Resolve the reported local
101
+ obstruction and retry `prune --force`; do not run `project push`, which would
102
+ republish the deleted remote ref.
103
+ - `oat project migrate <path> --to synced [--no-commit]` - migrate an existing
104
+ shared project to synced storage while preserving its artifacts and
105
+ retargeting the active project pointer. `--no-commit` leaves the parent
106
+ record and source-tree transition uncommitted for a library caller.
107
+ - `oat project list --scope shared|local|synced` - filter tracked projects by
108
+ scope. Add `--remote` to discover project refs that do not yet have a local
109
+ record or checkout, and `--include-coordination` to include coordination
110
+ parents. A malformed discovery record with no materialized checkout appears
111
+ as a `recorded-invalid` row. When the checkout is materialized, its existing
112
+ row instead carries the restore hint and `recordError` parse diagnostic in
113
+ `--json` output.
59
114
  - `oat tools migrate --pack <pack> --from <scope> --to <scope>` - move one installed pack between project and user scope. Always previews first, installs and re-inventories the destination before touching the source, and offers source removal only after the destination is verified complete. Declining or running non-interactively leaves the pack installed at both scopes rather than failing. `--dry-run` stops after the preview; there is no force flag. See [Tool Packs](../cli-utilities/tool-packs.md#oat-tools-migrate).
60
115
  - `oat pjm doctor --json` - read-only repository PJM diagnostics whose result carries an additive `adoption` object (`state` of `declared` | `inferred-legacy` | `partial-initialization` | `none`, `repoRoot`, and `recovery`). This, not `oat tools has project-management`, is the check that answers whether _this repository_ adopted PJM.
61
116
  - `oat config dump --json` - merged config with source attribution
@@ -66,7 +121,7 @@ Notable commands introduced in the current CLI surface:
66
121
  - `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`.
67
122
  - `oat project list --json` - summary state for tracked projects under the configured projects root
68
123
  - `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
69
- - `oat project archive [project-path] [--project-recap-run <project-relative-path>]` - archive a tracked project through the same local move, summary export, and optional 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.
124
+ - `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 optional 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. `--no-commit` is a manual/library-only option: for a synced project it still removes the checkout but deliberately omits the lifecycle commit receipt. Never pass it through `oat-project-complete`, which requires that receipt.
70
125
  - `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.
71
126
  - `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).
72
127
  - `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).
@@ -52,6 +52,8 @@ Pack intent is stored per scope:
52
52
  - Local runtime config (per-developer state): `.oat/config.local.json`
53
53
  - Active idea: `activeIdea` in `.oat/config.local.json` (repo) or `~/.oat/config.json` (user)
54
54
  - Projects root config: `projects.root` in `.oat/config.json` (read via `oat config get projects.root`)
55
+ - Default project scope: `projects.defaultScope` in `.oat/config.json`
56
+ (`synced` by default; override with `OAT_PROJECTS_DEFAULT_SCOPE`)
55
57
  - Archive config: `archive.s3Uri`, `archive.s3SyncOnComplete`, `archive.summaryExportPath`, `archive.wrapUpExportPath`, `archive.awsProfile`, and `archive.awsRegion` in `.oat/config.json`
56
58
  - Workflow gate config: `workflow.gates.skills` and `workflow.gates.execTargets` in `.oat/config.json`, `.oat/config.local.json`, or `~/.oat/config.json` (manage via `oat gate`)
57
59
  - Project sync manifest/config: `.oat/sync/`
@@ -87,16 +89,31 @@ Config ownership note:
87
89
  ## Project artifact trees
88
90
 
89
91
  - Shared: `.oat/projects/shared/<project>/`
92
+ - Synced checkout: `.oat/projects/synced/<project>/` (gitignored nested
93
+ worktree)
94
+ - Synced record: `.oat/projects/synced/<project>.json` (tracked on the parent
95
+ branch)
96
+ - Synced ref: `refs/oat/projects/<project>` on `origin`
90
97
  - Local: `.oat/projects/local/<project>/`
91
98
  - Archived: `.oat/projects/archived/<project>/`
92
99
 
100
+ The OAT-managed block in the repository root `.gitattributes` marks shared
101
+ project artifacts as generated for repository hosting UIs. `oat init` and
102
+ `oat tools update` own that block; preserve non-OAT entries outside its markers
103
+ and do not hand-edit the managed entry.
104
+
93
105
  Archive sync surfaces:
94
106
 
95
107
  - Local archive root: `.oat/projects/archived/`
96
108
  - Remote archive base: `archive.s3Uri` in `.oat/config.json`
97
109
  - Archive sync command: `oat repo archive sync` or `oat repo archive sync <project-name>`
98
110
  - Remote archive snapshot shape: `<archive.s3Uri>/<repo-slug>/projects/YYYYMMDD-<project-name>/`
99
- - Summary export target: `<repo>/<archive.summaryExportPath>/YYYYMMDD-<project-name>.md` when configured
111
+ - Summary export target:
112
+ `<repo>/<archive.summaryExportPath>/YYYYMMDD-<project-name>.md` when
113
+ configured. The archive report returns this absolute filesystem path, while
114
+ `oat project links --durable-summary` normalizes a contained path to a
115
+ repository-relative code span. It does not invent a GitHub-style URL for
116
+ non-GitHub remotes.
100
117
  - Wrap-up export target: `<repo>/<archive.wrapUpExportPath>/YYYY-MM-DD-wrap-up-<label>.md` when configured; otherwise `oat-wrap-up` falls back to `<repo>/.oat/repo/reference/wrap-ups/`
101
118
 
102
119
  ## Ideas — project level (gitignored)
@@ -24,6 +24,9 @@ Project scope is used for project workflows and repo-local sync state. User scop
24
24
  config.local.json
25
25
  projects/
26
26
  shared/
27
+ synced/
28
+ <project>.json
29
+ <project>/
27
30
  local/
28
31
  archived/
29
32
  ideas/
@@ -47,7 +50,7 @@ Project scope is used for project workflows and repo-local sync state. User scop
47
50
  | `.oat/config.json` | Shared repo runtime config for non-sync settings | Includes `worktrees.root`, `projects.root`, `git.defaultBranch`, `archive.*`, and `documentation.*` |
48
51
  | `.oat/config.local.json` | Local per-developer runtime state | Gitignored; includes `activeProject`, `lastPausedProject`, `activeIdea` |
49
52
  | `.oat/state.md` | Generated repo state dashboard | Gitignored; rebuilt with `oat state refresh` from config, project artifacts, and knowledge metadata |
50
- | `.oat/projects/` | OAT project artifacts | `shared`, `local`, `archived` scopes |
53
+ | `.oat/projects/` | OAT project artifacts | `shared`, `synced`, `local`, and lifecycle `archived` locations |
51
54
  | `.oat/ideas/` | Project-level ideas store | Often gitignored |
52
55
  | `.oat/sync/` | Interop sync state/config | See details below |
53
56
  | `.oat/templates/` | Artifact templates used by OAT skills | Source for scaffolding. Includes `docs-app-fuma/` (Fumadocs) and `docs-app-mkdocs/` (MkDocs) templates. |
@@ -105,6 +108,7 @@ Current schema keys:
105
108
  | `version` | `number` | `1` | Schema version |
106
109
  | `worktrees.root` | `string` | `".worktrees"` | Root directory for git worktrees (repo-relative or absolute) |
107
110
  | `projects.root` | `string` | `".oat/projects/shared"` | Default root directory for OAT projects |
111
+ | `projects.defaultScope` | `string` | `"synced"` | Scope used by project creation when `--scope` is omitted: `shared`, `local`, or `synced`. Environment override: `OAT_PROJECTS_DEFAULT_SCOPE`. |
108
112
  | `localPaths` | `string[]` | - | Gitignored directories to sync between main repo and worktrees. Supports glob patterns. Managed via `oat local add/remove`. |
109
113
  | `documentation.root` | `string` | - | Root directory containing documentation source files (e.g., `apps/docs/docs`) |
110
114
  | `documentation.tooling` | `string` | - | Documentation framework identifier (`mkdocs` or `fumadocs`) |
@@ -139,7 +143,8 @@ Example:
139
143
  {
140
144
  "version": 1,
141
145
  "projects": {
142
- "root": ".oat/projects/shared"
146
+ "root": ".oat/projects/shared",
147
+ "defaultScope": "synced"
143
148
  },
144
149
  "worktrees": {
145
150
  "root": ".worktrees"
@@ -173,12 +178,23 @@ For repo-relative values (levels 3-4), paths are resolved from the repository ro
173
178
  Each OAT project lives under:
174
179
 
175
180
  - `.oat/projects/shared/<project>/`
181
+ - `.oat/projects/synced/<project>/` for a gitignored nested worktree whose
182
+ history is published to `refs/oat/projects/<project>`
183
+ - `.oat/projects/synced/<project>.json` for the tracked discovery record that
184
+ identifies the ref, remote, and active or complete status
176
185
  - `.oat/projects/local/<project>/`
177
186
  - `.oat/projects/archived/<project>/`
178
187
 
179
- Archive sync behavior:
188
+ Completion and archive sync behavior:
180
189
 
181
- - `oat-project-complete` always archives locally into `.oat/projects/archived/<project>/`.
190
+ - When archiving is selected, `oat-project-complete` archives locally into
191
+ `.oat/projects/archived/<project>/`. For a synced project, the snapshot omits
192
+ the nested checkout's `.git` pointer and `reviews/`, then completion marks
193
+ the tracked record complete, removes the nested worktree, and retains the
194
+ project ref so pinned links keep resolving.
195
+ - When archiving is disabled or declined, completion leaves the synced
196
+ checkout and ref in place, pushes the finalized artifacts, and exact-path
197
+ commits the tracked record as complete.
182
198
  - If `archive.s3SyncOnComplete=true` and `archive.s3Uri` is configured, completion also uploads a dated snapshot such as `<archive.s3Uri>/<repo-slug>/projects/20260401-<project>/`.
183
199
  - `oat repo archive sync` syncs all repo archived projects down from S3 into `.oat/projects/archived/`.
184
200
  - `oat repo archive sync <project-name>` syncs the latest dated remote snapshot for a single project into `.oat/projects/archived/<project-name>/`.
@@ -5,7 +5,33 @@ description: 'Project artifact contracts: state.md, spec.md, design.md, plan.md,
5
5
 
6
6
  # Project Artifacts
7
7
 
8
- Project artifacts live under `.oat/projects/<scope>/<project>/`.
8
+ Project artifacts use one of three active scopes:
9
+
10
+ - `shared` artifacts live directly on the feature branch under
11
+ `.oat/projects/shared/<project>/`.
12
+ - `synced` artifacts live in a gitignored nested worktree at
13
+ `.oat/projects/synced/<project>/`, backed by
14
+ `refs/oat/projects/<project>` on `origin`. The feature branch tracks only
15
+ `.oat/projects/synced/<project>.json`.
16
+ - `local` artifacts stay untracked on the current machine under
17
+ `.oat/projects/local/<project>/`.
18
+
19
+ `projects.defaultScope` controls creation when a command does not pass
20
+ `--scope`; its default is `synced`.
21
+
22
+ ## Synced artifact bookkeeping
23
+
24
+ Lifecycle skills write the same project files in every scope. After a synced
25
+ write, they use `oat project push` instead of staging the artifact path on the
26
+ parent branch. The command makes an artifact commit in the nested checkout,
27
+ rebases it on the fetched project ref, and pushes only that ref. Arrival skills
28
+ run `oat project pull` before reading artifacts so a record or remote ref can
29
+ materialize the checkout first.
30
+
31
+ The tracked JSON record is routing metadata, not a copy of the project. It
32
+ identifies the slug, `origin`, ref, status, and archive snapshot when present.
33
+ The project ref remains the source of truth for active artifact content and
34
+ history.
9
35
 
10
36
  ## Core artifacts
11
37
 
@@ -406,6 +406,28 @@ For a plan-declared parallel group, the root:
406
406
  Containment, ownership, base, or fixture-readiness failure in smoke mode aborts
407
407
  the run. It never authorizes replacement or sequential degradation.
408
408
 
409
+ ## Synced projects in worktrees
410
+
411
+ A tracked `.oat/projects/synced/<project>.json` record lets every repository
412
+ worktree discover the same synced project without putting its artifacts on the
413
+ feature branch. On arrival, project skills run `oat project pull` before they
414
+ read state. Pull fetches the exact `refs/oat/projects/<project>` ref and, when
415
+ needed, materializes a fresh nested checkout at
416
+ `.oat/projects/synced/<project>/`.
417
+
418
+ Each parent worktree gets an independent detached nested checkout. Those
419
+ checkouts do not share an index or working tree; they reconcile artifact
420
+ history through the project ref on `origin`. If a pull or push encounters an
421
+ overlapping change, resolve the files in the nested checkout and run
422
+ `oat project pull --continue`. Use `oat project pull --abort` to restore the
423
+ pre-pull state instead.
424
+
425
+ `oat local sync` skips these nested repositories, so local-path hydration does
426
+ not copy or overwrite synced artifact checkouts. Removing a parent worktree
427
+ also needs no special nested-checkout cleanup: the ignored nested worktree does
428
+ not prevent parent removal, and the next `oat project pull` prunes stale Git
429
+ worktree registrations before materializing or updating the current checkout.
430
+
409
431
  ## Codex Depth
410
432
 
411
433
  Default execution needs the root-to-phase-agent depth. `agents.max_depth >= 2`
@@ -24,6 +24,8 @@ Projects are where the workflow layer becomes concrete: lifecycle phases, `state
24
24
  - [Programmatic Execution](programmatic-execution.md) - Per-harness headless/CLI execution surfaces and where OAT uses them.
25
25
  - [Project Artifacts](artifacts.md) - What lives in `state.md`, `discovery.md`, `plan.md`, `implementation.md`, and related files.
26
26
  - [Implementation Execution](implementation-execution.md) - Phase dispatch, runtime selection, review/fix loop, and dry-run behavior.
27
+ - [Reviewing OAT PRs](reviewing-oat-prs.md) - Read synced-project records and SHA-pinned reviewer links in a PR.
28
+ - [Picking Up Projects](picking-up-projects.md) - Continue a synced project on another machine or from another user.
27
29
  - [Project Splitting](splitting.md) - How broad discoveries or brainstorms become coordination parents and child projects.
28
30
  - [State Machine](state-machine.md) - Lifecycle and review status transitions across a project.
29
31
  - [Reviews](reviews.md) - How review request/receive loops work inside OAT projects.
@@ -50,6 +52,8 @@ This sub-section is the deep technical surface for how tracked OAT projects exec
50
52
  - Split broad scopes into coordination parents and focused children in [Project Splitting](splitting.md).
51
53
  - Understand lifecycle and review transitions in [State Machine](state-machine.md).
52
54
  - Learn review and PR expectations in [Reviews](reviews.md) and [PR Flow](pr-flow.md).
55
+ - Review a synced project's durable context in [Reviewing OAT PRs](reviewing-oat-prs.md).
56
+ - Continue remote project work with [Picking Up Projects](picking-up-projects.md).
53
57
 
54
58
  ## Go Deeper
55
59
 
@@ -68,4 +72,6 @@ This sub-section is the deep technical surface for how tracked OAT projects exec
68
72
  - [State Machine](state-machine.md) - Lifecycle and review status transitions across a project.
69
73
  - [Reviews](reviews.md) - How review request/receive loops work inside OAT projects.
70
74
  - [PR Flow](pr-flow.md) - Progress and final PR generation expectations.
75
+ - [Reviewing OAT PRs](reviewing-oat-prs.md) - Record metadata, pinned links, and editor discovery for synced projects.
76
+ - [Picking Up Projects](picking-up-projects.md) - Remote discovery, adopting pull, coordination children, and retention boundaries.
71
77
  - [Repository PR Comment Analysis](repo-analysis.md) - Repo-wide PR comment collection and triage workflows.
@@ -70,13 +70,23 @@ After implementation closeout finishes:
70
70
  - GitHub PR feedback delegates to `oat-project-review-receive-remote`
71
71
  - Review artifacts delegate to `oat-project-review-receive`
72
72
  - After revision tasks complete, state returns to `pr_open`
73
- 5. **Complete** (`oat-project-complete`) — accepts any phase status (`pr_open`, `complete`, `in_progress`), auto-refreshes `summary.md` before closeout when needed, and always archives the project locally
73
+ 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
74
74
 
75
75
  ### Completion archive behavior
76
76
 
77
- On completion, OAT now treats archive handling as part of the closeout lifecycle:
78
-
79
- - Local archive is always written to `.oat/projects/archived/<project>/`.
77
+ On completion, OAT treats archive handling as an explicit closeout choice:
78
+
79
+ - When archiving is selected, the local archive is written to `.oat/projects/archived/<project>/`.
80
+ - When archiving is disabled or declined, durable projects remain at their
81
+ active path. Synced completion still finalizes and pushes the project ref,
82
+ commits the discovery record as `complete`, retains the checkout and ref, and
83
+ attests a selected recap against the project-ref history.
84
+ - For a synced project, closeout first finalizes the project artifacts and
85
+ pushes them to `refs/oat/projects/<project>`. Archive then requires a clean,
86
+ fully pushed checkout; copies it without the `.git` pointer or `reviews/`;
87
+ marks the tracked record complete; commits the record and configured durable
88
+ exports on the parent branch; removes the nested checkout; and retains the
89
+ ref. This order keeps SHA-pinned PR links valid after completion.
80
90
  - If `.oat/config.json` enables `archive.s3SyncOnComplete` and sets `archive.s3Uri`, completion also attempts an S3 upload for a dated snapshot such as `<archive.s3Uri>/<repo-slug>/projects/20260401-<project>/`.
81
91
  - If `.oat/config.json` sets `archive.awsProfile` and/or `archive.awsRegion`, those values are forwarded to every `aws` invocation triggered by completion (preflight checks + `aws s3 sync`) and override any ambient shell `AWS_PROFILE` / `AWS_DEFAULT_PROFILE` / `AWS_REGION` / `AWS_DEFAULT_REGION` values. The repo's archive-scoped credentials are treated as deliberate intent so users don't have to unset shell env vars before running completion. See [`config-and-local-state.md`](../../cli-utilities/config-and-local-state.md) for the full precedence chain.
82
92
  - If `.oat/config.json` sets `archive.summaryExportPath`, completion copies `summary.md` to `<archive.summaryExportPath>/20260401-<project>.md`.
@@ -130,7 +140,7 @@ summary, documentation, PR, or project completion.
130
140
 
131
141
  ### Retrospective completion safety net
132
142
 
133
- Before an interactive completion archives the project,
143
+ Before an interactive completion closes the project,
134
144
  `oat-project-complete` checks for
135
145
  `{PROJECT_PATH}/references/project-retro.md`. If the artifact is missing, it
136
146
  offers to generate one before completion. If the artifact exists, completion
@@ -292,6 +302,10 @@ Capture lane progression:
292
302
  ## Operational rules
293
303
 
294
304
  - Keep `state.md`, `plan.md`, and `implementation.md` synchronized.
305
+ - For a synced project, publish lifecycle artifact writes with
306
+ `oat project push`; do not stage `.oat/projects/synced/<project>/` on the
307
+ parent branch.
308
+ - On arrival, run `oat project pull` before reading a synced project's state.
295
309
  - Stop at configured HiLL checkpoints.
296
310
  - Do not move lifecycle forward when required review gates are unresolved.
297
311
  - Project entry skills (`oat-project-new`, `oat-project-quick-start`, and `oat-project-import-plan`) surface inherited dirty git state before scaffolding. If the dirty list includes `.oat/sync/manifest.json`, `.claude/`, `.cursor/`, or `.codex/`, the skill calls out that those paths are typically sync output and offers Commit now, Proceed anyway, or Abort.