@ttt-productions/dev-standards 0.0.3 → 0.0.4

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.
@@ -144,10 +144,12 @@ Before starting a project's work:
144
144
  Every release of an `@ttt-productions/*` package hands its adoption to each app through a file in
145
145
  `<PACKAGES_REPO>/docs/work/adoptions/<app>/`.
146
146
 
147
- - **The package session writes them.** In the same change as the package edit, before the release
148
- command, it writes one adoption file per released package for each app — except an app-data
149
- package, whose file goes only to its own app. A package session cannot see which packages the
150
- other product installs, so every other released package gets a file for every app.
147
+ - **The package session writes them only for the apps that aren't in the conversation.** In the same
148
+ change as the package edit, before the release command, it writes one adoption file per released
149
+ package for each app outside the conversation — an app-data package's file goes only to its own
150
+ app. A package session cannot see which packages another product installs, so every other released
151
+ package gets a file for each of those apps. The app the conversation is working in adopts the
152
+ release itself, right after the install.
151
153
  - **The version it names** is the version the release will publish: one patch above the package's
152
154
  `package.json` version before the release.
153
155
  - **The file** is one item in the `docs/work/` item format (`<DEV_STANDARDS>/work/README.md`) —
@@ -198,9 +200,8 @@ step 5.
198
200
  ## The Normal `<APP_NAME>` Flows (named workflows — "do the normal dev/test flow" resolves HERE)
199
201
 
200
202
  These two named flows are the standing default for how work in these repos is verified and
201
- sequenced. They are DEFAULTS, not cages: DJ may override any step with explicit in-conversation
202
- instructions (e.g. "do the normal test flow, but WAIT for my go before starting dev:e2e — I'm
203
- using the machine"), and an override governs exactly what it names, nothing more. A repo changes a
203
+ sequenced. They are DEFAULTS, not cages: DJ may override any step with an explicit instruction; the
204
+ override governs exactly what it names, for that conversation only. A repo changes a
204
205
  flow only under its `<APP_NAME>` additions heading. In a repo whose `<APP_NAME>` is none
205
206
  (ttt-packages) the Test Flow does not apply — its gate is its own `CLAUDE.md` § Verification — and
206
207
  the Dev Flow's steps 1–4 are its whole share.
@@ -221,9 +222,10 @@ the Dev Flow's steps 1–4 are its whole share.
221
222
  (RULE-STD-QUALITY-008 — Claude operates the restart).
222
223
  5. Kill `dev:e2e` when done and STOP — wait for DJ's push.
223
224
 
224
- **When the session is orchestrating agents, stages 2–5 belong to ONE agent, never the orchestrator.**
225
- That agent starts `dev:e2e`, runs the live stages, fixes root causes (restarting the stack per stage
226
- 4), and kills it; the orchestrator only takes its report. "Claude-operated" here means that agent.
225
+ **In a conversation DJ has called an orchestrator, the Normal Test Flow is run by one test agent,
226
+ never the orchestrator.** A failure goes back to the orchestrator, which sends it to the agent that
227
+ built the failing code; that agent fixes it and reports. The same test agent then reruns the flow,
228
+ restarting `dev:e2e` per stage 4. In an inline conversation, the session runs the Test Flow itself.
227
229
 
228
230
  Not part of this flow: hosted-dev E2E runs (always separately commanded — `<HOSTED_E2E_DOC>`) and
229
231
  `npm run dev:local` (DJ's manual dev surface).
@@ -235,29 +237,23 @@ Not part of this flow: hosted-dev E2E runs (always separately commanded — `<HO
235
237
  change as the package edit.
236
238
  3. ttt-packages `npm run test:quiet` green.
237
239
  4. Hand DJ ONLY the release command (`./scripts/release-multiple.sh <folders…> patch`, its own fenced
238
- block) — then STOP. No install commands: Claude does the installs.
239
- 5. DJ runs the publish and says so. Claude then starts a 20-minute clock and checks npm every 30
240
- seconds until every released package's new version is the `@latest` on npm; then Claude runs the
241
- installs itself (`@latest --prefer-online`, at the root and in every consuming folder that declares
242
- the package — `<INSTALL_FOLDERS>`), confirms each lockfile names the new version, adopts the
243
- adoption files (§ Adoption files), and continues straight into the app work with no further go.
244
- While it polls, the session works on whatever does not depend on the release — the publish-wait
245
- overlap in `<DEV_STANDARDS>/development-preferences.md` § Shared-package publish.
246
- A version still missing from npm after 20 minutes = stop and tell DJ which package; never install
247
- anything but the published version.
248
- **What "published" means, and what to poll for.** When DJ says "published" (or "publish is
249
- running"), he has just RUN the release command: the script is still running and the packages are
250
- still building, so nothing may be on npm yet, and the version numbers in the checkout may not be
251
- bumped yet. `release-multiple.sh` first runs its `test:quiet` preflight (minutes); then, per package,
252
- `release-package.sh` bumps the version, commits `Release <pkg> vX.Y.Z`, tags it, and pushes; the
253
- tag triggers ttt-packages' `publish.yml` GitHub Actions job, which builds and publishes to npm. So
254
- the version to wait for is the NEW one — one patch above the package's `package.json` version
255
- before the release, or the version its `Release <pkg> v…` commit names once that lands — never the
256
- `package.json` version in the checkout at the moment DJ speaks, which can still be the old one
257
- (compared against npm `@latest`, it reads a stale match as "live"). A version is available only
258
- when npm `@latest` names it AND its tarball
259
- (`https://registry.npmjs.org/@ttt-productions/<pkg>/-/<pkg>-<version>.tgz`) answers 200: the
260
- registry can report the new `@latest` minutes before it serves the tarball, and an install in that
261
- gap fails `E404`.
240
+ block), with one line under it naming the versions it will publish — the same versions its
241
+ adoption files name, one patch above each package's `package.json` version before the release
242
+ (e.g. "Publishes chat-core 0.11.8 and chat-react 0.13.20.") — then STOP. No install commands:
243
+ Claude does the installs.
244
+ 5. DJ runs the publish and says so, at any point: the script just started, its preflight still
245
+ running, or the packages already published and GitHub Actions running. Claude then starts a
246
+ 20-minute clock and checks npm every 30 seconds for exactly the versions named in step 4 — it never
247
+ re-reads `package.json` or git to find them. A version is available only when npm `@latest` names
248
+ it AND its tarball (`https://registry.npmjs.org/@ttt-productions/<pkg>/-/<pkg>-<version>.tgz`)
249
+ answers 200: the registry can report the new `@latest` minutes before it serves the tarball, and
250
+ an install in that gap fails `E404`. Then Claude runs the installs itself (`@latest
251
+ --prefer-online`, at the root and in every consuming folder that declares the package —
252
+ `<INSTALL_FOLDERS>`), confirms each lockfile names the new version, adopts the release in its own
253
+ app (§ Adoption files), and continues straight into the app work with no further go. While it
254
+ polls, the session works on whatever does not depend on the release — the publish-wait overlap in
255
+ `<DEV_STANDARDS>/development-preferences.md` § Shared-package publish. A version still missing from
256
+ npm after 20 minutes = stop and tell DJ which package; never install anything but the published
257
+ version.
262
258
  6. All `<APP_NAME>` work; when the entire change set is done, run the Normal `<APP_NAME>` Test Flow.
263
259
  7. Stop and wait for DJ's push.
@@ -23,6 +23,16 @@ shared copy, in `@ttt-productions/dev-standards`, that every repo reads.
23
23
  it goes. Nothing is filed, parked, or written up without DJ's word.
24
24
  - A doc's "staged / later / deferred" label is never DJ's decision; only DJ's own explicit deferral
25
25
  parks an item.
26
+ - **DJ's rules live only in his rule docs** — the rulebooks, this file, `CLAUDE.md` / `AGENTS.md`,
27
+ and the workflows. An instruction DJ gives in a conversation lasts for that conversation only; it
28
+ becomes a standing rule only when he says to write it into the rules. No plan, work item, ledger,
29
+ or prompt ever holds a rule, an instruction, or reasoning, and a session never takes a rule from
30
+ one.
31
+ - **There are no handoff docs.** When DJ asks to get ready for a new conversation, the session gives
32
+ a small copy-paste prompt in chat that points at the items being worked; the items hold only what
33
+ is left. The prompt carries nothing else except open questions DJ chose to move. An item whose
34
+ only remaining work is the Normal Test Flow or a hosted E2E run is deleted; if a conversation
35
+ switches at that point, the prompt says to run it.
26
36
  - "Finish everything" / "do it all" means every single thing DJ has decided, with nothing left
27
37
  undone or parked. It never means deciding anything for DJ: when finishing needs a decision he has
28
38
  not made, ask that one question and keep doing the rest. Never stop for complexity, size, time of
@@ -51,22 +61,39 @@ shared copy, in `@ttt-productions/dev-standards`, that every repo reads.
51
61
  - An answer that REDIRECTS is not approval to build the revision — show the revised artifact in
52
62
  chat and get a clean confirm before implementing.
53
63
  - No new-conversation or handoff proposals unless DJ asks.
64
+ - **Every question is tracked until DJ answers it.** A question about the item being worked is asked
65
+ when it is found; the parts of that item that depend on the answer wait, and everything else keeps
66
+ going. A problem found outside the item never stops work: it is reported in chat with what was
67
+ verified and a recommendation, and stays open for DJ. When DJ has said he is away, no question
68
+ blocks: it goes in chat, the session finishes every part that does not depend on it, and moves to
69
+ the next item.
70
+ - **No Normal Test Flow while any question is open.** An answer can change code, and a test run
71
+ before it is worthless. The open questions are asked first, any code they change is done, and then
72
+ the Test Flow runs once.
73
+ - Open questions are asked one at a time, as questions, never buried in a status message. The
74
+ session never answers, files, or drops one itself.
75
+ - When DJ asks whether the conversation is good to end, or says to start a new one, the session first
76
+ says how many questions are open and asks whether to answer them here or move them into the new
77
+ conversation's prompt.
54
78
 
55
79
  ## Git, publish, deploy, and the dev stacks
56
80
 
57
- - DJ does ALL git: staging, commits, pushes, publishing, installs he has not handed over, and
58
- deployments. Hand him exact commands; never run them. Never commit or push. DJ stages files
59
- continuously while work is running so he can see what is changing; never treat a staged/unstaged
60
- change as a sign of someone else's work, and never bring up staging, the index, or other git state
61
- with DJ.
81
+ - DJ does ALL git — staging, commits, pushes, branches, publishing, installs he has not handed over,
82
+ and deployments. An AI runs none of it unless DJ commands that exact action in the conversation;
83
+ otherwise it hands him the exact command. DJ stages files continuously while work is running so he
84
+ can see what is changing; never treat a staged/unstaged change as a sign of someone else's work,
85
+ and never bring up staging, the index, or other git state with DJ.
86
+ - Git and GitHub (`git log`, `git status`, diffs, `gh`, Actions runs) are read only when DJ says it is
87
+ needed. A problem DJ brings is fixed from the current code; when and why it changed is not looked
88
+ up unless he asks.
62
89
  - Never instruct DJ to push or deploy — deploy IS `git push`. Never nag about deploys, indexes, or
63
90
  seed buttons.
64
91
  - Never discard, overwrite, reset, clean, or revert existing work unless DJ explicitly asks.
65
92
  Preserve unrelated uncommitted work; DJ or another tool may be working concurrently.
66
93
  - `dev:local` (DJ's manual dev stack) is DJ-only, always — never start or stop it.
67
94
  - `dev:e2e` (the verification stack) is session-operated only inside the repo's Normal Test Flow or
68
- on DJ's explicit command. DJ's in-conversation instruction overrides any flow step ("wait for my go
69
- before starting dev:e2e") and governs exactly what it names.
95
+ on DJ's explicit command. DJ's in-conversation instruction overrides any flow step and governs
96
+ exactly what it names, for that conversation only.
70
97
  - Never kill a running dev stack on your own judgment ("ports look wrong" = say what you see and
71
98
  WAIT). Never run e2e against a stale build.
72
99
  - Hosted-dev E2E runs happen only when DJ commands one, and follow the repo's hosted-E2E run doc
@@ -130,15 +157,25 @@ shared copy, in `@ttt-productions/dev-standards`, that every repo reads.
130
157
  - No half-working, dead, or known-bad code — build it or remove it. On a second sighting of a defect
131
158
  class, tell DJ and propose killing the CLASS system-wide plus a regression guard; do it only on
132
159
  DJ's command.
160
+ - **Never make yourself an exception.** Code that breaks a rule, guard, or lint check is fixed. An
161
+ exception is asked for only when there is genuinely no other way, and it goes to DJ with that
162
+ reason, why no fix works. Nothing is exempted without his yes. Every exception he approves carries
163
+ its reason at the exception itself, so anyone reading it years later knows at once why it exists:
164
+ the guard entry's reason field, the comment on the `eslint-disable` / `prettier-ignore` line, or,
165
+ for a design-level exception, the design doc it belongs to. The reason states why the exception
166
+ exists, never who approved it.
133
167
  - Reviewing an external plan (ChatGPT/Codex/etc.) means answering "is this the BEST code to solve
134
168
  my problem" — never just verifying its claims. Evaluate the design space (alternatives, root cause,
135
169
  structure) and fold an optimality verdict into the reviewed doc.
136
170
  - V1-scope discipline: confirm the trigger exists in V1 before asking DJ to design.
137
171
  - Docs stay lean — never a "done" log. Tracking docs hold only remaining work; finished work is
138
172
  DELETED.
173
+ - **Working files** a session needs — extracted text, a one-off script, intermediate output — go in
174
+ `C:\DjDev\claude-scratchpad\<YYYY-MM-DD>-<topic>\`, never in a temp folder, loose in `C:\DjDev`,
175
+ or inside a repo. A session writes there only when the work needs a file, never for a conversation
176
+ that is only talking, and deletes its folder when that work is done.
139
177
  - Working state that must outlive the session — orchestration ledgers, agent change logs, file
140
- claims, handoff notes — is never kept in a temp or scratchpad folder. It lives in the repo beside
141
- the work it tracks and is deleted when the work finishes.
178
+ claims — lives in the repo beside the work it tracks and is deleted when the work finishes.
142
179
  - Help with EVERY step, including non-code and operational ones — real artifacts (policies,
143
180
  runbooks, click-by-click), never a "your job" checklist. Walk-throughs go one step at a time, dev
144
181
  AND prod. A non-code or console step becomes a self-contained Claude web prompt (full context,
@@ -150,6 +187,19 @@ shared copy, in `@ttt-productions/dev-standards`, that every repo reads.
150
187
 
151
188
  ## Agents
152
189
 
190
+ - **Every conversation is inline unless DJ says, in that conversation, that it is an orchestrator.**
191
+ No doc, plan, ledger, or prompt makes a conversation an orchestrator.
192
+ - **Inline:** the session does the research and the work itself. When a piece of the work would be
193
+ done better by agents — LOW for mechanical work applied from written examples, HIGH for thinking
194
+ work or review — it proposes them to DJ with each agent's exact task and files, and launches them
195
+ only on his yes. Launching agents, a predefined wave included, never makes it an orchestrator; it
196
+ still runs its own Normal Test Flow.
197
+ - **Orchestrator:** the session saves its context for managing agents and does not read or edit code
198
+ itself. It first launches read-only agents to understand the system, then gives each building
199
+ agent the high-level picture and the design: build this, this way. An agent that finds a better or
200
+ different way stops and comes back instead of building it. Agents run in waves of a few at a time,
201
+ each owning its files, no file owned twice. LOW agents never decide; they apply the examples the
202
+ HIGH session gives them.
153
203
  - The main session owns edits unless DJ explicitly approves parallel implementers with disjoint file
154
204
  ownership. Nothing spawns without DJ's yes.
155
205
  - Every prompt that spawns an agent names that agent's mandatory reading as explicit
package/model-tiers.md CHANGED
@@ -22,5 +22,5 @@ follows the session unless a doc names one.
22
22
  task applies a fixed set of written patterns to many files; its prompt names every pattern and
23
23
  makes anything outside them a stop that returns to the HIGH session that spawned it. That session
24
24
  and its reviewer stay HIGH.
25
- - **The orchestrator is the session itself** — DJ picks its model when he starts it. Every SPAWNED
25
+ - **The session runs on the model DJ picks when he starts it.** Every SPAWNED
26
26
  agent's tier is binding.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ttt-productions/dev-standards",
3
- "version": "0.0.3",
3
+ "version": "0.0.4",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/ttt-productions/ttt-packages.git",
@@ -77,7 +77,7 @@ A test proves the business rule, never the code's current output: its expected v
77
77
  ### RULE-STD-QUALITY-006 — Lint and format: zero suppression in apps, reasoned disables in packages; one enforced format
78
78
  **Scope.** both
79
79
 
80
- **Rule.** The lint half is split by scope; the format half is the same for both. **Apps** are zero suppression: no `eslint-disable` comment anywhere in the linted trees — source, Functions, E2E, scripts, and config. When a rule fires, fix the root cause, and solve a genuine false positive structurally — rename, refactor, or scope the rule — never by suppressing the line; external-authority state pruning uses the sanctioned render-phase adjustment, not a suppressed effect. A `warn`-level finding is a finding to fix, and a rule is never turned off, nor `ignores` widened, to pass failing code. New app code also follows the conventions the lint config forces, listed below. **Packages** permit an `eslint-disable-next-line` only for a narrow intentional case, carrying its reason on the line; it is preferred over weakening the rule, and a real violation is fixed at its source.
80
+ **Rule.** The lint half is split by scope; the format half is the same for both. **Apps** are zero suppression: no `eslint-disable` comment anywhere in the linted trees — source, Functions, E2E, scripts, and config. When a rule fires, fix the root cause, and solve a genuine false positive structurally — rename, refactor, or scope the rule — never by suppressing the line; external-authority state pruning uses the sanctioned render-phase adjustment, not a suppressed effect. A `warn`-level finding is a finding to fix, and a rule is never turned off, nor `ignores` widened, to pass failing code. New app code also follows the conventions the lint config forces, listed below. **Packages** permit an `eslint-disable-next-line` only for a narrow intentional case where no fix works, on DJ's yes, carrying its reason on the line; it is preferred over weakening the rule, and a real violation is fixed at its source.
81
81
 
82
82
  Every code file — source, tests, scripts, and config — is in the one format Prettier writes from the shared Prettier config (this package's `config/prettier.json`); `test:quiet`'s format stage writes that format and then checks it, a check-only run (a package release preflight, `test:all`) only checks, so a release never publishes formatting nobody committed, and the check fails a file that is not formatted; `eslint-config-prettier` keeps ESLint out of formatting. A file is formatted by running Prettier, never reflowed by hand.
83
83
 
@@ -92,14 +92,14 @@ Every code file — source, tests, scripts, and config — is in the one format
92
92
  - An anonymous React wrapper component returned from a test helper (assign `displayName`).
93
93
  - Straight `'`/`"` in JSX text content (use `&apos;`/`&quot;`).
94
94
  - Suppressing `exhaustive-deps` instead of fixing at the source (destructure the stable `mutate`; memoize a derived dep; destructure the specific prop fields used).
95
- - An unformatted code file; a `prettier-ignore` without its reason; an ESLint formatting rule that fights Prettier.
95
+ - An unformatted code file; a `prettier-ignore` without its reason, or added when a fix works or without DJ's yes; an ESLint formatting rule that fights Prettier.
96
96
 
97
97
  **References.** RULE-STD-ENG-008; this package's `node/eslint` bases and `config/prettier.json`; each repo's ESLint config and `.prettierignore`.
98
98
 
99
99
  ### RULE-STD-QUALITY-007 — Guard tests enforce ownership and boundaries, never inventories
100
100
  **Scope.** both
101
101
 
102
- **Rule.** Structural guard tests (the repo-guards suite each repo runs in its gate — an app's guard suite, ttt-packages' boundary suite) enforce a forbidden boundary or single-owner rule against the current clean baseline — every allowlist entry carrying a one-line justification — so that a NEW regression fails the build. A guard must not mirror an exhaustive list of today's files, exports, packages, or domains: an inventory-mirror breaks on every legitimate addition and audits nothing.
102
+ **Rule.** Structural guard tests (the repo-guards suite each repo runs in its gate — an app's guard suite, ttt-packages' boundary suite) enforce a forbidden boundary or single-owner rule against the current clean baseline — every allowlist entry carrying a one-line justification — so that a NEW regression fails the build. An entry is added only when no fix works, on DJ's yes, with its reason in the entry. A guard must not mirror an exhaustive list of today's files, exports, packages, or domains: an inventory-mirror breaks on every legitimate addition and audits nothing.
103
103
 
104
104
  **Why.** A brittle inventory-mirror is churn, not enforcement; the value is catching the next violation, not counting the current files.
105
105
 
@@ -127,7 +127,7 @@ Every code file — source, tests, scripts, and config — is in the one format
127
127
  ### RULE-STD-QUALITY-009 — A test loads the code it tests when its file loads
128
128
  **Scope.** both
129
129
 
130
- **Rule.** A test imports the code it tests at the top of its file — a static import, or a top-level `await import()` — never inside a case, a hook, or a helper they call, and never resets the module registry. A case that needs other state gets it without a reload: an environment the code reads at load is set in `vi.hoisted` before the import, per-instance state is cleared through the module's test-only `__reset…()` seam, and a flag the code reads once is read when it is called instead. A file whose fresh module per case is itself what it proves is a reviewed entry with its why, and an entry whose file no longer does is stale. The repo-guards `testCaseModuleLoads` guard enforces it.
130
+ **Rule.** A test imports the code it tests at the top of its file — a static import, or a top-level `await import()` — never inside a case, a hook, or a helper they call, and never resets the module registry. A case that needs other state gets it without a reload: an environment the code reads at load is set in `vi.hoisted` before the import, per-instance state is cleared through the module's test-only `__reset…()` seam, and a flag the code reads once is read when it is called instead. A file whose fresh module per case is itself what it proves is a reviewed entry with its why — an entry is added only when no fix works, on DJ's yes, with its reason in the entry — and an entry whose file no longer does is stale. The repo-guards `testCaseModuleLoads` guard enforces it.
131
131
 
132
132
  **Why.** A module's first load pulls its whole graph; inside a case that cold load is timed as the case's own work, so a file's first case was slow for nothing it did and, under the full parallel run, crossed its timeout.
133
133
 
@@ -13,8 +13,11 @@ description: Claude Code workflow (Build or fix). Use when the work is big enoug
13
13
 
14
14
  ## Before anything spawns
15
15
 
16
- 1. The normal preflight, plus the routed rules and `docs/design/*.md` for every area involved.
17
- 2. Re-verify the work against the current code.
16
+ 1. The normal preflight. This session saves its context for managing agents and does not read or
17
+ edit code itself (`<DEV_STANDARDS>/development-preferences.md` § Agents).
18
+ 2. Launch read-only agents to read the routed rules, the `docs/design/*.md` for every area involved,
19
+ and the current code, and report the system back; the design each building agent gets comes from
20
+ their reports.
18
21
  3. Propose to DJ: the number of agents and each one's exact scope and owned files. Nothing spawns
19
22
  without DJ's yes.
20
23
  4. App-side work: confirm every shared package it depends on is at `@latest` first. Package work and
@@ -22,12 +25,13 @@ description: Claude Code workflow (Build or fix). Use when the work is big enoug
22
25
 
23
26
  ## Every spawned prompt
24
27
 
28
+ - The high-level picture and the design to build: build this, this way.
25
29
  - The agent's exact scope and owned files, and its mandatory reading as explicit read-before-acting
26
30
  paths: the routed rule files (shared and the app's) and `docs/design/*.md` for its area
27
31
  (RULE-STD-ENG-010).
28
32
  - A hard ban on spawning agents.
29
- - A kill-and-escalate clause: a needed package change, or anything unexpected → stop and report to
30
- this session.
33
+ - A kill-and-escalate clause: a needed package change, a better or different way than the design,
34
+ or anything unexpected → stop and report to this session.
31
35
  - Targeted tests only, on its own work.
32
36
  - Tier per `<DEV_STANDARDS>/model-tiers.md` (implementation agents; a mechanical-only part uses
33
37
  `mechanical-fan-out.md` instead).
@@ -37,7 +41,7 @@ description: Claude Code workflow (Build or fix). Use when the work is big enoug
37
41
  - Adversarial review agents at the HIGH tier over the landed work, each also checking every new or
38
42
  changed test against the business rule it claims to prove (RULE-STD-QUALITY-001; testing-coverage
39
43
  playbook).
40
- - Exactly ONE final full gate after every agent has landed: the Normal `<APP_NAME>` Test Flow. Its
41
- live stage (start `dev:e2e`, run, fix, restart, kill) belongs to ONE agent, never this session —
42
- this session takes its report.
44
+ - Exactly ONE final full gate after every agent has landed: the Normal `<APP_NAME>` Test Flow, run
45
+ as `<DEV_STANDARDS>/claude/CLAUDE.base.md` § The Normal `<APP_NAME>` Flows says for an
46
+ orchestrator.
43
47
  - Delete the finished `docs/work/` items and the ledger, then stop for DJ's push.
@@ -25,7 +25,9 @@ description: Claude Code workflow (Build or fix). Use when DJ wants known, decid
25
25
  Normal `<APP_NAME>` Dev Flow (`<DEV_STANDARDS>/claude/CLAUDE.base.md`).
26
26
  - Every fix ships a regression test that fails before the fix and proves the business rule
27
27
  (RULE-STD-QUALITY-001). Design docs the fix changes are updated in the same change.
28
- - A large mechanical change found along the way → `mechanical-fan-out.md`, which asks DJ first.
28
+ - A piece of the work agents would do better → propose LOW or HIGH agents for it to DJ, staying
29
+ inline (`<DEV_STANDARDS>/development-preferences.md` § Agents); a large mechanical change uses
30
+ `mechanical-fan-out.md`.
29
31
 
30
32
  ## Finishing
31
33
 
@@ -23,8 +23,9 @@ description: Claude Code workflow (Build or fix). Use when a multi-task plan DJ
23
23
 
24
24
  - Packages-first: every package-side task in the plan lands, gates, and is released before any
25
25
  app-side task (Normal `<APP_NAME>` Dev Flow, `<DEV_STANDARDS>/claude/CLAUDE.base.md`).
26
- - Build inline. Large mechanical parts → `mechanical-fan-out.md`; big parallel thinking work →
27
- propose `fan-out-implementation.md` to DJ.
26
+ - Build inline. A piece of the work agents would do better → propose LOW or HIGH agents for it to
27
+ DJ, staying inline (`<DEV_STANDARDS>/development-preferences.md` § Agents); large mechanical parts
28
+ use `mechanical-fan-out.md`.
28
29
  - Approval covers exactly the approved tasks — no adjacent refactors.
29
30
  - Every task ships its regression test (RULE-STD-QUALITY-001) and its doc updates.
30
31
 
@@ -34,5 +34,5 @@ through this; it stays inline or goes to `fan-out-implementation.md`.
34
34
  5. **One HIGH reviewer** checks all the agents' changes together once every agent is done: each
35
35
  change matches a listed pattern, nothing outside the patterns slipped in, and every new or changed
36
36
  test proves the business rule it claims, not the code's current output (RULE-STD-QUALITY-001).
37
- 6. **One final gate.** Back in the calling workflow: the Normal Test Flow once, for the whole change
38
- set. Its live stage belongs to ONE agent, never the orchestrating session.
37
+ 6. **One final gate.** Back in the calling workflow: the inline session runs the Normal Test Flow
38
+ once, for the whole change set.
@@ -21,8 +21,9 @@ description: Claude Code workflow (Build or fix). Use when DJ names a step of a
21
21
  3. Work the step, or one focused slice of it. A step with a publish stop: ALL its package work first,
22
22
  then the release command, per the Normal `<APP_NAME>` Dev Flow
23
23
  (`<DEV_STANDARDS>/claude/CLAUDE.base.md`).
24
- 4. Large mechanical parts → `mechanical-fan-out.md`; big parallel work → propose
25
- `fan-out-implementation.md` to DJ.
24
+ 4. A piece of the work agents would do better → propose LOW or HIGH agents for it to DJ, staying
25
+ inline (`<DEV_STANDARDS>/development-preferences.md` § Agents); large mechanical parts use
26
+ `mechanical-fan-out.md`.
26
27
  5. The Normal `<APP_NAME>` Test Flow, once, on the change set.
27
28
  6. Delete each finished item from the step's work doc. When the step is done, delete its folder and
28
29
  its section in `PLAN.md` — never renumber.