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
@@ -8,16 +8,28 @@ gen_codex_markdown_file() {
8
8
  local _src="$1" _out="$2"
9
9
  mkdir -p "$(dirname "$_out")"
10
10
  sed -E \
11
+ -e 's#(pack/)?\.claude/agents/devrites-\{security-auditor,performance-reviewer,simplifier-reviewer\}\.md#.codex/agents/devrites-security-auditor.toml`, `.codex/agents/devrites-performance-reviewer.toml`, or `.codex/agents/devrites-simplifier-reviewer.toml#g' \
12
+ -e 's#(\.\./)+agents/devrites-\{security-auditor,performance-reviewer,simplifier-reviewer\}\.md#.codex/agents/devrites-security-auditor.toml`, `.codex/agents/devrites-performance-reviewer.toml`, or `.codex/agents/devrites-simplifier-reviewer.toml#g' \
11
13
  -e 's#pack/\.claude/skills/devrites-lib/scripts/#.agents/skills/devrites-lib/scripts/#g' \
12
14
  -e 's#pack/\.claude/skills/#.agents/skills/#g' \
13
- -e 's#pack/\.claude/agents/(devrites-[A-Za-z0-9_-]+)\.md#.codex/agents/\1.toml#g' \
15
+ -e 's#pack/\.claude/agents/([A-Za-z0-9_-]+)\.md#.codex/agents/\1.toml#g' \
14
16
  -e 's#pack/\.claude/agents/#.codex/agents/#g' \
15
17
  -e 's#\.claude/skills/devrites-lib/scripts/#.agents/skills/devrites-lib/scripts/#g' \
16
18
  -e 's#\.claude/skills/#.agents/skills/#g' \
17
- -e 's#\.claude/agents/(devrites-[A-Za-z0-9_-]+)\.md#.codex/agents/\1.toml#g' \
19
+ -e 's#\.claude/agents/([A-Za-z0-9_-]+)\.md#.codex/agents/\1.toml#g' \
18
20
  -e 's#\.claude/agents/#.codex/agents/#g' \
19
- -e 's#\.\./\.\./\.\./agents/(devrites-[A-Za-z0-9_-]+)\.md#.codex/agents/\1.toml#g' \
20
- -e 's#\.\./\.\./agents/(devrites-[A-Za-z0-9_-]+)\.md#.codex/agents/\1.toml#g' \
21
+ -e 's#(\.\./)+agents/([A-Za-z0-9_-]+)\.md#.codex/agents/\2.toml#g' \
22
+ -e 's#\.codex/agents/([A-Za-z0-9_-]+)\.md#.codex/agents/\1.toml#g' \
23
+ -e 's#Host mapping: Claude Code uses `Agent` \(`Task` is its legacy alias\); Codex uses#Host mapping: Codex fresh-context dispatch uses#g' \
24
+ -e 's#`Agent` call#`spawn_agent` call#g' \
25
+ -e 's#Task breakdown#Work-item breakdown#g' \
26
+ -e 's#(^|[^A-Za-z0-9_])Task([^A-Za-z0-9_]|$)#\1spawn_agent\2#g' \
27
+ -e 's#dispatch `devrites-source-driven`#invoke `devrites-source-driven`#g' \
28
+ -e 's#Dispatch `devrites-source-driven`#Invoke `devrites-source-driven`#g' \
29
+ -e 's#pass-through dispatch to the matching `rite-<verb>` skill#pass-through invocation of the matching `rite-<verb>` skill#g' \
30
+ -e 's#verb dispatches to the matching `rite-<verb>` skill#verb invokes the matching `rite-<verb>` skill#g' \
31
+ -e 's#the dispatch map only#the invocation map only#g' \
32
+ -e 's#→ dispatch per the table above#→ invoke the matching skill per the table above#g' \
21
33
  -e 's#(^|[^A-Za-z0-9_./-])/(rite(-[a-z0-9-]+)?)([^A-Za-z0-9_-]|$)#\1$\2\4#g' \
22
34
  "$_src" > "$_out"
23
35
  }
@@ -26,11 +38,11 @@ gen_codex_skill_file() {
26
38
  _src="$1"; _out="$2"; _internal="${3:-0}"
27
39
  _tmp="$TMP_GEN_DIR/codex-skill-raw-$(basename "$(dirname "$_src")").md"
28
40
  mkdir -p "$(dirname "$_out")"
29
- # Internal (explicit-only) skills: replace the frontmatter description with a short stub in the
30
- # Codex mirror. Codex uses the description ONLY to build its 2% skills-list for implicit matching;
31
- # an explicit-only skill is never matched, so its full description is pure budget waste. Stubbing
32
- # the 12 internal skills frees that budget so the user-facing rite-* descriptions fit un-shortened
33
- # and keep matching reliably. Explicit `$name` invocation and the full SKILL.md body are untouched.
41
+ # Give the 12 internal skills a short description in the Codex mirror. Codex
42
+ # uses descriptions for its 2% implicit-matching budget, but these skills are
43
+ # invoked by name. Shorter internal descriptions leave that budget for the
44
+ # public rite-* skills. Keep explicit invocation and each SKILL.md body
45
+ # unchanged.
34
46
  awk -v internal="$_internal" '
35
47
  BEGIN { fm = 0; inserted = 0 }
36
48
  NR == 1 && $0 == "---" { print; fm = 1; next }
@@ -47,9 +59,13 @@ gen_codex_skill_file() {
47
59
  print ""
48
60
  print "- Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Read `.agents/skills/devrites-lib/reference/standards/core.md` before workflow work, then load the other `.agents/skills/devrites-lib/reference/standards/*.md` files exactly when this skill asks for them."
49
61
  print "- Use the installed `devrites-engine` binary as the canonical runtime helper surface for orientation, gates, and state mutation."
50
- print "- When this skill asks for a DevRites specialist or writer agent, **explicitly** spawn the matching Codex custom agent from `.codex/agents/devrites-*.toml` through Codex subagents (`spawn_agent`), then wait for its result and reconcile it as the skill instructs. Do not do the review inline just because the instruction to spawn is embedded here: Codex under-fires embedded spawn/skill instructions (openai/codex #23496), so treat the spawn as required, not optional."
51
- print "- The independence of a fresh-context subagent is the point. If Codex genuinely cannot spawn subagents in the current surface, run the documented inline fallback and **label the result an inline fallback, not an independent review**: an inline pass shares the calling context and is weaker evidence."
52
- print "- Codex project hooks are installed in `.codex/hooks.json`. Review and trust them with `/hooks` before relying on hook enforcement."
62
+ print "- **Invocation and dispatch are different:** invoke means run a skill in this context; dispatch means start a fresh agent with `spawn_agent`, await it, and reconcile its result. Never describe inline skill work as a dispatch."
63
+ print "- For every DevRites specialist or writer dispatch, first call `spawn_agent` with the named `devrites-<role>` custom role. The matching project contract is `.codex/agents/devrites-<role>.toml`."
64
+ print "- If `spawn_agent` is callable but a named read-only role is unavailable, use generic `explorer` only when the host proves that run has a runtime-enforced read-only sandbox. Tell it to read `.codex/agents/devrites-<role>.toml`, follow its `developer_instructions`, and execute the unchanged packet. A missing read-only custom role is not evidence that spawning is unavailable."
65
+ print "- Never dispatch generic `worker` for `devrites-slice-wright` unless the host proves that worker run carries exact DevRites identity and the same `.wright-allowlist` enforcement as the named role. Codex reports a generic run as `agent_type=worker`, so the generated global hooks cannot prove that binding. Reject that unsafe rung and use the documented labelled inline wright path with `.reconcile-inline` plus the full reconcile gate."
66
+ print "- If the host cannot prove the generic explorer is runtime read-only, reject that rung too. Only when no spawn primitive exists or a higher-priority policy rejects a safe spawn may the root run the documented discipline inline. Label it `independence: fallback`, never call it independent, and apply every fallback risk gate. An unbound generic wright or unconfined generic explorer is such a safety rejection, not evidence that no agents exist."
67
+ print "- Wait for every required fresh-context dispatch before reconciling or advancing. A backgrounded or lost result is incomplete."
68
+ print "- Codex project hooks are installed in `.codex/hooks.json`; declared-leaf hooks are scoped inside `.codex/agents/devrites-*.toml`. Review and trust them with `/hooks` before relying on hook enforcement."
53
69
  print "- When this skill asks a HITL question via `AskUserQuestion`: Codex'\''s equivalent (`request_user_input`) exists only in Plan mode. Outside Plan mode, render the option set as a plain numbered list in chat and **end the turn** so the human answers: NEVER silently pick an option yourself; auto-picking is AFK'\''s contract, gated by the `.devrites/AFK` sentinel."
54
70
  print ""
55
71
  fm = 0
@@ -62,7 +78,7 @@ gen_codex_skill_file() {
62
78
  print ""
63
79
  print "## Codex compatibility"
64
80
  print ""
65
- print "Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`, use matching `.codex/agents/devrites-*.toml` custom agents for DevRites subagent dispatch, and trust `.codex/hooks.json` with `/hooks` before relying on hooks."
81
+ print "Load DevRites engineering standards from `.agents/skills/devrites-lib/reference/standards/`. Invocation runs a skill inline; dispatch starts a fresh agent with `spawn_agent` and must be awaited. Try the named `devrites-<role>` first. A missing read-only role may fall back to generic `explorer` reading `.codex/agents/devrites-<role>.toml` only when the host proves runtime-enforced read-only sandboxing. Never use generic `worker` for the wright unless exact DevRites identity and `.wright-allowlist` enforcement are proven; Codex `agent_type=worker` does not prove them, so use the labelled inline `.reconcile-inline` path with full reconciliation. Other inline fallback requires spawning itself to be unavailable or a safe spawn to be rejected by higher-priority policy. Trust `.codex/hooks.json` and the inline hooks in `.codex/agents/devrites-*.toml` with `/hooks` before relying on hooks."
66
82
  }
67
83
  }
68
84
  ' "$_src" > "$_tmp"
@@ -73,6 +89,17 @@ toml_escape() {
73
89
  printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g'
74
90
  }
75
91
 
92
+ gen_codex_leaf_hook_toml() {
93
+ local _active_agent="$1" _required_var="$2" _subcommand="$3" _status="$4" _command
94
+ _command="cd \"\$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || { printf '%s\\n' 'DevRites: cannot resolve the project root for a declared Codex leaf. (devrites-codex-leaf-guard)' >&2; exit 2; }; DEVRITES_AGENT_RUN=1 DEVRITES_ACTIVE_AGENT=${_active_agent} ${_required_var}=1 devrites-engine hook ${_subcommand} --harness=codex; rc=\$?; case \"\$rc\" in 0) exit 0 ;; 2) exit 2 ;; *) printf '%s\\n' 'DevRites: declared Codex leaf guard unavailable or crashed; install or repair devrites-engine. (devrites-codex-leaf-guard)' >&2; exit 2 ;; esac"
95
+ printf '\n[[hooks.PreToolUse]]\n'
96
+ printf 'matcher = "Bash|Shell|sh|exec_command|run_command|Edit|Write|MultiEdit|NotebookEdit|apply_patch|exec|js|python|computer|computer_use|write_stdin|run_code|Agent|Task|spawn_agent|delegate|dispatch_agent|create_agent"\n\n'
97
+ printf '[[hooks.PreToolUse.hooks]]\n'
98
+ printf 'type = "command"\n'
99
+ printf "command = '''%s'''\n" "$_command"
100
+ printf 'statusMessage = "%s"\n' "$_status"
101
+ }
102
+
76
103
  # Generate a Codex custom-agent TOML file from a Claude Code markdown agent.
77
104
  # Codex does not consume .claude/agents/*.md directly; it loads project agents
78
105
  # from .codex/agents/*.toml.
@@ -106,6 +133,22 @@ gen_codex_agent() {
106
133
  gen_codex_markdown_file "$_body_tmp" "$_body_codex"
107
134
  cat "$_body_codex"
108
135
  printf "\n%s\n" "'''"
136
+ case "$_name" in
137
+ devrites-slice-wright)
138
+ gen_codex_leaf_hook_toml \
139
+ "$_name" \
140
+ "DEVRITES_WRIGHT_AGENT_REQUIRED" \
141
+ "wright-scope" \
142
+ "DevRites: checking slice-wright boundary"
143
+ ;;
144
+ *)
145
+ gen_codex_leaf_hook_toml \
146
+ "$_name" \
147
+ "DEVRITES_REVIEWER_AGENT_REQUIRED" \
148
+ "reviewer-readonly" \
149
+ "DevRites: checking reviewer read-only boundary"
150
+ ;;
151
+ esac
109
152
  } > "$_out"
110
153
  }
111
154
 
@@ -126,13 +169,16 @@ This project has DevRites installed for both Claude Code and Codex.
126
169
  - DevRites runtime helpers run through the installed `devrites-engine` binary.
127
170
  - Before using any DevRites workflow skill, read `.agents/skills/devrites-lib/reference/standards/core.md`. Load other `.agents/skills/devrites-lib/reference/standards/*.md` files when the skill or rule index asks for them. These are DevRites engineering standards, not Codex exec-policy `.rules` files.
128
171
  - Custom Codex subagents generated from the DevRites review agents live in `.codex/agents`.
129
- - When DevRites skill prose asks for a DevRites specialist or writer agent, use the matching Codex custom agent from `.codex/agents/devrites-*.toml` through Codex subagents. If Codex subagents are unavailable in the current surface, run the skill's documented inline fallback and say that the result was not an independent subagent review.
172
+ - In DevRites guidance, **invoke** means run a skill inline in the current context; **dispatch** means start a fresh agent with `spawn_agent`, wait for it, and reconcile its result.
173
+ - For a DevRites dispatch, first use the named `devrites-<role>` custom role. If a read-only role is unavailable but `spawn_agent` still works, use generic `explorer` only when the host proves runtime-enforced read-only sandboxing; tell it to read `.codex/agents/devrites-<role>.toml` before executing the unchanged packet.
174
+ - Do not use generic `worker` for the wright unless exact DevRites identity and `.wright-allowlist` enforcement are proven. Codex exposes that fallback as `agent_type=worker`, which the generated leaf hooks intentionally do not treat as a declared DevRites run. Reject the unsafe worker rung and use the documented labelled inline `.reconcile-inline` path with full reconciliation.
175
+ - Other inline work is allowed only when no spawn primitive exists or higher-priority policy rejects a safe spawn; label it `independence: fallback`, never independent. A missing read-only custom role alone is not such a rejection, but an unconfined generic explorer is.
130
176
  - Claude Code agent hook metadata is not active in Codex. The generated Codex agents preserve read-only intent with Codex sandbox settings where possible; still follow DevRites' scope and no-mutation rules explicitly.
131
177
 
132
178
  ## Workflow contract
133
179
 
134
180
  - Keep all feature state in `.devrites/work/<slug>/` and preserve `.devrites/ACTIVE`.
135
- - Follow the DevRites lifecycle: frame -> spec -> temper -> define -> plan -> vet -> build -> converge -> prove -> polish -> review -> seal -> ship -> done.
181
+ - Follow the DevRites lifecycle: frame -> spec -> clarify -> temper -> define -> plan -> vet -> build -> converge -> prove -> polish -> review -> seal -> ship -> done.
136
182
  - Claims of completion need recorded evidence in the feature workspace, not confidence alone.
137
183
  <!-- END DEVRITES CODEX -->
138
184
  EOF
@@ -145,18 +191,13 @@ gen_codex_hooks_json() {
145
191
  "hooks": {
146
192
  "PreToolUse": [
147
193
  {
148
- "matcher": "Bash",
194
+ "matcher": "Bash|Shell|sh|exec_command|run_command",
149
195
  "hooks": [
150
196
  {
151
197
  "type": "command",
152
- "command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec env DEVRITES_REVIEWER_AGENT_REQUIRED=1 devrites-engine hook reviewer-readonly --harness=codex",
153
- "statusMessage": "DevRites: checking reviewer read-only boundary"
154
- }
155
- ]
156
- },
157
- {
158
- "matcher": "Bash",
159
- "hooks": [
198
+ "command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec devrites-engine hook git-guard --harness=codex",
199
+ "statusMessage": "DevRites: checking destructive Git authority"
200
+ },
160
201
  {
161
202
  "type": "command",
162
203
  "command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec devrites-engine hook allow --harness=codex",
@@ -171,11 +212,6 @@ gen_codex_hooks_json() {
171
212
  "type": "command",
172
213
  "command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec devrites-engine hook a1-guard --harness=codex",
173
214
  "statusMessage": "DevRites: checking build write boundary"
174
- },
175
- {
176
- "type": "command",
177
- "command": "command -v devrites-engine >/dev/null 2>&1 || exit 0; cd \"$(git rev-parse --show-toplevel 2>/dev/null || pwd)\" 2>/dev/null || exit 0; exec env DEVRITES_WRIGHT_AGENT_REQUIRED=1 devrites-engine hook wright-scope --harness=codex",
178
- "statusMessage": "DevRites: checking slice file scope"
179
215
  }
180
216
  ]
181
217
  }
@@ -293,8 +329,8 @@ gen_codex_hooks_json() {
293
329
  }
294
330
  }
295
331
  EOF
296
- # NOTE: no SessionEnd entry: Codex does not emit a SessionEnd hook event (its lifecycle events
297
- # are SessionStart/SubagentStart/PreToolUse/PermissionRequest/PostToolUse/PreCompact/PostCompact/
298
- # UserPromptSubmit/SubagentStop/Stop). The `hook event session-end` trace is Claude-only; re-add
299
- # here if Codex ever ships the event.
332
+ # Codex has no SessionEnd hook event. Its lifecycle events are
333
+ # SessionStart/SubagentStart/PreToolUse/PermissionRequest/PostToolUse/PreCompact/
334
+ # PostCompact/UserPromptSubmit/SubagentStop/Stop. The `hook event session-end`
335
+ # trace remains Claude-only until Codex adds that event.
300
336
  }
@@ -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
+ }