devrites 6.0.3 → 6.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (785) 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/cli.md +25 -2
  9. package/docs/command-map.md +10 -8
  10. package/docs/engine/commands.md +10 -7
  11. package/docs/harness-compliance.md +2 -2
  12. package/docs/orchestration.md +5 -4
  13. package/docs/release.md +4 -4
  14. package/docs/skills.md +2 -2
  15. package/engine/commands.go +1 -1
  16. package/engine/help.go +10 -6
  17. package/engine/internal/acceptance/cli.go +4 -1
  18. package/engine/internal/acceptance/exec.go +11 -11
  19. package/engine/internal/devritespaths/paths.go +5 -0
  20. package/engine/internal/hostpack/hostpack.go +48 -3
  21. package/engine/internal/install/apply.go +68 -1
  22. package/engine/internal/install/binary.go +4 -0
  23. package/engine/internal/install/install.go +25 -15
  24. package/engine/internal/install/merge.go +287 -123
  25. package/engine/internal/install/preflight.go +71 -1
  26. package/engine/internal/install/uninstall.go +7 -1
  27. package/engine/internal/install/update.go +7 -3
  28. package/engine/internal/lib/claims.go +30 -14
  29. package/engine/internal/lib/cli_observe.go +6 -0
  30. package/engine/internal/lib/context.go +35 -12
  31. package/engine/internal/lib/diffscope.go +79 -3
  32. package/engine/internal/lib/dispatch.go +78 -12
  33. package/engine/internal/lib/drift.go +9 -2
  34. package/engine/internal/lib/handoff.go +14 -5
  35. package/engine/internal/lib/metrics.go +103 -10
  36. package/engine/internal/lib/migrate.go +30 -12
  37. package/engine/internal/lib/next.go +22 -2
  38. package/engine/internal/lib/observe_summary.go +8 -0
  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 +6 -2
  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/devrites-slice-wright.md +4 -1
  71. package/pack/.claude/agents/overhaul-implementer.md +1 -0
  72. package/pack/.claude/settings.json +4 -4
  73. package/pack/.claude/skills/devrites-api-interface/SKILL.md +1 -1
  74. package/pack/.claude/skills/devrites-audit/SKILL.md +1 -1
  75. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +1 -1
  76. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +3 -2
  77. package/pack/.claude/skills/devrites-doubt/SKILL.md +1 -1
  78. package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +1 -1
  79. package/pack/.claude/skills/devrites-interview/SKILL.md +1 -1
  80. package/pack/.claude/skills/devrites-lib/reference/intent-map.md +3 -3
  81. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -3
  82. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
  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/data-integrity.md +4 -0
  86. package/pack/.claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  87. package/pack/.claude/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  88. package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +2 -0
  89. package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  90. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +13 -0
  91. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -6
  92. package/pack/.claude/skills/devrites-prose-craft/SKILL.md +1 -1
  93. package/pack/.claude/skills/devrites-source-driven/SKILL.md +1 -1
  94. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +1 -1
  95. package/pack/.claude/skills/overhaul/references/orchestration.md +6 -2
  96. package/pack/.claude/skills/overhaul/references/records.md +8 -3
  97. package/pack/.claude/skills/rite/SKILL.md +4 -3
  98. package/pack/.claude/skills/rite/reference/menu.md +6 -5
  99. package/pack/.claude/skills/rite-adopt/SKILL.md +4 -3
  100. package/pack/.claude/skills/rite-autocomplete/SKILL.md +6 -5
  101. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +2 -1
  102. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  103. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +3 -1
  104. package/pack/.claude/skills/rite-build/reference/output.md +1 -1
  105. package/pack/.claude/skills/rite-build/reference/phase-contract.md +2 -0
  106. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +19 -0
  107. package/pack/.claude/skills/rite-converge/SKILL.md +4 -3
  108. package/pack/.claude/skills/rite-customize/SKILL.md +1 -1
  109. package/pack/.claude/skills/rite-define/SKILL.md +3 -2
  110. package/pack/.claude/skills/rite-doctor/SKILL.md +12 -6
  111. package/pack/.claude/skills/rite-dogfood/SKILL.md +2 -2
  112. package/pack/.claude/skills/rite-explain/SKILL.md +1 -1
  113. package/pack/.claude/skills/rite-fast/SKILL.md +3 -1
  114. package/pack/.claude/skills/rite-handoff/SKILL.md +4 -3
  115. package/pack/.claude/skills/rite-learn/SKILL.md +2 -2
  116. package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +2 -0
  117. package/pack/.claude/skills/rite-plan/reference/slicing.md +3 -1
  118. package/pack/.claude/skills/rite-pov/SKILL.md +1 -1
  119. package/pack/.claude/skills/rite-pr-feedback/SKILL.md +5 -4
  120. package/pack/.claude/skills/rite-pressure-test/SKILL.md +7 -5
  121. package/pack/.claude/skills/rite-prototype/SKILL.md +1 -1
  122. package/pack/.claude/skills/rite-quick/SKILL.md +10 -5
  123. package/pack/.claude/skills/rite-resolve/SKILL.md +3 -3
  124. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +4 -5
  125. package/pack/.claude/skills/rite-review/SKILL.md +2 -1
  126. package/pack/.claude/skills/rite-seal/SKILL.md +3 -3
  127. package/pack/.claude/skills/rite-seal/reference/go-no-go.md +2 -0
  128. package/pack/.claude/skills/rite-seal/reference/seal-template.md +5 -2
  129. package/pack/.claude/skills/rite-ship/reference/close-out.md +3 -2
  130. package/pack/.claude/skills/rite-spec/SKILL.md +4 -1
  131. package/pack/.claude/skills/rite-status/SKILL.md +1 -1
  132. package/pack/.claude/skills/rite-temper/reference/significance.md +2 -0
  133. package/pack/.claude/skills/rite-upgrade/SKILL.md +4 -2
  134. package/pack/.claude/skills/rite-vet/SKILL.md +3 -2
  135. package/pack/.claude/skills/rite-vet/reference/artifacts.md +1 -1
  136. package/pack/.claude/skills/rite-watch-pr/SKILL.md +1 -1
  137. package/pack/.claude/skills/rite-zoom-out/SKILL.md +1 -1
  138. package/pack/generated/claude/agents/devrites-devex-reviewer.md +5 -0
  139. package/pack/generated/claude/agents/devrites-evidence-scout.md +4 -0
  140. package/pack/generated/claude/agents/devrites-plan-reviewer.md +4 -1
  141. package/pack/generated/claude/agents/devrites-slice-wright.md +4 -1
  142. package/pack/generated/claude/agents/overhaul-backend-engineer.md +2 -0
  143. package/pack/generated/claude/agents/overhaul-boundary.md +2 -0
  144. package/pack/generated/claude/agents/overhaul-craft.md +2 -0
  145. package/pack/generated/claude/agents/overhaul-frontend-engineer.md +2 -0
  146. package/pack/generated/claude/agents/overhaul-implementer.md +3 -0
  147. package/pack/generated/claude/agents/overhaul-recon.md +2 -0
  148. package/pack/generated/claude/agents/overhaul-specialist.md +2 -0
  149. package/pack/generated/claude/agents/overhaul-verifier.md +2 -0
  150. package/pack/generated/claude/settings.json +4 -4
  151. package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +1 -1
  152. package/pack/generated/claude/skills/devrites-audit/SKILL.md +1 -1
  153. package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +1 -1
  154. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +3 -2
  155. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +1 -1
  156. package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +1 -1
  157. package/pack/generated/claude/skills/devrites-interview/SKILL.md +1 -1
  158. package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +3 -3
  159. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -3
  160. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
  161. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  162. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
  163. package/pack/generated/claude/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  164. package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  165. package/pack/generated/claude/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  166. package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +2 -0
  167. package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  168. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +13 -0
  169. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -6
  170. package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +1 -1
  171. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +1 -1
  172. package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +1 -1
  173. package/pack/generated/claude/skills/overhaul/references/orchestration.md +6 -2
  174. package/pack/generated/claude/skills/overhaul/references/records.md +8 -3
  175. package/pack/generated/claude/skills/rite/SKILL.md +4 -3
  176. package/pack/generated/claude/skills/rite/reference/menu.md +6 -5
  177. package/pack/generated/claude/skills/rite-adopt/SKILL.md +4 -3
  178. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +6 -5
  179. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +2 -1
  180. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  181. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +3 -1
  182. package/pack/generated/claude/skills/rite-build/reference/output.md +1 -1
  183. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +2 -0
  184. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +19 -0
  185. package/pack/generated/claude/skills/rite-converge/SKILL.md +4 -3
  186. package/pack/generated/claude/skills/rite-customize/SKILL.md +1 -1
  187. package/pack/generated/claude/skills/rite-define/SKILL.md +3 -2
  188. package/pack/generated/claude/skills/rite-doctor/SKILL.md +12 -6
  189. package/pack/generated/claude/skills/rite-dogfood/SKILL.md +2 -2
  190. package/pack/generated/claude/skills/rite-explain/SKILL.md +1 -1
  191. package/pack/generated/claude/skills/rite-fast/SKILL.md +3 -1
  192. package/pack/generated/claude/skills/rite-handoff/SKILL.md +4 -3
  193. package/pack/generated/claude/skills/rite-learn/SKILL.md +2 -2
  194. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +2 -0
  195. package/pack/generated/claude/skills/rite-plan/reference/slicing.md +3 -1
  196. package/pack/generated/claude/skills/rite-pov/SKILL.md +1 -1
  197. package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +5 -4
  198. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +7 -5
  199. package/pack/generated/claude/skills/rite-prototype/SKILL.md +1 -1
  200. package/pack/generated/claude/skills/rite-quick/SKILL.md +10 -5
  201. package/pack/generated/claude/skills/rite-resolve/SKILL.md +3 -3
  202. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +4 -5
  203. package/pack/generated/claude/skills/rite-review/SKILL.md +2 -1
  204. package/pack/generated/claude/skills/rite-seal/SKILL.md +3 -3
  205. package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +2 -0
  206. package/pack/generated/claude/skills/rite-seal/reference/seal-template.md +5 -2
  207. package/pack/generated/claude/skills/rite-ship/reference/close-out.md +3 -2
  208. package/pack/generated/claude/skills/rite-spec/SKILL.md +4 -1
  209. package/pack/generated/claude/skills/rite-status/SKILL.md +1 -1
  210. package/pack/generated/claude/skills/rite-temper/reference/significance.md +2 -0
  211. package/pack/generated/claude/skills/rite-upgrade/SKILL.md +4 -2
  212. package/pack/generated/claude/skills/rite-vet/SKILL.md +3 -2
  213. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +1 -1
  214. package/pack/generated/claude/skills/rite-watch-pr/SKILL.md +1 -1
  215. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +1 -1
  216. package/pack/generated/codex/agents/devrites-code-reviewer.toml +7 -7
  217. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +6 -1
  218. package/pack/generated/codex/agents/devrites-evidence-scout.toml +4 -0
  219. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +1 -1
  220. package/pack/generated/codex/agents/devrites-plan-drafter.toml +3 -3
  221. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +5 -2
  222. package/pack/generated/codex/agents/devrites-proof-runner.toml +2 -2
  223. package/pack/generated/codex/agents/devrites-security-auditor.toml +1 -1
  224. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +1 -1
  225. package/pack/generated/codex/agents/devrites-slice-wright.toml +8 -5
  226. package/pack/generated/codex/agents/devrites-test-analyst.toml +5 -5
  227. package/pack/generated/codex/agents/devrites-upgrade-planner.toml +1 -1
  228. package/pack/generated/codex/agents/fast-builder.toml +3 -3
  229. package/pack/generated/codex/agents/fast-critic.toml +3 -3
  230. package/pack/generated/codex/agents/overhaul-backend-engineer.toml +2 -0
  231. package/pack/generated/codex/agents/overhaul-boundary.toml +2 -0
  232. package/pack/generated/codex/agents/overhaul-craft.toml +2 -0
  233. package/pack/generated/codex/agents/overhaul-frontend-engineer.toml +2 -0
  234. package/pack/generated/codex/agents/overhaul-implementer.toml +2 -0
  235. package/pack/generated/codex/agents/overhaul-recon.toml +2 -0
  236. package/pack/generated/codex/agents/overhaul-specialist.toml +2 -0
  237. package/pack/generated/codex/agents/overhaul-verifier.toml +2 -0
  238. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +1 -1
  239. package/pack/generated/codex/skills/devrites-audit/SKILL.md +1 -1
  240. package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +1 -1
  241. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +3 -2
  242. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +1 -1
  243. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +1 -1
  244. package/pack/generated/codex/skills/devrites-interview/SKILL.md +1 -1
  245. package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +3 -3
  246. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  247. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
  248. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +1 -1
  249. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  250. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +1 -1
  251. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +1 -1
  252. package/pack/generated/codex/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  253. package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  254. package/pack/generated/codex/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  255. package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +2 -0
  256. package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  257. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +13 -0
  258. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  259. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +1 -1
  260. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +1 -1
  261. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +1 -1
  262. package/pack/generated/codex/skills/overhaul/SKILL.md +15 -15
  263. package/pack/generated/codex/skills/overhaul/references/audit-domains.md +2 -2
  264. package/pack/generated/codex/skills/overhaul/references/orchestration.md +11 -7
  265. package/pack/generated/codex/skills/overhaul/references/records.md +8 -3
  266. package/pack/generated/codex/skills/rite/SKILL.md +4 -3
  267. package/pack/generated/codex/skills/rite/reference/menu.md +6 -5
  268. package/pack/generated/codex/skills/rite-adopt/SKILL.md +4 -3
  269. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +7 -6
  270. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +2 -1
  271. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  272. package/pack/generated/codex/skills/rite-build/SKILL.md +2 -2
  273. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +3 -1
  274. package/pack/generated/codex/skills/rite-build/reference/output.md +1 -1
  275. package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +1 -1
  276. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +2 -0
  277. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +20 -1
  278. package/pack/generated/codex/skills/rite-clarify/SKILL.md +1 -1
  279. package/pack/generated/codex/skills/rite-converge/SKILL.md +5 -4
  280. package/pack/generated/codex/skills/rite-customize/SKILL.md +1 -1
  281. package/pack/generated/codex/skills/rite-define/SKILL.md +4 -3
  282. package/pack/generated/codex/skills/rite-doctor/SKILL.md +12 -6
  283. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +2 -2
  284. package/pack/generated/codex/skills/rite-explain/SKILL.md +1 -1
  285. package/pack/generated/codex/skills/rite-fast/SKILL.md +8 -6
  286. package/pack/generated/codex/skills/rite-frame/SKILL.md +1 -1
  287. package/pack/generated/codex/skills/rite-handoff/SKILL.md +4 -3
  288. package/pack/generated/codex/skills/rite-learn/SKILL.md +2 -2
  289. package/pack/generated/codex/skills/rite-plan/SKILL.md +1 -1
  290. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +2 -0
  291. package/pack/generated/codex/skills/rite-plan/reference/slicing.md +3 -1
  292. package/pack/generated/codex/skills/rite-polish/SKILL.md +2 -2
  293. package/pack/generated/codex/skills/rite-pov/SKILL.md +1 -1
  294. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +5 -4
  295. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +7 -5
  296. package/pack/generated/codex/skills/rite-prototype/SKILL.md +1 -1
  297. package/pack/generated/codex/skills/rite-prove/SKILL.md +1 -1
  298. package/pack/generated/codex/skills/rite-quick/SKILL.md +11 -6
  299. package/pack/generated/codex/skills/rite-resolve/SKILL.md +3 -3
  300. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +4 -5
  301. package/pack/generated/codex/skills/rite-review/SKILL.md +3 -2
  302. package/pack/generated/codex/skills/rite-seal/SKILL.md +4 -4
  303. package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +2 -0
  304. package/pack/generated/codex/skills/rite-seal/reference/seal-template.md +5 -2
  305. package/pack/generated/codex/skills/rite-ship/SKILL.md +1 -1
  306. package/pack/generated/codex/skills/rite-ship/reference/close-out.md +3 -2
  307. package/pack/generated/codex/skills/rite-spec/SKILL.md +5 -2
  308. package/pack/generated/codex/skills/rite-status/SKILL.md +1 -1
  309. package/pack/generated/codex/skills/rite-temper/SKILL.md +2 -2
  310. package/pack/generated/codex/skills/rite-temper/reference/significance.md +2 -0
  311. package/pack/generated/codex/skills/rite-upgrade/SKILL.md +4 -2
  312. package/pack/generated/codex/skills/rite-vet/SKILL.md +4 -3
  313. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +1 -1
  314. package/pack/generated/codex/skills/rite-watch-pr/SKILL.md +1 -1
  315. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +1 -1
  316. package/pack/generated/devin/AGENTS.md +1 -1
  317. package/pack/generated/devin/agents/devrites-devex-reviewer.md +5 -0
  318. package/pack/generated/devin/agents/devrites-evidence-scout.md +4 -0
  319. package/pack/generated/devin/agents/devrites-plan-reviewer.md +4 -1
  320. package/pack/generated/devin/agents/devrites-slice-wright.md +4 -1
  321. package/pack/generated/devin/agents/overhaul-backend-engineer.md +2 -0
  322. package/pack/generated/devin/agents/overhaul-boundary.md +2 -0
  323. package/pack/generated/devin/agents/overhaul-craft.md +2 -0
  324. package/pack/generated/devin/agents/overhaul-frontend-engineer.md +2 -0
  325. package/pack/generated/devin/agents/overhaul-implementer.md +2 -0
  326. package/pack/generated/devin/agents/overhaul-recon.md +2 -0
  327. package/pack/generated/devin/agents/overhaul-specialist.md +2 -0
  328. package/pack/generated/devin/agents/overhaul-verifier.md +2 -0
  329. package/pack/generated/devin/skills/devrites-api-interface/SKILL.md +1 -1
  330. package/pack/generated/devin/skills/devrites-audit/SKILL.md +1 -1
  331. package/pack/generated/devin/skills/devrites-browser-proof/SKILL.md +1 -1
  332. package/pack/generated/devin/skills/devrites-debug-recovery/SKILL.md +3 -2
  333. package/pack/generated/devin/skills/devrites-doubt/SKILL.md +1 -1
  334. package/pack/generated/devin/skills/devrites-frontend-craft/SKILL.md +1 -1
  335. package/pack/generated/devin/skills/devrites-interview/SKILL.md +2 -2
  336. package/pack/generated/devin/skills/devrites-lib/reference/intent-map.md +3 -3
  337. package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  338. package/pack/generated/devin/skills/devrites-lib/reference/standards/afk-hitl.md +8 -7
  339. package/pack/generated/devin/skills/devrites-lib/reference/standards/agents.md +1 -1
  340. package/pack/generated/devin/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  341. package/pack/generated/devin/skills/devrites-lib/reference/standards/code-review.md +1 -1
  342. package/pack/generated/devin/skills/devrites-lib/reference/standards/core.md +1 -1
  343. package/pack/generated/devin/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  344. package/pack/generated/devin/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  345. package/pack/generated/devin/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  346. package/pack/generated/devin/skills/devrites-lib/reference/standards/performance.md +2 -0
  347. package/pack/generated/devin/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  348. package/pack/generated/devin/skills/devrites-lib/reference/standards/testing.md +13 -0
  349. package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  350. package/pack/generated/devin/skills/devrites-prose-craft/SKILL.md +1 -1
  351. package/pack/generated/devin/skills/devrites-source-driven/SKILL.md +1 -1
  352. package/pack/generated/devin/skills/devrites-ux-shape/SKILL.md +1 -1
  353. package/pack/generated/devin/skills/overhaul/SKILL.md +15 -15
  354. package/pack/generated/devin/skills/overhaul/references/audit-domains.md +2 -2
  355. package/pack/generated/devin/skills/overhaul/references/orchestration.md +11 -7
  356. package/pack/generated/devin/skills/overhaul/references/records.md +8 -3
  357. package/pack/generated/devin/skills/rite/SKILL.md +4 -3
  358. package/pack/generated/devin/skills/rite/reference/menu.md +6 -5
  359. package/pack/generated/devin/skills/rite-adopt/SKILL.md +4 -3
  360. package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +8 -7
  361. package/pack/generated/devin/skills/rite-autocomplete/reference/decision-policy.md +1 -1
  362. package/pack/generated/devin/skills/rite-autocomplete/reference/loop.md +2 -1
  363. package/pack/generated/devin/skills/rite-autocomplete/reference/stop-conditions.md +3 -2
  364. package/pack/generated/devin/skills/rite-build/SKILL.md +2 -2
  365. package/pack/generated/devin/skills/rite-build/reference/afk-discipline.md +3 -1
  366. package/pack/generated/devin/skills/rite-build/reference/checkpoint-protocol.md +2 -2
  367. package/pack/generated/devin/skills/rite-build/reference/output.md +1 -1
  368. package/pack/generated/devin/skills/rite-build/reference/parallel-batch.md +1 -1
  369. package/pack/generated/devin/skills/rite-build/reference/phase-contract.md +2 -0
  370. package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +20 -1
  371. package/pack/generated/devin/skills/rite-clarify/SKILL.md +1 -1
  372. package/pack/generated/devin/skills/rite-converge/SKILL.md +5 -4
  373. package/pack/generated/devin/skills/rite-customize/SKILL.md +1 -1
  374. package/pack/generated/devin/skills/rite-define/SKILL.md +4 -3
  375. package/pack/generated/devin/skills/rite-doctor/SKILL.md +12 -6
  376. package/pack/generated/devin/skills/rite-dogfood/SKILL.md +2 -2
  377. package/pack/generated/devin/skills/rite-explain/SKILL.md +3 -3
  378. package/pack/generated/devin/skills/rite-explain/reference/intake.md +1 -1
  379. package/pack/generated/devin/skills/rite-fast/SKILL.md +8 -6
  380. package/pack/generated/devin/skills/rite-frame/SKILL.md +1 -1
  381. package/pack/generated/devin/skills/rite-handoff/SKILL.md +4 -3
  382. package/pack/generated/devin/skills/rite-learn/SKILL.md +2 -2
  383. package/pack/generated/devin/skills/rite-plan/SKILL.md +1 -1
  384. package/pack/generated/devin/skills/rite-plan/reference/replan-and-repair.md +2 -0
  385. package/pack/generated/devin/skills/rite-plan/reference/slicing.md +3 -1
  386. package/pack/generated/devin/skills/rite-polish/SKILL.md +2 -2
  387. package/pack/generated/devin/skills/rite-pov/SKILL.md +1 -1
  388. package/pack/generated/devin/skills/rite-pr-feedback/SKILL.md +5 -4
  389. package/pack/generated/devin/skills/rite-pressure-test/SKILL.md +7 -5
  390. package/pack/generated/devin/skills/rite-prototype/SKILL.md +1 -1
  391. package/pack/generated/devin/skills/rite-prove/SKILL.md +1 -1
  392. package/pack/generated/devin/skills/rite-quick/SKILL.md +11 -6
  393. package/pack/generated/devin/skills/rite-resolve/SKILL.md +4 -4
  394. package/pack/generated/devin/skills/rite-resolve/reference/answer-protocol.md +4 -5
  395. package/pack/generated/devin/skills/rite-review/SKILL.md +3 -2
  396. package/pack/generated/devin/skills/rite-seal/SKILL.md +4 -4
  397. package/pack/generated/devin/skills/rite-seal/reference/go-no-go.md +2 -0
  398. package/pack/generated/devin/skills/rite-seal/reference/seal-template.md +5 -2
  399. package/pack/generated/devin/skills/rite-ship/SKILL.md +1 -1
  400. package/pack/generated/devin/skills/rite-ship/reference/close-out.md +3 -2
  401. package/pack/generated/devin/skills/rite-spec/SKILL.md +5 -2
  402. package/pack/generated/devin/skills/rite-spec/reference/investigation.md +1 -1
  403. package/pack/generated/devin/skills/rite-status/SKILL.md +1 -1
  404. package/pack/generated/devin/skills/rite-temper/SKILL.md +3 -3
  405. package/pack/generated/devin/skills/rite-temper/reference/scope-modes.md +1 -1
  406. package/pack/generated/devin/skills/rite-temper/reference/significance.md +3 -1
  407. package/pack/generated/devin/skills/rite-upgrade/SKILL.md +4 -2
  408. package/pack/generated/devin/skills/rite-vet/SKILL.md +4 -3
  409. package/pack/generated/devin/skills/rite-vet/reference/artifacts.md +1 -1
  410. package/pack/generated/devin/skills/rite-vet/reference/review-axes.md +2 -2
  411. package/pack/generated/devin/skills/rite-watch-pr/SKILL.md +1 -1
  412. package/pack/generated/devin/skills/rite-zoom-out/SKILL.md +1 -1
  413. package/pack/generated/omp/agents/devrites-code-reviewer.md +7 -7
  414. package/pack/generated/omp/agents/devrites-devex-reviewer.md +6 -1
  415. package/pack/generated/omp/agents/devrites-evidence-scout.md +4 -0
  416. package/pack/generated/omp/agents/devrites-frontend-reviewer.md +1 -1
  417. package/pack/generated/omp/agents/devrites-plan-drafter.md +3 -3
  418. package/pack/generated/omp/agents/devrites-plan-reviewer.md +5 -2
  419. package/pack/generated/omp/agents/devrites-proof-runner.md +2 -2
  420. package/pack/generated/omp/agents/devrites-security-auditor.md +1 -1
  421. package/pack/generated/omp/agents/devrites-simplifier-reviewer.md +1 -1
  422. package/pack/generated/omp/agents/devrites-slice-wright.md +8 -5
  423. package/pack/generated/omp/agents/devrites-test-analyst.md +5 -5
  424. package/pack/generated/omp/agents/devrites-upgrade-planner.md +1 -1
  425. package/pack/generated/omp/agents/fast-builder.md +3 -3
  426. package/pack/generated/omp/agents/fast-critic.md +3 -3
  427. package/pack/generated/omp/agents/overhaul-backend-engineer.md +2 -0
  428. package/pack/generated/omp/agents/overhaul-boundary.md +2 -0
  429. package/pack/generated/omp/agents/overhaul-craft.md +2 -0
  430. package/pack/generated/omp/agents/overhaul-frontend-engineer.md +2 -0
  431. package/pack/generated/omp/agents/overhaul-implementer.md +2 -0
  432. package/pack/generated/omp/agents/overhaul-recon.md +2 -0
  433. package/pack/generated/omp/agents/overhaul-specialist.md +2 -0
  434. package/pack/generated/omp/agents/overhaul-verifier.md +2 -0
  435. package/pack/generated/omp/commands/rite-resolve.md +1 -1
  436. package/pack/generated/omp/skills/devrites-api-interface/SKILL.md +4 -4
  437. package/pack/generated/omp/skills/devrites-audit/SKILL.md +5 -5
  438. package/pack/generated/omp/skills/devrites-browser-proof/SKILL.md +5 -5
  439. package/pack/generated/omp/skills/devrites-browser-proof/reference/browser-performance.md +1 -1
  440. package/pack/generated/omp/skills/devrites-browser-proof/reference/visual-verdict.md +1 -1
  441. package/pack/generated/omp/skills/devrites-debug-recovery/SKILL.md +7 -6
  442. package/pack/generated/omp/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +1 -1
  443. package/pack/generated/omp/skills/devrites-doubt/SKILL.md +6 -6
  444. package/pack/generated/omp/skills/devrites-frontend-craft/SKILL.md +3 -3
  445. package/pack/generated/omp/skills/devrites-frontend-craft/reference/craft.md +1 -1
  446. package/pack/generated/omp/skills/devrites-frontend-craft/reference/design-references.md +4 -4
  447. package/pack/generated/omp/skills/devrites-frontend-craft/reference/fullstack.md +1 -1
  448. package/pack/generated/omp/skills/devrites-frontend-craft/reference/quality-standards.md +8 -8
  449. package/pack/generated/omp/skills/devrites-frontend-craft/reference/reuse-first.md +2 -2
  450. package/pack/generated/omp/skills/devrites-frontend-craft/reference/shape.md +2 -2
  451. package/pack/generated/omp/skills/devrites-interview/SKILL.md +3 -3
  452. package/pack/generated/omp/skills/devrites-lib/reference/intent-map.md +4 -4
  453. package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +8 -7
  454. package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +13 -12
  455. package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +6 -6
  456. package/pack/generated/omp/skills/devrites-lib/reference/standards/browser-proof-checklist.md +2 -2
  457. package/pack/generated/omp/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  458. package/pack/generated/omp/skills/devrites-lib/reference/standards/code-review.md +3 -3
  459. package/pack/generated/omp/skills/devrites-lib/reference/standards/coding-style.md +1 -1
  460. package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +2 -2
  461. package/pack/generated/omp/skills/devrites-lib/reference/standards/core.md +3 -3
  462. package/pack/generated/omp/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  463. package/pack/generated/omp/skills/devrites-lib/reference/standards/debug-recovery.md +1 -1
  464. package/pack/generated/omp/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
  465. package/pack/generated/omp/skills/devrites-lib/reference/standards/developer-experience.md +8 -3
  466. package/pack/generated/omp/skills/devrites-lib/reference/standards/glossary.md +3 -3
  467. package/pack/generated/omp/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  468. package/pack/generated/omp/skills/devrites-lib/reference/standards/performance.md +3 -1
  469. package/pack/generated/omp/skills/devrites-lib/reference/standards/prose-style.md +4 -4
  470. package/pack/generated/omp/skills/devrites-lib/reference/standards/release/ship-checklist.md +1 -1
  471. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/README.md +1 -1
  472. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/ci-workflows.md +1 -1
  473. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/react.md +1 -1
  474. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/stack-profile.md +5 -5
  475. package/pack/generated/omp/skills/devrites-lib/reference/standards/skill-authoring.md +15 -3
  476. package/pack/generated/omp/skills/devrites-lib/reference/standards/spec-grammar.md +3 -3
  477. package/pack/generated/omp/skills/devrites-lib/reference/standards/testing.md +14 -1
  478. package/pack/generated/omp/skills/devrites-lib/reference/standards/tooling.md +1 -1
  479. package/pack/generated/omp/skills/devrites-lib/reference/standards/verification-methods.md +1 -1
  480. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/index.md +2 -2
  481. package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +12 -8
  482. package/pack/generated/omp/skills/devrites-prose-craft/SKILL.md +4 -4
  483. package/pack/generated/omp/skills/devrites-prose-craft/reference/examples.md +1 -1
  484. package/pack/generated/omp/skills/devrites-source-driven/SKILL.md +3 -3
  485. package/pack/generated/omp/skills/devrites-ux-shape/SKILL.md +10 -10
  486. package/pack/generated/omp/skills/devrites-ux-shape/reference/brief-template.md +3 -3
  487. package/pack/generated/omp/skills/devrites-ux-shape/reference/visual-direction-probe.md +1 -1
  488. package/pack/generated/omp/skills/overhaul/references/orchestration.md +6 -2
  489. package/pack/generated/omp/skills/overhaul/references/records.md +8 -3
  490. package/pack/generated/omp/skills/rite/SKILL.md +8 -7
  491. package/pack/generated/omp/skills/rite/reference/menu.md +6 -5
  492. package/pack/generated/omp/skills/rite-adopt/SKILL.md +6 -5
  493. package/pack/generated/omp/skills/rite-adopt/reference/anti-patterns.md +1 -1
  494. package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +11 -10
  495. package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +1 -1
  496. package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +4 -3
  497. package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  498. package/pack/generated/omp/skills/rite-build/SKILL.md +7 -7
  499. package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +4 -2
  500. package/pack/generated/omp/skills/rite-build/reference/anti-patterns.md +1 -1
  501. package/pack/generated/omp/skills/rite-build/reference/checkpoint-protocol.md +2 -2
  502. package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +2 -2
  503. package/pack/generated/omp/skills/rite-build/reference/frontend-trigger.md +1 -1
  504. package/pack/generated/omp/skills/rite-build/reference/output.md +1 -1
  505. package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +4 -4
  506. package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +8 -6
  507. package/pack/generated/omp/skills/rite-build/reference/tdd.md +1 -1
  508. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +27 -8
  509. package/pack/generated/omp/skills/rite-clarify/SKILL.md +4 -4
  510. package/pack/generated/omp/skills/rite-clarify/reference/anti-patterns.md +1 -1
  511. package/pack/generated/omp/skills/rite-converge/SKILL.md +16 -15
  512. package/pack/generated/omp/skills/rite-converge/reference/convergence-assessment.md +4 -4
  513. package/pack/generated/omp/skills/rite-customize/SKILL.md +2 -2
  514. package/pack/generated/omp/skills/rite-define/SKILL.md +25 -24
  515. package/pack/generated/omp/skills/rite-define/reference/anti-patterns.md +2 -2
  516. package/pack/generated/omp/skills/rite-define/reference/gates.md +2 -2
  517. package/pack/generated/omp/skills/rite-doctor/SKILL.md +12 -6
  518. package/pack/generated/omp/skills/rite-dogfood/SKILL.md +5 -5
  519. package/pack/generated/omp/skills/rite-explain/SKILL.md +7 -7
  520. package/pack/generated/omp/skills/rite-explain/reference/intake.md +1 -1
  521. package/pack/generated/omp/skills/rite-fast/SKILL.md +12 -10
  522. package/pack/generated/omp/skills/rite-fast/reference/artifacts.md +1 -1
  523. package/pack/generated/omp/skills/rite-frame/SKILL.md +6 -6
  524. package/pack/generated/omp/skills/rite-frame/reference/failure-modes.md +4 -4
  525. package/pack/generated/omp/skills/rite-handoff/SKILL.md +7 -6
  526. package/pack/generated/omp/skills/rite-learn/SKILL.md +6 -6
  527. package/pack/generated/omp/skills/rite-plan/SKILL.md +8 -8
  528. package/pack/generated/omp/skills/rite-plan/reference/anti-patterns.md +1 -1
  529. package/pack/generated/omp/skills/rite-plan/reference/replan-and-repair.md +3 -1
  530. package/pack/generated/omp/skills/rite-plan/reference/slicing.md +6 -4
  531. package/pack/generated/omp/skills/rite-plan/reference/task-breakdown.md +1 -1
  532. package/pack/generated/omp/skills/rite-polish/SKILL.md +6 -6
  533. package/pack/generated/omp/skills/rite-polish/reference/anti-ai-slop.md +9 -9
  534. package/pack/generated/omp/skills/rite-polish/reference/anti-patterns.md +1 -1
  535. package/pack/generated/omp/skills/rite-polish/reference/backend-polish.md +2 -2
  536. package/pack/generated/omp/skills/rite-polish/reference/browser-polish-evidence.md +1 -1
  537. package/pack/generated/omp/skills/rite-polish/reference/code.md +8 -8
  538. package/pack/generated/omp/skills/rite-polish/reference/design-memory.md +3 -3
  539. package/pack/generated/omp/skills/rite-polish/reference/design-system-discovery.md +1 -1
  540. package/pack/generated/omp/skills/rite-polish/reference/harden-checklist.md +1 -1
  541. package/pack/generated/omp/skills/rite-polish/reference/ledger.md +3 -3
  542. package/pack/generated/omp/skills/rite-polish/reference/ui.md +1 -1
  543. package/pack/generated/omp/skills/rite-pov/SKILL.md +2 -2
  544. package/pack/generated/omp/skills/rite-pr-feedback/SKILL.md +6 -5
  545. package/pack/generated/omp/skills/rite-pressure-test/SKILL.md +9 -7
  546. package/pack/generated/omp/skills/rite-prototype/SKILL.md +1 -1
  547. package/pack/generated/omp/skills/rite-prove/SKILL.md +13 -13
  548. package/pack/generated/omp/skills/rite-prove/reference/acceptance-proof.md +7 -7
  549. package/pack/generated/omp/skills/rite-prove/reference/anti-patterns.md +1 -1
  550. package/pack/generated/omp/skills/rite-prove/reference/browser-proof.md +3 -3
  551. package/pack/generated/omp/skills/rite-prove/reference/failure-triage.md +2 -2
  552. package/pack/generated/omp/skills/rite-quick/SKILL.md +19 -14
  553. package/pack/generated/omp/skills/rite-resolve/SKILL.md +6 -6
  554. package/pack/generated/omp/skills/rite-resolve/reference/answer-protocol.md +4 -5
  555. package/pack/generated/omp/skills/rite-review/SKILL.md +23 -22
  556. package/pack/generated/omp/skills/rite-review/reference/anti-patterns.md +1 -1
  557. package/pack/generated/omp/skills/rite-review/reference/cognitive-load.md +2 -2
  558. package/pack/generated/omp/skills/rite-review/reference/nielsen-heuristics.md +1 -1
  559. package/pack/generated/omp/skills/rite-review/reference/performance-checklist.md +1 -1
  560. package/pack/generated/omp/skills/rite-review/reference/performance-review.md +1 -1
  561. package/pack/generated/omp/skills/rite-review/reference/security-review.md +2 -2
  562. package/pack/generated/omp/skills/rite-seal/SKILL.md +11 -11
  563. package/pack/generated/omp/skills/rite-seal/reference/anti-patterns.md +1 -1
  564. package/pack/generated/omp/skills/rite-seal/reference/final-evidence.md +3 -3
  565. package/pack/generated/omp/skills/rite-seal/reference/go-no-go.md +3 -1
  566. package/pack/generated/omp/skills/rite-seal/reference/output.md +1 -1
  567. package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +4 -4
  568. package/pack/generated/omp/skills/rite-seal/reference/seal-template.md +5 -2
  569. package/pack/generated/omp/skills/rite-ship/SKILL.md +7 -7
  570. package/pack/generated/omp/skills/rite-ship/reference/anti-patterns.md +1 -1
  571. package/pack/generated/omp/skills/rite-ship/reference/close-out.md +5 -4
  572. package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +2 -2
  573. package/pack/generated/omp/skills/rite-ship/reference/rollout.md +3 -3
  574. package/pack/generated/omp/skills/rite-spec/SKILL.md +17 -14
  575. package/pack/generated/omp/skills/rite-spec/reference/anti-patterns.md +1 -1
  576. package/pack/generated/omp/skills/rite-spec/reference/investigation.md +3 -3
  577. package/pack/generated/omp/skills/rite-spec/reference/question-protocol.md +1 -1
  578. package/pack/generated/omp/skills/rite-spec/reference/spec-template.md +2 -2
  579. package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +8 -8
  580. package/pack/generated/omp/skills/rite-status/SKILL.md +2 -2
  581. package/pack/generated/omp/skills/rite-temper/SKILL.md +13 -13
  582. package/pack/generated/omp/skills/rite-temper/reference/anti-patterns.md +2 -2
  583. package/pack/generated/omp/skills/rite-temper/reference/review-dimensions.md +3 -3
  584. package/pack/generated/omp/skills/rite-temper/reference/scope-modes.md +3 -3
  585. package/pack/generated/omp/skills/rite-temper/reference/significance.md +4 -2
  586. package/pack/generated/omp/skills/rite-upgrade/SKILL.md +7 -5
  587. package/pack/generated/omp/skills/rite-vet/SKILL.md +14 -13
  588. package/pack/generated/omp/skills/rite-vet/reference/anti-patterns.md +2 -2
  589. package/pack/generated/omp/skills/rite-vet/reference/artifacts.md +3 -3
  590. package/pack/generated/omp/skills/rite-vet/reference/depth.md +3 -3
  591. package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +5 -5
  592. package/pack/generated/omp/skills/rite-watch-pr/SKILL.md +2 -2
  593. package/pack/generated/omp/skills/rite-zoom-out/SKILL.md +1 -1
  594. package/pack/generated/pi/agents/devrites-devex-reviewer.md +5 -0
  595. package/pack/generated/pi/agents/devrites-evidence-scout.md +4 -0
  596. package/pack/generated/pi/agents/devrites-plan-reviewer.md +4 -1
  597. package/pack/generated/pi/agents/devrites-slice-wright.md +4 -1
  598. package/pack/generated/pi/agents/overhaul-backend-engineer.md +2 -0
  599. package/pack/generated/pi/agents/overhaul-boundary.md +2 -0
  600. package/pack/generated/pi/agents/overhaul-craft.md +2 -0
  601. package/pack/generated/pi/agents/overhaul-frontend-engineer.md +2 -0
  602. package/pack/generated/pi/agents/overhaul-implementer.md +2 -0
  603. package/pack/generated/pi/agents/overhaul-recon.md +2 -0
  604. package/pack/generated/pi/agents/overhaul-specialist.md +2 -0
  605. package/pack/generated/pi/agents/overhaul-verifier.md +2 -0
  606. package/pack/generated/pi/prompts/rite-resolve.md +1 -1
  607. package/pack/generated/pi/skills/devrites-api-interface/SKILL.md +1 -1
  608. package/pack/generated/pi/skills/devrites-audit/SKILL.md +1 -1
  609. package/pack/generated/pi/skills/devrites-browser-proof/SKILL.md +1 -1
  610. package/pack/generated/pi/skills/devrites-debug-recovery/SKILL.md +3 -2
  611. package/pack/generated/pi/skills/devrites-doubt/SKILL.md +1 -1
  612. package/pack/generated/pi/skills/devrites-frontend-craft/SKILL.md +1 -1
  613. package/pack/generated/pi/skills/devrites-interview/SKILL.md +1 -1
  614. package/pack/generated/pi/skills/devrites-lib/reference/intent-map.md +3 -3
  615. package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  616. package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
  617. package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +1 -1
  618. package/pack/generated/pi/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  619. package/pack/generated/pi/skills/devrites-lib/reference/standards/code-review.md +1 -1
  620. package/pack/generated/pi/skills/devrites-lib/reference/standards/core.md +1 -1
  621. package/pack/generated/pi/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  622. package/pack/generated/pi/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  623. package/pack/generated/pi/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  624. package/pack/generated/pi/skills/devrites-lib/reference/standards/performance.md +2 -0
  625. package/pack/generated/pi/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  626. package/pack/generated/pi/skills/devrites-lib/reference/standards/testing.md +13 -0
  627. package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  628. package/pack/generated/pi/skills/devrites-prose-craft/SKILL.md +1 -1
  629. package/pack/generated/pi/skills/devrites-source-driven/SKILL.md +1 -1
  630. package/pack/generated/pi/skills/devrites-ux-shape/SKILL.md +1 -1
  631. package/pack/generated/pi/skills/overhaul/SKILL.md +15 -15
  632. package/pack/generated/pi/skills/overhaul/references/audit-domains.md +2 -2
  633. package/pack/generated/pi/skills/overhaul/references/orchestration.md +11 -7
  634. package/pack/generated/pi/skills/overhaul/references/records.md +8 -3
  635. package/pack/generated/pi/skills/rite/SKILL.md +4 -3
  636. package/pack/generated/pi/skills/rite/reference/menu.md +6 -5
  637. package/pack/generated/pi/skills/rite-adopt/SKILL.md +4 -3
  638. package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +7 -6
  639. package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +2 -1
  640. package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  641. package/pack/generated/pi/skills/rite-build/SKILL.md +2 -2
  642. package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +3 -1
  643. package/pack/generated/pi/skills/rite-build/reference/output.md +1 -1
  644. package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +1 -1
  645. package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +2 -0
  646. package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +20 -1
  647. package/pack/generated/pi/skills/rite-clarify/SKILL.md +1 -1
  648. package/pack/generated/pi/skills/rite-converge/SKILL.md +5 -4
  649. package/pack/generated/pi/skills/rite-customize/SKILL.md +1 -1
  650. package/pack/generated/pi/skills/rite-define/SKILL.md +4 -3
  651. package/pack/generated/pi/skills/rite-doctor/SKILL.md +12 -6
  652. package/pack/generated/pi/skills/rite-dogfood/SKILL.md +2 -2
  653. package/pack/generated/pi/skills/rite-explain/SKILL.md +1 -1
  654. package/pack/generated/pi/skills/rite-fast/SKILL.md +8 -6
  655. package/pack/generated/pi/skills/rite-frame/SKILL.md +1 -1
  656. package/pack/generated/pi/skills/rite-handoff/SKILL.md +4 -3
  657. package/pack/generated/pi/skills/rite-learn/SKILL.md +2 -2
  658. package/pack/generated/pi/skills/rite-plan/SKILL.md +1 -1
  659. package/pack/generated/pi/skills/rite-plan/reference/replan-and-repair.md +2 -0
  660. package/pack/generated/pi/skills/rite-plan/reference/slicing.md +3 -1
  661. package/pack/generated/pi/skills/rite-polish/SKILL.md +2 -2
  662. package/pack/generated/pi/skills/rite-pov/SKILL.md +1 -1
  663. package/pack/generated/pi/skills/rite-pr-feedback/SKILL.md +5 -4
  664. package/pack/generated/pi/skills/rite-pressure-test/SKILL.md +7 -5
  665. package/pack/generated/pi/skills/rite-prototype/SKILL.md +1 -1
  666. package/pack/generated/pi/skills/rite-prove/SKILL.md +1 -1
  667. package/pack/generated/pi/skills/rite-quick/SKILL.md +11 -6
  668. package/pack/generated/pi/skills/rite-resolve/SKILL.md +3 -3
  669. package/pack/generated/pi/skills/rite-resolve/reference/answer-protocol.md +4 -5
  670. package/pack/generated/pi/skills/rite-review/SKILL.md +3 -2
  671. package/pack/generated/pi/skills/rite-seal/SKILL.md +4 -4
  672. package/pack/generated/pi/skills/rite-seal/reference/go-no-go.md +2 -0
  673. package/pack/generated/pi/skills/rite-seal/reference/seal-template.md +5 -2
  674. package/pack/generated/pi/skills/rite-ship/SKILL.md +1 -1
  675. package/pack/generated/pi/skills/rite-ship/reference/close-out.md +3 -2
  676. package/pack/generated/pi/skills/rite-spec/SKILL.md +5 -2
  677. package/pack/generated/pi/skills/rite-status/SKILL.md +1 -1
  678. package/pack/generated/pi/skills/rite-temper/SKILL.md +2 -2
  679. package/pack/generated/pi/skills/rite-temper/reference/significance.md +2 -0
  680. package/pack/generated/pi/skills/rite-upgrade/SKILL.md +4 -2
  681. package/pack/generated/pi/skills/rite-vet/SKILL.md +4 -3
  682. package/pack/generated/pi/skills/rite-vet/reference/artifacts.md +1 -1
  683. package/pack/generated/pi/skills/rite-watch-pr/SKILL.md +1 -1
  684. package/pack/generated/pi/skills/rite-zoom-out/SKILL.md +1 -1
  685. package/package.json +3 -2
  686. package/scripts/build-host-artifacts.sh +13 -0
  687. package/scripts/codex-generate.sh +5 -1
  688. package/scripts/devin-generate.sh +4 -3
  689. package/scripts/install-lib.sh +5 -0
  690. package/scripts/omp-generate.sh +23 -1
  691. package/scripts/pi-generate.sh +2 -2
  692. package/engine/cmd/releasepack/main_test.go +0 -239
  693. package/engine/harnessmatrix_test.go +0 -46
  694. package/engine/help_test.go +0 -241
  695. package/engine/internal/acceptance/acceptance_test.go +0 -946
  696. package/engine/internal/devritespaths/paths_test.go +0 -128
  697. package/engine/internal/fsutil/copy_test.go +0 -154
  698. package/engine/internal/gate/gate_test.go +0 -865
  699. package/engine/internal/gate/readiness_binding_test.go +0 -443
  700. package/engine/internal/gitenv/env_test.go +0 -48
  701. package/engine/internal/hostpack/hostpack_test.go +0 -269
  702. package/engine/internal/install/install_test.go +0 -1741
  703. package/engine/internal/install/workspace_advisory_test.go +0 -54
  704. package/engine/internal/lib/candidate_test.go +0 -506
  705. package/engine/internal/lib/claims_test.go +0 -267
  706. package/engine/internal/lib/closeout_test.go +0 -266
  707. package/engine/internal/lib/context_next_test.go +0 -860
  708. package/engine/internal/lib/cursor_compat_test.go +0 -65
  709. package/engine/internal/lib/detect_test.go +0 -118
  710. package/engine/internal/lib/drift_test.go +0 -135
  711. package/engine/internal/lib/dup_test.go +0 -666
  712. package/engine/internal/lib/environment_report_test.go +0 -54
  713. package/engine/internal/lib/evidencefresh_test.go +0 -120
  714. package/engine/internal/lib/handoff_test.go +0 -83
  715. package/engine/internal/lib/manifest_union_test.go +0 -251
  716. package/engine/internal/lib/metrics_test.go +0 -28
  717. package/engine/internal/lib/migrate_test.go +0 -213
  718. package/engine/internal/lib/observe_budgets_test.go +0 -396
  719. package/engine/internal/lib/open_visual_test.go +0 -291
  720. package/engine/internal/lib/regression_test.go +0 -282
  721. package/engine/internal/lib/resolve_remediation_test.go +0 -192
  722. package/engine/internal/lib/secretscan_test.go +0 -556
  723. package/engine/internal/lib/slicecheck_test.go +0 -170
  724. package/engine/internal/lib/taskgraph_test.go +0 -353
  725. package/engine/internal/lib/triggers_test.go +0 -23
  726. package/engine/internal/lib/util_test.go +0 -148
  727. package/engine/internal/lib/visual_outline_test.go +0 -189
  728. package/engine/internal/lib/windows_test.go +0 -420
  729. package/engine/internal/lib/workspace_read_test.go +0 -102
  730. package/engine/internal/markdowntext/markdowntext_fuzz_test.go +0 -36
  731. package/engine/internal/markdowntext/markdowntext_test.go +0 -58
  732. package/engine/internal/markdowntext/testdata/structural.json +0 -277
  733. package/engine/internal/notes/notes_test.go +0 -545
  734. package/engine/internal/overhaul/admit/admit_test.go +0 -204
  735. package/engine/internal/overhaul/admit/packet_test.go +0 -223
  736. package/engine/internal/overhaul/bench/run_test.go +0 -316
  737. package/engine/internal/overhaul/ovio/ovio_test.go +0 -75
  738. package/engine/internal/overhaul/packet/packet_test.go +0 -263
  739. package/engine/internal/overhaul/records/init_test.go +0 -96
  740. package/engine/internal/overhaul/records/records_test.go +0 -696
  741. package/engine/internal/overhaul/records/run_test.go +0 -77
  742. package/engine/internal/overhaul/render/run_test.go +0 -928
  743. package/engine/internal/overhaul/score/run_test.go +0 -636
  744. package/engine/internal/overhaul/snapshot/run_test.go +0 -718
  745. package/engine/internal/parallel/cli_test.go +0 -91
  746. package/engine/internal/parallel/ops_test.go +0 -939
  747. package/engine/internal/parallel/parallel_test.go +0 -645
  748. package/engine/internal/parallel/pathdisjoint_fuzz_test.go +0 -43
  749. package/engine/internal/parallel/pathdisjoint_test.go +0 -193
  750. package/engine/internal/parallel/select_test.go +0 -95
  751. package/engine/internal/parallel/testdata/fuzz/FuzzPathDisjoint/a449b81b4711b7b4 +0 -3
  752. package/engine/internal/reason/reason_test.go +0 -37
  753. package/engine/internal/release/release_test.go +0 -181
  754. package/engine/internal/rootfacts/facts_test.go +0 -364
  755. package/engine/internal/safepath/safepath_fuzz_test.go +0 -21
  756. package/engine/internal/safepath/safepath_test.go +0 -69
  757. package/engine/internal/safepath/safepath_windows_test.go +0 -26
  758. package/engine/internal/state/acceptance_test.go +0 -57
  759. package/engine/internal/state/budgets_test.go +0 -135
  760. package/engine/internal/state/cmd/workflowmanifest/main_test.go +0 -96
  761. package/engine/internal/state/concurrency_test.go +0 -184
  762. package/engine/internal/state/cursor_fuzz_test.go +0 -80
  763. package/engine/internal/state/cursor_test.go +0 -276
  764. package/engine/internal/state/observation_test.go +0 -961
  765. package/engine/internal/state/observation_unix_test.go +0 -68
  766. package/engine/internal/state/state_test.go +0 -986
  767. package/engine/internal/state/taskgraph_fuzz_test.go +0 -38
  768. package/engine/internal/state/taskgraph_test.go +0 -43
  769. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/114b28f68c1fa4db +0 -4
  770. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/378a0f2218e812ea +0 -4
  771. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/39eaa26fcb481e3c +0 -4
  772. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/776ca1dc0143acf0 +0 -4
  773. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/9295930c1ebb81df +0 -4
  774. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/a60de309dc33be0d +0 -4
  775. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f04dc7b06ef7c99f +0 -4
  776. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f3000ac510878bd6 +0 -4
  777. package/engine/internal/state/testdata/fuzz/FuzzWorkspaceSchemaRow/a75aabb9f2a847d5 +0 -2
  778. package/engine/internal/state/workspaceschema_fuzz_test.go +0 -27
  779. package/engine/internal/state/workspaceschema_test.go +0 -101
  780. package/engine/internal/state/write_test.go +0 -136
  781. package/engine/internal/version/version_test.go +0 -29
  782. package/engine/internal/workflow/commands_test.go +0 -18
  783. package/engine/note_routing_test.go +0 -95
  784. package/engine/observation_contract_test.go +0 -175
  785. 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
- }