@pmelab/gtd 58.2.0 → 59.0.1

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 (150) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +120 -395
  3. package/dist/chunks/{Schema-B3o6eRNU.mjs → testkit-07Z_ENch.mjs} +13503 -3460
  4. package/dist/chunks/{wire-C12dahrH.mjs → wire-BTUhRGXj.mjs} +1 -1
  5. package/dist/flows.mjs +1 -1
  6. package/dist/gtd.bundle.mjs +484 -497
  7. package/dist/testkit/gherkin.mjs +145 -65
  8. package/dist/testkit.mjs +1 -1
  9. package/dist/wire.mjs +1 -1
  10. package/package.json +3 -42
  11. package/skills/authoring/SKILL.md +34 -27
  12. package/src/cli/Cli.test.ts +148 -71
  13. package/src/cli/Cli.ts +384 -463
  14. package/src/cli/Help.test.ts +47 -0
  15. package/src/cli/Help.ts +70 -0
  16. package/src/cli/Program.test.ts +127 -33
  17. package/src/cli/Program.ts +70 -25
  18. package/src/edge/Edge.ts +4 -4
  19. package/src/emit/Emit.test.ts +1 -1
  20. package/src/emit/Emit.ts +1 -1
  21. package/src/flags/index.test.ts +0 -13
  22. package/src/flags/index.ts +1 -3
  23. package/src/flows/factory.ts +3 -1
  24. package/src/gherkin/index.ts +135 -71
  25. package/src/gherkin/messages.test.ts +90 -0
  26. package/src/gherkin/messages.ts +84 -0
  27. package/src/install/Install.test.ts +14 -11
  28. package/src/install/Install.ts +38 -15
  29. package/src/install/index.ts +1 -2
  30. package/src/replay/Replay.test.ts +1 -1
  31. package/src/replay/index.ts +1 -1
  32. package/src/step/planStart.ts +6 -1
  33. package/src/testkit/TestRepo.test.ts +47 -2
  34. package/src/testkit/TestRepo.ts +51 -6
  35. package/src/twins/EmittedScriptRecognizer.ts +5 -8
  36. package/src/twins/FlowScripts.ts +1 -1
  37. package/src/wire/Land.ts +1 -1
  38. package/src/workflow/index.ts +1 -0
  39. package/src/workflow/load.test.ts +138 -113
  40. package/src/workflow/load.ts +7 -7
  41. package/src/workflow/skills.test.ts +5 -5
  42. package/src/workflow/skills.ts +1 -1
  43. package/src/workflow/vars.test.ts +30 -3
  44. package/src/workflow/vars.ts +34 -2
  45. package/src/workflow-kit/index.ts +1 -1
  46. package/dist/chunks/reserved-lMYCaapY.mjs +0 -1990
  47. package/dist/chunks/review-Bfaror38.mjs +0 -427
  48. package/dist/chunks/tail-Bd7L940p.mjs +0 -355
  49. package/dist/chunks/testkit-JDtpNKyi.mjs +0 -10410
  50. package/dist/workflows/cleanup.mjs +0 -36
  51. package/dist/workflows/feature.mjs +0 -1018
  52. package/dist/workflows/fix.mjs +0 -41
  53. package/dist/workflows/review.mjs +0 -45
  54. package/dist/workflows/rollout.mjs +0 -48
  55. package/dist/workflows.mjs +0 -40651
  56. package/src/install/ConfigScaffold.ts +0 -22
  57. package/src/workflows/cleanup/cleanup-path.feature +0 -94
  58. package/src/workflows/cleanup/cleanup.feature +0 -315
  59. package/src/workflows/cleanup/cleanup.test.ts +0 -276
  60. package/src/workflows/cleanup/cleanup.ts +0 -52
  61. package/src/workflows/cleanup/index.ts +0 -6
  62. package/src/workflows/feature/acceptance-criteria-tier.feature +0 -25
  63. package/src/workflows/feature/acceptance-criteria.feature +0 -389
  64. package/src/workflows/feature/criteria-coverage.feature +0 -102
  65. package/src/workflows/feature/criteria.test.ts +0 -147
  66. package/src/workflows/feature/criteria.ts +0 -267
  67. package/src/workflows/feature/fast-path.feature +0 -93
  68. package/src/workflows/feature/feature.test.ts +0 -338
  69. package/src/workflows/feature/feature.ts +0 -156
  70. package/src/workflows/feature/green.ts +0 -19
  71. package/src/workflows/feature/index.ts +0 -18
  72. package/src/workflows/feature/lens-models.feature +0 -69
  73. package/src/workflows/feature/lens-review.feature +0 -566
  74. package/src/workflows/feature/naive-acceptance.feature +0 -147
  75. package/src/workflows/feature/naive-test.feature +0 -263
  76. package/src/workflows/feature/one-step-land.feature +0 -93
  77. package/src/workflows/feature/planning.ts +0 -41
  78. package/src/workflows/feature/refactor-absorbs.feature +0 -131
  79. package/src/workflows/feature/refactor-first.feature +0 -158
  80. package/src/workflows/feature/refactor-lens-models.feature +0 -79
  81. package/src/workflows/feature/refactor-rebuild.feature +0 -273
  82. package/src/workflows/feature/refactor-review.feature +0 -1528
  83. package/src/workflows/feature/refactor.test.ts +0 -1220
  84. package/src/workflows/feature/refactor.ts +0 -368
  85. package/src/workflows/feature/release-flag.feature +0 -167
  86. package/src/workflows/feature/release-flag.test.ts +0 -49
  87. package/src/workflows/feature/release-flag.ts +0 -46
  88. package/src/workflows/feature/review-gate.feature +0 -241
  89. package/src/workflows/feature/reviewer-walkthrough.feature +0 -142
  90. package/src/workflows/feature/risk-tier.feature +0 -351
  91. package/src/workflows/feature/seam-rejection.feature +0 -146
  92. package/src/workflows/feature/seam.feature +0 -297
  93. package/src/workflows/feature/seam.test.ts +0 -527
  94. package/src/workflows/feature/seam.ts +0 -426
  95. package/src/workflows/feature/standards.feature +0 -354
  96. package/src/workflows/feature/steps.test.ts +0 -65
  97. package/src/workflows/feature/steps.ts +0 -45
  98. package/src/workflows/feature/tier-pin.feature +0 -66
  99. package/src/workflows/feature/tier.test.ts +0 -166
  100. package/src/workflows/feature/tier.ts +0 -56
  101. package/src/workflows/fix/fix-lens-origin.feature +0 -114
  102. package/src/workflows/fix/fix-quality.feature +0 -212
  103. package/src/workflows/fix/fix.feature +0 -79
  104. package/src/workflows/fix/fix.test.ts +0 -74
  105. package/src/workflows/fix/fix.ts +0 -52
  106. package/src/workflows/fix/index.ts +0 -6
  107. package/src/workflows/index.ts +0 -47
  108. package/src/workflows/review/index.ts +0 -6
  109. package/src/workflows/review/review-door.feature +0 -199
  110. package/src/workflows/review/review.test.ts +0 -27
  111. package/src/workflows/review/review.ts +0 -60
  112. package/src/workflows/rollout/index.ts +0 -6
  113. package/src/workflows/rollout/rollout.feature +0 -510
  114. package/src/workflows/rollout/rollout.test.ts +0 -263
  115. package/src/workflows/rollout/rollout.ts +0 -82
  116. package/src/workflows/shared/__fixtures__/feature-collecting-prompt.txt +0 -98
  117. package/src/workflows/shared/access.test.ts +0 -62
  118. package/src/workflows/shared/access.ts +0 -24
  119. package/src/workflows/shared/config.fixture.ts +0 -12
  120. package/src/workflows/shared/fences.ts +0 -24
  121. package/src/workflows/shared/health.test.ts +0 -148
  122. package/src/workflows/shared/health.ts +0 -191
  123. package/src/workflows/shared/learn.test.ts +0 -140
  124. package/src/workflows/shared/learn.ts +0 -201
  125. package/src/workflows/shared/lenses.test.ts +0 -39
  126. package/src/workflows/shared/lenses.ts +0 -294
  127. package/src/workflows/shared/options.test.ts +0 -157
  128. package/src/workflows/shared/options.ts +0 -92
  129. package/src/workflows/shared/progress.feature +0 -124
  130. package/src/workflows/shared/prose.ts +0 -263
  131. package/src/workflows/shared/recheck.feature +0 -60
  132. package/src/workflows/shared/registry.test.ts +0 -345
  133. package/src/workflows/shared/registry.ts +0 -183
  134. package/src/workflows/shared/reserved.ts +0 -11
  135. package/src/workflows/shared/review.test.ts +0 -1062
  136. package/src/workflows/shared/review.ts +0 -446
  137. package/src/workflows/shared/skills.test.ts +0 -121
  138. package/src/workflows/shared/skills.ts +0 -49
  139. package/src/workflows/shared/standards.test.ts +0 -90
  140. package/src/workflows/shared/standards.ts +0 -156
  141. package/src/workflows/shared/steps.test.ts +0 -219
  142. package/src/workflows/shared/steps.ts +0 -201
  143. package/src/workflows/shared/tail.test.ts +0 -454
  144. package/src/workflows/shared/tail.ts +0 -264
  145. package/src/workflows/shared/text.fixture.ts +0 -128
  146. package/src/workflows/shared/text.test.ts +0 -1430
  147. package/src/workflows/shared/text.ts +0 -1700
  148. package/src/workflows/shared/threads.test.ts +0 -129
  149. package/src/workflows/shared/vars.ts +0 -47
  150. package/src/workflows/shared/workflows.steps.ts +0 -54
@@ -1,566 +0,0 @@
1
- @inmem
2
- Feature: the quality lap's findings are triaged, then decided at the finding gate
3
-
4
- A judge classifies each `## ` finding the lenses wrote to `.gtd/QUALITY.md`:
5
- a mechanical one is fixed by the fixer, noise is dropped with its `p` kept in
6
- a trailer, and a design one is a note. The notes, then the noise under
7
- `# Dropped as noise`, rest at the finding gate (`build.quality.gate`), each
8
- with one `- [ ] fix` box: a ticked finding is fixed, an unticked one
9
- dropped. The review then walks through the code and lists, in one
10
- `## Quality lap` chunk, what became of every finding.
11
-
12
- Background:
13
- Given the shipped workflows, as gtd install scaffolds them
14
- And an environment variable "GTD_QUALITYREVIEWS" set to "correctness"
15
- And a file "src/calc.ts" with:
16
- """
17
- export const add = (a: number, b: number) => a + b
18
- """
19
- And the working tree is committed as "feat: add calculator"
20
- And a file "TODO.md" with:
21
- """
22
- # Add subtract
23
-
24
- subtract(a, b) returns the difference.
25
- """
26
- And step "unwind" changes nothing
27
- And step "start-gate.check" changes nothing
28
- And step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
29
- """
30
- # Requirements
31
-
32
- ## Concerns
33
-
34
- ### Subtract
35
-
36
- - `subtract(a, b)` returns `a - b`.
37
-
38
- ## Impact
39
-
40
- - the greeting module
41
-
42
- ## Acceptance Criteria
43
-
44
- - AC-1: subtract(a, b) returns a - b.
45
- """
46
- And step "design.gate.answer" changes nothing
47
- And step "seam.naive" writes "src/calc.test.ts" with:
48
- """
49
- it("[AC-1] subtracts", () => {})
50
- """
51
- And step "seam.naive" writes "src/calc.ts" with:
52
- """
53
- export const add = (a: number, b: number) => a + b
54
- export const subtract = (a: number, b: number) => a - b
55
- """
56
- And step "seam.check" changes nothing
57
- And step "implement.applying" runs its script
58
- And step "implement.health.check" changes nothing
59
- And step "implement.closing" runs its script
60
- And step "build.quality.correctness.reviewing" writes ".gtd/QUALITY.md" with:
61
- """
62
- # Quality
63
-
64
- ## subtract has no negative test
65
-
66
- Add a test subtracting a larger number.
67
-
68
- ## add could be a method
69
-
70
- A class would read better.
71
-
72
- ## AC-1 ignores floating point
73
-
74
- Should subtract round? The criterion does not say.
75
- """
76
- And step "build.quality.sorting" runs its script
77
- And step "build.quality.gating" runs its script
78
- And step "build.quality.picking" runs its script
79
- And step "build.quality.closing" runs its script
80
- And step "build.review.carrying" runs its script
81
- And step "build.health.check" changes nothing
82
- And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
83
- """
84
- # Review: abc1234
85
-
86
- <!-- base: 0000000 -->
87
-
88
- ## Subtract
89
-
90
- - [ ] ./src/calc.ts#2-2 — subtract(a, b)
91
- """
92
-
93
- Scenario: a mechanical finding is fixed, the rest wait at the finding gate, and an untouched gate drops them
94
- Given judge step "build.quality.triage" answers:
95
- """
96
- [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"noise","p":0.85},{"id":"Q3","answer":"design","p":0.8}]
97
- """
98
- And step "build.fix.quality.fixing" writes "src/calc.test.ts" with:
99
- """
100
- it("[AC-1] subtracts", () => {})
101
- it("subtracts a larger number", () => {})
102
- """
103
- And step "build.fix.quality.fixing" deletes ".gtd/QUALITY.md"
104
- When the process is driven
105
- Then the process rests at "build.quality.gate"
106
- 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"
107
- And ".gtd/QUALITY.md" contains:
108
- """
109
- ## AC-1 ignores floating point
110
-
111
- _From lens correctness._
112
-
113
- Should subtract round? The criterion does not say.
114
-
115
- - [ ] fix
116
-
117
- # Dropped as noise
118
-
119
- ## add could be a method
120
-
121
- _From lens correctness. The judge called it noise (p=0.85)._
122
-
123
- A class would read better.
124
-
125
- - [ ] fix
126
- """
127
- When gtd lands
128
- And the process is driven
129
- Then the process rests at "build.review.await-review"
130
- And ".gtd/QUALITY.md" does not exist
131
- And ".gtd/REVIEW.md" contains:
132
- """
133
- ## Quality lap
134
-
135
- What the quality lenses found, and what became of it. Write a note under
136
- a line to reopen it.
137
-
138
- Fixed automatically:
139
-
140
- - subtract has no negative test (
141
- """
142
- And ".gtd/REVIEW.md" contains:
143
- """
144
- Dropped at the finding gate:
145
-
146
- - AC-1 ignores floating point (lens correctness)
147
-
148
- Dropped as noise:
149
-
150
- - add could be a method (p=0.85, lens correctness)
151
- """
152
- And ".gtd/REVIEW.md" contains the short hash of the commit "gtd(agent): build.fix.quality.fixing → build.health.check"
153
- And ".gtd/REVIEW.md" does not contain "Tick exactly one:"
154
- And the commit subjects end with:
155
- """
156
- gtd(check): implement.closing → build.quality.correctness.reviewing
157
- gtd(agent): build.quality.correctness.reviewing → build.quality.triage
158
- gtd(judge): build.quality.triage → build.quality.sorting
159
- gtd(check): build.quality.sorting → build.fix.quality.fixing
160
- gtd(agent): build.fix.quality.fixing → build.health.check
161
- gtd(check): build.health.check → build.quality.gating
162
- gtd(check): build.quality.gating → build.quality.gate
163
- gtd(human): build.quality.gate → build.quality.closing
164
- gtd(check): build.quality.closing → build.review.reviewing
165
- gtd(agent): build.review.reviewing → build.review.carrying
166
- gtd(check): build.review.carrying → build.review.await-review
167
- """
168
-
169
- Scenario: a ticked note is fixed with the human's guidance, never re-planned
170
- Given judge step "build.quality.triage" answers:
171
- """
172
- [{"id":"Q1","answer":"noise","p":0.9},{"id":"Q2","answer":"noise","p":0.85},{"id":"Q3","answer":"design","p":0.8}]
173
- """
174
- When the process is driven
175
- Then the process rests at "build.quality.gate"
176
- Given a file ".gtd/QUALITY.md" with:
177
- """
178
- # Quality
179
-
180
- ## AC-1 ignores floating point
181
-
182
- _From lens correctness._
183
-
184
- Should subtract round? The criterion does not say.
185
-
186
- - [x] fix
187
-
188
- Round half up.
189
-
190
- # Dropped as noise
191
-
192
- ## subtract has no negative test
193
-
194
- _From lens correctness. The judge called it noise (p=0.9)._
195
-
196
- Add a test subtracting a larger number.
197
-
198
- - [ ] fix
199
-
200
- ## add could be a method
201
-
202
- _From lens correctness. The judge called it noise (p=0.85)._
203
-
204
- A class would read better.
205
-
206
- - [ ] fix
207
- """
208
- When gtd lands
209
- And the process is driven
210
- Then the process rests at "build.fix.quality.fixing"
211
- And ".gtd/QUALITY.md" contains:
212
- """
213
- ## AC-1 ignores floating point
214
-
215
- Should subtract round? The criterion does not say.
216
-
217
- Guidance from the human — follow it:
218
-
219
- Round half up.
220
- """
221
- And ".gtd/QUALITY.md" does not contain "add could be a method"
222
- Given step "build.fix.quality.fixing" writes "src/calc.ts" with:
223
- """
224
- export const add = (a: number, b: number) => a + b
225
- export const subtract = (a: number, b: number) => Math.round(a - b)
226
- """
227
- And step "build.fix.quality.fixing" deletes ".gtd/QUALITY.md"
228
- When the process is driven
229
- Then the process rests at "build.review.await-review"
230
- And ".gtd/REVIEW.md" contains:
231
- """
232
- Fixed at the finding gate:
233
-
234
- - AC-1 ignores floating point (
235
- """
236
- And ".gtd/REVIEW.md" contains:
237
- """
238
- Dropped as noise:
239
-
240
- - subtract has no negative test (p=0.9, lens correctness)
241
- - add could be a method (p=0.85, lens correctness)
242
- """
243
- And the commit subjects end with:
244
- """
245
- gtd(human): build.quality.gate → build.quality.picking
246
- gtd(check): build.quality.picking → build.fix.quality.fixing
247
- gtd(agent): build.fix.quality.fixing → build.health.check
248
- gtd(check): build.health.check → build.review.reviewing
249
- gtd(agent): build.review.reviewing → build.review.carrying
250
- gtd(check): build.review.carrying → build.review.await-review
251
- """
252
-
253
- Scenario: a finding the judge called noise is rescued by its tick
254
- Given judge step "build.quality.triage" answers:
255
- """
256
- [{"id":"Q1","answer":"noise","p":0.9},{"id":"Q2","answer":"noise","p":0.85},{"id":"Q3","answer":"noise","p":0.8}]
257
- """
258
- And step "build.fix.quality.fixing" deletes ".gtd/QUALITY.md"
259
- When the process is driven
260
- Then the process rests at "build.quality.gate"
261
- Given a file ".gtd/QUALITY.md" with:
262
- """
263
- # Quality
264
-
265
- # Dropped as noise
266
-
267
- ## subtract has no negative test
268
-
269
- Add a test subtracting a larger number.
270
-
271
- - [ ] fix
272
-
273
- ## add could be a method
274
-
275
- A class would read better.
276
-
277
- - [x] fix
278
-
279
- ## AC-1 ignores floating point
280
-
281
- Should subtract round? The criterion does not say.
282
-
283
- - [ ] fix
284
- """
285
- When gtd lands
286
- And the process is driven
287
- Then the process rests at "build.review.await-review"
288
- And ".gtd/REVIEW.md" contains:
289
- """
290
- Fixed at the finding gate:
291
-
292
- - add could be a method (
293
- """
294
- And ".gtd/REVIEW.md" contains:
295
- """
296
- Dropped as noise:
297
-
298
- - subtract has no negative test (p=0.9, lens correctness)
299
- - AC-1 ignores floating point (p=0.8, lens correctness)
300
- """
301
-
302
- Scenario: guidance under an unticked box is refused
303
- Given judge step "build.quality.triage" answers:
304
- """
305
- [{"id":"Q1","answer":"noise","p":0.9},{"id":"Q2","answer":"noise","p":0.85},{"id":"Q3","answer":"design","p":0.8}]
306
- """
307
- When the process is driven
308
- Then the process rests at "build.quality.gate"
309
- Given a file ".gtd/QUALITY.md" with:
310
- """
311
- # Quality
312
-
313
- ## AC-1 ignores floating point
314
-
315
- Should subtract round? The criterion does not say.
316
-
317
- - [ ] fix
318
-
319
- Round half up.
320
- """
321
- Then landing is refused with "finding-gate: 1 problem(s) in .gtd/QUALITY.md"
322
- And landing is refused with "has guidance under an unticked box — tick it to fix the finding, or delete the text to drop it"
323
-
324
- Scenario: a ticked finding the fix cap leaves is listed unresolved, with no second gate
325
- Given judge step "build.quality.triage" answers:
326
- """
327
- [{"id":"Q1","answer":"noise","p":0.9},{"id":"Q2","answer":"noise","p":0.85},{"id":"Q3","answer":"design","p":0.8}]
328
- """
329
- And step "build.fix.quality.fixing" changes nothing
330
- When the process is driven
331
- Then the process rests at "build.quality.gate"
332
- Given a file ".gtd/QUALITY.md" with:
333
- """
334
- # Quality
335
-
336
- ## AC-1 ignores floating point
337
-
338
- Should subtract round? The criterion does not say.
339
-
340
- - [x] fix
341
- """
342
- When gtd lands
343
- And the process is driven
344
- Then the process rests at "build.review.await-review"
345
- And ".gtd/QUALITY.md" does not exist
346
- And ".gtd/REVIEW.md" contains:
347
- """
348
- Unresolved after the finding gate:
349
-
350
- - AC-1 ignores floating point (lens correctness)
351
- """
352
- And the commit subjects end with:
353
- """
354
- gtd(human): build.quality.gate → build.quality.picking
355
- gtd(check): build.quality.picking → build.fix.quality.fixing
356
- gtd(agent): build.fix.quality.fixing
357
- gtd(agent): build.fix.quality.fixing
358
- gtd(agent): build.fix.quality.fixing → build.health.check
359
- gtd(check): build.health.check → build.quality.closing
360
- gtd(check): build.quality.closing → build.review.reviewing
361
- gtd(agent): build.review.reviewing → build.review.carrying
362
- gtd(check): build.review.carrying → build.review.await-review
363
- """
364
-
365
- Scenario: a lap whose every finding was fixed has no gate
366
- Given judge step "build.quality.triage" answers:
367
- """
368
- [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"mechanical","p":0.9},{"id":"Q3","answer":"mechanical","p":0.9}]
369
- """
370
- And step "build.fix.quality.fixing" deletes ".gtd/QUALITY.md"
371
- When the process is driven
372
- Then the process rests at "build.review.await-review"
373
- And no commit body contains "build.quality.gate"
374
- And ".gtd/REVIEW.md" contains "- AC-1 ignores floating point ("
375
-
376
- Scenario: a risk is fixed before the human sees the review, re-reviewed in the reviewer's own draft
377
- Given judge step "build.quality.triage" answers:
378
- """
379
- [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"noise","p":0.85},{"id":"Q3","answer":"design","p":0.8}]
380
- """
381
- And step "build.fix.quality.fixing" deletes ".gtd/QUALITY.md"
382
- And step "build.quality.gate" changes nothing
383
- And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
384
- """
385
- # Review: abc1234
386
-
387
- <!-- base: 0000000 -->
388
-
389
- ## Subtract
390
-
391
- - [ ] ./src/calc.ts#2-2 — Risk: overflows on large numbers
392
- """
393
- When the process is driven
394
- Then the process rests at "build.review.fix.risks.fixing"
395
- And ".gtd/REVIEW.md" does not contain "## Quality lap"
396
- Given step "build.review.reviewing" is no longer scripted
397
- And step "build.review.reviewing" replaces the text "Risk: overflows on large numbers" in ".gtd/REVIEW.md" with "subtract(a, b), now guarded"
398
- And step "build.review.fix.risks.fixing" changes nothing
399
- When the process is driven
400
- Then the process rests at "build.review.await-review"
401
- And ".gtd/REVIEW.md" contains "subtract(a, b), now guarded"
402
- And ".gtd/REVIEW.md" contains "## Quality lap" exactly once
403
- And ".gtd/REVIEW.md" contains "Fixed automatically:" exactly once
404
- And the commit subjects end with:
405
- """
406
- gtd(check): build.quality.closing → build.review.reviewing
407
- gtd(agent): build.review.reviewing → build.review.fix.risks.fixing
408
- gtd(agent): build.review.fix.risks.fixing → build.health.check
409
- gtd(check): build.health.check → build.review.reviewing
410
- gtd(agent): build.review.reviewing → build.review.carrying
411
- gtd(check): build.review.carrying → build.review.await-review
412
- """
413
-
414
- Scenario: an unsure verdict makes a finding a note, never a fix or a drop
415
- Given judge step "build.quality.triage" answers:
416
- """
417
- [{"id":"Q1","answer":"mechanical","p":0.5},{"id":"Q2","answer":"noise","p":0.6}]
418
- """
419
- When the process is driven
420
- Then the process rests at "build.quality.gate"
421
- And ".gtd/QUALITY.md" contains "## subtract has no negative test"
422
- And ".gtd/QUALITY.md" contains "## add could be a method"
423
- And ".gtd/QUALITY.md" contains "## AC-1 ignores floating point"
424
- And ".gtd/QUALITY.md" does not contain "# Dropped as noise"
425
- And no commit body contains "Gtd-Mark: noise="
426
- And the commit subjects end with:
427
- """
428
- gtd(agent): build.quality.correctness.reviewing → build.quality.triage
429
- gtd(judge): build.quality.triage → build.quality.gating
430
- gtd(check): build.quality.gating → build.quality.gate
431
- """
432
-
433
- Scenario: a mechanical finding the fix cap leaves reaches the gate as unresolved
434
- Given judge step "build.quality.triage" answers:
435
- """
436
- [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"mechanical","p":0.9},{"id":"Q3","answer":"mechanical","p":0.9}]
437
- """
438
- And step "build.fix.quality.fixing" writes ".gtd/QUALITY.md" with:
439
- """
440
- # Quality
441
-
442
- ## add could be a method
443
-
444
- A class would read better.
445
- """
446
- When the process is driven
447
- Then the process rests at "build.quality.gate"
448
- And ".gtd/QUALITY.md" contains:
449
- """
450
- ## add could be a method
451
-
452
- _From lens correctness. The fixer left it unresolved._
453
-
454
- A class would read better.
455
-
456
- - [ ] fix
457
- """
458
- And the commit subjects end with:
459
- """
460
- gtd(judge): build.quality.triage → build.fix.quality.fixing
461
- gtd(agent): build.fix.quality.fixing
462
- gtd(agent): build.fix.quality.fixing
463
- gtd(agent): build.fix.quality.fixing → build.health.check
464
- gtd(check): build.health.check → build.quality.gating
465
- gtd(check): build.quality.gating → build.quality.gate
466
- """
467
- When gtd lands
468
- And the process is driven
469
- Then the process rests at "build.review.await-review"
470
- And ".gtd/REVIEW.md" contains "- subtract has no negative test ("
471
- And ".gtd/REVIEW.md" contains:
472
- """
473
- Dropped at the finding gate:
474
-
475
- - add could be a method (lens correctness)
476
- """
477
-
478
- Scenario: a fixer that renames a chunk it leaves counts nothing fixed
479
- Given judge step "build.quality.triage" answers:
480
- """
481
- [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"mechanical","p":0.9},{"id":"Q3","answer":"mechanical","p":0.9}]
482
- """
483
- And step "build.fix.quality.fixing" writes ".gtd/QUALITY.md" with:
484
- """
485
- # Quality
486
-
487
- ## null check in parse()
488
-
489
- Still open.
490
- """
491
- When the process is driven
492
- Then the process rests at "build.quality.gate"
493
- And ".gtd/QUALITY.md" contains "## null check in parse()"
494
- And ".gtd/QUALITY.md" contains "## subtract has no negative test"
495
- And ".gtd/QUALITY.md" contains "check whether it was fixed"
496
-
497
- Scenario: prose the fixer leaves outside every chunk does not hide its fixes
498
- Given judge step "build.quality.triage" answers:
499
- """
500
- [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"mechanical","p":0.9},{"id":"Q3","answer":"mechanical","p":0.9}]
501
- """
502
- And step "build.fix.quality.fixing" writes ".gtd/QUALITY.md" with:
503
- """
504
- # Quality
505
-
506
- All fixed.
507
- """
508
- When the process is driven
509
- Then the process rests at "build.review.await-review"
510
- And ".gtd/REVIEW.md" contains "- subtract has no negative test ("
511
- And ".gtd/REVIEW.md" does not contain "check whether it was fixed"
512
-
513
- Scenario: signing off the review ends the process
514
- Given judge step "build.quality.triage" answers:
515
- """
516
- [{"id":"Q1","answer":"noise","p":0.9},{"id":"Q2","answer":"noise","p":0.9},{"id":"Q3","answer":"noise","p":0.9}]
517
- """
518
- And step "build.quality.gate" changes nothing
519
- And step "build.review.closing" runs its script
520
- When the process is driven
521
- Then the process rests at "build.review.await-review"
522
- When gtd lands
523
- And the process is driven
524
- Then the process rests at "idle"
525
- And ".gtd/REVIEW.md" does not exist
526
- And the commit subjects end with:
527
- """
528
- gtd(agent): build.review.reviewing → build.review.carrying
529
- gtd(check): build.review.carrying → build.review.await-review
530
- gtd(human): build.review.await-review → build.review.closing
531
- gtd(check): build.review.closing → idle
532
- """
533
-
534
- Scenario: a finding whose entry the human deleted is listed as dropped
535
- Given judge step "build.quality.triage" answers:
536
- """
537
- [{"id":"Q1","answer":"noise","p":0.9},{"id":"Q2","answer":"noise","p":0.85},{"id":"Q3","answer":"design","p":0.8}]
538
- """
539
- When the process is driven
540
- Then the process rests at "build.quality.gate"
541
- Given a file ".gtd/QUALITY.md" with:
542
- """
543
- # Quality
544
-
545
- # Dropped as noise
546
-
547
- ## add could be a method
548
-
549
- A class would read better.
550
-
551
- - [ ] fix
552
- """
553
- When gtd lands
554
- And the process is driven
555
- Then the process rests at "build.review.await-review"
556
- And ".gtd/REVIEW.md" contains:
557
- """
558
- Dropped at the finding gate:
559
-
560
- - AC-1 ignores floating point (lens correctness)
561
-
562
- Dropped as noise:
563
-
564
- - add could be a method (p=0.85, lens correctness)
565
- - subtract has no negative test (p=0.9, lens correctness)
566
- """