@nurix/etna 0.18.10 → 0.18.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -5
- package/bin/etna.js +35 -0
- package/data/harness-index.json +9 -1
- package/data/harnesses/code/harness.json +2 -2
- package/data/harnesses/code/skills/documentation/references/templates.md +3 -0
- package/data/harnesses/etna/.prettierignore +12 -0
- package/data/harnesses/etna/.prettierrc.json +3 -0
- package/data/harnesses/etna/.vscode/settings.json +10 -0
- package/data/harnesses/etna/CLAUDE.md +160 -0
- package/data/harnesses/etna/agents/brainstorm.md +35 -0
- package/data/harnesses/etna/agents/change-review.md +251 -0
- package/data/harnesses/etna/agents/harness-manager.md +184 -0
- package/data/harnesses/etna/agents/maintenance.md +122 -0
- package/data/harnesses/etna/agents/performance-review.md +223 -0
- package/data/harnesses/etna/agents/spec-mode.md +56 -0
- package/data/harnesses/etna/harness.json +11 -0
- package/data/harnesses/etna/hooks/hooks.json +27 -0
- package/data/harnesses/etna/hooks/lib/redact.mjs +35 -0
- package/data/harnesses/etna/hooks/prompt-recall.mjs +155 -0
- package/data/harnesses/etna/hooks/session-reflect.mjs +285 -0
- package/data/harnesses/etna/rules/general.md +86 -0
- package/data/harnesses/etna/rules/kb.md +13 -0
- package/data/harnesses/etna/rules/nomenclature.md +41 -0
- package/data/harnesses/etna/skills/boundary/SKILL.md +49 -0
- package/data/harnesses/etna/skills/boundary/references/boundary-taxonomy.md +796 -0
- package/data/harnesses/etna/skills/brainstorm/README.md +136 -0
- package/data/harnesses/etna/skills/brainstorm/SKILL.md +135 -0
- package/data/harnesses/etna/skills/brainstorm/harvest.md +26 -0
- package/data/harnesses/etna/skills/brainstorm/templates/backlog.md +39 -0
- package/data/harnesses/etna/skills/brainstorm/templates/build.md +37 -0
- package/data/harnesses/etna/skills/brainstorm/templates/decisions.md +29 -0
- package/data/harnesses/etna/skills/brainstorm/templates/doctrine.md +31 -0
- package/data/harnesses/etna/skills/brainstorm/templates/domain-model.md +25 -0
- package/data/harnesses/etna/skills/brainstorm/templates/glossary.md +20 -0
- package/data/harnesses/etna/skills/brainstorm/templates/milestones.md +43 -0
- package/data/harnesses/etna/skills/brainstorm/templates/non-goals.md +17 -0
- package/data/harnesses/etna/skills/brainstorm/templates/plan-doc.md +61 -0
- package/data/harnesses/etna/skills/brainstorm/templates/questions.md +36 -0
- package/data/harnesses/etna/skills/brainstorm/templates/references.md +28 -0
- package/data/harnesses/etna/skills/brainstorm/templates/rejected.md +29 -0
- package/data/harnesses/etna/skills/brainstorm/templates/state.md +1 -0
- package/data/harnesses/etna/skills/brainstorm/templates/tech.md +23 -0
- package/data/harnesses/etna/skills/brainstorm/templates/thesis.md +21 -0
- package/data/harnesses/etna/skills/distiller/SKILL.md +90 -0
- package/data/harnesses/etna/skills/distiller/references/docs-mode.md +299 -0
- package/data/harnesses/etna/skills/distiller/references/method.md +94 -0
- package/data/harnesses/etna/skills/documentation/SKILL.md +124 -0
- package/data/harnesses/etna/skills/documentation/references/examples.md +162 -0
- package/data/harnesses/etna/skills/documentation/references/style-guide.md +308 -0
- package/data/harnesses/etna/skills/documentation/references/templates.md +894 -0
- package/data/harnesses/etna/skills/workflow-mapper/SKILL.md +451 -0
- package/data/harnesses/etna/skills/workflow-mapper/references/patterns.md +214 -0
- package/data/harnesses/mobile/.prettierignore +12 -0
- package/data/harnesses/mobile/.prettierrc.json +3 -0
- package/data/harnesses/mobile/.vscode/settings.json +10 -0
- package/data/harnesses/mobile/CLAUDE.md +129 -0
- package/data/harnesses/mobile/agents/brainstorm.md +35 -0
- package/data/harnesses/mobile/agents/change-review.md +251 -0
- package/data/harnesses/mobile/agents/harness-manager.md +184 -0
- package/data/harnesses/mobile/agents/maintenance.md +122 -0
- package/data/harnesses/mobile/agents/performance-review.md +223 -0
- package/data/harnesses/mobile/agents/spec-mode.md +56 -0
- package/data/harnesses/mobile/harness.json +11 -0
- package/data/harnesses/mobile/hooks/hooks.json +27 -0
- package/data/harnesses/mobile/hooks/lib/redact.mjs +35 -0
- package/data/harnesses/mobile/hooks/prompt-recall.mjs +155 -0
- package/data/harnesses/mobile/hooks/session-reflect.mjs +285 -0
- package/data/harnesses/mobile/rules/general.md +86 -0
- package/data/harnesses/mobile/rules/nomenclature.md +41 -0
- package/data/harnesses/mobile/rules/react-native.md +132 -0
- package/data/harnesses/mobile/rules/typescript.md +40 -0
- package/data/harnesses/mobile/skills/boundary/SKILL.md +49 -0
- package/data/harnesses/mobile/skills/boundary/references/boundary-taxonomy.md +796 -0
- package/data/harnesses/mobile/skills/brainstorm/README.md +136 -0
- package/data/harnesses/mobile/skills/brainstorm/SKILL.md +135 -0
- package/data/harnesses/mobile/skills/brainstorm/harvest.md +26 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/backlog.md +39 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/build.md +37 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/decisions.md +29 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/doctrine.md +31 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/domain-model.md +25 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/glossary.md +20 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/milestones.md +43 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/non-goals.md +17 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/plan-doc.md +61 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/questions.md +36 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/references.md +28 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/rejected.md +29 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/state.md +1 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/tech.md +23 -0
- package/data/harnesses/mobile/skills/brainstorm/templates/thesis.md +21 -0
- package/data/harnesses/mobile/skills/distiller/SKILL.md +90 -0
- package/data/harnesses/mobile/skills/distiller/references/docs-mode.md +299 -0
- package/data/harnesses/mobile/skills/distiller/references/method.md +94 -0
- package/data/harnesses/mobile/skills/documentation/SKILL.md +124 -0
- package/data/harnesses/mobile/skills/documentation/references/examples.md +162 -0
- package/data/harnesses/mobile/skills/documentation/references/style-guide.md +308 -0
- package/data/harnesses/mobile/skills/documentation/references/templates.md +894 -0
- package/data/harnesses/mobile/skills/workflow-mapper/SKILL.md +451 -0
- package/data/harnesses/mobile/skills/workflow-mapper/references/patterns.md +214 -0
- package/package.json +1 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
# brainstorm
|
|
2
|
+
|
|
3
|
+
A Claude Code skill that is a **thinking partner for designing software** — not a form to fill in. It runs one constant loop (distill → abstract → sync → record) over a conversation, files the thinking into a small set of substance-first pillars, and treats _coherence_ as a measurable target rather than a vibe.
|
|
4
|
+
|
|
5
|
+
The point of v2 is a single inversion over v1: **the conversation is the work; the artifacts serve it.** v1 had grown into elaborate bookkeeping (a tentative/committed decision state machine, background cascade locks and queues, a 10-pillar eager bootstrap, an unconditional greenfield doctrine) wrapped around thinking that never had to happen. v2 deletes that machinery and keeps the loop.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## The loop (the only constant)
|
|
10
|
+
|
|
11
|
+
Every turn, in every mode:
|
|
12
|
+
|
|
13
|
+
1. **Distill** — fold what the user said into the pillars, in their framing, this turn.
|
|
14
|
+
2. **Abstract** — name the latent structure they implied but didn't state (an entity relationship, an invariant, a principle). One offer per exchange.
|
|
15
|
+
3. **Sync** — keep the pillars consistent with each other and with the basis (the sync agent, below).
|
|
16
|
+
4. **Record** — writes happen in the turn that produced the information; nothing is hoarded for a session-end dump.
|
|
17
|
+
|
|
18
|
+
Everything else — pillar count, ceremony, harvest — scales with the idea. The loop does not.
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Lifecycle
|
|
23
|
+
|
|
24
|
+
Two subcommands, nothing else. The skill never auto-invokes on natural language.
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
/brainstorm start # open a session (requires a basis)
|
|
28
|
+
/brainstorm stop # close a session
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
### The entry gate
|
|
32
|
+
|
|
33
|
+
A session needs substance before it opens. `start` asks for a **basis**: a reference document, or a one-shot brain dump of the whole idea. If the user drip-feeds small action items (a bug fix, a single button), the skill says it's the wrong tool and **does not open** unless overridden. The basis _is_ the first dump — the skill distills it into the initial thesis and questions, so the first questions come from the user's own material, never from an empty template.
|
|
34
|
+
|
|
35
|
+
### Intake frame
|
|
36
|
+
|
|
37
|
+
After distilling the basis, one `AskUserQuestion` batch sets three dials:
|
|
38
|
+
|
|
39
|
+
- **Complexity** (low / medium / high) — sets the default pillar surface.
|
|
40
|
+
- **Build mode** (greenfield / brownfield / hybrid) — lands in `build.md`; opens or closes the execution sections and sets the writing posture.
|
|
41
|
+
- **Mode** — where the idea lives right now (see below).
|
|
42
|
+
|
|
43
|
+
Then the skill proposes an **aspect map** — the thinking dimensions for _this_ idea — which the user edits. The map drives the sync's coverage audit.
|
|
44
|
+
|
|
45
|
+
### Modes (who drives)
|
|
46
|
+
|
|
47
|
+
| Mode | Driver | When | Behavior |
|
|
48
|
+
| --- | --- | --- | --- |
|
|
49
|
+
| **dump** | user | idea is in their head | No questions mid-stream. Distill live, reflect back shape + contradictions + implications. |
|
|
50
|
+
| **interview** | skill | idea is fuzzy | Question batches of 2–3, one aspect at a time, each answer distilled immediately. |
|
|
51
|
+
| **probe** | skill | idea is drafted | Adversarial pass — flaws, edge cases, conflicts. Each finding becomes a question. |
|
|
52
|
+
| **converge** | shared | closing | Burn down open questions into decisions or explicit parks; ends with a mandatory sync. |
|
|
53
|
+
|
|
54
|
+
Mode switches on an explicit user word. On a strong signal the skill _offers_ a switch in one line; it never seizes it.
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## Coherence (the doneness function)
|
|
59
|
+
|
|
60
|
+
```
|
|
61
|
+
coherent ⇔ open_questions == 0 ∧ last sync ran after the last pillar write
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
`questions.md` is the **single convergence currency**: flaws, gaps, contradictions, and uncovered aspects all funnel into it, whoever raised them. Convergence is one number going to zero. Zero means _"audited against the four sources and clean,"_ never _"nothing came to mind"_ — which is why the sync agent's audit contract is mandatory.
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## The sync agent
|
|
69
|
+
|
|
70
|
+
The background reconciler that replaces v1's cascade apparatus. One sync in flight at a time; at most one queued behind it. It runs after substantive writes, mandatorily on entering converge and at `stop`, and on demand. It audits exactly four sources:
|
|
71
|
+
|
|
72
|
+
1. **Cross-pillar contradiction** — thesis vs domain model vs decisions vs doctrine vs build.
|
|
73
|
+
2. **Aspect coverage** — any mapped aspect with no content → a question.
|
|
74
|
+
3. **Basis drift** — does the thesis still agree with the basis? Accidental divergence → a question.
|
|
75
|
+
4. **Tech conflicts** — anything violating `tech.md` without a recorded deviation.
|
|
76
|
+
|
|
77
|
+
It applies **scribe-calls** (edits that don't change the design) directly and notes them; it files **design-calls** (edits that change the idea) as questions and moves on — never interrupting to ask "apply now or defer?" Its one-line report ("4 edits · 2 new questions · 6 open · untouched: risks") is the only ambient convergence pressure the skill applies.
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## Pillars (substance first, lazy by default)
|
|
82
|
+
|
|
83
|
+
Always present: `thesis.md`, `questions.md`, `decisions.md`, `build.md`. Materialized at medium+ complexity: `domain-model.md`, `tech.md`. Lazy (materialize on first real content at any complexity): `doctrine`, `glossary`, `non-goals`, `backlog`, `rejected`, `references`, `milestones`.
|
|
84
|
+
|
|
85
|
+
| File | Role |
|
|
86
|
+
| --- | --- |
|
|
87
|
+
| `thesis.md` | Running narrative of what we're designing + the aspect map. |
|
|
88
|
+
| `questions.md` | Single convergence currency — every unresolved design call. |
|
|
89
|
+
| `decisions.md` | Resolved calls with **Why** + **How to apply**. Append-only, no state machine. |
|
|
90
|
+
| `build.md` | How the work executes: build mode, migration strategy, gotchas, rollout. |
|
|
91
|
+
| `domain-model.md` | Information architecture — entities, relationships, cardinalities, state ownership. |
|
|
92
|
+
| `tech.md` | Stack choices, seeded from harness rules; deviations recorded with whys. |
|
|
93
|
+
| `doctrine` / `glossary` / `non-goals` / `backlog` / `rejected` / `references` / `milestones` | As their templates describe. |
|
|
94
|
+
|
|
95
|
+
The complexity dial sets _defaults_, not a cage — any lazy pillar materializes the moment the conversation produces content for it.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Build modes (replacing the greenfield doctrine)
|
|
100
|
+
|
|
101
|
+
v1 applied a present-tense "greenfield" writing doctrine unconditionally — which was a bug for brownfield work, where migration vocabulary is load-bearing. v2 folds this into `build.md` as a **mode** chosen at intake:
|
|
102
|
+
|
|
103
|
+
- **greenfield** (default) — present-tense everywhere, no phantom history. Execution sections closed.
|
|
104
|
+
- **brownfield** — migration vocabulary is legitimate in `build.md`; other pillars still describe the target.
|
|
105
|
+
- **hybrid** — new surface on a live system; execution sections apply to the seams only.
|
|
106
|
+
|
|
107
|
+
`build.md` also captures **gotchas** — execution hazards known now, before plan mode, because surfacing them in plan mode is too late.
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## Harvest (optional)
|
|
112
|
+
|
|
113
|
+
By default the session folder _is_ the product — self-contained, resumed by the next `/brainstorm start`. When the repo is v9-harnessed (`docs/architecture/` + `docs/modules/` exist) the skill _offers_ the harvest adapter at `stop`, which routes pillars into the doc tree (ADRs, module pillars, plans, the `boundary` skill). See `harvest.md`. The adapter is never assumed.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Hard rules
|
|
118
|
+
|
|
119
|
+
1. **No production code outside the session folder.** Illustrative snippets are fine inside it.
|
|
120
|
+
2. **Speak English to the user; codes (`Q3`, `D7`) live in the files.**
|
|
121
|
+
3. **`AskUserQuestion` appears in exactly three places:** the intake frame, interview mode, converge picks.
|
|
122
|
+
4. **Suggested, never seized** — mode shifts, abstractions, probes are offered once.
|
|
123
|
+
5. **Questions are the only convergence currency** — nothing pending may live only in the transcript.
|
|
124
|
+
6. **No auto-invocation** — only `/brainstorm start` and `/brainstorm stop`.
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## Files
|
|
129
|
+
|
|
130
|
+
```
|
|
131
|
+
brainstorm/
|
|
132
|
+
├── SKILL.md # the skill definition Claude Code loads (~1.8k words)
|
|
133
|
+
├── README.md # this file
|
|
134
|
+
├── harvest.md # optional v9 doc-tree adapter
|
|
135
|
+
└── templates/ # pillar templates copied into the session folder on first use
|
|
136
|
+
```
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: brainstorm
|
|
3
|
+
description: Thinking-partner session for designing software. Invoked ONLY by explicit slash commands `/brainstorm start` and `/brainstorm stop` — never auto-invoke on natural-language phrases like "let's plan", "let's design", or "let's think through X". Entry requires a basis (a reference document or a one-shot brain dump); drip-fed action items are rejected as too small. Runs one constant loop (distill → abstract → sync → record) across four modes (dump / interview / probe / converge). Coherence = zero open questions after a fresh pillar sync. Pillar count scales with a complexity dial; refuses production code outside the session folder while open.
|
|
4
|
+
argument-hint: "start | stop"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Brainstorm
|
|
8
|
+
|
|
9
|
+
Think with the user, then file — never the reverse. The artifacts exist to serve the conversation; the conversation never exists to populate artifacts. The constant across every scale of idea is **the loop**; everything else — pillar count, ceremony, harvest — scales with complexity.
|
|
10
|
+
|
|
11
|
+
## The loop — every turn, every mode
|
|
12
|
+
|
|
13
|
+
1. **Distill.** Fold what the user just said into the pillars, in _their_ framing, during the same turn.
|
|
14
|
+
2. **Abstract.** Name the latent structure they implied but didn't state — entities and relationships ("an account has many leads" → `domain-model.md`), invariants, principles, terms. Offer at most one abstraction per exchange; it's a contribution, not a lecture.
|
|
15
|
+
3. **Sync.** Keep the pillars consistent with each other and with the basis (see **The sync agent**).
|
|
16
|
+
4. **Record.** Writes happen in the turn that produced the information — never accumulated for a session-end dump.
|
|
17
|
+
|
|
18
|
+
Modes change _who drives_ and _how much gets asked_. The loop never stops.
|
|
19
|
+
|
|
20
|
+
## Modes
|
|
21
|
+
|
|
22
|
+
| Mode | Who drives | When | Behavior |
|
|
23
|
+
| --- | --- | --- | --- |
|
|
24
|
+
| **dump** | user | idea is in their head | No questions mid-stream. Distill live. After each chunk, reflect back: the shape, contradictions, implications. Distillation + reconciliation **is** active listening — never sit silent. |
|
|
25
|
+
| **interview** | skill | idea is fuzzy | Question batches of 2–3 via `AskUserQuestion`, scoped to **one aspect at a time**. Distill each answer immediately. Questions derive from the basis and the pillars — never from a template inventory. |
|
|
26
|
+
| **probe** | skill | idea is drafted, needs stress | Challenge it: flaws, edge cases, conflicts with `tech.md` / `doctrine.md` / the domain model. Each finding becomes a question (`Raised by: probe`) — file it and move on; don't demand resolution. |
|
|
27
|
+
| **converge** | shared | closing in | Burn down open questions. `AskUserQuestion` allowed for picks. Each resolution → a decision with **Why** + **How to apply**, or an explicit park (backlog / non-goals). Ends with a mandatory fresh sync. |
|
|
28
|
+
|
|
29
|
+
**Switching** is an explicit user word ("let me dump", "ask me questions", "poke holes", "let's converge"). On a strong signal — the user starts monologuing mid-interview, or answers every probe with "I haven't thought about it" — **offer** the switch in one line. Never seize it. Announce every shift in plain English: _"Switching to probe — I'll push on the sync-layer design. Say 'park' anytime."_
|
|
30
|
+
|
|
31
|
+
## `start`
|
|
32
|
+
|
|
33
|
+
### 1. The entry gate
|
|
34
|
+
|
|
35
|
+
A session needs substance before it opens. Ask for a **basis**: a reference document (path or URL), or a one-shot brain dump of the whole idea, right now, in prose.
|
|
36
|
+
|
|
37
|
+
- Basis arrives → copy/save it into `<folder>/basis/` and proceed.
|
|
38
|
+
- The user offers drip-sized input — a bug fix, a single button, small action items — say this skill is the wrong tool, recommend stopping, and **do not open the session** unless the user explicitly overrides.
|
|
39
|
+
- No basis and no dump → no session.
|
|
40
|
+
|
|
41
|
+
### 2. Read the basis, propose the frame
|
|
42
|
+
|
|
43
|
+
Distill the basis _first_ — this seeds `thesis.md` and the initial questions. Then one `AskUserQuestion` batch:
|
|
44
|
+
|
|
45
|
+
- **Complexity** — low / medium / high. The skill proposes from the basis; the user confirms. This sets the default pillar surface (see **Pillars**) and ceremony depth.
|
|
46
|
+
- **Build mode** — "Is this greenfield, or are we changing something that exists?" (greenfield / brownfield / hybrid). The answer lands in `build.md` and opens or closes its execution sections — migration strategy and gotchas are brainstorm-phase concerns; surfacing them in plan mode is too late.
|
|
47
|
+
- **Mode** — "Where is this idea right now — fully in your head (dump it), half-formed (I'll interview), or drafted and needing stress (I'll probe)?"
|
|
48
|
+
|
|
49
|
+
Then propose the **aspect map**: the thinking dimensions for _this specific idea_ (e.g., for a product: users/jobs, domain model, architecture, tech, risks; for a small tool: behavior, interface, failure modes). Derive it from the basis — there is no fixed list. The user edits it; write it into `thesis.md`. The map is the coverage source for the sync audit.
|
|
50
|
+
|
|
51
|
+
### 3. Bootstrap
|
|
52
|
+
|
|
53
|
+
Session folder: `./brainstorm/` by default (or `./plan/`, `./design/`, custom — reuse any folder containing `state.md`; confirm in one line). Create only the pillars the complexity calls for, from `templates/` (never overwrite existing files; if a template is missing, create the file from the field lists in **Pillars**). Write top-level `state.md`:
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
STATE: open
|
|
57
|
+
MODE: dump | interview | probe | converge
|
|
58
|
+
COMPLEXITY: low | medium | high
|
|
59
|
+
SESSION STARTED: <ISO date>
|
|
60
|
+
CURRENT TOPIC: <one line>
|
|
61
|
+
LAST SYNC: <ISO datetime or never>
|
|
62
|
+
SYNC IN FLIGHT: no
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Initial questions come from the basis distillation **only** — contradictions in the dump, gaps the aspect map exposes. Never interview to fill empty templates.
|
|
66
|
+
|
|
67
|
+
## Pillars — substance first, lazy by default
|
|
68
|
+
|
|
69
|
+
| Pillar | Holds | Exists |
|
|
70
|
+
| --- | --- | --- |
|
|
71
|
+
| `thesis.md` | What we're designing — running narrative, kept current + the aspect map | always |
|
|
72
|
+
| `questions.md` | The **single convergence currency** — every unresolved design call, whoever raised it | always |
|
|
73
|
+
| `decisions.md` | Resolved calls with **Why** + **How to apply** | always |
|
|
74
|
+
| `build.md` | How the work gets executed: build mode (greenfield default / brownfield / hybrid), migration strategy, gotchas, rollout. Greenfield closes the execution sections; brownfield opens them | always |
|
|
75
|
+
| `domain-model.md` | Entities, relationships, cardinalities, state ownership | medium+ |
|
|
76
|
+
| `tech.md` | Stack choices, seeded from harness rules (e.g. `.claude/rules/general.md`) at bootstrap; deviations recorded with whys | medium+ |
|
|
77
|
+
| `doctrine` / `glossary` / `non-goals` / `backlog` / `rejected` / `references` / `milestones` | as their templates describe | **lazy** — materialize on first real content, any complexity |
|
|
78
|
+
|
|
79
|
+
The complexity dial sets _defaults_, not a cage: any lazy pillar materializes mid-session the moment the conversation produces content for it, and at **low** complexity the always-four may even live as sections of a single file if the user prefers.
|
|
80
|
+
|
|
81
|
+
**Question entries** (`questions.md`): self-contained full prose in the user's framing, plus —
|
|
82
|
+
|
|
83
|
+
- **Raised by.** user | sync | probe
|
|
84
|
+
- **Closes when.** What resolution looks like — a pick, a confirmed fact, an accepted risk. Every question must be closeable.
|
|
85
|
+
- **Options / Lean / Claude's take** — optional; _Claude's take_ remains opt-in (only when the user asks for a recommendation).
|
|
86
|
+
|
|
87
|
+
**Decision entries** (`decisions.md`): append-only; **Decision**, **Why**, **How to apply**, **Resolves Q-N**. There is no tentative/committed state machine. Reversing a decision = append a new decision that names what it reverses, mark the old entry "Reversed by D-M", and let the next sync handle the ripples.
|
|
88
|
+
|
|
89
|
+
## The sync agent
|
|
90
|
+
|
|
91
|
+
The background reconciler that replaces ceremony with consistency. **One sync in flight at a time; queue at most one behind it.**
|
|
92
|
+
|
|
93
|
+
**When:** after a distillation batch lands substantive pillar writes (at the turn break, not mid-sentence); mandatorily on entering converge and at `stop`; on demand. At **low** complexity, run it inline yourself; at **medium+**, dispatch a background `general-purpose` agent (read/write access to the session folder only).
|
|
94
|
+
|
|
95
|
+
**Contract — audit exactly four sources:**
|
|
96
|
+
|
|
97
|
+
1. **Cross-pillar contradiction** — thesis vs domain model vs decisions vs doctrine vs build (a decision that implies migration work with no `build.md` entry is a contradiction).
|
|
98
|
+
2. **Aspect coverage** — any aspect on the map with no content anywhere → emit a question.
|
|
99
|
+
3. **Basis drift** — does the thesis still agree with `basis/`? Divergence is fine if decided; accidental divergence → emit a question.
|
|
100
|
+
4. **Tech conflicts** — anything that violates `tech.md` without a recorded deviation.
|
|
101
|
+
|
|
102
|
+
**Output:** direct pillar edits for **scribe-calls**, new questions for **design-calls**, and a one-line report.
|
|
103
|
+
|
|
104
|
+
**The line:** a _scribe-call_ is anything whose resolution doesn't change the design — wording, annotations, obvious bookkeeping. Just do it; list it in the report (the user can veto). A _design-call_ is anything whose resolution changes the idea — file it as a question (`Raised by: sync`) and move on. **Never** interrupt the conversation to ask "apply now or defer?" — file and continue.
|
|
105
|
+
|
|
106
|
+
**The report is the status line.** Deliver it at the next natural turn break:
|
|
107
|
+
|
|
108
|
+
> Sync: 4 edits applied · 2 new questions · **6 open** · untouched aspects: risks
|
|
109
|
+
|
|
110
|
+
There is no separate dashboard, no scheduled checkpoint. This line is the only ambient convergence pressure the skill applies.
|
|
111
|
+
|
|
112
|
+
## Coherence
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
coherent ⇔ open_questions == 0 ∧ last sync ran after the last pillar write
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Zero means _"audited against the four sources and clean"_ — never _"nothing came to mind."_ Don't declare the idea coherent on any other basis. Distance-to-coherent is always visible in the sync report; the **user** decides when to converge and when to close. The skill never says "let's decide now."
|
|
119
|
+
|
|
120
|
+
## `stop`
|
|
121
|
+
|
|
122
|
+
1. Run a final sync (wait for any in-flight sync first).
|
|
123
|
+
2. **Coherent** → say so and proceed. **Questions open** → list them plainly (English first, codes in parentheses) and offer per question: resolve now (mini-converge) / park explicitly (backlog or non-goals, with reason) / leave open and stop anyway — the folder keeps full state and resumes exactly where it left off.
|
|
124
|
+
3. **Harvest** — see `harvest.md`. Standalone by default: the session folder _is_ the product. If the repo is v9-harnessed (`docs/architecture/` + `docs/modules/` exist), offer the adapter routing; never assume it.
|
|
125
|
+
4. Write `STATE: closed` + one-line reason. Print: _"Run `/brainstorm start` to resume."_
|
|
126
|
+
|
|
127
|
+
## Conduct — holds for the whole session
|
|
128
|
+
|
|
129
|
+
1. **Speak English; codes live in files.** In conversation, name every pillar item by what it _is_ in plain words. Append the code in parentheses only when traceability needs it (_"…can a user change answer depth? (tracked as Q6)"_). Never lead with a bare `Q3`/`D7`. The user is not looking at the files.
|
|
130
|
+
2. **No production code outside the session folder.** Illustrative load-bearing snippets are fine inside it (`samples/` or fenced in pillars). If asked for production code: offer a sketch inside the folder, or `/brainstorm stop` first.
|
|
131
|
+
3. **The writing posture comes from `build.md`'s mode.** Greenfield: every pillar describes the system as it _will be_, present tense, as though the chosen design was always the plan — no migration vocabulary, no phantom history (banned list in `templates/build.md`). Brownfield/hybrid: migration vocabulary is legitimate, and `build.md` is its home; other pillars still describe the _target_ state.
|
|
132
|
+
4. **`AskUserQuestion` appears in exactly three places:** the intake frame batch, interview mode, and converge picks. Everywhere else: prose.
|
|
133
|
+
5. **Suggested, never seized.** Mode shifts, abstractions, probes — one offer each, accept refusal without re-litigating.
|
|
134
|
+
6. **Questions are the only convergence currency.** Flaws, gaps, contradictions, uncovered aspects — everything unresolved funnels into `questions.md` or it doesn't exist. Nothing pending may live only in the conversation transcript.
|
|
135
|
+
7. **No auto-invocation.** Only `/brainstorm start` and `/brainstorm stop` enter or leave a session. Read `state.md` at the start of every turn while a session folder exists.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Harvest adapter
|
|
2
|
+
|
|
3
|
+
Harvest is **optional and offered, never assumed**. By default the session folder is the product: a self-contained registry the next `/brainstorm start` resumes from. Run this adapter only when (a) the repo is v9-harnessed — `docs/architecture/` and `docs/modules/` exist — and (b) the user accepts the offer at `stop`.
|
|
4
|
+
|
|
5
|
+
## Routing
|
|
6
|
+
|
|
7
|
+
The harvest is a structured diff between the session pillars and the live docs, routed by scope: module-local findings → `docs/modules/{m}/pillars/`, cross-module + IA/contract changes → `docs/architecture/`, backlog → `docs/history/`.
|
|
8
|
+
|
|
9
|
+
| Session source | Destination |
|
|
10
|
+
| --- | --- |
|
|
11
|
+
| `thesis.md` narrative | `docs/history/plans/YYYY-MM-DD-{slug}.md` (Status: Draft, `documentation` skill §8 Plan template) |
|
|
12
|
+
| `domain-model.md` | `docs/architecture/domain-model.md`; if it changes the IA or a cross-cutting contract, note the contract change there — the `boundary` skill will pick it up from source at the next plan check |
|
|
13
|
+
| Decisions spanning 2+ modules | one ADR per cohesive theme → `docs/history/adr/ADR-NNN-{slug}.md` (a historical decision record, not the deployed-design SOT in `docs/architecture/`), authored to the **`documentation` skill §10 ADR template** (frontmatter `status:` is the lifecycle source of truth — no body Status line; required sections Decision/Context/Consequences); rejected alternatives → the ADR's **Options Considered** table |
|
|
14
|
+
| Module-local decisions / doctrine / glossary / rejected | `docs/modules/{m}/pillars/{decisions,doctrine,glossary,rejected}.md` |
|
|
15
|
+
| Cross-module doctrine / glossary | `docs/architecture/domain-model.md` / `docs/architecture/glossary.md` |
|
|
16
|
+
| `tech.md` deviations | `docs/architecture/references.md` or the relevant ADR |
|
|
17
|
+
| `non-goals.md` / `references.md` | `docs/architecture/{non-goals,references}.md` |
|
|
18
|
+
| `backlog.md` | `docs/history/backlog.md` (P0–P3) |
|
|
19
|
+
| Still-open questions | `docs/architecture/open-questions.md`, each with a _Resolution lands in_ pointer |
|
|
20
|
+
| `build.md` (brownfield/hybrid: migration strategy, gotchas, rollout) | the plan doc in `docs/history/plans/` — execution content is plan content, not architecture |
|
|
21
|
+
|
|
22
|
+
Append a changelog entry at `docs/history/changelog/YYYY-MM-DD-brainstorm-harvest-{slug}.md` listing what was written where.
|
|
23
|
+
|
|
24
|
+
## After harvest
|
|
25
|
+
|
|
26
|
+
Offer to delete the session folder (the dispersed homes now carry the content; the next session primes from them by copying relevant docs into `basis/`). Default to **keep** if the user is unsure — a kept folder simply resumes.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# Backlog
|
|
2
|
+
|
|
3
|
+
This file is the **forward-looking list of deferred-but-planned items** — work the team intends to build, but not in the current scope. It complements `non-goals.md` (which holds the scope-creep guards: things we are **not** building) and `rejected.md` (which holds paths we considered and chose against). Use the right pillar:
|
|
4
|
+
|
|
5
|
+
| Pillar | Semantics |
|
|
6
|
+
| --- | --- |
|
|
7
|
+
| `backlog.md` (this file) | "We **will** build this, just **later**." Deferred to a known future milestone. Roadmap forward. |
|
|
8
|
+
| `non-goals.md` | "We deliberately are **not** building this." Scope guard. May never be built. |
|
|
9
|
+
| `rejected.md` | "We considered this path and chose another." Past-tense alternative. |
|
|
10
|
+
|
|
11
|
+
If you can't tell which file an item belongs in, ask: _"Is the plan to build this eventually?"_ If yes → backlog. If no but could change → non-goals. If we already weighed it against an alternative → rejected.
|
|
12
|
+
|
|
13
|
+
Backlog items carry four load-bearing fields. **Target milestone** names the future bucket (`v1.1`, `M2`, `TBD`); **Why deferred** explains the reason it isn't in the current scope (commonly: scope cut, depends on something else, waiting for user feedback, lower priority than current work); **Scope** sketches what the item actually includes — enough that a future planner can pick it up cold; **Re-evaluate when** is the trigger that promotes it from backlog to active work.
|
|
14
|
+
|
|
15
|
+
When a backlog item is promoted (its milestone comes due), **delete it from this file** and either (a) seed a new round of intake questions in `questions.md` for the new scope, or (b) move the spec into a plan doc if the design is already mostly clear. Don't strikethrough, don't leave a "(promoted)" marker — same hygiene as resolved questions and triggered non-goals.
|
|
16
|
+
|
|
17
|
+
If a backlog item turns out to be unworkable or unneeded, move it to `rejected.md` (not deleted silently) with the reason.
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## B1 — [Title]
|
|
22
|
+
|
|
23
|
+
**Target milestone.** [v1.1 / M2 / TBD]
|
|
24
|
+
|
|
25
|
+
**Why deferred.** [The reason it isn't in current scope. Be specific: "scope cut to ship M0 by Q3"; "depends on X landing first"; "waiting for user feedback on whether this is actually needed"; "lower priority than the M0 critical path".]
|
|
26
|
+
|
|
27
|
+
**Scope.** [What this item actually includes when it eventually gets built. Sketch enough that a future planner can pick it up cold. Bullet points are fine.]
|
|
28
|
+
|
|
29
|
+
**Depends on.** [Optional. Other backlog items, milestones, or upstream features that need to land first. Drop the field if nothing.]
|
|
30
|
+
|
|
31
|
+
**Re-evaluate when.** [The trigger that promotes this from backlog to active work. Tie to a milestone boundary, a metric, or an external event.]
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## B2 — [Title]
|
|
36
|
+
|
|
37
|
+
(same format)
|
|
38
|
+
|
|
39
|
+
---
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Build
|
|
2
|
+
|
|
3
|
+
This pillar holds **how the work gets executed** — decided during brainstorming, not deferred to plan mode. Migration constraints and execution gotchas discovered late invalidate designs; surfacing them here, while the design is still fluid, is the point.
|
|
4
|
+
|
|
5
|
+
At `start` the skill asks: _"Is this greenfield, or are we changing something that exists?"_ The answer sets **Mode** below and opens or closes the execution sections. The sync agent treats this file as a contradiction source — a decision that implies migration work with no entry here raises a question.
|
|
6
|
+
|
|
7
|
+
## Mode
|
|
8
|
+
|
|
9
|
+
`greenfield` _(default)_ | `brownfield` | `hybrid`
|
|
10
|
+
|
|
11
|
+
- **greenfield** — nothing built yet: no production deploys, no users, no legacy code. The execution sections below are closed — mark them _Not applicable (greenfield)_. **Writing posture:** all pillars describe the system as it _will be_, in present tense, as though the chosen design was always the plan. Banned: "replaces" / "supersedes" / "previously" / "formerly" / "no longer" / "originally proposed" / `~~strikethrough~~` / "(resolved)" markers — the reader has no past, so don't reference one. Past tense lives only in `decisions.md`, `rejected.md`, `references.md`, and git history.
|
|
12
|
+
- **brownfield** — the idea changes a system that already exists. All sections below are live, and migration vocabulary — "replaces", "currently", "migrate from" — is legitimate and load-bearing **in this file**. Other pillars still describe the _target_ state in present tense; the journey from here to there lives here.
|
|
13
|
+
- **hybrid** — a new surface attached to a live system (a new module in a shipping product). The sections below apply to the seams only: integration points, shared state, contract changes. The new surface itself follows greenfield posture.
|
|
14
|
+
|
|
15
|
+
## Current state
|
|
16
|
+
|
|
17
|
+
_(brownfield/hybrid)_ What exists today, as relevant to the change. Link code paths or docs rather than restating them.
|
|
18
|
+
|
|
19
|
+
## Target state
|
|
20
|
+
|
|
21
|
+
One or two orienting sentences — cross-reference `thesis.md` rather than duplicating it.
|
|
22
|
+
|
|
23
|
+
## Migration strategy
|
|
24
|
+
|
|
25
|
+
How we get from current to target: phases, order of operations, coexistence windows, rollback points. Harvest routes this section into the implementation plan.
|
|
26
|
+
|
|
27
|
+
## Gotchas
|
|
28
|
+
|
|
29
|
+
Execution hazards known _now_, before plan mode — each one a bullet with why it bites:
|
|
30
|
+
|
|
31
|
+
- [e.g. data backfill must run before the new index exists, or reads 404 during the window]
|
|
32
|
+
- [e.g. auth cutover can't be phased — sessions are shared, it's all-or-nothing]
|
|
33
|
+
- [e.g. the event consumer is not idempotent; dual-write window will double-process]
|
|
34
|
+
|
|
35
|
+
## Rollout & risks
|
|
36
|
+
|
|
37
|
+
Sequencing, feature flags, kill switches, and the failure modes each phase accepts.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Decisions
|
|
2
|
+
|
|
3
|
+
This file is the **append-only ledger of resolved decisions**, with the reasoning future-you needs to judge edge cases.
|
|
4
|
+
|
|
5
|
+
Load-bearing fields:
|
|
6
|
+
|
|
7
|
+
- **Decision** — what was decided, in one or two sentences.
|
|
8
|
+
- **Why** — the motivation: a constraint, an incident, a deadline, a stakeholder ask. Without the _why_, decisions decay into rules no one understands.
|
|
9
|
+
- **How to apply** — when and where this decision shapes future work. Name the files, layers, or situations where it kicks in.
|
|
10
|
+
|
|
11
|
+
There is no tentative/committed state machine. A decision is a decision the moment it's written; the next sync handles its ripples. **Reversing** a decision = append a new decision that names what it reverses, add a one-line `Reversed by D-M (YYYY-MM-DD)` note to the old entry, and let the sync raise questions for anything downstream.
|
|
12
|
+
|
|
13
|
+
This ledger is one of the places where past tense is permitted (with `rejected.md`, `references.md`, `build.md`'s execution sections, and git history).
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## D1 — [Title]
|
|
18
|
+
|
|
19
|
+
**Decision.** [What was decided.]
|
|
20
|
+
|
|
21
|
+
**Why.** [The motivation future-you needs.]
|
|
22
|
+
|
|
23
|
+
**How to apply.** [Where this rule kicks in — be specific.]
|
|
24
|
+
|
|
25
|
+
**Resolves.** Q1 (deleted from `questions.md`).
|
|
26
|
+
|
|
27
|
+
**Alternatives considered.** _(optional — reference `rejected.md` if substantial)_
|
|
28
|
+
|
|
29
|
+
**Reverses.** _(only when this decision reverses an earlier one — name it and say what changed)_
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Doctrine
|
|
2
|
+
|
|
3
|
+
This file holds **stable principles that pre-answer future questions**. When a new question arises during a brainstorm, check here first — the doctrine may already settle it without a full debate.
|
|
4
|
+
|
|
5
|
+
Doctrine entries should be **rare and durable**. They are not preferences ("I like Postgres") and not one-off picks ("we picked Temporal for this project"). They are statements that apply across many decisions: _"we never self-host stateful services in M0–M3 because operating burden outweighs cost savings at our scale."_ A doctrine that gets revised every other week isn't doctrine — it's a preference in disguise. Demote it to `decisions.md`.
|
|
6
|
+
|
|
7
|
+
Add to doctrine only when a principle has either (a) been validated across multiple decisions in this project or others, or (b) is imposed from outside (compliance, vendor lock-in, team size) and won't change without a major shift. Doctrine pre-empts argument; if you're not confident the principle will hold for the next six months, don't write it here.
|
|
8
|
+
|
|
9
|
+
Each entry carries **Principle** (the one-line statement), **Why** (the reason this is principle, not preference — often a past incident, a hard constraint, or an accepted tradeoff), and **Applies when** (the triggers, so a reader recognizes "ah, this is a doctrine question" rather than re-debating from scratch). An optional **Exceptions** field is allowed but suspicious — if a principle has many exceptions, it's mis-stated.
|
|
10
|
+
|
|
11
|
+
Examples of real doctrine entries from past projects: _"Temporal IS the trace — no separate APM tool."_ — _"No Terraform; deploys are wrangler + GitHub Actions only."_ — _"Secrets only via wrangler, never in code or env files."_ — _"Buy-not-build for non-core capabilities until paying-customer signal justifies otherwise."_
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## P1 — [Principle name]
|
|
16
|
+
|
|
17
|
+
**Principle.** [One-line statement of the rule.]
|
|
18
|
+
|
|
19
|
+
**Why.** [The reason this is a principle, not a preference. Often a past incident, a hard constraint, or a tradeoff the team has already accepted.]
|
|
20
|
+
|
|
21
|
+
**Applies when.** [Triggers — situations where this principle should be invoked.]
|
|
22
|
+
|
|
23
|
+
**Exceptions.** [Optional. Cases where the principle deliberately does not apply. If you find yourself listing many exceptions, the principle is probably mis-stated.]
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## P2 — [Principle name]
|
|
28
|
+
|
|
29
|
+
(same format)
|
|
30
|
+
|
|
31
|
+
---
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Domain model
|
|
2
|
+
|
|
3
|
+
This file holds the **information architecture** of the idea: entities, relationships, cardinalities, and who owns what state. This is where facts like "an account has many leads" land the moment they're said — they are neither principles (`doctrine.md`) nor terms (`glossary.md`), and they must not be lost to the transcript.
|
|
4
|
+
|
|
5
|
+
The loop's _abstract_ step feeds this file: when the user implies structure without naming it, propose the entry here.
|
|
6
|
+
|
|
7
|
+
## Entities
|
|
8
|
+
|
|
9
|
+
### [Entity]
|
|
10
|
+
|
|
11
|
+
[One paragraph: what it is, what state it owns, where it lives (client / server / external system).]
|
|
12
|
+
|
|
13
|
+
## Relationships
|
|
14
|
+
|
|
15
|
+
| From | To | Cardinality | Notes |
|
|
16
|
+
| --- | --- | --- | --- |
|
|
17
|
+
| Account | Lead | 1 : N | [e.g. leads cannot transfer between accounts — see D3] |
|
|
18
|
+
|
|
19
|
+
Cardinality changes are design changes — when one shifts, expect the sync to raise questions against routing, storage, and milestones.
|
|
20
|
+
|
|
21
|
+
## Invariants
|
|
22
|
+
|
|
23
|
+
Rules the model must always satisfy, stated as present-tense facts:
|
|
24
|
+
|
|
25
|
+
- [e.g. Every lead belongs to exactly one account at any point in time.]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Glossary
|
|
2
|
+
|
|
3
|
+
This file collects **terms with project-specific meaning** — words whose definition in this project diverges from their general industry sense, or whose meaning is short and opaque enough that re-explaining it across docs wastes time.
|
|
4
|
+
|
|
5
|
+
The glossary exists to prevent the quietest and most expensive kind of design drift: two collaborators using the same word for different things. By the time you notice — usually mid-implementation — the cost of resolving the ambiguity is much higher than the cost of writing the entry that would have prevented it. So when you catch yourself saying "by X I mean…" for the second time, add the entry.
|
|
6
|
+
|
|
7
|
+
Do **not** catalog every term. Add to the glossary only when:
|
|
8
|
+
|
|
9
|
+
- A term has been used to mean two different things in the same session.
|
|
10
|
+
- A term's meaning here diverges from the standard industry sense (e.g., `subscriber` meaning a webhook destination rather than a pub/sub consumer).
|
|
11
|
+
- A short term names a specific concept that would otherwise need re-defining across docs (e.g., a node category name, an internal product term).
|
|
12
|
+
|
|
13
|
+
Entries are intentionally terse: one term, one line of meaning. Long explanations belong in plan docs or `decisions.md`.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
| Term | Meaning |
|
|
18
|
+
| --- | --- |
|
|
19
|
+
| (example: `studio`) | the canonical task queue for non-publish work — see `04-runtime.md` |
|
|
20
|
+
| (example: `subscriber`) | a webhook destination registered against an event kind, distinct from a `webhook` which is the inbound side |
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Milestones
|
|
2
|
+
|
|
3
|
+
This file holds **sequencing only** — what ships in what order, with the dependencies that justify the order. Scope of each milestone lives in the plan docs; this file is the schedule.
|
|
4
|
+
|
|
5
|
+
Every milestone names three things: a **Goal** (one line — what this milestone proves or unlocks), **Depends on** (the prior milestones, or "nothing" for M0), and **Open questions** (Q-numbers from `questions.md` that must be resolved before this milestone can start). The open-questions list is what makes a milestone "ready to start" — when the list is empty, the milestone is unblocked.
|
|
6
|
+
|
|
7
|
+
The **Ships** field captures the concrete artifact: "auth + empty dashboard deployed to staging" is useful; "MVP foundation" is not. Concrete ship definitions make it visible when a milestone has crept.
|
|
8
|
+
|
|
9
|
+
Order matters and the order is enforced by `Depends on`. If you ever notice that M3 could ship before M2, the sequencing is wrong — fix it here. Milestones do not exist to chunk work into nice-sized bites; they exist to make dependency order explicit so the team can parallelize what's parallelizable and serialize what isn't.
|
|
10
|
+
|
|
11
|
+
When a milestone ships, do **not** mark it "complete" with a strikethrough or "(shipped)" marker. The plan docs for that milestone should already describe the steady state in present tense; the milestone entry stays here as schedule, not as history. (Git tags and PR history capture "what shipped when" — this file is forward-looking.)
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## M0 — [Name]
|
|
16
|
+
|
|
17
|
+
**Goal.** [One-line — what this milestone proves or unlocks.]
|
|
18
|
+
|
|
19
|
+
**Depends on.** Nothing (this is the start).
|
|
20
|
+
|
|
21
|
+
**Open questions.** Q1, Q2, Q3 — see `questions.md`.
|
|
22
|
+
|
|
23
|
+
**Ships.** [Concrete deployed artifact.]
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## M1 — [Name]
|
|
28
|
+
|
|
29
|
+
**Goal.** [One-line.]
|
|
30
|
+
|
|
31
|
+
**Depends on.** M0.
|
|
32
|
+
|
|
33
|
+
**Open questions.** Q4, Q5 — see `questions.md`.
|
|
34
|
+
|
|
35
|
+
**Ships.** [Concrete deployed artifact.]
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## M2 — [Name]
|
|
40
|
+
|
|
41
|
+
(same format)
|
|
42
|
+
|
|
43
|
+
---
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Non-goals
|
|
2
|
+
|
|
3
|
+
This file is the **explicit list of things we are not building** in the current scope, with the reason for each. It is the mirror of the scope described in `thesis.md`: where the thesis says "this is what we're building", non-goals say "this looked plausible but is deliberately out". Distinguish it from `backlog.md` (things we _will_ build, just later) — a non-goal may never be built.
|
|
4
|
+
|
|
5
|
+
Non-goals carry real weight. Every entry here is a constraint that future decisions should respect — a scope-creep guard. The reason field is load-bearing: without it, a non-goal looks like an arbitrary "no" that future-you will second-guess at the first complication. With the reason, future-you knows whether the non-goal still holds when circumstances change.
|
|
6
|
+
|
|
7
|
+
Each non-goal should include a **Re-evaluate when** clause where applicable. Non-goals are not permanent vows; they are scope decisions tied to current constraints. When the constraint changes (a customer signs in a new region, a competitor ships the feature, infrastructure costs drop), the non-goal may move into scope. The re-evaluate clause names the trigger so the team doesn't carry a stale non-goal forever.
|
|
8
|
+
|
|
9
|
+
At milestone boundaries, scan this file. If a non-goal's re-evaluate trigger has fired, fold the item into scope (`thesis.md`, or `backlog.md` if it's planned-but-later) and delete the non-goal entry here — do not strikethrough, do not leave a "(promoted)" marker.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
- **No multi-region writes in M0.** _Reason:_ cost > benefit until 3+ paying customers in distinct regions. _Re-evaluate when:_ second paying customer signs in a non-primary region.
|
|
14
|
+
|
|
15
|
+
- **No mobile app.** _Reason:_ product hypothesis is desktop-first; no validated mobile demand. _Re-evaluate when:_ >20% of dashboard sessions are mobile UA.
|
|
16
|
+
|
|
17
|
+
- (add more here)
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# NN — [Domain name]
|
|
2
|
+
|
|
3
|
+
> This is a **plan doc**, not a pillar. It describes one domain of the system (e.g., runtime, storage, ingress) in present tense, as if the chosen design were always the plan. Plan docs do not host their own "open questions" sections — those live in `pillars/questions.md`. Plan docs do not narrate the design journey — that lives in `pillars/decisions.md` and `pillars/rejected.md`. Plan docs describe what the system is.
|
|
4
|
+
>
|
|
5
|
+
> Number plan docs sequentially: `01-foo.md`, `02-bar.md`, ... Each plan doc owns one domain. If a section grows past ~500 lines, split it into two plan docs rather than letting it sprawl.
|
|
6
|
+
>
|
|
7
|
+
> Cross-reference other plan docs with `see 04 §3.2` — pointer, not duplicated content.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## On versioning iterations
|
|
12
|
+
|
|
13
|
+
If this plan doc goes through a substantial rewrite (decision reversal, structural shift, ≥3 sections change together), preserve the evolution by saving a new version as `NN-domain-v0.X.md` rather than overwriting. Examples:
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
01-architecture-v0.1.md ← initial draft
|
|
17
|
+
01-architecture-v0.2.md ← second draft after architecture change
|
|
18
|
+
01-architecture-v0.3.md ← current draft (the one to read)
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Each version stays in the folder. Readers can follow v0.1 → v0.2 → v0.3 in order to see exactly how the design evolved. The current version's top-of-file frontmatter or first line notes its status:
|
|
22
|
+
|
|
23
|
+
```markdown
|
|
24
|
+
# 01 — Architecture (v0.3)
|
|
25
|
+
|
|
26
|
+
> **Status:** Current draft. Supersedes v0.1 and v0.2. v0.4 will narrow content.
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Skip versioning for small edits (typos, single-section polish, find-and-replace). The versioning pattern is for substantial rewrites that warrant a separate readable artifact.
|
|
30
|
+
|
|
31
|
+
The `stop` step in the brainstorm offers to prune older versions if you want to simplify the final handoff. Keeping them preserves the design rationale across long sessions; pruning them produces a clean steady-state.
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 1. What this is
|
|
36
|
+
|
|
37
|
+
[One paragraph in present tense describing what this domain is, what it does, and who depends on it. No "we decided" framing, no comparisons to alternatives.]
|
|
38
|
+
|
|
39
|
+
## 2. Components
|
|
40
|
+
|
|
41
|
+
[Subsystems, services, or modules inside this domain. Each gets a subsection with: name, role, what it owns, what it depends on. Diagrams are OK if they help.]
|
|
42
|
+
|
|
43
|
+
## 3. Interfaces
|
|
44
|
+
|
|
45
|
+
[How other domains interact with this one. APIs, queues, events, file formats. Stable contracts only — speculative ones go in `pillars/questions.md`.]
|
|
46
|
+
|
|
47
|
+
## 4. Constraints accepted
|
|
48
|
+
|
|
49
|
+
[Tradeoffs that shape the design. Phrased as current fact: "we accept a 5-second lag for predictable throughput", not "we considered streaming but chose batch".]
|
|
50
|
+
|
|
51
|
+
## 5. Future scope (optional)
|
|
52
|
+
|
|
53
|
+
[Cleanly labelled phase-2 ideas. Not framed as migrations. Skip the section if there's nothing here.]
|
|
54
|
+
|
|
55
|
+
---
|
|
56
|
+
|
|
57
|
+
## Open questions for this domain
|
|
58
|
+
|
|
59
|
+
See [`pillars/questions.md`](./pillars/questions.md): Q-N, Q-M, ...
|
|
60
|
+
|
|
61
|
+
(One line, never more. The plan doc never hosts question bodies.)
|