devrites 6.0.4 → 6.1.1

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 (800) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +24 -9
  3. package/SECURITY.md +9 -6
  4. package/bin/devrites.mjs +28 -12
  5. package/docs/adr/0035-claude-root-leaves-plan-mode.md +33 -0
  6. package/docs/adr/0036-archive-recall-is-a-read-time-query.md +32 -0
  7. package/docs/adr/README.md +4 -2
  8. package/docs/architecture.md +3 -1
  9. package/docs/cli.md +25 -2
  10. package/docs/command-map.md +10 -8
  11. package/docs/engine/commands.md +6 -3
  12. package/docs/harness-compliance.md +2 -2
  13. package/docs/orchestration.md +5 -4
  14. package/docs/release.md +4 -4
  15. package/docs/skills.md +2 -2
  16. package/engine/commands.go +1 -1
  17. package/engine/help.go +10 -6
  18. package/engine/internal/acceptance/cli.go +4 -1
  19. package/engine/internal/acceptance/exec.go +11 -11
  20. package/engine/internal/devritespaths/paths.go +5 -0
  21. package/engine/internal/hostpack/hostpack.go +48 -3
  22. package/engine/internal/install/apply.go +68 -1
  23. package/engine/internal/install/binary.go +4 -0
  24. package/engine/internal/install/install.go +25 -15
  25. package/engine/internal/install/merge.go +287 -123
  26. package/engine/internal/install/preflight.go +71 -1
  27. package/engine/internal/install/uninstall.go +7 -1
  28. package/engine/internal/install/update.go +7 -3
  29. package/engine/internal/lib/claims.go +30 -14
  30. package/engine/internal/lib/cli_observe.go +6 -0
  31. package/engine/internal/lib/context.go +24 -7
  32. package/engine/internal/lib/diffscope.go +79 -3
  33. package/engine/internal/lib/dispatch.go +34 -7
  34. package/engine/internal/lib/drift.go +9 -2
  35. package/engine/internal/lib/handoff.go +14 -5
  36. package/engine/internal/lib/metrics.go +29 -9
  37. package/engine/internal/lib/migrate.go +30 -12
  38. package/engine/internal/lib/next.go +22 -2
  39. package/engine/internal/lib/open_visual.go +3 -1
  40. package/engine/internal/lib/recall.go +355 -0
  41. package/engine/internal/lib/regression.go +20 -0
  42. package/engine/internal/lib/resolve.go +96 -53
  43. package/engine/internal/lib/secretscan.go +24 -1
  44. package/engine/internal/lib/taskgraph.go +31 -1
  45. package/engine/internal/lib/util.go +18 -7
  46. package/engine/internal/lib/windows.go +68 -15
  47. package/engine/internal/markdowntext/markdowntext.go +45 -6
  48. package/engine/internal/notes/cli.go +5 -3
  49. package/engine/internal/notes/notes.go +8 -3
  50. package/engine/internal/overhaul/admit/run.go +16 -12
  51. package/engine/internal/overhaul/overhaul.go +1 -0
  52. package/engine/internal/overhaul/records/check.go +52 -9
  53. package/engine/internal/overhaul/render/run.go +3 -2
  54. package/engine/internal/overhaul/snapshot/run.go +2 -2
  55. package/engine/internal/parallel/git.go +5 -6
  56. package/engine/internal/parallel/ops.go +3 -0
  57. package/engine/internal/parallel/pathdisjoint.go +9 -4
  58. package/engine/internal/release/release.go +11 -9
  59. package/engine/internal/safepath/safepath.go +17 -1
  60. package/engine/internal/state/budgets.go +8 -4
  61. package/engine/internal/state/feature.go +3 -1
  62. package/engine/internal/state/observation.go +12 -7
  63. package/engine/internal/state/taskgraph.go +67 -12
  64. package/engine/internal/state/write.go +7 -1
  65. package/engine/main.go +5 -1
  66. package/pack/.claude/agents/_shared/composition-overhaul.md +2 -0
  67. package/pack/.claude/agents/devrites-devex-reviewer.md +5 -0
  68. package/pack/.claude/agents/devrites-evidence-scout.md +4 -0
  69. package/pack/.claude/agents/devrites-plan-reviewer.md +4 -1
  70. package/pack/.claude/agents/overhaul-implementer.md +1 -0
  71. package/pack/.claude/settings.json +4 -4
  72. package/pack/.claude/skills/devrites-api-interface/SKILL.md +1 -1
  73. package/pack/.claude/skills/devrites-audit/SKILL.md +1 -1
  74. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +1 -1
  75. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +8 -6
  76. package/pack/.claude/skills/devrites-doubt/SKILL.md +1 -1
  77. package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +1 -1
  78. package/pack/.claude/skills/devrites-interview/SKILL.md +1 -1
  79. package/pack/.claude/skills/devrites-lib/reference/intent-map.md +3 -3
  80. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -3
  81. package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +12 -15
  82. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +30 -10
  83. package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  84. package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
  85. package/pack/.claude/skills/devrites-lib/reference/standards/core.md +1 -1
  86. package/pack/.claude/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  87. package/pack/.claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  88. package/pack/.claude/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  89. package/pack/.claude/skills/devrites-lib/reference/standards/one-shot-actions.md +7 -6
  90. package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +2 -0
  91. package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  92. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +13 -0
  93. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -6
  94. package/pack/.claude/skills/devrites-prose-craft/SKILL.md +1 -1
  95. package/pack/.claude/skills/devrites-source-driven/SKILL.md +1 -1
  96. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +1 -1
  97. package/pack/.claude/skills/overhaul/references/orchestration.md +6 -2
  98. package/pack/.claude/skills/overhaul/references/records.md +8 -3
  99. package/pack/.claude/skills/rite/SKILL.md +4 -3
  100. package/pack/.claude/skills/rite/reference/menu.md +6 -5
  101. package/pack/.claude/skills/rite-adopt/SKILL.md +4 -3
  102. package/pack/.claude/skills/rite-autocomplete/SKILL.md +17 -14
  103. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +9 -6
  104. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
  105. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +6 -3
  106. package/pack/.claude/skills/rite-build/reference/parallel-batch.md +5 -5
  107. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +19 -0
  108. package/pack/.claude/skills/rite-converge/SKILL.md +4 -3
  109. package/pack/.claude/skills/rite-customize/SKILL.md +1 -1
  110. package/pack/.claude/skills/rite-define/SKILL.md +3 -2
  111. package/pack/.claude/skills/rite-doctor/SKILL.md +12 -6
  112. package/pack/.claude/skills/rite-dogfood/SKILL.md +2 -2
  113. package/pack/.claude/skills/rite-explain/SKILL.md +1 -1
  114. package/pack/.claude/skills/rite-fast/SKILL.md +3 -1
  115. package/pack/.claude/skills/rite-handoff/SKILL.md +4 -3
  116. package/pack/.claude/skills/rite-learn/SKILL.md +2 -2
  117. package/pack/.claude/skills/rite-plan/SKILL.md +1 -1
  118. package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +2 -0
  119. package/pack/.claude/skills/rite-plan/reference/slicing.md +3 -1
  120. package/pack/.claude/skills/rite-pov/SKILL.md +1 -1
  121. package/pack/.claude/skills/rite-pr-feedback/SKILL.md +5 -4
  122. package/pack/.claude/skills/rite-pressure-test/SKILL.md +7 -5
  123. package/pack/.claude/skills/rite-prototype/SKILL.md +1 -1
  124. package/pack/.claude/skills/rite-prove/SKILL.md +4 -2
  125. package/pack/.claude/skills/rite-prove/reference/failure-triage.md +2 -1
  126. package/pack/.claude/skills/rite-quick/SKILL.md +10 -5
  127. package/pack/.claude/skills/rite-resolve/SKILL.md +3 -3
  128. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +4 -5
  129. package/pack/.claude/skills/rite-review/SKILL.md +2 -1
  130. package/pack/.claude/skills/rite-seal/SKILL.md +3 -3
  131. package/pack/.claude/skills/rite-seal/reference/go-no-go.md +2 -0
  132. package/pack/.claude/skills/rite-seal/reference/seal-template.md +5 -2
  133. package/pack/.claude/skills/rite-ship/reference/close-out.md +3 -2
  134. package/pack/.claude/skills/rite-spec/SKILL.md +4 -1
  135. package/pack/.claude/skills/rite-spec/reference/state-workspace.md +2 -2
  136. package/pack/.claude/skills/rite-status/SKILL.md +1 -1
  137. package/pack/.claude/skills/rite-temper/reference/significance.md +2 -0
  138. package/pack/.claude/skills/rite-upgrade/SKILL.md +4 -2
  139. package/pack/.claude/skills/rite-vet/SKILL.md +3 -2
  140. package/pack/.claude/skills/rite-vet/reference/artifacts.md +1 -1
  141. package/pack/.claude/skills/rite-watch-pr/SKILL.md +1 -1
  142. package/pack/.claude/skills/rite-zoom-out/SKILL.md +1 -1
  143. package/pack/generated/claude/agents/devrites-devex-reviewer.md +5 -0
  144. package/pack/generated/claude/agents/devrites-evidence-scout.md +4 -0
  145. package/pack/generated/claude/agents/devrites-plan-reviewer.md +4 -1
  146. package/pack/generated/claude/agents/overhaul-backend-engineer.md +2 -0
  147. package/pack/generated/claude/agents/overhaul-boundary.md +2 -0
  148. package/pack/generated/claude/agents/overhaul-craft.md +2 -0
  149. package/pack/generated/claude/agents/overhaul-frontend-engineer.md +2 -0
  150. package/pack/generated/claude/agents/overhaul-implementer.md +3 -0
  151. package/pack/generated/claude/agents/overhaul-recon.md +2 -0
  152. package/pack/generated/claude/agents/overhaul-specialist.md +2 -0
  153. package/pack/generated/claude/agents/overhaul-verifier.md +2 -0
  154. package/pack/generated/claude/settings.json +4 -4
  155. package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +1 -1
  156. package/pack/generated/claude/skills/devrites-audit/SKILL.md +1 -1
  157. package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +1 -1
  158. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +8 -6
  159. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +1 -1
  160. package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +1 -1
  161. package/pack/generated/claude/skills/devrites-interview/SKILL.md +1 -1
  162. package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +3 -3
  163. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -3
  164. package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +12 -15
  165. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +30 -10
  166. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  167. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
  168. package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +1 -1
  169. package/pack/generated/claude/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  170. package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  171. package/pack/generated/claude/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  172. package/pack/generated/claude/skills/devrites-lib/reference/standards/one-shot-actions.md +7 -6
  173. package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +2 -0
  174. package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  175. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +13 -0
  176. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -6
  177. package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +1 -1
  178. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +1 -1
  179. package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +1 -1
  180. package/pack/generated/claude/skills/overhaul/references/orchestration.md +6 -2
  181. package/pack/generated/claude/skills/overhaul/references/records.md +8 -3
  182. package/pack/generated/claude/skills/rite/SKILL.md +4 -3
  183. package/pack/generated/claude/skills/rite/reference/menu.md +6 -5
  184. package/pack/generated/claude/skills/rite-adopt/SKILL.md +4 -3
  185. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +17 -14
  186. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +9 -6
  187. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
  188. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +6 -3
  189. package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +5 -5
  190. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +19 -0
  191. package/pack/generated/claude/skills/rite-converge/SKILL.md +4 -3
  192. package/pack/generated/claude/skills/rite-customize/SKILL.md +1 -1
  193. package/pack/generated/claude/skills/rite-define/SKILL.md +3 -2
  194. package/pack/generated/claude/skills/rite-doctor/SKILL.md +12 -6
  195. package/pack/generated/claude/skills/rite-dogfood/SKILL.md +2 -2
  196. package/pack/generated/claude/skills/rite-explain/SKILL.md +1 -1
  197. package/pack/generated/claude/skills/rite-fast/SKILL.md +3 -1
  198. package/pack/generated/claude/skills/rite-handoff/SKILL.md +4 -3
  199. package/pack/generated/claude/skills/rite-learn/SKILL.md +2 -2
  200. package/pack/generated/claude/skills/rite-plan/SKILL.md +1 -1
  201. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +2 -0
  202. package/pack/generated/claude/skills/rite-plan/reference/slicing.md +3 -1
  203. package/pack/generated/claude/skills/rite-pov/SKILL.md +1 -1
  204. package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +5 -4
  205. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +7 -5
  206. package/pack/generated/claude/skills/rite-prototype/SKILL.md +1 -1
  207. package/pack/generated/claude/skills/rite-prove/SKILL.md +4 -2
  208. package/pack/generated/claude/skills/rite-prove/reference/failure-triage.md +2 -1
  209. package/pack/generated/claude/skills/rite-quick/SKILL.md +10 -5
  210. package/pack/generated/claude/skills/rite-resolve/SKILL.md +3 -3
  211. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +4 -5
  212. package/pack/generated/claude/skills/rite-review/SKILL.md +2 -1
  213. package/pack/generated/claude/skills/rite-seal/SKILL.md +3 -3
  214. package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +2 -0
  215. package/pack/generated/claude/skills/rite-seal/reference/seal-template.md +5 -2
  216. package/pack/generated/claude/skills/rite-ship/reference/close-out.md +3 -2
  217. package/pack/generated/claude/skills/rite-spec/SKILL.md +4 -1
  218. package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +2 -2
  219. package/pack/generated/claude/skills/rite-status/SKILL.md +1 -1
  220. package/pack/generated/claude/skills/rite-temper/reference/significance.md +2 -0
  221. package/pack/generated/claude/skills/rite-upgrade/SKILL.md +4 -2
  222. package/pack/generated/claude/skills/rite-vet/SKILL.md +3 -2
  223. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +1 -1
  224. package/pack/generated/claude/skills/rite-watch-pr/SKILL.md +1 -1
  225. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +1 -1
  226. package/pack/generated/codex/agents/devrites-code-reviewer.toml +7 -7
  227. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +6 -1
  228. package/pack/generated/codex/agents/devrites-evidence-scout.toml +4 -0
  229. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +1 -1
  230. package/pack/generated/codex/agents/devrites-plan-drafter.toml +3 -3
  231. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +5 -2
  232. package/pack/generated/codex/agents/devrites-proof-runner.toml +2 -2
  233. package/pack/generated/codex/agents/devrites-security-auditor.toml +1 -1
  234. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +1 -1
  235. package/pack/generated/codex/agents/devrites-slice-wright.toml +5 -5
  236. package/pack/generated/codex/agents/devrites-test-analyst.toml +5 -5
  237. package/pack/generated/codex/agents/devrites-upgrade-planner.toml +1 -1
  238. package/pack/generated/codex/agents/fast-builder.toml +3 -3
  239. package/pack/generated/codex/agents/fast-critic.toml +3 -3
  240. package/pack/generated/codex/agents/overhaul-backend-engineer.toml +2 -0
  241. package/pack/generated/codex/agents/overhaul-boundary.toml +2 -0
  242. package/pack/generated/codex/agents/overhaul-craft.toml +2 -0
  243. package/pack/generated/codex/agents/overhaul-frontend-engineer.toml +2 -0
  244. package/pack/generated/codex/agents/overhaul-implementer.toml +2 -0
  245. package/pack/generated/codex/agents/overhaul-recon.toml +2 -0
  246. package/pack/generated/codex/agents/overhaul-specialist.toml +2 -0
  247. package/pack/generated/codex/agents/overhaul-verifier.toml +2 -0
  248. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +1 -1
  249. package/pack/generated/codex/skills/devrites-audit/SKILL.md +1 -1
  250. package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +1 -1
  251. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +8 -6
  252. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +1 -1
  253. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +1 -1
  254. package/pack/generated/codex/skills/devrites-interview/SKILL.md +1 -1
  255. package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +3 -3
  256. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  257. package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +12 -15
  258. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +30 -10
  259. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +1 -1
  260. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  261. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +1 -1
  262. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +2 -2
  263. package/pack/generated/codex/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  264. package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  265. package/pack/generated/codex/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  266. package/pack/generated/codex/skills/devrites-lib/reference/standards/one-shot-actions.md +7 -6
  267. package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +2 -0
  268. package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  269. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +13 -0
  270. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  271. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +1 -1
  272. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +1 -1
  273. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +1 -1
  274. package/pack/generated/codex/skills/overhaul/SKILL.md +15 -15
  275. package/pack/generated/codex/skills/overhaul/references/audit-domains.md +2 -2
  276. package/pack/generated/codex/skills/overhaul/references/orchestration.md +11 -7
  277. package/pack/generated/codex/skills/overhaul/references/records.md +8 -3
  278. package/pack/generated/codex/skills/rite/SKILL.md +4 -3
  279. package/pack/generated/codex/skills/rite/reference/menu.md +6 -5
  280. package/pack/generated/codex/skills/rite-adopt/SKILL.md +4 -3
  281. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +18 -15
  282. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +9 -6
  283. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
  284. package/pack/generated/codex/skills/rite-build/SKILL.md +2 -2
  285. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +6 -3
  286. package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +6 -6
  287. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +20 -1
  288. package/pack/generated/codex/skills/rite-clarify/SKILL.md +1 -1
  289. package/pack/generated/codex/skills/rite-converge/SKILL.md +5 -4
  290. package/pack/generated/codex/skills/rite-customize/SKILL.md +1 -1
  291. package/pack/generated/codex/skills/rite-define/SKILL.md +4 -3
  292. package/pack/generated/codex/skills/rite-doctor/SKILL.md +12 -6
  293. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +2 -2
  294. package/pack/generated/codex/skills/rite-explain/SKILL.md +1 -1
  295. package/pack/generated/codex/skills/rite-fast/SKILL.md +8 -6
  296. package/pack/generated/codex/skills/rite-frame/SKILL.md +1 -1
  297. package/pack/generated/codex/skills/rite-handoff/SKILL.md +4 -3
  298. package/pack/generated/codex/skills/rite-learn/SKILL.md +2 -2
  299. package/pack/generated/codex/skills/rite-plan/SKILL.md +2 -2
  300. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +2 -0
  301. package/pack/generated/codex/skills/rite-plan/reference/slicing.md +3 -1
  302. package/pack/generated/codex/skills/rite-polish/SKILL.md +2 -2
  303. package/pack/generated/codex/skills/rite-pov/SKILL.md +1 -1
  304. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +5 -4
  305. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +7 -5
  306. package/pack/generated/codex/skills/rite-prototype/SKILL.md +1 -1
  307. package/pack/generated/codex/skills/rite-prove/SKILL.md +5 -3
  308. package/pack/generated/codex/skills/rite-prove/reference/failure-triage.md +2 -1
  309. package/pack/generated/codex/skills/rite-quick/SKILL.md +11 -6
  310. package/pack/generated/codex/skills/rite-resolve/SKILL.md +3 -3
  311. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +4 -5
  312. package/pack/generated/codex/skills/rite-review/SKILL.md +3 -2
  313. package/pack/generated/codex/skills/rite-seal/SKILL.md +4 -4
  314. package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +2 -0
  315. package/pack/generated/codex/skills/rite-seal/reference/seal-template.md +5 -2
  316. package/pack/generated/codex/skills/rite-ship/SKILL.md +1 -1
  317. package/pack/generated/codex/skills/rite-ship/reference/close-out.md +3 -2
  318. package/pack/generated/codex/skills/rite-spec/SKILL.md +5 -2
  319. package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +2 -2
  320. package/pack/generated/codex/skills/rite-status/SKILL.md +1 -1
  321. package/pack/generated/codex/skills/rite-temper/SKILL.md +2 -2
  322. package/pack/generated/codex/skills/rite-temper/reference/significance.md +2 -0
  323. package/pack/generated/codex/skills/rite-upgrade/SKILL.md +4 -2
  324. package/pack/generated/codex/skills/rite-vet/SKILL.md +4 -3
  325. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +1 -1
  326. package/pack/generated/codex/skills/rite-watch-pr/SKILL.md +1 -1
  327. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +1 -1
  328. package/pack/generated/devin/AGENTS.md +1 -1
  329. package/pack/generated/devin/agents/devrites-devex-reviewer.md +5 -0
  330. package/pack/generated/devin/agents/devrites-evidence-scout.md +4 -0
  331. package/pack/generated/devin/agents/devrites-plan-reviewer.md +4 -1
  332. package/pack/generated/devin/agents/overhaul-backend-engineer.md +2 -0
  333. package/pack/generated/devin/agents/overhaul-boundary.md +2 -0
  334. package/pack/generated/devin/agents/overhaul-craft.md +2 -0
  335. package/pack/generated/devin/agents/overhaul-frontend-engineer.md +2 -0
  336. package/pack/generated/devin/agents/overhaul-implementer.md +2 -0
  337. package/pack/generated/devin/agents/overhaul-recon.md +2 -0
  338. package/pack/generated/devin/agents/overhaul-specialist.md +2 -0
  339. package/pack/generated/devin/agents/overhaul-verifier.md +2 -0
  340. package/pack/generated/devin/skills/devrites-api-interface/SKILL.md +1 -1
  341. package/pack/generated/devin/skills/devrites-audit/SKILL.md +1 -1
  342. package/pack/generated/devin/skills/devrites-browser-proof/SKILL.md +1 -1
  343. package/pack/generated/devin/skills/devrites-debug-recovery/SKILL.md +8 -6
  344. package/pack/generated/devin/skills/devrites-doubt/SKILL.md +1 -1
  345. package/pack/generated/devin/skills/devrites-frontend-craft/SKILL.md +1 -1
  346. package/pack/generated/devin/skills/devrites-interview/SKILL.md +2 -2
  347. package/pack/generated/devin/skills/devrites-lib/reference/intent-map.md +3 -3
  348. package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  349. package/pack/generated/devin/skills/devrites-lib/reference/reply-contract.md +12 -15
  350. package/pack/generated/devin/skills/devrites-lib/reference/standards/afk-hitl.md +33 -13
  351. package/pack/generated/devin/skills/devrites-lib/reference/standards/agents.md +1 -1
  352. package/pack/generated/devin/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  353. package/pack/generated/devin/skills/devrites-lib/reference/standards/code-review.md +1 -1
  354. package/pack/generated/devin/skills/devrites-lib/reference/standards/core.md +2 -2
  355. package/pack/generated/devin/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  356. package/pack/generated/devin/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  357. package/pack/generated/devin/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  358. package/pack/generated/devin/skills/devrites-lib/reference/standards/one-shot-actions.md +7 -6
  359. package/pack/generated/devin/skills/devrites-lib/reference/standards/performance.md +2 -0
  360. package/pack/generated/devin/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  361. package/pack/generated/devin/skills/devrites-lib/reference/standards/testing.md +13 -0
  362. package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  363. package/pack/generated/devin/skills/devrites-prose-craft/SKILL.md +1 -1
  364. package/pack/generated/devin/skills/devrites-source-driven/SKILL.md +1 -1
  365. package/pack/generated/devin/skills/devrites-ux-shape/SKILL.md +1 -1
  366. package/pack/generated/devin/skills/overhaul/SKILL.md +15 -15
  367. package/pack/generated/devin/skills/overhaul/references/audit-domains.md +2 -2
  368. package/pack/generated/devin/skills/overhaul/references/orchestration.md +11 -7
  369. package/pack/generated/devin/skills/overhaul/references/records.md +8 -3
  370. package/pack/generated/devin/skills/rite/SKILL.md +4 -3
  371. package/pack/generated/devin/skills/rite/reference/menu.md +6 -5
  372. package/pack/generated/devin/skills/rite-adopt/SKILL.md +4 -3
  373. package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +19 -16
  374. package/pack/generated/devin/skills/rite-autocomplete/reference/decision-policy.md +1 -1
  375. package/pack/generated/devin/skills/rite-autocomplete/reference/loop.md +9 -6
  376. package/pack/generated/devin/skills/rite-autocomplete/reference/stop-conditions.md +26 -22
  377. package/pack/generated/devin/skills/rite-build/SKILL.md +2 -2
  378. package/pack/generated/devin/skills/rite-build/reference/afk-discipline.md +6 -3
  379. package/pack/generated/devin/skills/rite-build/reference/checkpoint-protocol.md +2 -2
  380. package/pack/generated/devin/skills/rite-build/reference/parallel-batch.md +6 -6
  381. package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +20 -1
  382. package/pack/generated/devin/skills/rite-clarify/SKILL.md +1 -1
  383. package/pack/generated/devin/skills/rite-converge/SKILL.md +5 -4
  384. package/pack/generated/devin/skills/rite-customize/SKILL.md +1 -1
  385. package/pack/generated/devin/skills/rite-define/SKILL.md +4 -3
  386. package/pack/generated/devin/skills/rite-doctor/SKILL.md +12 -6
  387. package/pack/generated/devin/skills/rite-dogfood/SKILL.md +2 -2
  388. package/pack/generated/devin/skills/rite-explain/SKILL.md +3 -3
  389. package/pack/generated/devin/skills/rite-explain/reference/intake.md +1 -1
  390. package/pack/generated/devin/skills/rite-fast/SKILL.md +8 -6
  391. package/pack/generated/devin/skills/rite-frame/SKILL.md +1 -1
  392. package/pack/generated/devin/skills/rite-handoff/SKILL.md +4 -3
  393. package/pack/generated/devin/skills/rite-learn/SKILL.md +2 -2
  394. package/pack/generated/devin/skills/rite-plan/SKILL.md +2 -2
  395. package/pack/generated/devin/skills/rite-plan/reference/replan-and-repair.md +2 -0
  396. package/pack/generated/devin/skills/rite-plan/reference/slicing.md +3 -1
  397. package/pack/generated/devin/skills/rite-polish/SKILL.md +2 -2
  398. package/pack/generated/devin/skills/rite-pov/SKILL.md +1 -1
  399. package/pack/generated/devin/skills/rite-pr-feedback/SKILL.md +5 -4
  400. package/pack/generated/devin/skills/rite-pressure-test/SKILL.md +7 -5
  401. package/pack/generated/devin/skills/rite-prototype/SKILL.md +1 -1
  402. package/pack/generated/devin/skills/rite-prove/SKILL.md +5 -3
  403. package/pack/generated/devin/skills/rite-prove/reference/failure-triage.md +2 -1
  404. package/pack/generated/devin/skills/rite-quick/SKILL.md +11 -6
  405. package/pack/generated/devin/skills/rite-resolve/SKILL.md +4 -4
  406. package/pack/generated/devin/skills/rite-resolve/reference/answer-protocol.md +4 -5
  407. package/pack/generated/devin/skills/rite-review/SKILL.md +3 -2
  408. package/pack/generated/devin/skills/rite-seal/SKILL.md +4 -4
  409. package/pack/generated/devin/skills/rite-seal/reference/go-no-go.md +2 -0
  410. package/pack/generated/devin/skills/rite-seal/reference/seal-template.md +5 -2
  411. package/pack/generated/devin/skills/rite-ship/SKILL.md +1 -1
  412. package/pack/generated/devin/skills/rite-ship/reference/close-out.md +3 -2
  413. package/pack/generated/devin/skills/rite-spec/SKILL.md +5 -2
  414. package/pack/generated/devin/skills/rite-spec/reference/investigation.md +1 -1
  415. package/pack/generated/devin/skills/rite-spec/reference/state-workspace.md +2 -2
  416. package/pack/generated/devin/skills/rite-status/SKILL.md +1 -1
  417. package/pack/generated/devin/skills/rite-temper/SKILL.md +3 -3
  418. package/pack/generated/devin/skills/rite-temper/reference/scope-modes.md +1 -1
  419. package/pack/generated/devin/skills/rite-temper/reference/significance.md +3 -1
  420. package/pack/generated/devin/skills/rite-upgrade/SKILL.md +4 -2
  421. package/pack/generated/devin/skills/rite-vet/SKILL.md +4 -3
  422. package/pack/generated/devin/skills/rite-vet/reference/artifacts.md +1 -1
  423. package/pack/generated/devin/skills/rite-vet/reference/review-axes.md +2 -2
  424. package/pack/generated/devin/skills/rite-watch-pr/SKILL.md +1 -1
  425. package/pack/generated/devin/skills/rite-zoom-out/SKILL.md +1 -1
  426. package/pack/generated/omp/agents/devrites-code-reviewer.md +7 -7
  427. package/pack/generated/omp/agents/devrites-devex-reviewer.md +6 -1
  428. package/pack/generated/omp/agents/devrites-evidence-scout.md +4 -0
  429. package/pack/generated/omp/agents/devrites-frontend-reviewer.md +1 -1
  430. package/pack/generated/omp/agents/devrites-plan-drafter.md +3 -3
  431. package/pack/generated/omp/agents/devrites-plan-reviewer.md +5 -2
  432. package/pack/generated/omp/agents/devrites-proof-runner.md +2 -2
  433. package/pack/generated/omp/agents/devrites-security-auditor.md +1 -1
  434. package/pack/generated/omp/agents/devrites-simplifier-reviewer.md +1 -1
  435. package/pack/generated/omp/agents/devrites-slice-wright.md +5 -5
  436. package/pack/generated/omp/agents/devrites-test-analyst.md +5 -5
  437. package/pack/generated/omp/agents/devrites-upgrade-planner.md +1 -1
  438. package/pack/generated/omp/agents/fast-builder.md +3 -3
  439. package/pack/generated/omp/agents/fast-critic.md +3 -3
  440. package/pack/generated/omp/agents/overhaul-backend-engineer.md +2 -0
  441. package/pack/generated/omp/agents/overhaul-boundary.md +2 -0
  442. package/pack/generated/omp/agents/overhaul-craft.md +2 -0
  443. package/pack/generated/omp/agents/overhaul-frontend-engineer.md +2 -0
  444. package/pack/generated/omp/agents/overhaul-implementer.md +2 -0
  445. package/pack/generated/omp/agents/overhaul-recon.md +2 -0
  446. package/pack/generated/omp/agents/overhaul-specialist.md +2 -0
  447. package/pack/generated/omp/agents/overhaul-verifier.md +2 -0
  448. package/pack/generated/omp/commands/rite-resolve.md +1 -1
  449. package/pack/generated/omp/skills/devrites-api-interface/SKILL.md +4 -4
  450. package/pack/generated/omp/skills/devrites-audit/SKILL.md +5 -5
  451. package/pack/generated/omp/skills/devrites-browser-proof/SKILL.md +5 -5
  452. package/pack/generated/omp/skills/devrites-browser-proof/reference/browser-performance.md +1 -1
  453. package/pack/generated/omp/skills/devrites-browser-proof/reference/visual-verdict.md +1 -1
  454. package/pack/generated/omp/skills/devrites-debug-recovery/SKILL.md +12 -10
  455. package/pack/generated/omp/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +1 -1
  456. package/pack/generated/omp/skills/devrites-doubt/SKILL.md +6 -6
  457. package/pack/generated/omp/skills/devrites-frontend-craft/SKILL.md +3 -3
  458. package/pack/generated/omp/skills/devrites-frontend-craft/reference/craft.md +1 -1
  459. package/pack/generated/omp/skills/devrites-frontend-craft/reference/design-references.md +4 -4
  460. package/pack/generated/omp/skills/devrites-frontend-craft/reference/fullstack.md +1 -1
  461. package/pack/generated/omp/skills/devrites-frontend-craft/reference/quality-standards.md +8 -8
  462. package/pack/generated/omp/skills/devrites-frontend-craft/reference/reuse-first.md +2 -2
  463. package/pack/generated/omp/skills/devrites-frontend-craft/reference/shape.md +2 -2
  464. package/pack/generated/omp/skills/devrites-interview/SKILL.md +3 -3
  465. package/pack/generated/omp/skills/devrites-lib/reference/intent-map.md +4 -4
  466. package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +8 -7
  467. package/pack/generated/omp/skills/devrites-lib/reference/reply-contract.md +12 -15
  468. package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +38 -18
  469. package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +6 -6
  470. package/pack/generated/omp/skills/devrites-lib/reference/standards/browser-proof-checklist.md +2 -2
  471. package/pack/generated/omp/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  472. package/pack/generated/omp/skills/devrites-lib/reference/standards/code-review.md +3 -3
  473. package/pack/generated/omp/skills/devrites-lib/reference/standards/coding-style.md +1 -1
  474. package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +2 -2
  475. package/pack/generated/omp/skills/devrites-lib/reference/standards/core.md +4 -4
  476. package/pack/generated/omp/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  477. package/pack/generated/omp/skills/devrites-lib/reference/standards/debug-recovery.md +1 -1
  478. package/pack/generated/omp/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
  479. package/pack/generated/omp/skills/devrites-lib/reference/standards/developer-experience.md +8 -3
  480. package/pack/generated/omp/skills/devrites-lib/reference/standards/glossary.md +3 -3
  481. package/pack/generated/omp/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  482. package/pack/generated/omp/skills/devrites-lib/reference/standards/one-shot-actions.md +7 -6
  483. package/pack/generated/omp/skills/devrites-lib/reference/standards/performance.md +3 -1
  484. package/pack/generated/omp/skills/devrites-lib/reference/standards/prose-style.md +4 -4
  485. package/pack/generated/omp/skills/devrites-lib/reference/standards/release/ship-checklist.md +1 -1
  486. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/README.md +1 -1
  487. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/ci-workflows.md +1 -1
  488. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/react.md +1 -1
  489. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/stack-profile.md +5 -5
  490. package/pack/generated/omp/skills/devrites-lib/reference/standards/skill-authoring.md +15 -3
  491. package/pack/generated/omp/skills/devrites-lib/reference/standards/spec-grammar.md +3 -3
  492. package/pack/generated/omp/skills/devrites-lib/reference/standards/testing.md +14 -1
  493. package/pack/generated/omp/skills/devrites-lib/reference/standards/tooling.md +1 -1
  494. package/pack/generated/omp/skills/devrites-lib/reference/standards/verification-methods.md +1 -1
  495. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/index.md +2 -2
  496. package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +12 -8
  497. package/pack/generated/omp/skills/devrites-prose-craft/SKILL.md +4 -4
  498. package/pack/generated/omp/skills/devrites-prose-craft/reference/examples.md +1 -1
  499. package/pack/generated/omp/skills/devrites-source-driven/SKILL.md +3 -3
  500. package/pack/generated/omp/skills/devrites-ux-shape/SKILL.md +10 -10
  501. package/pack/generated/omp/skills/devrites-ux-shape/reference/brief-template.md +3 -3
  502. package/pack/generated/omp/skills/devrites-ux-shape/reference/visual-direction-probe.md +1 -1
  503. package/pack/generated/omp/skills/overhaul/references/orchestration.md +6 -2
  504. package/pack/generated/omp/skills/overhaul/references/records.md +8 -3
  505. package/pack/generated/omp/skills/rite/SKILL.md +8 -7
  506. package/pack/generated/omp/skills/rite/reference/menu.md +6 -5
  507. package/pack/generated/omp/skills/rite-adopt/SKILL.md +6 -5
  508. package/pack/generated/omp/skills/rite-adopt/reference/anti-patterns.md +1 -1
  509. package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +22 -19
  510. package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +1 -1
  511. package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +11 -8
  512. package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
  513. package/pack/generated/omp/skills/rite-build/SKILL.md +7 -7
  514. package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +7 -4
  515. package/pack/generated/omp/skills/rite-build/reference/anti-patterns.md +1 -1
  516. package/pack/generated/omp/skills/rite-build/reference/checkpoint-protocol.md +2 -2
  517. package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +2 -2
  518. package/pack/generated/omp/skills/rite-build/reference/frontend-trigger.md +1 -1
  519. package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +9 -9
  520. package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +6 -6
  521. package/pack/generated/omp/skills/rite-build/reference/tdd.md +1 -1
  522. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +27 -8
  523. package/pack/generated/omp/skills/rite-clarify/SKILL.md +4 -4
  524. package/pack/generated/omp/skills/rite-clarify/reference/anti-patterns.md +1 -1
  525. package/pack/generated/omp/skills/rite-converge/SKILL.md +16 -15
  526. package/pack/generated/omp/skills/rite-converge/reference/convergence-assessment.md +4 -4
  527. package/pack/generated/omp/skills/rite-customize/SKILL.md +2 -2
  528. package/pack/generated/omp/skills/rite-define/SKILL.md +25 -24
  529. package/pack/generated/omp/skills/rite-define/reference/anti-patterns.md +2 -2
  530. package/pack/generated/omp/skills/rite-define/reference/gates.md +2 -2
  531. package/pack/generated/omp/skills/rite-doctor/SKILL.md +12 -6
  532. package/pack/generated/omp/skills/rite-dogfood/SKILL.md +5 -5
  533. package/pack/generated/omp/skills/rite-explain/SKILL.md +7 -7
  534. package/pack/generated/omp/skills/rite-explain/reference/intake.md +1 -1
  535. package/pack/generated/omp/skills/rite-fast/SKILL.md +12 -10
  536. package/pack/generated/omp/skills/rite-fast/reference/artifacts.md +1 -1
  537. package/pack/generated/omp/skills/rite-frame/SKILL.md +6 -6
  538. package/pack/generated/omp/skills/rite-frame/reference/failure-modes.md +4 -4
  539. package/pack/generated/omp/skills/rite-handoff/SKILL.md +7 -6
  540. package/pack/generated/omp/skills/rite-learn/SKILL.md +6 -6
  541. package/pack/generated/omp/skills/rite-plan/SKILL.md +9 -9
  542. package/pack/generated/omp/skills/rite-plan/reference/anti-patterns.md +1 -1
  543. package/pack/generated/omp/skills/rite-plan/reference/replan-and-repair.md +3 -1
  544. package/pack/generated/omp/skills/rite-plan/reference/slicing.md +6 -4
  545. package/pack/generated/omp/skills/rite-plan/reference/task-breakdown.md +1 -1
  546. package/pack/generated/omp/skills/rite-polish/SKILL.md +6 -6
  547. package/pack/generated/omp/skills/rite-polish/reference/anti-ai-slop.md +9 -9
  548. package/pack/generated/omp/skills/rite-polish/reference/anti-patterns.md +1 -1
  549. package/pack/generated/omp/skills/rite-polish/reference/backend-polish.md +2 -2
  550. package/pack/generated/omp/skills/rite-polish/reference/browser-polish-evidence.md +1 -1
  551. package/pack/generated/omp/skills/rite-polish/reference/code.md +8 -8
  552. package/pack/generated/omp/skills/rite-polish/reference/design-memory.md +3 -3
  553. package/pack/generated/omp/skills/rite-polish/reference/design-system-discovery.md +1 -1
  554. package/pack/generated/omp/skills/rite-polish/reference/harden-checklist.md +1 -1
  555. package/pack/generated/omp/skills/rite-polish/reference/ledger.md +3 -3
  556. package/pack/generated/omp/skills/rite-polish/reference/ui.md +1 -1
  557. package/pack/generated/omp/skills/rite-pov/SKILL.md +2 -2
  558. package/pack/generated/omp/skills/rite-pr-feedback/SKILL.md +6 -5
  559. package/pack/generated/omp/skills/rite-pressure-test/SKILL.md +9 -7
  560. package/pack/generated/omp/skills/rite-prototype/SKILL.md +1 -1
  561. package/pack/generated/omp/skills/rite-prove/SKILL.md +17 -15
  562. package/pack/generated/omp/skills/rite-prove/reference/acceptance-proof.md +7 -7
  563. package/pack/generated/omp/skills/rite-prove/reference/anti-patterns.md +1 -1
  564. package/pack/generated/omp/skills/rite-prove/reference/browser-proof.md +3 -3
  565. package/pack/generated/omp/skills/rite-prove/reference/failure-triage.md +4 -3
  566. package/pack/generated/omp/skills/rite-quick/SKILL.md +19 -14
  567. package/pack/generated/omp/skills/rite-resolve/SKILL.md +6 -6
  568. package/pack/generated/omp/skills/rite-resolve/reference/answer-protocol.md +4 -5
  569. package/pack/generated/omp/skills/rite-review/SKILL.md +23 -22
  570. package/pack/generated/omp/skills/rite-review/reference/anti-patterns.md +1 -1
  571. package/pack/generated/omp/skills/rite-review/reference/cognitive-load.md +2 -2
  572. package/pack/generated/omp/skills/rite-review/reference/nielsen-heuristics.md +1 -1
  573. package/pack/generated/omp/skills/rite-review/reference/performance-checklist.md +1 -1
  574. package/pack/generated/omp/skills/rite-review/reference/performance-review.md +1 -1
  575. package/pack/generated/omp/skills/rite-review/reference/security-review.md +2 -2
  576. package/pack/generated/omp/skills/rite-seal/SKILL.md +11 -11
  577. package/pack/generated/omp/skills/rite-seal/reference/anti-patterns.md +1 -1
  578. package/pack/generated/omp/skills/rite-seal/reference/final-evidence.md +3 -3
  579. package/pack/generated/omp/skills/rite-seal/reference/go-no-go.md +3 -1
  580. package/pack/generated/omp/skills/rite-seal/reference/output.md +1 -1
  581. package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +4 -4
  582. package/pack/generated/omp/skills/rite-seal/reference/seal-template.md +5 -2
  583. package/pack/generated/omp/skills/rite-ship/SKILL.md +7 -7
  584. package/pack/generated/omp/skills/rite-ship/reference/anti-patterns.md +1 -1
  585. package/pack/generated/omp/skills/rite-ship/reference/close-out.md +5 -4
  586. package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +2 -2
  587. package/pack/generated/omp/skills/rite-ship/reference/rollout.md +3 -3
  588. package/pack/generated/omp/skills/rite-spec/SKILL.md +17 -14
  589. package/pack/generated/omp/skills/rite-spec/reference/anti-patterns.md +1 -1
  590. package/pack/generated/omp/skills/rite-spec/reference/investigation.md +3 -3
  591. package/pack/generated/omp/skills/rite-spec/reference/question-protocol.md +1 -1
  592. package/pack/generated/omp/skills/rite-spec/reference/spec-template.md +2 -2
  593. package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +10 -10
  594. package/pack/generated/omp/skills/rite-status/SKILL.md +2 -2
  595. package/pack/generated/omp/skills/rite-temper/SKILL.md +13 -13
  596. package/pack/generated/omp/skills/rite-temper/reference/anti-patterns.md +2 -2
  597. package/pack/generated/omp/skills/rite-temper/reference/review-dimensions.md +3 -3
  598. package/pack/generated/omp/skills/rite-temper/reference/scope-modes.md +3 -3
  599. package/pack/generated/omp/skills/rite-temper/reference/significance.md +4 -2
  600. package/pack/generated/omp/skills/rite-upgrade/SKILL.md +7 -5
  601. package/pack/generated/omp/skills/rite-vet/SKILL.md +14 -13
  602. package/pack/generated/omp/skills/rite-vet/reference/anti-patterns.md +2 -2
  603. package/pack/generated/omp/skills/rite-vet/reference/artifacts.md +3 -3
  604. package/pack/generated/omp/skills/rite-vet/reference/depth.md +3 -3
  605. package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +5 -5
  606. package/pack/generated/omp/skills/rite-watch-pr/SKILL.md +2 -2
  607. package/pack/generated/omp/skills/rite-zoom-out/SKILL.md +1 -1
  608. package/pack/generated/pi/agents/devrites-devex-reviewer.md +5 -0
  609. package/pack/generated/pi/agents/devrites-evidence-scout.md +4 -0
  610. package/pack/generated/pi/agents/devrites-plan-reviewer.md +4 -1
  611. package/pack/generated/pi/agents/overhaul-backend-engineer.md +2 -0
  612. package/pack/generated/pi/agents/overhaul-boundary.md +2 -0
  613. package/pack/generated/pi/agents/overhaul-craft.md +2 -0
  614. package/pack/generated/pi/agents/overhaul-frontend-engineer.md +2 -0
  615. package/pack/generated/pi/agents/overhaul-implementer.md +2 -0
  616. package/pack/generated/pi/agents/overhaul-recon.md +2 -0
  617. package/pack/generated/pi/agents/overhaul-specialist.md +2 -0
  618. package/pack/generated/pi/agents/overhaul-verifier.md +2 -0
  619. package/pack/generated/pi/prompts/rite-resolve.md +1 -1
  620. package/pack/generated/pi/skills/devrites-api-interface/SKILL.md +1 -1
  621. package/pack/generated/pi/skills/devrites-audit/SKILL.md +1 -1
  622. package/pack/generated/pi/skills/devrites-browser-proof/SKILL.md +1 -1
  623. package/pack/generated/pi/skills/devrites-debug-recovery/SKILL.md +8 -6
  624. package/pack/generated/pi/skills/devrites-doubt/SKILL.md +1 -1
  625. package/pack/generated/pi/skills/devrites-frontend-craft/SKILL.md +1 -1
  626. package/pack/generated/pi/skills/devrites-interview/SKILL.md +1 -1
  627. package/pack/generated/pi/skills/devrites-lib/reference/intent-map.md +3 -3
  628. package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  629. package/pack/generated/pi/skills/devrites-lib/reference/reply-contract.md +12 -15
  630. package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +30 -10
  631. package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +1 -1
  632. package/pack/generated/pi/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  633. package/pack/generated/pi/skills/devrites-lib/reference/standards/code-review.md +1 -1
  634. package/pack/generated/pi/skills/devrites-lib/reference/standards/core.md +2 -2
  635. package/pack/generated/pi/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  636. package/pack/generated/pi/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  637. package/pack/generated/pi/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  638. package/pack/generated/pi/skills/devrites-lib/reference/standards/one-shot-actions.md +7 -6
  639. package/pack/generated/pi/skills/devrites-lib/reference/standards/performance.md +2 -0
  640. package/pack/generated/pi/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  641. package/pack/generated/pi/skills/devrites-lib/reference/standards/testing.md +13 -0
  642. package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  643. package/pack/generated/pi/skills/devrites-prose-craft/SKILL.md +1 -1
  644. package/pack/generated/pi/skills/devrites-source-driven/SKILL.md +1 -1
  645. package/pack/generated/pi/skills/devrites-ux-shape/SKILL.md +1 -1
  646. package/pack/generated/pi/skills/overhaul/SKILL.md +15 -15
  647. package/pack/generated/pi/skills/overhaul/references/audit-domains.md +2 -2
  648. package/pack/generated/pi/skills/overhaul/references/orchestration.md +11 -7
  649. package/pack/generated/pi/skills/overhaul/references/records.md +8 -3
  650. package/pack/generated/pi/skills/rite/SKILL.md +4 -3
  651. package/pack/generated/pi/skills/rite/reference/menu.md +6 -5
  652. package/pack/generated/pi/skills/rite-adopt/SKILL.md +4 -3
  653. package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +18 -15
  654. package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +9 -6
  655. package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
  656. package/pack/generated/pi/skills/rite-build/SKILL.md +2 -2
  657. package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +6 -3
  658. package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +6 -6
  659. package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +20 -1
  660. package/pack/generated/pi/skills/rite-clarify/SKILL.md +1 -1
  661. package/pack/generated/pi/skills/rite-converge/SKILL.md +5 -4
  662. package/pack/generated/pi/skills/rite-customize/SKILL.md +1 -1
  663. package/pack/generated/pi/skills/rite-define/SKILL.md +4 -3
  664. package/pack/generated/pi/skills/rite-doctor/SKILL.md +12 -6
  665. package/pack/generated/pi/skills/rite-dogfood/SKILL.md +2 -2
  666. package/pack/generated/pi/skills/rite-explain/SKILL.md +1 -1
  667. package/pack/generated/pi/skills/rite-fast/SKILL.md +8 -6
  668. package/pack/generated/pi/skills/rite-frame/SKILL.md +1 -1
  669. package/pack/generated/pi/skills/rite-handoff/SKILL.md +4 -3
  670. package/pack/generated/pi/skills/rite-learn/SKILL.md +2 -2
  671. package/pack/generated/pi/skills/rite-plan/SKILL.md +2 -2
  672. package/pack/generated/pi/skills/rite-plan/reference/replan-and-repair.md +2 -0
  673. package/pack/generated/pi/skills/rite-plan/reference/slicing.md +3 -1
  674. package/pack/generated/pi/skills/rite-polish/SKILL.md +2 -2
  675. package/pack/generated/pi/skills/rite-pov/SKILL.md +1 -1
  676. package/pack/generated/pi/skills/rite-pr-feedback/SKILL.md +5 -4
  677. package/pack/generated/pi/skills/rite-pressure-test/SKILL.md +7 -5
  678. package/pack/generated/pi/skills/rite-prototype/SKILL.md +1 -1
  679. package/pack/generated/pi/skills/rite-prove/SKILL.md +5 -3
  680. package/pack/generated/pi/skills/rite-prove/reference/failure-triage.md +2 -1
  681. package/pack/generated/pi/skills/rite-quick/SKILL.md +11 -6
  682. package/pack/generated/pi/skills/rite-resolve/SKILL.md +3 -3
  683. package/pack/generated/pi/skills/rite-resolve/reference/answer-protocol.md +4 -5
  684. package/pack/generated/pi/skills/rite-review/SKILL.md +3 -2
  685. package/pack/generated/pi/skills/rite-seal/SKILL.md +4 -4
  686. package/pack/generated/pi/skills/rite-seal/reference/go-no-go.md +2 -0
  687. package/pack/generated/pi/skills/rite-seal/reference/seal-template.md +5 -2
  688. package/pack/generated/pi/skills/rite-ship/SKILL.md +1 -1
  689. package/pack/generated/pi/skills/rite-ship/reference/close-out.md +3 -2
  690. package/pack/generated/pi/skills/rite-spec/SKILL.md +5 -2
  691. package/pack/generated/pi/skills/rite-spec/reference/state-workspace.md +2 -2
  692. package/pack/generated/pi/skills/rite-status/SKILL.md +1 -1
  693. package/pack/generated/pi/skills/rite-temper/SKILL.md +2 -2
  694. package/pack/generated/pi/skills/rite-temper/reference/significance.md +2 -0
  695. package/pack/generated/pi/skills/rite-upgrade/SKILL.md +4 -2
  696. package/pack/generated/pi/skills/rite-vet/SKILL.md +4 -3
  697. package/pack/generated/pi/skills/rite-vet/reference/artifacts.md +1 -1
  698. package/pack/generated/pi/skills/rite-watch-pr/SKILL.md +1 -1
  699. package/pack/generated/pi/skills/rite-zoom-out/SKILL.md +1 -1
  700. package/package.json +3 -2
  701. package/scripts/build-host-artifacts.sh +13 -0
  702. package/scripts/codex-generate.sh +5 -1
  703. package/scripts/devin-generate.sh +4 -3
  704. package/scripts/install-lib.sh +5 -0
  705. package/scripts/omp-generate.sh +23 -1
  706. package/scripts/pi-generate.sh +2 -2
  707. package/engine/cmd/releasepack/main_test.go +0 -239
  708. package/engine/harnessmatrix_test.go +0 -46
  709. package/engine/help_test.go +0 -241
  710. package/engine/internal/acceptance/acceptance_test.go +0 -946
  711. package/engine/internal/devritespaths/paths_test.go +0 -128
  712. package/engine/internal/fsutil/copy_test.go +0 -154
  713. package/engine/internal/gate/gate_test.go +0 -865
  714. package/engine/internal/gate/readiness_binding_test.go +0 -443
  715. package/engine/internal/gitenv/env_test.go +0 -48
  716. package/engine/internal/hostpack/hostpack_test.go +0 -269
  717. package/engine/internal/install/install_test.go +0 -1741
  718. package/engine/internal/install/workspace_advisory_test.go +0 -54
  719. package/engine/internal/lib/candidate_test.go +0 -506
  720. package/engine/internal/lib/claims_test.go +0 -267
  721. package/engine/internal/lib/closeout_test.go +0 -266
  722. package/engine/internal/lib/context_next_test.go +0 -912
  723. package/engine/internal/lib/cursor_compat_test.go +0 -65
  724. package/engine/internal/lib/detect_test.go +0 -118
  725. package/engine/internal/lib/drift_test.go +0 -135
  726. package/engine/internal/lib/dup_test.go +0 -666
  727. package/engine/internal/lib/environment_report_test.go +0 -54
  728. package/engine/internal/lib/evidencefresh_test.go +0 -120
  729. package/engine/internal/lib/handoff_test.go +0 -83
  730. package/engine/internal/lib/manifest_union_test.go +0 -251
  731. package/engine/internal/lib/metrics_test.go +0 -28
  732. package/engine/internal/lib/migrate_test.go +0 -213
  733. package/engine/internal/lib/observe_budgets_test.go +0 -428
  734. package/engine/internal/lib/open_visual_test.go +0 -291
  735. package/engine/internal/lib/regression_test.go +0 -282
  736. package/engine/internal/lib/resolve_remediation_test.go +0 -192
  737. package/engine/internal/lib/secretscan_test.go +0 -556
  738. package/engine/internal/lib/slicecheck_test.go +0 -170
  739. package/engine/internal/lib/taskgraph_test.go +0 -353
  740. package/engine/internal/lib/triggers_test.go +0 -23
  741. package/engine/internal/lib/util_test.go +0 -148
  742. package/engine/internal/lib/visual_outline_test.go +0 -189
  743. package/engine/internal/lib/windows_test.go +0 -420
  744. package/engine/internal/lib/workspace_read_test.go +0 -102
  745. package/engine/internal/markdowntext/markdowntext_fuzz_test.go +0 -36
  746. package/engine/internal/markdowntext/markdowntext_test.go +0 -58
  747. package/engine/internal/markdowntext/testdata/structural.json +0 -277
  748. package/engine/internal/notes/notes_test.go +0 -545
  749. package/engine/internal/overhaul/admit/admit_test.go +0 -204
  750. package/engine/internal/overhaul/admit/packet_test.go +0 -223
  751. package/engine/internal/overhaul/bench/run_test.go +0 -316
  752. package/engine/internal/overhaul/ovio/ovio_test.go +0 -75
  753. package/engine/internal/overhaul/packet/packet_test.go +0 -263
  754. package/engine/internal/overhaul/records/init_test.go +0 -96
  755. package/engine/internal/overhaul/records/records_test.go +0 -696
  756. package/engine/internal/overhaul/records/run_test.go +0 -77
  757. package/engine/internal/overhaul/render/run_test.go +0 -928
  758. package/engine/internal/overhaul/score/run_test.go +0 -636
  759. package/engine/internal/overhaul/snapshot/run_test.go +0 -718
  760. package/engine/internal/parallel/cli_test.go +0 -91
  761. package/engine/internal/parallel/ops_test.go +0 -939
  762. package/engine/internal/parallel/parallel_test.go +0 -645
  763. package/engine/internal/parallel/pathdisjoint_fuzz_test.go +0 -43
  764. package/engine/internal/parallel/pathdisjoint_test.go +0 -193
  765. package/engine/internal/parallel/select_test.go +0 -95
  766. package/engine/internal/parallel/testdata/fuzz/FuzzPathDisjoint/a449b81b4711b7b4 +0 -3
  767. package/engine/internal/reason/reason_test.go +0 -37
  768. package/engine/internal/release/release_test.go +0 -181
  769. package/engine/internal/rootfacts/facts_test.go +0 -364
  770. package/engine/internal/safepath/safepath_fuzz_test.go +0 -21
  771. package/engine/internal/safepath/safepath_test.go +0 -69
  772. package/engine/internal/safepath/safepath_windows_test.go +0 -26
  773. package/engine/internal/state/acceptance_test.go +0 -57
  774. package/engine/internal/state/budgets_test.go +0 -135
  775. package/engine/internal/state/cmd/workflowmanifest/main_test.go +0 -96
  776. package/engine/internal/state/concurrency_test.go +0 -184
  777. package/engine/internal/state/cursor_fuzz_test.go +0 -80
  778. package/engine/internal/state/cursor_test.go +0 -276
  779. package/engine/internal/state/observation_test.go +0 -961
  780. package/engine/internal/state/observation_unix_test.go +0 -68
  781. package/engine/internal/state/state_test.go +0 -986
  782. package/engine/internal/state/taskgraph_fuzz_test.go +0 -38
  783. package/engine/internal/state/taskgraph_test.go +0 -43
  784. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/114b28f68c1fa4db +0 -4
  785. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/378a0f2218e812ea +0 -4
  786. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/39eaa26fcb481e3c +0 -4
  787. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/776ca1dc0143acf0 +0 -4
  788. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/9295930c1ebb81df +0 -4
  789. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/a60de309dc33be0d +0 -4
  790. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f04dc7b06ef7c99f +0 -4
  791. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f3000ac510878bd6 +0 -4
  792. package/engine/internal/state/testdata/fuzz/FuzzWorkspaceSchemaRow/a75aabb9f2a847d5 +0 -2
  793. package/engine/internal/state/workspaceschema_fuzz_test.go +0 -27
  794. package/engine/internal/state/workspaceschema_test.go +0 -101
  795. package/engine/internal/state/write_test.go +0 -136
  796. package/engine/internal/version/version_test.go +0 -29
  797. package/engine/internal/workflow/commands_test.go +0 -18
  798. package/engine/note_routing_test.go +0 -95
  799. package/engine/observation_contract_test.go +0 -175
  800. package/engine/root_routing_test.go +0 -340
@@ -550,12 +550,17 @@ func Render(text, newline, id, summary, subject, quote, body string) string {
550
550
  }
551
551
 
552
552
  // RemoveEntry deletes one note block (its `- NOTE-` row through its last
553
- // contiguous attribute row) from the source text.
553
+ // attribute row) from the source text. Like ParseNotes, blank lines do not end
554
+ // the block; trailing blank lines stay.
554
555
  func RemoveEntry(text, newline string, note *Note) string {
555
556
  lines := strings.Split(strings.ReplaceAll(text, "\r\n", "\n"), "\n")
556
557
  end := note.Line
557
- for end < len(lines) && attrLineRE.MatchString(lines[end]) {
558
- end++
558
+ for i := end; i < len(lines); i++ {
559
+ if attrLineRE.MatchString(lines[i]) {
560
+ end = i + 1
561
+ } else if strings.TrimSpace(lines[i]) != "" {
562
+ break
563
+ }
559
564
  }
560
565
  kept := append([]string{}, lines[:note.Line-1]...)
561
566
  kept = append(kept, lines[end:]...)
@@ -25,6 +25,7 @@ import (
25
25
  "unicode/utf8"
26
26
 
27
27
  "github.com/devrites/devrites/internal/overhaul/ovio"
28
+ "github.com/devrites/devrites/internal/overhaul/packet"
28
29
  "github.com/devrites/devrites/internal/overhaul/records"
29
30
  )
30
31
 
@@ -46,22 +47,15 @@ func Run(args []string, stdout, stderr io.Writer) int {
46
47
  var code int
47
48
  var err error
48
49
  switch {
49
- case len(args) >= 3 && args[0] == "receipt":
50
- observed, hasObserved := "", false
51
- for i, a := range args {
52
- if a == "--observed" {
53
- if i+1 >= len(args) {
54
- fmt.Fprint(stderr, usage)
55
- return 2
56
- }
57
- observed, hasObserved = args[i+1], true
58
- break
59
- }
50
+ case len(args) >= 3 && args[0] == "receipt" && (len(args) == 3 || len(args) == 5 && args[3] == "--observed"):
51
+ observed, hasObserved := "", len(args) == 5
52
+ if hasObserved {
53
+ observed = args[4]
60
54
  }
61
55
  code, err = receipt(args[1], args[2], observed, hasObserved, stdout)
62
56
  case len(args) == 3 && args[0] == "packet":
63
57
  code, err = packetAdmit(args[1], args[2], stdout)
64
- case len(args) >= 3 && args[0] == "anchor":
58
+ case len(args) == 3 && args[0] == "anchor":
65
59
  code, err = anchor(args[1], args[2], stdout, stderr)
66
60
  default:
67
61
  fmt.Fprint(stderr, usage)
@@ -228,6 +222,16 @@ func receipt(run, path, observed string, hasObserved bool, stdout io.Writer) (in
228
222
  verdict(stdout, "DUPLICATE_OR_LATE", "attempt_status", x["status"])
229
223
  return 3, nil
230
224
  }
225
+ // Only the attempt's own receipt file counts: not a copy elsewhere (such
226
+ // as in the target repository) and not a symlink to one.
227
+ canon := filepath.Join(realpath(run), "receipts", packet.Name(map[string]any{"run_id": rj["run_id"],
228
+ "task_id": x["task_id"], "attempt_id": x["attempt_id"], "role": x["role"]})+".json")
229
+ if realpath(path) != canon {
230
+ why = append(why, "receipt must be the attempt's file <run>/receipts/<run_id>__<task_id>__<attempt_id>__<role>.json")
231
+ }
232
+ if r := ovio.Str(x["receipt"]); r != "" && realpath(join(run, r)) != canon {
233
+ why = append(why, "receipt differs from the dispatched attempt's receipt")
234
+ }
231
235
  for _, k := range []string{"role", "lane", "snapshot"} {
232
236
  if !eq(rc[k], x[k]) {
233
237
  why = append(why, k+" differs from the dispatch packet")
@@ -25,6 +25,7 @@ const Usage = `usage: devrites-engine overhaul <tool> ...
25
25
  overhaul records stage <run>
26
26
  overhaul records publish <run>
27
27
  overhaul records validate <run>
28
+ overhaul records prune <run> [--keep K]
28
29
  overhaul admit receipt <run> <receipt.json> [--observed <paths.txt>]
29
30
  overhaul admit packet <run> <packet.json>
30
31
  overhaul admit anchor <tree> <proposals.json>
@@ -13,6 +13,7 @@ import (
13
13
  "strings"
14
14
 
15
15
  "github.com/devrites/devrites/internal/overhaul/ovio"
16
+ "github.com/devrites/devrites/internal/overhaul/score"
16
17
  "github.com/devrites/devrites/internal/overhaul/snapshot"
17
18
  )
18
19
 
@@ -65,6 +66,9 @@ var (
65
66
  required = []string{"run.json", "coverage.json", "findings.json", "evidence.json", "dispatch.json",
66
67
  "approval.json", "cycles.json"}
67
68
  channels = set("conversation", "host-structured-action")
69
+ // finishedVerdict is the readiness verdict each finished-repair outcome requires.
70
+ finishedVerdict = map[string]string{"READY_FOR_USER_REVIEW": "MEETS_TARGETS",
71
+ "COMPLETED_WITH_APPROVED_DEGRADATION": "MEETS_TARGETS_WITH_APPROVED_DEGRADATION"}
68
72
  )
69
73
 
70
74
  // Repr renders a decoded JSON value the way Python's repr() does, so rule
@@ -198,13 +202,8 @@ func BadPath(p any, repo string) string {
198
202
  if path.Clean(s) != s || strings.Split(s, "/")[0] == ".." {
199
203
  return "not normalized or escapes the repository"
200
204
  }
201
- for _, part := range strings.Split(s, "/") {
202
- if part == ".git" {
203
- return "names a directory or git metadata"
204
- }
205
- }
206
- if strings.HasPrefix(s, snapshot.RunAreaDir) {
207
- return "names the overhaul run area"
205
+ if why := reserved(s); why != "" {
206
+ return why
208
207
  }
209
208
  if isDir(join(repo, s)) {
210
209
  return "names a directory or git metadata"
@@ -212,6 +211,30 @@ func BadPath(p any, repo string) string {
212
211
  if !inside(repo, s) {
213
212
  return "resolves outside the repository (symlink or traversal)"
214
213
  }
214
+ // A symlink alias must not reach git metadata or the run area either.
215
+ root := realpath(repo)
216
+ full := realpath(join(root, s))
217
+ if why := reserved(filepath.ToSlash(strings.TrimPrefix(full, root+string(os.PathSeparator)))); why != "" {
218
+ return why
219
+ }
220
+ if area := realpath(join(root, snapshot.RunAreaDir)); strings.HasPrefix(strings.ToLower(full), strings.ToLower(area)+string(os.PathSeparator)) {
221
+ return "names the overhaul run area"
222
+ }
223
+ return ""
224
+ }
225
+
226
+ // reserved names why a repository-relative path is off limits: any .git
227
+ // component or the run area, compared case-folded for case-insensitive filesystems.
228
+ func reserved(rel string) string {
229
+ l := strings.ToLower(rel)
230
+ for _, part := range strings.Split(l, "/") {
231
+ if part == ".git" {
232
+ return "names a directory or git metadata"
233
+ }
234
+ }
235
+ if strings.HasPrefix(l, snapshot.RunAreaDir) {
236
+ return "names the overhaul run area"
237
+ }
215
238
  return ""
216
239
  }
217
240
 
@@ -586,6 +609,27 @@ func Check(run, genDir, prevDir string) ([]string, error) {
586
609
  add("run.json: readiness_verdict differs from scorecard.json")
587
610
  }
588
611
  }
612
+ // A finished repair claims readiness only on a complete, passing scorecard.
613
+ outcome := str(rj, "execution_outcome")
614
+ if want := finishedVerdict[outcome]; want != "" {
615
+ if !isFile(scp) {
616
+ add("run.json: %s needs scorecard.json", outcome)
617
+ } else if sc, err := ovio.LoadObject(scp); err != nil {
618
+ return nil, err
619
+ } else {
620
+ if !eq(sc["readiness_verdict"], want) || !eq(rj["readiness_verdict"], want) {
621
+ add("run.json: %s needs readiness_verdict %s in run.json and scorecard.json", outcome, want)
622
+ }
623
+ gates := ovio.Obj(sc["gates"])
624
+ for _, g := range score.GateIDs(!ovio.Truthy(rj["assessment_only"])) {
625
+ st := str(gates, g)
626
+ waived := g == "G-CONCURRENCY" && st == "WAIVED_OPERATIONAL" && want == "MEETS_TARGETS_WITH_APPROVED_DEGRADATION"
627
+ if st != "PASS" && st != "NOT_APPLICABLE" && !waived {
628
+ add("run.json: %s needs gate %s to pass in scorecard.json (got %s)", outcome, g, Repr(gates[g]))
629
+ }
630
+ }
631
+ }
632
+ }
589
633
  if err := consistency(run, genDir, R, add); err != nil {
590
634
  return nil, err
591
635
  }
@@ -686,7 +730,7 @@ func Check(run, genDir, prevDir string) ([]string, error) {
686
730
  if set("returned", "admitted", "rejected")[status] && !(str(x, "receipt") != "" && isFile(join(run, str(x, "receipt")))) {
687
731
  add("attempt %s: receipt file missing", xid)
688
732
  }
689
- if set("dispatched", "running", "returned")[status] {
733
+ if !set("admitted", "rejected", "cancelled")[status] {
690
734
  unsettled = append(unsettled, xid)
691
735
  }
692
736
  if !writers[str(x, "role")] {
@@ -721,7 +765,6 @@ func Check(run, genDir, prevDir string) ([]string, error) {
721
765
  }
722
766
  }
723
767
  }
724
- outcome := str(rj, "execution_outcome")
725
768
  if outcome != "RUNNING" && len(unsettled) > 0 {
726
769
  add("attempts must be admitted, rejected or cancelled before the run leaves RUNNING: %s", Repr(unsettled[:min(5, len(unsettled))]))
727
770
  }
@@ -530,6 +530,7 @@ type built struct {
530
530
  laneCov map[string][2]int // lane -> reviewed, eligible ranges
531
531
  secs []section
532
532
  approve, stamp string
533
+ hasPlan bool // run.json names a plan revision
533
534
  finds []map[string]any
534
535
  lanes []string
535
536
  cards map[string][]map[string]any // section anchor -> findings drawn as cards in HTML
@@ -787,7 +788,7 @@ func build(run, gen string) (*built, error) {
787
788
  }
788
789
  stamp := sf("overhaul-stamp run=%s generation=%s plan=%s", rj["run_id"],
789
790
  strings.ReplaceAll(filepath.Base(strings.TrimRight(gen, "/")), ".tmp", ""), planStamp)
790
- return &built{rj: rj, sc: sc, base: base, rubric: rubric, domains: domains, tasks: tasks, laneCov: laneCov, secs: S, approve: approve, stamp: stamp, finds: finds, lanes: lanes,
791
+ return &built{rj: rj, sc: sc, base: base, rubric: rubric, domains: domains, tasks: tasks, laneCov: laneCov, secs: S, approve: approve, stamp: stamp, hasPlan: len(pr) > 0, finds: finds, lanes: lanes,
791
792
  cards: map[string][]map[string]any{"findings": confirmed, "opportunities": opps}, byF: byF}, nil
792
793
  }
793
794
 
@@ -816,7 +817,7 @@ func render(run, gen, kind, home string) (string, error) {
816
817
  runID := pyStr(b.rj["run_id"])
817
818
  if kind == "review" {
818
819
  for _, s := range b.secs {
819
- if s.anchor != "plan" || len(s.body) == 0 {
820
+ if s.anchor != "plan" || !b.hasPlan { // a zero-task plan still gets plan.md
820
821
  continue
821
822
  }
822
823
  lines := append([]string{"<!-- " + b.stamp + " -->", "# Overhaul plan " + runID, ""}, mdTable(v, s.cols, s.body)...)
@@ -239,7 +239,7 @@ func dirty(root string, tracked []string) (map[string]bool, error) {
239
239
  return set, nil
240
240
  }
241
241
  b, err := git(root, "-c", "diff.autoRefreshIndex=false", "diff", "--no-ext-diff", "--no-textconv", "--no-renames",
242
- "--name-only", "-z", "HEAD")
242
+ "--relative", "--name-only", "-z", "HEAD") // --relative: same base as ls-files when root is a subdirectory
243
243
  if err != nil {
244
244
  return nil, err
245
245
  }
@@ -465,7 +465,7 @@ func capture(root, out string, stdout io.Writer) error {
465
465
  safe := []string{"--", "."}
466
466
  for p, v := range st {
467
467
  if v.Sensitive {
468
- safe = append(safe, ":(top,exclude,literal)"+p)
468
+ safe = append(safe, ":(exclude,literal)"+p) // cwd-relative, like p, when root is a subdirectory
469
469
  }
470
470
  }
471
471
  for _, o := range []struct {
@@ -108,18 +108,17 @@ func isAncestor(repo, ancestor, descendant string) (bool, error) {
108
108
  }
109
109
 
110
110
  func diffNames(repo, a, b string) ([]string, error) {
111
- out, err := git(repo, "diff", "--name-only", a, b)
111
+ // --no-renames reports a rename's source as a deletion; -z keeps paths raw
112
+ // instead of C-quoted.
113
+ out, err := git(repo, "diff", "--name-only", "--no-renames", "-z", a, b)
112
114
  if err != nil {
113
115
  return nil, err
114
116
  }
117
+ out = strings.TrimSuffix(out, "\x00")
115
118
  if out == "" {
116
119
  return nil, nil
117
120
  }
118
- lines := strings.Split(out, "\n")
119
- for i := range lines {
120
- lines[i] = strings.TrimSpace(lines[i])
121
- }
122
- return lines, nil
121
+ return strings.Split(out, "\x00"), nil
123
122
  }
124
123
 
125
124
  func headSHA(repo string) (string, error) {
@@ -584,6 +584,9 @@ func cleanupLocked(repoRoot, slug string, force bool) ([]Salvage, error) {
584
584
  inScratch := sl.WorktreePath != "" && ownedWorktreePath(repoRoot, lease.BatchID, sl)
585
585
  owned := inScratch && createdWorktree(registered, sl.WorktreePath)
586
586
  if sl.WorktreePath != "" && !owned {
587
+ // Never salvaged, so the batch sweep must not delete this slice's
588
+ // scratch entry either (e.g. a --root spelled through a symlink).
589
+ keptWorktrees[sl.ID] = true
587
590
  if inScratch {
588
591
  warnf("slice %s worktree_path %q is not a worktree git registered; leaving it untouched",
589
592
  sl.ID, sl.WorktreePath)
@@ -67,21 +67,25 @@ func validateSlicePaths(paths []string, label, root string) ([]string, error) {
67
67
  if err != nil {
68
68
  return nil, fmt.Errorf("%s: %w", label, err)
69
69
  }
70
+ // Comparisons fold case always: on a case-insensitive filesystem
71
+ // (macOS, Windows) .DEVRITES is the control tree and A.go is a.go; on a
72
+ // case-sensitive one a false overlap only serializes the slices.
73
+ folded := strings.ToLower(path)
70
74
  // Parallel eligibility must reject workspace control metadata so slices
71
75
  // cannot claim control-tree / SSOT files (docs: ".devrites/**").
72
- if path == ".devrites" || strings.HasPrefix(path, ".devrites/") {
76
+ if folded == ".devrites" || strings.HasPrefix(folded, ".devrites/") {
73
77
  return nil, fmt.Errorf("%s: path must not include .devrites: %q", label, path)
74
78
  }
75
79
  // Same for git internals: a transfer commit can never carry .git/**
76
80
  // anyway, and inside a worktree .git is a file, so claiming it is
77
81
  // pure footgun.
78
- if path == ".git" || strings.HasPrefix(path, ".git/") {
82
+ if folded == ".git" || strings.HasPrefix(folded, ".git/") {
79
83
  return nil, fmt.Errorf("%s: path must not include .git: %q", label, path)
80
84
  }
81
- if _, ok := seen[path]; ok {
85
+ if _, ok := seen[folded]; ok {
82
86
  return nil, fmt.Errorf("%s: duplicate path %q", label, path)
83
87
  }
84
- seen[path] = struct{}{}
88
+ seen[folded] = struct{}{}
85
89
  normalized = append(normalized, path)
86
90
  if root != "" {
87
91
  // Check every component, not just the leaf: a symlinked directory
@@ -122,6 +126,7 @@ func CheckPathDisjoint(slices []SlicePaths, root string) ([]string, error) {
122
126
  return nil, err
123
127
  }
124
128
  for _, path := range paths {
129
+ path = strings.ToLower(path) // see validateSlicePaths: overlap folds case
125
130
  owners[path] = append(owners[path], label)
126
131
  }
127
132
  }
@@ -145,15 +145,17 @@ func validTag(tag string) bool {
145
145
  }
146
146
 
147
147
  func platformBinaryName() (string, error) {
148
- supported := (runtime.GOOS == "darwin" || runtime.GOOS == "linux") && (runtime.GOARCH == "amd64" || runtime.GOARCH == "arm64")
149
- if runtime.GOOS == "windows" && runtime.GOARCH == "amd64" {
150
- supported = true
151
- }
152
- if !supported {
153
- return "", fmt.Errorf("no DevRites engine release for %s/%s", runtime.GOOS, runtime.GOARCH)
154
- }
155
- name := "devrites-" + runtime.GOOS + "-" + runtime.GOARCH
156
- if runtime.GOOS == "windows" {
148
+ return binaryNameFor(runtime.GOOS, runtime.GOARCH)
149
+ }
150
+
151
+ // binaryNameFor names the release asset; CI publishes darwin, linux and
152
+ // windows for both amd64 and arm64.
153
+ func binaryNameFor(goos, goarch string) (string, error) {
154
+ if (goos != "darwin" && goos != "linux" && goos != "windows") || (goarch != "amd64" && goarch != "arm64") {
155
+ return "", fmt.Errorf("no DevRites engine release for %s/%s", goos, goarch)
156
+ }
157
+ name := "devrites-" + goos + "-" + goarch
158
+ if goos == "windows" {
157
159
  name += ".exe"
158
160
  }
159
161
  return name, nil
@@ -1,6 +1,7 @@
1
1
  package safepath
2
2
 
3
3
  import (
4
+ "errors"
4
5
  "os"
5
6
  "path/filepath"
6
7
  )
@@ -28,9 +29,10 @@ func WithinResolved(candidate, parent string) bool {
28
29
 
29
30
  // ResolveExisting resolves symlinks in the longest existing path prefix, then
30
31
  // appends any missing tail without allowing it to change the resolved parent.
32
+ // A dangling symlink is followed to its target: creating through it writes there.
31
33
  func ResolveExisting(filename string) (string, error) {
32
34
  var tail []string
33
- for {
35
+ for hops := 0; ; {
34
36
  resolved, err := filepath.EvalSymlinks(filename)
35
37
  if err == nil {
36
38
  for i := len(tail) - 1; i >= 0; i-- {
@@ -41,6 +43,20 @@ func ResolveExisting(filename string) (string, error) {
41
43
  if !os.IsNotExist(err) {
42
44
  return "", err
43
45
  }
46
+ if info, lerr := os.Lstat(filename); lerr == nil && info.Mode()&os.ModeSymlink != 0 {
47
+ target, rerr := os.Readlink(filename)
48
+ if rerr != nil {
49
+ return "", rerr
50
+ }
51
+ if hops++; hops > 255 {
52
+ return "", &os.PathError{Op: "resolve", Path: filename, Err: errors.New("too many symlinks")}
53
+ }
54
+ if !filepath.IsAbs(target) {
55
+ target = filepath.Join(filepath.Dir(filename), target)
56
+ }
57
+ filename = target
58
+ continue
59
+ }
44
60
  parent := filepath.Dir(filename)
45
61
  if parent == filename {
46
62
  return "", err
@@ -78,17 +78,21 @@ func ArtifactLineBudget(name string) (int, bool) {
78
78
 
79
79
  // sanctionedRootFiles are workspace-root files the schema places there without a
80
80
  // line budget: conditional artifacts (`references.md`, `investigation-map.md`,
81
- // `dogfood.md`) and engine-owned machine files (the parallel lease, the metrics
82
- // ledger, the regression baseline). Anything else in the root is unsanctioned
83
- // placement — `packets/` and `history/` own by-reference packets and relocated
84
- // narrative (workspace-artifact-schema.md "Required by phase").
81
+ // `dogfood.md`, `devex.md`) and engine-owned machine files (the parallel lease,
82
+ // the metrics ledger, the regression baseline, the dispatch ledger, the drift
83
+ // baseline). Anything else in the root is unsanctioned placement — `packets/`
84
+ // and `history/` own by-reference packets and relocated narrative
85
+ // (workspace-artifact-schema.md "Required by phase").
85
86
  var sanctionedRootFiles = map[string]bool{
86
87
  "references.md": true,
87
88
  "investigation-map.md": true,
88
89
  "dogfood.md": true,
90
+ "devex.md": true,
89
91
  "parallel-lease.md": true,
90
92
  "metrics.jsonl": true,
91
93
  "regression-baseline.json": true,
94
+ "dispatch.json": true,
95
+ "readiness-inputs.json": true,
92
96
  }
93
97
 
94
98
  // SanctionedRootFile reports whether name is a legitimate workspace-root file:
@@ -15,12 +15,14 @@ import (
15
15
  // ResolveRoot returns the .devrites directory to operate on. A non-empty
16
16
  // override (e.g. from DEVRITES_ROOT) may name either the project root or its
17
17
  // .devrites directory; otherwise the nearest ancestor .devrites is used.
18
+ // Callers take Dir(root) as the project, so a symlinked .devrites (which
19
+ // rootfacts proves resolves inside the project) keeps its project-side name.
18
20
  func ResolveRoot(override string) (string, error) {
19
21
  facts, err := rootfacts.Resolve(override)
20
22
  if err != nil {
21
23
  return "", err
22
24
  }
23
- return facts.PhysicalRoot, nil
25
+ return filepath.Join(facts.PhysicalProject, devritespaths.DevritesRootName), nil
24
26
  }
25
27
 
26
28
  // featureDir is the canonical per-feature state directory under root.
@@ -8,6 +8,7 @@ import (
8
8
  "os"
9
9
  "path"
10
10
  "path/filepath"
11
+ "slices"
11
12
  "sort"
12
13
  "strings"
13
14
 
@@ -350,10 +351,12 @@ func observationWorkspaceOverrideValid(root, slug string) bool {
350
351
  if raw == "" {
351
352
  return true
352
353
  }
353
- if strings.TrimSpace(raw) != raw || filepath.Clean(raw) != raw {
354
+ if strings.TrimSpace(raw) != raw {
354
355
  return false
355
356
  }
356
- if !filepath.IsAbs(raw) && !filepath.IsLocal(raw) {
357
+ // A ".." hop could route through a symlinked alias, so it is never
358
+ // cleaned away; "./" and trailing separators are harmless spellings.
359
+ if slices.Contains(strings.FieldsFunc(raw, func(r rune) bool { return r == '/' || r == filepath.Separator }), "..") {
357
360
  return false
358
361
  }
359
362
  physicalRoot, err := filepath.EvalSymlinks(root)
@@ -364,16 +367,18 @@ func observationWorkspaceOverrideValid(root, slug string) bool {
364
367
  if err != nil {
365
368
  return false
366
369
  }
367
- override := raw
370
+ override := filepath.Clean(raw)
368
371
  if !filepath.IsAbs(override) {
369
372
  override = filepath.Join(filepath.Dir(physicalRoot), override)
370
373
  }
371
- override, err = filepath.Abs(override)
372
- if err != nil {
374
+ // Only the selected root may be spelled through a symlink (/tmp versus
375
+ // /private/tmp); work/<slug> must match literally so an alias of the
376
+ // workspace itself never does.
377
+ if filepath.Base(override) != slug || filepath.Base(filepath.Dir(override)) != "work" {
373
378
  return false
374
379
  }
375
- want := filepath.Join(physicalRoot, "work", slug)
376
- return filepath.Clean(override) == filepath.Clean(want)
380
+ overrideRoot, err := filepath.EvalSymlinks(filepath.Dir(filepath.Dir(override)))
381
+ return err == nil && overrideRoot == physicalRoot
377
382
  }
378
383
 
379
384
  func observationInventory() []ArtifactPath {
@@ -3,16 +3,20 @@ package state
3
3
  import (
4
4
  "fmt"
5
5
  "regexp"
6
+ "slices"
6
7
  "strings"
7
8
  "unicode"
8
9
 
9
10
  "github.com/devrites/devrites/internal/markdowntext"
10
11
  )
11
12
 
12
- // TaskSlice is one SLICE-### block parsed from tasks.md.
13
+ // TaskSlice is one SLICE-### block parsed from tasks.md. Via maps a dependency
14
+ // ID to the interface its `(via <text>)` suffix names; bare edges are absent.
13
15
  type TaskSlice struct {
14
- ID string
15
- Dependencies []string
16
+ ID string
17
+ Dependencies []string
18
+ Via map[string]string
19
+ ConsumesProduces string
16
20
  }
17
21
 
18
22
  // TaskGraphResult is the deterministic outcome of parsing a tasks.md slice graph.
@@ -26,8 +30,12 @@ type TaskGraphResult struct {
26
30
  var (
27
31
  sliceHeaderRE = regexp.MustCompile(`(?m)^##\s+(SLICE-\d+)\b`)
28
32
  anyH2HeaderRE = regexp.MustCompile(`(?m)^##\s`)
29
- dependenciesRE = regexp.MustCompile(`(?m)^Dependencies:\s*(.+)\s*$`)
30
- dependsOnRE = regexp.MustCompile(`(?m)^depends_on:\s*(.+)\s*$`)
33
+ dependenciesRE = regexp.MustCompile(`(?m)^Dependencies:[ \t]*(.+)[ \t]*$`)
34
+ dependsOnRE = regexp.MustCompile(`(?m)^depends_on:[ \t]*(.+)[ \t]*$`)
35
+ consumesRE = regexp.MustCompile(`(?m)^Consumes / Produces:[ \t]*(.+)[ \t]*$`)
36
+ // viaSuffixRE matches a Dependencies `(via <text>)` suffix; group 2 is
37
+ // empty when the parenthetical is unclosed. Nested parentheses are unsupported.
38
+ viaSuffixRE = regexp.MustCompile(`\([ \t]*via\b([^()]*)(\))?`)
31
39
  sliceIDValidRE = regexp.MustCompile(`^SLICE-\d+$`)
32
40
  )
33
41
 
@@ -92,10 +100,10 @@ func ParseTaskGraph(tasksMarkdown []byte) TaskGraphResult {
92
100
  end = headers[i+1][0]
93
101
  }
94
102
  block := text[start:end]
95
- deps, problems := parseSliceGraph(id, block)
103
+ slice, problems := parseSliceGraph(id, block)
96
104
  result.Problems = append(result.Problems, problems...)
97
- result.Slices = append(result.Slices, TaskSlice{ID: id, Dependencies: deps})
98
- for _, dep := range deps {
105
+ result.Slices = append(result.Slices, slice)
106
+ for _, dep := range slice.Dependencies {
99
107
  if !known[dep] {
100
108
  result.Unknown = append(result.Unknown, dep)
101
109
  result.Problems = append(result.Problems, fmt.Sprintf("%s depends on unknown slice %s", id, dep))
@@ -121,14 +129,20 @@ func structuralTaskText(tasksMarkdown []byte) string {
121
129
  return string(masked)
122
130
  }
123
131
 
124
- func parseSliceGraph(id, block string) ([]string, []string) {
132
+ func parseSliceGraph(id, block string) (TaskSlice, []string) {
125
133
  var problems []string
126
134
  depsLine := firstLineValue(dependenciesRE, block)
127
135
  mirrorLine := firstLineValue(dependsOnRE, block)
128
- deps, malformed := parseIDList(depsLine)
129
- for _, token := range malformed {
136
+ bare, via, malformed := splitDependencyVia(depsLine)
137
+ deps, malformedIDs := parseIDList(bare)
138
+ for _, token := range append(malformed, malformedIDs...) {
130
139
  problems = append(problems, fmt.Sprintf("%s has malformed dependency %q", id, token))
131
140
  }
141
+ for dep := range via {
142
+ if !slices.Contains(deps, dep) {
143
+ delete(via, dep) // its ID token is already reported malformed
144
+ }
145
+ }
132
146
  mirror, mirrorMalformed := parseIDList(mirrorLine)
133
147
  for _, token := range mirrorMalformed {
134
148
  problems = append(problems, fmt.Sprintf("%s has malformed depends_on %q", id, token))
@@ -142,7 +156,48 @@ func parseSliceGraph(id, block string) ([]string, []string) {
142
156
  if depsLine == "" {
143
157
  deps = mirror
144
158
  }
145
- return deps, problems
159
+ return TaskSlice{ID: id, Dependencies: deps, Via: via, ConsumesProduces: firstLineValue(consumesRE, block)}, problems
160
+ }
161
+
162
+ // splitDependencyVia strips each `(via <text>)` suffix from a Dependencies
163
+ // value, returning the bare ID list, the via text keyed by the ID it follows,
164
+ // and any suffix that is empty, unclosed, or not directly after an ID.
165
+ func splitDependencyVia(raw string) (string, map[string]string, []string) {
166
+ var bare strings.Builder
167
+ var via map[string]string
168
+ var malformed []string
169
+ last := 0
170
+ for _, m := range viaSuffixRE.FindAllStringSubmatchIndex(raw, -1) {
171
+ before := raw[last:m[0]]
172
+ bare.WriteString(before)
173
+ last = m[1]
174
+ text := strings.TrimSpace(raw[m[2]:m[3]])
175
+ dep := precedingSliceID(before)
176
+ if m[4] < 0 || text == "" || dep == "" {
177
+ malformed = append(malformed, strings.TrimSpace(raw[m[0]:m[1]]))
178
+ continue
179
+ }
180
+ if via == nil {
181
+ via = make(map[string]string)
182
+ }
183
+ if _, seen := via[dep]; !seen {
184
+ via[dep] = text
185
+ }
186
+ }
187
+ bare.WriteString(raw[last:])
188
+ return bare.String(), via, malformed
189
+ }
190
+
191
+ // precedingSliceID returns the SLICE-### token that ends s, separated from what
192
+ // follows only by blanks, or "" when s ends in a separator or a non-ID token.
193
+ func precedingSliceID(s string) string {
194
+ s = strings.TrimRight(s, " \t")
195
+ start := strings.LastIndexAny(s, ",; \t") + 1
196
+ id := strings.Trim(s[start:], "`'\"(){}[]")
197
+ if !sliceIDValidRE.MatchString(id) {
198
+ return ""
199
+ }
200
+ return id
146
201
  }
147
202
 
148
203
  func firstLineValue(re *regexp.Regexp, block string) string {
@@ -103,12 +103,18 @@ func WithFeatureLockRelease(root, slug string, fn func(release func()) error) er
103
103
  }
104
104
 
105
105
  // featureLockPath validates slug and creates the feature directory, returning
106
- // the lock file path inside it.
106
+ // the lock file path inside it. A closed workspace (work/<slug> gone, archive/<slug>
107
+ // present) is refused rather than resurrected by a late lock.
107
108
  func featureLockPath(root, slug string) (string, error) {
108
109
  if !devritespaths.ValidSlug(slug) {
109
110
  return "", fmt.Errorf("lock feature %q: not a feature slug", slug)
110
111
  }
111
112
  dir := featureDir(root, slug)
113
+ if _, err := os.Lstat(dir); errors.Is(err, fs.ErrNotExist) {
114
+ if _, archErr := os.Lstat(filepath.Join(root, "archive", slug)); archErr == nil {
115
+ return "", fmt.Errorf("lock feature %q: workspace is closed (archived)", slug)
116
+ }
117
+ }
112
118
  if err := os.MkdirAll(dir, 0o755); err != nil {
113
119
  return "", fmt.Errorf("lock feature %q: %w", slug, err)
114
120
  }
package/engine/main.go CHANGED
@@ -48,6 +48,8 @@ Usage:
48
48
  devrites-engine orient <slug> Alias for observe summary
49
49
  devrites-engine next [slug] Print the minimal remaining lifecycle path with advisory skips
50
50
  devrites-engine handoff [slug] Emit the deterministic resume record (cursor, blocking gates, ledger, dead ends)
51
+ devrites-engine recall --paths <csv> [--limit n]
52
+ Point at archived features that touched these paths: decisions, constraints, findings (read-only)
51
53
  devrites-engine context [slug] (--phase <p> | --skill <name>) [--role <r>] [--slice <id>] [--trigger a,b]
52
54
  Emit one deduplicated read-set bundle for a phase, skill, or dispatch role
53
55
  devrites-engine metrics record <slug> --phase <p> --event <e> [--role r] [--bytes n] [--note s]
@@ -64,7 +66,7 @@ Usage:
64
66
  devrites-engine state resolve <qid> "<ans>" Resolve an open question and update state atomically
65
67
  devrites-engine state merge-manifest <slug> [pred...] Fold the recorded predecessor chain's manifests into the release candidate manifest
66
68
  devrites-engine state close <slug> Archive a shipped feature and clear ACTIVE
67
- devrites-engine migrate <slug> [--dry-run] Normalize a pre-v5 workspace to the current schema
69
+ devrites-engine migrate <slug> [--dry-run] [--answer id=choice] Normalize an older-schema workspace to the current schema
68
70
  devrites-engine secret-scan [--staged] [--stdin] [slug] Scan exact staged blobs, stdin, or touched files; HIGH blocks
69
71
  devrites-engine open-visual <path-or-name> [--slug <slug>] [--no-open]
70
72
  Resolve a visual HTML file, optionally open it locally, print agent paths
@@ -134,6 +136,8 @@ func run(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
134
136
  return lib.RunNext(root, args[1:], stdout, stderr)
135
137
  case "handoff":
136
138
  return lib.RunHandoff(root, args[1:], stdout, stderr)
139
+ case "recall":
140
+ return lib.RunRecall(root, args[1:], stdout, stderr)
137
141
  case "context":
138
142
  return lib.RunContext(root, args[1:], stdout, stderr)
139
143
  case "metrics":
@@ -1 +1,3 @@
1
1
  Do not invoke another agent. You are called by `/overhaul` and return your result to that orchestrator.
2
+
3
+ Write your receipt (`schema` `overhaul.receipt/1`) to the packet's `receipt_path`, copying `run_id`, `task_id`, `attempt_id`, `lane` and `snapshot` verbatim from the packet and setting `role` to the unprefixed role name (`verifier`, not `overhaul-verifier`); follow `.claude/skills/overhaul/references/orchestration.md` § Receipts, since admission rejects any mismatch.