devrites 3.2.2 → 3.2.3

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 (196) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/README.md +1 -1
  3. package/docs/architecture.md +6 -2
  4. package/docs/command-map.md +3 -3
  5. package/docs/engine/agent-contract.md +3 -2
  6. package/docs/harness-compliance.md +2 -2
  7. package/docs/orchestration.md +15 -12
  8. package/docs/porting-to-a-new-harness.md +2 -1
  9. package/docs/skills.md +7 -2
  10. package/engine/hooks.go +39 -4
  11. package/engine/hooks_agent_dispatch.go +1193 -0
  12. package/engine/hooks_workspace.go +78 -10
  13. package/engine/internal/forge/forge.go +0 -2
  14. package/engine/internal/harness/compliance.go +1 -1
  15. package/engine/internal/harness/harness.go +3 -0
  16. package/engine/internal/lib/doubtcoverage.go +2 -12
  17. package/engine/internal/lib/reconcile.go +4 -29
  18. package/engine/internal/lib/reconcile_test.go +14 -10
  19. package/engine/main.go +4 -1
  20. package/engine/tests/hook_test.go +874 -1
  21. package/engine/tests/lib_parity_test.go +5 -17
  22. package/engine/tests/parity_reconcile_test.go +1 -1
  23. package/engine/tests/parity_test.go +2 -6
  24. package/pack/.claude/skills/devrites-api-interface/SKILL.md +1 -0
  25. package/pack/.claude/skills/devrites-audit/SKILL.md +5 -6
  26. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +1 -0
  27. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +1 -0
  28. package/pack/.claude/skills/devrites-doubt/SKILL.md +2 -1
  29. package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +1 -0
  30. package/pack/.claude/skills/devrites-interview/SKILL.md +1 -0
  31. package/pack/.claude/skills/devrites-lib/SKILL.md +1 -0
  32. package/pack/.claude/skills/devrites-lib/reference/model-tiers.md +4 -3
  33. package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -5
  34. package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +14 -8
  35. package/pack/.claude/skills/devrites-prose-craft/SKILL.md +1 -0
  36. package/pack/.claude/skills/devrites-refresh-indexes/SKILL.md +1 -0
  37. package/pack/.claude/skills/devrites-source-driven/SKILL.md +1 -0
  38. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +1 -0
  39. package/pack/.claude/skills/rite/SKILL.md +1 -0
  40. package/pack/.claude/skills/rite-adopt/SKILL.md +1 -0
  41. package/pack/.claude/skills/rite-autocomplete/SKILL.md +1 -0
  42. package/pack/.claude/skills/rite-build/SKILL.md +2 -1
  43. package/pack/.claude/skills/rite-build/reference/phase-contract.md +3 -4
  44. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +11 -12
  45. package/pack/.claude/skills/rite-clarify/SKILL.md +1 -0
  46. package/pack/.claude/skills/rite-converge/SKILL.md +1 -0
  47. package/pack/.claude/skills/rite-customize/SKILL.md +1 -0
  48. package/pack/.claude/skills/rite-define/SKILL.md +1 -0
  49. package/pack/.claude/skills/rite-doctor/SKILL.md +1 -0
  50. package/pack/.claude/skills/rite-dogfood/SKILL.md +1 -0
  51. package/pack/.claude/skills/rite-explain/SKILL.md +4 -2
  52. package/pack/.claude/skills/rite-frame/SKILL.md +1 -0
  53. package/pack/.claude/skills/rite-handoff/SKILL.md +1 -0
  54. package/pack/.claude/skills/rite-learn/SKILL.md +1 -0
  55. package/pack/.claude/skills/rite-plan/SKILL.md +1 -0
  56. package/pack/.claude/skills/rite-polish/SKILL.md +1 -0
  57. package/pack/.claude/skills/rite-pov/SKILL.md +1 -0
  58. package/pack/.claude/skills/rite-pr-feedback/SKILL.md +1 -0
  59. package/pack/.claude/skills/rite-pressure-test/SKILL.md +1 -0
  60. package/pack/.claude/skills/rite-prototype/SKILL.md +1 -0
  61. package/pack/.claude/skills/rite-prove/SKILL.md +1 -0
  62. package/pack/.claude/skills/rite-quick/SKILL.md +1 -0
  63. package/pack/.claude/skills/rite-resolve/SKILL.md +1 -0
  64. package/pack/.claude/skills/rite-review/SKILL.md +1 -0
  65. package/pack/.claude/skills/rite-seal/SKILL.md +1 -0
  66. package/pack/.claude/skills/rite-seal/reference/phase-contract.md +2 -3
  67. package/pack/.claude/skills/rite-seal/reference/risk-and-rollback.md +10 -12
  68. package/pack/.claude/skills/rite-ship/SKILL.md +1 -0
  69. package/pack/.claude/skills/rite-spec/SKILL.md +1 -0
  70. package/pack/.claude/skills/rite-status/SKILL.md +1 -0
  71. package/pack/.claude/skills/rite-temper/SKILL.md +3 -2
  72. package/pack/.claude/skills/rite-upgrade/SKILL.md +3 -1
  73. package/pack/.claude/skills/rite-vet/SKILL.md +1 -0
  74. package/pack/.claude/skills/rite-zoom-out/SKILL.md +1 -0
  75. package/pack/generated/claude/skills/devrites-api-interface/SKILL.md +1 -0
  76. package/pack/generated/claude/skills/devrites-audit/SKILL.md +5 -6
  77. package/pack/generated/claude/skills/devrites-browser-proof/SKILL.md +1 -0
  78. package/pack/generated/claude/skills/devrites-debug-recovery/SKILL.md +1 -0
  79. package/pack/generated/claude/skills/devrites-doubt/SKILL.md +2 -1
  80. package/pack/generated/claude/skills/devrites-frontend-craft/SKILL.md +1 -0
  81. package/pack/generated/claude/skills/devrites-interview/SKILL.md +1 -0
  82. package/pack/generated/claude/skills/devrites-lib/SKILL.md +1 -0
  83. package/pack/generated/claude/skills/devrites-lib/reference/model-tiers.md +4 -3
  84. package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -5
  85. package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +14 -8
  86. package/pack/generated/claude/skills/devrites-prose-craft/SKILL.md +1 -0
  87. package/pack/generated/claude/skills/devrites-refresh-indexes/SKILL.md +1 -0
  88. package/pack/generated/claude/skills/devrites-source-driven/SKILL.md +1 -0
  89. package/pack/generated/claude/skills/devrites-ux-shape/SKILL.md +1 -0
  90. package/pack/generated/claude/skills/rite/SKILL.md +1 -0
  91. package/pack/generated/claude/skills/rite-adopt/SKILL.md +1 -0
  92. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +1 -0
  93. package/pack/generated/claude/skills/rite-build/SKILL.md +2 -1
  94. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +3 -4
  95. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +11 -12
  96. package/pack/generated/claude/skills/rite-clarify/SKILL.md +1 -0
  97. package/pack/generated/claude/skills/rite-converge/SKILL.md +1 -0
  98. package/pack/generated/claude/skills/rite-customize/SKILL.md +1 -0
  99. package/pack/generated/claude/skills/rite-define/SKILL.md +1 -0
  100. package/pack/generated/claude/skills/rite-doctor/SKILL.md +1 -0
  101. package/pack/generated/claude/skills/rite-dogfood/SKILL.md +1 -0
  102. package/pack/generated/claude/skills/rite-explain/SKILL.md +4 -2
  103. package/pack/generated/claude/skills/rite-frame/SKILL.md +1 -0
  104. package/pack/generated/claude/skills/rite-handoff/SKILL.md +1 -0
  105. package/pack/generated/claude/skills/rite-learn/SKILL.md +1 -0
  106. package/pack/generated/claude/skills/rite-plan/SKILL.md +1 -0
  107. package/pack/generated/claude/skills/rite-polish/SKILL.md +1 -0
  108. package/pack/generated/claude/skills/rite-pov/SKILL.md +1 -0
  109. package/pack/generated/claude/skills/rite-pr-feedback/SKILL.md +1 -0
  110. package/pack/generated/claude/skills/rite-pressure-test/SKILL.md +1 -0
  111. package/pack/generated/claude/skills/rite-prototype/SKILL.md +1 -0
  112. package/pack/generated/claude/skills/rite-prove/SKILL.md +1 -0
  113. package/pack/generated/claude/skills/rite-quick/SKILL.md +1 -0
  114. package/pack/generated/claude/skills/rite-resolve/SKILL.md +1 -0
  115. package/pack/generated/claude/skills/rite-review/SKILL.md +1 -0
  116. package/pack/generated/claude/skills/rite-seal/SKILL.md +1 -0
  117. package/pack/generated/claude/skills/rite-seal/reference/phase-contract.md +2 -3
  118. package/pack/generated/claude/skills/rite-seal/reference/risk-and-rollback.md +10 -12
  119. package/pack/generated/claude/skills/rite-ship/SKILL.md +1 -0
  120. package/pack/generated/claude/skills/rite-spec/SKILL.md +1 -0
  121. package/pack/generated/claude/skills/rite-status/SKILL.md +1 -0
  122. package/pack/generated/claude/skills/rite-temper/SKILL.md +3 -2
  123. package/pack/generated/claude/skills/rite-upgrade/SKILL.md +3 -1
  124. package/pack/generated/claude/skills/rite-vet/SKILL.md +1 -0
  125. package/pack/generated/claude/skills/rite-zoom-out/SKILL.md +1 -0
  126. package/pack/generated/codex/AGENTS.md +2 -4
  127. package/pack/generated/codex/hooks.json +24 -5
  128. package/pack/generated/codex/skills/devrites-api-interface/SKILL.md +6 -4
  129. package/pack/generated/codex/skills/devrites-audit/SKILL.md +10 -10
  130. package/pack/generated/codex/skills/devrites-browser-proof/SKILL.md +6 -4
  131. package/pack/generated/codex/skills/devrites-debug-recovery/SKILL.md +6 -4
  132. package/pack/generated/codex/skills/devrites-doubt/SKILL.md +7 -5
  133. package/pack/generated/codex/skills/devrites-frontend-craft/SKILL.md +6 -4
  134. package/pack/generated/codex/skills/devrites-interview/SKILL.md +6 -4
  135. package/pack/generated/codex/skills/devrites-lib/SKILL.md +6 -4
  136. package/pack/generated/codex/skills/devrites-lib/reference/model-tiers.md +4 -3
  137. package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +4 -5
  138. package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +14 -8
  139. package/pack/generated/codex/skills/devrites-prose-craft/SKILL.md +6 -4
  140. package/pack/generated/codex/skills/devrites-refresh-indexes/SKILL.md +6 -4
  141. package/pack/generated/codex/skills/devrites-source-driven/SKILL.md +6 -4
  142. package/pack/generated/codex/skills/devrites-ux-shape/SKILL.md +6 -4
  143. package/pack/generated/codex/skills/rite/SKILL.md +6 -4
  144. package/pack/generated/codex/skills/rite-adopt/SKILL.md +6 -4
  145. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +6 -4
  146. package/pack/generated/codex/skills/rite-build/SKILL.md +7 -5
  147. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +3 -4
  148. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +11 -12
  149. package/pack/generated/codex/skills/rite-clarify/SKILL.md +6 -4
  150. package/pack/generated/codex/skills/rite-converge/SKILL.md +6 -4
  151. package/pack/generated/codex/skills/rite-customize/SKILL.md +6 -4
  152. package/pack/generated/codex/skills/rite-define/SKILL.md +6 -4
  153. package/pack/generated/codex/skills/rite-doctor/SKILL.md +6 -4
  154. package/pack/generated/codex/skills/rite-dogfood/SKILL.md +6 -4
  155. package/pack/generated/codex/skills/rite-explain/SKILL.md +9 -6
  156. package/pack/generated/codex/skills/rite-frame/SKILL.md +6 -4
  157. package/pack/generated/codex/skills/rite-handoff/SKILL.md +6 -4
  158. package/pack/generated/codex/skills/rite-learn/SKILL.md +6 -4
  159. package/pack/generated/codex/skills/rite-plan/SKILL.md +6 -4
  160. package/pack/generated/codex/skills/rite-polish/SKILL.md +6 -4
  161. package/pack/generated/codex/skills/rite-pov/SKILL.md +6 -4
  162. package/pack/generated/codex/skills/rite-pr-feedback/SKILL.md +6 -4
  163. package/pack/generated/codex/skills/rite-pressure-test/SKILL.md +6 -4
  164. package/pack/generated/codex/skills/rite-prototype/SKILL.md +6 -4
  165. package/pack/generated/codex/skills/rite-prove/SKILL.md +6 -4
  166. package/pack/generated/codex/skills/rite-quick/SKILL.md +6 -4
  167. package/pack/generated/codex/skills/rite-resolve/SKILL.md +6 -4
  168. package/pack/generated/codex/skills/rite-review/SKILL.md +6 -4
  169. package/pack/generated/codex/skills/rite-seal/SKILL.md +6 -4
  170. package/pack/generated/codex/skills/rite-seal/reference/phase-contract.md +2 -3
  171. package/pack/generated/codex/skills/rite-seal/reference/risk-and-rollback.md +10 -12
  172. package/pack/generated/codex/skills/rite-ship/SKILL.md +6 -4
  173. package/pack/generated/codex/skills/rite-spec/SKILL.md +6 -4
  174. package/pack/generated/codex/skills/rite-status/SKILL.md +6 -4
  175. package/pack/generated/codex/skills/rite-temper/SKILL.md +8 -6
  176. package/pack/generated/codex/skills/rite-upgrade/SKILL.md +8 -5
  177. package/pack/generated/codex/skills/rite-vet/SKILL.md +6 -4
  178. package/pack/generated/codex/skills/rite-zoom-out/SKILL.md +6 -4
  179. package/package.json +1 -1
  180. package/scripts/codex-generate.sh +32 -18
  181. package/scripts/live-hosts/agent-result.schema.json +2 -1
  182. package/scripts/live-hosts/claude.sh +2 -2
  183. package/scripts/live-hosts/codex.sh +4 -0
  184. package/scripts/live-hosts/fake-host.py +1 -8
  185. package/scripts/live-hosts/host-transport.py +1 -2
  186. package/scripts/run-agent-contract-evals.py +3 -3
  187. package/scripts/run-evals.sh +3 -34
  188. package/scripts/validate-frontmatter.py +34 -1
  189. package/engine/testdata/golden/TestParityA1Guard/inline-fallback-silent.golden +0 -1
  190. package/engine/testdata/golden/TestParityDoubtCoverage/arg=inline.golden +0 -3
  191. package/engine/testdata/golden/TestParityDoubtCoverage/arg=missing-inline.golden +0 -3
  192. package/scripts/eval-runner.py +0 -275
  193. package/scripts/eval-scorer.mjs +0 -46
  194. package/scripts/render-eval-summary.py +0 -48
  195. /package/engine/testdata/golden/TestParityReconcile/{inline-fallback → close-window}/snapshot.golden +0 -0
  196. /package/engine/testdata/golden/TestParityReconcile/{inline-fallback.golden → close-window.golden} +0 -0
@@ -653,8 +653,8 @@ func TestCoverageGolden(t *testing.T) {
653
653
  // ---- doubt-coverage -------------------------------------------------------
654
654
  //
655
655
  // Golden: the decisions.md `doubt: MISSING` short-circuit (checked first), the
656
- // inline-build branch, the no-log pass, the wright/doubt count line, and the
657
- // 0/1/2/3 exit taxonomy are checked against golden snapshots.
656
+ // no-log pass, the wright/doubt count line, and the 0/1/2/3 exit taxonomy are
657
+ // checked against golden snapshots.
658
658
 
659
659
  func TestParityDoubtCoverage(t *testing.T) {
660
660
  work := t.TempDir()
@@ -664,15 +664,7 @@ func TestParityDoubtCoverage(t *testing.T) {
664
664
  "## Decisions stood\n- use flock — doubt: MISSING\n")
665
665
  writeFeatureFile(t, work, "missing", "footprint.log", "1000 wright 01\n")
666
666
 
667
- // MISSING is checked BEFORE the inline marker still exit 3.
668
- writeFeatureFile(t, work, "missing-inline", "decisions.md", "- x — doubt: MISSING\n")
669
- writeFeatureFile(t, work, "missing-inline", ".reconcile-inline", "")
670
-
671
- // inline build, no MISSING → exit 0.
672
- writeFeatureFile(t, work, "inline", ".reconcile-inline", "")
673
- writeFeatureFile(t, work, "inline", "decisions.md", "## Decisions stood\n- x — doubt: yes\n")
674
-
675
- // dir exists, no log / dec / marker → "no footprint log" pass.
667
+ // dir exists, no log / decisions"no footprint log" pass.
676
668
  makeFeatureDir(t, work, "nolog")
677
669
 
678
670
  // wright dispatch(es), zero doubt → exit 1.
@@ -687,7 +679,7 @@ func TestParityDoubtCoverage(t *testing.T) {
687
679
  "1000 reviewer code-reviewer\n1000 doubt d1\n")
688
680
 
689
681
  for _, arg := range []string{
690
- "missing", "missing-inline", "inline", "nolog",
682
+ "missing", "nolog",
691
683
  "nodoubt", "doubted", "nowright",
692
684
  "ghost", // no workspace at all → "no footprint log" pass
693
685
  } {
@@ -708,13 +700,12 @@ func TestParityDoubtCoverage(t *testing.T) {
708
700
  }
709
701
 
710
702
  // TestDoubtCoverageGolden asserts each verdict's exact stdout inline: the
711
- // SKIPPED / inline / no-log messages and the "no doubt ran" prompt.
703
+ // SKIPPED / no-log messages and the "no doubt ran" prompt.
712
704
  func TestDoubtCoverageGolden(t *testing.T) {
713
705
  work := t.TempDir()
714
706
  const base = ".devrites/features/"
715
707
 
716
708
  writeFile(t, work, base+"miss/decisions.md", "- x — doubt: MISSING\n")
717
- writeFile(t, work, base+"in/.reconcile-inline", "")
718
709
  mkdirAllT(t, work, base+"empty")
719
710
  writeFile(t, work, base+"nd/footprint.log", "1000 wright 01\n1000 wright 02\n")
720
711
  writeFile(t, work, base+"ok/footprint.log", "1000 wright 01\n1000 doubt d1\n")
@@ -723,9 +714,6 @@ func TestDoubtCoverageGolden(t *testing.T) {
723
714
  {"skipped", []string{"doubt-coverage", "miss"},
724
715
  "doubt-coverage: SKIPPED: a '## Decisions stood' entry in decisions.md has doubt: MISSING.\n" +
725
716
  "A decision was stood and recorded but never doubted. Re-dispatch doubt or escalate.\n", 3},
726
- {"inline", []string{"doubt-coverage", "in"},
727
- "doubt-coverage: inline build (.reconcile-inline): footprint heuristic n/a; no MISSING\n" +
728
- "verdict recorded. Verify by hand that each stood decision carries a devrites-doubt verdict.\n", 0},
729
717
  {"no-log", []string{"doubt-coverage", "empty"},
730
718
  "doubt-coverage: no footprint log: nothing to assess (pass)\n", 0},
731
719
  {"no-doubt-ran", []string{"doubt-coverage", "nd"},
@@ -68,7 +68,7 @@ func TestParityReconcile(t *testing.T) {
68
68
  assertGolden(t, out, code)
69
69
  })
70
70
 
71
- t.Run("inline-fallback", func(t *testing.T) {
71
+ t.Run("close-window", func(t *testing.T) {
72
72
  work := newRepo(t)
73
73
  snapshot(t, work)
74
74
  out, code := runArgv(t, work, libRootEnv(work), "", binPath, "reconcile", "close", "feat")
@@ -269,15 +269,12 @@ func TestParityRedwatch(t *testing.T) {
269
269
 
270
270
  // TestParityA1Guard checks `hook a1-guard` against golden snapshots for each
271
271
  // payload. It blocks a main-thread source edit only when the build window is open
272
- // and enforce is on, and allows subagent edits, .devrites bookkeeping edits, an
273
- // inline-fallback window, and a closed window.
272
+ // and enforce is on, and allows subagent edits, .devrites bookkeeping edits, and
273
+ // a closed window.
274
274
  func TestParityA1Guard(t *testing.T) {
275
275
  work := t.TempDir()
276
276
  makeFeatureDir(t, work, "win")
277
277
  writeFeatureFile(t, work, "win", ".reconcile-base", "snapshot\n")
278
- makeFeatureDir(t, work, "inline")
279
- writeFeatureFile(t, work, "inline", ".reconcile-base", "snapshot\n")
280
- writeFeatureFile(t, work, "inline", ".reconcile-inline", "")
281
278
  makeFeatureDir(t, work, "nowin") // no .reconcile-base → window closed
282
279
 
283
280
  enforce := []string{"DEVRITES_A1_HOOK=enforce"}
@@ -291,7 +288,6 @@ func TestParityA1Guard(t *testing.T) {
291
288
  {"devrites-edit-allowed", "win", enforce, `{"tool_name":"Edit","tool_input":{"file_path":".devrites/features/win/state.md"}}`},
292
289
  {"non-edit-tool", "win", enforce, `{"tool_name":"Bash","tool_input":{"command":"ls"}}`},
293
290
  {"observe-mode-silent", "win", nil, `{"tool_name":"Edit","tool_input":{"file_path":"src/app.js"}}`},
294
- {"inline-fallback-silent", "inline", enforce, `{"tool_name":"Edit","tool_input":{"file_path":"src/app.js"}}`},
295
291
  {"no-window-silent", "nowin", enforce, `{"tool_name":"Edit","tool_input":{"file_path":"src/app.js"}}`},
296
292
  } {
297
293
  tc := tc
@@ -2,6 +2,7 @@
2
2
  name: devrites-api-interface
3
3
  description: Design stable API/interface contracts before implementation: REST/GraphQL endpoints, module boundaries, type contracts, FE/BE splits. Use when the user says "design the API" or a slice crosses a boundary. Not for helpers.
4
4
  user-invocable: false
5
+ required-agent-roles: none
5
6
  ---
6
7
 
7
8
  # devrites-api-interface: contract before implementation
@@ -3,6 +3,7 @@ name: devrites-audit
3
3
  description: Read-only feature audit on security/perf/simplify: auth trust boundary, injection, secrets, hot-path, payload-size, perf budget, Chesterton delete/cleanup. Use when auditing one axis. Not for writes.
4
4
  argument-hint: "<security | perf | simplify>"
5
5
  user-invocable: false
6
+ required-agent-roles: none
6
7
  ---
7
8
 
8
9
  # devrites-audit: read-only audit dispatch
@@ -39,14 +40,12 @@ no cross-pollination and the shared maximum of three concurrent read-only roles.
39
40
 
40
41
  ## Fallback and scope
41
42
 
42
- Use the capability ladder; inline is allowed only when no safe fresh-context rung
43
- preserves the role's read-only boundary or policy rejects it, and must say
44
- `independence: fallback`. Use these role contracts:
43
+ Use the capability ladder. If no safe fresh-context rung preserves the role's
44
+ read-only boundary, stop for HITL. Use these role contracts:
45
45
 
46
46
  - `.claude/agents/devrites-security-auditor.md`
47
47
  - `.claude/agents/devrites-performance-reviewer.md`
48
48
  - `.claude/agents/devrites-simplifier-reviewer.md`
49
49
 
50
- Seal weights that fallback under
51
- [`risk-and-rollback.md`](../rite-seal/reference/risk-and-rollback.md). Stay inside the
52
- active feature. Critical findings block seal; simplification never changes behavior.
50
+ Stay inside the active feature. Critical findings block seal; simplification never
51
+ changes behavior.
@@ -2,6 +2,7 @@
2
2
  name: devrites-browser-proof
3
3
  description: Observe and prove working UI behavior in a real browser with screenshots, interactions, network evidence, and Core Web Vitals. Use for browser proof or performance after the page works.
4
4
  user-invocable: false
5
+ required-agent-roles: none
5
6
  ---
6
7
 
7
8
  # devrites-browser-proof: runtime evidence for UI
@@ -2,6 +2,7 @@
2
2
  name: devrites-debug-recovery
3
3
  description: Debug application failures: tests, builds, CI, runtime exceptions, browser errors, app 500s. Reproduce, rank hypotheses, fix root cause, regression-test. Use when "debug", "build is red", "tests fail", or the app is broken. Not for DevRites install health.
4
4
  user-invocable: false
5
+ required-agent-roles: none
5
6
  ---
6
7
 
7
8
  # devrites-debug-recovery: fix the root cause, not the symptom
@@ -2,6 +2,7 @@
2
2
  name: devrites-doubt
3
3
  description: Stress-test one non-trivial decision with an adversarial independent take. Use when the user says "are we sure", "double-check", "what could go wrong", or before boundary/data/auth/API/migration choices. Not for trivial choices.
4
4
  user-invocable: false
5
+ required-agent-roles: devrites-doubt-reviewer
5
6
  ---
6
7
 
7
8
  # devrites-doubt: CLAIM → EXTRACT → DOUBT → RECONCILE → STOP
@@ -22,7 +23,7 @@ code · claiming "this is safe", "this scales", or "this matches the spec".
22
23
  `agent-packet/v1` and the adversarial objective *"find what's wrong; do not
23
24
  validate."* Follow
24
25
  [`agents.md`](../devrites-lib/reference/standards/agents.md). Inline does not satisfy
25
- independence; it is a labeled fallback only at the final capability-ladder rung.
26
+ independence; if no fresh-agent rung is available, stop for HITL.
26
27
  - [ ] **4. RECONCILE**: classify EVERY finding: contract misread | valid & actionable |
27
28
  valid trade-off | noise. **Doubt-theater check:** if two or more cycles find substantive
28
29
  issues but classify **zero** as actionable, the review is too agreeable. Sharpen the
@@ -2,6 +2,7 @@
2
2
  name: devrites-frontend-craft
3
3
  description: Implement frontend at senior designer-engineer quality: every state covered, anti-AI-slop, WCAG 2.2 AA. Use when the user says "build the UI", "design system", "a11y", or `/rite-build` detects UI. Not for polishing a built feature or design exploration.
4
4
  user-invocable: false
5
+ required-agent-roles: none
5
6
  ---
6
7
 
7
8
  # devrites-frontend-craft: UI like a senior designer-engineer
@@ -2,6 +2,7 @@
2
2
  name: devrites-interview
3
3
  description: Interview the user one question at a time to extract intent. Use when the user says "interview me", "I am not sure what I want", or the ask is underspecified. Not for casual clarification.
4
4
  user-invocable: false
5
+ required-agent-roles: none
5
6
  ---
6
7
 
7
8
  # devrites-interview: extract intent
@@ -3,6 +3,7 @@ name: devrites-lib
3
3
  description: Internal shared DevRites helper library. Documents cross-cutting engine commands and references; not a user workflow. Do not invoke directly.
4
4
  user-invocable: false
5
5
  disable-model-invocation: true
6
+ required-agent-roles: none
6
7
  ---
7
8
 
8
9
  # devrites-lib: internal shared helpers (not a command)
@@ -21,13 +21,14 @@ one to a reviewer to save cost. The tier a scout runs on is where savings are sa
21
21
  ## The degradation rule
22
22
 
23
23
  Tiers are an optimization, never a correctness dependency. A skill written against tiers must run
24
- correctly on a harness that cannot select models per agent, or has no subagent primitive at all:
24
+ correctly on a harness that cannot select models per agent:
25
25
 
26
26
  1. **Per-agent model override unavailable** → dispatch the scout on the **inherited** model and
27
27
  keep its **read budget and output cap**. The cost control falls back to structure, not model
28
28
  choice. This is why every scout dispatch also carries an explicit read budget.
29
- 2. **No subagent primitive at all** → run the scout work **inline** in the orchestrator, with the
30
- same budgets. The tier still tells you how much to spend, even with nothing to dispatch to.
29
+ 2. **No safe fresh-agent rung** → stop for HITL when the scout is required, or record the
30
+ explicitly optional scout as skipped. Never relabel root-context work as independent
31
+ specialist dispatch.
31
32
 
32
33
  A skill that only works when it can pick a cheap model is broken. The tier names the *intent*; the
33
34
  budget enforces it regardless of what the harness can do.
@@ -91,9 +91,8 @@ devrites-engine footprint roster <slug>
91
91
  ```
92
92
 
93
93
  `roster` rc=3 means an unaccounted reviewer: dispatch or record why it does not apply.
94
- rc=1 means an always-on skip; this is valid only for an unchanged-candidate carry-forward
95
- or the explicit independence fallback in
96
- [`../../rite-seal/reference/risk-and-rollback.md`](../../rite-seal/reference/risk-and-rollback.md).
94
+ rc=1 means an always-on skip; this is valid only for an unchanged-candidate
95
+ carry-forward. A required reviewer that cannot be dispatched blocks the phase.
97
96
 
98
97
  ## Reconciliation
99
98
 
@@ -106,5 +105,5 @@ or the explicit independence fallback in
106
105
  6. Apply the caller's gate; do not invent a composite score.
107
106
 
108
107
  Every panel reviewer runs at the ceiling or inherited tier. If the named role is
109
- unavailable, use the universal ladder. Record an inline fallback as non-independent
110
- under the seal risk rule, never as a fresh-context pass.
108
+ unavailable, use the universal ladder. If no fresh-agent rung is available, stop for
109
+ HITL; never execute the reviewer in the root context.
@@ -50,7 +50,7 @@ review fan-out. Phase skills own their phase-locked role choice.
50
50
 
51
51
  ## Fresh-context dispatch ladder
52
52
 
53
- Use the first available rung; capability failure never changes the contract:
53
+ Use the first safe rung:
54
54
 
55
55
  1. Dispatch the named custom role with the host's spawn primitive.
56
56
  2. If spawning works but that role is unavailable, use a generic fresh agent only when
@@ -59,13 +59,19 @@ Use the first available rung; capability failure never changes the contract:
59
59
  allowlist (or an isolated/staged checkout) for a `worker`. Tell it to read the
60
60
  generated role contract, then give it the same packet. An instruction-only shared-tree
61
61
  writer is not an available rung.
62
- 3. When no safe fresh-context rung exists or policy rejects spawning, run the discipline
63
- inline under the same budgets and label it `independence: fallback`. It is not an
64
- independent review; seal applies
65
- [`risk-and-rollback.md`](../../../rite-seal/reference/risk-and-rollback.md).
66
-
67
- Host mapping: Claude Code uses `Agent` (`Task` is its legacy alias); Codex uses
68
- `spawn_agent`. Use the host-neutral term **fresh-context dispatch** in shared guidance.
62
+ 3. Otherwise stop for HITL; specialist work never runs in the root context.
63
+
64
+ Every canonical skill declares `required-agent-roles` in its frontmatter. Use `none`
65
+ when no fresh agent is unconditionally required for that invocation. Codex reads this
66
+ field from the installed skill at `UserPromptSubmit` and arms a fail-closed completion
67
+ receipt for every listed role; the engine derives roles from skill metadata.
68
+ Conditional scouts and reviewers remain owned by their explicit phase triggers.
69
+
70
+ Claude uses `Agent` (`Task` alias); Codex uses `spawn_agent`. V2 sends the exact named
71
+ role, a unique `task_name`, and `fork_turns="none"`; Codex loads its TOML natively.
72
+ Because V2 lifecycle calls bypass hooks, Stop/reconcile verify the durable rollout's
73
+ role, instructions, wait, completion, and delivered result. V1 uses guarded
74
+ `explorer`/`worker` with injected rules and a lifecycle receipt. Prose isn't evidence.
69
75
 
70
76
  ## File-backed dispatch contract
71
77
 
@@ -2,6 +2,7 @@
2
2
  name: devrites-prose-craft
3
3
  description: Humanize prose without losing technical content. Use when asked to remove AI-writing tells, match a writing sample or project voice, edit artifacts/replies/commit or PR prose, or run `/rite-polish`'s prose pass. Not for code comments or UI craft.
4
4
  user-invocable: false
5
+ required-agent-roles: none
5
6
  ---
6
7
 
7
8
  # devrites-prose-craft: prose that reads human
@@ -2,6 +2,7 @@
2
2
  name: devrites-refresh-indexes
3
3
  description: Refresh stale optional indexes. Use when structural lookup disagrees with live code or rite-doctor requests a synchronous reindex.
4
4
  user-invocable: false
5
+ required-agent-roles: none
5
6
  ---
6
7
 
7
8
  # devrites-refresh-indexes: keep the code-intelligence indexes fresh
@@ -2,6 +2,7 @@
2
2
  name: devrites-source-driven
3
3
  description: Verify uncertain framework/library behavior against official docs or installed source before relying on it. Use when the user says "check the docs", "verify this assumption", or hits an unfamiliar API. Not for internal code.
4
4
  user-invocable: false
5
+ required-agent-roles: devrites-evidence-scout
5
6
  ---
6
7
 
7
8
  # devrites-source-driven: verify, don't guess
@@ -2,6 +2,7 @@
2
2
  name: devrites-ux-shape
3
3
  description: Plan UX/UI before code: design direction, design brief, visual direction, key states, interaction model for screens/forms/dashboards/settings pages. Use when shaping UI. Not for building/polish.
4
4
  user-invocable: false
5
+ required-agent-roles: none
5
6
  ---
6
7
 
7
8
  # devrites-ux-shape: plan the UX/UI before code
@@ -4,6 +4,7 @@ description: User-invoked DevRites menu and router; no args renders the menu, a
4
4
  argument-hint: "[verb [args...]]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
7
+ required-agent-roles: none
7
8
  ---
8
9
 
9
10
  # /rite: DevRites menu + router
@@ -3,6 +3,7 @@ name: rite-adopt
3
3
  description: Adopt an existing or legacy codebase into DevRites by reverse-engineering current behavior, seeding conventions, and establishing the workflow. Use for inherited or live applications.
4
4
  argument-hint: "[path or area to adopt] [+ what you want to build next]"
5
5
  user-invocable: true
6
+ required-agent-roles: none
6
7
  ---
7
8
 
8
9
  # /rite-adopt: onboard existing code
@@ -3,6 +3,7 @@ name: rite-autocomplete
3
3
  description: Run the DevRites lifecycle end-to-end unattended; --ship confirms the final gate. Use when the user says "autocomplete", "one-shot this feature", or "ship it autonomously". Not for a single phase.
4
4
  argument-hint: "[idea] [--ship|--yolo] [--max-slices N]"
5
5
  user-invocable: true
6
+ required-agent-roles: none
6
7
  ---
7
8
 
8
9
  # /rite-autocomplete: full lifecycle, unattended
@@ -3,6 +3,7 @@ name: rite-build
3
3
  description: Build one approved vertical slice, then stop with evidence. Use when the next planned slice should be implemented. Not for multiple slices.
4
4
  argument-hint: "[slice number or name]"
5
5
  user-invocable: true
6
+ required-agent-roles: devrites-slice-wright
6
7
  ---
7
8
 
8
9
  # /rite-build: one verified slice
@@ -19,7 +20,7 @@ doubt, fail-on-red, recording, and stop checks. See
19
20
  ## Rules consulted (read on demand from `.claude/skills/devrites-lib/reference/standards/`)
20
21
  Read `.claude/skills/devrites-lib/reference/standards/core.md` first (workflow step 0). The
21
22
  following load on demand: **the wright reads them** (they are named in its contract) while it
22
- writes; read them yourself for the doubt/record gates or in the inline fallback:
23
+ writes; read them yourself for the doubt/record gates:
23
24
  - `coding-style.md`: naming, function shape, guard clauses, comments, reuse-first.
24
25
  - `error-handling.md`: fail fast, no silent catches, fail closed.
25
26
  - `testing.md`: pyramid, behaviour over implementation, see-it-fail-first.
@@ -55,9 +55,8 @@ See also [`one-slice-cycle.md`](one-slice-cycle.md).
55
55
  **Default serial branch.** Follow
56
56
  [`wright-dispatch.md`](wright-dispatch.md) end to end; it owns snapshot timing, stuck
57
57
  logging, the exact packet, conditional skill loading, and return checks. Dispatch through
58
- named wright → safely enforced generic fresh worker labelled inline fallback. Inline is
59
- allowed only when no fresh worker preserves recognized wright identity plus exact allowlist
60
- enforcement or isolated staging; it never skips reconciliation. Before any canonical
58
+ named wright → safely enforced generic fresh worker. If neither is available, stop for
59
+ HITL; the root never performs wright work. Before any canonical
61
60
  `.devrites/` mutation, validate the typed result and require a clean immediate
62
61
  `devrites-engine reconcile check`; exit `5` rejects the writer result.
63
62
  4. **Doubt every stood decision before accepting the slice.** The writer never grades its
@@ -176,4 +175,4 @@ See also [`one-slice-cycle.md`](one-slice-cycle.md).
176
175
  just built. **When every slice is built** (`✅ ALL BUILT`) say so explicitly (the build
177
176
  phase is complete, the next phase is `/rite-prove`) don't leave completion implicit.
178
177
 
179
- > **Mid-flight discipline.** The wright (or you, in the inline fallback) must resist doing two slices, skipping TDD, adding a defensive check, or wandering outside `touched-files.md`; you must resist skipping the post-return `devrites-doubt` because the wright "seems confident": see [`anti-patterns.md`](anti-patterns.md). Load it the moment you reach for the excuse.
178
+ > **Mid-flight discipline.** The wright must resist doing two slices, skipping TDD, adding a defensive check, or wandering outside `touched-files.md`; you must resist skipping the post-return `devrites-doubt` because the wright "seems confident": see [`anti-patterns.md`](anti-patterns.md). Load it the moment you reach for the excuse.
@@ -121,15 +121,14 @@ Only then persist `state.md`, `evidence.md`, `touched-files.md`, decision/doubt
121
121
  and browser evidence. Keep the retained window across a genuine human wait that will
122
122
  resume the same slice. Close it before abandoning the slice for a scope/plan transition.
123
123
 
124
- ## Host fallback
125
-
126
- Use named wright → safely enforced generic fresh worker labelled inline fallback from
127
- `standards/agents.md`. A generic worker is eligible only when the host preserves
128
- recognized wright identity plus exact allowlist enforcement, or contains it in an
129
- isolated/staged checkout. Post-hoc reconciliation alone cannot authorize an
130
- instruction-only shared-tree writer.
131
-
132
- When no safe fresh-context writer rung is callable, the root may execute the same bounded
133
- wright discipline inline. Write `.reconcile-inline` after the initial snapshot so the legacy
134
- A1 pre-hook recognizes the authorized fallback; reconciliation does **not** skip. The
135
- same allowlist, baseline, integrity gates, and close command remain mandatory.
124
+ ## Host dispatch
125
+
126
+ Use named wright → enforced V1 generic worker from `standards/agents.md`. On Codex
127
+ MultiAgent V2, dispatch the exact named `devrites-slice-wright` with a unique
128
+ `task_name` and `fork_turns="none"`; its durable child rollout must prove the native
129
+ wright role, wait, completion, and non-empty result from the current reconcile window.
130
+ Any generic worker still needs the exact allowlist or an isolated checkout;
131
+ reconciliation alone is insufficient. If no safe fresh-agent rung is available, stop
132
+ for HITL. On Codex, `reconcile check` and `reconcile close` require the completed
133
+ wright receipt bound to the current reconcile snapshot.
134
+ The root never performs wright work.
@@ -3,6 +3,7 @@ name: rite-clarify
3
3
  description: Run the topology-first decision-coverage scan after rite-spec and before strategy or architecture. Audit actors, journeys, states, data, integrations, operations, proof, assumptions, and must-NOT boundaries; close Partial/Missing rows and emit decision-coverage.md CLEAR. Use for missing/stale coverage or a missed pre-build product decision.
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
+ required-agent-roles: none
6
7
  ---
7
8
 
8
9
  # /rite-clarify: resolve product decisions
@@ -3,6 +3,7 @@ name: rite-converge
3
3
  description: Converge intent and live code. Use when resuming a half-built feature, after `/rite-adopt` drift, or the user asks "what's left to build". Not for initial planning.
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
+ required-agent-roles: devrites-evidence-scout
6
7
  ---
7
8
 
8
9
  # /rite-converge: compare live code with intent
@@ -4,6 +4,7 @@ description: User-invoked helper for authoring DevRites overrides or extensions.
4
4
  argument-hint: "[override <agent> | extension <name>]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
7
+ required-agent-roles: none
7
8
  ---
8
9
 
9
10
  # /rite-customize: guided project customization
@@ -3,6 +3,7 @@ name: rite-define
3
3
  description: Define the first build plan from an approved spec: architecture, task slices, traceability, and state. Use when turning approved intent into its initial plan.
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
+ required-agent-roles: devrites-plan-drafter
6
7
  ---
7
8
 
8
9
  # /rite-define: plan from the spec
@@ -3,6 +3,7 @@ name: rite-doctor
3
3
  description: Doctor DevRites setup or index health. Use when workflow wiring is broken, the user asks to check DevRites, or says "reindex". Not for application bugs.
4
4
  argument-hint: "[--code | --reindex]"
5
5
  user-invocable: true
6
+ required-agent-roles: none
6
7
  ---
7
8
 
8
9
  # /rite-doctor: health check
@@ -4,6 +4,7 @@ description: Explicit browser dogfood QA for the active feature or branch.
4
4
  argument-hint: "[feature-slug|branch] [--port N]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
7
+ required-agent-roles: none
7
8
  ---
8
9
 
9
10
  # /rite-dogfood: diff-scoped browser QA
@@ -4,6 +4,7 @@ description: User-invoked explainer that teaches one concept, diff, idea, or rec
4
4
  argument-hint: "[a concept | a diff ref | an idea | \"what did I do this week?\"], or bare to be asked"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
7
+ required-agent-roles: none
7
8
  ---
8
9
 
9
10
  # /rite-explain: the human half of the learning loop
@@ -42,8 +43,9 @@ Dispatch by task shape, per [`devrites-lib/reference/model-tiers.md`](../devrite
42
43
  orchestrator's own model; nothing is dispatched down. Teaching quality is the whole product: do
43
44
  not cheapen it.
44
45
 
45
- The degradation rule in that file applies: no per-agent model control run the scout inline under
46
- the same budget.
46
+ No per-agent model control means dispatch the scout as a same-model fresh agent under the
47
+ same budget. If no fresh-agent rung is available, stop with the missing capability; never run
48
+ the scout in the root context.
47
49
 
48
50
  ## Workflow
49
51
 
@@ -3,6 +3,7 @@ name: rite-frame
3
3
  description: Frame an ad-hoc ask before coding, then audit the diff. Use for underspecified imperative asks, raw-diff self-audits, or `/rite-quick` setup. Not a lifecycle gate.
4
4
  argument-hint: "[task to frame | diff to audit]"
5
5
  user-invocable: true
6
+ required-agent-roles: none
6
7
  ---
7
8
 
8
9
  # /rite-frame: frame the goal, audit the diff
@@ -4,6 +4,7 @@ description: User-invoked handoff writer: sync chat-only context into `.devrites
4
4
  user-invocable: true
5
5
  disable-model-invocation: true
6
6
  argument-hint: "[what the next session will focus on]"
7
+ required-agent-roles: none
7
8
  ---
8
9
 
9
10
  # /rite-handoff: chat-only context, into a fresh-agent doc
@@ -4,6 +4,7 @@ description: User-invoked review of the learning ledger; promotes recurring less
4
4
  argument-hint: "[--mine | \"<lesson to record>\"]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
7
+ required-agent-roles: none
7
8
  ---
8
9
 
9
10
  # /rite-learn: the cross-feature learning loop
@@ -3,6 +3,7 @@ name: rite-plan
3
3
  description: Re-plan existing work when reality invalidates the plan: reslice a slice that is too big, repair drift, reorder dependencies, split boundaries, or unblock work. Not first-pass decomposition.
4
4
  argument-hint: "[mode: decompose|reslice|repair|reorder|split|unblock|course-correct|revise]"
5
5
  user-invocable: true
6
+ required-agent-roles: devrites-plan-drafter
6
7
  ---
7
8
 
8
9
  # /rite-plan: (re)plan an active feature
@@ -3,6 +3,7 @@ name: rite-polish
3
3
  description: Polish the active feature before review: code always, UI when touched. Use when the user says "polish this", "finish before review", "normalize the UI", or "make it bolder/quieter". Not for repo-wide refactors.
4
4
  argument-hint: "[target | bolder | quieter | distill | harden | normalize-only]"
5
5
  user-invocable: true
6
+ required-agent-roles: none
6
7
  ---
7
8
 
8
9
  # /rite-polish: finish before review
@@ -3,6 +3,7 @@ name: rite-pov
3
3
  description: Project-grounded verdict for adopting, switching, rejecting, or revisiting a named external technology, library, platform, CVE, or pattern. Use when deciding whether this project should commit to an outside option.
4
4
  argument-hint: "[candidate/link/question]"
5
5
  user-invocable: true
6
+ required-agent-roles: none
6
7
  ---
7
8
 
8
9
  # /rite-pov: project-grounded external verdict
@@ -4,6 +4,7 @@ description: Explicit utility for resolving GitHub PR review feedback.
4
4
  argument-hint: "[PR number|thread URL|blank for current branch]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
7
+ required-agent-roles: none
7
8
  ---
8
9
 
9
10
  # /rite-pr-feedback: resolve PR review threads
@@ -3,6 +3,7 @@ name: rite-pressure-test
3
3
  description: Pressure-test a rough/vague idea: ideate, explore 3-5 approaches, radically different shapes, diverge then converge on direction before spec. Not for writing spec.
4
4
  argument-hint: "[rough idea or plan to stress-test]"
5
5
  user-invocable: true
6
+ required-agent-roles: none
6
7
  ---
7
8
 
8
9
  # /rite-pressure-test: diverge then converge
@@ -4,6 +4,7 @@ description: User-invoked throwaway prototype for one logic or UI design questio
4
4
  user-invocable: true
5
5
  disable-model-invocation: true
6
6
  argument-hint: "[the question the prototype is answering]"
7
+ required-agent-roles: none
7
8
  ---
8
9
 
9
10
  # /rite-prototype: answer one question with throwaway code
@@ -3,6 +3,7 @@ name: rite-prove
3
3
  description: Prove a completed feature with tests and the full test suite, build/typecheck/lint, end-to-end/browser evidence, screenshots, commands, and outputs for seal. Not for single-slice proof.
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
+ required-agent-roles: devrites-proof-runner
6
7
  ---
7
8
 
8
9
  # /rite-prove: prove the completed feature
@@ -3,6 +3,7 @@ name: rite-quick
3
3
  description: Express lane for a small reversible change: typo/copy/config, rate-limit constant, error message, local variable rename, feature flag, README link, one-file/function fix.
4
4
  argument-hint: "<what to change>"
5
5
  user-invocable: true
6
+ required-agent-roles: none
6
7
  ---
7
8
 
8
9
  # /rite-quick: express lane for small changes
@@ -4,6 +4,7 @@ description: User-invoked resume verb for answering, dropping, or batch-resolvin
4
4
  argument-hint: "<qid> \"<answer>\" | --drop <qid> [\"<reason>\"] | --batch <path-to-yaml>"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
7
+ required-agent-roles: none
7
8
  ---
8
9
 
9
10
  # /rite-resolve: answer the human gate
@@ -3,6 +3,7 @@ name: rite-review
3
3
  description: Review polished feature diff for correctness, readability, architecture, security, tests proving acceptance, Critical/Important findings, and quality dimensions before seal.
4
4
  argument-hint: "[scope: slice N | feature] [--full]"
5
5
  user-invocable: true
6
+ required-agent-roles: devrites-spec-reviewer, devrites-code-reviewer
6
7
  ---
7
8
 
8
9
  # /rite-review: feature-scoped review
@@ -3,6 +3,7 @@ name: rite-seal
3
3
  description: Decide GO / NO-GO readiness on the active feature. Use when the user asks "seal this", "GO / NO-GO", "decide if we can ship", "can we ship", or "safe to merge". Not for commit/push/tag/close; use /rite-ship.
4
4
  argument-hint: "[feature-slug] [--full]"
5
5
  user-invocable: true
6
+ required-agent-roles: devrites-test-analyst
6
7
  ---
7
8
 
8
9
  # /rite-seal: GO / NO-GO