@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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +46 -40
- package/dist/chunks/{reserved-CUkk9XgL.mjs → reserved-DxB5CROj.mjs} +73 -38
- package/dist/chunks/{review-BaCXlIT2.mjs → review-CKMSdvgW.mjs} +11 -9
- package/dist/chunks/{steering-DtUVUz9l.mjs → steering-CLhu8C7q.mjs} +262 -52
- package/dist/chunks/{tail-CX6Pdsql.mjs → tail-QZc7Uz2U.mjs} +1 -1
- package/dist/gtd.bundle.mjs +198 -43
- package/dist/steering.mjs +2 -2
- package/dist/testkit.mjs +1 -1
- package/dist/web/main.css +1 -1
- package/dist/web/main.js +510 -147
- package/dist/workflow-kit.mjs +1 -1
- package/dist/workflows/cleanup.mjs +2 -2
- package/dist/workflows/feature.mjs +228 -222
- package/dist/workflows/fix.mjs +3 -3
- package/dist/workflows/review.mjs +3 -3
- package/dist/workflows/rollout.mjs +1 -1
- package/dist/workflows.mjs +570 -317
- package/package.json +5 -4
- package/src/steering/FORMATS.md +4 -1
- package/src/steering/SteeringFormat.ts +7 -1
- package/src/steering/contract.test.ts +2 -1
- package/src/steering/fixtures/review/sectioned.md +31 -0
- package/src/steering/fixtures/review/sectioned.read.json +119 -0
- package/src/steering/index.ts +4 -0
- package/src/steering/qa.ts +1 -1
- package/src/steering/review.test.ts +270 -4
- package/src/steering/review.ts +328 -69
- package/src/testkit/steps.ts +13 -0
- package/src/workflows/feature/acceptance-criteria.feature +159 -3
- package/src/workflows/feature/continuation-cap.feature +4 -0
- package/src/workflows/feature/continuation-rebuild.feature +4 -0
- package/src/workflows/feature/continuation-slices.feature +4 -0
- package/src/workflows/feature/continuation.feature +4 -0
- package/src/workflows/feature/criteria.test.ts +60 -1
- package/src/workflows/feature/criteria.ts +87 -8
- package/src/workflows/feature/fast-path.feature +5 -6
- package/src/workflows/feature/feature.test.ts +6 -5
- package/src/workflows/feature/feature.ts +1 -2
- package/src/workflows/feature/flag-mode.feature +5 -6
- package/src/workflows/feature/green.ts +22 -0
- package/src/workflows/feature/hands-on-skip.feature +384 -0
- package/src/workflows/feature/lens-models.feature +4 -4
- package/src/workflows/feature/lens-review.feature +10 -8
- package/src/workflows/feature/naive-acceptance.feature +4 -0
- package/src/workflows/feature/one-step-land.feature +5 -6
- package/src/workflows/feature/planning.ts +2 -1
- package/src/workflows/feature/prototype-rounds.feature +5 -1
- package/src/workflows/feature/prototype.feature +18 -9
- package/src/workflows/feature/prototype.ts +48 -17
- package/src/workflows/feature/refactor-absorbs.feature +7 -8
- package/src/workflows/feature/refactor-first.feature +7 -8
- package/src/workflows/feature/refactor-lens-models.feature +4 -0
- package/src/workflows/feature/refactor-rebuild.feature +11 -12
- package/src/workflows/feature/refactor-review.feature +72 -72
- package/src/workflows/feature/review-answers.feature +94 -5
- package/src/workflows/feature/review-gate.feature +23 -53
- package/src/workflows/feature/reviewer-walkthrough.feature +33 -12
- package/src/workflows/feature/risk-tier.feature +32 -0
- package/src/workflows/feature/seam-rejection.feature +9 -6
- package/src/workflows/feature/seam.feature +9 -6
- package/src/workflows/feature/seam.test.ts +5 -3
- package/src/workflows/feature/seam.ts +2 -3
- package/src/workflows/feature/severity-budget.feature +11 -7
- package/src/workflows/feature/severity-sorted-review.feature +54 -54
- package/src/workflows/feature/slice-findings.feature +9 -15
- package/src/workflows/feature/slicing.feature +36 -24
- package/src/workflows/feature/standards.feature +4 -4
- package/src/workflows/feature/tier-pin.feature +4 -0
- package/src/workflows/shared/review.ts +26 -6
- package/src/workflows/shared/text.test.ts +85 -11
- package/src/workflows/shared/text.ts +95 -42
- package/src/workflows/feature/coverage.feature +0 -165
- 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
|
-
##
|
|
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
|
-
##
|
|
134
|
+
## Walkthrough
|
|
133
135
|
|
|
134
|
-
|
|
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
|
-
|
|
240
|
+
### add could be a method
|
|
239
241
|
|
|
240
242
|
_critical: judge unsure_
|
|
241
243
|
|
|
@@ -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.
|
|
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.
|
|
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
|
|
5
|
-
a person
|
|
6
|
-
|
|
7
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|