@turri-dev/cli 0.1.4-next.afc43a8 → 0.1.4-next.d6e59a8

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 (84) hide show
  1. package/.pi/themes/turri-dark.json +67 -66
  2. package/.pi/themes/turri-light.json +71 -73
  3. package/README.md +41 -127
  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/brand.js +7 -7
  29. package/dist/cultivate-cli.js +16 -23
  30. package/dist/extension.js +33 -59
  31. package/dist/jellyfish.js +130 -0
  32. package/dist/loop-cli.js +8 -8
  33. package/dist/module-report.js +5 -4
  34. package/dist/regenerate/plain-palette.js +52 -37
  35. package/dist/regenerate/side-panel.js +1 -1
  36. package/dist/regenerate/spec-map-view.js +9 -5
  37. package/dist/release-cli.js +3 -8
  38. package/dist/validate-cli.js +3 -8
  39. package/docs/README.md +5 -12
  40. package/docs/authoring-plain.md +37 -121
  41. package/docs/config.md +50 -176
  42. package/docs/deploy.md +21 -80
  43. package/docs/development.md +13 -41
  44. package/docs/headless.md +30 -136
  45. package/docs/images/how-turri-works.svg +29 -31
  46. package/docs/images/turri-banner.png +0 -0
  47. package/docs/images/turri-screenshot.png +0 -0
  48. package/docs/installation.md +13 -40
  49. package/docs/parser.md +15 -43
  50. package/docs/regenerating.md +231 -964
  51. package/docs/sandbox.md +38 -152
  52. package/docs/skills-and-gates.md +50 -173
  53. package/docs/theming.md +45 -46
  54. package/docs/using.md +66 -356
  55. package/genome/rules/bullet-continuation.md +5 -13
  56. package/genome/rules/concise-specs-examples.md +2 -4
  57. package/genome/rules/concise-specs-integration-examples.md +2 -6
  58. package/genome/rules/concise-specs.md +1 -2
  59. package/genome/rules/integration-embedded-testing.md +1 -4
  60. package/genome/rules/integrations.md +1 -2
  61. package/genome/rules/project-model.md +14 -37
  62. package/genome/rules/stdlib.md +14 -49
  63. package/genome/rules/turri-regeneration.md +35 -23
  64. package/genome/skills/add-implementation-requirement/SKILL.md +1 -2
  65. package/genome/skills/analyze-if-func-spec-too-complex/SKILL.md +3 -8
  66. package/genome/skills/brood/SKILL.md +37 -127
  67. package/genome/skills/brood/references/intent.md +4 -12
  68. package/genome/skills/brood/references/product.md +24 -76
  69. package/genome/skills/brood/references/stack.md +7 -29
  70. package/genome/skills/brood/references/testing.md +11 -42
  71. package/genome/skills/bud/SKILL.md +32 -109
  72. package/genome/skills/bud/references/intent.md +4 -11
  73. package/genome/skills/implement-conformance-testing-script/SKILL.md +3 -6
  74. package/genome/skills/implement-unit-testing-script/SKILL.md +1 -2
  75. package/genome/skills/mature/SKILL.md +21 -69
  76. package/genome/skills/spawn/SKILL.md +28 -113
  77. package/package.json +1 -1
  78. package/assets/jellyfish/dark-12.png +0 -0
  79. package/assets/jellyfish/dark-13.png +0 -0
  80. package/assets/jellyfish/dark-14.png +0 -0
  81. package/assets/jellyfish/fallback.txt +0 -252
  82. package/assets/jellyfish/light-12.png +0 -0
  83. package/assets/jellyfish/light-13.png +0 -0
  84. package/assets/jellyfish/light-14.png +0 -0
@@ -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.
@@ -1,11 +1,8 @@
1
1
  # the intent phase — What is the intent?
2
2
 
3
- Extract the user's intent before creating files or decomposing the product into specifications.
4
- Keep this phase short. Ask exactly five core questions, one at a time, and do not write to disk.
3
+ Extract the user's intent before creating files or decomposing the product into specifications. Keep this phase short. Ask exactly five core questions, one at a time, and do not write to disk.
5
4
 
6
- The harness has already asked the first question of this phase: how many questions the stack and
7
- product phases may ask - light (3), medium (5), thorough (10) or best judgement. Do not ask it
8
- again; this phase's own questions are not capped by it.
5
+ The harness has already asked the first question of this phase: how many questions the stack and product phases may ask - light (3), medium (5), thorough (10) or best judgement. Do not ask it again; this phase's own questions are not capped by it.
9
6
 
10
7
  ## Questions
11
8
 
@@ -15,8 +12,7 @@ again; this phase's own questions are not capped by it.
15
12
  4. **Success criterion** — What observable result would make the first version useful?
16
13
  5. **Initial boundary** — What should the first version deliberately leave out?
17
14
 
18
- Ask one focused follow-up only when an answer is too vague to summarize. Do not explore features,
19
- entities, technology, architecture, or testing yet; those belong to later phases.
15
+ Ask one focused follow-up only when an answer is too vague to summarize. Do not explore features, entities, technology, architecture, or testing yet; those belong to later phases.
20
16
 
21
17
  ## Intent brief
22
18
 
@@ -28,8 +24,4 @@ Summarize the answers in five short bullets:
28
24
  - Observable success criterion
29
25
  - Initial boundary and explicit exclusions
30
26
 
31
- Ask the user to confirm or correct the brief with one `ask_user` question, the five bullets passed whole as its
32
- `context` - the dialog shows only the question, its options and its `context`. The intent phase finishes only after
33
- explicit confirmation.
34
- Carry the confirmed brief into the stack and product phases so their questions refine it instead of restarting intent
35
- discovery.
27
+ Ask the user to confirm or correct the brief with one `ask_user` question, the five bullets passed whole as its `context` - the dialog shows only the question, its options and its `context`. The intent phase finishes only after explicit confirmation. Carry the confirmed brief into the stack and product phases so their questions refine it instead of restarting intent discovery.
@@ -1,101 +1,49 @@
1
1
  # the product phase — What does it do?
2
2
 
3
- The whole product interview, in one phase, walked **feature by feature** - not section by
4
- section. There is no pass that fills in the definitions and then another that writes the
5
- functional specs. Each question is about the product: a feature, a step in a flow, a rule.
6
- Its answer becomes one spec change that touches whatever sections that answer needs - the
7
- concepts the feature introduces, a policy it needs, its functional spec - and every spec change
8
- is built the moment it is written.
3
+ The whole product interview, in one phase, walked **feature by feature** - not section by section. There is no pass that fills in the definitions and then another that writes the functional specs. Each question is about the product: a feature, a step in a flow, a rule. Its answer becomes one spec change that touches whatever sections that answer needs - the concepts the feature introduces, a policy it needs, its functional spec - and every spec change is built the moment it is written.
9
4
 
10
5
  Carry the confirmed intent brief and the settled stack in. Do not restart either.
11
6
 
12
7
  ## How many questions
13
8
 
14
- The questioning level caps this phase's questions (light 3, medium 5, thorough 10, or best
15
- judgement - `SKILL.md`, "How many questions"), and so sets how broad each is. Every level walks
16
- all the topics below: light in a few broad questions - the features and their order in one, what
17
- they do end to end in another, with what fits the brief proposed for the person to confirm or
18
- correct; thorough in narrow ones, a feature, rule or edge case each. The level limits the
19
- questions, never the spec changes:
20
-
21
- - **Every answer is a spec change**, at every level: written with `write_spec_diff` and built at
22
- once, before the next question - `ask_user` refuses the next question until it is. A broad
23
- answer covering several features is a change for each.
24
- - **What the questions leave open is yours** - the details under a broad answer, and everything
25
- still open once the questions are over (the cap reached, or `end_questions` called). Each
26
- feature, edge case and rule you decide is its own spec change, written with `write_spec_diff`
27
- with no answer needed before it, and said in one line. Write as many as the product needs.
28
- Decide from the intent brief and the answers so far; leave out what they do not call for rather
29
- than invent scope.
9
+ The questioning level caps this phase's questions (light 3, medium 5, thorough 10, or best judgement - `SKILL.md`, "How many questions"), and so sets how broad each is. Every level walks all the topics below: light in a few broad questions - the features and their order in one, what they do end to end in another, with what fits the brief proposed for the person to confirm or correct; thorough in narrow ones, a feature, rule or edge case each. The level limits the questions, never the spec changes:
10
+
11
+ - **Every answer is a spec change**, at every level: written with `write_spec_diff` and built at once, before the next question - `ask_user` refuses the next question until it is. A broad answer covering several features is a change for each.
12
+ - **What the questions leave open is yours** - the details under a broad answer, and everything still open once the questions are over (the cap reached, or `end_questions` called). Each feature, edge case and rule you decide is its own spec change, written with `write_spec_diff` with no answer needed before it, and said in one line. Write as many as the product needs. Decide from the intent brief and the answers so far; leave out what they do not call for rather than invent scope.
30
13
 
31
14
  ## One question, one answer, a spec change, a render
32
15
 
33
16
  Every iteration is exactly this, at every questioning level:
34
17
 
35
- 1. **Ask one question** with `ask_user`, about the product: a feature, its trigger and outcome,
36
- one of its edge cases or rules, the next step of a flow - as broad as the level says. Never bundle two, and never ask about
37
- a spec section ("what concepts are there?", "what reqs apply?") - ask about what the product
38
- does, and let the answer decide which sections change.
18
+ 1. **Ask one question** with `ask_user`, about the product: a feature, its trigger and outcome, one of its edge cases or rules, the next step of a flow - as broad as the level says. Never bundle two, and never ask about a spec section ("what concepts are there?", "what reqs apply?") - ask about what the product does, and let the answer decide which sections change.
39
19
  2. **Turn the answer into a spec change** - one for each feature it covers - everything it calls for, across sections:
40
- - a concept the feature introduces, into `***definitions***`, following `add-concept`, defined
41
- in the same change as the functional spec that first uses it;
20
+ - a concept the feature introduces, into `***definitions***`, following `add-concept`, defined in the same change as the functional spec that first uses it;
42
21
  - a technology-free policy the answer states, into `***implementation reqs***`;
43
- - the functional spec for the feature, or the change to one already written, following
44
- `add-functional-spec`.
45
- Write it as a git diff of the `.plain` file(s): `diff --git a/<file> b/<file>`,
46
- `--- a/<file>`, `+++ b/<file>`, then the hunks with a few lines of unchanged context. Paths
47
- are relative to the project root.
48
- 3. **Write it with `write_spec_diff`.** It applies the diff and starts a render spec diff job for
49
- it in the same call - whatever the change touches, a definition alone included. Write every
50
- change the answer calls for before the next question - `ask_user` refuses it until then - and
51
- any you decide yourself beside them. Move straight on to the next question; never wait for a
52
- build.
53
-
54
- **One answer, at least one change.** A follow-up about the same feature - an edge case, a
55
- validation rule - is its own answer and its own change to that feature's spec. An answer that
56
- describes two features is two changes, both written before the next question. A change never
57
- carries both an answer and something you decided: what you decide is a change of its own.
58
-
59
- **Fix contradictions in place.** When a later answer refines or contradicts something already
60
- written, write the correction as its own diff with `fixes_earlier` set, before the next
61
- question. It is rendered like any other change.
62
-
63
- **Never edit the `.plain` files with `write` or `edit` in this phase.** A change that does not
64
- go through `write_spec_diff` is a change nothing renders.
22
+ - the functional spec for the feature, or the change to one already written, following `add-functional-spec`. Write it as a git diff of the `.plain` file(s): `diff --git a/<file> b/<file>`, `--- a/<file>`, `+++ b/<file>`, then the hunks with a few lines of unchanged context. Paths are relative to the project root.
23
+ 3. **Write it with `write_spec_diff`.** It applies the diff and starts a render spec diff job for it in the same call - whatever the change touches, a definition alone included. Write every change the answer calls for before the next question - `ask_user` refuses it until then - and any you decide yourself beside them. Move straight on to the next question; never wait for a build.
24
+
25
+ **One answer, at least one change.** A follow-up about the same feature - an edge case, a validation rule - is its own answer and its own change to that feature's spec. An answer that describes two features is two changes, both written before the next question. A change never carries both an answer and something you decided: what you decide is a change of its own.
26
+
27
+ **Fix contradictions in place.** When a later answer refines or contradicts something already written, write the correction as its own diff with `fixes_earlier` set, before the next question. It is rendered like any other change.
28
+
29
+ **Never edit the `.plain` files with `write` or `edit` in this phase.** A change that does not go through `write_spec_diff` is a change nothing renders.
65
30
 
66
31
  ## What a change may contain
67
32
 
68
- - **`***definitions***`** - the concepts the change needs, each defined before, or in the same
69
- change as, what first uses it.
70
- - **`***functional specs***`** - at most one new functionality per change: ≤200 lines of code
71
- change, language-agnostic, in chronological build order, externally explicit where it has an
72
- interface.
73
- - **`***implementation reqs***`** - only technology-free policy: an error-handling or retry
74
- policy, an ordering guarantee, a data-format rule. The technology was settled in the stack
75
- phase; an answer that needs a new technology is a stack answer - note it and steer back.
33
+ - **`***definitions***`** - the concepts the change needs, each defined before, or in the same change as, what first uses it.
34
+ - **`***functional specs***`** - at most one new functionality per change: ≤200 lines of code change, language-agnostic, in chronological build order, externally explicit where it has an interface.
35
+ - **`***implementation reqs***`** - only technology-free policy: an error-handling or retry policy, an ordering guarantee, a data-format rule. The technology was settled in the stack phase; an answer that needs a new technology is a stack answer - note it and steer back.
76
36
 
77
- Leave the `***test reqs***` as the testing phase wrote them, and write no `***acceptance tests***`.
78
- With conformance on, every change is built with its conformance tests - from the test reqs as they
79
- stand.
37
+ Leave the `***test reqs***` as the testing phase wrote them, and write no `***acceptance tests***`. With conformance on, every change is built with its conformance tests - from the test reqs as they stand.
80
38
 
81
39
  ## Topics (in order)
82
40
 
83
- 1. **Product description** - propose a one-sentence description from the confirmed intent brief,
84
- state it back in one line, and write it into the frontmatter as the first change.
85
- 2. **Features, one at a time, in build order** - the smallest thing that is useful first, then
86
- what builds on it. For each feature: one question for what triggers it and what comes out,
87
- then one per edge case, validation rule or permission that is not obvious. Each answer is a
88
- change: the first brings the feature's concepts and its functional spec; the follow-ups refine
89
- them. A feature too large for one functional spec is split *with the user* - that is the next
90
- question.
91
- 3. **User flows** - walk the product from the user's side: what happens first, what next, and at
92
- each decision point. Each missing step is a feature, taken the same way.
93
- 4. **User interface (optional)** - skip entirely if there is none. Otherwise per screen or
94
- interaction: what the user sees and what it does, still language- and framework-agnostic.
41
+ 1. **Product description** - propose a one-sentence description from the confirmed intent brief, state it back in one line, and write it into the frontmatter as the first change.
42
+ 2. **Features, one at a time, in build order** - the smallest thing that is useful first, then what builds on it. For each feature: one question for what triggers it and what comes out, then one per edge case, validation rule or permission that is not obvious. Each answer is a change: the first brings the feature's concepts and its functional spec; the follow-ups refine them. A feature too large for one functional spec is split *with the user* - that is the next question.
43
+ 3. **User flows** - walk the product from the user's side: what happens first, what next, and at each decision point. Each missing step is a feature, taken the same way.
44
+ 4. **User interface (optional)** - skip entirely if there is none. Otherwise per screen or interaction: what the user sees and what it does, still language- and framework-agnostic.
95
45
  5. **Anything else** - anything the user wants to add or change that has not been covered.
96
46
 
97
47
  ## Reporting builds
98
48
 
99
- Report each build result between questions, in one sentence. A failed build does not stop the
100
- interview - note it and carry on, unless it shows the spec itself is wrong, in which case fix
101
- the spec with a diff and `fixes_earlier`.
49
+ Report each build result between questions, in one sentence. A failed build does not stop the interview - note it and carry on, unless it shows the spec itself is wrong, in which case fix the spec with a diff and `fixes_earlier`.
@@ -2,14 +2,7 @@
2
2
 
3
3
  Gather the technical stack **and** the project's structure/architecture. This phase affects only `***implementation reqs***`, and ends with the unit testing script every build needs — the rest of testing comes later. Run the core loop from `SKILL.md` for each topic below, in order: ask, then write the requirement into the `.plain` file with the ordinary file tools. Nothing is built in this phase. When the user has no preference, propose a sensible default that fits earlier answers and ask them to confirm.
4
4
 
5
- The questioning level caps this phase's questions (light 3, medium 5, thorough 10, or best
6
- judgement - `SKILL.md`, "How many questions"), and so sets how broad each is. Every level reaches
7
- all the topics, in order: light in a few broad questions - the stack, say, then storage and
8
- outside services together, then the remaining constraints, each with what fits the brief
9
- proposed; thorough a topic or two a question, with follow-ups. Every topic left unasked once the
10
- questions are over gets the default that fits the intent brief and the answers so far, written as a
11
- requirement like any other and named as your choice in the closing summary. The unit testing script
12
- is written whatever the level.
5
+ The questioning level caps this phase's questions (light 3, medium 5, thorough 10, or best judgement - `SKILL.md`, "How many questions"), and so sets how broad each is. Every level reaches all the topics, in order: light in a few broad questions - the stack, say, then storage and outside services together, then the remaining constraints, each with what fits the brief proposed; thorough a topic or two a question, with follow-ups. Every topic left unasked once the questions are over gets the default that fits the intent brief and the answers so far, written as a requirement like any other and named as your choice in the closing summary. The unit testing script is written whatever the level.
13
6
 
14
7
  ## Author target for this phase
15
8
 
@@ -22,27 +15,12 @@ Do **not** add `***test reqs***` or `***acceptance tests***` in this phase — t
22
15
 
23
16
  ## First: a stack from the standard library
24
17
 
25
- Before the topics, settle what kind of software each module is - a backend, a frontend, a
26
- command-line tool, a library - and offer the standard library's stacks for that kind (the stdlib
27
- rule, in `<plain-rules>`, lists them) that this machine can build: `<toolchains on this machine>`, in
28
- your instructions, says which languages it can build now. The agents use its toolchains and install
29
- none, so a stack in a language it lacks stops at its first build. Ask with `ask_user`: those stacks
30
- as options, the one that fits earlier answers first, and "Something else…" for a stack of the user's
31
- own. A stack the user names in a language the machine lacks: say what to install first and that
32
- `turri doctor` checks it, and ask whether to wait for that or choose another.
33
-
34
- - **A stack from the standard library.** Import it into the module's frontmatter as
35
- `stdlib/<kind>/<stack>`, and read the templates it brings: the stack, its `stdlib/lang/<language>`
36
- and its kind's `common` - the folder is in the stdlib rule. They settle topics 1, 2 and 5, error handling and
37
- logging in topic 6, and the unit-test framework in topic 8: do not ask about those, and write no
38
- requirement that restates them. Say in one line what the stack settles - its language, framework,
39
- layout, how it reports errors and logs - so the user knows what they chose. Then walk only topics
40
- 3, 4, 6 (what the stack leaves open), 7, and the unit testing script in 8.
41
- - **Something else.** Walk every topic below. When the language is one the standard library has, its
42
- `stdlib/lang/<language>` template can still be imported for the language-wide conventions.
43
-
44
- A user who wants something the stack settles done differently - another framework, another layout -
45
- has chosen something else: an import cannot be taken back in part.
18
+ Before the topics, settle what kind of software each module is - a backend, a frontend, a command-line tool, a library - and offer the standard library's stacks for that kind (the stdlib rule, in `<plain-rules>`, lists them) that this machine can build: `<toolchains on this machine>`, in your instructions, says which languages it can build now. The agents use its toolchains and install none, so a stack in a language it lacks stops at its first build. Ask with `ask_user`: those stacks as options, the one that fits earlier answers first, and "Something else…" for a stack of the user's own. A stack the user names in a language the machine lacks: say what to install first and that `turri doctor` checks it, and ask whether to wait for that or choose another.
19
+
20
+ - **A stack from the standard library.** Import it into the module's frontmatter as `stdlib/<kind>/<stack>`, and read the templates it brings: the stack, its `stdlib/lang/<language>` and its kind's `common` - the folder is in the stdlib rule. They settle topics 1, 2 and 5, error handling and logging in topic 6, and the unit-test framework in topic 8: do not ask about those, and write no requirement that restates them. Say in one line what the stack settles - its language, framework, layout, how it reports errors and logs - so the user knows what they chose. Then walk only topics 3, 4, 6 (what the stack leaves open), 7, and the unit testing script in 8.
21
+ - **Something else.** Walk every topic below. When the language is one the standard library has, its `stdlib/lang/<language>` template can still be imported for the language-wide conventions.
22
+
23
+ A user who wants something the stack settles done differently - another framework, another layout - has chosen something else: an import cannot be taken back in part.
46
24
 
47
25
  ## Topics (in order)
48
26
 
@@ -1,56 +1,25 @@
1
1
  # the testing phase — How is what was built checked from the outside?
2
2
 
3
- Decide whether the project has conformance tests, and if it does, say in `***test reqs***` how they
4
- are written and run, and give it the script that runs them. This comes before the product phase, and
5
- nothing here is built: a change to the test reqs is not a spec diff, so it is written with the
6
- ordinary file tools, never `write_spec_diff`. What is settled here is what every build of the
7
- product phase follows - with conformance on, each spec change is built with its conformance tests.
8
- Run the core loop for each topic below, in order: ask, then write. When the user has no preference,
9
- propose a default that fits the stack and the intent brief and ask them to confirm.
10
-
11
- Conformance tests are black-box tests written from the spec: for each functional spec, tests that
12
- run the built software from the outside - as a command, over HTTP, through its public entry point -
13
- and check it does what the spec says, kept apart from the spec's acceptance tests. The harness runs
14
- the whole suite after every spec change, so they catch one change breaking another. They cost time
15
- and tokens on every build.
3
+ Decide whether the project has conformance tests, and if it does, say in `***test reqs***` how they are written and run, and give it the script that runs them. This comes before the product phase, and nothing here is built: a change to the test reqs is not a spec diff, so it is written with the ordinary file tools, never `write_spec_diff`. What is settled here is what every build of the product phase follows - with conformance on, each spec change is built with its conformance tests. Run the core loop for each topic below, in order: ask, then write. When the user has no preference, propose a default that fits the stack and the intent brief and ask them to confirm.
4
+
5
+ Conformance tests are black-box tests written from the spec: for each functional spec, tests that run the built software from the outside - as a command, over HTTP, through its public entry point - and check it does what the spec says, kept apart from the spec's acceptance tests. The harness runs the whole suite after every spec change, so they catch one change breaking another. They cost time and tokens on every build.
16
6
 
17
7
  ## Author target for this phase
18
8
 
19
- - `***test reqs***` - one `:ConformanceTests:` requirement per fact, on the template if one exists
20
- (shared by every module), otherwise on the module. Follow `genome/rules/test-reqs.md`.
21
- - `config.turri.yaml` at the project root - the `conformance-tests:` decision. Change only that key, and
22
- create the file if there is none; everything else in it stays as it is. When the project has only a
23
- `config.yaml`, copy it to `config.turri.yaml` first - and each `config.<name>.yaml` to
24
- `config.turri.<name>.yaml` - and write the copy: `config.yaml` may be another tool's, and is never
25
- written.
9
+ - `***test reqs***` - one `:ConformanceTests:` requirement per fact, on the template if one exists (shared by every module), otherwise on the module. Follow `genome/rules/test-reqs.md`.
10
+ - `config.turri.yaml` at the project root - the `conformance-tests:` decision. Change only that key, and create the file if there is none; everything else in it stays as it is. When the project has only a `config.yaml`, copy it to `config.turri.yaml` first - and each `config.<name>.yaml` to `config.turri.<name>.yaml` - and write the copy: `config.yaml` may be another tool's, and is never written.
26
11
  - `test_scripts/` - the conformance testing script.
27
12
 
28
13
  Write no `***acceptance tests***`, no functional specs and no `***implementation reqs***` here.
29
14
 
30
15
  ## Topics (in order)
31
16
 
32
- 1. **Conformance on or off** - ask it explicitly, with what it costs and what it catches; it is a
33
- recorded decision, never an inference. Ask it even when `config.turri.yaml` already has
34
- `conformance-tests:` - offer what it says as the first option. Write it to `config.turri.yaml` as `conformance-tests: true` or
35
- `conformance-tests: false`. Off: say that no conformance tests will be written or run until it
36
- is turned on, and go to the end of the phase.
37
- 2. **Framework** - e.g. pytest, JUnit, Jest, Go's `testing`; one that fits the stack. Author it as a
38
- `:ConformanceTests:` requirement.
39
- 3. **How the tests reach the software** - as a subprocess of the CLI, over HTTP against a server the
40
- tests start, through the public entry point it exports. Author it.
41
- 4. **Setup and outside services** - fixtures, test data, databases, third-party APIs: started for
42
- real, faked, or mocked at the boundary. Author each decision as its own requirement.
17
+ 1. **Conformance on or off** - ask it explicitly, with what it costs and what it catches; it is a recorded decision, never an inference. Ask it even when `config.turri.yaml` already has `conformance-tests:` - offer what it says as the first option. Write it to `config.turri.yaml` as `conformance-tests: true` or `conformance-tests: false`. Off: say that no conformance tests will be written or run until it is turned on, and go to the end of the phase.
18
+ 2. **Framework** - e.g. pytest, JUnit, Jest, Go's `testing`; one that fits the stack. Author it as a `:ConformanceTests:` requirement.
19
+ 3. **How the tests reach the software** - as a subprocess of the CLI, over HTTP against a server the tests start, through the public entry point it exports. Author it.
20
+ 4. **Setup and outside services** - fixtures, test data, databases, third-party APIs: started for real, faked, or mocked at the boundary. Author each decision as its own requirement.
43
21
  5. **How the whole suite is run** - the one command that discovers every test. Author it.
44
- 6. **The conformance testing script** - if turri already finds one (named by
45
- `conformance-tests-script:` in `config.turri.yaml`, or the one `run_conformance_tests*.sh` in the
46
- project root or in `test_scripts/`), check it runs the suite the way the test reqs now say, and
47
- keep it. Otherwise write `test_scripts/run_conformance_tests_<language>.sh` with
48
- `implement-conformance-testing-script`, to match the test reqs. Never link it from the specs.
49
- If `test_scripts/` would hold two of a kind, name the one to use in `config.turri.yaml`. In a
50
- project whose parts are on different stacks, name each stack's script in its own
51
- `config.turri.<stack>.yaml` (`conformance-tests-script:`), and tell the user to choose the stack
52
- with `/stack <stack>` (`--stack <stack>` on the command line) before building that part.
22
+ 6. **The conformance testing script** - if turri already finds one (named by `conformance-tests-script:` in `config.turri.yaml`, or the one `run_conformance_tests*.sh` in the project root or in `test_scripts/`), check it runs the suite the way the test reqs now say, and keep it. Otherwise write `test_scripts/run_conformance_tests_<language>.sh` with `implement-conformance-testing-script`, to match the test reqs. Never link it from the specs. If `test_scripts/` would hold two of a kind, name the one to use in `config.turri.yaml`. In a project whose parts are on different stacks, name each stack's script in its own `config.turri.<stack>.yaml` (`conformance-tests-script:`), and tell the user to choose the stack with `/stack <stack>` (`--stack <stack>` on the command line) before building that part.
53
23
  7. **Anything else** - anything about testing the user wants to add or change.
54
24
 
55
- Run `validate` on every module you changed. The product phase's first build needs the test reqs
56
- and the conformance testing script both there: without them it stops before it starts.
25
+ Run `validate` on every module you changed. The product phase's first build needs the test reqs and the conformance testing script both there: without them it stops before it starts.