devrites 2.1.0 → 2.3.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 (57) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +31 -17
  3. package/docs/architecture.md +30 -24
  4. package/docs/command-map.md +15 -6
  5. package/docs/flow.md +20 -6
  6. package/docs/orchestration.md +81 -0
  7. package/docs/skills.md +32 -8
  8. package/pack/.claude/agents/devrites-code-reviewer.md +40 -4
  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-security-auditor.md +21 -1
  14. package/pack/.claude/agents/devrites-slice-wright.md +18 -5
  15. package/pack/.claude/rules/README.md +7 -2
  16. package/pack/.claude/rules/afk-hitl.md +6 -0
  17. package/pack/.claude/rules/agents.md +30 -2
  18. package/pack/.claude/rules/anti-patterns.md +11 -0
  19. package/pack/.claude/rules/code-review.md +16 -6
  20. package/pack/.claude/rules/core.md +13 -4
  21. package/pack/.claude/rules/deprecation.md +50 -0
  22. package/pack/.claude/rules/developer-experience.md +119 -0
  23. package/pack/.claude/rules/observability.md +60 -0
  24. package/pack/.claude/rules/patterns.md +3 -0
  25. package/pack/.claude/rules/principles.md +158 -0
  26. package/pack/.claude/rules/security.md +31 -0
  27. package/pack/.claude/rules/spec-grammar.md +106 -0
  28. package/pack/.claude/skills/devrites-browser-proof/SKILL.md +42 -3
  29. package/pack/.claude/skills/devrites-lib/SKILL.md +9 -2
  30. package/pack/.claude/skills/devrites-lib/scripts/devrites.sh +8 -0
  31. package/pack/.claude/skills/devrites-lib/scripts/spec-validate.sh +130 -0
  32. package/pack/.claude/skills/rite-adopt/SKILL.md +13 -1
  33. package/pack/.claude/skills/rite-autocomplete/SKILL.md +3 -1
  34. package/pack/.claude/skills/rite-build/SKILL.md +36 -1
  35. package/pack/.claude/skills/rite-build/reference/anti-patterns.md +12 -0
  36. package/pack/.claude/skills/rite-build/reference/forge.md +171 -0
  37. package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +2 -0
  38. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +22 -2
  39. package/pack/.claude/skills/rite-define/SKILL.md +14 -1
  40. package/pack/.claude/skills/rite-frame/SKILL.md +7 -2
  41. package/pack/.claude/skills/rite-learn/SKILL.md +17 -4
  42. package/pack/.claude/skills/rite-polish/SKILL.md +3 -1
  43. package/pack/.claude/skills/rite-prove/SKILL.md +40 -1
  44. package/pack/.claude/skills/rite-quick/SKILL.md +9 -4
  45. package/pack/.claude/skills/rite-review/SKILL.md +5 -2
  46. package/pack/.claude/skills/rite-review/reference/five-axis-review.md +15 -1
  47. package/pack/.claude/skills/rite-seal/SKILL.md +33 -4
  48. package/pack/.claude/skills/rite-ship/SKILL.md +21 -0
  49. package/pack/.claude/skills/rite-spec/SKILL.md +29 -5
  50. package/pack/.claude/skills/rite-spec/reference/spec-template.md +11 -1
  51. package/pack/.claude/skills/rite-status/SKILL.md +3 -1
  52. package/pack/.claude/skills/rite-vet/SKILL.md +46 -14
  53. package/package.json +1 -1
  54. package/scripts/check-cross-refs.py +4 -0
  55. package/scripts/run-behavioral-evals.sh +170 -0
  56. package/scripts/run-evals.sh +3 -0
  57. package/scripts/validate.sh +16 -7
package/CHANGELOG.md CHANGED
@@ -2,10 +2,39 @@
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.3.0](https://github.com/ViktorsBaikers/DevRites/compare/v2.2.0...v2.3.0) (2026-06-23)
6
+
7
+ ### Added
8
+
9
+ * **agents:** auto-firing devex-reviewer + retrospector ([425c582](https://github.com/ViktorsBaikers/DevRites/commit/425c582802b5efb18a463a31174420dfb96838fe))
10
+ * **rules:** add project invariants as a trusted gating layer ([e569d7e](https://github.com/ViktorsBaikers/DevRites/commit/e569d7e065d1baf4e974c274d921431cc3c6e26e))
11
+ * **skills:** add spec-grammar validator + scenario hooks ([765430c](https://github.com/ViktorsBaikers/DevRites/commit/765430c3f21bd9f139d9de9ecc4d73e292970505))
12
+ * **skills:** competitive forge builds + structured visual verdict ([c509519](https://github.com/ViktorsBaikers/DevRites/commit/c50951957525a5cbf673ee52d3fa573838092959))
13
+ * **tests:** behavioral evals for gating-skill discipline ([9cfde94](https://github.com/ViktorsBaikers/DevRites/commit/9cfde942cd6fa12d2f08d0cb4f8e3c11354b9355))
14
+
15
+ ### Fixed
16
+
17
+ * **scripts:** allow forge-report.md as a runtime workspace artifact ([e01bd50](https://github.com/ViktorsBaikers/DevRites/commit/e01bd50dcc2d5767d8abd3a1f527ec762dc83583))
18
+
19
+ ### Documentation
20
+
21
+ * **skills:** sync skill/agent/rule counts + catalogue with current pack ([57ea677](https://github.com/ViktorsBaikers/DevRites/commit/57ea6771b2040382b80848cd5c866952b46355c9))
22
+
23
+ ## [2.2.0](https://github.com/ViktorsBaikers/DevRites/compare/v2.1.0...v2.2.0) (2026-06-23)
24
+
25
+ ### Added
26
+
27
+ * **rules:** add observability + deprecation rules, OWASP LLM Top 10 ([0c29760](https://github.com/ViktorsBaikers/DevRites/commit/0c29760e504c22c18d7ca2c5e1986746ba95a07d))
28
+
29
+ ### Fixed
30
+
31
+ * **release:** drop duplicate 2.1.0 changelog block ([0a7b510](https://github.com/ViktorsBaikers/DevRites/commit/0a7b5101ecd05e4c0b4d3812cefc68c0f92f1626))
32
+
5
33
  ## [2.1.0](https://github.com/ViktorsBaikers/DevRites/compare/v2.0.0...v2.1.0) (2026-06-23)
6
34
 
7
35
  ### Added
8
36
 
37
+ * **agents:** code reviewer gets structural-depth lenses ([b37c9d2](https://github.com/ViktorsBaikers/DevRites/commit/b37c9d259b99613b971269fac2943977dedbea6d))
9
38
  * **agents:** perf reviewer gets Source/Measured CWV modes ([be82b20](https://github.com/ViktorsBaikers/DevRites/commit/be82b20b37252a9f55d77e0f71659ec58a213ca6))
10
39
 
11
40
  ## [2.0.0](https://github.com/ViktorsBaikers/DevRites/compare/v1.18.0...v2.0.0) (2026-06-23)
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.1.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v2.1.0) — see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
104
+ **Status:** [`v2.3.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v2.3.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)
@@ -113,6 +120,7 @@ rules carrier, workspace state, namespace map) →
113
120
  [skills catalogue](docs/skills.md) ·
114
121
  [command map](docs/command-map.md) ·
115
122
  [flow diagrams](docs/flow.md) ·
123
+ [orchestration](docs/orchestration.md) ·
116
124
  [usage examples](docs/usage.md) ·
117
125
  [release pipeline](docs/release.md) ·
118
126
  [engineering rules](pack/.claude/rules/README.md)
@@ -274,7 +282,7 @@ investigation, cheaper context, and real browser proof. None are required.
274
282
 
275
283
  ## Skills
276
284
 
277
- 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.
278
286
 
279
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.
280
288
 
@@ -296,12 +304,12 @@ Pinned aliases live at `.claude/skills/<alias>/SKILL.md`. The script refuses `ri
296
304
  | Group | Skills |
297
305
  |---|---|
298
306
  | Lifecycle (8) | `rite-spec` · `rite-define` · `rite-build` · `rite-prove` · `rite-polish` · `rite-review` · `rite-seal` · `rite-ship` |
299
- | 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 |
300
308
  | Strategic (optional) | `rite-temper` — strategic spec review between spec and define; mandatory in `rite-autocomplete` |
301
309
  | Engineering (every feature) | `rite-vet` — engineering plan review between define and build; depth scales to stakes, never skipped; always in `rite-autocomplete` |
302
310
  | Resume / replan | `rite-resolve` · `rite-plan` |
303
311
  | Utility | `rite-status` · `rite-doctor` · `rite-zoom-out` · `rite-prototype` · `rite-handoff` · `rite-pressure-test` · `rite-autocomplete` |
304
- | 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` |
305
313
  | Menu | `rite` |
306
314
 
307
315
  **Internal `devrites-*` specialists (9)** — model-invoked, hidden from menu:
@@ -311,13 +319,19 @@ Pinned aliases live at `.claude/skills/<alias>/SKILL.md`. The script refuses `ri
311
319
  `devrites-debug-recovery` · `devrites-api-interface` ·
312
320
  `devrites-audit` (axes: `security` · `perf` · `simplify`).
313
321
 
314
- **Review agents (10)** — fresh-context reviewers under `.claude/agents/`:
322
+ **Review agents (12)** — fresh-context reviewers under `.claude/agents/`:
315
323
 
316
324
  `devrites-strategy-reviewer` (pre-plan, via `/rite-temper`) ·
317
325
  `devrites-plan-reviewer` (pre-build, via `/rite-vet`) · `devrites-spec-reviewer` ·
318
326
  `devrites-code-reviewer` · `devrites-test-analyst` · `devrites-frontend-reviewer` ·
319
327
  `devrites-security-auditor` · `devrites-performance-reviewer` ·
320
- `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.
321
335
 
322
336
  **Executor agent (1)** — fresh-context, **write-capable** writer under `.claude/agents/`:
323
337
 
@@ -423,15 +437,15 @@ browser-harness, backend-only, polish modes, zoom-out, mid-flight handoff):
423
437
  ## Engineering rules
424
438
 
425
439
  DevRites ships its own stack-agnostic engineering rules and installs them to
426
- `.claude/rules/` — 16 rule files plus a README index. They're **common** by design
427
- (no language assumptions); a project's own conventions always win where they exist.
428
- Skip them with `--no-rules`. Loading model: each `rite-*` skill Reads
429
- `.claude/rules/core.md` as its first step; the other 15 rule files load on
430
- 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.
431
445
 
432
446
  | Always-on | On-demand |
433
447
  |---|---|
434
- | `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` |
435
449
 
436
450
  Full index with phase mapping: [`pack/.claude/rules/README.md`](pack/.claude/rules/README.md);
437
451
  diagram: [`docs/flow.md` § Engineering-rules loading](docs/flow.md#6-engineering-rules-carrier).
@@ -485,9 +499,9 @@ devrites/
485
499
  # grade-feature · run-outcome-evals · devrites-detect · check-no-global-writes
486
500
  # sync-version · build-release-tarball
487
501
  mcp/ # devrites-mcp.mjs — MCP stdio server over the devrites CLI
488
- pack/.claude/ # skills/ 31 skills — 22 public + 9 model-invoked ─┐
489
- # agents/ 10 reviewers + 1 writer (slice-wright) ├─ the pack
490
- # 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
491
505
  evals/ # trigger evals (20/skill) + golden/ outcome-eval fixtures
492
506
  docs/ # architecture · skills · command-map · usage · flow · release · cli-mcp
493
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
@@ -177,7 +183,7 @@ demands. No carrier skill, no session-start autoload.
177
183
  ```mermaid
178
184
  flowchart TD
179
185
  R[rite-* skill<br/>step 0] -->|always-on| Core[.claude/rules/core.md]
180
- R -->|on demand index| Idx[(.claude/rules/README.md<br/>15 specialist rule files)]
186
+ R -->|on demand index| Idx[(.claude/rules/README.md<br/>19 specialist rule files)]
181
187
  Idx --> CS[coding-style.md]
182
188
  Idx --> EH[error-handling.md]
183
189
  Idx --> T[testing.md]
@@ -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
@@ -0,0 +1,81 @@
1
+ # Orchestration patterns
2
+
3
+ How DevRites coordinates multiple agents — the patterns it uses, the ones it deliberately avoids,
4
+ and where Claude Code's Agent Teams and worktree isolation fit. The rule that governs this lives in
5
+ [`pack/.claude/rules/agents.md`](../pack/.claude/rules/agents.md); this doc is the map.
6
+
7
+ ## The model
8
+
9
+ DevRites separates three roles and never blurs them:
10
+
11
+ - **Orchestrator** — the active `rite-*` skill (chiefly `/rite-build` and `/rite-seal`). It owns
12
+ the gates and the `.devrites/` workspace, dispatches the other agents, and is the *single
13
+ canonical writer* of workspace state.
14
+ - **Reviewers** — fresh-context, **read-only** subagents under `.claude/agents/`. Each gets the
15
+ workspace path + the diff and returns labelled findings; read-only is enforced at the tool layer
16
+ (`devrites-reviewer-readonly.sh`), not merely promised.
17
+ - **Executor** — `devrites-slice-wright`, the one **write-capable** agent. It implements a single
18
+ fully-specified slice in a fresh context and returns code + tests; it never writes the `.devrites/`
19
+ bookkeeping (the orchestrator does).
20
+
21
+ Fresh, undirected context is the point: an agent gets the contract, not the author's reasoning, so
22
+ its judgment is independent.
23
+
24
+ ## Endorsed patterns
25
+
26
+ 1. **Direct (no orchestration).** Most phases are one skill doing one job. Don't spawn an agent for
27
+ work the phase can do inline.
28
+ 2. **Parallel read-only fan-out.** At `/rite-seal` the relevant reviewers run *in parallel*, then
29
+ the orchestrator reconciles — banding by confidence and surfacing genuine disagreement explicitly
30
+ rather than averaging it away.
31
+ 3. **Single writer.** Exactly one `devrites-slice-wright` per slice, never a parallel fan-out of
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)).
38
+ 4. **Lifecycle as user-driven verbs.** Each verb performs one mutation and stops; chaining is
39
+ explicit (the user types the next command), so there are no hidden side effects between phases.
40
+ `/rite-autocomplete` is the one deliberate exception — an opt-in unattended driver.
41
+ 5. **Adversarial single-claim check.** `devrites-doubt` spawns a fresh reviewer to try to refute one
42
+ load-bearing decision, rather than asking the author to re-grade their own work.
43
+
44
+ ## Anti-patterns DevRites avoids
45
+
46
+ - **A persona that paraphrases another.** Passing one agent's summary to the next is lossy telephone;
47
+ reviewers read the raw diff and contract, not a digest of the author's reasoning.
48
+ - **Parallel writers.** See single-writer above — two agents editing the same feature concurrently
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.)
51
+ - **A router that does the work.** `/rite` is a *thin dispatcher* — it renders the menu, resolves a
52
+ verb to a skill, and gets out of the way. It holds no phase logic and produces no artifact itself.
53
+ (This is the distinction that makes a router fine: the anti-pattern is a "meta-orchestrator"
54
+ persona that paraphrases and re-decides on every call, not a dispatch table.)
55
+ - **Deep persona trees.** Agents don't call agents that call agents. The orchestrator dispatches one
56
+ level deep — reviewers and the wright — and reconciles the results itself.
57
+
58
+ ## Agent Teams and worktree isolation
59
+
60
+ Two Claude Code capabilities sit adjacent to DevRites' model; the stance on each is deliberate.
61
+
62
+ - **Agent Teams.** DevRites does **not** use Agent Teams to run the lifecycle. The on-disk workspace
63
+ plus fresh-context read-only fan-out already give independent context per agent without the
64
+ coordination overhead, and the lifecycle is intentionally single-slice / single-writer. Reach for
65
+ Agent Teams for work *outside* that discipline — competing-hypothesis debugging, or exploring
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.
75
+
76
+ ## See also
77
+
78
+ - [`pack/.claude/rules/agents.md`](../pack/.claude/rules/agents.md) — the reviewer / executor roster
79
+ and the when-to-fan-out rules.
80
+ - [`architecture.md`](architecture.md) — the full layer model.
81
+ - [`flow.md`](flow.md) — phase-by-phase flow and the public/internal namespace.