devrites 3.0.7 → 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 +12 -0
  2. package/README.md +67 -47
  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 +486 -38
  54. package/engine/internal/install/install_test.go +383 -10
  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,27 +1,25 @@
1
1
  #!/usr/bin/env bash
2
- # Deterministic OUTCOME grader for a finished DevRites feature workspace.
2
+ # Deterministic outcome grader for a completed DevRites feature workspace.
3
3
  #
4
- # The trigger evals (evals/*.json) test whether the right SKILL *fires*. This
5
- # grades whether a finished run reached a *shippable* state: the
6
- # product claim DevRites sells ("won't claim done without proof"). It reads only
7
- # committed Markdown artifacts (no API key, no Claude Code harness), so it runs
8
- # in CI against a golden fixture and is the kind of deterministic grader
9
- # Anthropic's eval guidance recommends for coding agents.
4
+ # Trigger evals in evals/*.json check skill selection. This script checks
5
+ # whether a completed run is shippable and has proof. It reads only committed
6
+ # Markdown artifacts, so CI can grade a golden fixture without an API key or
7
+ # model harness.
10
8
  #
11
- # Live evidence-freshness (mtime: does proof post-date code?) is NOT graded here
12
- #: git fixtures don't preserve mtimes; that gate is enforced on a live
13
- # workspace by the `devrites-engine evidence-fresh` engine gate.
9
+ # Git fixtures do not preserve the mtimes needed to compare proof with code.
10
+ # The `devrites-engine evidence-fresh` gate performs that check in a live
11
+ # workspace.
14
12
  #
15
- # Usage: grade-feature.sh <workspace-dir>
13
+ # Usage: grade-feature.sh [--json] <workspace-dir>
16
14
  # e.g. evals/golden/shippable-feature | .devrites/work/<slug> | .devrites/archive/<slug>
17
15
  #
18
- # Invariants (from rite-seal/reference/{seal-template,go-no-go,final-evidence}.md):
16
+ # Checks from rite-seal/reference/{seal-template,go-no-go,final-evidence}.md:
19
17
  # 1. seal.md present with "Verdict: GO" (not NO-GO)
20
18
  # 2. seal.md "## Acceptance Criteria" has no unchecked "- [ ]" item
21
19
  # 3. seal.md "## Blockers" is empty / "none"
22
20
  # 4. evidence.md present and non-empty
23
21
  # 5. review.md present
24
- # 6. questions.md has no entry with gate: validating + status: open (NO-GO by definition)
22
+ # 6. questions.md has no open question (later lifecycle phases block them)
25
23
  # 7. state.md Phase in {seal, ship, done}; Status not awaiting_human / blocked
26
24
  #
27
25
  # Exit codes: 0 shippable; 1 one or more invariants failed; 2 bad usage.
@@ -29,24 +27,41 @@
29
27
  set -euo pipefail
30
28
 
31
29
  ROOT="$(cd "$(dirname "$0")/.." && pwd)"
30
+ json=0
31
+ if [ "${1:-}" = "--json" ]; then
32
+ json=1
33
+ shift
34
+ fi
32
35
  ws="${1:-}"
33
- if [ -z "$ws" ] || [ ! -d "$ws" ]; then
34
- printf 'usage: grade-feature.sh <workspace-dir>\n' >&2
36
+ if [ "$#" -ne 1 ] || [ ! -d "$ws" ]; then
37
+ printf 'usage: grade-feature.sh [--json] <workspace-dir>\n' >&2
35
38
  exit 2
36
39
  fi
37
40
 
38
41
  seal="$ws/seal.md"; ev="$ws/evidence.md"; rev="$ws/review.md"
39
42
  q="$ws/questions.md"; st="$ws/state.md"
40
43
  problems=()
44
+ rules=()
45
+ unchecked=0
46
+ acceptance_ready=0
47
+
48
+ add_problem() {
49
+ rules+=("$1")
50
+ problems+=("$2")
51
+ }
41
52
 
42
- # 1 / 2 / 3: seal verdict, acceptance, blockers
53
+ # Checks 1 through 3: seal verdict, acceptance, and blockers.
43
54
  if [ ! -f "$seal" ]; then
44
- problems+=("seal.md missing: feature never sealed")
55
+ add_problem "final.seal.missing" "seal.md missing: feature never sealed"
45
56
  else
46
57
  grep -qiE '^[[:space:]]*Verdict:[[:space:]]*GO[[:space:]]*$' "$seal" \
47
- || problems+=("seal.md Verdict is not GO")
58
+ || add_problem "final.verdict.not-go" "seal.md Verdict is not GO"
48
59
  unchecked=$(awk '/^## /{insec=($0 ~ /^## Acceptance Criteria/)} insec && /^- \[ \]/{c++} END{print c+0}' "$seal")
49
- [ "${unchecked:-0}" -gt 0 ] && problems+=("seal.md has ${unchecked} unchecked acceptance criterion(s)")
60
+ if [ "${unchecked:-0}" -gt 0 ]; then
61
+ add_problem "final.acceptance.unchecked" "seal.md has ${unchecked} unchecked acceptance criterion(s)"
62
+ else
63
+ acceptance_ready=1
64
+ fi
50
65
  if awk '
51
66
  /^## /{ insec=($0 ~ /^## Blockers/); next }
52
67
  insec { l=$0; gsub(/^[[:space:]]+|[[:space:]]+$/,"",l)
@@ -54,40 +69,75 @@ else
54
69
  ll=tolower(l); if (ll ~ /^-?[[:space:]]*(none|n\/a)$/) next
55
70
  nz=1 }
56
71
  END { exit(nz?0:1) }' "$seal"; then
57
- problems+=("seal.md lists unresolved blockers")
72
+ add_problem "final.blockers.unresolved" "seal.md lists unresolved blockers"
58
73
  fi
59
74
  fi
60
75
 
61
- # 4: evidence
62
- { [ -f "$ev" ] && [ -s "$ev" ]; } || problems+=("evidence.md missing or empty: acceptance unproven")
76
+ # Check 4: evidence.
77
+ { [ -f "$ev" ] && [ -s "$ev" ]; } \
78
+ || add_problem "final.evidence.missing-or-empty" "evidence.md missing or empty: acceptance unproven"
63
79
 
64
- # 5: review
65
- [ -f "$rev" ] || problems+=("review.md missing: feature not reviewed")
80
+ # Check 5: review.
81
+ [ -f "$rev" ] || add_problem "final.review.missing" "review.md missing: feature not reviewed"
66
82
 
67
- # 6: open validating gate (merge-blocking by definition)
83
+ # Check 6: open questions block sealing.
68
84
  if [ -f "$q" ]; then
69
- if awk '
70
- /^## q-/{ if(inq && s=="open" && g=="validating") bad=1; inq=1; s=""; g=""; next }
71
- inq && /^status:/{ v=$0; sub(/^status:[[:space:]]*/,"",v); s=v }
72
- inq && /^gate:/ { v=$0; sub(/^gate:[[:space:]]*/,"",v); g=v }
73
- END{ if(inq && s=="open" && g=="validating") bad=1; exit(bad?0:1) }' "$q"; then
74
- problems+=("open 'gate: validating' question: merge-blocking by definition (NO-GO)")
85
+ if python3 - "$q" <<'PY'
86
+ from pathlib import Path
87
+ import sys
88
+
89
+ lines = Path(sys.argv[1]).read_text().splitlines()
90
+ in_question = False
91
+ status = ""
92
+ for line in lines:
93
+ stripped = line.strip()
94
+ if stripped.startswith("## "):
95
+ if in_question and status.lower() == "open":
96
+ raise SystemExit(0)
97
+ in_question = stripped[3:].lower().startswith("q-")
98
+ status = ""
99
+ elif in_question and stripped.lower().startswith("status:"):
100
+ status = stripped.split(":", 1)[1].strip()
101
+ if in_question and status.lower() == "open":
102
+ raise SystemExit(0)
103
+
104
+ status_index = None
105
+ for line in lines:
106
+ stripped = line.strip()
107
+ if not (stripped.startswith("|") and stripped.endswith("|")):
108
+ status_index = None
109
+ continue
110
+ cells = [cell.strip() for cell in stripped.strip("|").split("|")]
111
+ lowered = [cell.lower() for cell in cells]
112
+ if status_index is None:
113
+ status_index = lowered.index("status") if "status" in lowered else None
114
+ continue
115
+ if status_index < len(cells) and cells[status_index].lower() == "open":
116
+ raise SystemExit(0)
117
+ raise SystemExit(1)
118
+ PY
119
+ then
120
+ add_problem "final.questions.open" "questions.md contains an open question"
75
121
  fi
76
122
  fi
77
123
 
78
- # 7: state phase / status
124
+ # Check 7: state phase and status.
79
125
  if [ -f "$st" ]; then
80
126
  ph="$(python3 "$ROOT/scripts/workflow_schema.py" field "$st" phase 2>/dev/null || true)"
81
127
  stt="$(python3 "$ROOT/scripts/workflow_schema.py" field "$st" status 2>/dev/null || true)"
82
- if ! python3 "$ROOT/scripts/workflow_schema.py" phase-property "$ph" shippable; then
83
- problems+=("state.md Phase='${ph}' (expected a shippable phase)")
128
+ if ! python3 "$ROOT/scripts/workflow_schema.py" phase-property "$ph" shippable >/dev/null; then
129
+ add_problem "final.state.phase" "state.md Phase='${ph}' (expected a shippable phase)"
84
130
  fi
85
- case "$stt" in awaiting_human|blocked) problems+=("state.md Status='${stt}' (not shippable)") ;; esac
131
+ case "$stt" in
132
+ awaiting_human|blocked)
133
+ add_problem "final.state.status" "state.md Status='${stt}' (not shippable)"
134
+ ;;
135
+ esac
86
136
  else
87
- problems+=("state.md missing")
137
+ add_problem "final.state.missing" "state.md missing"
88
138
  fi
89
139
 
90
- # 8: executable acceptance criteria: every spec [ACn] proven + checked in seal
140
+ # Check 8: every spec [ACn] is proven and checked in the seal.
91
141
  run_acceptance_check() {
92
142
  if [ -n "${DEVRITES_CLI:-}" ]; then
93
143
  "$DEVRITES_CLI" check-acceptance "$ws"
@@ -109,13 +159,44 @@ run_acceptance_check() {
109
159
  return 127
110
160
  }
111
161
 
112
- if ! acout=$(run_acceptance_check 2>&1); then
113
- problems+=("acceptance: $(printf '%s' "$acout" | tail -1 | sed 's/^check-acceptance: //')")
162
+ if [ "$acceptance_ready" -eq 1 ] && ! acout=$(run_acceptance_check 2>&1); then
163
+ add_problem "final.acceptance.ids" \
164
+ "acceptance: $(printf '%s' "$acout" | tail -1 | sed 's/^check-acceptance: //')"
114
165
  fi
115
166
 
116
167
  slug="$(basename "$ws")"
168
+ if [ "$json" -eq 1 ]; then
169
+ status="GO"
170
+ [ "${#problems[@]}" -gt 0 ] && status="NO-GO"
171
+ pairs=()
172
+ for ((i = 0; i < ${#problems[@]}; i++)); do
173
+ pairs+=("${rules[$i]}" "${problems[$i]}")
174
+ done
175
+ python3 - "$slug" "$status" "${pairs[@]}" <<'PY'
176
+ import json
177
+ import sys
178
+
179
+ slug, status, *pairs = sys.argv[1:]
180
+ items = [
181
+ {"rule_id": pairs[i], "message": pairs[i + 1]}
182
+ for i in range(0, len(pairs), 2)
183
+ ]
184
+ print(json.dumps({
185
+ "schema": "devrites-outcome-grade/v1",
186
+ "workspace": slug,
187
+ "status": status,
188
+ "rule_ids": [item["rule_id"] for item in items],
189
+ "problems": items,
190
+ }, separators=(",", ":")))
191
+ PY
192
+ if [ "${#problems[@]}" -eq 0 ]; then
193
+ exit 0
194
+ fi
195
+ exit 1
196
+ fi
197
+
117
198
  if [ "${#problems[@]}" -eq 0 ]; then
118
- printf 'GO %s: shippable: sealed GO, acceptance proven, no blockers, no open validating gate.\n' "$slug"
199
+ printf 'GO %s: shippable: sealed GO, acceptance proven, no blockers, no open question.\n' "$slug"
119
200
  exit 0
120
201
  fi
121
202
  printf 'NO-GO %s: %d blocker(s):\n' "$slug" "${#problems[@]}"
@@ -0,0 +1,230 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "type": "object",
4
+ "additionalProperties": false,
5
+ "required": [
6
+ "result_version",
7
+ "run_id",
8
+ "cell_id",
9
+ "host",
10
+ "role",
11
+ "status",
12
+ "baseline_id",
13
+ "scope_id",
14
+ "budget",
15
+ "side_effects",
16
+ "payload_type",
17
+ "execution",
18
+ "signals",
19
+ "usage",
20
+ "dispatch_reason_id",
21
+ "result_reason_id",
22
+ "outcome",
23
+ "terminal_sentinel",
24
+ "host_version",
25
+ "model"
26
+ ],
27
+ "properties": {
28
+ "result_version": {
29
+ "const": "agent-result/v1"
30
+ },
31
+ "run_id": {
32
+ "type": "string",
33
+ "pattern": "^drv-run-v1:[0-9a-f]{32}$"
34
+ },
35
+ "cell_id": {
36
+ "type": "string"
37
+ },
38
+ "host": {
39
+ "enum": [
40
+ "claude",
41
+ "codex"
42
+ ]
43
+ },
44
+ "role": {
45
+ "type": "string"
46
+ },
47
+ "status": {
48
+ "enum": [
49
+ "complete",
50
+ "partial",
51
+ "blocked",
52
+ "failed"
53
+ ]
54
+ },
55
+ "baseline_id": {
56
+ "type": "string"
57
+ },
58
+ "scope_id": {
59
+ "type": "string",
60
+ "pattern": "^[0-9a-f]{64}$"
61
+ },
62
+ "budget": {
63
+ "type": "object",
64
+ "additionalProperties": false,
65
+ "required": [
66
+ "files_used",
67
+ "loaded_lines_used",
68
+ "result_lines_used"
69
+ ],
70
+ "properties": {
71
+ "files_used": {
72
+ "type": "integer",
73
+ "minimum": 0
74
+ },
75
+ "loaded_lines_used": {
76
+ "type": "integer",
77
+ "minimum": 0
78
+ },
79
+ "result_lines_used": {
80
+ "type": "integer",
81
+ "minimum": 0
82
+ }
83
+ }
84
+ },
85
+ "side_effects": {
86
+ "type": "object",
87
+ "additionalProperties": false,
88
+ "required": [
89
+ "repo_writes",
90
+ "scratch_write_count"
91
+ ],
92
+ "properties": {
93
+ "repo_writes": {
94
+ "type": "array",
95
+ "items": {
96
+ "type": "object",
97
+ "additionalProperties": false,
98
+ "required": [
99
+ "path",
100
+ "kind",
101
+ "sha256"
102
+ ],
103
+ "properties": {
104
+ "path": {
105
+ "type": "string"
106
+ },
107
+ "kind": {
108
+ "enum": [
109
+ "file",
110
+ "symlink",
111
+ "deleted"
112
+ ]
113
+ },
114
+ "sha256": {
115
+ "type": "string",
116
+ "pattern": "^[0-9a-f]{64}$"
117
+ }
118
+ }
119
+ }
120
+ },
121
+ "scratch_write_count": {
122
+ "type": "integer",
123
+ "minimum": 0
124
+ }
125
+ }
126
+ },
127
+ "payload_type": {
128
+ "enum": [
129
+ "review-findings",
130
+ "wright-report"
131
+ ]
132
+ },
133
+ "execution": {
134
+ "type": "object",
135
+ "additionalProperties": false,
136
+ "required": [
137
+ "mode",
138
+ "guard_strength",
139
+ "independence"
140
+ ],
141
+ "properties": {
142
+ "mode": {
143
+ "enum": [
144
+ "named",
145
+ "generic",
146
+ "inline"
147
+ ]
148
+ },
149
+ "guard_strength": {
150
+ "enum": [
151
+ "enforced",
152
+ "observed",
153
+ "unavailable",
154
+ "bypassed"
155
+ ]
156
+ },
157
+ "independence": {
158
+ "type": "boolean"
159
+ }
160
+ }
161
+ },
162
+ "signals": {
163
+ "type": "array",
164
+ "items": {
165
+ "type": "string"
166
+ },
167
+ "uniqueItems": true
168
+ },
169
+ "usage": {
170
+ "type": "object",
171
+ "additionalProperties": false,
172
+ "required": [
173
+ "input_tokens",
174
+ "output_tokens",
175
+ "cost_usd",
176
+ "cost_provenance"
177
+ ],
178
+ "properties": {
179
+ "input_tokens": {
180
+ "type": "integer",
181
+ "minimum": 0
182
+ },
183
+ "output_tokens": {
184
+ "type": "integer",
185
+ "minimum": 0
186
+ },
187
+ "cost_usd": {
188
+ "type": [
189
+ "string",
190
+ "null"
191
+ ],
192
+ "pattern": "^[0-9]+(\\.[0-9]+)?$"
193
+ },
194
+ "cost_provenance": {
195
+ "enum": [
196
+ "provider-reported",
197
+ "unavailable"
198
+ ]
199
+ }
200
+ }
201
+ },
202
+ "dispatch_reason_id": {
203
+ "type": "string",
204
+ "pattern": "^DRV-[A-Z0-9-]+$"
205
+ },
206
+ "result_reason_id": {
207
+ "type": "string",
208
+ "pattern": "^DRV-[A-Z0-9-]+$"
209
+ },
210
+ "outcome": {
211
+ "enum": [
212
+ "passed",
213
+ "denied",
214
+ "unavailable"
215
+ ]
216
+ },
217
+ "terminal_sentinel": {
218
+ "enum": [
219
+ "complete",
220
+ "interrupted"
221
+ ]
222
+ },
223
+ "host_version": {
224
+ "type": "string"
225
+ },
226
+ "model": {
227
+ "type": "string"
228
+ }
229
+ }
230
+ }
@@ -0,0 +1,87 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
5
+ # shellcheck disable=SC1091
6
+ source "$DIR/common.sh"
7
+ CONTRACT_HELPER="$DIR/host-transport.py"
8
+
9
+ case "${1:-}" in
10
+ version)
11
+ contract_version claude
12
+ ;;
13
+ run)
14
+ ;;
15
+ *)
16
+ contract_die "expected version or run"
17
+ ;;
18
+ esac
19
+
20
+ contract_prepare_run
21
+ if [ -n "${DEVRITES_CONTRACT_FAKE_HOST:-}" ]; then
22
+ contract_run_fake
23
+ fi
24
+ contract_read_auth
25
+ actual_version="$(env -i "PATH=$PATH" "LANG=C" "LC_ALL=C" claude --version 2>/dev/null)" \
26
+ || contract_die "Claude version preflight failed"
27
+ [ "$actual_version" = "$DEVRITES_CONTRACT_HOST_VERSION_PIN" ] \
28
+ || contract_die "Claude version pin changed"
29
+
30
+ simulate="$(python3 "$CONTRACT_HELPER" field simulate)"
31
+ role_class="$(python3 "$CONTRACT_HELPER" field role_class)"
32
+ tools="Agent,Read,Glob,Grep"
33
+ if [ "$role_class" = "wright" ]; then
34
+ tools="$tools,Edit,Write,Bash"
35
+ fi
36
+ if [ "$simulate" = "inline-fallback" ]; then
37
+ tools="Read,Glob,Grep"
38
+ fi
39
+ schema="$(cat "$DIR/agent-result.schema.json")"
40
+ mkdir -p "$XDG_CONFIG_HOME/claude"
41
+
42
+ trap 'contract_interrupt_result; exit 130' INT TERM
43
+ cd "$DEVRITES_ROOT"
44
+ set +e
45
+ env -i \
46
+ "PATH=$PATH" "LANG=C" "LC_ALL=C" "PYTHONDONTWRITEBYTECODE=1" \
47
+ "DEVRITES_CONTRACT_PACKET=$DEVRITES_CONTRACT_PACKET" \
48
+ python3 "$CONTRACT_HELPER" render |
49
+ env -i \
50
+ "PATH=$PATH" "LANG=C" "LC_ALL=C" \
51
+ "HOME=$HOME" "TMPDIR=$TMPDIR" \
52
+ "XDG_CONFIG_HOME=$XDG_CONFIG_HOME" "XDG_STATE_HOME=$XDG_STATE_HOME" \
53
+ "CLAUDE_CONFIG_DIR=$XDG_CONFIG_HOME/claude" \
54
+ "CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1" \
55
+ "ANTHROPIC_API_KEY=$CONTRACT_AUTH_VALUE" \
56
+ "DEVRITES_ROOT=$DEVRITES_ROOT" \
57
+ "DEVRITES_AGENT_SCRATCH=$DEVRITES_AGENT_SCRATCH" \
58
+ "DEVRITES_RUN_ID=$DEVRITES_RUN_ID" \
59
+ claude -p \
60
+ --output-format json \
61
+ --json-schema "$schema" \
62
+ --model "$DEVRITES_CONTRACT_MODEL" \
63
+ --max-budget-usd "$DEVRITES_CONTRACT_MAX_COST_USD" \
64
+ --permission-mode dontAsk \
65
+ --tools "$tools" \
66
+ --setting-sources project \
67
+ --settings '{}' \
68
+ --strict-mcp-config \
69
+ --mcp-config '{"mcpServers":{}}' \
70
+ --no-chrome \
71
+ --no-session-persistence |
72
+ env -i \
73
+ "PATH=$PATH" "LANG=C" "LC_ALL=C" "PYTHONDONTWRITEBYTECODE=1" \
74
+ "DEVRITES_CONTRACT_PACKET=$DEVRITES_CONTRACT_PACKET" \
75
+ "DEVRITES_CONTRACT_RESULT=$DEVRITES_CONTRACT_RESULT" \
76
+ "DEVRITES_CONTRACT_HOST_VERSION_PIN=$DEVRITES_CONTRACT_HOST_VERSION_PIN" \
77
+ "DEVRITES_CONTRACT_MODEL=$DEVRITES_CONTRACT_MODEL" \
78
+ python3 "$CONTRACT_HELPER" normalize
79
+ pipeline=("${PIPESTATUS[@]}")
80
+ set -e
81
+ host_rc="${pipeline[1]:-2}"
82
+ normalize_rc="${pipeline[2]:-2}"
83
+ [ "$normalize_rc" -eq 0 ] || exit 2
84
+ if [ "$host_rc" -eq 130 ]; then
85
+ contract_interrupt_result
86
+ fi
87
+ exit "$host_rc"
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
5
+ # shellcheck disable=SC1091
6
+ source "$DIR/common.sh"
7
+ CONTRACT_HELPER="$DIR/host-transport.py"
8
+
9
+ case "${1:-}" in
10
+ version)
11
+ contract_version codex
12
+ ;;
13
+ run)
14
+ ;;
15
+ *)
16
+ contract_die "expected version or run"
17
+ ;;
18
+ esac
19
+
20
+ contract_prepare_run
21
+ if [ -n "${DEVRITES_CONTRACT_FAKE_HOST:-}" ]; then
22
+ contract_run_fake
23
+ fi
24
+ contract_read_auth
25
+ actual_version="$(env -i "PATH=$PATH" "LANG=C" "LC_ALL=C" codex --version 2>/dev/null)" \
26
+ || contract_die "Codex version preflight failed"
27
+ [ "$actual_version" = "$DEVRITES_CONTRACT_HOST_VERSION_PIN" ] \
28
+ || contract_die "Codex version pin changed"
29
+
30
+ role_class="$(python3 "$CONTRACT_HELPER" field role_class)"
31
+ sandbox="read-only"
32
+ if [ "$role_class" = "wright" ]; then
33
+ sandbox="workspace-write"
34
+ fi
35
+ mkdir -p "$XDG_CONFIG_HOME/codex"
36
+
37
+ trap 'contract_interrupt_result; exit 130' INT TERM
38
+ cd "$DEVRITES_ROOT"
39
+ set +e
40
+ env -i \
41
+ "PATH=$PATH" "LANG=C" "LC_ALL=C" "PYTHONDONTWRITEBYTECODE=1" \
42
+ "DEVRITES_CONTRACT_PACKET=$DEVRITES_CONTRACT_PACKET" \
43
+ python3 "$CONTRACT_HELPER" render |
44
+ env -i \
45
+ "PATH=$PATH" "LANG=C" "LC_ALL=C" \
46
+ "HOME=$HOME" "TMPDIR=$TMPDIR" \
47
+ "XDG_CONFIG_HOME=$XDG_CONFIG_HOME" "XDG_STATE_HOME=$XDG_STATE_HOME" \
48
+ "CODEX_HOME=$XDG_CONFIG_HOME/codex" \
49
+ "OPENAI_API_KEY=$CONTRACT_AUTH_VALUE" \
50
+ "DEVRITES_ROOT=$DEVRITES_ROOT" \
51
+ "DEVRITES_AGENT_SCRATCH=$DEVRITES_AGENT_SCRATCH" \
52
+ "DEVRITES_RUN_ID=$DEVRITES_RUN_ID" \
53
+ codex exec \
54
+ --json \
55
+ --ephemeral \
56
+ --strict-config \
57
+ --ignore-user-config \
58
+ --skip-git-repo-check \
59
+ --dangerously-bypass-hook-trust \
60
+ --sandbox "$sandbox" \
61
+ --model "$DEVRITES_CONTRACT_MODEL" \
62
+ --output-schema "$DIR/agent-result.schema.json" \
63
+ -c shell_environment_policy.inherit=none \
64
+ -C "$DEVRITES_ROOT" \
65
+ - |
66
+ env -i \
67
+ "PATH=$PATH" "LANG=C" "LC_ALL=C" "PYTHONDONTWRITEBYTECODE=1" \
68
+ "DEVRITES_CONTRACT_PACKET=$DEVRITES_CONTRACT_PACKET" \
69
+ "DEVRITES_CONTRACT_RESULT=$DEVRITES_CONTRACT_RESULT" \
70
+ "DEVRITES_CONTRACT_HOST_VERSION_PIN=$DEVRITES_CONTRACT_HOST_VERSION_PIN" \
71
+ "DEVRITES_CONTRACT_MODEL=$DEVRITES_CONTRACT_MODEL" \
72
+ python3 "$CONTRACT_HELPER" normalize
73
+ pipeline=("${PIPESTATUS[@]}")
74
+ set -e
75
+ host_rc="${pipeline[1]:-2}"
76
+ normalize_rc="${pipeline[2]:-2}"
77
+ [ "$normalize_rc" -eq 0 ] || exit 2
78
+ if [ "$host_rc" -eq 130 ]; then
79
+ contract_interrupt_result
80
+ fi
81
+ exit "$host_rc"