devrites 6.0.4 → 6.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (800) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/README.md +24 -9
  3. package/SECURITY.md +9 -6
  4. package/bin/devrites.mjs +28 -12
  5. package/docs/adr/0035-claude-root-leaves-plan-mode.md +33 -0
  6. package/docs/adr/0036-archive-recall-is-a-read-time-query.md +32 -0
  7. package/docs/adr/README.md +4 -2
  8. package/docs/architecture.md +3 -1
  9. package/docs/cli.md +25 -2
  10. package/docs/command-map.md +10 -8
  11. package/docs/engine/commands.md +6 -3
  12. package/docs/harness-compliance.md +2 -2
  13. package/docs/orchestration.md +5 -4
  14. package/docs/release.md +4 -4
  15. package/docs/skills.md +2 -2
  16. package/engine/commands.go +1 -1
  17. package/engine/help.go +10 -6
  18. package/engine/internal/acceptance/cli.go +4 -1
  19. package/engine/internal/acceptance/exec.go +11 -11
  20. package/engine/internal/devritespaths/paths.go +5 -0
  21. package/engine/internal/hostpack/hostpack.go +48 -3
  22. package/engine/internal/install/apply.go +68 -1
  23. package/engine/internal/install/binary.go +4 -0
  24. package/engine/internal/install/install.go +25 -15
  25. package/engine/internal/install/merge.go +287 -123
  26. package/engine/internal/install/preflight.go +71 -1
  27. package/engine/internal/install/uninstall.go +7 -1
  28. package/engine/internal/install/update.go +7 -3
  29. package/engine/internal/lib/claims.go +30 -14
  30. package/engine/internal/lib/cli_observe.go +6 -0
  31. package/engine/internal/lib/context.go +24 -7
  32. package/engine/internal/lib/diffscope.go +79 -3
  33. package/engine/internal/lib/dispatch.go +34 -7
  34. package/engine/internal/lib/drift.go +9 -2
  35. package/engine/internal/lib/handoff.go +14 -5
  36. package/engine/internal/lib/metrics.go +29 -9
  37. package/engine/internal/lib/migrate.go +30 -12
  38. package/engine/internal/lib/next.go +22 -2
  39. package/engine/internal/lib/open_visual.go +3 -1
  40. package/engine/internal/lib/recall.go +355 -0
  41. package/engine/internal/lib/regression.go +20 -0
  42. package/engine/internal/lib/resolve.go +96 -53
  43. package/engine/internal/lib/secretscan.go +24 -1
  44. package/engine/internal/lib/taskgraph.go +31 -1
  45. package/engine/internal/lib/util.go +18 -7
  46. package/engine/internal/lib/windows.go +68 -15
  47. package/engine/internal/markdowntext/markdowntext.go +45 -6
  48. package/engine/internal/notes/cli.go +5 -3
  49. package/engine/internal/notes/notes.go +8 -3
  50. package/engine/internal/overhaul/admit/run.go +16 -12
  51. package/engine/internal/overhaul/overhaul.go +1 -0
  52. package/engine/internal/overhaul/records/check.go +52 -9
  53. package/engine/internal/overhaul/render/run.go +3 -2
  54. package/engine/internal/overhaul/snapshot/run.go +2 -2
  55. package/engine/internal/parallel/git.go +5 -6
  56. package/engine/internal/parallel/ops.go +3 -0
  57. package/engine/internal/parallel/pathdisjoint.go +9 -4
  58. package/engine/internal/release/release.go +11 -9
  59. package/engine/internal/safepath/safepath.go +17 -1
  60. package/engine/internal/state/budgets.go +8 -4
  61. package/engine/internal/state/feature.go +3 -1
  62. package/engine/internal/state/observation.go +12 -7
  63. package/engine/internal/state/taskgraph.go +67 -12
  64. package/engine/internal/state/write.go +7 -1
  65. package/engine/main.go +5 -1
  66. package/pack/.claude/agents/_shared/composition-overhaul.md +2 -0
  67. package/pack/.claude/agents/devrites-devex-reviewer.md +5 -0
  68. package/pack/.claude/agents/devrites-evidence-scout.md +4 -0
  69. package/pack/.claude/agents/devrites-plan-reviewer.md +4 -1
  70. package/pack/.claude/agents/overhaul-implementer.md +1 -0
  71. package/pack/.claude/settings.json +4 -4
  72. package/pack/.claude/skills/devrites-api-interface/SKILL.md +1 -1
  73. package/pack/.claude/skills/devrites-audit/SKILL.md +1 -1
  74. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +1 -1
  75. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +8 -6
  76. package/pack/.claude/skills/devrites-doubt/SKILL.md +1 -1
  77. package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +1 -1
  78. package/pack/.claude/skills/devrites-interview/SKILL.md +1 -1
  79. package/pack/.claude/skills/devrites-lib/reference/intent-map.md +3 -3
  80. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -3
  81. package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +12 -15
  82. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +30 -10
  83. package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  84. package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
  85. package/pack/.claude/skills/devrites-lib/reference/standards/core.md +1 -1
  86. package/pack/.claude/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  87. package/pack/.claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  88. package/pack/.claude/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  89. package/pack/.claude/skills/devrites-lib/reference/standards/one-shot-actions.md +7 -6
  90. package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +2 -0
  91. package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  92. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +13 -0
  93. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -6
  94. package/pack/.claude/skills/devrites-prose-craft/SKILL.md +1 -1
  95. package/pack/.claude/skills/devrites-source-driven/SKILL.md +1 -1
  96. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +1 -1
  97. package/pack/.claude/skills/overhaul/references/orchestration.md +6 -2
  98. package/pack/.claude/skills/overhaul/references/records.md +8 -3
  99. package/pack/.claude/skills/rite/SKILL.md +4 -3
  100. package/pack/.claude/skills/rite/reference/menu.md +6 -5
  101. package/pack/.claude/skills/rite-adopt/SKILL.md +4 -3
  102. package/pack/.claude/skills/rite-autocomplete/SKILL.md +17 -14
  103. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +9 -6
  104. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
  105. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +6 -3
  106. package/pack/.claude/skills/rite-build/reference/parallel-batch.md +5 -5
  107. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +19 -0
  108. package/pack/.claude/skills/rite-converge/SKILL.md +4 -3
  109. package/pack/.claude/skills/rite-customize/SKILL.md +1 -1
  110. package/pack/.claude/skills/rite-define/SKILL.md +3 -2
  111. package/pack/.claude/skills/rite-doctor/SKILL.md +12 -6
  112. package/pack/.claude/skills/rite-dogfood/SKILL.md +2 -2
  113. package/pack/.claude/skills/rite-explain/SKILL.md +1 -1
  114. package/pack/.claude/skills/rite-fast/SKILL.md +3 -1
  115. package/pack/.claude/skills/rite-handoff/SKILL.md +4 -3
  116. package/pack/.claude/skills/rite-learn/SKILL.md +2 -2
  117. package/pack/.claude/skills/rite-plan/SKILL.md +1 -1
  118. package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +2 -0
  119. package/pack/.claude/skills/rite-plan/reference/slicing.md +3 -1
  120. package/pack/.claude/skills/rite-pov/SKILL.md +1 -1
  121. package/pack/.claude/skills/rite-pr-feedback/SKILL.md +5 -4
  122. package/pack/.claude/skills/rite-pressure-test/SKILL.md +7 -5
  123. package/pack/.claude/skills/rite-prototype/SKILL.md +1 -1
  124. package/pack/.claude/skills/rite-prove/SKILL.md +4 -2
  125. package/pack/.claude/skills/rite-prove/reference/failure-triage.md +2 -1
  126. package/pack/.claude/skills/rite-quick/SKILL.md +10 -5
  127. package/pack/.claude/skills/rite-resolve/SKILL.md +3 -3
  128. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +4 -5
  129. package/pack/.claude/skills/rite-review/SKILL.md +2 -1
  130. package/pack/.claude/skills/rite-seal/SKILL.md +3 -3
  131. package/pack/.claude/skills/rite-seal/reference/go-no-go.md +2 -0
  132. package/pack/.claude/skills/rite-seal/reference/seal-template.md +5 -2
  133. package/pack/.claude/skills/rite-ship/reference/close-out.md +3 -2
  134. package/pack/.claude/skills/rite-spec/SKILL.md +4 -1
  135. package/pack/.claude/skills/rite-spec/reference/state-workspace.md +2 -2
  136. package/pack/.claude/skills/rite-status/SKILL.md +1 -1
  137. package/pack/.claude/skills/rite-temper/reference/significance.md +2 -0
  138. package/pack/.claude/skills/rite-upgrade/SKILL.md +4 -2
  139. package/pack/.claude/skills/rite-vet/SKILL.md +3 -2
  140. package/pack/.claude/skills/rite-vet/reference/artifacts.md +1 -1
  141. package/pack/.claude/skills/rite-watch-pr/SKILL.md +1 -1
  142. package/pack/.claude/skills/rite-zoom-out/SKILL.md +1 -1
  143. package/pack/generated/claude/agents/devrites-devex-reviewer.md +5 -0
  144. package/pack/generated/claude/agents/devrites-evidence-scout.md +4 -0
  145. package/pack/generated/claude/agents/devrites-plan-reviewer.md +4 -1
  146. package/pack/generated/claude/agents/overhaul-backend-engineer.md +2 -0
  147. package/pack/generated/claude/agents/overhaul-boundary.md +2 -0
  148. package/pack/generated/claude/agents/overhaul-craft.md +2 -0
  149. package/pack/generated/claude/agents/overhaul-frontend-engineer.md +2 -0
  150. package/pack/generated/claude/agents/overhaul-implementer.md +3 -0
  151. package/pack/generated/claude/agents/overhaul-recon.md +2 -0
  152. package/pack/generated/claude/agents/overhaul-specialist.md +2 -0
  153. package/pack/generated/claude/agents/overhaul-verifier.md +2 -0
  154. package/pack/generated/claude/settings.json +4 -4
  155. package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +1 -1
  156. package/pack/generated/claude/skills/devrites-audit/SKILL.md +1 -1
  157. package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +1 -1
  158. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +8 -6
  159. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +1 -1
  160. package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +1 -1
  161. package/pack/generated/claude/skills/devrites-interview/SKILL.md +1 -1
  162. package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +3 -3
  163. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -3
  164. package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +12 -15
  165. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +30 -10
  166. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  167. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
  168. package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +1 -1
  169. package/pack/generated/claude/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  170. package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  171. package/pack/generated/claude/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  172. package/pack/generated/claude/skills/devrites-lib/reference/standards/one-shot-actions.md +7 -6
  173. package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +2 -0
  174. package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  175. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +13 -0
  176. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +10 -6
  177. package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +1 -1
  178. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +1 -1
  179. package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +1 -1
  180. package/pack/generated/claude/skills/overhaul/references/orchestration.md +6 -2
  181. package/pack/generated/claude/skills/overhaul/references/records.md +8 -3
  182. package/pack/generated/claude/skills/rite/SKILL.md +4 -3
  183. package/pack/generated/claude/skills/rite/reference/menu.md +6 -5
  184. package/pack/generated/claude/skills/rite-adopt/SKILL.md +4 -3
  185. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +17 -14
  186. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +9 -6
  187. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
  188. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +6 -3
  189. package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +5 -5
  190. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +19 -0
  191. package/pack/generated/claude/skills/rite-converge/SKILL.md +4 -3
  192. package/pack/generated/claude/skills/rite-customize/SKILL.md +1 -1
  193. package/pack/generated/claude/skills/rite-define/SKILL.md +3 -2
  194. package/pack/generated/claude/skills/rite-doctor/SKILL.md +12 -6
  195. package/pack/generated/claude/skills/rite-dogfood/SKILL.md +2 -2
  196. package/pack/generated/claude/skills/rite-explain/SKILL.md +1 -1
  197. package/pack/generated/claude/skills/rite-fast/SKILL.md +3 -1
  198. package/pack/generated/claude/skills/rite-handoff/SKILL.md +4 -3
  199. package/pack/generated/claude/skills/rite-learn/SKILL.md +2 -2
  200. package/pack/generated/claude/skills/rite-plan/SKILL.md +1 -1
  201. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +2 -0
  202. package/pack/generated/claude/skills/rite-plan/reference/slicing.md +3 -1
  203. package/pack/generated/claude/skills/rite-pov/SKILL.md +1 -1
  204. package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +5 -4
  205. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +7 -5
  206. package/pack/generated/claude/skills/rite-prototype/SKILL.md +1 -1
  207. package/pack/generated/claude/skills/rite-prove/SKILL.md +4 -2
  208. package/pack/generated/claude/skills/rite-prove/reference/failure-triage.md +2 -1
  209. package/pack/generated/claude/skills/rite-quick/SKILL.md +10 -5
  210. package/pack/generated/claude/skills/rite-resolve/SKILL.md +3 -3
  211. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +4 -5
  212. package/pack/generated/claude/skills/rite-review/SKILL.md +2 -1
  213. package/pack/generated/claude/skills/rite-seal/SKILL.md +3 -3
  214. package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +2 -0
  215. package/pack/generated/claude/skills/rite-seal/reference/seal-template.md +5 -2
  216. package/pack/generated/claude/skills/rite-ship/reference/close-out.md +3 -2
  217. package/pack/generated/claude/skills/rite-spec/SKILL.md +4 -1
  218. package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +2 -2
  219. package/pack/generated/claude/skills/rite-status/SKILL.md +1 -1
  220. package/pack/generated/claude/skills/rite-temper/reference/significance.md +2 -0
  221. package/pack/generated/claude/skills/rite-upgrade/SKILL.md +4 -2
  222. package/pack/generated/claude/skills/rite-vet/SKILL.md +3 -2
  223. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +1 -1
  224. package/pack/generated/claude/skills/rite-watch-pr/SKILL.md +1 -1
  225. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +1 -1
  226. package/pack/generated/codex/agents/devrites-code-reviewer.toml +7 -7
  227. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +6 -1
  228. package/pack/generated/codex/agents/devrites-evidence-scout.toml +4 -0
  229. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +1 -1
  230. package/pack/generated/codex/agents/devrites-plan-drafter.toml +3 -3
  231. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +5 -2
  232. package/pack/generated/codex/agents/devrites-proof-runner.toml +2 -2
  233. package/pack/generated/codex/agents/devrites-security-auditor.toml +1 -1
  234. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +1 -1
  235. package/pack/generated/codex/agents/devrites-slice-wright.toml +5 -5
  236. package/pack/generated/codex/agents/devrites-test-analyst.toml +5 -5
  237. package/pack/generated/codex/agents/devrites-upgrade-planner.toml +1 -1
  238. package/pack/generated/codex/agents/fast-builder.toml +3 -3
  239. package/pack/generated/codex/agents/fast-critic.toml +3 -3
  240. package/pack/generated/codex/agents/overhaul-backend-engineer.toml +2 -0
  241. package/pack/generated/codex/agents/overhaul-boundary.toml +2 -0
  242. package/pack/generated/codex/agents/overhaul-craft.toml +2 -0
  243. package/pack/generated/codex/agents/overhaul-frontend-engineer.toml +2 -0
  244. package/pack/generated/codex/agents/overhaul-implementer.toml +2 -0
  245. package/pack/generated/codex/agents/overhaul-recon.toml +2 -0
  246. package/pack/generated/codex/agents/overhaul-specialist.toml +2 -0
  247. package/pack/generated/codex/agents/overhaul-verifier.toml +2 -0
  248. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +1 -1
  249. package/pack/generated/codex/skills/devrites-audit/SKILL.md +1 -1
  250. package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +1 -1
  251. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +8 -6
  252. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +1 -1
  253. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +1 -1
  254. package/pack/generated/codex/skills/devrites-interview/SKILL.md +1 -1
  255. package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +3 -3
  256. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  257. package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +12 -15
  258. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +30 -10
  259. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +1 -1
  260. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  261. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +1 -1
  262. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +2 -2
  263. package/pack/generated/codex/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  264. package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  265. package/pack/generated/codex/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  266. package/pack/generated/codex/skills/devrites-lib/reference/standards/one-shot-actions.md +7 -6
  267. package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +2 -0
  268. package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  269. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +13 -0
  270. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  271. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +1 -1
  272. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +1 -1
  273. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +1 -1
  274. package/pack/generated/codex/skills/overhaul/SKILL.md +15 -15
  275. package/pack/generated/codex/skills/overhaul/references/audit-domains.md +2 -2
  276. package/pack/generated/codex/skills/overhaul/references/orchestration.md +11 -7
  277. package/pack/generated/codex/skills/overhaul/references/records.md +8 -3
  278. package/pack/generated/codex/skills/rite/SKILL.md +4 -3
  279. package/pack/generated/codex/skills/rite/reference/menu.md +6 -5
  280. package/pack/generated/codex/skills/rite-adopt/SKILL.md +4 -3
  281. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +18 -15
  282. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +9 -6
  283. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
  284. package/pack/generated/codex/skills/rite-build/SKILL.md +2 -2
  285. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +6 -3
  286. package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +6 -6
  287. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +20 -1
  288. package/pack/generated/codex/skills/rite-clarify/SKILL.md +1 -1
  289. package/pack/generated/codex/skills/rite-converge/SKILL.md +5 -4
  290. package/pack/generated/codex/skills/rite-customize/SKILL.md +1 -1
  291. package/pack/generated/codex/skills/rite-define/SKILL.md +4 -3
  292. package/pack/generated/codex/skills/rite-doctor/SKILL.md +12 -6
  293. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +2 -2
  294. package/pack/generated/codex/skills/rite-explain/SKILL.md +1 -1
  295. package/pack/generated/codex/skills/rite-fast/SKILL.md +8 -6
  296. package/pack/generated/codex/skills/rite-frame/SKILL.md +1 -1
  297. package/pack/generated/codex/skills/rite-handoff/SKILL.md +4 -3
  298. package/pack/generated/codex/skills/rite-learn/SKILL.md +2 -2
  299. package/pack/generated/codex/skills/rite-plan/SKILL.md +2 -2
  300. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +2 -0
  301. package/pack/generated/codex/skills/rite-plan/reference/slicing.md +3 -1
  302. package/pack/generated/codex/skills/rite-polish/SKILL.md +2 -2
  303. package/pack/generated/codex/skills/rite-pov/SKILL.md +1 -1
  304. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +5 -4
  305. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +7 -5
  306. package/pack/generated/codex/skills/rite-prototype/SKILL.md +1 -1
  307. package/pack/generated/codex/skills/rite-prove/SKILL.md +5 -3
  308. package/pack/generated/codex/skills/rite-prove/reference/failure-triage.md +2 -1
  309. package/pack/generated/codex/skills/rite-quick/SKILL.md +11 -6
  310. package/pack/generated/codex/skills/rite-resolve/SKILL.md +3 -3
  311. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +4 -5
  312. package/pack/generated/codex/skills/rite-review/SKILL.md +3 -2
  313. package/pack/generated/codex/skills/rite-seal/SKILL.md +4 -4
  314. package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +2 -0
  315. package/pack/generated/codex/skills/rite-seal/reference/seal-template.md +5 -2
  316. package/pack/generated/codex/skills/rite-ship/SKILL.md +1 -1
  317. package/pack/generated/codex/skills/rite-ship/reference/close-out.md +3 -2
  318. package/pack/generated/codex/skills/rite-spec/SKILL.md +5 -2
  319. package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +2 -2
  320. package/pack/generated/codex/skills/rite-status/SKILL.md +1 -1
  321. package/pack/generated/codex/skills/rite-temper/SKILL.md +2 -2
  322. package/pack/generated/codex/skills/rite-temper/reference/significance.md +2 -0
  323. package/pack/generated/codex/skills/rite-upgrade/SKILL.md +4 -2
  324. package/pack/generated/codex/skills/rite-vet/SKILL.md +4 -3
  325. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +1 -1
  326. package/pack/generated/codex/skills/rite-watch-pr/SKILL.md +1 -1
  327. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +1 -1
  328. package/pack/generated/devin/AGENTS.md +1 -1
  329. package/pack/generated/devin/agents/devrites-devex-reviewer.md +5 -0
  330. package/pack/generated/devin/agents/devrites-evidence-scout.md +4 -0
  331. package/pack/generated/devin/agents/devrites-plan-reviewer.md +4 -1
  332. package/pack/generated/devin/agents/overhaul-backend-engineer.md +2 -0
  333. package/pack/generated/devin/agents/overhaul-boundary.md +2 -0
  334. package/pack/generated/devin/agents/overhaul-craft.md +2 -0
  335. package/pack/generated/devin/agents/overhaul-frontend-engineer.md +2 -0
  336. package/pack/generated/devin/agents/overhaul-implementer.md +2 -0
  337. package/pack/generated/devin/agents/overhaul-recon.md +2 -0
  338. package/pack/generated/devin/agents/overhaul-specialist.md +2 -0
  339. package/pack/generated/devin/agents/overhaul-verifier.md +2 -0
  340. package/pack/generated/devin/skills/devrites-api-interface/SKILL.md +1 -1
  341. package/pack/generated/devin/skills/devrites-audit/SKILL.md +1 -1
  342. package/pack/generated/devin/skills/devrites-browser-proof/SKILL.md +1 -1
  343. package/pack/generated/devin/skills/devrites-debug-recovery/SKILL.md +8 -6
  344. package/pack/generated/devin/skills/devrites-doubt/SKILL.md +1 -1
  345. package/pack/generated/devin/skills/devrites-frontend-craft/SKILL.md +1 -1
  346. package/pack/generated/devin/skills/devrites-interview/SKILL.md +2 -2
  347. package/pack/generated/devin/skills/devrites-lib/reference/intent-map.md +3 -3
  348. package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  349. package/pack/generated/devin/skills/devrites-lib/reference/reply-contract.md +12 -15
  350. package/pack/generated/devin/skills/devrites-lib/reference/standards/afk-hitl.md +33 -13
  351. package/pack/generated/devin/skills/devrites-lib/reference/standards/agents.md +1 -1
  352. package/pack/generated/devin/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  353. package/pack/generated/devin/skills/devrites-lib/reference/standards/code-review.md +1 -1
  354. package/pack/generated/devin/skills/devrites-lib/reference/standards/core.md +2 -2
  355. package/pack/generated/devin/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  356. package/pack/generated/devin/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  357. package/pack/generated/devin/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  358. package/pack/generated/devin/skills/devrites-lib/reference/standards/one-shot-actions.md +7 -6
  359. package/pack/generated/devin/skills/devrites-lib/reference/standards/performance.md +2 -0
  360. package/pack/generated/devin/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  361. package/pack/generated/devin/skills/devrites-lib/reference/standards/testing.md +13 -0
  362. package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  363. package/pack/generated/devin/skills/devrites-prose-craft/SKILL.md +1 -1
  364. package/pack/generated/devin/skills/devrites-source-driven/SKILL.md +1 -1
  365. package/pack/generated/devin/skills/devrites-ux-shape/SKILL.md +1 -1
  366. package/pack/generated/devin/skills/overhaul/SKILL.md +15 -15
  367. package/pack/generated/devin/skills/overhaul/references/audit-domains.md +2 -2
  368. package/pack/generated/devin/skills/overhaul/references/orchestration.md +11 -7
  369. package/pack/generated/devin/skills/overhaul/references/records.md +8 -3
  370. package/pack/generated/devin/skills/rite/SKILL.md +4 -3
  371. package/pack/generated/devin/skills/rite/reference/menu.md +6 -5
  372. package/pack/generated/devin/skills/rite-adopt/SKILL.md +4 -3
  373. package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +19 -16
  374. package/pack/generated/devin/skills/rite-autocomplete/reference/decision-policy.md +1 -1
  375. package/pack/generated/devin/skills/rite-autocomplete/reference/loop.md +9 -6
  376. package/pack/generated/devin/skills/rite-autocomplete/reference/stop-conditions.md +26 -22
  377. package/pack/generated/devin/skills/rite-build/SKILL.md +2 -2
  378. package/pack/generated/devin/skills/rite-build/reference/afk-discipline.md +6 -3
  379. package/pack/generated/devin/skills/rite-build/reference/checkpoint-protocol.md +2 -2
  380. package/pack/generated/devin/skills/rite-build/reference/parallel-batch.md +6 -6
  381. package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +20 -1
  382. package/pack/generated/devin/skills/rite-clarify/SKILL.md +1 -1
  383. package/pack/generated/devin/skills/rite-converge/SKILL.md +5 -4
  384. package/pack/generated/devin/skills/rite-customize/SKILL.md +1 -1
  385. package/pack/generated/devin/skills/rite-define/SKILL.md +4 -3
  386. package/pack/generated/devin/skills/rite-doctor/SKILL.md +12 -6
  387. package/pack/generated/devin/skills/rite-dogfood/SKILL.md +2 -2
  388. package/pack/generated/devin/skills/rite-explain/SKILL.md +3 -3
  389. package/pack/generated/devin/skills/rite-explain/reference/intake.md +1 -1
  390. package/pack/generated/devin/skills/rite-fast/SKILL.md +8 -6
  391. package/pack/generated/devin/skills/rite-frame/SKILL.md +1 -1
  392. package/pack/generated/devin/skills/rite-handoff/SKILL.md +4 -3
  393. package/pack/generated/devin/skills/rite-learn/SKILL.md +2 -2
  394. package/pack/generated/devin/skills/rite-plan/SKILL.md +2 -2
  395. package/pack/generated/devin/skills/rite-plan/reference/replan-and-repair.md +2 -0
  396. package/pack/generated/devin/skills/rite-plan/reference/slicing.md +3 -1
  397. package/pack/generated/devin/skills/rite-polish/SKILL.md +2 -2
  398. package/pack/generated/devin/skills/rite-pov/SKILL.md +1 -1
  399. package/pack/generated/devin/skills/rite-pr-feedback/SKILL.md +5 -4
  400. package/pack/generated/devin/skills/rite-pressure-test/SKILL.md +7 -5
  401. package/pack/generated/devin/skills/rite-prototype/SKILL.md +1 -1
  402. package/pack/generated/devin/skills/rite-prove/SKILL.md +5 -3
  403. package/pack/generated/devin/skills/rite-prove/reference/failure-triage.md +2 -1
  404. package/pack/generated/devin/skills/rite-quick/SKILL.md +11 -6
  405. package/pack/generated/devin/skills/rite-resolve/SKILL.md +4 -4
  406. package/pack/generated/devin/skills/rite-resolve/reference/answer-protocol.md +4 -5
  407. package/pack/generated/devin/skills/rite-review/SKILL.md +3 -2
  408. package/pack/generated/devin/skills/rite-seal/SKILL.md +4 -4
  409. package/pack/generated/devin/skills/rite-seal/reference/go-no-go.md +2 -0
  410. package/pack/generated/devin/skills/rite-seal/reference/seal-template.md +5 -2
  411. package/pack/generated/devin/skills/rite-ship/SKILL.md +1 -1
  412. package/pack/generated/devin/skills/rite-ship/reference/close-out.md +3 -2
  413. package/pack/generated/devin/skills/rite-spec/SKILL.md +5 -2
  414. package/pack/generated/devin/skills/rite-spec/reference/investigation.md +1 -1
  415. package/pack/generated/devin/skills/rite-spec/reference/state-workspace.md +2 -2
  416. package/pack/generated/devin/skills/rite-status/SKILL.md +1 -1
  417. package/pack/generated/devin/skills/rite-temper/SKILL.md +3 -3
  418. package/pack/generated/devin/skills/rite-temper/reference/scope-modes.md +1 -1
  419. package/pack/generated/devin/skills/rite-temper/reference/significance.md +3 -1
  420. package/pack/generated/devin/skills/rite-upgrade/SKILL.md +4 -2
  421. package/pack/generated/devin/skills/rite-vet/SKILL.md +4 -3
  422. package/pack/generated/devin/skills/rite-vet/reference/artifacts.md +1 -1
  423. package/pack/generated/devin/skills/rite-vet/reference/review-axes.md +2 -2
  424. package/pack/generated/devin/skills/rite-watch-pr/SKILL.md +1 -1
  425. package/pack/generated/devin/skills/rite-zoom-out/SKILL.md +1 -1
  426. package/pack/generated/omp/agents/devrites-code-reviewer.md +7 -7
  427. package/pack/generated/omp/agents/devrites-devex-reviewer.md +6 -1
  428. package/pack/generated/omp/agents/devrites-evidence-scout.md +4 -0
  429. package/pack/generated/omp/agents/devrites-frontend-reviewer.md +1 -1
  430. package/pack/generated/omp/agents/devrites-plan-drafter.md +3 -3
  431. package/pack/generated/omp/agents/devrites-plan-reviewer.md +5 -2
  432. package/pack/generated/omp/agents/devrites-proof-runner.md +2 -2
  433. package/pack/generated/omp/agents/devrites-security-auditor.md +1 -1
  434. package/pack/generated/omp/agents/devrites-simplifier-reviewer.md +1 -1
  435. package/pack/generated/omp/agents/devrites-slice-wright.md +5 -5
  436. package/pack/generated/omp/agents/devrites-test-analyst.md +5 -5
  437. package/pack/generated/omp/agents/devrites-upgrade-planner.md +1 -1
  438. package/pack/generated/omp/agents/fast-builder.md +3 -3
  439. package/pack/generated/omp/agents/fast-critic.md +3 -3
  440. package/pack/generated/omp/agents/overhaul-backend-engineer.md +2 -0
  441. package/pack/generated/omp/agents/overhaul-boundary.md +2 -0
  442. package/pack/generated/omp/agents/overhaul-craft.md +2 -0
  443. package/pack/generated/omp/agents/overhaul-frontend-engineer.md +2 -0
  444. package/pack/generated/omp/agents/overhaul-implementer.md +2 -0
  445. package/pack/generated/omp/agents/overhaul-recon.md +2 -0
  446. package/pack/generated/omp/agents/overhaul-specialist.md +2 -0
  447. package/pack/generated/omp/agents/overhaul-verifier.md +2 -0
  448. package/pack/generated/omp/commands/rite-resolve.md +1 -1
  449. package/pack/generated/omp/skills/devrites-api-interface/SKILL.md +4 -4
  450. package/pack/generated/omp/skills/devrites-audit/SKILL.md +5 -5
  451. package/pack/generated/omp/skills/devrites-browser-proof/SKILL.md +5 -5
  452. package/pack/generated/omp/skills/devrites-browser-proof/reference/browser-performance.md +1 -1
  453. package/pack/generated/omp/skills/devrites-browser-proof/reference/visual-verdict.md +1 -1
  454. package/pack/generated/omp/skills/devrites-debug-recovery/SKILL.md +12 -10
  455. package/pack/generated/omp/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +1 -1
  456. package/pack/generated/omp/skills/devrites-doubt/SKILL.md +6 -6
  457. package/pack/generated/omp/skills/devrites-frontend-craft/SKILL.md +3 -3
  458. package/pack/generated/omp/skills/devrites-frontend-craft/reference/craft.md +1 -1
  459. package/pack/generated/omp/skills/devrites-frontend-craft/reference/design-references.md +4 -4
  460. package/pack/generated/omp/skills/devrites-frontend-craft/reference/fullstack.md +1 -1
  461. package/pack/generated/omp/skills/devrites-frontend-craft/reference/quality-standards.md +8 -8
  462. package/pack/generated/omp/skills/devrites-frontend-craft/reference/reuse-first.md +2 -2
  463. package/pack/generated/omp/skills/devrites-frontend-craft/reference/shape.md +2 -2
  464. package/pack/generated/omp/skills/devrites-interview/SKILL.md +3 -3
  465. package/pack/generated/omp/skills/devrites-lib/reference/intent-map.md +4 -4
  466. package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +8 -7
  467. package/pack/generated/omp/skills/devrites-lib/reference/reply-contract.md +12 -15
  468. package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +38 -18
  469. package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +6 -6
  470. package/pack/generated/omp/skills/devrites-lib/reference/standards/browser-proof-checklist.md +2 -2
  471. package/pack/generated/omp/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  472. package/pack/generated/omp/skills/devrites-lib/reference/standards/code-review.md +3 -3
  473. package/pack/generated/omp/skills/devrites-lib/reference/standards/coding-style.md +1 -1
  474. package/pack/generated/omp/skills/devrites-lib/reference/standards/context-hygiene.md +2 -2
  475. package/pack/generated/omp/skills/devrites-lib/reference/standards/core.md +4 -4
  476. package/pack/generated/omp/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  477. package/pack/generated/omp/skills/devrites-lib/reference/standards/debug-recovery.md +1 -1
  478. package/pack/generated/omp/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
  479. package/pack/generated/omp/skills/devrites-lib/reference/standards/developer-experience.md +8 -3
  480. package/pack/generated/omp/skills/devrites-lib/reference/standards/glossary.md +3 -3
  481. package/pack/generated/omp/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  482. package/pack/generated/omp/skills/devrites-lib/reference/standards/one-shot-actions.md +7 -6
  483. package/pack/generated/omp/skills/devrites-lib/reference/standards/performance.md +3 -1
  484. package/pack/generated/omp/skills/devrites-lib/reference/standards/prose-style.md +4 -4
  485. package/pack/generated/omp/skills/devrites-lib/reference/standards/release/ship-checklist.md +1 -1
  486. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/README.md +1 -1
  487. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/ci-workflows.md +1 -1
  488. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/react.md +1 -1
  489. package/pack/generated/omp/skills/devrites-lib/reference/standards/review/stack-profile.md +5 -5
  490. package/pack/generated/omp/skills/devrites-lib/reference/standards/skill-authoring.md +15 -3
  491. package/pack/generated/omp/skills/devrites-lib/reference/standards/spec-grammar.md +3 -3
  492. package/pack/generated/omp/skills/devrites-lib/reference/standards/testing.md +14 -1
  493. package/pack/generated/omp/skills/devrites-lib/reference/standards/tooling.md +1 -1
  494. package/pack/generated/omp/skills/devrites-lib/reference/standards/verification-methods.md +1 -1
  495. package/pack/generated/omp/skills/devrites-lib/reference/visual-playbooks/index.md +2 -2
  496. package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +12 -8
  497. package/pack/generated/omp/skills/devrites-prose-craft/SKILL.md +4 -4
  498. package/pack/generated/omp/skills/devrites-prose-craft/reference/examples.md +1 -1
  499. package/pack/generated/omp/skills/devrites-source-driven/SKILL.md +3 -3
  500. package/pack/generated/omp/skills/devrites-ux-shape/SKILL.md +10 -10
  501. package/pack/generated/omp/skills/devrites-ux-shape/reference/brief-template.md +3 -3
  502. package/pack/generated/omp/skills/devrites-ux-shape/reference/visual-direction-probe.md +1 -1
  503. package/pack/generated/omp/skills/overhaul/references/orchestration.md +6 -2
  504. package/pack/generated/omp/skills/overhaul/references/records.md +8 -3
  505. package/pack/generated/omp/skills/rite/SKILL.md +8 -7
  506. package/pack/generated/omp/skills/rite/reference/menu.md +6 -5
  507. package/pack/generated/omp/skills/rite-adopt/SKILL.md +6 -5
  508. package/pack/generated/omp/skills/rite-adopt/reference/anti-patterns.md +1 -1
  509. package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +22 -19
  510. package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +1 -1
  511. package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +11 -8
  512. package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
  513. package/pack/generated/omp/skills/rite-build/SKILL.md +7 -7
  514. package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +7 -4
  515. package/pack/generated/omp/skills/rite-build/reference/anti-patterns.md +1 -1
  516. package/pack/generated/omp/skills/rite-build/reference/checkpoint-protocol.md +2 -2
  517. package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +2 -2
  518. package/pack/generated/omp/skills/rite-build/reference/frontend-trigger.md +1 -1
  519. package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +9 -9
  520. package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +6 -6
  521. package/pack/generated/omp/skills/rite-build/reference/tdd.md +1 -1
  522. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +27 -8
  523. package/pack/generated/omp/skills/rite-clarify/SKILL.md +4 -4
  524. package/pack/generated/omp/skills/rite-clarify/reference/anti-patterns.md +1 -1
  525. package/pack/generated/omp/skills/rite-converge/SKILL.md +16 -15
  526. package/pack/generated/omp/skills/rite-converge/reference/convergence-assessment.md +4 -4
  527. package/pack/generated/omp/skills/rite-customize/SKILL.md +2 -2
  528. package/pack/generated/omp/skills/rite-define/SKILL.md +25 -24
  529. package/pack/generated/omp/skills/rite-define/reference/anti-patterns.md +2 -2
  530. package/pack/generated/omp/skills/rite-define/reference/gates.md +2 -2
  531. package/pack/generated/omp/skills/rite-doctor/SKILL.md +12 -6
  532. package/pack/generated/omp/skills/rite-dogfood/SKILL.md +5 -5
  533. package/pack/generated/omp/skills/rite-explain/SKILL.md +7 -7
  534. package/pack/generated/omp/skills/rite-explain/reference/intake.md +1 -1
  535. package/pack/generated/omp/skills/rite-fast/SKILL.md +12 -10
  536. package/pack/generated/omp/skills/rite-fast/reference/artifacts.md +1 -1
  537. package/pack/generated/omp/skills/rite-frame/SKILL.md +6 -6
  538. package/pack/generated/omp/skills/rite-frame/reference/failure-modes.md +4 -4
  539. package/pack/generated/omp/skills/rite-handoff/SKILL.md +7 -6
  540. package/pack/generated/omp/skills/rite-learn/SKILL.md +6 -6
  541. package/pack/generated/omp/skills/rite-plan/SKILL.md +9 -9
  542. package/pack/generated/omp/skills/rite-plan/reference/anti-patterns.md +1 -1
  543. package/pack/generated/omp/skills/rite-plan/reference/replan-and-repair.md +3 -1
  544. package/pack/generated/omp/skills/rite-plan/reference/slicing.md +6 -4
  545. package/pack/generated/omp/skills/rite-plan/reference/task-breakdown.md +1 -1
  546. package/pack/generated/omp/skills/rite-polish/SKILL.md +6 -6
  547. package/pack/generated/omp/skills/rite-polish/reference/anti-ai-slop.md +9 -9
  548. package/pack/generated/omp/skills/rite-polish/reference/anti-patterns.md +1 -1
  549. package/pack/generated/omp/skills/rite-polish/reference/backend-polish.md +2 -2
  550. package/pack/generated/omp/skills/rite-polish/reference/browser-polish-evidence.md +1 -1
  551. package/pack/generated/omp/skills/rite-polish/reference/code.md +8 -8
  552. package/pack/generated/omp/skills/rite-polish/reference/design-memory.md +3 -3
  553. package/pack/generated/omp/skills/rite-polish/reference/design-system-discovery.md +1 -1
  554. package/pack/generated/omp/skills/rite-polish/reference/harden-checklist.md +1 -1
  555. package/pack/generated/omp/skills/rite-polish/reference/ledger.md +3 -3
  556. package/pack/generated/omp/skills/rite-polish/reference/ui.md +1 -1
  557. package/pack/generated/omp/skills/rite-pov/SKILL.md +2 -2
  558. package/pack/generated/omp/skills/rite-pr-feedback/SKILL.md +6 -5
  559. package/pack/generated/omp/skills/rite-pressure-test/SKILL.md +9 -7
  560. package/pack/generated/omp/skills/rite-prototype/SKILL.md +1 -1
  561. package/pack/generated/omp/skills/rite-prove/SKILL.md +17 -15
  562. package/pack/generated/omp/skills/rite-prove/reference/acceptance-proof.md +7 -7
  563. package/pack/generated/omp/skills/rite-prove/reference/anti-patterns.md +1 -1
  564. package/pack/generated/omp/skills/rite-prove/reference/browser-proof.md +3 -3
  565. package/pack/generated/omp/skills/rite-prove/reference/failure-triage.md +4 -3
  566. package/pack/generated/omp/skills/rite-quick/SKILL.md +19 -14
  567. package/pack/generated/omp/skills/rite-resolve/SKILL.md +6 -6
  568. package/pack/generated/omp/skills/rite-resolve/reference/answer-protocol.md +4 -5
  569. package/pack/generated/omp/skills/rite-review/SKILL.md +23 -22
  570. package/pack/generated/omp/skills/rite-review/reference/anti-patterns.md +1 -1
  571. package/pack/generated/omp/skills/rite-review/reference/cognitive-load.md +2 -2
  572. package/pack/generated/omp/skills/rite-review/reference/nielsen-heuristics.md +1 -1
  573. package/pack/generated/omp/skills/rite-review/reference/performance-checklist.md +1 -1
  574. package/pack/generated/omp/skills/rite-review/reference/performance-review.md +1 -1
  575. package/pack/generated/omp/skills/rite-review/reference/security-review.md +2 -2
  576. package/pack/generated/omp/skills/rite-seal/SKILL.md +11 -11
  577. package/pack/generated/omp/skills/rite-seal/reference/anti-patterns.md +1 -1
  578. package/pack/generated/omp/skills/rite-seal/reference/final-evidence.md +3 -3
  579. package/pack/generated/omp/skills/rite-seal/reference/go-no-go.md +3 -1
  580. package/pack/generated/omp/skills/rite-seal/reference/output.md +1 -1
  581. package/pack/generated/omp/skills/rite-seal/reference/phase-contract.md +4 -4
  582. package/pack/generated/omp/skills/rite-seal/reference/seal-template.md +5 -2
  583. package/pack/generated/omp/skills/rite-ship/SKILL.md +7 -7
  584. package/pack/generated/omp/skills/rite-ship/reference/anti-patterns.md +1 -1
  585. package/pack/generated/omp/skills/rite-ship/reference/close-out.md +5 -4
  586. package/pack/generated/omp/skills/rite-ship/reference/git-ship.md +2 -2
  587. package/pack/generated/omp/skills/rite-ship/reference/rollout.md +3 -3
  588. package/pack/generated/omp/skills/rite-spec/SKILL.md +17 -14
  589. package/pack/generated/omp/skills/rite-spec/reference/anti-patterns.md +1 -1
  590. package/pack/generated/omp/skills/rite-spec/reference/investigation.md +3 -3
  591. package/pack/generated/omp/skills/rite-spec/reference/question-protocol.md +1 -1
  592. package/pack/generated/omp/skills/rite-spec/reference/spec-template.md +2 -2
  593. package/pack/generated/omp/skills/rite-spec/reference/state-workspace.md +10 -10
  594. package/pack/generated/omp/skills/rite-status/SKILL.md +2 -2
  595. package/pack/generated/omp/skills/rite-temper/SKILL.md +13 -13
  596. package/pack/generated/omp/skills/rite-temper/reference/anti-patterns.md +2 -2
  597. package/pack/generated/omp/skills/rite-temper/reference/review-dimensions.md +3 -3
  598. package/pack/generated/omp/skills/rite-temper/reference/scope-modes.md +3 -3
  599. package/pack/generated/omp/skills/rite-temper/reference/significance.md +4 -2
  600. package/pack/generated/omp/skills/rite-upgrade/SKILL.md +7 -5
  601. package/pack/generated/omp/skills/rite-vet/SKILL.md +14 -13
  602. package/pack/generated/omp/skills/rite-vet/reference/anti-patterns.md +2 -2
  603. package/pack/generated/omp/skills/rite-vet/reference/artifacts.md +3 -3
  604. package/pack/generated/omp/skills/rite-vet/reference/depth.md +3 -3
  605. package/pack/generated/omp/skills/rite-vet/reference/review-axes.md +5 -5
  606. package/pack/generated/omp/skills/rite-watch-pr/SKILL.md +2 -2
  607. package/pack/generated/omp/skills/rite-zoom-out/SKILL.md +1 -1
  608. package/pack/generated/pi/agents/devrites-devex-reviewer.md +5 -0
  609. package/pack/generated/pi/agents/devrites-evidence-scout.md +4 -0
  610. package/pack/generated/pi/agents/devrites-plan-reviewer.md +4 -1
  611. package/pack/generated/pi/agents/overhaul-backend-engineer.md +2 -0
  612. package/pack/generated/pi/agents/overhaul-boundary.md +2 -0
  613. package/pack/generated/pi/agents/overhaul-craft.md +2 -0
  614. package/pack/generated/pi/agents/overhaul-frontend-engineer.md +2 -0
  615. package/pack/generated/pi/agents/overhaul-implementer.md +2 -0
  616. package/pack/generated/pi/agents/overhaul-recon.md +2 -0
  617. package/pack/generated/pi/agents/overhaul-specialist.md +2 -0
  618. package/pack/generated/pi/agents/overhaul-verifier.md +2 -0
  619. package/pack/generated/pi/prompts/rite-resolve.md +1 -1
  620. package/pack/generated/pi/skills/devrites-api-interface/SKILL.md +1 -1
  621. package/pack/generated/pi/skills/devrites-audit/SKILL.md +1 -1
  622. package/pack/generated/pi/skills/devrites-browser-proof/SKILL.md +1 -1
  623. package/pack/generated/pi/skills/devrites-debug-recovery/SKILL.md +8 -6
  624. package/pack/generated/pi/skills/devrites-doubt/SKILL.md +1 -1
  625. package/pack/generated/pi/skills/devrites-frontend-craft/SKILL.md +1 -1
  626. package/pack/generated/pi/skills/devrites-interview/SKILL.md +1 -1
  627. package/pack/generated/pi/skills/devrites-lib/reference/intent-map.md +3 -3
  628. package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +6 -5
  629. package/pack/generated/pi/skills/devrites-lib/reference/reply-contract.md +12 -15
  630. package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +30 -10
  631. package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +1 -1
  632. package/pack/generated/pi/skills/devrites-lib/reference/standards/ci-cd.md +2 -1
  633. package/pack/generated/pi/skills/devrites-lib/reference/standards/code-review.md +1 -1
  634. package/pack/generated/pi/skills/devrites-lib/reference/standards/core.md +2 -2
  635. package/pack/generated/pi/skills/devrites-lib/reference/standards/data-integrity.md +4 -0
  636. package/pack/generated/pi/skills/devrites-lib/reference/standards/developer-experience.md +5 -0
  637. package/pack/generated/pi/skills/devrites-lib/reference/standards/loop-operations.md +3 -0
  638. package/pack/generated/pi/skills/devrites-lib/reference/standards/one-shot-actions.md +7 -6
  639. package/pack/generated/pi/skills/devrites-lib/reference/standards/performance.md +2 -0
  640. package/pack/generated/pi/skills/devrites-lib/reference/standards/skill-authoring.md +13 -1
  641. package/pack/generated/pi/skills/devrites-lib/reference/standards/testing.md +13 -0
  642. package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +11 -7
  643. package/pack/generated/pi/skills/devrites-prose-craft/SKILL.md +1 -1
  644. package/pack/generated/pi/skills/devrites-source-driven/SKILL.md +1 -1
  645. package/pack/generated/pi/skills/devrites-ux-shape/SKILL.md +1 -1
  646. package/pack/generated/pi/skills/overhaul/SKILL.md +15 -15
  647. package/pack/generated/pi/skills/overhaul/references/audit-domains.md +2 -2
  648. package/pack/generated/pi/skills/overhaul/references/orchestration.md +11 -7
  649. package/pack/generated/pi/skills/overhaul/references/records.md +8 -3
  650. package/pack/generated/pi/skills/rite/SKILL.md +4 -3
  651. package/pack/generated/pi/skills/rite/reference/menu.md +6 -5
  652. package/pack/generated/pi/skills/rite-adopt/SKILL.md +4 -3
  653. package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +18 -15
  654. package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +9 -6
  655. package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +25 -21
  656. package/pack/generated/pi/skills/rite-build/SKILL.md +2 -2
  657. package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +6 -3
  658. package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +6 -6
  659. package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +20 -1
  660. package/pack/generated/pi/skills/rite-clarify/SKILL.md +1 -1
  661. package/pack/generated/pi/skills/rite-converge/SKILL.md +5 -4
  662. package/pack/generated/pi/skills/rite-customize/SKILL.md +1 -1
  663. package/pack/generated/pi/skills/rite-define/SKILL.md +4 -3
  664. package/pack/generated/pi/skills/rite-doctor/SKILL.md +12 -6
  665. package/pack/generated/pi/skills/rite-dogfood/SKILL.md +2 -2
  666. package/pack/generated/pi/skills/rite-explain/SKILL.md +1 -1
  667. package/pack/generated/pi/skills/rite-fast/SKILL.md +8 -6
  668. package/pack/generated/pi/skills/rite-frame/SKILL.md +1 -1
  669. package/pack/generated/pi/skills/rite-handoff/SKILL.md +4 -3
  670. package/pack/generated/pi/skills/rite-learn/SKILL.md +2 -2
  671. package/pack/generated/pi/skills/rite-plan/SKILL.md +2 -2
  672. package/pack/generated/pi/skills/rite-plan/reference/replan-and-repair.md +2 -0
  673. package/pack/generated/pi/skills/rite-plan/reference/slicing.md +3 -1
  674. package/pack/generated/pi/skills/rite-polish/SKILL.md +2 -2
  675. package/pack/generated/pi/skills/rite-pov/SKILL.md +1 -1
  676. package/pack/generated/pi/skills/rite-pr-feedback/SKILL.md +5 -4
  677. package/pack/generated/pi/skills/rite-pressure-test/SKILL.md +7 -5
  678. package/pack/generated/pi/skills/rite-prototype/SKILL.md +1 -1
  679. package/pack/generated/pi/skills/rite-prove/SKILL.md +5 -3
  680. package/pack/generated/pi/skills/rite-prove/reference/failure-triage.md +2 -1
  681. package/pack/generated/pi/skills/rite-quick/SKILL.md +11 -6
  682. package/pack/generated/pi/skills/rite-resolve/SKILL.md +3 -3
  683. package/pack/generated/pi/skills/rite-resolve/reference/answer-protocol.md +4 -5
  684. package/pack/generated/pi/skills/rite-review/SKILL.md +3 -2
  685. package/pack/generated/pi/skills/rite-seal/SKILL.md +4 -4
  686. package/pack/generated/pi/skills/rite-seal/reference/go-no-go.md +2 -0
  687. package/pack/generated/pi/skills/rite-seal/reference/seal-template.md +5 -2
  688. package/pack/generated/pi/skills/rite-ship/SKILL.md +1 -1
  689. package/pack/generated/pi/skills/rite-ship/reference/close-out.md +3 -2
  690. package/pack/generated/pi/skills/rite-spec/SKILL.md +5 -2
  691. package/pack/generated/pi/skills/rite-spec/reference/state-workspace.md +2 -2
  692. package/pack/generated/pi/skills/rite-status/SKILL.md +1 -1
  693. package/pack/generated/pi/skills/rite-temper/SKILL.md +2 -2
  694. package/pack/generated/pi/skills/rite-temper/reference/significance.md +2 -0
  695. package/pack/generated/pi/skills/rite-upgrade/SKILL.md +4 -2
  696. package/pack/generated/pi/skills/rite-vet/SKILL.md +4 -3
  697. package/pack/generated/pi/skills/rite-vet/reference/artifacts.md +1 -1
  698. package/pack/generated/pi/skills/rite-watch-pr/SKILL.md +1 -1
  699. package/pack/generated/pi/skills/rite-zoom-out/SKILL.md +1 -1
  700. package/package.json +3 -2
  701. package/scripts/build-host-artifacts.sh +13 -0
  702. package/scripts/codex-generate.sh +5 -1
  703. package/scripts/devin-generate.sh +4 -3
  704. package/scripts/install-lib.sh +5 -0
  705. package/scripts/omp-generate.sh +23 -1
  706. package/scripts/pi-generate.sh +2 -2
  707. package/engine/cmd/releasepack/main_test.go +0 -239
  708. package/engine/harnessmatrix_test.go +0 -46
  709. package/engine/help_test.go +0 -241
  710. package/engine/internal/acceptance/acceptance_test.go +0 -946
  711. package/engine/internal/devritespaths/paths_test.go +0 -128
  712. package/engine/internal/fsutil/copy_test.go +0 -154
  713. package/engine/internal/gate/gate_test.go +0 -865
  714. package/engine/internal/gate/readiness_binding_test.go +0 -443
  715. package/engine/internal/gitenv/env_test.go +0 -48
  716. package/engine/internal/hostpack/hostpack_test.go +0 -269
  717. package/engine/internal/install/install_test.go +0 -1741
  718. package/engine/internal/install/workspace_advisory_test.go +0 -54
  719. package/engine/internal/lib/candidate_test.go +0 -506
  720. package/engine/internal/lib/claims_test.go +0 -267
  721. package/engine/internal/lib/closeout_test.go +0 -266
  722. package/engine/internal/lib/context_next_test.go +0 -912
  723. package/engine/internal/lib/cursor_compat_test.go +0 -65
  724. package/engine/internal/lib/detect_test.go +0 -118
  725. package/engine/internal/lib/drift_test.go +0 -135
  726. package/engine/internal/lib/dup_test.go +0 -666
  727. package/engine/internal/lib/environment_report_test.go +0 -54
  728. package/engine/internal/lib/evidencefresh_test.go +0 -120
  729. package/engine/internal/lib/handoff_test.go +0 -83
  730. package/engine/internal/lib/manifest_union_test.go +0 -251
  731. package/engine/internal/lib/metrics_test.go +0 -28
  732. package/engine/internal/lib/migrate_test.go +0 -213
  733. package/engine/internal/lib/observe_budgets_test.go +0 -428
  734. package/engine/internal/lib/open_visual_test.go +0 -291
  735. package/engine/internal/lib/regression_test.go +0 -282
  736. package/engine/internal/lib/resolve_remediation_test.go +0 -192
  737. package/engine/internal/lib/secretscan_test.go +0 -556
  738. package/engine/internal/lib/slicecheck_test.go +0 -170
  739. package/engine/internal/lib/taskgraph_test.go +0 -353
  740. package/engine/internal/lib/triggers_test.go +0 -23
  741. package/engine/internal/lib/util_test.go +0 -148
  742. package/engine/internal/lib/visual_outline_test.go +0 -189
  743. package/engine/internal/lib/windows_test.go +0 -420
  744. package/engine/internal/lib/workspace_read_test.go +0 -102
  745. package/engine/internal/markdowntext/markdowntext_fuzz_test.go +0 -36
  746. package/engine/internal/markdowntext/markdowntext_test.go +0 -58
  747. package/engine/internal/markdowntext/testdata/structural.json +0 -277
  748. package/engine/internal/notes/notes_test.go +0 -545
  749. package/engine/internal/overhaul/admit/admit_test.go +0 -204
  750. package/engine/internal/overhaul/admit/packet_test.go +0 -223
  751. package/engine/internal/overhaul/bench/run_test.go +0 -316
  752. package/engine/internal/overhaul/ovio/ovio_test.go +0 -75
  753. package/engine/internal/overhaul/packet/packet_test.go +0 -263
  754. package/engine/internal/overhaul/records/init_test.go +0 -96
  755. package/engine/internal/overhaul/records/records_test.go +0 -696
  756. package/engine/internal/overhaul/records/run_test.go +0 -77
  757. package/engine/internal/overhaul/render/run_test.go +0 -928
  758. package/engine/internal/overhaul/score/run_test.go +0 -636
  759. package/engine/internal/overhaul/snapshot/run_test.go +0 -718
  760. package/engine/internal/parallel/cli_test.go +0 -91
  761. package/engine/internal/parallel/ops_test.go +0 -939
  762. package/engine/internal/parallel/parallel_test.go +0 -645
  763. package/engine/internal/parallel/pathdisjoint_fuzz_test.go +0 -43
  764. package/engine/internal/parallel/pathdisjoint_test.go +0 -193
  765. package/engine/internal/parallel/select_test.go +0 -95
  766. package/engine/internal/parallel/testdata/fuzz/FuzzPathDisjoint/a449b81b4711b7b4 +0 -3
  767. package/engine/internal/reason/reason_test.go +0 -37
  768. package/engine/internal/release/release_test.go +0 -181
  769. package/engine/internal/rootfacts/facts_test.go +0 -364
  770. package/engine/internal/safepath/safepath_fuzz_test.go +0 -21
  771. package/engine/internal/safepath/safepath_test.go +0 -69
  772. package/engine/internal/safepath/safepath_windows_test.go +0 -26
  773. package/engine/internal/state/acceptance_test.go +0 -57
  774. package/engine/internal/state/budgets_test.go +0 -135
  775. package/engine/internal/state/cmd/workflowmanifest/main_test.go +0 -96
  776. package/engine/internal/state/concurrency_test.go +0 -184
  777. package/engine/internal/state/cursor_fuzz_test.go +0 -80
  778. package/engine/internal/state/cursor_test.go +0 -276
  779. package/engine/internal/state/observation_test.go +0 -961
  780. package/engine/internal/state/observation_unix_test.go +0 -68
  781. package/engine/internal/state/state_test.go +0 -986
  782. package/engine/internal/state/taskgraph_fuzz_test.go +0 -38
  783. package/engine/internal/state/taskgraph_test.go +0 -43
  784. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/114b28f68c1fa4db +0 -4
  785. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/378a0f2218e812ea +0 -4
  786. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/39eaa26fcb481e3c +0 -4
  787. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/776ca1dc0143acf0 +0 -4
  788. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/9295930c1ebb81df +0 -4
  789. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/a60de309dc33be0d +0 -4
  790. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f04dc7b06ef7c99f +0 -4
  791. package/engine/internal/state/testdata/fuzz/FuzzCursorRoundTrip/f3000ac510878bd6 +0 -4
  792. package/engine/internal/state/testdata/fuzz/FuzzWorkspaceSchemaRow/a75aabb9f2a847d5 +0 -2
  793. package/engine/internal/state/workspaceschema_fuzz_test.go +0 -27
  794. package/engine/internal/state/workspaceschema_test.go +0 -101
  795. package/engine/internal/state/write_test.go +0 -136
  796. package/engine/internal/version/version_test.go +0 -29
  797. package/engine/internal/workflow/commands_test.go +0 -18
  798. package/engine/note_routing_test.go +0 -95
  799. package/engine/observation_contract_test.go +0 -175
  800. package/engine/root_routing_test.go +0 -340
@@ -1,928 +0,0 @@
1
- package render
2
-
3
- import (
4
- "bytes"
5
- "crypto/sha256"
6
- "encoding/base64"
7
- "encoding/json"
8
- "math/big"
9
- "os"
10
- "path/filepath"
11
- "regexp"
12
- "strconv"
13
- "strings"
14
- "testing"
15
-
16
- "github.com/devrites/devrites/internal/overhaul/score"
17
- )
18
-
19
- const (
20
- hostile = "\"><img src=x onerror=alert(1)><script>alert(2)</script>|`rm -rf /`"
21
- hostileEsc = "&quot;&gt;&lt;img src=x onerror=alert(1)&gt;&lt;script&gt;alert(2)&lt;/script&gt;|`rm -rf /`"
22
- fakeHome = "/Users/tester"
23
- badLane = `x"><a href="#p">y</a>`
24
- )
25
-
26
- func writeJSON(t *testing.T, path string, v any) {
27
- t.Helper()
28
- if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
29
- t.Fatal(err)
30
- }
31
- b, err := json.Marshal(v)
32
- if err != nil {
33
- t.Fatal(err)
34
- }
35
- if err := os.WriteFile(path, b, 0o644); err != nil {
36
- t.Fatal(err)
37
- }
38
- }
39
-
40
- type obj = map[string]any
41
-
42
- // fixture builds a run dir and generation; withPlan=false makes an
43
- // assessment-only audit that has a rubric revision but no plan.
44
- func fixture(t *testing.T, withPlan bool) (run, gen string) {
45
- t.Helper()
46
- t.Setenv("HOME", fakeHome)
47
- t.Setenv("USERPROFILE", fakeHome) // os.UserHomeDir on Windows
48
- run = t.TempDir()
49
- gen = filepath.Join(run, "generations", "g0003.tmp")
50
- writeJSON(t, filepath.Join(run, "revisions", "rubric-r1.json"), obj{
51
- "rev": 1,
52
- "domains": obj{"correctness": 1, "security": 1},
53
- "lanes": []any{"backend"},
54
- "controls": []any{
55
- obj{"id": "C-1", "domain": "correctness", "lanes": []any{"backend"}, "weight": 0.1, "hard_gate": true},
56
- obj{"id": "C-2", "domain": "security", "lanes": []any{"backend"}, "weight": 0.2},
57
- },
58
- })
59
- revisions := obj{"rubric": obj{"rev": 1, "file": "revisions/rubric-r1.json"}}
60
- if withPlan {
61
- writeJSON(t, filepath.Join(run, "revisions", "plan-r1.json"), obj{
62
- "rev": 1,
63
- "rubric": obj{"file": "revisions/rubric-r1.json"},
64
- "tasks": []any{
65
- obj{"id": "T-1", "lane": "backend", "findings": []any{"F-1"}, "oracle": "go test ./x", "risk": "low"},
66
- obj{"id": "T-2", "lane": "frontend"},
67
- },
68
- })
69
- revisions["plan"] = obj{"rev": 1, "file": "revisions/plan-r1.json"}
70
- }
71
- writeJSON(t, filepath.Join(gen, "run.json"), obj{
72
- "run_id": "R1", "mode": "repair", "assessment_only": !withPlan, "phase": "review",
73
- "readiness_verdict": "NOT_READY", "execution_outcome": "AWAITING_APPROVAL", "revisions": revisions,
74
- })
75
- writeJSON(t, filepath.Join(gen, "coverage.json"), obj{"files": []any{
76
- obj{"path": fakeHome + "/proj/a.go", "eligible": true, "lanes": []any{"backend"},
77
- "ranges": []any{obj{"start": 1, "end": 9, "state": "verified"}}},
78
- obj{"path": "vendor/x.js", "eligible": false, "exclusion": obj{"reason": hostile}},
79
- }, "applicability": []any{obj{"domain": "operations", "component": "api", "lane": "backend", "state": "blocked",
80
- "reason": "no container runtime"}}})
81
- writeJSON(t, filepath.Join(gen, "findings.json"), obj{"findings": []any{
82
- obj{"id": "F-1", "title": hostile, "kind": "defect", "severity": "high", "status": "confirmed",
83
- "failing_scenario": "nil deref"},
84
- obj{"id": "F-2", "title": "OPP-TITLE", "kind": "opportunity", "status": "confirmed"},
85
- }})
86
- writeJSON(t, filepath.Join(gen, "evidence.json"), obj{"items": []any{}})
87
- writeJSON(t, filepath.Join(gen, "dispatch.json"), obj{"attempts": []any{
88
- obj{"task_id": "T-1", "attempt_id": 1, "lane": "backend", "role": "implementer", "status": "admitted",
89
- "changed_paths": []any{"x/a.go"}},
90
- obj{"task_id": "T-9", "attempt_id": 1, "lane": badLane, "role": "reviewer", "status": "admitted"},
91
- }})
92
- writeJSON(t, filepath.Join(gen, "approval.json"), obj{"events": []any{
93
- obj{"id": "A-1", "kind": "plan", "status": "recorded", "quote": "QUOTE-approve r1"},
94
- }})
95
- writeJSON(t, filepath.Join(gen, "cycles.json"), obj{"cycles": []any{}})
96
- writeJSON(t, filepath.Join(gen, "scorecard.json"), obj{
97
- "readiness_verdict": "NOT_READY",
98
- "status_by_control": obj{"C-1": "FAIL"},
99
- "global": obj{"Q": obj{"exact": "1/2"}, "domains": obj{"correctness": obj{"exact": "5/2"}, "security": obj{"exact": "19/2"}}},
100
- "lanes": obj{"backend": obj{"Q": obj{"exact": "487/50"}, "domains": obj{"correctness": obj{"exact": "1"}, "security": obj{"exact": "10"}}}},
101
- "thresholds": []any{
102
- obj{"scope": "global", "value": obj{"exact": "1/2", "decimal": "0.5"}, "min": "97/10", "result": "FAIL"},
103
- obj{"scope": "lane backend", "value": obj{"exact": "487/50", "decimal": "9.74"}, "min": "97/10", "result": "PASS"},
104
- obj{"scope": "domain correctness", "value": obj{"exact": "5/2"}, "min": "9", "result": "FAIL"},
105
- obj{"scope": "domain security", "value": obj{"exact": "19/2"}, "min": "9", "result": "PASS"},
106
- },
107
- "gates": obj{"G-THRESHOLDS": "FAIL", "G-MANDATORY": "FAIL", "G-COVERAGE": "PASS", "G-ORACLES": "UNKNOWN"},
108
- })
109
- writeJSON(t, filepath.Join(gen, "scorecard-baseline.json"), obj{
110
- "thresholds": []any{obj{"scope": "global", "value": obj{"exact": "1/4"}}},
111
- })
112
- return run, gen
113
- }
114
-
115
- func renderKind(t *testing.T, run, gen, kind string) (string, string) {
116
- t.Helper()
117
- var out, errb bytes.Buffer
118
- if code := Run([]string{run, gen, kind}, &out, &errb); code != 0 {
119
- t.Fatalf("exit %d: %s", code, errb.String())
120
- }
121
- want := filepath.Join(gen, "views", kind+".html")
122
- if strings.TrimSpace(out.String()) != want {
123
- t.Fatalf("printed %q, want %q", out.String(), want)
124
- }
125
- h, err := os.ReadFile(want)
126
- if err != nil {
127
- t.Fatal(err)
128
- }
129
- m, err := os.ReadFile(filepath.Join(gen, "views", kind+".md"))
130
- if err != nil {
131
- t.Fatal(err)
132
- }
133
- return string(h), string(m)
134
- }
135
-
136
- // sectionHTML returns the HTML of one <section id="...">.
137
- func sectionHTML(t *testing.T, page, id string) string {
138
- t.Helper()
139
- i := strings.Index(page, `<section id="`+id+`">`)
140
- if i < 0 {
141
- t.Fatalf("section %q missing", id)
142
- }
143
- s := page[i:]
144
- return s[:strings.Index(s, "</section>")]
145
- }
146
-
147
- // tags returns every markup tag; escaped text never contains a raw '<'.
148
- func tags(page string) []string {
149
- var out []string
150
- for _, part := range strings.Split(page, "<")[1:] {
151
- out = append(out, part[:strings.IndexByte(part, '>')])
152
- }
153
- return out
154
- }
155
-
156
- func TestHostileTextIsInert(t *testing.T) {
157
- run, gen := fixture(t, true)
158
- h, _ := renderKind(t, run, gen, "review")
159
- for _, tag := range tags(h) {
160
- low := strings.ToLower(tag)
161
- if strings.HasPrefix(low, "script") || strings.HasPrefix(low, "img") || strings.Contains(low, "onerror") {
162
- t.Fatalf("live markup injected: <%s>", tag)
163
- }
164
- }
165
- for _, id := range []string{"findings", "coverage"} {
166
- if !strings.Contains(sectionHTML(t, h, id), hostileEsc) {
167
- t.Errorf("escaped hostile text missing in %s", id)
168
- }
169
- }
170
- }
171
-
172
- func TestCSPPinsStylesheetAndNoRemoteURLs(t *testing.T) {
173
- run, gen := fixture(t, true)
174
- h, _ := renderKind(t, run, gen, "review")
175
- style := h[strings.Index(h, "<style>")+len("<style>") : strings.Index(h, "</style>")]
176
- sum := sha256.Sum256([]byte(style))
177
- want := `content="default-src 'none'; style-src 'sha256-` + base64.StdEncoding.EncodeToString(sum[:]) +
178
- `'; img-src data:; base-uri 'none'; form-action 'none'"`
179
- if !strings.Contains(h, want) {
180
- t.Fatal("CSP missing or hash does not match the emitted stylesheet")
181
- }
182
- if strings.Contains(h, "http://") || strings.Contains(h, "https://") || strings.Contains(h, "<script") {
183
- t.Fatal("remote URL or script present")
184
- }
185
- if nt, nc := strings.Count(h, "<table>"), strings.Count(h, "<caption>"); nt == 0 || nt != nc {
186
- t.Fatalf("tables %d captions %d", nt, nc)
187
- }
188
- if strings.Count(h, `<div class="scroll" role="region" tabindex="0"`) != strings.Count(h, "<table>") {
189
- t.Fatal("table outside a focusable scroll region")
190
- }
191
- }
192
-
193
- func TestMarkdownEscapesAndHomeRedacted(t *testing.T) {
194
- run, gen := fixture(t, true)
195
- h, md := renderKind(t, run, gen, "review")
196
- if strings.Contains(md, "<script>") || !strings.Contains(md, "&lt;/script>\\|`rm -rf /`") {
197
- t.Fatal("markdown cell not escaped")
198
- }
199
- for _, page := range []string{h, md} {
200
- if strings.Contains(page, fakeHome) || !strings.Contains(page, "~/proj/a.go") {
201
- t.Fatal("home path not redacted")
202
- }
203
- }
204
- }
205
-
206
- func TestMarkdownCellDropsCarriageReturns(t *testing.T) {
207
- run, gen := fixture(t, true)
208
- var f obj
209
- b, err := os.ReadFile(filepath.Join(gen, "findings.json"))
210
- if err != nil {
211
- t.Fatal(err)
212
- }
213
- if err := json.Unmarshal(b, &f); err != nil {
214
- t.Fatal(err)
215
- }
216
- f["findings"].([]any)[0].(obj)["failing_scenario"] = "line one\r\n# HEADING\r\n```\rlone"
217
- writeJSON(t, filepath.Join(gen, "findings.json"), f)
218
- _, md := renderKind(t, run, gen, "report")
219
- if strings.Contains(md, "\r") {
220
- t.Fatal("markdown cell carries a carriage return")
221
- }
222
- if !strings.Contains(md, "line one # HEADING ``` lone") {
223
- t.Fatal("line breaks not collapsed to single spaces")
224
- }
225
- }
226
-
227
- func TestRowIDsDecisionAndStamp(t *testing.T) {
228
- run, gen := fixture(t, true)
229
- h, md := renderKind(t, run, gen, "review")
230
- // Findings render as expandable rows: the row element carries the finding's anchor.
231
- if !strings.Contains(sectionHTML(t, h, "findings"), `<details id="F-1" class="finding s-high">`) || strings.Count(h, `id="F-1"`) != 1 {
232
- t.Fatal("finding anchor F-1 missing or not unique")
233
- }
234
- if !strings.Contains(sectionHTML(t, h, "plan"), `<details id="T-1" class="task">`) || strings.Count(h, `id="T-1"`) != 1 {
235
- t.Fatal("task anchor T-1 missing or not unique")
236
- }
237
- if strings.Contains(h, `id="nil deref"`) || strings.Contains(h, `id="run_id"`) {
238
- t.Fatal("id on a non-ID first cell")
239
- }
240
- d, f := strings.Index(h, `<section id="decide">`), strings.Index(h, `<section id="findings">`)
241
- if d < 0 || d > f {
242
- t.Fatal("decision section missing or after findings")
243
- }
244
- if !strings.Contains(sectionHTML(t, h, "decide"), `<textarea id="ap" readonly>Approve overhaul R1 plan revision 1, digest `) {
245
- t.Fatal("approval textarea missing")
246
- }
247
- if !strings.HasPrefix(md, "<!-- overhaul-stamp run=R1 generation=g0003 plan=r1:") ||
248
- !strings.Contains(h, "<!-- overhaul-stamp run=R1 generation=g0003 plan=r1:") ||
249
- !strings.Contains(h, `<header class="top"><span class="brand">Overhaul review R1</span><code>overhaul-stamp run=R1 generation=g0003 plan=r1:`) {
250
- t.Fatal("stamp missing")
251
- }
252
- if !strings.Contains(h, `<p role="status"><strong>Outcome AWAITING_APPROVAL · verdict NOT_READY · phase review</strong></p>`) {
253
- t.Fatal("status summary missing")
254
- }
255
- }
256
-
257
- func TestHostileLaneCannotInject(t *testing.T) {
258
- run, gen := fixture(t, true)
259
- h, md := renderKind(t, run, gen, "review")
260
- if strings.Contains(h, `<a href="#p">`) || strings.Contains(md, `<a href="#p">`) {
261
- t.Fatal("lane name injected an anchor")
262
- }
263
- if !strings.Contains(h, `<section id="lane-x---a-href---p--y--a-">`) {
264
- t.Fatal("lane anchor not sanitized")
265
- }
266
- }
267
-
268
- func TestSectionContents(t *testing.T) {
269
- run, gen := fixture(t, true)
270
- h, md := renderKind(t, run, gen, "review")
271
- for _, id := range []string{"findings", "leads", "rejected", "repairs"} {
272
- if strings.Contains(sectionHTML(t, h, id), "OPP-TITLE") {
273
- t.Fatalf("opportunity leaked into %s", id)
274
- }
275
- }
276
- if !strings.Contains(sectionHTML(t, h, "opportunities"), "OPP-TITLE") {
277
- t.Fatal("opportunity missing")
278
- }
279
- if !strings.Contains(md, "| F-1 / T-1 | high, not recorded | nil deref | x/a.go | go test ./x |") {
280
- t.Fatal("repairs join missing")
281
- }
282
- card := sectionHTML(t, h, "scorecard")
283
- if !strings.Contains(card, `<td>global</td><td><span class="muted">not recorded</span></td><td class="n">3/10</td><td class="n">1/4</td><td class="n">1/2</td><td>C-2</td><td>C-1</td>`) {
284
- t.Fatalf("transparent scorecard global row wrong: %s", card)
285
- }
286
- if !strings.Contains(sectionHTML(t, h, "approvals"), "QUOTE-approve r1") {
287
- t.Fatal("approval quote missing")
288
- }
289
- if !strings.Contains(sectionHTML(t, h, "applicability"), "no container runtime") {
290
- t.Fatal("blocked applicability cell missing from the report")
291
- }
292
- }
293
-
294
- func TestPlanMarkdown(t *testing.T) {
295
- run, gen := fixture(t, true)
296
- renderKind(t, run, gen, "review")
297
- b, err := os.ReadFile(filepath.Join(gen, "views", "plan.md"))
298
- if err != nil {
299
- t.Fatal(err)
300
- }
301
- p := string(b)
302
- if !strings.HasPrefix(p, "<!-- overhaul-stamp run=R1 generation=g0003 plan=r1:") ||
303
- !strings.Contains(p, "| T-1 | backend | F-1 |") ||
304
- !strings.Contains(p, "```text\nApprove overhaul R1 plan revision 1, digest ") {
305
- t.Fatalf("plan.md incomplete:\n%s", p)
306
- }
307
- }
308
-
309
- func TestAssessmentOnlyAudit(t *testing.T) {
310
- run, gen := fixture(t, false)
311
- for _, kind := range []string{"review", "report"} {
312
- h, md := renderKind(t, run, gen, kind)
313
- ctl := sectionHTML(t, h, "controls")
314
- if !strings.Contains(ctl, `<tr id="C-1">`) || !strings.Contains(ctl, `<tr id="C-2">`) {
315
- t.Fatal("rubric controls not listed from run.json revisions")
316
- }
317
- if strings.Contains(h+md, "Approve overhaul") || strings.Contains(h, `id="decide"`) {
318
- t.Fatal("assessment-only run shows an approval message")
319
- }
320
- if !strings.Contains(h, "plan=none") {
321
- t.Fatal("stamp should record plan=none")
322
- }
323
- }
324
- if _, err := os.Stat(filepath.Join(gen, "views", "plan.md")); !os.IsNotExist(err) {
325
- t.Fatal("plan.md written without a plan")
326
- }
327
- }
328
-
329
- func TestUsage(t *testing.T) {
330
- var out, errb bytes.Buffer
331
- for _, args := range [][]string{{"run"}, {"run", "gen", "bogus"}} {
332
- if Run(args, &out, &errb) != 2 {
333
- t.Fatalf("%v: want exit 2", args)
334
- }
335
- }
336
- }
337
-
338
- func TestSummaryAnswersFirst(t *testing.T) {
339
- run, gen := fixture(t, true)
340
- h, _ := renderKind(t, run, gen, "review")
341
- i := strings.Index(h, `<header id="summary" class="hero">`)
342
- if i < 0 || i > strings.Index(h, `<section id="gaps">`) || strings.Index(h, `<section id="gaps">`) > strings.Index(h, `<section id="decide">`) {
343
- t.Fatal("summary, then charts, then the decision")
344
- }
345
- hero := h[i : i+strings.Index(h[i:], "</header>")]
346
- for _, want := range []string{
347
- `<h1 class="verdict t-bad">Not ready</h1>`,
348
- `<p class="hero-num">0.50<span> / 10</span></p>`,
349
- `Target 9.70 · 9.20 to go`,
350
- `aria-label="Global score 0.50 of 10, target 9.70"`,
351
- `<span class="lbl">backend</span>`, `<span class="val">9.74</span>`,
352
- // open gates in plain words with their id and status; passing gates counted
353
- `Scores are below their minimums<br><code>G-THRESHOLDS · FAIL</code>`,
354
- `<li class="t-warn"><span class="mark">?</span><span>Regression tests are not proven red then green<br><code>G-ORACLES · UNKNOWN</code>`,
355
- `1 other gate passes.`,
356
- // confirmed findings by severity (the opportunity F-2 is not a finding)
357
- `<h2>1 open finding</h2>`, `<a href="#findings">High</a> <strong>1</strong>`,
358
- `role="img" aria-label="Open findings by severity"><title>Open findings by severity</title>`,
359
- `<a href="#decide">Decide on the repair plan</a> <span class="muted">2 tasks proposed</span>`,
360
- } {
361
- if !strings.Contains(hero, want) {
362
- t.Errorf("summary lacks %s", want)
363
- }
364
- }
365
- if strings.Contains(hero, "Confirmed findings by severity") {
366
- t.Error("severity bar label still says confirmed findings")
367
- }
368
- if !strings.Contains(h, `<span class="pill t-bad">NOT_READY</span></header>`) {
369
- t.Error("top bar verdict pill missing")
370
- }
371
- f := sectionHTML(t, h, "findings")
372
- if !strings.Contains(f, `id="sev-all" checked>`) || !strings.Contains(f, `id="sev-high"`) || strings.Contains(f, `id="sev-critical"`) {
373
- t.Error("severity filter should offer All plus only the severities present")
374
- }
375
- if strings.Contains(sectionHTML(t, h, "opportunities"), `class="filter"`) {
376
- t.Error("opportunities carry no severity filter")
377
- }
378
- if !strings.Contains(h, `<details id="records" class="records">`) || strings.Index(h, `<details id="records"`) > strings.Index(h, `<section id="coverage">`) {
379
- t.Error("record tables belong in the collapsed appendix")
380
- }
381
- // The appendix count names what it counts: sections, not tables, since a
382
- // card-list section emits no <table>. It must equal the sections emitted.
383
- ap := h[strings.Index(h, `<details id="records"`):]
384
- m := regexp.MustCompile(`<summary>All records <span class="count">(\d+) sections</span></summary>`).FindStringSubmatch(ap)
385
- if m == nil {
386
- t.Fatal("appendix summary must count sections")
387
- }
388
- if n := strconv.Itoa(strings.Count(ap, "<section ")); m[1] != n {
389
- t.Errorf("appendix states %s sections but emits %s", m[1], n)
390
- }
391
- }
392
-
393
- // A run scored only at baseline must still show its scores (a real run did not).
394
- func TestSummaryFallsBackToBaselineScorecard(t *testing.T) {
395
- run, gen := fixture(t, true)
396
- if err := os.Remove(filepath.Join(gen, "scorecard.json")); err != nil {
397
- t.Fatal(err)
398
- }
399
- h, _ := renderKind(t, run, gen, "review")
400
- if !strings.Contains(h, `<p class="hero-num">0.25<span> / 10</span></p>`) {
401
- t.Fatal("baseline scorecard not used when no candidate scorecard exists")
402
- }
403
- }
404
-
405
- func TestGapCharts(t *testing.T) {
406
- run, gen := fixture(t, true)
407
- h, _ := renderKind(t, run, gen, "review")
408
- gaps := sectionHTML(t, h, "gaps")
409
- c, s := strings.Index(gaps, `#controls">correctness`), strings.Index(gaps, `#controls">security`)
410
- if c < 0 || s < 0 || c > s {
411
- t.Fatal("gap map lists the worst domain first")
412
- }
413
- for _, want := range []string{
414
- `<td class="cell g2"><span class="val">2.50</span>`, // 6.5 below the 9.0 floor
415
- `<td class="cell g0"><span class="val">9.50</span>`, // meets the floor
416
- `<td class="cell g2"><span class="val">1.00</span>`, // backend correctness: exactly 8 below
417
- `<th scope="col">backend</th>`,
418
- } {
419
- if !strings.Contains(gaps, want) {
420
- t.Errorf("gap map lacks %s", want)
421
- }
422
- }
423
- // A cell with no score is drawn gx and the legend names that bucket.
424
- if strings.Contains(gaps, `class="cell gx"`) {
425
- t.Fatal("control: every fixture cell is scored")
426
- }
427
- b, err := os.ReadFile(filepath.Join(gen, "scorecard.json"))
428
- if err != nil {
429
- t.Fatal(err)
430
- }
431
- var sc obj
432
- if err := json.Unmarshal(b, &sc); err != nil {
433
- t.Fatal(err)
434
- }
435
- delete(sc["lanes"].(obj)["backend"].(obj)["domains"].(obj), "security")
436
- writeJSON(t, filepath.Join(gen, "scorecard.json"), sc)
437
- h, _ = renderKind(t, run, gen, "review")
438
- gaps = sectionHTML(t, h, "gaps")
439
- if !strings.Contains(gaps, `class="cell gx"`) {
440
- t.Fatal("a lane domain without a score should be drawn gx")
441
- }
442
- if !strings.Contains(gaps, `<li><span class="key gx"></span>not scored</li>`) {
443
- t.Error("gap map legend lacks a row for unscored cells")
444
- }
445
- loss := sectionHTML(t, h, "losses")
446
- if !strings.Contains(loss, `1 of 1 failing</span>`) || !strings.Contains(loss, `0 of 1 failing · 1 without evidence</span>`) {
447
- t.Errorf("control split wrong: %s", loss)
448
- }
449
- if !strings.Contains(sectionHTML(t, h, "hotspots"), `<code>(no location)</code>`) {
450
- t.Error("finding without a location missing from hotspots")
451
- }
452
- if !strings.Contains(sectionHTML(t, h, "plan"), `1 of 1</span>`) {
453
- t.Error("plan coverage of the high finding missing")
454
- }
455
- if !strings.Contains(sectionHTML(t, h, "reach"), `all reviewed`) {
456
- t.Error("backend lane coverage missing")
457
- }
458
- // Every chart is an image with a text alternative, and its values are printed too.
459
- if n, m := strings.Count(h, `<svg class="bar"`), strings.Count(h, `role="img" aria-label="`); n == 0 || n != m {
460
- t.Fatalf("charts %d, labelled %d", n, m)
461
- }
462
- }
463
-
464
- func TestGapClassBoundaries(t *testing.T) {
465
- floor := big.NewRat(9, 1)
466
- for val, want := range map[string]string{"9": "g0", "10": "g0", "8.99": "g4", "7": "g4", "6.99": "g3", "4": "g3", "3.99": "g2", "1": "g2", "0.99": "g1", "0": "g1"} {
467
- r, _ := new(big.Rat).SetString(val)
468
- if got := gapClass(r, floor); got != want {
469
- t.Errorf("gapClass(%s) = %s, want %s", val, got, want)
470
- }
471
- }
472
- if gapClass(nil, floor) != "gx" {
473
- t.Error("missing score must not look like a result")
474
- }
475
- }
476
-
477
- func TestArea(t *testing.T) {
478
- for p, want := range map[string]string{"crates/central/src/x.rs": "crates/central", "frontend/x.ts": "frontend",
479
- "README.md": "(repository root)", "/a/b/c": "a/b"} {
480
- if got := area(p); got != want {
481
- t.Errorf("area(%q) = %q, want %q", p, got, want)
482
- }
483
- }
484
- }
485
-
486
- func TestFloor2NeverOverstates(t *testing.T) {
487
- for r, want := range map[*big.Rat]string{big.NewRat(9699, 1000): "9.69", big.NewRat(97, 10): "9.70",
488
- big.NewRat(10, 1): "10.00", big.NewRat(0, 1): "0.00", big.NewRat(1, 3): "0.33"} {
489
- if got := floor2(r); got != want {
490
- t.Errorf("floor2(%s) = %s, want %s", r, got, want)
491
- }
492
- }
493
- }
494
-
495
- // Light is the base (and print) theme; dark applies on screens that prefer it
496
- // and must redefine every colour token.
497
- func TestThemeTokens(t *testing.T) {
498
- tok := regexp.MustCompile(`--[a-z0-9-]+:`)
499
- block := func(start string) string {
500
- i := strings.Index(css, start)
501
- if i < 0 {
502
- t.Fatalf("%q missing", start)
503
- }
504
- s := css[i+len(start):]
505
- return s[:strings.IndexByte(s, '}')]
506
- }
507
- light, dark := block(":root{"), block("@media screen and (prefers-color-scheme:dark){:root{")
508
- if !strings.Contains(light, "color-scheme:light") || !strings.Contains(dark, "color-scheme:dark") {
509
- t.Fatal("color-scheme not declared per theme")
510
- }
511
- darkTok := map[string]bool{}
512
- for _, k := range tok.FindAllString(dark, -1) {
513
- darkTok[k] = true
514
- }
515
- for _, k := range tok.FindAllString(light, -1) {
516
- if k != "--serif:" && k != "--sans:" && k != "--mono:" && !darkTok[k] {
517
- t.Errorf("dark theme does not redefine %s", k)
518
- }
519
- }
520
- for _, k := range []string{"--bg:", "--fg:", "--accent:", "--s-critical:", "--s-high:", "--s-medium:", "--s-low:", "--s-informational:"} {
521
- if !strings.Contains(light, k) || !darkTok[k] {
522
- t.Errorf("token %s missing from a theme", k)
523
- }
524
- }
525
- if strings.Contains(css, "url(") || strings.Contains(css, "@import") || strings.Contains(css, "@font-face") {
526
- t.Error("stylesheet references an external resource")
527
- }
528
- }
529
-
530
- // A threshold minimum that is recorded but cannot be read must be
531
- // reported as unknown. Substituting the renderer's own policy constant prints a
532
- // number the record never held, and the hero then states "met" against it.
533
- func TestUnreadableMinimumIsNotSubstituted(t *testing.T) {
534
- run, gen := fixture(t, true)
535
-
536
- // Control: this run's parseable minimum still drives the hero. Without this
537
- // the assertions below could pass because the page printed nothing.
538
- h, _ := renderKind(t, run, gen, "review")
539
- hero := heroOf(t, h)
540
- if !strings.Contains(hero, `Target 9.70 · 9.20 to go`) {
541
- t.Fatalf("control: a parseable minimum must still print a numeric target, got %s", hero)
542
- }
543
-
544
- // Same run, same score, recorded minimum replaced by one this renderer
545
- // cannot parse ("nine point seven").
546
- b, err := os.ReadFile(filepath.Join(gen, "scorecard.json"))
547
- if err != nil {
548
- t.Fatal(err)
549
- }
550
- var sc obj
551
- if err := json.Unmarshal(b, &sc); err != nil {
552
- t.Fatal(err)
553
- }
554
- sc["thresholds"].([]any)[0].(obj)["min"] = "nine point seven"
555
- writeJSON(t, filepath.Join(gen, "scorecard.json"), sc)
556
-
557
- h, _ = renderKind(t, run, gen, "review")
558
- hero = heroOf(t, h)
559
-
560
- // The hero still reports the score: this is not a page that printed nothing.
561
- if !strings.Contains(hero, `<p class="hero-num">0.50<span> / 10</span></p>`) {
562
- t.Errorf("hero lost its score line: %s", hero)
563
- }
564
- // The unreadable minimum is reported as unknown, in the text and in the
565
- // bar's text alternative.
566
- for _, want := range []string{
567
- `Target not recorded`,
568
- `aria-label="Global score 0.50 of 10, target not recorded"`,
569
- } {
570
- if !strings.Contains(hero, want) {
571
- t.Errorf("hero must report an unreadable minimum as unknown, lacks %s: %s", want, hero)
572
- }
573
- }
574
- // No substituted number is printed as the target.
575
- if m := regexp.MustCompile(`Target\s+[0-9]`).FindString(hero); m != "" {
576
- t.Errorf("hero printed a numeric target %q for an unreadable minimum", m)
577
- }
578
- if m := regexp.MustCompile(`aria-label="Global score [^"]*target [0-9]`).FindString(hero); m != "" {
579
- t.Errorf("global bar labelled with a numeric target %q for an unreadable minimum", m)
580
- }
581
- // The record still shows the raw minimum, so the reader sees what was unread.
582
- if !strings.Contains(h, `nine point seven`) {
583
- t.Error("the scorecard record should still print the raw minimum")
584
- }
585
- }
586
-
587
- func heroOf(t *testing.T, h string) string {
588
- t.Helper()
589
- i := strings.Index(h, `<header id="summary" class="hero">`)
590
- if i < 0 {
591
- t.Fatal("hero missing")
592
- }
593
- return h[i : i+strings.Index(h[i:], "</header>")]
594
- }
595
-
596
- // A scope with no recorded minimum must not borrow the renderer's policy
597
- // constants: the view states the target is unknown and prints no number for it.
598
- func TestAbsentMinimumIsNotSubstituted(t *testing.T) {
599
- run, gen := fixture(t, true)
600
- b, err := os.ReadFile(filepath.Join(gen, "scorecard.json"))
601
- if err != nil {
602
- t.Fatal(err)
603
- }
604
- var sc obj
605
- if err := json.Unmarshal(b, &sc); err != nil {
606
- t.Fatal(err)
607
- }
608
- // The global row loses its min, the lane row is dropped, and the domain
609
- // rows are dropped, so no scope records a minimum.
610
- rows := sc["thresholds"].([]any)
611
- delete(rows[0].(obj), "min")
612
- sc["thresholds"] = rows[:1]
613
- writeJSON(t, filepath.Join(gen, "scorecard.json"), sc)
614
-
615
- h, _ := renderKind(t, run, gen, "review")
616
- hero := heroOf(t, h)
617
- for _, want := range []string{
618
- `<p class="hero-num">0.50<span> / 10</span></p>`,
619
- `Target not recorded`,
620
- `aria-label="Global score 0.50 of 10, target not recorded"`,
621
- } {
622
- if !strings.Contains(hero, want) {
623
- t.Errorf("hero lacks %s: %s", want, hero)
624
- }
625
- }
626
- if m := regexp.MustCompile(`Target\s+[0-9]|target [0-9]`).FindString(hero); m != "" {
627
- t.Errorf("hero printed a substituted target %q: %s", m, hero)
628
- }
629
- gaps := sectionHTML(t, h, "gaps")
630
- if m := regexp.MustCompile(`floor [0-9]`).FindString(gaps); m != "" {
631
- t.Errorf("gap map printed a substituted floor %q", m)
632
- }
633
- if !strings.Contains(gaps, "floor not recorded") {
634
- t.Error("gap map should say the floor is not recorded")
635
- }
636
- // A cell with no floor has no gap to colour: it must not land in a gap bucket.
637
- if m := regexp.MustCompile(`<td class="cell (g[0-4])"`).FindString(gaps); m != "" {
638
- t.Errorf("gap map placed a no-floor cell in a gap bucket: %s", m)
639
- }
640
- if !strings.Contains(gaps, `<td class="cell c-unk">`) {
641
- t.Error("a no-floor cell should render with the neutral unknown class")
642
- }
643
- }
644
-
645
- func renderWithGates(t *testing.T, withPlan bool, gates obj) string {
646
- t.Helper()
647
- run, gen := fixture(t, withPlan)
648
- b, err := os.ReadFile(filepath.Join(gen, "scorecard.json"))
649
- if err != nil {
650
- t.Fatal(err)
651
- }
652
- var sc obj
653
- if err := json.Unmarshal(b, &sc); err != nil {
654
- t.Fatal(err)
655
- }
656
- sc["gates"] = gates
657
- writeJSON(t, filepath.Join(gen, "scorecard.json"), sc)
658
- h, _ := renderKind(t, run, gen, "review")
659
- return heroOf(t, h)
660
- }
661
-
662
- func passing(ids []string) obj {
663
- g := obj{}
664
- for _, id := range ids {
665
- g[id] = "PASS"
666
- }
667
- return g
668
- }
669
-
670
- // A gate record that omits gates must never read as "nothing blocks": every
671
- // gate the run's mode requires and the record lacks is named as not recorded.
672
- func TestIncompleteGateRecordDoesNotClearReadiness(t *testing.T) {
673
- audit, repair := score.GateIDs(false), score.GateIDs(true)
674
- if len(audit) != 10 || len(repair) != 19 {
675
- t.Fatalf("expected 10 audit and 19 remediation gates, got %d and %d", len(audit), len(repair))
676
- }
677
-
678
- // One gate recorded on a remediation run: the other eighteen are named.
679
- hero := renderWithGates(t, true, obj{"G-THRESHOLDS": "PASS"})
680
- if strings.Contains(hero, "Nothing blocks readiness") {
681
- t.Errorf("a one-gate record cleared readiness: %s", hero)
682
- }
683
- for _, id := range repair[1:] {
684
- if !strings.Contains(hero, "<code>"+id+" · NOT_RECORDED</code>") {
685
- t.Errorf("hero does not name the absent gate %s: %s", id, hero)
686
- }
687
- }
688
- if strings.Contains(hero, "<code>G-THRESHOLDS ·") {
689
- t.Errorf("a recorded passing gate was listed as blocking: %s", hero)
690
- }
691
-
692
- // A complete audit scorecard on a remediation run lacks the repair gates.
693
- hero = renderWithGates(t, true, passing(audit))
694
- if strings.Contains(hero, "Nothing blocks readiness") {
695
- t.Errorf("an audit scorecard cleared a remediation run: %s", hero)
696
- }
697
- for _, id := range repair[len(audit):] {
698
- if !strings.Contains(hero, "<code>"+id+" · NOT_RECORDED</code>") {
699
- t.Errorf("hero does not name the absent repair gate %s: %s", id, hero)
700
- }
701
- }
702
- for _, id := range audit {
703
- if strings.Contains(hero, "<code>"+id+" ·") {
704
- t.Errorf("recorded audit gate %s listed as blocking: %s", id, hero)
705
- }
706
- }
707
-
708
- // The same audit scorecard is complete for an assessment-only run, and a
709
- // complete remediation record is complete for a remediation run.
710
- for name, c := range map[string]struct {
711
- plan bool
712
- ids []string
713
- }{"assessment-only audit": {false, audit}, "remediation full": {true, repair}} {
714
- if hero := renderWithGates(t, c.plan, passing(c.ids)); !strings.Contains(hero, "Nothing blocks readiness") {
715
- t.Errorf("%s: a complete passing record should clear readiness: %s", name, hero)
716
- }
717
- }
718
- }
719
-
720
- func readObj(t *testing.T, path string) obj {
721
- t.Helper()
722
- b, err := os.ReadFile(path)
723
- if err != nil {
724
- t.Fatal(err)
725
- }
726
- var m obj
727
- if err := json.Unmarshal(b, &m); err != nil {
728
- t.Fatal(err)
729
- }
730
- return m
731
- }
732
-
733
- // setGates records every gate as PASS except the overrides, plus a verdict.
734
- func setGates(t *testing.T, gen string, over map[string]string, verdict string) {
735
- t.Helper()
736
- g := obj{}
737
- for _, id := range score.GateIDs(true) {
738
- g[id] = "PASS"
739
- }
740
- for k, v := range over {
741
- g[k] = v
742
- }
743
- sc := readObj(t, filepath.Join(gen, "scorecard.json"))
744
- sc["gates"], sc["readiness_verdict"] = g, verdict
745
- writeJSON(t, filepath.Join(gen, "scorecard.json"), sc)
746
- rj := readObj(t, filepath.Join(gen, "run.json"))
747
- rj["readiness_verdict"] = verdict
748
- writeJSON(t, filepath.Join(gen, "run.json"), rj)
749
- }
750
-
751
- func TestExcludedRangeCountsAsReviewed(t *testing.T) {
752
- run, gen := fixture(t, true)
753
- c := readObj(t, filepath.Join(gen, "coverage.json"))
754
- c["files"].([]any)[0].(obj)["ranges"] = []any{obj{"start": 1, "end": 4, "state": "verified"}, obj{"start": 5, "end": 9, "state": "excluded"}}
755
- writeJSON(t, filepath.Join(gen, "coverage.json"), c)
756
- h, md := renderKind(t, run, gen, "report")
757
- if reach := sectionHTML(t, h, "reach"); !strings.Contains(reach, "all reviewed") {
758
- t.Errorf("excluded range shown as open: %s", reach)
759
- }
760
- if strings.Contains(md, "1 / 2") {
761
- t.Errorf("lane coverage lists the excluded range as open")
762
- }
763
- }
764
-
765
- func TestWaivedGateDoesNotBlock(t *testing.T) {
766
- run, gen := fixture(t, true)
767
- setGates(t, gen, map[string]string{"G-CONCURRENCY": "WAIVED_OPERATIONAL"}, "MEETS_TARGETS_WITH_APPROVED_DEGRADATION")
768
- h, _ := renderKind(t, run, gen, "report")
769
- hero := heroOf(t, h)
770
- if strings.Contains(hero, "What blocks readiness") {
771
- t.Errorf("approved waiver listed as blocking: %s", hero)
772
- }
773
- if !strings.Contains(hero, "waived with approval: G-CONCURRENCY") {
774
- t.Errorf("waiver not named: %s", hero)
775
- }
776
- }
777
-
778
- func TestNotApplicableGatesAreNotCountedAsPassing(t *testing.T) {
779
- run, gen := fixture(t, true)
780
- setGates(t, gen, map[string]string{"G-CONCURRENCY": "NOT_APPLICABLE", "G-PERF-TARGETS": "NOT_APPLICABLE", "G-ORACLES": "UNKNOWN"}, "NOT_READY")
781
- h, _ := renderKind(t, run, gen, "report")
782
- hero := heroOf(t, h)
783
- if !strings.Contains(hero, "16 other gates pass · 2 not applicable") {
784
- t.Errorf("blocked hero miscounts not-applicable gates: %s", hero)
785
- }
786
- run, gen = fixture(t, true)
787
- setGates(t, gen, map[string]string{"G-CONCURRENCY": "NOT_APPLICABLE"}, "MEETS_TARGETS")
788
- h, _ = renderKind(t, run, gen, "report")
789
- hero = heroOf(t, h)
790
- if strings.Contains(hero, "All 19 gates pass") || !strings.Contains(hero, "18 gates pass · 1 not applicable") {
791
- t.Errorf("clear hero miscounts not-applicable gates: %s", hero)
792
- }
793
- }
794
-
795
- func TestVerifiedFindingIsNotOpen(t *testing.T) {
796
- run, gen := fixture(t, true)
797
- f := readObj(t, filepath.Join(gen, "findings.json"))
798
- f1 := f["findings"].([]any)[0].(obj)
799
- f1["status"], f1["severity"] = "verified", "critical"
800
- writeJSON(t, filepath.Join(gen, "findings.json"), f)
801
- setGates(t, gen, nil, "MEETS_TARGETS")
802
- h, _ := renderKind(t, run, gen, "report")
803
- i := strings.Index(h, `<div class="strip">`)
804
- strip := h[i : i+strings.Index(h[i:], "</div>")]
805
- if strings.Contains(strip, "confirmed finding") || strings.Contains(strip, "Critical 1") {
806
- t.Errorf("verified finding counted as open: %s", strip)
807
- }
808
- if !strings.Contains(strip, "0 open findings · 1 verified repaired") {
809
- t.Errorf("verified repair not summarised: %s", strip)
810
- }
811
- if strings.Contains(h, `id="hotspots"`) {
812
- t.Errorf("verified finding listed as a hotspot")
813
- }
814
- }
815
-
816
- func TestHotspotAreaRedactsHome(t *testing.T) {
817
- run, gen := fixture(t, true)
818
- f := readObj(t, filepath.Join(gen, "findings.json"))
819
- f["findings"].([]any)[0].(obj)["locations"] = []any{obj{"path": fakeHome + "/proj/a.go"}}
820
- writeJSON(t, filepath.Join(gen, "findings.json"), f)
821
- h, _ := renderKind(t, run, gen, "report")
822
- if hs := sectionHTML(t, h, "hotspots"); strings.Contains(hs, "tester") {
823
- t.Errorf("hotspots leak the home directory: %s", hs)
824
- }
825
- }
826
-
827
- func TestHotspotSplitIsPrinted(t *testing.T) {
828
- run, gen := fixture(t, true)
829
- h, _ := renderKind(t, run, gen, "review")
830
- if hs := sectionHTML(t, h, "hotspots"); !strings.Contains(hs, `High 1</span></li>`) {
831
- t.Errorf("hotspot severity split not printed: %s", hs)
832
- }
833
- }
834
-
835
- func TestLossChartSkipsApprovedNotApplicable(t *testing.T) {
836
- run, gen := fixture(t, true)
837
- p := filepath.Join(run, "revisions", "rubric-r1.json")
838
- r := readObj(t, p)
839
- r["controls"].([]any)[1].(obj)["na"] = obj{"reason": "r", "evidence": "e", "approved": true}
840
- writeJSON(t, p, r)
841
- h, _ := renderKind(t, run, gen, "review")
842
- loss := sectionHTML(t, h, "losses")
843
- if strings.Contains(loss, "without evidence") || strings.Contains(loss, `#controls">security`) {
844
- t.Errorf("approved not-applicable control drawn as missing evidence: %s", loss)
845
- }
846
- if !strings.Contains(loss, `1 of 1 failing</span>`) {
847
- t.Errorf("live control split lost: %s", loss)
848
- }
849
- }
850
-
851
- func TestStylesheetRules(t *testing.T) {
852
- for _, c := range []struct {
853
- name string
854
- want []string
855
- not []string
856
- }{
857
- {"narrow summary reflow", []string{
858
- "@media (max-width:40rem){.finding>summary,.task>summary{grid-template-columns:auto auto minmax(0,1fr)}.ftitle,.finding .where{grid-column:1/-1}}"}, nil},
859
- {"forced colors keep the checked filter and legend swatches", []string{
860
- "@media (forced-colors:active){.filter input:checked+label{forced-color-adjust:none;background:Highlight;color:HighlightText;border-color:Highlight}.key{forced-color-adjust:none}}"}, nil},
861
- {"filter never hides a targeted finding", []string{
862
- ".finding:not(.s-critical):not(:target)", ".finding:not(.s-high):not(:target)", ".finding:not(.s-medium):not(:target)",
863
- ".finding:not(.s-low):not(:target)", ".finding:not(.s-informational):not(:target)"}, nil},
864
- {"filter applies on screen only", []string{"@media screen{#findings:has(#sev-critical:checked)"}, nil},
865
- {"gap legend key is not the unknown colour", []string{
866
- ".key.c-unk{--c:var(--unk)}.key.gx{--c:var(--track);box-shadow:inset 0 0 0 1px var(--muted)}"}, []string{".key.c-unk,.key.gx", ".key.gx{--c:var(--unk)}"}},
867
- {"print keeps a closed appendix closed", []string{
868
- "details::details-content{content-visibility:visible}", "details.records:not([open])::details-content{content-visibility:hidden}"}, nil},
869
- } {
870
- t.Run(c.name, func(t *testing.T) {
871
- for _, s := range c.want {
872
- if !strings.Contains(css, s) {
873
- t.Errorf("stylesheet lacks %q", s)
874
- }
875
- }
876
- for _, s := range c.not {
877
- if strings.Contains(css, s) {
878
- t.Errorf("stylesheet still has %q", s)
879
- }
880
- }
881
- })
882
- }
883
- }
884
-
885
- func TestDisclosureCue(t *testing.T) {
886
- run, gen := fixture(t, true)
887
- h, _ := renderKind(t, run, gen, "review")
888
- for _, s := range []string{".finding[open]>summary .fid::before", ".task[open]>summary .fid::before", ".records[open]>summary::before"} {
889
- if !strings.Contains(h, s) {
890
- t.Errorf("no disclosure cue %q", s)
891
- }
892
- }
893
- }
894
-
895
- func TestHeadingsNest(t *testing.T) {
896
- run, gen := fixture(t, true)
897
- p := filepath.Join(gen, "findings.json")
898
- f := readObj(t, p)
899
- f["findings"].([]any)[0].(obj)["evidence"] = "trace"
900
- f["findings"].([]any)[0].(obj)["actual"] = "panic"
901
- f["findings"].([]any)[0].(obj)["smallest_fix"] = "guard"
902
- writeJSON(t, p, f)
903
- for _, kind := range []string{"review", "report"} {
904
- h, _ := renderKind(t, run, gen, kind)
905
- prev := 0
906
- for _, m := range regexp.MustCompile(`<h([1-6])[ >]`).FindAllStringSubmatch(h, -1) {
907
- lvl, _ := strconv.Atoi(m[1])
908
- if prev > 0 && lvl > prev+1 {
909
- t.Fatalf("%s: heading level jumps from h%d to h%d", kind, prev, lvl)
910
- }
911
- prev = lvl
912
- }
913
- }
914
- }
915
-
916
- func TestAppendixSectionsAreDisclosures(t *testing.T) {
917
- run, gen := fixture(t, true)
918
- h, _ := renderKind(t, run, gen, "report")
919
- i := strings.Index(h, `<details id="records"`)
920
- if i < 0 {
921
- t.Fatal("appendix missing")
922
- }
923
- ap := h[i:]
924
- secs, recs := strings.Count(ap, "<section "), strings.Count(ap, `<details class="rec"><summary>`)
925
- if secs == 0 || secs != recs {
926
- t.Errorf("%d sections, %d rec details", secs, recs)
927
- }
928
- }