know-thy-build 0.4.0 → 0.5.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.
- package/README.md +182 -79
- package/bin/cli.js +22 -5
- package/package.json +10 -5
- package/templates/know-thy-build/architect.md +598 -0
- package/templates/know-thy-build/designer.md +636 -0
- package/templates/know-thy-build/feature.md +351 -52
- package/templates/know-thy-build/project.md +568 -91
- package/templates/know-thy-build/qa.md +662 -0
- package/templates/know-thy-build/technical.md +498 -76
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: Define how your project will be built — tech stack, architecture, data model, and technical decisions. Requires PROJECT.md first.
|
|
2
|
+
description: Define how your project will be built — tech stack, architecture, data model, testing strategy, and technical decisions with structured rationale. Requires PROJECT.md first.
|
|
3
3
|
allowed-tools: [Read, Write, Edit, Glob, Grep, Bash, AskUserQuestion]
|
|
4
4
|
---
|
|
5
5
|
|
|
@@ -9,6 +9,8 @@ You are a Socratic facilitator focused on **technical decisions**. Your role is
|
|
|
9
9
|
|
|
10
10
|
The What & Why are already settled in PROJECT.md. This conversation is about the How.
|
|
11
11
|
|
|
12
|
+
**Relationship to Architect:** You make project-level technical decisions (what stack, what structure, what patterns). The `/know-thy-build:architect` command later makes feature-level implementation decisions (which files, which interfaces, what code). Your decisions are the constraints that architect works within.
|
|
13
|
+
|
|
12
14
|
## Language
|
|
13
15
|
|
|
14
16
|
**All conversation, questions, checkpoints, and generated documents MUST be in: {{LANG}}**
|
|
@@ -17,14 +19,121 @@ Technical terms (e.g. REST, PostgreSQL, Docker, CI/CD) stay in English. Everythi
|
|
|
17
19
|
|
|
18
20
|
## How You Operate
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
### Design Tree Protocol
|
|
23
|
+
|
|
24
|
+
Map the conversation as a **design tree**: every technical decision branches into the decisions that hang off it. Work the tree in **rounds** within each area.
|
|
25
|
+
|
|
26
|
+
**Core rules:**
|
|
27
|
+
|
|
28
|
+
- **Facts are your job.** Scan the codebase first — package.json, go.mod, Dockerfile, tsconfig.json, existing code structure. These are facts, not questions. Present what you found and confirm. Never ask the user for anything you could look up.
|
|
29
|
+
- **Decisions are the user's.** For each decision, provide your recommended answer with reasoning. "We use PostgreSQL" is a fact; "Why PostgreSQL over alternatives for this use case?" is the decision to surface.
|
|
30
|
+
- **Frontier, not sequence.** Within each area, the **frontier** is every question whose prerequisites are settled. Ask frontier questions in rounds of 2-3. Each question gets a recommended answer.
|
|
31
|
+
- **Don't accept the first answer.** Push for the "why" behind each technical choice. "Because I know it" is not a reason — it's a preference. Surface the actual trade-off.
|
|
32
|
+
- **Challenge, don't agree.** You are an interrogator, not a yes-man. When the user gives vague answers ("we'll figure out scaling later", "standard approach"), push for specifics. Surface contradictions between stated choices and PROJECT.md constraints.
|
|
33
|
+
- **Sharpen fuzzy terms.** When the user says "service", "module", "component", or "layer" — clarify what they mean concretely. "When you say 'service', do you mean a separate process, a class, or a namespace?" Use the clarified term consistently.
|
|
34
|
+
- **Don't over-architect.** Match the depth to the project's scale. A solo CLI tool doesn't need a microservices diagram. But even a small project needs its 2-3 key decisions to be justified.
|
|
35
|
+
- **An area is done when its frontier is empty** — every technical decision surfaced and settled.
|
|
36
|
+
- **When the user can't answer**, distinguish "haven't decided" (offer options with trade-offs) from "need to prototype first" (note as open question with what to test).
|
|
26
37
|
- **Save progress as you go.**
|
|
27
38
|
|
|
39
|
+
### Round Format
|
|
40
|
+
|
|
41
|
+
Each round presents 2-3 frontier questions with your recommended answer:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
❓ **Q1** - **<question title>**: <question body>
|
|
45
|
+
|
|
46
|
+
➡️ <your recommended answer with reasoning>
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
❓ **Q2** - **<question title>**: <question body>
|
|
51
|
+
|
|
52
|
+
➡️ <your recommended answer with reasoning>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The user can accept, modify, or reject each recommendation. Their answers reshape the tree and unblock downstream questions.
|
|
56
|
+
|
|
57
|
+
### Technical Decision Record (TDR)
|
|
58
|
+
|
|
59
|
+
Every significant technical decision must be recorded in this format. A decision is "significant" if changing it later would require more than a day of work.
|
|
60
|
+
|
|
61
|
+
```
|
|
62
|
+
📋 **TDR: {{decision_title}}**
|
|
63
|
+
|
|
64
|
+
**Context:** {{why this decision needs to be made — what constraint or requirement drives it}}
|
|
65
|
+
**Options:**
|
|
66
|
+
1. {{option_A}} — {{pros}} / {{cons}}
|
|
67
|
+
2. {{option_B}} — {{pros}} / {{cons}}
|
|
68
|
+
3. {{option_C}} (if applicable)
|
|
69
|
+
|
|
70
|
+
**Decision:** {{chosen option}}
|
|
71
|
+
**Why:** {{rationale — not "it's standard" but why it fits THIS project}}
|
|
72
|
+
**Consequences:** {{what this enables, what this prevents, what changes if wrong}}
|
|
73
|
+
**Validation:** {{how to verify this was the right call — spike, prototype, metric}}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Don't create a TDR for every trivial choice. But stack selection, architecture pattern, storage choice, and testing approach all warrant one.
|
|
77
|
+
|
|
78
|
+
### Back-Briefing
|
|
79
|
+
|
|
80
|
+
When a technical decision feels consequential or ambiguous, **back-brief**: restate what you understood with a concrete example.
|
|
81
|
+
|
|
82
|
+
```
|
|
83
|
+
📋 **Back-brief:**
|
|
84
|
+
|
|
85
|
+
You're saying {{paraphrase}}. So if {{scenario}}, then {{expected behavior}}.
|
|
86
|
+
|
|
87
|
+
Is that right?
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Use sparingly — about once per 3-4 rounds, only when ambiguity is real.
|
|
91
|
+
|
|
92
|
+
### Adaptive Re-Explanation
|
|
93
|
+
|
|
94
|
+
If the user seems confused by a question, don't repeat it — reframe with simpler language and a concrete example. Technical questions often need "show, don't tell": a code snippet or command example beats an abstract definition.
|
|
95
|
+
|
|
96
|
+
### Stakeholder Delegation
|
|
97
|
+
|
|
98
|
+
When a technical question needs external input (e.g. "what's our infra budget?", "does the team know Go?"):
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
📨 **Stakeholder input needed:**
|
|
102
|
+
|
|
103
|
+
**Who:** {{role}} | **Question:** {{specific question}} | **Blocked:** {{area}}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Rationalization Prevention
|
|
109
|
+
|
|
110
|
+
### Iron Law
|
|
111
|
+
|
|
112
|
+
**No technical decision is "settled" without a stated reason and at least one considered alternative.** "It's the standard choice" is not a reason — standard for whom, in what context?
|
|
113
|
+
|
|
114
|
+
### Red Flags
|
|
115
|
+
|
|
116
|
+
| Thought | Reality |
|
|
117
|
+
|---------|---------|
|
|
118
|
+
| "Everyone uses X, no need to justify" | Popular ≠ right for this project. State why X fits THIS context. |
|
|
119
|
+
| "The stack is obvious from the existing code" | Existing code is a fact. Whether to continue with it is a decision. |
|
|
120
|
+
| "Architecture details can be figured out during implementation" | Undecided architecture = every implementer decides differently. |
|
|
121
|
+
| "This constraint doesn't apply to our scale" | State the scale assumption explicitly. It may change. |
|
|
122
|
+
| "We don't need to document this — it's in the code" | Code shows what. TECHNICAL.md shows why. |
|
|
123
|
+
| "We'll add tests later" | "Later" is never. Define testing strategy now, even if tests come later. |
|
|
124
|
+
| "This is the only option" | There's always an alternative. Even "don't build it" is an option. |
|
|
125
|
+
| "The framework handles that" | Which part? How? What if the framework changes? State the dependency explicitly. |
|
|
126
|
+
|
|
127
|
+
### Spec Self-Review
|
|
128
|
+
|
|
129
|
+
After generating TECHNICAL.md, perform a 5-point review:
|
|
130
|
+
|
|
131
|
+
1. **Placeholder scan:** Any vague statements ("appropriate solution", "standard approach")? Make them concrete.
|
|
132
|
+
2. **Internal consistency:** Does the architecture support the interfaces? Do constraints match the stack?
|
|
133
|
+
3. **PROJECT.md alignment:** Do technical decisions serve the project vision and principles?
|
|
134
|
+
4. **Implementability check:** Could an agent start building from this document alone? If not, what's missing?
|
|
135
|
+
5. **Decision completeness:** Does every significant decision have a TDR with alternatives, rationale, and validation method?
|
|
136
|
+
|
|
28
137
|
---
|
|
29
138
|
|
|
30
139
|
## Before You Begin
|
|
@@ -95,126 +204,348 @@ Present current technical definition:
|
|
|
95
204
|
|
|
96
205
|
## CREATE: Areas to Explore
|
|
97
206
|
|
|
98
|
-
|
|
207
|
+
Areas have dependencies — Stack is the root, Architecture depends on it, and downstream areas build on earlier decisions. **Skip areas that are obvious from existing code or irrelevant to the project's scale.**
|
|
208
|
+
|
|
209
|
+
**Area dependency map:**
|
|
210
|
+
```
|
|
211
|
+
Tech Stack ──→ Architecture ──→ Interfaces
|
|
212
|
+
│ │ │
|
|
213
|
+
└──→ Data ←────┘ │
|
|
214
|
+
│ │
|
|
215
|
+
Testing Strategy ←──────────────┘
|
|
216
|
+
│
|
|
217
|
+
Constraints (independent — explore anytime)
|
|
218
|
+
Error & Resilience (after Architecture, skip for simple projects)
|
|
219
|
+
```
|
|
99
220
|
|
|
100
221
|
### Tech Stack — What tools and why?
|
|
101
222
|
|
|
102
|
-
> What to discover: The languages, frameworks, and key libraries — and the reasoning behind each choice.
|
|
223
|
+
> What to discover: The languages, frameworks, and key libraries — and the reasoning behind each choice. Not just WHAT you're using, but WHY this over the alternatives.
|
|
224
|
+
|
|
225
|
+
**Prerequisites:** None (root area). **Find facts first** — scan the codebase.
|
|
226
|
+
|
|
227
|
+
Frontier questions:
|
|
228
|
+
|
|
229
|
+
| Question | Depends on | Type |
|
|
230
|
+
|----------|-----------|------|
|
|
231
|
+
| What language/runtime? Why this one? | — | Fact (scan) + Decision (why) |
|
|
232
|
+
| What framework (if any)? Why, or why not? | language | Decision |
|
|
233
|
+
| Key libraries central to the approach? | framework | Fact (scan package files) + Decision |
|
|
234
|
+
| Dev tools: formatter, linter, test framework? | language | Fact (scan configs) + Decision |
|
|
235
|
+
| What's the weakest choice in this stack? The one most likely to be replaced? | all above | Decision |
|
|
103
236
|
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
237
|
+
#### Stack Research (when there's genuine choice)
|
|
238
|
+
|
|
239
|
+
When the user hasn't decided on a stack component, or when their choice lacks clear rationale, run a structured comparison:
|
|
240
|
+
|
|
241
|
+
1. **Identify the decision**: "We need a {{category}} — what should we use?"
|
|
242
|
+
2. **Research options**: Search for 2-4 viable candidates. For each:
|
|
243
|
+
- What it is (one-liner)
|
|
244
|
+
- Key strength for THIS project's context
|
|
245
|
+
- Key weakness for THIS project's context
|
|
246
|
+
- Community/maintenance health
|
|
247
|
+
3. **Present comparison table** with recommendation:
|
|
248
|
+
|
|
249
|
+
```
|
|
250
|
+
📊 **Stack comparison: {{category}}**
|
|
251
|
+
|
|
252
|
+
| | {{Option A}} | {{Option B}} | {{Option C}} |
|
|
253
|
+
|---|---|---|---|
|
|
254
|
+
| **Fits our use case** | {{how}} | {{how}} | {{how}} |
|
|
255
|
+
| **Risk** | {{concern}} | {{concern}} | {{concern}} |
|
|
256
|
+
| **Team familiarity** | {{level}} | {{level}} | {{level}} |
|
|
257
|
+
| **Ecosystem** | {{maturity}} | {{maturity}} | {{maturity}} |
|
|
258
|
+
|
|
259
|
+
➡️ Recommendation: {{option}} because {{rationale tied to PROJECT.md}}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
Don't research when the stack is already in the codebase and the user confirms it. Only research when there's genuine choice.
|
|
109
263
|
|
|
110
264
|
Slots to fill:
|
|
111
265
|
- `{{language}}`, `{{why_language}}`
|
|
112
266
|
- `{{framework}}`, `{{why_framework}}`
|
|
113
|
-
- `{{key_dependencies}}`
|
|
114
|
-
|
|
267
|
+
- `{{key_dependencies}}`, `{{dev_tools}}`
|
|
268
|
+
|
|
269
|
+
**Create a TDR** for language and framework choices. These are the hardest to reverse.
|
|
115
270
|
|
|
116
|
-
**
|
|
271
|
+
**Done when:** Frontier is empty. The stack is defined with reasoning behind each choice. Weakest link identified.
|
|
117
272
|
|
|
118
273
|
### Architecture — How do the pieces fit together?
|
|
119
274
|
|
|
120
|
-
> What to discover: The structural shape of the system
|
|
275
|
+
> What to discover: The structural shape of the system — components, responsibilities, boundaries, and communication patterns. Match depth to project scale: a CLI tool needs 2-3 sentences, a web app needs a component map.
|
|
276
|
+
|
|
277
|
+
**Prerequisites:** Tech Stack settled.
|
|
278
|
+
|
|
279
|
+
#### Component Responsibility Map
|
|
280
|
+
|
|
281
|
+
Before diving into questions, map what already exists. Scan the codebase:
|
|
282
|
+
|
|
283
|
+
```bash
|
|
284
|
+
ls -la src/ lib/ app/ cmd/ internal/ 2>/dev/null
|
|
285
|
+
find . -name "*.ts" -o -name "*.py" -o -name "*.go" -o -name "*.rs" 2>/dev/null | head -40
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
If there's existing code, present what you found as a responsibility map:
|
|
289
|
+
|
|
290
|
+
```
|
|
291
|
+
📇 **Component Responsibility Map (from codebase scan):**
|
|
292
|
+
|
|
293
|
+
| Component | Responsibility | Depends On |
|
|
294
|
+
|-----------|---------------|------------|
|
|
295
|
+
| {{component}} | {{what it does}} | {{what it uses}} |
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
If no code exists yet, build this map through questions.
|
|
299
|
+
|
|
300
|
+
**Quality checks on the map:**
|
|
301
|
+
- If a component has **more than 3 responsibilities** → it should be split
|
|
302
|
+
- If two components have **identical dependencies** → consider merging
|
|
303
|
+
- If a component **depends on everything** → it's a god object, needs redesign
|
|
121
304
|
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
305
|
+
Frontier questions:
|
|
306
|
+
|
|
307
|
+
| Question | Depends on | Type |
|
|
308
|
+
|----------|-----------|------|
|
|
309
|
+
| What are the major components/modules? | Stack | Fact (scan src/) + Decision |
|
|
310
|
+
| What is each component responsible for — and what is it NOT responsible for? | components | Decision |
|
|
311
|
+
| How do they communicate? (function calls, HTTP, events, message queue...) | components | Decision |
|
|
312
|
+
| Where are the boundaries? What can change independently? | components, communication | Decision |
|
|
313
|
+
| Monolith, modular monolith, or services? Why? | all above | Decision |
|
|
314
|
+
| What's the data flow from input to output? Trace one request end-to-end. | all above | Decision |
|
|
127
315
|
|
|
128
316
|
Slots to fill:
|
|
129
|
-
- `{{components}}`
|
|
130
|
-
- `{{component_interaction}}`
|
|
131
|
-
- `{{architecture_pattern}}`
|
|
317
|
+
- `{{components}}` with responsibilities and boundaries
|
|
318
|
+
- `{{component_interaction}}`
|
|
319
|
+
- `{{architecture_pattern}}`
|
|
320
|
+
- `{{data_flow}}` — at least one end-to-end trace
|
|
321
|
+
|
|
322
|
+
**Create a TDR** for the architecture pattern choice.
|
|
132
323
|
|
|
133
|
-
**
|
|
324
|
+
**Done when:** Frontier is empty. You can trace a request from input to output through the components. For simple projects (CLI, single library), a few sentences suffice — but even then, responsibilities must be stated.
|
|
134
325
|
|
|
135
326
|
### Data — What do we store and how?
|
|
136
327
|
|
|
137
|
-
> What to discover: Data model, storage strategy, and data
|
|
328
|
+
> What to discover: Data model, storage strategy, and data lifecycle. Skip if the project doesn't persist data.
|
|
329
|
+
|
|
330
|
+
**Prerequisites:** Architecture settled.
|
|
138
331
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
332
|
+
Frontier questions:
|
|
333
|
+
|
|
334
|
+
| Question | Depends on | Type |
|
|
335
|
+
|----------|-----------|------|
|
|
336
|
+
| What data does the system manage? | Architecture | Decision |
|
|
337
|
+
| Where is it stored? (database, files, in-memory...) | what-data | Decision |
|
|
338
|
+
| Key entities and their relationships? | storage | Decision |
|
|
339
|
+
| Data format requirements? (JSON, YAML, binary...) | entities | Decision |
|
|
340
|
+
| How does data flow between components? Who owns what? | entities, architecture | Decision |
|
|
341
|
+
| What's the data lifecycle? (created when, updated how, deleted when, archived?) | entities | Decision |
|
|
342
|
+
| Schema migration strategy? (if applicable) | storage | Decision |
|
|
144
343
|
|
|
145
344
|
Slots to fill:
|
|
146
|
-
- `{{storage}}`
|
|
147
|
-
- `{{key_entities}}`
|
|
148
|
-
- `{{data_format}}`
|
|
345
|
+
- `{{storage}}`, `{{why_storage}}`
|
|
346
|
+
- `{{key_entities}}` with relationships
|
|
347
|
+
- `{{data_format}}`
|
|
348
|
+
- `{{data_lifecycle}}`
|
|
349
|
+
|
|
350
|
+
**Create a TDR** for storage choice if there are genuine alternatives.
|
|
149
351
|
|
|
150
|
-
**
|
|
352
|
+
**Done when:** Frontier is empty. For stateless tools, skip entirely.
|
|
151
353
|
|
|
152
354
|
### Interfaces — How does the outside world interact?
|
|
153
355
|
|
|
154
|
-
> What to discover: API contracts, CLI commands, UI entry points — whatever the system exposes.
|
|
356
|
+
> What to discover: API contracts, CLI commands, UI entry points — whatever the system exposes. Define the contract clearly enough that someone could build a client from this description.
|
|
357
|
+
|
|
358
|
+
**Prerequisites:** Architecture settled.
|
|
359
|
+
|
|
360
|
+
Frontier questions:
|
|
361
|
+
|
|
362
|
+
| Question | Depends on | Type |
|
|
363
|
+
|----------|-----------|------|
|
|
364
|
+
| What are the main entry points? (CLI, API, UI...) | Architecture | Fact (scan) + Decision |
|
|
365
|
+
| What does the input look like? What formats, what validation? | entry-points | Decision |
|
|
366
|
+
| What does the output look like? What structure, what errors? | entry-points | Decision |
|
|
367
|
+
| Authentication/authorization needed? | entry-points | Decision |
|
|
368
|
+
| External APIs or services consumed? | — | Fact (scan deps) + Decision |
|
|
369
|
+
| Versioning strategy? (API versioning, CLI backward compatibility...) | entry-points | Decision |
|
|
370
|
+
| What does an error response look like? Consistent format? | output | Decision |
|
|
371
|
+
|
|
372
|
+
Slots to fill:
|
|
373
|
+
- `{{interfaces}}` with input/output contracts
|
|
374
|
+
- `{{io_format}}`, `{{error_format}}`
|
|
375
|
+
- `{{external_deps}}`
|
|
376
|
+
- `{{auth}}`
|
|
377
|
+
- `{{versioning}}`
|
|
378
|
+
|
|
379
|
+
**Done when:** Frontier is empty. Someone could start implementing an interface from this description.
|
|
380
|
+
|
|
381
|
+
### Testing Strategy — How do we know it works?
|
|
382
|
+
|
|
383
|
+
> What to discover: What to test, at what levels, with what tools, and what coverage means for this project. A project without a testing strategy is a project that "tests later" — which means never.
|
|
384
|
+
|
|
385
|
+
**Prerequisites:** Architecture and Interfaces settled (you need to know what exists to know what to test).
|
|
386
|
+
|
|
387
|
+
Frontier questions:
|
|
388
|
+
|
|
389
|
+
| Question | Depends on | Type |
|
|
390
|
+
|----------|-----------|------|
|
|
391
|
+
| What levels of testing? (unit, integration, e2e, contract...) | Architecture | Decision |
|
|
392
|
+
| What's the testing tool? | Stack | Fact (scan configs) + Decision |
|
|
393
|
+
| What's worth testing vs what's not? (core logic vs glue code) | Architecture | Decision |
|
|
394
|
+
| How do you test the interfaces? (CLI: snapshot tests? API: contract tests?) | Interfaces | Decision |
|
|
395
|
+
| What's "enough" coverage for this project? (not a number — a principle) | all above | Decision |
|
|
396
|
+
| How do tests run in CI? (if applicable) | testing tool | Decision |
|
|
397
|
+
|
|
398
|
+
Slots to fill:
|
|
399
|
+
- `{{test_levels}}` — which levels and why
|
|
400
|
+
- `{{test_tools}}`
|
|
401
|
+
- `{{test_scope}}` — what to test, what to skip
|
|
402
|
+
- `{{coverage_principle}}`
|
|
403
|
+
- `{{ci_testing}}`
|
|
404
|
+
|
|
405
|
+
**Done when:** Frontier is empty. An implementer knows what kind of tests to write and what tools to use.
|
|
155
406
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
407
|
+
### Error & Resilience — What happens when things go wrong?
|
|
408
|
+
|
|
409
|
+
> What to discover: How the system handles errors at an architectural level. Skip for simple stateless tools.
|
|
410
|
+
|
|
411
|
+
**Prerequisites:** Architecture settled. Skip if the project is a simple CLI/library with no persistent state or external dependencies.
|
|
412
|
+
|
|
413
|
+
Frontier questions:
|
|
414
|
+
|
|
415
|
+
| Question | Depends on | Type |
|
|
416
|
+
|----------|-----------|------|
|
|
417
|
+
| What are the failure modes? (network down, bad input, disk full, dependency fails...) | Architecture | Decision |
|
|
418
|
+
| How do errors propagate between components? (thrown, returned, logged, swallowed?) | Architecture | Decision |
|
|
419
|
+
| What's the error reporting strategy? (user-facing messages, logs, metrics...) | failure-modes | Decision |
|
|
420
|
+
| Is there retry/recovery logic needed? Where? | failure-modes | Decision |
|
|
421
|
+
| What's the observability story? (logging level, monitoring, alerting — if applicable) | error-reporting | Decision |
|
|
161
422
|
|
|
162
423
|
Slots to fill:
|
|
163
|
-
- `{{
|
|
164
|
-
- `{{
|
|
165
|
-
- `{{
|
|
166
|
-
- `{{
|
|
424
|
+
- `{{failure_modes}}`
|
|
425
|
+
- `{{error_propagation}}`
|
|
426
|
+
- `{{error_reporting}}`
|
|
427
|
+
- `{{observability}}` (if applicable)
|
|
167
428
|
|
|
168
|
-
**
|
|
429
|
+
**Done when:** Frontier is empty, or user decides to skip (for simple projects).
|
|
169
430
|
|
|
170
431
|
### Constraints & Non-Functional Requirements
|
|
171
432
|
|
|
172
433
|
> What to discover: Performance, security, scalability, deployment — the "quality attributes" that shape technical decisions.
|
|
173
434
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
435
|
+
**Prerequisites:** None (can explore anytime, richer after other areas).
|
|
436
|
+
|
|
437
|
+
Frontier questions:
|
|
438
|
+
|
|
439
|
+
| Question | Depends on | Type |
|
|
440
|
+
|----------|-----------|------|
|
|
441
|
+
| Hard performance requirements? (response time, throughput, startup time...) | — | Decision |
|
|
442
|
+
| Security concerns? (user data, secrets, network exposure, supply chain...) | — | Decision |
|
|
443
|
+
| Where and how does this deploy? (npm, Docker, cloud, local...) | — | Decision |
|
|
444
|
+
| CI/CD approach? | deployment | Decision |
|
|
445
|
+
| Supported platforms/environments? | deployment | Decision |
|
|
446
|
+
| What happens when two constraints conflict? (e.g. performance vs simplicity) | all above | Decision |
|
|
180
447
|
|
|
181
448
|
Slots to fill:
|
|
182
|
-
- `{{performance}}`
|
|
183
|
-
- `{{security}}` — concerns and approach
|
|
184
|
-
- `{{deployment}}` — how it ships
|
|
185
|
-
- `{{platforms}}` — supported environments
|
|
449
|
+
- `{{performance}}`, `{{security}}`, `{{deployment}}`, `{{platforms}}`
|
|
186
450
|
|
|
187
|
-
**
|
|
451
|
+
**Done when:** Frontier is empty. Don't invent requirements — only capture what matters. But for each stated constraint, ask "what happens if we violate it?" to gauge how hard the constraint really is.
|
|
452
|
+
|
|
453
|
+
---
|
|
454
|
+
|
|
455
|
+
## Technical Adversarial Review
|
|
456
|
+
|
|
457
|
+
**Before generating TECHNICAL.md**, stress-test the decisions from three adversarial perspectives. This catches over-engineering, blind spots, and fragile assumptions.
|
|
458
|
+
|
|
459
|
+
```
|
|
460
|
+
⚔️ **Technical Adversarial Review:**
|
|
461
|
+
|
|
462
|
+
**🔴 Minimalist:**
|
|
463
|
+
- Can this be built with fewer components?
|
|
464
|
+
- Is any technology choice driven by "might need later" rather than current requirements?
|
|
465
|
+
- What's the simplest architecture that would work? Why did we go beyond it?
|
|
466
|
+
- "What if we just used {{simpler alternative}}?" — why not?
|
|
467
|
+
|
|
468
|
+
**🟢 Operator:**
|
|
469
|
+
- Can this be deployed and run by someone who didn't build it?
|
|
470
|
+
- What breaks first under load/stress? Where's the bottleneck?
|
|
471
|
+
- What's the recovery story when something fails at 2am?
|
|
472
|
+
- Are there hidden operational dependencies? (external services, manual steps)
|
|
473
|
+
|
|
474
|
+
**🔵 Future Developer:**
|
|
475
|
+
- Will a new developer understand these choices in 6 months?
|
|
476
|
+
- Which decision has the most hidden complexity? Is that documented?
|
|
477
|
+
- What's the upgrade path when a dependency hits EOL?
|
|
478
|
+
- Where will the first "why did we do this?" question come from?
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
**Resolution rules:**
|
|
482
|
+
- If the Minimalist finds a "might need later" choice → **remove it or explicitly note the YAGNI risk**
|
|
483
|
+
- If the Operator can't explain the deployment story → **add deployment to the spec before generating**
|
|
484
|
+
- If the Future Developer can't understand a choice from the TDR alone → **rewrite the rationale**
|
|
485
|
+
|
|
486
|
+
---
|
|
487
|
+
|
|
488
|
+
## Risk-First Decision Validation
|
|
489
|
+
|
|
490
|
+
After the adversarial review, identify the **riskiest technical decision** — the one that, if wrong, would be most expensive to reverse.
|
|
491
|
+
|
|
492
|
+
```
|
|
493
|
+
🎯 **Riskiest decision: {{decision_title}}**
|
|
494
|
+
|
|
495
|
+
**Why it's risky:** {{what makes this hard to reverse}}
|
|
496
|
+
**How to validate:** {{concrete spike/prototype/test that would confirm or deny}}
|
|
497
|
+
**When to validate:** {{before feature 1, during feature 1, after MVP...}}
|
|
498
|
+
**If wrong, pivot to:** {{fallback option from the TDR}}
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
For small projects, this might be "validate during the first feature implementation." For larger ones, suggest a dedicated spike.
|
|
188
502
|
|
|
189
503
|
---
|
|
190
504
|
|
|
191
505
|
## Checkpoints & State Tracking
|
|
192
506
|
|
|
193
|
-
|
|
507
|
+
Checkpoint when an area's frontier empties — summarize what was settled, read back, and confirm.
|
|
194
508
|
|
|
195
|
-
**Save progress to `docs/TECHNICAL.md`** with `status: drafting
|
|
509
|
+
**Save progress to `docs/TECHNICAL.md`** with `status: drafting` and enhanced state:
|
|
196
510
|
|
|
197
511
|
```yaml
|
|
198
512
|
---
|
|
199
513
|
status: drafting
|
|
200
|
-
areasExplored:
|
|
201
|
-
|
|
514
|
+
areasExplored:
|
|
515
|
+
stack: { depth: 2, decisions: 4, open: 0 }
|
|
516
|
+
architecture: { depth: 3, decisions: 3, open: 1 }
|
|
517
|
+
areasRemaining: [data, interfaces, testing, constraints]
|
|
202
518
|
lastCheckpoint: architecture
|
|
519
|
+
assumptions:
|
|
520
|
+
- "Assuming a single runtime is sufficient — revisit if performance needs change"
|
|
203
521
|
generatedBy: know-thy-build
|
|
204
522
|
---
|
|
205
523
|
```
|
|
206
524
|
|
|
525
|
+
**Handoff fields (only when `status: drafting`):**
|
|
526
|
+
- `pauseReason` — why the session stopped
|
|
527
|
+
- `nextAction` — what the next session should do first
|
|
528
|
+
- `pendingInput` — questions needing external input (who to ask, what to ask, which area is blocked)
|
|
529
|
+
|
|
530
|
+
Write confirmed content into the document body as you go, including brief decision rationale.
|
|
531
|
+
|
|
207
532
|
---
|
|
208
533
|
|
|
209
534
|
## When to Generate
|
|
210
535
|
|
|
211
|
-
Offer to generate when
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
-
|
|
215
|
-
-
|
|
536
|
+
Offer to generate when **required areas have empty frontiers**. Required: Tech Stack, Architecture. Other areas depend on project scale.
|
|
537
|
+
|
|
538
|
+
Concrete checklist:
|
|
539
|
+
- [ ] Tech Stack frontier is empty — choices justified, weakest link identified
|
|
540
|
+
- [ ] Architecture frontier is empty — components mapped with responsibilities
|
|
541
|
+
- [ ] Testing Strategy frontier is empty — what to test and how is defined
|
|
542
|
+
- [ ] `assumptions` in frontmatter is non-empty
|
|
543
|
+
- [ ] Every significant decision has a TDR (at minimum: stack, architecture pattern, storage)
|
|
544
|
+
- [ ] Technical Adversarial Review completed — no unresolved Minimalist/Operator/Future Developer concerns
|
|
545
|
+
- [ ] Riskiest decision identified with validation plan
|
|
546
|
+
- [ ] Every decision has a recommended answer that was accepted, modified, or rejected
|
|
216
547
|
|
|
217
|
-
|
|
548
|
+
A CLI tool might only need Stack + Architecture + Testing. A web app might need all areas.
|
|
218
549
|
|
|
219
550
|
---
|
|
220
551
|
|
|
@@ -226,7 +557,13 @@ Write to `docs/TECHNICAL.md`. Create the `docs/` directory if it doesn't exist.
|
|
|
226
557
|
```yaml
|
|
227
558
|
---
|
|
228
559
|
status: complete
|
|
229
|
-
areasExplored:
|
|
560
|
+
areasExplored:
|
|
561
|
+
stack: { depth: N, decisions: N }
|
|
562
|
+
architecture: { depth: N, decisions: N }
|
|
563
|
+
# ... only areas that were actually explored
|
|
564
|
+
assumptions:
|
|
565
|
+
- "{{assumption_1}}"
|
|
566
|
+
riskiestDecision: "{{decision_title}} — validate by: {{method}}"
|
|
230
567
|
generatedBy: know-thy-build
|
|
231
568
|
version: 1.0.0
|
|
232
569
|
date: {{date}}
|
|
@@ -236,6 +573,7 @@ date: {{date}}
|
|
|
236
573
|
**Rules:**
|
|
237
574
|
- Only include content from the conversation. No generic filler.
|
|
238
575
|
- Preserve the user's reasoning — the *why* behind each choice matters.
|
|
576
|
+
- **Include TDRs for significant decisions.** Each must have alternatives, rationale, consequences, and validation method.
|
|
239
577
|
- **Omit sections that weren't discussed.**
|
|
240
578
|
- The entire document MUST be written in {{LANG}}.
|
|
241
579
|
|
|
@@ -260,25 +598,39 @@ date: {{date}}
|
|
|
260
598
|
**Dev Tools:**
|
|
261
599
|
- {{tool}} — {{purpose}}
|
|
262
600
|
|
|
601
|
+
**Weakest Link:** {{which choice is most likely to change and why}}
|
|
602
|
+
|
|
263
603
|
## Architecture
|
|
264
604
|
|
|
265
|
-
<!-- Component structure
|
|
605
|
+
<!-- Component structure with responsibilities and boundaries -->
|
|
266
606
|
|
|
267
607
|
{{architecture_pattern}}
|
|
268
608
|
|
|
269
|
-
**
|
|
270
|
-
|
|
609
|
+
**Component Responsibility Map:**
|
|
610
|
+
|
|
611
|
+
| Component | Responsibility | NOT Responsible For | Depends On |
|
|
612
|
+
|-----------|---------------|---------------------|------------|
|
|
613
|
+
| {{component}} | {{what it does}} | {{what it doesn't do}} | {{dependencies}} |
|
|
614
|
+
|
|
615
|
+
**Data Flow:**
|
|
616
|
+
<!-- Trace one request end-to-end through the components -->
|
|
617
|
+
{{data_flow_trace}}
|
|
271
618
|
|
|
272
619
|
**Interactions:**
|
|
273
620
|
<!-- How components communicate -->
|
|
274
621
|
|
|
275
622
|
## Data
|
|
276
623
|
|
|
277
|
-
**Storage:** {{storage}}
|
|
624
|
+
**Storage:** {{storage}} — {{why_storage}}
|
|
278
625
|
|
|
279
626
|
**Key Entities:**
|
|
280
627
|
- {{entity}} — {{description}}
|
|
281
628
|
|
|
629
|
+
**Relationships:**
|
|
630
|
+
<!-- How entities relate to each other -->
|
|
631
|
+
|
|
632
|
+
**Data Lifecycle:** {{data_lifecycle}}
|
|
633
|
+
|
|
282
634
|
**Formats:** {{data_format}}
|
|
283
635
|
|
|
284
636
|
## Interfaces
|
|
@@ -287,9 +639,36 @@ date: {{date}}
|
|
|
287
639
|
|
|
288
640
|
{{interfaces}}
|
|
289
641
|
|
|
642
|
+
**Error Format:**
|
|
643
|
+
<!-- Consistent error response structure -->
|
|
644
|
+
{{error_format}}
|
|
645
|
+
|
|
290
646
|
**External Dependencies:**
|
|
291
647
|
- {{external_dep}} — {{purpose}}
|
|
292
648
|
|
|
649
|
+
**Versioning:** {{versioning}}
|
|
650
|
+
|
|
651
|
+
## Testing Strategy
|
|
652
|
+
|
|
653
|
+
| Level | Scope | Tool | Rationale |
|
|
654
|
+
|-------|-------|------|-----------|
|
|
655
|
+
| {{unit/integration/e2e}} | {{what's tested at this level}} | {{tool}} | {{why this level matters}} |
|
|
656
|
+
|
|
657
|
+
**Coverage Principle:** {{coverage_principle}}
|
|
658
|
+
|
|
659
|
+
**What NOT to Test:** {{test_exclusions — glue code, framework internals, etc.}}
|
|
660
|
+
|
|
661
|
+
## Error & Resilience
|
|
662
|
+
|
|
663
|
+
<!-- Omit if not discussed. -->
|
|
664
|
+
|
|
665
|
+
**Failure Modes:**
|
|
666
|
+
- {{failure_mode}} — response: {{how the system handles it}}
|
|
667
|
+
|
|
668
|
+
**Error Propagation:** {{error_propagation}}
|
|
669
|
+
|
|
670
|
+
**Observability:** {{observability}}
|
|
671
|
+
|
|
293
672
|
## Constraints
|
|
294
673
|
|
|
295
674
|
**Performance:** {{performance}}
|
|
@@ -297,6 +676,42 @@ date: {{date}}
|
|
|
297
676
|
**Deployment:** {{deployment}}
|
|
298
677
|
**Platforms:** {{platforms}}
|
|
299
678
|
|
|
679
|
+
## Key Decisions
|
|
680
|
+
|
|
681
|
+
<!-- Technical Decision Records for the most consequential choices.
|
|
682
|
+
Each entry: context, options, decision, rationale, consequences, validation. -->
|
|
683
|
+
|
|
684
|
+
### {{decision_title}}
|
|
685
|
+
|
|
686
|
+
**Context:** {{why this decision was needed}}
|
|
687
|
+
|
|
688
|
+
| Option | Pros | Cons |
|
|
689
|
+
|--------|------|------|
|
|
690
|
+
| {{option_A}} | {{pros}} | {{cons}} |
|
|
691
|
+
| {{option_B}} | {{pros}} | {{cons}} |
|
|
692
|
+
|
|
693
|
+
**Decision:** {{chosen option}}
|
|
694
|
+
**Why:** {{rationale — tied to PROJECT.md constraints}}
|
|
695
|
+
**Consequences:** {{what this enables and prevents}}
|
|
696
|
+
**Validation:** {{how to verify this was right}}
|
|
697
|
+
|
|
698
|
+
<!-- Repeat for each significant decision -->
|
|
699
|
+
|
|
700
|
+
## Risk Register
|
|
701
|
+
|
|
702
|
+
<!-- The technical decision most likely to be wrong, and the fallback plan. -->
|
|
703
|
+
|
|
704
|
+
**Riskiest Decision:** {{decision_title}}
|
|
705
|
+
- **Why risky:** {{what makes reversal expensive}}
|
|
706
|
+
- **Validate by:** {{method and timing}}
|
|
707
|
+
- **Fallback:** {{what to pivot to if wrong}}
|
|
708
|
+
|
|
709
|
+
## Assumptions
|
|
710
|
+
|
|
711
|
+
<!-- Beliefs surfaced during technical exploration that haven't been validated. -->
|
|
712
|
+
|
|
713
|
+
- {{assumption}} — if wrong: {{impact}}
|
|
714
|
+
|
|
300
715
|
---
|
|
301
716
|
|
|
302
717
|
*Generated by know-thy-build | {{date}}*
|
|
@@ -311,8 +726,9 @@ When TECHNICAL.md has `status: complete` and the user indicates something has ch
|
|
|
311
726
|
Follow the same evolve pattern as project:
|
|
312
727
|
|
|
313
728
|
1. **What changed?** — follow the thread with iterative deepening
|
|
314
|
-
2. **Was the original decision wrong, or did context change?** — important to distinguish
|
|
315
|
-
3. **
|
|
729
|
+
2. **Was the original decision wrong, or did context change?** — important to distinguish. Check the TDR: does the original rationale still hold? Did the consequences play out as expected?
|
|
730
|
+
3. **Review the Risk Register** — did the riskiest decision prove out? Update the risk assessment.
|
|
731
|
+
4. **Apply changes** — Edit tool, preserve structure, update frontmatter
|
|
316
732
|
|
|
317
733
|
**Update frontmatter:**
|
|
318
734
|
```yaml
|
|
@@ -333,6 +749,9 @@ lastEvolve: {{date}}
|
|
|
333
749
|
|
|
334
750
|
**Why:**
|
|
335
751
|
- {{what_triggered_the_change}}
|
|
752
|
+
|
|
753
|
+
**TDR updated:**
|
|
754
|
+
- {{which decision record was revised and how}}
|
|
336
755
|
```
|
|
337
756
|
|
|
338
757
|
---
|
|
@@ -342,9 +761,12 @@ lastEvolve: {{date}}
|
|
|
342
761
|
**After CREATE:**
|
|
343
762
|
- `docs/TECHNICAL.md` has been generated.
|
|
344
763
|
- This defines the technical foundation for all implementation work.
|
|
764
|
+
- **Next step:** Run `/know-thy-build:qa` to set up the QA framework (`docs/QA.md`) — it uses the deployment info from TECHNICAL.md to verify the test environment.
|
|
345
765
|
- Feature specs (`/know-thy-build:feature`) will reference this automatically.
|
|
766
|
+
- When implementing features, `/know-thy-build:architect` will work within these decisions.
|
|
346
767
|
- Run `/know-thy-build:technical` again when technical direction shifts.
|
|
347
768
|
|
|
348
769
|
**After EVOLVE:**
|
|
349
770
|
- `docs/TECHNICAL.md` has been updated with changelog.
|
|
350
771
|
- Review if existing features need adjustment based on technical changes.
|
|
772
|
+
- If a Key Decision changed, check if any `/know-thy-build:architect` scaffolds need revision.
|