devrites 3.0.6 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (472) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +67 -45
  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/README.md +3 -0
  12. package/docs/agents/triage-labels.md +7 -7
  13. package/docs/architecture.md +157 -140
  14. package/docs/cli.md +41 -12
  15. package/docs/command-map.md +49 -35
  16. package/docs/engine/agent-contract.md +92 -15
  17. package/docs/engine/commands.md +242 -72
  18. package/docs/engine/state-schema.md +52 -23
  19. package/docs/engine/workspace-schema.md +94 -15
  20. package/docs/extensions.md +1 -1
  21. package/docs/flow.md +80 -50
  22. package/docs/harness-compliance.md +29 -5
  23. package/docs/orchestration.md +107 -79
  24. package/docs/quick-reference.md +7 -3
  25. package/docs/release.md +4 -3
  26. package/docs/skills.md +64 -38
  27. package/docs/usage.md +57 -38
  28. package/engine/cmd/releasepack/main.go +219 -0
  29. package/engine/cmd/releasepack/main_test.go +170 -0
  30. package/engine/commands.go +170 -23
  31. package/engine/git_guard.go +187 -0
  32. package/engine/git_guard_test.go +283 -0
  33. package/engine/hookpolicy.go +53 -55
  34. package/engine/hookpolicy_test.go +91 -1
  35. package/engine/hooks.go +296 -75
  36. package/engine/hooks_events_test.go +276 -6
  37. package/engine/hooks_workspace.go +640 -159
  38. package/engine/internal/devritespaths/paths.go +65 -10
  39. package/engine/internal/devritespaths/paths_test.go +110 -0
  40. package/engine/internal/doctor/doctor.go +153 -23
  41. package/engine/internal/doctor/doctor_test.go +74 -0
  42. package/engine/internal/forge/forge.go +940 -0
  43. package/engine/internal/forge/forge_test.go +576 -0
  44. package/engine/internal/forge/git.go +245 -0
  45. package/engine/internal/forge/liveness_unix.go +48 -0
  46. package/engine/internal/forge/liveness_windows.go +67 -0
  47. package/engine/internal/forge/manifest.go +402 -0
  48. package/engine/internal/gate/gate.go +90 -71
  49. package/engine/internal/gate/gate_test.go +71 -2
  50. package/engine/internal/harness/compliance.go +18 -24
  51. package/engine/internal/harness/harness.go +37 -44
  52. package/engine/internal/harness/harness_test.go +21 -5
  53. package/engine/internal/install/install.go +575 -58
  54. package/engine/internal/install/install_test.go +490 -9
  55. package/engine/internal/iohooks/iohooks.go +350 -59
  56. package/engine/internal/iohooks/iohooks_test.go +421 -1
  57. package/engine/internal/lib/buildreadiness.go +35 -18
  58. package/engine/internal/lib/clarifyreturn.go +91 -0
  59. package/engine/internal/lib/clarifyreturn_test.go +123 -0
  60. package/engine/internal/lib/context.go +54 -15
  61. package/engine/internal/lib/cursor_compat_test.go +8 -0
  62. package/engine/internal/lib/extensions.go +2 -3
  63. package/engine/internal/lib/gitauthority.go +601 -0
  64. package/engine/internal/lib/gitauthority_test.go +346 -0
  65. package/engine/internal/lib/jsonout.go +25 -11
  66. package/engine/internal/lib/jsonout_test.go +16 -0
  67. package/engine/internal/lib/lanes.go +14 -8
  68. package/engine/internal/lib/observability_test.go +358 -0
  69. package/engine/internal/lib/packageexistence.go +151 -35
  70. package/engine/internal/lib/packageexistence_test.go +163 -0
  71. package/engine/internal/lib/progress.go +11 -9
  72. package/engine/internal/lib/provenance.go +462 -0
  73. package/engine/internal/lib/provenance_test.go +154 -0
  74. package/engine/internal/lib/readiness_contract.json +111 -0
  75. package/engine/internal/lib/readinessartifact.go +510 -0
  76. package/engine/internal/lib/readinessartifact_test.go +321 -0
  77. package/engine/internal/lib/reconcile.go +712 -88
  78. package/engine/internal/lib/reconcile_test.go +335 -16
  79. package/engine/internal/lib/recoveryattempts.go +298 -0
  80. package/engine/internal/lib/recoveryattempts_test.go +215 -0
  81. package/engine/internal/lib/resolve.go +23 -19
  82. package/engine/internal/lib/runbook_context_test.go +20 -0
  83. package/engine/internal/lib/session.go +701 -9
  84. package/engine/internal/lib/session_test.go +80 -13
  85. package/engine/internal/lib/testintegrity.go +33 -37
  86. package/engine/internal/lib/testintegrity_test.go +63 -1
  87. package/engine/internal/migrate/migrate.go +81 -1
  88. package/engine/internal/migrate/migrate_test.go +22 -1
  89. package/engine/internal/reason/reason.go +180 -0
  90. package/engine/internal/reason/reason_test.go +35 -0
  91. package/engine/internal/rootfacts/facts.go +466 -0
  92. package/engine/internal/rootfacts/facts_test.go +306 -0
  93. package/engine/internal/safepath/safepath.go +55 -0
  94. package/engine/internal/safepath/safepath_test.go +69 -0
  95. package/engine/internal/safepath/safepath_windows_test.go +26 -0
  96. package/engine/internal/state/clarify_transition.go +165 -0
  97. package/engine/internal/state/clarify_transition_test.go +130 -0
  98. package/engine/internal/state/cmd/workflowmanifest/main.go +12 -8
  99. package/engine/internal/state/cursor.go +58 -0
  100. package/engine/internal/state/cursor_test.go +42 -1
  101. package/engine/internal/state/feature.go +35 -48
  102. package/engine/internal/state/schema.go +90 -37
  103. package/engine/internal/state/snapshot.go +18 -2
  104. package/engine/internal/state/state_test.go +187 -7
  105. package/engine/internal/state/status.go +48 -11
  106. package/engine/internal/state/workflow_manifest.json +231 -50
  107. package/engine/internal/toolpolicy/classifier.go +533 -0
  108. package/engine/internal/toolpolicy/classifier_test.go +424 -0
  109. package/engine/internal/toolpolicy/git.go +616 -0
  110. package/engine/internal/toolpolicy/scanner.go +382 -0
  111. package/engine/main.go +160 -77
  112. package/engine/observability_cli_test.go +52 -0
  113. package/engine/root_routing_test.go +277 -0
  114. package/engine/testdata/golden/TestParityBuildReadiness/arg=approved.golden +1 -1
  115. package/engine/testdata/golden/TestParityBuildReadiness/arg=emptystatus.golden +1 -1
  116. package/engine/testdata/golden/TestParityBuildReadiness/arg=noclarify.golden +1 -0
  117. package/engine/testdata/golden/TestParityBuildReadiness/arg=novet.golden +1 -0
  118. package/engine/testdata/golden/TestParityBuildReadiness/arg=stalevet.golden +1 -0
  119. package/engine/testdata/golden/TestParityBuildReadiness/arg=trailhash.golden +1 -1
  120. package/engine/testdata/golden/TestParityBuildReadiness/arg=trailpipe.golden +1 -1
  121. package/engine/testdata/golden/TestParityBuildReadiness/arg=vetnotready.golden +1 -0
  122. package/engine/testdata/golden/TestParityProgress/arg=allbuilt.golden +1 -1
  123. package/engine/testdata/golden/TestParityProgress/arg=done.golden +1 -1
  124. package/engine/testdata/golden/TestParityProgress/arg=mid.golden +1 -1
  125. package/engine/testdata/golden/TestParityProgress/arg=nophase.golden +1 -1
  126. package/engine/testdata/golden/TestParityProgress/arg=noslice.golden +1 -1
  127. package/engine/testdata/golden/TestParityProgress/arg=plan.golden +1 -1
  128. package/engine/testdata/golden/TestParityProgress/arg=seal.golden +1 -1
  129. package/engine/testdata/golden/TestParityReconcile/check-clean.golden +1 -1
  130. package/engine/testdata/golden/TestParityReconcile/inline-fallback.golden +1 -0
  131. package/engine/testdata/golden/TestParityReconcile/snapshot-no-allowlist.golden +1 -0
  132. package/engine/testdata/golden/TestParityWrightScope/devrites-edit-denied.golden +2 -0
  133. package/engine/testdata/golden/TestParityWrightScope/out-of-scope-enforce-denies.golden +1 -1
  134. package/engine/tests/adr_0011_define_plan_test.go +30 -0
  135. package/engine/tests/budget_test.go +19 -8
  136. package/engine/tests/concurrency_cli_test.go +7 -1
  137. package/engine/tests/doctor_cli_test.go +148 -2
  138. package/engine/tests/forge_cli_test.go +463 -0
  139. package/engine/tests/gate_test.go +63 -8
  140. package/engine/tests/hook_test.go +260 -8
  141. package/engine/tests/hooks_io_test.go +94 -3
  142. package/engine/tests/json_contract_test.go +127 -2
  143. package/engine/tests/migrate_cli_test.go +2 -2
  144. package/engine/tests/parity_buildreadiness_test.go +141 -10
  145. package/engine/tests/parity_learnings_test.go +16 -17
  146. package/engine/tests/parity_reconcile_test.go +20 -17
  147. package/engine/tests/parity_resolve_test.go +12 -11
  148. package/engine/tests/parity_test.go +21 -17
  149. package/pack/.claude/agents/devrites-code-reviewer.md +62 -48
  150. package/pack/.claude/agents/devrites-devex-reviewer.md +69 -53
  151. package/pack/.claude/agents/devrites-doubt-reviewer.md +29 -22
  152. package/pack/.claude/agents/devrites-evidence-scout.md +69 -0
  153. package/pack/.claude/agents/devrites-forge-judge.md +74 -61
  154. package/pack/.claude/agents/devrites-frontend-reviewer.md +48 -39
  155. package/pack/.claude/agents/devrites-performance-reviewer.md +49 -40
  156. package/pack/.claude/agents/devrites-plan-drafter.md +71 -0
  157. package/pack/.claude/agents/devrites-plan-reviewer.md +80 -47
  158. package/pack/.claude/agents/devrites-proof-runner.md +74 -0
  159. package/pack/.claude/agents/devrites-retrospector.md +48 -45
  160. package/pack/.claude/agents/devrites-security-auditor.md +46 -36
  161. package/pack/.claude/agents/devrites-simplifier-reviewer.md +50 -46
  162. package/pack/.claude/agents/devrites-slice-wright.md +153 -165
  163. package/pack/.claude/agents/devrites-spec-reviewer.md +34 -32
  164. package/pack/.claude/agents/devrites-strategy-reviewer.md +63 -34
  165. package/pack/.claude/agents/devrites-test-analyst.md +40 -30
  166. package/pack/.claude/settings.json +2 -1
  167. package/pack/.claude/skills/devrites-audit/SKILL.md +40 -61
  168. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +24 -13
  169. package/pack/.claude/skills/devrites-debug-recovery/reference/build-the-loop.md +24 -21
  170. package/pack/.claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -6
  171. package/pack/.claude/skills/devrites-debug-recovery/reference/instrumentation.md +2 -2
  172. package/pack/.claude/skills/devrites-doubt/SKILL.md +25 -17
  173. package/pack/.claude/skills/devrites-interview/SKILL.md +53 -52
  174. package/pack/.claude/skills/devrites-lib/SKILL.md +11 -9
  175. package/pack/.claude/skills/devrites-lib/reference/intent-map.md +3 -2
  176. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +82 -137
  177. package/pack/.claude/skills/devrites-lib/reference/reply-contract.md +8 -1
  178. package/pack/.claude/skills/devrites-lib/reference/standards/README.md +38 -55
  179. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +53 -27
  180. package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +198 -190
  181. package/pack/.claude/skills/devrites-lib/reference/standards/anti-patterns.md +5 -15
  182. package/pack/.claude/skills/devrites-lib/reference/standards/ci-cd.md +27 -58
  183. package/pack/.claude/skills/devrites-lib/reference/standards/code-review.md +16 -52
  184. package/pack/.claude/skills/devrites-lib/reference/standards/coding-style.md +2 -10
  185. package/pack/.claude/skills/devrites-lib/reference/standards/context-hygiene.md +18 -61
  186. package/pack/.claude/skills/devrites-lib/reference/standards/core.md +23 -18
  187. package/pack/.claude/skills/devrites-lib/reference/standards/deprecation.md +17 -57
  188. package/pack/.claude/skills/devrites-lib/reference/standards/development-workflow.md +4 -33
  189. package/pack/.claude/skills/devrites-lib/reference/standards/git-workflow.md +4 -20
  190. package/pack/.claude/skills/devrites-lib/reference/standards/hooks.md +3 -14
  191. package/pack/.claude/skills/devrites-lib/reference/standards/patterns.md +9 -25
  192. package/pack/.claude/skills/devrites-lib/reference/standards/performance.md +0 -9
  193. package/pack/.claude/skills/devrites-lib/reference/standards/principles.md +1 -3
  194. package/pack/.claude/skills/devrites-lib/reference/standards/security.md +17 -7
  195. package/pack/.claude/skills/devrites-lib/reference/standards/testing.md +1 -27
  196. package/pack/.claude/skills/devrites-lib/reference/standards/tooling.md +46 -50
  197. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +23 -10
  198. package/pack/.claude/skills/devrites-source-driven/SKILL.md +23 -22
  199. package/pack/.claude/skills/rite/SKILL.md +8 -6
  200. package/pack/.claude/skills/rite/reference/menu.md +8 -6
  201. package/pack/.claude/skills/rite-adopt/SKILL.md +33 -37
  202. package/pack/.claude/skills/rite-autocomplete/SKILL.md +33 -28
  203. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +21 -21
  204. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +15 -6
  205. package/pack/.claude/skills/rite-build/SKILL.md +35 -30
  206. package/pack/.claude/skills/rite-build/reference/afk-discipline.md +38 -38
  207. package/pack/.claude/skills/rite-build/reference/evidence-standard.md +10 -0
  208. package/pack/.claude/skills/rite-build/reference/forge.md +186 -156
  209. package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +4 -3
  210. package/pack/.claude/skills/rite-build/reference/phase-contract.md +96 -175
  211. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +129 -134
  212. package/pack/.claude/skills/rite-clarify/SKILL.md +89 -0
  213. package/pack/.claude/skills/rite-clarify/reference/decision-coverage.md +59 -0
  214. package/pack/.claude/skills/rite-converge/SKILL.md +35 -25
  215. package/pack/.claude/skills/rite-define/SKILL.md +57 -32
  216. package/pack/.claude/skills/rite-define/reference/gates.md +16 -15
  217. package/pack/.claude/skills/rite-define/reference/plan-template.md +16 -8
  218. package/pack/.claude/skills/rite-frame/reference/failure-modes.md +22 -24
  219. package/pack/.claude/skills/rite-plan/SKILL.md +44 -16
  220. package/pack/.claude/skills/rite-plan/reference/task-breakdown.md +4 -0
  221. package/pack/.claude/skills/rite-polish/SKILL.md +27 -23
  222. package/pack/.claude/skills/rite-prototype/SKILL.md +25 -26
  223. package/pack/.claude/skills/rite-prove/SKILL.md +27 -17
  224. package/pack/.claude/skills/rite-resolve/SKILL.md +12 -11
  225. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +3 -0
  226. package/pack/.claude/skills/rite-review/SKILL.md +37 -28
  227. package/pack/.claude/skills/rite-seal/reference/phase-contract.md +27 -92
  228. package/pack/.claude/skills/rite-seal/reference/risk-and-rollback.md +13 -0
  229. package/pack/.claude/skills/rite-ship/reference/design-memory.md +31 -36
  230. package/pack/.claude/skills/rite-spec/SKILL.md +84 -135
  231. package/pack/.claude/skills/rite-spec/reference/investigation.md +37 -33
  232. package/pack/.claude/skills/rite-spec/reference/question-protocol.md +6 -2
  233. package/pack/.claude/skills/rite-spec/reference/spec-checklists.md +25 -24
  234. package/pack/.claude/skills/rite-spec/reference/spec-template.md +9 -2
  235. package/pack/.claude/skills/rite-spec/reference/state-workspace.md +13 -3
  236. package/pack/.claude/skills/rite-temper/SKILL.md +62 -47
  237. package/pack/.claude/skills/rite-temper/reference/review-dimensions.md +24 -22
  238. package/pack/.claude/skills/rite-vet/SKILL.md +110 -113
  239. package/pack/.claude/skills/rite-vet/reference/artifacts.md +42 -9
  240. package/pack/.claude/skills/rite-vet/reference/review-axes.md +39 -37
  241. package/pack/generated/claude/agents/devrites-code-reviewer.md +62 -48
  242. package/pack/generated/claude/agents/devrites-devex-reviewer.md +69 -53
  243. package/pack/generated/claude/agents/devrites-doubt-reviewer.md +29 -22
  244. package/pack/generated/claude/agents/devrites-evidence-scout.md +69 -0
  245. package/pack/generated/claude/agents/devrites-forge-judge.md +74 -61
  246. package/pack/generated/claude/agents/devrites-frontend-reviewer.md +48 -39
  247. package/pack/generated/claude/agents/devrites-performance-reviewer.md +49 -40
  248. package/pack/generated/claude/agents/devrites-plan-drafter.md +71 -0
  249. package/pack/generated/claude/agents/devrites-plan-reviewer.md +80 -47
  250. package/pack/generated/claude/agents/devrites-proof-runner.md +74 -0
  251. package/pack/generated/claude/agents/devrites-retrospector.md +48 -45
  252. package/pack/generated/claude/agents/devrites-security-auditor.md +46 -36
  253. package/pack/generated/claude/agents/devrites-simplifier-reviewer.md +50 -46
  254. package/pack/generated/claude/agents/devrites-slice-wright.md +153 -165
  255. package/pack/generated/claude/agents/devrites-spec-reviewer.md +34 -32
  256. package/pack/generated/claude/agents/devrites-strategy-reviewer.md +63 -34
  257. package/pack/generated/claude/agents/devrites-test-analyst.md +40 -30
  258. package/pack/generated/claude/settings.json +2 -1
  259. package/pack/generated/claude/skills/devrites-audit/SKILL.md +40 -61
  260. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +24 -13
  261. package/pack/generated/claude/skills/devrites-debug-recovery/reference/build-the-loop.md +24 -21
  262. package/pack/generated/claude/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -6
  263. package/pack/generated/claude/skills/devrites-debug-recovery/reference/instrumentation.md +2 -2
  264. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +25 -17
  265. package/pack/generated/claude/skills/devrites-interview/SKILL.md +53 -52
  266. package/pack/generated/claude/skills/devrites-lib/SKILL.md +11 -9
  267. package/pack/generated/claude/skills/devrites-lib/reference/intent-map.md +3 -2
  268. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +82 -137
  269. package/pack/generated/claude/skills/devrites-lib/reference/reply-contract.md +8 -1
  270. package/pack/generated/claude/skills/devrites-lib/reference/standards/README.md +38 -55
  271. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +53 -27
  272. package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +198 -190
  273. package/pack/generated/claude/skills/devrites-lib/reference/standards/anti-patterns.md +5 -15
  274. package/pack/generated/claude/skills/devrites-lib/reference/standards/ci-cd.md +27 -58
  275. package/pack/generated/claude/skills/devrites-lib/reference/standards/code-review.md +16 -52
  276. package/pack/generated/claude/skills/devrites-lib/reference/standards/coding-style.md +2 -10
  277. package/pack/generated/claude/skills/devrites-lib/reference/standards/context-hygiene.md +18 -61
  278. package/pack/generated/claude/skills/devrites-lib/reference/standards/core.md +23 -18
  279. package/pack/generated/claude/skills/devrites-lib/reference/standards/deprecation.md +17 -57
  280. package/pack/generated/claude/skills/devrites-lib/reference/standards/development-workflow.md +4 -33
  281. package/pack/generated/claude/skills/devrites-lib/reference/standards/git-workflow.md +4 -20
  282. package/pack/generated/claude/skills/devrites-lib/reference/standards/hooks.md +3 -14
  283. package/pack/generated/claude/skills/devrites-lib/reference/standards/patterns.md +9 -25
  284. package/pack/generated/claude/skills/devrites-lib/reference/standards/performance.md +0 -9
  285. package/pack/generated/claude/skills/devrites-lib/reference/standards/principles.md +1 -3
  286. package/pack/generated/claude/skills/devrites-lib/reference/standards/security.md +17 -7
  287. package/pack/generated/claude/skills/devrites-lib/reference/standards/testing.md +1 -27
  288. package/pack/generated/claude/skills/devrites-lib/reference/standards/tooling.md +46 -50
  289. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +23 -10
  290. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +23 -22
  291. package/pack/generated/claude/skills/rite/SKILL.md +8 -6
  292. package/pack/generated/claude/skills/rite/reference/menu.md +8 -6
  293. package/pack/generated/claude/skills/rite-adopt/SKILL.md +33 -37
  294. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +33 -28
  295. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +21 -21
  296. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +15 -6
  297. package/pack/generated/claude/skills/rite-build/SKILL.md +35 -30
  298. package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +38 -38
  299. package/pack/generated/claude/skills/rite-build/reference/evidence-standard.md +10 -0
  300. package/pack/generated/claude/skills/rite-build/reference/forge.md +186 -156
  301. package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +4 -3
  302. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +96 -175
  303. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +129 -134
  304. package/pack/generated/claude/skills/rite-clarify/SKILL.md +89 -0
  305. package/pack/generated/claude/skills/rite-clarify/reference/decision-coverage.md +59 -0
  306. package/pack/generated/claude/skills/rite-converge/SKILL.md +35 -25
  307. package/pack/generated/claude/skills/rite-define/SKILL.md +57 -32
  308. package/pack/generated/claude/skills/rite-define/reference/gates.md +16 -15
  309. package/pack/generated/claude/skills/rite-define/reference/plan-template.md +16 -8
  310. package/pack/generated/claude/skills/rite-frame/reference/failure-modes.md +22 -24
  311. package/pack/generated/claude/skills/rite-plan/SKILL.md +44 -16
  312. package/pack/generated/claude/skills/rite-plan/reference/task-breakdown.md +4 -0
  313. package/pack/generated/claude/skills/rite-polish/SKILL.md +27 -23
  314. package/pack/generated/claude/skills/rite-prototype/SKILL.md +25 -26
  315. package/pack/generated/claude/skills/rite-prove/SKILL.md +27 -17
  316. package/pack/generated/claude/skills/rite-resolve/SKILL.md +12 -11
  317. package/pack/generated/claude/skills/rite-resolve/reference/answer-protocol.md +3 -0
  318. package/pack/generated/claude/skills/rite-review/SKILL.md +37 -28
  319. package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +27 -92
  320. package/pack/generated/claude/skills/rite-seal/reference/risk-and-rollback.md +13 -0
  321. package/pack/generated/claude/skills/rite-ship/reference/design-memory.md +31 -36
  322. package/pack/generated/claude/skills/rite-spec/SKILL.md +84 -135
  323. package/pack/generated/claude/skills/rite-spec/reference/investigation.md +37 -33
  324. package/pack/generated/claude/skills/rite-spec/reference/question-protocol.md +6 -2
  325. package/pack/generated/claude/skills/rite-spec/reference/spec-checklists.md +25 -24
  326. package/pack/generated/claude/skills/rite-spec/reference/spec-template.md +9 -2
  327. package/pack/generated/claude/skills/rite-spec/reference/state-workspace.md +13 -3
  328. package/pack/generated/claude/skills/rite-temper/SKILL.md +62 -47
  329. package/pack/generated/claude/skills/rite-temper/reference/review-dimensions.md +24 -22
  330. package/pack/generated/claude/skills/rite-vet/SKILL.md +110 -113
  331. package/pack/generated/claude/skills/rite-vet/reference/artifacts.md +42 -9
  332. package/pack/generated/claude/skills/rite-vet/reference/review-axes.md +39 -37
  333. package/pack/generated/codex/AGENTS.md +5 -2
  334. package/pack/generated/codex/agents/devrites-code-reviewer.toml +69 -47
  335. package/pack/generated/codex/agents/devrites-devex-reviewer.toml +75 -51
  336. package/pack/generated/codex/agents/devrites-doubt-reviewer.toml +35 -20
  337. package/pack/generated/codex/agents/devrites-evidence-scout.toml +75 -0
  338. package/pack/generated/codex/agents/devrites-forge-judge.toml +80 -59
  339. package/pack/generated/codex/agents/devrites-frontend-reviewer.toml +54 -37
  340. package/pack/generated/codex/agents/devrites-performance-reviewer.toml +55 -38
  341. package/pack/generated/codex/agents/devrites-plan-drafter.toml +77 -0
  342. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +82 -47
  343. package/pack/generated/codex/agents/devrites-proof-runner.toml +80 -0
  344. package/pack/generated/codex/agents/devrites-retrospector.toml +54 -43
  345. package/pack/generated/codex/agents/devrites-security-auditor.toml +53 -35
  346. package/pack/generated/codex/agents/devrites-simplifier-reviewer.toml +56 -44
  347. package/pack/generated/codex/agents/devrites-slice-wright.toml +159 -163
  348. package/pack/generated/codex/agents/devrites-spec-reviewer.toml +40 -30
  349. package/pack/generated/codex/agents/devrites-strategy-reviewer.toml +65 -34
  350. package/pack/generated/codex/agents/devrites-test-analyst.toml +46 -28
  351. package/pack/generated/codex/hooks.json +4 -14
  352. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +7 -3
  353. package/pack/generated/codex/skills/devrites-audit/SKILL.md +47 -64
  354. package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +7 -3
  355. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +31 -16
  356. package/pack/generated/codex/skills/devrites-debug-recovery/reference/build-the-loop.md +24 -21
  357. package/pack/generated/codex/skills/devrites-debug-recovery/reference/cleanup-and-classify.md +34 -6
  358. package/pack/generated/codex/skills/devrites-debug-recovery/reference/instrumentation.md +2 -2
  359. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +32 -20
  360. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +7 -3
  361. package/pack/generated/codex/skills/devrites-interview/SKILL.md +60 -55
  362. package/pack/generated/codex/skills/devrites-lib/SKILL.md +18 -12
  363. package/pack/generated/codex/skills/devrites-lib/reference/intent-map.md +3 -2
  364. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +82 -137
  365. package/pack/generated/codex/skills/devrites-lib/reference/reply-contract.md +8 -1
  366. package/pack/generated/codex/skills/devrites-lib/reference/standards/README.md +38 -55
  367. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +53 -27
  368. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +198 -190
  369. package/pack/generated/codex/skills/devrites-lib/reference/standards/anti-patterns.md +5 -15
  370. package/pack/generated/codex/skills/devrites-lib/reference/standards/ci-cd.md +27 -58
  371. package/pack/generated/codex/skills/devrites-lib/reference/standards/code-review.md +16 -52
  372. package/pack/generated/codex/skills/devrites-lib/reference/standards/coding-style.md +2 -10
  373. package/pack/generated/codex/skills/devrites-lib/reference/standards/context-hygiene.md +18 -61
  374. package/pack/generated/codex/skills/devrites-lib/reference/standards/core.md +23 -18
  375. package/pack/generated/codex/skills/devrites-lib/reference/standards/deprecation.md +17 -57
  376. package/pack/generated/codex/skills/devrites-lib/reference/standards/development-workflow.md +4 -33
  377. package/pack/generated/codex/skills/devrites-lib/reference/standards/git-workflow.md +4 -20
  378. package/pack/generated/codex/skills/devrites-lib/reference/standards/hooks.md +3 -14
  379. package/pack/generated/codex/skills/devrites-lib/reference/standards/patterns.md +9 -25
  380. package/pack/generated/codex/skills/devrites-lib/reference/standards/performance.md +0 -9
  381. package/pack/generated/codex/skills/devrites-lib/reference/standards/principles.md +1 -3
  382. package/pack/generated/codex/skills/devrites-lib/reference/standards/security.md +17 -7
  383. package/pack/generated/codex/skills/devrites-lib/reference/standards/testing.md +1 -27
  384. package/pack/generated/codex/skills/devrites-lib/reference/standards/tooling.md +46 -50
  385. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +23 -10
  386. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +7 -3
  387. package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +7 -3
  388. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +29 -24
  389. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +7 -3
  390. package/pack/generated/codex/skills/rite/SKILL.md +19 -13
  391. package/pack/generated/codex/skills/rite/reference/menu.md +8 -6
  392. package/pack/generated/codex/skills/rite-adopt/SKILL.md +40 -40
  393. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +40 -31
  394. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +21 -21
  395. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +15 -6
  396. package/pack/generated/codex/skills/rite-build/SKILL.md +42 -33
  397. package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +38 -38
  398. package/pack/generated/codex/skills/rite-build/reference/evidence-standard.md +10 -0
  399. package/pack/generated/codex/skills/rite-build/reference/forge.md +186 -156
  400. package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +4 -3
  401. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +96 -175
  402. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +129 -134
  403. package/pack/generated/codex/skills/rite-clarify/SKILL.md +105 -0
  404. package/pack/generated/codex/skills/rite-clarify/reference/decision-coverage.md +59 -0
  405. package/pack/generated/codex/skills/rite-converge/SKILL.md +42 -28
  406. package/pack/generated/codex/skills/rite-customize/SKILL.md +7 -3
  407. package/pack/generated/codex/skills/rite-define/SKILL.md +64 -35
  408. package/pack/generated/codex/skills/rite-define/reference/gates.md +16 -15
  409. package/pack/generated/codex/skills/rite-define/reference/plan-template.md +16 -8
  410. package/pack/generated/codex/skills/rite-doctor/SKILL.md +7 -3
  411. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +7 -3
  412. package/pack/generated/codex/skills/rite-explain/SKILL.md +7 -3
  413. package/pack/generated/codex/skills/rite-frame/SKILL.md +7 -3
  414. package/pack/generated/codex/skills/rite-frame/reference/failure-modes.md +22 -24
  415. package/pack/generated/codex/skills/rite-handoff/SKILL.md +7 -3
  416. package/pack/generated/codex/skills/rite-learn/SKILL.md +7 -3
  417. package/pack/generated/codex/skills/rite-plan/SKILL.md +51 -19
  418. package/pack/generated/codex/skills/rite-plan/reference/task-breakdown.md +5 -1
  419. package/pack/generated/codex/skills/rite-polish/SKILL.md +34 -26
  420. package/pack/generated/codex/skills/rite-pov/SKILL.md +7 -3
  421. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +7 -3
  422. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +7 -3
  423. package/pack/generated/codex/skills/rite-prototype/SKILL.md +32 -29
  424. package/pack/generated/codex/skills/rite-prove/SKILL.md +34 -20
  425. package/pack/generated/codex/skills/rite-quick/SKILL.md +7 -3
  426. package/pack/generated/codex/skills/rite-resolve/SKILL.md +19 -14
  427. package/pack/generated/codex/skills/rite-resolve/reference/answer-protocol.md +3 -0
  428. package/pack/generated/codex/skills/rite-review/SKILL.md +44 -31
  429. package/pack/generated/codex/skills/rite-seal/SKILL.md +7 -3
  430. package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +27 -92
  431. package/pack/generated/codex/skills/rite-seal/reference/risk-and-rollback.md +13 -0
  432. package/pack/generated/codex/skills/rite-ship/SKILL.md +7 -3
  433. package/pack/generated/codex/skills/rite-ship/reference/design-memory.md +31 -36
  434. package/pack/generated/codex/skills/rite-spec/SKILL.md +91 -138
  435. package/pack/generated/codex/skills/rite-spec/reference/investigation.md +37 -33
  436. package/pack/generated/codex/skills/rite-spec/reference/question-protocol.md +6 -2
  437. package/pack/generated/codex/skills/rite-spec/reference/spec-checklists.md +25 -24
  438. package/pack/generated/codex/skills/rite-spec/reference/spec-template.md +9 -2
  439. package/pack/generated/codex/skills/rite-spec/reference/state-workspace.md +13 -3
  440. package/pack/generated/codex/skills/rite-status/SKILL.md +7 -3
  441. package/pack/generated/codex/skills/rite-temper/SKILL.md +69 -50
  442. package/pack/generated/codex/skills/rite-temper/reference/review-dimensions.md +24 -22
  443. package/pack/generated/codex/skills/rite-vet/SKILL.md +117 -116
  444. package/pack/generated/codex/skills/rite-vet/reference/artifacts.md +42 -9
  445. package/pack/generated/codex/skills/rite-vet/reference/review-axes.md +40 -38
  446. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +7 -3
  447. package/package.json +1 -1
  448. package/scripts/build-release-tarball.sh +32 -15
  449. package/scripts/check-authority-drift.py +125 -0
  450. package/scripts/check-instruction-size-baseline.mjs +19 -11
  451. package/scripts/check-invocation-integrity.py +2 -0
  452. package/scripts/codex-generate.sh +69 -33
  453. package/scripts/grade-feature.sh +121 -40
  454. package/scripts/live-hosts/agent-result.schema.json +230 -0
  455. package/scripts/live-hosts/claude.sh +87 -0
  456. package/scripts/live-hosts/codex.sh +81 -0
  457. package/scripts/live-hosts/common.sh +113 -0
  458. package/scripts/live-hosts/fake-host.py +264 -0
  459. package/scripts/live-hosts/host-transport.py +287 -0
  460. package/scripts/release-check.sh +5 -1
  461. package/scripts/run-agent-contract-evals.py +1380 -0
  462. package/scripts/run-behavioral-evals.sh +24 -30
  463. package/scripts/run-evals.sh +1 -5
  464. package/scripts/run-live-behavioral-evals.py +1274 -144
  465. package/scripts/run-outcome-evals.sh +414 -88
  466. package/scripts/run-tests.mjs +30 -2
  467. package/scripts/skills-inventory.mjs +1 -1
  468. package/scripts/validate-workflow-security.py +39 -20
  469. package/scripts/validate-workspace-schema.py +362 -10
  470. package/scripts/validate.sh +21 -15
  471. package/engine/testdata/golden/TestParityWrightScope/devrites-edit-allowed.golden +0 -1
  472. /package/engine/testdata/golden/{TestParityReconcile/check-no-claimed.golden → TestParityBuildReadiness/arg=clarifyopen.golden} +0 -0
@@ -1,97 +1,423 @@
1
1
  #!/usr/bin/env bash
2
- # Outcome-eval harness: proves the deterministic feature grader BOTH passes a
3
- # known-shippable workspace AND fails a known-blocked one (see-it-fail-first:
4
- # a grader that never returns NO-GO proves nothing). Runs in CI; no API key.
5
- #
6
- # Usage: run-outcome-evals.sh
2
+ # Run the deterministic final-outcome matrix. The canonical fixture passes the
3
+ # shell grader and Go seal gate. Each failing case changes one input.
7
4
 
8
5
  set -euo pipefail
9
6
 
10
7
  ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
11
8
  GRADER="$ROOT/scripts/grade-feature.sh"
12
- good="$ROOT/evals/golden/shippable-feature"
13
- bad="$ROOT/evals/golden/blocked-feature"
14
- nearmiss="$ROOT/evals/golden/near-miss-unproven-ac"
15
- fail=0
9
+ GOOD="$ROOT/evals/golden/shippable-feature"
10
+ MANIFEST="$ROOT/engine/internal/state/workflow_manifest.json"
11
+ READINESS="$ROOT/engine/internal/lib/readiness_contract.json"
16
12
  tmp="$(mktemp -d)"
17
13
  trap 'rm -rf "$tmp"' EXIT
18
14
 
19
- echo "== grade golden/shippable-feature (expect GO) =="
20
- if bash "$GRADER" "$good"; then
21
- echo " PASS: graded GO"
22
- else
23
- echo " FAIL: a known-shippable workspace should grade GO"; fail=1
24
- fi
25
-
26
- echo
27
- echo "== grade synthetic/canonical-cursor (expect GO) =="
28
- canonical="$tmp/canonical-cursor"
29
- mkdir -p "$canonical"
30
- cp -R "$good/." "$canonical/"
31
- cat > "$canonical/state.md" <<'MD'
32
- # State
33
-
34
- ## Cursor
35
- | Key | Value |
36
- | --- | --- |
37
- | phase | done |
38
- | status | done |
39
- | next_action | archived |
40
- MD
41
- if bash "$GRADER" "$canonical"; then
42
- echo " PASS: canonical cursor graded GO"
43
- else
44
- echo " FAIL: canonical cursor should grade GO"; fail=1
45
- fi
46
-
47
- echo
48
- echo "== grade golden/blocked-feature (expect NO-GO) =="
49
- if bash "$GRADER" "$bad"; then
50
- echo " FAIL: a known-blocked workspace should NOT grade GO"; fail=1
51
- else
52
- echo " PASS: correctly graded NO-GO"
53
- fi
54
-
55
- echo
56
- echo "== grade golden/near-miss-unproven-ac (expect NO-GO on ONE invariant) =="
57
- # Isolates invariant 2 (every acceptance criterion proven): identical to the
58
- # shippable fixture except a single AC is left unchecked. Proves that gate fails
59
- # independently: not only when six invariants trip at once.
60
- if bash "$GRADER" "$nearmiss"; then
61
- echo " FAIL: an unproven acceptance criterion must grade NO-GO"; fail=1
62
- else
63
- echo " PASS: correctly graded NO-GO on the lone unchecked AC"
64
- fi
65
-
66
- echo
67
- echo "== grade synthetic/checked-wrong-ac (expect NO-GO on id coverage) =="
68
- wrongac="$tmp/checked-wrong-ac"
69
- mkdir -p "$wrongac"
70
- cp -R "$good/." "$wrongac/"
71
- cat > "$wrongac/seal.md" <<'MD'
72
- # Seal: checked-wrong-ac
73
-
74
- Verdict: GO
75
-
76
- ## Acceptance Criteria
77
- - [x] [AC999] An unrelated item is checked.
78
-
79
- ## Verification Evidence
80
- Evidence exists.
81
-
82
- ## Blockers
83
- none
84
- MD
85
- if bash "$GRADER" "$wrongac"; then
86
- echo " FAIL: checked unrelated acceptance items must not prove spec [ACn] criteria"; fail=1
87
- else
88
- echo " PASS: correctly graded NO-GO when spec [ACn] ids are missing from seal.md"
89
- fi
90
-
91
- echo
92
- if [ "$fail" -eq 0 ]; then
93
- echo "Outcome evals passed."
94
- else
95
- echo "Outcome evals FAILED."
96
- fi
97
- exit "$fail"
15
+ ENGINE="$tmp/devrites-engine"
16
+ (cd "$ROOT/engine" && CGO_ENABLED=0 go build -trimpath -o "$ENGINE" .)
17
+ export DEVRITES_CLI="$ENGINE"
18
+
19
+ # A fake PATH binary exposes accidental fallback. The grader must use the exact
20
+ # binary built above through DEVRITES_CLI.
21
+ mkdir -p "$tmp/stale-path"
22
+ cat >"$tmp/stale-path/devrites-engine" <<'SH'
23
+ #!/usr/bin/env sh
24
+ echo "stale PATH shim executed" >&2
25
+ exit 99
26
+ SH
27
+ chmod +x "$tmp/stale-path/devrites-engine"
28
+ export PATH="$tmp/stale-path:$PATH"
29
+
30
+ CAPTURED=""
31
+ CAPTURE_CODE=0
32
+ run_capture() {
33
+ set +e
34
+ CAPTURED="$("$@" 2>&1)"
35
+ CAPTURE_CODE=$?
36
+ set -e
37
+ }
38
+
39
+ fail() {
40
+ printf 'FAIL: %s\n' "$*" >&2
41
+ exit 1
42
+ }
43
+
44
+ assert_grade() {
45
+ local want_status="$1"
46
+ local want_rules="$2"
47
+ printf '%s' "$CAPTURED" | python3 -c '
48
+ import json
49
+ import sys
50
+
51
+ want_status, want_rules = sys.argv[1:]
52
+ data = json.load(sys.stdin)
53
+ got_rules = ",".join(data["rule_ids"])
54
+ if data["schema"] != "devrites-outcome-grade/v1":
55
+ raise SystemExit("grade schema={!r}".format(data.get("schema")))
56
+ if data["status"] != want_status:
57
+ raise SystemExit("grade status={!r}, want {!r}".format(data["status"], want_status))
58
+ if got_rules != want_rules:
59
+ raise SystemExit("grade rules={!r}, want {!r}".format(got_rules, want_rules))
60
+ ' "$want_status" "$want_rules"
61
+ }
62
+
63
+ assert_seal() {
64
+ local want_reason="$1"
65
+ printf '%s' "$CAPTURED" | python3 -c '
66
+ import json
67
+ import sys
68
+
69
+ data = json.load(sys.stdin)
70
+ want = sys.argv[1]
71
+ if data["schema"] != "devrites-command/v1" or data["command"] != "seal":
72
+ raise SystemExit(f"unexpected seal envelope: {data!r}")
73
+ if data.get("reason_id") != want:
74
+ raise SystemExit("seal reason={!r}, want {!r}".format(data.get("reason_id"), want))
75
+ ' "$want_reason"
76
+ }
77
+
78
+ stage_workspace() {
79
+ local project="$1"
80
+ local slug="$2"
81
+ local mode="$3"
82
+ local ws="$project/.devrites/work/$slug"
83
+ mkdir -p "$ws"
84
+ cp -R "$GOOD/." "$ws/"
85
+ if [ "$mode" = "readiness" ]; then
86
+ python3 - "$ws/state.md" <<'PY'
87
+ from pathlib import Path
88
+ import sys
89
+
90
+ path = Path(sys.argv[1])
91
+ text = path.read_text()
92
+ for old, new in (
93
+ ("| phase | done |", "| phase | build |"),
94
+ ("| status | done |", "| status | running |"),
95
+ ):
96
+ if text.count(old) != 1:
97
+ raise SystemExit(f"{path}: expected exactly one {old!r}")
98
+ text = text.replace(old, new)
99
+ path.write_text(text)
100
+ PY
101
+ fi
102
+
103
+ python3 - "$project" "$ws" <<'PY'
104
+ from pathlib import Path
105
+ import os
106
+ import re
107
+ import sys
108
+
109
+ project, workspace = map(Path, sys.argv[1:])
110
+ paths = re.findall(r"`([^`]+)`", (workspace / "touched-files.md").read_text())
111
+ for relative in paths:
112
+ path = project / relative
113
+ path.parent.mkdir(parents=True, exist_ok=True)
114
+ path.write_text("synthetic outcome-eval source\n")
115
+ os.utime(path, (1_700_000_000, 1_700_000_000))
116
+ os.utime(workspace / "evidence.md", (1_700_000_100, 1_700_000_100))
117
+ PY
118
+ }
119
+
120
+ snapshot_tree() {
121
+ local project="$1"
122
+ local output="$2"
123
+ python3 - "$project" "$output" <<'PY'
124
+ from pathlib import Path
125
+ import hashlib
126
+ import sys
127
+
128
+ root, output = map(Path, sys.argv[1:])
129
+ rows = []
130
+ for path in sorted(root.rglob("*")):
131
+ if not path.is_file():
132
+ continue
133
+ stat = path.stat()
134
+ rows.append(
135
+ f"{path.relative_to(root)}|{stat.st_mode & 0o777:o}|{stat.st_mtime_ns}|"
136
+ f"{hashlib.sha256(path.read_bytes()).hexdigest()}"
137
+ )
138
+ output.write_text("\n".join(rows) + "\n")
139
+ PY
140
+ }
141
+
142
+ assert_one_mutation() {
143
+ local before="$1"
144
+ local after="$2"
145
+ local want_path="$3"
146
+ python3 - "$before" "$after" "$want_path" <<'PY'
147
+ from pathlib import Path
148
+ import sys
149
+
150
+ before_path, after_path = map(Path, sys.argv[1:3])
151
+ want = sys.argv[3]
152
+ def load(path):
153
+ rows = {}
154
+ for line in path.read_text().splitlines():
155
+ key = line.split("|", 1)[0]
156
+ rows[key] = line
157
+ return rows
158
+
159
+ before, after = load(before_path), load(after_path)
160
+ changed = sorted(
161
+ key for key in before.keys() | after.keys()
162
+ if before.get(key) != after.get(key)
163
+ )
164
+ if changed != [want]:
165
+ raise SystemExit(f"causal paths={changed!r}, want {[want]!r}")
166
+ PY
167
+ }
168
+
169
+ replace_once() {
170
+ local path="$1"
171
+ local old="$2"
172
+ local new="$3"
173
+ python3 - "$path" "$old" "$new" <<'PY'
174
+ from pathlib import Path
175
+ import sys
176
+
177
+ path = Path(sys.argv[1])
178
+ old, new = sys.argv[2:]
179
+ text = path.read_text()
180
+ if text.count(old) != 1:
181
+ raise SystemExit(f"{path}: expected exactly one {old!r}, found {text.count(old)}")
182
+ path.write_text(text.replace(old, new))
183
+ PY
184
+ }
185
+
186
+ mutate_final() {
187
+ local id="$1"
188
+ local project="$2"
189
+ local slug="$3"
190
+ local ws="$project/.devrites/work/$slug"
191
+ case "$id" in
192
+ missing_review) rm "$ws/review.md" ;;
193
+ missing_evidence) rm "$ws/evidence.md" ;;
194
+ empty_evidence) : >"$ws/evidence.md" ;;
195
+ missing_seal) rm "$ws/seal.md" ;;
196
+ non_go) replace_once "$ws/seal.md" "Verdict: GO" "Verdict: NO-GO" ;;
197
+ unresolved_blocker)
198
+ replace_once "$ws/seal.md" $'## Blockers\nnone' $'## Blockers\n- release blocker'
199
+ ;;
200
+ open_question)
201
+ replace_once "$ws/questions.md" "| Q-001 | answered |" "| Q-001 | open |"
202
+ ;;
203
+ wrong_phase) replace_once "$ws/state.md" "| phase | done |" "| phase | review |" ;;
204
+ awaiting_human)
205
+ replace_once "$ws/state.md" "| status | done |" "| status | awaiting_human |"
206
+ ;;
207
+ blocked_status) replace_once "$ws/state.md" "| status | done |" "| status | blocked |" ;;
208
+ unchecked_ac)
209
+ replace_once "$ws/seal.md" "- [x] AC-001:" "- [ ] AC-001:"
210
+ ;;
211
+ wrong_ac_id)
212
+ replace_once "$ws/seal.md" "AC-003:" "AC-999:"
213
+ ;;
214
+ *) fail "unknown final mutation $id" ;;
215
+ esac
216
+ }
217
+
218
+ mutation_path() {
219
+ local id="$1"
220
+ local slug="$2"
221
+ case "$id" in
222
+ missing_review) printf '.devrites/work/%s/review.md\n' "$slug" ;;
223
+ missing_evidence|empty_evidence) printf '.devrites/work/%s/evidence.md\n' "$slug" ;;
224
+ missing_seal|non_go|unresolved_blocker|unchecked_ac|wrong_ac_id)
225
+ printf '.devrites/work/%s/seal.md\n' "$slug"
226
+ ;;
227
+ open_question) printf '.devrites/work/%s/questions.md\n' "$slug" ;;
228
+ wrong_phase|awaiting_human|blocked_status)
229
+ printf '.devrites/work/%s/state.md\n' "$slug"
230
+ ;;
231
+ *) fail "unknown mutation path $id" ;;
232
+ esac
233
+ }
234
+
235
+ run_final_case() {
236
+ local id="$1"
237
+ local want_rule="$2"
238
+ local want_seal_code="$3"
239
+ local want_reason="$4"
240
+ local project="$tmp/final-$id"
241
+ local slug="case-$id"
242
+ local before="$tmp/$id.before"
243
+ local after="$tmp/$id.after"
244
+ local ws="$project/.devrites/work/$slug"
245
+
246
+ stage_workspace "$project" "$slug" final
247
+ snapshot_tree "$project" "$before"
248
+ mutate_final "$id" "$project" "$slug"
249
+ snapshot_tree "$project" "$after"
250
+ assert_one_mutation "$before" "$after" "$(mutation_path "$id" "$slug")"
251
+
252
+ run_capture bash "$GRADER" --json "$ws"
253
+ [ "$CAPTURE_CODE" -eq 1 ] || fail "$id grader exit=$CAPTURE_CODE; $CAPTURED"
254
+ assert_grade "NO-GO" "$want_rule"
255
+
256
+ run_capture env DEVRITES_ROOT="$project" "$ENGINE" seal --json "$slug"
257
+ [ "$CAPTURE_CODE" -eq "$want_seal_code" ] \
258
+ || fail "$id seal exit=$CAPTURE_CODE, want $want_seal_code; $CAPTURED"
259
+ assert_seal "$want_reason"
260
+ printf ' PASS %-20s rule=%s reason=%s\n' "$id" "$want_rule" "$want_reason"
261
+ }
262
+
263
+ readiness_code() {
264
+ local id="$1"
265
+ python3 - "$READINESS" "$id" <<'PY'
266
+ import json
267
+ import sys
268
+
269
+ contract = json.load(open(sys.argv[1]))
270
+ want = sys.argv[2]
271
+ matches = [row for row in contract["reasons"] if row["id"] == want]
272
+ if len(matches) != 1:
273
+ raise SystemExit(f"readiness reason {want!r} is not unique")
274
+ print(matches[0]["code"])
275
+ PY
276
+ }
277
+
278
+ run_readiness_case() {
279
+ local id="$1"
280
+ local file="$2"
281
+ local readiness_id="$3"
282
+ local project="$tmp/readiness-$id"
283
+ local slug="case-$id"
284
+ local ws="$project/.devrites/work/$slug"
285
+ local before="$tmp/$id.before"
286
+ local after="$tmp/$id.after"
287
+ local want_code
288
+ want_code="$(readiness_code "$readiness_id")"
289
+
290
+ stage_workspace "$project" "$slug" readiness
291
+ run_capture env DEVRITES_ROOT="$project" "$ENGINE" build-readiness "$slug"
292
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "$id readiness baseline failed: $CAPTURED"
293
+
294
+ snapshot_tree "$project" "$before"
295
+ printf '\nOutcome-eval drift.\n' >>"$ws/$file"
296
+ snapshot_tree "$project" "$after"
297
+ assert_one_mutation "$before" "$after" ".devrites/work/$slug/$file"
298
+
299
+ run_capture env DEVRITES_ROOT="$project" "$ENGINE" build-readiness "$slug"
300
+ [ "$CAPTURE_CODE" -eq "$want_code" ] \
301
+ || fail "$id readiness exit=$CAPTURE_CODE, want $want_code; $CAPTURED"
302
+
303
+ run_capture env DEVRITES_ROOT="$project" "$ENGINE" seal --json "$slug"
304
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "$id structural seal failed: $CAPTURED"
305
+ assert_seal "DRV-GATE-SEAL-PASSED"
306
+ printf ' PASS %-20s readiness=%s(code=%s) reason=DRV-GATE-SEAL-PASSED\n' \
307
+ "$id" "$readiness_id" "$want_code"
308
+ }
309
+
310
+ run_stale_case() {
311
+ local id="stale_proof"
312
+ local project="$tmp/$id"
313
+ local slug="case-$id"
314
+ local ws="$project/.devrites/work/$slug"
315
+ local source="src/routes/transactions/export.ts"
316
+ local before="$tmp/$id.before"
317
+ local after="$tmp/$id.after"
318
+
319
+ stage_workspace "$project" "$slug" final
320
+ snapshot_tree "$project" "$before"
321
+ python3 - "$project/$source" <<'PY'
322
+ import os
323
+ import sys
324
+ os.utime(sys.argv[1], (1_700_000_200, 1_700_000_200))
325
+ PY
326
+ snapshot_tree "$project" "$after"
327
+ assert_one_mutation "$before" "$after" "$source"
328
+
329
+ run_capture bash "$GRADER" --json "$ws"
330
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "$id final-only grader failed: $CAPTURED"
331
+ assert_grade "GO" ""
332
+
333
+ run_capture env DEVRITES_ROOT="$project" "$ENGINE" evidence-fresh "$slug"
334
+ [ "$CAPTURE_CODE" -eq 3 ] || fail "$id evidence exit=$CAPTURE_CODE, want 3; $CAPTURED"
335
+
336
+ run_capture env DEVRITES_ROOT="$project" "$ENGINE" seal --json "$slug"
337
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "$id structural seal failed: $CAPTURED"
338
+ assert_seal "DRV-GATE-SEAL-PASSED"
339
+ printf ' PASS %-20s evidence=stale(code=3) reason=DRV-GATE-SEAL-PASSED\n' "$id"
340
+ }
341
+
342
+ printf '== canonical owner inventory ==\n'
343
+ python3 - "$MANIFEST" "$READINESS" "$GOOD" <<'PY'
344
+ from pathlib import Path
345
+ import json
346
+ import sys
347
+
348
+ manifest = json.load(open(sys.argv[1]))
349
+ readiness = json.load(open(sys.argv[2]))
350
+ workspace = Path(sys.argv[3])
351
+ seal = [phase for phase in manifest["phases"] if phase["id"] == "seal"]
352
+ if len(seal) != 1 or not seal[0].get("shippable"):
353
+ raise SystemExit("workflow manifest must own one shippable seal phase")
354
+ required = seal[0]["workspaceRequired"]
355
+ missing = [
356
+ name for name in required
357
+ if not (workspace / name).is_file() or not (workspace / name).read_text().strip()
358
+ ]
359
+ if missing:
360
+ raise SystemExit(f"canonical fixture missing seal artifacts: {missing}")
361
+ contract_artifacts = [
362
+ readiness["coverage"]["artifact"],
363
+ readiness["engineering"]["artifact"],
364
+ readiness["testPlan"]["artifact"],
365
+ ]
366
+ missing_contract = [name for name in contract_artifacts if not (workspace / name).is_file()]
367
+ if missing_contract:
368
+ raise SystemExit(f"canonical fixture missing readiness artifacts: {missing_contract}")
369
+ for name in ("seal.md", "review.md"):
370
+ if not (workspace / name).is_file():
371
+ raise SystemExit(f"canonical fixture missing final-only artifact: {name}")
372
+ print(f" PASS: {len(required)} seal artifacts + {len(contract_artifacts)} readiness bindings + final-only files")
373
+ PY
374
+ run_capture python3 "$ROOT/scripts/validate-workspace-schema.py" "$GOOD"
375
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "canonical workspace schema failed: $CAPTURED"
376
+ printf ' PASS: workspace schema validator\n'
377
+
378
+ printf '\n== canonical base: shell grader + exact Go gates ==\n'
379
+ run_capture bash "$GRADER" --json "$GOOD"
380
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "canonical grader failed: $CAPTURED"
381
+ assert_grade "GO" ""
382
+
383
+ base_project="$tmp/canonical-base"
384
+ base_slug="shippable-feature"
385
+ stage_workspace "$base_project" "$base_slug" final
386
+ run_capture env DEVRITES_ROOT="$base_project" "$ENGINE" evidence-fresh "$base_slug"
387
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "canonical evidence freshness failed: $CAPTURED"
388
+ run_capture env DEVRITES_ROOT="$base_project" "$ENGINE" seal --json "$base_slug"
389
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "canonical seal failed: $CAPTURED"
390
+ assert_seal "DRV-GATE-SEAL-PASSED"
391
+
392
+ readiness_project="$tmp/canonical-readiness"
393
+ readiness_slug="readiness-feature"
394
+ stage_workspace "$readiness_project" "$readiness_slug" readiness
395
+ run_capture env DEVRITES_ROOT="$readiness_project" "$ENGINE" build-readiness "$readiness_slug"
396
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "canonical readiness projection failed: $CAPTURED"
397
+ printf ' PASS: grader GO, seal DRV-GATE-SEAL-PASSED, evidence fresh, readiness ready\n'
398
+
399
+ printf '\n== one-delta final-outcome matrix ==\n'
400
+ run_final_case missing_review final.review.missing 0 DRV-GATE-SEAL-PASSED
401
+ run_final_case missing_evidence final.evidence.missing-or-empty 3 DRV-GATE-SEAL-MISSING
402
+ run_final_case empty_evidence final.evidence.missing-or-empty 3 DRV-GATE-SEAL-MISSING
403
+ run_final_case missing_seal final.seal.missing 0 DRV-GATE-SEAL-PASSED
404
+ run_final_case non_go final.verdict.not-go 0 DRV-GATE-SEAL-PASSED
405
+ run_final_case unresolved_blocker final.blockers.unresolved 0 DRV-GATE-SEAL-PASSED
406
+ run_final_case open_question final.questions.open 0 DRV-GATE-SEAL-PASSED
407
+ run_final_case wrong_phase final.state.phase 0 DRV-GATE-SEAL-PASSED
408
+ run_final_case awaiting_human final.state.status 0 DRV-GATE-SEAL-PASSED
409
+ run_final_case blocked_status final.state.status 0 DRV-GATE-SEAL-PASSED
410
+ run_final_case unchecked_ac final.acceptance.unchecked 0 DRV-GATE-SEAL-PASSED
411
+ run_final_case wrong_ac_id final.acceptance.ids 0 DRV-GATE-SEAL-PASSED
412
+ run_stale_case
413
+ run_readiness_case coverage_digest_drift brief.md coverage-not-clear
414
+ run_readiness_case engineering_digest_drift architecture.md engineering-not-ready
415
+
416
+ printf '\n== legacy compatibility fixtures (not matrix proof) ==\n'
417
+ for legacy in blocked-feature near-miss-unproven-ac; do
418
+ run_capture bash "$GRADER" --json "$ROOT/evals/golden/$legacy"
419
+ [ "$CAPTURE_CODE" -eq 1 ] || fail "$legacy should remain NO-GO"
420
+ printf ' PASS: %s remains NO-GO\n' "$legacy"
421
+ done
422
+
423
+ printf '\nOutcome evals passed: canonical parity + 15 isolated negative rows.\n'
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { spawn } from 'node:child_process';
3
- import { existsSync, mkdtempSync, readdirSync, rmSync } from 'node:fs';
3
+ import { existsSync, mkdtempSync, readFileSync, readdirSync, rmSync } from 'node:fs';
4
4
  import { tmpdir } from 'node:os';
5
5
  import { basename, join } from 'node:path';
6
6
 
@@ -12,6 +12,15 @@ let serial = false;
12
12
  let fast = false;
13
13
  const filters = [];
14
14
 
15
+ function repositoryPackageVersion() {
16
+ const version = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')).version;
17
+ const safeSemver = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
18
+ if (typeof version !== 'string' || version.length > 128 || !safeSemver.test(version)) {
19
+ throw new Error('package.json version must be a safe semantic version of at most 128 characters');
20
+ }
21
+ return version;
22
+ }
23
+
15
24
  for (let i = 0; i < args.length; i++) {
16
25
  const arg = args[i];
17
26
  if (arg === '--serial') serial = true;
@@ -35,6 +44,7 @@ const integrationTests = new Set([
35
44
  'cli-smoke.sh',
36
45
  'codex-agent-generation-test.sh',
37
46
  'codex-runtime-smoke.sh',
47
+ 'claude-runtime-smoke.sh',
38
48
  'fixture-install.sh',
39
49
  'install-flag-parser-legacy-smoke.sh',
40
50
  'host-artifacts-test.sh',
@@ -65,8 +75,11 @@ const testWeights = new Map([
65
75
  ['validate-pack.sh', 25],
66
76
  ['install-flag-parser-invalid-smoke.sh', 20],
67
77
  ['codex-agent-generation-test.sh', 20],
78
+ ['agent-contract-evals-test.sh', 18],
79
+ ['claude-runtime-smoke.sh', 15],
68
80
  ['codex-runtime-smoke.sh', 15],
69
81
  ['hooks-parity-test.sh', 15],
82
+ ['outcome-evals-test.sh', 15],
70
83
  ['host-artifacts-test.sh', 10],
71
84
  ['install-pin-no-global-smoke.sh', 10],
72
85
  ]);
@@ -122,9 +135,24 @@ process.on('exit', () => {
122
135
  });
123
136
 
124
137
  if (!sharedEngine && existsSync(join(root, 'engine', 'go.mod'))) {
138
+ let engineVersion;
139
+ try {
140
+ engineVersion = `v${repositoryPackageVersion()}`;
141
+ } catch (error) {
142
+ console.error(`cannot build shared test engine: ${error.message}`);
143
+ process.exit(1);
144
+ }
125
145
  sharedEngineDir = mkdtempSync(join(tmpdir(), 'devrites-test-engine-'));
126
146
  sharedEngine = join(sharedEngineDir, 'devrites-engine');
127
- const build = spawn('go', ['build', '-trimpath', '-o', sharedEngine, '.'], {
147
+ const build = spawn('go', [
148
+ 'build',
149
+ '-trimpath',
150
+ '-ldflags',
151
+ `-s -w -X github.com/devrites/devrites/internal/version.Version=${engineVersion}`,
152
+ '-o',
153
+ sharedEngine,
154
+ '.',
155
+ ], {
128
156
  cwd: join(root, 'engine'),
129
157
  env: { ...process.env, CGO_ENABLED: '0' },
130
158
  stdio: ['ignore', 'ignore', 'pipe'],
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- // skills-inventory.mjs: verify authored DevRites skill inventory and docs counts.
2
+ // Verify the authored DevRites skill inventory and documentation counts.
3
3
  import { readdirSync, readFileSync, statSync } from 'node:fs';
4
4
  import { join, relative } from 'node:path';
5
5