devrites 6.0.4 → 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 (764) hide show
  1. package/CHANGELOG.md +6 -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 +6 -3
  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 +24 -7
  31. package/engine/internal/lib/diffscope.go +79 -3
  32. package/engine/internal/lib/dispatch.go +34 -7
  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 +29 -9
  36. package/engine/internal/lib/migrate.go +30 -12
  37. package/engine/internal/lib/next.go +22 -2
  38. package/engine/internal/lib/open_visual.go +3 -1
  39. package/engine/internal/lib/recall.go +355 -0
  40. package/engine/internal/lib/regression.go +20 -0
  41. package/engine/internal/lib/resolve.go +96 -53
  42. package/engine/internal/lib/secretscan.go +24 -1
  43. package/engine/internal/lib/taskgraph.go +31 -1
  44. package/engine/internal/lib/util.go +18 -7
  45. package/engine/internal/lib/windows.go +68 -15
  46. package/engine/internal/markdowntext/markdowntext.go +45 -6
  47. package/engine/internal/notes/cli.go +5 -3
  48. package/engine/internal/notes/notes.go +8 -3
  49. package/engine/internal/overhaul/admit/run.go +16 -12
  50. package/engine/internal/overhaul/overhaul.go +1 -0
  51. package/engine/internal/overhaul/records/check.go +52 -9
  52. package/engine/internal/overhaul/render/run.go +3 -2
  53. package/engine/internal/overhaul/snapshot/run.go +2 -2
  54. package/engine/internal/parallel/git.go +5 -6
  55. package/engine/internal/parallel/ops.go +3 -0
  56. package/engine/internal/parallel/pathdisjoint.go +9 -4
  57. package/engine/internal/release/release.go +11 -9
  58. package/engine/internal/safepath/safepath.go +17 -1
  59. package/engine/internal/state/budgets.go +8 -4
  60. package/engine/internal/state/feature.go +3 -1
  61. package/engine/internal/state/observation.go +12 -7
  62. package/engine/internal/state/taskgraph.go +67 -12
  63. package/engine/internal/state/write.go +7 -1
  64. package/engine/main.go +5 -1
  65. package/pack/.claude/agents/_shared/composition-overhaul.md +2 -0
  66. package/pack/.claude/agents/devrites-devex-reviewer.md +5 -0
  67. package/pack/.claude/agents/devrites-evidence-scout.md +4 -0
  68. package/pack/.claude/agents/devrites-plan-reviewer.md +4 -1
  69. package/pack/.claude/agents/overhaul-implementer.md +1 -0
  70. package/pack/.claude/settings.json +4 -4
  71. package/pack/.claude/skills/devrites-api-interface/SKILL.md +1 -1
  72. package/pack/.claude/skills/devrites-audit/SKILL.md +1 -1
  73. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +1 -1
  74. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +3 -2
  75. package/pack/.claude/skills/devrites-doubt/SKILL.md +1 -1
  76. package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +1 -1
  77. package/pack/.claude/skills/devrites-interview/SKILL.md +1 -1
  78. package/pack/.claude/skills/devrites-lib/reference/intent-map.md +3 -3
  79. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -3
  80. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
  81. package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  82. package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
  83. package/pack/.claude/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  84. package/pack/.claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  85. package/pack/.claude/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  86. package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +2 -0
  87. package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  88. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +13 -0
  89. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -6
  90. package/pack/.claude/skills/devrites-prose-craft/SKILL.md +1 -1
  91. package/pack/.claude/skills/devrites-source-driven/SKILL.md +1 -1
  92. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +1 -1
  93. package/pack/.claude/skills/overhaul/references/orchestration.md +6 -2
  94. package/pack/.claude/skills/overhaul/references/records.md +8 -3
  95. package/pack/.claude/skills/rite/SKILL.md +4 -3
  96. package/pack/.claude/skills/rite/reference/menu.md +6 -5
  97. package/pack/.claude/skills/rite-adopt/SKILL.md +4 -3
  98. package/pack/.claude/skills/rite-autocomplete/SKILL.md +6 -5
  99. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +2 -1
  100. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  101. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +19 -0
  102. package/pack/.claude/skills/rite-converge/SKILL.md +4 -3
  103. package/pack/.claude/skills/rite-customize/SKILL.md +1 -1
  104. package/pack/.claude/skills/rite-define/SKILL.md +3 -2
  105. package/pack/.claude/skills/rite-doctor/SKILL.md +12 -6
  106. package/pack/.claude/skills/rite-dogfood/SKILL.md +2 -2
  107. package/pack/.claude/skills/rite-explain/SKILL.md +1 -1
  108. package/pack/.claude/skills/rite-fast/SKILL.md +3 -1
  109. package/pack/.claude/skills/rite-handoff/SKILL.md +4 -3
  110. package/pack/.claude/skills/rite-learn/SKILL.md +2 -2
  111. package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +2 -0
  112. package/pack/.claude/skills/rite-plan/reference/slicing.md +3 -1
  113. package/pack/.claude/skills/rite-pov/SKILL.md +1 -1
  114. package/pack/.claude/skills/rite-pr-feedback/SKILL.md +5 -4
  115. package/pack/.claude/skills/rite-pressure-test/SKILL.md +7 -5
  116. package/pack/.claude/skills/rite-prototype/SKILL.md +1 -1
  117. package/pack/.claude/skills/rite-quick/SKILL.md +10 -5
  118. package/pack/.claude/skills/rite-resolve/SKILL.md +3 -3
  119. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +4 -5
  120. package/pack/.claude/skills/rite-review/SKILL.md +2 -1
  121. package/pack/.claude/skills/rite-seal/SKILL.md +3 -3
  122. package/pack/.claude/skills/rite-seal/reference/go-no-go.md +2 -0
  123. package/pack/.claude/skills/rite-seal/reference/seal-template.md +5 -2
  124. package/pack/.claude/skills/rite-ship/reference/close-out.md +3 -2
  125. package/pack/.claude/skills/rite-spec/SKILL.md +4 -1
  126. package/pack/.claude/skills/rite-status/SKILL.md +1 -1
  127. package/pack/.claude/skills/rite-temper/reference/significance.md +2 -0
  128. package/pack/.claude/skills/rite-upgrade/SKILL.md +4 -2
  129. package/pack/.claude/skills/rite-vet/SKILL.md +3 -2
  130. package/pack/.claude/skills/rite-vet/reference/artifacts.md +1 -1
  131. package/pack/.claude/skills/rite-watch-pr/SKILL.md +1 -1
  132. package/pack/.claude/skills/rite-zoom-out/SKILL.md +1 -1
  133. package/pack/generated/claude/agents/devrites-devex-reviewer.md +5 -0
  134. package/pack/generated/claude/agents/devrites-evidence-scout.md +4 -0
  135. package/pack/generated/claude/agents/devrites-plan-reviewer.md +4 -1
  136. package/pack/generated/claude/agents/overhaul-backend-engineer.md +2 -0
  137. package/pack/generated/claude/agents/overhaul-boundary.md +2 -0
  138. package/pack/generated/claude/agents/overhaul-craft.md +2 -0
  139. package/pack/generated/claude/agents/overhaul-frontend-engineer.md +2 -0
  140. package/pack/generated/claude/agents/overhaul-implementer.md +3 -0
  141. package/pack/generated/claude/agents/overhaul-recon.md +2 -0
  142. package/pack/generated/claude/agents/overhaul-specialist.md +2 -0
  143. package/pack/generated/claude/agents/overhaul-verifier.md +2 -0
  144. package/pack/generated/claude/settings.json +4 -4
  145. package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +1 -1
  146. package/pack/generated/claude/skills/devrites-audit/SKILL.md +1 -1
  147. package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +1 -1
  148. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +3 -2
  149. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +1 -1
  150. package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +1 -1
  151. package/pack/generated/claude/skills/devrites-interview/SKILL.md +1 -1
  152. package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +3 -3
  153. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -3
  154. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
  155. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  156. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
  157. package/pack/generated/claude/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  158. package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  159. package/pack/generated/claude/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  160. package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +2 -0
  161. package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  162. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +13 -0
  163. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -6
  164. package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +1 -1
  165. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +1 -1
  166. package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +1 -1
  167. package/pack/generated/claude/skills/overhaul/references/orchestration.md +6 -2
  168. package/pack/generated/claude/skills/overhaul/references/records.md +8 -3
  169. package/pack/generated/claude/skills/rite/SKILL.md +4 -3
  170. package/pack/generated/claude/skills/rite/reference/menu.md +6 -5
  171. package/pack/generated/claude/skills/rite-adopt/SKILL.md +4 -3
  172. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +6 -5
  173. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +2 -1
  174. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  175. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +19 -0
  176. package/pack/generated/claude/skills/rite-converge/SKILL.md +4 -3
  177. package/pack/generated/claude/skills/rite-customize/SKILL.md +1 -1
  178. package/pack/generated/claude/skills/rite-define/SKILL.md +3 -2
  179. package/pack/generated/claude/skills/rite-doctor/SKILL.md +12 -6
  180. package/pack/generated/claude/skills/rite-dogfood/SKILL.md +2 -2
  181. package/pack/generated/claude/skills/rite-explain/SKILL.md +1 -1
  182. package/pack/generated/claude/skills/rite-fast/SKILL.md +3 -1
  183. package/pack/generated/claude/skills/rite-handoff/SKILL.md +4 -3
  184. package/pack/generated/claude/skills/rite-learn/SKILL.md +2 -2
  185. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +2 -0
  186. package/pack/generated/claude/skills/rite-plan/reference/slicing.md +3 -1
  187. package/pack/generated/claude/skills/rite-pov/SKILL.md +1 -1
  188. package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +5 -4
  189. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +7 -5
  190. package/pack/generated/claude/skills/rite-prototype/SKILL.md +1 -1
  191. package/pack/generated/claude/skills/rite-quick/SKILL.md +10 -5
  192. package/pack/generated/claude/skills/rite-resolve/SKILL.md +3 -3
  193. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +4 -5
  194. package/pack/generated/claude/skills/rite-review/SKILL.md +2 -1
  195. package/pack/generated/claude/skills/rite-seal/SKILL.md +3 -3
  196. package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +2 -0
  197. package/pack/generated/claude/skills/rite-seal/reference/seal-template.md +5 -2
  198. package/pack/generated/claude/skills/rite-ship/reference/close-out.md +3 -2
  199. package/pack/generated/claude/skills/rite-spec/SKILL.md +4 -1
  200. package/pack/generated/claude/skills/rite-status/SKILL.md +1 -1
  201. package/pack/generated/claude/skills/rite-temper/reference/significance.md +2 -0
  202. package/pack/generated/claude/skills/rite-upgrade/SKILL.md +4 -2
  203. package/pack/generated/claude/skills/rite-vet/SKILL.md +3 -2
  204. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +1 -1
  205. package/pack/generated/claude/skills/rite-watch-pr/SKILL.md +1 -1
  206. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +1 -1
  207. package/pack/generated/codex/agents/devrites-code-reviewer.toml +7 -7
  208. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +6 -1
  209. package/pack/generated/codex/agents/devrites-evidence-scout.toml +4 -0
  210. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +1 -1
  211. package/pack/generated/codex/agents/devrites-plan-drafter.toml +3 -3
  212. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +5 -2
  213. package/pack/generated/codex/agents/devrites-proof-runner.toml +2 -2
  214. package/pack/generated/codex/agents/devrites-security-auditor.toml +1 -1
  215. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +1 -1
  216. package/pack/generated/codex/agents/devrites-slice-wright.toml +5 -5
  217. package/pack/generated/codex/agents/devrites-test-analyst.toml +5 -5
  218. package/pack/generated/codex/agents/devrites-upgrade-planner.toml +1 -1
  219. package/pack/generated/codex/agents/fast-builder.toml +3 -3
  220. package/pack/generated/codex/agents/fast-critic.toml +3 -3
  221. package/pack/generated/codex/agents/overhaul-backend-engineer.toml +2 -0
  222. package/pack/generated/codex/agents/overhaul-boundary.toml +2 -0
  223. package/pack/generated/codex/agents/overhaul-craft.toml +2 -0
  224. package/pack/generated/codex/agents/overhaul-frontend-engineer.toml +2 -0
  225. package/pack/generated/codex/agents/overhaul-implementer.toml +2 -0
  226. package/pack/generated/codex/agents/overhaul-recon.toml +2 -0
  227. package/pack/generated/codex/agents/overhaul-specialist.toml +2 -0
  228. package/pack/generated/codex/agents/overhaul-verifier.toml +2 -0
  229. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +1 -1
  230. package/pack/generated/codex/skills/devrites-audit/SKILL.md +1 -1
  231. package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +1 -1
  232. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +3 -2
  233. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +1 -1
  234. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +1 -1
  235. package/pack/generated/codex/skills/devrites-interview/SKILL.md +1 -1
  236. package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +3 -3
  237. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  238. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
  239. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +1 -1
  240. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  241. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +1 -1
  242. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +1 -1
  243. package/pack/generated/codex/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  244. package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  245. package/pack/generated/codex/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  246. package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +2 -0
  247. package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  248. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +13 -0
  249. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  250. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +1 -1
  251. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +1 -1
  252. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +1 -1
  253. package/pack/generated/codex/skills/overhaul/SKILL.md +15 -15
  254. package/pack/generated/codex/skills/overhaul/references/audit-domains.md +2 -2
  255. package/pack/generated/codex/skills/overhaul/references/orchestration.md +11 -7
  256. package/pack/generated/codex/skills/overhaul/references/records.md +8 -3
  257. package/pack/generated/codex/skills/rite/SKILL.md +4 -3
  258. package/pack/generated/codex/skills/rite/reference/menu.md +6 -5
  259. package/pack/generated/codex/skills/rite-adopt/SKILL.md +4 -3
  260. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +7 -6
  261. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +2 -1
  262. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  263. package/pack/generated/codex/skills/rite-build/SKILL.md +2 -2
  264. package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +1 -1
  265. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +20 -1
  266. package/pack/generated/codex/skills/rite-clarify/SKILL.md +1 -1
  267. package/pack/generated/codex/skills/rite-converge/SKILL.md +5 -4
  268. package/pack/generated/codex/skills/rite-customize/SKILL.md +1 -1
  269. package/pack/generated/codex/skills/rite-define/SKILL.md +4 -3
  270. package/pack/generated/codex/skills/rite-doctor/SKILL.md +12 -6
  271. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +2 -2
  272. package/pack/generated/codex/skills/rite-explain/SKILL.md +1 -1
  273. package/pack/generated/codex/skills/rite-fast/SKILL.md +8 -6
  274. package/pack/generated/codex/skills/rite-frame/SKILL.md +1 -1
  275. package/pack/generated/codex/skills/rite-handoff/SKILL.md +4 -3
  276. package/pack/generated/codex/skills/rite-learn/SKILL.md +2 -2
  277. package/pack/generated/codex/skills/rite-plan/SKILL.md +1 -1
  278. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +2 -0
  279. package/pack/generated/codex/skills/rite-plan/reference/slicing.md +3 -1
  280. package/pack/generated/codex/skills/rite-polish/SKILL.md +2 -2
  281. package/pack/generated/codex/skills/rite-pov/SKILL.md +1 -1
  282. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +5 -4
  283. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +7 -5
  284. package/pack/generated/codex/skills/rite-prototype/SKILL.md +1 -1
  285. package/pack/generated/codex/skills/rite-prove/SKILL.md +1 -1
  286. package/pack/generated/codex/skills/rite-quick/SKILL.md +11 -6
  287. package/pack/generated/codex/skills/rite-resolve/SKILL.md +3 -3
  288. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +4 -5
  289. package/pack/generated/codex/skills/rite-review/SKILL.md +3 -2
  290. package/pack/generated/codex/skills/rite-seal/SKILL.md +4 -4
  291. package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +2 -0
  292. package/pack/generated/codex/skills/rite-seal/reference/seal-template.md +5 -2
  293. package/pack/generated/codex/skills/rite-ship/SKILL.md +1 -1
  294. package/pack/generated/codex/skills/rite-ship/reference/close-out.md +3 -2
  295. package/pack/generated/codex/skills/rite-spec/SKILL.md +5 -2
  296. package/pack/generated/codex/skills/rite-status/SKILL.md +1 -1
  297. package/pack/generated/codex/skills/rite-temper/SKILL.md +2 -2
  298. package/pack/generated/codex/skills/rite-temper/reference/significance.md +2 -0
  299. package/pack/generated/codex/skills/rite-upgrade/SKILL.md +4 -2
  300. package/pack/generated/codex/skills/rite-vet/SKILL.md +4 -3
  301. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +1 -1
  302. package/pack/generated/codex/skills/rite-watch-pr/SKILL.md +1 -1
  303. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +1 -1
  304. package/pack/generated/devin/AGENTS.md +1 -1
  305. package/pack/generated/devin/agents/devrites-devex-reviewer.md +5 -0
  306. package/pack/generated/devin/agents/devrites-evidence-scout.md +4 -0
  307. package/pack/generated/devin/agents/devrites-plan-reviewer.md +4 -1
  308. package/pack/generated/devin/agents/overhaul-backend-engineer.md +2 -0
  309. package/pack/generated/devin/agents/overhaul-boundary.md +2 -0
  310. package/pack/generated/devin/agents/overhaul-craft.md +2 -0
  311. package/pack/generated/devin/agents/overhaul-frontend-engineer.md +2 -0
  312. package/pack/generated/devin/agents/overhaul-implementer.md +2 -0
  313. package/pack/generated/devin/agents/overhaul-recon.md +2 -0
  314. package/pack/generated/devin/agents/overhaul-specialist.md +2 -0
  315. package/pack/generated/devin/agents/overhaul-verifier.md +2 -0
  316. package/pack/generated/devin/skills/devrites-api-interface/SKILL.md +1 -1
  317. package/pack/generated/devin/skills/devrites-audit/SKILL.md +1 -1
  318. package/pack/generated/devin/skills/devrites-browser-proof/SKILL.md +1 -1
  319. package/pack/generated/devin/skills/devrites-debug-recovery/SKILL.md +3 -2
  320. package/pack/generated/devin/skills/devrites-doubt/SKILL.md +1 -1
  321. package/pack/generated/devin/skills/devrites-frontend-craft/SKILL.md +1 -1
  322. package/pack/generated/devin/skills/devrites-interview/SKILL.md +2 -2
  323. package/pack/generated/devin/skills/devrites-lib/reference/intent-map.md +3 -3
  324. package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  325. package/pack/generated/devin/skills/devrites-lib/reference/standards/afk-hitl.md +8 -7
  326. package/pack/generated/devin/skills/devrites-lib/reference/standards/agents.md +1 -1
  327. package/pack/generated/devin/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  328. package/pack/generated/devin/skills/devrites-lib/reference/standards/code-review.md +1 -1
  329. package/pack/generated/devin/skills/devrites-lib/reference/standards/core.md +1 -1
  330. package/pack/generated/devin/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  331. package/pack/generated/devin/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  332. package/pack/generated/devin/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  333. package/pack/generated/devin/skills/devrites-lib/reference/standards/performance.md +2 -0
  334. package/pack/generated/devin/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  335. package/pack/generated/devin/skills/devrites-lib/reference/standards/testing.md +13 -0
  336. package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  337. package/pack/generated/devin/skills/devrites-prose-craft/SKILL.md +1 -1
  338. package/pack/generated/devin/skills/devrites-source-driven/SKILL.md +1 -1
  339. package/pack/generated/devin/skills/devrites-ux-shape/SKILL.md +1 -1
  340. package/pack/generated/devin/skills/overhaul/SKILL.md +15 -15
  341. package/pack/generated/devin/skills/overhaul/references/audit-domains.md +2 -2
  342. package/pack/generated/devin/skills/overhaul/references/orchestration.md +11 -7
  343. package/pack/generated/devin/skills/overhaul/references/records.md +8 -3
  344. package/pack/generated/devin/skills/rite/SKILL.md +4 -3
  345. package/pack/generated/devin/skills/rite/reference/menu.md +6 -5
  346. package/pack/generated/devin/skills/rite-adopt/SKILL.md +4 -3
  347. package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +8 -7
  348. package/pack/generated/devin/skills/rite-autocomplete/reference/decision-policy.md +1 -1
  349. package/pack/generated/devin/skills/rite-autocomplete/reference/loop.md +2 -1
  350. package/pack/generated/devin/skills/rite-autocomplete/reference/stop-conditions.md +3 -2
  351. package/pack/generated/devin/skills/rite-build/SKILL.md +2 -2
  352. package/pack/generated/devin/skills/rite-build/reference/checkpoint-protocol.md +2 -2
  353. package/pack/generated/devin/skills/rite-build/reference/parallel-batch.md +1 -1
  354. package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +20 -1
  355. package/pack/generated/devin/skills/rite-clarify/SKILL.md +1 -1
  356. package/pack/generated/devin/skills/rite-converge/SKILL.md +5 -4
  357. package/pack/generated/devin/skills/rite-customize/SKILL.md +1 -1
  358. package/pack/generated/devin/skills/rite-define/SKILL.md +4 -3
  359. package/pack/generated/devin/skills/rite-doctor/SKILL.md +12 -6
  360. package/pack/generated/devin/skills/rite-dogfood/SKILL.md +2 -2
  361. package/pack/generated/devin/skills/rite-explain/SKILL.md +3 -3
  362. package/pack/generated/devin/skills/rite-explain/reference/intake.md +1 -1
  363. package/pack/generated/devin/skills/rite-fast/SKILL.md +8 -6
  364. package/pack/generated/devin/skills/rite-frame/SKILL.md +1 -1
  365. package/pack/generated/devin/skills/rite-handoff/SKILL.md +4 -3
  366. package/pack/generated/devin/skills/rite-learn/SKILL.md +2 -2
  367. package/pack/generated/devin/skills/rite-plan/SKILL.md +1 -1
  368. package/pack/generated/devin/skills/rite-plan/reference/replan-and-repair.md +2 -0
  369. package/pack/generated/devin/skills/rite-plan/reference/slicing.md +3 -1
  370. package/pack/generated/devin/skills/rite-polish/SKILL.md +2 -2
  371. package/pack/generated/devin/skills/rite-pov/SKILL.md +1 -1
  372. package/pack/generated/devin/skills/rite-pr-feedback/SKILL.md +5 -4
  373. package/pack/generated/devin/skills/rite-pressure-test/SKILL.md +7 -5
  374. package/pack/generated/devin/skills/rite-prototype/SKILL.md +1 -1
  375. package/pack/generated/devin/skills/rite-prove/SKILL.md +1 -1
  376. package/pack/generated/devin/skills/rite-quick/SKILL.md +11 -6
  377. package/pack/generated/devin/skills/rite-resolve/SKILL.md +4 -4
  378. package/pack/generated/devin/skills/rite-resolve/reference/answer-protocol.md +4 -5
  379. package/pack/generated/devin/skills/rite-review/SKILL.md +3 -2
  380. package/pack/generated/devin/skills/rite-seal/SKILL.md +4 -4
  381. package/pack/generated/devin/skills/rite-seal/reference/go-no-go.md +2 -0
  382. package/pack/generated/devin/skills/rite-seal/reference/seal-template.md +5 -2
  383. package/pack/generated/devin/skills/rite-ship/SKILL.md +1 -1
  384. package/pack/generated/devin/skills/rite-ship/reference/close-out.md +3 -2
  385. package/pack/generated/devin/skills/rite-spec/SKILL.md +5 -2
  386. package/pack/generated/devin/skills/rite-spec/reference/investigation.md +1 -1
  387. package/pack/generated/devin/skills/rite-status/SKILL.md +1 -1
  388. package/pack/generated/devin/skills/rite-temper/SKILL.md +3 -3
  389. package/pack/generated/devin/skills/rite-temper/reference/scope-modes.md +1 -1
  390. package/pack/generated/devin/skills/rite-temper/reference/significance.md +3 -1
  391. package/pack/generated/devin/skills/rite-upgrade/SKILL.md +4 -2
  392. package/pack/generated/devin/skills/rite-vet/SKILL.md +4 -3
  393. package/pack/generated/devin/skills/rite-vet/reference/artifacts.md +1 -1
  394. package/pack/generated/devin/skills/rite-vet/reference/review-axes.md +2 -2
  395. package/pack/generated/devin/skills/rite-watch-pr/SKILL.md +1 -1
  396. package/pack/generated/devin/skills/rite-zoom-out/SKILL.md +1 -1
  397. package/pack/generated/omp/agents/devrites-code-reviewer.md +7 -7
  398. package/pack/generated/omp/agents/devrites-devex-reviewer.md +6 -1
  399. package/pack/generated/omp/agents/devrites-evidence-scout.md +4 -0
  400. package/pack/generated/omp/agents/devrites-frontend-reviewer.md +1 -1
  401. package/pack/generated/omp/agents/devrites-plan-drafter.md +3 -3
  402. package/pack/generated/omp/agents/devrites-plan-reviewer.md +5 -2
  403. package/pack/generated/omp/agents/devrites-proof-runner.md +2 -2
  404. package/pack/generated/omp/agents/devrites-security-auditor.md +1 -1
  405. package/pack/generated/omp/agents/devrites-simplifier-reviewer.md +1 -1
  406. package/pack/generated/omp/agents/devrites-slice-wright.md +5 -5
  407. package/pack/generated/omp/agents/devrites-test-analyst.md +5 -5
  408. package/pack/generated/omp/agents/devrites-upgrade-planner.md +1 -1
  409. package/pack/generated/omp/agents/fast-builder.md +3 -3
  410. package/pack/generated/omp/agents/fast-critic.md +3 -3
  411. package/pack/generated/omp/agents/overhaul-backend-engineer.md +2 -0
  412. package/pack/generated/omp/agents/overhaul-boundary.md +2 -0
  413. package/pack/generated/omp/agents/overhaul-craft.md +2 -0
  414. package/pack/generated/omp/agents/overhaul-frontend-engineer.md +2 -0
  415. package/pack/generated/omp/agents/overhaul-implementer.md +2 -0
  416. package/pack/generated/omp/agents/overhaul-recon.md +2 -0
  417. package/pack/generated/omp/agents/overhaul-specialist.md +2 -0
  418. package/pack/generated/omp/agents/overhaul-verifier.md +2 -0
  419. package/pack/generated/omp/commands/rite-resolve.md +1 -1
  420. package/pack/generated/omp/skills/devrites-api-interface/SKILL.md +4 -4
  421. package/pack/generated/omp/skills/devrites-audit/SKILL.md +5 -5
  422. package/pack/generated/omp/skills/devrites-browser-proof/SKILL.md +5 -5
  423. package/pack/generated/omp/skills/devrites-browser-proof/reference/browser-performance.md +1 -1
  424. package/pack/generated/omp/skills/devrites-browser-proof/reference/visual-verdict.md +1 -1
  425. package/pack/generated/omp/skills/devrites-debug-recovery/SKILL.md +7 -6
  426. package/pack/generated/omp/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +1 -1
  427. package/pack/generated/omp/skills/devrites-doubt/SKILL.md +6 -6
  428. package/pack/generated/omp/skills/devrites-frontend-craft/SKILL.md +3 -3
  429. package/pack/generated/omp/skills/devrites-frontend-craft/reference/craft.md +1 -1
  430. package/pack/generated/omp/skills/devrites-frontend-craft/reference/design-references.md +4 -4
  431. package/pack/generated/omp/skills/devrites-frontend-craft/reference/fullstack.md +1 -1
  432. package/pack/generated/omp/skills/devrites-frontend-craft/reference/quality-standards.md +8 -8
  433. package/pack/generated/omp/skills/devrites-frontend-craft/reference/reuse-first.md +2 -2
  434. package/pack/generated/omp/skills/devrites-frontend-craft/reference/shape.md +2 -2
  435. package/pack/generated/omp/skills/devrites-interview/SKILL.md +3 -3
  436. package/pack/generated/omp/skills/devrites-lib/reference/intent-map.md +4 -4
  437. package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +8 -7
  438. package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +13 -12
  439. package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +6 -6
  440. package/pack/generated/omp/skills/devrites-lib/reference/standards/browser-proof-checklist.md +2 -2
  441. package/pack/generated/omp/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  442. package/pack/generated/omp/skills/devrites-lib/reference/standards/code-review.md +3 -3
  443. package/pack/generated/omp/skills/devrites-lib/reference/standards/coding-style.md +1 -1
  444. package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +2 -2
  445. package/pack/generated/omp/skills/devrites-lib/reference/standards/core.md +3 -3
  446. package/pack/generated/omp/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  447. package/pack/generated/omp/skills/devrites-lib/reference/standards/debug-recovery.md +1 -1
  448. package/pack/generated/omp/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
  449. package/pack/generated/omp/skills/devrites-lib/reference/standards/developer-experience.md +8 -3
  450. package/pack/generated/omp/skills/devrites-lib/reference/standards/glossary.md +3 -3
  451. package/pack/generated/omp/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  452. package/pack/generated/omp/skills/devrites-lib/reference/standards/performance.md +3 -1
  453. package/pack/generated/omp/skills/devrites-lib/reference/standards/prose-style.md +4 -4
  454. package/pack/generated/omp/skills/devrites-lib/reference/standards/release/ship-checklist.md +1 -1
  455. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/README.md +1 -1
  456. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/ci-workflows.md +1 -1
  457. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/react.md +1 -1
  458. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/stack-profile.md +5 -5
  459. package/pack/generated/omp/skills/devrites-lib/reference/standards/skill-authoring.md +15 -3
  460. package/pack/generated/omp/skills/devrites-lib/reference/standards/spec-grammar.md +3 -3
  461. package/pack/generated/omp/skills/devrites-lib/reference/standards/testing.md +14 -1
  462. package/pack/generated/omp/skills/devrites-lib/reference/standards/tooling.md +1 -1
  463. package/pack/generated/omp/skills/devrites-lib/reference/standards/verification-methods.md +1 -1
  464. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/index.md +2 -2
  465. package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +12 -8
  466. package/pack/generated/omp/skills/devrites-prose-craft/SKILL.md +4 -4
  467. package/pack/generated/omp/skills/devrites-prose-craft/reference/examples.md +1 -1
  468. package/pack/generated/omp/skills/devrites-source-driven/SKILL.md +3 -3
  469. package/pack/generated/omp/skills/devrites-ux-shape/SKILL.md +10 -10
  470. package/pack/generated/omp/skills/devrites-ux-shape/reference/brief-template.md +3 -3
  471. package/pack/generated/omp/skills/devrites-ux-shape/reference/visual-direction-probe.md +1 -1
  472. package/pack/generated/omp/skills/overhaul/references/orchestration.md +6 -2
  473. package/pack/generated/omp/skills/overhaul/references/records.md +8 -3
  474. package/pack/generated/omp/skills/rite/SKILL.md +8 -7
  475. package/pack/generated/omp/skills/rite/reference/menu.md +6 -5
  476. package/pack/generated/omp/skills/rite-adopt/SKILL.md +6 -5
  477. package/pack/generated/omp/skills/rite-adopt/reference/anti-patterns.md +1 -1
  478. package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +11 -10
  479. package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +1 -1
  480. package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +4 -3
  481. package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  482. package/pack/generated/omp/skills/rite-build/SKILL.md +7 -7
  483. package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +1 -1
  484. package/pack/generated/omp/skills/rite-build/reference/anti-patterns.md +1 -1
  485. package/pack/generated/omp/skills/rite-build/reference/checkpoint-protocol.md +2 -2
  486. package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +2 -2
  487. package/pack/generated/omp/skills/rite-build/reference/frontend-trigger.md +1 -1
  488. package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +4 -4
  489. package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +6 -6
  490. package/pack/generated/omp/skills/rite-build/reference/tdd.md +1 -1
  491. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +27 -8
  492. package/pack/generated/omp/skills/rite-clarify/SKILL.md +4 -4
  493. package/pack/generated/omp/skills/rite-clarify/reference/anti-patterns.md +1 -1
  494. package/pack/generated/omp/skills/rite-converge/SKILL.md +16 -15
  495. package/pack/generated/omp/skills/rite-converge/reference/convergence-assessment.md +4 -4
  496. package/pack/generated/omp/skills/rite-customize/SKILL.md +2 -2
  497. package/pack/generated/omp/skills/rite-define/SKILL.md +25 -24
  498. package/pack/generated/omp/skills/rite-define/reference/anti-patterns.md +2 -2
  499. package/pack/generated/omp/skills/rite-define/reference/gates.md +2 -2
  500. package/pack/generated/omp/skills/rite-doctor/SKILL.md +12 -6
  501. package/pack/generated/omp/skills/rite-dogfood/SKILL.md +5 -5
  502. package/pack/generated/omp/skills/rite-explain/SKILL.md +7 -7
  503. package/pack/generated/omp/skills/rite-explain/reference/intake.md +1 -1
  504. package/pack/generated/omp/skills/rite-fast/SKILL.md +12 -10
  505. package/pack/generated/omp/skills/rite-fast/reference/artifacts.md +1 -1
  506. package/pack/generated/omp/skills/rite-frame/SKILL.md +6 -6
  507. package/pack/generated/omp/skills/rite-frame/reference/failure-modes.md +4 -4
  508. package/pack/generated/omp/skills/rite-handoff/SKILL.md +7 -6
  509. package/pack/generated/omp/skills/rite-learn/SKILL.md +6 -6
  510. package/pack/generated/omp/skills/rite-plan/SKILL.md +8 -8
  511. package/pack/generated/omp/skills/rite-plan/reference/anti-patterns.md +1 -1
  512. package/pack/generated/omp/skills/rite-plan/reference/replan-and-repair.md +3 -1
  513. package/pack/generated/omp/skills/rite-plan/reference/slicing.md +6 -4
  514. package/pack/generated/omp/skills/rite-plan/reference/task-breakdown.md +1 -1
  515. package/pack/generated/omp/skills/rite-polish/SKILL.md +6 -6
  516. package/pack/generated/omp/skills/rite-polish/reference/anti-ai-slop.md +9 -9
  517. package/pack/generated/omp/skills/rite-polish/reference/anti-patterns.md +1 -1
  518. package/pack/generated/omp/skills/rite-polish/reference/backend-polish.md +2 -2
  519. package/pack/generated/omp/skills/rite-polish/reference/browser-polish-evidence.md +1 -1
  520. package/pack/generated/omp/skills/rite-polish/reference/code.md +8 -8
  521. package/pack/generated/omp/skills/rite-polish/reference/design-memory.md +3 -3
  522. package/pack/generated/omp/skills/rite-polish/reference/design-system-discovery.md +1 -1
  523. package/pack/generated/omp/skills/rite-polish/reference/harden-checklist.md +1 -1
  524. package/pack/generated/omp/skills/rite-polish/reference/ledger.md +3 -3
  525. package/pack/generated/omp/skills/rite-polish/reference/ui.md +1 -1
  526. package/pack/generated/omp/skills/rite-pov/SKILL.md +2 -2
  527. package/pack/generated/omp/skills/rite-pr-feedback/SKILL.md +6 -5
  528. package/pack/generated/omp/skills/rite-pressure-test/SKILL.md +9 -7
  529. package/pack/generated/omp/skills/rite-prototype/SKILL.md +1 -1
  530. package/pack/generated/omp/skills/rite-prove/SKILL.md +13 -13
  531. package/pack/generated/omp/skills/rite-prove/reference/acceptance-proof.md +7 -7
  532. package/pack/generated/omp/skills/rite-prove/reference/anti-patterns.md +1 -1
  533. package/pack/generated/omp/skills/rite-prove/reference/browser-proof.md +3 -3
  534. package/pack/generated/omp/skills/rite-prove/reference/failure-triage.md +2 -2
  535. package/pack/generated/omp/skills/rite-quick/SKILL.md +19 -14
  536. package/pack/generated/omp/skills/rite-resolve/SKILL.md +6 -6
  537. package/pack/generated/omp/skills/rite-resolve/reference/answer-protocol.md +4 -5
  538. package/pack/generated/omp/skills/rite-review/SKILL.md +23 -22
  539. package/pack/generated/omp/skills/rite-review/reference/anti-patterns.md +1 -1
  540. package/pack/generated/omp/skills/rite-review/reference/cognitive-load.md +2 -2
  541. package/pack/generated/omp/skills/rite-review/reference/nielsen-heuristics.md +1 -1
  542. package/pack/generated/omp/skills/rite-review/reference/performance-checklist.md +1 -1
  543. package/pack/generated/omp/skills/rite-review/reference/performance-review.md +1 -1
  544. package/pack/generated/omp/skills/rite-review/reference/security-review.md +2 -2
  545. package/pack/generated/omp/skills/rite-seal/SKILL.md +11 -11
  546. package/pack/generated/omp/skills/rite-seal/reference/anti-patterns.md +1 -1
  547. package/pack/generated/omp/skills/rite-seal/reference/final-evidence.md +3 -3
  548. package/pack/generated/omp/skills/rite-seal/reference/go-no-go.md +3 -1
  549. package/pack/generated/omp/skills/rite-seal/reference/output.md +1 -1
  550. package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +4 -4
  551. package/pack/generated/omp/skills/rite-seal/reference/seal-template.md +5 -2
  552. package/pack/generated/omp/skills/rite-ship/SKILL.md +7 -7
  553. package/pack/generated/omp/skills/rite-ship/reference/anti-patterns.md +1 -1
  554. package/pack/generated/omp/skills/rite-ship/reference/close-out.md +5 -4
  555. package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +2 -2
  556. package/pack/generated/omp/skills/rite-ship/reference/rollout.md +3 -3
  557. package/pack/generated/omp/skills/rite-spec/SKILL.md +17 -14
  558. package/pack/generated/omp/skills/rite-spec/reference/anti-patterns.md +1 -1
  559. package/pack/generated/omp/skills/rite-spec/reference/investigation.md +3 -3
  560. package/pack/generated/omp/skills/rite-spec/reference/question-protocol.md +1 -1
  561. package/pack/generated/omp/skills/rite-spec/reference/spec-template.md +2 -2
  562. package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +8 -8
  563. package/pack/generated/omp/skills/rite-status/SKILL.md +2 -2
  564. package/pack/generated/omp/skills/rite-temper/SKILL.md +13 -13
  565. package/pack/generated/omp/skills/rite-temper/reference/anti-patterns.md +2 -2
  566. package/pack/generated/omp/skills/rite-temper/reference/review-dimensions.md +3 -3
  567. package/pack/generated/omp/skills/rite-temper/reference/scope-modes.md +3 -3
  568. package/pack/generated/omp/skills/rite-temper/reference/significance.md +4 -2
  569. package/pack/generated/omp/skills/rite-upgrade/SKILL.md +7 -5
  570. package/pack/generated/omp/skills/rite-vet/SKILL.md +14 -13
  571. package/pack/generated/omp/skills/rite-vet/reference/anti-patterns.md +2 -2
  572. package/pack/generated/omp/skills/rite-vet/reference/artifacts.md +3 -3
  573. package/pack/generated/omp/skills/rite-vet/reference/depth.md +3 -3
  574. package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +5 -5
  575. package/pack/generated/omp/skills/rite-watch-pr/SKILL.md +2 -2
  576. package/pack/generated/omp/skills/rite-zoom-out/SKILL.md +1 -1
  577. package/pack/generated/pi/agents/devrites-devex-reviewer.md +5 -0
  578. package/pack/generated/pi/agents/devrites-evidence-scout.md +4 -0
  579. package/pack/generated/pi/agents/devrites-plan-reviewer.md +4 -1
  580. package/pack/generated/pi/agents/overhaul-backend-engineer.md +2 -0
  581. package/pack/generated/pi/agents/overhaul-boundary.md +2 -0
  582. package/pack/generated/pi/agents/overhaul-craft.md +2 -0
  583. package/pack/generated/pi/agents/overhaul-frontend-engineer.md +2 -0
  584. package/pack/generated/pi/agents/overhaul-implementer.md +2 -0
  585. package/pack/generated/pi/agents/overhaul-recon.md +2 -0
  586. package/pack/generated/pi/agents/overhaul-specialist.md +2 -0
  587. package/pack/generated/pi/agents/overhaul-verifier.md +2 -0
  588. package/pack/generated/pi/prompts/rite-resolve.md +1 -1
  589. package/pack/generated/pi/skills/devrites-api-interface/SKILL.md +1 -1
  590. package/pack/generated/pi/skills/devrites-audit/SKILL.md +1 -1
  591. package/pack/generated/pi/skills/devrites-browser-proof/SKILL.md +1 -1
  592. package/pack/generated/pi/skills/devrites-debug-recovery/SKILL.md +3 -2
  593. package/pack/generated/pi/skills/devrites-doubt/SKILL.md +1 -1
  594. package/pack/generated/pi/skills/devrites-frontend-craft/SKILL.md +1 -1
  595. package/pack/generated/pi/skills/devrites-interview/SKILL.md +1 -1
  596. package/pack/generated/pi/skills/devrites-lib/reference/intent-map.md +3 -3
  597. package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  598. package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +5 -4
  599. package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +1 -1
  600. package/pack/generated/pi/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  601. package/pack/generated/pi/skills/devrites-lib/reference/standards/code-review.md +1 -1
  602. package/pack/generated/pi/skills/devrites-lib/reference/standards/core.md +1 -1
  603. package/pack/generated/pi/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  604. package/pack/generated/pi/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  605. package/pack/generated/pi/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  606. package/pack/generated/pi/skills/devrites-lib/reference/standards/performance.md +2 -0
  607. package/pack/generated/pi/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  608. package/pack/generated/pi/skills/devrites-lib/reference/standards/testing.md +13 -0
  609. package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  610. package/pack/generated/pi/skills/devrites-prose-craft/SKILL.md +1 -1
  611. package/pack/generated/pi/skills/devrites-source-driven/SKILL.md +1 -1
  612. package/pack/generated/pi/skills/devrites-ux-shape/SKILL.md +1 -1
  613. package/pack/generated/pi/skills/overhaul/SKILL.md +15 -15
  614. package/pack/generated/pi/skills/overhaul/references/audit-domains.md +2 -2
  615. package/pack/generated/pi/skills/overhaul/references/orchestration.md +11 -7
  616. package/pack/generated/pi/skills/overhaul/references/records.md +8 -3
  617. package/pack/generated/pi/skills/rite/SKILL.md +4 -3
  618. package/pack/generated/pi/skills/rite/reference/menu.md +6 -5
  619. package/pack/generated/pi/skills/rite-adopt/SKILL.md +4 -3
  620. package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +7 -6
  621. package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +2 -1
  622. package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +2 -1
  623. package/pack/generated/pi/skills/rite-build/SKILL.md +2 -2
  624. package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +1 -1
  625. package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +20 -1
  626. package/pack/generated/pi/skills/rite-clarify/SKILL.md +1 -1
  627. package/pack/generated/pi/skills/rite-converge/SKILL.md +5 -4
  628. package/pack/generated/pi/skills/rite-customize/SKILL.md +1 -1
  629. package/pack/generated/pi/skills/rite-define/SKILL.md +4 -3
  630. package/pack/generated/pi/skills/rite-doctor/SKILL.md +12 -6
  631. package/pack/generated/pi/skills/rite-dogfood/SKILL.md +2 -2
  632. package/pack/generated/pi/skills/rite-explain/SKILL.md +1 -1
  633. package/pack/generated/pi/skills/rite-fast/SKILL.md +8 -6
  634. package/pack/generated/pi/skills/rite-frame/SKILL.md +1 -1
  635. package/pack/generated/pi/skills/rite-handoff/SKILL.md +4 -3
  636. package/pack/generated/pi/skills/rite-learn/SKILL.md +2 -2
  637. package/pack/generated/pi/skills/rite-plan/SKILL.md +1 -1
  638. package/pack/generated/pi/skills/rite-plan/reference/replan-and-repair.md +2 -0
  639. package/pack/generated/pi/skills/rite-plan/reference/slicing.md +3 -1
  640. package/pack/generated/pi/skills/rite-polish/SKILL.md +2 -2
  641. package/pack/generated/pi/skills/rite-pov/SKILL.md +1 -1
  642. package/pack/generated/pi/skills/rite-pr-feedback/SKILL.md +5 -4
  643. package/pack/generated/pi/skills/rite-pressure-test/SKILL.md +7 -5
  644. package/pack/generated/pi/skills/rite-prototype/SKILL.md +1 -1
  645. package/pack/generated/pi/skills/rite-prove/SKILL.md +1 -1
  646. package/pack/generated/pi/skills/rite-quick/SKILL.md +11 -6
  647. package/pack/generated/pi/skills/rite-resolve/SKILL.md +3 -3
  648. package/pack/generated/pi/skills/rite-resolve/reference/answer-protocol.md +4 -5
  649. package/pack/generated/pi/skills/rite-review/SKILL.md +3 -2
  650. package/pack/generated/pi/skills/rite-seal/SKILL.md +4 -4
  651. package/pack/generated/pi/skills/rite-seal/reference/go-no-go.md +2 -0
  652. package/pack/generated/pi/skills/rite-seal/reference/seal-template.md +5 -2
  653. package/pack/generated/pi/skills/rite-ship/SKILL.md +1 -1
  654. package/pack/generated/pi/skills/rite-ship/reference/close-out.md +3 -2
  655. package/pack/generated/pi/skills/rite-spec/SKILL.md +5 -2
  656. package/pack/generated/pi/skills/rite-status/SKILL.md +1 -1
  657. package/pack/generated/pi/skills/rite-temper/SKILL.md +2 -2
  658. package/pack/generated/pi/skills/rite-temper/reference/significance.md +2 -0
  659. package/pack/generated/pi/skills/rite-upgrade/SKILL.md +4 -2
  660. package/pack/generated/pi/skills/rite-vet/SKILL.md +4 -3
  661. package/pack/generated/pi/skills/rite-vet/reference/artifacts.md +1 -1
  662. package/pack/generated/pi/skills/rite-watch-pr/SKILL.md +1 -1
  663. package/pack/generated/pi/skills/rite-zoom-out/SKILL.md +1 -1
  664. package/package.json +3 -2
  665. package/scripts/build-host-artifacts.sh +13 -0
  666. package/scripts/codex-generate.sh +5 -1
  667. package/scripts/devin-generate.sh +4 -3
  668. package/scripts/install-lib.sh +5 -0
  669. package/scripts/omp-generate.sh +23 -1
  670. package/scripts/pi-generate.sh +2 -2
  671. package/engine/cmd/releasepack/main_test.go +0 -239
  672. package/engine/harnessmatrix_test.go +0 -46
  673. package/engine/help_test.go +0 -241
  674. package/engine/internal/acceptance/acceptance_test.go +0 -946
  675. package/engine/internal/devritespaths/paths_test.go +0 -128
  676. package/engine/internal/fsutil/copy_test.go +0 -154
  677. package/engine/internal/gate/gate_test.go +0 -865
  678. package/engine/internal/gate/readiness_binding_test.go +0 -443
  679. package/engine/internal/gitenv/env_test.go +0 -48
  680. package/engine/internal/hostpack/hostpack_test.go +0 -269
  681. package/engine/internal/install/install_test.go +0 -1741
  682. package/engine/internal/install/workspace_advisory_test.go +0 -54
  683. package/engine/internal/lib/candidate_test.go +0 -506
  684. package/engine/internal/lib/claims_test.go +0 -267
  685. package/engine/internal/lib/closeout_test.go +0 -266
  686. package/engine/internal/lib/context_next_test.go +0 -912
  687. package/engine/internal/lib/cursor_compat_test.go +0 -65
  688. package/engine/internal/lib/detect_test.go +0 -118
  689. package/engine/internal/lib/drift_test.go +0 -135
  690. package/engine/internal/lib/dup_test.go +0 -666
  691. package/engine/internal/lib/environment_report_test.go +0 -54
  692. package/engine/internal/lib/evidencefresh_test.go +0 -120
  693. package/engine/internal/lib/handoff_test.go +0 -83
  694. package/engine/internal/lib/manifest_union_test.go +0 -251
  695. package/engine/internal/lib/metrics_test.go +0 -28
  696. package/engine/internal/lib/migrate_test.go +0 -213
  697. package/engine/internal/lib/observe_budgets_test.go +0 -428
  698. package/engine/internal/lib/open_visual_test.go +0 -291
  699. package/engine/internal/lib/regression_test.go +0 -282
  700. package/engine/internal/lib/resolve_remediation_test.go +0 -192
  701. package/engine/internal/lib/secretscan_test.go +0 -556
  702. package/engine/internal/lib/slicecheck_test.go +0 -170
  703. package/engine/internal/lib/taskgraph_test.go +0 -353
  704. package/engine/internal/lib/triggers_test.go +0 -23
  705. package/engine/internal/lib/util_test.go +0 -148
  706. package/engine/internal/lib/visual_outline_test.go +0 -189
  707. package/engine/internal/lib/windows_test.go +0 -420
  708. package/engine/internal/lib/workspace_read_test.go +0 -102
  709. package/engine/internal/markdowntext/markdowntext_fuzz_test.go +0 -36
  710. package/engine/internal/markdowntext/markdowntext_test.go +0 -58
  711. package/engine/internal/markdowntext/testdata/structural.json +0 -277
  712. package/engine/internal/notes/notes_test.go +0 -545
  713. package/engine/internal/overhaul/admit/admit_test.go +0 -204
  714. package/engine/internal/overhaul/admit/packet_test.go +0 -223
  715. package/engine/internal/overhaul/bench/run_test.go +0 -316
  716. package/engine/internal/overhaul/ovio/ovio_test.go +0 -75
  717. package/engine/internal/overhaul/packet/packet_test.go +0 -263
  718. package/engine/internal/overhaul/records/init_test.go +0 -96
  719. package/engine/internal/overhaul/records/records_test.go +0 -696
  720. package/engine/internal/overhaul/records/run_test.go +0 -77
  721. package/engine/internal/overhaul/render/run_test.go +0 -928
  722. package/engine/internal/overhaul/score/run_test.go +0 -636
  723. package/engine/internal/overhaul/snapshot/run_test.go +0 -718
  724. package/engine/internal/parallel/cli_test.go +0 -91
  725. package/engine/internal/parallel/ops_test.go +0 -939
  726. package/engine/internal/parallel/parallel_test.go +0 -645
  727. package/engine/internal/parallel/pathdisjoint_fuzz_test.go +0 -43
  728. package/engine/internal/parallel/pathdisjoint_test.go +0 -193
  729. package/engine/internal/parallel/select_test.go +0 -95
  730. package/engine/internal/parallel/testdata/fuzz/FuzzPathDisjoint/a449b81b4711b7b4 +0 -3
  731. package/engine/internal/reason/reason_test.go +0 -37
  732. package/engine/internal/release/release_test.go +0 -181
  733. package/engine/internal/rootfacts/facts_test.go +0 -364
  734. package/engine/internal/safepath/safepath_fuzz_test.go +0 -21
  735. package/engine/internal/safepath/safepath_test.go +0 -69
  736. package/engine/internal/safepath/safepath_windows_test.go +0 -26
  737. package/engine/internal/state/acceptance_test.go +0 -57
  738. package/engine/internal/state/budgets_test.go +0 -135
  739. package/engine/internal/state/cmd/workflowmanifest/main_test.go +0 -96
  740. package/engine/internal/state/concurrency_test.go +0 -184
  741. package/engine/internal/state/cursor_fuzz_test.go +0 -80
  742. package/engine/internal/state/cursor_test.go +0 -276
  743. package/engine/internal/state/observation_test.go +0 -961
  744. package/engine/internal/state/observation_unix_test.go +0 -68
  745. package/engine/internal/state/state_test.go +0 -986
  746. package/engine/internal/state/taskgraph_fuzz_test.go +0 -38
  747. package/engine/internal/state/taskgraph_test.go +0 -43
  748. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/114b28f68c1fa4db +0 -4
  749. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/378a0f2218e812ea +0 -4
  750. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/39eaa26fcb481e3c +0 -4
  751. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/776ca1dc0143acf0 +0 -4
  752. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/9295930c1ebb81df +0 -4
  753. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/a60de309dc33be0d +0 -4
  754. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f04dc7b06ef7c99f +0 -4
  755. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f3000ac510878bd6 +0 -4
  756. package/engine/internal/state/testdata/fuzz/FuzzWorkspaceSchemaRow/a75aabb9f2a847d5 +0 -2
  757. package/engine/internal/state/workspaceschema_fuzz_test.go +0 -27
  758. package/engine/internal/state/workspaceschema_test.go +0 -101
  759. package/engine/internal/state/write_test.go +0 -136
  760. package/engine/internal/version/version_test.go +0 -29
  761. package/engine/internal/workflow/commands_test.go +0 -18
  762. package/engine/note_routing_test.go +0 -95
  763. package/engine/observation_contract_test.go +0 -175
  764. package/engine/root_routing_test.go +0 -340
@@ -1,696 +0,0 @@
1
- package records
2
-
3
- import (
4
- "bytes"
5
- "encoding/json"
6
- "os"
7
- "path/filepath"
8
- "strings"
9
- "testing"
10
-
11
- "github.com/devrites/devrites/internal/overhaul/ovio"
12
- "github.com/devrites/devrites/internal/overhaul/render"
13
- )
14
-
15
- type J = map[string]any
16
- type L = []any
17
-
18
- type fixture struct {
19
- t *testing.T
20
- repo, run string
21
- }
22
-
23
- func write(t *testing.T, path string, v any) {
24
- t.Helper()
25
- if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
26
- t.Fatal(err)
27
- }
28
- var b []byte
29
- switch x := v.(type) {
30
- case string:
31
- b = []byte(x)
32
- default:
33
- var err error
34
- if b, err = json.MarshalIndent(v, "", " "); err != nil {
35
- t.Fatal(err)
36
- }
37
- }
38
- if err := os.WriteFile(path, b, 0o644); err != nil {
39
- t.Fatal(err)
40
- }
41
- }
42
-
43
- func digest(t *testing.T, path string) string {
44
- t.Helper()
45
- d, err := ovio.SHA256File(path)
46
- if err != nil {
47
- t.Fatal(err)
48
- }
49
- return d
50
- }
51
-
52
- func task(id string, deps L, path string) J {
53
- return J{"id": id, "deps": deps, "allowed_paths": L{path}, "oracle": "test passes",
54
- "writer_role": "implementer", "verifier_role": "verifier", "controls": L{"C-1"}}
55
- }
56
-
57
- func newFixture(t *testing.T) *fixture {
58
- dir := t.TempDir()
59
- f := &fixture{t: t, repo: filepath.Join(dir, "repo"), run: filepath.Join(dir, "run")}
60
- write(t, filepath.Join(f.repo, "src/a.py"), "print('a')\n")
61
- write(t, filepath.Join(f.run, "revisions/rubric-r1.json"), J{"schema": "overhaul.rubric/1", "rev": 1, "controls": L{J{"id": "C-1"}}})
62
- f.writePlan(L{task("T-1", L{}, "src/a.py"), task("T-2", L{"T-1"}, "src/b.py")})
63
- write(t, filepath.Join(f.run, "evidence/red.log"), "red\n")
64
- write(t, filepath.Join(f.run, "receipts/R-1.json"), J{})
65
- return f
66
- }
67
-
68
- func (f *fixture) writePlan(tasks L) {
69
- write(f.t, filepath.Join(f.run, "revisions/plan-r1.json"), J{"schema": "overhaul.plan/1", "rev": 1,
70
- "rubric": J{"file": "revisions/rubric-r1.json", "sha256": digest(f.t, filepath.Join(f.run, "revisions/rubric-r1.json"))},
71
- "tasks": tasks})
72
- }
73
-
74
- // records returns a fresh, valid record set with digests of the current files.
75
- func (f *fixture) records() map[string]J {
76
- return map[string]J{
77
- "run.json": {"schema": "overhaul.run/1", "run_id": "run-1", "repo_root": f.repo, "mode": "full",
78
- "assessment_only": false, "phase": "REMEDIATING", "readiness_verdict": "NOT_ASSESSED",
79
- "execution_outcome": "RUNNING", "revisions": J{"plan": J{"rev": 1, "file": "revisions/plan-r1.json"}}},
80
- "coverage.json": {"schema": "overhaul.coverage/1", "files": L{J{"path": "src/a.py", "eligible": true}}},
81
- "findings.json": {"schema": "overhaul.findings/1", "findings": L{J{"id": "F-1", "fingerprint": "fp-1",
82
- "kind": "defect", "scope_origin": "pre-existing", "status": "confirmed", "severity": "high",
83
- "domain": "correctness", "controls": L{"C-1"},
84
- "evidence": L{"E-1"}, "locations": L{J{"path": "src/a.py", "start": 1, "end": 1},
85
- J{"path": "mobile-app:src/api.ts", "external": true}},
86
- "history": L{J{"status": "candidate"}, J{"status": "confirmed"}}}}},
87
- "evidence.json": {"schema": "overhaul.evidence/1", "items": L{J{"id": "E-1", "path": "evidence/red.log",
88
- "sha256": digest(f.t, filepath.Join(f.run, "evidence/red.log"))}}},
89
- "dispatch.json": {"schema": "overhaul.dispatch/1", "attempts": L{J{"task_id": "T-1", "attempt_id": "A1",
90
- "role": "implementer", "status": "admitted", "authorized_by": "AP-1", "receipt": "receipts/R-1.json",
91
- "changed_paths": L{"src/a.py"}}}},
92
- "approval.json": {"schema": "overhaul.approval/1", "events": L{J{"id": "AP-1", "kind": "approve",
93
- "status": "active", "tasks": L{"T-1"}, "plan_rev": 1, "quote": "yes, fix T-1", "channel": "conversation",
94
- "plan_digest": digest(f.t, filepath.Join(f.run, "revisions/plan-r1.json"))}}},
95
- "cycles.json": {"schema": "overhaul.cycles/1", "cycles": L{J{"n": 1}}},
96
- }
97
- }
98
-
99
- func (f *fixture) cmd(args ...string) (int, string, string) {
100
- var out, errb bytes.Buffer
101
- code := Run(args, &out, &errb)
102
- return code, out.String(), errb.String()
103
- }
104
-
105
- // publish stages, writes recs (plus extra files relative to the stage) and publishes.
106
- func (f *fixture) publish(recs map[string]J, extra map[string]string) (int, string) {
107
- f.t.Helper()
108
- code, out, errs := f.cmd("stage", f.run)
109
- if code != 0 {
110
- f.t.Fatalf("stage: %d %s", code, errs)
111
- }
112
- tmp := strings.TrimSpace(out)
113
- for name, doc := range recs {
114
- write(f.t, filepath.Join(tmp, name), doc)
115
- }
116
- for name, body := range extra {
117
- write(f.t, filepath.Join(tmp, name), body)
118
- }
119
- code, out, errs = f.cmd("publish", f.run)
120
- return code, out + errs
121
- }
122
-
123
- // publishRendered stages recs, renders review and report views into the stage, then publishes.
124
- func (f *fixture) publishRendered(recs map[string]J) (int, string) {
125
- f.t.Helper()
126
- code, out, errs := f.cmd("stage", f.run)
127
- if code != 0 {
128
- f.t.Fatalf("stage: %d %s", code, errs)
129
- }
130
- tmp := strings.TrimSpace(out)
131
- for name, doc := range recs {
132
- write(f.t, filepath.Join(tmp, name), doc)
133
- }
134
- for _, kind := range []string{"review", "report"} {
135
- var o, e bytes.Buffer
136
- if c := render.Run([]string{f.run, tmp, kind}, &o, &e); c != 0 {
137
- f.t.Fatalf("render %s: %d %s", kind, c, e.String())
138
- }
139
- }
140
- code, out, errs = f.cmd("publish", f.run)
141
- return code, out + errs
142
- }
143
-
144
- func (f *fixture) mustPublish(recs map[string]J) {
145
- f.t.Helper()
146
- if code, out := f.publish(recs, nil); code != 0 {
147
- f.t.Fatalf("publish failed: %d\n%s", code, out)
148
- }
149
- }
150
-
151
- func finding(r map[string]J) J { return r["findings.json"]["findings"].(L)[0].(J) }
152
- func approval(r map[string]J) J { return r["approval.json"]["events"].(L)[0].(J) }
153
- func attempts(r map[string]J) L { return r["dispatch.json"]["attempts"].(L) }
154
-
155
- func addAttempt(r map[string]J, a J) {
156
- r["dispatch.json"]["attempts"] = append(attempts(r), a)
157
- }
158
-
159
- func TestPublishThenValidate(t *testing.T) {
160
- f := newFixture(t)
161
- code, out := f.publish(f.records(), nil)
162
- if code != 0 || !strings.Contains(out, "published g0001") {
163
- t.Fatalf("publish: %d %s", code, out)
164
- }
165
- if code, out, _ := f.cmd("validate", f.run); code != 0 || strings.TrimSpace(out) != "valid g0001" {
166
- t.Fatalf("validate: %d %s", code, out)
167
- }
168
- f.mustPublish(f.records())
169
- m, err := ovio.LoadObject(filepath.Join(f.run, "g0002/manifest.json"))
170
- if err != nil {
171
- t.Fatal(err)
172
- }
173
- _, hasRun := ovio.Obj(m["files"])["run.json"]
174
- _, hasPlan := ovio.Obj(m["revisions"])["revisions/plan-r1.json"]
175
- if m["previous"] != "g0001" || !hasRun || !hasPlan {
176
- t.Fatalf("manifest: %v", m)
177
- }
178
- if code, out, _ := f.cmd("validate", f.run); code != 0 || strings.TrimSpace(out) != "valid g0002" {
179
- t.Fatalf("validate g0002: %d %s", code, out)
180
- }
181
- if code, out, _ := f.cmd("digest", filepath.Join(f.run, "evidence/red.log")); code != 0 ||
182
- strings.TrimSpace(out) != digest(t, filepath.Join(f.run, "evidence/red.log")) {
183
- t.Fatalf("digest: %d %s", code, out)
184
- }
185
- if code, _, _ := f.cmd("bogus"); code != 2 {
186
- t.Fatalf("usage exit = %d", code)
187
- }
188
- }
189
-
190
- func cell(r map[string]J) J { return r["coverage.json"]["applicability"].(L)[0].(J) }
191
-
192
- // scorecard records a scorecard with the given gates and points run.json at its rubric.
193
- func scorecard(r map[string]J, gates J) {
194
- r["run.json"]["revisions"].(J)["rubric"] = J{"rev": 1, "file": "revisions/rubric-r1.json"}
195
- r["scorecard.json"] = J{"schema": "overhaul.scorecard/1", "gates": gates}
196
- }
197
-
198
- // reviewed records one applicability cell in state st, backed by a receipt that
199
- // checked its domain, and a fully reviewed range for the fixture's file.
200
- func reviewed(f *fixture, r map[string]J, st string) {
201
- write(f.t, filepath.Join(f.run, "receipts/R-dom.json"), J{"outcome": "no-findings", "domains_checked": L{"correctness"}})
202
- addAttempt(r, J{"task_id": "W-1", "attempt_id": "A1", "role": "reviewer", "status": "admitted", "receipt": "receipts/R-dom.json"})
203
- r["coverage.json"]["applicability"] = L{J{"domain": "correctness", "component": "api", "lane": "backend",
204
- "state": st, "reason": "no GUI", "receipts": L{"receipts/R-dom.json"}}}
205
- r["coverage.json"]["files"] = L{J{"path": "src/a.py", "eligible": true,
206
- "ranges": L{J{"start": 1, "end": 1, "state": "semantically-reviewed"}}}}
207
- }
208
-
209
- func TestSingleGenerationRules(t *testing.T) {
210
- verifiedHistory := L{J{"status": "candidate"}, J{"status": "confirmed"}, J{"status": "approved-for-fix"},
211
- J{"status": "in-progress"}, J{"status": "fixed-unverified"}, J{"status": "verified"}}
212
- verifier := J{"task_id": "T-1", "attempt_id": "V1", "role": "verifier", "status": "admitted", "receipt": "receipts/R-1.json"}
213
- cases := []struct {
214
- name string
215
- mutate func(f *fixture, r map[string]J)
216
- want string // "" means the publish must succeed
217
- }{
218
- {"approval without quote", func(f *fixture, r map[string]J) { delete(approval(r), "quote") }, "needs the user's verbatim decision"},
219
- {"approval untrusted channel", func(f *fixture, r map[string]J) { approval(r)["channel"] = "email" }, "trusted channel"},
220
- {"accept-degradation without quote", func(f *fixture, r map[string]J) {
221
- r["approval.json"]["events"] = append(r["approval.json"]["events"].(L), J{"id": "D-1", "kind": "accept-degradation", "channel": "conversation"})
222
- }, "approval D-1: needs the user's verbatim decision"},
223
- {"approval digest mismatch", func(f *fixture, r map[string]J) { approval(r)["plan_digest"] = strings.Repeat("0", 64) }, "plan digest does not match"},
224
- {"subset approval missing prerequisite", func(f *fixture, r map[string]J) { approval(r)["tasks"] = L{"T-2"} }, "miss prerequisites ['T-1']"},
225
- {"writer for unapproved task", func(f *fixture, r map[string]J) {
226
- addAttempt(r, J{"task_id": "T-2", "attempt_id": "A1", "role": "implementer", "status": "running", "authorized_by": "AP-1"})
227
- }, "attempt T-2#A1: writer task is not in the active approval"},
228
- {"approval active after stop", func(f *fixture, r map[string]J) {
229
- r["approval.json"]["events"] = append(r["approval.json"]["events"].(L), J{"id": "S-1", "kind": "stop"})
230
- }, "still active after a later stop/revoke"},
231
- {"live writer after stop", func(f *fixture, r map[string]J) {
232
- approval(r)["status"] = "stopped"
233
- r["approval.json"]["events"] = append(r["approval.json"]["events"].(L), J{"id": "S-1", "kind": "stop"})
234
- addAttempt(r, J{"task_id": "T-1", "attempt_id": "A2", "role": "implementer", "status": "running", "authorized_by": "AP-1"})
235
- }, "attempt T-1#A2: writer task is not in the active approval"},
236
- {"assessment-only with approval", func(f *fixture, r map[string]J) {
237
- r["run.json"]["assessment_only"] = true
238
- r["dispatch.json"]["attempts"] = L{}
239
- }, "assessment-only run carries an active approval"},
240
- {"assessment-only with writer", func(f *fixture, r map[string]J) {
241
- r["run.json"]["assessment_only"] = true
242
- approval(r)["status"] = "revoked"
243
- }, "writer dispatched in an assessment-only run"},
244
- {"live writers case alias", func(f *fixture, r map[string]J) {
245
- addAttempt(r, J{"task_id": "T-1", "attempt_id": "A2", "role": "implementer", "status": "running", "authorized_by": "AP-1", "write_paths": L{"src/a.py"}})
246
- addAttempt(r, J{"task_id": "T-1", "attempt_id": "A3", "role": "implementer", "status": "unknown", "authorized_by": "AP-1", "write_paths": L{"SRC/A.PY"}})
247
- }, "single writer: T-1#A2 and T-1#A3 both hold SRC/A.PY"},
248
- {"live writers symlink alias", func(f *fixture, r map[string]J) {
249
- if err := os.Symlink("a.py", filepath.Join(f.repo, "src/link.py")); err != nil {
250
- f.t.Fatal(err)
251
- }
252
- addAttempt(r, J{"task_id": "T-1", "attempt_id": "A2", "role": "implementer", "status": "running", "authorized_by": "AP-1", "write_paths": L{"src/a.py"}})
253
- addAttempt(r, J{"task_id": "T-1", "attempt_id": "A3", "role": "implementer", "status": "dispatched", "authorized_by": "AP-1", "write_paths": L{"src/link.py"}})
254
- }, "single writer: T-1#A2 and T-1#A3 both hold src/link.py"},
255
- {"settled writers may share a path", func(f *fixture, r map[string]J) {
256
- addAttempt(r, J{"task_id": "T-1", "attempt_id": "A2", "role": "implementer", "status": "running", "authorized_by": "AP-1", "write_paths": L{"src/a.py"}})
257
- addAttempt(r, J{"task_id": "T-1", "attempt_id": "A3", "role": "implementer", "status": "cancelled", "authorized_by": "AP-1", "write_paths": L{"src/a.py"}})
258
- }, ""},
259
- {"allowed path escape", func(f *fixture, r map[string]J) {
260
- f.writePlan(L{task("T-1", L{}, "../outside.py"), task("T-2", L{"T-1"}, "src/b.py")})
261
- approval(r)["plan_digest"] = digest(f.t, filepath.Join(f.run, "revisions/plan-r1.json"))
262
- }, "allowed path '../outside.py' not normalized or escapes the repository"},
263
- {"dependency cycle", func(f *fixture, r map[string]J) {
264
- f.writePlan(L{task("T-1", L{"T-2"}, "src/a.py"), task("T-2", L{"T-1"}, "src/b.py")})
265
- approval(r)["plan_digest"] = digest(f.t, filepath.Join(f.run, "revisions/plan-r1.json"))
266
- approval(r)["tasks"] = L{"T-1", "T-2"}
267
- }, "task dependencies contain a cycle"},
268
- {"task id breaks the approval fence", func(f *fixture, r map[string]J) {
269
- f.writePlan(L{task("T-1", L{}, "src/a.py"), task("T-2\n```\n<img src=x>", L{"T-1"}, "src/b.py")})
270
- approval(r)["plan_digest"] = digest(f.t, filepath.Join(f.run, "revisions/plan-r1.json"))
271
- }, "id must match"},
272
- {"bracket path accepted", func(f *fixture, r map[string]J) {
273
- f.writePlan(L{task("T-1", L{}, "src/a.py"), task("T-2", L{"T-1"}, "app/blog/[slug]/page.tsx")})
274
- approval(r)["plan_digest"] = digest(f.t, filepath.Join(f.run, "revisions/plan-r1.json"))
275
- finding(r)["locations"] = L{J{"path": "app/blog/[slug]/page.tsx", "start": 1}}
276
- }, ""},
277
- {"duplicate fingerprint", func(f *fixture, r map[string]J) {
278
- r["findings.json"]["findings"] = append(r["findings.json"]["findings"].(L), J{"id": "F-2", "fingerprint": "fp-1",
279
- "kind": "defect", "scope_origin": "introduced", "status": "candidate", "history": L{J{"status": "candidate"}}})
280
- }, "finding fingerprint: duplicate id 'fp-1'"},
281
- {"needs-validation without blockers", func(f *fixture, r map[string]J) {
282
- r["findings.json"]["findings"] = append(r["findings.json"]["findings"].(L), J{"id": "F-2", "fingerprint": "fp-2",
283
- "kind": "defect", "scope_origin": "introduced", "status": "needs-validation",
284
- "history": L{J{"status": "candidate"}, J{"status": "needs-validation"}}})
285
- }, "finding F-2: needs-validation must name the missing fact (blockers)"},
286
- {"host path location", func(f *fixture, r map[string]J) {
287
- finding(r)["locations"] = L{J{"path": "/Users/me/app/a.py", "start": 1}}
288
- }, "location '/Users/me/app/a.py' is not a repository-relative path or label"},
289
- {"external host path location", func(f *fixture, r map[string]J) {
290
- finding(r)["locations"] = L{J{"path": "~/app/a.py", "external": true}}
291
- }, "is not a repository-relative path or label"},
292
- {"directory location", func(f *fixture, r map[string]J) {
293
- finding(r)["locations"] = L{J{"path": "src"}}
294
- }, "location 'src' is not a repository-relative path or label"},
295
- {"illegal transition", func(f *fixture, r map[string]J) {
296
- finding(r)["history"] = L{J{"status": "candidate"}, J{"status": "verified"}, J{"status": "confirmed"}}
297
- }, "illegal transition candidate -> verified"},
298
- {"severity on candidate", func(f *fixture, r map[string]J) {
299
- finding(r)["status"] = "candidate"
300
- finding(r)["history"] = L{J{"status": "candidate"}}
301
- }, "severity only for established impact"},
302
- {"history must start at candidate", func(f *fixture, r map[string]J) {
303
- finding(r)["history"] = L{J{"status": "confirmed"}}
304
- }, "must start at candidate"},
305
- {"same-status entry with reason", func(f *fixture, r map[string]J) {
306
- finding(r)["history"] = L{J{"status": "candidate"}, J{"status": "confirmed"}, J{"status": "confirmed", "reason": "severity re-assessed"}}
307
- }, ""},
308
- {"same-status entry without reason", func(f *fixture, r map[string]J) {
309
- finding(r)["history"] = L{J{"status": "candidate"}, J{"status": "confirmed"}, J{"status": "confirmed"}}
310
- }, "illegal transition confirmed -> confirmed"},
311
- {"evidence sha256 mandatory", func(f *fixture, r map[string]J) {
312
- delete(r["evidence.json"]["items"].(L)[0].(J), "sha256")
313
- }, "evidence E-1: sha256 missing"},
314
- {"evidence outside run dir", func(f *fixture, r map[string]J) {
315
- r["evidence.json"]["items"].(L)[0].(J)["path"] = "../repo/src/a.py"
316
- }, "evidence E-1: path missing or outside run dir"},
317
- {"verified_by without verifier", func(f *fixture, r map[string]J) {
318
- finding(r)["status"], finding(r)["history"], finding(r)["verified_by"] = "verified", verifiedHistory, "T-1#V1"
319
- }, "verified_by must name an admitted verifier attempt"},
320
- {"verified_by names attempt", func(f *fixture, r map[string]J) {
321
- finding(r)["status"], finding(r)["history"], finding(r)["verified_by"] = "verified", verifiedHistory, "T-1#V1"
322
- addAttempt(r, verifier)
323
- }, ""},
324
- {"verified_by names receipt", func(f *fixture, r map[string]J) {
325
- finding(r)["status"], finding(r)["history"], finding(r)["verified_by"] = "verified", verifiedHistory, "receipts/R-1.json"
326
- addAttempt(r, verifier)
327
- }, ""},
328
- {"plan file must match rev", func(f *fixture, r map[string]J) {
329
- r["run.json"]["revisions"] = J{"plan": J{"rev": 1, "file": "revisions/rubric-r1.json"}}
330
- }, "must be revisions/plan-r<rev>.json"},
331
- {"approvals need revisions.plan", func(f *fixture, r map[string]J) {
332
- r["run.json"]["revisions"] = J{}
333
- r["dispatch.json"]["attempts"] = L{}
334
- }, "approvals and writers need revisions.plan"},
335
- {"writers need revisions.plan", func(f *fixture, r map[string]J) {
336
- r["run.json"]["revisions"] = J{}
337
- r["approval.json"]["events"] = L{}
338
- }, "approvals and writers need revisions.plan"},
339
- {"assessment without plan is fine", func(f *fixture, r map[string]J) {
340
- r["run.json"]["revisions"] = J{}
341
- r["run.json"]["assessment_only"] = true
342
- r["approval.json"]["events"] = L{}
343
- r["dispatch.json"]["attempts"] = L{}
344
- }, ""},
345
- {"terminal outcome missing", func(f *fixture, r map[string]J) {
346
- r["run.json"]["execution_outcome"] = "READY_FOR_USER_REVIEW"
347
- }, "approved tasks without exactly one recorded outcome: ['T-1']"},
348
- {"terminal outcome recorded", func(f *fixture, r map[string]J) {
349
- r["run.json"]["execution_outcome"] = "READY_FOR_USER_REVIEW"
350
- r["run.json"]["task_outcomes"] = J{"T-1": "completed"}
351
- }, ""},
352
- {"unsettled attempt blocks leaving RUNNING", func(f *fixture, r map[string]J) {
353
- r["run.json"]["execution_outcome"] = "STOPPED_BY_USER"
354
- r["run.json"]["task_outcomes"] = J{"T-1": "completed"}
355
- addAttempt(r, J{"task_id": "R-9", "attempt_id": "A1", "role": "reviewer", "status": "returned", "receipt": "receipts/R-1.json"})
356
- }, "before the run leaves RUNNING: ['R-9#A1']"},
357
- {"unknown and timed-out allowed after stop", func(f *fixture, r map[string]J) {
358
- approval(r)["status"] = "stopped"
359
- r["approval.json"]["events"] = append(r["approval.json"]["events"].(L), J{"id": "S-1", "kind": "stop"})
360
- r["run.json"]["execution_outcome"] = "STOPPED_BY_USER"
361
- r["run.json"]["task_outcomes"] = J{"T-1": "not-started"}
362
- addAttempt(r, J{"task_id": "T-1", "attempt_id": "A2", "role": "implementer", "status": "unknown", "authorized_by": "AP-1"})
363
- addAttempt(r, J{"task_id": "R-9", "attempt_id": "A1", "role": "reviewer", "status": "timed-out"})
364
- }, ""},
365
- {"scorecard needs revisions.rubric", func(f *fixture, r map[string]J) {
366
- r["scorecard.json"] = J{"readiness_verdict": "NOT_ASSESSED"}
367
- }, "scorecard needs revisions.rubric"},
368
- {"scorecard rubric digest", func(f *fixture, r map[string]J) {
369
- r["scorecard.json"] = J{"readiness_verdict": "NOT_ASSESSED"}
370
- r["run.json"]["revisions"].(J)["rubric"] = J{"rev": 1, "file": "revisions/rubric-r1.json", "sha256": strings.Repeat("0", 64)}
371
- }, "revisions.rubric digest mismatch"},
372
- {"scorecard verdict differs", func(f *fixture, r map[string]J) {
373
- r["scorecard.json"] = J{"readiness_verdict": "NOT_READY"}
374
- r["run.json"]["revisions"].(J)["rubric"] = J{"rev": 1, "file": "revisions/rubric-r1.json",
375
- "sha256": digest(f.t, filepath.Join(f.run, "revisions/rubric-r1.json"))}
376
- }, "readiness_verdict differs"},
377
- {"scorecard consistent", func(f *fixture, r map[string]J) {
378
- r["scorecard.json"] = J{"readiness_verdict": "NOT_ASSESSED"}
379
- r["run.json"]["revisions"].(J)["rubric"] = J{"rev": 1, "file": "revisions/rubric-r1.json",
380
- "sha256": digest(f.t, filepath.Join(f.run, "revisions/rubric-r1.json"))}
381
- }, ""},
382
- {"schema tag and enum", func(f *fixture, r map[string]J) {
383
- r["cycles.json"]["schema"] = "overhaul.cycle/1"
384
- r["run.json"]["mode"] = "yolo"
385
- }, "run.json: mode='yolo' not in ['branch', 'full', 'pr']"},
386
- {"stopped run without report views", func(f *fixture, r map[string]J) {
387
- r["run.json"]["execution_outcome"] = "READY_FOR_USER_REVIEW"
388
- r["run.json"]["task_outcomes"] = J{"T-1": "completed"}
389
- }, "views/report.html is required once the run stops"},
390
- {"awaiting approval without review views", func(f *fixture, r map[string]J) {
391
- r["run.json"]["execution_outcome"] = "AWAITING_APPROVAL"
392
- r["run.json"]["phase"] = "AWAITING_APPROVAL"
393
- }, "views/review.html is required while awaiting approval"},
394
- {"ineligible coverage without reason", func(f *fixture, r map[string]J) {
395
- r["coverage.json"]["files"] = L{J{"path": "src/a.py", "eligible": false}}
396
- }, "coverage src/a.py: ineligible without an exclusion reason"},
397
- {"finding without domain", func(f *fixture, r map[string]J) { delete(finding(r), "domain") }, "finding F-1: domain must be one of"},
398
- {"confirmed finding without controls", func(f *fixture, r map[string]J) { delete(finding(r), "controls") },
399
- "finding F-1: a confirmed finding names the rubric controls it fails"},
400
- {"finding with unknown control", func(f *fixture, r map[string]J) { finding(r)["controls"] = L{"C-9"} }, "finding F-1: unknown control C-9"},
401
- {"open finding with passing control", func(f *fixture, r map[string]J) {
402
- r["results-candidate.json"] = J{"schema": "overhaul.results/1", "results": J{"C-1": J{"status": "PASS"}}}
403
- }, "finding F-1: control C-1 is PASS in results-candidate.json while the finding is confirmed"},
404
- {"critical-high gate against open finding", func(f *fixture, r map[string]J) {
405
- scorecard(r, J{"G-NO-CRITICAL-HIGH": "PASS"})
406
- }, "G-NO-CRITICAL-HIGH is PASS but finding F-1 is confirmed high"},
407
- {"serious-lead gate against open lead", func(f *fixture, r map[string]J) {
408
- r["findings.json"]["findings"] = append(r["findings.json"]["findings"].(L), J{"id": "F-2", "fingerprint": "fp-2",
409
- "kind": "defect", "scope_origin": "pre-existing", "status": "candidate", "domain": "security",
410
- "potential_impact": "critical", "history": L{J{"status": "candidate"}}})
411
- scorecard(r, J{"G-NO-OPEN-SERIOUS-LEAD": "PASS"})
412
- }, "G-NO-OPEN-SERIOUS-LEAD is PASS but lead F-2 is open with potential impact critical"},
413
- {"coverage gate without matrix", func(f *fixture, r map[string]J) { scorecard(r, J{"G-COVERAGE": "PASS"}) },
414
- "G-COVERAGE is PASS without an applicability matrix"},
415
- {"coverage gate with blocked cell", func(f *fixture, r map[string]J) {
416
- reviewed(f, r, "blocked")
417
- scorecard(r, J{"G-COVERAGE": "PASS"})
418
- }, "applicability ['correctness', 'api', 'backend'] is blocked"},
419
- {"coverage gate with unchecked domain", func(f *fixture, r map[string]J) {
420
- reviewed(f, r, "applicable")
421
- cell(r)["receipts"] = L{"receipts/R-1.json"}
422
- scorecard(r, J{"G-COVERAGE": "PASS"})
423
- }, "no admitted, non-gap receipt of applicability ['correctness', 'api', 'backend'] lists correctness in domains_checked"},
424
- {"coverage gate with unreviewed range", func(f *fixture, r map[string]J) {
425
- reviewed(f, r, "applicable")
426
- r["coverage.json"]["files"] = L{J{"path": "src/a.py", "eligible": true, "ranges": L{J{"start": 1, "end": 1, "state": "tool-scanned"}}}}
427
- scorecard(r, J{"G-COVERAGE": "PASS"})
428
- }, "eligible file src/a.py has unreviewed ranges"},
429
- {"coverage gate with rejected receipt", func(f *fixture, r map[string]J) {
430
- reviewed(f, r, "applicable")
431
- attempts(r)[len(attempts(r))-1].(J)["status"] = "rejected"
432
- scorecard(r, J{"G-COVERAGE": "PASS"})
433
- }, "no admitted, non-gap receipt of applicability"},
434
- {"coverage gate with gap receipt", func(f *fixture, r map[string]J) {
435
- reviewed(f, r, "applicable")
436
- write(f.t, filepath.Join(f.run, "receipts/R-dom.json"), J{"outcome": "gap", "domains_checked": L{"correctness"}})
437
- scorecard(r, J{"G-COVERAGE": "PASS"})
438
- }, "no admitted, non-gap receipt of applicability"},
439
- {"coverage gate counts empty files", func(f *fixture, r map[string]J) {
440
- reviewed(f, r, "applicable")
441
- r["coverage.json"]["files"] = L{J{"path": "src/a.py", "eligible": true, "lines": 0}}
442
- scorecard(r, J{"G-COVERAGE": "PASS"})
443
- }, ""},
444
- {"coverage gate backed by records", func(f *fixture, r map[string]J) {
445
- reviewed(f, r, "applicable")
446
- scorecard(r, J{"G-COVERAGE": "PASS"})
447
- }, ""},
448
- {"unknown applicability state", func(f *fixture, r map[string]J) {
449
- reviewed(f, r, "maybe")
450
- }, "state must be applicable, not-applicable or blocked"},
451
- {"not-applicable cell without reason", func(f *fixture, r map[string]J) {
452
- reviewed(f, r, "not-applicable")
453
- delete(cell(r), "reason")
454
- }, "not-applicable needs a reason"},
455
- {"unknown range state", func(f *fixture, r map[string]J) {
456
- r["coverage.json"]["files"] = L{J{"path": "src/a.py", "eligible": true, "ranges": L{J{"start": 1, "end": 1, "state": "done"}}}}
457
- }, "range state 'done' is not a coverage state"},
458
- }
459
- for _, c := range cases {
460
- t.Run(c.name, func(t *testing.T) {
461
- f := newFixture(t)
462
- r := f.records()
463
- c.mutate(f, r)
464
- publish := func() (int, string) { return f.publish(r, nil) }
465
- if c.want == "" {
466
- publish = func() (int, string) { return f.publishRendered(r) }
467
- }
468
- code, out := publish()
469
- if c.want == "" {
470
- if code != 0 {
471
- t.Fatalf("want publish ok, got %d:\n%s", code, out)
472
- }
473
- return
474
- }
475
- if code != 1 || !strings.Contains(out, "VIOLATION: ") || !strings.Contains(out, c.want) {
476
- t.Fatalf("want exit 1 with %q, got %d:\n%s", c.want, code, out)
477
- }
478
- })
479
- }
480
- }
481
-
482
- func TestCrossGenerationRules(t *testing.T) {
483
- cases := []struct {
484
- name string
485
- mutate func(f *fixture, r map[string]J)
486
- want string
487
- }{
488
- {"cycles append-only", func(f *fixture, r map[string]J) { r["cycles.json"]["cycles"] = L{J{"n": 2}} }, "cycles.json is append-only"},
489
- {"cycles may grow", func(f *fixture, r map[string]J) {
490
- r["cycles.json"]["cycles"] = L{J{"n": 1}, J{"n": 2}}
491
- }, ""},
492
- {"finding removed", func(f *fixture, r map[string]J) { r["findings.json"]["findings"] = L{} }, "finding F-1: removed or history rewritten"},
493
- {"history rewritten", func(f *fixture, r map[string]J) {
494
- finding(r)["history"] = L{J{"status": "candidate", "reason": "edited"}, J{"status": "confirmed"}}
495
- }, "finding F-1: removed or history rewritten"},
496
- {"severity change without history", func(f *fixture, r map[string]J) { finding(r)["severity"] = "medium" }, "severity or kind changed without a history entry"},
497
- {"severity change with history", func(f *fixture, r map[string]J) {
498
- finding(r)["severity"] = "medium"
499
- finding(r)["history"] = L{J{"status": "candidate"}, J{"status": "confirmed"}, J{"status": "confirmed", "reason": "re-assessed"}}
500
- }, ""},
501
- {"approval events append-only", func(f *fixture, r map[string]J) { approval(r)["quote"] = "something else" }, "approval.json events are append-only"},
502
- {"approval status may change", func(f *fixture, r map[string]J) { approval(r)["status"] = "revoked" }, ""},
503
- {"immutable revision changed", func(f *fixture, r map[string]J) {
504
- write(f.t, filepath.Join(f.run, "revisions/rubric-r1.json"), J{"schema": "overhaul.rubric/1", "rev": 1, "controls": L{}})
505
- }, "immutable revision changed: revisions/rubric-r1.json"},
506
- {"run_id pinned", func(f *fixture, r map[string]J) { r["run.json"]["run_id"] = "run-2" }, "run_id changed"},
507
- {"mode pinned", func(f *fixture, r map[string]J) { r["run.json"]["mode"] = "pr" }, "mode changed"},
508
- {"repo_root pinned", func(f *fixture, r map[string]J) {
509
- r["run.json"]["repo_root"] = filepath.Join(f.repo, "src")
510
- }, "repo_root changed"},
511
- {"assessment_only pinned", func(f *fixture, r map[string]J) {
512
- r["run.json"]["assessment_only"] = true
513
- approval(r)["status"] = "revoked"
514
- r["dispatch.json"]["attempts"] = L{}
515
- }, "assessment_only changed"},
516
- {"coverage denominator shrank", func(f *fixture, r map[string]J) { r["coverage.json"]["files"] = L{} }, "coverage denominator shrank: ['src/a.py']"},
517
- {"coverage exclusion keeps denominator", func(f *fixture, r map[string]J) {
518
- r["coverage.json"]["files"] = L{J{"path": "src/a.py", "eligible": false, "exclusion": J{"reason": "generated"}}}
519
- }, ""},
520
- }
521
- for _, c := range cases {
522
- t.Run(c.name, func(t *testing.T) {
523
- f := newFixture(t)
524
- f.mustPublish(f.records())
525
- r := f.records()
526
- c.mutate(f, r)
527
- code, out := f.publish(r, nil)
528
- if c.want == "" {
529
- if code != 0 {
530
- t.Fatalf("want publish ok, got %d:\n%s", code, out)
531
- }
532
- return
533
- }
534
- if code != 1 || !strings.Contains(out, c.want) {
535
- t.Fatalf("want exit 1 with %q, got %d:\n%s", c.want, code, out)
536
- }
537
- })
538
- }
539
- }
540
-
541
- func TestStaleStage(t *testing.T) {
542
- f := newFixture(t)
543
- f.mustPublish(f.records())
544
- if code, _, errs := f.cmd("stage", f.run); code != 0 {
545
- t.Fatal(errs)
546
- }
547
- write(t, filepath.Join(f.run, "CURRENT"), "g0000\n")
548
- code, _, errs := f.cmd("publish", f.run)
549
- if code != 1 || !strings.Contains(errs, "stale stage: CURRENT moved from g0001 to g0000") {
550
- t.Fatalf("got %d %s", code, errs)
551
- }
552
- if code, _, errs := f.cmd("stage", f.run); code != 2 || !strings.Contains(errs, "g0001 exists but CURRENT is g0000: interrupted publish") {
553
- t.Fatalf("restage: %d %s", code, errs)
554
- }
555
- }
556
-
557
- func TestStageCopiesWithoutViewsOrManifest(t *testing.T) {
558
- f := newFixture(t)
559
- stamp := "overhaul-stamp run=run-1 generation=g0001 plan=r1:" + digest(t, filepath.Join(f.run, "revisions/plan-r1.json"))
560
- if code, out := f.publish(f.records(), map[string]string{"views/review.md": "# Review\n" + stamp + "\n"}); code != 0 {
561
- t.Fatal(out)
562
- }
563
- code, out, errs := f.cmd("stage", f.run)
564
- if code != 0 {
565
- t.Fatal(errs)
566
- }
567
- tmp := strings.TrimSpace(out)
568
- if filepath.Clean(tmp) != filepath.Join(f.run, "g0002.tmp") {
569
- t.Fatalf("stage path %q", tmp)
570
- }
571
- base, _ := os.ReadFile(filepath.Join(tmp, ".base"))
572
- if string(base) != "g0001" || isDir(filepath.Join(tmp, "views")) || isFile(filepath.Join(tmp, "manifest.json")) || !isFile(filepath.Join(tmp, "run.json")) {
573
- t.Fatalf("bad stage contents (base %q)", base)
574
- }
575
- if code, _, errs := f.cmd("stage", f.run); code != 2 || !strings.Contains(errs, "staged generation already exists") {
576
- t.Fatalf("double stage: %d %s", code, errs)
577
- }
578
- }
579
-
580
- func TestTamperedGenerationDetected(t *testing.T) {
581
- f := newFixture(t)
582
- f.mustPublish(f.records())
583
- p := filepath.Join(f.run, "g0001/cycles.json")
584
- b, _ := os.ReadFile(p)
585
- write(t, p, string(b)+" ")
586
- code, out, _ := f.cmd("validate", f.run)
587
- if code != 1 || !strings.Contains(out, "VIOLATION: mixed or modified generation: cycles.json does not match manifest") {
588
- t.Fatalf("got %d %s", code, out)
589
- }
590
- }
591
-
592
- func TestViewStamp(t *testing.T) {
593
- f := newFixture(t)
594
- code, out := f.publish(f.records(), map[string]string{"views/review.md": "overhaul-stamp run=run-1 generation=g0000 plan=none\n"})
595
- if code != 1 || !strings.Contains(out, "view review.md: stamp does not match this generation") {
596
- t.Fatalf("got %d %s", code, out)
597
- }
598
- }
599
-
600
- // Views from the renderer must carry the stamp this validator expects.
601
- func TestRenderedViewsPassValidation(t *testing.T) {
602
- f := newFixture(t)
603
- code, out, errs := f.cmd("stage", f.run)
604
- if code != 0 {
605
- t.Fatalf("stage: %d %s", code, errs)
606
- }
607
- tmp := strings.TrimSpace(out)
608
- for name, doc := range f.records() {
609
- write(t, filepath.Join(tmp, name), doc)
610
- }
611
- for _, kind := range []string{"review", "report"} {
612
- var o, e bytes.Buffer
613
- if c := render.Run([]string{f.run, tmp, kind}, &o, &e); c != 0 {
614
- t.Fatalf("render %s: %d %s", kind, c, e.String())
615
- }
616
- }
617
- if code, out, errs := f.cmd("publish", f.run); code != 0 {
618
- t.Fatalf("publish: %d %s%s", code, out, errs)
619
- }
620
- }
621
-
622
- func TestInterruptedPublish(t *testing.T) {
623
- f := newFixture(t)
624
- f.mustPublish(f.records())
625
- if err := os.Mkdir(filepath.Join(f.run, "g0002"), 0o755); err != nil {
626
- t.Fatal(err)
627
- }
628
- code, _, errs := f.cmd("stage", f.run)
629
- if code != 2 || !strings.Contains(errs, "interrupted publish") {
630
- t.Fatalf("stage: %d %s", code, errs)
631
- }
632
- code, out, _ := f.cmd("validate", f.run)
633
- if code != 0 || !strings.Contains(out, "NOTE: g0002 is newer than CURRENT") || !strings.Contains(out, "valid g0001") {
634
- t.Fatalf("validate: %d %s", code, out)
635
- }
636
- }
637
-
638
- func TestPublishNeedsExactlyOneStage(t *testing.T) {
639
- f := newFixture(t)
640
- if err := os.MkdirAll(filepath.Join(f.run, "revisions"), 0o755); err != nil {
641
- t.Fatal(err)
642
- }
643
- code, _, errs := f.cmd("publish", f.run)
644
- if code != 2 || !strings.Contains(errs, "expected exactly one staged generation, found []") {
645
- t.Fatalf("got %d %s", code, errs)
646
- }
647
- }
648
-
649
- func TestBadPath(t *testing.T) {
650
- repo := t.TempDir()
651
- outside := t.TempDir()
652
- write(t, filepath.Join(repo, "src/a.py"), "x\n")
653
- write(t, filepath.Join(outside, "secret.py"), "x\n")
654
- if err := os.Symlink(filepath.Join(outside, "secret.py"), filepath.Join(repo, "src/out.py")); err != nil {
655
- t.Fatal(err)
656
- }
657
- cases := []struct {
658
- path any
659
- want string
660
- }{
661
- {"src/a.py", ""},
662
- {"src/new.py", ""},
663
- {"app/blog/[slug]/page.tsx", ""},
664
- {"src/*.py", "not an exact relative file path"},
665
- {"src/a?.py", "not an exact relative file path"},
666
- {"/etc/passwd", "not an exact relative file path"},
667
- {"src/", "not an exact relative file path"},
668
- {"", "not an exact relative file path"},
669
- {json.Number("3"), "not an exact relative file path"},
670
- {"../x.py", "not normalized or escapes the repository"},
671
- {"src/../src/a.py", "not normalized or escapes the repository"},
672
- {"./src/a.py", "not normalized or escapes the repository"},
673
- {"src", "names a directory or git metadata"},
674
- {".git/config", "names a directory or git metadata"},
675
- {".devrites/overhaul/r1/g0001/run.json", "names the overhaul run area"},
676
- {"src/.git/HEAD", "names a directory or git metadata"},
677
- {"src/out.py", "resolves outside the repository (symlink or traversal)"},
678
- }
679
- for _, c := range cases {
680
- if got := BadPath(c.path, repo); got != c.want {
681
- t.Errorf("BadPath(%v) = %q, want %q", c.path, got, c.want)
682
- }
683
- }
684
- }
685
-
686
- func TestRepr(t *testing.T) {
687
- cases := map[string]any{
688
- "None": nil, "True": true, "'a'": "a", `"it's"`: "it's", "['a', 'b']": L{"a", "b"},
689
- "3": json.Number("3"), `'a\\b'`: `a\b`,
690
- }
691
- for want, v := range cases {
692
- if got := Repr(v); got != want {
693
- t.Errorf("Repr(%v) = %s, want %s", v, got, want)
694
- }
695
- }
696
- }