@pmelab/gtd 51.0.1 → 52.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +46 -40
  3. package/dist/chunks/{reserved-CUkk9XgL.mjs → reserved-DxB5CROj.mjs} +73 -38
  4. package/dist/chunks/{review-BaCXlIT2.mjs → review-CKMSdvgW.mjs} +11 -9
  5. package/dist/chunks/{steering-DtUVUz9l.mjs → steering-CLhu8C7q.mjs} +262 -52
  6. package/dist/chunks/{tail-CX6Pdsql.mjs → tail-QZc7Uz2U.mjs} +1 -1
  7. package/dist/gtd.bundle.mjs +198 -43
  8. package/dist/steering.mjs +2 -2
  9. package/dist/testkit.mjs +1 -1
  10. package/dist/web/main.css +1 -1
  11. package/dist/web/main.js +510 -147
  12. package/dist/workflow-kit.mjs +1 -1
  13. package/dist/workflows/cleanup.mjs +2 -2
  14. package/dist/workflows/feature.mjs +228 -222
  15. package/dist/workflows/fix.mjs +3 -3
  16. package/dist/workflows/review.mjs +3 -3
  17. package/dist/workflows/rollout.mjs +1 -1
  18. package/dist/workflows.mjs +570 -317
  19. package/package.json +5 -4
  20. package/src/steering/FORMATS.md +4 -1
  21. package/src/steering/SteeringFormat.ts +7 -1
  22. package/src/steering/contract.test.ts +2 -1
  23. package/src/steering/fixtures/review/sectioned.md +31 -0
  24. package/src/steering/fixtures/review/sectioned.read.json +119 -0
  25. package/src/steering/index.ts +4 -0
  26. package/src/steering/qa.ts +1 -1
  27. package/src/steering/review.test.ts +270 -4
  28. package/src/steering/review.ts +328 -69
  29. package/src/testkit/steps.ts +13 -0
  30. package/src/workflows/feature/acceptance-criteria.feature +159 -3
  31. package/src/workflows/feature/continuation-cap.feature +4 -0
  32. package/src/workflows/feature/continuation-rebuild.feature +4 -0
  33. package/src/workflows/feature/continuation-slices.feature +4 -0
  34. package/src/workflows/feature/continuation.feature +4 -0
  35. package/src/workflows/feature/criteria.test.ts +60 -1
  36. package/src/workflows/feature/criteria.ts +87 -8
  37. package/src/workflows/feature/fast-path.feature +5 -6
  38. package/src/workflows/feature/feature.test.ts +6 -5
  39. package/src/workflows/feature/feature.ts +1 -2
  40. package/src/workflows/feature/flag-mode.feature +5 -6
  41. package/src/workflows/feature/green.ts +22 -0
  42. package/src/workflows/feature/hands-on-skip.feature +384 -0
  43. package/src/workflows/feature/lens-models.feature +4 -4
  44. package/src/workflows/feature/lens-review.feature +10 -8
  45. package/src/workflows/feature/naive-acceptance.feature +4 -0
  46. package/src/workflows/feature/one-step-land.feature +5 -6
  47. package/src/workflows/feature/planning.ts +2 -1
  48. package/src/workflows/feature/prototype-rounds.feature +5 -1
  49. package/src/workflows/feature/prototype.feature +18 -9
  50. package/src/workflows/feature/prototype.ts +48 -17
  51. package/src/workflows/feature/refactor-absorbs.feature +7 -8
  52. package/src/workflows/feature/refactor-first.feature +7 -8
  53. package/src/workflows/feature/refactor-lens-models.feature +4 -0
  54. package/src/workflows/feature/refactor-rebuild.feature +11 -12
  55. package/src/workflows/feature/refactor-review.feature +72 -72
  56. package/src/workflows/feature/review-answers.feature +94 -5
  57. package/src/workflows/feature/review-gate.feature +23 -53
  58. package/src/workflows/feature/reviewer-walkthrough.feature +33 -12
  59. package/src/workflows/feature/risk-tier.feature +32 -0
  60. package/src/workflows/feature/seam-rejection.feature +9 -6
  61. package/src/workflows/feature/seam.feature +9 -6
  62. package/src/workflows/feature/seam.test.ts +5 -3
  63. package/src/workflows/feature/seam.ts +2 -3
  64. package/src/workflows/feature/severity-budget.feature +11 -7
  65. package/src/workflows/feature/severity-sorted-review.feature +54 -54
  66. package/src/workflows/feature/slice-findings.feature +9 -15
  67. package/src/workflows/feature/slicing.feature +36 -24
  68. package/src/workflows/feature/standards.feature +4 -4
  69. package/src/workflows/feature/tier-pin.feature +4 -0
  70. package/src/workflows/shared/review.ts +26 -6
  71. package/src/workflows/shared/text.test.ts +85 -11
  72. package/src/workflows/shared/text.ts +95 -42
  73. package/src/workflows/feature/coverage.feature +0 -165
  74. package/src/workflows/feature/coverage.ts +0 -120
@@ -0,0 +1,22 @@
1
+ import { healthy } from "../shared/health.js"
2
+ import { coder, FEEDBACK, REQUIREMENTS } from "../shared/steps.js"
3
+ import * as t from "../shared/text.js"
4
+ import { requireCriteriaFrozen } from "./criteria.js"
5
+
6
+ export const green = (guard?: () => void): Promise<void> =>
7
+ healthy(
8
+ () =>
9
+ t.agentWithSkills("fix.suite.fixing", t.implementFixPrompt(), {
10
+ label: "Fixing the check",
11
+ file: FEEDBACK,
12
+ model: coder(),
13
+ system: t.builderSystem(),
14
+ }),
15
+ {
16
+ guard: () => {
17
+ requireCriteriaFrozen(REQUIREMENTS)
18
+ guard?.()
19
+ },
20
+ guardRests: false,
21
+ },
22
+ )
@@ -0,0 +1,384 @@
1
+ @inmem
2
+ Feature: the hands-on test tries only the criteria a person can observe
3
+
4
+ Design may tag a criterion no person can try by using the change — prompt
5
+ wording, internal wiring — by writing `(no hands-on)` between its ID and the
6
+ colon. At every hands-on test, implement.prototype.observable asks a judge,
7
+ per untagged criterion, whether a person can observe it by using the
8
+ software; a tagged one is never asked about. Every ID it does not answer
9
+ `no` reaches implement.prototype.testing, which must report each once and
10
+ needs no chunk for the rest. A slice with no such criterion is not tested by hand, and
11
+ nothing rests to say so.
12
+
13
+ Background:
14
+ Given the shipped workflows, as gtd install scaffolds them
15
+ And an environment variable "GTD_QUALITYREVIEWS" set to ""
16
+ And an environment variable "GTD_FLAGMODE" set to "false"
17
+ And an environment variable "GTD_SLICEMAXCRITERIA" set to "2"
18
+ And a file "src/calc.ts" with:
19
+ """
20
+ export const add = (a: number, b: number) => a + b
21
+ """
22
+ And the working tree is committed as "feat: add calculator"
23
+ And a file "TODO.md" with:
24
+ """
25
+ # Add subtract
26
+
27
+ subtract(a, b) returns the difference.
28
+ """
29
+ And step "unwind" changes nothing
30
+ And step "start-gate.check" changes nothing
31
+ And step "design.gate.answer" changes nothing
32
+ And step "seam.check" changes nothing
33
+ And step "implement.applying" runs its script
34
+ And step "implement.health.check" changes nothing
35
+ And step "implement.closing" runs its script
36
+
37
+ Scenario: the testing turn skips a tagged criterion, which the judge is never asked about
38
+ Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
39
+ """
40
+ # Requirements
41
+
42
+ ## Impact
43
+
44
+ - the greeting module
45
+
46
+ ## Acceptance Criteria
47
+
48
+ - AC-1: subtract(a, b) returns a - b.
49
+ - AC-2 (no hands-on): the build prompt names subtract.
50
+ """
51
+ And step "seam.naive" writes "src/calc.test.ts" with:
52
+ """
53
+ it("[AC-1] subtracts", () => {})
54
+ it("[AC-2] names subtract", () => {})
55
+ """
56
+ And judge step "implement.prototype.observable", when its questions contain "criterion AC-2 describes", answers:
57
+ """
58
+ [{"id":"AC-1","answer":"no","p":0.9},{"id":"AC-2","answer":"no","p":0.9}]
59
+ """
60
+ And judge step "implement.prototype.observable", when its questions contain "criterion AC-1 describes", answers:
61
+ """
62
+ [{"id":"AC-1","answer":"yes","p":0.9}]
63
+ """
64
+ And step "implement.prototype.testing" is prompted with "Skip AC-2: no person can observe them"
65
+ And step "implement.prototype.testing" writes ".gtd/PROTOTYPE.md" with:
66
+ """
67
+ ## AC-1: pass
68
+
69
+ Printed 2.
70
+ """
71
+ When the process is driven
72
+ Then the process rests at "build.review.reviewing"
73
+ And the commit subjects end with:
74
+ """
75
+ gtd(check): implement.health.check → implement.prototype.observable
76
+ gtd(judge): implement.prototype.observable → implement.prototype.testing
77
+ gtd(agent): implement.prototype.testing → implement.closing
78
+ gtd(check): implement.closing → build.review.reviewing
79
+ """
80
+
81
+ Scenario: a criterion the judge finds no person can observe is skipped like a tagged one
82
+ Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
83
+ """
84
+ # Requirements
85
+
86
+ ## Impact
87
+
88
+ - the greeting module
89
+
90
+ ## Acceptance Criteria
91
+
92
+ - AC-1: subtract(a, b) returns a - b.
93
+ - AC-2: add is unchanged.
94
+ """
95
+ And step "seam.naive" writes "src/calc.test.ts" with:
96
+ """
97
+ it("[AC-1] subtracts", () => {})
98
+ it("[AC-2] adds", () => {})
99
+ """
100
+ And judge step "implement.prototype.observable" answers:
101
+ """
102
+ [{"id":"AC-1","answer":"yes","p":0.9},{"id":"AC-2","answer":"no","p":0.9}]
103
+ """
104
+ And step "implement.prototype.testing" is prompted with "Skip AC-2: no person can observe them"
105
+ And step "implement.prototype.testing" writes ".gtd/PROTOTYPE.md" with:
106
+ """
107
+ ## AC-1: pass
108
+
109
+ Printed 2.
110
+ """
111
+ When the process is driven
112
+ Then the process rests at "build.review.reviewing"
113
+ And the commit subjects end with:
114
+ """
115
+ gtd(judge): implement.prototype.observable → implement.prototype.testing
116
+ gtd(agent): implement.prototype.testing → implement.closing
117
+ gtd(check): implement.closing → build.review.reviewing
118
+ """
119
+
120
+ Scenario: a criterion the judge gives no verdict on is tested by hand
121
+ Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
122
+ """
123
+ # Requirements
124
+
125
+ ## Impact
126
+
127
+ - the greeting module
128
+
129
+ ## Acceptance Criteria
130
+
131
+ - AC-1: subtract(a, b) returns a - b.
132
+ - AC-2: add is unchanged.
133
+ """
134
+ And step "seam.naive" writes "src/calc.test.ts" with:
135
+ """
136
+ it("[AC-1] subtracts", () => {})
137
+ it("[AC-2] adds", () => {})
138
+ """
139
+ And judge step "implement.prototype.observable" answers:
140
+ """
141
+ [{"id":"AC-2","answer":"no","p":0.9}]
142
+ """
143
+ And step "implement.prototype.testing" is prompted with "Skip AC-2: no person can observe them"
144
+ And step "implement.prototype.testing" writes ".gtd/PROTOTYPE.md" with:
145
+ """
146
+ ## AC-1: pass
147
+
148
+ Printed 2.
149
+ """
150
+ When the process is driven
151
+ Then the process rests at "build.review.reviewing"
152
+ And the commit subjects end with:
153
+ """
154
+ gtd(judge): implement.prototype.observable → implement.prototype.testing
155
+ gtd(agent): implement.prototype.testing → implement.closing
156
+ gtd(check): implement.closing → build.review.reviewing
157
+ """
158
+
159
+ Scenario: a judge landing without a verdict tests every untagged criterion by hand
160
+ Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
161
+ """
162
+ # Requirements
163
+
164
+ ## Impact
165
+
166
+ - the greeting module
167
+
168
+ ## Acceptance Criteria
169
+
170
+ - AC-1: subtract(a, b) returns a - b.
171
+ - AC-2: add is unchanged.
172
+ """
173
+ And step "seam.naive" writes "src/calc.test.ts" with:
174
+ """
175
+ it("[AC-1] subtracts", () => {})
176
+ it("[AC-2] adds", () => {})
177
+ """
178
+ And judge step "implement.prototype.observable" answers:
179
+ """
180
+ []
181
+ """
182
+ And step "implement.prototype.testing" writes ".gtd/PROTOTYPE.md" with:
183
+ """
184
+ ## AC-1: pass
185
+
186
+ Printed 2.
187
+ """
188
+ Then driving the process is refused with "exactly one chunk headed `## <ID>: pass|fail|blocked` for AC-2"
189
+
190
+ Scenario: a report missing a criterion the judge found observable is refused
191
+ Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
192
+ """
193
+ # Requirements
194
+
195
+ ## Impact
196
+
197
+ - the greeting module
198
+
199
+ ## Acceptance Criteria
200
+
201
+ - AC-1: subtract(a, b) returns a - b.
202
+ - AC-2: subtract prints a warning for negative results.
203
+ """
204
+ And step "seam.naive" writes "src/calc.test.ts" with:
205
+ """
206
+ it("[AC-1] subtracts", () => {})
207
+ it("[AC-2] warns", () => {})
208
+ """
209
+ And judge step "implement.prototype.observable" answers:
210
+ """
211
+ [{"id":"AC-1","answer":"yes","p":0.9},{"id":"AC-2","answer":"yes","p":0.9}]
212
+ """
213
+ And step "implement.prototype.testing" writes ".gtd/PROTOTYPE.md" with:
214
+ """
215
+ ## AC-1: pass
216
+
217
+ Printed 2.
218
+ """
219
+ Then driving the process is refused with "exactly one chunk headed `## <ID>: pass|fail|blocked` for AC-2"
220
+
221
+ Scenario: a change with no observable criterion skips the hands-on test without resting
222
+ Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
223
+ """
224
+ # Requirements
225
+
226
+ ## Impact
227
+
228
+ - the greeting module
229
+
230
+ ## Acceptance Criteria
231
+
232
+ - AC-1: add is unchanged.
233
+ """
234
+ And step "seam.naive" writes "src/calc.test.ts" with:
235
+ """
236
+ it("[AC-1] adds", () => {})
237
+ """
238
+ And judge step "implement.prototype.observable" answers:
239
+ """
240
+ [{"id":"AC-1","answer":"no","p":0.9}]
241
+ """
242
+ When the process is driven
243
+ Then the process rests at "build.review.reviewing"
244
+ And the commit subjects end with:
245
+ """
246
+ gtd(check): implement.health.check → implement.prototype.observable
247
+ gtd(judge): implement.prototype.observable → implement.closing
248
+ gtd(check): implement.closing → build.review.reviewing
249
+ """
250
+
251
+ Scenario: a change whose every criterion is tagged is not tested by hand or judged
252
+ Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
253
+ """
254
+ # Requirements
255
+
256
+ ## Impact
257
+
258
+ - the greeting module
259
+
260
+ ## Acceptance Criteria
261
+
262
+ - AC-1 (no hands-on): the build prompt names subtract.
263
+ - AC-2 (no hands-on): the review prompt names subtract.
264
+ """
265
+ And step "seam.naive" writes "src/calc.test.ts" with:
266
+ """
267
+ it("[AC-1] names subtract in the build", () => {})
268
+ it("[AC-2] names subtract in the review", () => {})
269
+ """
270
+ When the process is driven
271
+ Then the process rests at "build.review.reviewing"
272
+ And the commit subjects end with:
273
+ """
274
+ gtd(check): implement.health.check → implement.closing
275
+ gtd(check): implement.closing → build.review.reviewing
276
+ """
277
+
278
+ Scenario: each slice's hands-on test judges its own criteria afresh
279
+ Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
280
+ """
281
+ # Requirements
282
+
283
+ ## Impact
284
+
285
+ - the greeting module
286
+
287
+ ## Acceptance Criteria
288
+
289
+ - AC-1: subtract(a, b) returns a - b.
290
+ - AC-2 (no hands-on): the build prompt names subtract.
291
+ - AC-3: the review prompt names subtract.
292
+ """
293
+ And step "design.slicing" writes ".gtd/SLICES.md" with:
294
+ """
295
+ # Slices
296
+
297
+ ## Prompts
298
+
299
+ - AC-2
300
+ - AC-3
301
+
302
+ ## Subtract
303
+
304
+ - AC-1
305
+ """
306
+ And step "seam.naive", when prompted with "This slice builds AC-2, AC-3 only", writes "src/prompts.test.ts" with:
307
+ """
308
+ it("[AC-2] names subtract in the build", () => {})
309
+ it("[AC-3] names subtract in the review", () => {})
310
+ """
311
+ And step "seam.naive", when prompted with "This slice builds AC-1 only", writes "src/calc.test.ts" with:
312
+ """
313
+ it("[AC-1] subtracts", () => {})
314
+ """
315
+ And judge step "implement.prototype.observable", when its questions contain "criterion AC-3 describes", answers:
316
+ """
317
+ [{"id":"AC-3","answer":"no","p":0.9}]
318
+ """
319
+ And judge step "implement.prototype.observable", when its questions contain "criterion AC-1 describes", answers:
320
+ """
321
+ [{"id":"AC-1","answer":"yes","p":0.9}]
322
+ """
323
+ And step "implement.prototype.testing" writes ".gtd/PROTOTYPE.md" with:
324
+ """
325
+ ## AC-1: pass
326
+
327
+ Printed 2.
328
+ """
329
+ When the process is driven
330
+ Then the process rests at "build.review.reviewing"
331
+ And the commit subjects end with:
332
+ """
333
+ gtd(check): implement.health.check → implement.prototype.observable
334
+ gtd(judge): implement.prototype.observable → implement.closing
335
+ gtd(check): implement.closing → seam.naive
336
+ gtd(agent): seam.naive → seam.check
337
+ gtd(check): seam.check → implement.applying
338
+ gtd(check): implement.applying → implement.health.check
339
+ gtd(check): implement.health.check → implement.prototype.observable
340
+ gtd(judge): implement.prototype.observable → implement.prototype.testing
341
+ gtd(agent): implement.prototype.testing → implement.closing
342
+ gtd(check): implement.closing → build.review.reviewing
343
+ """
344
+
345
+ Scenario: the tag is frozen once design is settled
346
+ Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
347
+ """
348
+ # Requirements
349
+
350
+ ## Impact
351
+
352
+ - the greeting module
353
+
354
+ ## Acceptance Criteria
355
+
356
+ - AC-1: subtract(a, b) returns a - b.
357
+ """
358
+ And step "seam.naive" writes "src/calc.test.ts" with:
359
+ """
360
+ it("[AC-1] subtracts", () => {})
361
+ """
362
+ And judge step "implement.prototype.observable" answers:
363
+ """
364
+ [{"id":"AC-1","answer":"yes","p":0.9}]
365
+ """
366
+ And step "implement.prototype.testing" writes ".gtd/PROTOTYPE.md" with:
367
+ """
368
+ ## AC-1: fail
369
+
370
+ Printed 4.
371
+ """
372
+ And step "implement.prototype.fix.fixing" writes ".gtd/REQUIREMENTS.md" with:
373
+ """
374
+ # Requirements
375
+
376
+ ## Impact
377
+
378
+ - the greeting module
379
+
380
+ ## Acceptance Criteria
381
+
382
+ - AC-1 (no hands-on): subtract(a, b) returns a - b.
383
+ """
384
+ Then driving the process is refused with "criteria-frozen"
@@ -33,6 +33,10 @@ Feature: each quality lens runs on its own model hint
33
33
  """
34
34
  # Requirements
35
35
 
36
+ ## Impact
37
+
38
+ - the greeting module
39
+
36
40
  ## Acceptance Criteria
37
41
 
38
42
  - AC-1: `subtract(a, b)` returns `a - b`.
@@ -51,10 +55,6 @@ Feature: each quality lens runs on its own model hint
51
55
  And step "implement.applying" runs its script
52
56
  And step "implement.health.check" changes nothing
53
57
  And step "implement.closing" runs its script
54
- And judge step "implement.coverage" answers:
55
- """
56
- [{"id":"AC-1","answer":"yes","p":0.9}]
57
- """
58
58
 
59
59
  Scenario: a hinted lens runs on its hint, every other lens on its default
60
60
  When the process is driven
@@ -35,6 +35,10 @@ Feature: the quality lap's findings are triaged before the review
35
35
 
36
36
  - `subtract(a, b)` returns `a - b`.
37
37
 
38
+ ## Impact
39
+
40
+ - the greeting module
41
+
38
42
  ## Acceptance Criteria
39
43
 
40
44
  - AC-1: subtract(a, b) returns a - b.
@@ -53,10 +57,6 @@ Feature: the quality lap's findings are triaged before the review
53
57
  And step "implement.applying" runs its script
54
58
  And step "implement.health.check" changes nothing
55
59
  And step "implement.closing" runs its script
56
- And judge step "implement.coverage" answers:
57
- """
58
- [{"id":"AC-1","answer":"yes","p":0.9}]
59
- """
60
60
  And step "build.quality.correctness.reviewing" writes ".gtd/QUALITY.md" with:
61
61
  """
62
62
  # Quality
@@ -113,7 +113,9 @@ Feature: the quality lap's findings are triaged before the review
113
113
  And the commit "gtd(judge): build.quality.triage → build.quality.sorting" has a body containing "Gtd-Mark: noise=Q2 p=0.85 add could be a method"
114
114
  And ".gtd/REVIEW.md" contains:
115
115
  """
116
- ## AC-1 ignores floating point
116
+ ## Findings
117
+
118
+ ### AC-1 ignores floating point
117
119
 
118
120
  _critical: judge unsure_
119
121
 
@@ -129,9 +131,9 @@ Feature: the quality lap's findings are triaged before the review
129
131
  - [ ] won't fix
130
132
  - [ ] _your answer_
131
133
 
132
- ## Fixed automatically
134
+ ## Walkthrough
133
135
 
134
- - subtract has no negative test (
136
+ ### Subtract
135
137
  """
136
138
  And ".gtd/REVIEW.md" contains the short hash of the commit "gtd(agent): build.fix.quality.fixing → build.health.check"
137
139
  And ".gtd/REVIEW.md" contains:
@@ -235,7 +237,7 @@ Feature: the quality lap's findings are triaged before the review
235
237
  And ".gtd/QUALITY.md" does not exist
236
238
  And ".gtd/REVIEW.md" contains:
237
239
  """
238
- ## add could be a method
240
+ ### add could be a method
239
241
 
240
242
  _critical: judge unsure_
241
243
 
@@ -28,6 +28,10 @@ Feature: a naive pass ends only when a test names every criterion and the suite
28
28
  """
29
29
  # Requirements
30
30
 
31
+ ## Impact
32
+
33
+ - the greeting module
34
+
31
35
  ## Acceptance Criteria
32
36
 
33
37
  - AC-1: `subtract(5, 3)` returns 2.
@@ -36,6 +36,10 @@ Feature: a naive pass the judge rules land is itself the implementation
36
36
 
37
37
  - greeting reads "Hello, world".
38
38
 
39
+ ## Impact
40
+
41
+ - the greeting module
42
+
39
43
  ## Acceptance Criteria
40
44
 
41
45
  - AC-1: the change behaves as described.
@@ -57,10 +61,6 @@ Feature: a naive pass the judge rules land is itself the implementation
57
61
  And step "implement.applying" runs its script
58
62
  And step "implement.health.check" changes nothing
59
63
  And step "implement.closing" runs its script
60
- And judge step "implement.coverage" answers:
61
- """
62
- [{"id":"AC-1","answer":"yes","p":0.9}]
63
- """
64
64
  And step "build.quality.correctness.reviewing" changes nothing
65
65
 
66
66
  Scenario: a land judgment applies the naive pass and runs from idle to the review gate with no rebuild
@@ -79,8 +79,7 @@ Feature: a naive pass the judge rules land is itself the implementation
79
79
  gtd(check): seam.check → seam.judge
80
80
  gtd(judge): seam.judge → implement.applying
81
81
  gtd(check): implement.applying → implement.health.check
82
- gtd(check): implement.health.check → implement.coverage
83
- gtd(judge): implement.coverage → implement.closing
82
+ gtd(check): implement.health.check → implement.closing
84
83
  gtd(check): implement.closing → build.quality.correctness.reviewing
85
84
  gtd(agent): build.quality.correctness.reviewing → build.review.reviewing
86
85
  """
@@ -8,7 +8,7 @@ import {
8
8
  scope,
9
9
  } from "../../flows/index.js"
10
10
  import { REQUIREMENTS } from "../shared/steps.js"
11
- import { requireCriteria } from "./criteria.js"
11
+ import { requireCriteria, requireImpact } from "./criteria.js"
12
12
  import { answerProductQuestions, triage } from "./steps.js"
13
13
 
14
14
  /**
@@ -33,6 +33,7 @@ export const design = (base: string, guard?: () => void): Promise<void> =>
33
33
  requireProgress(REQUIREMENTS)
34
34
  requireReplies(REQUIREMENTS)
35
35
  requireCriteria(REQUIREMENTS)
36
+ requireImpact(REQUIREMENTS)
36
37
  guard?.()
37
38
  } while (await noteGate(REQUIREMENTS, answerProductQuestions))
38
39
  })
@@ -28,6 +28,10 @@ Feature: past its round cap the hands-on test rests at a person's gate
28
28
  """
29
29
  # Requirements
30
30
 
31
+ ## Impact
32
+
33
+ - the greeting module
34
+
31
35
  ## Acceptance Criteria
32
36
 
33
37
  - AC-1: subtract(a, b) returns a - b.
@@ -47,7 +51,7 @@ Feature: past its round cap the hands-on test rests at a person's gate
47
51
  And step "seam.check" changes nothing
48
52
  And step "implement.applying" runs its script
49
53
  And step "implement.health.check" changes nothing
50
- And judge step "implement.coverage" answers:
54
+ And judge step "implement.prototype.observable" answers:
51
55
  """
52
56
  [{"id":"AC-1","answer":"yes","p":0.9},{"id":"AC-2","answer":"yes","p":0.9}]
53
57
  """
@@ -1,10 +1,11 @@
1
1
  @inmem
2
- Feature: every criterion is tested by hand before the quality lap
2
+ Feature: every observable criterion is tested by hand before the quality lap
3
3
 
4
- Once coverage is judged, implement.prototype.testing uses the slice the way
5
- a person would and writes .gtd/PROTOTYPE.md, one chunk per criterion headed
6
- `## AC-<n>: pass|fail|blocked`, plus one per problem found beside them. A
7
- failure goes to implement.prototype.fix.fixing and is tested again; only a clean
4
+ Once the suite is green, implement.prototype.observable judges which
5
+ criteria a person can observe, and implement.prototype.testing uses the
6
+ slice the way a person would and writes .gtd/PROTOTYPE.md, one chunk per
7
+ such criterion headed `## AC-<n>: pass|fail|blocked`, plus one per problem
8
+ found beside them. A failure goes to implement.prototype.fix.fixing and is tested again; only a clean
8
9
  report closes the slice. Past `prototypeRounds` fix rounds, or with nothing a
9
10
  fixer can take, a person decides at implement.prototype.open.
10
11
 
@@ -29,6 +30,10 @@ Feature: every criterion is tested by hand before the quality lap
29
30
  """
30
31
  # Requirements
31
32
 
33
+ ## Impact
34
+
35
+ - the greeting module
36
+
32
37
  ## Acceptance Criteria
33
38
 
34
39
  - AC-1: subtract(a, b) returns a - b.
@@ -48,7 +53,7 @@ Feature: every criterion is tested by hand before the quality lap
48
53
  And step "seam.check" changes nothing
49
54
  And step "implement.applying" runs its script
50
55
  And step "implement.health.check" changes nothing
51
- And judge step "implement.coverage" answers:
56
+ And judge step "implement.prototype.observable" answers:
52
57
  """
53
58
  [{"id":"AC-1","answer":"yes","p":0.9},{"id":"AC-2","answer":"yes","p":0.9}]
54
59
  """
@@ -57,7 +62,7 @@ Feature: every criterion is tested by hand before the quality lap
57
62
  Scenario: the testing turn is told to use every criterion for real, in a disposable place
58
63
  When the process is driven
59
64
  Then the process rests at "implement.prototype.testing"
60
- And the last commit subject is "gtd(judge): implement.coverage → implement.prototype.testing"
65
+ And the last commit subject is "gtd(judge): implement.prototype.observable → implement.prototype.testing"
61
66
  And the resting step's content contains "Running the test suite is not this"
62
67
  And the resting step's content contains "against the user's real data or this working tree"
63
68
  And the resting step's content contains "`## AC-<n>: pass`"
@@ -79,7 +84,7 @@ Feature: every criterion is tested by hand before the quality lap
79
84
  Then the process rests at "build.quality.correctness.reviewing"
80
85
  And the commit subjects end with:
81
86
  """
82
- gtd(judge): implement.coverage → implement.prototype.testing
87
+ gtd(judge): implement.prototype.observable → implement.prototype.testing
83
88
  gtd(agent): implement.prototype.testing → implement.closing
84
89
  gtd(check): implement.closing → build.quality.correctness.reviewing
85
90
  """
@@ -121,7 +126,7 @@ Feature: every criterion is tested by hand before the quality lap
121
126
  Then the process rests at "build.quality.correctness.reviewing"
122
127
  And the commit subjects end with:
123
128
  """
124
- gtd(judge): implement.coverage → implement.prototype.testing
129
+ gtd(judge): implement.prototype.observable → implement.prototype.testing
125
130
  gtd(agent): implement.prototype.testing → implement.prototype.fix.fixing
126
131
  gtd(agent): implement.prototype.fix.fixing → implement.prototype.health.check
127
132
  gtd(check): implement.prototype.health.check → implement.prototype.testing
@@ -235,6 +240,10 @@ Feature: every criterion is tested by hand before the quality lap
235
240
  """
236
241
  # Requirements
237
242
 
243
+ ## Impact
244
+
245
+ - the greeting module
246
+
238
247
  ## Acceptance Criteria
239
248
 
240
249
  - AC-2: add is unchanged.