voidmachine 5.0.8 → 6.0.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.
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env bash
2
- # Non-blocking adapter for PostToolUse and Stop canonical events.
2
+ # PostToolUse outcomes and repeated-read advice share this non-blocking process.
3
+ # PostToolUseFailure resets advice only; Stop retains its canonical event.
3
4
  set -uo pipefail
4
5
 
5
6
  ROOT="${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel 2>/dev/null || pwd)}"
@@ -18,7 +18,7 @@ reviewed pull request instead. Promotion to the branch that deploys stays human.
18
18
  ## What this skill does NOT do
19
19
 
20
20
  It owns no ticket cycle. Every worker runs the canonical `void-implement` skill, whole, once per
21
- ticket, specialist panel included. If you find yourself writing "then the worker runs the tests,
21
+ ticket, with applicability owned there. If you find yourself writing "then the worker runs the tests,
22
22
  then reviews..." inside autopilot, stop: that behaviour has one owner, and two copies drift until
23
23
  a ticket gets a different standard depending on how it was started.
24
24
 
@@ -31,9 +31,9 @@ names none. When the person says they merge themselves, run `void-machine autopi
31
31
  Promotion from the integration branch to the one that deploys stays human.
32
32
 
33
33
  It never merges a change to the machinery that judges merges. A pull request touching
34
- `.github/**`, `scripts/independent-review-check.mjs`, `.void/program.md`, `packages/core/hooks/**`,
34
+ `.github/**`, `.void/program.md`, `packages/core/hooks/**`,
35
35
  what a judging workflow runs from outside `.github`
36
- (`scripts/promotion-authority.mjs`, `scripts/auto-merge-contract.mjs`, `scripts/verify.mjs`,
36
+ (`scripts/auto-merge-contract.mjs`, `scripts/verify.mjs`,
37
37
  `packages/core/enforce/**`), what judges a publication (`scripts/prepare-release-artifact.mjs`,
38
38
  `scripts/verify-release-publication.mjs` and the two release contracts they read), the loop code that believes a verdict and merges (`loop.ts`,
39
39
  `loop-observe.ts`, `branch-identity.ts`, `commands/autopilot-loop.ts`), the local chain of judgment
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: void-brainstorm
3
- description: "Engage on a raw idea, or the moment an exchange settles a behaviour, boundary or trade-off: pressure-test, one question at a time, 2-3 approaches, spec written and approved before any code."
3
+ description: "Resolve a raw idea or consequential design ambiguity: inspect context, compare alternatives and record approved choices. Clear authorized implementation requests go directly to void-implement."
4
4
  ---
5
5
 
6
6
  # brainstorm — voidcorp craftsman edition
7
7
 
8
- Start by understanding the project context. Then ask questions one at a time to refine the idea. Once you understand what is being built, present the design in sections, get approval, write the spec to `docs/specs/`, and transition to `void-plan`. **No implementation skill, no code, no scaffolding until the spec is written and approved.**
8
+ Use this skill when intent, behavior or a consequential boundary remains undecided. Inspect the existing context, resolve the decisions that change the outcome, and record the approved design. `void-implement` owns applicability: a clear implementation request does not need a design interview.
9
9
 
10
10
  **Attribution**: see `.source`. Primary source: superpowers/brainstorm; the upstream idea-pressure-test mode is the distilled `gstack:/office-hours` diagnostic, vendored for void-machine.
11
11
 
@@ -53,23 +53,22 @@ everyone to skip Step 0 when it matters.
53
53
 
54
54
  ---
55
55
 
56
- ## HARD GATE
56
+ ## Decision gate
57
57
 
58
- Do NOT invoke any implementation skill, write any code, scaffold any project, or take any implementation action until:
58
+ Do not implement an unresolved choice that materially changes scope, safety, external effects
59
+ or a lasting contract. Present the decision and its trade-offs together, then obtain the needed
60
+ approval. Work that does not depend on it may continue.
59
61
 
60
- 1. The spec is written to `docs/specs/YYYY-MM-DD-<topic>.md`
61
- 2. The spec has passed self-review
62
- 3. The user has explicitly approved the written spec
63
-
64
- **This applies to EVERY project, regardless of perceived simplicity.**
65
-
66
- The anti-pattern is "this is too simple to need a design." Every project goes through this process. Simple projects' specs are short (a few sentences for truly trivial ones), but they MUST be written and approved.
62
+ For already authorized scope, do not request approval again merely because it has been written
63
+ into a spec or plan. The user's explicit request and accepted decisions are valid inputs.
64
+ A durable spec is useful for a structural or multi-step change; a mechanical fix or bounded
65
+ request may go directly to `void-implement` with its acceptance criteria.
67
66
 
68
67
  ---
69
68
 
70
69
  ## Ingesting a forge spec
71
70
 
72
- If `docs/specs/` holds a spec with `source: forge` in its frontmatter (the forge→harness artifact contract), the up-front thinking is already done. **Verify and fill the gaps — do not re-ask what the spec already answers.** The 18 recon variables cover persona, pain, positioning, competition, pricing, and the visual identity; the winning design and critique verdict are attached. Read them, confirm they still hold, and ask only about what is missing (a partial spec — recon without critique, or a field absent in an older `forge_version` — is ingested for what it has, with the holes listed as the only open questions). Then go straight to writing/approving the spec. Do not restart the interview from scratch.
71
+ If `docs/specs/` holds a spec with `source: forge` in its frontmatter (the forge→harness artifact contract), the up-front thinking is already done. **Verify and fill the gaps — do not re-ask what the spec already answers.** The 18 recon variables cover persona, pain, positioning, competition, pricing, and the visual identity; the winning design and critique verdict are attached. Read them, confirm they still hold, and ask only about what is missing (a partial spec — recon without critique, or a field absent in an older `forge_version` — is ingested for what it has, with the holes listed as the only open questions). Record the accepted scope and resolve only remaining choices. Do not restart the interview or approval from scratch.
73
72
 
74
73
  ## Pressure-testing a raw idea (upstream mode)
75
74
 
@@ -86,7 +85,9 @@ Runs ONLY when the input is a raw *product idea* ("I want to build X"), not an a
86
85
  5. **Observation & surprise.** Have you watched someone use it without helping — what did they do that surprised you? Red flag: surveys and demo calls (surveys lie, demos are theater).
87
86
  6. **Future-fit.** If the world looks meaningfully different in 3 years, does this become more essential or less? Red flag: "the market grows 20%/yr" — every competitor cites the same tailwind.
88
87
 
89
- **Escape hatch.** If the user says "just do it": ask the 2 most critical remaining questions for their stage, then move on. If they push back a second time, respect it and proceed. Only a fully-formed plan with real evidence (named users, revenue) earns a full skip — and even then, still confirm the premises and generate alternatives.
88
+ **Respect the mandate.** If the user says to proceed, reuse known answers and make routine
89
+ reversible implementation choices. Ask only about a missing decision that materially changes
90
+ the outcome or requires separate authority; do not make the user repeat the instruction.
90
91
 
91
92
  ## Process
92
93
 
@@ -119,7 +120,7 @@ Wait for the user's response. If they decline, proceed in text-only.
119
120
 
120
121
  ### Step 4 — Ask clarifying questions
121
122
 
122
- - One question at a time. Never batch.
123
+ - Ask only unresolved consequential questions; group closely related questions when it reduces interruptions.
123
124
  - Multi-choice preferred when applicable (2–4 distinct mutually-exclusive options with brief descriptions and a recommended option labeled).
124
125
  - Open-ended fine when no obvious options exist.
125
126
  - Focus on: purpose, constraints, success criteria.
@@ -135,7 +136,10 @@ Wait for the user's response. If they decline, proceed in text-only.
135
136
 
136
137
  Runs on **every brainstorm, whatever the subject** — a product idea, a guard, a contract, a migration. Demand pressure-testing above belongs to a raw product idea, because a merge gate has no market to interrogate; ambition is not scoped that way, since timidity is not a property of product ideas. This pass lived inside the product-idea mode and therefore never fired on a technical subject, which is most of what gets designed here.
137
138
 
138
- Before settling, deliberately drop the self-imposed constraints: what does this look like at 10x — no resource limit, no "we can't because"? What is the *coolest* version the user has not considered? Carry that into Step 5: always include one "ideal / most ambitious" path and one "creative-lateral" reframing, not just the safe increment. YAGNI still prunes the *final* scope — but prune down from an ambitious set; do not start timid.
139
+ Before settling an unresolved design, consider whether a simpler or materially better approach
140
+ changes the outcome. Include an ambitious or lateral option only when it answers that question.
141
+ Do not expand an already accepted scope or reopen a completed decision to manufacture alternatives.
142
+ YAGNI prunes the options before asking the user to evaluate them.
139
143
 
140
144
  ### Step 5 — Propose 2–3 approaches
141
145
 
@@ -153,7 +157,7 @@ Once the intent is clear, present the design in sections:
153
157
  - Rollout / phases (if non-trivial)
154
158
  - TDD mode per implementation phase (strict / souple / exploratory — composes with `void-tdd` skill)
155
159
 
156
- Get approval AFTER each section before moving on. Scale each section to its complexity: a few sentences for simple projects, 200–300 words for nuanced ones.
160
+ Present related decisions together and obtain approval for the unresolved consequential choices. Do not request approval section by section for explanatory prose.
157
161
 
158
162
  ### Step 7 — Write the spec
159
163
 
@@ -188,17 +192,15 @@ Read the spec with fresh eyes:
188
192
 
189
193
  Fix issues inline. No need to re-review — just fix and move on.
190
194
 
191
- ### Step 9 — User reviews the written spec
192
-
193
- Ask the user to review the spec file before proceeding:
194
-
195
- > "Spec written and committed to `docs/specs/<file>.md`. Please review and let me know if you want changes before we start the implementation plan."
195
+ ### Step 9 — Confirm unresolved choices
196
196
 
197
- Wait for the user's response. If they request changes, make them and re-run self-review. Only proceed once the user approves.
197
+ Link the written spec and identify any decision not yet authorized. Ask only about those
198
+ remaining choices. If it records decisions already approved in this conversation, proceed.
198
199
 
199
- ### Step 10 — Transition to `void-plan`
200
+ ### Step 10 — Transition to execution
200
201
 
201
- The ONLY post-brainstorming transition. Invoke plan. Do not invoke any other skill (frontend-design, mcp-builder, etc.).
202
+ Use `void-plan` when dependencies, multiple units or later-session continuity need a durable
203
+ sequence. A bounded single unit with clear acceptance criteria goes to `void-implement`.
202
204
 
203
205
  ---
204
206
 
@@ -221,58 +223,35 @@ Smaller, well-bounded units are easier to work with — easier for the agent to
221
223
 
222
224
  ---
223
225
 
224
- ## Red Flags — thoughts that mean STOP
225
-
226
- | Thought | Reality |
227
- |---|---|
228
- | "This is too simple to need a design" | The gate applies to every project. Write the short version. |
229
- | "I need more context first" | Skill check comes BEFORE clarifying questions. |
230
- | "Let me explore the codebase first" | Sure, but the design discipline still applies. |
231
- | "I can check git/files quickly" | Files lack conversation context. Stay in the process. |
232
- | "Let me gather information first" | Process telling you HOW to gather information. |
233
- | "This doesn't need a formal skill" | If a skill exists, use it. |
234
- | "I'll just do this one thing first" | Check BEFORE doing anything. |
235
- | "This feels productive" | Undisciplined action wastes time. |
236
-
237
- ---
238
-
239
226
  ## Key principles
240
227
 
241
- - **One question at a time.** Never overwhelm with multiple.
242
- - **Multi-choice preferred.** Easier to answer than open-ended.
243
- - **YAGNI ruthlessly.** Remove unnecessary features from all designs.
244
- - **Explore alternatives.** Always propose 2–3 approaches before settling.
245
- - **Incremental validation.** Present design, get approval before moving on.
246
- - **Be flexible.** Go back and clarify when something doesn't make sense.
228
+ - Read the actual contract before asking what it says.
229
+ - Resolve a material ambiguity once; retain the answer through implementation.
230
+ - Keep KISS, useful boundaries and the smallest sufficient scope.
231
+ - Compare credible alternatives when they change the result, not for a fixed option count.
232
+ - Document lasting structural decisions through `void-decide`.
233
+ - Optional improvements do not reopen accepted scope or cause another review cycle.
247
234
 
248
235
  ---
249
236
 
250
237
  ## Composition with other skills
251
238
 
252
239
  - **Raw product idea** ("I have an idea..."): pressure-test it first via the upstream mode above (the vendored `/office-hours` diagnostic), then design. Broader product *roadmap / strategy* routes to `void-plan-review` (CEO lens — challenges a written plan's premise and ambition).
253
- - **Downstream — `void-plan`**: the ONLY post-brainstorming transition.
240
+ - **Downstream**: `void-plan` for dependent work; `void-implement` for a bounded approved unit.
254
241
  - **With `void-tdd`**: the spec declares the TDD mode for each major implementation step. Plans then uses this.
255
242
  - **With `void-hexagonal-architecture` + `void-domain-driven-design`**: these skills inform the design's structure (bounded contexts, ports, aggregates). Brainstorming consumes their vocabulary; does not duplicate their decisions.
256
- - **With `void-code-review`**: a PR that introduces features without a linked spec gets flagged.
243
+ - **With `void-code-review`**: review against the accepted behavior and constraints; an absent spec alone is not a defect.
257
244
 
258
245
  ---
259
246
 
260
247
  ## Anti-rules
261
248
 
262
- - MUST NOT skip the hard gate.
263
- - MUST NOT batch multiple questions in one message.
264
- - MUST NOT decide implementation details (those go to plans).
265
- - MUST NOT decide product roadmap / strategy (routes to `void-plan-review` CEO lens). It DOES pressure-test a raw idea's demand (the upstream mode) and push ambition on any subject (Step 4b) — both in scope, not delegated.
266
- - MUST NOT skip the spec-write step "because the conversation is clear."
267
- - MUST NOT transition to any skill other than `void-plan` post-approval.
268
-
269
- ---
249
+ - Do not implement a consequential unresolved decision or infer external authorization.
250
+ - Do not restart discovery or approvals already resolved by the user's request.
251
+ - Do not widen product scope during implementation under the guise of ambition.
252
+ - Do not hide material uncertainty behind a complete-looking template.
270
253
 
271
254
  ## Final rule
272
255
 
273
- ```
274
- Idea → questions → 2–3 approaches → design in sections → spec written → self-review → user approves → plan.
275
- Otherwise → it is not voidcorp brainstorm.
276
- ```
277
-
278
- The hard gate exists because LLM agents write very fast code for very wrong problems. The discipline pays for itself in the first project that does not have to be rewritten.
256
+ Unresolved design → inspect → compare useful options → resolve consequential decisions →
257
+ record → plan only as needed → implement the accepted scope.
@@ -5,7 +5,7 @@ description: Pre-PR critical pass. Six dimensions (correctness, tests, security,
5
5
 
6
6
  # code-review — voidcorp craftsman edition
7
7
 
8
- A review without a framework is "the first ten things I noticed." This skill provides the framework: six dimensions in order, blocker vs nit, evidence block in the PR body, two modes, explicit composition with Claude Code's native `/void-code-review` and specialized agents. The skill orchestrates; it does not duplicate the deep-pass agents.
8
+ A review examines the accepted behavior and the consequences of shipping the change. This skill provides the framework: six dimensions in order, blocker vs nit, evidence block in the PR body, two modes, explicit composition with Claude Code's native `/void-code-review` and specialized agents. The skill orchestrates; it does not duplicate the deep-pass agents.
9
9
 
10
10
  **Attribution**: see `.source` in this directory.
11
11
 
@@ -41,9 +41,9 @@ Every comment is explicitly prefixed:
41
41
  - **`QUESTION:`** — clarification request. May escalate to BLOCKER if answer reveals a defect.
42
42
  - **`PRAISE:`** — explicit acknowledgement of good code (rare, but valued).
43
43
 
44
- Style / naming / minor structure: `NIT:`. Correctness / missing test / security / boundary violation: `BLOCKER:`.
44
+ Style, naming and optional refactoring are advisory. Correctness, security or a broken boundary blocks only with a concrete consequence. A missing test blocks when a demonstrated behavior or regression risk lacks an adequate proof, not because a checklist asks for another test.
45
45
 
46
- A review that does not use the prefixes is incomplete. The companion hook `blocker-prefix-grep` produces the BLOCKER/NIT count for the evidence block.
46
+ Use these prefixes to make decisions legible; formatting alone never creates a blocking defect. The companion hook `blocker-prefix-grep` produces the BLOCKER/NIT count for the evidence block.
47
47
 
48
48
  ---
49
49
 
@@ -57,7 +57,7 @@ Every PR in strict mode includes a Review Evidence block:
57
57
  - **Mode**: strict
58
58
  - **Reviewer runtime**: native independent reviewer or codex CLI (one general pass)
59
59
  - **Dimensions covered**:
60
- - [x] Correctness — tdd evidence verified (RED commit c925187, GREEN 5e0055b)
60
+ - [x] Correctness — actual RED command/result before implementation, then GREEN on candidate
61
61
  - [x] Tests — 4/4 passing, mutation score 94%, no business mocks
62
62
  - [x] Security — trust boundary validated via Zod at /api/checkout
63
63
  - [x] Structure — services do not touch DB (repository pattern verified)
@@ -117,9 +117,20 @@ The skill is the orchestration. Specialized agents and the native `/void-code-re
117
117
 
118
118
  - The PR's HEAD has been built and tested locally / in CI. No build errors or failing required tests. Lint findings block only for a demonstrated consequence.
119
119
  - Inspect output for leaked data and actionable errors; advisory diagnostics do not reopen review.
120
- - The PR description includes a clear "what" and "why."
120
+ - Recover the accepted behavior and rationale from the task, request or PR; ask only if a missing decision changes correctness or scope.
121
121
 
122
- If any pre-condition fails, the review pauses — fix the pre-condition first.
122
+ A failing required proof or invalid subject prevents acceptance. Missing prose or advisory output does not prevent the reviewer from inspecting the candidate.
123
+
124
+ ### Reviewer runtime
125
+
126
+ Prefer an available supported runtime different from the writer for the one independent general
127
+ review. Verify its real invocation and read-only permissions; never relabel a same-runtime session.
128
+ A canonical mission's authenticated envelope remains authoritative: current canonical dispatch
129
+ binds its runtime to the coordinator. This preference does not add cross-runtime routing or allow
130
+ foreign receipts into that journal. Use the supported independent path and state the limitation;
131
+ no repeated probe or extra general review is required merely to obtain a different brand.
132
+ Retain the actual reviewer for targeted corrections. Runtime diversity complements independence
133
+ and consequence-based findings; it is not proof of correctness by itself.
123
134
 
124
135
  ### Pass
125
136
 
@@ -139,6 +150,8 @@ If any pre-condition fails, the review pauses — fix the pre-condition first.
139
150
  5. Follow `void-implement`'s maximum two correction batches. Incomplete review, resumption and
140
151
  transport repair do not consume or reset that budget. Advisory findings never request a
141
152
  correction cycle. At the limit, report unresolved defects with cause and next action.
153
+ Advisory findings never start a correction cycle; stop after acceptance, required proofs and independent review hold.
154
+
142
155
  6. The orchestrator may request one independent opinion on a disputed point and retain it
143
156
  as evidence for targeted verification, without reopening general review or resetting the
144
157
  budget. No separate automatic arbitration command is provided. Escalate beyond-mandate
@@ -149,7 +162,7 @@ If any pre-condition fails, the review pauses — fix the pre-condition first.
149
162
  ### Author response (Google practices)
150
163
 
151
164
  - Address every BLOCKER (fix or reasoned pushback).
152
- - Read every NIT. Address those you agree with; ignore the rest.
165
+ - Read NITs as optional advice. Once acceptance and proofs hold, leave them out; they never reopen the completed work or trigger another cycle.
153
166
  - Treat QUESTION as a thinking prompt — answer or escalate.
154
167
  - Push back when you disagree. Reviewer may hold ground with a clear "why."
155
168
 
@@ -159,7 +172,7 @@ If any pre-condition fails, the review pauses — fix the pre-condition first.
159
172
 
160
173
  ### "LGTM" reviews
161
174
 
162
- A review that does not list the dimensions checked is not a review. Even "everything looks fine" requires the evidence block in strict mode.
175
+ A bare verdict with no examined subject or evidence is insufficient. State the dimensions actually checked and concrete findings briefly; repeated checklist prose adds no proof.
163
176
 
164
177
  ### File-by-file linear walk
165
178
 
@@ -214,11 +227,11 @@ See `../../hooks/`.
214
227
  | Problem | Solution |
215
228
  |---|---|
216
229
  | Review feels shallow | You skipped a dimension. Walk all six in order. |
217
- | Cannot tell BLOCKER from NIT | Correctness / security / missing test / boundary violation = BLOCKER. Everything else = NIT. |
230
+ | Cannot tell BLOCKER from NIT | A demonstrated defect or missing proof of a concrete risk blocks; optional improvement is advisory. |
218
231
  | Diff is too large to review | Ask the author to split, or invoke `large-cl-justification:` if truly atomic. |
219
232
  | Found a structural rot beyond the diff | `QUESTION:` + suggest follow-up issue. Do not block this PR on it. |
220
233
  | Claude and Codex disagree | Surface the delta. Let the author/user decide. |
221
- | Cannot reach pristine output | Pre-condition failed. Pause the review until fixed. |
234
+ | Diagnostics remain | Resolve actionable defects; name unrelated warnings without restarting review. |
222
235
 
223
236
  ---
224
237
 
@@ -159,14 +159,13 @@ Commits produced in pair with an AI agent include `Co-Authored-By`. Authorship t
159
159
 
160
160
  ---
161
161
 
162
- ## Bug fix commit pairs (composes with void-debug)
162
+ ## Bug fix evidence (composes with void-debug)
163
163
 
164
- A bug fix is TWO commits:
165
-
166
- 1. `test: reproduce <bug summary>` — the failing test that demonstrates the bug
167
- 2. `fix: <root cause description>` — the implementation that resolves it
168
-
169
- Combined into one commit = rejected. The pair makes the regression-prevention explicit in `git log`.
164
+ Separate `test:` and `fix:` commits are optional. A regression test and its fix may share one
165
+ logical, bisectable commit; unrelated changes still belong in separate commits.
166
+ The proof is the observed RED result before the production fix, followed by GREEN on the
167
+ candidate, as required by `void-tdd` and `void-debug`. A pair of commit messages alone cannot
168
+ prove that chronology. Retain the actual test commands/results and explain the root cause.
170
169
 
171
170
  ---
172
171
 
@@ -182,7 +181,7 @@ Combined into one commit = rejected. The pair makes the regression-prevention ex
182
181
  ## Composition with other skills
183
182
 
184
183
  - **Runs AFTER `void-verify`** — the completion handoff produces the "what done"; this skill frames it for git.
185
- - **With `void-debug`** — bug fix commit pairs (`test:` then `fix:`).
184
+ - **With `void-debug`** — observed RED/GREEN proof and root cause; phase commits are optional.
186
185
  - **With `void-refactor`** — Two-Hat principle, named Fowler refactors in subjects.
187
186
  - **With `void-brainstorm` + `void-plan`** — substantive commits link to their spec / plan in the body.
188
187
  - **With `void-code-review`** — review comments respect the commit boundaries (do not request mixing intent).
@@ -195,7 +194,7 @@ Combined into one commit = rejected. The pair makes the regression-prevention ex
195
194
  - MUST NOT permit vacuous subjects.
196
195
  - MUST NOT permit em dash / emoji / non-ASCII.
197
196
  - MUST NOT permit `feat:` / `fix:` / `refactor:` without a body why.
198
- - MUST NOT combine bug-fix `test:` and `fix:` commits.
197
+ - MUST NOT substitute phase commit messages for observed RED/GREEN evidence.
199
198
  - MUST NOT silently allow invented commit types.
200
199
 
201
200
  ---
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: void-debug
3
- description: "Four phases (investigate, analyze, hypothesize, implement). Iron Law: no fix without a failing test reproducing the bug AND a root cause. Bug fix commit pairs. Use on bug or test failure."
3
+ description: "Four phases (investigate, analyze, hypothesize, implement). Iron Law: no fix without a failing test reproducing the bug AND a root cause. Observed RED/GREEN evidence. Use on bug or test failure."
4
4
  ---
5
5
 
6
6
  # debug — voidcorp craftsman edition
@@ -67,16 +67,15 @@ If the hypothesis does not predict a falsifiable behavior change, it is a guess.
67
67
 
68
68
  In this order:
69
69
 
70
- 1. **Write the reproducing test** (in `strict` mode per `void-tdd`). It must fail on `main`.
71
- 2. **Commit**: `test: reproduce <bug summary>`.
72
- 3. **Implement the fix**. The test now passes; other tests still pass.
73
- 4. **Commit**: `fix: <root cause description>`. Composes with `void-commit-discipline` (the "why" is the root cause).
74
- 5. **Verify pristine output** — no warnings, no leaked logs.
75
- 6. **Root-cause section in PR body** — see template below.
76
-
70
+ 1. **Write and run the reproducing test** (strict per `void-tdd`) against the unchanged base. Observe failure for the root cause, not an environment error.
71
+ 2. **Retain RED evidence**: command, relevant failure and tested source state, before implementation.
72
+ 3. **Implement the fix**, then observe the focused regression and affected tests passing.
73
+ 4. **Commit a logical, bisectable change** with its root cause; separate failing-test commits are optional.
74
+ 5. **Verify output** for actionable errors, leaks and unexplained warnings.
75
+ 6. **Explain the root cause briefly** in the PR, linking the actual RED/GREEN proof.
77
76
  ### Banned
78
77
 
79
- - Combining the reproducing test and the fix in one commit. Bug fix commit pairs are non-negotiable.
78
+ - Treating a commit message or test file as proof that the regression actually failed before the fix.
80
79
  - Adding the test "later" after the fix.
81
80
  - Marking the bug closed without an explanation that survives scrutiny.
82
81
 
@@ -170,7 +169,7 @@ Retry-until-green is rejected.
170
169
 
171
170
  **3-strike rule.** Three failed hypotheses → stop treating it as a simple bug. It is likely architectural: instrument-and-wait, or escalate to a structural review (see "When the root cause is structural").
172
171
 
173
- **Blast-radius gate.** If the fix touches > 5 files, stop and ask: proceed / split / rethink. A wide fix for a narrow bug is usually the wrong layer.
172
+ **Blast-radius check.** If the fix touches > 5 files, verify that every change is necessary to the root cause. Ask only when the required scope exceeds the mandate; file count alone does not require approval.
174
173
 
175
174
  **Recurring bug = architectural smell.** `git log` the affected files for prior fixes. The same file fixed three times is not coincidence — the root is structural, not the latest symptom.
176
175
 
@@ -140,7 +140,7 @@ export function createEmail(raw: string): Result<Email, ValidationError> {
140
140
  }
141
141
  ```
142
142
 
143
- Apply to every domain primitive: `UserId`, `OrgId`, `OrderId`, `Email`, `PhoneNumber`, `IsoDate`, `Money` (`{ amount: number; currency: CurrencyCode }`, with `CurrencyCode` itself branded).
143
+ Use a branded type when it prevents a concrete mix-up or enforces an invariant: for example distinct `UserId`/`OrgId`, validated `Email`, or monetary units. Preserve existing meaningful brands. A local primitive with no distinct invariant needs no wrapper merely to satisfy a pattern.
144
144
 
145
145
  Composes with `void-typescript-strict` (branded type mechanics) and `void-functional` (smart constructors return `Result`).
146
146
 
@@ -259,7 +259,7 @@ See `../../hooks/`.
259
259
  | Hero feels weak | Singular primary action. Recess everything else. Cut decorative gradient if generic. |
260
260
  | Too many font sizes | Reduce to the 3-token system. Vary by weight and color. |
261
261
  | Motion feels excessive | Cut decorative animations. Keep only state-change communication. |
262
- | Mobile screenshot fails | Layout was desktop-first. Restart at 360–390px. |
262
+ | Mobile screenshot fails | Diagnose and repair the affected layout at 360–390px; retain unaffected proofs and verify desktop parity. |
263
263
  | Cannot reach AA contrast | Design system token failure. Adjust palette tokens, not per-component overrides. |
264
264
 
265
265
  ---