devrites 2.4.0 → 2.5.1
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.
- package/CHANGELOG.md +22 -2
- package/README.md +1 -1
- package/install.sh +31 -2
- package/pack/.claude/agents/devrites-security-auditor.md +6 -10
- package/pack/.claude/rules/agents.md +3 -2
- package/pack/.claude/rules/core.md +1 -1
- package/pack/.claude/rules/prose-style.md +1 -1
- package/pack/.claude/skills/devrites-api-interface/SKILL.md +6 -7
- package/pack/.claude/skills/devrites-audit/SKILL.md +2 -2
- package/pack/.claude/skills/devrites-browser-proof/SKILL.md +3 -3
- package/pack/.claude/skills/devrites-debug-recovery/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-doubt/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-frontend-craft/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-frontend-craft/reference/shape.md +1 -1
- package/pack/.claude/skills/devrites-interview/SKILL.md +1 -1
- package/pack/.claude/skills/{rite-seal → devrites-lib}/reference/parallel-dispatch.md +19 -7
- package/pack/.claude/skills/devrites-lib/scripts/doubt-coverage.sh +35 -15
- package/pack/.claude/skills/devrites-lib/scripts/rites.sh +41 -0
- package/pack/.claude/skills/devrites-prose-craft/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-refresh-indexes/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-source-driven/SKILL.md +1 -1
- package/pack/.claude/skills/devrites-ux-shape/SKILL.md +1 -1
- package/pack/.claude/skills/rite/SKILL.md +7 -25
- package/pack/.claude/skills/rite/reference/menu.md +10 -3
- package/pack/.claude/skills/rite-adopt/SKILL.md +1 -1
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +1 -1
- package/pack/.claude/skills/rite-build/SKILL.md +56 -50
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +7 -3
- package/pack/.claude/skills/rite-define/SKILL.md +1 -1
- package/pack/.claude/skills/rite-doctor/SKILL.md +1 -1
- package/pack/.claude/skills/rite-frame/SKILL.md +1 -1
- package/pack/.claude/skills/rite-handoff/SKILL.md +4 -4
- package/pack/.claude/skills/rite-learn/SKILL.md +1 -1
- package/pack/.claude/skills/rite-plan/SKILL.md +5 -1
- package/pack/.claude/skills/rite-polish/SKILL.md +1 -1
- package/pack/.claude/skills/rite-polish/reference/code.md +4 -0
- package/pack/.claude/skills/rite-pressure-test/SKILL.md +3 -2
- package/pack/.claude/skills/rite-prototype/SKILL.md +5 -3
- package/pack/.claude/skills/rite-prove/SKILL.md +1 -1
- package/pack/.claude/skills/rite-quick/SKILL.md +1 -1
- package/pack/.claude/skills/rite-resolve/reference/answer-protocol.md +3 -2
- package/pack/.claude/skills/rite-review/SKILL.md +4 -4
- package/pack/.claude/skills/rite-review/reference/cognitive-load.md +4 -2
- package/pack/.claude/skills/rite-review/reference/five-axis-review.md +1 -1
- package/pack/.claude/skills/rite-review/reference/security-review.md +5 -0
- package/pack/.claude/skills/rite-seal/SKILL.md +18 -12
- package/pack/.claude/skills/rite-seal/reference/go-no-go.md +18 -2
- package/pack/.claude/skills/rite-ship/SKILL.md +1 -1
- package/pack/.claude/skills/rite-spec/SKILL.md +21 -2
- package/pack/.claude/skills/rite-spec/reference/state-workspace.md +12 -4
- package/pack/.claude/skills/rite-status/SKILL.md +1 -1
- package/pack/.claude/skills/rite-temper/SKILL.md +1 -1
- package/pack/.claude/skills/rite-vet/SKILL.md +1 -1
- package/pack/.claude/skills/rite-zoom-out/SKILL.md +3 -2
- package/package.json +1 -1
- 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.
|
|
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
|
-
|
|
68
|
-
[ -f "$
|
|
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
|
-
|
|
76
|
-
[ -f "$
|
|
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
|
|
@@ -101,28 +105,35 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
|
|
|
101
105
|
right next slice. Write the slice's `Mode` to `state.md` as `Slice mode: <HITL|AFK>` on
|
|
102
106
|
**every** selection (not only on the HITL pause path); `/rite-resolve` clears or updates
|
|
103
107
|
it on resume.
|
|
104
|
-
2a. **HITL gate (pre-action pause).** Read the slice's `Mode`. If `HITL
|
|
105
|
-
checkpoint per
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
108
|
+
2a. **HITL gate (pre-action pause).** Read the slice's `Mode`. If `HITL`, surface the
|
|
109
|
+
checkpoint as a ranked **option set** and resolve it **before** any code lands, per
|
|
110
|
+
[`reference/checkpoint-protocol.md`](reference/checkpoint-protocol.md). Branch on whether
|
|
111
|
+
a human is here:
|
|
112
|
+
- **Human present (interactive — no `.devrites/AFK`) → ask inline via `AskUserQuestion`.**
|
|
113
|
+
This is the default for an interactive build. Render 2–4 options, the recommended one
|
|
114
|
+
**first and labelled `(Recommended)`**, each with its dimension-tagged rationale + the
|
|
115
|
+
trade-off it accepts, plus the `Something else — I'll describe it` escape hatch. The
|
|
116
|
+
human picks; record the pick to `questions.md` (`answered`) + `decisions.md` (through the
|
|
117
|
+
`resolve.sh` writer), clear the gate, and **continue to step 3 in place** — do **not**
|
|
118
|
+
STOP, do **not** route through `/rite-resolve`.
|
|
119
|
+
- **Human absent / AFK (`.devrites/AFK` present) → auto-pick or persist + STOP.** For a gate
|
|
120
|
+
in `allow_gates`, auto-pick the recommended option (option 1) and proceed; otherwise
|
|
121
|
+
append the `questions.md` entry, write the `Awaiting human` block to `state.md`, set
|
|
122
|
+
`Status: awaiting_human`, fire the `notify:` hook, then **STOP** — resume when the user
|
|
123
|
+
runs `/rite-resolve <qid> "<answer>"`. `blocking` / `escalating` / irreversible-risk gates
|
|
124
|
+
always take this stop path, never the AFK auto-pick.
|
|
110
125
|
3. **Snapshot the tree, then dispatch the build core to `devrites-slice-wright`** — one `Task`
|
|
111
126
|
call, fresh context. **First**, capture the pre-dispatch tree so the reconcile gate (step 6)
|
|
112
127
|
can prove you never touched source — run this immediately before the `Task` call:
|
|
113
128
|
```bash
|
|
114
|
-
|
|
115
|
-
[ -f "$
|
|
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)"
|
|
129
|
+
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
|
|
130
|
+
[ -f "$R" ] && bash "$R" reconcile snapshot || echo "(reconcile gate unavailable — verify by hand that only the wright wrote source)"
|
|
118
131
|
```
|
|
119
132
|
Then log the dispatch so the stuck-loop detector can catch a slice that keeps being
|
|
120
133
|
re-dispatched without progress (it pauses the build even under AFK):
|
|
121
134
|
```bash
|
|
122
|
-
|
|
123
|
-
[ -f "$
|
|
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
|
|
135
|
+
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
|
|
136
|
+
[ -f "$R" ] && bash "$R" stuck log "$(cat .devrites/ACTIVE 2>/dev/null)" dispatch "<slice id>" || true
|
|
126
137
|
```
|
|
127
138
|
**Forge branch — only if the selected slice is `Forge: yes`.** Instead of the single dispatch
|
|
128
139
|
below, run the competitive build per [`reference/forge.md`](reference/forge.md): K=2–3 candidate
|
|
@@ -174,10 +185,8 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
|
|
|
174
185
|
`built`.** Log each dispatch so the seal can prove doubt ran (the footprint already counts a
|
|
175
186
|
`doubt` kind):
|
|
176
187
|
```bash
|
|
177
|
-
|
|
178
|
-
[ -f "$
|
|
179
|
-
[ -f "$FP" ] || FP=pack/.claude/skills/devrites-lib/scripts/footprint.sh
|
|
180
|
-
[ -f "$FP" ] && bash "$FP" log <slug> doubt "<decision id>" || true
|
|
188
|
+
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
|
|
189
|
+
[ -f "$R" ] && bash "$R" footprint log <slug> doubt "<decision id>" || true
|
|
181
190
|
``` The doubt loop honours `.devrites/AFK` (see its AFK
|
|
182
191
|
exception): findings below the slice's gate ceiling become advisory entries in `questions.md`;
|
|
183
192
|
destructive / auth / public-API concerns always pause regardless. A non-empty `Escalation` in
|
|
@@ -205,10 +214,8 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
|
|
|
205
214
|
wright's reported `Files changed` paths (one per line) to
|
|
206
215
|
`.devrites/work/<slug>/.reconcile-claimed`, then:
|
|
207
216
|
```bash
|
|
208
|
-
|
|
209
|
-
[ -f "$
|
|
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)"
|
|
217
|
+
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
|
|
218
|
+
[ -f "$R" ] && { bash "$R" reconcile check; echo "reconcile rc=$?"; } || echo "(reconcile gate unavailable — confirm by hand only the wright wrote source)"
|
|
212
219
|
```
|
|
213
220
|
**Exit 5 → hard STOP:** a source file changed outside the wright's claimed set — code was
|
|
214
221
|
edited by something other than the wright (A1 breach). Revert it and re-dispatch the wright;
|
|
@@ -217,28 +224,31 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
|
|
|
217
224
|
**Then run the test-integrity gate (anti-reward-hacking)** — prove the slice didn't reach
|
|
218
225
|
green by weakening its tests:
|
|
219
226
|
```bash
|
|
220
|
-
|
|
221
|
-
[ -f "$
|
|
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)"
|
|
227
|
+
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
|
|
228
|
+
[ -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
229
|
```
|
|
225
230
|
**Exit 3 → hard STOP:** a test was deleted, skipped, or de-asserted since the slice base — the
|
|
226
231
|
slice went green by weakening its tests, a Critical protocol violation. Revert the weakening and
|
|
227
232
|
re-dispatch the wright; do **not** mark the slice `built`.
|
|
228
233
|
|
|
229
234
|
Then, from the wright's artifact, update `state.md`,
|
|
230
|
-
`evidence.md`, `touched-files.md` (and `browser-evidence.md` for UI).
|
|
235
|
+
`evidence.md`, `touched-files.md` (and `browser-evidence.md` for UI). **Persist every
|
|
236
|
+
`Decisions stood` entry from the wright's artifact to a `## Decisions stood` section in
|
|
237
|
+
`decisions.md`, one line each ending `— doubt: <accept | reject-resolved | MISSING>`** — the
|
|
238
|
+
verdict from step 4, or `MISSING` if step 4 was skipped for that entry. Write this ledger at
|
|
239
|
+
record-time **independent of the doubt step**, so a stood decision lands on disk even when it
|
|
240
|
+
was never doubted: `/rite-seal` cross-checks the ledger, and a `doubt: MISSING` entry is the
|
|
241
|
+
skipped-doubt finding that would otherwise leave no trace (the per-slice skip the footprint
|
|
242
|
+
count alone can't catch). If the wright stood no decisions, write `## Decisions stood` with
|
|
243
|
+
`- none` so the absence is recorded, not assumed. If the wright reported
|
|
231
244
|
an approach it tried and backed out of, record it under a `## Dead ends` section in
|
|
232
245
|
`decisions.md` so a retry or the next agent doesn't repeat it.
|
|
233
246
|
**If the wright's `Conventions` field reports a contradiction** (the live code now
|
|
234
247
|
disagrees with a held convention), record the drift — you own this bookkeeping:
|
|
235
248
|
```bash
|
|
236
|
-
|
|
237
|
-
[ -f "$
|
|
238
|
-
|
|
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
|
|
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" conventions contradict --key <key> --slug <slug> \
|
|
251
|
+
--evidence "<what the live code does>" --drift-file .devrites/work/<slug>/drift.md || true
|
|
242
252
|
```
|
|
243
253
|
It lowers the convention's band (or retires it) and appends a `convention-drift` entry to
|
|
244
254
|
`drift.md`. The ledger is **promoted only at `/rite-seal` on GO** — build only records
|
|
@@ -247,10 +257,8 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
|
|
|
247
257
|
[evidence-standard](reference/evidence-standard.md). Append a footprint record for this
|
|
248
258
|
slice's wright dispatch (deterministic run-weight bookkeeping the seal reports):
|
|
249
259
|
```bash
|
|
250
|
-
|
|
251
|
-
[ -f "$
|
|
252
|
-
[ -f "$FP" ] || FP=pack/.claude/skills/devrites-lib/scripts/footprint.sh
|
|
253
|
-
[ -f "$FP" ] && bash "$FP" log <slug> wright "<slice id>" || true
|
|
260
|
+
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
|
|
261
|
+
[ -f "$R" ] && bash "$R" footprint log <slug> wright "<slice id>" || true
|
|
254
262
|
```
|
|
255
263
|
If `.devrites/AFK` is present, decrement
|
|
256
264
|
the budget by running `bash .claude/skills/devrites-lib/scripts/tick-afk.sh <state.md path>` —
|
|
@@ -261,10 +269,8 @@ writes; read them yourself for the doubt/record gates or in the inline fallback:
|
|
|
261
269
|
shared footer (mirror of the step-0 preamble) so the slice meter + flow ribbon are
|
|
262
270
|
deterministic, not model-typed:
|
|
263
271
|
```bash
|
|
264
|
-
|
|
265
|
-
[ -f "$
|
|
266
|
-
[ -f "$PR" ] || PR=pack/.claude/skills/devrites-lib/scripts/progress.sh
|
|
267
|
-
[ -f "$PR" ] && bash "$PR" || echo "(progress footer unavailable on this install)"
|
|
272
|
+
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
|
|
273
|
+
[ -f "$R" ] && bash "$R" progress || echo "(progress footer unavailable on this install)"
|
|
268
274
|
```
|
|
269
275
|
It reads `state.md` (already updated in step 6), so the meter reflects the slice you
|
|
270
276
|
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
|
-
[`../../
|
|
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.
|
|
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
|
-
[`../../
|
|
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"
|
|
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",
|
|
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:
|
|
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",
|
|
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
|
-
|
|
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.
|
|
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", "
|
|
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", "
|
|
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", "
|
|
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"
|
|
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,
|
|
75
|
-
|
|
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
|
|
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
|
|
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
|
|
29
|
-
"absorbed by Slice N" are sufficient
|
|
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:
|
|
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 [`
|
|
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
|
|
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
|
|
85
|
-
-
|
|
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`).
|
|
@@ -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:
|
|
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
|
-
|
|
|
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
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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 [`
|
|
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
|
|
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
|
---
|