@turri-dev/cli 0.1.4-next.318a98a → 0.1.4-next.5a8c6e5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/.pi/themes/turri-dark.json +67 -66
  2. package/.pi/themes/turri-light.json +71 -73
  3. package/README.md +40 -128
  4. package/assets/jellyfish/dark-00.png +0 -0
  5. package/assets/jellyfish/dark-01.png +0 -0
  6. package/assets/jellyfish/dark-02.png +0 -0
  7. package/assets/jellyfish/dark-03.png +0 -0
  8. package/assets/jellyfish/dark-04.png +0 -0
  9. package/assets/jellyfish/dark-05.png +0 -0
  10. package/assets/jellyfish/dark-06.png +0 -0
  11. package/assets/jellyfish/dark-07.png +0 -0
  12. package/assets/jellyfish/dark-08.png +0 -0
  13. package/assets/jellyfish/dark-09.png +0 -0
  14. package/assets/jellyfish/dark-10.png +0 -0
  15. package/assets/jellyfish/dark-11.png +0 -0
  16. package/assets/jellyfish/light-00.png +0 -0
  17. package/assets/jellyfish/light-01.png +0 -0
  18. package/assets/jellyfish/light-02.png +0 -0
  19. package/assets/jellyfish/light-03.png +0 -0
  20. package/assets/jellyfish/light-04.png +0 -0
  21. package/assets/jellyfish/light-05.png +0 -0
  22. package/assets/jellyfish/light-06.png +0 -0
  23. package/assets/jellyfish/light-07.png +0 -0
  24. package/assets/jellyfish/light-08.png +0 -0
  25. package/assets/jellyfish/light-09.png +0 -0
  26. package/assets/jellyfish/light-10.png +0 -0
  27. package/assets/jellyfish/light-11.png +0 -0
  28. package/dist/ask.js +34 -15
  29. package/dist/brand.js +7 -7
  30. package/dist/cli-options.js +12 -6
  31. package/dist/config-edit.js +1 -0
  32. package/dist/config.js +5 -2
  33. package/dist/cultivate-cli.js +16 -23
  34. package/dist/extension.js +59 -67
  35. package/dist/init-config.js +5 -0
  36. package/dist/jellyfish.js +130 -0
  37. package/dist/loop-cli.js +19 -7
  38. package/dist/loop-tools.js +11 -5
  39. package/dist/module-report.js +5 -4
  40. package/dist/pi.js +76 -19
  41. package/dist/question-dialog.js +1 -0
  42. package/dist/regenerate/activity.js +21 -0
  43. package/dist/regenerate/list-arguments.js +121 -0
  44. package/dist/regenerate/loop.js +21 -8
  45. package/dist/regenerate/plain-palette.js +52 -37
  46. package/dist/regenerate/regenerate.js +4 -2
  47. package/dist/regenerate/self-check.js +13 -6
  48. package/dist/regenerate/side-panel.js +1 -1
  49. package/dist/regenerate/spec-map-view.js +9 -5
  50. package/dist/regenerate/test-scripts.js +54 -10
  51. package/dist/regenerate/unit-review.js +1 -1
  52. package/dist/regenerate-cli.js +11 -5
  53. package/dist/release-cli.js +3 -8
  54. package/dist/review/live.js +2 -1
  55. package/dist/run-report.js +39 -1
  56. package/dist/validate-cli.js +3 -8
  57. package/docs/README.md +5 -12
  58. package/docs/authoring-plain.md +37 -119
  59. package/docs/config.md +53 -178
  60. package/docs/deploy.md +21 -80
  61. package/docs/development.md +13 -41
  62. package/docs/headless.md +45 -121
  63. package/docs/images/how-turri-works.svg +29 -31
  64. package/docs/images/turri-banner.png +0 -0
  65. package/docs/installation.md +13 -40
  66. package/docs/parser.md +15 -43
  67. package/docs/regenerating.md +229 -938
  68. package/docs/sandbox.md +38 -152
  69. package/docs/skills-and-gates.md +50 -171
  70. package/docs/theming.md +45 -46
  71. package/docs/using.md +69 -345
  72. package/genome/rules/bullet-continuation.md +5 -13
  73. package/genome/rules/concise-specs-examples.md +2 -4
  74. package/genome/rules/concise-specs-integration-examples.md +2 -6
  75. package/genome/rules/concise-specs.md +1 -2
  76. package/genome/rules/func-specs.md +1 -0
  77. package/genome/rules/integration-embedded-testing.md +1 -4
  78. package/genome/rules/integrations.md +1 -2
  79. package/genome/rules/project-model.md +14 -35
  80. package/genome/rules/stdlib.md +14 -49
  81. package/genome/rules/turri-regeneration.md +48 -0
  82. package/genome/skills/add-implementation-requirement/SKILL.md +1 -2
  83. package/genome/skills/analyze-if-func-spec-too-complex/SKILL.md +3 -8
  84. package/genome/skills/brood/SKILL.md +37 -127
  85. package/genome/skills/brood/references/intent.md +4 -12
  86. package/genome/skills/brood/references/product.md +24 -76
  87. package/genome/skills/brood/references/stack.md +7 -29
  88. package/genome/skills/brood/references/testing.md +11 -42
  89. package/genome/skills/bud/SKILL.md +32 -109
  90. package/genome/skills/bud/references/intent.md +4 -11
  91. package/genome/skills/implement-conformance-testing-script/SKILL.md +3 -6
  92. package/genome/skills/implement-unit-testing-script/SKILL.md +1 -2
  93. package/genome/skills/mature/SKILL.md +21 -69
  94. package/genome/skills/refactor-module/SKILL.md +24 -2
  95. package/genome/skills/spawn/SKILL.md +28 -113
  96. package/package.json +1 -1
  97. package/assets/jellyfish/dark-12.png +0 -0
  98. package/assets/jellyfish/dark-13.png +0 -0
  99. package/assets/jellyfish/dark-14.png +0 -0
  100. package/assets/jellyfish/fallback.txt +0 -252
  101. package/assets/jellyfish/light-12.png +0 -0
  102. package/assets/jellyfish/light-13.png +0 -0
  103. package/assets/jellyfish/light-14.png +0 -0
@@ -15,19 +15,12 @@ These rules apply to every section and to concept explanations.
15
15
 
16
16
  ## One statement per line
17
17
 
18
- This is the preferred `.plain` authoring convention, not something the renderer enforces. A line
19
- break in a section means one of exactly two things: a new `- ` statement, or a nested `- `
20
- clarification of the statement above it. There is no third, typographic reason to break a line.
18
+ This is the preferred `.plain` authoring convention, not something the renderer enforces. A line break in a section means one of exactly two things: a new `- ` statement, or a nested `- ` clarification of the statement above it. There is no third, typographic reason to break a line.
21
19
 
22
20
  - Write each statement on a single line, however long
23
- - Never break a line just for width: a bare continuation (an indented line without `- `) adds a
24
- line break that carries no structure — to every future reader and editing agent it is
25
- indistinguishable from a deliberate sub-point
26
- - The test: if content deserves its own line, it deserves its own `- ` bullet; if it doesn't,
27
- keep it on the parent's line
28
- - What the renderer does enforce is the top level: every statement in a section must be a `- `
29
- list item — a flush-left prose line is a syntax error. A bare continuation, by contrast, is
30
- accepted and folded into its parent item verbatim
21
+ - Never break a line just for width: a bare continuation (an indented line without `- `) adds a line break that carries no structure — to every future reader and editing agent it is indistinguishable from a deliberate sub-point
22
+ - The test: if content deserves its own line, it deserves its own `- ` bullet; if it doesn't, keep it on the parent's line
23
+ - What the renderer does enforce is the top level: every statement in a section must be a `- ` list item — a flush-left prose line is a syntax error. A bare continuation, by contrast, is accepted and folded into its parent item verbatim
31
24
 
32
25
  BAD — line broken for width (bare continuation):
33
26
 
@@ -65,5 +58,4 @@ BEST — separate clarifications expressed as nested bullets:
65
58
 
66
59
  ## Content that belongs in resources
67
60
 
68
- Long URLs, schema fragments, and example payloads belong in `resources/` because they are external
69
- artifacts, not because of their character count. Follow `linked-resources.md`.
61
+ Long URLs, schema fragments, and example payloads belong in `resources/` because they are external artifacts, not because of their character count. Follow `linked-resources.md`.
@@ -208,8 +208,7 @@ GOOD:
208
208
  - :ConformanceTests: mock every external HTTP call.
209
209
  ```
210
210
 
211
- Every hedge hands the renderer a decision the spec was supposed to make. A spec states one
212
- behavior.
211
+ Every hedge hands the renderer a decision the spec was supposed to make. A spec states one behavior.
213
212
 
214
213
  ## Ornate vocabulary
215
214
 
@@ -427,5 +426,4 @@ GOOD:
427
426
  - :ProjectList: contains exactly one :Project:, named `Apollo`.
428
427
  ```
429
428
 
430
- One narrated paragraph becomes an ordered set of checkable steps, and "everything worked as
431
- expected" becomes an assertion.
429
+ One narrated paragraph becomes an ordered set of checkable steps, and "everything worked as expected" becomes an assertion.
@@ -221,9 +221,7 @@ GOOD:
221
221
  - :ProviderClient: uses :AuthTokenManager: to cache and refresh :AccessToken:.
222
222
  ```
223
223
 
224
- The grant type, endpoint, body encoding, and response fields are in the security scheme. What
225
- survives is the policy the scheme does not describe: the env-var names, the refresh margin, the
226
- retry-once-on-401 rule, and the concurrency behavior.
224
+ The grant type, endpoint, body encoding, and response fields are in the security scheme. What survives is the policy the scheme does not describe: the env-var names, the refresh margin, the retry-once-on-401 rule, and the concurrency behavior.
227
225
 
228
226
  Almost all of it is implementation reqs — acquisition, caching, and refresh are machinery a caller never sees. Not all of it, though, and the rewrite has to name a component to say the rest. :ProviderAuth: performs the grant and has no observable surface; :AuthTokenManager: is what consumes it and hands tokens to :ProviderClient:, so it is the concept a functional spec can take as its subject. Without that consumer the section is left with a subject-less bullet, which `func-specs.md` rules out — and that one spec is the only line here a live conformance test can assert.
229
227
 
@@ -265,6 +263,4 @@ GOOD:
265
263
  - The `429` and forced-`5xx` paths mock that endpoint alone; every other path is live.
266
264
  ```
267
265
 
268
- A policy that holds for every endpoint is stated once. Enumerate an endpoint only where it departs
269
- from the policy — here, the two paths that cannot be exercised live safely, which
270
- `integrations.md` requires to be documented explicitly.
266
+ A policy that holds for every endpoint is stated once. Enumerate an endpoint only where it departs from the policy — here, the two paths that cannot be exercised live safely, which `integrations.md` requires to be documented explicitly.
@@ -27,8 +27,7 @@ Do not write:
27
27
  - Anything about work the spec is not about ("no changes to the existing UI")
28
28
  - Meta-commentary about the spec itself ("this spec is intentionally small", "as described above")
29
29
 
30
- Worked pairs for every item above — padding, rationale, defaults, technology behavior,
31
- meta-commentary, and duplication of an `import` — are in `concise-specs-examples.md`.
30
+ Worked pairs for every item above — padding, rationale, defaults, technology behavior, meta-commentary, and duplication of an `import` — are in `concise-specs-examples.md`.
32
31
 
33
32
  ## Use plain words
34
33
 
@@ -65,6 +65,7 @@ GOOD — statements of fact with concrete subjects:
65
65
  - The renderer has **no knowledge of future specs** — only previously rendered specs are in context
66
66
  - A new spec can reference behavior from earlier specs but cannot assume anything about specs that come after it
67
67
  - Functional specs from `requires` modules are treated as previous requirements — transitively, across the whole ancestor chain
68
+ - This order is about what a spec may assume, not what a change costs: turri regenerates a change as a spec diff wherever it sits (`turri-regeneration.md`)
68
69
 
69
70
  ## No conflicts
70
71
  - The new spec must not contradict any existing functional spec
@@ -4,10 +4,7 @@ description: Rules for authoring the two test scripts that an embedded ***plain
4
4
 
5
5
  # Rules for embedded-integration test scripts
6
6
 
7
- When an embedded integration ships its two `test_scripts/` (unit, conformance), these
8
- rules apply on top of the contracts in the corresponding
9
- `implement-*-testing-script` skills. `project-model.md` covers the rendering and
10
- testing workflow.
7
+ When an embedded integration ships its two `test_scripts/` (unit, conformance), these rules apply on top of the contracts in the corresponding `implement-*-testing-script` skills. `project-model.md` covers the rendering and testing workflow.
11
8
 
12
9
  ## Staging model (read this first)
13
10
 
@@ -63,8 +63,7 @@ Integrations exist to talk to a real third-party (or internal) API. Their `:Conf
63
63
  - The integration's `:ConformanceTests:` **must** make real network calls to the provider (typically a sandbox / staging environment, occasionally production for read-only paths). Recorded responses may back unit tests, but they are **not** a substitute for live conformance
64
64
  - The only exceptions are paths that **cannot** be exercised live safely:
65
65
  - **Rate-limit (429) tests** — must not exhaust the live quota; use a local mock for that specific endpoint
66
- - **Deliberately destructive failure modes** (forced 5xx) the provider doesn't let you trigger — same; mock the specific endpoint
67
- Document each exception explicitly in `***test reqs***`; everything else is live by default
66
+ - **Deliberately destructive failure modes** (forced 5xx) the provider doesn't let you trigger — same; mock the specific endpoint Document each exception explicitly in `***test reqs***`; everything else is live by default
68
67
 
69
68
  ### Secrets come from the environment
70
69
 
@@ -4,15 +4,12 @@ description: The ***plain project model - the specs as source of truth, the repo
4
4
 
5
5
  # The ***plain project model
6
6
 
7
- This rule covers the project as a whole. Section content is owned by the per-section rule files;
8
- file structure by `module-structure.md`.
7
+ This rule covers the project as a whole. Section content is owned by the per-section rule files; file structure by `module-structure.md`.
9
8
 
10
9
  ## Source of truth
11
10
 
12
- - The `.plain` files are the source of truth. They state what the software does, how it is built,
13
- and how it is tested; the code is generated from them
14
- - Every change to the software is a change to a `.plain` file, which the next render builds. A fix
15
- made anywhere else is lost the next time the code is regenerated
11
+ - The `.plain` files are the source of truth. They state what the software does, how it is built, and how it is tested; the code is generated from them
12
+ - Every change to the software is a change to a `.plain` file, which the next render builds. A fix made anywhere else is lost the next time the code is regenerated
16
13
 
17
14
  ## Repository layout
18
15
 
@@ -27,37 +24,23 @@ plain_modules/ # generated - one folder per module
27
24
  <module>/tests/ # the whole conformance suite of the module
28
25
  ```
29
26
 
30
- Follow `module-structure.md`, `import-modules.md` and `linked-resources.md` for what these
31
- directories may contain and how a spec refers to them.
27
+ Follow `module-structure.md`, `import-modules.md` and `linked-resources.md` for what these directories may contain and how a spec refers to them.
32
28
 
33
29
  ## The config records the build decisions
34
30
 
35
- `config.turri.yaml`, at the project root beside the specs, is where the project's decisions about how it
36
- is built live: the models, whether conformance tests are written (`conformance-tests:`), and the scripts
37
- it uses (`unittests-script:`, `conformance-tests-script:`,
38
- `prepare-environment-script:`). turri can find a script by its name, but the config is what a person
39
- reads to see how the project is set up, and what they change.
40
-
41
- - Settle a decision, write it into the config in the same step - never leave it to be inferred from
42
- what is on disk. A testing script you write or keep is named by its key, by path
43
- from the root (`unittests-script: test_scripts/run_unittests_python.sh`); conformance tests
44
- turned on or off are `conformance-tests: true` or `false`
45
- - Change only the keys you settled. Where the file has a key's example commented out, uncomment that
46
- line and set it; keep every other line and comment as it is
47
- - A project whose parts are on different stacks keeps each stack's scripts in its own
48
- `config.turri.<stack>.yaml` beside it; what the stacks share stays in `config.turri.yaml`
49
- - A project with only a `config.yaml` has it copied to `config.turri.yaml` first, and each
50
- `config.<name>.yaml` to `config.turri.<name>.yaml`; `config.yaml` may be another tool's, and is never
51
- written
31
+ `config.turri.yaml`, at the project root beside the specs, is where the project's decisions about how it is built live: the models, whether conformance tests are written (`conformance-tests:`), and the scripts it uses (`unittests-script:`, `conformance-tests-script:`, `prepare-environment-script:`). turri can find a script by its name, but the config is what a person reads to see how the project is set up, and what they change.
32
+
33
+ - Settle a decision, write it into the config in the same step - never leave it to be inferred from what is on disk. A testing script you write or keep is named by its key, by path from the root (`unittests-script: test_scripts/run_unittests_python.sh`); conformance tests turned on or off are `conformance-tests: true` or `false`
34
+ - Change only the keys you settled. Where the file has a key's example commented out, uncomment that line and set it; keep every other line and comment as it is
35
+ - A project whose parts are on different stacks keeps each stack's scripts in its own `config.turri.<stack>.yaml` beside it; what the stacks share stays in `config.turri.yaml`
36
+ - A project with only a `config.yaml` has it copied to `config.turri.yaml` first, and each `config.<name>.yaml` to `config.turri.<name>.yaml`; `config.yaml` may be another tool's, and is never written
52
37
  - Say in your summary which lines you wrote
53
38
 
54
39
  ## Generated output is read-only
55
40
 
56
- Everything under `plain_modules/` is generated - `code/` and `tests/` alike. Read it, run it, debug
57
- it; never edit it. Fix the spec instead, in the section that owns the fact:
41
+ Everything under `plain_modules/` is generated - `code/` and `tests/` alike. Read it, run it, debug it; never edit it. Fix the spec instead, in the section that owns the fact:
58
42
 
59
- - behaviour, implementation or unit-test guidance → definitions, functional specs, or implementation
60
- reqs
43
+ - behaviour, implementation or unit-test guidance → definitions, functional specs, or implementation reqs
61
44
  - conformance-test guidance → test reqs
62
45
  - acceptance-test guidance → the acceptance tests nested under their functional spec
63
46
 
@@ -75,14 +58,10 @@ Parameters are key-value pairs; the template reads them as `{{ variable_name }}`
75
58
 
76
59
  ## When an earlier test fails after a render
77
60
 
78
- Functional specs render in order, each knowing the ones before it and none after it - a required
79
- module's specs count as before. After each render every conformance test so far runs again. A test
80
- that passed before and fails now means one of:
61
+ Each functional spec is written knowing the ones before it and none after it - a required module's specs count as before - so a spec may rely on what earlier ones say, never on later ones. This is about what a spec may assume, not what a change costs (`turri-regeneration.md`). After each render every conformance test so far runs again. A test that passed before and fails now means one of:
81
62
 
82
63
  1. the new code does not satisfy its spec;
83
64
  2. the test does not test its spec accurately;
84
65
  3. the new spec and an earlier one conflict.
85
66
 
86
- The harness triages the first two and repairs the code. The third is a spec problem: resolve it in
87
- the `.plain` files with `resolve-spec-conflict`, and trace a misbehaving build back to its spec with
88
- `debug-specs` - never by editing generated output.
67
+ The harness triages the first two and repairs the code. The third is a spec problem: resolve it in the `.plain` files with `resolve-spec-conflict`, and trace a misbehaving build back to its spec with `debug-specs` - never by editing generated output.
@@ -4,11 +4,7 @@ description: The ***plain standard library - import modules for a backend, a fro
4
4
 
5
5
  # Rules for the standard library
6
6
 
7
- turri ships a standard library of import modules that settle everything about a generic piece
8
- of software on one stack except what it does: its language and framework, its layout, its
9
- configuration, how it handles errors, how it logs, how it stops, and how it is tested. A module that
10
- imports one writes only what is its own - its concepts and its functional specs - and a requirement
11
- only for what its stack does not settle.
7
+ turri ships a standard library of import modules that settle everything about a generic piece of software on one stack except what it does: its language and framework, its layout, its configuration, how it handles errors, how it logs, how it stops, and how it is tested. A module that imports one writes only what is its own - its concepts and its functional specs - and a requirement only for what its stack does not settle.
12
8
 
13
9
  ```plain
14
10
  ---
@@ -20,54 +16,23 @@ import:
20
16
 
21
17
  ## How it is built up
22
18
 
23
- - Each stack imports its language's template - `stdlib/lang/python` - and its kind's `common` -
24
- `stdlib/backend/common` - so importing the stack brings all three.
25
- - Each stack's conformance tests are a template of their own, `stdlib/<kind>/conformance/<stack>`,
26
- which imports `stdlib/<kind>/conformance/common`.
27
- - The `common` of a kind settles what every stack of it shares. For a backend: settings from the
28
- environment, checked at start; handler, service and repository layers; domain errors turned into
29
- one error body `{"error": {"code", "message"}}` with fixed codes and statuses; JSON logs with a
30
- request id; shutdown on a signal. For a command-line tool: `Error: <message>` on standard error,
31
- exit codes 0, 1, 2 and 130, logs on standard error with `--verbose` and `--debug`. For a frontend:
32
- one API layer with an `ApiError`, errors shown in place or at the root, one logger module. For a
33
- library: one public entry point, one base error type, no output of its own.
19
+ - Each stack imports its language's template - `stdlib/lang/python` - and its kind's `common` - `stdlib/backend/common` - so importing the stack brings all three.
20
+ - Each stack's conformance tests are a template of their own, `stdlib/<kind>/conformance/<stack>`, which imports `stdlib/<kind>/conformance/common`.
21
+ - The `common` of a kind settles what every stack of it shares. For a backend: settings from the environment, checked at start; handler, service and repository layers; domain errors turned into one error body `{"error": {"code", "message"}}` with fixed codes and statuses; JSON logs with a request id; shutdown on a signal. For a command-line tool: `Error: <message>` on standard error, exit codes 0, 1, 2 and 130, logs on standard error with `--verbose` and `--debug`. For a frontend: one API layer with an `ApiError`, errors shown in place or at the root, one logger module. For a library: one public entry point, one base error type, no output of its own.
34
22
 
35
23
  ## When to use it
36
24
 
37
- - When the person wants a backend, a frontend, a command-line tool or a library, import the stack
38
- that fits instead of writing its implementation reqs yourself.
39
- - Pick the stack from what the person said, the project's other modules, and what the module talks
40
- to. With nothing to go on: `stdlib/backend/python-fastapi`, `stdlib/frontend/react-vite`,
41
- `stdlib/cli/python-typer`, `stdlib/library/python`.
42
- - Import the conformance template only when the module has conformance tests - the person asked for
43
- them, and the project's config does not turn them off (`conformance-tests: false`). Without it
44
- the module has no test reqs, and no conformance tests are written or run for it. Turning them on
45
- later is adding that one import.
46
- - Read the templates a module imports before writing its specs - the folder is named below - and
47
- write no requirement they already make (see `concise-specs.md`).
48
- - Write a functional spec's errors in the templates' terms: a backend's failure by its status and
49
- `error.code` - `not_found`, `conflict`, `validation_error`, `unauthenticated`, `forbidden`, or a
50
- code of the module's own - and a command-line tool's by its exit code and message.
51
- - Add a requirement on top for what the module needs beyond its stack - storage, an outside
52
- service, a library it must use. When the module differs from its stack on something the stack
53
- settles - another framework, another layout - write the stack yourself instead: an import cannot
54
- be taken back in part. For a language with no stack of the kind wanted, import its
55
- `stdlib/lang/<language>` and write the rest.
56
- - `stdlib/` is a reserved name. An import that starts with it is always the standard library's
57
- template, and a project module at such a path - `stdlib/backend/python-fastapi.plain` in the
58
- spec's folder, its `template/` folder or `PLAIN_TEMPLATE_DIRS` - is an error. Never write a module
59
- under a `stdlib/` folder of the project; a project's own shared template goes in `template/`
60
- under a name of its own.
25
+ - When the person wants a backend, a frontend, a command-line tool or a library, import the stack that fits instead of writing its implementation reqs yourself.
26
+ - Pick the stack from what the person said, the project's other modules, and what the module talks to. With nothing to go on: `stdlib/backend/python-fastapi`, `stdlib/frontend/react-vite`, `stdlib/cli/python-typer`, `stdlib/library/python`.
27
+ - Import the conformance template only when the module has conformance tests - the person asked for them, and the project's config does not turn them off (`conformance-tests: false`). Without it the module has no test reqs, and no conformance tests are written or run for it. Turning them on later is adding that one import.
28
+ - Read the templates a module imports before writing its specs - the folder is named below - and write no requirement they already make (see `concise-specs.md`).
29
+ - Write a functional spec's errors in the templates' terms: a backend's failure by its status and `error.code` - `not_found`, `conflict`, `validation_error`, `unauthenticated`, `forbidden`, or a code of the module's own - and a command-line tool's by its exit code and message.
30
+ - Add a requirement on top for what the module needs beyond its stack - storage, an outside service, a library it must use. When the module differs from its stack on something the stack settles - another framework, another layout - write the stack yourself instead: an import cannot be taken back in part. For a language with no stack of the kind wanted, import its `stdlib/lang/<language>` and write the rest.
31
+ - `stdlib/` is a reserved name. An import that starts with it is always the standard library's template, and a project module at such a path - `stdlib/backend/python-fastapi.plain` in the spec's folder, its `template/` folder or `PLAIN_TEMPLATE_DIRS` - is an error. Never write a module under a `stdlib/` folder of the project; a project's own shared template goes in `template/` under a name of its own.
61
32
 
62
33
  ## What it does not do
63
34
 
64
- - It defines no concepts: its requirements are on the predefined `:Implementation:`, `:UnitTests:`
65
- and `:ConformanceTests:` only, so it never collides with the module's own definitions.
35
+ - It defines no concepts: its requirements are on the predefined `:Implementation:`, `:UnitTests:` and `:ConformanceTests:` only, so it never collides with the module's own definitions.
66
36
  - It holds no storage: a module with a database says which, and how it is reached, on top.
67
- - It holds no testing scripts. The module still needs its unit testing script, and its conformance
68
- testing script when it has conformance tests - written with the `implement-unit-testing-script`
69
- and `implement-conformance-testing-script` skills for the stack's language and test framework. Each
70
- runs the static checks of what it tests - the formatter, linter and type checker its language template
71
- names, on the code or on the conformance tests - and they count as the tests do.
72
- - It names its stack's toolchain - Python 3.12, Node.js 24, Java 21, Go 1.25, Rust - which the agents use from the
73
- machine turri runs on; they install none, so `turri doctor` says when the machine lacks it.
37
+ - It holds no testing scripts. The module still needs its unit testing script, and its conformance testing script when it has conformance tests - written with the `implement-unit-testing-script` and `implement-conformance-testing-script` skills for the stack's language and test framework. Each runs the static checks of what it tests - the formatter, linter and type checker its language template names, on the code or on the conformance tests - and they count as the tests do.
38
+ - It names its stack's toolchain - Python 3.12, Node.js 24, Java 21, Go 1.25, Rust - which the agents use from the machine turri runs on; they install none, so `turri doctor` says when the machine lacks it.
@@ -0,0 +1,48 @@
1
+ ---
2
+ description: How turri regenerates the code from a spec change - by spec diff, in the chain's tip - what each kind of change sets off, what a coding agent sees, how bad code is fixed and where the cost really is, so a spec is placed and written by what it means, never by a guess at what regenerating it costs
3
+ ---
4
+
5
+ # How turri regenerates the code
6
+
7
+ The other rules say what a spec means. This one says what turri does with a change to it, so that where a change goes, and how it is made, is never decided by a wrong idea of how turri works. Each section ends in the same place: decide by what the spec means.
8
+
9
+ ## A change is regenerated as a spec diff
10
+
11
+ - turri regenerates the code from spec diffs: what changed between the spec the code was built from and the spec now
12
+ - A functional spec added, changed or taken out is that change alone, wherever it sits - first, in the middle or last of its module
13
+ - The specs around it are not regenerated because their position or numbering moved, and nothing after it is built again. A spec inserted in the middle is one addition
14
+ - "Specs render top to bottom, each knowing only the ones before it" is about what a spec may assume (`func-specs.md`), not about what a change costs
15
+
16
+ ## A change is regenerated in the chain's tip
17
+
18
+ - A chain's code lives in its tip - the furthest module built on it. The modules below it keep the code they were built with
19
+ - A change to any module of the chain, the base's included, is regenerated in the tip's code - not in the module the change was made in
20
+ - Putting a change in a lower module costs no more than putting it in the tip, and saves nothing either
21
+ - Moving specs between modules of the chain renders nothing. Moving specs into a module the code was never built on is the exception: no change to the code brings that module in, so the chain has to be regenerated from scratch - never done without the person agreeing
22
+
23
+ ## What each kind of change sets off
24
+
25
+ - A functional spec added is built, with its unit tests; one changed is patched in place; one taken out has its code, and the tests only it had, removed
26
+ - A definition changed patches every functional spec that uses its concept, directly or through other definitions. So does a change to a linked resource: the spec or definition linking it is changed though its text is not. A widely used definition is the costly edit - not a spec's position
27
+ - Implementation reqs alone, or definitions no functional spec uses, are a mechanical change: the code adapts, and no test is written or changes what it asserts
28
+ - Test reqs and acceptance tests reach the conformance tests only, never the code
29
+ - Definitions moved to a common module and reqs reordered are recorded, not rendered
30
+
31
+ ## What a coding agent sees
32
+
33
+ - A coding agent sees its prompt and its module's code - nothing else. It cannot read `.plain` files, this conversation, AGENTS.md or the person
34
+ - What the code needs to know has to be in the spec. A fact said only in the conversation, AGENTS.md or notes never reaches the code, and is lost at the next regeneration
35
+ - Steering reaches the agents that plan the work - how it is cut and in what order - not what the code does. What the code does is changed in the spec
36
+
37
+ ## How bad code is fixed
38
+
39
+ - Never edit the code under `plain_modules/`: the next regeneration does not keep it, and the code record no longer says what the code is
40
+ - In order of cost: change the spec where it is wrong or silent; regenerate the functional specs whose code went bad again, by name; regenerate the module from scratch, or its whole chain - only when the person asks for it or agrees to it
41
+ - A pulse that does not land is rolled back whole - code, tests and record together - and its module waits until the spec changes or the module is asked for again. Running it again unchanged usually ends the same way: look at why it did not land first
42
+
43
+ ## Where the cost is
44
+
45
+ - The cost is the work regenerated: how many functional specs a change touches, directly or through the definitions they use, cut into pulses of at most `max-specs-per-pulse`
46
+ - Regenerating functional specs again, or a module or chain from scratch, costs most, and is only ever asked for outright
47
+ - Placement never adds cost. Put a functional spec in the module that owns the concern, at the point in its order where what it relies on has been said; never at the end of a module, or in the tip, only to spare regeneration - it spares none
48
+ - Never write placement for cost into AGENTS.md, a skill or notes: what is written there is read back later as how the project works
@@ -49,8 +49,7 @@ Implementation reqs are free-form instructions that steer code generation. Commo
49
49
 
50
50
  ## Key Principle: HOW vs WHAT
51
51
 
52
- `***implementation reqs***` describe HOW the software should be built.
53
- `***functional specs***` describe WHAT the software should do.
52
+ `***implementation reqs***` describe HOW the software should be built. `***functional specs***` describe WHAT the software should do.
54
53
 
55
54
  If the requirement describes observable behavior (endpoints, business rules, user-facing features), it belongs in functional specs. If it describes internal structure, technology, or coding guidance, it belongs here.
56
55
 
@@ -32,14 +32,9 @@ Work through each indicator. A single "yes" does not automatically mean the spec
32
32
 
33
33
  ### 0. First-Spec Bootstrap Cost
34
34
 
35
- Is this the first functional spec in a new root module with no implementation baseline supplied by
36
- `requires`? If so, include the implicit cost of creating the project structure, package metadata,
37
- framework configuration, entry point, initial source files, and unit-test infrastructure.
38
-
39
- The first spec must be substantially simpler than a later spec. It should expose one minimal,
40
- deterministic capability that can be invoked and tested. Setup without an observable result is not
41
- acceptable, but combining bootstrap work with persistence, integrations, multiple interfaces,
42
- branching workflows, or cross-cutting behavior is a strong `TOO COMPLEX` signal.
35
+ Is this the first functional spec in a new root module with no implementation baseline supplied by `requires`? If so, include the implicit cost of creating the project structure, package metadata, framework configuration, entry point, initial source files, and unit-test infrastructure.
36
+
37
+ The first spec must be substantially simpler than a later spec. It should expose one minimal, deterministic capability that can be invoked and tested. Setup without an observable result is not acceptable, but combining bootstrap work with persistence, integrations, multiple interfaces, branching workflows, or cross-cutting behavior is a strong `TOO COMPLEX` signal.
43
38
 
44
39
  ### 1. Number of Distinct Behaviors
45
40
 
@@ -31,9 +31,7 @@ metadata:
31
31
 
32
32
  # Brood
33
33
 
34
- Load the `***plain` syntax rules before writing anything — they are in the system prompt
35
- under `<plain-rules>`; read `genome/rules/<name>.md` for the full text of any rule you need
36
- to quote or follow closely.
34
+ Load the `***plain` syntax rules before writing anything — they are in the system prompt under `<plain-rules>`; read `genome/rules/<name>.md` for the full text of any rule you need to quote or follow closely.
37
35
 
38
36
  ## Role
39
37
 
@@ -45,25 +43,15 @@ The testing phase is the exception: it changes only `***test reqs***`, and comes
45
43
 
46
44
  ## Phase discipline
47
45
 
48
- **Finish each phase — its specs on disk and the user's confirmation given — before starting
49
- the next.** Do not draft, or even ask about, later-phase content while a phase is open: if an
50
- answer drifts ahead, acknowledge it briefly, note it for later, and steer back.
46
+ **Finish each phase — its specs on disk and the user's confirmation given — before starting the next.** Do not draft, or even ask about, later-phase content while a phase is open: if an answer drifts ahead, acknowledge it briefly, note it for later, and steer back.
51
47
 
52
- When entering a phase, read its reference file and walk its topics **in order**. Skip a
53
- topic only if it genuinely does not apply, and say so explicitly.
48
+ When entering a phase, read its reference file and walk its topics **in order**. Skip a topic only if it genuinely does not apply, and say so explicitly.
54
49
 
55
- Between phases — and only between phases — summarize what was written and get one explicit
56
- confirmation before continuing. That single confirmation replaces per-change approval; do
57
- not ask for both. Do not ask the user to approve each spec change: they are answering
58
- questions, not running a review queue. After each change, say in one line what went into the
59
- spec, and carry straight on.
50
+ Between phases — and only between phases — summarize what was written and get one explicit confirmation before continuing. That single confirmation replaces per-change approval; do not ask for both. Do not ask the user to approve each spec change: they are answering questions, not running a review queue. After each change, say in one line what went into the spec, and carry straight on.
60
51
 
61
52
  ## How many questions
62
53
 
63
- The first question of the intent phase is the harness's own, not yours: how many questions the
64
- **stack** and **product** phases may ask. The person picks one level, and it holds for each of
65
- them. The level sets how many questions there are and so how broad each is - never what they
66
- cover:
54
+ The first question of the intent phase is the harness's own, not yours: how many questions the **stack** and **product** phases may ask. The person picks one level, and it holds for each of them. The level sets how many questions there are and so how broad each is - never what they cover:
67
55
 
68
56
  | level | questions a phase | each question |
69
57
  | --- | --- | --- |
@@ -72,21 +60,9 @@ cover:
72
60
  | thorough | at most 10 | narrow: one feature, rule or edge case, with follow-ups on the ones that matter |
73
61
  | best judgement | as many as you judge the phase needs | as broad or as narrow as each area needs |
74
62
 
75
- At every level the questions reach all of the phase's topics; fewer questions only go less deep.
76
- The intent and testing phases are not capped. Follow-ups count; the closing confirmation of a
77
- phase - asked with `confirms_phase: true` - does not. Past the cap `ask_user` refuses the question.
78
- To stop sooner, or under best judgement once the phase is settled enough to build, call
79
- `end_questions`.
80
-
81
- The level limits the questions, never the spec changes. In the product phase **every answer is a
82
- spec change**, whatever the level: written with `write_spec_diff` and built at once, before the
83
- next question - `ask_user` refuses the next one until it is. A broad answer that covers several
84
- features is several changes, one a feature, and you write them all. What the questions leave
85
- open - the details of a light answer, what is left once they are over - is yours to decide, as a
86
- careful engineer would, in the light of the intent brief: each decision a spec change of its own,
87
- written with `write_spec_diff` with no answer needed before it, and said in one line. Write as many
88
- as the product needs. The phase's summary names every decision you made yourself, so the
89
- confirmation is where the person can change it.
63
+ At every level the questions reach all of the phase's topics; fewer questions only go less deep. The intent and testing phases are not capped. Follow-ups count; the closing confirmation of a phase - asked with `confirms_phase: true` - does not. Past the cap `ask_user` refuses the question. To stop sooner, or under best judgement once the phase is settled enough to build, call `end_questions`.
64
+
65
+ The level limits the questions, never the spec changes. In the product phase **every answer is a spec change**, whatever the level: written with `write_spec_diff` and built at once, before the next question - `ask_user` refuses the next one until it is. A broad answer that covers several features is several changes, one a feature, and you write them all. What the questions leave open - the details of a light answer, what is left once they are over - is yours to decide, as a careful engineer would, in the light of the intent brief: each decision a spec change of its own, written with `write_spec_diff` with no answer needed before it, and said in one line. Write as many as the product needs. The phase's summary names every decision you made yourself, so the confirmation is where the person can change it.
90
66
 
91
67
  ## Question style
92
68
 
@@ -104,126 +80,60 @@ confirmation is where the person can change it.
104
80
 
105
81
  ### intent
106
82
 
107
- The harness has asked how many questions the stack and product phases may ask before this phase
108
- starts; its note beside these instructions gives the answer. Do not ask it again.
83
+ The harness has asked how many questions the stack and product phases may ask before this phase starts; its note beside these instructions gives the answer. Do not ask it again.
109
84
 
110
- Read `references/intent.md` and ask its five core questions one at a time via `ask_user`.
111
- Ask at most one focused follow-up when an answer is too vague to summarize.
85
+ Read `references/intent.md` and ask its five core questions one at a time via `ask_user`. Ask at most one focused follow-up when an answer is too vague to summarize.
112
86
 
113
- Write nothing to disk in this phase — no project files, no specification files. Keep
114
- entities, features, technology and testing for the phases that own them.
87
+ Write nothing to disk in this phase — no project files, no specification files. Keep entities, features, technology and testing for the phases that own them.
115
88
 
116
- Summarize the problem, the primary user, the desired outcome, the observable success
117
- criterion, and the initial boundary with its explicit exclusions. Get explicit confirmation
118
- of that brief - the bullets passed whole as `ask_user`'s `context`, which the dialog shows above the
119
- question - and carry it into every later phase.
89
+ Summarize the problem, the primary user, the desired outcome, the observable success criterion, and the initial boundary with its explicit exclusions. Get explicit confirmation of that brief - the bullets passed whole as `ask_user`'s `context`, which the dialog shows above the question - and carry it into every later phase.
120
90
 
121
91
  This phase ends on the user's confirmation.
122
92
 
123
93
  ### stack
124
94
 
125
- **This comes before any functionality, so that every spec change in the product phase can be
126
- built the moment it is written.** A functionality cannot be rendered without knowing the
127
- language it is written in and the framework its tests use.
95
+ **This comes before any functionality, so that every spec change in the product phase can be built the moment it is written.** A functionality cannot be rendered without knowing the language it is written in and the framework its tests use.
128
96
 
129
- Read `references/stack.md` and walk its topics in order, within the questioning level (see "How
130
- many questions"): language, frameworks, storage,
131
- external services, structure and architecture, other constraints, anything else, and last the
132
- unit tests - generated code needs them from the first functionality onward.
97
+ Read `references/stack.md` and walk its topics in order, within the questioning level (see "How many questions"): language, frameworks, storage, external services, structure and architecture, other constraints, anything else, and last the unit tests - generated code needs them from the first functionality onward.
133
98
 
134
- Offer the standard library's stacks first, those in a language this machine can build now (the stdlib
135
- rule, in `<plain-rules>`, `<toolchains on this machine>`, and the first section of
136
- `references/stack.md`): a stack from it is one import, and only what it leaves open -
137
- storage, external services, other constraints - is asked and written.
99
+ Offer the standard library's stacks first, those in a language this machine can build now (the stdlib rule, in `<plain-rules>`, `<toolchains on this machine>`, and the first section of `references/stack.md`): a stack from it is one import, and only what it leaves open - storage, external services, other constraints - is asked and written.
138
100
 
139
- Create the module structure and frontmatter so there is a `.plain` file to build into, and
140
- author every requirement into `***implementation reqs***` at the right scope — shared
141
- requirements into the template, module-specific ones into the module. Write these with the
142
- ordinary file tools; **nothing is built in this phase**, and `write_spec_diff` is not used here.
101
+ Create the module structure and frontmatter so there is a `.plain` file to build into, and author every requirement into `***implementation reqs***` at the right scope — shared requirements into the template, module-specific ones into the module. Write these with the ordinary file tools; **nothing is built in this phase**, and `write_spec_diff` is not used here.
143
102
 
144
103
  Write no definitions, no functional specs, no `***test reqs***` and no `***acceptance tests***`.
145
104
 
146
- End the phase with the unit tests: their framework, as a `:UnitTests:` requirement, and the unit
147
- testing script, which every build needs from the first one on. If turri already finds a
148
- script - named by `unittests-script:` in `config.turri.yaml` at the project root, or the one
149
- `run_unittests*.sh` in the root or in `test_scripts/` - keep it. Otherwise write
150
- `test_scripts/run_unittests_<language>.sh` with the `implement-unit-testing-script` skill, for the
151
- language and framework just settled. Do not link it from the specs. Without it, every build stops
152
- before it starts. When this module sits in a project beside another on a different stack - a
153
- frontend beside a backend, sharing only an imported module - its script is its stack's: name it in
154
- that stack's `config.turri.<stack>.yaml` beside `config.turri.yaml` (`unittests-script:`) -
155
- `config.turri.frontend.yaml` for the stack `frontend` - not in `config.turri.yaml`, which is the
156
- project's and holds what the stacks share. A stack is chosen, never worked out: tell the user to
157
- choose it with `/stack <stack>` (`--stack <stack>` on the command line) before building this module.
158
-
159
- The unit testing script runs the static checks too - the formatter, linter and type checker the stack
160
- names, which count as the unit tests do; `implement-unit-testing-script` says which for each language.
161
- There is no separate static checks script.
162
-
163
- Run `turri validate` on the module before finishing, so the product phase does not start
164
- on top of a file that does not parse.
165
-
166
- Finish by summarizing the stack, the architecture, the unit testing script and the static checks it runs - marking each
167
- choice you made without asking - and getting explicit confirmation, with `confirms_phase: true`. The user
168
- reading the stack back is the check.
105
+ End the phase with the unit tests: their framework, as a `:UnitTests:` requirement, and the unit testing script, which every build needs from the first one on. If turri already finds a script - named by `unittests-script:` in `config.turri.yaml` at the project root, or the one `run_unittests*.sh` in the root or in `test_scripts/` - keep it. Otherwise write `test_scripts/run_unittests_<language>.sh` with the `implement-unit-testing-script` skill, for the language and framework just settled. Do not link it from the specs. Without it, every build stops before it starts. When this module sits in a project beside another on a different stack - a frontend beside a backend, sharing only an imported module - its script is its stack's: name it in that stack's `config.turri.<stack>.yaml` beside `config.turri.yaml` (`unittests-script:`) - `config.turri.frontend.yaml` for the stack `frontend` - not in `config.turri.yaml`, which is the project's and holds what the stacks share. A stack is chosen, never worked out: tell the user to choose it with `/stack <stack>` (`--stack <stack>` on the command line) before building this module.
106
+
107
+ The unit testing script runs the static checks too - the formatter, linter and type checker the stack names, which count as the unit tests do; `implement-unit-testing-script` says which for each language. There is no separate static checks script.
108
+
109
+ Run `turri validate` on the module before finishing, so the product phase does not start on top of a file that does not parse.
110
+
111
+ Finish by summarizing the stack, the architecture, the unit testing script and the static checks it runs - marking each choice you made without asking - and getting explicit confirmation, with `confirms_phase: true`. The user reading the stack back is the check.
169
112
 
170
113
  ### testing
171
114
 
172
- Read `references/testing.md`. Carry the intent brief and the stack in; ask about neither again. Walk
173
- its topics in order. Nothing is built yet, and nothing is built in this phase.
115
+ Read `references/testing.md`. Carry the intent brief and the stack in; ask about neither again. Walk its topics in order. Nothing is built yet, and nothing is built in this phase.
174
116
 
175
- First the decision: are there conformance tests at all? Ask it explicitly - even when
176
- `config.turri.yaml` already says, ask, offering what it says first - and write the answer to
177
- `config.turri.yaml` as `conformance-tests:` - the chat and every build follow it. A project with
178
- only a `config.yaml` has it copied to `config.turri.yaml` first; never write `config.yaml`. Off, and the phase is
179
- done once the user confirms: the product phase's builds then write and run no conformance tests.
117
+ First the decision: are there conformance tests at all? Ask it explicitly - even when `config.turri.yaml` already says, ask, offering what it says first - and write the answer to `config.turri.yaml` as `conformance-tests:` - the chat and every build follow it. A project with only a `config.yaml` has it copied to `config.turri.yaml` first; never write `config.yaml`. Off, and the phase is done once the user confirms: the product phase's builds then write and run no conformance tests.
180
118
 
181
- On: when the stack came from the standard library, import its conformance template
182
- (`stdlib/<kind>/conformance/<stack>`) and ask only about what it does not settle. Each answer about how the
183
- tests are written and run becomes a `:ConformanceTests:` requirement in `***test reqs***`, written
184
- with the ordinary file tools. A change to the test reqs is not a spec
185
- diff: never use `write_spec_diff` in this phase. Then make sure the project has its conformance
186
- testing script - `implement-conformance-testing-script` writes it into `test_scripts/` when
187
- turri finds none - and run `validate` on what you changed. Without both, the first build of
188
- the product phase stops before it starts.
119
+ On: when the stack came from the standard library, import its conformance template (`stdlib/<kind>/conformance/<stack>`) and ask only about what it does not settle. Each answer about how the tests are written and run becomes a `:ConformanceTests:` requirement in `***test reqs***`, written with the ordinary file tools. A change to the test reqs is not a spec diff: never use `write_spec_diff` in this phase. Then make sure the project has its conformance testing script - `implement-conformance-testing-script` writes it into `test_scripts/` when turri finds none - and run `validate` on what you changed. Without both, the first build of the product phase stops before it starts.
189
120
 
190
- Finish by summarizing the decision, the test reqs and the script, and saying that from the first
191
- spec change on, every build writes and runs its conformance tests. Get explicit confirmation.
121
+ Finish by summarizing the decision, the test reqs and the script, and saying that from the first spec change on, every build writes and runs its conformance tests. Get explicit confirmation.
192
122
 
193
123
  ### product
194
124
 
195
- Read `references/product.md`. Carry the intent brief, the stack and the testing decisions in;
196
- restart none of them. This
197
- is the whole product interview, walked **feature by feature** - never section by section. Do
198
- not fill in the definitions first and the functional specs after: that is not this skill.
125
+ Read `references/product.md`. Carry the intent brief, the stack and the testing decisions in; restart none of them. This is the whole product interview, walked **feature by feature** - never section by section. Do not fill in the definitions first and the functional specs after: that is not this skill.
199
126
 
200
- Walk its topics in order, and run this loop while the questioning level allows (see "How many
201
- questions") - each question as broad as the level says:
127
+ Walk its topics in order, and run this loop while the questioning level allows (see "How many questions") - each question as broad as the level says:
202
128
 
203
- 1. **Ask** one question with `ask_user` - about a feature, a step of a flow, a rule; never about
204
- a spec section.
129
+ 1. **Ask** one question with `ask_user` - about a feature, a step of a flow, a rule; never about a spec section.
205
130
  2. The user **answers**.
206
- 3. **Make the spec change** the answer calls for, as one git diff of the `.plain` files - across
207
- every section it needs: the concepts it introduces, a policy it states, the functional spec it
208
- adds or changes.
209
- 4. **Write it with `write_spec_diff`**, which applies it and starts a render spec diff job for it,
210
- whatever it touches. With conformance on, that build also writes and runs the change's
211
- conformance tests. An answer that covers several features is a change for each: write them
212
- all. Then the changes for what you decide yourself around it, if any.
131
+ 3. **Make the spec change** the answer calls for, as one git diff of the `.plain` files - across every section it needs: the concepts it introduces, a policy it states, the functional spec it adds or changes.
132
+ 4. **Write it with `write_spec_diff`**, which applies it and starts a render spec diff job for it, whatever it touches. With conformance on, that build also writes and runs the change's conformance tests. An answer that covers several features is a change for each: write them all. Then the changes for what you decide yourself around it, if any.
213
133
  5. Move straight on to the next question; never wait for a build.
214
134
 
215
- Every answer, at least one spec change and one render spec diff job, written before the next
216
- question - at every level. Once the questions are over, write what is left of the product the same
217
- way - one decision of yours, one spec change - with no answer between. Correct something already
218
- written with
219
- a diff and `fixes_earlier`, before the next question. Never change a `.plain` file in this
220
- phase by any other means than `write_spec_diff`.
221
-
222
- Report each build result between questions, in one sentence. Use `drift` when the
223
- user asks how the builds are going.
224
-
225
- Finish by summarizing the concepts and the features in build order, marking what you decided without
226
- asking, saying what is built and what is still queued, getting explicit confirmation with
227
- `confirms_phase: true`. The summary is for the person to take in at a glance: a line a feature, a few
228
- words a concept, each decision you made yourself in a few words - about fifteen lines at most, never
229
- the specs' wording or every rule; they are in the spec.
135
+ Every answer, at least one spec change and one render spec diff job, written before the next question - at every level. Once the questions are over, write what is left of the product the same way - one decision of yours, one spec change - with no answer between. Correct something already written with a diff and `fixes_earlier`, before the next question. Never change a `.plain` file in this phase by any other means than `write_spec_diff`.
136
+
137
+ Report each build result between questions, in one sentence. Use `drift` when the user asks how the builds are going.
138
+
139
+ Finish by summarizing the concepts and the features in build order, marking what you decided without asking, saying what is built and what is still queued, getting explicit confirmation with `confirms_phase: true`. The summary is for the person to take in at a glance: a line a feature, a few words a concept, each decision you made yourself in a few words - about fifteen lines at most, never the specs' wording or every rule; they are in the spec.