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
@@ -1,97 +1,454 @@
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" "$READINESS" <<'PY'
87
+ from pathlib import Path
88
+ import json
89
+ import sys
90
+
91
+ workspace, contract_path = map(Path, sys.argv[1:])
92
+ path = workspace / "state.md"
93
+ text = path.read_text()
94
+ for old, new in (
95
+ ("| phase | done |", "| phase | build |"),
96
+ ("| status | done |", "| status | running |"),
97
+ ):
98
+ if text.count(old) != 1:
99
+ raise SystemExit(f"{path}: expected exactly one {old!r}")
100
+ text = text.replace(old, new)
101
+ path.write_text(text)
102
+
103
+ contract = json.loads(contract_path.read_text())
104
+ field = contract["contractField"]
105
+ declaration = f"{field}: {contract['schema']}"
106
+ for name in ("decision-coverage.md", "test-plan.md", "eng-review.md"):
107
+ artifact = workspace / name
108
+ lines = [
109
+ line for line in artifact.read_text().splitlines()
110
+ if not line.startswith(f"{field}:")
111
+ ]
112
+ lines[1:1] = ["", declaration]
113
+ artifact.write_text("\n".join(lines) + "\n")
114
+ PY
115
+ local engineering_digest
116
+ engineering_digest="$(
117
+ env DEVRITES_ROOT="$project" "$ENGINE" readiness-digest engineering "$slug"
118
+ )"
119
+ python3 - "$ws/eng-review.md" "$engineering_digest" <<'PY'
120
+ from pathlib import Path
121
+ import sys
122
+
123
+ path = Path(sys.argv[1])
124
+ field = sys.argv[2]
125
+ lines = path.read_text().splitlines()
126
+ matches = [i for i, line in enumerate(lines) if line.startswith("Readiness inputs SHA-256:")]
127
+ if len(matches) != 1:
128
+ raise SystemExit(f"{path}: expected exactly one engineering digest")
129
+ lines[matches[0]] = field
130
+ path.write_text("\n".join(lines) + "\n")
131
+ PY
132
+ fi
133
+
134
+ python3 - "$project" "$ws" <<'PY'
135
+ from pathlib import Path
136
+ import os
137
+ import re
138
+ import sys
139
+
140
+ project, workspace = map(Path, sys.argv[1:])
141
+ paths = re.findall(r"`([^`]+)`", (workspace / "touched-files.md").read_text())
142
+ for relative in paths:
143
+ path = project / relative
144
+ path.parent.mkdir(parents=True, exist_ok=True)
145
+ path.write_text("synthetic outcome-eval source\n")
146
+ os.utime(path, (1_700_000_000, 1_700_000_000))
147
+ os.utime(workspace / "evidence.md", (1_700_000_100, 1_700_000_100))
148
+ PY
149
+ }
150
+
151
+ snapshot_tree() {
152
+ local project="$1"
153
+ local output="$2"
154
+ python3 - "$project" "$output" <<'PY'
155
+ from pathlib import Path
156
+ import hashlib
157
+ import sys
158
+
159
+ root, output = map(Path, sys.argv[1:])
160
+ rows = []
161
+ for path in sorted(root.rglob("*")):
162
+ if not path.is_file():
163
+ continue
164
+ stat = path.stat()
165
+ rows.append(
166
+ f"{path.relative_to(root)}|{stat.st_mode & 0o777:o}|{stat.st_mtime_ns}|"
167
+ f"{hashlib.sha256(path.read_bytes()).hexdigest()}"
168
+ )
169
+ output.write_text("\n".join(rows) + "\n")
170
+ PY
171
+ }
172
+
173
+ assert_one_mutation() {
174
+ local before="$1"
175
+ local after="$2"
176
+ local want_path="$3"
177
+ python3 - "$before" "$after" "$want_path" <<'PY'
178
+ from pathlib import Path
179
+ import sys
180
+
181
+ before_path, after_path = map(Path, sys.argv[1:3])
182
+ want = sys.argv[3]
183
+ def load(path):
184
+ rows = {}
185
+ for line in path.read_text().splitlines():
186
+ key = line.split("|", 1)[0]
187
+ rows[key] = line
188
+ return rows
189
+
190
+ before, after = load(before_path), load(after_path)
191
+ changed = sorted(
192
+ key for key in before.keys() | after.keys()
193
+ if before.get(key) != after.get(key)
194
+ )
195
+ if changed != [want]:
196
+ raise SystemExit(f"causal paths={changed!r}, want {[want]!r}")
197
+ PY
198
+ }
199
+
200
+ replace_once() {
201
+ local path="$1"
202
+ local old="$2"
203
+ local new="$3"
204
+ python3 - "$path" "$old" "$new" <<'PY'
205
+ from pathlib import Path
206
+ import sys
207
+
208
+ path = Path(sys.argv[1])
209
+ old, new = sys.argv[2:]
210
+ text = path.read_text()
211
+ if text.count(old) != 1:
212
+ raise SystemExit(f"{path}: expected exactly one {old!r}, found {text.count(old)}")
213
+ path.write_text(text.replace(old, new))
214
+ PY
215
+ }
216
+
217
+ mutate_final() {
218
+ local id="$1"
219
+ local project="$2"
220
+ local slug="$3"
221
+ local ws="$project/.devrites/work/$slug"
222
+ case "$id" in
223
+ missing_review) rm "$ws/review.md" ;;
224
+ missing_evidence) rm "$ws/evidence.md" ;;
225
+ empty_evidence) : >"$ws/evidence.md" ;;
226
+ missing_seal) rm "$ws/seal.md" ;;
227
+ non_go) replace_once "$ws/seal.md" "Verdict: GO" "Verdict: NO-GO" ;;
228
+ unresolved_blocker)
229
+ replace_once "$ws/seal.md" $'## Blockers\nnone' $'## Blockers\n- release blocker'
230
+ ;;
231
+ open_question)
232
+ replace_once "$ws/questions.md" "| Q-001 | answered |" "| Q-001 | open |"
233
+ ;;
234
+ wrong_phase) replace_once "$ws/state.md" "| phase | done |" "| phase | review |" ;;
235
+ awaiting_human)
236
+ replace_once "$ws/state.md" "| status | done |" "| status | awaiting_human |"
237
+ ;;
238
+ blocked_status) replace_once "$ws/state.md" "| status | done |" "| status | blocked |" ;;
239
+ unchecked_ac)
240
+ replace_once "$ws/seal.md" "- [x] AC-001:" "- [ ] AC-001:"
241
+ ;;
242
+ wrong_ac_id)
243
+ replace_once "$ws/seal.md" "AC-003:" "AC-999:"
244
+ ;;
245
+ *) fail "unknown final mutation $id" ;;
246
+ esac
247
+ }
248
+
249
+ mutation_path() {
250
+ local id="$1"
251
+ local slug="$2"
252
+ case "$id" in
253
+ missing_review) printf '.devrites/work/%s/review.md\n' "$slug" ;;
254
+ missing_evidence|empty_evidence) printf '.devrites/work/%s/evidence.md\n' "$slug" ;;
255
+ missing_seal|non_go|unresolved_blocker|unchecked_ac|wrong_ac_id)
256
+ printf '.devrites/work/%s/seal.md\n' "$slug"
257
+ ;;
258
+ open_question) printf '.devrites/work/%s/questions.md\n' "$slug" ;;
259
+ wrong_phase|awaiting_human|blocked_status)
260
+ printf '.devrites/work/%s/state.md\n' "$slug"
261
+ ;;
262
+ *) fail "unknown mutation path $id" ;;
263
+ esac
264
+ }
265
+
266
+ run_final_case() {
267
+ local id="$1"
268
+ local want_rule="$2"
269
+ local want_seal_code="$3"
270
+ local want_reason="$4"
271
+ local project="$tmp/final-$id"
272
+ local slug="case-$id"
273
+ local before="$tmp/$id.before"
274
+ local after="$tmp/$id.after"
275
+ local ws="$project/.devrites/work/$slug"
276
+
277
+ stage_workspace "$project" "$slug" final
278
+ snapshot_tree "$project" "$before"
279
+ mutate_final "$id" "$project" "$slug"
280
+ snapshot_tree "$project" "$after"
281
+ assert_one_mutation "$before" "$after" "$(mutation_path "$id" "$slug")"
282
+
283
+ run_capture bash "$GRADER" --json "$ws"
284
+ [ "$CAPTURE_CODE" -eq 1 ] || fail "$id grader exit=$CAPTURE_CODE; $CAPTURED"
285
+ assert_grade "NO-GO" "$want_rule"
286
+
287
+ run_capture env DEVRITES_ROOT="$project" "$ENGINE" seal --json "$slug"
288
+ [ "$CAPTURE_CODE" -eq "$want_seal_code" ] \
289
+ || fail "$id seal exit=$CAPTURE_CODE, want $want_seal_code; $CAPTURED"
290
+ assert_seal "$want_reason"
291
+ printf ' PASS %-20s rule=%s reason=%s\n' "$id" "$want_rule" "$want_reason"
292
+ }
293
+
294
+ readiness_code() {
295
+ local id="$1"
296
+ python3 - "$READINESS" "$id" <<'PY'
297
+ import json
298
+ import sys
299
+
300
+ contract = json.load(open(sys.argv[1]))
301
+ want = sys.argv[2]
302
+ matches = [row for row in contract["reasons"] if row["id"] == want]
303
+ if len(matches) != 1:
304
+ raise SystemExit(f"readiness reason {want!r} is not unique")
305
+ print(matches[0]["code"])
306
+ PY
307
+ }
308
+
309
+ run_readiness_case() {
310
+ local id="$1"
311
+ local file="$2"
312
+ local readiness_id="$3"
313
+ local project="$tmp/readiness-$id"
314
+ local slug="case-$id"
315
+ local ws="$project/.devrites/work/$slug"
316
+ local before="$tmp/$id.before"
317
+ local after="$tmp/$id.after"
318
+ local want_code
319
+ want_code="$(readiness_code "$readiness_id")"
320
+
321
+ stage_workspace "$project" "$slug" readiness
322
+ run_capture env DEVRITES_ROOT="$project" "$ENGINE" build-readiness "$slug"
323
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "$id readiness baseline failed: $CAPTURED"
324
+
325
+ snapshot_tree "$project" "$before"
326
+ printf '\nOutcome-eval drift.\n' >>"$ws/$file"
327
+ snapshot_tree "$project" "$after"
328
+ assert_one_mutation "$before" "$after" ".devrites/work/$slug/$file"
329
+
330
+ run_capture env DEVRITES_ROOT="$project" "$ENGINE" build-readiness "$slug"
331
+ [ "$CAPTURE_CODE" -eq "$want_code" ] \
332
+ || fail "$id readiness exit=$CAPTURE_CODE, want $want_code; $CAPTURED"
333
+
334
+ run_capture env DEVRITES_ROOT="$project" "$ENGINE" seal --json "$slug"
335
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "$id structural seal failed: $CAPTURED"
336
+ assert_seal "DRV-GATE-SEAL-PASSED"
337
+ printf ' PASS %-20s readiness=%s(code=%s) reason=DRV-GATE-SEAL-PASSED\n' \
338
+ "$id" "$readiness_id" "$want_code"
339
+ }
340
+
341
+ run_stale_case() {
342
+ local id="stale_proof"
343
+ local project="$tmp/$id"
344
+ local slug="case-$id"
345
+ local ws="$project/.devrites/work/$slug"
346
+ local source="src/routes/transactions/export.ts"
347
+ local before="$tmp/$id.before"
348
+ local after="$tmp/$id.after"
349
+
350
+ stage_workspace "$project" "$slug" final
351
+ snapshot_tree "$project" "$before"
352
+ python3 - "$project/$source" <<'PY'
353
+ import os
354
+ import sys
355
+ os.utime(sys.argv[1], (1_700_000_200, 1_700_000_200))
356
+ PY
357
+ snapshot_tree "$project" "$after"
358
+ assert_one_mutation "$before" "$after" "$source"
359
+
360
+ run_capture bash "$GRADER" --json "$ws"
361
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "$id final-only grader failed: $CAPTURED"
362
+ assert_grade "GO" ""
363
+
364
+ run_capture env DEVRITES_ROOT="$project" "$ENGINE" evidence-fresh "$slug"
365
+ [ "$CAPTURE_CODE" -eq 3 ] || fail "$id evidence exit=$CAPTURE_CODE, want 3; $CAPTURED"
366
+
367
+ run_capture env DEVRITES_ROOT="$project" "$ENGINE" seal --json "$slug"
368
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "$id structural seal failed: $CAPTURED"
369
+ assert_seal "DRV-GATE-SEAL-PASSED"
370
+ printf ' PASS %-20s evidence=stale(code=3) reason=DRV-GATE-SEAL-PASSED\n' "$id"
371
+ }
372
+
373
+ printf '== canonical owner inventory ==\n'
374
+ python3 - "$MANIFEST" "$READINESS" "$GOOD" <<'PY'
375
+ from pathlib import Path
376
+ import json
377
+ import sys
378
+
379
+ manifest = json.load(open(sys.argv[1]))
380
+ readiness = json.load(open(sys.argv[2]))
381
+ workspace = Path(sys.argv[3])
382
+ seal = [phase for phase in manifest["phases"] if phase["id"] == "seal"]
383
+ if len(seal) != 1 or not seal[0].get("shippable"):
384
+ raise SystemExit("workflow manifest must own one shippable seal phase")
385
+ required = seal[0]["workspaceRequired"]
386
+ missing = [
387
+ name for name in required
388
+ if not (workspace / name).is_file() or not (workspace / name).read_text().strip()
389
+ ]
390
+ if missing:
391
+ raise SystemExit(f"canonical fixture missing seal artifacts: {missing}")
392
+ contract_artifacts = [
393
+ readiness["coverage"]["artifact"],
394
+ readiness["engineering"]["artifact"],
395
+ readiness["testPlan"]["artifact"],
396
+ ]
397
+ missing_contract = [name for name in contract_artifacts if not (workspace / name).is_file()]
398
+ if missing_contract:
399
+ raise SystemExit(f"canonical fixture missing readiness artifacts: {missing_contract}")
400
+ for name in ("seal.md", "review.md"):
401
+ if not (workspace / name).is_file():
402
+ raise SystemExit(f"canonical fixture missing final-only artifact: {name}")
403
+ print(f" PASS: {len(required)} seal artifacts + {len(contract_artifacts)} readiness bindings + final-only files")
404
+ PY
405
+ run_capture python3 "$ROOT/scripts/validate-workspace-schema.py" "$GOOD"
406
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "canonical workspace schema failed: $CAPTURED"
407
+ printf ' PASS: workspace schema validator\n'
408
+
409
+ printf '\n== canonical base: shell grader + exact Go gates ==\n'
410
+ run_capture bash "$GRADER" --json "$GOOD"
411
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "canonical grader failed: $CAPTURED"
412
+ assert_grade "GO" ""
413
+
414
+ base_project="$tmp/canonical-base"
415
+ base_slug="shippable-feature"
416
+ stage_workspace "$base_project" "$base_slug" final
417
+ run_capture env DEVRITES_ROOT="$base_project" "$ENGINE" evidence-fresh "$base_slug"
418
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "canonical evidence freshness failed: $CAPTURED"
419
+ run_capture env DEVRITES_ROOT="$base_project" "$ENGINE" seal --json "$base_slug"
420
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "canonical seal failed: $CAPTURED"
421
+ assert_seal "DRV-GATE-SEAL-PASSED"
422
+
423
+ readiness_project="$tmp/canonical-readiness"
424
+ readiness_slug="readiness-feature"
425
+ stage_workspace "$readiness_project" "$readiness_slug" readiness
426
+ run_capture env DEVRITES_ROOT="$readiness_project" "$ENGINE" build-readiness "$readiness_slug"
427
+ [ "$CAPTURE_CODE" -eq 0 ] || fail "canonical readiness projection failed: $CAPTURED"
428
+ printf ' PASS: grader GO, seal DRV-GATE-SEAL-PASSED, evidence fresh, readiness ready\n'
429
+
430
+ printf '\n== one-delta final-outcome matrix ==\n'
431
+ run_final_case missing_review final.review.missing 0 DRV-GATE-SEAL-PASSED
432
+ run_final_case missing_evidence final.evidence.missing-or-empty 3 DRV-GATE-SEAL-MISSING
433
+ run_final_case empty_evidence final.evidence.missing-or-empty 3 DRV-GATE-SEAL-MISSING
434
+ run_final_case missing_seal final.seal.missing 0 DRV-GATE-SEAL-PASSED
435
+ run_final_case non_go final.verdict.not-go 0 DRV-GATE-SEAL-PASSED
436
+ run_final_case unresolved_blocker final.blockers.unresolved 0 DRV-GATE-SEAL-PASSED
437
+ run_final_case open_question final.questions.open 0 DRV-GATE-SEAL-PASSED
438
+ run_final_case wrong_phase final.state.phase 0 DRV-GATE-SEAL-PASSED
439
+ run_final_case awaiting_human final.state.status 0 DRV-GATE-SEAL-PASSED
440
+ run_final_case blocked_status final.state.status 0 DRV-GATE-SEAL-PASSED
441
+ run_final_case unchecked_ac final.acceptance.unchecked 0 DRV-GATE-SEAL-PASSED
442
+ run_final_case wrong_ac_id final.acceptance.ids 0 DRV-GATE-SEAL-PASSED
443
+ run_stale_case
444
+ run_readiness_case coverage_digest_drift brief.md coverage-not-clear
445
+ run_readiness_case engineering_digest_drift architecture.md engineering-not-ready
446
+
447
+ printf '\n== legacy compatibility fixtures (not matrix proof) ==\n'
448
+ for legacy in blocked-feature near-miss-unproven-ac; do
449
+ run_capture bash "$GRADER" --json "$ROOT/evals/golden/$legacy"
450
+ [ "$CAPTURE_CODE" -eq 1 ] || fail "$legacy should remain NO-GO"
451
+ printf ' PASS: %s remains NO-GO\n' "$legacy"
452
+ done
453
+
454
+ 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