devrites 3.0.7 → 3.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 (484) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +82 -50
  3. package/SECURITY.md +31 -29
  4. package/docs/adr/0001-go-engine-as-control-plane.md +1 -1
  5. package/docs/adr/0002-dual-host-harness.md +1 -1
  6. package/docs/adr/0004-state-schema-phases-sections.md +1 -2
  7. package/docs/adr/0006-clock-seam-and-engine-ci-gates.md +3 -4
  8. package/docs/adr/0009-prebuild-decision-coverage-and-readiness.md +67 -0
  9. package/docs/adr/0010-agent-first-fresh-context-orchestration.md +71 -0
  10. package/docs/adr/0011-define-plan-transition-rights.md +28 -0
  11. package/docs/adr/0012-semantic-workspace-upgrades.md +77 -0
  12. package/docs/adr/README.md +4 -0
  13. package/docs/agents/triage-labels.md +7 -7
  14. package/docs/architecture.md +179 -141
  15. package/docs/cli.md +47 -12
  16. package/docs/command-map.md +61 -38
  17. package/docs/engine/agent-contract.md +92 -15
  18. package/docs/engine/commands.md +248 -72
  19. package/docs/engine/state-schema.md +52 -23
  20. package/docs/engine/workspace-schema.md +103 -15
  21. package/docs/extensions.md +1 -1
  22. package/docs/flow.md +86 -51
  23. package/docs/harness-compliance.md +29 -5
  24. package/docs/orchestration.md +107 -79
  25. package/docs/quick-reference.md +11 -3
  26. package/docs/release.md +4 -3
  27. package/docs/skills.md +67 -38
  28. package/docs/usage.md +84 -39
  29. package/engine/cmd/releasepack/main.go +219 -0
  30. package/engine/cmd/releasepack/main_test.go +170 -0
  31. package/engine/commands.go +170 -23
  32. package/engine/git_guard.go +187 -0
  33. package/engine/git_guard_test.go +283 -0
  34. package/engine/hookpolicy.go +53 -55
  35. package/engine/hookpolicy_test.go +91 -1
  36. package/engine/hooks.go +296 -75
  37. package/engine/hooks_events_test.go +276 -6
  38. package/engine/hooks_workspace.go +640 -159
  39. package/engine/internal/devritespaths/paths.go +65 -10
  40. package/engine/internal/devritespaths/paths_test.go +110 -0
  41. package/engine/internal/doctor/doctor.go +153 -23
  42. package/engine/internal/doctor/doctor_test.go +74 -0
  43. package/engine/internal/forge/forge.go +940 -0
  44. package/engine/internal/forge/forge_test.go +576 -0
  45. package/engine/internal/forge/git.go +245 -0
  46. package/engine/internal/forge/liveness_unix.go +48 -0
  47. package/engine/internal/forge/liveness_windows.go +67 -0
  48. package/engine/internal/forge/manifest.go +402 -0
  49. package/engine/internal/gate/gate.go +90 -71
  50. package/engine/internal/gate/gate_test.go +71 -2
  51. package/engine/internal/harness/compliance.go +18 -24
  52. package/engine/internal/harness/harness.go +37 -44
  53. package/engine/internal/harness/harness_test.go +21 -5
  54. package/engine/internal/install/install.go +486 -38
  55. package/engine/internal/install/install_test.go +383 -10
  56. package/engine/internal/iohooks/iohooks.go +350 -59
  57. package/engine/internal/iohooks/iohooks_test.go +421 -1
  58. package/engine/internal/lib/buildreadiness.go +43 -18
  59. package/engine/internal/lib/clarifyreturn.go +91 -0
  60. package/engine/internal/lib/clarifyreturn_test.go +123 -0
  61. package/engine/internal/lib/context.go +54 -15
  62. package/engine/internal/lib/cursor_compat_test.go +8 -0
  63. package/engine/internal/lib/extensions.go +2 -3
  64. package/engine/internal/lib/gitauthority.go +601 -0
  65. package/engine/internal/lib/gitauthority_test.go +346 -0
  66. package/engine/internal/lib/jsonout.go +25 -11
  67. package/engine/internal/lib/jsonout_test.go +16 -0
  68. package/engine/internal/lib/lanes.go +14 -8
  69. package/engine/internal/lib/observability_test.go +358 -0
  70. package/engine/internal/lib/packageexistence.go +151 -35
  71. package/engine/internal/lib/packageexistence_test.go +163 -0
  72. package/engine/internal/lib/progress.go +11 -9
  73. package/engine/internal/lib/provenance.go +462 -0
  74. package/engine/internal/lib/provenance_test.go +154 -0
  75. package/engine/internal/lib/readiness_contract.json +118 -0
  76. package/engine/internal/lib/readinessartifact.go +533 -0
  77. package/engine/internal/lib/readinessartifact_test.go +422 -0
  78. package/engine/internal/lib/reconcile.go +712 -88
  79. package/engine/internal/lib/reconcile_test.go +335 -16
  80. package/engine/internal/lib/recoveryattempts.go +298 -0
  81. package/engine/internal/lib/recoveryattempts_test.go +215 -0
  82. package/engine/internal/lib/resolve.go +23 -19
  83. package/engine/internal/lib/runbook_context_test.go +20 -0
  84. package/engine/internal/lib/session.go +701 -9
  85. package/engine/internal/lib/session_test.go +80 -13
  86. package/engine/internal/lib/testintegrity.go +33 -37
  87. package/engine/internal/lib/testintegrity_test.go +63 -1
  88. package/engine/internal/migrate/migrate.go +81 -1
  89. package/engine/internal/migrate/migrate_test.go +22 -1
  90. package/engine/internal/reason/reason.go +180 -0
  91. package/engine/internal/reason/reason_test.go +35 -0
  92. package/engine/internal/rootfacts/facts.go +466 -0
  93. package/engine/internal/rootfacts/facts_test.go +306 -0
  94. package/engine/internal/safepath/safepath.go +55 -0
  95. package/engine/internal/safepath/safepath_test.go +69 -0
  96. package/engine/internal/safepath/safepath_windows_test.go +26 -0
  97. package/engine/internal/state/clarify_transition.go +165 -0
  98. package/engine/internal/state/clarify_transition_test.go +130 -0
  99. package/engine/internal/state/cmd/workflowmanifest/main.go +12 -8
  100. package/engine/internal/state/cursor.go +58 -0
  101. package/engine/internal/state/cursor_test.go +42 -1
  102. package/engine/internal/state/feature.go +35 -48
  103. package/engine/internal/state/schema.go +90 -37
  104. package/engine/internal/state/snapshot.go +18 -2
  105. package/engine/internal/state/state_test.go +187 -7
  106. package/engine/internal/state/status.go +48 -11
  107. package/engine/internal/state/workflow_manifest.json +231 -50
  108. package/engine/internal/toolpolicy/classifier.go +533 -0
  109. package/engine/internal/toolpolicy/classifier_test.go +424 -0
  110. package/engine/internal/toolpolicy/git.go +616 -0
  111. package/engine/internal/toolpolicy/scanner.go +382 -0
  112. package/engine/main.go +160 -77
  113. package/engine/observability_cli_test.go +52 -0
  114. package/engine/root_routing_test.go +277 -0
  115. package/engine/testdata/golden/TestParityBuildReadiness/arg=approved.golden +1 -1
  116. package/engine/testdata/golden/TestParityBuildReadiness/arg=emptystatus.golden +1 -1
  117. package/engine/testdata/golden/TestParityBuildReadiness/arg=legacycontract.golden +1 -0
  118. package/engine/testdata/golden/TestParityBuildReadiness/arg=noclarify.golden +1 -0
  119. package/engine/testdata/golden/TestParityBuildReadiness/arg=novet.golden +1 -0
  120. package/engine/testdata/golden/TestParityBuildReadiness/arg=stalevet.golden +1 -0
  121. package/engine/testdata/golden/TestParityBuildReadiness/arg=trailhash.golden +1 -1
  122. package/engine/testdata/golden/TestParityBuildReadiness/arg=trailpipe.golden +1 -1
  123. package/engine/testdata/golden/TestParityBuildReadiness/arg=vetnotready.golden +1 -0
  124. package/engine/testdata/golden/TestParityProgress/arg=allbuilt.golden +1 -1
  125. package/engine/testdata/golden/TestParityProgress/arg=done.golden +1 -1
  126. package/engine/testdata/golden/TestParityProgress/arg=mid.golden +1 -1
  127. package/engine/testdata/golden/TestParityProgress/arg=nophase.golden +1 -1
  128. package/engine/testdata/golden/TestParityProgress/arg=noslice.golden +1 -1
  129. package/engine/testdata/golden/TestParityProgress/arg=plan.golden +1 -1
  130. package/engine/testdata/golden/TestParityProgress/arg=seal.golden +1 -1
  131. package/engine/testdata/golden/TestParityReconcile/check-clean.golden +1 -1
  132. package/engine/testdata/golden/TestParityReconcile/inline-fallback.golden +1 -0
  133. package/engine/testdata/golden/TestParityReconcile/snapshot-no-allowlist.golden +1 -0
  134. package/engine/testdata/golden/TestParityWrightScope/devrites-edit-denied.golden +2 -0
  135. package/engine/testdata/golden/TestParityWrightScope/out-of-scope-enforce-denies.golden +1 -1
  136. package/engine/tests/adr_0011_define_plan_test.go +30 -0
  137. package/engine/tests/budget_test.go +19 -8
  138. package/engine/tests/concurrency_cli_test.go +7 -1
  139. package/engine/tests/doctor_cli_test.go +148 -2
  140. package/engine/tests/forge_cli_test.go +463 -0
  141. package/engine/tests/gate_test.go +63 -8
  142. package/engine/tests/hook_test.go +260 -8
  143. package/engine/tests/hooks_io_test.go +94 -3
  144. package/engine/tests/json_contract_test.go +127 -2
  145. package/engine/tests/migrate_cli_test.go +2 -2
  146. package/engine/tests/parity_buildreadiness_test.go +167 -10
  147. package/engine/tests/parity_learnings_test.go +16 -17
  148. package/engine/tests/parity_reconcile_test.go +20 -17
  149. package/engine/tests/parity_resolve_test.go +12 -11
  150. package/engine/tests/parity_test.go +21 -17
  151. package/pack/.claude/agents/devrites-code-reviewer.md +62 -48
  152. package/pack/.claude/agents/devrites-devex-reviewer.md +69 -53
  153. package/pack/.claude/agents/devrites-doubt-reviewer.md +29 -22
  154. package/pack/.claude/agents/devrites-evidence-scout.md +69 -0
  155. package/pack/.claude/agents/devrites-forge-judge.md +74 -61
  156. package/pack/.claude/agents/devrites-frontend-reviewer.md +48 -39
  157. package/pack/.claude/agents/devrites-performance-reviewer.md +49 -40
  158. package/pack/.claude/agents/devrites-plan-drafter.md +73 -0
  159. package/pack/.claude/agents/devrites-plan-reviewer.md +80 -47
  160. package/pack/.claude/agents/devrites-proof-runner.md +74 -0
  161. package/pack/.claude/agents/devrites-retrospector.md +48 -45
  162. package/pack/.claude/agents/devrites-security-auditor.md +46 -36
  163. package/pack/.claude/agents/devrites-simplifier-reviewer.md +50 -46
  164. package/pack/.claude/agents/devrites-slice-wright.md +153 -165
  165. package/pack/.claude/agents/devrites-spec-reviewer.md +34 -32
  166. package/pack/.claude/agents/devrites-strategy-reviewer.md +63 -34
  167. package/pack/.claude/agents/devrites-test-analyst.md +40 -30
  168. package/pack/.claude/agents/devrites-upgrade-planner.md +100 -0
  169. package/pack/.claude/settings.json +2 -1
  170. package/pack/.claude/skills/devrites-audit/SKILL.md +40 -61
  171. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +24 -13
  172. package/pack/.claude/skills/devrites-debug-recovery/reference/build-the-loop.md +24 -21
  173. package/pack/.claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -6
  174. package/pack/.claude/skills/devrites-debug-recovery/reference/instrumentation.md +2 -2
  175. package/pack/.claude/skills/devrites-doubt/SKILL.md +25 -17
  176. package/pack/.claude/skills/devrites-interview/SKILL.md +53 -52
  177. package/pack/.claude/skills/devrites-lib/SKILL.md +12 -9
  178. package/pack/.claude/skills/devrites-lib/reference/intent-map.md +4 -2
  179. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +82 -137
  180. package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +8 -1
  181. package/pack/.claude/skills/devrites-lib/reference/standards/README.md +38 -55
  182. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +53 -27
  183. package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +200 -190
  184. package/pack/.claude/skills/devrites-lib/reference/standards/anti-patterns.md +5 -15
  185. package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +27 -58
  186. package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +16 -52
  187. package/pack/.claude/skills/devrites-lib/reference/standards/coding-style.md +2 -10
  188. package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +18 -61
  189. package/pack/.claude/skills/devrites-lib/reference/standards/core.md +23 -18
  190. package/pack/.claude/skills/devrites-lib/reference/standards/deprecation.md +17 -57
  191. package/pack/.claude/skills/devrites-lib/reference/standards/development-workflow.md +4 -33
  192. package/pack/.claude/skills/devrites-lib/reference/standards/git-workflow.md +4 -20
  193. package/pack/.claude/skills/devrites-lib/reference/standards/hooks.md +3 -14
  194. package/pack/.claude/skills/devrites-lib/reference/standards/patterns.md +9 -25
  195. package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +0 -9
  196. package/pack/.claude/skills/devrites-lib/reference/standards/principles.md +1 -3
  197. package/pack/.claude/skills/devrites-lib/reference/standards/security.md +17 -7
  198. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +1 -27
  199. package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +46 -50
  200. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +40 -10
  201. package/pack/.claude/skills/devrites-source-driven/SKILL.md +23 -22
  202. package/pack/.claude/skills/rite/SKILL.md +10 -6
  203. package/pack/.claude/skills/rite/reference/menu.md +13 -7
  204. package/pack/.claude/skills/rite-adopt/SKILL.md +33 -37
  205. package/pack/.claude/skills/rite-autocomplete/SKILL.md +33 -28
  206. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +21 -21
  207. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +15 -6
  208. package/pack/.claude/skills/rite-build/SKILL.md +35 -30
  209. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +41 -39
  210. package/pack/.claude/skills/rite-build/reference/evidence-standard.md +10 -0
  211. package/pack/.claude/skills/rite-build/reference/forge.md +186 -156
  212. package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +4 -3
  213. package/pack/.claude/skills/rite-build/reference/phase-contract.md +96 -175
  214. package/pack/.claude/skills/rite-build/reference/spec-drift-guard.md +10 -4
  215. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +129 -134
  216. package/pack/.claude/skills/rite-clarify/SKILL.md +90 -0
  217. package/pack/.claude/skills/rite-clarify/reference/decision-coverage.md +61 -0
  218. package/pack/.claude/skills/rite-converge/SKILL.md +35 -25
  219. package/pack/.claude/skills/rite-define/SKILL.md +58 -32
  220. package/pack/.claude/skills/rite-define/reference/gates.md +16 -15
  221. package/pack/.claude/skills/rite-define/reference/plan-template.md +18 -8
  222. package/pack/.claude/skills/rite-frame/reference/failure-modes.md +22 -24
  223. package/pack/.claude/skills/rite-plan/SKILL.md +47 -16
  224. package/pack/.claude/skills/rite-plan/reference/task-breakdown.md +4 -0
  225. package/pack/.claude/skills/rite-polish/SKILL.md +27 -23
  226. package/pack/.claude/skills/rite-prototype/SKILL.md +25 -26
  227. package/pack/.claude/skills/rite-prove/SKILL.md +27 -17
  228. package/pack/.claude/skills/rite-resolve/SKILL.md +12 -11
  229. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +3 -0
  230. package/pack/.claude/skills/rite-review/SKILL.md +37 -28
  231. package/pack/.claude/skills/rite-seal/reference/phase-contract.md +27 -92
  232. package/pack/.claude/skills/rite-seal/reference/risk-and-rollback.md +13 -0
  233. package/pack/.claude/skills/rite-ship/reference/design-memory.md +31 -36
  234. package/pack/.claude/skills/rite-spec/SKILL.md +84 -135
  235. package/pack/.claude/skills/rite-spec/reference/investigation.md +37 -33
  236. package/pack/.claude/skills/rite-spec/reference/question-protocol.md +6 -2
  237. package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +25 -24
  238. package/pack/.claude/skills/rite-spec/reference/spec-template.md +9 -2
  239. package/pack/.claude/skills/rite-spec/reference/state-workspace.md +13 -3
  240. package/pack/.claude/skills/rite-temper/SKILL.md +62 -47
  241. package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +24 -22
  242. package/pack/.claude/skills/rite-upgrade/SKILL.md +125 -0
  243. package/pack/.claude/skills/rite-vet/SKILL.md +114 -113
  244. package/pack/.claude/skills/rite-vet/reference/artifacts.md +50 -9
  245. package/pack/.claude/skills/rite-vet/reference/review-axes.md +39 -37
  246. package/pack/generated/claude/agents/devrites-code-reviewer.md +62 -48
  247. package/pack/generated/claude/agents/devrites-devex-reviewer.md +69 -53
  248. package/pack/generated/claude/agents/devrites-doubt-reviewer.md +29 -22
  249. package/pack/generated/claude/agents/devrites-evidence-scout.md +69 -0
  250. package/pack/generated/claude/agents/devrites-forge-judge.md +74 -61
  251. package/pack/generated/claude/agents/devrites-frontend-reviewer.md +48 -39
  252. package/pack/generated/claude/agents/devrites-performance-reviewer.md +49 -40
  253. package/pack/generated/claude/agents/devrites-plan-drafter.md +73 -0
  254. package/pack/generated/claude/agents/devrites-plan-reviewer.md +80 -47
  255. package/pack/generated/claude/agents/devrites-proof-runner.md +74 -0
  256. package/pack/generated/claude/agents/devrites-retrospector.md +48 -45
  257. package/pack/generated/claude/agents/devrites-security-auditor.md +46 -36
  258. package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +50 -46
  259. package/pack/generated/claude/agents/devrites-slice-wright.md +153 -165
  260. package/pack/generated/claude/agents/devrites-spec-reviewer.md +34 -32
  261. package/pack/generated/claude/agents/devrites-strategy-reviewer.md +63 -34
  262. package/pack/generated/claude/agents/devrites-test-analyst.md +40 -30
  263. package/pack/generated/claude/agents/devrites-upgrade-planner.md +100 -0
  264. package/pack/generated/claude/settings.json +2 -1
  265. package/pack/generated/claude/skills/devrites-audit/SKILL.md +40 -61
  266. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +24 -13
  267. package/pack/generated/claude/skills/devrites-debug-recovery/reference/build-the-loop.md +24 -21
  268. package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -6
  269. package/pack/generated/claude/skills/devrites-debug-recovery/reference/instrumentation.md +2 -2
  270. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +25 -17
  271. package/pack/generated/claude/skills/devrites-interview/SKILL.md +53 -52
  272. package/pack/generated/claude/skills/devrites-lib/SKILL.md +12 -9
  273. package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +4 -2
  274. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +82 -137
  275. package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +8 -1
  276. package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +38 -55
  277. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +53 -27
  278. package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +200 -190
  279. package/pack/generated/claude/skills/devrites-lib/reference/standards/anti-patterns.md +5 -15
  280. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +27 -58
  281. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +16 -52
  282. package/pack/generated/claude/skills/devrites-lib/reference/standards/coding-style.md +2 -10
  283. package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +18 -61
  284. package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +23 -18
  285. package/pack/generated/claude/skills/devrites-lib/reference/standards/deprecation.md +17 -57
  286. package/pack/generated/claude/skills/devrites-lib/reference/standards/development-workflow.md +4 -33
  287. package/pack/generated/claude/skills/devrites-lib/reference/standards/git-workflow.md +4 -20
  288. package/pack/generated/claude/skills/devrites-lib/reference/standards/hooks.md +3 -14
  289. package/pack/generated/claude/skills/devrites-lib/reference/standards/patterns.md +9 -25
  290. package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +0 -9
  291. package/pack/generated/claude/skills/devrites-lib/reference/standards/principles.md +1 -3
  292. package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +17 -7
  293. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +1 -27
  294. package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +46 -50
  295. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +40 -10
  296. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +23 -22
  297. package/pack/generated/claude/skills/rite/SKILL.md +10 -6
  298. package/pack/generated/claude/skills/rite/reference/menu.md +13 -7
  299. package/pack/generated/claude/skills/rite-adopt/SKILL.md +33 -37
  300. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +33 -28
  301. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +21 -21
  302. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +15 -6
  303. package/pack/generated/claude/skills/rite-build/SKILL.md +35 -30
  304. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +41 -39
  305. package/pack/generated/claude/skills/rite-build/reference/evidence-standard.md +10 -0
  306. package/pack/generated/claude/skills/rite-build/reference/forge.md +186 -156
  307. package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +4 -3
  308. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +96 -175
  309. package/pack/generated/claude/skills/rite-build/reference/spec-drift-guard.md +10 -4
  310. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +129 -134
  311. package/pack/generated/claude/skills/rite-clarify/SKILL.md +90 -0
  312. package/pack/generated/claude/skills/rite-clarify/reference/decision-coverage.md +61 -0
  313. package/pack/generated/claude/skills/rite-converge/SKILL.md +35 -25
  314. package/pack/generated/claude/skills/rite-define/SKILL.md +58 -32
  315. package/pack/generated/claude/skills/rite-define/reference/gates.md +16 -15
  316. package/pack/generated/claude/skills/rite-define/reference/plan-template.md +18 -8
  317. package/pack/generated/claude/skills/rite-frame/reference/failure-modes.md +22 -24
  318. package/pack/generated/claude/skills/rite-plan/SKILL.md +47 -16
  319. package/pack/generated/claude/skills/rite-plan/reference/task-breakdown.md +4 -0
  320. package/pack/generated/claude/skills/rite-polish/SKILL.md +27 -23
  321. package/pack/generated/claude/skills/rite-prototype/SKILL.md +25 -26
  322. package/pack/generated/claude/skills/rite-prove/SKILL.md +27 -17
  323. package/pack/generated/claude/skills/rite-resolve/SKILL.md +12 -11
  324. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +3 -0
  325. package/pack/generated/claude/skills/rite-review/SKILL.md +37 -28
  326. package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +27 -92
  327. package/pack/generated/claude/skills/rite-seal/reference/risk-and-rollback.md +13 -0
  328. package/pack/generated/claude/skills/rite-ship/reference/design-memory.md +31 -36
  329. package/pack/generated/claude/skills/rite-spec/SKILL.md +84 -135
  330. package/pack/generated/claude/skills/rite-spec/reference/investigation.md +37 -33
  331. package/pack/generated/claude/skills/rite-spec/reference/question-protocol.md +6 -2
  332. package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +25 -24
  333. package/pack/generated/claude/skills/rite-spec/reference/spec-template.md +9 -2
  334. package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +13 -3
  335. package/pack/generated/claude/skills/rite-temper/SKILL.md +62 -47
  336. package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +24 -22
  337. package/pack/generated/claude/skills/rite-upgrade/SKILL.md +125 -0
  338. package/pack/generated/claude/skills/rite-vet/SKILL.md +114 -113
  339. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +50 -9
  340. package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +39 -37
  341. package/pack/generated/codex/AGENTS.md +5 -2
  342. package/pack/generated/codex/agents/devrites-code-reviewer.toml +69 -47
  343. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +75 -51
  344. package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +35 -20
  345. package/pack/generated/codex/agents/devrites-evidence-scout.toml +75 -0
  346. package/pack/generated/codex/agents/devrites-forge-judge.toml +80 -59
  347. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +54 -37
  348. package/pack/generated/codex/agents/devrites-performance-reviewer.toml +55 -38
  349. package/pack/generated/codex/agents/devrites-plan-drafter.toml +79 -0
  350. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +82 -47
  351. package/pack/generated/codex/agents/devrites-proof-runner.toml +80 -0
  352. package/pack/generated/codex/agents/devrites-retrospector.toml +54 -43
  353. package/pack/generated/codex/agents/devrites-security-auditor.toml +53 -35
  354. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +56 -44
  355. package/pack/generated/codex/agents/devrites-slice-wright.toml +159 -163
  356. package/pack/generated/codex/agents/devrites-spec-reviewer.toml +40 -30
  357. package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +65 -34
  358. package/pack/generated/codex/agents/devrites-test-analyst.toml +46 -28
  359. package/pack/generated/codex/agents/devrites-upgrade-planner.toml +106 -0
  360. package/pack/generated/codex/hooks.json +4 -14
  361. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +7 -3
  362. package/pack/generated/codex/skills/devrites-audit/SKILL.md +47 -64
  363. package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +7 -3
  364. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +31 -16
  365. package/pack/generated/codex/skills/devrites-debug-recovery/reference/build-the-loop.md +24 -21
  366. package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -6
  367. package/pack/generated/codex/skills/devrites-debug-recovery/reference/instrumentation.md +2 -2
  368. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +32 -20
  369. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +7 -3
  370. package/pack/generated/codex/skills/devrites-interview/SKILL.md +60 -55
  371. package/pack/generated/codex/skills/devrites-lib/SKILL.md +19 -12
  372. package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +4 -2
  373. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +82 -137
  374. package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +8 -1
  375. package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +38 -55
  376. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +53 -27
  377. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +200 -190
  378. package/pack/generated/codex/skills/devrites-lib/reference/standards/anti-patterns.md +5 -15
  379. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +27 -58
  380. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +16 -52
  381. package/pack/generated/codex/skills/devrites-lib/reference/standards/coding-style.md +2 -10
  382. package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +18 -61
  383. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +23 -18
  384. package/pack/generated/codex/skills/devrites-lib/reference/standards/deprecation.md +17 -57
  385. package/pack/generated/codex/skills/devrites-lib/reference/standards/development-workflow.md +4 -33
  386. package/pack/generated/codex/skills/devrites-lib/reference/standards/git-workflow.md +4 -20
  387. package/pack/generated/codex/skills/devrites-lib/reference/standards/hooks.md +3 -14
  388. package/pack/generated/codex/skills/devrites-lib/reference/standards/patterns.md +9 -25
  389. package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +0 -9
  390. package/pack/generated/codex/skills/devrites-lib/reference/standards/principles.md +1 -3
  391. package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +17 -7
  392. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +1 -27
  393. package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +46 -50
  394. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +40 -10
  395. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +7 -3
  396. package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +7 -3
  397. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +29 -24
  398. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +7 -3
  399. package/pack/generated/codex/skills/rite/SKILL.md +21 -13
  400. package/pack/generated/codex/skills/rite/reference/menu.md +13 -7
  401. package/pack/generated/codex/skills/rite-adopt/SKILL.md +40 -40
  402. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +40 -31
  403. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +21 -21
  404. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +15 -6
  405. package/pack/generated/codex/skills/rite-build/SKILL.md +42 -33
  406. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +41 -39
  407. package/pack/generated/codex/skills/rite-build/reference/evidence-standard.md +10 -0
  408. package/pack/generated/codex/skills/rite-build/reference/forge.md +186 -156
  409. package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +4 -3
  410. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +96 -175
  411. package/pack/generated/codex/skills/rite-build/reference/spec-drift-guard.md +10 -4
  412. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +129 -134
  413. package/pack/generated/codex/skills/rite-clarify/SKILL.md +106 -0
  414. package/pack/generated/codex/skills/rite-clarify/reference/decision-coverage.md +61 -0
  415. package/pack/generated/codex/skills/rite-converge/SKILL.md +42 -28
  416. package/pack/generated/codex/skills/rite-customize/SKILL.md +7 -3
  417. package/pack/generated/codex/skills/rite-define/SKILL.md +65 -35
  418. package/pack/generated/codex/skills/rite-define/reference/gates.md +16 -15
  419. package/pack/generated/codex/skills/rite-define/reference/plan-template.md +18 -8
  420. package/pack/generated/codex/skills/rite-doctor/SKILL.md +7 -3
  421. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +7 -3
  422. package/pack/generated/codex/skills/rite-explain/SKILL.md +7 -3
  423. package/pack/generated/codex/skills/rite-frame/SKILL.md +7 -3
  424. package/pack/generated/codex/skills/rite-frame/reference/failure-modes.md +22 -24
  425. package/pack/generated/codex/skills/rite-handoff/SKILL.md +7 -3
  426. package/pack/generated/codex/skills/rite-learn/SKILL.md +7 -3
  427. package/pack/generated/codex/skills/rite-plan/SKILL.md +54 -19
  428. package/pack/generated/codex/skills/rite-plan/reference/task-breakdown.md +5 -1
  429. package/pack/generated/codex/skills/rite-polish/SKILL.md +34 -26
  430. package/pack/generated/codex/skills/rite-pov/SKILL.md +7 -3
  431. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +7 -3
  432. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +7 -3
  433. package/pack/generated/codex/skills/rite-prototype/SKILL.md +32 -29
  434. package/pack/generated/codex/skills/rite-prove/SKILL.md +34 -20
  435. package/pack/generated/codex/skills/rite-quick/SKILL.md +7 -3
  436. package/pack/generated/codex/skills/rite-resolve/SKILL.md +19 -14
  437. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +3 -0
  438. package/pack/generated/codex/skills/rite-review/SKILL.md +44 -31
  439. package/pack/generated/codex/skills/rite-seal/SKILL.md +7 -3
  440. package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +27 -92
  441. package/pack/generated/codex/skills/rite-seal/reference/risk-and-rollback.md +13 -0
  442. package/pack/generated/codex/skills/rite-ship/SKILL.md +7 -3
  443. package/pack/generated/codex/skills/rite-ship/reference/design-memory.md +31 -36
  444. package/pack/generated/codex/skills/rite-spec/SKILL.md +91 -138
  445. package/pack/generated/codex/skills/rite-spec/reference/investigation.md +37 -33
  446. package/pack/generated/codex/skills/rite-spec/reference/question-protocol.md +6 -2
  447. package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +25 -24
  448. package/pack/generated/codex/skills/rite-spec/reference/spec-template.md +9 -2
  449. package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +13 -3
  450. package/pack/generated/codex/skills/rite-status/SKILL.md +7 -3
  451. package/pack/generated/codex/skills/rite-temper/SKILL.md +69 -50
  452. package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +24 -22
  453. package/pack/generated/codex/skills/rite-upgrade/SKILL.md +141 -0
  454. package/pack/generated/codex/skills/rite-upgrade/agents/openai.yaml +2 -0
  455. package/pack/generated/codex/skills/rite-vet/SKILL.md +121 -116
  456. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +50 -9
  457. package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +40 -38
  458. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +7 -3
  459. package/package.json +1 -1
  460. package/scripts/build-release-tarball.sh +32 -15
  461. package/scripts/check-authority-drift.py +125 -0
  462. package/scripts/check-instruction-size-baseline.mjs +19 -11
  463. package/scripts/check-invocation-integrity.py +2 -0
  464. package/scripts/codex-generate.sh +69 -33
  465. package/scripts/grade-feature.sh +121 -40
  466. package/scripts/live-hosts/agent-result.schema.json +230 -0
  467. package/scripts/live-hosts/claude.sh +87 -0
  468. package/scripts/live-hosts/codex.sh +81 -0
  469. package/scripts/live-hosts/common.sh +113 -0
  470. package/scripts/live-hosts/fake-host.py +264 -0
  471. package/scripts/live-hosts/host-transport.py +287 -0
  472. package/scripts/release-check.sh +5 -1
  473. package/scripts/run-agent-contract-evals.py +1380 -0
  474. package/scripts/run-behavioral-evals.sh +24 -30
  475. package/scripts/run-evals.sh +1 -5
  476. package/scripts/run-live-behavioral-evals.py +1274 -144
  477. package/scripts/run-outcome-evals.sh +445 -88
  478. package/scripts/run-tests.mjs +30 -2
  479. package/scripts/skills-inventory.mjs +1 -1
  480. package/scripts/validate-workflow-security.py +39 -20
  481. package/scripts/validate-workspace-schema.py +362 -10
  482. package/scripts/validate.sh +21 -15
  483. package/engine/testdata/golden/TestParityWrightScope/devrites-edit-allowed.golden +0 -1
  484. /package/engine/testdata/golden/{TestParityReconcile/check-no-claimed.golden → TestParityBuildReadiness/arg=clarifyopen.golden} +0 -0
@@ -0,0 +1,277 @@
1
+ package main
2
+
3
+ import (
4
+ "bytes"
5
+ "os"
6
+ "os/exec"
7
+ "path/filepath"
8
+ "reflect"
9
+ "sort"
10
+ "strings"
11
+ "testing"
12
+ )
13
+
14
+ func TestRootModeForCoversReadAndWriteSurfaces(t *testing.T) {
15
+ tests := []struct {
16
+ name string
17
+ command string
18
+ args []string
19
+ want rootMode
20
+ }{
21
+ {name: "unrelated command", command: "doctor", want: rootUnused},
22
+ {name: "first task", command: "first-task", want: rootLenient},
23
+ {name: "spec dedupe", command: "spec-dedupe", want: rootLenient},
24
+ {name: "footprint render", command: "footprint", args: []string{"render"}, want: rootLenient},
25
+ {name: "footprint roster", command: "footprint", args: []string{"roster"}, want: rootLenient},
26
+ {name: "footprint log", command: "footprint", args: []string{"log"}, want: rootStrict},
27
+ {name: "evidence fresh", command: "evidence-fresh", want: rootLenient},
28
+ {name: "coverage", command: "coverage", want: rootLenient},
29
+ {name: "doubt coverage", command: "doubt-coverage", want: rootLenient},
30
+ {name: "budget", command: "budget", want: rootLenient},
31
+ {name: "preamble", command: "preamble", want: rootLenient},
32
+ {name: "progress", command: "progress", want: rootLenient},
33
+ {name: "stuck check", command: "stuck", args: []string{"check"}, want: rootLenient},
34
+ {name: "stuck log", command: "stuck", args: []string{"log"}, want: rootStrict},
35
+ {name: "recovery route", command: "recovery", args: []string{"route"}, want: rootLenient},
36
+ {name: "recovery check", command: "recovery", args: []string{"check"}, want: rootLenient},
37
+ {name: "recovery fingerprint", command: "recovery", args: []string{"fingerprint"}, want: rootLenient},
38
+ {name: "recovery record", command: "recovery", args: []string{"record"}, want: rootStrict},
39
+ {name: "recovery clear", command: "recovery", args: []string{"clear"}, want: rootStrict},
40
+ {name: "build readiness", command: "build-readiness", want: rootLenient},
41
+ {name: "readiness digest", command: "readiness-digest", want: rootLenient},
42
+ {name: "clarify enter", command: "clarify-return", args: []string{"enter"}, want: rootStrict},
43
+ {name: "clarify restore", command: "clarify-return", args: []string{"restore"}, want: rootStrict},
44
+ {name: "analyze", command: "analyze", want: rootLenient},
45
+ {name: "mutation gate", command: "mutation-gate", want: rootLenient},
46
+ {name: "test integrity", command: "test-integrity", want: rootLenient},
47
+ {name: "review integrity", command: "review-integrity", want: rootLenient},
48
+ {name: "package existence", command: "package-existence", want: rootLenient},
49
+ {name: "reconcile snapshot", command: "reconcile", args: []string{"snapshot"}, want: rootStrict},
50
+ {name: "reconcile check", command: "reconcile", args: []string{"check"}, want: rootStrict},
51
+ {name: "reconcile close", command: "reconcile", args: []string{"close"}, want: rootStrict},
52
+ {name: "resolve", command: "resolve", want: rootStrict},
53
+ {name: "resolve next qid", command: "resolve", args: []string{"next-qid"}, want: rootLenient},
54
+ {name: "close out", command: "close-out", want: rootStrict},
55
+ {name: "archive search", command: "archive-search", want: rootLenient},
56
+ {name: "decisions search", command: "decisions", args: []string{"search"}, want: rootLenient},
57
+ {name: "decisions index", command: "decisions", args: []string{"index"}, want: rootStrict},
58
+ {name: "ledger diff", command: "ledger", args: []string{"diff"}, want: rootLenient},
59
+ {name: "ledger validate", command: "ledger", args: []string{"validate"}, want: rootLenient},
60
+ {name: "ledger list", command: "ledger", args: []string{"list"}, want: rootLenient},
61
+ {name: "ledger show", command: "ledger", args: []string{"show"}, want: rootLenient},
62
+ {name: "ledger sync", command: "ledger", args: []string{"sync"}, want: rootStrict},
63
+ {name: "ledger json before sync", command: "ledger", args: []string{"--json", "sync"}, want: rootStrict},
64
+ {name: "learnings list", command: "learnings", args: []string{"list"}, want: rootLenient},
65
+ {name: "learnings top", command: "learnings", args: []string{"top"}, want: rootLenient},
66
+ {name: "learnings mine", command: "learnings", args: []string{"mine"}, want: rootLenient},
67
+ {name: "learnings nudge", command: "learnings", args: []string{"nudge"}, want: rootLenient},
68
+ {name: "learnings add", command: "learnings", args: []string{"add"}, want: rootStrict},
69
+ {name: "timeline list", command: "timeline", args: []string{"list"}, want: rootLenient},
70
+ {name: "timeline report", command: "timeline", args: []string{"report"}, want: rootLenient},
71
+ {name: "timeline log", command: "timeline", args: []string{"log"}, want: rootStrict},
72
+ {name: "timeline purge", command: "timeline", args: []string{"purge"}, want: rootStrict},
73
+ {name: "health list", command: "health", args: []string{"list"}, want: rootLenient},
74
+ {name: "health default", command: "health", want: rootStrict},
75
+ {name: "health run", command: "health", args: []string{"run"}, want: rootStrict},
76
+ {name: "health check", command: "health", args: []string{"check"}, want: rootStrict},
77
+ {name: "health record", command: "health", args: []string{"record"}, want: rootStrict},
78
+ {name: "config", command: "config", args: []string{"get"}, want: rootLenient},
79
+ {name: "reviewers", command: "reviewers", args: []string{"list"}, want: rootLenient},
80
+ {name: "outside voice", command: "outside-voice", want: rootLenient},
81
+ {name: "docs stale", command: "docs-stale", want: rootLenient},
82
+ {name: "secret scan", command: "secret-scan", want: rootLenient},
83
+ {name: "review fingerprints read", command: "review-fingerprints", want: rootLenient},
84
+ {name: "review fingerprints write", command: "review-fingerprints", args: []string{"demo", "--write"}, want: rootStrict},
85
+ {name: "reviewer stats report", command: "reviewer-stats", args: []string{"report"}, want: rootLenient},
86
+ {name: "reviewer stats record", command: "reviewer-stats", args: []string{"record"}, want: rootStrict},
87
+ {name: "lanes", command: "lanes", args: []string{"plan"}, want: rootLenient},
88
+ {name: "forge missing verb", command: "forge", want: rootStrict},
89
+ {name: "forge plan", command: "forge", args: []string{"plan"}, want: rootStrict},
90
+ {name: "forge record", command: "forge", args: []string{"record"}, want: rootStrict},
91
+ {name: "forge extract", command: "forge", args: []string{"extract"}, want: rootStrict},
92
+ {name: "forge merge", command: "forge", args: []string{"merge"}, want: rootStrict},
93
+ {name: "forge cleanup", command: "forge", args: []string{"cleanup"}, want: rootStrict},
94
+ {name: "forge reap", command: "forge", args: []string{"reap"}, want: rootStrict},
95
+ {name: "extensions list", command: "extensions", args: []string{"list"}, want: rootLenient},
96
+ {name: "extensions validate", command: "extensions", args: []string{"validate"}, want: rootLenient},
97
+ {name: "extensions sync", command: "extensions", args: []string{"sync"}, want: rootStrict},
98
+ {name: "overrides", command: "overrides", args: []string{"validate"}, want: rootLenient},
99
+ {name: "context show", command: "context", args: []string{"show"}, want: rootLenient},
100
+ {name: "context sync", command: "context", args: []string{"sync"}, want: rootStrict},
101
+ {name: "runbook list", command: "runbook", args: []string{"list"}, want: rootLenient},
102
+ {name: "runbook validate", command: "runbook", args: []string{"validate"}, want: rootLenient},
103
+ {name: "runbook run", command: "runbook", args: []string{"run"}, want: rootStrict},
104
+ {name: "runbook resume", command: "runbook", args: []string{"resume"}, want: rootStrict},
105
+ }
106
+
107
+ for _, test := range tests {
108
+ t.Run(test.name, func(t *testing.T) {
109
+ if got := rootModeFor(test.command, test.args); got != test.want {
110
+ t.Fatalf("rootModeFor(%q, %q) = %d, want %d", test.command, test.args, got, test.want)
111
+ }
112
+ })
113
+ }
114
+ }
115
+
116
+ func TestStrictForgeRefusesParentWorkspaceAcrossNestedRepository(t *testing.T) {
117
+ parent := t.TempDir()
118
+ if err := os.Mkdir(filepath.Join(parent, ".devrites"), 0o755); err != nil {
119
+ t.Fatal(err)
120
+ }
121
+ child := filepath.Join(parent, "nested")
122
+ if err := os.Mkdir(child, 0o755); err != nil {
123
+ t.Fatal(err)
124
+ }
125
+ initRootRoutingGitRepo(t, child)
126
+ withRootRoutingCWD(t, child)
127
+ t.Setenv("DEVRITES_ROOT", "")
128
+ t.Setenv("DEVRITES_WORKSPACE", "")
129
+
130
+ var stdout, stderr bytes.Buffer
131
+ code := run([]string{"forge", "plan"}, strings.NewReader(""), &stdout, &stderr)
132
+ if code != exitBlocked {
133
+ t.Fatalf("forge plan exit = %d, want %d; stdout=%q stderr=%q", code, exitBlocked, stdout.String(), stderr.String())
134
+ }
135
+ if !strings.Contains(stderr.String(), "unsafe DevRites root") {
136
+ t.Fatalf("stderr = %q, want unsafe-root refusal", stderr.String())
137
+ }
138
+ if _, err := os.Stat(filepath.Join(child, ".devrites")); !os.IsNotExist(err) {
139
+ t.Fatalf("strict refusal must not create nested workspace; stat err=%v", err)
140
+ }
141
+
142
+ stdout.Reset()
143
+ stderr.Reset()
144
+ code = run([]string{"context", "show"}, strings.NewReader(""), &stdout, &stderr)
145
+ if code != exitOK {
146
+ t.Fatalf("context show exit = %d, want %d; stderr=%q", code, exitOK, stderr.String())
147
+ }
148
+ if !strings.Contains(stdout.String(), "DRV-ROOT-OUTSIDE-GIT") {
149
+ t.Fatalf("context show should diagnose the unsafe parent root; stdout=%q", stdout.String())
150
+ }
151
+ }
152
+
153
+ func TestStrictWriterRefusesExternalWorkspaceBeforeMutation(t *testing.T) {
154
+ project := t.TempDir()
155
+ root := filepath.Join(project, ".devrites")
156
+ if err := os.MkdirAll(filepath.Join(root, "work", "demo"), 0o755); err != nil {
157
+ t.Fatal(err)
158
+ }
159
+ initRootRoutingGitRepo(t, project)
160
+ withRootRoutingCWD(t, project)
161
+ t.Setenv("DEVRITES_ROOT", "")
162
+ t.Setenv("DEVRITES_WORKSPACE", t.TempDir())
163
+ before := rootRoutingTree(t, root)
164
+
165
+ var stdout, stderr bytes.Buffer
166
+ code := run([]string{"timeline", "log", "rite-build"}, strings.NewReader(""), &stdout, &stderr)
167
+ if code != exitBlocked {
168
+ t.Fatalf("timeline log exit = %d, want %d; stdout=%q stderr=%q", code, exitBlocked, stdout.String(), stderr.String())
169
+ }
170
+ if !strings.Contains(stderr.String(), "unsafe DevRites root") {
171
+ t.Fatalf("stderr = %q, want unsafe-root refusal", stderr.String())
172
+ }
173
+ if after := rootRoutingTree(t, root); !reflect.DeepEqual(after, before) {
174
+ t.Fatalf("strict refusal mutated workspace tree: before=%q after=%q", before, after)
175
+ }
176
+
177
+ stdout.Reset()
178
+ stderr.Reset()
179
+ code = run(
180
+ []string{"timeline", "purge", "--run", "drv-run-v1:0123456789abcdef0123456789abcdef"},
181
+ strings.NewReader(""),
182
+ &stdout,
183
+ &stderr,
184
+ )
185
+ if code != exitBlocked {
186
+ t.Fatalf("timeline purge exit = %d, want %d; stdout=%q stderr=%q", code, exitBlocked, stdout.String(), stderr.String())
187
+ }
188
+ if after := rootRoutingTree(t, root); !reflect.DeepEqual(after, before) {
189
+ t.Fatalf("unsafe timeline purge mutated workspace tree: before=%q after=%q", before, after)
190
+ }
191
+ }
192
+
193
+ func TestStrictWriterRefusesWorkspaceOverrideWithoutRoot(t *testing.T) {
194
+ project := t.TempDir()
195
+ initRootRoutingGitRepo(t, project)
196
+ withRootRoutingCWD(t, project)
197
+ t.Setenv("DEVRITES_ROOT", "")
198
+ t.Setenv("DEVRITES_WORKSPACE", t.TempDir())
199
+
200
+ var stdout, stderr bytes.Buffer
201
+ code := run([]string{"learnings", "add", "demo", "must not escape"}, strings.NewReader(""), &stdout, &stderr)
202
+ if code != exitBlocked {
203
+ t.Fatalf("learnings add exit = %d, want %d; stdout=%q stderr=%q", code, exitBlocked, stdout.String(), stderr.String())
204
+ }
205
+ if !strings.Contains(stderr.String(), "DEVRITES_WORKSPACE requires a selected DevRites root") {
206
+ t.Fatalf("stderr = %q, want workspace-without-root refusal", stderr.String())
207
+ }
208
+ if _, err := os.Stat(filepath.Join(project, ".devrites")); !os.IsNotExist(err) {
209
+ t.Fatalf("strict refusal must not create a root; stat err=%v", err)
210
+ }
211
+ }
212
+
213
+ func TestStrictWriterRefusesMissingExplicitRoot(t *testing.T) {
214
+ project := t.TempDir()
215
+ initRootRoutingGitRepo(t, project)
216
+ withRootRoutingCWD(t, project)
217
+ root := filepath.Join(project, ".devrites")
218
+ t.Setenv("DEVRITES_ROOT", root)
219
+ t.Setenv("DEVRITES_WORKSPACE", "")
220
+
221
+ var stdout, stderr bytes.Buffer
222
+ code := run([]string{"learnings", "add", "demo", "must not bootstrap"}, strings.NewReader(""), &stdout, &stderr)
223
+ if code != exitBlocked {
224
+ t.Fatalf("learnings add exit = %d, want %d; stdout=%q stderr=%q", code, exitBlocked, stdout.String(), stderr.String())
225
+ }
226
+ if !strings.Contains(stderr.String(), "unsafe DevRites root") {
227
+ t.Fatalf("stderr = %q, want invalid explicit-root refusal", stderr.String())
228
+ }
229
+ if _, err := os.Stat(root); !os.IsNotExist(err) {
230
+ t.Fatalf("strict refusal must not create explicit missing root; stat err=%v", err)
231
+ }
232
+ }
233
+
234
+ func initRootRoutingGitRepo(t *testing.T, dir string) {
235
+ t.Helper()
236
+ cmd := exec.Command("git", "init", "-q", dir)
237
+ if output, err := cmd.CombinedOutput(); err != nil {
238
+ t.Fatalf("git init %s: %v\n%s", dir, err, output)
239
+ }
240
+ }
241
+
242
+ func withRootRoutingCWD(t *testing.T, dir string) {
243
+ t.Helper()
244
+ before, err := os.Getwd()
245
+ if err != nil {
246
+ t.Fatal(err)
247
+ }
248
+ if err := os.Chdir(dir); err != nil {
249
+ t.Fatal(err)
250
+ }
251
+ t.Cleanup(func() {
252
+ if err := os.Chdir(before); err != nil {
253
+ t.Errorf("restore cwd: %v", err)
254
+ }
255
+ })
256
+ }
257
+
258
+ func rootRoutingTree(t *testing.T, root string) []string {
259
+ t.Helper()
260
+ var paths []string
261
+ err := filepath.WalkDir(root, func(path string, entry os.DirEntry, err error) error {
262
+ if err != nil {
263
+ return err
264
+ }
265
+ rel, err := filepath.Rel(root, path)
266
+ if err != nil {
267
+ return err
268
+ }
269
+ paths = append(paths, rel)
270
+ return nil
271
+ })
272
+ if err != nil {
273
+ t.Fatal(err)
274
+ }
275
+ sort.Strings(paths)
276
+ return paths
277
+ }
@@ -1,2 +1,2 @@
1
1
  exit 0
2
- readiness: OK: plan approved 2024-01-01, status running. Ready to build.
2
+ readiness: OK: plan approved 2024-01-01, decision coverage CLEAR, implementation READY, status running. Ready to build.
@@ -1,2 +1,2 @@
1
1
  exit 0
2
- readiness: OK: plan approved 2024-01-01, status running. Ready to build.
2
+ readiness: OK: plan approved 2024-01-01, decision coverage CLEAR, implementation READY, status running. Ready to build.
@@ -1,2 +1,2 @@
1
1
  exit 0
2
- readiness: OK: plan approved 2024-01-01, status running. Ready to build.
2
+ readiness: OK: plan approved 2024-01-01, decision coverage CLEAR, implementation READY, status running. Ready to build.
@@ -1,2 +1,2 @@
1
1
  exit 0
2
- readiness: OK: plan approved 2024-01-01, status running. Ready to build.
2
+ readiness: OK: plan approved 2024-01-01, decision coverage CLEAR, implementation READY, status running. Ready to build.
@@ -1,4 +1,4 @@
1
1
  exit 0
2
2
  ── rite-build ─────────
3
3
  Slices 2/2 ██████████ ✅ ALL BUILT
4
- Flow spec ✓ define ✓ plan ✓ build ◉ prove ○ polish ○ review ○ seal ○ ship ○
4
+ Flow spec ✓ clarify ✓ define ✓ plan ✓ build ◉ prove ○ polish ○ review ○ seal ○ ship ○
@@ -1,3 +1,3 @@
1
1
  exit 0
2
2
  ── rite-done ─────────
3
- Flow spec ✓ define ✓ plan ✓ build ✓ prove ✓ polish ✓ review ✓ seal ✓ ship ✓
3
+ Flow spec ✓ clarify ✓ define ✓ plan ✓ build ✓ prove ✓ polish ✓ review ✓ seal ✓ ship ✓
@@ -1,4 +1,4 @@
1
1
  exit 0
2
2
  ── rite-build ─────────
3
3
  Slice 2/3 ███████░░░ detail ✓
4
- Flow spec ✓ temper ✓ define ✓ plan ✓ vet ✓ build ◉ prove ○ polish ○ review ○ seal ○ ship ○
4
+ Flow spec ✓ clarify ✓ temper ✓ define ✓ plan ✓ vet ✓ build ◉ prove ○ polish ○ review ○ seal ○ ship ○
@@ -1,3 +1,3 @@
1
1
  exit 0
2
2
  ── rite-spec ─────────
3
- Flow spec ◉ define ○ plan ○ build ○ prove ○ polish ○ review ○ seal ○ ship ○
3
+ Flow spec ◉ clarify ○ define ○ plan ○ build ○ prove ○ polish ○ review ○ seal ○ ship ○
@@ -1,3 +1,3 @@
1
1
  exit 0
2
2
  ── rite-spec ─────────
3
- Flow spec ◉ define ○ plan ○ build ○ prove ○ polish ○ review ○ seal ○ ship ○
3
+ Flow spec ◉ clarify ○ define ○ plan ○ build ○ prove ○ polish ○ review ○ seal ○ ship ○
@@ -1,4 +1,4 @@
1
1
  exit 0
2
2
  ── rite-plan ─────────
3
3
  Slice 2/3 ███████░░░ detail ✓
4
- Flow spec ✓ define ✓ plan ◉ build ○ prove ○ polish ○ review ○ seal ○ ship ○
4
+ Flow spec ✓ clarify ✓ define ✓ plan ◉ build ○ prove ○ polish ○ review ○ seal ○ ship ○
@@ -1,3 +1,3 @@
1
1
  exit 0
2
2
  ── rite-seal ─────────
3
- Flow spec ✓ define ✓ plan ✓ build ✓ prove ✓ polish ✓ review ✓ seal ◉ ship ○
3
+ Flow spec ✓ clarify ✓ define ✓ plan ✓ build ✓ prove ✓ polish ✓ review ✓ seal ◉ ship ○
@@ -1,2 +1,2 @@
1
1
  exit 0
2
- reconcile: OK: every source change is the wright's; orchestrator touched only bookkeeping.
2
+ reconcile: OK: every slice change matches the orchestrator allowlist; baseline retained for post-slice gates (run "reconcile close" afterward).
@@ -1 +1,2 @@
1
1
  exit 0
2
+ reconcile: closed slice window for feat.
@@ -0,0 +1,2 @@
1
+ exit 0
2
+ {"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"DevRites scope: this write is not in the orchestrator-provided exact wright allowlist, or it targets .devrites. Build only the slice contract; return the blocked path to the orchestrator instead of widening scope. (devrites-wright-scope)"}}
@@ -1,2 +1,2 @@
1
1
  exit 0
2
- {"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"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)"}}
2
+ {"hookSpecificOutput":{"hookEventName":"PreToolUse","permissionDecision":"deny","permissionDecisionReason":"DevRites scope: this write is not in the orchestrator-provided exact wright allowlist, or it targets .devrites. Build only the slice contract; return the blocked path to the orchestrator instead of widening scope. (devrites-wright-scope)"}}
@@ -0,0 +1,30 @@
1
+ package main_test
2
+
3
+ import (
4
+ "testing"
5
+
6
+ "github.com/devrites/devrites/internal/state"
7
+ )
8
+
9
+ func TestADR0011DefineAndPlanHaveDistinctTransitionRights(t *testing.T) {
10
+ if got := state.ResumeVerb(state.PhaseDefine); got != "define" {
11
+ t.Fatalf("define resumes %q, want define", got)
12
+ }
13
+ if got := state.ResumeVerb(state.PhasePlan); got != "vet" {
14
+ t.Fatalf("plan resumes %q, want vet", got)
15
+ }
16
+ if got, ok := state.PhaseForName("planning"); !ok || got != state.PhasePlan {
17
+ t.Fatalf("planning alias=(%q,%v), want plan compatibility", got, ok)
18
+ }
19
+
20
+ rights := map[string]state.Phase{}
21
+ for _, phase := range state.WorkflowPhases() {
22
+ if phase.TransitionRight == "" {
23
+ t.Fatalf("phase %q has no transition right", phase.ID)
24
+ }
25
+ if prior := rights[phase.TransitionRight]; prior != "" {
26
+ t.Fatalf("phases %q and %q share transition right %q", prior, phase.ID, phase.TransitionRight)
27
+ }
28
+ rights[phase.TransitionRight] = phase.ID
29
+ }
30
+ }
@@ -5,18 +5,29 @@ import (
5
5
  "testing"
6
6
  )
7
7
 
8
- // TestStatusLiveWorkspace is the P2 acceptance check: `devrites-engine status <slug>`
9
- // must report a canonical work/<slug> feature the live pack created without a
10
- // workspace-map frontmatter: phase from the canonical state.md ledger and proof/status
11
- // completeness from canonical evidence.md/state.md files. Before schema unification this returned
8
+ // TestStatusLiveWorkspace checks a canonical work/<slug> feature without
9
+ // workspace-map frontmatter. Status must read the phase from state.md and
10
+ // completeness from evidence.md and state.md instead of reporting
12
11
  // "feature not found".
13
12
  func TestStatusLiveWorkspace(t *testing.T) {
14
13
  work := t.TempDir()
15
14
  writeFile(t, work, ".devrites/work/live/state.md", "- Phase: build\n- Status: running\n")
16
- writeFile(t, work, ".devrites/work/live/spec.md", "# Spec\n\nDo the thing.\n")
17
- writeFile(t, work, ".devrites/work/live/plan.md", "# Plan\n\nApproach.\n")
18
- writeFile(t, work, ".devrites/work/live/decisions.md", "# Decisions\n\nChose X.\n")
19
- writeFile(t, work, ".devrites/work/live/tasks.md", "# Tasks\n\n- [x] slice 1\n")
15
+ for name, body := range map[string]string{
16
+ "brief.md": "# Brief\n\nDo the thing.\n",
17
+ "spec.md": "# Spec\n\nDo the thing.\n",
18
+ "decisions.md": "# Decisions\n\nChose X.\n",
19
+ "assumptions.md": "# Assumptions\n\nNone.\n",
20
+ "questions.md": "# Questions\n\nNone.\n",
21
+ "decision-coverage.md": "# Decision coverage\n\nCLEAR.\n",
22
+ "architecture.md": "# Architecture\n\nExisting layer.\n",
23
+ "plan.md": "# Plan\n\nApproach.\n",
24
+ "tasks.md": "# Tasks\n\n- [x] slice 1\n",
25
+ "traceability.md": "# Traceability\n\nMapped.\n",
26
+ "eng-review.md": "# Engineering review\n\nREADY.\n",
27
+ "test-plan.md": "# Test plan\n\nRun tests.\n",
28
+ } {
29
+ writeFile(t, work, ".devrites/work/live/"+name, body)
30
+ }
20
31
  (parityCase{
21
32
  workdir: work,
22
33
  env: libRootEnv(work),
@@ -19,8 +19,13 @@ import (
19
19
  // from many goroutines. It returns stdout and exit code (and a fatal error only
20
20
  // for a non-exit failure like the binary being unrunnable).
21
21
  func runProc(root string, args ...string) (stdout string, code int, fatal error) {
22
+ return runProcInput(root, "", args...)
23
+ }
24
+
25
+ func runProcInput(root, stdin string, args ...string) (stdout string, code int, fatal error) {
22
26
  cmd := exec.Command(binPath, args...)
23
27
  cmd.Env = append(os.Environ(), "DEVRITES_ROOT="+root)
28
+ cmd.Stdin = strings.NewReader(stdin)
24
29
  var out bytes.Buffer
25
30
  cmd.Stdout = &out
26
31
  cmd.Stderr = &bytes.Buffer{}
@@ -94,7 +99,8 @@ func TestConcurrentStopGateAppendsNeverTear(t *testing.T) {
94
99
  wg.Add(1)
95
100
  go func(i int) {
96
101
  defer wg.Done()
97
- _, code, fatal := runProc(root, "hook", "stop-gate", "--harness=claude")
102
+ _, code, fatal := runProcInput(root, `{"stop_hook_active":false}`,
103
+ "hook", "stop-gate", "--harness=claude")
98
104
  if fatal != nil {
99
105
  code = -1
100
106
  }