devrites 7.2.7 → 7.3.0

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 (340) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +6 -1
  3. package/docs/candidate-integrity.md +10 -0
  4. package/docs/cli.md +7 -1
  5. package/docs/command-map.md +9 -2
  6. package/docs/engine/commands.md +50 -4
  7. package/docs/orchestration.md +35 -13
  8. package/docs/skills.md +5 -0
  9. package/engine/internal/acceptance/cli.go +35 -30
  10. package/engine/internal/acceptance/preconditions.go +1 -1
  11. package/engine/internal/acceptance/run.go +138 -53
  12. package/engine/internal/acceptance/transcript.go +236 -45
  13. package/engine/internal/devritespaths/paths.go +23 -5
  14. package/engine/internal/gate/gate.go +6 -0
  15. package/engine/internal/install/apply.go +5 -0
  16. package/engine/internal/install/merge.go +48 -6
  17. package/engine/internal/install/preflight.go +21 -3
  18. package/engine/internal/install/uninstall.go +9 -10
  19. package/engine/internal/lib/apply_bundle.go +7 -1
  20. package/engine/internal/lib/candidate.go +20 -7
  21. package/engine/internal/lib/candidate_coverage.go +2 -19
  22. package/engine/internal/lib/closeout.go +22 -10
  23. package/engine/internal/lib/context.go +67 -47
  24. package/engine/internal/lib/context_io.go +171 -0
  25. package/engine/internal/lib/detect.go +8 -8
  26. package/engine/internal/lib/dispatch.go +6 -0
  27. package/engine/internal/lib/packet.go +37 -7
  28. package/engine/internal/lib/packet_freeze.go +60 -12
  29. package/engine/internal/lib/packet_integrity.go +179 -0
  30. package/engine/internal/lib/perturb.go +3 -3
  31. package/engine/internal/lib/resolve.go +10 -5
  32. package/engine/internal/lib/slicecheck.go +7 -1
  33. package/engine/internal/lib/state_edit.go +9 -2
  34. package/engine/internal/lib/taskgraph.go +20 -36
  35. package/engine/internal/lib/triggers.go +30 -31
  36. package/engine/internal/lib/workspace_pool.go +330 -0
  37. package/engine/internal/parallel/cli.go +190 -49
  38. package/engine/internal/parallel/git.go +47 -14
  39. package/engine/internal/parallel/landing.go +232 -0
  40. package/engine/internal/parallel/lease.go +97 -18
  41. package/engine/internal/parallel/ops.go +312 -155
  42. package/engine/internal/parallel/pathdisjoint.go +48 -4
  43. package/engine/internal/parallel/prune.go +133 -0
  44. package/engine/internal/parallel/repository.go +239 -0
  45. package/engine/internal/parallel/select.go +64 -42
  46. package/engine/internal/state/cursor.go +5 -5
  47. package/engine/main.go +2 -1
  48. package/pack/.claude/agents/devrites-proof-runner.md +16 -9
  49. package/pack/.claude/skills/devrites-lib/SKILL.md +2 -0
  50. package/pack/.claude/skills/devrites-lib/reference/candidate-integrity.md +7 -3
  51. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +3 -0
  52. package/pack/.claude/skills/devrites-lib/reference/parallel-workspaces.md +202 -0
  53. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +9 -12
  54. package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +7 -3
  55. package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +1 -1
  56. package/pack/.claude/skills/devrites-lib/reference/standards/gates.md +18 -9
  57. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -0
  58. package/pack/.claude/skills/rite-autocomplete/SKILL.md +13 -10
  59. package/pack/.claude/skills/rite-autocomplete/reference/lookahead.md +4 -4
  60. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +13 -9
  61. package/pack/.claude/skills/rite-build/SKILL.md +13 -10
  62. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +1 -1
  63. package/pack/.claude/skills/rite-build/reference/checkpoint.md +1 -1
  64. package/pack/.claude/skills/rite-build/reference/parallel-batch.md +60 -39
  65. package/pack/.claude/skills/rite-build/reference/phase-contract.md +8 -5
  66. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +7 -7
  67. package/pack/.claude/skills/rite-clarify/SKILL.md +2 -2
  68. package/pack/.claude/skills/rite-converge/SKILL.md +4 -4
  69. package/pack/.claude/skills/rite-define/SKILL.md +7 -3
  70. package/pack/.claude/skills/rite-define/reference/plan-template.md +4 -2
  71. package/pack/.claude/skills/rite-plan/SKILL.md +11 -8
  72. package/pack/.claude/skills/rite-plan/reference/dependency-graph.md +9 -2
  73. package/pack/.claude/skills/rite-plan/reference/slicing.md +2 -0
  74. package/pack/.claude/skills/rite-polish/SKILL.md +3 -3
  75. package/pack/.claude/skills/rite-prove/SKILL.md +9 -5
  76. package/pack/.claude/skills/rite-resolve/SKILL.md +3 -3
  77. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +2 -0
  78. package/pack/.claude/skills/rite-review/SKILL.md +4 -3
  79. package/pack/.claude/skills/rite-review/reference/feature-scoped-review.md +2 -2
  80. package/pack/.claude/skills/rite-seal/SKILL.md +1 -1
  81. package/pack/.claude/skills/rite-seal/reference/phase-contract.md +1 -1
  82. package/pack/.claude/skills/rite-ship/SKILL.md +2 -2
  83. package/pack/.claude/skills/rite-ship/reference/git-ship.md +2 -2
  84. package/pack/.claude/skills/rite-spec/SKILL.md +8 -5
  85. package/pack/.claude/skills/rite-spec/reference/state-workspace.md +5 -0
  86. package/pack/.claude/skills/rite-temper/SKILL.md +3 -3
  87. package/pack/.claude/skills/rite-vet/SKILL.md +9 -5
  88. package/pack/.claude/skills/rite-vet/reference/review-axes.md +12 -5
  89. package/pack/generated/claude/agents/devrites-proof-runner.md +16 -9
  90. package/pack/generated/claude/skills/devrites-lib/SKILL.md +2 -0
  91. package/pack/generated/claude/skills/devrites-lib/reference/candidate-integrity.md +7 -3
  92. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +3 -0
  93. package/pack/generated/claude/skills/devrites-lib/reference/parallel-workspaces.md +202 -0
  94. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +9 -12
  95. package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +7 -3
  96. package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +1 -1
  97. package/pack/generated/claude/skills/devrites-lib/reference/standards/gates.md +18 -9
  98. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -0
  99. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +13 -10
  100. package/pack/generated/claude/skills/rite-autocomplete/reference/lookahead.md +4 -4
  101. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +13 -9
  102. package/pack/generated/claude/skills/rite-build/SKILL.md +13 -10
  103. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +1 -1
  104. package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +1 -1
  105. package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +60 -39
  106. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +8 -5
  107. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +7 -7
  108. package/pack/generated/claude/skills/rite-clarify/SKILL.md +2 -2
  109. package/pack/generated/claude/skills/rite-converge/SKILL.md +4 -4
  110. package/pack/generated/claude/skills/rite-define/SKILL.md +7 -3
  111. package/pack/generated/claude/skills/rite-define/reference/plan-template.md +4 -2
  112. package/pack/generated/claude/skills/rite-plan/SKILL.md +11 -8
  113. package/pack/generated/claude/skills/rite-plan/reference/dependency-graph.md +9 -2
  114. package/pack/generated/claude/skills/rite-plan/reference/slicing.md +2 -0
  115. package/pack/generated/claude/skills/rite-polish/SKILL.md +3 -3
  116. package/pack/generated/claude/skills/rite-prove/SKILL.md +9 -5
  117. package/pack/generated/claude/skills/rite-resolve/SKILL.md +3 -3
  118. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +2 -0
  119. package/pack/generated/claude/skills/rite-review/SKILL.md +4 -3
  120. package/pack/generated/claude/skills/rite-review/reference/feature-scoped-review.md +2 -2
  121. package/pack/generated/claude/skills/rite-seal/SKILL.md +1 -1
  122. package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +1 -1
  123. package/pack/generated/claude/skills/rite-ship/SKILL.md +2 -2
  124. package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +2 -2
  125. package/pack/generated/claude/skills/rite-spec/SKILL.md +8 -5
  126. package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +5 -0
  127. package/pack/generated/claude/skills/rite-temper/SKILL.md +3 -3
  128. package/pack/generated/claude/skills/rite-vet/SKILL.md +9 -5
  129. package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +12 -5
  130. package/pack/generated/codex/agents/devrites-proof-runner.toml +16 -9
  131. package/pack/generated/codex/skills/devrites-lib/SKILL.md +2 -0
  132. package/pack/generated/codex/skills/devrites-lib/reference/candidate-integrity.md +7 -3
  133. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +3 -0
  134. package/pack/generated/codex/skills/devrites-lib/reference/parallel-workspaces.md +202 -0
  135. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +9 -12
  136. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +7 -3
  137. package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +1 -1
  138. package/pack/generated/codex/skills/devrites-lib/reference/standards/gates.md +18 -9
  139. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -0
  140. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +13 -10
  141. package/pack/generated/codex/skills/rite-autocomplete/reference/lookahead.md +4 -4
  142. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +13 -9
  143. package/pack/generated/codex/skills/rite-build/SKILL.md +13 -10
  144. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +1 -1
  145. package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +1 -1
  146. package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +60 -39
  147. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +8 -5
  148. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +7 -7
  149. package/pack/generated/codex/skills/rite-clarify/SKILL.md +2 -2
  150. package/pack/generated/codex/skills/rite-converge/SKILL.md +4 -4
  151. package/pack/generated/codex/skills/rite-define/SKILL.md +7 -3
  152. package/pack/generated/codex/skills/rite-define/reference/plan-template.md +4 -2
  153. package/pack/generated/codex/skills/rite-plan/SKILL.md +11 -8
  154. package/pack/generated/codex/skills/rite-plan/reference/dependency-graph.md +9 -2
  155. package/pack/generated/codex/skills/rite-plan/reference/slicing.md +2 -0
  156. package/pack/generated/codex/skills/rite-polish/SKILL.md +3 -3
  157. package/pack/generated/codex/skills/rite-prove/SKILL.md +9 -5
  158. package/pack/generated/codex/skills/rite-resolve/SKILL.md +3 -3
  159. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +2 -0
  160. package/pack/generated/codex/skills/rite-review/SKILL.md +4 -3
  161. package/pack/generated/codex/skills/rite-review/reference/feature-scoped-review.md +2 -2
  162. package/pack/generated/codex/skills/rite-seal/SKILL.md +1 -1
  163. package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +1 -1
  164. package/pack/generated/codex/skills/rite-ship/SKILL.md +2 -2
  165. package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +2 -2
  166. package/pack/generated/codex/skills/rite-spec/SKILL.md +8 -5
  167. package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +5 -0
  168. package/pack/generated/codex/skills/rite-temper/SKILL.md +3 -3
  169. package/pack/generated/codex/skills/rite-vet/SKILL.md +9 -5
  170. package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +12 -5
  171. package/pack/generated/devin/agents/devrites-proof-runner.md +16 -9
  172. package/pack/generated/devin/skills/devrites-lib/SKILL.md +2 -0
  173. package/pack/generated/devin/skills/devrites-lib/reference/candidate-integrity.md +7 -3
  174. package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +3 -0
  175. package/pack/generated/devin/skills/devrites-lib/reference/parallel-workspaces.md +202 -0
  176. package/pack/generated/devin/skills/devrites-lib/reference/standards/afk-hitl.md +9 -12
  177. package/pack/generated/devin/skills/devrites-lib/reference/standards/agents.md +7 -3
  178. package/pack/generated/devin/skills/devrites-lib/reference/standards/context-hygiene.md +1 -1
  179. package/pack/generated/devin/skills/devrites-lib/reference/standards/gates.md +18 -9
  180. package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -0
  181. package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +13 -10
  182. package/pack/generated/devin/skills/rite-autocomplete/reference/lookahead.md +4 -4
  183. package/pack/generated/devin/skills/rite-autocomplete/reference/loop.md +13 -9
  184. package/pack/generated/devin/skills/rite-build/SKILL.md +13 -10
  185. package/pack/generated/devin/skills/rite-build/reference/afk-discipline.md +1 -1
  186. package/pack/generated/devin/skills/rite-build/reference/checkpoint.md +1 -1
  187. package/pack/generated/devin/skills/rite-build/reference/parallel-batch.md +60 -39
  188. package/pack/generated/devin/skills/rite-build/reference/phase-contract.md +8 -5
  189. package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +7 -7
  190. package/pack/generated/devin/skills/rite-clarify/SKILL.md +2 -2
  191. package/pack/generated/devin/skills/rite-converge/SKILL.md +4 -4
  192. package/pack/generated/devin/skills/rite-define/SKILL.md +7 -3
  193. package/pack/generated/devin/skills/rite-define/reference/plan-template.md +4 -2
  194. package/pack/generated/devin/skills/rite-plan/SKILL.md +11 -8
  195. package/pack/generated/devin/skills/rite-plan/reference/dependency-graph.md +9 -2
  196. package/pack/generated/devin/skills/rite-plan/reference/slicing.md +2 -0
  197. package/pack/generated/devin/skills/rite-polish/SKILL.md +3 -3
  198. package/pack/generated/devin/skills/rite-prove/SKILL.md +9 -5
  199. package/pack/generated/devin/skills/rite-resolve/SKILL.md +3 -3
  200. package/pack/generated/devin/skills/rite-resolve/reference/answer-protocol.md +2 -0
  201. package/pack/generated/devin/skills/rite-review/SKILL.md +4 -3
  202. package/pack/generated/devin/skills/rite-review/reference/feature-scoped-review.md +2 -2
  203. package/pack/generated/devin/skills/rite-seal/SKILL.md +1 -1
  204. package/pack/generated/devin/skills/rite-seal/reference/phase-contract.md +1 -1
  205. package/pack/generated/devin/skills/rite-ship/SKILL.md +2 -2
  206. package/pack/generated/devin/skills/rite-ship/reference/git-ship.md +2 -2
  207. package/pack/generated/devin/skills/rite-spec/SKILL.md +8 -5
  208. package/pack/generated/devin/skills/rite-spec/reference/state-workspace.md +5 -0
  209. package/pack/generated/devin/skills/rite-temper/SKILL.md +3 -3
  210. package/pack/generated/devin/skills/rite-vet/SKILL.md +9 -5
  211. package/pack/generated/devin/skills/rite-vet/reference/review-axes.md +12 -5
  212. package/pack/generated/dsh/agents/devrites-proof-runner.md +16 -9
  213. package/pack/generated/dsh/runtime/cordis.patch.yml +1 -1
  214. package/pack/generated/dsh/skills/devrites-lib/SKILL.md +2 -0
  215. package/pack/generated/dsh/skills/devrites-lib/reference/candidate-integrity.md +7 -3
  216. package/pack/generated/dsh/skills/devrites-lib/reference/parallel-dispatch.md +3 -0
  217. package/pack/generated/dsh/skills/devrites-lib/reference/parallel-workspaces.md +202 -0
  218. package/pack/generated/dsh/skills/devrites-lib/reference/standards/afk-hitl.md +9 -12
  219. package/pack/generated/dsh/skills/devrites-lib/reference/standards/agents.md +7 -3
  220. package/pack/generated/dsh/skills/devrites-lib/reference/standards/context-hygiene.md +1 -1
  221. package/pack/generated/dsh/skills/devrites-lib/reference/standards/gates.md +18 -9
  222. package/pack/generated/dsh/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -0
  223. package/pack/generated/dsh/skills/rite-autocomplete/SKILL.md +13 -10
  224. package/pack/generated/dsh/skills/rite-autocomplete/reference/lookahead.md +4 -4
  225. package/pack/generated/dsh/skills/rite-autocomplete/reference/loop.md +13 -9
  226. package/pack/generated/dsh/skills/rite-build/SKILL.md +13 -10
  227. package/pack/generated/dsh/skills/rite-build/reference/afk-discipline.md +1 -1
  228. package/pack/generated/dsh/skills/rite-build/reference/checkpoint.md +1 -1
  229. package/pack/generated/dsh/skills/rite-build/reference/parallel-batch.md +60 -39
  230. package/pack/generated/dsh/skills/rite-build/reference/phase-contract.md +8 -5
  231. package/pack/generated/dsh/skills/rite-build/reference/wright-dispatch.md +7 -7
  232. package/pack/generated/dsh/skills/rite-clarify/SKILL.md +2 -2
  233. package/pack/generated/dsh/skills/rite-converge/SKILL.md +4 -4
  234. package/pack/generated/dsh/skills/rite-define/SKILL.md +7 -3
  235. package/pack/generated/dsh/skills/rite-define/reference/plan-template.md +4 -2
  236. package/pack/generated/dsh/skills/rite-plan/SKILL.md +11 -8
  237. package/pack/generated/dsh/skills/rite-plan/reference/dependency-graph.md +9 -2
  238. package/pack/generated/dsh/skills/rite-plan/reference/slicing.md +2 -0
  239. package/pack/generated/dsh/skills/rite-polish/SKILL.md +3 -3
  240. package/pack/generated/dsh/skills/rite-prove/SKILL.md +9 -5
  241. package/pack/generated/dsh/skills/rite-resolve/SKILL.md +3 -3
  242. package/pack/generated/dsh/skills/rite-resolve/reference/answer-protocol.md +2 -0
  243. package/pack/generated/dsh/skills/rite-review/SKILL.md +4 -3
  244. package/pack/generated/dsh/skills/rite-review/reference/feature-scoped-review.md +2 -2
  245. package/pack/generated/dsh/skills/rite-seal/SKILL.md +1 -1
  246. package/pack/generated/dsh/skills/rite-seal/reference/phase-contract.md +1 -1
  247. package/pack/generated/dsh/skills/rite-ship/SKILL.md +2 -2
  248. package/pack/generated/dsh/skills/rite-ship/reference/git-ship.md +2 -2
  249. package/pack/generated/dsh/skills/rite-spec/SKILL.md +8 -5
  250. package/pack/generated/dsh/skills/rite-spec/reference/state-workspace.md +5 -0
  251. package/pack/generated/dsh/skills/rite-temper/SKILL.md +3 -3
  252. package/pack/generated/dsh/skills/rite-vet/SKILL.md +9 -5
  253. package/pack/generated/dsh/skills/rite-vet/reference/review-axes.md +12 -5
  254. package/pack/generated/omp/agents/devrites-proof-runner.md +16 -9
  255. package/pack/generated/omp/commands/rite-build.md +1 -1
  256. package/pack/generated/omp/skills/devrites-lib/SKILL.md +2 -0
  257. package/pack/generated/omp/skills/devrites-lib/reference/candidate-integrity.md +7 -3
  258. package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +3 -0
  259. package/pack/generated/omp/skills/devrites-lib/reference/parallel-workspaces.md +202 -0
  260. package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +9 -12
  261. package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +11 -3
  262. package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +1 -1
  263. package/pack/generated/omp/skills/devrites-lib/reference/standards/gates.md +18 -9
  264. package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -0
  265. package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +13 -10
  266. package/pack/generated/omp/skills/rite-autocomplete/reference/lookahead.md +4 -4
  267. package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +13 -9
  268. package/pack/generated/omp/skills/rite-build/SKILL.md +13 -10
  269. package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +1 -1
  270. package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +1 -1
  271. package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +60 -39
  272. package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +8 -5
  273. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +7 -7
  274. package/pack/generated/omp/skills/rite-clarify/SKILL.md +2 -2
  275. package/pack/generated/omp/skills/rite-converge/SKILL.md +4 -4
  276. package/pack/generated/omp/skills/rite-define/SKILL.md +7 -3
  277. package/pack/generated/omp/skills/rite-define/reference/plan-template.md +4 -2
  278. package/pack/generated/omp/skills/rite-plan/SKILL.md +11 -8
  279. package/pack/generated/omp/skills/rite-plan/reference/dependency-graph.md +9 -2
  280. package/pack/generated/omp/skills/rite-plan/reference/slicing.md +2 -0
  281. package/pack/generated/omp/skills/rite-polish/SKILL.md +3 -3
  282. package/pack/generated/omp/skills/rite-prove/SKILL.md +9 -5
  283. package/pack/generated/omp/skills/rite-resolve/SKILL.md +3 -3
  284. package/pack/generated/omp/skills/rite-resolve/reference/answer-protocol.md +2 -0
  285. package/pack/generated/omp/skills/rite-review/SKILL.md +4 -3
  286. package/pack/generated/omp/skills/rite-review/reference/feature-scoped-review.md +2 -2
  287. package/pack/generated/omp/skills/rite-seal/SKILL.md +1 -1
  288. package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +1 -1
  289. package/pack/generated/omp/skills/rite-ship/SKILL.md +2 -2
  290. package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +2 -2
  291. package/pack/generated/omp/skills/rite-spec/SKILL.md +8 -5
  292. package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +5 -0
  293. package/pack/generated/omp/skills/rite-temper/SKILL.md +3 -3
  294. package/pack/generated/omp/skills/rite-vet/SKILL.md +9 -5
  295. package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +12 -5
  296. package/pack/generated/pi/agents/devrites-proof-runner.md +16 -9
  297. package/pack/generated/pi/prompts/rite-build.md +1 -1
  298. package/pack/generated/pi/skills/devrites-lib/SKILL.md +2 -0
  299. package/pack/generated/pi/skills/devrites-lib/reference/candidate-integrity.md +7 -3
  300. package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +3 -0
  301. package/pack/generated/pi/skills/devrites-lib/reference/parallel-workspaces.md +202 -0
  302. package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +9 -12
  303. package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +7 -3
  304. package/pack/generated/pi/skills/devrites-lib/reference/standards/context-hygiene.md +1 -1
  305. package/pack/generated/pi/skills/devrites-lib/reference/standards/gates.md +18 -9
  306. package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -0
  307. package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +13 -10
  308. package/pack/generated/pi/skills/rite-autocomplete/reference/lookahead.md +4 -4
  309. package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +13 -9
  310. package/pack/generated/pi/skills/rite-build/SKILL.md +13 -10
  311. package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +1 -1
  312. package/pack/generated/pi/skills/rite-build/reference/checkpoint.md +1 -1
  313. package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +60 -39
  314. package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +8 -5
  315. package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +7 -7
  316. package/pack/generated/pi/skills/rite-clarify/SKILL.md +2 -2
  317. package/pack/generated/pi/skills/rite-converge/SKILL.md +4 -4
  318. package/pack/generated/pi/skills/rite-define/SKILL.md +7 -3
  319. package/pack/generated/pi/skills/rite-define/reference/plan-template.md +4 -2
  320. package/pack/generated/pi/skills/rite-plan/SKILL.md +11 -8
  321. package/pack/generated/pi/skills/rite-plan/reference/dependency-graph.md +9 -2
  322. package/pack/generated/pi/skills/rite-plan/reference/slicing.md +2 -0
  323. package/pack/generated/pi/skills/rite-polish/SKILL.md +3 -3
  324. package/pack/generated/pi/skills/rite-prove/SKILL.md +9 -5
  325. package/pack/generated/pi/skills/rite-resolve/SKILL.md +3 -3
  326. package/pack/generated/pi/skills/rite-resolve/reference/answer-protocol.md +2 -0
  327. package/pack/generated/pi/skills/rite-review/SKILL.md +4 -3
  328. package/pack/generated/pi/skills/rite-review/reference/feature-scoped-review.md +2 -2
  329. package/pack/generated/pi/skills/rite-seal/SKILL.md +1 -1
  330. package/pack/generated/pi/skills/rite-seal/reference/phase-contract.md +1 -1
  331. package/pack/generated/pi/skills/rite-ship/SKILL.md +2 -2
  332. package/pack/generated/pi/skills/rite-ship/reference/git-ship.md +2 -2
  333. package/pack/generated/pi/skills/rite-spec/SKILL.md +8 -5
  334. package/pack/generated/pi/skills/rite-spec/reference/state-workspace.md +5 -0
  335. package/pack/generated/pi/skills/rite-temper/SKILL.md +3 -3
  336. package/pack/generated/pi/skills/rite-vet/SKILL.md +9 -5
  337. package/pack/generated/pi/skills/rite-vet/reference/review-axes.md +12 -5
  338. package/package.json +1 -1
  339. package/scripts/build-host-artifacts.sh +5 -6
  340. package/scripts/omp-generate.sh +24 -14
@@ -0,0 +1,232 @@
1
+ package parallel
2
+
3
+ import (
4
+ "fmt"
5
+ "reflect"
6
+ "strings"
7
+ )
8
+
9
+ // landing is written before FF and retained afterward as the exact retry receipt.
10
+ // Worker transfers are rewritten on control; ancestry is not landing evidence.
11
+ type landing struct {
12
+ BatchID string `json:"batch_id"`
13
+ Controller string `json:"controller"`
14
+ Checkout string `json:"checkout"`
15
+ Ref string `json:"ref"`
16
+ PriorTip string `json:"prior_tip"`
17
+ NewTip string `json:"new_tip"`
18
+ Slice string `json:"slice,omitempty"`
19
+ Targets []LeaseSlice `json:"targets"`
20
+ }
21
+
22
+ func validateLanding(lease *Lease, record *landing, accepted bool) error {
23
+ if record == nil {
24
+ return nil
25
+ }
26
+ if record.BatchID != lease.BatchID || validateSlug(record.Controller) != nil || record.Checkout == "" || record.Ref == "" || len(record.PriorTip) != 40 || !shaRE.MatchString(record.PriorTip) || len(record.NewTip) != 40 || !shaRE.MatchString(record.NewTip) || record.PriorTip == record.NewTip || len(record.Targets) == 0 {
27
+ return fmt.Errorf("invalid landing identity")
28
+ }
29
+ if lease.ControlCheckout != record.Checkout || lease.ControlRef != record.Ref {
30
+ return fmt.Errorf("landing controller identity differs from lease")
31
+ }
32
+ seen := map[string]bool{}
33
+ for _, target := range record.Targets {
34
+ key := SliceKey(target.Workspace, target.ID)
35
+ if seen[key] || len(target.TransferCommit) != 40 || !shaRE.MatchString(target.TransferCommit) || target.WrightStatus != WrightGreen {
36
+ return fmt.Errorf("invalid landing target %s", key)
37
+ }
38
+ seen[key] = true
39
+ found := false
40
+ for _, sl := range lease.Slices {
41
+ if SliceKey(sl.Workspace, sl.ID) != key {
42
+ continue
43
+ }
44
+ if accepted {
45
+ if sl.WrightStatus != WrightIntegrated {
46
+ return fmt.Errorf("accepted landing target %s is not integrated", key)
47
+ }
48
+ sl.WrightStatus = WrightGreen
49
+ }
50
+ if !reflect.DeepEqual(sl, target) {
51
+ return fmt.Errorf("landing target %s changed", key)
52
+ }
53
+ found = true
54
+ break
55
+ }
56
+ if !found {
57
+ return fmt.Errorf("landing target %s missing", key)
58
+ }
59
+ }
60
+ if record.Slice != "" && (len(record.Targets) != 1 || SliceKey(record.Targets[0].Workspace, record.Targets[0].ID) != record.Slice) {
61
+ return fmt.Errorf("landing selector differs from targets")
62
+ }
63
+ if !accepted && !strings.HasPrefix(strings.ToLower(record.PriorTip), strings.ToLower(expectedControl(lease))) {
64
+ return fmt.Errorf("pending landing prior tip differs from lease")
65
+ }
66
+ if accepted && lease.ControlTip != record.NewTip {
67
+ return fmt.Errorf("accepted landing tip differs from lease")
68
+ }
69
+ return nil
70
+ }
71
+
72
+ func controlIdentity(root string) (string, string, error) {
73
+ ref, err := git(root, "symbolic-ref", "--quiet", "HEAD")
74
+ if err != nil {
75
+ if !strings.Contains(err.Error(), "exit 1") {
76
+ return "", "", err
77
+ }
78
+ ref = "HEAD"
79
+ }
80
+ return resolvedPath(root), ref, nil
81
+ }
82
+
83
+ func ensureControllerIdentity(root string, lease *Lease) error {
84
+ if lease.ControlCheckout == "" && lease.ControlRef == "" {
85
+ return nil // Legacy leases have no historical checkout/ref evidence.
86
+ }
87
+ checkout, ref, err := controlIdentity(root)
88
+ if err != nil {
89
+ return err
90
+ }
91
+ if checkout != lease.ControlCheckout || ref != lease.ControlRef {
92
+ return fmt.Errorf("control checkout/ref changed; expected %s %s, have %s %s", lease.ControlCheckout, lease.ControlRef, checkout, ref)
93
+ }
94
+ return nil
95
+ }
96
+
97
+ // recoverLanding runs under controller + feature locks. Only integrate may
98
+ // perform a prepared FF; abort may cancel exact-prior preparation instead.
99
+ func recoverLanding(root, slug, path string, lease *Lease, resume, cancel bool) (*landing, error) {
100
+ if err := ensureControllerIdentity(root, lease); err != nil {
101
+ return nil, err
102
+ }
103
+ record := lease.PendingLanding
104
+ if record == nil {
105
+ return nil, nil
106
+ }
107
+ if record.Controller != slug {
108
+ return nil, fmt.Errorf("pending landing controller changed")
109
+ }
110
+ if err := validateLanding(lease, record, false); err != nil {
111
+ return nil, err
112
+ }
113
+ prior, err := revParse(root, expectedControl(lease))
114
+ if err != nil {
115
+ return nil, err
116
+ }
117
+ if prior != record.PriorTip {
118
+ return nil, fmt.Errorf("pending landing resolved prior tip differs from lease")
119
+ }
120
+ head, err := headSHA(root)
121
+ if err != nil {
122
+ return nil, err
123
+ }
124
+ switch head {
125
+ case record.PriorTip:
126
+ if cancel {
127
+ lease.PendingLanding = nil
128
+ return nil, writeLease(path, lease)
129
+ }
130
+ if !resume {
131
+ return nil, fmt.Errorf("pending landing requires integrate --apply-to-control or abort before mutation")
132
+ }
133
+ var paths []string
134
+ for _, target := range record.Targets {
135
+ paths = append(paths, target.Paths...)
136
+ }
137
+ dirty, err := porcelainDirtyPaths(root, paths)
138
+ if err != nil {
139
+ return nil, err
140
+ }
141
+ if dirty {
142
+ return nil, fmt.Errorf("control has uncommitted changes on pending landing paths")
143
+ }
144
+ mergeErr := mergeFFOnly(root, record.NewTip)
145
+ // A post-merge hook may fail after the ref already advanced.
146
+ head, err = headSHA(root)
147
+ if err != nil {
148
+ return nil, err
149
+ }
150
+ if err := ensureControllerIdentity(root, lease); err != nil {
151
+ return nil, err
152
+ }
153
+ if head != record.NewTip {
154
+ return nil, fmt.Errorf("pending landing fast-forward did not reach exact recorded tip (HEAD=%s): %v", head, mergeErr)
155
+ }
156
+ case record.NewTip:
157
+ default:
158
+ return nil, fmt.Errorf("pending landing refuses external control tip %s; expected exactly %s or %s", head, record.PriorTip, record.NewTip)
159
+ }
160
+ for i := range lease.Slices {
161
+ for _, target := range record.Targets {
162
+ if SliceKey(lease.Slices[i].Workspace, lease.Slices[i].ID) == SliceKey(target.Workspace, target.ID) {
163
+ lease.Slices[i].WrightStatus = WrightIntegrated
164
+ }
165
+ }
166
+ }
167
+ lease.ControlTip = record.NewTip
168
+ lease.Status = StatusRunning
169
+ if len(activeSlices(lease)) == 0 {
170
+ lease.Status = StatusComplete
171
+ }
172
+ lease.PendingLanding = nil
173
+ lease.LastLanding = record
174
+ if err := writeLease(path, lease); err != nil {
175
+ return nil, fmt.Errorf("control landed at %s; persist landing recovery before further mutation: %w", record.NewTip, err)
176
+ }
177
+ return record, nil
178
+ }
179
+
180
+ func acceptedRetry(root string, lease *Lease, selector string) (string, error) {
181
+ record := lease.LastLanding
182
+ if record == nil || record.Slice != selector {
183
+ return "", nil
184
+ }
185
+ if err := ensureControllerIdentity(root, lease); err != nil {
186
+ return "", err
187
+ }
188
+ if err := ensureControlAtBase(root, record.NewTip); err != nil {
189
+ return "", err
190
+ }
191
+ if err := validateLanding(lease, record, true); err != nil {
192
+ return "", err
193
+ }
194
+ // An all-slice request after refill is new work, not the old all-slice retry.
195
+ if selector == "" && len(activeSlices(lease)) != 0 {
196
+ return "", nil
197
+ }
198
+ return record.NewTip, nil
199
+ }
200
+
201
+ func protectRawLease(current, next *Lease) error {
202
+ if current == nil {
203
+ if next.PendingLanding != nil || next.LastLanding != nil {
204
+ return fmt.Errorf("lease-write cannot fabricate landing evidence")
205
+ }
206
+ return nil
207
+ }
208
+ if current.PendingLanding != nil {
209
+ if !reflect.DeepEqual(current, next) {
210
+ return fmt.Errorf("lease-write refuses mutation during pending landing; recover integrate or abort first")
211
+ }
212
+ return nil
213
+ }
214
+ if next.PendingLanding != nil || !reflect.DeepEqual(current.LastLanding, next.LastLanding) || current.ControlCheckout != next.ControlCheckout || current.ControlRef != next.ControlRef {
215
+ return fmt.Errorf("lease-write cannot change landing evidence or controller identity")
216
+ }
217
+ for _, sl := range current.Slices {
218
+ if sl.WrightStatus != WrightIntegrated {
219
+ continue
220
+ }
221
+ found := false
222
+ for _, candidate := range next.Slices {
223
+ if SliceKey(sl.Workspace, sl.ID) == SliceKey(candidate.Workspace, candidate.ID) && reflect.DeepEqual(sl, candidate) {
224
+ found = true
225
+ }
226
+ }
227
+ if !found {
228
+ return fmt.Errorf("lease-write cannot change integrated slice %s", SliceKey(sl.Workspace, sl.ID))
229
+ }
230
+ }
231
+ return nil
232
+ }
@@ -26,7 +26,7 @@ const (
26
26
  // control; it no longer holds a parallel slot.
27
27
  WrightIntegrated = "integrated"
28
28
 
29
- MinParallelSlices = 2
29
+ MinParallelSlices = 1
30
30
  MaxParallelSlices = 10
31
31
  )
32
32
 
@@ -46,7 +46,12 @@ type Lease struct {
46
46
  CreatedAt string `json:"created_at"`
47
47
  BaseSHA string `json:"base_sha"`
48
48
  ControlTip string `json:"control_tip,omitempty"`
49
+ ControlCheckout string `json:"control_checkout,omitempty"`
50
+ ControlRef string `json:"control_ref,omitempty"`
51
+ PendingLanding *landing `json:"pending_landing,omitempty"`
52
+ LastLanding *landing `json:"last_landing,omitempty"`
49
53
  N int `json:"n"`
54
+ Capacity int `json:"capacity,omitempty"`
50
55
  Status string `json:"status"`
51
56
  ControlPIDOrSession string `json:"control_pid_or_session"`
52
57
  Slices []LeaseSlice `json:"slices"`
@@ -57,6 +62,7 @@ type Lease struct {
57
62
  // from the original create).
58
63
  type LeaseSlice struct {
59
64
  ID string `json:"id"`
65
+ Workspace string `json:"workspace,omitempty"`
60
66
  Paths []string `json:"paths"`
61
67
  WorktreePath string `json:"worktree_path"`
62
68
  Branch string `json:"branch"`
@@ -87,7 +93,7 @@ func activeSlices(lease *Lease) []SlicePaths {
87
93
  var active []SlicePaths
88
94
  for _, sl := range lease.Slices {
89
95
  if sl.WrightStatus != WrightIntegrated {
90
- active = append(active, SlicePaths{ID: sl.ID, Paths: sl.Paths})
96
+ active = append(active, SlicePaths{ID: sl.ID, Workspace: sl.Workspace, Paths: sl.Paths})
91
97
  }
92
98
  }
93
99
  return active
@@ -112,17 +118,64 @@ func IntegrateBranchName(slug, batchID string) string {
112
118
  return fmt.Sprintf("devrites/parallel/%s/%s/integrate", slug, batchID)
113
119
  }
114
120
 
115
- // ownedBranchName reports whether branch is inside this batch's namespace —
116
- // devrites/parallel/<slug>/<batch>/…. Cleanup deletes only owned branches;
117
- // a lease naming anything else (e.g. a forged "main") is left alone.
118
- func ownedBranchName(slug, batchID, branch string) bool {
119
- return strings.HasPrefix(branch, fmt.Sprintf("devrites/parallel/%s/%s/", slug, batchID))
120
- }
121
-
122
121
  func WorkerWorktreePath(repoRoot, batchID, sliceID string) string {
123
122
  return filepath.Join(ScratchRoot(repoRoot), batchID, sliceID)
124
123
  }
125
124
 
125
+ func workerBranch(slug, batchID, workspace, id string) string {
126
+ if workspace != "" {
127
+ return WorkerBranch(slug, batchID, "_workspaces/"+workspace+"/"+id)
128
+ }
129
+ return WorkerBranch(slug, batchID, id)
130
+ }
131
+
132
+ func workerWorktreePath(root, batchID, workspace, id string) string {
133
+ if workspace != "" {
134
+ return filepath.Join(ScratchRoot(root), batchID, "_workspaces", workspace, id)
135
+ }
136
+ return WorkerWorktreePath(root, batchID, id)
137
+ }
138
+
139
+ func leaseCapacity(lease *Lease) int {
140
+ if lease.Capacity == 0 {
141
+ return MaxParallelSlices
142
+ }
143
+ return lease.Capacity
144
+ }
145
+
146
+ func validateCapacity(capacity int) error {
147
+ if capacity < 0 || capacity > MaxParallelSlices {
148
+ return fmt.Errorf("cap must be 1-%d (got %d)", MaxParallelSlices, capacity)
149
+ }
150
+ return nil
151
+ }
152
+
153
+ func normalizeLease(lease *Lease, controller string) error {
154
+ for i := range lease.Slices {
155
+ if lease.Slices[i].Workspace == controller {
156
+ lease.Slices[i].Workspace = ""
157
+ }
158
+ }
159
+ return ValidateLease(lease)
160
+ }
161
+
162
+ func normalizeSliceRef(controller, ref string) (string, error) {
163
+ workspace, id, qualified := strings.Cut(ref, "/")
164
+ if !qualified {
165
+ return ref, validateSliceID(ref)
166
+ }
167
+ if err := validateSlug(workspace); err != nil {
168
+ return "", err
169
+ }
170
+ if err := validateSliceID(id); err != nil {
171
+ return "", err
172
+ }
173
+ if workspace == controller {
174
+ workspace = ""
175
+ }
176
+ return SliceKey(workspace, id), nil
177
+ }
178
+
126
179
  func validateSlug(slug string) error {
127
180
  if !slugRE.MatchString(slug) {
128
181
  return fmt.Errorf("invalid slug %q", slug)
@@ -177,8 +230,11 @@ func ValidateLease(lease *Lease) error {
177
230
  if len(lease.Slices) < MinParallelSlices {
178
231
  return checkParallelSliceCount(len(lease.Slices))
179
232
  }
180
- if active := len(activeSlices(lease)); active > MaxParallelSlices {
181
- return fmt.Errorf("parallel requires %d-%d slices active at once (got %d)", MinParallelSlices, MaxParallelSlices, active)
233
+ if err := validateCapacity(lease.Capacity); err != nil {
234
+ return err
235
+ }
236
+ if active := len(activeSlices(lease)); active > leaseCapacity(lease) {
237
+ return fmt.Errorf("parallel requires %d-%d slices active at once (got %d)", MinParallelSlices, leaseCapacity(lease), active)
182
238
  }
183
239
  if lease.N != len(lease.Slices) {
184
240
  return fmt.Errorf("lease n=%d does not match slices=%d", lease.N, len(lease.Slices))
@@ -188,25 +244,37 @@ func ValidateLease(lease *Lease) error {
188
244
  if err := validateSliceID(sl.ID); err != nil {
189
245
  return fmt.Errorf("slice %d: %w", i, err)
190
246
  }
191
- if _, ok := seen[sl.ID]; ok {
192
- return fmt.Errorf("duplicate slice id %q", sl.ID)
247
+ if sl.Workspace != "" {
248
+ if err := validateSlug(sl.Workspace); err != nil {
249
+ return fmt.Errorf("slice %d: %w", i, err)
250
+ }
193
251
  }
194
- seen[sl.ID] = struct{}{}
195
- if _, err := validateSlicePaths(sl.Paths, fmt.Sprintf("slice %q", sl.ID), ""); err != nil {
252
+ key := SliceKey(sl.Workspace, sl.ID)
253
+ if _, ok := seen[key]; ok {
254
+ return fmt.Errorf("duplicate slice id %q", key)
255
+ }
256
+ seen[key] = struct{}{}
257
+ if _, err := validateSlicePaths(sl.Paths, fmt.Sprintf("slice %q", key), ""); err != nil {
196
258
  return err
197
259
  }
198
260
  switch sl.WrightStatus {
199
261
  case "", WrightPending, WrightGreen, WrightRed, WrightGap, WrightIntegrated:
200
262
  default:
201
- return fmt.Errorf("slice %q: invalid wright_status %q", sl.ID, sl.WrightStatus)
263
+ return fmt.Errorf("slice %q: invalid wright_status %q", key, sl.WrightStatus)
202
264
  }
203
265
  if sl.TransferCommit != "" && !shaRE.MatchString(sl.TransferCommit) {
204
- return fmt.Errorf("slice %q: invalid transfer_commit %q", sl.ID, sl.TransferCommit)
266
+ return fmt.Errorf("slice %q: invalid transfer_commit %q", key, sl.TransferCommit)
205
267
  }
206
268
  if sl.BaseSHA != "" && !shaRE.MatchString(sl.BaseSHA) {
207
- return fmt.Errorf("slice %q: invalid base_sha %q", sl.ID, sl.BaseSHA)
269
+ return fmt.Errorf("slice %q: invalid base_sha %q", key, sl.BaseSHA)
208
270
  }
209
271
  }
272
+ if err := validateLanding(lease, lease.PendingLanding, false); err != nil {
273
+ return err
274
+ }
275
+ if err := validateLanding(lease, lease.LastLanding, true); err != nil {
276
+ return err
277
+ }
210
278
  return nil
211
279
  }
212
280
 
@@ -228,11 +296,17 @@ func EmitLeaseMarkdown(lease *Lease) (string, error) {
228
296
  fmt.Fprintf(&b, "control_tip: %s\n", yamlQuote(lease.ControlTip))
229
297
  }
230
298
  fmt.Fprintf(&b, "n: %d\n", lease.N)
299
+ if lease.Capacity != 0 {
300
+ fmt.Fprintf(&b, "capacity: %d\n", lease.Capacity)
301
+ }
231
302
  fmt.Fprintf(&b, "status: %s\n", yamlQuote(lease.Status))
232
303
  fmt.Fprintf(&b, "control_pid_or_session: %s\n", yamlQuote(lease.ControlPIDOrSession))
233
304
  b.WriteString("slices:\n")
234
305
  for _, sl := range lease.Slices {
235
306
  fmt.Fprintf(&b, " - id: %s\n", yamlQuote(sl.ID))
307
+ if sl.Workspace != "" {
308
+ fmt.Fprintf(&b, " workspace: %s\n", yamlQuote(sl.Workspace))
309
+ }
236
310
  if len(sl.Paths) == 0 {
237
311
  b.WriteString(" paths: []\n")
238
312
  } else {
@@ -299,6 +373,11 @@ func ReadLease(path string) (*Lease, error) {
299
373
  }
300
374
 
301
375
  func ClearLease(path string) error {
376
+ if lease, err := ReadLease(path); err == nil && lease.PendingLanding != nil {
377
+ return fmt.Errorf("lease-clear refuses pending landing; recover with integrate --apply-to-control or abort")
378
+ } else if err != nil && !os.IsNotExist(err) {
379
+ return err
380
+ }
302
381
  err := os.Remove(path)
303
382
  if err != nil && !os.IsNotExist(err) {
304
383
  return err