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
@@ -1,946 +0,0 @@
1
- package acceptance
2
-
3
- import (
4
- "context"
5
- "errors"
6
- "os"
7
- "path/filepath"
8
- "strings"
9
- "testing"
10
- "time"
11
- )
12
-
13
- // --- parsing -------------------------------------------------------------
14
-
15
- func TestParseLedgerRunnableAndManualGates(t *testing.T) {
16
- doc := ParseLedger(`# Gates
17
-
18
- - [ ] AC-001: binary builds clean
19
- CHECK: go build ./...
20
- EXPECT: ok
21
- CWD: engine
22
- EVIDENCE: pending
23
-
24
- - [x] AC-002: spec reviewed by a human
25
- EVIDENCE: reviewed 2024-06-01 by ops
26
- `)
27
- if len(doc.Errors) != 0 {
28
- t.Fatalf("errors=%v", doc.Errors)
29
- }
30
- if len(doc.Gates) != 2 {
31
- t.Fatalf("gates=%d", len(doc.Gates))
32
- }
33
- runnable, manual := doc.Gates[0], doc.Gates[1]
34
- if runnable.ID != "AC-001" || runnable.Check != "go build ./..." || runnable.Expect != "ok" || runnable.Cwd != "engine" {
35
- t.Fatalf("runnable gate misparsed: %+v", runnable)
36
- }
37
- if runnable.Checked || runnable.Evidence != "pending" {
38
- t.Fatalf("runnable state misparsed: %+v", runnable)
39
- }
40
- if manual.ID != "AC-002" || !manual.Checked || manual.Evidence != "reviewed 2024-06-01 by ops" {
41
- t.Fatalf("manual gate misparsed: %+v", manual)
42
- }
43
- }
44
-
45
- func TestParseLedgerIgnoresFencedExamples(t *testing.T) {
46
- doc := ParseLedger(`# Gates
47
-
48
- Example ledger, do not parse:
49
-
50
- ` + "```markdown" + `
51
- - [ ] FAKE-1: fenced gate
52
- EVIDENCE: fenced evidence
53
- ` + "```" + `
54
-
55
- - [x] REAL-1: real gate
56
- EVIDENCE: attested
57
-
58
- ` + "```" + `
59
- EVIDENCE: fenced attribute decoy
60
- ` + "```" + `
61
- `)
62
- if len(doc.Errors) != 0 {
63
- t.Fatalf("errors=%v", doc.Errors)
64
- }
65
- if len(doc.Gates) != 1 || doc.Gates[0].ID != "REAL-1" {
66
- t.Fatalf("fenced gate leaked into parse: %+v", doc.Gates)
67
- }
68
- if doc.Gates[0].Evidence != "attested" {
69
- t.Fatalf("fenced attribute decoy overwrote evidence: %q", doc.Gates[0].Evidence)
70
- }
71
- }
72
-
73
- func TestParseLedgerErrors(t *testing.T) {
74
- cases := map[string]string{
75
- "empty": "# Gates\n",
76
- "partial-check": "- [ ] G1: x\n CHECK: cmd\n",
77
- "partial-expect": "- [ ] G1: x\n EXPECT: out\n",
78
- "unindented-attr": "- [ ] G1: x\nCHECK: cmd\n EXPECT: out\n",
79
- "orphan-attr": " EVIDENCE: nowhere\n- [ ] G1: x\n",
80
- "duplicate-id": "- [ ] G1: a\n- [ ] G1: b\n",
81
- "long-id": "- [ ] " + strings.Repeat("G", 65) + ": x\n",
82
- "indented-abandon": "- [ ] G1: x\n ABANDON: G1 nope\n",
83
- "abandon-unknown": "- [ ] G1: x\nABANDON: G2 gone\n",
84
- "abandon-no-reason": "- [ ] G1: x\nABANDON: G1\n",
85
- "absolute-cwd": "- [ ] G1: x\n CHECK: c\n EXPECT: o\n CWD: /etc\n",
86
- "windows-abs-cwd": "- [ ] G1: x\n CHECK: c\n EXPECT: o\n CWD: C:\\tmp\n",
87
- "traversal-cwd": "- [ ] G1: x\n CHECK: c\n EXPECT: o\n CWD: a/../b\n",
88
- "bad-expect-pattern": "- [ ] G1: x\n CHECK: c\n EXPECT: /[/\n",
89
- }
90
- for name, text := range cases {
91
- doc := ParseLedger(text)
92
- if len(doc.Errors) == 0 {
93
- t.Errorf("%s: expected parse error, got none", name)
94
- }
95
- }
96
- }
97
-
98
- func TestParseLedgerAbandonRecordsReason(t *testing.T) {
99
- doc := ParseLedger("- [ ] G1: x\n- [ ] G2: y\n\nABANDON: G1 upstream API removed\n")
100
- if len(doc.Errors) != 0 {
101
- t.Fatalf("errors=%v", doc.Errors)
102
- }
103
- if doc.Abandoned["G1"] != "upstream API removed" {
104
- t.Fatalf("abandoned=%v", doc.Abandoned)
105
- }
106
- }
107
-
108
- func TestParseLedgerPreservesCRLF(t *testing.T) {
109
- doc := ParseLedger("- [ ] G1: x\r\n EVIDENCE: pending\r\n")
110
- if doc.Newline() != "\r\n" {
111
- t.Fatalf("newline=%q", doc.Newline())
112
- }
113
- }
114
-
115
- func TestCompileExpectForms(t *testing.T) {
116
- sub, err := CompileExpect("all tests pass")
117
- if err != nil || sub.Kind != "substring" || !sub.Matches("ok all tests pass ok") {
118
- t.Fatalf("substring: %+v %v", sub, err)
119
- }
120
- re, err := CompileExpect(`/PASS \d+ files/`)
121
- if err != nil || re.Kind != "regex" || !re.Matches("PASS 3 files") {
122
- t.Fatalf("regex: %+v %v", re, err)
123
- }
124
- if re.PathLike {
125
- t.Fatalf("non-path regex misflagged: %+v", re)
126
- }
127
- pathRe, err := CompileExpect(`/tmp/out\.txt/`)
128
- if err != nil || !pathRe.PathLike {
129
- t.Fatalf("path-like regex not flagged: %+v %v", pathRe, err)
130
- }
131
- ci, err := CompileExpect(`/success/i`)
132
- if err != nil || !ci.Matches("SUCCESS") {
133
- t.Fatalf("case-insensitive: %v", err)
134
- }
135
- if _, err := CompileExpect(""); err == nil {
136
- t.Fatal("empty EXPECT must error")
137
- }
138
- // A /…/ form with non-flag trailing characters is a substring, not a
139
- // regex — `/a/b/c` stays a usable literal path expectation.
140
- subLiteral, err := CompileExpect(`/a/b/c`)
141
- if err != nil || subLiteral.Kind != "substring" {
142
- t.Fatalf("slash literal: %+v %v", subLiteral, err)
143
- }
144
- }
145
-
146
- // --- state reduction ------------------------------------------------------
147
-
148
- func runnableGate(id string, checked bool, evidence string) *Gate {
149
- return &Gate{ID: id, Title: "outcome", Checked: checked, Check: "probe", Expect: "ok", Evidence: evidence}
150
- }
151
-
152
- func TestGateStateManual(t *testing.T) {
153
- doc := &Document{Abandoned: map[string]string{}}
154
- manual := &Gate{ID: "M1", Evidence: "pending"}
155
- if got := GateState(manual, doc); got != StateUnmet {
156
- t.Fatalf("unchecked manual=%s", got)
157
- }
158
- manual.Checked = true
159
- if got := GateState(manual, doc); got != StateUnmet {
160
- t.Fatalf("pending-evidence manual=%s", got)
161
- }
162
- manual.Evidence = "human verified on staging"
163
- if got := GateState(manual, doc); got != StateMet {
164
- t.Fatalf("attested manual=%s", got)
165
- }
166
- }
167
-
168
- func TestGateStateRunnable(t *testing.T) {
169
- doc := &Document{Abandoned: map[string]string{}}
170
- gate := runnableGate("R1", false, "pending")
171
- if got := GateState(gate, doc); got != StateUnmet {
172
- t.Fatalf("unchecked=%s", got)
173
- }
174
- gate.Checked = true
175
- gate.Evidence = "looks good to me"
176
- if got := GateState(gate, doc); got != StateStaleUnmet {
177
- t.Fatalf("prose evidence on runnable gate must be stale, got %s", got)
178
- }
179
- gate.Evidence = FormatEvidence(gate, OutputDigest("out"), 3, "2024-01-01T00:00:00Z")
180
- if got := GateState(gate, doc); got != StateMet {
181
- t.Fatalf("bound evidence=%s", got)
182
- }
183
- }
184
-
185
- func TestGateStateDefinitionDriftStale(t *testing.T) {
186
- doc := &Document{Abandoned: map[string]string{}}
187
- gate := runnableGate("R1", true, "")
188
- gate.Evidence = FormatEvidence(gate, OutputDigest("out"), 3, "t")
189
- for _, mutate := range []func(*Gate){
190
- func(g *Gate) { g.Check = "probe --verbose" },
191
- func(g *Gate) { g.Expect = "ok2" },
192
- func(g *Gate) { g.Cwd = "sub" },
193
- } {
194
- edited := *gate
195
- mutate(&edited)
196
- if got := GateState(&edited, doc); got != StateStaleUnmet {
197
- t.Fatalf("edited definition must be stale, got %s", got)
198
- }
199
- }
200
- }
201
-
202
- func TestGateStateAbandonedWins(t *testing.T) {
203
- doc := &Document{Abandoned: map[string]string{"R1": "vendor removed"}}
204
- gate := runnableGate("R1", true, "")
205
- gate.Evidence = FormatEvidence(gate, OutputDigest("o"), 1, "t")
206
- if got := GateState(gate, doc); got != StateAbandoned {
207
- t.Fatalf("abandoned=%s", got)
208
- }
209
- }
210
-
211
- func TestReduceCountsAndIds(t *testing.T) {
212
- doc := &Document{Abandoned: map[string]string{"G3": "handoff"}}
213
- met := runnableGate("G1", true, "")
214
- met.Evidence = FormatEvidence(met, OutputDigest("o"), 1, "t")
215
- unmet := runnableGate("G2", false, "pending")
216
- stale := runnableGate("G4", true, "stale prose")
217
- doc.Gates = []*Gate{met, unmet, {ID: "G3", Title: "gone"}, stale}
218
-
219
- red := doc.Reduce([]ApprovedCommand{{Command: "probe", Cwd: ""}})
220
- if red.Total != 4 || red.Met != 1 || red.Unmet != 2 || red.Abandoned != 1 || red.Stale != 1 {
221
- t.Fatalf("reduction=%+v", red)
222
- }
223
- if red.AllMet() || !red.HandoffRequired() {
224
- t.Fatalf("verdict wrong: %+v", red)
225
- }
226
- // G2 and G4 are unmet runnable gates whose CHECK "probe" IS approved.
227
- if len(red.UnapprIDs) != 0 {
228
- t.Fatalf("unapproved=%v", red.UnapprIDs)
229
- }
230
- red = doc.Reduce([]ApprovedCommand{{Command: "other", Cwd: ""}})
231
- if len(red.UnapprIDs) != 2 {
232
- t.Fatalf("unapproved ids=%v", red.UnapprIDs)
233
- }
234
- // A nil approval surface approves nothing: every unmet runnable gate is unapproved.
235
- red = doc.Reduce(nil)
236
- if len(red.UnapprIDs) != 2 {
237
- t.Fatalf("nil approved must flag every unmet runnable gate: %v", red.UnapprIDs)
238
- }
239
- }
240
-
241
- func TestReduceAllMet(t *testing.T) {
242
- doc := &Document{Abandoned: map[string]string{}}
243
- gate := runnableGate("G1", true, "")
244
- gate.Evidence = FormatEvidence(gate, OutputDigest("o"), 1, "t")
245
- doc.Gates = []*Gate{gate}
246
- if !doc.Reduce(nil).AllMet() {
247
- t.Fatal("single met gate must reduce all-met")
248
- }
249
- }
250
-
251
- // --- approval -------------------------------------------------------------
252
-
253
- const testPlanPreflight = `# Test plan
254
-
255
- ## Build-entry preflight
256
-
257
- | Command | Cwd | Purpose |
258
- | --- | --- | --- |
259
- | go test ./internal/acceptance | engine | package tests |
260
- | ./scripts/scan.sh \| tail -1 | repository | escaped pipe survives |
261
- | make build | . | root convention |
262
-
263
- ## Consumptive actions
264
-
265
- | Command | Cwd |
266
- | --- | --- |
267
- | rm -rf dist | . |
268
- `
269
-
270
- func TestApprovedCommandsPreflightOnly(t *testing.T) {
271
- approved := ApprovedCommands([]byte(testPlanPreflight))
272
- if len(approved) != 3 {
273
- t.Fatalf("approved=%+v", approved)
274
- }
275
- if !Approved("go test ./internal/acceptance", "engine", approved) {
276
- t.Fatal("exact pair must approve")
277
- }
278
- if Approved("go test ./internal/acceptance", ".", approved) {
279
- t.Fatal("same command, different cwd must not approve")
280
- }
281
- if !Approved(" go test ./internal/acceptance ", "engine/", approved) {
282
- t.Fatal("whitespace/slash normalization must approve the same pair")
283
- }
284
- if Approved("rm -rf dist", ".", approved) {
285
- t.Fatal("non-preflight section must not approve")
286
- }
287
- if !Approved("./scripts/scan.sh | tail -1", "root", approved) {
288
- t.Fatal("escaped-pipe command and root cwd must approve")
289
- }
290
- }
291
-
292
- func TestApprovedCommandsNoSection(t *testing.T) {
293
- if approved := ApprovedCommands([]byte("# Plan\n\nno table\n")); len(approved) != 0 {
294
- t.Fatalf("approved=%+v", approved)
295
- }
296
- // A nil plan approves nothing and reports it as an empty value, never nil.
297
- if approved := ApprovedCommands(nil); approved == nil || len(approved) != 0 {
298
- t.Fatalf("nil plan must approve nothing, and report it as a value: %+v", approved)
299
- }
300
- }
301
-
302
- func TestNormalizeApprovedCwd(t *testing.T) {
303
- for _, root := range []string{"", ".", "./", "repository", "root", "repo", "n/a", "-", "`.`"} {
304
- if got := normalizeApprovedCwd(root); got != "" {
305
- t.Fatalf("root convention %q -> %q", root, got)
306
- }
307
- }
308
- if got := normalizeApprovedCwd("engine/"); got != "engine" {
309
- t.Fatalf("engine/ -> %q", got)
310
- }
311
- }
312
-
313
- // --- execution ------------------------------------------------------------
314
-
315
- func writeWorkspace(t *testing.T) (project, ledgerPath string) {
316
- t.Helper()
317
- project = t.TempDir()
318
- root := filepath.Join(project, ".devrites")
319
- work := filepath.Join(root, "work", "feat")
320
- if err := os.MkdirAll(work, 0o755); err != nil {
321
- t.Fatal(err)
322
- }
323
- return project, filepath.Join(work, GatesFile)
324
- }
325
-
326
- func writeLedger(t *testing.T, ledgerPath, body string) {
327
- t.Helper()
328
- if err := os.WriteFile(ledgerPath, []byte(body), 0o644); err != nil {
329
- t.Fatal(err)
330
- }
331
- }
332
-
333
- func TestRunGatesExecutesAndBindsEvidence(t *testing.T) {
334
- project, ledgerPath := writeWorkspace(t)
335
- writeLedger(t, ledgerPath, "- [ ] G1: probe prints marker\n CHECK: echo RUN-MARKER\n EXPECT: RUN-MARKER\n EVIDENCE: pending\n")
336
- doc := ParseLedger(mustRead(t, ledgerPath))
337
- approved := []ApprovedCommand{{Command: "echo RUN-MARKER", Cwd: ""}}
338
-
339
- results := RunGates(context.Background(), project, ledgerPath, doc, approved, false, 10*time.Second)
340
- if len(results) != 1 || !results[0].Ran || !results[0].Passed || results[0].WriteErr != nil {
341
- t.Fatalf("results=%+v", results)
342
- }
343
- doc = ParseLedger(mustRead(t, ledgerPath))
344
- if len(doc.Errors) != 0 {
345
- t.Fatalf("rewritten ledger malformed: %v", doc.Errors)
346
- }
347
- gate := doc.Gates[0]
348
- if !gate.Checked || !strings.HasPrefix(gate.Evidence, EvidenceMarker) {
349
- t.Fatalf("ledger not updated: %+v", gate)
350
- }
351
- if GateState(gate, doc) != StateMet {
352
- t.Fatalf("gate not met after run: %s", GateState(gate, doc))
353
- }
354
- // Already met: skipped without reverify.
355
- results = RunGates(context.Background(), project, ledgerPath, doc, approved, false, 10*time.Second)
356
- if !results[0].Passed || results[0].Ran {
357
- t.Fatalf("met gate must skip: %+v", results[0])
358
- }
359
- // Reverify re-executes it.
360
- results = RunGates(context.Background(), project, ledgerPath, doc, approved, true, 10*time.Second)
361
- if !results[0].Ran || !results[0].Passed {
362
- t.Fatalf("reverify must re-run: %+v", results[0])
363
- }
364
- }
365
-
366
- func TestRunGatesFailureClearsBox(t *testing.T) {
367
- project, ledgerPath := writeWorkspace(t)
368
- writeLedger(t, ledgerPath, "- [x] G1: prior pass\n CHECK: echo nothing\n EXPECT: NEVER-PRESENT\n EVIDENCE: bogus\n")
369
- doc := ParseLedger(mustRead(t, ledgerPath))
370
- approved := []ApprovedCommand{{Command: "echo nothing", Cwd: ""}}
371
-
372
- results := RunGates(context.Background(), project, ledgerPath, doc, approved, true, 10*time.Second)
373
- if !results[0].Ran || results[0].Passed {
374
- t.Fatalf("results=%+v", results)
375
- }
376
- doc = ParseLedger(mustRead(t, ledgerPath))
377
- if doc.Gates[0].Checked || doc.Gates[0].Evidence != "pending" {
378
- t.Fatalf("failed gate must uncheck and reset evidence: %+v", doc.Gates[0])
379
- }
380
- }
381
-
382
- func TestRunGatesSkipsUnapprovedManualAbandoned(t *testing.T) {
383
- project, ledgerPath := writeWorkspace(t)
384
- writeLedger(t, ledgerPath,
385
- "- [ ] G1: unvetted\n CHECK: echo hi\n EXPECT: hi\n EVIDENCE: pending\n"+
386
- "- [ ] G2: judged\n EVIDENCE: pending\n"+
387
- "- [ ] G3: gone\n CHECK: echo hi\n EXPECT: hi\n EVIDENCE: pending\n"+
388
- "ABANDON: G3 removed upstream\n")
389
- doc := ParseLedger(mustRead(t, ledgerPath))
390
- results := RunGates(context.Background(), project, ledgerPath, doc, []ApprovedCommand{}, false, 10*time.Second)
391
- if len(results) != 3 {
392
- t.Fatalf("results=%+v", results)
393
- }
394
- for _, r := range results {
395
- if r.Ran {
396
- t.Fatalf("gate %s must not execute: %+v", r.ID, r)
397
- }
398
- }
399
- // Ledger untouched: no evidence was written for skipped gates.
400
- doc = ParseLedger(mustRead(t, ledgerPath))
401
- for _, gate := range doc.Gates {
402
- if gate.Checked {
403
- t.Fatalf("skipped gate %s mutated", gate.ID)
404
- }
405
- }
406
- }
407
-
408
- func TestWriteResultDiscardsMovedOracle(t *testing.T) {
409
- _, ledgerPath := writeWorkspace(t)
410
- writeLedger(t, ledgerPath, "- [ ] G1: probe\n CHECK: echo hi\n EXPECT: hi\n EVIDENCE: pending\n")
411
- doc := ParseLedger(mustRead(t, ledgerPath))
412
- ran := doc.Gates[0]
413
- // The oracle moves between execution and writeback.
414
- writeLedger(t, ledgerPath, "- [ ] G1: probe\n CHECK: echo hi --verbose\n EXPECT: hi\n EVIDENCE: pending\n")
415
- if err := writeResult(ledgerPath, ran, "evidence", true); !errors.Is(err, ErrOracleMoved) {
416
- t.Fatalf("err=%v", err)
417
- }
418
- // The ledger still shows the new, unchecked definition.
419
- doc = ParseLedger(mustRead(t, ledgerPath))
420
- if doc.Gates[0].Checked || doc.Gates[0].Check != "echo hi --verbose" {
421
- t.Fatalf("ledger clobbered: %+v", doc.Gates[0])
422
- }
423
- }
424
-
425
- func TestWriteResultIgnoresFencedEvidenceDecoy(t *testing.T) {
426
- _, ledgerPath := writeWorkspace(t)
427
- writeLedger(t, ledgerPath,
428
- "- [ ] G1: probe\n CHECK: echo hi\n EXPECT: hi\n\n"+
429
- "```\n EVIDENCE: fenced decoy\n```\n")
430
- doc := ParseLedger(mustRead(t, ledgerPath))
431
- if err := writeResult(ledgerPath, doc.Gates[0], "automatic-evidence=v1; def=x; exit=0; expect=matched; output-sha256=y; output-bytes=1; at=t", true); err != nil {
432
- t.Fatal(err)
433
- }
434
- text := mustRead(t, ledgerPath)
435
- if strings.Contains(text, "fenced decoy") == false {
436
- t.Fatalf("fenced decoy must survive:\n%s", text)
437
- }
438
- doc = ParseLedger(text)
439
- if doc.Gates[0].Evidence == "fenced decoy" || !strings.HasPrefix(doc.Gates[0].Evidence, EvidenceMarker) {
440
- t.Fatalf("evidence misrouted: %q", doc.Gates[0].Evidence)
441
- }
442
- }
443
-
444
- func TestReadLedgerFileBounds(t *testing.T) {
445
- _, ledgerPath := writeWorkspace(t)
446
- if _, err := ReadLedgerFile(ledgerPath); err == nil {
447
- t.Fatal("missing ledger must error")
448
- }
449
- dir := filepath.Join(filepath.Dir(ledgerPath), "notafile")
450
- if err := os.Mkdir(dir, 0o755); err != nil {
451
- t.Fatal(err)
452
- }
453
- if _, err := ReadLedgerFile(dir); err == nil {
454
- t.Fatal("non-regular file must error")
455
- }
456
- }
457
-
458
- // --- lint -----------------------------------------------------------------
459
-
460
- func TestLintFindings(t *testing.T) {
461
- doc := ParseLedger(`- [ ] G1: echo done
462
- CHECK: echo done
463
- EXPECT: pass
464
-
465
- - [ ] G2: Improve coverage by 40 percent
466
- EVIDENCE: pending
467
-
468
- - [ ] G3: real probe
469
- CHECK: ./probe.sh
470
- EXPECT: /tmp/out\.txt/
471
-
472
- - [ ] G4: unvetted
473
- CHECK: ./other.sh
474
- EXPECT: marker
475
- `)
476
- if len(doc.Errors) != 0 {
477
- t.Fatalf("errors=%v", doc.Errors)
478
- }
479
- findings := LintLedger(doc, []ApprovedCommand{{Command: "./probe.sh", Cwd: ""}})
480
- rules := map[string]string{}
481
- for _, f := range findings {
482
- rules[f.Gate+":"+f.Rule] = f.Level
483
- }
484
- for _, want := range []string{
485
- "G1:tautological-check", "G1:weak-expect",
486
- "G2:manual-gate", "G2:unmeasured-number", "G2:activity-not-outcome",
487
- "G3:path-read-as-regex",
488
- "G4:unapproved-check",
489
- } {
490
- if _, ok := rules[want]; !ok {
491
- t.Errorf("missing finding %s in %+v", want, rules)
492
- }
493
- }
494
- if rules["G4:unapproved-check"] != "error" {
495
- t.Fatalf("unapproved must be an error: %+v", rules)
496
- }
497
- // 3 of 4 live gates runnable → no mostly-manual warning.
498
- if _, ok := rules[":mostly-manual"]; ok {
499
- t.Fatalf("unexpected mostly-manual: %+v", rules)
500
- }
501
- }
502
-
503
- func TestLintDuplicateOracle(t *testing.T) {
504
- doc := ParseLedger(`- [ ] G1: first
505
- CHECK: ./probe.sh
506
- EXPECT: marker
507
-
508
- - [ ] G2: same oracle, reworded title
509
- CHECK: ./probe.sh
510
- EXPECT: marker
511
-
512
- - [ ] G3: different oracle
513
- CHECK: ./probe.sh
514
- EXPECT: other
515
-
516
- - [ ] G4: abandoned duplicate
517
- CHECK: ./probe.sh
518
- EXPECT: marker
519
-
520
- - [ ] G5: same check in another cwd
521
- CHECK: ./probe.sh
522
- EXPECT: marker
523
- CWD: engine
524
-
525
- ABANDON: G4 superseded
526
- `)
527
- if len(doc.Errors) != 0 {
528
- t.Fatalf("errors=%v", doc.Errors)
529
- }
530
- findings := LintLedger(doc, []ApprovedCommand{{Command: "./probe.sh", Cwd: ""}, {Command: "./probe.sh", Cwd: "engine"}})
531
- rules := map[string]bool{}
532
- for _, f := range findings {
533
- rules[f.Gate+":"+f.Rule] = true
534
- }
535
- if !rules["G2:duplicate-oracle"] {
536
- t.Errorf("missing G2 duplicate-oracle in %+v", rules)
537
- }
538
- for _, absent := range []string{"G3:duplicate-oracle", "G4:duplicate-oracle", "G5:duplicate-oracle"} {
539
- if rules[absent] {
540
- t.Errorf("unexpected %s in %+v", absent, rules)
541
- }
542
- }
543
- }
544
-
545
- func TestLintMostlyManualAndCounts(t *testing.T) {
546
- doc := ParseLedger("- [ ] G1: a\n CHECK: c\n EXPECT: o\n- [ ] G2: b\n- [ ] G3: c\n")
547
- findings := LintLedger(doc, nil)
548
- var mostlyManual bool
549
- for _, f := range findings {
550
- if f.Rule == "mostly-manual" {
551
- mostlyManual = true
552
- }
553
- }
554
- if !mostlyManual {
555
- t.Fatalf("findings=%+v", findings)
556
- }
557
- // The one runnable gate (G1) has no approved row, so lint reports an error.
558
- errs, warns := LintCounts(findings)
559
- if errs != 1 || warns == 0 {
560
- t.Fatalf("counts=%d/%d", errs, warns)
561
- }
562
- }
563
-
564
- // --- scaffold -------------------------------------------------------------
565
-
566
- func TestScaffoldLedger(t *testing.T) {
567
- empty := ScaffoldLedger("feat", nil)
568
- doc := ParseLedger(empty)
569
- if len(doc.Errors) != 0 || len(doc.Gates) != 1 || doc.Gates[0].ID != "G1" {
570
- t.Fatalf("placeholder scaffold malformed: %v %+v", doc.Errors, doc.Gates)
571
- }
572
- spec := []byte("# Spec\n\n## Acceptance criteria\n\n- AC-002 first\n- AC-001 second\n- AC-002 repeated\n\n## Non-goals\n\n- AC-003 not required\n")
573
- scaffolded := ScaffoldLedger("feat", spec)
574
- doc = ParseLedger(scaffolded)
575
- if len(doc.Errors) != 0 || len(doc.Gates) != 2 || doc.Gates[0].ID != "AC-002" || doc.Gates[1].ID != "AC-001" {
576
- t.Fatalf("scaffolded gates: %v %+v", doc.Errors, doc.Gates)
577
- }
578
- }
579
-
580
- // --- CLI ------------------------------------------------------------------
581
-
582
- func TestRunCLIStatusAndScaffold(t *testing.T) {
583
- project := t.TempDir()
584
- root := filepath.Join(project, ".devrites")
585
- work := filepath.Join(root, "work", "feat")
586
- if err := os.MkdirAll(work, 0o755); err != nil {
587
- t.Fatal(err)
588
- }
589
- var stdout, stderr strings.Builder
590
-
591
- if code := Run(root, []string{"bogus"}, &stdout, &stderr); code != ExitUsage {
592
- t.Fatalf("unknown sub=%d", code)
593
- }
594
- if code := Run(root, []string{"status", "feat"}, &stdout, &stderr); code != ExitBlocked {
595
- t.Fatalf("missing ledger status=%d", code)
596
- }
597
- if code := Run(root, []string{"scaffold", "feat"}, &stdout, &stderr); code != ExitOK {
598
- t.Fatalf("scaffold=%d stderr=%q", code, stderr.String())
599
- }
600
- if !strings.Contains(stdout.String(), "created:") {
601
- t.Fatalf("scaffold stdout=%q", stdout.String())
602
- }
603
- // Scaffold never clobbers.
604
- if code := Run(root, []string{"scaffold", "feat"}, &stdout, &stderr); code != ExitBlocked {
605
- t.Fatalf("second scaffold=%d", code)
606
- }
607
- // The scaffolded ledger parses and reports all-unmet.
608
- stdout.Reset()
609
- if code := Run(root, []string{"status", "feat"}, &stdout, &stderr); code != ExitBlocked {
610
- t.Fatalf("status=%d out=%q", code, stdout.String())
611
- }
612
- if !strings.Contains(stdout.String(), "result: not-met") {
613
- t.Fatalf("status stdout=%q", stdout.String())
614
- }
615
- }
616
-
617
- func TestRunCLIAttestAbandon(t *testing.T) {
618
- project := t.TempDir()
619
- root := filepath.Join(project, ".devrites")
620
- work := filepath.Join(root, "work", "feat")
621
- if err := os.MkdirAll(work, 0o755); err != nil {
622
- t.Fatal(err)
623
- }
624
- writeLedger(t, filepath.Join(work, GatesFile),
625
- "- [ ] M1: human judged\n EVIDENCE: pending\n- [ ] M2: other\n EVIDENCE: pending\n")
626
- var stdout, stderr strings.Builder
627
-
628
- if code := Run(root, []string{"attest", "feat", "M1", "verified", "on staging"}, &stdout, &stderr); code != ExitOK {
629
- t.Fatalf("attest=%d stderr=%q", code, stderr.String())
630
- }
631
- if code := Run(root, []string{"attest", "feat", "M9", "nope"}, &stdout, &stderr); code != ExitBlocked {
632
- t.Fatalf("unknown gate attest=%d", code)
633
- }
634
- if code := Run(root, []string{"abandon", "feat", "M2", "vendor gone"}, &stdout, &stderr); code != ExitOK {
635
- t.Fatalf("abandon=%d stderr=%q", code, stderr.String())
636
- }
637
- // Abandoned gates refuse attestation.
638
- if code := Run(root, []string{"attest", "feat", "M2", "too late"}, &stdout, &stderr); code != ExitBlocked {
639
- t.Fatalf("abandoned attest=%d", code)
640
- }
641
- stdout.Reset()
642
- if code := Run(root, []string{"status", "feat"}, &stdout, &stderr); code != ExitBlocked {
643
- t.Fatalf("status=%d", code)
644
- }
645
- if !strings.Contains(stdout.String(), "result: handoff") || !strings.Contains(stdout.String(), "handoff-id: M2") {
646
- t.Fatalf("status stdout=%q", stdout.String())
647
- }
648
- }
649
-
650
- func mustRead(t *testing.T, path string) string {
651
- t.Helper()
652
- raw, err := os.ReadFile(path)
653
- if err != nil {
654
- t.Fatal(err)
655
- }
656
- return string(raw)
657
- }
658
-
659
- // An unresolvable approval surface is refused, never executed. Each consumer
660
- // (run, reduce, lint) is asserted at its own guard, and nil and empty surfaces
661
- // must behave identically.
662
-
663
- func TestApprovedCommandsNeverNilSurface(t *testing.T) {
664
- // ApprovedCommands never returns nil: a consumer must be able to refuse on an
665
- // empty surface.
666
- cases := map[string][]byte{
667
- "absent file (empty input)": nil,
668
- "invalid utf8": {0xff, 0xfe, 0x00, 'a'},
669
- "no preflight section": []byte("# Test plan\n\n## Plan\nnothing here\n"),
670
- "heading only": []byte("## Build-entry preflight\n"),
671
- "header row only": []byte("## Build-entry preflight\n| command | cwd |\n"),
672
- }
673
- for name, in := range cases {
674
- got := ApprovedCommands(in)
675
- if got == nil {
676
- t.Errorf("CASE %s: ApprovedCommands returned nil; nil reads as 'approval not applicable' so every CHECK executes unreviewed. Must return a non-nil (possibly empty) surface.", name)
677
- continue
678
- }
679
- if len(got) != 0 {
680
- t.Errorf("CASE %s: ApprovedCommands = %v; want non-nil empty (nothing was approved)", name, got)
681
- }
682
- }
683
- }
684
-
685
- func TestRunGatesRefusesUnresolvableApprovalSurface(t *testing.T) {
686
- for _, tc := range []struct {
687
- name string
688
- approved []ApprovedCommand
689
- }{
690
- {"nil surface", nil},
691
- {"empty non-nil surface", []ApprovedCommand{}},
692
- } {
693
- t.Run(tc.name, func(t *testing.T) {
694
- project := t.TempDir()
695
- work := filepath.Join(project, ".devrites", "work", "feat")
696
- if err := os.MkdirAll(work, 0o755); err != nil {
697
- t.Fatal(err)
698
- }
699
- ledgerPath := filepath.Join(work, GatesFile)
700
- body := "- [ ] G1: unreviewed oracle\n CHECK: echo UNAPPROVED-MUST-NOT-RUN\n EXPECT: UNAPPROVED-MUST-NOT-RUN\n EVIDENCE: pending\n"
701
- if err := os.WriteFile(ledgerPath, []byte(body), 0o644); err != nil {
702
- t.Fatal(err)
703
- }
704
- doc := ParseLedger(mustRead(t, ledgerPath))
705
- results := RunGates(context.Background(), project, ledgerPath, doc, tc.approved, false, 10*time.Second)
706
- if len(results) != 1 {
707
- t.Fatalf("results=%+v", results)
708
- }
709
- r := results[0]
710
- if r.Ran {
711
- t.Errorf("DEFECT: gate executed under a %s approval surface (passed=%v detail=%q). An unreviewed CHECK must not execute when approvals cannot be established.", tc.name, r.Passed, r.Detail)
712
- }
713
- if r.Passed {
714
- t.Errorf("DEFECT: gate reported passed under a %s approval surface; certification must not happen.", tc.name)
715
- }
716
- if !strings.Contains(r.Detail, "not an approved") {
717
- t.Errorf("detail=%q; want a refusal naming the unapproved CHECK", r.Detail)
718
- }
719
- after := mustRead(t, ledgerPath)
720
- if strings.Contains(after, EvidenceMarker) {
721
- t.Errorf("DEFECT: ledger was certified with automatic evidence under a %s approval surface:\n%s", tc.name, after)
722
- }
723
- if !strings.Contains(after, "EVIDENCE: pending") {
724
- t.Errorf("ledger evidence was mutated under a %s approval surface:\n%s", tc.name, after)
725
- }
726
- if red := doc.Reduce(tc.approved); red.Unapproved != 1 {
727
- t.Errorf("reduction under %s surface: Unapproved=%d; want 1 so `gates status` cannot report unapproved: 0", tc.name, red.Unapproved)
728
- }
729
- })
730
- }
731
- }
732
-
733
- func TestLintFlagsNilAndEmptyApprovalSurfaceIdentically(t *testing.T) {
734
- for _, tc := range []struct {
735
- name string
736
- approved []ApprovedCommand
737
- }{
738
- {"nil surface", nil},
739
- {"empty surface", []ApprovedCommand{}},
740
- } {
741
- doc := &Document{Abandoned: map[string]string{}}
742
- g := runnableGate("G1", true, "pending")
743
- g.Check = "echo anything"
744
- g.Cwd = ""
745
- doc.Gates = []*Gate{g}
746
- found := false
747
- for _, f := range LintLedger(doc, tc.approved) {
748
- if f.Rule == "unapproved-check" && strings.Contains(f.Message, "echo anything") {
749
- found = true
750
- }
751
- }
752
- if !found {
753
- t.Errorf("DEFECT: Lint(%s) reported no unapproved-check finding; `gates lint --strict` reports LINT OK instead of the authorization error.", tc.name)
754
- }
755
- }
756
- }
757
-
758
- // Refusal applies only where a command would actually execute; manual and
759
- // already-met gates must not be blocked by an unresolvable approval surface.
760
- func TestUnresolvableApprovalDoesNotBlockNonExecutingGates(t *testing.T) {
761
- project := t.TempDir()
762
-
763
- // Manual gates execute nothing, so there is nothing to authorize.
764
- manualOnly := ParseLedger("- [x] M1: human judged\n EVIDENCE: a stranger checked the transcript\n")
765
- if red := manualOnly.Reduce(nil); !red.AllMet() {
766
- t.Errorf("a manual-only ledger has no CHECK to approve and must still reduce all-met: %+v", red)
767
- }
768
- if red := manualOnly.Reduce(nil); red.Unapproved != 0 {
769
- t.Errorf("manual gates are not executions and must not count as unapproved: %+v", red)
770
- }
771
- for _, f := range LintLedger(manualOnly, nil) {
772
- if f.Rule == "unapproved-check" {
773
- t.Errorf("manual gates must never be flagged unapproved: %+v", f)
774
- }
775
- }
776
-
777
- // An already-met runnable gate returns before the approval guard, so a
778
- // workspace whose gates were vetted and met in an earlier run keeps its state.
779
- met := runnableGate("R1", true, "")
780
- met.Check = "echo already"
781
- met.Expect = "already"
782
- met.Evidence = FormatEvidence(met, OutputDigest("already\n"), 8, "2026-01-01T00:00:00Z")
783
- if got := GateState(met, &Document{Abandoned: map[string]string{}}); got != StateMet {
784
- t.Fatalf("fixture must be genuinely met, not %s", got)
785
- }
786
- manualUnmet := &Gate{ID: "M2", Title: "human judged", Evidence: "pending"}
787
- doc := &Document{Abandoned: map[string]string{}, Gates: []*Gate{manualUnmet, met}}
788
- for _, r := range RunGates(context.Background(), project, filepath.Join(project, "unused.md"), doc, nil, false, 10*time.Second) {
789
- if strings.Contains(r.Detail, "not an approved") {
790
- t.Errorf("gate %s was refused for approval although it never executes: %q", r.ID, r.Detail)
791
- }
792
- switch r.ID {
793
- case "M2":
794
- if !strings.Contains(r.Detail, "manual gate") {
795
- t.Errorf("M2 detail=%q; want the manual-gate wording, proving the approval guard was never reached", r.Detail)
796
- }
797
- case "R1":
798
- if !strings.Contains(r.Detail, "already met") {
799
- t.Errorf("R1 detail=%q; want already-met, proving a vetted pass is not re-litigated", r.Detail)
800
- }
801
- }
802
- }
803
- }
804
-
805
- // An unreadable test-plan.md leaves every runnable CHECK unapproved: the runner
806
- // refuses it and the reduction and lint report it, whatever the value's nil-ness.
807
- func TestLoadTestPlanUnreadableApprovesNothing(t *testing.T) {
808
- approved := loadTestPlan(filepath.Join(t.TempDir(), "missing", "test-plan.md"))
809
- if Approved("echo hi", "", approved) {
810
- t.Fatalf("unreadable plan approved a command: %+v", approved)
811
- }
812
- g := runnableGate("G1", true, "pending")
813
- g.Check = "echo hi"
814
- doc := &Document{Abandoned: map[string]string{}, Gates: []*Gate{g}}
815
- if red := doc.Reduce(approved); red.Unapproved != 1 {
816
- t.Fatalf("Unapproved=%d; want 1", red.Unapproved)
817
- }
818
- errs, _ := LintCounts(LintLedger(doc, approved))
819
- if errs != 1 {
820
- t.Fatalf("lint errs=%d; want 1 unapproved-check", errs)
821
- }
822
- }
823
-
824
- // `gates attest` refuses a placeholder note at write time, so a manual gate is
825
- // never left checked on evidence the reader would later reject.
826
- func TestAttestRefusesPlaceholderNotes(t *testing.T) {
827
- placeholders := []string{"n/a", "tbd", "-", "ok", "done", "yes", "pending", "PENDING", "verified", "TODO", "N/A", "none", "n/a (see notes)", "done.", "AC-004: outcome seen", "outcome seen", "AC-004 - outcome seen", "**done**"}
828
- for _, note := range placeholders {
829
- project := t.TempDir()
830
- root := filepath.Join(project, ".devrites")
831
- work := filepath.Join(root, "work", "feat")
832
- if err := os.MkdirAll(work, 0o755); err != nil {
833
- t.Fatal(err)
834
- }
835
- ledgerPath := filepath.Join(work, GatesFile)
836
- body := "- [ ] AC-004: outcome seen\n EVIDENCE: pending\n"
837
- writeLedger(t, ledgerPath, body)
838
- var stdout, stderr strings.Builder
839
- if code := Run(root, []string{"attest", "feat", "AC-004", note}, &stdout, &stderr); code == ExitOK {
840
- t.Errorf("placeholder %q was accepted at write time", note)
841
- }
842
- if !strings.Contains(stderr.String(), "placeholder") {
843
- t.Errorf("placeholder %q: stderr=%q; want a message naming the placeholder", note, stderr.String())
844
- }
845
- if got := mustRead(t, ledgerPath); got != body {
846
- t.Errorf("placeholder %q mutated the ledger:\n%s", note, got)
847
- }
848
- }
849
- }
850
-
851
- // The refusal must say a trailing parenthetical after a placeholder word is
852
- // ignored, since the note otherwise appears to already cite who and where.
853
- func TestAttestRefusalExplainsIgnoredParenthetical(t *testing.T) {
854
- project := t.TempDir()
855
- root := filepath.Join(project, ".devrites")
856
- work := filepath.Join(root, "work", "feat")
857
- if err := os.MkdirAll(work, 0o755); err != nil {
858
- t.Fatal(err)
859
- }
860
- writeLedger(t, filepath.Join(work, GatesFile), "- [ ] AC-004: outcome seen\n EVIDENCE: pending\n")
861
- var stdout, stderr strings.Builder
862
- note := "done (verified on staging by Ann, q-12)"
863
- if code := Run(root, []string{"attest", "feat", "AC-004", note}, &stdout, &stderr); code == ExitOK {
864
- t.Fatalf("note %q was accepted", note)
865
- }
866
- for _, want := range []string{"placeholder", "trailing (", "is ignored"} {
867
- if !strings.Contains(stderr.String(), want) {
868
- t.Errorf("stderr=%q; want it to contain %q", stderr.String(), want)
869
- }
870
- }
871
- }
872
-
873
- func TestAttestAcceptsSubstantiveNote(t *testing.T) {
874
- project := t.TempDir()
875
- root := filepath.Join(project, ".devrites")
876
- work := filepath.Join(root, "work", "feat")
877
- if err := os.MkdirAll(work, 0o755); err != nil {
878
- t.Fatal(err)
879
- }
880
- ledgerPath := filepath.Join(work, GatesFile)
881
- writeLedger(t, ledgerPath, "- [ ] AC-004: outcome seen\n EVIDENCE: pending\n")
882
- var stdout, stderr strings.Builder
883
- if code := Run(root, []string{"attest", "feat", "AC-004", "verified on staging by reviewer"}, &stdout, &stderr); code != ExitOK {
884
- t.Fatalf("substantive note refused: code=%d stderr=%q", code, stderr.String())
885
- }
886
- doc := ParseLedger(mustRead(t, ledgerPath))
887
- if len(doc.Gates) != 1 || GateState(doc.Gates[0], doc) != StateMet {
888
- t.Fatalf("substantive attestation not met: %+v", doc.Gates)
889
- }
890
- }
891
-
892
- func manualLedger(note string) *Document {
893
- return ParseLedger("# Gates\n\n- [x] AC-004: outcome seen\n EVIDENCE: " + note + "\n")
894
- }
895
-
896
- func TestManualGatePlaceholdersNeverMet(t *testing.T) {
897
- for _, ev := range []string{"n/a", "tbd", "-", "ok", "done", "yes", "pending", "PENDING", "Pending", "verified", "TODO", "N/A", "TBD", "none", "n/a (see notes)", "done.",
898
- "AC-004 — outcome seen", "AC-004 - outcome seen", "`done`", "**done**", "\"n/a\"",
899
- "AC-004: outcome seen", "outcome seen", "AC-004", "AC-004 – outcome seen", "*done*", "_done_", "'done'", "Done!", " yes. ", "N.A.", "—", "✅", "✓ done", "[done]", "> done", "~~tbd~~", "outcome seen (AC-004)", "AC-004 (outcome seen)", "AC004 outcome seen", "ac-004: OUTCOME SEEN.", "pass", "passed", "true", "0", "okay", "none.", "TODO: later", "not applicable", "N/A - not applicable", "AC-004 done", "done - AC-004", "AC004 outcome seen", "AC 004 done", "see above", "(done)", "TBD (see notes)"} {
900
- d := manualLedger(ev)
901
- if len(d.Gates) != 1 || d.Gates[0].ID != "AC-004" || d.Gates[0].Evidence == "" {
902
- t.Logf("PARSE %q: gates=%d errs=%v", ev, len(d.Gates), d.Errors)
903
- continue
904
- }
905
- if got := GateState(d.Gates[0], d); got == StateMet {
906
- t.Errorf("placeholder %q reached met", ev)
907
- }
908
- if d.Reduce(nil).AllMet() {
909
- t.Errorf("placeholder %q: AllMet", ev)
910
- }
911
- }
912
- }
913
-
914
- // A title's own trailing parenthetical is part of the title, so a note that
915
- // repeats only that parenthetical restates the title and stays unmet.
916
- func TestManualGateTitleParentheticalIsTitleText(t *testing.T) {
917
- for _, title := range []string{"Refund appears in ledger. (REQ-002)", "Refund appears in ledger (REQ-002)"} {
918
- for _, note := range []string{"REQ-002", "(REQ-002)", "req 002", "Refund appears in ledger (REQ-002)"} {
919
- d := ParseLedger("# Gates\n\n- [x] AC-004: " + title + "\n EVIDENCE: " + note + "\n")
920
- if len(d.Gates) != 1 {
921
- t.Fatalf("title %q note %q: gates=%d errs=%v", title, note, len(d.Gates), d.Errors)
922
- }
923
- if got := GateState(d.Gates[0], d); got == StateMet {
924
- t.Errorf("title %q: title-only note %q reached met", title, note)
925
- }
926
- }
927
- d := ParseLedger("# Gates\n\n- [x] AC-004: " + title + "\n EVIDENCE: REQ-002 confirmed on staging by Brooke\n")
928
- if got := GateState(d.Gates[0], d); got != StateMet {
929
- t.Errorf("title %q: substantive note = %s, want met", title, got)
930
- }
931
- }
932
- }
933
-
934
- func TestManualGateSubstantiveNotesMet(t *testing.T) {
935
- for _, ev := range []string{"verified on staging by reviewer", "Verified on staging by reviewer (ticket 42)", "done on prod: 3 orders replayed, outcome seen in dashboard",
936
- "Done: reviewer confirmed checkout on staging (q-12)", "q-12: Brooke confirmed the outcome seen on staging", "Yes - Brooke saw the banner on iPhone 15 (q-7)",
937
- "(q-12) Brooke confirmed refund on staging", "outcome seen on staging by Brooke", "AC-004 outcome seen on staging by Brooke, q-3", "(Brooke confirmed refund on staging, q-12)"} {
938
- d := manualLedger(ev)
939
- if got := GateState(d.Gates[0], d); got != StateMet {
940
- t.Errorf("substantive %q = %s, want met", ev, got)
941
- }
942
- if !d.Reduce(nil).AllMet() {
943
- t.Errorf("substantive %q not AllMet", ev)
944
- }
945
- }
946
- }