devrites 5.14.3 → 6.0.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 (716) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/NOTICE.md +6 -4
  3. package/README.md +77 -16
  4. package/SECURITY.md +25 -11
  5. package/bin/devrites.mjs +49 -15
  6. package/docs/adr/0001-go-engine-as-control-plane.md +6 -3
  7. package/docs/adr/0029-v5-workspace-schema-and-native-migration.md +9 -0
  8. package/docs/adr/README.md +3 -2
  9. package/docs/agents/issue-tracker.md +1 -1
  10. package/docs/architecture.md +6 -3
  11. package/docs/cli.md +32 -9
  12. package/docs/command-map.md +5 -3
  13. package/docs/engine/state-schema.md +1 -1
  14. package/docs/flow.md +1 -1
  15. package/docs/harness-compliance.md +2 -2
  16. package/docs/release.md +15 -11
  17. package/docs/usage.md +1 -1
  18. package/engine/commands.go +1 -1
  19. package/engine/go.mod +1 -1
  20. package/engine/help.go +41 -15
  21. package/engine/help_test.go +134 -0
  22. package/engine/internal/acceptance/acceptance_test.go +298 -7
  23. package/engine/internal/acceptance/approve.go +7 -2
  24. package/engine/internal/acceptance/cli.go +3 -0
  25. package/engine/internal/acceptance/evidence.go +69 -5
  26. package/engine/internal/acceptance/lint.go +1 -1
  27. package/engine/internal/acceptance/run.go +5 -3
  28. package/engine/internal/acceptance/scaffold.go +5 -16
  29. package/engine/internal/devritespaths/paths.go +7 -6
  30. package/engine/internal/devritespaths/paths_test.go +18 -0
  31. package/engine/internal/fsutil/copy.go +83 -49
  32. package/engine/internal/fsutil/copy_test.go +70 -109
  33. package/engine/internal/gate/gate.go +89 -16
  34. package/engine/internal/gate/gate_test.go +101 -0
  35. package/engine/internal/hostpack/hostpack.go +52 -2
  36. package/engine/internal/hostpack/hostpack_test.go +83 -2
  37. package/engine/internal/install/apply.go +59 -16
  38. package/engine/internal/install/binary.go +10 -1
  39. package/engine/internal/install/install_test.go +428 -0
  40. package/engine/internal/install/merge.go +69 -38
  41. package/engine/internal/install/preflight.go +7 -0
  42. package/engine/internal/install/uninstall.go +43 -4
  43. package/engine/internal/lib/claims.go +25 -4
  44. package/engine/internal/lib/claims_test.go +57 -0
  45. package/engine/internal/lib/closeout.go +41 -3
  46. package/engine/internal/lib/closeout_test.go +144 -0
  47. package/engine/internal/lib/context.go +8 -4
  48. package/engine/internal/lib/context_next_test.go +100 -0
  49. package/engine/internal/lib/detect.go +1 -1
  50. package/engine/internal/lib/detect_test.go +13 -0
  51. package/engine/internal/lib/diffscope.go +19 -9
  52. package/engine/internal/lib/dispatch.go +7 -0
  53. package/engine/internal/lib/dup.go +40 -37
  54. package/engine/internal/lib/dup_test.go +178 -0
  55. package/engine/internal/lib/manifest_union.go +4 -1
  56. package/engine/internal/lib/manifest_union_test.go +37 -0
  57. package/engine/internal/lib/metrics.go +4 -0
  58. package/engine/internal/lib/metrics_test.go +28 -0
  59. package/engine/internal/lib/migrate_test.go +59 -0
  60. package/engine/internal/lib/observe_budgets.go +25 -9
  61. package/engine/internal/lib/observe_budgets_test.go +254 -0
  62. package/engine/internal/lib/observe_summary.go +23 -2
  63. package/engine/internal/lib/open_visual.go +4 -2
  64. package/engine/internal/lib/open_visual_test.go +11 -0
  65. package/engine/internal/lib/regression.go +62 -23
  66. package/engine/internal/lib/regression_test.go +103 -0
  67. package/engine/internal/lib/resolve.go +36 -17
  68. package/engine/internal/lib/resolve_remediation_test.go +132 -0
  69. package/engine/internal/lib/skilltrust.go +0 -11
  70. package/engine/internal/lib/slicecheck.go +7 -5
  71. package/engine/internal/lib/slicecheck_test.go +18 -0
  72. package/engine/internal/lib/triggers.go +9 -3
  73. package/engine/internal/lib/triggers_test.go +23 -0
  74. package/engine/internal/lib/util.go +17 -3
  75. package/engine/internal/lib/util_test.go +104 -0
  76. package/engine/internal/lib/visual_outline.go +7 -3
  77. package/engine/internal/lib/visual_outline_test.go +28 -0
  78. package/engine/internal/lib/windows.go +13 -9
  79. package/engine/internal/lib/windows_test.go +98 -0
  80. package/engine/internal/lib/workspace_read.go +2 -11
  81. package/engine/internal/lib/workspace_read_test.go +102 -0
  82. package/engine/internal/markdowntext/markdowntext.go +194 -11
  83. package/engine/internal/markdowntext/testdata/structural.json +250 -0
  84. package/engine/internal/notes/cli.go +30 -12
  85. package/engine/internal/notes/notes.go +242 -39
  86. package/engine/internal/notes/notes_test.go +372 -0
  87. package/engine/internal/overhaul/admit/packet.go +89 -0
  88. package/engine/internal/overhaul/admit/packet_test.go +223 -0
  89. package/engine/internal/overhaul/admit/run.go +4 -0
  90. package/engine/internal/overhaul/bench/run.go +6 -0
  91. package/engine/internal/overhaul/bench/run_test.go +46 -0
  92. package/engine/internal/overhaul/overhaul.go +6 -1
  93. package/engine/internal/overhaul/ovio/ovio.go +10 -3
  94. package/engine/internal/overhaul/ovio/ovio_test.go +75 -0
  95. package/engine/internal/overhaul/packet/packet.go +208 -0
  96. package/engine/internal/overhaul/packet/packet_test.go +263 -0
  97. package/engine/internal/overhaul/records/check.go +6 -0
  98. package/engine/internal/overhaul/records/init.go +16 -5
  99. package/engine/internal/overhaul/records/records_test.go +4 -0
  100. package/engine/internal/overhaul/records/run.go +66 -0
  101. package/engine/internal/overhaul/records/run_test.go +77 -0
  102. package/engine/internal/overhaul/render/run.go +15 -11
  103. package/engine/internal/overhaul/render/run_test.go +463 -1
  104. package/engine/internal/overhaul/render/visual.go +95 -33
  105. package/engine/internal/overhaul/score/run.go +20 -0
  106. package/engine/internal/overhaul/score/run_test.go +156 -1
  107. package/engine/internal/overhaul/snapshot/run.go +78 -21
  108. package/engine/internal/overhaul/snapshot/run_test.go +344 -8
  109. package/engine/internal/parallel/cli.go +33 -20
  110. package/engine/internal/parallel/cli_test.go +59 -0
  111. package/engine/internal/parallel/git.go +39 -1
  112. package/engine/internal/parallel/ops.go +101 -11
  113. package/engine/internal/parallel/ops_test.go +552 -69
  114. package/engine/internal/parallel/parallel_test.go +31 -1
  115. package/engine/internal/parallel/pathdisjoint.go +19 -1
  116. package/engine/internal/parallel/pathdisjoint_test.go +72 -0
  117. package/engine/internal/parallel/select.go +6 -2
  118. package/engine/internal/release/release.go +13 -3
  119. package/engine/internal/release/release_test.go +208 -3
  120. package/engine/internal/rootfacts/facts.go +9 -0
  121. package/engine/internal/rootfacts/facts_test.go +38 -0
  122. package/engine/internal/state/acceptance.go +7 -1
  123. package/engine/internal/state/budgets.go +11 -10
  124. package/engine/internal/state/budgets_test.go +93 -0
  125. package/engine/internal/state/cursor.go +19 -8
  126. package/engine/internal/state/cursor_test.go +120 -0
  127. package/engine/internal/state/lock_unix.go +7 -1
  128. package/engine/internal/state/lock_windows.go +7 -1
  129. package/engine/internal/state/state_test.go +49 -18
  130. package/engine/internal/state/taskgraph.go +18 -4
  131. package/engine/internal/state/taskgraph_test.go +43 -0
  132. package/engine/internal/state/workspaceschema.go +16 -2
  133. package/engine/internal/state/workspaceschema_test.go +34 -0
  134. package/engine/internal/state/write.go +67 -6
  135. package/engine/internal/state/write_test.go +136 -0
  136. package/engine/internal/version/version_test.go +2 -0
  137. package/engine/main.go +8 -1
  138. package/engine/observation_contract_test.go +1 -1
  139. package/engine/root_routing_test.go +23 -1
  140. package/install.sh +132 -12
  141. package/pack/.claude/agents/_shared/result-admission.md +3 -1
  142. package/pack/.claude/agents/devrites-code-reviewer.md +3 -2
  143. package/pack/.claude/agents/devrites-doubt-reviewer.md +4 -2
  144. package/pack/.claude/agents/devrites-spec-reviewer.md +5 -4
  145. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +2 -2
  146. package/pack/.claude/skills/devrites-frontend-craft/reference/design-references.md +18 -18
  147. package/pack/.claude/skills/devrites-frontend-craft/reference/quality-standards.md +6 -4
  148. package/pack/.claude/skills/devrites-interview/SKILL.md +4 -4
  149. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +1 -1
  150. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +11 -3
  151. package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +3 -2
  152. package/pack/.claude/skills/devrites-lib/reference/standards/gates.md +6 -5
  153. package/pack/.claude/skills/devrites-lib/reference/standards/spec-grammar.md +1 -1
  154. package/pack/.claude/skills/devrites-lib/reference/standards/verification-methods.md +3 -3
  155. package/pack/.claude/skills/devrites-lib/reference/standards/windows.md +3 -3
  156. package/pack/.claude/skills/devrites-lib/reference/standards/workflow-artifacts.md +2 -2
  157. package/pack/.claude/skills/devrites-lib/reference/visual-playbooks/outline-template.md +1 -1
  158. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +4 -4
  159. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +11 -12
  160. package/pack/.claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +3 -1
  161. package/pack/.claude/skills/overhaul/SKILL.md +1 -1
  162. package/pack/.claude/skills/overhaul/references/orchestration.md +5 -3
  163. package/pack/.claude/skills/overhaul/references/records.md +39 -0
  164. package/pack/.claude/skills/overhaul/references/scoring.md +14 -4
  165. package/pack/.claude/skills/rite/reference/menu.md +1 -1
  166. package/pack/.claude/skills/rite-adopt/SKILL.md +8 -2
  167. package/pack/.claude/skills/rite-autocomplete/SKILL.md +12 -7
  168. package/pack/.claude/skills/rite-autocomplete/reference/decision-policy.md +3 -2
  169. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +3 -3
  170. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +6 -3
  171. package/pack/.claude/skills/rite-build/SKILL.md +2 -1
  172. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +1 -1
  173. package/pack/.claude/skills/rite-build/reference/checkpoint-protocol.md +1 -1
  174. package/pack/.claude/skills/rite-build/reference/checkpoint.md +5 -0
  175. package/pack/.claude/skills/rite-build/reference/parallel-batch.md +2 -2
  176. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +3 -2
  177. package/pack/.claude/skills/rite-clarify/SKILL.md +5 -4
  178. package/pack/.claude/skills/rite-clarify/reference/anti-patterns.md +2 -2
  179. package/pack/.claude/skills/rite-clarify/reference/decision-coverage.md +3 -2
  180. package/pack/.claude/skills/rite-converge/SKILL.md +2 -0
  181. package/pack/.claude/skills/rite-customize/SKILL.md +6 -4
  182. package/pack/.claude/skills/rite-define/SKILL.md +2 -0
  183. package/pack/.claude/skills/rite-define/reference/gates.md +8 -7
  184. package/pack/.claude/skills/rite-explain/SKILL.md +1 -1
  185. package/pack/.claude/skills/rite-explain/reference/intake.md +1 -1
  186. package/pack/.claude/skills/rite-fast/SKILL.md +1 -1
  187. package/pack/.claude/skills/rite-plan/SKILL.md +4 -3
  188. package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +4 -4
  189. package/pack/.claude/skills/rite-plan/reference/slicing.md +3 -3
  190. package/pack/.claude/skills/rite-polish/reference/anti-ai-slop.md +1 -1
  191. package/pack/.claude/skills/rite-prove/reference/browser-proof.md +5 -5
  192. package/pack/.claude/skills/rite-resolve/SKILL.md +3 -3
  193. package/pack/.claude/skills/rite-seal/SKILL.md +4 -3
  194. package/pack/.claude/skills/rite-seal/reference/phase-contract.md +3 -2
  195. package/pack/.claude/skills/rite-seal/reference/seal-template.md +2 -0
  196. package/pack/.claude/skills/rite-ship/SKILL.md +4 -2
  197. package/pack/.claude/skills/rite-ship/reference/git-ship.md +8 -2
  198. package/pack/.claude/skills/rite-ship/reference/ship-template.md +2 -1
  199. package/pack/.claude/skills/rite-spec/SKILL.md +2 -2
  200. package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +1 -1
  201. package/pack/.claude/skills/rite-spec/reference/spec-template.md +7 -3
  202. package/pack/.claude/skills/rite-spec/reference/state-workspace.md +2 -0
  203. package/pack/.claude/skills/rite-temper/SKILL.md +14 -11
  204. package/pack/.claude/skills/rite-temper/reference/scope-modes.md +1 -1
  205. package/pack/.claude/skills/rite-temper/reference/significance.md +10 -3
  206. package/pack/.claude/skills/rite-temper/reference/strategy-template.md +13 -2
  207. package/pack/.claude/skills/rite-vet/SKILL.md +4 -3
  208. package/pack/.claude/skills/rite-vet/reference/artifacts.md +1 -1
  209. package/pack/.claude/workflows/devrites-readonly-review.js +5 -4
  210. package/pack/generated/claude/agents/devrites-code-reviewer.md +6 -3
  211. package/pack/generated/claude/agents/devrites-devex-reviewer.md +3 -1
  212. package/pack/generated/claude/agents/devrites-doubt-reviewer.md +7 -3
  213. package/pack/generated/claude/agents/devrites-evidence-scout.md +3 -1
  214. package/pack/generated/claude/agents/devrites-frontend-reviewer.md +3 -1
  215. package/pack/generated/claude/agents/devrites-performance-reviewer.md +3 -1
  216. package/pack/generated/claude/agents/devrites-plan-reviewer.md +3 -1
  217. package/pack/generated/claude/agents/devrites-proof-runner.md +3 -1
  218. package/pack/generated/claude/agents/devrites-retrospector.md +3 -1
  219. package/pack/generated/claude/agents/devrites-security-auditor.md +3 -1
  220. package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +3 -1
  221. package/pack/generated/claude/agents/devrites-spec-reviewer.md +8 -5
  222. package/pack/generated/claude/agents/devrites-strategy-reviewer.md +3 -1
  223. package/pack/generated/claude/agents/devrites-test-analyst.md +3 -1
  224. package/pack/generated/claude/agents/devrites-upgrade-planner.md +3 -1
  225. package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +2 -2
  226. package/pack/generated/claude/skills/devrites-frontend-craft/reference/design-references.md +18 -18
  227. package/pack/generated/claude/skills/devrites-frontend-craft/reference/quality-standards.md +6 -4
  228. package/pack/generated/claude/skills/devrites-interview/SKILL.md +4 -4
  229. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +1 -1
  230. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +11 -3
  231. package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +3 -2
  232. package/pack/generated/claude/skills/devrites-lib/reference/standards/gates.md +6 -5
  233. package/pack/generated/claude/skills/devrites-lib/reference/standards/spec-grammar.md +1 -1
  234. package/pack/generated/claude/skills/devrites-lib/reference/standards/verification-methods.md +3 -3
  235. package/pack/generated/claude/skills/devrites-lib/reference/standards/windows.md +3 -3
  236. package/pack/generated/claude/skills/devrites-lib/reference/standards/workflow-artifacts.md +2 -2
  237. package/pack/generated/claude/skills/devrites-lib/reference/visual-playbooks/outline-template.md +1 -1
  238. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +4 -4
  239. package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +11 -12
  240. package/pack/generated/claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +3 -1
  241. package/pack/generated/claude/skills/overhaul/SKILL.md +1 -1
  242. package/pack/generated/claude/skills/overhaul/references/orchestration.md +5 -3
  243. package/pack/generated/claude/skills/overhaul/references/records.md +39 -0
  244. package/pack/generated/claude/skills/overhaul/references/scoring.md +14 -4
  245. package/pack/generated/claude/skills/rite/reference/menu.md +1 -1
  246. package/pack/generated/claude/skills/rite-adopt/SKILL.md +8 -2
  247. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +12 -7
  248. package/pack/generated/claude/skills/rite-autocomplete/reference/decision-policy.md +3 -2
  249. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +3 -3
  250. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +6 -3
  251. package/pack/generated/claude/skills/rite-build/SKILL.md +2 -1
  252. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +1 -1
  253. package/pack/generated/claude/skills/rite-build/reference/checkpoint-protocol.md +1 -1
  254. package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +5 -0
  255. package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +2 -2
  256. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +3 -2
  257. package/pack/generated/claude/skills/rite-clarify/SKILL.md +5 -4
  258. package/pack/generated/claude/skills/rite-clarify/reference/anti-patterns.md +2 -2
  259. package/pack/generated/claude/skills/rite-clarify/reference/decision-coverage.md +3 -2
  260. package/pack/generated/claude/skills/rite-converge/SKILL.md +2 -0
  261. package/pack/generated/claude/skills/rite-customize/SKILL.md +6 -4
  262. package/pack/generated/claude/skills/rite-define/SKILL.md +2 -0
  263. package/pack/generated/claude/skills/rite-define/reference/gates.md +8 -7
  264. package/pack/generated/claude/skills/rite-explain/SKILL.md +1 -1
  265. package/pack/generated/claude/skills/rite-explain/reference/intake.md +1 -1
  266. package/pack/generated/claude/skills/rite-fast/SKILL.md +1 -1
  267. package/pack/generated/claude/skills/rite-plan/SKILL.md +4 -3
  268. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +4 -4
  269. package/pack/generated/claude/skills/rite-plan/reference/slicing.md +3 -3
  270. package/pack/generated/claude/skills/rite-polish/reference/anti-ai-slop.md +1 -1
  271. package/pack/generated/claude/skills/rite-prove/reference/browser-proof.md +5 -5
  272. package/pack/generated/claude/skills/rite-resolve/SKILL.md +3 -3
  273. package/pack/generated/claude/skills/rite-seal/SKILL.md +4 -3
  274. package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +3 -2
  275. package/pack/generated/claude/skills/rite-seal/reference/seal-template.md +2 -0
  276. package/pack/generated/claude/skills/rite-ship/SKILL.md +4 -2
  277. package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +8 -2
  278. package/pack/generated/claude/skills/rite-ship/reference/ship-template.md +2 -1
  279. package/pack/generated/claude/skills/rite-spec/SKILL.md +2 -2
  280. package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +1 -1
  281. package/pack/generated/claude/skills/rite-spec/reference/spec-template.md +7 -3
  282. package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +2 -0
  283. package/pack/generated/claude/skills/rite-temper/SKILL.md +14 -11
  284. package/pack/generated/claude/skills/rite-temper/reference/scope-modes.md +1 -1
  285. package/pack/generated/claude/skills/rite-temper/reference/significance.md +10 -3
  286. package/pack/generated/claude/skills/rite-temper/reference/strategy-template.md +13 -2
  287. package/pack/generated/claude/skills/rite-vet/SKILL.md +4 -3
  288. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +1 -1
  289. package/pack/generated/claude/workflows/devrites-readonly-review.js +5 -4
  290. package/pack/generated/codex/AGENTS.md +1 -1
  291. package/pack/generated/codex/agents/devrites-code-reviewer.toml +6 -3
  292. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +3 -1
  293. package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +7 -3
  294. package/pack/generated/codex/agents/devrites-evidence-scout.toml +3 -1
  295. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +3 -1
  296. package/pack/generated/codex/agents/devrites-performance-reviewer.toml +3 -1
  297. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +3 -1
  298. package/pack/generated/codex/agents/devrites-proof-runner.toml +3 -1
  299. package/pack/generated/codex/agents/devrites-retrospector.toml +3 -1
  300. package/pack/generated/codex/agents/devrites-security-auditor.toml +3 -1
  301. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +3 -1
  302. package/pack/generated/codex/agents/devrites-spec-reviewer.toml +8 -5
  303. package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +3 -1
  304. package/pack/generated/codex/agents/devrites-test-analyst.toml +3 -1
  305. package/pack/generated/codex/agents/devrites-upgrade-planner.toml +3 -1
  306. package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +2 -2
  307. package/pack/generated/codex/skills/devrites-frontend-craft/reference/design-references.md +18 -18
  308. package/pack/generated/codex/skills/devrites-frontend-craft/reference/quality-standards.md +6 -4
  309. package/pack/generated/codex/skills/devrites-interview/SKILL.md +4 -4
  310. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +1 -1
  311. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +11 -3
  312. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +3 -2
  313. package/pack/generated/codex/skills/devrites-lib/reference/standards/gates.md +6 -5
  314. package/pack/generated/codex/skills/devrites-lib/reference/standards/spec-grammar.md +1 -1
  315. package/pack/generated/codex/skills/devrites-lib/reference/standards/verification-methods.md +3 -3
  316. package/pack/generated/codex/skills/devrites-lib/reference/standards/windows.md +3 -3
  317. package/pack/generated/codex/skills/devrites-lib/reference/standards/workflow-artifacts.md +2 -2
  318. package/pack/generated/codex/skills/devrites-lib/reference/visual-playbooks/outline-template.md +1 -1
  319. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +4 -4
  320. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +11 -12
  321. package/pack/generated/codex/skills/devrites-ux-shape/reference/visual-direction-probe.md +3 -1
  322. package/pack/generated/codex/skills/overhaul/SKILL.md +1 -1
  323. package/pack/generated/codex/skills/overhaul/references/orchestration.md +5 -3
  324. package/pack/generated/codex/skills/overhaul/references/records.md +39 -0
  325. package/pack/generated/codex/skills/overhaul/references/scoring.md +14 -4
  326. package/pack/generated/codex/skills/rite/reference/menu.md +1 -1
  327. package/pack/generated/codex/skills/rite-adopt/SKILL.md +8 -2
  328. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +12 -7
  329. package/pack/generated/codex/skills/rite-autocomplete/reference/decision-policy.md +3 -2
  330. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +3 -3
  331. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +6 -3
  332. package/pack/generated/codex/skills/rite-build/SKILL.md +2 -1
  333. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +1 -1
  334. package/pack/generated/codex/skills/rite-build/reference/checkpoint-protocol.md +1 -1
  335. package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +5 -0
  336. package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +2 -2
  337. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +3 -2
  338. package/pack/generated/codex/skills/rite-clarify/SKILL.md +5 -4
  339. package/pack/generated/codex/skills/rite-clarify/reference/anti-patterns.md +2 -2
  340. package/pack/generated/codex/skills/rite-clarify/reference/decision-coverage.md +3 -2
  341. package/pack/generated/codex/skills/rite-converge/SKILL.md +2 -0
  342. package/pack/generated/codex/skills/rite-customize/SKILL.md +6 -4
  343. package/pack/generated/codex/skills/rite-define/SKILL.md +2 -0
  344. package/pack/generated/codex/skills/rite-define/reference/gates.md +8 -7
  345. package/pack/generated/codex/skills/rite-explain/SKILL.md +1 -1
  346. package/pack/generated/codex/skills/rite-explain/reference/intake.md +1 -1
  347. package/pack/generated/codex/skills/rite-fast/SKILL.md +1 -1
  348. package/pack/generated/codex/skills/rite-plan/SKILL.md +4 -3
  349. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +4 -4
  350. package/pack/generated/codex/skills/rite-plan/reference/slicing.md +3 -3
  351. package/pack/generated/codex/skills/rite-polish/reference/anti-ai-slop.md +1 -1
  352. package/pack/generated/codex/skills/rite-prove/reference/browser-proof.md +5 -5
  353. package/pack/generated/codex/skills/rite-resolve/SKILL.md +3 -3
  354. package/pack/generated/codex/skills/rite-seal/SKILL.md +4 -3
  355. package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +3 -2
  356. package/pack/generated/codex/skills/rite-seal/reference/seal-template.md +2 -0
  357. package/pack/generated/codex/skills/rite-ship/SKILL.md +4 -2
  358. package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +8 -2
  359. package/pack/generated/codex/skills/rite-ship/reference/ship-template.md +2 -1
  360. package/pack/generated/codex/skills/rite-spec/SKILL.md +2 -2
  361. package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +1 -1
  362. package/pack/generated/codex/skills/rite-spec/reference/spec-template.md +7 -3
  363. package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +2 -0
  364. package/pack/generated/codex/skills/rite-temper/SKILL.md +14 -11
  365. package/pack/generated/codex/skills/rite-temper/reference/scope-modes.md +1 -1
  366. package/pack/generated/codex/skills/rite-temper/reference/significance.md +10 -3
  367. package/pack/generated/codex/skills/rite-temper/reference/strategy-template.md +13 -2
  368. package/pack/generated/codex/skills/rite-vet/SKILL.md +4 -3
  369. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +1 -1
  370. package/pack/generated/devin/AGENTS.md +1 -1
  371. package/pack/generated/devin/agents/devrites-code-reviewer.md +6 -3
  372. package/pack/generated/devin/agents/devrites-devex-reviewer.md +3 -1
  373. package/pack/generated/devin/agents/devrites-doubt-reviewer.md +7 -3
  374. package/pack/generated/devin/agents/devrites-evidence-scout.md +3 -1
  375. package/pack/generated/devin/agents/devrites-frontend-reviewer.md +3 -1
  376. package/pack/generated/devin/agents/devrites-performance-reviewer.md +3 -1
  377. package/pack/generated/devin/agents/devrites-plan-reviewer.md +3 -1
  378. package/pack/generated/devin/agents/devrites-proof-runner.md +3 -1
  379. package/pack/generated/devin/agents/devrites-retrospector.md +3 -1
  380. package/pack/generated/devin/agents/devrites-security-auditor.md +3 -1
  381. package/pack/generated/devin/agents/devrites-simplifier-reviewer.md +3 -1
  382. package/pack/generated/devin/agents/devrites-spec-reviewer.md +8 -5
  383. package/pack/generated/devin/agents/devrites-strategy-reviewer.md +3 -1
  384. package/pack/generated/devin/agents/devrites-test-analyst.md +3 -1
  385. package/pack/generated/devin/agents/devrites-upgrade-planner.md +3 -1
  386. package/pack/generated/devin/skills/devrites-browser-proof/SKILL.md +2 -2
  387. package/pack/generated/devin/skills/devrites-frontend-craft/reference/design-references.md +18 -18
  388. package/pack/generated/devin/skills/devrites-frontend-craft/reference/quality-standards.md +6 -4
  389. package/pack/generated/devin/skills/devrites-interview/SKILL.md +4 -4
  390. package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +1 -1
  391. package/pack/generated/devin/skills/devrites-lib/reference/standards/afk-hitl.md +11 -3
  392. package/pack/generated/devin/skills/devrites-lib/reference/standards/agents.md +3 -2
  393. package/pack/generated/devin/skills/devrites-lib/reference/standards/gates.md +6 -5
  394. package/pack/generated/devin/skills/devrites-lib/reference/standards/spec-grammar.md +1 -1
  395. package/pack/generated/devin/skills/devrites-lib/reference/standards/verification-methods.md +3 -3
  396. package/pack/generated/devin/skills/devrites-lib/reference/standards/windows.md +3 -3
  397. package/pack/generated/devin/skills/devrites-lib/reference/standards/workflow-artifacts.md +2 -2
  398. package/pack/generated/devin/skills/devrites-lib/reference/visual-playbooks/outline-template.md +1 -1
  399. package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +4 -4
  400. package/pack/generated/devin/skills/devrites-ux-shape/SKILL.md +11 -12
  401. package/pack/generated/devin/skills/devrites-ux-shape/reference/visual-direction-probe.md +3 -1
  402. package/pack/generated/devin/skills/overhaul/SKILL.md +1 -1
  403. package/pack/generated/devin/skills/overhaul/references/orchestration.md +5 -3
  404. package/pack/generated/devin/skills/overhaul/references/records.md +39 -0
  405. package/pack/generated/devin/skills/overhaul/references/scoring.md +14 -4
  406. package/pack/generated/devin/skills/rite/reference/menu.md +1 -1
  407. package/pack/generated/devin/skills/rite-adopt/SKILL.md +8 -2
  408. package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +12 -7
  409. package/pack/generated/devin/skills/rite-autocomplete/reference/decision-policy.md +3 -2
  410. package/pack/generated/devin/skills/rite-autocomplete/reference/loop.md +3 -3
  411. package/pack/generated/devin/skills/rite-autocomplete/reference/stop-conditions.md +6 -3
  412. package/pack/generated/devin/skills/rite-build/SKILL.md +2 -1
  413. package/pack/generated/devin/skills/rite-build/reference/afk-discipline.md +1 -1
  414. package/pack/generated/devin/skills/rite-build/reference/checkpoint-protocol.md +1 -1
  415. package/pack/generated/devin/skills/rite-build/reference/checkpoint.md +5 -0
  416. package/pack/generated/devin/skills/rite-build/reference/parallel-batch.md +2 -2
  417. package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +3 -2
  418. package/pack/generated/devin/skills/rite-clarify/SKILL.md +5 -4
  419. package/pack/generated/devin/skills/rite-clarify/reference/anti-patterns.md +2 -2
  420. package/pack/generated/devin/skills/rite-clarify/reference/decision-coverage.md +3 -2
  421. package/pack/generated/devin/skills/rite-converge/SKILL.md +2 -0
  422. package/pack/generated/devin/skills/rite-customize/SKILL.md +6 -4
  423. package/pack/generated/devin/skills/rite-define/SKILL.md +2 -0
  424. package/pack/generated/devin/skills/rite-define/reference/gates.md +8 -7
  425. package/pack/generated/devin/skills/rite-explain/SKILL.md +1 -1
  426. package/pack/generated/devin/skills/rite-explain/reference/intake.md +1 -1
  427. package/pack/generated/devin/skills/rite-fast/SKILL.md +1 -1
  428. package/pack/generated/devin/skills/rite-plan/SKILL.md +4 -3
  429. package/pack/generated/devin/skills/rite-plan/reference/replan-and-repair.md +4 -4
  430. package/pack/generated/devin/skills/rite-plan/reference/slicing.md +3 -3
  431. package/pack/generated/devin/skills/rite-polish/reference/anti-ai-slop.md +1 -1
  432. package/pack/generated/devin/skills/rite-prove/reference/browser-proof.md +5 -5
  433. package/pack/generated/devin/skills/rite-resolve/SKILL.md +3 -3
  434. package/pack/generated/devin/skills/rite-seal/SKILL.md +4 -3
  435. package/pack/generated/devin/skills/rite-seal/reference/phase-contract.md +3 -2
  436. package/pack/generated/devin/skills/rite-seal/reference/seal-template.md +2 -0
  437. package/pack/generated/devin/skills/rite-ship/SKILL.md +4 -2
  438. package/pack/generated/devin/skills/rite-ship/reference/git-ship.md +8 -2
  439. package/pack/generated/devin/skills/rite-ship/reference/ship-template.md +2 -1
  440. package/pack/generated/devin/skills/rite-spec/SKILL.md +2 -2
  441. package/pack/generated/devin/skills/rite-spec/reference/spec-checklists.md +1 -1
  442. package/pack/generated/devin/skills/rite-spec/reference/spec-template.md +7 -3
  443. package/pack/generated/devin/skills/rite-spec/reference/state-workspace.md +2 -0
  444. package/pack/generated/devin/skills/rite-temper/SKILL.md +14 -11
  445. package/pack/generated/devin/skills/rite-temper/reference/scope-modes.md +1 -1
  446. package/pack/generated/devin/skills/rite-temper/reference/significance.md +10 -3
  447. package/pack/generated/devin/skills/rite-temper/reference/strategy-template.md +13 -2
  448. package/pack/generated/devin/skills/rite-vet/SKILL.md +4 -3
  449. package/pack/generated/devin/skills/rite-vet/reference/artifacts.md +1 -1
  450. package/pack/generated/omp/agents/devrites-code-reviewer.md +6 -3
  451. package/pack/generated/omp/agents/devrites-devex-reviewer.md +3 -1
  452. package/pack/generated/omp/agents/devrites-doubt-reviewer.md +7 -3
  453. package/pack/generated/omp/agents/devrites-evidence-scout.md +3 -1
  454. package/pack/generated/omp/agents/devrites-frontend-reviewer.md +3 -1
  455. package/pack/generated/omp/agents/devrites-performance-reviewer.md +3 -1
  456. package/pack/generated/omp/agents/devrites-plan-reviewer.md +3 -1
  457. package/pack/generated/omp/agents/devrites-proof-runner.md +3 -1
  458. package/pack/generated/omp/agents/devrites-retrospector.md +3 -1
  459. package/pack/generated/omp/agents/devrites-security-auditor.md +3 -1
  460. package/pack/generated/omp/agents/devrites-simplifier-reviewer.md +3 -1
  461. package/pack/generated/omp/agents/devrites-spec-reviewer.md +8 -5
  462. package/pack/generated/omp/agents/devrites-strategy-reviewer.md +3 -1
  463. package/pack/generated/omp/agents/devrites-test-analyst.md +3 -1
  464. package/pack/generated/omp/agents/devrites-upgrade-planner.md +3 -1
  465. package/pack/generated/omp/commands/rite-define.md +1 -1
  466. package/pack/generated/omp/commands/rite-handoff.md +1 -1
  467. package/pack/generated/omp/commands/rite-plan.md +1 -1
  468. package/pack/generated/omp/commands/rite-pressure-test.md +1 -1
  469. package/pack/generated/omp/commands/rite-quick.md +1 -1
  470. package/pack/generated/omp/commands/rite-status.md +1 -1
  471. package/pack/generated/omp/commands/rite-temper.md +1 -1
  472. package/pack/generated/omp/commands/rite-zoom-out.md +1 -1
  473. package/pack/generated/omp/skills/devrites-browser-proof/SKILL.md +2 -2
  474. package/pack/generated/omp/skills/devrites-frontend-craft/reference/design-references.md +18 -18
  475. package/pack/generated/omp/skills/devrites-frontend-craft/reference/quality-standards.md +6 -4
  476. package/pack/generated/omp/skills/devrites-interview/SKILL.md +4 -4
  477. package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +1 -1
  478. package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +11 -3
  479. package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +3 -2
  480. package/pack/generated/omp/skills/devrites-lib/reference/standards/gates.md +6 -5
  481. package/pack/generated/omp/skills/devrites-lib/reference/standards/spec-grammar.md +1 -1
  482. package/pack/generated/omp/skills/devrites-lib/reference/standards/verification-methods.md +3 -3
  483. package/pack/generated/omp/skills/devrites-lib/reference/standards/windows.md +3 -3
  484. package/pack/generated/omp/skills/devrites-lib/reference/standards/workflow-artifacts.md +2 -2
  485. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/outline-template.md +1 -1
  486. package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +4 -4
  487. package/pack/generated/omp/skills/devrites-ux-shape/SKILL.md +11 -12
  488. package/pack/generated/omp/skills/devrites-ux-shape/reference/visual-direction-probe.md +3 -1
  489. package/pack/generated/omp/skills/overhaul/SKILL.md +1 -1
  490. package/pack/generated/omp/skills/overhaul/references/orchestration.md +5 -3
  491. package/pack/generated/omp/skills/overhaul/references/records.md +39 -0
  492. package/pack/generated/omp/skills/overhaul/references/scoring.md +14 -4
  493. package/pack/generated/omp/skills/rite/reference/menu.md +1 -1
  494. package/pack/generated/omp/skills/rite-adopt/SKILL.md +8 -2
  495. package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +12 -7
  496. package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +3 -2
  497. package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +3 -3
  498. package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +6 -3
  499. package/pack/generated/omp/skills/rite-build/SKILL.md +2 -1
  500. package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +1 -1
  501. package/pack/generated/omp/skills/rite-build/reference/checkpoint-protocol.md +1 -1
  502. package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +5 -0
  503. package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +2 -2
  504. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +3 -2
  505. package/pack/generated/omp/skills/rite-clarify/SKILL.md +5 -4
  506. package/pack/generated/omp/skills/rite-clarify/reference/anti-patterns.md +2 -2
  507. package/pack/generated/omp/skills/rite-clarify/reference/decision-coverage.md +3 -2
  508. package/pack/generated/omp/skills/rite-converge/SKILL.md +2 -0
  509. package/pack/generated/omp/skills/rite-customize/SKILL.md +6 -4
  510. package/pack/generated/omp/skills/rite-define/SKILL.md +2 -0
  511. package/pack/generated/omp/skills/rite-define/reference/gates.md +8 -7
  512. package/pack/generated/omp/skills/rite-explain/SKILL.md +1 -1
  513. package/pack/generated/omp/skills/rite-explain/reference/intake.md +1 -1
  514. package/pack/generated/omp/skills/rite-fast/SKILL.md +1 -1
  515. package/pack/generated/omp/skills/rite-plan/SKILL.md +4 -3
  516. package/pack/generated/omp/skills/rite-plan/reference/replan-and-repair.md +4 -4
  517. package/pack/generated/omp/skills/rite-plan/reference/slicing.md +3 -3
  518. package/pack/generated/omp/skills/rite-polish/reference/anti-ai-slop.md +1 -1
  519. package/pack/generated/omp/skills/rite-prove/reference/browser-proof.md +5 -5
  520. package/pack/generated/omp/skills/rite-resolve/SKILL.md +3 -3
  521. package/pack/generated/omp/skills/rite-seal/SKILL.md +4 -3
  522. package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +3 -2
  523. package/pack/generated/omp/skills/rite-seal/reference/seal-template.md +2 -0
  524. package/pack/generated/omp/skills/rite-ship/SKILL.md +4 -2
  525. package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +8 -2
  526. package/pack/generated/omp/skills/rite-ship/reference/ship-template.md +2 -1
  527. package/pack/generated/omp/skills/rite-spec/SKILL.md +2 -2
  528. package/pack/generated/omp/skills/rite-spec/reference/spec-checklists.md +1 -1
  529. package/pack/generated/omp/skills/rite-spec/reference/spec-template.md +7 -3
  530. package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +2 -0
  531. package/pack/generated/omp/skills/rite-temper/SKILL.md +14 -11
  532. package/pack/generated/omp/skills/rite-temper/reference/scope-modes.md +1 -1
  533. package/pack/generated/omp/skills/rite-temper/reference/significance.md +10 -3
  534. package/pack/generated/omp/skills/rite-temper/reference/strategy-template.md +13 -2
  535. package/pack/generated/omp/skills/rite-vet/SKILL.md +4 -3
  536. package/pack/generated/omp/skills/rite-vet/reference/artifacts.md +1 -1
  537. package/pack/generated/pi/AGENTS.md +1 -1
  538. package/pack/generated/pi/agents/devrites-code-reviewer.md +6 -3
  539. package/pack/generated/pi/agents/devrites-devex-reviewer.md +3 -1
  540. package/pack/generated/pi/agents/devrites-doubt-reviewer.md +7 -3
  541. package/pack/generated/pi/agents/devrites-evidence-scout.md +3 -1
  542. package/pack/generated/pi/agents/devrites-frontend-reviewer.md +3 -1
  543. package/pack/generated/pi/agents/devrites-performance-reviewer.md +3 -1
  544. package/pack/generated/pi/agents/devrites-plan-reviewer.md +3 -1
  545. package/pack/generated/pi/agents/devrites-proof-runner.md +3 -1
  546. package/pack/generated/pi/agents/devrites-retrospector.md +3 -1
  547. package/pack/generated/pi/agents/devrites-security-auditor.md +3 -1
  548. package/pack/generated/pi/agents/devrites-simplifier-reviewer.md +3 -1
  549. package/pack/generated/pi/agents/devrites-spec-reviewer.md +8 -5
  550. package/pack/generated/pi/agents/devrites-strategy-reviewer.md +3 -1
  551. package/pack/generated/pi/agents/devrites-test-analyst.md +3 -1
  552. package/pack/generated/pi/agents/devrites-upgrade-planner.md +3 -1
  553. package/pack/generated/pi/prompts/rite-define.md +1 -1
  554. package/pack/generated/pi/prompts/rite-handoff.md +1 -1
  555. package/pack/generated/pi/prompts/rite-plan.md +1 -1
  556. package/pack/generated/pi/prompts/rite-pressure-test.md +1 -1
  557. package/pack/generated/pi/prompts/rite-quick.md +1 -1
  558. package/pack/generated/pi/prompts/rite-status.md +1 -1
  559. package/pack/generated/pi/prompts/rite-temper.md +1 -1
  560. package/pack/generated/pi/prompts/rite-zoom-out.md +1 -1
  561. package/pack/generated/pi/skills/devrites-browser-proof/SKILL.md +2 -2
  562. package/pack/generated/pi/skills/devrites-frontend-craft/reference/design-references.md +18 -18
  563. package/pack/generated/pi/skills/devrites-frontend-craft/reference/quality-standards.md +6 -4
  564. package/pack/generated/pi/skills/devrites-interview/SKILL.md +4 -4
  565. package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +1 -1
  566. package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +11 -3
  567. package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +3 -2
  568. package/pack/generated/pi/skills/devrites-lib/reference/standards/gates.md +6 -5
  569. package/pack/generated/pi/skills/devrites-lib/reference/standards/spec-grammar.md +1 -1
  570. package/pack/generated/pi/skills/devrites-lib/reference/standards/verification-methods.md +3 -3
  571. package/pack/generated/pi/skills/devrites-lib/reference/standards/windows.md +3 -3
  572. package/pack/generated/pi/skills/devrites-lib/reference/standards/workflow-artifacts.md +2 -2
  573. package/pack/generated/pi/skills/devrites-lib/reference/visual-playbooks/outline-template.md +1 -1
  574. package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +4 -4
  575. package/pack/generated/pi/skills/devrites-ux-shape/SKILL.md +11 -12
  576. package/pack/generated/pi/skills/devrites-ux-shape/reference/visual-direction-probe.md +3 -1
  577. package/pack/generated/pi/skills/overhaul/SKILL.md +1 -1
  578. package/pack/generated/pi/skills/overhaul/references/orchestration.md +5 -3
  579. package/pack/generated/pi/skills/overhaul/references/records.md +39 -0
  580. package/pack/generated/pi/skills/overhaul/references/scoring.md +14 -4
  581. package/pack/generated/pi/skills/rite/reference/menu.md +1 -1
  582. package/pack/generated/pi/skills/rite-adopt/SKILL.md +8 -2
  583. package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +12 -7
  584. package/pack/generated/pi/skills/rite-autocomplete/reference/decision-policy.md +3 -2
  585. package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +3 -3
  586. package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +6 -3
  587. package/pack/generated/pi/skills/rite-build/SKILL.md +2 -1
  588. package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +1 -1
  589. package/pack/generated/pi/skills/rite-build/reference/checkpoint-protocol.md +1 -1
  590. package/pack/generated/pi/skills/rite-build/reference/checkpoint.md +5 -0
  591. package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +2 -2
  592. package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +3 -2
  593. package/pack/generated/pi/skills/rite-clarify/SKILL.md +5 -4
  594. package/pack/generated/pi/skills/rite-clarify/reference/anti-patterns.md +2 -2
  595. package/pack/generated/pi/skills/rite-clarify/reference/decision-coverage.md +3 -2
  596. package/pack/generated/pi/skills/rite-converge/SKILL.md +2 -0
  597. package/pack/generated/pi/skills/rite-customize/SKILL.md +6 -4
  598. package/pack/generated/pi/skills/rite-define/SKILL.md +2 -0
  599. package/pack/generated/pi/skills/rite-define/reference/gates.md +8 -7
  600. package/pack/generated/pi/skills/rite-explain/SKILL.md +1 -1
  601. package/pack/generated/pi/skills/rite-explain/reference/intake.md +1 -1
  602. package/pack/generated/pi/skills/rite-fast/SKILL.md +1 -1
  603. package/pack/generated/pi/skills/rite-plan/SKILL.md +4 -3
  604. package/pack/generated/pi/skills/rite-plan/reference/replan-and-repair.md +4 -4
  605. package/pack/generated/pi/skills/rite-plan/reference/slicing.md +3 -3
  606. package/pack/generated/pi/skills/rite-polish/reference/anti-ai-slop.md +1 -1
  607. package/pack/generated/pi/skills/rite-prove/reference/browser-proof.md +5 -5
  608. package/pack/generated/pi/skills/rite-resolve/SKILL.md +3 -3
  609. package/pack/generated/pi/skills/rite-seal/SKILL.md +4 -3
  610. package/pack/generated/pi/skills/rite-seal/reference/phase-contract.md +3 -2
  611. package/pack/generated/pi/skills/rite-seal/reference/seal-template.md +2 -0
  612. package/pack/generated/pi/skills/rite-ship/SKILL.md +4 -2
  613. package/pack/generated/pi/skills/rite-ship/reference/git-ship.md +8 -2
  614. package/pack/generated/pi/skills/rite-ship/reference/ship-template.md +2 -1
  615. package/pack/generated/pi/skills/rite-spec/SKILL.md +2 -2
  616. package/pack/generated/pi/skills/rite-spec/reference/spec-checklists.md +1 -1
  617. package/pack/generated/pi/skills/rite-spec/reference/spec-template.md +7 -3
  618. package/pack/generated/pi/skills/rite-spec/reference/state-workspace.md +2 -0
  619. package/pack/generated/pi/skills/rite-temper/SKILL.md +14 -11
  620. package/pack/generated/pi/skills/rite-temper/reference/scope-modes.md +1 -1
  621. package/pack/generated/pi/skills/rite-temper/reference/significance.md +10 -3
  622. package/pack/generated/pi/skills/rite-temper/reference/strategy-template.md +13 -2
  623. package/pack/generated/pi/skills/rite-vet/SKILL.md +4 -3
  624. package/pack/generated/pi/skills/rite-vet/reference/artifacts.md +1 -1
  625. package/package.json +5 -4
  626. package/scripts/build-host-artifacts.sh +15 -0
  627. package/scripts/codex-generate.sh +1 -1
  628. package/scripts/devin-generate.sh +1 -1
  629. package/scripts/expand-includes.py +46 -0
  630. package/scripts/install-lib.sh +42 -7
  631. package/scripts/omp-generate.sh +11 -0
  632. package/scripts/pi-generate.sh +12 -1
  633. package/update.sh +1 -2
  634. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/README.md +0 -7
  635. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/architecture.md +0 -3
  636. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/assumptions.md +0 -3
  637. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/brief.md +0 -3
  638. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/decision-coverage.md +0 -3
  639. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/decisions.md +0 -4
  640. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/eng-review.md +0 -3
  641. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/gates.md +0 -4
  642. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/plan.md +0 -5
  643. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/questions.md +0 -3
  644. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/spec.md +0 -6
  645. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/state.md +0 -8
  646. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/tasks.md +0 -1
  647. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/test-plan.md +0 -3
  648. package/engine/testdata/fixtures/basic/devrites-root/work/auth-tokens/traceability.md +0 -3
  649. package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/README.md +0 -7
  650. package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/assumptions.md +0 -3
  651. package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/brief.md +0 -3
  652. package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/decisions.md +0 -3
  653. package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/questions.md +0 -3
  654. package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/spec.md +0 -6
  655. package/engine/testdata/fixtures/basic/devrites-root/work/search-ranking/state.md +0 -3
  656. package/engine/testdata/golden/TestParityCloseOut/active_pointed_elsewhere.golden +0 -2
  657. package/engine/testdata/golden/TestParityCloseOut/active_slug_cleared.golden +0 -2
  658. package/engine/testdata/golden/TestParityCloseOut/archive_clobber.golden +0 -1
  659. package/engine/testdata/golden/TestParityCloseOut/missing_slug.golden +0 -1
  660. package/engine/testdata/golden/TestParityCloseOut/missing_workspace.golden +0 -1
  661. package/engine/testdata/golden/TestParityLearnings/add.golden +0 -2
  662. package/engine/testdata/golden/TestParityLearnings/list.golden +0 -5
  663. package/engine/testdata/golden/TestParityLearnings/mine-no-archive.golden +0 -2
  664. package/engine/testdata/golden/TestParityLearnings/mine.golden +0 -5
  665. package/engine/testdata/golden/TestParityLearnings/nudge.golden +0 -2
  666. package/engine/testdata/golden/TestParityLearnings/unknown.golden +0 -1
  667. package/engine/testdata/golden/TestParityPackageExistence/ghost-workspace.golden +0 -1
  668. package/engine/testdata/golden/TestParityPackageExistence/no-manifest.golden +0 -1
  669. package/engine/testdata/golden/TestParityPackageExistence/not-git.golden +0 -1
  670. package/engine/testdata/golden/TestParityPackageExistence/undeclared.golden +0 -1
  671. package/engine/testdata/golden/TestParityPreamble/afk/a.golden +0 -14
  672. package/engine/testdata/golden/TestParityPreamble/hitl/active.golden +0 -18
  673. package/engine/testdata/golden/TestParityPreamble/hitl/bare.golden +0 -10
  674. package/engine/testdata/golden/TestParityPreamble/hitl/full.golden +0 -18
  675. package/engine/testdata/golden/TestParityPreamble/hitl/ghost.golden +0 -2
  676. package/engine/testdata/golden/TestParityPreamble/hitl/nonl.golden +0 -11
  677. package/engine/testdata/golden/TestParityPreamble/hitl/openend.golden +0 -13
  678. package/engine/testdata/golden/TestParityProgress/arg=allbuilt.golden +0 -4
  679. package/engine/testdata/golden/TestParityProgress/arg=done.golden +0 -3
  680. package/engine/testdata/golden/TestParityProgress/arg=ghost.golden +0 -1
  681. package/engine/testdata/golden/TestParityProgress/arg=mid.golden +0 -4
  682. package/engine/testdata/golden/TestParityProgress/arg=nophase.golden +0 -3
  683. package/engine/testdata/golden/TestParityProgress/arg=noslice.golden +0 -3
  684. package/engine/testdata/golden/TestParityProgress/arg=plan.golden +0 -4
  685. package/engine/testdata/golden/TestParityProgress/arg=seal.golden +0 -3
  686. package/engine/testdata/golden/TestParityResolve/answer/questions.md.golden +0 -9
  687. package/engine/testdata/golden/TestParityResolve/answer/state.md.golden +0 -7
  688. package/engine/testdata/golden/TestParityResolve/answer.golden +0 -4
  689. package/engine/testdata/golden/TestParityResolve/batch/questions.md.golden +0 -9
  690. package/engine/testdata/golden/TestParityResolve/batch-unterminated/questions.md.golden +0 -9
  691. package/engine/testdata/golden/TestParityResolve/batch-unterminated.golden +0 -2
  692. package/engine/testdata/golden/TestParityResolve/batch.golden +0 -3
  693. package/engine/testdata/golden/TestParityResolve/drop/questions.md.golden +0 -9
  694. package/engine/testdata/golden/TestParityResolve/drop/state.md.golden +0 -9
  695. package/engine/testdata/golden/TestParityResolve/drop.golden +0 -4
  696. package/engine/testdata/golden/TestParityResolve/missing-answer.golden +0 -1
  697. package/engine/testdata/golden/TestParityResolve/no-workspace.golden +0 -1
  698. package/engine/testdata/golden/TestParityResolve/not-found.golden +0 -1
  699. package/engine/testdata/golden/TestParityResolve/not-open.golden +0 -1
  700. package/engine/testdata/golden/TestStatusLiveWorkspace.golden +0 -10
  701. package/engine/testdata/golden/status/auth-tokens.txt +0 -9
  702. package/engine/testdata/golden/status/search-ranking.txt +0 -9
  703. package/engine/testdata/visual/open-visual-smoke.html +0 -675
  704. package/engine/testdata/visual/open-visual-smoke.outline.md +0 -54
  705. package/engine/tests/adr_0003_gate_exit_code_test.go +0 -32
  706. package/engine/tests/adr_0004_required_by_phase_test.go +0 -54
  707. package/engine/tests/adr_0011_define_plan_test.go +0 -32
  708. package/engine/tests/adr_0027_readiness_binding_test.go +0 -107
  709. package/engine/tests/cli_test.go +0 -126
  710. package/engine/tests/gate_test.go +0 -669
  711. package/engine/tests/meta_test.go +0 -37
  712. package/engine/tests/parity_closeout_test.go +0 -105
  713. package/engine/tests/parity_githelpers_test.go +0 -41
  714. package/engine/tests/parity_resolve_test.go +0 -136
  715. package/engine/tests/parity_test.go +0 -86
  716. package/engine/tests/workspace_observation_migration_test.go +0 -1069
@@ -5,6 +5,7 @@ import (
5
5
  "fmt"
6
6
  "os"
7
7
  "path/filepath"
8
+ "runtime"
8
9
  "strings"
9
10
  "sync"
10
11
  "testing"
@@ -167,61 +168,261 @@ func TestIntegrateSurfacesStuckStagingWorktree(t *testing.T) {
167
168
  }
168
169
 
169
170
  // TestCleanupNeverTouchesForeignWorktreePath proves a lease whose
170
- // worktree_path points outside the batch scratch layout is never salvaged
171
+ // worktree_path is not the exact directory Create wrote is never salvaged
171
172
  // into nor deleted — the lease field is advisory, not a RemoveAll license.
173
+ // Two spellings of "not ours" are covered: a path outside the batch scratch
174
+ // layout, and the deterministic scratch path itself reached through a symlink.
172
175
  func TestCleanupNeverTouchesForeignWorktreePath(t *testing.T) {
173
- repo, base := setupRepo(t)
174
176
  slug, batch := "demo-feature", "batch1"
175
- lease, err := Create(CreateOpts{
176
- Root: repo,
177
- Slug: slug,
178
- BatchID: batch,
179
- BaseSHA: base,
180
- Slices: []SlicePaths{
181
- {ID: "slice-a", Paths: []string{"src/a.go"}},
182
- {ID: "slice-b", Paths: []string{"src/b.go"}},
183
- },
184
- })
185
- if err != nil {
186
- t.Fatal(err)
187
- }
188
- foreign := filepath.Join(t.TempDir(), "precious")
189
- if err := os.MkdirAll(foreign, 0o755); err != nil {
190
- t.Fatal(err)
191
- }
192
- if err := os.WriteFile(filepath.Join(foreign, "keep.txt"), []byte("x"), 0o644); err != nil {
193
- t.Fatal(err)
194
- }
195
- lease.Slices[0].WorktreePath = foreign
196
- // A forged branch outside the batch namespace must survive too.
197
- gitOk(t, repo, "branch", "user/topic", base)
198
- lease.Slices[0].Branch = "user/topic"
199
- leasePath, err := LeasePath(repo, slug)
200
- if err != nil {
201
- t.Fatal(err)
202
- }
203
- if err := WriteLease(leasePath, lease); err != nil {
204
- t.Fatal(err)
177
+ slices := []SlicePaths{
178
+ {ID: "slice-a", Paths: []string{"src/a.go"}},
179
+ {ID: "slice-b", Paths: []string{"src/b.go"}},
205
180
  }
206
181
 
207
- var warnings []string
208
- swapSeams(t)
209
- warnf = func(format string, args ...any) {
210
- warnings = append(warnings, fmt.Sprintf(format, args...))
211
- }
212
- if _, err := Cleanup(repo, slug, true); err != nil {
213
- t.Fatal(err)
214
- }
215
- if _, err := os.Stat(filepath.Join(foreign, "keep.txt")); err != nil {
216
- t.Fatalf("foreign path was touched: %v", err)
217
- }
218
- if tip := gitOk(t, repo, "rev-parse", "user/topic"); tip != base {
219
- t.Fatalf("foreign branch user/topic moved to %s, want %s", tip, base)
220
- }
221
- joined := strings.Join(warnings, "\n")
222
- if !strings.Contains(joined, "outside") {
223
- t.Fatalf("expected warnings naming foreign path and branch, got:\n%s", warnings)
224
- }
182
+ t.Run("worktree_path outside the scratch root", func(t *testing.T) {
183
+ repo, base := setupRepo(t)
184
+ lease, err := Create(CreateOpts{
185
+ Root: repo,
186
+ Slug: slug,
187
+ BatchID: batch,
188
+ BaseSHA: base,
189
+ Slices: slices,
190
+ })
191
+ if err != nil {
192
+ t.Fatal(err)
193
+ }
194
+ foreign := filepath.Join(t.TempDir(), "precious")
195
+ if err := os.MkdirAll(foreign, 0o755); err != nil {
196
+ t.Fatal(err)
197
+ }
198
+ if err := os.WriteFile(filepath.Join(foreign, "keep.txt"), []byte("x"), 0o644); err != nil {
199
+ t.Fatal(err)
200
+ }
201
+ lease.Slices[0].WorktreePath = foreign
202
+ // A forged branch outside the batch namespace must survive too.
203
+ gitOk(t, repo, "branch", "user/topic", base)
204
+ lease.Slices[0].Branch = "user/topic"
205
+ leasePath, err := LeasePath(repo, slug)
206
+ if err != nil {
207
+ t.Fatal(err)
208
+ }
209
+ if err := WriteLease(leasePath, lease); err != nil {
210
+ t.Fatal(err)
211
+ }
212
+
213
+ var warnings []string
214
+ swapSeams(t)
215
+ warnf = func(format string, args ...any) {
216
+ warnings = append(warnings, fmt.Sprintf(format, args...))
217
+ }
218
+ if _, err := Cleanup(repo, slug, true); err != nil {
219
+ t.Fatal(err)
220
+ }
221
+ if _, err := os.Stat(filepath.Join(foreign, "keep.txt")); err != nil {
222
+ t.Fatalf("foreign path was touched: %v", err)
223
+ }
224
+ if tip := gitOk(t, repo, "rev-parse", "user/topic"); tip != base {
225
+ t.Fatalf("foreign branch user/topic moved to %s, want %s", tip, base)
226
+ }
227
+ joined := strings.Join(warnings, "\n")
228
+ if !strings.Contains(joined, "outside") {
229
+ t.Fatalf("expected warnings naming foreign path and branch, got:\n%s", warnings)
230
+ }
231
+ })
232
+
233
+ // A stale lease still names exactly the path Create wrote; here the batch
234
+ // directory was replaced by a symlink, so the directory a forced cleanup
235
+ // would delete lives outside the scratch root. filepath.Abs matches both sides
236
+ // of the ownership check because neither side resolves symlinks.
237
+ t.Run("scratch worktree_path reached through a symlink", func(t *testing.T) {
238
+ repo, base := setupRepo(t)
239
+ if _, err := Create(CreateOpts{
240
+ Root: repo,
241
+ Slug: slug,
242
+ BatchID: batch,
243
+ BaseSHA: base,
244
+ Slices: slices,
245
+ }); err != nil {
246
+ t.Fatal(err)
247
+ }
248
+
249
+ // An unrelated repository outside the workspace, carrying a committed file
250
+ // and a dirty one on the allowlisted path: a salvage would commit inside it
251
+ // and a RemoveAll would delete the tree.
252
+ outside := t.TempDir()
253
+ sliceA := filepath.Join(outside, "slice-a")
254
+ if err := os.MkdirAll(filepath.Join(sliceA, "src"), 0o755); err != nil {
255
+ t.Fatal(err)
256
+ }
257
+ gitOk(t, sliceA, "init")
258
+ gitOk(t, sliceA, "checkout", "-b", "main")
259
+ if err := os.WriteFile(filepath.Join(sliceA, "src", "a.go"), []byte("package main\n"), 0o644); err != nil {
260
+ t.Fatal(err)
261
+ }
262
+ gitOk(t, sliceA, "add", ".")
263
+ gitOk(t, sliceA, "commit", "-m", "unrelated base")
264
+ unrelatedTip := gitOk(t, sliceA, "rev-parse", "HEAD")
265
+ if err := os.WriteFile(filepath.Join(sliceA, "src", "a.go"), []byte("package main\n\nfunc Unrelated() {}\n"), 0o644); err != nil {
266
+ t.Fatal(err)
267
+ }
268
+
269
+ batchDir := filepath.Join(ScratchRoot(repo), batch)
270
+ if err := os.RemoveAll(batchDir); err != nil {
271
+ t.Fatal(err)
272
+ }
273
+ if err := os.Symlink(outside, batchDir); err != nil {
274
+ t.Fatal(err)
275
+ }
276
+
277
+ // The lease on disk is what Create wrote; only the filesystem moved.
278
+ // Assert the path cleanup will use really does resolve through the symlink,
279
+ // so this case cannot pass without traversing it.
280
+ leasePath, err := LeasePath(repo, slug)
281
+ if err != nil {
282
+ t.Fatal(err)
283
+ }
284
+ lease, err := ReadLease(leasePath)
285
+ if err != nil {
286
+ t.Fatal(err)
287
+ }
288
+ claimed := lease.Slices[0].WorktreePath
289
+ if want := WorkerWorktreePath(repo, batch, "slice-a"); claimed != want {
290
+ t.Fatalf("lease worktree_path %q, want the deterministic %q", claimed, want)
291
+ }
292
+ resolved, err := filepath.EvalSymlinks(claimed)
293
+ if err != nil {
294
+ t.Fatalf("claimed worktree_path does not resolve: %v", err)
295
+ }
296
+ realSliceA, err := filepath.EvalSymlinks(sliceA)
297
+ if err != nil {
298
+ t.Fatal(err)
299
+ }
300
+ if resolved != realSliceA {
301
+ t.Fatalf("%q resolved to %q, want the symlink target %q", claimed, resolved, realSliceA)
302
+ }
303
+
304
+ var warnings []string
305
+ swapSeams(t)
306
+ warnf = func(format string, args ...any) {
307
+ warnings = append(warnings, fmt.Sprintf(format, args...))
308
+ }
309
+ if _, err := Cleanup(repo, slug, true); err != nil {
310
+ t.Fatal(err)
311
+ }
312
+
313
+ if _, err := os.Stat(filepath.Join(sliceA, "src", "a.go")); err != nil {
314
+ t.Fatalf("worktree reached through a symlinked batch directory was deleted: %v", err)
315
+ }
316
+ if tip := gitOk(t, sliceA, "rev-parse", "HEAD"); tip != unrelatedTip {
317
+ t.Fatalf("salvage committed inside an unrelated repository: tip %s want %s", tip, unrelatedTip)
318
+ }
319
+ if joined := strings.Join(warnings, "\n"); !strings.Contains(joined, "worktree_path") {
320
+ t.Fatalf("expected a warning naming the refused worktree_path, got:\n%s", warnings)
321
+ }
322
+ })
323
+
324
+ // A symlink that stays inside the scratch root still redirects the delete
325
+ // onto a directory the lease does not name.
326
+ t.Run("scratch worktree_path reached through a symlink inside the scratch root", func(t *testing.T) {
327
+ repo, base := setupRepo(t)
328
+ if _, err := Create(CreateOpts{
329
+ Root: repo,
330
+ Slug: slug,
331
+ BatchID: batch,
332
+ BaseSHA: base,
333
+ Slices: slices,
334
+ }); err != nil {
335
+ t.Fatal(err)
336
+ }
337
+ sibling := filepath.Join(ScratchRoot(repo), "sibling-batch")
338
+ keep := filepath.Join(sibling, "slice-a", "keep.txt")
339
+ if err := os.MkdirAll(filepath.Dir(keep), 0o755); err != nil {
340
+ t.Fatal(err)
341
+ }
342
+ if err := os.WriteFile(keep, []byte("x"), 0o644); err != nil {
343
+ t.Fatal(err)
344
+ }
345
+ batchDir := filepath.Join(ScratchRoot(repo), batch)
346
+ if err := os.RemoveAll(batchDir); err != nil {
347
+ t.Fatal(err)
348
+ }
349
+ if err := os.Symlink(sibling, batchDir); err != nil {
350
+ t.Fatal(err)
351
+ }
352
+
353
+ swapSeams(t)
354
+ warnf = func(string, ...any) {}
355
+ if _, err := Cleanup(repo, slug, true); err != nil {
356
+ t.Fatal(err)
357
+ }
358
+ if _, err := os.Stat(keep); err != nil {
359
+ t.Fatalf("directory under an in-scratch symlink was deleted: %v", err)
360
+ }
361
+ })
362
+
363
+ // Ownership is decided by what git registered when Create ran, not by the
364
+ // lease. A lease naming a deterministic in-scratch path that Create never
365
+ // made (and a stray sibling no lease names) must survive a forced cleanup,
366
+ // while the real worktrees are still removed.
367
+ t.Run("in-scratch path Create never made", func(t *testing.T) {
368
+ repo, base := setupRepo(t)
369
+ lease, err := Create(CreateOpts{
370
+ Root: repo,
371
+ Slug: slug,
372
+ BatchID: batch,
373
+ BaseSHA: base,
374
+ Slices: slices,
375
+ })
376
+ if err != nil {
377
+ t.Fatal(err)
378
+ }
379
+ forged := WorkerWorktreePath(repo, batch, "slice-x")
380
+ stray := filepath.Join(ScratchRoot(repo), batch, "stray")
381
+ for _, d := range []string{forged, stray} {
382
+ if err := os.MkdirAll(d, 0o755); err != nil {
383
+ t.Fatal(err)
384
+ }
385
+ if err := os.WriteFile(filepath.Join(d, "keep.txt"), []byte("x"), 0o644); err != nil {
386
+ t.Fatal(err)
387
+ }
388
+ }
389
+ lease.Slices = append(lease.Slices, LeaseSlice{
390
+ ID: "slice-x",
391
+ Paths: []string{"src/x.go"},
392
+ WorktreePath: forged,
393
+ WrightStatus: WrightPending,
394
+ })
395
+ lease.N = len(lease.Slices)
396
+ leasePath, err := LeasePath(repo, slug)
397
+ if err != nil {
398
+ t.Fatal(err)
399
+ }
400
+ if err := WriteLease(leasePath, lease); err != nil {
401
+ t.Fatal(err)
402
+ }
403
+
404
+ var warnings []string
405
+ swapSeams(t)
406
+ warnf = func(format string, args ...any) {
407
+ warnings = append(warnings, fmt.Sprintf(format, args...))
408
+ }
409
+ if _, err := Cleanup(repo, slug, true); err != nil {
410
+ t.Fatal(err)
411
+ }
412
+ for _, d := range []string{forged, stray} {
413
+ if _, err := os.Stat(filepath.Join(d, "keep.txt")); err != nil {
414
+ t.Fatalf("unregistered scratch directory %s was deleted: %v", d, err)
415
+ }
416
+ }
417
+ for _, id := range []string{"slice-a", "slice-b"} {
418
+ if _, err := os.Stat(WorkerWorktreePath(repo, batch, id)); !os.IsNotExist(err) {
419
+ t.Fatalf("registered worktree %s was not removed: %v", id, err)
420
+ }
421
+ }
422
+ if joined := strings.Join(warnings, "\n"); !strings.Contains(joined, "not a worktree") {
423
+ t.Fatalf("expected a warning naming the refused path, got:\n%s", warnings)
424
+ }
425
+ })
225
426
  }
226
427
 
227
428
  // TestCleanupFailedSalvageKeepsWorktreeDir proves a salvage error keeps the
@@ -277,6 +478,255 @@ func TestCleanupFailedSalvageKeepsWorktreeDir(t *testing.T) {
277
478
  }
278
479
  }
279
480
 
481
+ // TestCleanupNamesDirectoryGitDroppedButNotDeleted proves that when git has
482
+ // already dropped a worktree and its directory cannot be deleted, the error
483
+ // names the directory and says a rerun will not delete it, and the rerun does
484
+ // leave it on disk.
485
+ func TestCleanupNamesDirectoryGitDroppedButNotDeleted(t *testing.T) {
486
+ if os.Geteuid() == 0 || runtime.GOOS == "windows" {
487
+ t.Skip("directory permissions do not bind root or windows")
488
+ }
489
+ repo, base := setupRepo(t)
490
+ slug, batch := "demo-feature", "batch1"
491
+ if _, err := Create(CreateOpts{
492
+ Root: repo,
493
+ Slug: slug,
494
+ BatchID: batch,
495
+ BaseSHA: base,
496
+ Slices: []SlicePaths{
497
+ {ID: "slice-a", Paths: []string{"src/a.go"}},
498
+ {ID: "slice-b", Paths: []string{"src/b.go"}},
499
+ },
500
+ }); err != nil {
501
+ t.Fatal(err)
502
+ }
503
+ wt := WorkerWorktreePath(repo, batch, "slice-a")
504
+ batchDir := filepath.Dir(wt)
505
+
506
+ swapSeams(t)
507
+ warnf = func(string, ...any) {}
508
+ removeWorktree = func(repo, path string) error {
509
+ // Like real git: drop the registration, fail to delete the
510
+ // directory, and exit non-zero.
511
+ if err := os.RemoveAll(filepath.Join(repo, ".git", "worktrees", filepath.Base(path))); err != nil {
512
+ return err
513
+ }
514
+ if err := os.Chmod(batchDir, 0o500); err != nil {
515
+ return err
516
+ }
517
+ return errors.New("failed to delete '" + path + "': Permission denied")
518
+ }
519
+ t.Cleanup(func() { _ = os.Chmod(batchDir, 0o700) })
520
+
521
+ _, err := Cleanup(repo, slug, true)
522
+ if err == nil || !strings.Contains(err.Error(), wt) || !strings.Contains(err.Error(), "remove it by hand") {
523
+ t.Fatalf("error must name %s and say it needs manual removal, got %v", wt, err)
524
+ }
525
+ if err := os.Chmod(batchDir, 0o700); err != nil {
526
+ t.Fatal(err)
527
+ }
528
+ if _, err := Cleanup(repo, slug, true); err != nil {
529
+ t.Fatalf("rerun: %v", err)
530
+ }
531
+ if _, err := os.Stat(wt); err != nil {
532
+ t.Fatalf("rerun must leave the unregistered directory in place, stat err=%v", err)
533
+ }
534
+ }
535
+
536
+ // TestCleanupFailedListNamesEachEntryOnce proves a slice whose directory
537
+ // removal fails in both the per-slice and the scratch-entry pass is named once,
538
+ // in lease order.
539
+ func TestCleanupFailedListNamesEachEntryOnce(t *testing.T) {
540
+ if os.Geteuid() == 0 || runtime.GOOS == "windows" {
541
+ t.Skip("directory permissions do not bind root or windows")
542
+ }
543
+ repo, base := setupRepo(t)
544
+ slug, batch := "demo-feature", "batch1"
545
+ if _, err := Create(CreateOpts{
546
+ Root: repo,
547
+ Slug: slug,
548
+ BatchID: batch,
549
+ BaseSHA: base,
550
+ Slices: []SlicePaths{
551
+ {ID: "slice-a", Paths: []string{"src/a.go"}},
552
+ {ID: "slice-b", Paths: []string{"src/b.go"}},
553
+ },
554
+ }); err != nil {
555
+ t.Fatal(err)
556
+ }
557
+ batchDir := filepath.Dir(WorkerWorktreePath(repo, batch, "slice-a"))
558
+
559
+ swapSeams(t)
560
+ warnf = func(string, ...any) {}
561
+ removeWorktree = func(string, string) error {
562
+ if err := os.Chmod(batchDir, 0o500); err != nil {
563
+ return err
564
+ }
565
+ return errors.New("simulated stuck worker worktree")
566
+ }
567
+ t.Cleanup(func() { _ = os.Chmod(batchDir, 0o700) })
568
+
569
+ _, err := Cleanup(repo, slug, true)
570
+ const want = "cleanup incomplete for slice-a, slice-b; "
571
+ if err == nil || !strings.HasPrefix(err.Error(), want) {
572
+ t.Fatalf("failed list must name slice-a and slice-b once each, want prefix %q, got %v", want, err)
573
+ }
574
+ }
575
+
576
+ // TestCleanupKeepsRerunGuidanceWhileStillRegistered proves a failed directory
577
+ // delete that leaves git's registration intact is retryable: the error asks for
578
+ // a rerun and does not tell the operator to remove the directory by hand.
579
+ func TestCleanupKeepsRerunGuidanceWhileStillRegistered(t *testing.T) {
580
+ if os.Geteuid() == 0 || runtime.GOOS == "windows" {
581
+ t.Skip("directory permissions do not bind root or windows")
582
+ }
583
+ repo, base := setupRepo(t)
584
+ slug, batch := "demo-feature", "batch1"
585
+ if _, err := Create(CreateOpts{
586
+ Root: repo,
587
+ Slug: slug,
588
+ BatchID: batch,
589
+ BaseSHA: base,
590
+ Slices: []SlicePaths{
591
+ {ID: "slice-a", Paths: []string{"src/a.go"}},
592
+ {ID: "slice-b", Paths: []string{"src/b.go"}},
593
+ },
594
+ }); err != nil {
595
+ t.Fatal(err)
596
+ }
597
+ wt := WorkerWorktreePath(repo, batch, "slice-a")
598
+ batchDir := filepath.Dir(wt)
599
+
600
+ swapSeams(t)
601
+ warnf = func(string, ...any) {}
602
+ removeWorktree = func(repo, path string) error {
603
+ if err := os.Chmod(batchDir, 0o500); err != nil {
604
+ return err
605
+ }
606
+ return errors.New("failed to delete '" + path + "': Permission denied")
607
+ }
608
+ t.Cleanup(func() { _ = os.Chmod(batchDir, 0o700) })
609
+
610
+ _, err := Cleanup(repo, slug, true)
611
+ if err == nil || !strings.Contains(err.Error(), "rerun cleanup") {
612
+ t.Fatalf("error must ask for a rerun, got %v", err)
613
+ }
614
+ if strings.Contains(err.Error(), "remove it by hand") {
615
+ t.Fatalf("a still-registered worktree is retryable, got %v", err)
616
+ }
617
+ leasePath, lerr := LeasePath(repo, slug)
618
+ if lerr != nil {
619
+ t.Fatal(lerr)
620
+ }
621
+ if _, rerr := ReadLease(leasePath); rerr != nil {
622
+ t.Fatalf("lease must be kept for the rerun: %v", rerr)
623
+ }
624
+ }
625
+
626
+ // TestCleanupDoesNotClaimUnregisteredWhenListUnreadable proves that when git's
627
+ // registration cannot be re-read after a failed delete, the error says so
628
+ // instead of claiming git dropped the worktree.
629
+ func TestCleanupDoesNotClaimUnregisteredWhenListUnreadable(t *testing.T) {
630
+ if os.Geteuid() == 0 || runtime.GOOS == "windows" {
631
+ t.Skip("directory permissions do not bind root or windows")
632
+ }
633
+ repo, base := setupRepo(t)
634
+ slug, batch := "demo-feature", "batch1"
635
+ if _, err := Create(CreateOpts{
636
+ Root: repo,
637
+ Slug: slug,
638
+ BatchID: batch,
639
+ BaseSHA: base,
640
+ Slices: []SlicePaths{
641
+ {ID: "slice-a", Paths: []string{"src/a.go"}},
642
+ {ID: "slice-b", Paths: []string{"src/b.go"}},
643
+ },
644
+ }); err != nil {
645
+ t.Fatal(err)
646
+ }
647
+ wt := WorkerWorktreePath(repo, batch, "slice-a")
648
+ batchDir := filepath.Dir(wt)
649
+ gitDir := filepath.Join(repo, ".git")
650
+
651
+ swapSeams(t)
652
+ warnf = func(string, ...any) {}
653
+ removeWorktree = func(repo, path string) error {
654
+ if err := os.Chmod(batchDir, 0o500); err != nil {
655
+ return err
656
+ }
657
+ if err := os.Chmod(gitDir, 0o000); err != nil {
658
+ return err
659
+ }
660
+ return errors.New("failed to delete '" + path + "': Permission denied")
661
+ }
662
+ t.Cleanup(func() {
663
+ _ = os.Chmod(batchDir, 0o700)
664
+ _ = os.Chmod(gitDir, 0o755)
665
+ })
666
+
667
+ _, err := Cleanup(repo, slug, true)
668
+ if err == nil || !strings.Contains(err.Error(), wt) {
669
+ t.Fatalf("error must name %s, got %v", wt, err)
670
+ }
671
+ if strings.Contains(err.Error(), "no longer registers") {
672
+ t.Fatalf("registration is unknown, must not be called dropped: %v", err)
673
+ }
674
+ if !strings.Contains(err.Error(), "could not confirm whether git still registers") {
675
+ t.Fatalf("error must say registration could not be confirmed, got %v", err)
676
+ }
677
+ }
678
+
679
+ // TestCleanupStrandedRealGit runs the real git: an undeletable file inside the
680
+ // worktree makes `git worktree remove --force` unregister it and still fail,
681
+ // so stranding must be decided from git's registration, not the exit code.
682
+ func TestCleanupStrandedRealGit(t *testing.T) {
683
+ if os.Geteuid() == 0 || runtime.GOOS == "windows" {
684
+ t.Skip("directory permissions do not bind root or windows")
685
+ }
686
+ repo, base := setupRepo(t)
687
+ slug, batch := "demo-feature", "batch1"
688
+ if _, err := Create(CreateOpts{
689
+ Root: repo,
690
+ Slug: slug,
691
+ BatchID: batch,
692
+ BaseSHA: base,
693
+ Slices: []SlicePaths{
694
+ {ID: "slice-a", Paths: []string{"src/a.go"}},
695
+ {ID: "slice-b", Paths: []string{"src/b.go"}},
696
+ },
697
+ }); err != nil {
698
+ t.Fatal(err)
699
+ }
700
+ wt := WorkerWorktreePath(repo, batch, "slice-a")
701
+ locked := filepath.Join(wt, "locked")
702
+ if err := os.MkdirAll(locked, 0o755); err != nil {
703
+ t.Fatal(err)
704
+ }
705
+ if err := os.WriteFile(filepath.Join(locked, "f"), []byte("x"), 0o644); err != nil {
706
+ t.Fatal(err)
707
+ }
708
+ if err := os.Chmod(locked, 0o555); err != nil {
709
+ t.Fatal(err)
710
+ }
711
+ t.Cleanup(func() { _ = os.Chmod(locked, 0o755) })
712
+
713
+ swapSeams(t)
714
+ warnf = func(string, ...any) {}
715
+ _, err := Cleanup(repo, slug, true)
716
+ if err == nil || !strings.Contains(err.Error(), wt) || !strings.Contains(err.Error(), "remove it by hand") {
717
+ t.Fatalf("error must name %s and say it needs manual removal, got %v", wt, err)
718
+ }
719
+ if err := os.Chmod(locked, 0o755); err != nil {
720
+ t.Fatal(err)
721
+ }
722
+ if _, err := Cleanup(repo, slug, true); err != nil {
723
+ t.Fatalf("rerun: %v", err)
724
+ }
725
+ if _, err := os.Stat(wt); err != nil {
726
+ t.Fatalf("rerun must leave the unregistered directory in place, stat err=%v", err)
727
+ }
728
+ }
729
+
280
730
  // TestConcurrentRecordGreenKeepsEverySlice proves the feature lock serializes
281
731
  // concurrent record-green calls so no sibling's transfer commit is lost to a
282
732
  // read-modify-write race on the lease.
@@ -379,15 +829,19 @@ func TestConcurrentCreateSingleWinner(t *testing.T) {
379
829
  }
380
830
  }
381
831
 
382
- // TestCleanupWarnsOnFailedBranchCleanup proves Cleanup reports branch cleanup
383
- // failures instead of erasing the lease while orphans remain.
384
- func TestCleanupWarnsOnFailedBranchCleanup(t *testing.T) {
832
+ // stuckBranchBatch creates a two-slice batch and stubs worktree removal so
833
+ // cleanup leaves a stale registration behind: Cleanup's own RemoveAll deletes
834
+ // the worktree directory while git still lists the branch as checked out, so
835
+ // deleteBranch refuses. It returns the repo, slug, the stuck branch and the
836
+ // captured warnings.
837
+ func stuckBranchBatch(t *testing.T) (repo, slug, branch string, warnings *[]string) {
838
+ t.Helper()
385
839
  repo, base := setupRepo(t)
386
- slug, batch := "demo-feature", "batch1"
840
+ slug = "demo-feature"
387
841
  lease, err := Create(CreateOpts{
388
842
  Root: repo,
389
843
  Slug: slug,
390
- BatchID: batch,
844
+ BatchID: "batch1",
391
845
  BaseSHA: base,
392
846
  Slices: []SlicePaths{
393
847
  {ID: "slice-a", Paths: []string{"src/a.go"}},
@@ -397,33 +851,45 @@ func TestCleanupWarnsOnFailedBranchCleanup(t *testing.T) {
397
851
  if err != nil {
398
852
  t.Fatal(err)
399
853
  }
400
- branchA := lease.Slices[0].Branch
401
-
402
854
  swapSeams(t)
403
- // Removal "fails" without removing; Cleanup's own RemoveAll then deletes
404
- // the worktree directory while the stale git registration still lists the
405
- // branch as checked out, so deleteBranch refuses and must be reported.
406
855
  removeWorktree = func(string, string) error {
407
856
  return errors.New("simulated stuck worker worktree")
408
857
  }
409
- var warnings []string
858
+ warnings = new([]string)
410
859
  warnf = func(format string, args ...any) {
411
- warnings = append(warnings, fmt.Sprintf(format, args...))
860
+ *warnings = append(*warnings, fmt.Sprintf(format, args...))
412
861
  }
862
+ return repo, slug, lease.Slices[0].Branch, warnings
863
+ }
413
864
 
414
- if _, err := Cleanup(repo, slug, true); err != nil {
415
- t.Fatalf("cleanup continues after reporting failures: %v", err)
416
- }
417
- joined := strings.Join(warnings, "\n")
418
- if !strings.Contains(joined, branchA) {
419
- t.Fatalf("warnings should name the stuck branch %s, got:\n%s", branchA, joined)
865
+ // TestCleanupWarnsOnFailedBranchCleanup proves Cleanup reports branch cleanup
866
+ // failures and keeps the lease so the orphans stay reachable for a rerun.
867
+ func TestCleanupWarnsOnFailedBranchCleanup(t *testing.T) {
868
+ repo, slug, branchA, warnings := stuckBranchBatch(t)
869
+
870
+ if _, err := Cleanup(repo, slug, true); err == nil || !strings.Contains(err.Error(), "slice-a") {
871
+ t.Fatalf("cleanup must fail naming slice-a, got %v", err)
420
872
  }
421
873
  leasePath, err := LeasePath(repo, slug)
422
874
  if err != nil {
423
875
  t.Fatal(err)
424
876
  }
877
+ if _, err := os.Stat(leasePath); err != nil {
878
+ t.Fatalf("lease must survive a failed cleanup, got %v", err)
879
+ }
880
+ // The rerun finds the lease and, with the stale registration pruned by the
881
+ // first pass, completes the removal and clears it.
882
+ if _, err := Cleanup(repo, slug, true); err != nil {
883
+ t.Fatalf("rerun against the kept lease: %v", err)
884
+ }
425
885
  if _, err := os.Stat(leasePath); !os.IsNotExist(err) {
426
- t.Fatalf("cleanup should still clear the lease, got %v", err)
886
+ t.Fatalf("rerun should clear the lease, got %v", err)
887
+ }
888
+ if exists, err := branchExists(repo, branchA); err != nil || exists {
889
+ t.Fatalf("rerun should delete %s: exists=%v err=%v", branchA, exists, err)
890
+ }
891
+ if joined := strings.Join(*warnings, "\n"); !strings.Contains(joined, branchA) {
892
+ t.Fatalf("warnings should name the stuck branch %s, got:\n%s", branchA, joined)
427
893
  }
428
894
  }
429
895
 
@@ -454,3 +920,20 @@ func TestControlCommitMessage(t *testing.T) {
454
920
  t.Fatalf("empty summary after strip: %q", got)
455
921
  }
456
922
  }
923
+
924
+ func TestCreateRefusesAncestorOverlap(t *testing.T) {
925
+ repo, base := setupRepo(t)
926
+ _, err := Create(CreateOpts{
927
+ Root: repo,
928
+ Slug: "demo",
929
+ BatchID: "batch1",
930
+ BaseSHA: base,
931
+ Slices: []SlicePaths{
932
+ {ID: "slice-a", Paths: []string{"src"}},
933
+ {ID: "slice-b", Paths: []string{"src/a.go"}},
934
+ },
935
+ })
936
+ if err == nil || !strings.Contains(err.Error(), "overlap") {
937
+ t.Fatalf("expected overlap refusal, got %v", err)
938
+ }
939
+ }