devrites 4.0.12 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (283) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +3 -3
  3. package/docs/architecture.md +4 -4
  4. package/docs/command-map.md +4 -3
  5. package/docs/engine/commands.md +65 -6
  6. package/docs/flow.md +2 -1
  7. package/docs/orchestration.md +45 -4
  8. package/docs/skills.md +4 -3
  9. package/engine/go.mod +1 -1
  10. package/engine/internal/devritespaths/paths.go +5 -4
  11. package/engine/internal/gate/gate.go +154 -46
  12. package/engine/internal/gate/gate_test.go +290 -2
  13. package/engine/internal/gate/readiness_binding.go +66 -100
  14. package/engine/internal/gate/readiness_binding_test.go +126 -3
  15. package/engine/internal/hostpack/hostpack.go +9 -4
  16. package/engine/internal/hostpack/hostpack_test.go +16 -7
  17. package/engine/internal/install/install_test.go +5 -0
  18. package/engine/internal/lib/resolve.go +6 -6
  19. package/engine/internal/state/cmd/workflowmanifest/main.go +32 -3
  20. package/engine/internal/state/feature.go +1 -100
  21. package/engine/internal/state/observation.go +584 -0
  22. package/engine/internal/state/observation_open_other.go +9 -0
  23. package/engine/internal/state/observation_open_unix.go +12 -0
  24. package/engine/internal/state/observation_test.go +960 -0
  25. package/engine/internal/state/observation_unix_test.go +68 -0
  26. package/engine/internal/state/schema.go +60 -160
  27. package/engine/internal/state/state_test.go +489 -101
  28. package/engine/internal/state/status.go +67 -48
  29. package/engine/tests/adr_0004_required_by_phase_test.go +16 -13
  30. package/engine/tests/adr_0011_define_plan_test.go +14 -12
  31. package/engine/tests/gate_test.go +403 -28
  32. package/engine/tests/workspace_observation_migration_test.go +1065 -0
  33. package/pack/.claude/agents/devrites-code-reviewer.md +6 -1
  34. package/pack/.claude/agents/devrites-plan-drafter.md +5 -0
  35. package/pack/.claude/agents/devrites-plan-reviewer.md +6 -0
  36. package/pack/.claude/agents/devrites-proof-runner.md +7 -1
  37. package/pack/.claude/agents/devrites-retrospector.md +21 -25
  38. package/pack/.claude/agents/devrites-security-auditor.md +7 -3
  39. package/pack/.claude/agents/devrites-slice-wright.md +30 -4
  40. package/pack/.claude/agents/devrites-spec-reviewer.md +5 -0
  41. package/pack/.claude/agents/devrites-strategy-reviewer.md +3 -4
  42. package/pack/.claude/agents/devrites-test-analyst.md +5 -0
  43. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +13 -26
  44. package/pack/.claude/skills/devrites-debug-recovery/reference/build-the-loop.md +11 -14
  45. package/pack/.claude/skills/devrites-doubt/SKILL.md +3 -4
  46. package/pack/.claude/skills/devrites-frontend-craft/reference/reuse-first.md +3 -4
  47. package/pack/.claude/skills/devrites-lib/reference/standards/README.md +5 -1
  48. package/pack/.claude/skills/devrites-lib/reference/standards/acceptance-preserving-reslice.md +30 -0
  49. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +35 -17
  50. package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +11 -3
  51. package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +19 -0
  52. package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
  53. package/pack/.claude/skills/devrites-lib/reference/standards/core.md +5 -0
  54. package/pack/.claude/skills/devrites-lib/reference/standards/data-integrity.md +95 -0
  55. package/pack/.claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -5
  56. package/pack/.claude/skills/devrites-lib/reference/standards/documentation.md +28 -29
  57. package/pack/.claude/skills/devrites-lib/reference/standards/edge-case-trace.md +70 -10
  58. package/pack/.claude/skills/devrites-lib/reference/standards/integration-reliability.md +79 -0
  59. package/pack/.claude/skills/devrites-lib/reference/standards/loop-operations.md +85 -0
  60. package/pack/.claude/skills/devrites-lib/reference/standards/observability.md +10 -0
  61. package/pack/.claude/skills/devrites-lib/reference/standards/one-shot-actions.md +1 -6
  62. package/pack/.claude/skills/devrites-lib/reference/standards/patterns.md +20 -0
  63. package/pack/.claude/skills/devrites-lib/reference/standards/repository-topology.md +73 -0
  64. package/pack/.claude/skills/devrites-lib/reference/standards/security-checklist.md +6 -2
  65. package/pack/.claude/skills/devrites-lib/reference/standards/security.md +51 -16
  66. package/pack/.claude/skills/devrites-lib/reference/standards/skill-authoring.md +35 -40
  67. package/pack/.claude/skills/devrites-lib/reference/standards/test-proof-checklist.md +4 -0
  68. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +51 -6
  69. package/pack/.claude/skills/devrites-lib/reference/standards/workflow-artifacts.md +411 -102
  70. package/pack/.claude/skills/rite/SKILL.md +2 -0
  71. package/pack/.claude/skills/rite-adopt/SKILL.md +8 -10
  72. package/pack/.claude/skills/rite-adopt/reference/adoption.md +13 -15
  73. package/pack/.claude/skills/rite-autocomplete/SKILL.md +98 -139
  74. package/pack/.claude/skills/rite-autocomplete/reference/decision-policy.md +11 -5
  75. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +99 -114
  76. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +92 -124
  77. package/pack/.claude/skills/rite-build/SKILL.md +51 -73
  78. package/pack/.claude/skills/rite-build/reference/phase-contract.md +9 -18
  79. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +37 -4
  80. package/pack/.claude/skills/rite-clarify/SKILL.md +3 -2
  81. package/pack/.claude/skills/rite-converge/SKILL.md +4 -2
  82. package/pack/.claude/skills/rite-converge/reference/convergence-assessment.md +8 -4
  83. package/pack/.claude/skills/rite-customize/SKILL.md +16 -18
  84. package/pack/.claude/skills/rite-define/SKILL.md +60 -62
  85. package/pack/.claude/skills/rite-define/reference/plan-template.md +88 -71
  86. package/pack/.claude/skills/rite-explain/SKILL.md +2 -1
  87. package/pack/.claude/skills/rite-learn/SKILL.md +28 -32
  88. package/pack/.claude/skills/rite-plan/SKILL.md +53 -56
  89. package/pack/.claude/skills/rite-plan/reference/anti-patterns.md +11 -1
  90. package/pack/.claude/skills/rite-plan/reference/dependency-graph.md +11 -2
  91. package/pack/.claude/skills/rite-plan/reference/replan-and-repair.md +10 -3
  92. package/pack/.claude/skills/rite-plan/reference/task-breakdown.md +2 -0
  93. package/pack/.claude/skills/rite-polish/reference/adr-promotion.md +7 -7
  94. package/pack/.claude/skills/rite-pressure-test/SKILL.md +24 -31
  95. package/pack/.claude/skills/rite-prove/SKILL.md +95 -156
  96. package/pack/.claude/skills/rite-prove/reference/acceptance-proof.md +28 -0
  97. package/pack/.claude/skills/rite-review/SKILL.md +5 -4
  98. package/pack/.claude/skills/rite-review/reference/five-axis-review.md +6 -0
  99. package/pack/.claude/skills/rite-review/reference/security-review.md +7 -2
  100. package/pack/.claude/skills/rite-seal/reference/final-evidence.md +3 -0
  101. package/pack/.claude/skills/rite-seal/reference/risk-and-rollback.md +19 -4
  102. package/pack/.claude/skills/rite-ship/reference/rollout.md +62 -43
  103. package/pack/.claude/skills/rite-spec/SKILL.md +8 -1
  104. package/pack/.claude/skills/rite-spec/reference/ai-spec-template.md +13 -6
  105. package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +14 -2
  106. package/pack/.claude/skills/rite-spec/reference/spec-template.md +33 -4
  107. package/pack/.claude/skills/rite-temper/SKILL.md +5 -1
  108. package/pack/.claude/skills/rite-vet/SKILL.md +121 -174
  109. package/pack/.claude/skills/rite-vet/reference/anti-patterns.md +14 -2
  110. package/pack/.claude/skills/rite-vet/reference/artifacts.md +15 -9
  111. package/pack/.claude/skills/rite-vet/reference/depth.md +10 -3
  112. package/pack/.claude/skills/rite-vet/reference/review-axes.md +75 -77
  113. package/pack/.claude/skills/rite-watch-pr/SKILL.md +85 -0
  114. package/pack/.claude/skills/rite-zoom-out/SKILL.md +4 -5
  115. package/pack/.claude/workflows/devrites-readonly-review.js +194 -0
  116. package/pack/generated/README.md +1 -1
  117. package/pack/generated/claude/agents/devrites-code-reviewer.md +6 -1
  118. package/pack/generated/claude/agents/devrites-plan-drafter.md +5 -0
  119. package/pack/generated/claude/agents/devrites-plan-reviewer.md +6 -0
  120. package/pack/generated/claude/agents/devrites-proof-runner.md +7 -1
  121. package/pack/generated/claude/agents/devrites-retrospector.md +21 -25
  122. package/pack/generated/claude/agents/devrites-security-auditor.md +7 -3
  123. package/pack/generated/claude/agents/devrites-slice-wright.md +30 -4
  124. package/pack/generated/claude/agents/devrites-spec-reviewer.md +5 -0
  125. package/pack/generated/claude/agents/devrites-strategy-reviewer.md +3 -4
  126. package/pack/generated/claude/agents/devrites-test-analyst.md +5 -0
  127. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +13 -26
  128. package/pack/generated/claude/skills/devrites-debug-recovery/reference/build-the-loop.md +11 -14
  129. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +3 -4
  130. package/pack/generated/claude/skills/devrites-frontend-craft/reference/reuse-first.md +3 -4
  131. package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +5 -1
  132. package/pack/generated/claude/skills/devrites-lib/reference/standards/acceptance-preserving-reslice.md +30 -0
  133. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +35 -17
  134. package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +11 -3
  135. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +19 -0
  136. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +1 -1
  137. package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +5 -0
  138. package/pack/generated/claude/skills/devrites-lib/reference/standards/data-integrity.md +95 -0
  139. package/pack/generated/claude/skills/devrites-lib/reference/standards/developer-experience.md +5 -5
  140. package/pack/generated/claude/skills/devrites-lib/reference/standards/documentation.md +28 -29
  141. package/pack/generated/claude/skills/devrites-lib/reference/standards/edge-case-trace.md +70 -10
  142. package/pack/generated/claude/skills/devrites-lib/reference/standards/integration-reliability.md +79 -0
  143. package/pack/generated/claude/skills/devrites-lib/reference/standards/loop-operations.md +85 -0
  144. package/pack/generated/claude/skills/devrites-lib/reference/standards/observability.md +10 -0
  145. package/pack/generated/claude/skills/devrites-lib/reference/standards/one-shot-actions.md +1 -6
  146. package/pack/generated/claude/skills/devrites-lib/reference/standards/patterns.md +20 -0
  147. package/pack/generated/claude/skills/devrites-lib/reference/standards/repository-topology.md +73 -0
  148. package/pack/generated/claude/skills/devrites-lib/reference/standards/security-checklist.md +6 -2
  149. package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +51 -16
  150. package/pack/generated/claude/skills/devrites-lib/reference/standards/skill-authoring.md +35 -40
  151. package/pack/generated/claude/skills/devrites-lib/reference/standards/test-proof-checklist.md +4 -0
  152. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +51 -6
  153. package/pack/generated/claude/skills/devrites-lib/reference/standards/workflow-artifacts.md +411 -102
  154. package/pack/generated/claude/skills/rite/SKILL.md +2 -0
  155. package/pack/generated/claude/skills/rite-adopt/SKILL.md +8 -10
  156. package/pack/generated/claude/skills/rite-adopt/reference/adoption.md +13 -15
  157. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +98 -139
  158. package/pack/generated/claude/skills/rite-autocomplete/reference/decision-policy.md +11 -5
  159. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +99 -114
  160. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +92 -124
  161. package/pack/generated/claude/skills/rite-build/SKILL.md +51 -73
  162. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +9 -18
  163. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +37 -4
  164. package/pack/generated/claude/skills/rite-clarify/SKILL.md +3 -2
  165. package/pack/generated/claude/skills/rite-converge/SKILL.md +4 -2
  166. package/pack/generated/claude/skills/rite-converge/reference/convergence-assessment.md +8 -4
  167. package/pack/generated/claude/skills/rite-customize/SKILL.md +16 -18
  168. package/pack/generated/claude/skills/rite-define/SKILL.md +60 -62
  169. package/pack/generated/claude/skills/rite-define/reference/plan-template.md +88 -71
  170. package/pack/generated/claude/skills/rite-explain/SKILL.md +2 -1
  171. package/pack/generated/claude/skills/rite-learn/SKILL.md +28 -32
  172. package/pack/generated/claude/skills/rite-plan/SKILL.md +53 -56
  173. package/pack/generated/claude/skills/rite-plan/reference/anti-patterns.md +11 -1
  174. package/pack/generated/claude/skills/rite-plan/reference/dependency-graph.md +11 -2
  175. package/pack/generated/claude/skills/rite-plan/reference/replan-and-repair.md +10 -3
  176. package/pack/generated/claude/skills/rite-plan/reference/task-breakdown.md +2 -0
  177. package/pack/generated/claude/skills/rite-polish/reference/adr-promotion.md +7 -7
  178. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +24 -31
  179. package/pack/generated/claude/skills/rite-prove/SKILL.md +95 -156
  180. package/pack/generated/claude/skills/rite-prove/reference/acceptance-proof.md +28 -0
  181. package/pack/generated/claude/skills/rite-review/SKILL.md +5 -4
  182. package/pack/generated/claude/skills/rite-review/reference/five-axis-review.md +6 -0
  183. package/pack/generated/claude/skills/rite-review/reference/security-review.md +7 -2
  184. package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +3 -0
  185. package/pack/generated/claude/skills/rite-seal/reference/risk-and-rollback.md +19 -4
  186. package/pack/generated/claude/skills/rite-ship/reference/rollout.md +62 -43
  187. package/pack/generated/claude/skills/rite-spec/SKILL.md +8 -1
  188. package/pack/generated/claude/skills/rite-spec/reference/ai-spec-template.md +13 -6
  189. package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +14 -2
  190. package/pack/generated/claude/skills/rite-spec/reference/spec-template.md +33 -4
  191. package/pack/generated/claude/skills/rite-temper/SKILL.md +5 -1
  192. package/pack/generated/claude/skills/rite-vet/SKILL.md +121 -174
  193. package/pack/generated/claude/skills/rite-vet/reference/anti-patterns.md +14 -2
  194. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +15 -9
  195. package/pack/generated/claude/skills/rite-vet/reference/depth.md +10 -3
  196. package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +75 -77
  197. package/pack/generated/claude/skills/rite-watch-pr/SKILL.md +85 -0
  198. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +4 -5
  199. package/pack/generated/claude/workflows/devrites-readonly-review.js +194 -0
  200. package/pack/generated/codex/agents/devrites-code-reviewer.toml +6 -1
  201. package/pack/generated/codex/agents/devrites-plan-drafter.toml +5 -0
  202. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +6 -0
  203. package/pack/generated/codex/agents/devrites-proof-runner.toml +7 -1
  204. package/pack/generated/codex/agents/devrites-retrospector.toml +21 -25
  205. package/pack/generated/codex/agents/devrites-security-auditor.toml +7 -3
  206. package/pack/generated/codex/agents/devrites-slice-wright.toml +30 -4
  207. package/pack/generated/codex/agents/devrites-spec-reviewer.toml +5 -0
  208. package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +3 -4
  209. package/pack/generated/codex/agents/devrites-test-analyst.toml +5 -0
  210. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +13 -26
  211. package/pack/generated/codex/skills/devrites-debug-recovery/reference/build-the-loop.md +11 -14
  212. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +3 -4
  213. package/pack/generated/codex/skills/devrites-frontend-craft/reference/reuse-first.md +3 -4
  214. package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +5 -1
  215. package/pack/generated/codex/skills/devrites-lib/reference/standards/acceptance-preserving-reslice.md +30 -0
  216. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +35 -17
  217. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +11 -3
  218. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +19 -0
  219. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +1 -1
  220. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +5 -0
  221. package/pack/generated/codex/skills/devrites-lib/reference/standards/data-integrity.md +95 -0
  222. package/pack/generated/codex/skills/devrites-lib/reference/standards/developer-experience.md +5 -5
  223. package/pack/generated/codex/skills/devrites-lib/reference/standards/documentation.md +28 -29
  224. package/pack/generated/codex/skills/devrites-lib/reference/standards/edge-case-trace.md +70 -10
  225. package/pack/generated/codex/skills/devrites-lib/reference/standards/integration-reliability.md +79 -0
  226. package/pack/generated/codex/skills/devrites-lib/reference/standards/loop-operations.md +85 -0
  227. package/pack/generated/codex/skills/devrites-lib/reference/standards/observability.md +10 -0
  228. package/pack/generated/codex/skills/devrites-lib/reference/standards/one-shot-actions.md +1 -6
  229. package/pack/generated/codex/skills/devrites-lib/reference/standards/patterns.md +20 -0
  230. package/pack/generated/codex/skills/devrites-lib/reference/standards/repository-topology.md +73 -0
  231. package/pack/generated/codex/skills/devrites-lib/reference/standards/security-checklist.md +6 -2
  232. package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +51 -16
  233. package/pack/generated/codex/skills/devrites-lib/reference/standards/skill-authoring.md +35 -40
  234. package/pack/generated/codex/skills/devrites-lib/reference/standards/test-proof-checklist.md +4 -0
  235. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +51 -6
  236. package/pack/generated/codex/skills/devrites-lib/reference/standards/workflow-artifacts.md +411 -102
  237. package/pack/generated/codex/skills/rite/SKILL.md +2 -0
  238. package/pack/generated/codex/skills/rite-adopt/SKILL.md +8 -10
  239. package/pack/generated/codex/skills/rite-adopt/reference/adoption.md +13 -15
  240. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +98 -139
  241. package/pack/generated/codex/skills/rite-autocomplete/reference/decision-policy.md +11 -5
  242. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +99 -114
  243. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +92 -124
  244. package/pack/generated/codex/skills/rite-build/SKILL.md +51 -73
  245. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +9 -18
  246. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +37 -4
  247. package/pack/generated/codex/skills/rite-clarify/SKILL.md +3 -2
  248. package/pack/generated/codex/skills/rite-converge/SKILL.md +4 -2
  249. package/pack/generated/codex/skills/rite-converge/reference/convergence-assessment.md +8 -4
  250. package/pack/generated/codex/skills/rite-customize/SKILL.md +16 -18
  251. package/pack/generated/codex/skills/rite-define/SKILL.md +60 -62
  252. package/pack/generated/codex/skills/rite-define/reference/plan-template.md +88 -71
  253. package/pack/generated/codex/skills/rite-explain/SKILL.md +2 -1
  254. package/pack/generated/codex/skills/rite-learn/SKILL.md +28 -32
  255. package/pack/generated/codex/skills/rite-plan/SKILL.md +53 -56
  256. package/pack/generated/codex/skills/rite-plan/reference/anti-patterns.md +11 -1
  257. package/pack/generated/codex/skills/rite-plan/reference/dependency-graph.md +11 -2
  258. package/pack/generated/codex/skills/rite-plan/reference/replan-and-repair.md +10 -3
  259. package/pack/generated/codex/skills/rite-plan/reference/task-breakdown.md +2 -0
  260. package/pack/generated/codex/skills/rite-polish/reference/adr-promotion.md +7 -7
  261. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +24 -31
  262. package/pack/generated/codex/skills/rite-prove/SKILL.md +95 -156
  263. package/pack/generated/codex/skills/rite-prove/reference/acceptance-proof.md +28 -0
  264. package/pack/generated/codex/skills/rite-review/SKILL.md +5 -4
  265. package/pack/generated/codex/skills/rite-review/reference/five-axis-review.md +6 -0
  266. package/pack/generated/codex/skills/rite-review/reference/security-review.md +7 -2
  267. package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +3 -0
  268. package/pack/generated/codex/skills/rite-seal/reference/risk-and-rollback.md +19 -4
  269. package/pack/generated/codex/skills/rite-ship/reference/rollout.md +62 -43
  270. package/pack/generated/codex/skills/rite-spec/SKILL.md +8 -1
  271. package/pack/generated/codex/skills/rite-spec/reference/ai-spec-template.md +13 -6
  272. package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +14 -2
  273. package/pack/generated/codex/skills/rite-spec/reference/spec-template.md +33 -4
  274. package/pack/generated/codex/skills/rite-temper/SKILL.md +5 -1
  275. package/pack/generated/codex/skills/rite-vet/SKILL.md +121 -174
  276. package/pack/generated/codex/skills/rite-vet/reference/anti-patterns.md +14 -2
  277. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +15 -9
  278. package/pack/generated/codex/skills/rite-vet/reference/depth.md +10 -3
  279. package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +75 -77
  280. package/pack/generated/codex/skills/rite-watch-pr/SKILL.md +85 -0
  281. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +4 -5
  282. package/package.json +1 -1
  283. package/scripts/build-host-artifacts.sh +3 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,20 @@
2
2
 
3
3
  All notable changes to DevRites are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and DevRites adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Releases are generated automatically by [semantic-release](https://semantic-release.gitbook.io/) from Conventional Commits on `main`.
4
4
 
5
+ ## [4.2.0](https://github.com/ViktorsBaikers/DevRites/compare/v4.1.0...v4.2.0) (2026-08-23)
6
+
7
+ ### Added
8
+
9
+ * **rite:** ship workflow artifact, reslice, and observation ([#36](https://github.com/ViktorsBaikers/DevRites/issues/36)) ([456a00e](https://github.com/ViktorsBaikers/DevRites/commit/456a00e8280acdab9525a762a267be7084b26a9f))
10
+
11
+ ## [4.1.0](https://github.com/ViktorsBaikers/DevRites/compare/v4.0.12...v4.1.0) (2026-08-12)
12
+
13
+ ### Added
14
+
15
+ * **rite:** add bounded host-native loop operations ([af8f50e](https://github.com/ViktorsBaikers/DevRites/commit/af8f50e434160a7ab33d7e4c8b5b387c4097bfdc))
16
+ * **rite:** deepen engineering risk guidance ([a109d35](https://github.com/ViktorsBaikers/DevRites/commit/a109d35788d831f037361cbc5c491d0b2cb2dd64))
17
+ * **rite:** govern decision horizons and learnings ([af48088](https://github.com/ViktorsBaikers/DevRites/commit/af48088157107e08f60a82659d7e445180ed1e96))
18
+
5
19
  ## [4.0.12](https://github.com/ViktorsBaikers/DevRites/compare/v4.0.11...v4.0.12) (2026-08-09)
6
20
 
7
21
  ### Fixed
package/README.md CHANGED
@@ -28,7 +28,7 @@ project-conventional push, tag, or PR action, and archive the workspace.
28
28
  Unattended runs may create local WIP checkpoint commits along the way, but they
29
29
  remain local unless Ship's disclosed plan includes an approved remote action.
30
30
 
31
- **Status:** [`v4.0.12`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v4.0.12): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
31
+ **Status:** [`v4.2.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v4.2.0): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
32
32
 
33
33
  This is the latest published release; `main` may contain unreleased work.
34
34
 
@@ -381,8 +381,8 @@ through Claude Code or Codex plugin stores.
381
381
 
382
382
  ## Skills and agents
383
383
 
384
- The pack ships 43 skills: 32 public and 11 internal. The public surface contains
385
- the `rite` menu and 31 `rite-*` workflows and utilities. Ten `devrites-*`
384
+ The pack ships 44 skills: 33 public and 11 internal. The public surface contains
385
+ the `rite` menu and 32 `rite-*` workflows and utilities. Ten `devrites-*`
386
386
  specialists load when a matching task needs them; `devrites-lib` carries the
387
387
  shared contracts and engineering standards.
388
388
 
@@ -33,8 +33,8 @@ cursor readers, traceability rules, and phase-relative completeness model, see
33
33
  2. **Public utility and on-ramp skills**: `rite-adopt`, `rite-quick`,
34
34
  `rite-frame`, `rite-status`, `rite-doctor`, `rite-upgrade`, `rite-learn`, `rite-explain`,
35
35
  `rite-customize`, `rite-zoom-out`, `rite-prototype`, `rite-handoff`,
36
- `rite-pressure-test`, `rite-pov`, `rite-dogfood`, `rite-pr-feedback`, and
37
- `rite-autocomplete`. These are public commands. `rite-autocomplete` is the
36
+ `rite-pressure-test`, `rite-pov`, `rite-dogfood`, `rite-pr-feedback`,
37
+ `rite-watch-pr`, and `rite-autocomplete`. These are public commands. `rite-autocomplete` is the
38
38
  unattended orchestrator. By default it drives the reversible lifecycle
39
39
  through Seal GO and stops. Explicit `--ship` enters Ship preflight but still
40
40
  waits for a fresh literal `GO` and native approval before mutation. It
@@ -381,8 +381,8 @@ contract.
381
381
 
382
382
  ## Design choices at a glance
383
383
 
384
- - **Surface**: 31 public `rite-*` skills (43 total), plus the thin `/rite`
385
- menu: 32 public and 11 internal. The lifecycle
384
+ - **Surface**: 32 public `rite-*` skills (44 total), plus the thin `/rite`
385
+ menu: 33 public and 11 internal. The lifecycle
386
386
  includes mandatory adaptive Clarify, optional Temper, mandatory Vet, and
387
387
  Converge recovery; Seal **decides** and Ship **executes + closes**. Ten
388
388
  `devrites-*` specialist skills are model-invoked; `devrites-lib` is the
@@ -19,8 +19,8 @@ mean that a skill is internal; each `SKILL.md` uses `user-invocable:` to set
19
19
  visibility. Public utilities use the `rite-*` prefix: `rite-quick`,
20
20
  `rite-frame`, `rite-adopt`, `rite-learn`, `rite-doctor`, `rite-customize`,
21
21
  `rite-zoom-out`, `rite-prototype`, `rite-handoff`, `rite-pressure-test`,
22
- `rite-autocomplete`, `rite-explain`, `rite-pov`, `rite-dogfood`, and
23
- `rite-pr-feedback`, plus the evidence-gated workspace compatibility command
22
+ `rite-autocomplete`, `rite-explain`, `rite-pov`, `rite-dogfood`,
23
+ `rite-pr-feedback`, and `rite-watch-pr`, plus the evidence-gated workspace compatibility command
24
24
  `rite-upgrade`. The host may invoke `devrites-*` specialists through the model.
25
25
  `devrites-lib` is the non-workflow library exception.
26
26
 
@@ -113,6 +113,7 @@ See [`cli.md`](cli.md).
113
113
  | [`/rite-pov`](../pack/.claude/skills/rite-pov/SKILL.md) | utility | `[candidate/link/question]` | Project-grounded verdict on one outside option after live repository and primary-source evidence. | live code/docs + external sources | `decisions.md` or ADR only on request |
114
114
  | [`/rite-dogfood`](../pack/.claude/skills/rite-dogfood/SKILL.md) | utility | `[feature-slug\|branch] [--port N]` | Diff-scoped browser QA: map changed user journeys, run scenario matrix, fix small obvious breakages, write dogfood report. Explicit-only. | diff + app routes + browser | `.devrites/work/<slug>/dogfood.md` + safe fixes |
115
115
  | [`/rite-pr-feedback`](../pack/.claude/skills/rite-pr-feedback/SKILL.md) | utility | `[PR number\|thread URL\|blank for current branch]` | Resolve GitHub PR review feedback: fetch unresolved threads, judge centrally, fix valid items, reply, resolve. Explicit-only. | PR threads + code | code/tests + PR replies/resolutions |
116
+ | [`/rite-watch-pr`](../pack/.claude/skills/rite-watch-pr/SKILL.md) | utility | `[PR number\|PR URL\|blank for current branch]` | Observe one GitHub PR/CI/review snapshot, classify one next action, and stop. Safe for capability-admitted native schedules/events; never mutates code, Git, checks, threads, or PR state. | PR/check/review metadata + bounded failed-log excerpts | none |
116
117
  | [`/rite-pressure-test`](../pack/.claude/skills/rite-pressure-test/SKILL.md) | utility | `[idea]` | Pressure-test a rough idea: 3 to 5 genuinely different options → converge on one with trade-off + hinge. | spec / surrounding code | `decisions.md` (optional) |
117
118
  | [`/rite-doctor`](../pack/.claude/skills/rite-doctor/SKILL.md) | diagnostic | none | Diagnose the DevRites binary, pack, schema, and native host permission/profile configuration. | install + host config | none |
118
119
 
@@ -183,7 +184,7 @@ index is in
183
184
  [`pack/.claude/skills/devrites-lib/reference/standards/README.md`](../pack/.claude/skills/devrites-lib/reference/standards/README.md).
184
185
 
185
186
  - `core.md` (always-on): operating rules + universal anti-rationalizations + 1-line craft disciplines + persistence-before-stopping summary.
186
- - On-demand rules and checklists (read by the phase that needs them): `coding-style.md` · `prose-style.md` · `error-handling.md` · `testing.md` · `spec-grammar.md` · `code-review.md` · `edge-case-trace.md` · `principles.md` · `security.md` · `performance.md` · `observability.md` · `developer-experience.md` · `patterns.md` · `git-workflow.md` · `ci-cd.md` · `hooks.md` · `documentation.md` · `development-workflow.md` · `deprecation.md` · `elicitation.md` · `agents.md` · `context-hygiene.md` · `anti-patterns.md` · `afk-hitl.md` · `tooling.md` · `skill-authoring.md` · `definition-of-done.md` · `review-checklist.md` · `test-proof-checklist.md` · `browser-proof-checklist.md` · `security-checklist.md`
187
+ - On-demand rules and checklists (read by the phase that needs them): `coding-style.md` · `prose-style.md` · `error-handling.md` · `testing.md` · `spec-grammar.md` · `code-review.md` · `edge-case-trace.md` · `principles.md` · `security.md` · `repository-topology.md` · `data-integrity.md` · `integration-reliability.md` · `performance.md` · `observability.md` · `developer-experience.md` · `patterns.md` · `git-workflow.md` · `ci-cd.md` · `hooks.md` · `documentation.md` · `development-workflow.md` · `deprecation.md` · `elicitation.md` · `agents.md` · `context-hygiene.md` · `anti-patterns.md` · `afk-hitl.md` · `loop-operations.md` · `tooling.md` · `skill-authoring.md` · `definition-of-done.md` · `review-checklist.md` · `test-proof-checklist.md` · `browser-proof-checklist.md` · `security-checklist.md`
187
188
  - `anti-patterns.md`: pack-wide rationalizations + red flags. Loaded by each per-phase `rite-*/reference/anti-patterns.md`; can be loaded directly for cross-phase reluctance.
188
189
 
189
190
  ## Trigger conditions (auto-selection)
@@ -12,9 +12,9 @@ workflow strategy.
12
12
  | `update [flags]` | Refresh an existing managed installation. |
13
13
  | `uninstall [flags]` | Remove managed artifacts while preserving runtime workspace state. |
14
14
  | `check candidate <slug>` | Validate the strict manifest and compute the content-bound project-candidate identity. |
15
- | `check readiness <slug>` | Check phase files, human gates, and the current stable Build-input binding when applicable. |
15
+ | `check readiness <slug>` | Check target-Phase files, open human gates from Clarify onward, and the current stable Build-input binding when applicable. |
16
16
  | `check readiness --emit-binding <slug>` | Render the exact stable Build-input binding for Vet to record after review. |
17
- | `check seal <slug>` | Check final files, human gates, the stable Build-input binding, and exact candidate bindings. |
17
+ | `check seal <slug>` | Check files required by target Phase `seal`, open human gates, the stable Build-input binding, and exact candidate bindings. |
18
18
  | `state resolve <qid> "<answer>"` | Resolve an open question and update `questions.md` plus `state.md` atomically. |
19
19
  | `state close <slug>` | Archive a shipped workspace and clear matching `ACTIVE`. |
20
20
  | `secret-scan [--staged] [--stdin] [slug]` | Scan exact staged blobs, stdin, or touched regular files for credential material. |
@@ -29,10 +29,12 @@ not to the engine command namespace.
29
29
  ## Check boundary
30
30
 
31
31
  The candidate gate validates and hashes path/state/type/mode/content identity;
32
- it does not infer scope from Git. The readiness gate checks structure plus the
33
- exact stable Build-input binding after Vet. The seal gate repeats that binding
34
- and checks exact candidate bindings in evidence, optional browser evidence,
35
- review, and seal. None judges the meaning of `CLEAR`/`READY` prose,
32
+ it does not infer scope from Git. The readiness gate checks target-Phase
33
+ structure and applies open-question blocking only when that target is Clarify
34
+ or later, plus the exact stable Build-input binding after Vet. The seal gate
35
+ always targets Phase `seal`, repeats that binding, and checks exact candidate
36
+ bindings in evidence, optional browser evidence, review, and seal. None judges
37
+ the meaning of `CLEAR`/`READY` prose,
36
38
  parses reviewer narratives, infers acceptance coverage, counts assertions,
37
39
  interprets capability deltas, or decides whether a technical plan is sound.
38
40
 
@@ -104,6 +106,63 @@ ambient Git state. Ordinary readiness and Seal require that exact standalone
104
106
  line in `eng-review.md`; stale input returns
105
107
  `reason: DRV-GATE-READINESS-STALE` and routes through `/rite-vet`.
106
108
 
109
+ ### Workspace observation diagnostics
110
+
111
+ Lifecycle checks acquire the fixed workspace Markdown inventory once. Each
112
+ artifact is classified as `absent`, `empty`, `malformed`, `unsafe`,
113
+ `unreadable`, or `present`. Retained content is limited to 1 MiB per file and
114
+ 8 MiB aggregate. Diagnostic lines use this exact shape:
115
+ `artifact: <logical-path>: <state> (<code>)`.
116
+
117
+ The closed diagnostic codes and recoveries are:
118
+
119
+ | Code | Exact Gate recovery | Exact standalone readiness-binding payload |
120
+ |---|---|---|
121
+ | `malformed_markdown` | `next: repair <logical-path>: replace invalid Markdown with valid Markdown; required artifacts need substantive content` | `readiness input <logical-path> is malformed (malformed_markdown); replace invalid Markdown with valid Markdown` |
122
+ | `parent_symlink` | `next: repair <logical-path>: replace the symlinked parent with a real directory` | `readiness input <logical-path> is unsafe (parent_symlink); replace the symlinked parent with a real directory` |
123
+ | `final_symlink` | `next: repair <logical-path>: replace the symlink with a regular file` | `readiness input <logical-path> is unsafe (final_symlink); replace the symlink with a regular file` |
124
+ | `non_regular` | `next: repair <logical-path>: replace the non-regular entry with a regular file` | `readiness input <logical-path> is unsafe (non_regular); replace the non-regular entry with a regular file` |
125
+ | `file_too_large` | `next: repair <logical-path>: reduce the file to at most 1 MiB` | `readiness input <logical-path> is unsafe (file_too_large); reduce the file to at most 1 MiB` |
126
+ | `permission_denied` | `next: repair <logical-path>: grant read permission` | `readiness input <logical-path> is unreadable (permission_denied); grant read permission` |
127
+ | `read_failure` | `next: repair <logical-path>: restore a readable regular file` | `readiness input <logical-path> is unreadable (read_failure); restore a readable regular file` |
128
+
129
+ The Gate recovery column remains exact for target-policy-required artifacts. For
130
+ a selected optional readiness input, the same code-specific repair appends
131
+ `; optional readiness input may instead be removed` and does not call the input
132
+ required.
133
+
134
+ These seven codes are the closed Workspace Observation classification and
135
+ recovery mapping outcomes. A selected public consumer emits only a code
136
+ reachable for its consumed fixed logical path. Invalid workspace ancestry is
137
+ `workspace_invalid`, not an artifact `parent_symlink` diagnostic.
138
+
139
+ Status emits diagnostics without recovery or `next:` lines, after section rows
140
+ and before `result`. Gate emits diagnostics after `reason` and before recovery,
141
+ `invariant`, and `retry` lines. Generic add-content recovery applies only to
142
+ absent or empty target-required artifacts. Standalone readiness-binding
143
+ failures use the existing `readiness-binding: BLOCKED:` prefix and the logical
144
+ readiness-input state/code plus recovery; they never disclose physical paths or
145
+ content.
146
+
147
+ Whole observation failures are `workspace_invalid`, `aggregate_too_large`, and
148
+ `concurrent_change`. Their disclosure-safe payloads are exact:
149
+
150
+ - `workspace observation: workspace_invalid: workspace is unavailable; verify the selected logical workspace and canonical workspace override, then retry`
151
+ - `workspace observation: aggregate_too_large: retained content exceeds the 8 MiB aggregate limit; reduce retained Markdown below 8 MiB, then retry`
152
+ - `workspace observation: concurrent_change: workspace changed during acquisition; retry`
153
+
154
+ An absent or empty `state.md` appends `add real content to state.md and retry` to
155
+ the existing logical error. A malformed, unsafe, or unreadable `state.md`
156
+ appends `repair state.md and retry`. A ledger without a phase appends `record
157
+ phase in state.md and retry`; an unknown phase appends `record a known phase in
158
+ state.md and retry`.
159
+
160
+ Whole observation failures use stderr, exit `2`, and no lifecycle result or
161
+ reason on stdout. Standalone readiness-binding failures use one stderr line,
162
+ exit `3`, and empty stdout. Per-artifact lifecycle blocks keep existing reason
163
+ IDs and stdout exit `3`; successful checks keep stdout exit `0`. Seal evidence
164
+ freshness still runs separately after a successful Seal gate.
165
+
107
166
  - `0`: passed or completed.
108
167
  - `2`: common invalid request or unreadable-state result.
109
168
  - `3`: common deterministic lifecycle or safety block.
package/docs/flow.md CHANGED
@@ -375,7 +375,7 @@ separately by `disable-model-invocation`.
375
375
 
376
376
  ```mermaid
377
377
  flowchart TB
378
- subgraph Public["Public (user-invocable: true): 32 skills"]
378
+ subgraph Public["Public (user-invocable: true): 33 skills"]
379
379
  direction TB
380
380
  R1[/rite/]
381
381
  R2[/rite-spec/]
@@ -405,6 +405,7 @@ flowchart TB
405
405
  RDO[/rite-dogfood/]
406
406
  RPOV[/rite-pov/]
407
407
  RPF[/rite-pr-feedback/]
408
+ RWP[/rite-watch-pr/]
408
409
  IPT[/rite-pressure-test/]
409
410
  D1[/rite-zoom-out/]
410
411
  D2[/rite-prototype/]
@@ -28,8 +28,9 @@ root reconciles semantics; engine checks deterministic structure/state/safety
28
28
  workspace-capable for its writer child to execute.
29
29
  - The role catalog has one source/test writer, `devrites-slice-wright`. Claude
30
30
  and Codex make only that exact specialist writable.
31
- - Leaves never invoke leaves, ask the human, change phase, commit, push, deploy,
32
- migrate live data, or write canonical workflow state.
31
+ - Leaves never invoke leaves, ask the human, change phase, push, deploy, migrate live
32
+ data, or write canonical workflow state. Only an eligible isolated-worktree wright
33
+ may create one local unpushed transfer commit; same-worktree leaves never commit.
33
34
 
34
35
  Skills name the exact role and bounded task in normal language. The host owns
35
36
  internal spawn fields, scheduling, waiting, follow-ups, and result delivery.
@@ -65,6 +66,35 @@ sibling cannot erase it.
65
66
  An evidenced clean result is valid. Reviewers must account for their rubric and
66
67
  inspected scope, but they never manufacture a finding to fill a quota.
67
68
 
69
+ ## Read-only Claude workflow pilot
70
+
71
+ Claude installs `.claude/workflows/devrites-readonly-review.js` as an optional
72
+ adapter for immutable-candidate discovery, four independent reviewer roles, one
73
+ adversarial verification pass, and a completeness check. Its script owns only
74
+ transient fan-out and intermediate results. It cannot write source, tests,
75
+ `.devrites/**`, Git, proof, lifecycle state, or shared services; it never invokes
76
+ `devrites-slice-wright`.
77
+
78
+ The caller still admits every returned role result under the normal result-closure
79
+ contract and performs final reconciliation. A workflow timeout, missing role,
80
+ malformed result, unread input, or incomplete verification is a gap. The adapter does
81
+ not replace `/rite-review`, alter required rosters, or create another durable state
82
+ plane.
83
+
84
+ Codex keeps the same portable skill/agent semantics through native agent dispatch and
85
+ has no fake workflow mirror. Provider parity applies to review meaning and evidence,
86
+ not to this optional Claude orchestration optimization. Use the pilot only when an
87
+ immutable candidate already exists; lifecycle writes, proof execution, human gates,
88
+ and final decisions remain with the rite root.
89
+
90
+ Host capabilities are admitted independently. Codex CLI agent threads and inherited
91
+ sandboxes establish context/permission separation, not filesystem worktree isolation;
92
+ without an explicit named-agent worktree and reconciliation interface, Codex uses the
93
+ serial same-worktree writer. Likewise, goals or hooks do not prove native time/event
94
+ activation. Unsupported activation remains `unavailable` rather than being emulated by
95
+ a DevRites scheduler or shell loop. The claim-bounded acceptance rows live in
96
+ [`codex-acceptance.json`](../evals/native-host/codex-acceptance.json).
97
+
68
98
  ## Slice-wright lifecycle
69
99
 
70
100
  For Claude or Codex, the root states the smallest exact project-relative source
@@ -86,8 +116,19 @@ symlink escapes, duplicates, and `.devrites/**` are invalid.
86
116
  Exact-path scope is instruction-backed on both hosts; native sandboxes provide
87
117
  the broader writer/read-only split. An unauthorized delta is rejected and the
88
118
  same bounded writer must restore it before work continues. The root never
89
- widens the contract or rewrites source. Parallel source writers in one worktree
90
- are forbidden.
119
+ widens the contract or rewrites source.
120
+
121
+ A serial native-worktree pilot may isolate `devrites-slice-wright` when the candidate
122
+ baseline is committed and clean, the repository is not a submodule child, baseline
123
+ proof is green, and the host exposes explicit result reconciliation. The wright
124
+ returns one local unpushed transfer commit; root proves its exact paths and unchanged
125
+ base before native transfer, then re-proves the reconciled candidate. Missing transfer,
126
+ conflict, extra paths, moved base, or cleanup failure stops with worktree evidence
127
+ preserved. No ad hoc copy/cherry-pick/merge occurs from the read-only root.
128
+
129
+ Isolation does not authorize throughput. At most one writer runs across all linked
130
+ worktrees for the workspace; parallel writers remain forbidden until serial transfer,
131
+ conflict, proof, and review measurements justify a separate design.
91
132
 
92
133
  ## Engine boundary
93
134
 
package/docs/skills.md CHANGED
@@ -1,6 +1,6 @@
1
- # All 43 skills
1
+ # All 44 skills
2
2
 
3
- The pack contains 43 skills: the `rite` menu, 31 user-invocable `rite-*`
3
+ The pack contains 44 skills: the `rite` menu, 32 user-invocable `rite-*`
4
4
  workflow and utility skills, 10 model-invoked `devrites-*` specialists, and the
5
5
  internal `devrites-lib` library. `devrites-lib` is not a command. It holds shared
6
6
  references and the few explicit script exceptions.
@@ -37,7 +37,7 @@ contract when a rite names parallel reviewers.
37
37
 
38
38
  `rite-*` is the namespace for lifecycle and utility commands. Its utilities are
39
39
  `rite-quick`, `rite-frame`, `rite-adopt`, `rite-learn`, `rite-customize`,
40
- `rite-explain`, `rite-pov`, `rite-dogfood`, `rite-pr-feedback`, `rite-doctor`,
40
+ `rite-explain`, `rite-pov`, `rite-dogfood`, `rite-pr-feedback`, `rite-watch-pr`, `rite-doctor`,
41
41
  `rite-upgrade`, `rite-prototype`, `rite-handoff`, `rite-zoom-out`, and
42
42
  `rite-pressure-test`.
43
43
  Some specialized utilities set `disable-model-invocation: true` and run only
@@ -231,6 +231,7 @@ and `Shipped`. Utility commands keep the same compact labels and one-next-action
231
231
  | [`rite-pov`](../pack/.claude/skills/rite-pov/SKILL.md) | Project-grounded verdict on a named external option: adopt / trial / hold / reject / not-our-problem after project + external floors clear. | "should we adopt X", "switch to Y", CVE/deprecation relevance, bounded external comparisons. |
232
232
  | [`rite-dogfood`](../pack/.claude/skills/rite-dogfood/SKILL.md) | Diff-scoped browser QA: map changed user journeys, run scenario matrix, fix small obvious breakages, write `dogfood.md`. | Explicit-only after prove/polish/review when browser UX confidence matters. |
233
233
  | [`rite-pr-feedback`](../pack/.claude/skills/rite-pr-feedback/SKILL.md) | Resolve PR review feedback: fetch unresolved threads, judge centrally, fix valid items, reply, resolve. | Explicit-only: `/rite-pr-feedback` / `/rite pr-feedback`. |
234
+ | [`rite-watch-pr`](../pack/.claude/skills/rite-watch-pr/SKILL.md) | Observe one PR/CI/review snapshot and report one next action without mutation. | Read-only capability-admitted native schedule/event observation or `/rite-watch-pr`. |
234
235
 
235
236
  ### Foundation: engineering rules
236
237
 
package/engine/go.mod CHANGED
@@ -2,4 +2,4 @@ module github.com/devrites/devrites
2
2
 
3
3
  go 1.26
4
4
 
5
- toolchain go1.26.5
5
+ toolchain go1.26.7
@@ -13,10 +13,11 @@ import (
13
13
  const (
14
14
  DevritesRootName = ".devrites"
15
15
 
16
- ClaudeSkillsTarget = ".claude/skills"
17
- CodexSkillsTarget = ".agents/skills"
18
- ClaudeAgentsTarget = ".claude/agents"
19
- CodexAgentsTarget = ".codex/agents"
16
+ ClaudeSkillsTarget = ".claude/skills"
17
+ CodexSkillsTarget = ".agents/skills"
18
+ ClaudeAgentsTarget = ".claude/agents"
19
+ CodexAgentsTarget = ".codex/agents"
20
+ ClaudeWorkflowsTarget = ".claude/workflows"
20
21
 
21
22
  ManifestName = ".claude/devrites.manifest"
22
23
  )
@@ -6,11 +6,8 @@ package gate
6
6
 
7
7
  import (
8
8
  "fmt"
9
- "os"
10
- "path/filepath"
11
9
  "strings"
12
10
 
13
- "github.com/devrites/devrites/internal/devritespaths"
14
11
  "github.com/devrites/devrites/internal/reason"
15
12
  "github.com/devrites/devrites/internal/state"
16
13
  )
@@ -27,50 +24,82 @@ const (
27
24
  Seal Kind = "seal"
28
25
  )
29
26
 
30
- // Result is a gate outcome. Blocked is true iff a required section is missing;
31
- // Missing lists them in canonical order for an actionable message.
27
+ // Result is a gate outcome. Blocked is true iff a deterministic requirement
28
+ // failed; missing files and diagnostics retain their canonical policy order.
32
29
  type Result struct {
33
- Kind Kind
34
- Slug string
35
- Phase state.Phase
36
- Target state.Phase // the phase whose requirements were checked
37
- Missing []state.Section // compact legacy view
38
- MissingFiles []string // authoritative per-file view
39
- StateProblems []string // deterministic cross-file invariant failures
40
- Blocked bool
41
- ReasonID reason.ID
30
+ Kind Kind
31
+ Slug string
32
+ Phase state.Phase
33
+ Target state.Phase
34
+ Missing []state.Section
35
+ MissingFiles []string
36
+ Diagnostics []state.ArtifactDiagnostic
37
+ AddContentFiles []string
38
+ StateProblems []string
39
+ Blocked bool
40
+ ReasonID reason.ID
42
41
  }
43
42
 
44
- // Check runs a gate against feature <slug> under root. It reads workspace files
45
- // directly instead of trusting a cache. Invalid requests and unreadable state
46
- // return errors; missing required content returns a blocked Result.
43
+ // Check runs a gate against feature <slug> under root. One workspace observation
44
+ // supplies every lifecycle, question, and readiness fact used by the result.
47
45
  func Check(kind Kind, root, slug string) (*Result, error) {
48
- f, err := state.LoadFeature(root, slug)
46
+ observation, err := state.ObserveWorkspace(root, slug)
49
47
  if err != nil {
50
48
  return nil, fmt.Errorf("gate %s: %w", kind, err)
51
49
  }
52
- target := f.Phase
50
+ result, err := checkObservation(kind, observation)
51
+ if err != nil {
52
+ return nil, fmt.Errorf("gate %s: %w", kind, err)
53
+ }
54
+ return result, nil
55
+ }
56
+
57
+ func checkObservation(kind Kind, observation *state.WorkspaceObservation) (*Result, error) {
58
+ phase, err := observation.DeclaredPhase()
59
+ if err != nil {
60
+ return nil, err
61
+ }
62
+ target := phase
53
63
  if kind == Seal {
54
64
  target = state.PhaseSeal
55
65
  }
56
- missing := state.MissingFor(f, target)
57
- missingFiles := state.MissingWorkspaceFiles(f, target)
66
+ policy, ok := state.PolicyFor(target)
67
+ if !ok {
68
+ return nil, fmt.Errorf("unknown target phase %q", target)
69
+ }
70
+ target = policy.Target
71
+
72
+ missing := missingSections(observation, policy.RequiredSections)
73
+ missingArtifacts, diagnostics := observation.Missing(policy.RequiredArtifacts)
74
+ missingFiles := make([]string, len(missingArtifacts))
75
+ var addContentFiles []string
76
+ for i, artifact := range missingArtifacts {
77
+ missingFiles[i] = string(artifact)
78
+ fact, ok := observation.Fact(artifact)
79
+ if ok && (fact.State() == state.ArtifactAbsent || fact.State() == state.ArtifactEmpty) {
80
+ addContentFiles = append(addContentFiles, string(artifact))
81
+ }
82
+ }
58
83
  blocked := len(missingFiles) > 0
59
84
  readinessStale := false
60
85
  var stateProblems []string
61
- if gates, awaitingHuman := openHumanGates(devritespaths.FeatureDir(root, slug)); len(gates) > 0 {
62
- problem := fmt.Sprintf("open %s human question(s) remain in questions.md", strings.Join(gates, "/"))
63
- if !awaitingHuman {
64
- problem += " but state.md is not awaiting_human"
86
+
87
+ if policy.BlocksOpenQuestions {
88
+ if gates, awaitingHuman := retainedHumanGates(observation); len(gates) > 0 {
89
+ problem := fmt.Sprintf("open %s human question(s) remain in questions.md", strings.Join(gates, "/"))
90
+ if !awaitingHuman {
91
+ problem += " but state.md is not awaiting_human"
92
+ }
93
+ stateProblems = append(stateProblems, problem)
94
+ blocked = true
65
95
  }
66
- stateProblems = append(stateProblems, problem)
67
- blocked = true
68
96
  }
69
- if len(missingFiles) == 0 && phaseRequiresReadinessBinding(target) {
70
- expected, bindingErr := verifyReadinessBinding(root, slug)
97
+ if len(missingFiles) == 0 && phaseRequiresReadinessBinding(policy) {
98
+ expected, bindingErr := verifyReadinessBinding(observation)
71
99
  if bindingErr != nil {
72
100
  readinessStale = true
73
101
  blocked = true
102
+ diagnostics = append(diagnostics, readinessDiagnostics(observation)...)
74
103
  if expected == "" {
75
104
  stateProblems = append(stateProblems, bindingErr.Error()+"; repair the input and rerun /rite-vet")
76
105
  } else {
@@ -78,15 +107,18 @@ func Check(kind Kind, root, slug string) (*Result, error) {
78
107
  }
79
108
  }
80
109
  }
110
+
81
111
  result := &Result{
82
- Kind: kind,
83
- Slug: slug,
84
- Phase: f.Phase,
85
- Target: target,
86
- Missing: missing,
87
- MissingFiles: missingFiles,
88
- StateProblems: stateProblems,
89
- Blocked: blocked,
112
+ Kind: kind,
113
+ Slug: observation.Slug(),
114
+ Phase: phase,
115
+ Target: target,
116
+ Missing: missing,
117
+ MissingFiles: missingFiles,
118
+ Diagnostics: diagnostics,
119
+ AddContentFiles: addContentFiles,
120
+ StateProblems: stateProblems,
121
+ Blocked: blocked,
90
122
  }
91
123
  result.ReasonID = ResultReasonID(kind, blocked)
92
124
  if readinessStale {
@@ -95,6 +127,24 @@ func Check(kind Kind, root, slug string) (*Result, error) {
95
127
  return result, nil
96
128
  }
97
129
 
130
+ func missingSections(observation *state.WorkspaceObservation, required []state.Section) []state.Section {
131
+ var missing []state.Section
132
+ for _, section := range required {
133
+ artifact := state.ArtifactPath(string(section) + ".md")
134
+ switch section {
135
+ case state.SectionProof:
136
+ artifact = state.EvidenceFile
137
+ case state.SectionStatus:
138
+ artifact = state.LedgerFile
139
+ }
140
+ fact, ok := observation.Fact(artifact)
141
+ if !ok || fact.State() != state.ArtifactPresent {
142
+ missing = append(missing, section)
143
+ }
144
+ }
145
+ return missing
146
+ }
147
+
98
148
  // ResultReasonID returns the typed outcome owned by the lifecycle gate.
99
149
  func ResultReasonID(kind Kind, blocked bool) reason.ID {
100
150
  switch kind {
@@ -114,7 +164,7 @@ func ResultReasonID(kind Kind, blocked bool) reason.ID {
114
164
  }
115
165
 
116
166
  // Render returns stable, greppable output with a trailing newline. A blocked
117
- // result names the missing files and the command to rerun.
167
+ // result names missing files, selected diagnostics, recovery, and the retry.
118
168
  func (r *Result) Render() string {
119
169
  var b strings.Builder
120
170
  fmt.Fprintf(&b, "gate: %s\n", r.Kind)
@@ -135,8 +185,17 @@ func (r *Result) Render() string {
135
185
  fmt.Fprintf(&b, "result: blocked (missing to leave %q: %s)\n", r.Phase, strings.Join(missing, ", "))
136
186
  }
137
187
  fmt.Fprintf(&b, "reason: %s\n", r.ReasonID)
138
- if len(missing) > 0 {
139
- fmt.Fprintf(&b, "next: add real content to %s\n", strings.Join(missing, ", "))
188
+ for _, diagnostic := range r.Diagnostics {
189
+ fmt.Fprintf(&b, "artifact: %s: %s (%s)\n", diagnostic.Path, diagnostic.State, diagnostic.Code)
190
+ }
191
+ if len(r.AddContentFiles) > 0 {
192
+ fmt.Fprintf(&b, "next: add real content to %s\n", strings.Join(r.AddContentFiles, ", "))
193
+ }
194
+ for _, diagnostic := range r.Diagnostics {
195
+ if recovery := diagnosticRecovery(diagnostic, targetRequiresArtifact(r.Target, diagnostic.Path)); recovery != "" {
196
+ b.WriteString(recovery)
197
+ b.WriteByte('\n')
198
+ }
140
199
  }
141
200
  for _, problem := range r.StateProblems {
142
201
  fmt.Fprintf(&b, "invariant: %s\n", problem)
@@ -145,19 +204,68 @@ func (r *Result) Render() string {
145
204
  return b.String()
146
205
  }
147
206
 
207
+ func diagnosticRecovery(diagnostic state.ArtifactDiagnostic, required bool) string {
208
+ prefix := fmt.Sprintf("next: repair %s: ", diagnostic.Path)
209
+ repair := diagnosticRepair(diagnostic.Code)
210
+ if repair == "" {
211
+ return ""
212
+ }
213
+ if required && diagnostic.Code == state.DiagnosticMalformedMarkdown {
214
+ repair += "; required artifacts need substantive content"
215
+ }
216
+ if !required {
217
+ repair += "; optional readiness input may instead be removed"
218
+ }
219
+ return prefix + repair
220
+ }
221
+
222
+ func targetRequiresArtifact(target state.Phase, path state.ArtifactPath) bool {
223
+ policy, ok := state.PolicyFor(target)
224
+ if !ok {
225
+ return false
226
+ }
227
+ for _, required := range policy.RequiredArtifacts {
228
+ if required == path {
229
+ return true
230
+ }
231
+ }
232
+ return false
233
+ }
234
+
235
+ func diagnosticRepair(code state.DiagnosticCode) string {
236
+ switch code {
237
+ case state.DiagnosticMalformedMarkdown:
238
+ return "replace invalid Markdown with valid Markdown"
239
+ case state.DiagnosticParentSymlink:
240
+ return "replace the symlinked parent with a real directory"
241
+ case state.DiagnosticFinalSymlink:
242
+ return "replace the symlink with a regular file"
243
+ case state.DiagnosticNonRegular:
244
+ return "replace the non-regular entry with a regular file"
245
+ case state.DiagnosticFileTooLarge:
246
+ return "reduce the file to at most 1 MiB"
247
+ case state.DiagnosticPermissionDenied:
248
+ return "grant read permission"
249
+ case state.DiagnosticReadFailure:
250
+ return "restore a readable regular file"
251
+ default:
252
+ return ""
253
+ }
254
+ }
255
+
148
256
  const gateSpaceChars = " \t\n\v\f\r"
149
257
 
150
- func openHumanGates(featureDir string) ([]string, bool) {
151
- qdata, err := os.ReadFile(filepath.Join(featureDir, "questions.md"))
152
- if err != nil {
258
+ func retainedHumanGates(observation *state.WorkspaceObservation) ([]string, bool) {
259
+ questions, ok := observation.Fact("questions.md")
260
+ if !ok || (questions.State() != state.ArtifactPresent && questions.State() != state.ArtifactEmpty) {
153
261
  return nil, false
154
262
  }
155
- gates := openBlockingQuestionGates(qdata)
263
+ gates := openBlockingQuestionGates(questions.Bytes())
156
264
  if len(gates) == 0 {
157
265
  return nil, false
158
266
  }
159
- sdata, err := os.ReadFile(filepath.Join(featureDir, "state.md"))
160
- return gates, err == nil && stateAwaitingHuman(sdata)
267
+ ledger, ok := observation.Fact(state.LedgerFile)
268
+ return gates, ok && ledger.State() == state.ArtifactPresent && stateAwaitingHuman(ledger.Bytes())
161
269
  }
162
270
 
163
271
  func openBlockingQuestionGates(data []byte) []string {