@pmelab/gtd 55.0.0 → 56.0.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 +60 -61
- package/dist/chunks/{reserved-DHafcW7t.mjs → reserved-B8EC-WE8.mjs} +77 -203
- package/dist/chunks/{review-BJGKwlYv.mjs → review-HdrX0FJ7.mjs} +30 -125
- package/dist/chunks/{steering-CLhu8C7q.mjs → steering-CCNvngSH.mjs} +256 -65
- package/dist/chunks/{tail-B9Hw2AFB.mjs → tail-BSLah2mA.mjs} +144 -56
- package/dist/gtd.bundle.mjs +259 -22
- package/dist/steering.mjs +2 -2
- package/dist/testkit.mjs +6 -6
- package/dist/web/main.css +1 -1
- package/dist/web/main.js +551 -66
- package/dist/workflow-kit.mjs +1 -1
- package/dist/workflows/cleanup.mjs +2 -2
- package/dist/workflows/feature.mjs +14 -16
- 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 +522 -453
- package/package.json +1 -1
- package/skills/authoring/SKILL.md +3 -3
- package/src/cli/Cli.ts +5 -5
- package/src/edge/Edge.test.ts +1 -1
- package/src/steering/FORMATS.md +5 -1
- package/src/steering/SteeringFormats.test.ts +2 -2
- package/src/steering/contract.test.ts +1 -0
- package/src/steering/findings.test.ts +47 -0
- package/src/steering/findings.ts +350 -0
- package/src/steering/fixtures/findings/gate.md +34 -0
- package/src/steering/fixtures/findings/gate.read.json +87 -0
- package/src/steering/index.test.ts +2 -2
- package/src/steering/index.ts +4 -3
- package/src/steering/review.test.ts +1 -75
- package/src/steering/review.ts +1 -74
- package/src/workflow/compile.test.ts +1 -0
- package/src/workflows/feature/criteria-coverage.feature +1 -6
- package/src/workflows/feature/feature.test.ts +1 -1
- package/src/workflows/feature/feature.ts +12 -20
- package/src/workflows/feature/lens-review.feature +323 -171
- package/src/workflows/feature/refactor-absorbs.feature +1 -7
- package/src/workflows/feature/refactor-first.feature +2 -10
- package/src/workflows/feature/refactor-rebuild.feature +4 -24
- package/src/workflows/feature/refactor-review.feature +33 -117
- package/src/workflows/feature/refactor.test.ts +0 -2
- package/src/workflows/feature/refactor.ts +0 -1
- package/src/workflows/feature/review-gate.feature +6 -22
- package/src/workflows/feature/reviewer-walkthrough.feature +16 -103
- package/src/workflows/feature/standards.feature +75 -34
- package/src/workflows/fix/fix-lens-origin.feature +20 -7
- package/src/workflows/fix/fix-quality.feature +102 -23
- package/src/workflows/review/review-door.feature +62 -59
- package/src/workflows/shared/learn.test.ts +0 -14
- package/src/workflows/shared/learn.ts +1 -6
- package/src/workflows/shared/lenses.ts +149 -43
- package/src/workflows/shared/review.test.ts +27 -26
- package/src/workflows/shared/review.ts +29 -196
- package/src/workflows/shared/tail.ts +18 -9
- package/src/workflows/shared/text.test.ts +103 -288
- package/src/workflows/shared/text.ts +131 -329
- package/src/workflows/feature/review-answers.feature +0 -324
- package/src/workflows/feature/severity-budget.feature +0 -116
- package/src/workflows/feature/severity-sorted-review.feature +0 -198
|
@@ -1,324 +0,0 @@
|
|
|
1
|
-
@inmem
|
|
2
|
-
Feature: every note in the review is answered with one tick
|
|
3
|
-
|
|
4
|
-
Each quality note in `.gtd/REVIEW.md` ends in three boxes — fix as
|
|
5
|
-
suggested, won't fix, or the human's own answer written over the
|
|
6
|
-
placeholder. The gate refuses to land until every note holds exactly one
|
|
7
|
-
tick. A fix goes to the nit batch, a won't-fix is dropped and recorded in
|
|
8
|
-
the gate's commit, an own answer is judged like any other note. Nothing is
|
|
9
|
-
deferred to `.gtd/TODO.md`.
|
|
10
|
-
|
|
11
|
-
Background:
|
|
12
|
-
Given the shipped workflows, as gtd install scaffolds them
|
|
13
|
-
And an environment variable "GTD_PROTOTYPEROUNDS" set to "0"
|
|
14
|
-
And an environment variable "GTD_QUALITYREVIEWS" set to "correctness"
|
|
15
|
-
And an environment variable "GTD_FLAGMODE" set to "false"
|
|
16
|
-
And a file "src/calc.ts" with:
|
|
17
|
-
"""
|
|
18
|
-
export const add = (a: number, b: number) => a + b
|
|
19
|
-
"""
|
|
20
|
-
And the working tree is committed as "feat: add calculator"
|
|
21
|
-
And a file "TODO.md" with:
|
|
22
|
-
"""
|
|
23
|
-
# Add subtract
|
|
24
|
-
|
|
25
|
-
subtract(a, b) returns the difference.
|
|
26
|
-
"""
|
|
27
|
-
And step "unwind" changes nothing
|
|
28
|
-
And step "start-gate.check" changes nothing
|
|
29
|
-
And step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
|
|
30
|
-
"""
|
|
31
|
-
# Requirements
|
|
32
|
-
|
|
33
|
-
## Concerns
|
|
34
|
-
|
|
35
|
-
### Subtract
|
|
36
|
-
|
|
37
|
-
- `subtract(a, b)` returns `a - b`.
|
|
38
|
-
|
|
39
|
-
## Impact
|
|
40
|
-
|
|
41
|
-
- the greeting module
|
|
42
|
-
|
|
43
|
-
## Acceptance Criteria
|
|
44
|
-
|
|
45
|
-
- AC-1: subtract(a, b) returns a - b.
|
|
46
|
-
"""
|
|
47
|
-
And step "design.gate.answer" changes nothing
|
|
48
|
-
And step "seam.naive" writes "src/calc.test.ts" with:
|
|
49
|
-
"""
|
|
50
|
-
it("[AC-1] subtracts", () => {})
|
|
51
|
-
"""
|
|
52
|
-
And step "seam.naive" writes "src/calc.ts" with:
|
|
53
|
-
"""
|
|
54
|
-
export const add = (a: number, b: number) => a + b
|
|
55
|
-
export const subtract = (a: number, b: number) => a - b
|
|
56
|
-
"""
|
|
57
|
-
And step "seam.check" changes nothing
|
|
58
|
-
And step "implement.applying" runs its script
|
|
59
|
-
And step "implement.health.check" changes nothing
|
|
60
|
-
And step "implement.closing" runs its script
|
|
61
|
-
And step "build.quality.correctness.reviewing" writes ".gtd/QUALITY.md" with:
|
|
62
|
-
"""
|
|
63
|
-
# Quality
|
|
64
|
-
|
|
65
|
-
## subtract has no negative test
|
|
66
|
-
|
|
67
|
-
Add a test subtracting a larger number.
|
|
68
|
-
|
|
69
|
-
## add could be a method
|
|
70
|
-
|
|
71
|
-
A class would read better.
|
|
72
|
-
|
|
73
|
-
## AC-1 ignores floating point
|
|
74
|
-
|
|
75
|
-
Should subtract round? The criterion does not say.
|
|
76
|
-
"""
|
|
77
|
-
And step "build.quality.sorting" runs its script
|
|
78
|
-
And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
79
|
-
"""
|
|
80
|
-
# Review: abc1234
|
|
81
|
-
|
|
82
|
-
<!-- base: 0000000 -->
|
|
83
|
-
|
|
84
|
-
## Subtract
|
|
85
|
-
|
|
86
|
-
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
87
|
-
"""
|
|
88
|
-
And step "build.review.reviewing", when prompted with "- `## AC-1 ignores floating point`", writes ".gtd/REVIEW.md" with:
|
|
89
|
-
"""
|
|
90
|
-
# Review: abc1234
|
|
91
|
-
|
|
92
|
-
<!-- base: 0000000 -->
|
|
93
|
-
|
|
94
|
-
## Subtract
|
|
95
|
-
|
|
96
|
-
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
97
|
-
|
|
98
|
-
## AC-1 ignores floating point
|
|
99
|
-
|
|
100
|
-
- [ ] ./src/calc.ts#2-2 — returns the raw difference
|
|
101
|
-
"""
|
|
102
|
-
And step "build.review.reviewing", when prompted with "worked on the human's nits", writes ".gtd/REVIEW.md" with:
|
|
103
|
-
"""
|
|
104
|
-
# Review: abc1234
|
|
105
|
-
|
|
106
|
-
<!-- base: 0000000 -->
|
|
107
|
-
|
|
108
|
-
## Subtract
|
|
109
|
-
|
|
110
|
-
- [ ] ./src/calc.ts#2-2 — now rounds the difference
|
|
111
|
-
"""
|
|
112
|
-
And step "build.review.carrying" runs its script
|
|
113
|
-
And judge step "build.review.ranking" answers:
|
|
114
|
-
"""
|
|
115
|
-
[]
|
|
116
|
-
"""
|
|
117
|
-
And judge step "build.quality.triage" answers:
|
|
118
|
-
"""
|
|
119
|
-
[{"id":"Q1","answer":"noise","p":0.9},{"id":"Q2","answer":"noise","p":0.9},{"id":"Q3","answer":"design","p":0.9}]
|
|
120
|
-
"""
|
|
121
|
-
And step "build.review.closing" runs its script
|
|
122
|
-
|
|
123
|
-
Scenario: the note ends in its three answer boxes
|
|
124
|
-
When the process is driven
|
|
125
|
-
Then the process rests at "build.review.await-review"
|
|
126
|
-
And ".gtd/REVIEW.md" contains:
|
|
127
|
-
"""
|
|
128
|
-
## Findings
|
|
129
|
-
|
|
130
|
-
### AC-1 ignores floating point
|
|
131
|
-
|
|
132
|
-
_critical: judge unsure_
|
|
133
|
-
|
|
134
|
-
Should subtract round? The criterion does not say.
|
|
135
|
-
|
|
136
|
-
In the code:
|
|
137
|
-
|
|
138
|
-
- [ ] ./src/calc.ts#2-2 — returns the raw difference
|
|
139
|
-
|
|
140
|
-
Tick exactly one:
|
|
141
|
-
|
|
142
|
-
- [ ] fix as suggested
|
|
143
|
-
- [ ] won't fix
|
|
144
|
-
- [ ] _your answer_
|
|
145
|
-
"""
|
|
146
|
-
|
|
147
|
-
Scenario: a sign-off with the note unanswered is refused
|
|
148
|
-
When the process is driven
|
|
149
|
-
Then landing is refused with "answer-completeness: 1 note(s) in .gtd/REVIEW.md not answered"
|
|
150
|
-
And the process rests at "build.review.await-review"
|
|
151
|
-
|
|
152
|
-
Scenario: two ticks on one note are refused
|
|
153
|
-
When the process is driven
|
|
154
|
-
And the text "- [ ] fix as suggested" in ".gtd/REVIEW.md" is replaced with "- [x] fix as suggested"
|
|
155
|
-
And the text "- [ ] won't fix" in ".gtd/REVIEW.md" is replaced with "- [x] won't fix"
|
|
156
|
-
Then landing is refused with "tick exactly one box per note"
|
|
157
|
-
|
|
158
|
-
Scenario: a ticked answer still holding the placeholder is refused
|
|
159
|
-
When the process is driven
|
|
160
|
-
And the text "- [ ] _your answer_" in ".gtd/REVIEW.md" is replaced with "- [x] _your answer_"
|
|
161
|
-
Then landing is refused with "answer-completeness"
|
|
162
|
-
|
|
163
|
-
Scenario: won't fix drops the note, records it, and signs off
|
|
164
|
-
Given judge step "build.review.standards.judge" answers:
|
|
165
|
-
"""
|
|
166
|
-
[{"id":"standard-1","answer":"no","p":0.9}]
|
|
167
|
-
"""
|
|
168
|
-
When the process is driven
|
|
169
|
-
And the text "- [ ] won't fix" in ".gtd/REVIEW.md" is replaced with "- [x] won't fix"
|
|
170
|
-
And gtd lands
|
|
171
|
-
And the process is driven
|
|
172
|
-
Then the process rests at "idle"
|
|
173
|
-
And the commit "gtd(human): build.review.await-review → build.review.standards.judge" has a body containing "Gtd-Mark: wontfix=AC-1 ignores floating point"
|
|
174
|
-
And ".gtd/TODO.md" does not exist
|
|
175
|
-
And no commit body contains "build.review.triage"
|
|
176
|
-
|
|
177
|
-
Scenario: fix as suggested goes to the nit batch unjudged, and the note is not asked again
|
|
178
|
-
Given step "build.review.fix.nits.fixing" writes "src/calc.ts" with:
|
|
179
|
-
"""
|
|
180
|
-
export const add = (a: number, b: number) => a + b
|
|
181
|
-
export const subtract = (a: number, b: number) => Math.round(a - b)
|
|
182
|
-
"""
|
|
183
|
-
And step "build.review.fix.nits.fixing" is prompted with "Should subtract round?"
|
|
184
|
-
And step "build.health.check" changes nothing
|
|
185
|
-
When the process is driven
|
|
186
|
-
And the text "- [ ] fix as suggested" in ".gtd/REVIEW.md" is replaced with "- [x] fix as suggested"
|
|
187
|
-
And gtd lands
|
|
188
|
-
And the process is driven
|
|
189
|
-
Then the process rests at "build.review.await-review"
|
|
190
|
-
And no commit body contains "build.review.triage"
|
|
191
|
-
And ".gtd/REVIEW.md" contains "now rounds the difference"
|
|
192
|
-
And ".gtd/REVIEW.md" does not contain "AC-1 ignores floating point"
|
|
193
|
-
And ".gtd/TODO.md" does not exist
|
|
194
|
-
When gtd lands
|
|
195
|
-
And the process is driven
|
|
196
|
-
Then the process rests at "idle"
|
|
197
|
-
|
|
198
|
-
Scenario: an own answer is judged like a note
|
|
199
|
-
Given judge step "build.review.standards.judge" answers:
|
|
200
|
-
"""
|
|
201
|
-
[{"id":"standard-1","answer":"no","p":0.9}]
|
|
202
|
-
"""
|
|
203
|
-
And judge step "build.review.triage" answers:
|
|
204
|
-
"""
|
|
205
|
-
[{"id":"answer-1","answer":"nit","p":0.9}]
|
|
206
|
-
"""
|
|
207
|
-
And step "build.review.fix.nits.fixing" is prompted with "round half up"
|
|
208
|
-
And step "build.health.check" changes nothing
|
|
209
|
-
And step "build.review.fix.nits.fixing" writes "src/calc.ts" with:
|
|
210
|
-
"""
|
|
211
|
-
export const add = (a: number, b: number) => a + b
|
|
212
|
-
export const subtract = (a: number, b: number) => Math.round(a - b)
|
|
213
|
-
"""
|
|
214
|
-
When the process is driven
|
|
215
|
-
And the text "- [ ] _your answer_" in ".gtd/REVIEW.md" is replaced with "- [x] round half up"
|
|
216
|
-
And gtd lands
|
|
217
|
-
And the process is driven
|
|
218
|
-
Then the process rests at "build.review.await-review"
|
|
219
|
-
And the commit subjects end with:
|
|
220
|
-
"""
|
|
221
|
-
gtd(human): build.review.await-review → build.review.standards.judge
|
|
222
|
-
gtd(judge): build.review.standards.judge → build.review.triage
|
|
223
|
-
gtd(judge): build.review.triage → build.review.fix.nits.fixing
|
|
224
|
-
gtd(agent): build.review.fix.nits.fixing → build.health.check
|
|
225
|
-
gtd(check): build.health.check → build.review.closing
|
|
226
|
-
gtd(check): build.review.closing → build.review.reviewing
|
|
227
|
-
gtd(agent): build.review.reviewing → build.review.ranking
|
|
228
|
-
gtd(judge): build.review.ranking → build.review.carrying
|
|
229
|
-
gtd(check): build.review.carrying → build.review.await-review
|
|
230
|
-
"""
|
|
231
|
-
And ".gtd/REVIEW.md" does not contain "AC-1 ignores floating point"
|
|
232
|
-
|
|
233
|
-
Scenario: deleting a note's boxes instead of answering is refused
|
|
234
|
-
When the process is driven
|
|
235
|
-
And the text "- [ ] fix as suggested" in ".gtd/REVIEW.md" is replaced with ""
|
|
236
|
-
And the text "Tick exactly one:" in ".gtd/REVIEW.md" is replaced with ""
|
|
237
|
-
Then landing is refused with "its answer boxes were deleted"
|
|
238
|
-
|
|
239
|
-
Scenario: a review still in the flat layout, every chunk a `## `, is answered by its ticks
|
|
240
|
-
Given judge step "build.review.standards.judge" answers:
|
|
241
|
-
"""
|
|
242
|
-
[{"id":"standard-1","answer":"no","p":0.9}]
|
|
243
|
-
"""
|
|
244
|
-
When the process is driven
|
|
245
|
-
Then the process rests at "build.review.await-review"
|
|
246
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
247
|
-
"""
|
|
248
|
-
# Review: abc1234
|
|
249
|
-
|
|
250
|
-
<!-- base: 0000000 -->
|
|
251
|
-
|
|
252
|
-
## AC-1 ignores floating point
|
|
253
|
-
|
|
254
|
-
_critical: judge unsure_
|
|
255
|
-
|
|
256
|
-
Should subtract round? The criterion does not say.
|
|
257
|
-
|
|
258
|
-
In the code:
|
|
259
|
-
|
|
260
|
-
- [ ] ./src/calc.ts#2-2 — returns the raw difference
|
|
261
|
-
|
|
262
|
-
Tick exactly one:
|
|
263
|
-
|
|
264
|
-
- [ ] fix as suggested
|
|
265
|
-
- [x] won't fix
|
|
266
|
-
- [ ] _your answer_
|
|
267
|
-
|
|
268
|
-
## Subtract
|
|
269
|
-
|
|
270
|
-
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
271
|
-
"""
|
|
272
|
-
When gtd lands
|
|
273
|
-
And the process is driven
|
|
274
|
-
Then the process rests at "idle"
|
|
275
|
-
And the commit "gtd(human): build.review.await-review → build.review.standards.judge" has a body containing "Gtd-Mark: wontfix=AC-1 ignores floating point"
|
|
276
|
-
And no commit body contains "build.review.triage"
|
|
277
|
-
|
|
278
|
-
Scenario: boxes ticked in the walkthrough answer nothing
|
|
279
|
-
Given judge step "build.review.standards.judge" answers:
|
|
280
|
-
"""
|
|
281
|
-
[{"id":"standard-1","answer":"no","p":0.9}]
|
|
282
|
-
"""
|
|
283
|
-
When the process is driven
|
|
284
|
-
Then the process rests at "build.review.await-review"
|
|
285
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
286
|
-
"""
|
|
287
|
-
# Review: abc1234
|
|
288
|
-
|
|
289
|
-
<!-- base: 0000000 -->
|
|
290
|
-
|
|
291
|
-
## Findings
|
|
292
|
-
|
|
293
|
-
### AC-1 ignores floating point
|
|
294
|
-
|
|
295
|
-
_critical: judge unsure_
|
|
296
|
-
|
|
297
|
-
Should subtract round? The criterion does not say.
|
|
298
|
-
|
|
299
|
-
In the code:
|
|
300
|
-
|
|
301
|
-
- [ ] ./src/calc.ts#2-2 — returns the raw difference
|
|
302
|
-
|
|
303
|
-
Tick exactly one:
|
|
304
|
-
|
|
305
|
-
- [ ] fix as suggested
|
|
306
|
-
- [x] won't fix
|
|
307
|
-
- [ ] _your answer_
|
|
308
|
-
|
|
309
|
-
## Walkthrough
|
|
310
|
-
|
|
311
|
-
### Subtract
|
|
312
|
-
|
|
313
|
-
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
314
|
-
|
|
315
|
-
Tick exactly one:
|
|
316
|
-
|
|
317
|
-
- [x] fix as suggested
|
|
318
|
-
- [ ] won't fix
|
|
319
|
-
- [ ] _your answer_
|
|
320
|
-
"""
|
|
321
|
-
When gtd lands
|
|
322
|
-
And the process is driven
|
|
323
|
-
Then the process rests at "idle"
|
|
324
|
-
And no commit body contains "build.review.fix.nits.fixing"
|
|
@@ -1,116 +0,0 @@
|
|
|
1
|
-
@inmem
|
|
2
|
-
Feature: the review's ranking is batched to the judge's budget
|
|
3
|
-
|
|
4
|
-
`build.review.ranking` puts as many chunks in one judgment as the budget's
|
|
5
|
-
even share still holds whole; the rest go to the next. A chunk too big to
|
|
6
|
-
fit even alone is cut, and a cut chunk is critical.
|
|
7
|
-
|
|
8
|
-
Background:
|
|
9
|
-
Given the shipped workflows, as gtd install scaffolds them
|
|
10
|
-
And an environment variable "GTD_PROTOTYPEROUNDS" set to "0"
|
|
11
|
-
And an environment variable "GTD_QUALITYREVIEWS" set to "correctness"
|
|
12
|
-
And an environment variable "GTD_FLAGMODE" set to "false"
|
|
13
|
-
And an environment variable "GTD_JUDGEBUDGETBYTES" set to "150"
|
|
14
|
-
And a file "src/calc.ts" with:
|
|
15
|
-
"""
|
|
16
|
-
export const add = (a: number, b: number) => a + b
|
|
17
|
-
"""
|
|
18
|
-
And the working tree is committed as "feat: add calculator"
|
|
19
|
-
And a file "TODO.md" with:
|
|
20
|
-
"""
|
|
21
|
-
# Add subtract
|
|
22
|
-
|
|
23
|
-
subtract(a, b) returns the difference.
|
|
24
|
-
"""
|
|
25
|
-
And step "unwind" changes nothing
|
|
26
|
-
And step "start-gate.check" changes nothing
|
|
27
|
-
And step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
|
|
28
|
-
"""
|
|
29
|
-
# Requirements
|
|
30
|
-
|
|
31
|
-
## Impact
|
|
32
|
-
|
|
33
|
-
- the greeting module
|
|
34
|
-
|
|
35
|
-
## Acceptance Criteria
|
|
36
|
-
|
|
37
|
-
- AC-1: subtract(a, b) returns a - b.
|
|
38
|
-
"""
|
|
39
|
-
And step "design.gate.answer" changes nothing
|
|
40
|
-
And step "seam.naive" writes "src/calc.test.ts" with:
|
|
41
|
-
"""
|
|
42
|
-
it("[AC-1] subtracts", () => {})
|
|
43
|
-
"""
|
|
44
|
-
And step "seam.naive" writes "src/calc.ts" with:
|
|
45
|
-
"""
|
|
46
|
-
export const add = (a: number, b: number) => a + b
|
|
47
|
-
export const subtract = (a: number, b: number) => a - b
|
|
48
|
-
"""
|
|
49
|
-
And step "seam.check" changes nothing
|
|
50
|
-
And step "implement.applying" runs its script
|
|
51
|
-
And step "implement.health.check" changes nothing
|
|
52
|
-
And step "implement.closing" runs its script
|
|
53
|
-
And step "build.quality.correctness.reviewing" writes ".gtd/QUALITY.md" with:
|
|
54
|
-
"""
|
|
55
|
-
# Quality
|
|
56
|
-
|
|
57
|
-
## AC-1 ignores floating point
|
|
58
|
-
|
|
59
|
-
Should subtract round? The criterion does not say.
|
|
60
|
-
"""
|
|
61
|
-
And judge step "build.quality.triage" answers:
|
|
62
|
-
"""
|
|
63
|
-
[{"id":"Q1","answer":"design","p":0.9}]
|
|
64
|
-
"""
|
|
65
|
-
And step "build.quality.sorting" runs its script
|
|
66
|
-
And step "build.quality.closing" runs its script
|
|
67
|
-
And step "build.review.carrying" runs its script
|
|
68
|
-
|
|
69
|
-
Scenario: a chunk the budget cuts is listed as critical, the others judged in batches of their own
|
|
70
|
-
Given step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
71
|
-
"""
|
|
72
|
-
# Review: abc1234
|
|
73
|
-
|
|
74
|
-
<!-- base: 0000000 -->
|
|
75
|
-
|
|
76
|
-
## Subtract
|
|
77
|
-
|
|
78
|
-
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
79
|
-
|
|
80
|
-
## AC-1 ignores floating point
|
|
81
|
-
|
|
82
|
-
- [ ] ./src/calc.ts#2-2 — returns the raw difference
|
|
83
|
-
"""
|
|
84
|
-
And judge step "build.review.ranking", when its questions contain "C1.security", answers:
|
|
85
|
-
"""
|
|
86
|
-
[{"id":"C1.security","answer":"no","p":0.9},{"id":"C1.reversibility","answer":"two-way","p":0.9},{"id":"C1.blastRadius","answer":"local","p":0.9},{"id":"C1.newConcept","answer":"no","p":0.9}]
|
|
87
|
-
"""
|
|
88
|
-
And judge step "build.review.ranking", when its questions contain "C2.security", answers:
|
|
89
|
-
"""
|
|
90
|
-
[{"id":"C2.security","answer":"no","p":0.9},{"id":"C2.reversibility","answer":"two-way","p":0.9},{"id":"C2.blastRadius","answer":"local","p":0.9},{"id":"C2.newConcept","answer":"no","p":0.9}]
|
|
91
|
-
"""
|
|
92
|
-
When the process is driven
|
|
93
|
-
Then the process rests at "build.review.await-review"
|
|
94
|
-
And ".gtd/REVIEW.md" contains:
|
|
95
|
-
"""
|
|
96
|
-
## Findings
|
|
97
|
-
|
|
98
|
-
### AC-1 ignores floating point
|
|
99
|
-
|
|
100
|
-
_critical: judge unsure_
|
|
101
|
-
"""
|
|
102
|
-
And ".gtd/REVIEW.md" contains:
|
|
103
|
-
"""
|
|
104
|
-
## Walkthrough
|
|
105
|
-
|
|
106
|
-
### Subtract
|
|
107
|
-
|
|
108
|
-
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
109
|
-
"""
|
|
110
|
-
And the commit subjects end with:
|
|
111
|
-
"""
|
|
112
|
-
gtd(agent): build.review.reviewing → build.review.ranking
|
|
113
|
-
gtd(judge): build.review.ranking
|
|
114
|
-
gtd(judge): build.review.ranking → build.review.carrying
|
|
115
|
-
gtd(check): build.review.carrying → build.review.await-review
|
|
116
|
-
"""
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
@inmem
|
|
2
|
-
Feature: the final review lists the findings that matter most first
|
|
3
|
-
|
|
4
|
-
Before the review rests, the judge rates every chunk the reviewer wrote on
|
|
5
|
-
the same four questions as a human's note (`build.review.ranking`): critical
|
|
6
|
-
(security, or a one-way door), should (a contract, or a new concept), could.
|
|
7
|
-
The quality findings go under `## Findings` in that order, security before
|
|
8
|
-
one-way doors, each led by its tier and reason; a finding the judge cannot
|
|
9
|
-
rate is critical. The walkthrough goes under `## Walkthrough` in the
|
|
10
|
-
reviewer's order, with no tier.
|
|
11
|
-
|
|
12
|
-
Background:
|
|
13
|
-
Given the shipped workflows, as gtd install scaffolds them
|
|
14
|
-
And an environment variable "GTD_PROTOTYPEROUNDS" set to "0"
|
|
15
|
-
And an environment variable "GTD_QUALITYREVIEWS" set to "correctness"
|
|
16
|
-
And an environment variable "GTD_FLAGMODE" set to "false"
|
|
17
|
-
And a file "src/calc.ts" with:
|
|
18
|
-
"""
|
|
19
|
-
export const add = (a: number, b: number) => a + b
|
|
20
|
-
"""
|
|
21
|
-
And the working tree is committed as "feat: add calculator"
|
|
22
|
-
And a file "TODO.md" with:
|
|
23
|
-
"""
|
|
24
|
-
# Add subtract
|
|
25
|
-
|
|
26
|
-
subtract(a, b) returns the difference.
|
|
27
|
-
"""
|
|
28
|
-
And step "unwind" changes nothing
|
|
29
|
-
And step "start-gate.check" changes nothing
|
|
30
|
-
And step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
|
|
31
|
-
"""
|
|
32
|
-
# Requirements
|
|
33
|
-
|
|
34
|
-
## Impact
|
|
35
|
-
|
|
36
|
-
- the greeting module
|
|
37
|
-
|
|
38
|
-
## Acceptance Criteria
|
|
39
|
-
|
|
40
|
-
- AC-1: subtract(a, b) returns a - b.
|
|
41
|
-
"""
|
|
42
|
-
And step "design.gate.answer" changes nothing
|
|
43
|
-
And step "seam.naive" writes "src/calc.test.ts" with:
|
|
44
|
-
"""
|
|
45
|
-
it("[AC-1] subtracts", () => {})
|
|
46
|
-
"""
|
|
47
|
-
And step "seam.naive" writes "src/calc.ts" with:
|
|
48
|
-
"""
|
|
49
|
-
export const add = (a: number, b: number) => a + b
|
|
50
|
-
export const subtract = (a: number, b: number) => a - b
|
|
51
|
-
"""
|
|
52
|
-
And step "seam.check" changes nothing
|
|
53
|
-
And step "implement.applying" runs its script
|
|
54
|
-
And step "implement.health.check" changes nothing
|
|
55
|
-
And step "implement.closing" runs its script
|
|
56
|
-
And step "build.quality.correctness.reviewing" writes ".gtd/QUALITY.md" with:
|
|
57
|
-
"""
|
|
58
|
-
# Quality
|
|
59
|
-
|
|
60
|
-
## AC-1 ignores floating point
|
|
61
|
-
|
|
62
|
-
Should subtract round? The criterion does not say.
|
|
63
|
-
|
|
64
|
-
## Token in logs
|
|
65
|
-
|
|
66
|
-
The caller's token reaches the log.
|
|
67
|
-
"""
|
|
68
|
-
And judge step "build.quality.triage" answers:
|
|
69
|
-
"""
|
|
70
|
-
[{"id":"Q1","answer":"design","p":0.9},{"id":"Q2","answer":"design","p":0.9}]
|
|
71
|
-
"""
|
|
72
|
-
And step "build.quality.sorting" runs its script
|
|
73
|
-
And step "build.quality.closing" runs its script
|
|
74
|
-
And step "build.review.carrying" runs its script
|
|
75
|
-
|
|
76
|
-
Scenario: findings are sorted by tier, the walkthrough kept in the reviewer's order
|
|
77
|
-
Given step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
78
|
-
"""
|
|
79
|
-
# Review: abc1234
|
|
80
|
-
|
|
81
|
-
<!-- base: 0000000 -->
|
|
82
|
-
|
|
83
|
-
## Subtract
|
|
84
|
-
|
|
85
|
-
The new export.
|
|
86
|
-
|
|
87
|
-
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
88
|
-
|
|
89
|
-
## AC-1 ignores floating point
|
|
90
|
-
|
|
91
|
-
- [ ] ./src/calc.ts#2-2 — returns the raw difference
|
|
92
|
-
|
|
93
|
-
## Session token
|
|
94
|
-
|
|
95
|
-
- [ ] ./src/calc.ts#1-1 — reads the caller's token
|
|
96
|
-
|
|
97
|
-
## Token in logs
|
|
98
|
-
|
|
99
|
-
- [ ] ./src/calc.ts#1-1 — where it is logged
|
|
100
|
-
"""
|
|
101
|
-
And judge step "build.review.ranking" answers:
|
|
102
|
-
"""
|
|
103
|
-
[{"id":"C1.security","answer":"no","p":0.9},{"id":"C1.reversibility","answer":"two-way","p":0.9},{"id":"C1.blastRadius","answer":"local","p":0.9},{"id":"C1.newConcept","answer":"no","p":0.9},{"id":"C2.security","answer":"no","p":0.9},{"id":"C2.reversibility","answer":"two-way","p":0.9},{"id":"C2.blastRadius","answer":"contract","p":0.9},{"id":"C2.newConcept","answer":"no","p":0.9},{"id":"C3.security","answer":"yes","p":0.9},{"id":"C3.reversibility","answer":"two-way","p":0.9},{"id":"C3.blastRadius","answer":"module","p":0.9},{"id":"C3.newConcept","answer":"no","p":0.9},{"id":"C4.security","answer":"no","p":0.9},{"id":"C4.reversibility","answer":"one-way","p":0.9},{"id":"C4.blastRadius","answer":"contract","p":0.9},{"id":"C4.newConcept","answer":"no","p":0.9}]
|
|
104
|
-
"""
|
|
105
|
-
When the process is driven
|
|
106
|
-
Then the process rests at "build.review.await-review"
|
|
107
|
-
And ".gtd/REVIEW.md" contains:
|
|
108
|
-
"""
|
|
109
|
-
<!-- base: 0000000 -->
|
|
110
|
-
|
|
111
|
-
## Findings
|
|
112
|
-
|
|
113
|
-
### Token in logs
|
|
114
|
-
|
|
115
|
-
_critical: one-way door_
|
|
116
|
-
|
|
117
|
-
The caller's token reaches the log.
|
|
118
|
-
"""
|
|
119
|
-
And ".gtd/REVIEW.md" contains:
|
|
120
|
-
"""
|
|
121
|
-
- [ ] _your answer_
|
|
122
|
-
|
|
123
|
-
### AC-1 ignores floating point
|
|
124
|
-
|
|
125
|
-
_should: contract_
|
|
126
|
-
|
|
127
|
-
Should subtract round? The criterion does not say.
|
|
128
|
-
"""
|
|
129
|
-
And ".gtd/REVIEW.md" contains:
|
|
130
|
-
"""
|
|
131
|
-
- [ ] _your answer_
|
|
132
|
-
|
|
133
|
-
## Walkthrough
|
|
134
|
-
|
|
135
|
-
### Subtract
|
|
136
|
-
|
|
137
|
-
The new export.
|
|
138
|
-
|
|
139
|
-
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
140
|
-
|
|
141
|
-
### Session token
|
|
142
|
-
|
|
143
|
-
- [ ] ./src/calc.ts#1-1 — reads the caller's token
|
|
144
|
-
"""
|
|
145
|
-
And ".gtd/REVIEW.md" does not contain "_critical: security_"
|
|
146
|
-
And the commit "gtd(judge): build.review.ranking → build.review.carrying" has a body containing "Gtd-Judge:"
|
|
147
|
-
And the commit subjects end with:
|
|
148
|
-
"""
|
|
149
|
-
gtd(agent): build.review.reviewing → build.review.ranking
|
|
150
|
-
gtd(judge): build.review.ranking → build.review.carrying
|
|
151
|
-
gtd(check): build.review.carrying → build.review.await-review
|
|
152
|
-
"""
|
|
153
|
-
|
|
154
|
-
Scenario: a finding the judge is unsure about is listed as critical
|
|
155
|
-
Given step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
156
|
-
"""
|
|
157
|
-
# Review: abc1234
|
|
158
|
-
|
|
159
|
-
<!-- base: 0000000 -->
|
|
160
|
-
|
|
161
|
-
## Subtract
|
|
162
|
-
|
|
163
|
-
The new export.
|
|
164
|
-
|
|
165
|
-
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
166
|
-
|
|
167
|
-
## AC-1 ignores floating point
|
|
168
|
-
|
|
169
|
-
- [ ] ./src/calc.ts#2-2 — returns the raw difference
|
|
170
|
-
|
|
171
|
-
## Session token
|
|
172
|
-
|
|
173
|
-
- [ ] ./src/calc.ts#1-1 — reads the caller's token
|
|
174
|
-
|
|
175
|
-
## Token in logs
|
|
176
|
-
|
|
177
|
-
- [ ] ./src/calc.ts#1-1 — where it is logged
|
|
178
|
-
"""
|
|
179
|
-
And judge step "build.review.ranking" answers:
|
|
180
|
-
"""
|
|
181
|
-
[{"id":"C1.security","answer":"no","p":0.9},{"id":"C1.reversibility","answer":"two-way","p":0.9},{"id":"C1.blastRadius","answer":"local","p":0.9},{"id":"C1.newConcept","answer":"no","p":0.9},{"id":"C2.security","answer":"no","p":0.4},{"id":"C2.reversibility","answer":"two-way","p":0.9},{"id":"C2.blastRadius","answer":"local","p":0.9},{"id":"C2.newConcept","answer":"no","p":0.9},{"id":"C3.security","answer":"yes","p":0.9},{"id":"C3.reversibility","answer":"two-way","p":0.9},{"id":"C3.blastRadius","answer":"local","p":0.9},{"id":"C3.newConcept","answer":"no","p":0.9},{"id":"C4.security","answer":"no","p":0.9},{"id":"C4.reversibility","answer":"two-way","p":0.9},{"id":"C4.blastRadius","answer":"local","p":0.9},{"id":"C4.newConcept","answer":"yes","p":0.9}]
|
|
182
|
-
"""
|
|
183
|
-
When the process is driven
|
|
184
|
-
Then the process rests at "build.review.await-review"
|
|
185
|
-
And ".gtd/REVIEW.md" contains:
|
|
186
|
-
"""
|
|
187
|
-
## Findings
|
|
188
|
-
|
|
189
|
-
### AC-1 ignores floating point
|
|
190
|
-
|
|
191
|
-
_critical: judge unsure_
|
|
192
|
-
"""
|
|
193
|
-
And ".gtd/REVIEW.md" contains:
|
|
194
|
-
"""
|
|
195
|
-
### Token in logs
|
|
196
|
-
|
|
197
|
-
_should: new concept_
|
|
198
|
-
"""
|