@open-agent-toolkit/cli 0.2.50 → 0.2.52

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 (263) hide show
  1. package/assets/bundle-metadata.json +1 -1
  2. package/assets/docs/cli-utilities/bootstrap.md +6 -2
  3. package/assets/docs/cli-utilities/tool-packs.md +87 -33
  4. package/assets/docs/provider-sync/commands.md +30 -2
  5. package/assets/docs/provider-sync/config.md +19 -0
  6. package/assets/docs/provider-sync/manifest-and-drift.md +37 -0
  7. package/assets/docs/provider-sync/providers.md +69 -2
  8. package/assets/docs/provider-sync/scope-and-surface.md +44 -0
  9. package/assets/docs/reference/cli-reference.md +21 -5
  10. package/assets/docs/reference/file-locations.md +8 -2
  11. package/assets/docs/reference/oat-directory-structure.md +25 -9
  12. package/assets/docs/workflows/projects/artifacts.md +9 -4
  13. package/assets/docs/workflows/projects/evidence-layers.md +110 -1
  14. package/assets/docs/workflows/projects/implementation-execution.md +13 -0
  15. package/assets/docs/workflows/projects/lifecycle.md +17 -5
  16. package/assets/docs/workflows/projects/orchestration-model.md +18 -0
  17. package/assets/docs/workflows/projects/picking-up-projects.md +26 -9
  18. package/assets/docs/workflows/projects/pr-flow.md +5 -3
  19. package/assets/docs/workflows/projects/reviewing-oat-prs.md +12 -8
  20. package/assets/public-package-versions.json +4 -4
  21. package/assets/skills/oat-dispatch-subagents/SKILL.md +57 -1
  22. package/assets/skills/oat-dispatch-subagents/references/record-schema.md +77 -1
  23. package/assets/skills/oat-project-autonomous/references/gate-inventory.md +3 -3
  24. package/assets/skills/oat-project-complete/SKILL.md +193 -26
  25. package/assets/skills/oat-project-complete/scripts/execute-synced-archive-entry.mjs +306 -0
  26. package/assets/skills/oat-project-complete/scripts/finalize-synced-archive.mjs +125 -0
  27. package/assets/skills/oat-project-complete/scripts/parse-synced-archive-resume-fields.mjs +106 -0
  28. package/assets/skills/oat-project-complete/scripts/recover-completion-receipts.mjs +110 -0
  29. package/assets/skills/oat-project-complete/scripts/resolve-synced-archive-entry.mjs +164 -0
  30. package/assets/skills/oat-project-dispatch-subagents/SKILL.md +24 -1
  31. package/assets/skills/oat-project-document/references/docs/autonomy-contract.md +3 -3
  32. package/assets/skills/oat-project-implement/references/dispatch-and-dry-run.md +11 -0
  33. package/assets/skills/oat-project-implement/references/docs/autonomy-contract.md +3 -3
  34. package/assets/skills/oat-project-plan-writing/SKILL.md +12 -1
  35. package/assets/skills/oat-project-pr-final/references/docs/autonomy-contract.md +3 -3
  36. package/assets/skills/oat-project-quick-start/references/docs/autonomy-contract.md +3 -3
  37. package/assets/skills/oat-project-review-provide/SKILL.md +12 -1
  38. package/assets/skills/oat-project-review-provide-remote/SKILL.md +12 -1
  39. package/dist/agents/canonical/index.d.ts +2 -0
  40. package/dist/agents/canonical/index.d.ts.map +1 -1
  41. package/dist/agents/canonical/index.js +1 -0
  42. package/dist/agents/canonical/resolve.d.ts +45 -0
  43. package/dist/agents/canonical/resolve.d.ts.map +1 -0
  44. package/dist/agents/canonical/resolve.js +175 -0
  45. package/dist/commands/decision/agents-guidance.d.ts +2 -2
  46. package/dist/commands/decision/agents-guidance.d.ts.map +1 -1
  47. package/dist/commands/decision/agents-guidance.js +1 -4
  48. package/dist/commands/decision/index.d.ts.map +1 -1
  49. package/dist/commands/decision/index.js +25 -6
  50. package/dist/commands/docs/init/index.d.ts +7 -1
  51. package/dist/commands/docs/init/index.d.ts.map +1 -1
  52. package/dist/commands/docs/init/index.js +53 -20
  53. package/dist/commands/doctor/index.d.ts +8 -2
  54. package/dist/commands/doctor/index.d.ts.map +1 -1
  55. package/dist/commands/doctor/index.js +157 -46
  56. package/dist/commands/init/index.d.ts +8 -3
  57. package/dist/commands/init/index.d.ts.map +1 -1
  58. package/dist/commands/init/index.js +64 -26
  59. package/dist/commands/init/tools/index.d.ts +12 -12
  60. package/dist/commands/init/tools/index.d.ts.map +1 -1
  61. package/dist/commands/init/tools/index.js +430 -99
  62. package/dist/commands/init/tools/install-state.d.ts +2 -0
  63. package/dist/commands/init/tools/install-state.d.ts.map +1 -1
  64. package/dist/commands/init/tools/install-state.js +11 -0
  65. package/dist/commands/init/tools/project-guidance.d.ts +49 -0
  66. package/dist/commands/init/tools/project-guidance.d.ts.map +1 -0
  67. package/dist/commands/init/tools/project-guidance.js +144 -0
  68. package/dist/commands/init/tools/workflows/index.d.ts +7 -0
  69. package/dist/commands/init/tools/workflows/index.d.ts.map +1 -1
  70. package/dist/commands/init/tools/workflows/index.js +160 -7
  71. package/dist/commands/pjm/index.d.ts.map +1 -1
  72. package/dist/commands/pjm/index.js +28 -3
  73. package/dist/commands/pjm/init.d.ts +5 -0
  74. package/dist/commands/pjm/init.d.ts.map +1 -1
  75. package/dist/commands/pjm/init.js +19 -3
  76. package/dist/commands/project/archive/archive-utils.d.ts +8 -1
  77. package/dist/commands/project/archive/archive-utils.d.ts.map +1 -1
  78. package/dist/commands/project/archive/archive-utils.js +147 -50
  79. package/dist/commands/project/archive/push-runner.d.ts.map +1 -1
  80. package/dist/commands/project/archive/push-runner.js +15 -2
  81. package/dist/commands/project/dispatch/index.d.ts +10 -0
  82. package/dist/commands/project/dispatch/index.d.ts.map +1 -0
  83. package/dist/commands/project/dispatch/index.js +137 -0
  84. package/dist/commands/project/dispatch/record.d.ts +91 -0
  85. package/dist/commands/project/dispatch/record.d.ts.map +1 -0
  86. package/dist/commands/project/dispatch/record.js +402 -0
  87. package/dist/commands/project/index.d.ts.map +1 -1
  88. package/dist/commands/project/index.js +2 -0
  89. package/dist/commands/project/links/compute.d.ts +1 -0
  90. package/dist/commands/project/links/compute.d.ts.map +1 -1
  91. package/dist/commands/project/links/compute.js +5 -4
  92. package/dist/commands/project/links/index.d.ts +9 -0
  93. package/dist/commands/project/links/index.d.ts.map +1 -1
  94. package/dist/commands/project/links/index.js +71 -2
  95. package/dist/commands/project/list.d.ts +10 -2
  96. package/dist/commands/project/list.d.ts.map +1 -1
  97. package/dist/commands/project/list.js +205 -29
  98. package/dist/commands/project/open/index.d.ts +2 -0
  99. package/dist/commands/project/open/index.d.ts.map +1 -1
  100. package/dist/commands/project/open/index.js +16 -1
  101. package/dist/commands/project/prune/index.d.ts +10 -4
  102. package/dist/commands/project/prune/index.d.ts.map +1 -1
  103. package/dist/commands/project/prune/index.js +85 -15
  104. package/dist/commands/project/pull/index.d.ts +4 -0
  105. package/dist/commands/project/pull/index.d.ts.map +1 -1
  106. package/dist/commands/project/pull/index.js +82 -3
  107. package/dist/commands/project/sync/git.d.ts +9 -0
  108. package/dist/commands/project/sync/git.d.ts.map +1 -1
  109. package/dist/commands/project/sync/git.js +18 -0
  110. package/dist/commands/project/sync/ref-sync.d.ts +16 -1
  111. package/dist/commands/project/sync/ref-sync.d.ts.map +1 -1
  112. package/dist/commands/project/sync/ref-sync.js +288 -17
  113. package/dist/commands/project/sync/resolve-target.d.ts +10 -0
  114. package/dist/commands/project/sync/resolve-target.d.ts.map +1 -1
  115. package/dist/commands/project/sync/resolve-target.js +56 -1
  116. package/dist/commands/providers/inspect/inspect.d.ts +8 -1
  117. package/dist/commands/providers/inspect/inspect.d.ts.map +1 -1
  118. package/dist/commands/providers/inspect/inspect.js +146 -26
  119. package/dist/commands/providers/list/list.d.ts +8 -1
  120. package/dist/commands/providers/list/list.d.ts.map +1 -1
  121. package/dist/commands/providers/list/list.js +139 -23
  122. package/dist/commands/providers/providers.types.d.ts +25 -1
  123. package/dist/commands/providers/providers.types.d.ts.map +1 -1
  124. package/dist/commands/providers/set/index.d.ts +9 -1
  125. package/dist/commands/providers/set/index.d.ts.map +1 -1
  126. package/dist/commands/providers/set/index.js +43 -33
  127. package/dist/commands/remove/skill/remove-skill.d.ts.map +1 -1
  128. package/dist/commands/remove/skill/remove-skill.js +11 -0
  129. package/dist/commands/shared/agents-md.d.ts +42 -14
  130. package/dist/commands/shared/agents-md.d.ts.map +1 -1
  131. package/dist/commands/shared/agents-md.js +364 -70
  132. package/dist/commands/shared/project-scope.d.ts +2 -0
  133. package/dist/commands/shared/project-scope.d.ts.map +1 -1
  134. package/dist/commands/shared/project-scope.js +5 -0
  135. package/dist/commands/state/generate.d.ts +2 -0
  136. package/dist/commands/state/generate.d.ts.map +1 -1
  137. package/dist/commands/state/generate.js +93 -28
  138. package/dist/commands/status/index.d.ts +8 -3
  139. package/dist/commands/status/index.d.ts.map +1 -1
  140. package/dist/commands/status/index.js +147 -32
  141. package/dist/commands/sync/apply.d.ts.map +1 -1
  142. package/dist/commands/sync/apply.js +220 -29
  143. package/dist/commands/sync/dry-run.d.ts.map +1 -1
  144. package/dist/commands/sync/dry-run.js +30 -6
  145. package/dist/commands/sync/index.d.ts +17 -2
  146. package/dist/commands/sync/index.d.ts.map +1 -1
  147. package/dist/commands/sync/index.js +106 -41
  148. package/dist/commands/sync/sync.types.d.ts +39 -2
  149. package/dist/commands/sync/sync.types.d.ts.map +1 -1
  150. package/dist/commands/sync/sync.utils.d.ts +5 -1
  151. package/dist/commands/sync/sync.utils.d.ts.map +1 -1
  152. package/dist/commands/sync/sync.utils.js +73 -0
  153. package/dist/commands/tools/info/info-tool.d.ts +2 -0
  154. package/dist/commands/tools/info/info-tool.d.ts.map +1 -1
  155. package/dist/commands/tools/info/info-tool.js +34 -12
  156. package/dist/commands/tools/install/index.d.ts.map +1 -1
  157. package/dist/commands/tools/install/index.js +19 -3
  158. package/dist/commands/tools/list/list-tools.d.ts +2 -0
  159. package/dist/commands/tools/list/list-tools.d.ts.map +1 -1
  160. package/dist/commands/tools/list/list-tools.js +36 -7
  161. package/dist/commands/tools/remove/index.d.ts.map +1 -1
  162. package/dist/commands/tools/remove/index.js +150 -21
  163. package/dist/commands/tools/remove/remove-tools.d.ts +20 -0
  164. package/dist/commands/tools/remove/remove-tools.d.ts.map +1 -1
  165. package/dist/commands/tools/remove/remove-tools.js +122 -1
  166. package/dist/commands/tools/shared/format-pack-inventory.d.ts +19 -0
  167. package/dist/commands/tools/shared/format-pack-inventory.d.ts.map +1 -1
  168. package/dist/commands/tools/shared/format-pack-inventory.js +109 -0
  169. package/dist/commands/tools/shared/pack-evidence.d.ts +66 -0
  170. package/dist/commands/tools/shared/pack-evidence.d.ts.map +1 -0
  171. package/dist/commands/tools/shared/pack-evidence.js +132 -0
  172. package/dist/commands/tools/shared/pack-inventory.d.ts +1 -0
  173. package/dist/commands/tools/shared/pack-inventory.d.ts.map +1 -1
  174. package/dist/commands/tools/shared/pack-lifecycle-outcome.d.ts +44 -0
  175. package/dist/commands/tools/shared/pack-lifecycle-outcome.d.ts.map +1 -0
  176. package/dist/commands/tools/shared/pack-lifecycle-outcome.js +91 -0
  177. package/dist/commands/tools/update/index.d.ts.map +1 -1
  178. package/dist/commands/tools/update/index.js +74 -4
  179. package/dist/commands/tools/update/update-tools.d.ts +5 -0
  180. package/dist/commands/tools/update/update-tools.d.ts.map +1 -1
  181. package/dist/commands/tools/update/update-tools.js +64 -2
  182. package/dist/config/oat-config.d.ts +5 -0
  183. package/dist/config/oat-config.d.ts.map +1 -1
  184. package/dist/config/oat-config.js +17 -5
  185. package/dist/config/user-sync-config.d.ts +1 -0
  186. package/dist/config/user-sync-config.d.ts.map +1 -1
  187. package/dist/config/user-sync-config.js +8 -0
  188. package/dist/drift/detector.d.ts +2 -2
  189. package/dist/drift/detector.d.ts.map +1 -1
  190. package/dist/drift/detector.js +18 -0
  191. package/dist/drift/strays.d.ts.map +1 -1
  192. package/dist/drift/strays.js +5 -0
  193. package/dist/engine/collection-sync.d.ts +14 -0
  194. package/dist/engine/collection-sync.d.ts.map +1 -0
  195. package/dist/engine/collection-sync.js +282 -0
  196. package/dist/engine/compute-plan.d.ts +8 -1
  197. package/dist/engine/compute-plan.d.ts.map +1 -1
  198. package/dist/engine/compute-plan.js +303 -12
  199. package/dist/engine/engine.types.d.ts +61 -0
  200. package/dist/engine/engine.types.d.ts.map +1 -1
  201. package/dist/engine/execute-plan.d.ts +22 -2
  202. package/dist/engine/execute-plan.d.ts.map +1 -1
  203. package/dist/engine/execute-plan.js +459 -27
  204. package/dist/engine/provider-path-safety.d.ts +1 -0
  205. package/dist/engine/provider-path-safety.d.ts.map +1 -1
  206. package/dist/engine/provider-path-safety.js +15 -0
  207. package/dist/engine/scanner.d.ts +2 -2
  208. package/dist/engine/scanner.d.ts.map +1 -1
  209. package/dist/engine/scanner.js +21 -4
  210. package/dist/fs/io.d.ts +67 -0
  211. package/dist/fs/io.d.ts.map +1 -1
  212. package/dist/fs/io.js +536 -3
  213. package/dist/manifest/index.d.ts +2 -2
  214. package/dist/manifest/index.d.ts.map +1 -1
  215. package/dist/manifest/index.js +1 -1
  216. package/dist/manifest/manager.d.ts +2 -2
  217. package/dist/manifest/manager.d.ts.map +1 -1
  218. package/dist/manifest/manager.js +20 -3
  219. package/dist/manifest/manifest.types.d.ts +704 -13
  220. package/dist/manifest/manifest.types.d.ts.map +1 -1
  221. package/dist/manifest/manifest.types.js +131 -15
  222. package/dist/providers/codex/codec/sync-extension.d.ts.map +1 -1
  223. package/dist/providers/codex/codec/sync-extension.js +41 -10
  224. package/dist/providers/cursor/codec/sync-extension.d.ts.map +1 -1
  225. package/dist/providers/cursor/codec/sync-extension.js +41 -10
  226. package/dist/providers/identity/absolute-paths.d.ts +68 -0
  227. package/dist/providers/identity/absolute-paths.d.ts.map +1 -0
  228. package/dist/providers/identity/absolute-paths.js +144 -0
  229. package/dist/providers/identity/claude-runtime-observation.d.ts +105 -0
  230. package/dist/providers/identity/claude-runtime-observation.d.ts.map +1 -0
  231. package/dist/providers/identity/claude-runtime-observation.fixtures.d.ts +40 -0
  232. package/dist/providers/identity/claude-runtime-observation.fixtures.d.ts.map +1 -0
  233. package/dist/providers/identity/claude-runtime-observation.fixtures.js +146 -0
  234. package/dist/providers/identity/claude-runtime-observation.js +229 -0
  235. package/dist/providers/identity/codex-runtime-observation.d.ts +75 -0
  236. package/dist/providers/identity/codex-runtime-observation.d.ts.map +1 -0
  237. package/dist/providers/identity/codex-runtime-observation.fixtures.d.ts +37 -0
  238. package/dist/providers/identity/codex-runtime-observation.fixtures.d.ts.map +1 -0
  239. package/dist/providers/identity/codex-runtime-observation.fixtures.js +539 -0
  240. package/dist/providers/identity/codex-runtime-observation.js +255 -0
  241. package/dist/providers/identity/generic-dispatch-record.d.ts +313 -0
  242. package/dist/providers/identity/generic-dispatch-record.d.ts.map +1 -0
  243. package/dist/providers/identity/generic-dispatch-record.js +539 -0
  244. package/dist/providers/identity/oat-dispatch-record.d.ts +1964 -0
  245. package/dist/providers/identity/oat-dispatch-record.d.ts.map +1 -0
  246. package/dist/providers/identity/oat-dispatch-record.js +691 -0
  247. package/dist/providers/identity/runtime-observation.d.ts +100 -0
  248. package/dist/providers/identity/runtime-observation.d.ts.map +1 -0
  249. package/dist/providers/identity/runtime-observation.js +169 -0
  250. package/dist/providers/shared/index.d.ts +2 -0
  251. package/dist/providers/shared/index.d.ts.map +1 -1
  252. package/dist/providers/shared/index.js +1 -0
  253. package/dist/providers/shared/materialization-extension.d.ts +12 -0
  254. package/dist/providers/shared/materialization-extension.d.ts.map +1 -1
  255. package/dist/providers/shared/registry.d.ts +69 -0
  256. package/dist/providers/shared/registry.d.ts.map +1 -0
  257. package/dist/providers/shared/registry.js +252 -0
  258. package/dist/providers/shared/restart-adviser.d.ts +26 -0
  259. package/dist/providers/shared/restart-adviser.d.ts.map +1 -0
  260. package/dist/providers/shared/restart-adviser.js +96 -0
  261. package/dist/shared/types.d.ts +4 -0
  262. package/dist/shared/types.d.ts.map +1 -1
  263. package/package.json +2 -2
@@ -244,7 +244,7 @@ remains immutable baseline evidence for the original p01-t01 verification.
244
244
  | `oat-project-summary/SKILL.md` | `68c197c44c18 -> NG`; `35cb2ea1d677 -> NG`; `a167d03559fa -> NG`; `cf317c17c586 -> SUMMARY-01`; `f3e49b727752 -> NG`; `f979b2342d28 -> NG`; `803bf40ec423 -> NG`; `c8fced47ef8e -> NG`; `d7ea1e2a4f5f -> NG`; `5f315ab87cb1 -> NG` |
245
245
  | `oat-project-pr-final/SKILL.md` | `601ac2b890f2 -> NG`; `c264a64398f0 -> NG`; `9efcbcee42ea -> NG`; `655d61df0a8f -> NG`; `cf317c17c586 -> PRFINAL-01`; `2de348a391c0 -> PRFINAL-03` |
246
246
  | `oat-project-pr-final/references/docs/autonomy-contract.md` | `* -> NG` |
247
- | `oat-project-complete/SKILL.md` | `6ed459f9e462 -> NG`; `a167d03559fa -> NG`; `79c2eeed668c -> COMPLETE-01`; `2c1514b9d9af -> COMPLETE-01`; `31c750b4fea7 -> COMPLETE-01`; `cfba413b1293 -> COMPLETE-01`; `7fcfce0423ac -> COMPLETE-01`; `7bcbf58b54e9 -> NG`; `4c7f88a7f942 -> COMPLETE-02`; `6a1a95acc8cc -> COMPLETE-02`; `3b559956b3eb -> COMPLETE-03`; `14d161cdf99b -> COMPLETE-03`; `12f7c30a54c8 -> NG`; `fffe5eea5ebd -> NG`; `e7dc6fdc4eb3 -> COMPLETE-01`; `e5460e437299 -> NG`; `882b61c9096c -> NG`; `9ffa1c752505 -> NG` |
247
+ | `oat-project-complete/SKILL.md` | `6ed459f9e462 -> NG`; `a167d03559fa -> NG`; `79c2eeed668c -> COMPLETE-01`; `2c1514b9d9af -> COMPLETE-01`; `31c750b4fea7 -> COMPLETE-01`; `cfba413b1293 -> COMPLETE-01`; `7fcfce0423ac -> COMPLETE-01`; `7bcbf58b54e9 -> NG`; `4c7f88a7f942 -> COMPLETE-02`; `6a1a95acc8cc -> COMPLETE-02`; `3b559956b3eb -> COMPLETE-03`; `14d161cdf99b -> COMPLETE-03`; `fffe5eea5ebd -> NG`; `e7dc6fdc4eb3 -> COMPLETE-01`; `e5460e437299 -> NG`; `882b61c9096c -> NG`; `9ffa1c752505 -> NG` |
248
248
  | `oat-project-review-provide/SKILL.md` | `1f4b981cac8b -> NG`; `adaeca152bb2 -> NG`; `2f7c201c3c06 -> NG`; `88f79700afdc -> NG`; `655d61df0a8f -> NG`; `efafde9ef5a0 -> NG`; `d2a3861d6323 -> REVIEWPROVIDE-02`; `65f5b9cf49cd -> REVIEWPROVIDE-04`; `962cb38d246a -> REVIEWPROVIDE-04`; `1a568483ba0b -> REVIEWPROVIDE-04`; `610e27edfe85 -> REVIEWPROVIDE-04`; `bb0096e95c47 -> REVIEWPROVIDE-06`; `55f6357a987d -> REVIEWPROVIDE-06`; `1bee61f8531c -> REVIEWPROVIDE-07`; `3d35091607a1 -> REVIEWPROVIDE-08`; `fb40c4341c4c -> NG`; `b22d16885150 -> NG`; `d2b25906242e -> REVIEWPROVIDE-08`; `fd8ebf72b3c4 -> NG`; `fcb9de611ff3 -> NG`; `d2a838dfb18d -> NG`; `c3d50ea7cf69 -> NG`; `09b1b8dd445c -> NG`; `7acc8f3718d2 -> REVIEWPROVIDE-09`; `b2fa883fc4a2 -> NG`; `fe4421531b4c -> NG` |
249
249
  | `oat-project-review-receive/SKILL.md` | `9b8a3743d626 -> NG`; `df49c8c6f192 -> NG`; `4ee8730382d3 -> NG`; `655d61df0a8f -> NG`; `765f897d67ac -> NG`; `53b58d16dd32 -> NG`; `fb8755a3bdf4 -> NG`; `c8ab5dd90075 -> NG`; `1f7dd98dff2f -> NG`; `56f78c6740e6 -> NG`; `76f5fb5a88cd -> NG`; `085abfa3599f -> REVIEWRECEIVE-01`; `3ad3aadb8c60 -> NG`; `a7d114059bb6 -> NG`; `ac88cfaa83d9 -> NG`; `594bbf70346c -> REVIEWRECEIVE-08`; `f31f07284718 -> REVIEWRECEIVE-02`; `aba178a21441 -> REVIEWRECEIVE-04`; `a37e601cd731 -> REVIEWRECEIVE-05`; `20e05e1a4381 -> REVIEWRECEIVE-06`; `90001dadf75f -> REVIEWRECEIVE-07`; `f8fd58180ecf -> NG`; `c3abcdc02d9f -> NG`; `f2ebdd6abb9b -> NG` |
250
250
  | `oat-project-review-provide/SKILL.md` | `2e794bf4fc4a -> REVIEWPROVIDE-08`; `5441ab977b46 -> REVIEWPROVIDE-08` |
@@ -256,11 +256,11 @@ remains immutable baseline evidence for the original p01-t01 verification.
256
256
  | `oat-dispatch-subagents/references/provider-claude.md` | `fbe3a21e9533 -> NG` |
257
257
  | `oat-dispatch-subagents/references/provider-codex.md` | `95b0f82018c7 -> NG` |
258
258
  | `oat-dispatch-subagents/references/provider-cursor.md` | `f781555295a9 -> NG`; `55ccfef14fd6 -> NG` |
259
- | `oat-dispatch-subagents/references/record-schema.md` | `78f8069274a8 -> NG`; `1c9a84c4d1e0 -> NG` |
259
+ | `oat-dispatch-subagents/references/record-schema.md` | `78f8069274a8 -> NG`; `1c9a84c4d1e0 -> NG`; `2a63da6e3a96 -> NG`; `30762d53b043 -> NG` |
260
260
  | `oat-project-dispatch-subagents/SKILL.md` | `eca03ad1ca12 -> PDISPATCH-01`; `59fbcdc79cea -> PDISPATCH-01` |
261
261
  | `oat-project-plan/SKILL.md` | `f99e44b39932 -> PLAN-12`; `7e6a9854504b -> NG` |
262
262
  | `oat-project-implement/references/completion-and-closeout.md` | `6909a5a5a1fa -> IMPLEMENT-19`; `a7c02ef670fd -> IMPLEMENT-19`; `9dde56d89a71 -> IMPLEMENT-16`; `13c41b2b2590 -> IMPLEMENT-16` |
263
- | `oat-project-complete/SKILL.md` | `0177956707aa -> NG`; `8305b5bb65ef -> NG`; `eb3e75663ac0 -> NG`; `8cc1fa5aab1e -> COMPLETE-01`; `4c209fbb4716 -> COMPLETE-01`; `02e4175e1171 -> COMPLETE-01`; `d698d4f98e76 -> COMPLETE-01`; `9f86a7218d93 -> COMPLETE-01`; `024713698d9a -> COMPLETE-01`; `c327995053fa -> COMPLETE-01`; `61f81d4ec7c1 -> COMPLETE-01`; `14fb2e56809f -> COMPLETE-01`; `7d4ff668744d -> COMPLETE-01`; `502a6c141784 -> COMPLETE-01`; `fb7e2db356af -> COMPLETE-01` |
263
+ | `oat-project-complete/SKILL.md` | `0177956707aa -> NG`; `8305b5bb65ef -> NG`; `eb3e75663ac0 -> NG`; `8cc1fa5aab1e -> COMPLETE-01`; `4c209fbb4716 -> COMPLETE-01`; `02e4175e1171 -> COMPLETE-01`; `d698d4f98e76 -> COMPLETE-01`; `9f86a7218d93 -> COMPLETE-01`; `024713698d9a -> COMPLETE-01`; `c327995053fa -> COMPLETE-01`; `61f81d4ec7c1 -> COMPLETE-01`; `14fb2e56809f -> COMPLETE-01`; `7d4ff668744d -> COMPLETE-01`; `502a6c141784 -> COMPLETE-01`; `fb7e2db356af -> COMPLETE-01`; `f73f8476360a -> NG`; `1e15f420039f -> NG`; `cc234032ddd7 -> NG`; `c3d25f1398bb -> NG`; `ca13a6645df2 -> NG` |
264
264
 
265
265
  ## Prompt-scan comparison
266
266
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: oat-project-complete
3
- version: 1.7.5
3
+ version: 1.7.6
4
4
  description: Use when all implementation work is finished and the project is ready to close. Marks the OAT project lifecycle as complete.
5
5
  disable-model-invocation: true
6
6
  user-invocable: true
@@ -49,6 +49,10 @@ COMPLETION_RECEIPT_SCRIPT="$SKILL_DIR/scripts/recover-completion-receipts.mjs"
49
49
  COMPLETION_RETRY_SCRIPT="$SKILL_DIR/scripts/resolve-completion-retry.mjs"
50
50
  COMPLETION_RETRY_FIELDS_SCRIPT="$SKILL_DIR/scripts/parse-completion-retry-fields.mjs"
51
51
  NONARCHIVE_LIFECYCLE_RECEIPT_SCRIPT="$SKILL_DIR/scripts/validate-nonarchive-lifecycle-receipt.mjs"
52
+ SYNCED_ARCHIVE_ENTRY_SCRIPT="$SKILL_DIR/scripts/resolve-synced-archive-entry.mjs"
53
+ SYNCED_ARCHIVE_EXECUTE_SCRIPT="$SKILL_DIR/scripts/execute-synced-archive-entry.mjs"
54
+ SYNCED_ARCHIVE_RESUME_FIELDS_SCRIPT="$SKILL_DIR/scripts/parse-synced-archive-resume-fields.mjs"
55
+ SYNCED_ARCHIVE_FINALIZE_SCRIPT="$SKILL_DIR/scripts/finalize-synced-archive.mjs"
52
56
  test -f "$COMPLETION_RECEIPT_SCRIPT" || {
53
57
  echo "oat: completion receipt recovery script is missing" >&2
54
58
  exit 1
@@ -65,10 +69,56 @@ test -f "$NONARCHIVE_LIFECYCLE_RECEIPT_SCRIPT" || {
65
69
  echo "Missing non-archive lifecycle receipt validator: $NONARCHIVE_LIFECYCLE_RECEIPT_SCRIPT" >&2
66
70
  exit 1
67
71
  }
72
+ test -f "$SYNCED_ARCHIVE_ENTRY_SCRIPT" || {
73
+ echo "Missing synced archive entry router: $SYNCED_ARCHIVE_ENTRY_SCRIPT" >&2
74
+ exit 1
75
+ }
76
+ test -f "$SYNCED_ARCHIVE_EXECUTE_SCRIPT" || {
77
+ echo "Missing synced archive entry executor: $SYNCED_ARCHIVE_EXECUTE_SCRIPT" >&2
78
+ exit 1
79
+ }
80
+ test -f "$SYNCED_ARCHIVE_RESUME_FIELDS_SCRIPT" || {
81
+ echo "Missing synced archive resume field parser: $SYNCED_ARCHIVE_RESUME_FIELDS_SCRIPT" >&2
82
+ exit 1
83
+ }
84
+ test -f "$SYNCED_ARCHIVE_FINALIZE_SCRIPT" || {
85
+ echo "Missing synced archive finalizer: $SYNCED_ARCHIVE_FINALIZE_SCRIPT" >&2
86
+ exit 1
87
+ }
68
88
 
69
89
  PROJECT_SCOPE=$(oat project scope "$PROJECT_PATH" --format value) || { echo "oat: cannot resolve project scope for $PROJECT_PATH; refusing completion" >&2; exit 1; }
90
+ SYNCED_ARCHIVE_RESUME="false"
70
91
  if [[ "$PROJECT_SCOPE" == "synced" ]]; then
71
- oat project pull "$PROJECT_PATH" || { echo "oat: project pull failed for $PROJECT_PATH; resolve the reported state before continuing" >&2; exit 1; }
92
+ SYNCED_RECORD_PATH="${PROJECT_PATH}.json"
93
+ REPO_ROOT=$(git rev-parse --show-toplevel) || exit 1
94
+ SYNCED_ARCHIVE_ENTRY=$(node "$SYNCED_ARCHIVE_EXECUTE_SCRIPT" \
95
+ --repo-root "$REPO_ROOT" \
96
+ --record-path "$SYNCED_RECORD_PATH" \
97
+ --project-name "$PROJECT_NAME" \
98
+ --project-path "$PROJECT_PATH") || exit 1
99
+ SYNCED_ARCHIVE_ENTRY_ROUTE=$(node -e '
100
+ const value = JSON.parse(process.argv[1]);
101
+ if (value.status !== "ok" || !["continue-active", "archive-resumed"].includes(value.route)) process.exit(1);
102
+ process.stdout.write(value.route);
103
+ ' "$SYNCED_ARCHIVE_ENTRY") || exit 1
104
+ if [[ "$SYNCED_ARCHIVE_ENTRY_ROUTE" == "archive-resumed" ]]; then
105
+ printf '%s\n' "$SYNCED_ARCHIVE_ENTRY"
106
+ SYNCED_ARCHIVE_RESUME_ASSIGNMENTS=$(node \
107
+ "$SYNCED_ARCHIVE_RESUME_FIELDS_SCRIPT" \
108
+ "$SYNCED_ARCHIVE_ENTRY") || exit 1
109
+ eval "$SYNCED_ARCHIVE_RESUME_ASSIGNMENTS" || exit 1
110
+ ARCHIVED_PROJECT_STATUS_ASSIGNMENTS=$(oat project status \
111
+ --project-path "$ARCHIVE_PATH" --shell \
112
+ oat_pr_status=project.prStatus \
113
+ oat_pr_url=project.prUrl) || exit 1
114
+ eval "$ARCHIVED_PROJECT_STATUS_ASSIGNMENTS" || exit 1
115
+ WAS_PR_OPEN_AT_START="false"
116
+ if [[ "${oat_pr_status:-}" == "open" ]]; then
117
+ WAS_PR_OPEN_AT_START="true"
118
+ fi
119
+ echo "Verified synced archive terminal receipt; active pointer retained until closeout succeeds."
120
+ echo "Steps 2-8 will not replay; continuing at Step 8.5."
121
+ fi
72
122
  fi
73
123
  PROJECT_RETAINED_REF=""
74
124
  if [[ "$PROJECT_SCOPE" == "synced" ]]; then
@@ -80,6 +130,14 @@ if [[ "$PROJECT_SCOPE" == "shared" || "$PROJECT_SCOPE" == "synced" ]]; then
80
130
  fi
81
131
  ```
82
132
 
133
+ When `SYNCED_ARCHIVE_RESUME="true"`, continue directly at **Step 8.5**. Do not
134
+ execute Steps 2 through 8, ask the upfront questions again, read or mutate the
135
+ retired active checkout, regenerate active artifacts, or invoke archive a
136
+ second time. The executor result and the archived project status have already
137
+ initialized every resume-safe downstream receipt and choice. A resume never
138
+ opens a new PR from an unpersisted prior answer; `SHOULD_OPEN_PR="false"`, while
139
+ an already-tracked open PR is updated by Step 11.5.
140
+
83
141
  ### Step 2: Upfront User Questions (Batched)
84
142
 
85
143
  Ask all user questions at once so the user can answer them in a single interaction, then the rest of the skill runs without further prompts.
@@ -641,13 +699,20 @@ project push.
641
699
  The CLI command owns both the frontmatter completion fields and the canonical markdown body updates for `state.md`.
642
700
  It must set `oat_lifecycle: complete`, completion timestamps, `**Status:** Complete`, `**Last Updated:**`, the canonical `## Current Phase` body, normalized `## Progress`, and `## Next Milestone`.
643
701
 
644
- ### Step 6: Clear Active Project Pointer
702
+ ### Step 6: Clear or Defer the Active Project Pointer
645
703
 
646
- Clear the active project pointer immediately. If the user is completing a project, clearing the pointer is implicit — no confirmation needed.
704
+ Clearing the active project pointer is implicit and requires no confirmation.
705
+ For a synced archive, defer the clear until Step 8 has validated the full
706
+ terminal report. Every archive or configured-S3 failure therefore exits with
707
+ the original pointer intact and the completion remains directly resumable.
647
708
 
648
709
  ```bash
649
- oat config set activeProject ""
650
- echo "Active project pointer cleared."
710
+ if [[ "$PROJECT_SCOPE" == "synced" && "$SHOULD_ARCHIVE" == "true" ]]; then
711
+ echo "Active project pointer retained until synced archive terminal receipt validation."
712
+ else
713
+ oat config set activeProject ""
714
+ echo "Active project pointer cleared."
715
+ fi
651
716
  ```
652
717
 
653
718
  ### Step 7: Generate PR Description
@@ -869,7 +934,10 @@ source.
869
934
  This conditional skips archive movement only; it does not skip the Step 3.7
870
935
  seal append for an existing project log.
871
936
 
872
- Archive happens after PR description generation (so artifacts are readable at tracked paths) but before commit+push (so the archive deletion is included in the commit).
937
+ Archive happens after PR description generation. For a synced project, the
938
+ archive command owns the exact lifecycle commit that deletes the discovery
939
+ record together with tracked archive exports; later bookkeeping must reuse its
940
+ receipt rather than creating a second lifecycle commit.
873
941
 
874
942
  The archive-side effects in this step are CLI-owned. Do not reimplement local archive movement, summary export, S3 sync, AWS credential handling, or worktree durability checks in the skill.
875
943
 
@@ -894,14 +962,22 @@ printf '%s\n' "$ARCHIVE_OUTPUT"
894
962
 
895
963
  Parse `ARCHIVE_OUTPUT` as the `oat project archive --json` report. Require
896
964
  `status: "ok"`, `mode: "apply"`, and a non-empty `archivePath`; use its
897
- `s3Path`, `summaryExportFile`, `lifecycleCommit`, and `warnings` fields for later reporting. Set
965
+ `s3Path`, `summaryExportFile`, `lifecycleCommit`, `completedRef`,
966
+ `verifiedSourceSha`, `activeAliasDisposition`, `recordRetired`, and `warnings`
967
+ fields for later reporting. Set
898
968
  `ARCHIVE_PATH` from `archivePath`, set `SUMMARY_EXPORT_FILE` from
899
969
  `summaryExportFile` (empty when null), then set `PROJECT_PATH="$ARCHIVE_PATH"`.
900
970
 
901
971
  For a synced project, require a full `lifecycleCommit` SHA in the archive
902
- report and set `LIFECYCLE_COMMIT` to it. This is the parent-branch record and
903
- summary-export commit owned by archive; do not replace it with
904
- `git rev-parse HEAD` and do not create another lifecycle commit.
972
+ report, require `completedRef` to equal
973
+ `refs/oat/completed/${PROJECT_NAME}`, require a full `verifiedSourceSha`,
974
+ require `activeAliasDisposition` to be `removed` or `retained`, and require
975
+ `recordRetired` to be exactly `true`. Set `LIFECYCLE_COMMIT` to the reported
976
+ commit. This is the parent-branch record-deletion and archive-export commit
977
+ owned by archive; do not replace it with `git rev-parse HEAD` and do not create
978
+ another lifecycle commit. `removed` is the completed-only terminal shape;
979
+ `retained` is the equally terminal same-SHA active alias shape. A differing-SHA
980
+ state is never a successful report.
905
981
 
906
982
  When `SELECTED_PROJECT_RECAP_RUN` is non-empty, also require the report's
907
983
  `projectRecapExport.sourceRunRoot`, `projectRecapExport.exportRoot`, and
@@ -925,9 +1001,28 @@ The no-recap invocation remains `oat project archive "$PROJECT_PATH"` with
925
1001
  `--json` added only to select the machine-readable report.
926
1002
  Use `ARCHIVE_S3_CONTEXT` in Step 12 if the command reports profile/region details.
927
1003
 
1004
+ Only after every applicable synced terminal and recap-export field above has
1005
+ passed validation may the workflow continue. Keep the pointer through the
1006
+ required link, dashboard, bookkeeping, push, and PR-closeout work below so a
1007
+ failure after record retirement can retry through the recordless archive path.
1008
+
928
1009
  #### Step 8.5: Finalize Archive-Aware Recap Links
929
1010
 
930
- Run this only when archive returned a `projectRecapExport`.
1011
+ The recap-link rewrite in this subsection runs only when archive returned a
1012
+ `projectRecapExport`. A synced archive resume with no recap export performs no
1013
+ recap-link rewrite, then still continues at Step 8.6.
1014
+
1015
+ This is the explicit rejoin point when `SYNCED_ARCHIVE_RESUME="true"`. Use
1016
+ `ARCHIVE_OUTPUT` and `PROJECT_RECAP_EXPORT_JSON` from the validated executor
1017
+ result; use its `ARCHIVE_PATH`, `SUMMARY_EXPORT_FILE`, `LIFECYCLE_COMMIT`,
1018
+ `ARCHIVE_S3_PATH`, and `SELECTED_PROJECT_RECAP_RUN` assignments for all later
1019
+ steps. Do not infer any receipt from the deleted checkout and do not rerun the
1020
+ Step 8 archive command—the executor already validated the terminal report.
1021
+ Keep the active pointer until post-archive closeout succeeds, then run the
1022
+ finalizer once before confirmation. Continue through Steps 8.5–12, including
1023
+ final synced links,
1024
+ dashboard refresh, the required bookkeeping push, tracked-PR closeout when
1025
+ applicable, and final confirmation.
931
1026
 
932
1027
  Rewrite recap links in the tracked summary export and the PR description body from `projectRecapExport.exportRoot`; do not derive them from the local archive.
933
1028
  Use a repository-relative path under
@@ -1068,7 +1163,8 @@ Expected changes may include:
1068
1163
  - `{PROJECT_PATH}/pr/project-pr-*.md` (PR description artifact)
1069
1164
  - `.oat/state.md` is regenerated locally in Step 9 but should not be staged; it is generated dashboard state and normally gitignored.
1070
1165
  - `.oat/config.local.json` (if `activeProject` cleared)
1071
- - Shared-project deletions or synced-project record updates (if archived)
1166
+ - Shared-project deletions; synced archive record deletion is already sealed by
1167
+ the archive-owned lifecycle commit
1072
1168
  - The complete tracked recap export and tracked summary export reported by
1073
1169
  archive (if present)
1074
1170
 
@@ -1122,9 +1218,11 @@ Rules:
1122
1218
 
1123
1219
  Skip when no final recap was selected, for local-scope projects, when the
1124
1220
  selected recap is already durable solely through independently verified publish
1125
- evidence, or when Step 7.5 restored an exact `EVIDENCE_COMMIT`. In the recovered
1126
- evidence case, verify the selected run's manifest and build record are the two
1127
- exact paths in that commit and continue without re-attesting or rewriting them.
1221
+ evidence, or when Step 7.5 or the synced archive-resume executor restored an
1222
+ exact `EVIDENCE_COMMIT`. In the recovered evidence case, the recovery primitive
1223
+ has already verified the selected run's manifest and build record as the two
1224
+ exact paths in that commit, with `LIFECYCLE_COMMIT` as its immediate parent.
1225
+ Continue without re-attesting or rewriting either record.
1128
1226
 
1129
1227
  For an archived recap, consume the exact `projectRecapExport` values recorded
1130
1228
  in Step 8. Plan finalization through
@@ -1171,7 +1269,8 @@ details, and continue to the evidence commit.
1171
1269
 
1172
1270
  ### Step 10.6: Commit Evidence + Push
1173
1271
 
1174
- When Step 10.5 ran and Step 7.5 did not restore `EVIDENCE_COMMIT`, create the evidence update. Commit only the exported `manifest.json` and `build-record.json` as the evidence update, including warning-bearing records from a failed attestation. On failure, commit the warning-bearing `manifest.json` and `build-record.json`. Run
1272
+ When Step 10.5 ran and neither Step 7.5 nor the synced archive-resume executor
1273
+ restored `EVIDENCE_COMMIT`, create the evidence update. Commit only the exported `manifest.json` and `build-record.json` as the evidence update, including warning-bearing records from a failed attestation. On failure, commit the warning-bearing `manifest.json` and `build-record.json`. Run
1175
1274
  `verifyTrackedRunFinalization(...)` with the artifact commit, immediate evidence
1176
1275
  commit parent/order, exact evidence paths, attestation outcome, and unchanged
1177
1276
  unrelated-change snapshots.
@@ -1198,6 +1297,7 @@ git commit --only -m "chore(oat): attest final project recap" -- \
1198
1297
  EVIDENCE_COMMIT=$(git rev-parse HEAD)
1199
1298
  test "$(git rev-parse "$EVIDENCE_COMMIT^")" = "$LIFECYCLE_COMMIT"
1200
1299
  test "$(git diff --cached --binary)" = "$UNRELATED_STAGED_PATCH_BEFORE"
1300
+ EVIDENCE_PUSH_REQUIRED="true"
1201
1301
  ```
1202
1302
 
1203
1303
  Verify the evidence commit contains exactly those two paths, the lifecycle
@@ -1233,12 +1333,51 @@ test "$(git -C "$ACTIVE_PROJECT_PATH" diff --cached --binary)" = \
1233
1333
  "$UNRELATED_PROJECT_STAGE_BEFORE"
1234
1334
  ```
1235
1335
 
1236
- When Step 7.5 restored `EVIDENCE_COMMIT`, do not stage or commit recap records
1237
- again. Require the retained remote ref to equal that exact evidence SHA, keep
1238
- its immediate parent equal to `PROJECT_REF_COMMIT`, and preserve the recovered
1239
- `PROJECT_LINKS_PIN_COMMIT`. The parent discovery-record commit remains confined
1240
- to its one canonical path, and all unrelated staged-state snapshots must remain
1241
- byte-for-byte unchanged.
1336
+ When Step 7.5 restored `EVIDENCE_COMMIT` for a non-archive completion, do not
1337
+ stage or commit recap records again. Require the retained remote ref to equal
1338
+ that exact evidence SHA, keep its immediate parent equal to
1339
+ `PROJECT_REF_COMMIT`, and preserve the recovered `PROJECT_LINKS_PIN_COMMIT`.
1340
+ When the synced archive-resume executor restored `EVIDENCE_COMMIT`, likewise do
1341
+ not re-attest, stage, or commit: it already required the evidence commit to
1342
+ change exactly `EXPORTED_MANIFEST_PATH` and `EXPORTED_BUILD_RECORD_PATH`, with
1343
+ `LIFECYCLE_COMMIT` as its immediate parent. Its `EVIDENCE_PUSH_REQUIRED`
1344
+ receipt determines whether the one parent-branch push remains pending. All
1345
+ unrelated staged-state snapshots must remain byte-for-byte unchanged.
1346
+
1347
+ For every synced archive completion, including `SYNCED_ARCHIVE_RESUME="true"`,
1348
+ push the parent branch exactly once after the lifecycle receipt and any recap
1349
+ evidence commit are final. Verify the pushed upstream contains the exact final
1350
+ bookkeeping commit before continuing to PR closeout or claiming completion:
1351
+
1352
+ ```bash
1353
+ if [[ "$PROJECT_SCOPE" == "synced" && "$SHOULD_ARCHIVE" == "true" ]]; then
1354
+ BOOKKEEPING_PUSH_COMMIT="${EVIDENCE_COMMIT:-$LIFECYCLE_COMMIT}"
1355
+ test -n "$BOOKKEEPING_PUSH_COMMIT" || exit 1
1356
+ git merge-base --is-ancestor "$LIFECYCLE_COMMIT" \
1357
+ "$BOOKKEEPING_PUSH_COMMIT" || exit 1
1358
+ if [[ -n "$EVIDENCE_COMMIT" ]]; then
1359
+ test "$(git rev-parse "$EVIDENCE_COMMIT^")" = \
1360
+ "$LIFECYCLE_COMMIT" || exit 1
1361
+ if [[ "$EVIDENCE_PUSH_REQUIRED" != "true" && \
1362
+ "$EVIDENCE_PUSH_REQUIRED" != "false" ]]; then
1363
+ exit 1
1364
+ fi
1365
+ case "$EVIDENCE_PUSH_REQUIRED" in
1366
+ true) git push || exit 1 ;;
1367
+ false) echo "Reusing published recap evidence receipt: $EVIDENCE_COMMIT" ;;
1368
+ esac
1369
+ else
1370
+ git push || exit 1
1371
+ fi
1372
+ BOOKKEEPING_UPSTREAM=$(git rev-parse --abbrev-ref \
1373
+ --symbolic-full-name '@{u}') || exit 1
1374
+ BOOKKEEPING_UPSTREAM_COMMIT=$(git rev-parse \
1375
+ "$BOOKKEEPING_UPSTREAM^{commit}") || exit 1
1376
+ test "$BOOKKEEPING_UPSTREAM_COMMIT" = \
1377
+ "$BOOKKEEPING_PUSH_COMMIT" || exit 1
1378
+ echo "Completion bookkeeping pushed: $BOOKKEEPING_PUSH_COMMIT"
1379
+ fi
1380
+ ```
1242
1381
 
1243
1382
  ### Step 11: Open PR in GitHub (Conditional)
1244
1383
 
@@ -1304,20 +1443,48 @@ Steps:
1304
1443
  4. Push the updated body:
1305
1444
 
1306
1445
  ```bash
1307
- gh pr edit "$PR_REF" --body-file "$TMP_BODY"
1446
+ if ! command -v gh >/dev/null 2>&1; then
1447
+ echo "GitHub CLI is unavailable; update the tracked PR manually from $TMP_BODY." >&2
1448
+ if [[ "$PROJECT_SCOPE" == "synced" && "$SHOULD_ARCHIVE" == "true" ]]; then
1449
+ exit 1
1450
+ fi
1451
+ elif ! gh pr edit "$PR_REF" --body-file "$TMP_BODY"; then
1452
+ echo "PR description update failed; update it manually from $TMP_BODY." >&2
1453
+ if [[ "$PROJECT_SCOPE" == "synced" && "$SHOULD_ARCHIVE" == "true" ]]; then
1454
+ exit 1
1455
+ fi
1456
+ fi
1308
1457
  ```
1309
1458
 
1310
1459
  5. Clean up the temp file.
1311
1460
 
1312
1461
  Failure handling:
1313
1462
 
1314
- - If `gh` is missing, warn and print the path to the regenerated artifact body so the user can paste it into the PR manually. Do not fail the skill.
1315
- - If `gh pr edit` fails (e.g. PR was merged between Step 2 and now, or the auth token lacks edit permission), warn and continue. Step 12's completion summary should call out that the PR body was not updated and surface the artifact path so the user can update it manually.
1463
+ - If `gh` is missing or `gh pr edit` fails, always print the manual-update path.
1464
+ For a synced archive completion this tracked-PR update is required: stop
1465
+ before Step 12, retain the active pointer, and let the next invocation resume
1466
+ recordlessly. Other completion shapes retain their existing warning-only
1467
+ behavior and Step 12 summary guidance.
1316
1468
  - Never re-archive or re-commit on failure here — the lifecycle bookkeeping
1317
1469
  and any recap evidence update in Step 10.6 already shipped.
1318
1470
 
1319
1471
  ### Step 12: Confirm to User
1320
1472
 
1473
+ Immediately before confirmation, clear the deferred synced archive pointer.
1474
+ The finalizer validates the terminal receipt again before changing
1475
+ configuration. This ordering keeps every failure before final confirmation
1476
+ directly retryable, including a retry after record retirement:
1477
+
1478
+ ```bash
1479
+ if [[ "$PROJECT_SCOPE" == "synced" && "$SHOULD_ARCHIVE" == "true" ]]; then
1480
+ SYNCED_ARCHIVE_FINALIZATION=$(printf '%s\n' "$ARCHIVE_OUTPUT" | \
1481
+ node "$SYNCED_ARCHIVE_FINALIZE_SCRIPT" \
1482
+ --project-name "$PROJECT_NAME") || exit 1
1483
+ printf '%s\n' "$SYNCED_ARCHIVE_FINALIZATION"
1484
+ echo "Synced archive terminal receipt verified; active project pointer cleared."
1485
+ fi
1486
+ ```
1487
+
1321
1488
  Show user:
1322
1489
 
1323
1490
  - "Project **{PROJECT_NAME}** marked as complete."