devrites 2.4.0 → 2.5.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 (56) hide show
  1. package/CHANGELOG.md +16 -2
  2. package/README.md +1 -1
  3. package/install.sh +31 -2
  4. package/pack/.claude/agents/devrites-security-auditor.md +6 -10
  5. package/pack/.claude/rules/agents.md +3 -2
  6. package/pack/.claude/rules/core.md +1 -1
  7. package/pack/.claude/rules/prose-style.md +1 -1
  8. package/pack/.claude/skills/devrites-api-interface/SKILL.md +6 -7
  9. package/pack/.claude/skills/devrites-audit/SKILL.md +2 -2
  10. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +3 -3
  11. package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +1 -1
  12. package/pack/.claude/skills/devrites-doubt/SKILL.md +1 -1
  13. package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +1 -1
  14. package/pack/.claude/skills/devrites-frontend-craft/reference/shape.md +1 -1
  15. package/pack/.claude/skills/devrites-interview/SKILL.md +1 -1
  16. package/pack/.claude/skills/{rite-seal → devrites-lib}/reference/parallel-dispatch.md +19 -7
  17. package/pack/.claude/skills/devrites-lib/scripts/doubt-coverage.sh +35 -15
  18. package/pack/.claude/skills/devrites-lib/scripts/rites.sh +41 -0
  19. package/pack/.claude/skills/devrites-prose-craft/SKILL.md +1 -1
  20. package/pack/.claude/skills/devrites-refresh-indexes/SKILL.md +1 -1
  21. package/pack/.claude/skills/devrites-source-driven/SKILL.md +1 -1
  22. package/pack/.claude/skills/devrites-ux-shape/SKILL.md +1 -1
  23. package/pack/.claude/skills/rite/SKILL.md +7 -25
  24. package/pack/.claude/skills/rite/reference/menu.md +10 -3
  25. package/pack/.claude/skills/rite-adopt/SKILL.md +1 -1
  26. package/pack/.claude/skills/rite-autocomplete/SKILL.md +1 -1
  27. package/pack/.claude/skills/rite-build/SKILL.md +39 -44
  28. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +7 -3
  29. package/pack/.claude/skills/rite-define/SKILL.md +1 -1
  30. package/pack/.claude/skills/rite-doctor/SKILL.md +1 -1
  31. package/pack/.claude/skills/rite-frame/SKILL.md +1 -1
  32. package/pack/.claude/skills/rite-handoff/SKILL.md +4 -4
  33. package/pack/.claude/skills/rite-learn/SKILL.md +1 -1
  34. package/pack/.claude/skills/rite-plan/SKILL.md +5 -1
  35. package/pack/.claude/skills/rite-polish/SKILL.md +1 -1
  36. package/pack/.claude/skills/rite-polish/reference/code.md +4 -0
  37. package/pack/.claude/skills/rite-pressure-test/SKILL.md +3 -2
  38. package/pack/.claude/skills/rite-prototype/SKILL.md +5 -3
  39. package/pack/.claude/skills/rite-prove/SKILL.md +1 -1
  40. package/pack/.claude/skills/rite-quick/SKILL.md +1 -1
  41. package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +3 -2
  42. package/pack/.claude/skills/rite-review/SKILL.md +4 -4
  43. package/pack/.claude/skills/rite-review/reference/cognitive-load.md +4 -2
  44. package/pack/.claude/skills/rite-review/reference/five-axis-review.md +1 -1
  45. package/pack/.claude/skills/rite-review/reference/security-review.md +5 -0
  46. package/pack/.claude/skills/rite-seal/SKILL.md +18 -12
  47. package/pack/.claude/skills/rite-seal/reference/go-no-go.md +18 -2
  48. package/pack/.claude/skills/rite-ship/SKILL.md +1 -1
  49. package/pack/.claude/skills/rite-spec/SKILL.md +21 -2
  50. package/pack/.claude/skills/rite-spec/reference/state-workspace.md +12 -4
  51. package/pack/.claude/skills/rite-status/SKILL.md +1 -1
  52. package/pack/.claude/skills/rite-temper/SKILL.md +1 -1
  53. package/pack/.claude/skills/rite-vet/SKILL.md +1 -1
  54. package/pack/.claude/skills/rite-zoom-out/SKILL.md +3 -2
  55. package/package.json +1 -1
  56. package/pack/.claude/skills/rite-review/reference/parallel-dispatch.md +0 -62
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-build
3
- description: Implement exactly ONE vertical slice of the active feature, then stop with evidence. A fresh-context `devrites-slice-wright` writes the slice (orient → TDD → verify, anti-slop, project idiom); this skill gates it (readiness, HITL/AFK, doubt loop, Spec Drift Guard) and records the evidence. Use when the user says "build the next slice", "implement slice N", "continue", "code this slice". Not for bug fixes, prototypes, refactors outside scope, or two slices in a row.
3
+ description: Implement exactly ONE vertical slice of the active feature, then stop with evidence. Use when the user says "build the next slice", "implement slice N", "continue the build", "code this slice". Not for bug fixes, prototypes, refactors outside scope, or two slices in a row.
4
4
  argument-hint: "[slice number or name]"
5
5
  user-invocable: true
6
6
  ---
@@ -60,22 +60,26 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
60
60
  single-path — forge is the rare exception ([`reference/forge.md`](reference/forge.md)).
61
61
 
62
62
  ## Workflow ([one-slice-cycle](reference/one-slice-cycle.md))
63
+
64
+ > **Running the gate helpers.** Each gated `bash` block resolves the shared runner `rites.sh` into
65
+ > `$R` (self-contained — blocks don't share shell state), then calls a named helper:
66
+ > `bash "$R" <helper> [args]` runs
67
+ > `devrites-lib/scripts/<helper>.sh`, **propagates its exit code** (so the `rc=$?` checks below
68
+ > still hold) and degrades to a printed note if the lib is absent. One locator, many helpers —
69
+ > see [`devrites-lib/scripts/rites.sh`](../devrites-lib/scripts/rites.sh).
70
+
63
71
  0. **Rules + AFK + readiness check.** Read `.claude/rules/core.md` first. Then **run the
64
72
  shared orientation preamble** — it prints `state.md`, the artifacts present, the run
65
73
  mode (HITL/AFK), and the open-question tally by gate, deterministically:
66
74
  ```bash
67
- P=.claude/skills/devrites-lib/scripts/preamble.sh
68
- [ -f "$P" ] || P="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/preamble.sh"
69
- [ -f "$P" ] || P=pack/.claude/skills/devrites-lib/scripts/preamble.sh
70
- [ -f "$P" ] && bash "$P" || echo "(orientation preamble unavailable on this install — read state.md directly to orient)"
75
+ R=.claude/skills/devrites-lib/scripts/rites.sh; [ -f "$R" ] || R="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/rites.sh"; [ -f "$R" ] || R=pack/.claude/skills/devrites-lib/scripts/rites.sh
76
+ [ -f "$R" ] && bash "$R" preamble || echo "(orientation preamble unavailable on this install — read state.md directly to orient)"
71
77
  ```
72
78
  Then **run the readiness gate** — it enforces the step-0 stop conditions by exit code,
73
79
  not by memory:
74
80
  ```bash
75
- G=.claude/skills/devrites-lib/scripts/readiness.sh
76
- [ -f "$G" ] || G="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/readiness.sh"
77
- [ -f "$G" ] || G=pack/.claude/skills/devrites-lib/scripts/readiness.sh
78
- [ -f "$G" ] && { bash "$G"; echo "readiness rc=$?"; } || echo "(readiness gate unavailable — apply the prose checks below)"
81
+ R=.claude/skills/devrites-lib/scripts/rites.sh; [ -f "$R" ] || R="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/rites.sh"; [ -f "$R" ] || R=pack/.claude/skills/devrites-lib/scripts/rites.sh
82
+ [ -f "$R" ] && { bash "$R" readiness; echo "readiness rc=$?"; } || echo "(readiness gate unavailable — apply the prose checks below)"
79
83
  ```
80
84
  A non-zero `rc` is a hard STOP: `2` → `/rite-define` (plan not approved), `3` →
81
85
  `/rite-resolve` (awaiting human), `4` → `/rite-plan` (blocked). The prose below is the
@@ -111,18 +115,14 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
111
115
  call, fresh context. **First**, capture the pre-dispatch tree so the reconcile gate (step 6)
112
116
  can prove you never touched source — run this immediately before the `Task` call:
113
117
  ```bash
114
- RC=.claude/skills/devrites-lib/scripts/reconcile.sh
115
- [ -f "$RC" ] || RC="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/reconcile.sh"
116
- [ -f "$RC" ] || RC=pack/.claude/skills/devrites-lib/scripts/reconcile.sh
117
- [ -f "$RC" ] && bash "$RC" snapshot || echo "(reconcile gate unavailable — verify by hand that only the wright wrote source)"
118
+ R=.claude/skills/devrites-lib/scripts/rites.sh; [ -f "$R" ] || R="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/rites.sh"; [ -f "$R" ] || R=pack/.claude/skills/devrites-lib/scripts/rites.sh
119
+ [ -f "$R" ] && bash "$R" reconcile snapshot || echo "(reconcile gate unavailable — verify by hand that only the wright wrote source)"
118
120
  ```
119
121
  Then log the dispatch so the stuck-loop detector can catch a slice that keeps being
120
122
  re-dispatched without progress (it pauses the build even under AFK):
121
123
  ```bash
122
- ST=.claude/skills/devrites-lib/scripts/stuck.sh
123
- [ -f "$ST" ] || ST="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/stuck.sh"
124
- [ -f "$ST" ] || ST=pack/.claude/skills/devrites-lib/scripts/stuck.sh
125
- [ -f "$ST" ] && bash "$ST" log "$(cat .devrites/ACTIVE 2>/dev/null)" dispatch "<slice id>" || true
124
+ R=.claude/skills/devrites-lib/scripts/rites.sh; [ -f "$R" ] || R="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/rites.sh"; [ -f "$R" ] || R=pack/.claude/skills/devrites-lib/scripts/rites.sh
125
+ [ -f "$R" ] && bash "$R" stuck log "$(cat .devrites/ACTIVE 2>/dev/null)" dispatch "<slice id>" || true
126
126
  ```
127
127
  **Forge branch — only if the selected slice is `Forge: yes`.** Instead of the single dispatch
128
128
  below, run the competitive build per [`reference/forge.md`](reference/forge.md): K=2–3 candidate
@@ -174,10 +174,8 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
174
174
  `built`.** Log each dispatch so the seal can prove doubt ran (the footprint already counts a
175
175
  `doubt` kind):
176
176
  ```bash
177
- FP=.claude/skills/devrites-lib/scripts/footprint.sh
178
- [ -f "$FP" ] || FP="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/footprint.sh"
179
- [ -f "$FP" ] || FP=pack/.claude/skills/devrites-lib/scripts/footprint.sh
180
- [ -f "$FP" ] && bash "$FP" log <slug> doubt "<decision id>" || true
177
+ R=.claude/skills/devrites-lib/scripts/rites.sh; [ -f "$R" ] || R="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/rites.sh"; [ -f "$R" ] || R=pack/.claude/skills/devrites-lib/scripts/rites.sh
178
+ [ -f "$R" ] && bash "$R" footprint log <slug> doubt "<decision id>" || true
181
179
  ``` The doubt loop honours `.devrites/AFK` (see its AFK
182
180
  exception): findings below the slice's gate ceiling become advisory entries in `questions.md`;
183
181
  destructive / auth / public-API concerns always pause regardless. A non-empty `Escalation` in
@@ -205,10 +203,8 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
205
203
  wright's reported `Files changed` paths (one per line) to
206
204
  `.devrites/work/<slug>/.reconcile-claimed`, then:
207
205
  ```bash
208
- RC=.claude/skills/devrites-lib/scripts/reconcile.sh
209
- [ -f "$RC" ] || RC="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/reconcile.sh"
210
- [ -f "$RC" ] || RC=pack/.claude/skills/devrites-lib/scripts/reconcile.sh
211
- [ -f "$RC" ] && { bash "$RC" check; echo "reconcile rc=$?"; } || echo "(reconcile gate unavailable — confirm by hand only the wright wrote source)"
206
+ R=.claude/skills/devrites-lib/scripts/rites.sh; [ -f "$R" ] || R="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/rites.sh"; [ -f "$R" ] || R=pack/.claude/skills/devrites-lib/scripts/rites.sh
207
+ [ -f "$R" ] && { bash "$R" reconcile check; echo "reconcile rc=$?"; } || echo "(reconcile gate unavailable — confirm by hand only the wright wrote source)"
212
208
  ```
213
209
  **Exit 5 → hard STOP:** a source file changed outside the wright's claimed set — code was
214
210
  edited by something other than the wright (A1 breach). Revert it and re-dispatch the wright;
@@ -217,28 +213,31 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
217
213
  **Then run the test-integrity gate (anti-reward-hacking)** — prove the slice didn't reach
218
214
  green by weakening its tests:
219
215
  ```bash
220
- TI=.claude/skills/devrites-lib/scripts/test-integrity.sh
221
- [ -f "$TI" ] || TI="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/test-integrity.sh"
222
- [ -f "$TI" ] || TI=pack/.claude/skills/devrites-lib/scripts/test-integrity.sh
223
- [ -f "$TI" ] && { bash "$TI"; echo "test-integrity rc=$?"; } || echo "(test-integrity gate unavailable — confirm by hand no test was deleted/skipped/loosened)"
216
+ R=.claude/skills/devrites-lib/scripts/rites.sh; [ -f "$R" ] || R="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/rites.sh"; [ -f "$R" ] || R=pack/.claude/skills/devrites-lib/scripts/rites.sh
217
+ [ -f "$R" ] && { bash "$R" test-integrity; echo "test-integrity rc=$?"; } || echo "(test-integrity gate unavailable — confirm by hand no test was deleted/skipped/loosened)"
224
218
  ```
225
219
  **Exit 3 → hard STOP:** a test was deleted, skipped, or de-asserted since the slice base — the
226
220
  slice went green by weakening its tests, a Critical protocol violation. Revert the weakening and
227
221
  re-dispatch the wright; do **not** mark the slice `built`.
228
222
 
229
223
  Then, from the wright's artifact, update `state.md`,
230
- `evidence.md`, `touched-files.md` (and `browser-evidence.md` for UI). If the wright reported
224
+ `evidence.md`, `touched-files.md` (and `browser-evidence.md` for UI). **Persist every
225
+ `Decisions stood` entry from the wright's artifact to a `## Decisions stood` section in
226
+ `decisions.md`, one line each ending `— doubt: <accept | reject-resolved | MISSING>`** — the
227
+ verdict from step 4, or `MISSING` if step 4 was skipped for that entry. Write this ledger at
228
+ record-time **independent of the doubt step**, so a stood decision lands on disk even when it
229
+ was never doubted: `/rite-seal` cross-checks the ledger, and a `doubt: MISSING` entry is the
230
+ skipped-doubt finding that would otherwise leave no trace (the per-slice skip the footprint
231
+ count alone can't catch). If the wright stood no decisions, write `## Decisions stood` with
232
+ `- none` so the absence is recorded, not assumed. If the wright reported
231
233
  an approach it tried and backed out of, record it under a `## Dead ends` section in
232
234
  `decisions.md` so a retry or the next agent doesn't repeat it.
233
235
  **If the wright's `Conventions` field reports a contradiction** (the live code now
234
236
  disagrees with a held convention), record the drift — you own this bookkeeping:
235
237
  ```bash
236
- C=.claude/skills/devrites-lib/scripts/conventions.py
237
- [ -f "$C" ] || C="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/conventions.py"
238
- [ -f "$C" ] || C=pack/.claude/skills/devrites-lib/scripts/conventions.py
239
- command -v python3 >/dev/null 2>&1 && [ -f "$C" ] && \
240
- python3 "$C" contradict --key <key> --slug <slug> --evidence "<what the live code does>" \
241
- --drift-file .devrites/work/<slug>/drift.md || true
238
+ R=.claude/skills/devrites-lib/scripts/rites.sh; [ -f "$R" ] || R="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/rites.sh"; [ -f "$R" ] || R=pack/.claude/skills/devrites-lib/scripts/rites.sh
239
+ [ -f "$R" ] && bash "$R" conventions contradict --key <key> --slug <slug> \
240
+ --evidence "<what the live code does>" --drift-file .devrites/work/<slug>/drift.md || true
242
241
  ```
243
242
  It lowers the convention's band (or retires it) and appends a `convention-drift` entry to
244
243
  `drift.md`. The ledger is **promoted only at `/rite-seal` on GO** — build only records
@@ -247,10 +246,8 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
247
246
  [evidence-standard](reference/evidence-standard.md). Append a footprint record for this
248
247
  slice's wright dispatch (deterministic run-weight bookkeeping the seal reports):
249
248
  ```bash
250
- FP=.claude/skills/devrites-lib/scripts/footprint.sh
251
- [ -f "$FP" ] || FP="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/footprint.sh"
252
- [ -f "$FP" ] || FP=pack/.claude/skills/devrites-lib/scripts/footprint.sh
253
- [ -f "$FP" ] && bash "$FP" log <slug> wright "<slice id>" || true
249
+ R=.claude/skills/devrites-lib/scripts/rites.sh; [ -f "$R" ] || R="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/rites.sh"; [ -f "$R" ] || R=pack/.claude/skills/devrites-lib/scripts/rites.sh
250
+ [ -f "$R" ] && bash "$R" footprint log <slug> wright "<slice id>" || true
254
251
  ```
255
252
  If `.devrites/AFK` is present, decrement
256
253
  the budget by running `bash .claude/skills/devrites-lib/scripts/tick-afk.sh <state.md path>` —
@@ -261,10 +258,8 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
261
258
  shared footer (mirror of the step-0 preamble) so the slice meter + flow ribbon are
262
259
  deterministic, not model-typed:
263
260
  ```bash
264
- PR=.claude/skills/devrites-lib/scripts/progress.sh
265
- [ -f "$PR" ] || PR="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/progress.sh"
266
- [ -f "$PR" ] || PR=pack/.claude/skills/devrites-lib/scripts/progress.sh
267
- [ -f "$PR" ] && bash "$PR" || echo "(progress footer unavailable on this install)"
261
+ R=.claude/skills/devrites-lib/scripts/rites.sh; [ -f "$R" ] || R="${CLAUDE_SKILL_DIR:-}/../devrites-lib/scripts/rites.sh"; [ -f "$R" ] || R=pack/.claude/skills/devrites-lib/scripts/rites.sh
262
+ [ -f "$R" ] && bash "$R" progress || echo "(progress footer unavailable on this install)"
268
263
  ```
269
264
  It reads `state.md` (already updated in step 6), so the meter reflects the slice you
270
265
  just built. **When every slice is built** (`✅ ALL BUILT`) say so explicitly — the build
@@ -3,7 +3,7 @@
3
3
  How `/rite-build` hands the **build core** of one slice to `devrites-slice-wright` — the
4
4
  fresh-context, **write-capable** executor under `.claude/agents/`. Loaded on demand by
5
5
  `/rite-build`; not a skill itself. Sibling of
6
- [`../../rite-seal/reference/parallel-dispatch.md`](../../rite-seal/reference/parallel-dispatch.md)
6
+ [`../../devrites-lib/reference/parallel-dispatch.md`](../../devrites-lib/reference/parallel-dispatch.md)
7
7
  (the read-only reviewer fan-out) — same isolation principle, opposite direction: this one
8
8
  **writes**.
9
9
 
@@ -92,7 +92,11 @@ set.
92
92
  it and re-dispatch, don't mark the slice built. Then persist the wright's artifact to
93
93
  `state.md`, `evidence.md`, `touched-files.md` (and `browser-evidence.md` for UI) per
94
94
  [`evidence-standard.md`](evidence-standard.md). Evidence is the wright's real command output,
95
- not its say-so. Then tick AFK if `.devrites/AFK` is present (`tick-afk.sh`; exit 3 STOP).
95
+ not its say-so. **Persist every `Decisions stood` entry to a `## Decisions stood` section in
96
+ `decisions.md`, one line each ending `— doubt: <accept | reject-resolved | MISSING>`** —
97
+ independent of the doubt step (step 1 above), so a skipped decision still lands on record for
98
+ the seal's doubt-coverage cross-check (`- none` when the wright stood nothing). Then tick AFK if
99
+ `.devrites/AFK` is present (`tick-afk.sh`; exit 3 → STOP).
96
100
 
97
101
  ## Forge — competing candidates (the deliberate exception)
98
102
 
@@ -119,7 +123,7 @@ same anti-slop charter; it just doesn't get the isolation. In this path the orch
119
123
  legitimately the writer, so write `.devrites/work/<slug>/.reconcile-inline` before editing — the
120
124
  reconcile gate (step 4) skips when that sentinel is present. Mirrors the reviewer-dispatch
121
125
  fallback in
122
- [`../../rite-seal/reference/parallel-dispatch.md`](../../rite-seal/reference/parallel-dispatch.md).
126
+ [`../../devrites-lib/reference/parallel-dispatch.md`](../../devrites-lib/reference/parallel-dispatch.md).
123
127
 
124
128
  ## Optional pre-block hook (defense in depth)
125
129
  `reconcile.sh` is the **post-hoc** gate — it always runs and catches an A1 breach at record time.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-define
3
- description: Decompose an approved `spec.md` into `plan.md` + vertical task slices + `state.md`; every acceptance criterion maps to ≥1 slice. Use when the user says "plan this", "break this into slices", "task breakdown". Not for writing code or repairing an existing plan (use `/rite-plan`).
3
+ description: Decompose an approved `spec.md` into `plan.md` + vertical task slices + `state.md`; every acceptance criterion maps to ≥1 slice. Use when the user says "plan this" or "break this into slices". Not for writing code or repairing an existing plan (use `/rite-plan`).
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-doctor
3
- description: Diagnose DevRites install + workspace health on demand and print a full report — install integrity, a stale `.devrites/ACTIVE` pointer, a corrupt workspace, orphaned gates, and broken hook wiring. Use when the user says "rite doctor", "check my DevRites install", "is DevRites healthy", "diagnose devrites", or "why isn't the workflow picking up my feature". Not for debugging the user's own code (use `devrites-debug-recovery`) or for feature progress / next-action (use `/rite-status`).
3
+ description: Diagnose DevRites install + workspace health on demand and print a full report — install integrity, a stale `.devrites/ACTIVE` pointer, a corrupt workspace, orphaned gates, and broken hook wiring. Use when the user says "rite doctor", "check my DevRites install", or "why isn't the workflow picking up my feature". Not for debugging the user's own code (use `devrites-debug-recovery`) or for feature progress / next-action (use `/rite-status`).
4
4
  argument-hint: ""
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-frame
3
- description: Pre-flight + self-audit lens that applies the four classic LLM coding failure modes — silent assumption, overcomplication, out-of-scope edit, unverifiable goal to ad-hoc and express-lane work the full lifecycle's gates never see. FRAME converts an imperative ask into a falsifiable success criterion + verify command before any code; AUDIT checks the resulting diff against the four modes, each mapped to its DevRites cure. Use at the top of `/rite-quick`, before a plain "just do X" / "quick fix" edit, or to self-review a raw diff for assumptions, bloat, scope creep, or a missing success criterion. Not a replacement for the lifecycle gates (`/rite-seal`, `/rite-review`), the adversarial subagent pre-mortem (`devrites-doubt`), or the fresh-context axis audit (`devrites-audit`) — it is the lightweight inline reflex for work that skips those.
3
+ description: Frame an ad-hoc ask into a falsifiable success criterion before coding, then audit the diff against the four classic LLM failure modes — silent assumption, overcomplication, out-of-scope edit, unverifiable goal. Use to reframe an underspecified imperative ask, to self-audit a raw diff, or at the top of `/rite-quick`. Not a replacement for the lifecycle gates (`/rite-seal`, `/rite-review`), the adversarial pre-mortem (`devrites-doubt`), or the fresh-context axis audit (`devrites-audit`) — it is the lightweight inline reflex for work that skips those.
4
4
  argument-hint: "[task to frame | diff to audit]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-handoff
3
- description: Compact the current chat into a handoff doc a fresh agent can pick up cold — syncs chat-only context into the canonical `.devrites/` files, references artifacts by path. Use when the user says "handoff", "prep for tomorrow", "I'm leaving for a while", "summarize for the next agent". Not for routine `/clear` between phases.
3
+ description: Compact the current chat into a handoff doc a fresh agent can pick up cold — syncs chat-only context into the canonical `.devrites/` files, references artifacts by path. Use when the user says "handoff", "prep for tomorrow", or "summarize for the next agent". Not for routine `/clear` between phases.
4
4
  user-invocable: true
5
5
  argument-hint: "[what the next session will focus on]"
6
6
  ---
@@ -73,9 +73,9 @@ themselves. The workspace is the canonical store; the handoff is the chat-only d
73
73
  - `git diff` output — the next agent runs `git diff` themselves.
74
74
  - The full conversation transcript — distil.
75
75
  - Secrets (API keys, tokens, PII, credentials). Redact aggressively.
76
- - **New ideas the user didn't confirm.** A handoff records what *happened* and what's *next* —
77
- not fresh suggestions, scope the user didn't agree to, or a redesign you thought of. Capture the
78
- state, not your opinions about it.
76
+ - **New ideas the user didn't confirm.** A handoff records what *happened* and what's *next*.
77
+ Leave out fresh suggestions, scope the user didn't agree to, and redesigns you thought of. Capture
78
+ the state, not your opinions about it.
79
79
 
80
80
  ## Output template
81
81
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-learn
3
- description: Review the auto-captured learning ledger and promote recurring lessons to project rules or principles — the human-gated half of the cross-feature learning loop. Capture is automatic (`/rite-seal` appends dismissed-finding classes + dead-ends to `.devrites/learnings.md` on every GO; the review skills load it before a fan-out), so the system learns without a command; this skill mines that ledger across features and decides which recurring lessons graduate into a rule (propose, don't impose). Use when the user says "what have we learned", "rite learn", "harvest lessons", "promote our learnings", or after several features ship. Not for the install (`/rite-doctor`), feature status (`/rite-status`), onboarding (`/rite-adopt`), or a diff review (`/rite-review`).
3
+ description: Review the auto-captured learning ledger and promote recurring lessons to project rules or principles — the human-gated half of the cross-feature learning loop. Not for the install (`/rite-doctor`), feature status (`/rite-status`), onboarding (`/rite-adopt`), or a diff review (`/rite-review`).
4
4
  argument-hint: "[--mine | \"<lesson to record>\"]"
5
5
  user-invocable: true
6
6
  disable-model-invocation: true
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-plan
3
- description: Reshape an active plan — decompose / reslice / repair / reorder / split FE-BE / unblock / course-correct — without changing product behavior unless asked. Use when the user says "replan", "reslice", "repair the plan", "drift", "unblock", "change of plan", "we're pivoting", or `/rite-build` flags Spec Drift. Not for the initial plan (use `/rite-define`).
3
+ description: Reshape an active plan — decompose / reslice / repair / reorder / split FE-BE / unblock / course-correct — without changing product behavior unless asked. Use when the user says "replan", "reslice", "repair the plan", "unblock", "we're pivoting", or `/rite-build` flags Spec Drift. Not for the initial plan (use `/rite-define`).
4
4
  argument-hint: "[mode: decompose|reslice|repair|reorder|split|unblock|course-correct]"
5
5
  user-invocable: true
6
6
  ---
@@ -66,6 +66,10 @@ reshaping slice cadence or DoD criteria.
66
66
  5. Update `plan.md`, `tasks.md`, `state.md`, and append rationale to `decisions.md`.
67
67
  If you stopped for drift, mark the `drift.md` entry resolved.
68
68
  6. If product behavior/acceptance criteria change, confirm with the user before writing.
69
+ 7. **Done when** — every slice is sized (builds + proves in one cycle; no slice scoring >3
70
+ left unjustified), the dependency order is acyclic, every `drift.md` entry you stopped for
71
+ is marked resolved, and behavior-change-vs-not is confirmed (`no`, or asked + answered).
72
+ If any check fails, loop back — don't hand off a half-reshaped plan.
69
73
 
70
74
  > **Mid-flight discipline.** When tempted to change product behavior without asking, absorb drift silently, or skip the user — see [`anti-patterns`](reference/anti-patterns.md). Load it the moment you reach for the excuse.
71
75
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-polish
3
- description: Polish the active feature before review — code polish always; UI normalize + ship-quality pass when UI is touched. Use when the user says "polish this", "finish before review", "ship-quality", "normalize the UI", "bolder", "quieter", "distill", "harden". Not for repo-wide refactors or pre-`/rite-prove` polish.
3
+ description: Polish the active feature before review — code polish always; UI normalize + ship-quality pass when UI is touched. Use when the user says "polish this", "finish before review", "normalize the UI", or "make it bolder/quieter". Not for repo-wide refactors or pre-`/rite-prove` polish.
4
4
  argument-hint: "[target | bolder | quieter | distill | harden | normalize-only]"
5
5
  user-invocable: true
6
6
  ---
@@ -52,6 +52,10 @@ feature only.
52
52
  cleverness that's shorter but harder to read is not simpler.
53
53
  - **Cleanup**: remove TODOs, `console.log`s, commented-out code, unused
54
54
  imports/vars; tighten naming and comments in code this feature touched.
55
+ - **Done when** — every anti-slop charter item in the touched code is cleared
56
+ (the AI-tells do-not list — [anti-ai-slop.md](anti-ai-slop.md) Code section,
57
+ `coding-style.md`) **and** the feature's targeted tests + build re-run green.
58
+ An open charter item or a red check means Phase 1 isn't done.
55
59
 
56
60
  ## Phase 2 — Backend polish *(if BE touched)*
57
61
 
@@ -1,10 +1,11 @@
1
1
  ---
2
2
  name: rite-pressure-test
3
- description: Pressure-test a rough idea — diverge into 3-5 genuinely different options, then converge on one with the trade-off and decision hinge. Use when the user says "ideate", "refine this idea", "stress-test my plan", "I have a vague idea", or `/rite-spec` flags the concept as rough. Not for writing the spec (use `/rite-spec`).
3
+ description: Pressure-test a rough idea — diverge into 3-5 genuinely different options, then converge on one with the trade-off and decision hinge. Use when the user says "ideate", "stress-test my plan", "I have a vague idea", or `/rite-spec` flags the concept as rough. Not for writing the spec (use `/rite-spec`).
4
+ argument-hint: "[rough idea or plan to stress-test]"
4
5
  user-invocable: true
5
6
  ---
6
7
 
7
- # rite-pressure-test — diverge then converge
8
+ # /rite-pressure-test — diverge then converge
8
9
 
9
10
  Use when the *idea* (not just the requirements) is rough. Generate options, then commit
10
11
  to one — so `/rite-spec` has a real direction to specify.
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-prototype
3
- description: Throwaway prototype answering ONE design question — either a runnable Logic harness or 2–4 radically different UI variations on one route — then delete or absorb. Use when the user says "prototype this", "sanity-check the data model", "try a few UI designs", "let me play with it", "mock it up". Not for production code.
3
+ description: Throwaway prototype answering ONE design question — either a runnable Logic harness or 2–4 radically different UI variations on one route — then delete or absorb. Use when the user says "prototype this", "sanity-check the data model", or "try a few UI designs". Not for production code.
4
4
  user-invocable: true
5
5
  argument-hint: "[the question the prototype is answering]"
6
6
  ---
@@ -71,8 +71,10 @@ one of:
71
71
  with the question and the answer.
72
72
  - A `NOTES.md` next to the prototype if no active feature exists.
73
73
 
74
- If the user is around, this is a quick conversation. If they're AFK, leave a placeholder
75
- ("VERDICT: ___") so the next pass fills it in before the prototype is deleted.
74
+ If the user is around, this is a quick conversation. If they're AFK, the prototype is
75
+ complete only once the verdict is actually filled in a blank `VERDICT: ___` is not an
76
+ answer. Leave it marked **not yet complete** and queue the open question so a later pass
77
+ fills the verdict before the prototype is deleted.
76
78
 
77
79
  ## Where this slots in
78
80
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-prove
3
- description: Prove the completed feature full tests + build + typecheck + lint + browser-proof ladder — walking `spec.md` acceptance criteria one by one. Use when the user says "prove this", "run the full tests", "is this feature really done", "check it end-to-end". Not for single-slice or pre-completion proof.
3
+ description: Prove the completed feature against its `spec.md` acceptance criteria. Use when the user says "prove this", "run the full tests", or "check it end-to-end". Not for single-slice or pre-completion proof.
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-quick
3
- description: Express lane for a SMALL, reversible change — one short artifact, then build → prove → ship, collapsing the full spec → define → vet → build → prove → review → seal lifecycle into one pass. Use when the user says "quick fix", "small change", "tiny tweak", "just do X", or for a typo / copy / config / single-function / one-file change that is low-risk and unambiguous. Escalates to `/rite-spec` (full lifecycle) the moment scope, risk, or ambiguity grows. Not for auth / data-model / migration / public-API / multi-slice / ambiguous work — those need the full lifecycle.
3
+ description: Express lane for a SMALL, reversible change. Use when the user says "quick fix" or "just do X", or for a typo / copy / config / single-function / one-file change that is low-risk and unambiguous. Escalates to `/rite-spec` (full lifecycle) the moment scope, risk, or ambiguity grows. Not for auth / data-model / migration / public-API / multi-slice / ambiguous work — those need the full lifecycle.
4
4
  argument-hint: "<what to change>"
5
5
  user-invocable: true
6
6
  ---
@@ -25,8 +25,9 @@ shapes, the batch file format, and the rules the underlying `devrites-lib/script
25
25
  - A drop is **not** an answer — it removes the question from the active queue without
26
26
  recording a decision. Use it when the question is obsolete, a duplicate, or absorbed
27
27
  by a re-plan.
28
- - The reason is required as a single trailing string. "obsolete" / "duplicate" /
29
- "absorbed by Slice N" are sufficient but never blank.
28
+ - The reason is an optional single trailing string, **strongly recommended** for the
29
+ audit trail. "obsolete" / "duplicate" / "absorbed by Slice N" are sufficient; if omitted,
30
+ `resolve.sh` records the reason as `dropped`.
30
31
 
31
32
  ### 3. Batch
32
33
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-review
3
- description: Feature-scoped multi-axis review of the polished diff Spec + Code-review axes fan out as parallel subagents; findings under one severity scale. Use when the user says "review this", "audit my diff", "final review before seal", "check this against the spec". Not for whole-project refactors or single-slice review.
3
+ description: Review the polished diff at feature scope across Spec + Code-review axes. Use when the user says "review this", "audit my diff", "final review before seal", "check this against the spec". Not for whole-project refactors or single-slice review.
4
4
  argument-hint: "[scope: slice N | feature]"
5
5
  user-invocable: true
6
6
  ---
@@ -13,7 +13,7 @@ if none, tell the user to run `/rite-spec <feature>`.
13
13
  > **Differs from built-in `/code-review` in:** `/code-review` is a generic
14
14
  > diff review with no workspace context. `/rite-review` reads
15
15
  > `.devrites/work/<slug>/spec.md` first, runs Spec ↔ Code-review axes as
16
- > parallel subagents (see [`reference/parallel-dispatch.md`](reference/parallel-dispatch.md)), and gates feeding
16
+ > parallel subagents (see [`parallel-dispatch.md`](../devrites-lib/reference/parallel-dispatch.md)), and gates feeding
17
17
  > into `/rite-seal`. Use `/code-review` for a one-off diff; use
18
18
  > `/rite-review` for a DevRites feature where the spec is the contract.
19
19
 
@@ -86,11 +86,11 @@ pull these via `Read` when the diff demands them:
86
86
  between the axes explicitly (e.g. "Spec axis says complete, Code-review axis says
87
87
  untestable") — `/rite-seal` decides what blocks.
88
88
  4. **Reconcile, don't re-review.** With the two parallel reports in hand, the inline
89
- lead reconciles — it does **not** re-run a five-axis pass over correctness /
89
+ lead reconciles — it does **not** re-run the code-review axes over correctness /
90
90
  readability / architecture / maintainability that `devrites-code-reviewer` already
91
91
  covered. Stay in scope ([feature-scoped-review](reference/feature-scoped-review.md)).
92
92
  Add only what the dispatched agents could not, then resolve overlaps and
93
- contradictions before labeling. ([five-axis-review](reference/five-axis-review.md)
93
+ contradictions before labeling. ([five-axis-review.md](reference/five-axis-review.md)
94
94
  documents the axes the code-review agent applies.)
95
95
  - **UI feature?** Apply the **UX rubric**
96
96
  ([nielsen-heuristics](reference/nielsen-heuristics.md)) and the
@@ -81,8 +81,10 @@ doesn't decide the rewrite strategy.
81
81
 
82
82
  ## What this lens **doesn't** cover
83
83
 
84
- - **Accessibility** — separate axis (WCAG 2.2; see `quality-standards.md`).
85
- - **Performance** — separate axis (Core Web Vitals; see `quality-standards.md`).
84
+ - **Accessibility** — separate axis (WCAG 2.2; see
85
+ [`devrites-frontend-craft/reference/quality-standards.md`](../../devrites-frontend-craft/reference/quality-standards.md)).
86
+ - **Performance** — separate axis (Core Web Vitals; see
87
+ [`performance-checklist.md`](performance-checklist.md)).
86
88
  - **Code quality** — covered by the simplification audit
87
89
  (`devrites-audit simplify`).
88
90
  - **Security** — covered by the security audit (`devrites-audit security`).
@@ -1,4 +1,4 @@
1
- # Five-axis review
1
+ # Code-review axes
2
2
 
3
3
  The axes the dispatched `devrites-code-reviewer` applies to the diff (tests first
4
4
  — always), under one severity scale (Critical / Important / Suggestion / Nit / FYI).
@@ -4,6 +4,11 @@ Apply when the feature involves user input, auth/authz, data storage, external
4
4
  integrations, secrets, or permissions. Delegates to `devrites-audit security`.
5
5
 
6
6
  ## OWASP-Top-10-oriented checks
7
+
8
+ This is the **single-sourced OWASP-web checklist** both `/rite-review` and the
9
+ `devrites-security-auditor` agent apply (trust-boundary + the OWASP **LLM** Top 10 live in
10
+ [`rules/security.md`](../../../rules/security.md)). Keep the enumeration here; don't restate it.
11
+
7
12
  - **Injection** — parameterized queries; no string-built SQL/shell/HTML; validate &
8
13
  encode at boundaries.
9
14
  - **Broken access control** — every sensitive action checks authz server-side; no
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-seal
3
- description: Final GO / NO-GO decision gate — walk `spec.md` acceptance against `evidence.md`, fan out reviewers in parallel, block on Critical, ask y/N on Important, write the verdict to seal.md. Use when the user says "seal this", "GO / NO-GO", "is it safe to merge", "final gate", "decide if we can ship". Hands off to /rite-ship for the actual commit/push/close. Not for the irreversible ship itself (use /rite-ship), inline review, or unpolished features.
3
+ description: Decide GO / NO-GO on the active feature. Use when the user says "seal this" or "GO / NO-GO". Hands off to /rite-ship for the actual commit/push/close. Not for the irreversible ship itself (use /rite-ship), inline review, or unpolished features.
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  ---
@@ -42,7 +42,7 @@ Read `review.md` and the latest reviewer outputs.
42
42
  | Diff violates a declared project principle (`.devrites/principles.md`) with no recorded, human-approved exception | **NO-GO**, list each violated principle with `file:line`. Same standing as an unproven criterion (absent / empty file → none declared → not a blocker). |
43
43
  | Unresolved drift in `drift.md` | **NO-GO**, route through `/rite-plan` first. |
44
44
  | Any `questions.md` entry with `gate: validating` and `status: open` | **NO-GO** regardless of behavior impact — an open validating gate is merge-blocking by definition. A slice marked `built (pending review)` is not done. |
45
- | `doubt-coverage` rc=1, or a stood decision (boundary / data-model / auth / public-API / migration / branching) recorded in `decisions.md` with no `devrites-doubt` verdict | **Important** — and **NO-GO** when the undoubted decision is an irreversible-risk class (auth / public-API / migration), the same standing as an unproven acceptance criterion. `/rite-build` step 4 records the verdict + logs a `doubt` footprint; absence here means doubt was skipped. Genuinely-empty `Decisions stood` on every slice is a valid pass confirm, don't assume. |
45
+ | A stood decision (boundary / data-model / auth / public-API / migration / branching) in the `decisions.md` `## Decisions stood` ledger with no recorded `devrites-doubt` verdict — `doubt: MISSING` / `doubt-coverage` rc=3 | **Important** — **NO-GO** when the undoubted decision is irreversible-risk (auth / public-API / migration), the same standing as an unproven acceptance criterion. Severity rides the unverified **decision**, not the exit code: `doubt-coverage` rc=1 (zero doubt dispatched) is a **prompt to verify**, not itself a finding — confirm against the ledger, where every-slice-trivial (`- none`) passes and a skipped triggering decision is the finding. |
46
46
 
47
47
  ## Workflow
48
48
  1. **Run the shared orientation preamble** — it prints `state.md`, the artifacts present,
@@ -84,14 +84,20 @@ Read `review.md` and the latest reviewer outputs.
84
84
  [ -f "$DC" ] || DC=pack/.claude/skills/devrites-lib/scripts/doubt-coverage.sh
85
85
  [ -f "$DC" ] && { bash "$DC" <slug>; echo "doubt-coverage rc=$?"; } || echo "(doubt-coverage gate unavailable — confirm by hand each stood decision carries a devrites-doubt verdict)"
86
86
  ```
87
- The script proves the **footprint half** (a `doubt` dispatch was logged per `/rite-build`
88
- step 4); you prove the **verdict half**: every decision in `decisions.md` that crosses a doubt
89
- trigger (boundary / data-model / auth / public-API / migration / branching / "safe" / "scales")
90
- must carry a recorded `devrites-doubt` verdict `accept`, or a `reject` whose required changes
91
- were resolved. Per the severity gate: **rc=1 or a triggering decision with no verdict is an
92
- Important finding**, escalating to **NO-GO** when the undoubted decision is irreversible-risk
93
- (auth / public-API / migration). A genuinely-empty `Decisions stood` across every slice passes —
94
- confirm it against `decisions.md`, don't assume it.
87
+ The script reads two records `/rite-build` writes the `## Decisions stood` ledger in
88
+ `decisions.md` (each entry ends `— doubt: <accept | reject-resolved | MISSING>`) and the `doubt`
89
+ footprint. Read the exit code:
90
+ - **rc=3** the ledger records a stood decision with `doubt: MISSING`: doubt was definitively
91
+ skipped for a decision on record. **Important**; **NO-GO** when that decision is irreversible-risk
92
+ (auth / public-API / migration). This is the per-slice skip the footprint count alone can't catch.
93
+ - **rc=1** zero doubt dispatched across the build. A **prompt to verify, not a finding**: confirm
94
+ against the ledger — an every-slice-trivial feature (`- none`) is a valid pass; a stood triggering
95
+ decision (boundary / data-model / auth / public-API / migration / branching) with no verdict is
96
+ the finding, same severity as rc=3.
97
+ - **rc=0** — covered, or not assessable (an inline build logs no dispatch — verify the ledger's
98
+ verdicts by hand).
99
+ Either way, walk the `## Decisions stood` ledger yourself: severity rides the unverified
100
+ **decision**, never the exit code alone.
95
101
  5. Check **security, data, migration, rollback** risk —
96
102
  [risk-and-rollback](reference/risk-and-rollback.md). If `strategy.md` exists (from
97
103
  `/rite-temper`), confirm its **top pre-mortem risks are mitigated** in the diff/evidence and
@@ -119,14 +125,14 @@ Read `review.md` and the latest reviewer outputs.
119
125
  7. **Independent review** — seal is the final gate, not a re-run of `/rite-review`.
120
126
  It **always re-spawns** the axes `/rite-review` did not cover: `devrites-test-analyst`,
121
127
  `devrites-security-auditor`, `devrites-performance-reviewer`, and
122
- `devrites-frontend-reviewer` (UI). It **only re-runs the Spec and Code axes**
128
+ `devrites-frontend-reviewer` (UI). It **only re-runs the Spec and Code-review axes**
123
129
  (`devrites-spec-reviewer`, `devrites-code-reviewer`) when the diff changed since
124
130
  `/rite-review` ran (compare against `review.md`); if the diff is unchanged, carry
125
131
  review's verdicts on those axes forward rather than re-litigating them.
126
132
  If subagents are available, fan out to the chosen DevRites
127
133
  reviewers (`.claude/agents/devrites-*`) **in parallel** (one `Task` block,
128
134
  multiple tool calls; see `.claude/rules/agents.md` — "Run independent
129
- reviewers in parallel", and [`reference/parallel-dispatch.md`](reference/parallel-dispatch.md)
135
+ reviewers in parallel", and [`parallel-dispatch.md`](../devrites-lib/reference/parallel-dispatch.md)
130
136
  for the full dispatch shape + reconciliation procedure):
131
137
  `devrites-spec-reviewer` (does the diff implement
132
138
  the spec?), `devrites-test-analyst` (do the tests prove acceptance?),
@@ -1,15 +1,25 @@
1
1
  # GO / NO-GO
2
2
 
3
3
  The seal verdict is binary and evidence-based. When in doubt, NO-GO with a clear blocker
4
- list beats a hopeful GO.
4
+ list beats a hopeful GO. The **authoritative gate is the severity table in
5
+ [`../SKILL.md`](../SKILL.md) ("Severity gate")**; this file is the rationale behind it — keep
6
+ the two in sync.
5
7
 
6
8
  ## NO-GO if any of these hold
7
9
  - A **critical acceptance criterion is unproven** (no evidence, or evidence shows fail).
8
10
  - **Tests or build fail** without an explicit, user-accepted risk.
9
- - The UI **cannot be verified** and the UI risk is material (visible/important surface).
11
+ - The UI **cannot be verified** and the UI risk is material (visible/important surface), or a
12
+ Visual Verdict `FAIL` lands on an acceptance-mapped UI criterion (`browser-evidence.md`).
10
13
  - **Unresolved spec drift** remains (a known-wrong plan or an open behavior question).
11
14
  - A **security-critical issue** remains (auth bypass, data exposure, injection).
12
15
  - A **data migration or destructive change lacks a rollback plan**.
16
+ - A **declared project principle is violated** (`.devrites/principles.md`) with no recorded,
17
+ human-approved exception — same standing as an unproven criterion (absent / empty file →
18
+ none declared → not a blocker).
19
+ - A **stood decision was never independently doubted** — a `## Decisions stood` entry in
20
+ `decisions.md` carrying `doubt: MISSING` (or `doubt-coverage.sh` rc=3) — when that decision
21
+ is irreversible-risk (auth / public-API / migration). Severity rides the undoubted decision,
22
+ not the exit code.
13
23
  - Any `questions.md` entry with `gate: validating` and `status: open` — **NO-GO
14
24
  regardless of behavior impact** (an open validating gate is merge-blocking by
15
25
  definition). A slice marked `built (pending review)` is not done.
@@ -27,6 +37,12 @@ list beats a hopeful GO.
27
37
  - Security/data/migration risks either resolved or explicitly accepted by the user with
28
38
  a rollback path.
29
39
 
40
+ ## Important findings (`Critical == 0`, `Important > 0`)
41
+ Open `Important` findings do not auto-pass. With acceptance proven and drift resolved, render
42
+ the interactive prompt *"`Important > 0` open. Proceed to seal? [y/N]"* — default **N**. `y`
43
+ → GO; otherwise NO-GO with the open Important findings listed as blockers-by-policy. Don't
44
+ silently fold Important findings into a GO.
45
+
30
46
  ## Conditional GO
31
47
  If only **non-blocking follow-ups** remain, it's a GO with a recorded follow-up list —
32
48
  not a NO-GO. Distinguish "must fix to ship" (blocker) from "should do next" (follow-up).
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: rite-ship
3
- description: Ship the sealed feature and close the task — render type-GO, run the irreversible git commit/push/tag (or open the PR), write ship.md, then archive the workspace and clear .devrites/ACTIVE. Use when the user says "ship it", "ship this", "push it out", "close the task", "finish and archive", or right after /rite-seal returns GO. Not for the GO/NO-GO decision itself (use /rite-seal) or an unsealed feature.
3
+ description: Ship the sealed feature and close the task. Use when the user says "ship it" or "close the task", or right after /rite-seal returns GO. Not for the GO/NO-GO decision itself (use /rite-seal) or an unsealed feature.
4
4
  argument-hint: "[feature-slug]"
5
5
  user-invocable: true
6
6
  ---