@pmelab/gtd 55.0.0 → 57.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.
Files changed (83) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +72 -80
  3. package/dist/chunks/{reserved-DHafcW7t.mjs → reserved-X2RkNHin.mjs} +110 -318
  4. package/dist/chunks/{review-BJGKwlYv.mjs → review-v7sh5GF4.mjs} +30 -125
  5. package/dist/chunks/{steering-CLhu8C7q.mjs → steering-CCNvngSH.mjs} +256 -65
  6. package/dist/chunks/{tail-B9Hw2AFB.mjs → tail-S04KEewi.mjs} +144 -56
  7. package/dist/gtd.bundle.mjs +259 -22
  8. package/dist/steering.mjs +2 -2
  9. package/dist/testkit.mjs +6 -6
  10. package/dist/web/main.css +1 -1
  11. package/dist/web/main.js +551 -66
  12. package/dist/workflow-kit.mjs +1 -1
  13. package/dist/workflows/cleanup.mjs +2 -2
  14. package/dist/workflows/feature.mjs +63 -175
  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 +603 -727
  19. package/package.json +1 -1
  20. package/skills/authoring/SKILL.md +3 -3
  21. package/src/cli/Cli.ts +5 -5
  22. package/src/edge/Edge.test.ts +1 -1
  23. package/src/steering/FORMATS.md +5 -1
  24. package/src/steering/SteeringFormats.test.ts +2 -2
  25. package/src/steering/contract.test.ts +1 -0
  26. package/src/steering/findings.test.ts +47 -0
  27. package/src/steering/findings.ts +350 -0
  28. package/src/steering/fixtures/findings/gate.md +34 -0
  29. package/src/steering/fixtures/findings/gate.read.json +87 -0
  30. package/src/steering/index.test.ts +2 -2
  31. package/src/steering/index.ts +4 -3
  32. package/src/steering/review.test.ts +1 -75
  33. package/src/steering/review.ts +1 -74
  34. package/src/workflow/compile.test.ts +1 -0
  35. package/src/workflows/feature/criteria-coverage.feature +1 -7
  36. package/src/workflows/feature/criteria.test.ts +1 -41
  37. package/src/workflows/feature/criteria.ts +2 -14
  38. package/src/workflows/feature/fast-path.feature +0 -1
  39. package/src/workflows/feature/feature.test.ts +1 -1
  40. package/src/workflows/feature/feature.ts +16 -25
  41. package/src/workflows/feature/flag-mode.feature +1 -1
  42. package/src/workflows/feature/lens-models.feature +0 -1
  43. package/src/workflows/feature/lens-review.feature +323 -172
  44. package/src/workflows/feature/naive-test.feature +258 -0
  45. package/src/workflows/feature/one-step-land.feature +0 -1
  46. package/src/workflows/feature/refactor-absorbs.feature +1 -8
  47. package/src/workflows/feature/refactor-first.feature +2 -11
  48. package/src/workflows/feature/refactor-rebuild.feature +4 -25
  49. package/src/workflows/feature/refactor-review.feature +33 -118
  50. package/src/workflows/feature/refactor.test.ts +0 -2
  51. package/src/workflows/feature/refactor.ts +0 -1
  52. package/src/workflows/feature/review-gate.feature +7 -24
  53. package/src/workflows/feature/reviewer-walkthrough.feature +16 -104
  54. package/src/workflows/feature/seam-rejection.feature +0 -1
  55. package/src/workflows/feature/seam.feature +0 -1
  56. package/src/workflows/feature/seam.test.ts +1 -2
  57. package/src/workflows/feature/seam.ts +56 -10
  58. package/src/workflows/feature/standards.feature +75 -35
  59. package/src/workflows/fix/fix-lens-origin.feature +20 -7
  60. package/src/workflows/fix/fix-quality.feature +102 -23
  61. package/src/workflows/review/review-door.feature +62 -59
  62. package/src/workflows/shared/learn.test.ts +0 -14
  63. package/src/workflows/shared/learn.ts +1 -6
  64. package/src/workflows/shared/lenses.ts +149 -43
  65. package/src/workflows/shared/options.ts +9 -1
  66. package/src/workflows/shared/prose.ts +0 -6
  67. package/src/workflows/shared/review.test.ts +27 -26
  68. package/src/workflows/shared/review.ts +29 -196
  69. package/src/workflows/shared/skills.test.ts +0 -4
  70. package/src/workflows/shared/skills.ts +0 -5
  71. package/src/workflows/shared/steps.ts +1 -1
  72. package/src/workflows/shared/tail.ts +18 -9
  73. package/src/workflows/shared/text.test.ts +125 -329
  74. package/src/workflows/shared/text.ts +173 -471
  75. package/src/workflows/shared/vars.ts +2 -3
  76. package/src/workflows/feature/hands-on-skip.feature +0 -316
  77. package/src/workflows/feature/prototype-rounds.feature +0 -156
  78. package/src/workflows/feature/prototype.feature +0 -428
  79. package/src/workflows/feature/prototype.test.ts +0 -43
  80. package/src/workflows/feature/prototype.ts +0 -198
  81. package/src/workflows/feature/review-answers.feature +0 -324
  82. package/src/workflows/feature/severity-budget.feature +0 -116
  83. 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
- """