devrites 3.0.5 → 3.0.7

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 (744) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +282 -533
  3. package/SECURITY.md +26 -26
  4. package/docs/adr/README.md +7 -9
  5. package/docs/agents/domain.md +5 -5
  6. package/docs/agents/issue-driven-rites.md +1 -1
  7. package/docs/agents/issue-tracker.md +1 -1
  8. package/docs/agents/triage-labels.md +2 -2
  9. package/docs/architecture.md +45 -45
  10. package/docs/cli.md +11 -11
  11. package/docs/command-map.md +33 -33
  12. package/docs/engine/agent-contract.md +6 -6
  13. package/docs/engine/commands.md +66 -65
  14. package/docs/engine/state-schema.md +15 -15
  15. package/docs/engine/workspace-schema.md +7 -7
  16. package/docs/extensions.md +17 -17
  17. package/docs/flow.md +17 -17
  18. package/docs/harness-compliance.md +2 -2
  19. package/docs/orchestration.md +21 -20
  20. package/docs/release.md +22 -5
  21. package/docs/research/go-authoritative-workflow-schema-and-quality-2026-07-20.md +3 -3
  22. package/docs/skills.md +77 -52
  23. package/docs/usage.md +33 -32
  24. package/engine/Makefile +2 -2
  25. package/engine/commands.go +3 -3
  26. package/engine/harnessmatrix.go +2 -2
  27. package/engine/hookpolicy.go +9 -9
  28. package/engine/hooks.go +11 -11
  29. package/engine/hooks_workspace.go +11 -11
  30. package/engine/internal/doctor/doctor.go +7 -7
  31. package/engine/internal/gate/gate.go +11 -11
  32. package/engine/internal/harness/compliance.go +1 -1
  33. package/engine/internal/harness/harness.go +7 -7
  34. package/engine/internal/install/install.go +95 -24
  35. package/engine/internal/install/install_test.go +111 -3
  36. package/engine/internal/iohooks/detach_unix.go +1 -1
  37. package/engine/internal/iohooks/iohooks.go +8 -8
  38. package/engine/internal/lib/adoption.go +1 -1
  39. package/engine/internal/lib/analyze.go +15 -15
  40. package/engine/internal/lib/archivesearch.go +3 -3
  41. package/engine/internal/lib/budget.go +3 -3
  42. package/engine/internal/lib/buildreadiness.go +6 -6
  43. package/engine/internal/lib/checkacceptance.go +10 -10
  44. package/engine/internal/lib/closeout.go +5 -5
  45. package/engine/internal/lib/conventions.go +3 -3
  46. package/engine/internal/lib/coverage.go +4 -4
  47. package/engine/internal/lib/doubtcoverage.go +9 -9
  48. package/engine/internal/lib/evidencefresh.go +6 -6
  49. package/engine/internal/lib/extensions.go +9 -9
  50. package/engine/internal/lib/footprint.go +13 -13
  51. package/engine/internal/lib/jsonout.go +2 -2
  52. package/engine/internal/lib/lanes.go +2 -2
  53. package/engine/internal/lib/learnings.go +9 -9
  54. package/engine/internal/lib/ledger.go +8 -8
  55. package/engine/internal/lib/ledger_test.go +5 -5
  56. package/engine/internal/lib/mutationgate.go +4 -4
  57. package/engine/internal/lib/overrides.go +9 -9
  58. package/engine/internal/lib/overrides_test.go +2 -2
  59. package/engine/internal/lib/packageexistence.go +5 -5
  60. package/engine/internal/lib/preamble.go +6 -6
  61. package/engine/internal/lib/progress.go +5 -5
  62. package/engine/internal/lib/reconcile.go +80 -20
  63. package/engine/internal/lib/reconcile_test.go +13 -5
  64. package/engine/internal/lib/resolve.go +3 -3
  65. package/engine/internal/lib/reviewerstats.go +2 -2
  66. package/engine/internal/lib/reviewintegrity.go +13 -13
  67. package/engine/internal/lib/reviewintegrity_test.go +6 -6
  68. package/engine/internal/lib/runbook.go +1 -1
  69. package/engine/internal/lib/session.go +1 -1
  70. package/engine/internal/lib/session_test.go +2 -2
  71. package/engine/internal/lib/specparse.go +4 -4
  72. package/engine/internal/lib/specskeleton.go +2 -2
  73. package/engine/internal/lib/specvalidate.go +13 -13
  74. package/engine/internal/lib/stuck.go +13 -13
  75. package/engine/internal/lib/templates/conventions_ledger_header.md +1 -1
  76. package/engine/internal/lib/templates/conventions_orient_header.txt +1 -1
  77. package/engine/internal/lib/testintegrity.go +9 -9
  78. package/engine/internal/lib/tickafk.go +4 -4
  79. package/engine/internal/migrate/migrate.go +2 -2
  80. package/engine/internal/migrate/migrate_test.go +1 -0
  81. package/engine/internal/orient/firstrun.go +8 -8
  82. package/engine/internal/orient/orient.go +5 -5
  83. package/engine/internal/state/concurrency_test.go +4 -4
  84. package/engine/internal/state/feature.go +6 -6
  85. package/engine/internal/state/lock_unix.go +1 -1
  86. package/engine/internal/state/schema.go +1 -1
  87. package/engine/internal/state/snapshot.go +2 -2
  88. package/engine/internal/state/write.go +1 -1
  89. package/engine/internal/version/version.go +1 -1
  90. package/engine/main.go +5 -5
  91. package/engine/subagent_orient_context.txt +4 -4
  92. package/engine/testdata/golden/TestParityA1Guard/source-edit-enforce-denies.golden +1 -1
  93. package/engine/testdata/golden/TestParityAnalyze/slug=covered.golden +2 -2
  94. package/engine/testdata/golden/TestParityAnalyze/slug=dangling.golden +3 -3
  95. package/engine/testdata/golden/TestParityAnalyze/slug=noac.golden +2 -2
  96. package/engine/testdata/golden/TestParityAnalyze/slug=order.golden +4 -4
  97. package/engine/testdata/golden/TestParityAnalyze/slug=orphan.golden +3 -3
  98. package/engine/testdata/golden/TestParityAnalyze/slug=uncovered.golden +3 -3
  99. package/engine/testdata/golden/TestParityBudget/extra-md.golden +1 -1
  100. package/engine/testdata/golden/TestParityBudget/over-advisory.golden +1 -1
  101. package/engine/testdata/golden/TestParityBudget/over-strict.golden +1 -1
  102. package/engine/testdata/golden/TestParityBuildReadiness/arg=approved.golden +1 -1
  103. package/engine/testdata/golden/TestParityBuildReadiness/arg=emptystatus.golden +1 -1
  104. package/engine/testdata/golden/TestParityBuildReadiness/arg=trailhash.golden +1 -1
  105. package/engine/testdata/golden/TestParityBuildReadiness/arg=trailpipe.golden +1 -1
  106. package/engine/testdata/golden/TestParityCheckAcceptance/arg=flat-ok.golden +1 -1
  107. package/engine/testdata/golden/TestParityCheckAcceptance/arg=id-ok.golden +1 -1
  108. package/engine/testdata/golden/TestParityCloseOut/active_pointed_elsewhere.golden +1 -1
  109. package/engine/testdata/golden/TestParityCoverage/arg=speconly.golden +2 -2
  110. package/engine/testdata/golden/TestParityCursor/bare.golden +1 -1
  111. package/engine/testdata/golden/TestParityCursor/full-afk.golden +1 -1
  112. package/engine/testdata/golden/TestParityCursor/full-hitl.golden +1 -1
  113. package/engine/testdata/golden/TestParityCursor/red.golden +2 -2
  114. package/engine/testdata/golden/TestParityCursor/zerogates.golden +1 -1
  115. package/engine/testdata/golden/TestParityDoubtCoverage/arg=ghost.golden +1 -1
  116. package/engine/testdata/golden/TestParityDoubtCoverage/arg=inline.golden +1 -1
  117. package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing-inline.golden +1 -1
  118. package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing.golden +1 -1
  119. package/engine/testdata/golden/TestParityDoubtCoverage/arg=nodoubt.golden +1 -1
  120. package/engine/testdata/golden/TestParityDoubtCoverage/arg=nolog.golden +1 -1
  121. package/engine/testdata/golden/TestParityLearnings/mine-no-archive.golden +1 -1
  122. package/engine/testdata/golden/TestParityLearnings/mine.golden +1 -1
  123. package/engine/testdata/golden/TestParityLearnings/nudge.golden +1 -1
  124. package/engine/testdata/golden/TestParityMutationGate/active-slug.golden +1 -1
  125. package/engine/testdata/golden/TestParityMutationGate/explicit-slug.golden +1 -1
  126. package/engine/testdata/golden/TestParityPackageExistence/declared.golden +1 -1
  127. package/engine/testdata/golden/TestParityPackageExistence/default-import-subpath.golden +1 -1
  128. package/engine/testdata/golden/TestParityReconcile/check-clean.golden +1 -1
  129. package/engine/testdata/golden/TestParityRedwatch/fail-writes-red.golden +1 -1
  130. package/engine/testdata/golden/TestParityResolve/answer/state.md.golden +1 -1
  131. package/engine/testdata/golden/TestParityResolve/batch.golden +1 -1
  132. package/engine/testdata/golden/TestParityReviewerReadonly/agent-required-devrites-agent-denies.golden +1 -1
  133. package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-git-commit.golden +1 -1
  134. package/engine/testdata/golden/TestParityReviewerReadonly/enforce-deny-mutating.golden +1 -1
  135. package/engine/testdata/golden/TestParitySpecValidate/arg=flat.golden +1 -1
  136. package/engine/testdata/golden/TestParitySpecValidate/arg=valid/spec.md.golden +1 -1
  137. package/engine/testdata/golden/TestParitySpecValidate/arg=valid.golden +1 -1
  138. package/engine/testdata/golden/TestParityStuckCheck/custom-window-2.golden +1 -1
  139. package/engine/testdata/golden/TestParityStuckCheck/dominant.golden +1 -1
  140. package/engine/testdata/golden/TestParityStuckCheck/few.golden +1 -1
  141. package/engine/testdata/golden/TestParityStuckCheck/ghost.golden +1 -1
  142. package/engine/testdata/golden/TestParityStuckCheck/identical.golden +1 -1
  143. package/engine/testdata/golden/TestParityStuckCheck/nolog.golden +1 -1
  144. package/engine/testdata/golden/TestParityStuckCheck/pingpong.golden +1 -1
  145. package/engine/testdata/golden/TestParityStuckCheck/varied.golden +1 -1
  146. package/engine/testdata/golden/TestParityStuckCheck/window-04-identical.golden +1 -1
  147. package/engine/testdata/golden/TestParityStuckCheck/window-2.5-varied4.golden +1 -1
  148. package/engine/testdata/golden/TestParityStuckCheck/window-4x-varied4.golden +1 -1
  149. package/engine/testdata/golden/TestParityStuckCheck/window-leadspace-varied4.golden +1 -1
  150. package/engine/testdata/golden/TestParityStuckCheck/window-plus4-identical.golden +1 -1
  151. package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent-subagent-type-key.golden +1 -1
  152. package/engine/testdata/golden/TestParitySubagentOrient/devrites-agent.golden +1 -1
  153. package/engine/testdata/golden/TestParityTestIntegrity/clean.golden +1 -1
  154. package/engine/testdata/golden/TestParityTickAfk/missingField.golden +1 -1
  155. package/engine/testdata/golden/TestParityTickAfk/none.golden +1 -1
  156. package/engine/testdata/golden/TestParityWrightScope/out-of-scope-enforce-denies.golden +1 -1
  157. package/engine/testdata/golden/TestSpecSkeleton/missing-some.golden +1 -1
  158. package/engine/testdata/golden/TestSpecSkeleton/present-all.golden +1 -1
  159. package/engine/tests/adr_0004_required_by_phase_test.go +2 -2
  160. package/engine/tests/adr_0006_clock_seam_test.go +1 -1
  161. package/engine/tests/budget_test.go +1 -1
  162. package/engine/tests/canonical_ac_ids_test.go +2 -2
  163. package/engine/tests/cli_test.go +1 -1
  164. package/engine/tests/concurrency_cli_test.go +1 -1
  165. package/engine/tests/gate_test.go +4 -4
  166. package/engine/tests/hook_test.go +3 -3
  167. package/engine/tests/hooks_io_test.go +1 -1
  168. package/engine/tests/lib_parity_test.go +29 -29
  169. package/engine/tests/meta_test.go +2 -2
  170. package/engine/tests/parity_closeout_test.go +1 -1
  171. package/engine/tests/parity_learnings_test.go +2 -2
  172. package/engine/tests/parity_mutationgate_test.go +2 -2
  173. package/engine/tests/parity_resolve_test.go +1 -1
  174. package/engine/tests/parity_test.go +3 -3
  175. package/engine/tests/parity_tickafk_test.go +1 -1
  176. package/engine/validatepack.go +5 -5
  177. package/engine/validatepackskills.go +9 -9
  178. package/pack/.claude/agents/devrites-code-reviewer.md +21 -22
  179. package/pack/.claude/agents/devrites-devex-reviewer.md +17 -17
  180. package/pack/.claude/agents/devrites-doubt-reviewer.md +6 -6
  181. package/pack/.claude/agents/devrites-forge-judge.md +26 -26
  182. package/pack/.claude/agents/devrites-frontend-reviewer.md +17 -17
  183. package/pack/.claude/agents/devrites-performance-reviewer.md +19 -18
  184. package/pack/.claude/agents/devrites-plan-reviewer.md +29 -27
  185. package/pack/.claude/agents/devrites-retrospector.md +19 -19
  186. package/pack/.claude/agents/devrites-security-auditor.md +15 -15
  187. package/pack/.claude/agents/devrites-simplifier-reviewer.md +14 -14
  188. package/pack/.claude/agents/devrites-slice-wright.md +52 -51
  189. package/pack/.claude/agents/devrites-spec-reviewer.md +11 -11
  190. package/pack/.claude/agents/devrites-strategy-reviewer.md +21 -21
  191. package/pack/.claude/agents/devrites-test-analyst.md +13 -13
  192. package/pack/.claude/settings.json +1 -1
  193. package/pack/.claude/skills/devrites-api-interface/SKILL.md +12 -12
  194. package/pack/.claude/skills/devrites-audit/SKILL.md +7 -7
  195. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +16 -16
  196. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +14 -14
  197. package/pack/.claude/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
  198. package/pack/.claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
  199. package/pack/.claude/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
  200. package/pack/.claude/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
  201. package/pack/.claude/skills/devrites-debug-recovery/reference/trace.md +4 -4
  202. package/pack/.claude/skills/devrites-doubt/SKILL.md +14 -14
  203. package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +18 -18
  204. package/pack/.claude/skills/devrites-frontend-craft/reference/craft.md +17 -17
  205. package/pack/.claude/skills/devrites-frontend-craft/reference/design-references.md +25 -25
  206. package/pack/.claude/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
  207. package/pack/.claude/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
  208. package/pack/.claude/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
  209. package/pack/.claude/skills/devrites-frontend-craft/reference/shape.md +13 -13
  210. package/pack/.claude/skills/devrites-interview/SKILL.md +27 -27
  211. package/pack/.claude/skills/devrites-lib/SKILL.md +18 -18
  212. package/pack/.claude/skills/devrites-lib/reference/model-tiers.md +5 -5
  213. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
  214. package/pack/.claude/skills/devrites-lib/reference/standards/README.md +10 -10
  215. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
  216. package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +37 -37
  217. package/pack/.claude/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
  218. package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
  219. package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +40 -40
  220. package/pack/.claude/skills/devrites-lib/reference/standards/coding-style.md +7 -7
  221. package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
  222. package/pack/.claude/skills/devrites-lib/reference/standards/core.md +23 -23
  223. package/pack/.claude/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
  224. package/pack/.claude/skills/devrites-lib/reference/standards/deprecation.md +18 -18
  225. package/pack/.claude/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
  226. package/pack/.claude/skills/devrites-lib/reference/standards/development-workflow.md +10 -10
  227. package/pack/.claude/skills/devrites-lib/reference/standards/documentation.md +4 -4
  228. package/pack/.claude/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
  229. package/pack/.claude/skills/devrites-lib/reference/standards/elicitation.md +26 -26
  230. package/pack/.claude/skills/devrites-lib/reference/standards/error-handling.md +4 -4
  231. package/pack/.claude/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
  232. package/pack/.claude/skills/devrites-lib/reference/standards/hooks.md +3 -3
  233. package/pack/.claude/skills/devrites-lib/reference/standards/observability.md +15 -15
  234. package/pack/.claude/skills/devrites-lib/reference/standards/patterns.md +8 -8
  235. package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +5 -5
  236. package/pack/.claude/skills/devrites-lib/reference/standards/principles.md +31 -31
  237. package/pack/.claude/skills/devrites-lib/reference/standards/prose-style.md +25 -25
  238. package/pack/.claude/skills/devrites-lib/reference/standards/security.md +30 -30
  239. package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
  240. package/pack/.claude/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
  241. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +40 -40
  242. package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +26 -26
  243. package/pack/.claude/skills/devrites-prose-craft/SKILL.md +5 -5
  244. package/pack/.claude/skills/devrites-refresh-indexes/SKILL.md +6 -6
  245. package/pack/.claude/skills/devrites-source-driven/SKILL.md +8 -8
  246. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +33 -33
  247. package/pack/.claude/skills/devrites-ux-shape/reference/brief-template.md +6 -6
  248. package/pack/.claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
  249. package/pack/.claude/skills/rite/SKILL.md +7 -7
  250. package/pack/.claude/skills/rite/reference/menu.md +6 -6
  251. package/pack/.claude/skills/rite-adopt/SKILL.md +15 -15
  252. package/pack/.claude/skills/rite-adopt/reference/adoption.md +9 -9
  253. package/pack/.claude/skills/rite-adopt/reference/anti-patterns.md +6 -6
  254. package/pack/.claude/skills/rite-autocomplete/SKILL.md +14 -14
  255. package/pack/.claude/skills/rite-autocomplete/reference/decision-policy.md +4 -4
  256. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +7 -7
  257. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
  258. package/pack/.claude/skills/rite-build/SKILL.md +22 -22
  259. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +9 -9
  260. package/pack/.claude/skills/rite-build/reference/anti-patterns.md +6 -6
  261. package/pack/.claude/skills/rite-build/reference/checkpoint-protocol.md +14 -14
  262. package/pack/.claude/skills/rite-build/reference/checkpoint.md +8 -8
  263. package/pack/.claude/skills/rite-build/reference/evidence-standard.md +1 -1
  264. package/pack/.claude/skills/rite-build/reference/forge.md +28 -29
  265. package/pack/.claude/skills/rite-build/reference/frontend-trigger.md +2 -2
  266. package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +3 -3
  267. package/pack/.claude/skills/rite-build/reference/output.md +1 -1
  268. package/pack/.claude/skills/rite-build/reference/phase-contract.md +44 -44
  269. package/pack/.claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
  270. package/pack/.claude/skills/rite-build/reference/tdd.md +6 -6
  271. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +23 -23
  272. package/pack/.claude/skills/rite-converge/SKILL.md +17 -17
  273. package/pack/.claude/skills/rite-converge/reference/anti-patterns.md +7 -7
  274. package/pack/.claude/skills/rite-converge/reference/convergence-assessment.md +14 -14
  275. package/pack/.claude/skills/rite-customize/SKILL.md +2 -2
  276. package/pack/.claude/skills/rite-define/SKILL.md +25 -25
  277. package/pack/.claude/skills/rite-define/reference/anti-patterns.md +5 -5
  278. package/pack/.claude/skills/rite-define/reference/gates.md +13 -13
  279. package/pack/.claude/skills/rite-define/reference/plan-template.md +1 -1
  280. package/pack/.claude/skills/rite-doctor/SKILL.md +11 -11
  281. package/pack/.claude/skills/rite-dogfood/SKILL.md +2 -2
  282. package/pack/.claude/skills/rite-explain/SKILL.md +22 -22
  283. package/pack/.claude/skills/rite-explain/reference/intake.md +16 -16
  284. package/pack/.claude/skills/rite-frame/SKILL.md +22 -22
  285. package/pack/.claude/skills/rite-frame/reference/failure-modes.md +13 -13
  286. package/pack/.claude/skills/rite-handoff/SKILL.md +12 -12
  287. package/pack/.claude/skills/rite-learn/SKILL.md +23 -23
  288. package/pack/.claude/skills/rite-plan/SKILL.md +21 -21
  289. package/pack/.claude/skills/rite-plan/reference/anti-patterns.md +3 -3
  290. package/pack/.claude/skills/rite-plan/reference/dependency-graph.md +1 -1
  291. package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +3 -3
  292. package/pack/.claude/skills/rite-plan/reference/slicing.md +9 -9
  293. package/pack/.claude/skills/rite-plan/reference/task-breakdown.md +3 -3
  294. package/pack/.claude/skills/rite-polish/SKILL.md +11 -11
  295. package/pack/.claude/skills/rite-polish/reference/anti-patterns.md +8 -8
  296. package/pack/.claude/skills/rite-polish/reference/backend-polish.md +13 -13
  297. package/pack/.claude/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
  298. package/pack/.claude/skills/rite-polish/reference/code.md +26 -26
  299. package/pack/.claude/skills/rite-polish/reference/harden-checklist.md +31 -31
  300. package/pack/.claude/skills/rite-polish/reference/ui.md +23 -23
  301. package/pack/.claude/skills/rite-pov/SKILL.md +3 -3
  302. package/pack/.claude/skills/rite-pr-feedback/SKILL.md +2 -2
  303. package/pack/.claude/skills/rite-pressure-test/SKILL.md +14 -14
  304. package/pack/.claude/skills/rite-prototype/SKILL.md +13 -13
  305. package/pack/.claude/skills/rite-prove/SKILL.md +17 -17
  306. package/pack/.claude/skills/rite-prove/reference/anti-patterns.md +4 -4
  307. package/pack/.claude/skills/rite-prove/reference/browser-proof.md +2 -2
  308. package/pack/.claude/skills/rite-prove/reference/failure-triage.md +4 -4
  309. package/pack/.claude/skills/rite-prove/reference/proof-ladder.md +6 -6
  310. package/pack/.claude/skills/rite-prove/reference/test-command-discovery.md +1 -1
  311. package/pack/.claude/skills/rite-quick/SKILL.md +22 -22
  312. package/pack/.claude/skills/rite-resolve/SKILL.md +18 -18
  313. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +7 -7
  314. package/pack/.claude/skills/rite-review/SKILL.md +34 -34
  315. package/pack/.claude/skills/rite-review/reference/anti-patterns.md +4 -4
  316. package/pack/.claude/skills/rite-review/reference/cognitive-load.md +22 -22
  317. package/pack/.claude/skills/rite-review/reference/feature-scoped-review.md +2 -2
  318. package/pack/.claude/skills/rite-review/reference/five-axis-review.md +8 -8
  319. package/pack/.claude/skills/rite-review/reference/nielsen-heuristics.md +14 -14
  320. package/pack/.claude/skills/rite-review/reference/performance-checklist.md +14 -14
  321. package/pack/.claude/skills/rite-review/reference/security-review.md +9 -9
  322. package/pack/.claude/skills/rite-seal/SKILL.md +26 -26
  323. package/pack/.claude/skills/rite-seal/reference/anti-patterns.md +8 -8
  324. package/pack/.claude/skills/rite-seal/reference/conventions-ledger.md +8 -8
  325. package/pack/.claude/skills/rite-seal/reference/final-evidence.md +9 -9
  326. package/pack/.claude/skills/rite-seal/reference/go-no-go.md +9 -9
  327. package/pack/.claude/skills/rite-seal/reference/phase-contract.md +43 -43
  328. package/pack/.claude/skills/rite-ship/SKILL.md +12 -12
  329. package/pack/.claude/skills/rite-ship/reference/anti-patterns.md +5 -5
  330. package/pack/.claude/skills/rite-ship/reference/close-out.md +2 -2
  331. package/pack/.claude/skills/rite-ship/reference/design-memory.md +22 -22
  332. package/pack/.claude/skills/rite-ship/reference/git-ship.md +10 -10
  333. package/pack/.claude/skills/rite-ship/reference/ledger.md +9 -9
  334. package/pack/.claude/skills/rite-ship/reference/rollout.md +11 -11
  335. package/pack/.claude/skills/rite-ship/reference/ship-template.md +1 -1
  336. package/pack/.claude/skills/rite-spec/SKILL.md +45 -45
  337. package/pack/.claude/skills/rite-spec/reference/acceptance-criteria.md +4 -4
  338. package/pack/.claude/skills/rite-spec/reference/anti-patterns.md +6 -6
  339. package/pack/.claude/skills/rite-spec/reference/interview-patterns.md +3 -3
  340. package/pack/.claude/skills/rite-spec/reference/investigation.md +21 -21
  341. package/pack/.claude/skills/rite-spec/reference/question-protocol.md +9 -9
  342. package/pack/.claude/skills/rite-spec/reference/references-intake.md +8 -8
  343. package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +19 -19
  344. package/pack/.claude/skills/rite-status/SKILL.md +13 -13
  345. package/pack/.claude/skills/rite-temper/SKILL.md +29 -29
  346. package/pack/.claude/skills/rite-temper/reference/anti-patterns.md +11 -11
  347. package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +20 -20
  348. package/pack/.claude/skills/rite-temper/reference/scope-modes.md +16 -16
  349. package/pack/.claude/skills/rite-temper/reference/significance.md +10 -10
  350. package/pack/.claude/skills/rite-temper/reference/strategy-template.md +14 -14
  351. package/pack/.claude/skills/rite-vet/SKILL.md +31 -31
  352. package/pack/.claude/skills/rite-vet/reference/anti-patterns.md +14 -14
  353. package/pack/.claude/skills/rite-vet/reference/artifacts.md +10 -10
  354. package/pack/.claude/skills/rite-vet/reference/cross-model.md +9 -9
  355. package/pack/.claude/skills/rite-vet/reference/depth.md +14 -14
  356. package/pack/.claude/skills/rite-vet/reference/eng-lenses.md +9 -9
  357. package/pack/.claude/skills/rite-vet/reference/review-axes.md +28 -28
  358. package/pack/.claude/skills/rite-zoom-out/SKILL.md +18 -18
  359. package/pack/generated/claude/agents/devrites-code-reviewer.md +21 -22
  360. package/pack/generated/claude/agents/devrites-devex-reviewer.md +17 -17
  361. package/pack/generated/claude/agents/devrites-doubt-reviewer.md +6 -6
  362. package/pack/generated/claude/agents/devrites-forge-judge.md +26 -26
  363. package/pack/generated/claude/agents/devrites-frontend-reviewer.md +17 -17
  364. package/pack/generated/claude/agents/devrites-performance-reviewer.md +19 -18
  365. package/pack/generated/claude/agents/devrites-plan-reviewer.md +29 -27
  366. package/pack/generated/claude/agents/devrites-retrospector.md +19 -19
  367. package/pack/generated/claude/agents/devrites-security-auditor.md +15 -15
  368. package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +14 -14
  369. package/pack/generated/claude/agents/devrites-slice-wright.md +52 -51
  370. package/pack/generated/claude/agents/devrites-spec-reviewer.md +11 -11
  371. package/pack/generated/claude/agents/devrites-strategy-reviewer.md +21 -21
  372. package/pack/generated/claude/agents/devrites-test-analyst.md +13 -13
  373. package/pack/generated/claude/settings.json +1 -1
  374. package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +12 -12
  375. package/pack/generated/claude/skills/devrites-audit/SKILL.md +7 -7
  376. package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +16 -16
  377. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +14 -14
  378. package/pack/generated/claude/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
  379. package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
  380. package/pack/generated/claude/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
  381. package/pack/generated/claude/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
  382. package/pack/generated/claude/skills/devrites-debug-recovery/reference/trace.md +4 -4
  383. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +14 -14
  384. package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +18 -18
  385. package/pack/generated/claude/skills/devrites-frontend-craft/reference/craft.md +17 -17
  386. package/pack/generated/claude/skills/devrites-frontend-craft/reference/design-references.md +25 -25
  387. package/pack/generated/claude/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
  388. package/pack/generated/claude/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
  389. package/pack/generated/claude/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
  390. package/pack/generated/claude/skills/devrites-frontend-craft/reference/shape.md +13 -13
  391. package/pack/generated/claude/skills/devrites-interview/SKILL.md +27 -27
  392. package/pack/generated/claude/skills/devrites-lib/SKILL.md +18 -18
  393. package/pack/generated/claude/skills/devrites-lib/reference/model-tiers.md +5 -5
  394. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
  395. package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +10 -10
  396. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
  397. package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +37 -37
  398. package/pack/generated/claude/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
  399. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
  400. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +40 -40
  401. package/pack/generated/claude/skills/devrites-lib/reference/standards/coding-style.md +7 -7
  402. package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
  403. package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +23 -23
  404. package/pack/generated/claude/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
  405. package/pack/generated/claude/skills/devrites-lib/reference/standards/deprecation.md +18 -18
  406. package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
  407. package/pack/generated/claude/skills/devrites-lib/reference/standards/development-workflow.md +10 -10
  408. package/pack/generated/claude/skills/devrites-lib/reference/standards/documentation.md +4 -4
  409. package/pack/generated/claude/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
  410. package/pack/generated/claude/skills/devrites-lib/reference/standards/elicitation.md +26 -26
  411. package/pack/generated/claude/skills/devrites-lib/reference/standards/error-handling.md +4 -4
  412. package/pack/generated/claude/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
  413. package/pack/generated/claude/skills/devrites-lib/reference/standards/hooks.md +3 -3
  414. package/pack/generated/claude/skills/devrites-lib/reference/standards/observability.md +15 -15
  415. package/pack/generated/claude/skills/devrites-lib/reference/standards/patterns.md +8 -8
  416. package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +5 -5
  417. package/pack/generated/claude/skills/devrites-lib/reference/standards/principles.md +31 -31
  418. package/pack/generated/claude/skills/devrites-lib/reference/standards/prose-style.md +25 -25
  419. package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +30 -30
  420. package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
  421. package/pack/generated/claude/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
  422. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +40 -40
  423. package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +26 -26
  424. package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +5 -5
  425. package/pack/generated/claude/skills/devrites-refresh-indexes/SKILL.md +6 -6
  426. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +8 -8
  427. package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +33 -33
  428. package/pack/generated/claude/skills/devrites-ux-shape/reference/brief-template.md +6 -6
  429. package/pack/generated/claude/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
  430. package/pack/generated/claude/skills/rite/SKILL.md +7 -7
  431. package/pack/generated/claude/skills/rite/reference/menu.md +6 -6
  432. package/pack/generated/claude/skills/rite-adopt/SKILL.md +15 -15
  433. package/pack/generated/claude/skills/rite-adopt/reference/adoption.md +9 -9
  434. package/pack/generated/claude/skills/rite-adopt/reference/anti-patterns.md +6 -6
  435. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +14 -14
  436. package/pack/generated/claude/skills/rite-autocomplete/reference/decision-policy.md +4 -4
  437. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +7 -7
  438. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
  439. package/pack/generated/claude/skills/rite-build/SKILL.md +22 -22
  440. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +9 -9
  441. package/pack/generated/claude/skills/rite-build/reference/anti-patterns.md +6 -6
  442. package/pack/generated/claude/skills/rite-build/reference/checkpoint-protocol.md +14 -14
  443. package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +8 -8
  444. package/pack/generated/claude/skills/rite-build/reference/evidence-standard.md +1 -1
  445. package/pack/generated/claude/skills/rite-build/reference/forge.md +28 -29
  446. package/pack/generated/claude/skills/rite-build/reference/frontend-trigger.md +2 -2
  447. package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +3 -3
  448. package/pack/generated/claude/skills/rite-build/reference/output.md +1 -1
  449. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +44 -44
  450. package/pack/generated/claude/skills/rite-build/reference/spec-drift-guard.md +1 -1
  451. package/pack/generated/claude/skills/rite-build/reference/tdd.md +6 -6
  452. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +23 -23
  453. package/pack/generated/claude/skills/rite-converge/SKILL.md +17 -17
  454. package/pack/generated/claude/skills/rite-converge/reference/anti-patterns.md +7 -7
  455. package/pack/generated/claude/skills/rite-converge/reference/convergence-assessment.md +14 -14
  456. package/pack/generated/claude/skills/rite-customize/SKILL.md +2 -2
  457. package/pack/generated/claude/skills/rite-define/SKILL.md +25 -25
  458. package/pack/generated/claude/skills/rite-define/reference/anti-patterns.md +5 -5
  459. package/pack/generated/claude/skills/rite-define/reference/gates.md +13 -13
  460. package/pack/generated/claude/skills/rite-define/reference/plan-template.md +1 -1
  461. package/pack/generated/claude/skills/rite-doctor/SKILL.md +11 -11
  462. package/pack/generated/claude/skills/rite-dogfood/SKILL.md +2 -2
  463. package/pack/generated/claude/skills/rite-explain/SKILL.md +22 -22
  464. package/pack/generated/claude/skills/rite-explain/reference/intake.md +16 -16
  465. package/pack/generated/claude/skills/rite-frame/SKILL.md +22 -22
  466. package/pack/generated/claude/skills/rite-frame/reference/failure-modes.md +13 -13
  467. package/pack/generated/claude/skills/rite-handoff/SKILL.md +12 -12
  468. package/pack/generated/claude/skills/rite-learn/SKILL.md +23 -23
  469. package/pack/generated/claude/skills/rite-plan/SKILL.md +21 -21
  470. package/pack/generated/claude/skills/rite-plan/reference/anti-patterns.md +3 -3
  471. package/pack/generated/claude/skills/rite-plan/reference/dependency-graph.md +1 -1
  472. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +3 -3
  473. package/pack/generated/claude/skills/rite-plan/reference/slicing.md +9 -9
  474. package/pack/generated/claude/skills/rite-plan/reference/task-breakdown.md +3 -3
  475. package/pack/generated/claude/skills/rite-polish/SKILL.md +11 -11
  476. package/pack/generated/claude/skills/rite-polish/reference/anti-patterns.md +8 -8
  477. package/pack/generated/claude/skills/rite-polish/reference/backend-polish.md +13 -13
  478. package/pack/generated/claude/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
  479. package/pack/generated/claude/skills/rite-polish/reference/code.md +26 -26
  480. package/pack/generated/claude/skills/rite-polish/reference/harden-checklist.md +31 -31
  481. package/pack/generated/claude/skills/rite-polish/reference/ui.md +23 -23
  482. package/pack/generated/claude/skills/rite-pov/SKILL.md +3 -3
  483. package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +2 -2
  484. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +14 -14
  485. package/pack/generated/claude/skills/rite-prototype/SKILL.md +13 -13
  486. package/pack/generated/claude/skills/rite-prove/SKILL.md +17 -17
  487. package/pack/generated/claude/skills/rite-prove/reference/anti-patterns.md +4 -4
  488. package/pack/generated/claude/skills/rite-prove/reference/browser-proof.md +2 -2
  489. package/pack/generated/claude/skills/rite-prove/reference/failure-triage.md +4 -4
  490. package/pack/generated/claude/skills/rite-prove/reference/proof-ladder.md +6 -6
  491. package/pack/generated/claude/skills/rite-prove/reference/test-command-discovery.md +1 -1
  492. package/pack/generated/claude/skills/rite-quick/SKILL.md +22 -22
  493. package/pack/generated/claude/skills/rite-resolve/SKILL.md +18 -18
  494. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +7 -7
  495. package/pack/generated/claude/skills/rite-review/SKILL.md +34 -34
  496. package/pack/generated/claude/skills/rite-review/reference/anti-patterns.md +4 -4
  497. package/pack/generated/claude/skills/rite-review/reference/cognitive-load.md +22 -22
  498. package/pack/generated/claude/skills/rite-review/reference/feature-scoped-review.md +2 -2
  499. package/pack/generated/claude/skills/rite-review/reference/five-axis-review.md +8 -8
  500. package/pack/generated/claude/skills/rite-review/reference/nielsen-heuristics.md +14 -14
  501. package/pack/generated/claude/skills/rite-review/reference/performance-checklist.md +14 -14
  502. package/pack/generated/claude/skills/rite-review/reference/security-review.md +9 -9
  503. package/pack/generated/claude/skills/rite-seal/SKILL.md +26 -26
  504. package/pack/generated/claude/skills/rite-seal/reference/anti-patterns.md +8 -8
  505. package/pack/generated/claude/skills/rite-seal/reference/conventions-ledger.md +8 -8
  506. package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +9 -9
  507. package/pack/generated/claude/skills/rite-seal/reference/go-no-go.md +9 -9
  508. package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +43 -43
  509. package/pack/generated/claude/skills/rite-ship/SKILL.md +12 -12
  510. package/pack/generated/claude/skills/rite-ship/reference/anti-patterns.md +5 -5
  511. package/pack/generated/claude/skills/rite-ship/reference/close-out.md +2 -2
  512. package/pack/generated/claude/skills/rite-ship/reference/design-memory.md +22 -22
  513. package/pack/generated/claude/skills/rite-ship/reference/git-ship.md +10 -10
  514. package/pack/generated/claude/skills/rite-ship/reference/ledger.md +9 -9
  515. package/pack/generated/claude/skills/rite-ship/reference/rollout.md +11 -11
  516. package/pack/generated/claude/skills/rite-ship/reference/ship-template.md +1 -1
  517. package/pack/generated/claude/skills/rite-spec/SKILL.md +45 -45
  518. package/pack/generated/claude/skills/rite-spec/reference/acceptance-criteria.md +4 -4
  519. package/pack/generated/claude/skills/rite-spec/reference/anti-patterns.md +6 -6
  520. package/pack/generated/claude/skills/rite-spec/reference/interview-patterns.md +3 -3
  521. package/pack/generated/claude/skills/rite-spec/reference/investigation.md +21 -21
  522. package/pack/generated/claude/skills/rite-spec/reference/question-protocol.md +9 -9
  523. package/pack/generated/claude/skills/rite-spec/reference/references-intake.md +8 -8
  524. package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +19 -19
  525. package/pack/generated/claude/skills/rite-status/SKILL.md +13 -13
  526. package/pack/generated/claude/skills/rite-temper/SKILL.md +29 -29
  527. package/pack/generated/claude/skills/rite-temper/reference/anti-patterns.md +11 -11
  528. package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +20 -20
  529. package/pack/generated/claude/skills/rite-temper/reference/scope-modes.md +16 -16
  530. package/pack/generated/claude/skills/rite-temper/reference/significance.md +10 -10
  531. package/pack/generated/claude/skills/rite-temper/reference/strategy-template.md +14 -14
  532. package/pack/generated/claude/skills/rite-vet/SKILL.md +31 -31
  533. package/pack/generated/claude/skills/rite-vet/reference/anti-patterns.md +14 -14
  534. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +10 -10
  535. package/pack/generated/claude/skills/rite-vet/reference/cross-model.md +9 -9
  536. package/pack/generated/claude/skills/rite-vet/reference/depth.md +14 -14
  537. package/pack/generated/claude/skills/rite-vet/reference/eng-lenses.md +9 -9
  538. package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +28 -28
  539. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +18 -18
  540. package/pack/generated/codex/agents/devrites-code-reviewer.toml +21 -22
  541. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +17 -17
  542. package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +6 -6
  543. package/pack/generated/codex/agents/devrites-forge-judge.toml +26 -26
  544. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +17 -17
  545. package/pack/generated/codex/agents/devrites-performance-reviewer.toml +19 -18
  546. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +29 -27
  547. package/pack/generated/codex/agents/devrites-retrospector.toml +19 -19
  548. package/pack/generated/codex/agents/devrites-security-auditor.toml +15 -15
  549. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +14 -14
  550. package/pack/generated/codex/agents/devrites-slice-wright.toml +52 -51
  551. package/pack/generated/codex/agents/devrites-spec-reviewer.toml +11 -11
  552. package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +21 -21
  553. package/pack/generated/codex/agents/devrites-test-analyst.toml +13 -13
  554. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +15 -15
  555. package/pack/generated/codex/skills/devrites-audit/SKILL.md +10 -10
  556. package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +19 -19
  557. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +17 -17
  558. package/pack/generated/codex/skills/devrites-debug-recovery/reference/build-the-loop.md +16 -16
  559. package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +2 -2
  560. package/pack/generated/codex/skills/devrites-debug-recovery/reference/hypotheses.md +2 -2
  561. package/pack/generated/codex/skills/devrites-debug-recovery/reference/regression-test.md +3 -3
  562. package/pack/generated/codex/skills/devrites-debug-recovery/reference/trace.md +4 -4
  563. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +17 -17
  564. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +20 -20
  565. package/pack/generated/codex/skills/devrites-frontend-craft/reference/craft.md +17 -17
  566. package/pack/generated/codex/skills/devrites-frontend-craft/reference/design-references.md +25 -25
  567. package/pack/generated/codex/skills/devrites-frontend-craft/reference/fullstack.md +6 -6
  568. package/pack/generated/codex/skills/devrites-frontend-craft/reference/quality-standards.md +44 -44
  569. package/pack/generated/codex/skills/devrites-frontend-craft/reference/reuse-first.md +9 -9
  570. package/pack/generated/codex/skills/devrites-frontend-craft/reference/shape.md +13 -13
  571. package/pack/generated/codex/skills/devrites-interview/SKILL.md +30 -30
  572. package/pack/generated/codex/skills/devrites-lib/SKILL.md +21 -21
  573. package/pack/generated/codex/skills/devrites-lib/reference/model-tiers.md +5 -5
  574. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +36 -36
  575. package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +10 -10
  576. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +33 -33
  577. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +37 -37
  578. package/pack/generated/codex/skills/devrites-lib/reference/standards/anti-patterns.md +9 -9
  579. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +12 -12
  580. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +40 -40
  581. package/pack/generated/codex/skills/devrites-lib/reference/standards/coding-style.md +7 -7
  582. package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +24 -25
  583. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +23 -23
  584. package/pack/generated/codex/skills/devrites-lib/reference/standards/definition-of-done.md +1 -1
  585. package/pack/generated/codex/skills/devrites-lib/reference/standards/deprecation.md +18 -18
  586. package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +29 -29
  587. package/pack/generated/codex/skills/devrites-lib/reference/standards/development-workflow.md +10 -10
  588. package/pack/generated/codex/skills/devrites-lib/reference/standards/documentation.md +4 -4
  589. package/pack/generated/codex/skills/devrites-lib/reference/standards/edge-case-trace.md +1 -1
  590. package/pack/generated/codex/skills/devrites-lib/reference/standards/elicitation.md +26 -26
  591. package/pack/generated/codex/skills/devrites-lib/reference/standards/error-handling.md +4 -4
  592. package/pack/generated/codex/skills/devrites-lib/reference/standards/git-workflow.md +9 -9
  593. package/pack/generated/codex/skills/devrites-lib/reference/standards/hooks.md +3 -3
  594. package/pack/generated/codex/skills/devrites-lib/reference/standards/observability.md +15 -15
  595. package/pack/generated/codex/skills/devrites-lib/reference/standards/patterns.md +8 -8
  596. package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +5 -5
  597. package/pack/generated/codex/skills/devrites-lib/reference/standards/principles.md +31 -31
  598. package/pack/generated/codex/skills/devrites-lib/reference/standards/prose-style.md +25 -25
  599. package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +30 -30
  600. package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +11 -11
  601. package/pack/generated/codex/skills/devrites-lib/reference/standards/spec-grammar.md +30 -30
  602. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +40 -40
  603. package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +26 -26
  604. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +8 -8
  605. package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +9 -9
  606. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +11 -11
  607. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +36 -36
  608. package/pack/generated/codex/skills/devrites-ux-shape/reference/brief-template.md +6 -6
  609. package/pack/generated/codex/skills/devrites-ux-shape/reference/visual-direction-probe.md +9 -9
  610. package/pack/generated/codex/skills/rite/SKILL.md +10 -10
  611. package/pack/generated/codex/skills/rite/reference/menu.md +6 -6
  612. package/pack/generated/codex/skills/rite-adopt/SKILL.md +18 -18
  613. package/pack/generated/codex/skills/rite-adopt/reference/adoption.md +9 -9
  614. package/pack/generated/codex/skills/rite-adopt/reference/anti-patterns.md +6 -6
  615. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +17 -17
  616. package/pack/generated/codex/skills/rite-autocomplete/reference/decision-policy.md +4 -4
  617. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +7 -7
  618. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +7 -7
  619. package/pack/generated/codex/skills/rite-build/SKILL.md +25 -25
  620. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +9 -9
  621. package/pack/generated/codex/skills/rite-build/reference/anti-patterns.md +6 -6
  622. package/pack/generated/codex/skills/rite-build/reference/checkpoint-protocol.md +14 -14
  623. package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +8 -8
  624. package/pack/generated/codex/skills/rite-build/reference/evidence-standard.md +1 -1
  625. package/pack/generated/codex/skills/rite-build/reference/forge.md +28 -29
  626. package/pack/generated/codex/skills/rite-build/reference/frontend-trigger.md +2 -2
  627. package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +3 -3
  628. package/pack/generated/codex/skills/rite-build/reference/output.md +1 -1
  629. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +44 -44
  630. package/pack/generated/codex/skills/rite-build/reference/spec-drift-guard.md +1 -1
  631. package/pack/generated/codex/skills/rite-build/reference/tdd.md +6 -6
  632. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +23 -23
  633. package/pack/generated/codex/skills/rite-converge/SKILL.md +20 -20
  634. package/pack/generated/codex/skills/rite-converge/reference/anti-patterns.md +7 -7
  635. package/pack/generated/codex/skills/rite-converge/reference/convergence-assessment.md +14 -14
  636. package/pack/generated/codex/skills/rite-customize/SKILL.md +5 -5
  637. package/pack/generated/codex/skills/rite-define/SKILL.md +28 -28
  638. package/pack/generated/codex/skills/rite-define/reference/anti-patterns.md +5 -5
  639. package/pack/generated/codex/skills/rite-define/reference/gates.md +13 -13
  640. package/pack/generated/codex/skills/rite-define/reference/plan-template.md +1 -1
  641. package/pack/generated/codex/skills/rite-doctor/SKILL.md +14 -14
  642. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +5 -5
  643. package/pack/generated/codex/skills/rite-explain/SKILL.md +25 -25
  644. package/pack/generated/codex/skills/rite-explain/reference/intake.md +16 -16
  645. package/pack/generated/codex/skills/rite-frame/SKILL.md +25 -25
  646. package/pack/generated/codex/skills/rite-frame/reference/failure-modes.md +13 -13
  647. package/pack/generated/codex/skills/rite-handoff/SKILL.md +15 -15
  648. package/pack/generated/codex/skills/rite-learn/SKILL.md +26 -26
  649. package/pack/generated/codex/skills/rite-plan/SKILL.md +24 -24
  650. package/pack/generated/codex/skills/rite-plan/reference/anti-patterns.md +3 -3
  651. package/pack/generated/codex/skills/rite-plan/reference/dependency-graph.md +1 -1
  652. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +3 -3
  653. package/pack/generated/codex/skills/rite-plan/reference/slicing.md +9 -9
  654. package/pack/generated/codex/skills/rite-plan/reference/task-breakdown.md +3 -3
  655. package/pack/generated/codex/skills/rite-polish/SKILL.md +14 -14
  656. package/pack/generated/codex/skills/rite-polish/reference/anti-patterns.md +8 -8
  657. package/pack/generated/codex/skills/rite-polish/reference/backend-polish.md +13 -13
  658. package/pack/generated/codex/skills/rite-polish/reference/browser-polish-evidence.md +4 -4
  659. package/pack/generated/codex/skills/rite-polish/reference/code.md +26 -26
  660. package/pack/generated/codex/skills/rite-polish/reference/harden-checklist.md +31 -31
  661. package/pack/generated/codex/skills/rite-polish/reference/ui.md +23 -23
  662. package/pack/generated/codex/skills/rite-pov/SKILL.md +6 -6
  663. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +5 -5
  664. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +17 -17
  665. package/pack/generated/codex/skills/rite-prototype/SKILL.md +16 -16
  666. package/pack/generated/codex/skills/rite-prove/SKILL.md +20 -20
  667. package/pack/generated/codex/skills/rite-prove/reference/anti-patterns.md +4 -4
  668. package/pack/generated/codex/skills/rite-prove/reference/browser-proof.md +2 -2
  669. package/pack/generated/codex/skills/rite-prove/reference/failure-triage.md +4 -4
  670. package/pack/generated/codex/skills/rite-prove/reference/proof-ladder.md +6 -6
  671. package/pack/generated/codex/skills/rite-prove/reference/test-command-discovery.md +1 -1
  672. package/pack/generated/codex/skills/rite-quick/SKILL.md +25 -25
  673. package/pack/generated/codex/skills/rite-resolve/SKILL.md +21 -21
  674. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +7 -7
  675. package/pack/generated/codex/skills/rite-review/SKILL.md +37 -37
  676. package/pack/generated/codex/skills/rite-review/reference/anti-patterns.md +4 -4
  677. package/pack/generated/codex/skills/rite-review/reference/cognitive-load.md +22 -22
  678. package/pack/generated/codex/skills/rite-review/reference/feature-scoped-review.md +2 -2
  679. package/pack/generated/codex/skills/rite-review/reference/five-axis-review.md +8 -8
  680. package/pack/generated/codex/skills/rite-review/reference/nielsen-heuristics.md +14 -14
  681. package/pack/generated/codex/skills/rite-review/reference/performance-checklist.md +14 -14
  682. package/pack/generated/codex/skills/rite-review/reference/security-review.md +9 -9
  683. package/pack/generated/codex/skills/rite-seal/SKILL.md +29 -29
  684. package/pack/generated/codex/skills/rite-seal/reference/anti-patterns.md +8 -8
  685. package/pack/generated/codex/skills/rite-seal/reference/conventions-ledger.md +8 -8
  686. package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +9 -9
  687. package/pack/generated/codex/skills/rite-seal/reference/go-no-go.md +9 -9
  688. package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +43 -43
  689. package/pack/generated/codex/skills/rite-ship/SKILL.md +15 -15
  690. package/pack/generated/codex/skills/rite-ship/reference/anti-patterns.md +5 -5
  691. package/pack/generated/codex/skills/rite-ship/reference/close-out.md +2 -2
  692. package/pack/generated/codex/skills/rite-ship/reference/design-memory.md +22 -22
  693. package/pack/generated/codex/skills/rite-ship/reference/git-ship.md +10 -10
  694. package/pack/generated/codex/skills/rite-ship/reference/ledger.md +9 -9
  695. package/pack/generated/codex/skills/rite-ship/reference/rollout.md +11 -11
  696. package/pack/generated/codex/skills/rite-ship/reference/ship-template.md +1 -1
  697. package/pack/generated/codex/skills/rite-spec/SKILL.md +48 -48
  698. package/pack/generated/codex/skills/rite-spec/reference/acceptance-criteria.md +4 -4
  699. package/pack/generated/codex/skills/rite-spec/reference/anti-patterns.md +6 -6
  700. package/pack/generated/codex/skills/rite-spec/reference/interview-patterns.md +3 -3
  701. package/pack/generated/codex/skills/rite-spec/reference/investigation.md +21 -21
  702. package/pack/generated/codex/skills/rite-spec/reference/question-protocol.md +9 -9
  703. package/pack/generated/codex/skills/rite-spec/reference/references-intake.md +8 -8
  704. package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +19 -19
  705. package/pack/generated/codex/skills/rite-status/SKILL.md +16 -16
  706. package/pack/generated/codex/skills/rite-temper/SKILL.md +32 -32
  707. package/pack/generated/codex/skills/rite-temper/reference/anti-patterns.md +11 -11
  708. package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +20 -20
  709. package/pack/generated/codex/skills/rite-temper/reference/scope-modes.md +16 -16
  710. package/pack/generated/codex/skills/rite-temper/reference/significance.md +10 -10
  711. package/pack/generated/codex/skills/rite-temper/reference/strategy-template.md +14 -14
  712. package/pack/generated/codex/skills/rite-vet/SKILL.md +34 -34
  713. package/pack/generated/codex/skills/rite-vet/reference/anti-patterns.md +14 -14
  714. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +10 -10
  715. package/pack/generated/codex/skills/rite-vet/reference/cross-model.md +9 -9
  716. package/pack/generated/codex/skills/rite-vet/reference/depth.md +14 -14
  717. package/pack/generated/codex/skills/rite-vet/reference/eng-lenses.md +9 -9
  718. package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +28 -28
  719. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +21 -21
  720. package/package.json +2 -2
  721. package/scripts/build-binaries.sh +1 -1
  722. package/scripts/build-host-artifacts.sh +1 -1
  723. package/scripts/build-release-tarball.sh +1 -1
  724. package/scripts/check-cross-refs.py +8 -8
  725. package/scripts/check-invocation-integrity.py +4 -4
  726. package/scripts/check-no-global-writes.sh +2 -2
  727. package/scripts/check-reply-contract.sh +1 -1
  728. package/scripts/check-rule-uniqueness.sh +2 -2
  729. package/scripts/codex-generate.sh +5 -5
  730. package/scripts/devrites-detect.sh +33 -33
  731. package/scripts/eval-runner.py +7 -7
  732. package/scripts/grade-feature.sh +14 -14
  733. package/scripts/install-lib.sh +2 -2
  734. package/scripts/pin.sh +12 -12
  735. package/scripts/run-behavioral-evals.sh +12 -12
  736. package/scripts/run-evals.sh +1 -1
  737. package/scripts/run-outcome-evals.sh +12 -12
  738. package/scripts/scan-pack-security.py +4 -4
  739. package/scripts/scan-supply-chain-iocs.py +7 -7
  740. package/scripts/skills-inventory.mjs +7 -8
  741. package/scripts/sync-version.sh +2 -2
  742. package/scripts/validate-workflow-security.py +12 -6
  743. package/scripts/validate-workspace-schema.py +2 -2
  744. package/scripts/validate.sh +7 -7
@@ -7,7 +7,7 @@ import (
7
7
 
8
8
  // Hook control plane.
9
9
  //
10
- // Every wired hook has a canonical id its `hook <name>` CLI verb (allow,
10
+ // Every wired hook has a canonical id: its `hook <name>` CLI verb (allow,
11
11
  // orient, stop-gate, …). That id is the addressable handle for two orthogonal
12
12
  // runtime controls, both read from the environment so an operator tunes safety
13
13
  // vs speed without editing any JSON:
@@ -17,7 +17,7 @@ import (
17
17
  //
18
18
  // The profile is a floor: a hook runs when its tier is at or below the active
19
19
  // profile AND it is not in the kill list. Everything else short-circuits to a
20
- // clean fail-open no-op in cmdHook identical to the inline `command -v … ||
20
+ // clean fail-open no-op in cmdHook: identical to the inline `command -v … ||
21
21
  // exit 0` guard, so a disabled hook is indistinguishable from an absent binary.
22
22
  //
23
23
  // A SEPARATE axis is enforce-vs-observe: the OBSERVE-by-default guards (a1-guard,
@@ -31,23 +31,23 @@ type hookTier int
31
31
 
32
32
  const (
33
33
  tierMinimal hookTier = iota // orientation-only; never blocks or mutates flow
34
- tierStandard // the default working set gates, guards, caches
34
+ tierStandard // the default working set: gates, guards, caches
35
35
  tierStrict // reserved for experimental/aggressive hooks
36
36
  )
37
37
 
38
38
  // hookRegistry maps each canonical hook id to the profile tier that first
39
39
  // activates it. A name absent from the registry is treated as tierMinimal
40
- // (always active) fail-open: an unrecognised hook is never silently disabled
40
+ // (always active): fail-open: an unrecognised hook is never silently disabled
41
41
  // by the profile mechanism.
42
42
  var hookRegistry = map[string]hookTier{
43
- // minimal orientation and auto-approval, which never interrupt work.
43
+ // minimal: orientation and auto-approval, which never interrupt work.
44
44
  "allow": tierMinimal,
45
45
  "orient": tierMinimal,
46
46
  "subagent-orient": tierMinimal,
47
47
  "cursor": tierMinimal,
48
48
  "statusline": tierMinimal,
49
49
 
50
- // standard the default gates, guards, sentinels and caches.
50
+ // standard: the default gates, guards, sentinels and caches.
51
51
  "a1-guard": tierStandard,
52
52
  "stop-gate": tierStandard,
53
53
  "reviewer-readonly": tierStandard,
@@ -62,7 +62,7 @@ var hookRegistry = map[string]hookTier{
62
62
  }
63
63
 
64
64
  // hookProfileTier resolves DEVRITES_HOOK_PROFILE to a tier, defaulting to
65
- // standard on empty or unrecognised input (fail-open a typo never silently
65
+ // standard on empty or unrecognised input (fail-open: a typo never silently
66
66
  // strips the working set below default).
67
67
  func hookProfileTier() hookTier {
68
68
  switch strings.ToLower(strings.TrimSpace(os.Getenv("DEVRITES_HOOK_PROFILE"))) {
@@ -83,7 +83,7 @@ func hookActive(name string) bool {
83
83
  }
84
84
  tier, known := hookRegistry[name]
85
85
  if !known {
86
- return true // unknown id never disabled by profile
86
+ return true // unknown id: never disabled by profile
87
87
  }
88
88
  return tier <= hookProfileTier()
89
89
  }
@@ -105,7 +105,7 @@ func hookDisabled(name string) bool {
105
105
 
106
106
  // hookEnforce reports whether an OBSERVE-default guard should block rather than
107
107
  // log. It is true when the guard's own DEVRITES_*=enforce var is set, OR when
108
- // the strict profile is active strict enforces every guard at once.
108
+ // the strict profile is active: strict enforces every guard at once.
109
109
  func hookEnforce(specificVar string) bool {
110
110
  if os.Getenv(specificVar) == "enforce" {
111
111
  return true
package/engine/hooks.go CHANGED
@@ -22,13 +22,13 @@ import (
22
22
  // The engine's inline shell guard handles a missing binary; this handles a
23
23
  // present binary run outside a workspace.
24
24
  func hookOrient(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer) int {
25
- // The SessionStart payload is drained but unused orientation is a pure read
25
+ // The SessionStart payload is drained but unused: orientation is a pure read
26
26
  // of the workspace files, not a function of the harness's stdin.
27
27
  _, _ = io.Copy(io.Discard, stdin)
28
28
 
29
29
  root, err := orient.ResolveRoot(os.Getenv("DEVRITES_ROOT"))
30
30
  if err != nil {
31
- return exitOK // not a DevRites workspace silent no-op
31
+ return exitOK // not a DevRites workspace: silent no-op
32
32
  }
33
33
  text, has, err := orient.Digest(root)
34
34
  if err != nil {
@@ -58,7 +58,7 @@ func hookOrient(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer) in
58
58
  func hookStopGate(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer) int {
59
59
  in := h.ParseStopInput(stdin)
60
60
  if in.StopHookActive {
61
- return exitOK // already re-entered this stop cycle let it stop
61
+ return exitOK // already re-entered this stop cycle: let it stop
62
62
  }
63
63
  root, err := orient.ResolveRoot(os.Getenv("DEVRITES_ROOT"))
64
64
  if err != nil {
@@ -89,7 +89,7 @@ func hookStopGate(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer)
89
89
  }
90
90
 
91
91
  // allowReason is the auto-approval message the allow hook emits.
92
- const allowReason = "DevRites read-only orientation/gate command auto-approved by the devrites-allow hook"
92
+ const allowReason = "DevRites read-only orientation/gate command: auto-approved by the devrites-allow hook"
93
93
 
94
94
  var allowReadonlyCommands = map[string]bool{
95
95
  "check-acceptance": true,
@@ -213,10 +213,10 @@ func safeAllowArg(arg string) bool {
213
213
  // reviewerReadonlyDenyReason is the exact denial message
214
214
  // devrites-reviewer-readonly.sh emits. It must stay byte-identical to keep the
215
215
  // parity oracle green.
216
- const reviewerReadonlyDenyReason = "DevRites: reviewers are read-only. This Bash command can mutate or exfiltrate; inspect with Read/Grep/Glob and return findings do not modify the tree or reach the network. (devrites-reviewer-readonly)"
216
+ const reviewerReadonlyDenyReason = "DevRites: reviewers are read-only. This Bash command can mutate or exfiltrate; inspect with Read/Grep/Glob and return findings: do not modify the tree or reach the network. (devrites-reviewer-readonly)"
217
217
 
218
218
  // reviewerMutateRe matches a Bash command that could mutate the tree or reach the
219
- // network the deny-list ported verbatim from devrites-reviewer-readonly.sh. A
219
+ // network: the deny-list ported verbatim from devrites-reviewer-readonly.sh. A
220
220
  // fresh-context reviewer reads untrusted source, so a silent write/exfil path is
221
221
  // a prompt-injection surface (standards/security.md). pack-scan-ignore: this is
222
222
  // the hook's own defensive deny-list, not a payload.
@@ -225,7 +225,7 @@ const reviewerReadonlyDenyReason = "DevRites: reviewers are read-only. This Bash
225
225
  // this matches against the WHOLE command, while the bash hook's
226
226
  // `read -r tool cmd agent_type` truncates the command at its first newline and so
227
227
  // only ever scans line 1. A reviewer running a multi-line Bash whose later lines
228
- // mutate (e.g. `cat x\nsed -i …`) slips past the bash hook but is denied here
228
+ // mutate (e.g. `cat x\nsed -i …`) slips past the bash hook but is denied here:
229
229
  // intentional hardening of a latent bash bug, not a parity regression. (RE2's
230
230
  // `[[:space:]]` already matches `\n`, so no `(?m)` flag is needed for the `-i$`
231
231
  // alternative to fire at an interior line break.)
@@ -240,7 +240,7 @@ func hookReviewerReadonly(h harness.Harness, stdin io.Reader, stdout, stderr io.
240
240
  if err != nil {
241
241
  return exitOK
242
242
  }
243
- // Fast path: a payload with no tool call is not ours mirrors the script's
243
+ // Fast path: a payload with no tool call is not ours: mirrors the script's
244
244
  // `case "$input" in *'"tool_name"'*`.
245
245
  if !bytes.Contains(data, []byte(`"tool_name"`)) {
246
246
  return exitOK
@@ -300,19 +300,19 @@ var subagentOrientContext string
300
300
  // hookSubagentOrient injects the DevRites discipline into every devrites-* subagent
301
301
  // at spawn: a spawned subagent starts in a fresh context and neither auto-loads the
302
302
  // rite-* framework nor discovers skills the way the main thread does. It mirrors
303
- // devrites-subagent-orient.sh fire only for devrites-* agents, emit a fixed
303
+ // devrites-subagent-orient.sh: fire only for devrites-* agents, emit a fixed
304
304
  // context envelope, stay silent + fail-open otherwise.
305
305
  func hookSubagentOrient(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer) int {
306
306
  agentType := h.SubagentAgentType(stdin)
307
307
  if !strings.HasPrefix(agentType, "devrites-") {
308
- return exitOK // not a DevRites subagent (or no identity) silent no-op
308
+ return exitOK // not a DevRites subagent (or no identity): silent no-op
309
309
  }
310
310
  out, err := h.SubagentStartContext(strings.ReplaceAll(subagentOrientContext, "\r\n", "\n"))
311
311
  if err != nil {
312
312
  debugf(stderr, "subagent-orient: %v", err)
313
313
  return exitOK
314
314
  }
315
- // No trailing newline matches the script's `node ... process.stdout.write`.
315
+ // No trailing newline: matches the script's `node ... process.stdout.write`.
316
316
  fmt.Fprint(stdout, out)
317
317
  return exitOK
318
318
  }
@@ -41,7 +41,7 @@ func resolveWorkspaceDir(root, slug string) string {
41
41
  }
42
42
 
43
43
  // resolveWorkspace resolves the active feature's directory.
44
- // ok is false a silent no-op when there is no .devrites root or no active
44
+ // ok is false (a silent no-op) when there is no .devrites root or no active
45
45
  // feature, keeping the hooks fail-open outside a DevRites workspace.
46
46
  func resolveWorkspace() (root, slug, dir string, ok bool) {
47
47
  root, err := orient.ResolveRoot(os.Getenv("DEVRITES_ROOT"))
@@ -74,8 +74,8 @@ type auqEventJSON struct {
74
74
  // bloats the timeline.
75
75
  const auqFieldMax = 300
76
76
 
77
- // hookAUQ deterministically captures an AskUserQuestion exchange every
78
- // question with the user's chosen answer into the session trace, so HITL
77
+ // hookAUQ deterministically captures an AskUserQuestion exchange: every
78
+ // question with the user's chosen answer: into the session trace, so HITL
79
79
  // decisions are recorded at the substrate rather than trusted to the model's
80
80
  // bookkeeping. Capture only: it never tunes, blocks, or replies. Fail-open like
81
81
  // every workspace hook: unparseable payload, unknown response shape, or no
@@ -192,7 +192,7 @@ func hookHandoffSnapshot(stdin io.Reader, stdout, stderr io.Writer) int {
192
192
  next, _ := state.CursorField(stateLines, state.CursorNextAction)
193
193
  stamp := time.Now().UTC().Format(time.RFC3339)
194
194
  var b strings.Builder
195
- fmt.Fprintf(&b, "\n## Handoff snapshot %s\n", stamp)
195
+ fmt.Fprintf(&b, "\n## Handoff snapshot: %s\n", stamp)
196
196
  fmt.Fprintf(&b, "- Feature: %s\n", slug)
197
197
  if phase != "" {
198
198
  fmt.Fprintf(&b, "- Phase: %s\n", phase)
@@ -229,7 +229,7 @@ func hookCursor(stdin io.Reader, stdout, stderr io.Writer) int {
229
229
  afk, _ = state.CursorField(stateLines, state.CursorAFKSlicesRemaining)
230
230
  }
231
231
 
232
- fmt.Fprintf(stdout, "DevRites cursor active feature: %s\n", slug)
232
+ fmt.Fprintf(stdout, "DevRites cursor: active feature: %s\n", slug)
233
233
  if status != "" {
234
234
  fmt.Fprintf(stdout, " status: %s\n", status)
235
235
  }
@@ -241,7 +241,7 @@ func hookCursor(stdin io.Reader, stdout, stderr io.Writer) int {
241
241
  fmt.Fprintf(stdout, " AFK slices remaining: %s\n", afk)
242
242
  }
243
243
  if wsIsFile(filepath.Join(dir, ".red")) {
244
- fmt.Fprintln(stdout, " ⚠ tests/build RED resolve before stopping")
244
+ fmt.Fprintln(stdout, " ⚠ tests/build RED: resolve before stopping")
245
245
  }
246
246
  return exitOK
247
247
  }
@@ -281,7 +281,7 @@ var (
281
281
  redPassRe = regexp.MustCompile(`(?im)PASS(ED)?|0[[:space:]]+(failed|failing|errors?)|all tests passed|BUILD SUCC(ESS|EEDED)|succeeded|no (errors|problems|issues)|(^|[^a-z])ok([^a-z]|$)|✓`)
282
282
  )
283
283
 
284
- const redReasonFmt = "DevRites: tests/build are RED (%s). Fix to green or record the failure + next step in state.md before stopping the Stop gate blocks an end-of-turn while .red is set."
284
+ const redReasonFmt = "DevRites: tests/build are RED (%s). Fix to green or record the failure + next step in state.md before stopping: the Stop gate blocks an end-of-turn while .red is set."
285
285
 
286
286
  // hookRedwatch is the fail-on-red sentinel (PostToolUse Bash). After a test / build
287
287
  // / lint command it sets or clears <featureDir>/.red so the Stop gate can refuse to
@@ -339,7 +339,7 @@ func redwatchSafe(cmd string) string {
339
339
  // node regex the shell guards use.
340
340
  var patchPathRe = regexp.MustCompile(`(?m)^\*\*\* (?:(?:Add|Update|Delete) File|Move to): (.+)$`)
341
341
 
342
- // isEditTool reports whether a tool can write source the Edit family plus
342
+ // isEditTool reports whether a tool can write source: the Edit family plus
343
343
  // Codex's apply_patch.
344
344
  func isEditTool(tool string) bool {
345
345
  switch tool {
@@ -364,10 +364,10 @@ func underDevrites(abs, root string) bool {
364
364
  return strings.HasPrefix(abs, root+string(filepath.Separator))
365
365
  }
366
366
 
367
- const a1DenyReason = "DevRites A1: the orchestrator must not edit source mid-build the slice-wright is the only writer. Re-dispatch the wright (continue it once) or stop + escalate; do not patch the code yourself. (devrites-a1-guard)"
367
+ const a1DenyReason = "DevRites A1: the orchestrator must not edit source mid-build: the slice-wright is the only writer. Re-dispatch the wright (continue it once) or stop + escalate; do not patch the code yourself. (devrites-a1-guard)"
368
368
 
369
369
  // hookA1Guard keeps the /rite-build orchestrator from editing source while a slice
370
- // is mid-build the slice-wright (a subagent) is the only sanctioned writer of
370
+ // is mid-build: the slice-wright (a subagent) is the only sanctioned writer of
371
371
  // code. Ported from devrites-a1-guard.sh onto the new schema: FAIL-OPEN, OBSERVE by
372
372
  // default (logs to .a1-guard.log), blocking only when the build window is open, the
373
373
  // edit is source from the MAIN thread, and enforce mode is on.
@@ -451,7 +451,7 @@ func hookA1Guard(h harness.Harness, stdin io.Reader, stdout, stderr io.Writer) i
451
451
  return exitOK
452
452
  }
453
453
 
454
- const wrightDenyReason = "DevRites scope: this path is not in touched-files.md. Build only the slice contract; if the slice genuinely needs this file, return an Escalation so the orchestrator routes it through the Spec Drift Guard do not widen scope yourself. (devrites-wright-scope)"
454
+ const wrightDenyReason = "DevRites scope: this path is not in touched-files.md. Build only the slice contract; if the slice genuinely needs this file, return an Escalation so the orchestrator routes it through the Spec Drift Guard: do not widen scope yourself. (devrites-wright-scope)"
455
455
 
456
456
  // hookWrightScope fences the slice-wright to its slice: it denies an Edit/Write to a
457
457
  // path not listed in the feature's touched-files.md. Ported from
@@ -1,5 +1,5 @@
1
- // Package doctor reports the version triangle the engine binary, the installed
2
- // DevRites pack, and the on-disk .devrites state schema and a clear skew
1
+ // Package doctor reports the version triangle: the engine binary, the installed
2
+ // DevRites pack, and the on-disk .devrites state schema, and a clear skew
3
3
  // verdict. Version skew is a leading cause of silent breakage; doctor turns it
4
4
  // into one legible line. Everything here is a read; doctor never mutates state.
5
5
  package doctor
@@ -16,7 +16,7 @@ import (
16
16
  )
17
17
 
18
18
  // Unknown is the pack value reported when the installed pack version can't be
19
- // discovered skew against an unknown pack is not asserted.
19
+ // discovered: skew against an unknown pack is not asserted.
20
20
  const Unknown = "unknown"
21
21
 
22
22
  // Report is the resolved version triangle plus its verdict.
@@ -45,7 +45,7 @@ func Diagnose(projectDir, root string) (*Report, error) {
45
45
  return nil, fmt.Errorf("read state schema: %w", err)
46
46
  }
47
47
  if stateSchema == 0 {
48
- // Nothing on disk declares a version treat it as the current schema;
48
+ // Nothing on disk declares a version: treat it as the current schema;
49
49
  // undeclared state is read as the engine's own version.
50
50
  stateSchema = state.SchemaVersion
51
51
  }
@@ -61,10 +61,10 @@ func Diagnose(projectDir, root string) (*Report, error) {
61
61
  switch {
62
62
  case r.StateSchema > r.BinarySchema:
63
63
  r.Refuse = true
64
- r.Verdict = fmt.Sprintf("REFUSE: state schema v%d is newer than this binary supports (v%d) update devrites",
64
+ r.Verdict = fmt.Sprintf("REFUSE: state schema v%d is newer than this binary supports (v%d): update devrites",
65
65
  r.StateSchema, r.BinarySchema)
66
66
  case r.packSkew():
67
- r.Verdict = fmt.Sprintf("WARN: binary %s is older than the installed pack %s update the devrites-engine binary",
67
+ r.Verdict = fmt.Sprintf("WARN: binary %s is older than the installed pack %s: update the devrites-engine binary",
68
68
  r.Binary, r.Pack)
69
69
  default:
70
70
  r.Verdict = "ok: binary, pack, and state schema are compatible"
@@ -131,7 +131,7 @@ func driftChecks(projectDir string) []string {
131
131
  checks = append(checks, "WARN: .claude/settings.json exists but does not reference devrites-engine hooks")
132
132
  }
133
133
  } else if isDir(filepath.Join(projectDir, ".claude")) {
134
- checks = append(checks, "WARN: .claude/settings.json missing Claude hooks/statusline may be absent")
134
+ checks = append(checks, "WARN: .claude/settings.json missing: Claude hooks/statusline may be absent")
135
135
  }
136
136
  if isDir(filepath.Join(projectDir, ".claude", "skills")) && !isDir(filepath.Join(projectDir, ".agents", "skills")) {
137
137
  checks = append(checks, "WARN: Claude skills installed but Codex skill mirror .agents/skills is missing")
@@ -2,7 +2,7 @@
2
2
  //
3
3
  // Enforcement is phase-relative, gate-scoped, and transition-fired: a gate
4
4
  // checks only the sections required to make its transition, and only when it is
5
- // run never on every tool call. A block is a HITL pause (a structured
5
+ // run: never on every tool call. A block is a HITL pause (a structured
6
6
  // "missing X" the human resolves and retries), never a crash. Judgment gates
7
7
  // stay advisory; these deterministic gates are the ones allowed to block.
8
8
  package gate
@@ -23,10 +23,10 @@ type Kind string
23
23
 
24
24
  const (
25
25
  // Readiness checks the sections required to LEAVE the feature's current
26
- // phase the gate fired when advancing to the next phase.
26
+ // phase: the gate fired when advancing to the next phase.
27
27
  Readiness Kind = "readiness"
28
28
  // Seal checks the full seal-phase requirement set regardless of the
29
- // feature's current phase the final completeness gate before shipping.
29
+ // feature's current phase: the final completeness gate before shipping.
30
30
  Seal Kind = "seal"
31
31
  )
32
32
 
@@ -44,7 +44,7 @@ type Result struct {
44
44
  // Check runs a gate against feature <slug> under root, reading the files
45
45
  // directly (the files are always the source of truth, so a gate never trusts a
46
46
  // possibly-stale cache). It returns an error only for a genuinely broken request
47
- // (unknown slug, unreadable state) a legitimately incomplete feature is a
47
+ // (unknown slug, unreadable state): a legitimately incomplete feature is a
48
48
  // Result with Blocked set, not an error.
49
49
  func Check(kind Kind, root, slug string) (*Result, error) {
50
50
  f, err := state.LoadFeature(root, slug)
@@ -68,7 +68,7 @@ func Check(kind Kind, root, slug string) (*Result, error) {
68
68
 
69
69
  // Render produces the deterministic, greppable gate output (with a trailing
70
70
  // newline). A block names exactly the missing sections and the resolve step, so
71
- // a human or an AFK agent knows precisely what to fix.
71
+ // a human (or an AFK agent) knows precisely what to fix.
72
72
  func (r *Result) Render() string {
73
73
  var b strings.Builder
74
74
  fmt.Fprintf(&b, "gate: %s\n", r.Kind)
@@ -92,10 +92,10 @@ func (r *Result) Render() string {
92
92
  // StopGate evaluates the stop-hook rest-point invariant for the active feature:
93
93
  // a feature that CLAIMS completion (it has advanced to seal, ship, or done)
94
94
  // must not have an empty proof section. This is a rest-point check, NOT
95
- // whole-feature completeness normal in-progress incompleteness never trips it,
95
+ // whole-feature completeness: normal in-progress incompleteness never trips it,
96
96
  // so a mid-build turn is never blocked.
97
97
  //
98
- // It returns a zero StopResult (Blocked false) silent, no block when there
98
+ // It returns a zero StopResult (Blocked false) (silent, no block) when there
99
99
  // is no active feature or the workspace can't be read, keeping the stop hook
100
100
  // fail-open.
101
101
  func StopGate(root string) (StopResult, error) {
@@ -108,7 +108,7 @@ func StopGate(root string) (StopResult, error) {
108
108
  return StopResult{}, nil // fail-open: a broken workspace never wedges Stop
109
109
  }
110
110
  // Fail-on-red: the redwatch hook marks a known-red suite by writing .red. A turn
111
- // must not rest while it is set evidence over confidence. This is a rest-point
111
+ // must not rest while it is set: evidence over confidence. This is a rest-point
112
112
  // invariant (a concrete, provable inconsistency), not whole-feature completeness.
113
113
  featureDir := devritespaths.FeatureDir(root, slug)
114
114
  if _, statErr := os.Stat(filepath.Join(featureDir, ".red")); statErr == nil {
@@ -116,7 +116,7 @@ func StopGate(root string) (StopResult, error) {
116
116
  Slug: slug,
117
117
  Blocked: true,
118
118
  Reason: fmt.Sprintf(
119
- "feature %q has tests/build RED (.red is set) fix to green, or record the failure and next step, before stopping",
119
+ "feature %q has tests/build RED (.red is set): fix to green, or record the failure and next step, before stopping",
120
120
  slug),
121
121
  }, nil
122
122
  }
@@ -125,7 +125,7 @@ func StopGate(root string) (StopResult, error) {
125
125
  Slug: slug,
126
126
  Blocked: true,
127
127
  Reason: fmt.Sprintf(
128
- "feature %q has open %s human question(s) in questions.md but state.md is not awaiting_human surface the gate before stopping",
128
+ "feature %q has open %s human question(s) in questions.md but state.md is not awaiting_human: surface the gate before stopping",
129
129
  slug, strings.Join(gates, "/")),
130
130
  }, nil
131
131
  }
@@ -135,7 +135,7 @@ func StopGate(root string) (StopResult, error) {
135
135
  Slug: slug,
136
136
  Blocked: true,
137
137
  Reason: fmt.Sprintf(
138
- "feature %q is at phase %q but proof.md is empty record acceptance evidence, or move the phase back, before stopping",
138
+ "feature %q is at phase %q but proof.md is empty: record acceptance evidence, or move the phase back, before stopping",
139
139
  slug, f.Phase),
140
140
  }, nil
141
141
  }
@@ -95,7 +95,7 @@ func RenderMatrix() string {
95
95
  }
96
96
  b.WriteString("\nTiers: **Native** (the harness exposes and delivers the surface directly; policy notes state whether it blocks) · **Adapter-backed** ")
97
97
  b.WriteString("(supported through a translation shim) · **Instruction-backed** ")
98
- b.WriteString("(no runtime surface rides on a directive the model may under-fire) · ")
98
+ b.WriteString("(no runtime surface: rides on a directive the model may under-fire) · ")
99
99
  b.WriteString("**Conditional** (native but gated on an operator precondition).\n\n")
100
100
  b.WriteString(MatrixEndMarker)
101
101
  return b.String()
@@ -3,7 +3,7 @@
3
3
  // One binary serves both Claude Code and Codex. The shared gate/orientation
4
4
  // logic lives in the middle (internal/orient, internal/gate); this package
5
5
  // translates each harness's hook stdin schema and its exit/decision convention.
6
- // The engine never calls a model these adapters only shape stdin/stdout.
6
+ // The engine never calls a model: these adapters only shape stdin/stdout.
7
7
  package harness
8
8
 
9
9
  import (
@@ -93,7 +93,7 @@ type StopInput struct {
93
93
  }
94
94
 
95
95
  // ParseStopInput decodes a Stop hook's stdin. An empty or malformed payload is
96
- // not an error it decodes to the zero value (StopHookActive false), so a
96
+ // not an error: it decodes to the zero value (StopHookActive false), so a
97
97
  // harness that sends nothing simply gets a first-pass gate check. This keeps the
98
98
  // hook fail-open: bad stdin never crashes it.
99
99
  func (h Harness) ParseStopInput(r io.Reader) StopInput {
@@ -107,8 +107,8 @@ func (h Harness) ParseStopInput(r io.Reader) StopInput {
107
107
  }
108
108
 
109
109
  // PreToolInput is the subset of a PreToolUse hook's stdin the reviewer-readonly
110
- // guard reads: which tool is about to run, its command, and for the optional
111
- // agent-scoping gate the calling subagent's name. Every field is best-effort:
110
+ // guard reads: which tool is about to run, its command, and: for the optional
111
+ // agent-scoping gate: the calling subagent's name. Every field is best-effort:
112
112
  // a hook that can't identify the tool simply falls through to its silent no-op.
113
113
  type PreToolInput struct {
114
114
  ToolName string
@@ -118,7 +118,7 @@ type PreToolInput struct {
118
118
 
119
119
  // ParsePreToolInput decodes a PreToolUse payload. Like ParseStopInput it never
120
120
  // errors: an empty or malformed payload decodes to the zero value so a guard hook
121
- // stays fail-open. AgentType reads `agent_type` ONLY matching
121
+ // stays fail-open. AgentType reads `agent_type` ONLY: matching
122
122
  // devrites-reviewer-readonly.sh's node parse exactly (it does not consult the
123
123
  // subagent_type / agentType aliases; SubagentAgentType does, for the subagent
124
124
  // hook that needs them).
@@ -145,7 +145,7 @@ func (h Harness) ParsePreToolInput(r io.Reader) PreToolInput {
145
145
 
146
146
  // SubagentAgentType decodes just the spawned subagent's name from a SubagentStart
147
147
  // payload, reading whichever of agent_type / subagent_type / agentType the harness
148
- // populates (Claude and Codex differ) the exact 3-way fallback
148
+ // populates (Claude and Codex differ): the exact 3-way fallback
149
149
  // devrites-subagent-orient.sh uses. Never errors: bad stdin yields "".
150
150
  func (h Harness) SubagentAgentType(r io.Reader) string {
151
151
  var raw struct {
@@ -198,7 +198,7 @@ type preToolEnvelope struct {
198
198
  // GuardInput is the fuller PreToolUse / PostToolUse payload the write-guards read:
199
199
  // the tool + its command / target path, the calling subagent's identity (both the
200
200
  // agent_id Claude sends and the agent_type Codex sends), and the tool's response
201
- // text (for the post-hooks that inspect output). Best-effort bad stdin yields
201
+ // text (for the post-hooks that inspect output). Best-effort: bad stdin yields
202
202
  // the zero value so a guard stays fail-open.
203
203
  type GuardInput struct {
204
204
  ToolName string
@@ -16,6 +16,7 @@ import (
16
16
  "os/exec"
17
17
  "path/filepath"
18
18
  "reflect"
19
+ "runtime"
19
20
  "slices"
20
21
  "sort"
21
22
  "strings"
@@ -30,6 +31,7 @@ import (
30
31
 
31
32
  const ManifestName = devritespaths.ManifestName
32
33
  const defaultRepo = "ViktorsBaikers/DevRites"
34
+ const githubBaseURL = "https://github.com"
33
35
 
34
36
  type Mode string
35
37
 
@@ -69,15 +71,17 @@ type stats struct {
69
71
  }
70
72
 
71
73
  type runner struct {
72
- opts Options
73
- target string
74
- payload string
75
- payloadFS fs.FS
76
- source string
77
- manifest []string
78
- records map[string]string
79
- prev map[string]bool
80
- stats stats
74
+ opts Options
75
+ target string
76
+ payload string
77
+ payloadFS fs.FS
78
+ source string
79
+ manifest []string
80
+ records map[string]string
81
+ prev map[string]bool
82
+ stats stats
83
+ releaseBinaryTag string
84
+ preparedBinary string
81
85
  }
82
86
 
83
87
  func DefaultOptions(mode Mode) Options {
@@ -849,7 +853,20 @@ func runUpdate(opts Options) error {
849
853
  if opts.DryRun {
850
854
  next.DryRun = true
851
855
  }
852
- return Apply(next)
856
+ r, err := newRunner(next)
857
+ if err != nil {
858
+ return fmt.Errorf("prepare installer: %w", err)
859
+ }
860
+ r.releaseBinaryTag = latestTag
861
+ if next.WithBinary && os.Getenv("DEVRITES_NO_BINARY") != "1" && !next.DryRun {
862
+ staged, cleanup, err := r.acquireBinary(latestTag, githubBaseURL)
863
+ if err != nil {
864
+ return fmt.Errorf("prepare engine binary: %w", err)
865
+ }
866
+ defer cleanup()
867
+ r.preparedBinary = staged
868
+ }
869
+ return r.install()
853
870
  }
854
871
 
855
872
  func resolveUpdateTag(opts Options) (string, error) {
@@ -1185,6 +1202,8 @@ func containsDevritesHook(v any) bool {
1185
1202
 
1186
1203
  func isDevritesHooksComment(comment string) bool {
1187
1204
  return comment == "DevRites hooks" ||
1205
+ strings.HasPrefix(comment, "DevRites hooks: every event invokes the global `devrites-engine` engine binary") ||
1206
+ strings.HasPrefix(comment, "DevRites hooks: auto-approve the read-only orientation/gate scripts") ||
1188
1207
  strings.HasPrefix(comment, "DevRites hooks — every event invokes the global `devrites-engine` engine binary") ||
1189
1208
  strings.HasPrefix(comment, "DevRites hooks — auto-approve the read-only orientation/gate scripts") ||
1190
1209
  strings.HasPrefix(comment, "DevRites hooks for Codex. Project hooks load only after")
@@ -1295,24 +1314,24 @@ func (r *runner) installBinary() error {
1295
1314
  return nil
1296
1315
  }
1297
1316
  }
1298
- staged, cleanup, err := r.acquireBinary(tag)
1299
- if err != nil {
1300
- fmt.Fprintf(r.opts.Stderr, "warning: engine binary: %v - hooks fail open until you install it.\n", err)
1301
- return nil
1317
+ staged, cleanup := r.preparedBinary, func() {}
1318
+ if staged == "" {
1319
+ var err error
1320
+ staged, cleanup, err = r.acquireBinary(tag, githubBaseURL)
1321
+ if err != nil {
1322
+ return r.binaryInstallFailure(err)
1323
+ }
1302
1324
  }
1303
1325
  defer cleanup()
1304
1326
  if err := os.MkdirAll(filepath.Dir(dest), 0o755); err != nil {
1305
- fmt.Fprintf(r.opts.Stderr, "warning: engine binary: %v - hooks fail open until you install it.\n", err)
1306
- return nil
1327
+ return r.binaryInstallFailure(err)
1307
1328
  }
1308
1329
  data, err := os.ReadFile(staged)
1309
1330
  if err != nil {
1310
- fmt.Fprintf(r.opts.Stderr, "warning: engine binary: %v - hooks fail open until you install it.\n", err)
1311
- return nil
1331
+ return r.binaryInstallFailure(err)
1312
1332
  }
1313
1333
  if err := fsutil.WriteFileAtomic(dest, data, 0o755); err != nil {
1314
- fmt.Fprintf(r.opts.Stderr, "warning: engine binary: %v - hooks fail open until you install it.\n", err)
1315
- return nil
1334
+ return r.binaryInstallFailure(err)
1316
1335
  }
1317
1336
  _ = os.Chmod(dest, 0o755)
1318
1337
  fmt.Fprintf(r.opts.Stdout, " engine binary: installed %s\n", dest)
@@ -1322,12 +1341,23 @@ func (r *runner) installBinary() error {
1322
1341
  return nil
1323
1342
  }
1324
1343
 
1325
- func (r *runner) acquireBinary(tag string) (string, func(), error) {
1344
+ func (r *runner) binaryInstallFailure(err error) error {
1345
+ if r.preparedBinary != "" {
1346
+ return err
1347
+ }
1348
+ fmt.Fprintf(r.opts.Stderr, "warning: engine binary: %v - hooks fail open until you install it.\n", err)
1349
+ return nil
1350
+ }
1351
+
1352
+ func (r *runner) acquireBinary(tag, baseURL string) (string, func(), error) {
1326
1353
  if v := os.Getenv("DEVRITES_ENGINE_CLI"); v != "" {
1327
1354
  if exists(v) {
1328
- return v, func() {}, nil
1355
+ if r.releaseBinaryTag == "" || strings.TrimPrefix(engineVersion(v), "v") == strings.TrimPrefix(r.releaseBinaryTag, "v") {
1356
+ return v, func() {}, nil
1357
+ }
1358
+ } else {
1359
+ return "", func() {}, fmt.Errorf("DEVRITES_ENGINE_CLI points to a missing binary: %s", v)
1329
1360
  }
1330
- return "", func() {}, fmt.Errorf("DEVRITES_ENGINE_CLI points to a missing binary: %s", v)
1331
1361
  }
1332
1362
  tmp, err := os.MkdirTemp("", "devrites-engine-*")
1333
1363
  if err != nil {
@@ -1335,19 +1365,60 @@ func (r *runner) acquireBinary(tag string) (string, func(), error) {
1335
1365
  }
1336
1366
  cleanup := func() { _ = os.RemoveAll(tmp) }
1337
1367
  staged := filepath.Join(tmp, "devrites-engine")
1368
+ var releaseErr error
1369
+ if r.releaseBinaryTag != "" && os.Getenv("DEVRITES_UPDATE_BUNDLE") == "" {
1370
+ repo := os.Getenv("DEVRITES_REPO")
1371
+ if repo == "" {
1372
+ repo = defaultRepo
1373
+ }
1374
+ downloaded, err := downloadReleaseBinary(baseURL, repo, r.releaseBinaryTag, staged)
1375
+ if err == nil {
1376
+ return staged, cleanup, nil
1377
+ }
1378
+ if downloaded {
1379
+ return "", cleanup, err
1380
+ }
1381
+ releaseErr = err
1382
+ }
1338
1383
  if r.source != "" && exists(filepath.Join(r.source, "engine", "go.mod")) {
1339
1384
  ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
1340
1385
  defer cancel()
1341
- cmd := exec.CommandContext(ctx, "go", "build", "-trimpath", "-ldflags", "-s -w -X github.com/devrites/devrites/internal/version.Version="+tag, "-o", staged, ".")
1386
+ cmd := exec.CommandContext(ctx, "go", "build", "-buildvcs=false", "-trimpath", "-ldflags", "-s -w -X github.com/devrites/devrites/internal/version.Version="+tag, "-o", staged, ".")
1342
1387
  cmd.Dir = filepath.Join(r.source, "engine")
1343
1388
  if out, err := cmd.CombinedOutput(); err != nil {
1389
+ if releaseErr != nil {
1390
+ return "", cleanup, fmt.Errorf("could not download release binary: %v; source fallback failed: %w: %s", releaseErr, err, strings.TrimSpace(string(out)))
1391
+ }
1344
1392
  return "", cleanup, fmt.Errorf("could not build from source: %w: %s", err, strings.TrimSpace(string(out)))
1345
1393
  }
1346
1394
  return staged, cleanup, nil
1347
1395
  }
1396
+ if releaseErr != nil {
1397
+ return "", cleanup, fmt.Errorf("could not obtain a binary: %v; no Go source fallback", releaseErr)
1398
+ }
1348
1399
  return "", cleanup, fmt.Errorf("could not obtain a binary (no DEVRITES_ENGINE_CLI handoff, no Go source)")
1349
1400
  }
1350
1401
 
1402
+ func downloadReleaseBinary(baseURL, repo, tag, dest string) (bool, error) {
1403
+ asset := fmt.Sprintf("devrites-%s-%s", runtime.GOOS, runtime.GOARCH)
1404
+ if runtime.GOOS == "windows" {
1405
+ asset += ".exe"
1406
+ }
1407
+ url := fmt.Sprintf("%s/%s/releases/download/%s/%s", strings.TrimRight(baseURL, "/"), repo, tag, asset)
1408
+ if err := iohooks.DownloadFile(url, dest); err != nil {
1409
+ return false, fmt.Errorf("download %s: %w", asset, err)
1410
+ }
1411
+ sumPath := dest + ".sha256"
1412
+ defer os.Remove(sumPath)
1413
+ if err := iohooks.DownloadFile(url+".sha256", sumPath); err != nil {
1414
+ return true, fmt.Errorf("could not verify release binary %s: missing checksum: %w", asset, err)
1415
+ }
1416
+ if err := verifySHA256(dest, sumPath); err != nil {
1417
+ return true, fmt.Errorf("could not verify release binary %s: %w", asset, err)
1418
+ }
1419
+ return true, nil
1420
+ }
1421
+
1351
1422
  func (r *runner) removeBinary() error {
1352
1423
  if r.opts.KeepBinary {
1353
1424
  fmt.Fprintln(r.opts.Stdout, " kept the global devrites-engine binary (--keep-binary).")