@turri-dev/cli 0.1.4-next.5a94e68 → 0.1.4-next.8254fbc
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/.pi/themes/turri-dark.json +67 -66
- package/.pi/themes/turri-light.json +71 -73
- package/README.md +40 -128
- package/assets/jellyfish/dark-00.png +0 -0
- package/assets/jellyfish/dark-01.png +0 -0
- package/assets/jellyfish/dark-02.png +0 -0
- package/assets/jellyfish/dark-03.png +0 -0
- package/assets/jellyfish/dark-04.png +0 -0
- package/assets/jellyfish/dark-05.png +0 -0
- package/assets/jellyfish/dark-06.png +0 -0
- package/assets/jellyfish/dark-07.png +0 -0
- package/assets/jellyfish/dark-08.png +0 -0
- package/assets/jellyfish/dark-09.png +0 -0
- package/assets/jellyfish/dark-10.png +0 -0
- package/assets/jellyfish/dark-11.png +0 -0
- package/assets/jellyfish/dark-12.png +0 -0
- package/assets/jellyfish/dark-13.png +0 -0
- package/assets/jellyfish/dark-14.png +0 -0
- package/assets/jellyfish/light-00.png +0 -0
- package/assets/jellyfish/light-01.png +0 -0
- package/assets/jellyfish/light-02.png +0 -0
- package/assets/jellyfish/light-03.png +0 -0
- package/assets/jellyfish/light-04.png +0 -0
- package/assets/jellyfish/light-05.png +0 -0
- package/assets/jellyfish/light-06.png +0 -0
- package/assets/jellyfish/light-07.png +0 -0
- package/assets/jellyfish/light-08.png +0 -0
- package/assets/jellyfish/light-09.png +0 -0
- package/assets/jellyfish/light-10.png +0 -0
- package/assets/jellyfish/light-11.png +0 -0
- package/assets/jellyfish/light-12.png +0 -0
- package/assets/jellyfish/light-13.png +0 -0
- package/assets/jellyfish/light-14.png +0 -0
- package/dist/brand.js +7 -7
- package/dist/cultivate-cli.js +16 -23
- package/dist/extension.js +15 -21
- package/dist/loop-cli.js +8 -8
- package/dist/module-report.js +5 -4
- package/dist/regenerate/plain-palette.js +51 -36
- package/dist/regenerate/side-panel.js +1 -1
- package/dist/regenerate/spec-map-view.js +9 -5
- package/dist/release-cli.js +3 -8
- package/dist/validate-cli.js +3 -8
- package/docs/README.md +5 -12
- package/docs/authoring-plain.md +37 -119
- package/docs/config.md +50 -176
- package/docs/deploy.md +21 -80
- package/docs/development.md +13 -41
- package/docs/headless.md +30 -136
- package/docs/images/how-turri-works.svg +29 -31
- package/docs/images/turri-banner.png +0 -0
- package/docs/installation.md +13 -40
- package/docs/parser.md +15 -43
- package/docs/regenerating.md +231 -964
- package/docs/sandbox.md +38 -152
- package/docs/skills-and-gates.md +50 -173
- package/docs/theming.md +45 -46
- package/docs/using.md +66 -356
- package/genome/rules/bullet-continuation.md +5 -13
- package/genome/rules/concise-specs-examples.md +2 -4
- package/genome/rules/concise-specs-integration-examples.md +2 -6
- package/genome/rules/concise-specs.md +1 -2
- package/genome/rules/func-specs.md +1 -0
- package/genome/rules/integration-embedded-testing.md +1 -4
- package/genome/rules/integrations.md +1 -2
- package/genome/rules/project-model.md +14 -35
- package/genome/rules/stdlib.md +14 -49
- package/genome/rules/turri-regeneration.md +48 -0
- package/genome/skills/add-implementation-requirement/SKILL.md +1 -2
- package/genome/skills/analyze-if-func-spec-too-complex/SKILL.md +3 -8
- package/genome/skills/brood/SKILL.md +37 -127
- package/genome/skills/brood/references/intent.md +4 -12
- package/genome/skills/brood/references/product.md +24 -76
- package/genome/skills/brood/references/stack.md +7 -29
- package/genome/skills/brood/references/testing.md +11 -42
- package/genome/skills/bud/SKILL.md +32 -109
- package/genome/skills/bud/references/intent.md +4 -11
- package/genome/skills/implement-conformance-testing-script/SKILL.md +3 -6
- package/genome/skills/implement-unit-testing-script/SKILL.md +1 -2
- package/genome/skills/mature/SKILL.md +21 -69
- package/genome/skills/spawn/SKILL.md +28 -113
- package/package.json +1 -1
|
@@ -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
|
-
|
|
25
|
-
|
|
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
|
-
|
|
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
|
-
|
|
37
|
-
it
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
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.
|
package/genome/rules/stdlib.md
CHANGED
|
@@ -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
|
-
|
|
25
|
-
-
|
|
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
|
-
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
-
|
|
43
|
-
|
|
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
|
-
|
|
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
|
-
|
|
37
|
-
|
|
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
|
-
|
|
77
|
-
phase
|
|
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
|
-
|
|
148
|
-
script -
|
|
149
|
-
|
|
150
|
-
`
|
|
151
|
-
|
|
152
|
-
|
|
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
|
-
|
|
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
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
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.
|