devrites 2.2.0 → 2.4.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 (53) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/README.md +30 -17
  3. package/docs/architecture.md +30 -24
  4. package/docs/command-map.md +15 -6
  5. package/docs/flow.md +19 -5
  6. package/docs/orchestration.md +17 -7
  7. package/docs/skills.md +32 -8
  8. package/pack/.claude/agents/devrites-code-reviewer.md +6 -1
  9. package/pack/.claude/agents/devrites-devex-reviewer.md +94 -0
  10. package/pack/.claude/agents/devrites-forge-judge.md +92 -0
  11. package/pack/.claude/agents/devrites-frontend-reviewer.md +8 -0
  12. package/pack/.claude/agents/devrites-retrospector.md +91 -0
  13. package/pack/.claude/agents/devrites-slice-wright.md +18 -5
  14. package/pack/.claude/rules/README.md +5 -2
  15. package/pack/.claude/rules/agents.md +30 -2
  16. package/pack/.claude/rules/anti-patterns.md +11 -0
  17. package/pack/.claude/rules/code-review.md +16 -6
  18. package/pack/.claude/rules/core.md +13 -4
  19. package/pack/.claude/rules/developer-experience.md +119 -0
  20. package/pack/.claude/rules/principles.md +158 -0
  21. package/pack/.claude/rules/spec-grammar.md +106 -0
  22. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +42 -3
  23. package/pack/.claude/skills/devrites-doubt/SKILL.md +1 -1
  24. package/pack/.claude/skills/devrites-lib/SKILL.md +9 -2
  25. package/pack/.claude/skills/devrites-lib/scripts/devrites.sh +8 -0
  26. package/pack/.claude/skills/devrites-lib/scripts/doubt-coverage.sh +39 -0
  27. package/pack/.claude/skills/devrites-lib/scripts/spec-validate.sh +130 -0
  28. package/pack/.claude/skills/rite-adopt/SKILL.md +13 -1
  29. package/pack/.claude/skills/rite-autocomplete/SKILL.md +3 -1
  30. package/pack/.claude/skills/rite-build/SKILL.md +51 -2
  31. package/pack/.claude/skills/rite-build/reference/anti-patterns.md +12 -0
  32. package/pack/.claude/skills/rite-build/reference/forge.md +171 -0
  33. package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +2 -0
  34. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +22 -2
  35. package/pack/.claude/skills/rite-define/SKILL.md +14 -1
  36. package/pack/.claude/skills/rite-frame/SKILL.md +7 -2
  37. package/pack/.claude/skills/rite-learn/SKILL.md +17 -4
  38. package/pack/.claude/skills/rite-polish/SKILL.md +3 -1
  39. package/pack/.claude/skills/rite-prove/SKILL.md +30 -1
  40. package/pack/.claude/skills/rite-quick/SKILL.md +9 -4
  41. package/pack/.claude/skills/rite-review/SKILL.md +5 -2
  42. package/pack/.claude/skills/rite-seal/SKILL.md +39 -4
  43. package/pack/.claude/skills/rite-seal/reference/anti-patterns.md +2 -0
  44. package/pack/.claude/skills/rite-ship/SKILL.md +21 -0
  45. package/pack/.claude/skills/rite-spec/SKILL.md +29 -5
  46. package/pack/.claude/skills/rite-spec/reference/spec-template.md +11 -1
  47. package/pack/.claude/skills/rite-status/SKILL.md +3 -1
  48. package/pack/.claude/skills/rite-vet/SKILL.md +46 -14
  49. package/package.json +1 -1
  50. package/scripts/check-cross-refs.py +4 -0
  51. package/scripts/run-behavioral-evals.sh +170 -0
  52. package/scripts/run-evals.sh +3 -0
  53. package/scripts/validate.sh +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,30 @@
2
2
 
3
3
  All notable changes to DevRites are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and DevRites adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Releases are generated automatically by [semantic-release](https://semantic-release.gitbook.io/) from Conventional Commits on `main`.
4
4
 
5
+ ## [2.4.0](https://github.com/ViktorsBaikers/DevRites/compare/v2.3.0...v2.4.0) (2026-06-27)
6
+
7
+ ### Added
8
+
9
+ * **devrites:** enforce the doubt gate from invocation through seal ([0397cca](https://github.com/ViktorsBaikers/DevRites/commit/0397cca2158ed1e798c29122485d4e2b69ea4f80))
10
+
11
+ ## [2.3.0](https://github.com/ViktorsBaikers/DevRites/compare/v2.2.0...v2.3.0) (2026-06-23)
12
+
13
+ ### Added
14
+
15
+ * **agents:** auto-firing devex-reviewer + retrospector ([425c582](https://github.com/ViktorsBaikers/DevRites/commit/425c582802b5efb18a463a31174420dfb96838fe))
16
+ * **rules:** add project invariants as a trusted gating layer ([e569d7e](https://github.com/ViktorsBaikers/DevRites/commit/e569d7e065d1baf4e974c274d921431cc3c6e26e))
17
+ * **skills:** add spec-grammar validator + scenario hooks ([765430c](https://github.com/ViktorsBaikers/DevRites/commit/765430c3f21bd9f139d9de9ecc4d73e292970505))
18
+ * **skills:** competitive forge builds + structured visual verdict ([c509519](https://github.com/ViktorsBaikers/DevRites/commit/c50951957525a5cbf673ee52d3fa573838092959))
19
+ * **tests:** behavioral evals for gating-skill discipline ([9cfde94](https://github.com/ViktorsBaikers/DevRites/commit/9cfde942cd6fa12d2f08d0cb4f8e3c11354b9355))
20
+
21
+ ### Fixed
22
+
23
+ * **scripts:** allow forge-report.md as a runtime workspace artifact ([e01bd50](https://github.com/ViktorsBaikers/DevRites/commit/e01bd50dcc2d5767d8abd3a1f527ec762dc83583))
24
+
25
+ ### Documentation
26
+
27
+ * **skills:** sync skill/agent/rule counts + catalogue with current pack ([57ea677](https://github.com/ViktorsBaikers/DevRites/commit/57ea6771b2040382b80848cd5c866952b46355c9))
28
+
5
29
  ## [2.2.0](https://github.com/ViktorsBaikers/DevRites/compare/v2.1.0...v2.2.0) (2026-06-23)
6
30
 
7
31
  ### Added
package/README.md CHANGED
@@ -12,17 +12,24 @@ directory: `spec.md` → (`strategy.md`) → `plan.md` + `tasks.md` → (`eng-re
12
12
  files — no chat-context summary required. **Spec Drift Guard** catches the wrong turn
13
13
  before it costs you a day. **AFK mode** runs unattended without silently accepting
14
14
  destructive migrations, auth changes, or red tests. **`type-GO`** demands a literal
15
- typed confirmation before any irreversible commit / push / tag.
15
+ typed confirmation before any irreversible commit / push / tag. **Project principles**
16
+ (`.devrites/principles.md`) — the invariants you declare once ("money in integer cents",
17
+ "no PII in logs", "never break the v1 API") — then gate every plan, build, and seal, with a
18
+ recorded-exception escape hatch instead of silent work-arounds.
16
19
 
17
20
  ```
18
21
  .devrites/
19
22
  ACTIVE # which feature is active
20
23
  AFK # presence = AFK mode; YAML body sets max_slices / notify / allow_gates
24
+ principles.md # project invariants — authored, prescriptive, GATING (the 4th knowledge layer)
25
+ conventions.md # learned project idioms — descriptive, an untrusted prior
26
+ learnings.md # dismissed-finding classes + dead ends — suppresses recurring false positives
21
27
  work/<slug>/
22
28
  brief.md spec.md references.md references/ # spec
23
29
  strategy.md # temper (optional)
24
30
  plan.md tasks.md # define
25
31
  eng-review.md test-plan.md # vet
32
+ forge-report.md # build (only a Forge: yes slice — competed candidates → winner)
26
33
  state.md questions.md decisions.md assumptions.md drift.md
27
34
  touched-files.md evidence.md browser-evidence.md design-brief.md
28
35
  polish-report.md review.md seal.md ship.md handoff.md
@@ -94,7 +101,7 @@ Full diagram set (lifecycle, polish orchestrator, review fan-out, debug loop,
94
101
  rules carrier, workspace state, namespace map) →
95
102
  [`docs/flow.md`](docs/flow.md).
96
103
 
97
- **Status:** [`v2.2.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v2.2.0) — see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
104
+ **Status:** [`v2.4.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v2.4.0) — see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
98
105
 
99
106
  ## Contents
100
107
 
@@ -102,7 +109,7 @@ rules carrier, workspace state, namespace map) →
102
109
  - [Modes — HITL & AFK](#modes--hitl--afk)
103
110
  - [Install](#install) — [npx / bash](#installing) · [upgrade](#upgrading-an-existing-install)
104
111
  - [Recommended setup](#recommended-setup-optional-but-devrites-is-much-sharper-with-it) — codegraph · graphify · browser-harness
105
- - [Skills](#skills) — 31 total · full catalogue in [`docs/skills.md`](docs/skills.md)
112
+ - [Skills](#skills) — 36 total · full catalogue in [`docs/skills.md`](docs/skills.md)
106
113
  - [Typical workflow](#typical-workflow) · [Worked examples](docs/usage.md)
107
114
  - [Engineering rules](#engineering-rules) · [Browser proof ladder](#browser-proof-ladder) · [Frontend & fullstack](#frontend--fullstack)
108
115
  - [Safety & scope](#safety--scope) · [Security model](#security-model)
@@ -275,7 +282,7 @@ investigation, cheaper context, and real browser proof. None are required.
275
282
 
276
283
  ## Skills
277
284
 
278
- The pack ships **31 skills total** — 22 user-invocable `rite-*` workflow + utility skills, 9 model-invoked `devrites-*` specialists. **Prefix convention:** `rite-*` is the user-facing slash-command surface; `devrites-*` is internal (model-invoked, hidden from the menu). Each skill is a structured workflow with its own operating rules, anti-rationalization tables, and red flags. Engineering rules live at `.claude/rules/`; each `rite-*` skill Reads `.claude/rules/core.md` as its first step, and the other 15 rule files load on demand.
285
+ The pack ships **36 skills total** — 24 user-invocable `rite-*` workflow + utility skills, 11 model-invoked `devrites-*` specialists, plus the internal `devrites-lib` library (scripts the workflow skills run, not a command). **Prefix convention:** `rite-*` is the user-facing slash-command surface; `devrites-*` is internal (model-invoked, hidden from the menu). Each skill is a structured workflow with its own operating rules, anti-rationalization tables, and red flags. Engineering rules live at `.claude/rules/`; each `rite-*` skill Reads `.claude/rules/core.md` as its first step, and the other 22 rule files load on demand.
279
286
 
280
287
  **Two invocation forms.** Every user-invocable skill responds to **both** `/rite <verb>` (menu form — type `/rite` to discover) and `/rite-<verb>` (direct shortcut — muscle memory). The forms are equivalent: `/rite build slice-2` ≡ `/rite-build slice-2`. Use whichever reads more naturally.
281
288
 
@@ -297,12 +304,12 @@ Pinned aliases live at `.claude/skills/<alias>/SKILL.md`. The script refuses `ri
297
304
  | Group | Skills |
298
305
  |---|---|
299
306
  | Lifecycle (8) | `rite-spec` · `rite-define` · `rite-build` · `rite-prove` · `rite-polish` · `rite-review` · `rite-seal` · `rite-ship` |
300
- | On-ramp (optional) | `rite-adopt` — onboard an existing codebase: reverse-derive `spec.md` + seed the conventions ledger, then hand off to the lifecycle |
307
+ | On-ramp (optional) | `rite-adopt` — onboard an existing codebase: reverse-derive `spec.md`, seed the conventions ledger + propose project principles, then hand off to the lifecycle |
301
308
  | Strategic (optional) | `rite-temper` — strategic spec review between spec and define; mandatory in `rite-autocomplete` |
302
309
  | Engineering (every feature) | `rite-vet` — engineering plan review between define and build; depth scales to stakes, never skipped; always in `rite-autocomplete` |
303
310
  | Resume / replan | `rite-resolve` · `rite-plan` |
304
311
  | Utility | `rite-status` · `rite-doctor` · `rite-zoom-out` · `rite-prototype` · `rite-handoff` · `rite-pressure-test` · `rite-autocomplete` |
305
- | Learning (optional) | `rite-learn` — cross-feature learning loop: mine shipped features for recurring mistakes + dismissed-finding classes, propose project-local lessons into `.devrites/learnings.md` |
312
+ | Learning (optional) | `rite-learn` — cross-feature learning loop: mine shipped features for recurring mistakes + dismissed-finding classes, propose project-local lessons into `.devrites/learnings.md`, and promote recurring invariants to `.devrites/principles.md` |
306
313
  | Menu | `rite` |
307
314
 
308
315
  **Internal `devrites-*` specialists (9)** — model-invoked, hidden from menu:
@@ -312,13 +319,19 @@ Pinned aliases live at `.claude/skills/<alias>/SKILL.md`. The script refuses `ri
312
319
  `devrites-debug-recovery` · `devrites-api-interface` ·
313
320
  `devrites-audit` (axes: `security` · `perf` · `simplify`).
314
321
 
315
- **Review agents (10)** — fresh-context reviewers under `.claude/agents/`:
322
+ **Review agents (12)** — fresh-context reviewers under `.claude/agents/`:
316
323
 
317
324
  `devrites-strategy-reviewer` (pre-plan, via `/rite-temper`) ·
318
325
  `devrites-plan-reviewer` (pre-build, via `/rite-vet`) · `devrites-spec-reviewer` ·
319
326
  `devrites-code-reviewer` · `devrites-test-analyst` · `devrites-frontend-reviewer` ·
320
327
  `devrites-security-auditor` · `devrites-performance-reviewer` ·
321
- `devrites-doubt-reviewer` · `devrites-simplifier-reviewer`.
328
+ `devrites-devex-reviewer` (developer-facing surface, predict at `/rite-vet` + measure-the-boomerang at `/rite-seal`) ·
329
+ `devrites-doubt-reviewer` · `devrites-simplifier-reviewer` ·
330
+ `devrites-forge-judge` (build-time, via `/rite-build` — scores competing candidate builds on a `Forge: yes` slice, picks the winner).
331
+
332
+ **Cross-feature analyst (1)** — fresh-context, read-only, scope is the archive not a diff:
333
+
334
+ `devrites-retrospector` — dispatched at `/rite-ship` close (cadence-gated) to mine shipped features for recurring patterns + trends and **draft** graduation candidates for `/rite-learn`; proposes, never imposes.
322
335
 
323
336
  **Executor agent (1)** — fresh-context, **write-capable** writer under `.claude/agents/`:
324
337
 
@@ -424,15 +437,15 @@ browser-harness, backend-only, polish modes, zoom-out, mid-flight handoff):
424
437
  ## Engineering rules
425
438
 
426
439
  DevRites ships its own stack-agnostic engineering rules and installs them to
427
- `.claude/rules/` — 16 rule files plus a README index. They're **common** by design
428
- (no language assumptions); a project's own conventions always win where they exist.
429
- Skip them with `--no-rules`. Loading model: each `rite-*` skill Reads
430
- `.claude/rules/core.md` as its first step; the other 15 rule files load on
431
- demand via `Read` from the skill body that needs them.
440
+ `.claude/rules/` — 23 rule files plus a README index. They're **common** by design
441
+ (no language assumptions); a project's own conventions always win where they exist, and a
442
+ project's own **principles** (`.devrites/principles.md`) outrank both. Skip them with
443
+ `--no-rules`. Loading model: each `rite-*` skill Reads `.claude/rules/core.md` as its first
444
+ step; the other 22 rule files load on demand via `Read` from the skill body that needs them.
432
445
 
433
446
  | Always-on | On-demand |
434
447
  |---|---|
435
- | `core.md` | `coding-style.md` · `error-handling.md` · `testing.md` · `code-review.md` · `security.md` · `performance.md` · `patterns.md` · `git-workflow.md` · `hooks.md` · `documentation.md` · `development-workflow.md` · `agents.md` · `context-hygiene.md` · `afk-hitl.md` · `anti-patterns.md` |
448
+ | `core.md` | `coding-style.md` · `prose-style.md` · `error-handling.md` · `testing.md` · `spec-grammar.md` · `code-review.md` · `principles.md` · `security.md` · `performance.md` · `observability.md` · `developer-experience.md` · `patterns.md` · `git-workflow.md` · `hooks.md` · `documentation.md` · `development-workflow.md` · `deprecation.md` · `agents.md` · `context-hygiene.md` · `afk-hitl.md` · `anti-patterns.md` · `tooling.md` |
436
449
 
437
450
  Full index with phase mapping: [`pack/.claude/rules/README.md`](pack/.claude/rules/README.md);
438
451
  diagram: [`docs/flow.md` § Engineering-rules loading](docs/flow.md#6-engineering-rules-carrier).
@@ -486,9 +499,9 @@ devrites/
486
499
  # grade-feature · run-outcome-evals · devrites-detect · check-no-global-writes
487
500
  # sync-version · build-release-tarball
488
501
  mcp/ # devrites-mcp.mjs — MCP stdio server over the devrites CLI
489
- pack/.claude/ # skills/ 31 skills — 22 public + 9 model-invoked ─┐
490
- # agents/ 10 reviewers + 1 writer (slice-wright) ├─ the pack
491
- # rules/ 16 rule files + README index
502
+ pack/.claude/ # skills/ 36 skills — 24 public + 12 internal ─┐
503
+ # agents/ 13 read-only + 1 writer (slice-wright) ├─ the pack
504
+ # rules/ 23 rule files + README index
492
505
  evals/ # trigger evals (20/skill) + golden/ outcome-eval fixtures
493
506
  docs/ # architecture · skills · command-map · usage · flow · release · cli-mcp
494
507
  internal/ # research, development notes (gitignored)
@@ -46,22 +46,27 @@ ship.
46
46
  4. **Supporting references** — `reference/*.md` inside each skill. Long checklists,
47
47
  templates, and anti-rationalization tables loaded on demand (progressive
48
48
  disclosure) so `SKILL.md` bodies stay small.
49
- 5. **Agents** — `.claude/agents/devrites-*` fresh-context subagents. Nine **read-only
50
- reviewers**: the post-build set used by `/rite-seal` and the doubt loop
51
- (`devrites-spec-reviewer`, `-code-reviewer`, `-test-analyst`, `-frontend-reviewer`,
52
- `-security-auditor`, `-performance-reviewer`, `-doubt-reviewer`, `-simplifier-reviewer`),
53
- plus the **pre-plan** `devrites-strategy-reviewer` used by `/rite-temper`. Plus one
54
- **write-capable** executor, `devrites-slice-wright`, dispatched by `/rite-build` to write
55
- one slice in a clean context (the write-side mirror of the reviewers).
49
+ 5. **Agents** — `.claude/agents/devrites-*` fresh-context subagents: **13 read-only + 1
50
+ write-capable**. The read-only set is twelve reviewers the post-build fan-out used by
51
+ `/rite-seal` and the doubt loop (`devrites-spec-reviewer`, `-code-reviewer`, `-test-analyst`,
52
+ `-frontend-reviewer`, `-security-auditor`, `-performance-reviewer`, `-devex-reviewer`,
53
+ `-doubt-reviewer`, `-simplifier-reviewer`), the **pre-plan** `devrites-strategy-reviewer`
54
+ (`/rite-temper`), the **pre-build** `devrites-plan-reviewer` (`/rite-vet`), and the
55
+ **build-time** `devrites-forge-judge` (scores competing candidate builds on a `Forge: yes`
56
+ slice) — plus the cross-feature `devrites-retrospector` (mines the shipped archive at
57
+ `/rite-ship` close). The one **write-capable** executor, `devrites-slice-wright`, is
58
+ dispatched by `/rite-build` to write one slice in a clean context (the write-side mirror of
59
+ the reviewers).
56
60
  6. **Engineering rules** — DevRites' own stack-agnostic rules installed to
57
61
  `.claude/rules/`. Each `rite-*` skill Reads `core.md` as its first step
58
- (step 0); 15 on-demand files load by the phase that needs them:
59
- - **Craft:** `coding-style.md` · `patterns.md` · `error-handling.md` ·
60
- `testing.md` · `documentation.md`.
61
- - **Quality / safety:** `code-review.md` · `security.md` ·
62
- `performance.md` · `anti-patterns.md`.
62
+ (step 0); 22 on-demand files load by the phase that needs them:
63
+ - **Craft:** `coding-style.md` · `prose-style.md` · `patterns.md` · `error-handling.md` ·
64
+ `testing.md` · `spec-grammar.md` · `documentation.md`.
65
+ - **Quality / safety:** `code-review.md` · `principles.md` · `security.md` ·
66
+ `performance.md` · `observability.md` · `developer-experience.md` · `deprecation.md` ·
67
+ `anti-patterns.md`.
63
68
  - **Workflow / ops:** `development-workflow.md` · `git-workflow.md` ·
64
- `hooks.md` · `agents.md` · `context-hygiene.md` · `afk-hitl.md`.
69
+ `hooks.md` · `agents.md` · `context-hygiene.md` · `afk-hitl.md` · `tooling.md`.
65
70
  - **Index:** `README.md` (phase mapping, loading model).
66
71
 
67
72
  State lives in `.devrites/` as human-readable Markdown so it survives context
@@ -75,7 +80,7 @@ per-skill catalog with triggers + I/O.
75
80
  ### Why a shared orientation preamble (`devrites-lib`)
76
81
  Every workspace-operating skill's first move is the same: orient on the active feature —
77
82
  slug, phase, artifacts present, run mode, open-question tally — before acting. Re-deriving
78
- that from raw Markdown in each skill was duplicated (step-0 prose across ~15 skills),
83
+ that from raw Markdown in each skill was duplicated (step-0 prose across ~20 skills),
79
84
  token-heavy (counting open gates meant re-reading the append-only `questions.md`, which
80
85
  only grows), and error-prone (a missed AFK sentinel or a miscounted gate changes behavior).
81
86
  So orientation is computed once by one read-only script, `devrites-lib/scripts/preamble.sh`,
@@ -211,20 +216,21 @@ contract.
211
216
 
212
217
  ## Design choices at a glance
213
218
 
214
- - **Surface**: 19 public `rite-*` skills (28 total) — the thin `/rite` menu
219
+ - **Surface**: 24 public `rite-*` skills (36 total) — the thin `/rite` menu
215
220
  (carries the routing) + 8 lifecycle phases (`rite-spec`, `rite-define`,
216
221
  `rite-build`, `rite-prove`, `rite-polish`, `rite-review`, `rite-seal`,
217
222
  `rite-ship` — seal **decides**, ship **executes + closes**) + the
218
223
  `rite-temper` (strategic, optional) and `rite-vet` (engineering, every plan)
219
- reviews +
220
- `rite-status` +
221
- the `rite-plan` replan verb + the `rite-resolve` resume verb + 5 utilities
222
- (`rite-zoom-out`, `rite-prototype`, `rite-handoff`, `rite-pressure-test`,
223
- `rite-autocomplete` — the unattended full-lifecycle orchestrator) — plus 9
224
- internal model-invoked `devrites-*` specialists, not one mega-command. The
225
- `devrites-` prefix is a namespace (collision avoidance), not a
226
- public/internal marker `user-invocable:` is. All `devrites-*` skills are
227
- model-invoked.
224
+ reviews + the `rite-quick` express lane and `rite-frame` pre-flight/self-audit
225
+ lens + `rite-adopt` (onboard an existing codebase) + `rite-learn` (cross-feature
226
+ lessons) + `rite-status` + `rite-doctor` (install health) +
227
+ the `rite-plan` replan verb + the `rite-resolve` resume verb + 4 ideation /
228
+ handoff utilities (`rite-zoom-out`, `rite-prototype`, `rite-handoff`,
229
+ `rite-pressure-test`) + `rite-autocomplete` (the unattended full-lifecycle
230
+ orchestrator) plus 11 internal model-invoked `devrites-*` specialists and the
231
+ `devrites-lib` library, not one mega-command. The `devrites-` prefix is a
232
+ namespace (collision avoidance), not a public/internal marker —
233
+ `user-invocable:` is. All `devrites-*` skills are model-invoked.
228
234
  - **Selection**: the `/rite` menu skill carries the routing table; every
229
235
  workflow skill enforces a "right skill, right time" rule in its body.
230
236
  - **State**: durable `.devrites/` Markdown that survives compaction and new sessions.
@@ -12,8 +12,9 @@ what it writes, and how the pieces interact.
12
12
  `devrites-` is a **namespace prefix** chosen for collision avoidance against
13
13
  bundled Claude Code skill names (`prototype`, `handoff`, `triage`, `diagnose`,
14
14
  …). It does **not** signal "internal" — visibility is governed by the
15
- `user-invocable:` flag in each `SKILL.md`. All five public utilities use the
16
- `rite-*` prefix (`rite-zoom-out`, `rite-prototype`, `rite-handoff`,
15
+ `user-invocable:` flag in each `SKILL.md`. All public utilities use the
16
+ `rite-*` prefix (`rite-quick`, `rite-frame`, `rite-adopt`, `rite-learn`,
17
+ `rite-doctor`, `rite-zoom-out`, `rite-prototype`, `rite-handoff`,
17
18
  `rite-pressure-test`, `rite-autocomplete`); every `devrites-*` skill is
18
19
  model-invoked.
19
20
 
@@ -35,6 +36,8 @@ model-invoked.
35
36
  | [`/rite-ship`](../pack/.claude/skills/rite-ship/SKILL.md) | ship | `[slug]` | Final phase. Requires a GO in `seal.md` → renders type-`GO` + runs the irreversible git ladder (commit → push → tag/PR) + closes the task (archive workspace → `.devrites/archive/<slug>/`, clear `ACTIVE`, phase `done`). Triggers: "ship it", "ship this", "push it out", "close the task". | `seal.md` + all artifacts + diff | `ship.md`, `state.md`, archive |
36
37
  | [`/rite-autocomplete`](../pack/.claude/skills/rite-autocomplete/SKILL.md) | (orchestrator) | `[idea] [--ship\|--yolo] [--max-slices N]` | Full unattended lifecycle (spec → … → seal → ship), best option at each soft gate, rationale to `decisions.md`. Vague prompt → up-front interview; pauses on hard-risk / blocking / escalating / open-validating / NO-GO / budget-exhausted. Default stops at the final type-`GO`; `--ship` flag (alias `--yolo`) auto-confirms it. Triggers: "autocomplete", "do the whole thing". | idea + workspace | whole workspace (drives every phase) |
37
38
  | [`/rite-quick`](../pack/.claude/skills/rite-quick/SKILL.md) | (express) | `<change>` | Express lane for a **small, reversible, unambiguous** change — one-line contract → TDD build → scoped prove → review-lite → ship, no full artifact tree. **Significance gate first**: auth / migration / public-API / destructive / multi-slice / ambiguous → escalates to `/rite-spec`. Triggers: "quick fix", "small change", "tiny tweak", "just do X". | the change + codebase | code + commit (optional `brief.md` / `evidence.md`) |
39
+ | [`/rite-frame`](../pack/.claude/skills/rite-frame/SKILL.md) | lens | `[ask \| diff]` | Pre-flight + self-audit lens for ad-hoc work the lifecycle gates never see — **FRAME** turns an imperative ask into a falsifiable success criterion + verify command before code; **AUDIT** checks a raw diff against the four LLM coding failure modes (silent assumption / overcomplication / out-of-scope edit / unverifiable goal). Top of `/rite-quick` or before a plain "just do X". | the ask / a raw diff | success criterion + verify command (inline) |
40
+ | [`/rite-adopt`](../pack/.claude/skills/rite-adopt/SKILL.md) | onboard | `[path]` | Bring an EXISTING codebase under DevRites — reverse-derive a `spec.md` of current behavior + placement + architecture, seed the conventions ledger from observed idioms, then hand off to the lifecycle. Triggers: "adopt this project", "onboard this codebase", "we already have code". | the codebase | `spec.md`, `.devrites/conventions.md`, `decisions.md`, `state.md` |
38
41
  | [`/rite-status`](../pack/.claude/skills/rite-status/SKILL.md) | status | `[slug]` | Active feature: phase, run mode (AFK/HITL), status, next action, evidence, open questions by gate, risks, handoff readiness. Reads via the shared `devrites-lib` preamble (portable). | workspace + `.devrites/AFK` | — |
39
42
  | [`/rite-resolve`](../pack/.claude/skills/rite-resolve/SKILL.md) | resume | `<qid> "<answer>"` \| `--drop <qid>` \| `--batch <file>` | Answer / drop / batch-resolve open `questions.md` entries; clears `state.md` `Awaiting human` and sets `Status: running`. Canonical writer for `status: open → answered`. | `questions.md` + `state.md` | `questions.md`, `state.md` |
40
43
  | [`/rite-zoom-out`](../pack/.claude/skills/rite-zoom-out/SKILL.md) | utility | — | One-pass structural map of an unfamiliar area (modules, in-callers, out-calls, decisions) in project vocabulary. Prefers codegraph/graphify. | codebase + ADRs/CONTEXT.md | — |
@@ -42,6 +45,7 @@ model-invoked.
42
45
  | [`/rite-handoff`](../pack/.claude/skills/rite-handoff/SKILL.md) | utility | `[next-session-focus]` | Compacts the chat into a handoff doc. Syncs chat-only context into workspace canonical files. References existing artifacts by path. | chat + workspace | `handoff.md` + sync into canonical files |
43
46
  | [`/rite-learn`](../pack/.claude/skills/rite-learn/SKILL.md) | utility | `[--mine \| "<lesson>"]` | Mine archived features for recurring mistakes / dismissed-finding classes; propose project-local lessons into `.devrites/learnings.md` (loaded by the review skills before a fan-out). | archive + workspace | `.devrites/learnings.md` |
44
47
  | [`/rite-pressure-test`](../pack/.claude/skills/rite-pressure-test/SKILL.md) | utility | `[idea]` | Pressure-test a rough idea: 3–5 genuinely different options → converge on one with trade-off + hinge. | spec / surrounding code | `decisions.md` (optional) |
48
+ | [`/rite-doctor`](../pack/.claude/skills/rite-doctor/SKILL.md) | diagnostic | — | Diagnose DevRites install + workspace health — install integrity, stale `.devrites/ACTIVE`, corrupt workspace, orphaned gates, broken hook wiring. Read-only report. Triggers: "rite doctor", "is DevRites healthy", "why isn't the workflow picking up my feature". | install + workspace | — |
45
49
 
46
50
  ## Internal skills (`user-invocable: false`, model-invoked)
47
51
 
@@ -52,7 +56,9 @@ model-invoked.
52
56
  | [`devrites-doubt`](../pack/.claude/skills/devrites-doubt/SKILL.md) | non-trivial decision in build/review | CLAIM → EXTRACT → DOUBT → RECONCILE → STOP | adversarial; ask user if uncertain |
53
57
  | [`devrites-ux-shape`](../pack/.claude/skills/devrites-ux-shape/SKILL.md) | UI detected in `/rite-spec` | Plan UX/UI before code → `design-brief.md` (direction, states, interaction, visual-direction probe) | the build target; refs: brief-template/visual-direction-probe |
54
58
  | [`devrites-frontend-craft`](../pack/.claude/skills/devrites-frontend-craft/SKILL.md) | UI detected in build/polish | Build **to** `design-brief.md`: register, refine-per-slice, states, anti-slop | refs: shape/craft/design-references |
55
- | [`devrites-browser-proof`](../pack/.claude/skills/devrites-browser-proof/SKILL.md) | UI in prove/polish | Browser proof ladder + evidence schema | harness preferred |
59
+ | [`devrites-prose-craft`](../pack/.claude/skills/devrites-prose-craft/SKILL.md) | a phase writes prose; `/rite-polish` Phase 1 catch | Human-voice writing strip LLM tells, keep precise lists/terms | refs: banned-phrases, structures, examples |
60
+ | [`devrites-browser-proof`](../pack/.claude/skills/devrites-browser-proof/SKILL.md) | UI in prove/polish | Browser proof ladder + evidence schema + the structured **Visual Verdict** table | harness preferred |
61
+ | [`devrites-refresh-indexes`](../pack/.claude/skills/devrites-refresh-indexes/SKILL.md) | Stop hook (auto) or "reindex" | Keep codebase-memory-mcp / codegraph / graphify current after edits | manual force; no-ops when no index |
56
62
  | [`devrites-debug-recovery`](../pack/.claude/skills/devrites-debug-recovery/SKILL.md) | failing tests/build/runtime | 6-phase: loop → reproduce → hypotheses → instrument → fix → cleanup | references split per phase |
57
63
  | [`devrites-api-interface`](../pack/.claude/skills/devrites-api-interface/SKILL.md) | cross-boundary slice | Stable API/contract design | FE/BE split |
58
64
  | [`devrites-audit simplify`](../pack/.claude/skills/devrites-audit/SKILL.md) | `/rite-polish` Phase 1 | Chesterton's Fence, behavior-preserving simplification | dispatches `devrites-simplifier-reviewer` |
@@ -62,21 +68,24 @@ model-invoked.
62
68
 
63
69
  ## Agents (`.claude/agents/devrites-*`, fresh-context subagents)
64
70
 
65
- Ten **read-only reviewers** plus one **write-capable** executor (`devrites-slice-wright`).
71
+ **13 read-only** (12 reviewers + the cross-feature `devrites-retrospector`) plus one **write-capable** executor (`devrites-slice-wright`).
66
72
 
67
73
  | Agent | Spawned by | Purpose |
68
74
  |---|---|---|
69
75
  | [`devrites-slice-wright`](../pack/.claude/agents/devrites-slice-wright.md) | `/rite-build` (the build core) | **Write-capable** — turn one slice contract into clean, idiomatic, proven code (orient → TDD → verify, anti-slop); returns a structured artifact, writes no bookkeeping |
70
76
  | [`devrites-strategy-reviewer`](../pack/.claude/agents/devrites-strategy-reviewer.md) | `/rite-temper` (pre-plan) | Spec-vs-rubric strategic review (ambition / scope / premise / pre-mortem / YAGNI / testability / irreversibility / cross-cutting / convention); read-only; **not** part of the seal fan-out |
71
77
  | [`devrites-plan-reviewer`](../pack/.claude/agents/devrites-plan-reviewer.md) | `/rite-vet` (pre-build) | Plan-vs-rubric engineering review (architecture / scope-reuse / plan code-quality / test-coverage design / performance / reversibility / failure-mode coverage), confidence-banded with a quote-the-source verification gate; read-only; **not** part of the seal fan-out |
78
+ | [`devrites-forge-judge`](../pack/.claude/agents/devrites-forge-judge.md) | `/rite-build` on a `Forge: yes` slice | Comparative judge of K=2–3 competing candidate builds (acceptance / test strength / principle fit / simplicity / reuse / anti-slop); picks the single winner to land, names grafts; read-only |
72
79
  | [`devrites-spec-reviewer`](../pack/.claude/agents/devrites-spec-reviewer.md) | `/rite-review` Spec axis; `/rite-seal` | Does the diff implement the spec? Missing/partial/wrong criteria; scope creep |
73
80
  | [`devrites-code-reviewer`](../pack/.claude/agents/devrites-code-reviewer.md) | `/rite-review` Standards axis; `/rite-seal` | Correctness / readability / architecture / maintainability |
74
81
  | [`devrites-test-analyst`](../pack/.claude/agents/devrites-test-analyst.md) | `/rite-seal` | Do the tests actually prove the acceptance criteria? |
75
- | [`devrites-frontend-reviewer`](../pack/.claude/agents/devrites-frontend-reviewer.md) | `/rite-seal` on UI features | UX, a11y, responsive, design-system, anti-AI-slop |
82
+ | [`devrites-frontend-reviewer`](../pack/.claude/agents/devrites-frontend-reviewer.md) | `/rite-seal` on UI features | UX, a11y, responsive, design-system, anti-AI-slop; reads the **Visual Verdict** |
76
83
  | [`devrites-security-auditor`](../pack/.claude/agents/devrites-security-auditor.md) | `/rite-seal` when input/auth/data in scope | OWASP Top 10, trust boundary, secrets, deps |
77
84
  | [`devrites-performance-reviewer`](../pack/.claude/agents/devrites-performance-reviewer.md) | `/rite-seal` when perf relevant | N+1s, hot paths, payload size |
85
+ | [`devrites-devex-reviewer`](../pack/.claude/agents/devrites-devex-reviewer.md) | `/rite-vet` (predict) + `/rite-seal` (measure) when a developer-facing surface is in scope | Developer-experience scorecard + predict-vs-measure boomerang (TTHW, getting-started, error-message quality, ergonomics, docs) |
78
86
  | [`devrites-doubt-reviewer`](../pack/.claude/agents/devrites-doubt-reviewer.md) | `devrites-doubt` loop | Adversarial check of a single claim/decision |
79
87
  | [`devrites-simplifier-reviewer`](../pack/.claude/agents/devrites-simplifier-reviewer.md) | `devrites-audit simplify` | Independent simplification judgment |
88
+ | [`devrites-retrospector`](../pack/.claude/agents/devrites-retrospector.md) | `/rite-ship` close (cadence-gated) | Cross-feature retrospective — mines the shipped archive for recurring patterns + trends; **drafts** graduation candidates for `/rite-learn`; read-only |
80
89
 
81
90
  ## Engineering rules (`pack/.claude/rules/`)
82
91
 
@@ -85,7 +94,7 @@ first step (step 0); the rest are referenced on demand. Full index in
85
94
  [`pack/.claude/rules/README.md`](../pack/.claude/rules/README.md).
86
95
 
87
96
  - `core.md` (always-on) — operating rules + universal anti-rationalizations + 1-line craft disciplines + persistence-before-stopping summary.
88
- - `coding-style.md` · `error-handling.md` · `testing.md` · `code-review.md` · `security.md` · `performance.md` · `patterns.md` · `git-workflow.md` · `hooks.md` · `documentation.md` · `development-workflow.md` · `agents.md` · `context-hygiene.md` · `afk-hitl.md`
97
+ - The other **22 on-demand** (read by the phase that needs them): `coding-style.md` · `prose-style.md` · `error-handling.md` · `testing.md` · `spec-grammar.md` · `code-review.md` · `principles.md` · `security.md` · `performance.md` · `observability.md` · `developer-experience.md` · `patterns.md` · `git-workflow.md` · `hooks.md` · `documentation.md` · `development-workflow.md` · `deprecation.md` · `agents.md` · `context-hygiene.md` · `afk-hitl.md` · `tooling.md`
89
98
  - `anti-patterns.md` — pack-wide rationalizations + red flags. Loaded by each per-phase `rite-*/reference/anti-patterns.md`; can be loaded directly for cross-phase reluctance.
90
99
 
91
100
  ## Trigger conditions (auto-selection)
package/docs/flow.md CHANGED
@@ -20,6 +20,8 @@ flowchart LR
20
20
  Spec -->|spec.md ready| Define[/rite-define/]
21
21
  Define -->|plan.md + tasks.md<br/>each slice tagged AFK/HITL| Build[/rite-build/]
22
22
  Build -->|one slice done<br/>+ evidence| Build
23
+ Build -.->|"Forge: yes slice"| Forge[forge: K candidates<br/>→ devrites-forge-judge → 1 winner]
24
+ Forge -.->|winner lands<br/>forge-report.md| Build
23
25
  Build -->|HITL gate fires| Await{{Awaiting human<br/>state.md + questions.md}}
24
26
  Await -->|"/rite-resolve &lt;qid&gt; &lt;answer&gt;"| Build
25
27
  Build -->|all slices built| Prove[/rite-prove/]
@@ -45,7 +47,7 @@ flowchart LR
45
47
  class Shipped done
46
48
  class Repair repair
47
49
  class Await gate
48
- class Shape internal
50
+ class Shape,Forge internal
49
51
  ```
50
52
 
51
53
  ## 2. `/rite-polish` orchestrator
@@ -117,6 +119,8 @@ flowchart TB
117
119
  Walk -.->|UI only| FERev[devrites-frontend-reviewer]
118
120
  Walk -.->|input/auth/data| SecRev[devrites-security-auditor]
119
121
  Walk -.->|perf relevant| PerfRev[devrites-performance-reviewer]
122
+ VV[/browser-evidence.md<br/>Visual Verdict/] -.->|UI + design-brief.md| FERev
123
+ VV -.->|acceptance-mapped FAIL = NO-GO| Gate
120
124
  SpecRev --> Gate
121
125
  CodeRev --> Gate
122
126
  TestRev --> Gate
@@ -141,6 +145,8 @@ flowchart TB
141
145
  class Gate,YN gate
142
146
  class Go,Ship ship
143
147
  class NoGo stop
148
+ classDef artifact fill:#0f172a,stroke:#9ca3af,color:#f9fafb
149
+ class VV artifact
144
150
  ```
145
151
 
146
152
  ## 5. `devrites-debug-recovery` six-phase loop
@@ -286,7 +292,7 @@ skills (`prototype`, `handoff`, `triage`, `diagnose`). Visibility is the
286
292
 
287
293
  ```mermaid
288
294
  flowchart TB
289
- subgraph Public["Public (user-invocable: true) — 19 skills"]
295
+ subgraph Public["Public (user-invocable: true) — 24 skills"]
290
296
  direction TB
291
297
  R1[/rite/]
292
298
  R2[/rite-spec/]
@@ -303,12 +309,17 @@ flowchart TB
303
309
  R13[/rite-autocomplete/]
304
310
  R10[/rite-status/]
305
311
  R11[/rite-resolve/]
312
+ RQ[/rite-quick/]
313
+ RF[/rite-frame/]
314
+ RA[/rite-adopt/]
315
+ RL[/rite-learn/]
316
+ RD[/rite-doctor/]
306
317
  IPT[/rite-pressure-test/]
307
318
  D1[/rite-zoom-out/]
308
319
  D2[/rite-prototype/]
309
320
  D3[/rite-handoff/]
310
321
  end
311
- subgraph Internal["Internal (user-invocable: false) — 9 skills, model-invoked"]
322
+ subgraph Internal["Internal (user-invocable: false) — 12 skills (11 specialists + devrites-lib library)"]
312
323
  direction TB
313
324
  I1[devrites-api-interface]
314
325
  I2[devrites-audit<br/>security · perf · simplify]
@@ -319,12 +330,15 @@ flowchart TB
319
330
  I7[devrites-interview]
320
331
  I8[devrites-source-driven]
321
332
  I9[devrites-ux-shape]
333
+ I10[devrites-prose-craft]
334
+ I11[devrites-refresh-indexes]
335
+ I12[devrites-lib<br/>library scripts]
322
336
  end
323
337
 
324
338
  classDef pub fill:#064e3b,stroke:#34d399,color:#ecfdf5
325
339
  classDef int fill:#1f2937,stroke:#9ca3af,color:#f9fafb
326
- class R1,R2,RT,R3,RV,R4,R5,R6,R7,R8,R9,R12,R13,R10,R11,IPT,D1,D2,D3 pub
327
- class I1,I2,I3,I4,I5,I6,I7,I8,I9 int
340
+ class R1,R2,RT,R3,RV,R4,R5,R6,R7,R8,R9,R12,R13,R10,R11,RQ,RF,RA,RL,RD,IPT,D1,D2,D3 pub
341
+ class I1,I2,I3,I4,I5,I6,I7,I8,I9,I10,I11,I12 int
328
342
  ```
329
343
 
330
344
  ## 9. AFK & HITL state machine
@@ -29,7 +29,12 @@ its judgment is independent.
29
29
  the orchestrator reconciles — banding by confidence and surfacing genuine disagreement explicitly
30
30
  rather than averaging it away.
31
31
  3. **Single writer.** Exactly one `devrites-slice-wright` per slice, never a parallel fan-out of
32
- writers — concurrent writers make conflicting implicit decisions that corrupt a coherent design.
32
+ writers *sharing a tree* — concurrent writers on one tree make conflicting implicit decisions
33
+ that corrupt a coherent design. The one sanctioned exception is a **forge** slice
34
+ (`Forge: yes`, flagged by `/rite-vet`): K=2–3 candidate wrights build it on distinct strategies
35
+ in **isolated** worktrees, `devrites-forge-judge` scores them, and exactly one winner's diff
36
+ lands — no tree ever has two authors, so the invariant holds
37
+ ([`rite-build/reference/forge.md`](../pack/.claude/skills/rite-build/reference/forge.md)).
33
38
  4. **Lifecycle as user-driven verbs.** Each verb performs one mutation and stops; chaining is
34
39
  explicit (the user types the next command), so there are no hidden side effects between phases.
35
40
  `/rite-autocomplete` is the one deliberate exception — an opt-in unattended driver.
@@ -41,7 +46,8 @@ its judgment is independent.
41
46
  - **A persona that paraphrases another.** Passing one agent's summary to the next is lossy telephone;
42
47
  reviewers read the raw diff and contract, not a digest of the author's reasoning.
43
48
  - **Parallel writers.** See single-writer above — two agents editing the same feature concurrently
44
- is a merge of conflicting decisions, not a speed-up.
49
+ is a merge of conflicting decisions, not a speed-up. (Forge is *not* this: its candidates write in
50
+ **isolated** worktrees and exactly one lands, so no tree is ever co-authored.)
45
51
  - **A router that does the work.** `/rite` is a *thin dispatcher* — it renders the menu, resolves a
46
52
  verb to a skill, and gets out of the way. It holds no phase logic and produces no artifact itself.
47
53
  (This is the distinction that makes a router fine: the anti-pattern is a "meta-orchestrator"
@@ -57,11 +63,15 @@ Two Claude Code capabilities sit adjacent to DevRites' model; the stance on each
57
63
  plus fresh-context read-only fan-out already give independent context per agent without the
58
64
  coordination overhead, and the lifecycle is intentionally single-slice / single-writer. Reach for
59
65
  Agent Teams for work *outside* that discipline — competing-hypothesis debugging, or exploring
60
- several genuinely different approaches in parallel — not to parallelise a DevRites build.
61
- - **Worktree isolation.** Orthogonal to DevRites. A single feature is single-writer on one branch by
62
- design, so DevRites doesn't spawn worktrees itself — but you can run DevRites *inside* a git
63
- worktree to drive two features in parallel without them colliding. The `.devrites/ACTIVE` sentinel
64
- is per-working-tree, so each worktree carries its own active feature.
66
+ several genuinely different approaches in parallel — not to parallelise a DevRites build. The one
67
+ in-lifecycle form of "compete several approaches" is **forge** (a `Forge: yes` slice), and it is
68
+ deliberately bounded: vet-gated, K≤3, isolated, winner-takes-all.
69
+ - **Worktree isolation.** A single feature is single-writer on one branch by design, so DevRites
70
+ doesn't spawn worktrees for ordinary builds but you can run DevRites *inside* a git worktree to
71
+ drive two features in parallel without them colliding (the `.devrites/ACTIVE` sentinel is
72
+ per-working-tree, so each carries its own active feature). The one place DevRites spawns worktrees
73
+ itself is a **forge** slice: each candidate build gets an ephemeral worktree, auto-removed after
74
+ the winner lands.
65
75
 
66
76
  ## See also
67
77
 
package/docs/skills.md CHANGED
@@ -1,8 +1,8 @@
1
- # All 29 skills
1
+ # All 36 skills
2
2
 
3
- The pack ships **29 skills total** — 20 user-invocable `rite-*` workflow + utility skills, 9 model-invoked `devrites-*` specialists. Each skill is a structured workflow with its own operating rules, anti-rationalization tables, and red flags. Engineering rules live at `.claude/rules/`; each `rite-*` skill Reads `.claude/rules/core.md` as its first step (step 0) and pulls the other rule files on demand (no carrier skill, no session-start autoload). A 30th directory — the internal `devrites-lib` library skill (`user-invocable: false`, not a command) — ships the cross-cutting scripts the workflow skills run: the read-only orientation preamble and the `readiness` / `evidence-fresh` / `acceptance` gate scripts, plus the `tick-afk` / `resolve` / `close-out` state mutators. A unified `devrites` CLI and an MCP server expose those ops to any tool (see [`cli-mcp.md`](cli-mcp.md)).
3
+ The pack ships **36 skills total** — 24 user-invocable `rite-*` workflow + utility skills and 11 model-invoked `devrites-*` specialists, plus the internal `devrites-lib` library skill (`user-invocable: false`, not a command) that ships the cross-cutting scripts the workflow skills run: the read-only orientation preamble and the `readiness` / `evidence-fresh` / `acceptance` gate scripts, plus the `tick-afk` / `resolve` / `close-out` state mutators. Each skill is a structured workflow with its own operating rules, anti-rationalization tables, and red flags. Engineering rules live at `.claude/rules/`; each `rite-*` skill Reads `.claude/rules/core.md` as its first step (step 0) and pulls the other 22 rule files on demand (no carrier skill, no session-start autoload). A unified `devrites` CLI and an MCP server expose the `devrites-lib` ops to any tool (see [`cli-mcp.md`](cli-mcp.md)).
4
4
 
5
- **Naming convention.** `rite-*` is the user-facing slash-command surface (lifecycle phases plus utilities — `rite-prototype`, `rite-handoff`, `rite-zoom-out`, `rite-pressure-test`). `devrites-*` is internal (model-invoked, hidden from the menu) and collision-avoiding against bundled Claude Code skill names. Visibility is governed by each skill's `user-invocable:` flag; the prefix mirrors it.
5
+ **Naming convention.** `rite-*` is the user-facing slash-command surface (lifecycle phases plus utilities — `rite-quick`, `rite-frame`, `rite-adopt`, `rite-learn`, `rite-doctor`, `rite-prototype`, `rite-handoff`, `rite-zoom-out`, `rite-pressure-test`). `devrites-*` is internal (model-invoked, hidden from the menu) and collision-avoiding against bundled Claude Code skill names. Visibility is governed by each skill's `user-invocable:` flag; the prefix mirrors it.
6
6
 
7
7
  ---
8
8
 
@@ -54,8 +54,13 @@ Every user-invocable skill responds to **both** `/rite <verb>` (menu form — ty
54
54
  | `/rite prototype` | `/rite-prototype` | utility | Throwaway code that answers ONE design question before committing — routes between a Logic harness (state/data model) and 2–4 radically different UI variations on one route. |
55
55
  | `/rite handoff` | `/rite-handoff` | utility | Compact the chat session into a handoff doc a fresh agent can pick up — syncs to the workspace, references existing artifacts by path. |
56
56
  | `/rite pressure-test` | `/rite-pressure-test` | utility | Diverge → converge on a rough idea before specifying. |
57
+ | `/rite quick` | `/rite-quick` | express | Express lane for a **small, reversible, unambiguous** change — one-line contract → TDD build → scoped prove → review-lite → ship, no full artifact tree. Significance gate first: auth / migration / public-API / destructive / multi-slice / ambiguous → escalates to `/rite-spec`. |
58
+ | `/rite frame` | `/rite-frame` | lens | Pre-flight + self-audit lens for ad-hoc work the lifecycle's gates never see — converts an imperative ask into a falsifiable success criterion + verify command (FRAME), then audits a raw diff against the four LLM coding failure modes (AUDIT). |
59
+ | `/rite adopt` | `/rite-adopt` | onboard | Bring an EXISTING codebase under DevRites — reverse-derive a `spec.md` of current behavior + placement + architecture, and seed the conventions ledger from the idioms the code already follows. |
60
+ | `/rite learn` | `/rite-learn` | utility | Cross-feature learning loop — mine shipped features for recurring mistakes + dismissed-finding classes, propose project-local lessons into `.devrites/learnings.md` (and graduate a recurring invariant to a project principle, human-gated). |
61
+ | `/rite doctor` | `/rite-doctor` | diagnostic | Diagnose DevRites install + workspace health — install integrity, a stale `.devrites/ACTIVE`, a corrupt workspace, orphaned gates, broken hook wiring. |
57
62
 
58
- The 9 model-invoked internal specialists (hidden from the menu): `devrites-interview`, `-source-driven`, `-doubt`, `-ux-shape`, `-frontend-craft`, `-browser-proof`, `-debug-recovery`, `-api-interface`, `-audit` (security / perf / simplify). The `/rite` menu carries the routing, the five user-invocable utilities all use the `rite-*` prefix (`rite-prototype`, `rite-handoff`, `rite-zoom-out`, `rite-pressure-test`, `rite-autocomplete`), and the `/rite-polish` phases live as references inside the same skill rather than as `rite-polish-code` / `rite-polish-ui`. Triggers and interactions are documented in [`command-map.md`](command-map.md); diagrams in [`flow.md`](flow.md).
63
+ The 11 model-invoked internal specialists (hidden from the menu): `devrites-interview`, `-source-driven`, `-doubt`, `-ux-shape`, `-frontend-craft`, `-prose-craft`, `-browser-proof`, `-debug-recovery`, `-api-interface`, `-audit` (security / perf / simplify), `-refresh-indexes`. Plus the `devrites-lib` library skill (scripts, not a command). The `/rite` menu carries the routing, the user-invocable utilities all use the `rite-*` prefix (`rite-quick`, `rite-frame`, `rite-adopt`, `rite-learn`, `rite-doctor`, `rite-prototype`, `rite-handoff`, `rite-zoom-out`, `rite-pressure-test`, `rite-autocomplete`), and the `/rite-polish` phases live as references inside the same skill rather than as `rite-polish-code` / `rite-polish-ui`. Triggers and interactions are documented in [`command-map.md`](command-map.md); diagrams in [`flow.md`](flow.md).
59
64
 
60
65
  ---
61
66
 
@@ -68,6 +73,15 @@ The 9 model-invoked internal specialists (hidden from the menu): `devrites-inter
68
73
  | [`rite`](../pack/.claude/skills/rite/SKILL.md) | Compact menu + active-feature status + suggested next command. Does not run a workflow. | You type `/rite`, ask "what DevRites commands exist", or "where am I". |
69
74
  | [`rite-status`](../pack/.claude/skills/rite-status/SKILL.md) | Read-only report: phase, run mode (AFK/HITL), status, active slice, next action, evidence, open questions by gate, drift, risks. | You ask "where am I", "what's the status", "what's next". |
70
75
  | [`rite-resolve`](../pack/.claude/skills/rite-resolve/SKILL.md) | Answer / drop / batch-resolve open `questions.md` entries; clears `state.md` `Awaiting human` and resumes the workflow. | A HITL checkpoint is open or AFK left blocking questions; you type `/rite-resolve <qid> "<answer>"`. |
76
+ | [`rite-doctor`](../pack/.claude/skills/rite-doctor/SKILL.md) | Diagnose DevRites install + workspace health — install integrity, stale `.devrites/ACTIVE`, corrupt workspace, orphaned gates, broken hook wiring. Read-only report. | "rite doctor", "is DevRites healthy", "why isn't the workflow picking up my feature". |
77
+
78
+ ### Express & ad-hoc — small or unguarded work
79
+
80
+ | Skill | What It Does | Use When |
81
+ |---|---|---|
82
+ | [`rite-quick`](../pack/.claude/skills/rite-quick/SKILL.md) | Express lane for a **small, reversible, unambiguous** change — one-line contract → TDD build → scoped prove → review-lite → ship, collapsing the full lifecycle into one pass. Significance gate first: auth / migration / public-API / destructive / multi-slice / ambiguous **escalates to `/rite-spec`**. | "quick fix", "small change", "tiny tweak", "just do X" on a low-risk change. |
83
+ | [`rite-frame`](../pack/.claude/skills/rite-frame/SKILL.md) | Pre-flight + self-audit lens for ad-hoc work the lifecycle gates never see — FRAME converts an imperative ask into a falsifiable success criterion + verify command before code; AUDIT checks a raw diff against the four LLM coding failure modes (silent assumption / overcomplication / out-of-scope edit / unverifiable goal). | Top of `/rite-quick`, before a plain "just do X" edit, or to self-review a raw diff. |
84
+ | [`rite-adopt`](../pack/.claude/skills/rite-adopt/SKILL.md) | Bring an EXISTING codebase under DevRites — reverse-derive a `spec.md` of current behavior + placement + architecture, and seed the conventions ledger from the idioms the code already follows, then hand off to the lifecycle. | "adopt this project", "onboard this codebase", "we already have code", "reverse-engineer a spec from the existing app". |
71
85
 
72
86
  ### Spec — Understand the ask before any code
73
87
 
@@ -101,17 +115,18 @@ The 9 model-invoked internal specialists (hidden from the menu): `devrites-inter
101
115
 
102
116
  | Skill | What It Does | Use When |
103
117
  |---|---|---|
104
- | [`rite-build`](../pack/.claude/skills/rite-build/SKILL.md) | Orchestrates **exactly one** vertical slice: pre-flight gates, then dispatches a fresh-context [`devrites-slice-wright`](../pack/.claude/agents/devrites-slice-wright.md) for the build core, then doubts / gates / records with evidence. | A plan exists and the next slice is ready. |
118
+ | [`rite-build`](../pack/.claude/skills/rite-build/SKILL.md) | Orchestrates **exactly one** vertical slice: pre-flight gates, then dispatches a fresh-context [`devrites-slice-wright`](../pack/.claude/agents/devrites-slice-wright.md) for the build core, then doubts / gates / records with evidence. A slice `/rite-vet` flagged `Forge: yes` competes K=2–3 isolated candidate builds judged by [`devrites-forge-judge`](../pack/.claude/agents/devrites-forge-judge.md), landing one winner (`forge-report.md`). | A plan exists and the next slice is ready. |
105
119
  | [`devrites-source-driven`](../pack/.claude/skills/devrites-source-driven/SKILL.md) | Consult official docs / source before relying on framework behavior; record the source. | API, config, or framework behavior is assumed rather than known. |
106
120
  | [`devrites-api-interface`](../pack/.claude/skills/devrites-api-interface/SKILL.md) | Design stable API / interface contracts — REST/GraphQL, module boundaries, type contracts, FE/BE split. | A slice crosses a boundary or defines a public interface. |
107
121
  | [`devrites-debug-recovery`](../pack/.claude/skills/devrites-debug-recovery/SKILL.md) | Reproduce → ranked hypotheses → instrument → fix in scope → regression-test. Stops guess-and-retry. | Tests, builds, or runtime checks fail. |
122
+ | [`devrites-refresh-indexes`](../pack/.claude/skills/devrites-refresh-indexes/SKILL.md) | Keep the optional code-intelligence indexes (codebase-memory-mcp, codegraph, graphify) current so the next structural lookup reads live code, not a stale graph. The Stop hook runs it automatically; this skill is the manual force. | Index looks stale, after a large change before a structural query, or "reindex" / "the graph is stale". |
108
123
 
109
124
  ### Prove — Real evidence, including the browser
110
125
 
111
126
  | Skill | What It Does | Use When |
112
127
  |---|---|---|
113
128
  | [`rite-prove`](../pack/.claude/skills/rite-prove/SKILL.md) | Tests + build + runtime + browser evidence for the current scope. | All slices built; ready for full verification. |
114
- | [`devrites-browser-proof`](../pack/.claude/skills/devrites-browser-proof/SKILL.md) | Browser proof ladder: browser-harness → Chrome DevTools MCP → `/run`+`/verify` → project E2E → manual. | Scope touches UI. |
129
+ | [`devrites-browser-proof`](../pack/.claude/skills/devrites-browser-proof/SKILL.md) | Browser proof ladder: browser-harness → Chrome DevTools MCP → `/run`+`/verify` → project E2E → manual. Auto-emits the structured **Visual Verdict** (per-criterion PASS/FAIL vs `design-brief.md`) for UI slices — consumed by `devrites-frontend-reviewer` and gated at `/rite-seal`. | Scope touches UI. |
115
130
 
116
131
  ### Polish — Normalize, then ship-quality detail pass
117
132
 
@@ -119,6 +134,7 @@ The 9 model-invoked internal specialists (hidden from the menu): `devrites-inter
119
134
  |---|---|---|
120
135
  | [`rite-polish`](../pack/.claude/skills/rite-polish/SKILL.md) | Orchestrator. Always runs code polish (`reference/code.md`); detects UI scope and runs UI normalize + polish (`reference/ui.md`) when needed. Accepts mode tokens (`bolder`, `quieter`, `distill`, `harden`, `normalize-only`). | All slices proven; ready to finish. |
121
136
  | [`devrites-frontend-craft`](../pack/.claude/skills/devrites-frontend-craft/SKILL.md) | Senior frontend craft — register, shape-before-code, all states, design system, anti-AI-slop, Core Web Vitals + WCAG 2.2. | A slice touches UI. |
137
+ | [`devrites-prose-craft`](../pack/.claude/skills/devrites-prose-craft/SKILL.md) | Human-voice writing for artifacts + replies — strips the LLM tells (filler openers, false contrasts, fake profundity, em-dash tics, hedging) while keeping precise lists, exact terms, and spec structure. The catch pass in `/rite-polish` Phase 1. | A phase writes prose (spec / plan / decisions / review / seal / commit / PR bodies) or a user-facing reply. |
122
138
 
123
139
  ### Review — Adversarial, scoped to the feature
124
140
 
@@ -154,27 +170,35 @@ The 9 model-invoked internal specialists (hidden from the menu): `devrites-inter
154
170
 
155
171
  | Skill | What It Does | Use When |
156
172
  |---|---|---|
157
- | (engineering rules) | Live at `.claude/rules/` post-install — each `rite-*` skill Reads `.claude/rules/core.md` as its first step (step 0); the other 19 rule files (`coding-style.md`, `prose-style.md`, `error-handling.md`, `testing.md`, `code-review.md`, `security.md`, `performance.md`, `observability.md`, `patterns.md`, `git-workflow.md`, `hooks.md`, `documentation.md`, `development-workflow.md`, `deprecation.md`, `agents.md`, `context-hygiene.md`, `anti-patterns.md`, `afk-hitl.md`, `tooling.md`) load on demand per skill body. No carrier skill, no session-start autoload. | n/a — step-0 core / on-demand by path. |
173
+ | (engineering rules) | Live at `.claude/rules/` post-install — each `rite-*` skill Reads `.claude/rules/core.md` as its first step (step 0); the other 22 rule files (`coding-style.md`, `prose-style.md`, `error-handling.md`, `testing.md`, `spec-grammar.md`, `code-review.md`, `principles.md`, `security.md`, `performance.md`, `observability.md`, `developer-experience.md`, `patterns.md`, `git-workflow.md`, `hooks.md`, `documentation.md`, `development-workflow.md`, `deprecation.md`, `agents.md`, `context-hygiene.md`, `anti-patterns.md`, `afk-hitl.md`, `tooling.md`) load on demand per skill body. No carrier skill, no session-start autoload. | n/a — step-0 core / on-demand by path. |
158
174
 
159
175
  ---
160
176
 
161
177
  ## Review agents — Fresh-context reviewers
162
178
 
163
- Spawned by `/rite-review`, `/rite-seal` (post-build), `/rite-temper` (pre-plan), and `/rite-vet` (pre-build) for independent judgment. Read-only; given only the artifact + rubric, never the author's reasoning.
179
+ Spawned by `/rite-review`, `/rite-seal` (post-build), `/rite-temper` (pre-plan), `/rite-vet` (pre-build), and `/rite-build` (the forge judge, on a `Forge: yes` slice) for independent judgment. Read-only; given only the artifact + rubric, never the author's reasoning. **13 read-only** in all (12 reviewers + the cross-feature `devrites-retrospector`); plus the one **write-capable** `devrites-slice-wright` below.
164
180
 
165
181
  | Agent | Purpose |
166
182
  |---|---|
167
183
  | [`devrites-strategy-reviewer`](../pack/.claude/agents/devrites-strategy-reviewer.md) | **Pre-plan** spec-vs-rubric strategic review (ambition / scope / premise / pre-mortem / YAGNI / testability / irreversibility / cross-cutting / convention) — via `/rite-temper`, not the seal fan-out. |
168
184
  | [`devrites-plan-reviewer`](../pack/.claude/agents/devrites-plan-reviewer.md) | **Pre-build** plan-vs-rubric engineering review (architecture / scope-reuse / plan code-quality / test-coverage design / performance / reversibility / failure-mode coverage), confidence-banded with a quote-the-source verification gate — via `/rite-vet`, not the seal fan-out. |
185
+ | [`devrites-forge-judge`](../pack/.claude/agents/devrites-forge-judge.md) | **Build-time** comparative judge of K=2–3 competing candidate builds of one slice (acceptance / test strength / principle fit / simplicity / reuse / anti-slop) — via `/rite-build` on a `Forge: yes` slice; picks the single winner to land, names grafts. |
169
186
  | [`devrites-spec-reviewer`](../pack/.claude/agents/devrites-spec-reviewer.md) | Does the diff implement the spec? Missing / partial / wrong criteria; scope creep. |
170
187
  | [`devrites-code-reviewer`](../pack/.claude/agents/devrites-code-reviewer.md) | Correctness / readability / architecture / maintainability. |
171
188
  | [`devrites-test-analyst`](../pack/.claude/agents/devrites-test-analyst.md) | Do the tests actually prove the acceptance criteria? |
172
189
  | [`devrites-frontend-reviewer`](../pack/.claude/agents/devrites-frontend-reviewer.md) | UX, a11y, responsive, design-system, anti-AI-slop. |
173
190
  | [`devrites-security-auditor`](../pack/.claude/agents/devrites-security-auditor.md) | OWASP Top 10, trust boundary, secrets, deps. |
174
191
  | [`devrites-performance-reviewer`](../pack/.claude/agents/devrites-performance-reviewer.md) | N+1s, hot paths, payload size. |
192
+ | [`devrites-devex-reviewer`](../pack/.claude/agents/devrites-devex-reviewer.md) | Developer-experience scorecard + the predict-vs-measure boomerang (TTHW, getting-started, error-message quality, ergonomics, docs) — predicts at `/rite-vet`, measures + reconciles at `/rite-seal`, when a developer-facing surface (API / CLI / SDK / webhook / config / errors / getting-started) is in scope. |
175
193
  | [`devrites-doubt-reviewer`](../pack/.claude/agents/devrites-doubt-reviewer.md) | Adversarial check of a single claim/decision. |
176
194
  | [`devrites-simplifier-reviewer`](../pack/.claude/agents/devrites-simplifier-reviewer.md) | Independent simplification judgment (called by `devrites-audit simplify`). |
177
195
 
196
+ **Cross-feature analyst** (read-only, scope is the archive not a diff):
197
+
198
+ | Agent | Purpose |
199
+ |---|---|
200
+ | [`devrites-retrospector`](../pack/.claude/agents/devrites-retrospector.md) | Mine the shipped `.devrites/archive/<slug>/` workspaces for recurring patterns + trends (repeated review findings, recurring drift, dead-ends, GO/NO-GO + rework signal) and **draft** graduation candidates for `/rite-learn`. Proposes, never imposes. Dispatched at `/rite-ship` close, cadence-gated. |
201
+
178
202
  Seal fan-out diagram: [`flow.md` § /rite-seal fan-out](flow.md#4-rite-seal-fan-out).
179
203
 
180
204
  ---