@pmelab/gtd 41.0.0 → 43.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 (73) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +107 -53
  3. package/claude/hooks/sketch.ts +1 -1
  4. package/dist/chunks/{reserved-Ch4LLrEj.mjs → reserved-COEMFEpy.mjs} +84 -51
  5. package/dist/chunks/{steering-DVILanVf.mjs → steering-D4LUQ-av.mjs} +95 -12
  6. package/dist/chunks/tail-C_xn8U7U.mjs +246 -0
  7. package/dist/flows.mjs +11 -1
  8. package/dist/gtd.bundle.mjs +498 -30
  9. package/dist/steering.mjs +2 -2
  10. package/dist/testkit.mjs +460 -28
  11. package/dist/web/main.js +42 -13
  12. package/dist/workflow-kit.mjs +61 -25
  13. package/dist/workflows/cleanup.mjs +2 -2
  14. package/dist/workflows/feature.mjs +66 -57
  15. package/dist/workflows/fix.mjs +3 -3
  16. package/dist/workflows/review.mjs +2 -2
  17. package/dist/workflows/rollout.mjs +1 -1
  18. package/dist/workflows.mjs +446 -141
  19. package/package.json +1 -1
  20. package/src/cli/Cli.test.ts +33 -1
  21. package/src/cli/Cli.ts +70 -6
  22. package/src/cli/History.ts +15 -0
  23. package/src/cli/Judges.test.ts +373 -0
  24. package/src/cli/Judges.ts +624 -0
  25. package/src/cli/Metrics.ts +3 -16
  26. package/src/cli/Program.test.ts +3 -1
  27. package/src/cli/Program.ts +9 -0
  28. package/src/flows/scripts.ts +15 -0
  29. package/src/steering/index.ts +12 -1
  30. package/src/steering/review.test.ts +109 -20
  31. package/src/steering/review.ts +160 -9
  32. package/src/testkit/EmittedScriptRecognizer.ts +0 -14
  33. package/src/testkit/FlowScripts.test.ts +17 -0
  34. package/src/testkit/FlowScripts.ts +15 -0
  35. package/src/testkit/steps.ts +31 -0
  36. package/src/workflow-kit/review.test.ts +170 -26
  37. package/src/workflow-kit/review.ts +95 -19
  38. package/src/workflows/feature/coverage.feature +3 -3
  39. package/src/workflows/feature/fast-path.feature +2 -2
  40. package/src/workflows/feature/feature.test.ts +2 -37
  41. package/src/workflows/feature/feature.ts +12 -14
  42. package/src/workflows/feature/flag-mode.feature +2 -2
  43. package/src/workflows/feature/lens-review.feature +246 -0
  44. package/src/workflows/feature/one-step-land.feature +2 -2
  45. package/src/workflows/feature/quality-unresolved.feature +47 -32
  46. package/src/workflows/feature/refactor-absorbs.feature +3 -3
  47. package/src/workflows/feature/refactor-first.feature +5 -5
  48. package/src/workflows/feature/refactor-rebuild.feature +7 -7
  49. package/src/workflows/feature/refactor-review.feature +19 -100
  50. package/src/workflows/feature/refactor.test.ts +12 -27
  51. package/src/workflows/feature/refactor.ts +0 -1
  52. package/src/workflows/feature/review-answers.feature +179 -0
  53. package/src/workflows/feature/review-gate.feature +6 -6
  54. package/src/workflows/feature/review.test.ts +33 -77
  55. package/src/workflows/feature/review.ts +79 -47
  56. package/src/workflows/feature/seam-rejection.feature +2 -2
  57. package/src/workflows/feature/seam.feature +2 -2
  58. package/src/workflows/feature/seam.test.ts +1 -1
  59. package/src/workflows/feature/slicing.feature +6 -6
  60. package/src/workflows/feature/steps.test.ts +0 -12
  61. package/src/workflows/feature/steps.ts +3 -10
  62. package/src/workflows/index.ts +1 -0
  63. package/src/workflows/shared/__fixtures__/feature-collecting-prompt.txt +6 -5
  64. package/src/workflows/shared/access.test.ts +2 -11
  65. package/src/workflows/shared/access.ts +0 -2
  66. package/src/workflows/shared/lenses.test.ts +39 -0
  67. package/src/workflows/shared/lenses.ts +176 -0
  68. package/src/workflows/shared/options.ts +1 -0
  69. package/src/workflows/shared/tail.ts +19 -4
  70. package/src/workflows/shared/text.test.ts +106 -88
  71. package/src/workflows/shared/text.ts +164 -53
  72. package/src/workflows/shared/vars.ts +1 -0
  73. package/dist/chunks/tail-lY1UmJrU.mjs +0 -112
@@ -67,7 +67,7 @@ Feature: flag mode off lands the naive pass with no release flag, seam judge or
67
67
  """
68
68
  And step "build.quality.correctness.reviewing" changes nothing
69
69
  When the process is driven
70
- Then the process rests at "build.review.reviewing"
70
+ Then the process rests at "build.review.composing"
71
71
  And "src/calc.ts" contains "subtract"
72
72
  And "src/calc.test.ts" contains "[AC-1] subtracts"
73
73
  And the commit subjects end with:
@@ -85,5 +85,5 @@ Feature: flag mode off lands the naive pass with no release flag, seam judge or
85
85
  gtd(check): implement.health.check → implement.coverage
86
86
  gtd(judge): implement.coverage → implement.closing
87
87
  gtd(check): implement.closing → build.quality.correctness.reviewing
88
- gtd(agent): build.quality.correctness.reviewing → build.review.reviewing
88
+ gtd(agent): build.quality.correctness.reviewing → build.review.composing
89
89
  """
@@ -0,0 +1,246 @@
1
+ @inmem
2
+ Feature: the quality lenses are the only agentic review
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 becomes a note in `.gtd/REVIEW.md`, with answer
7
+ boxes. gtd writes that file itself — no reviewer turn runs — and lists,
8
+ without tick boxes, what was fixed automatically and what was dropped as
9
+ noise.
10
+
11
+ Background:
12
+ Given the shipped workflows, as gtd install scaffolds them
13
+ And an environment variable "GTD_QUALITYREVIEWS" set to "correctness"
14
+ And an environment variable "GTD_FLAGMODE" set to "false"
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
+ ## 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 judge step "implement.coverage" answers:
57
+ """
58
+ [{"id":"AC-1","answer":"yes","p":0.9}]
59
+ """
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.review.composing" runs its script
78
+
79
+ Scenario: a mechanical finding is fixed and listed, noise dropped and listed, a design one noted
80
+ Given judge step "build.quality.triage" answers:
81
+ """
82
+ [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"noise","p":0.85},{"id":"Q3","answer":"design","p":0.8}]
83
+ """
84
+ And step "build.fix.quality.fixing" writes "src/calc.test.ts" with:
85
+ """
86
+ it("[AC-1] subtracts", () => {})
87
+ it("subtracts a larger number", () => {})
88
+ """
89
+ And step "build.fix.quality.fixing" deletes ".gtd/QUALITY.md"
90
+ And step "build.health.check" changes nothing
91
+ When the process is driven
92
+ Then the process rests at "build.review.await-review"
93
+ And ".gtd/QUALITY.md" does not exist
94
+ 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"
95
+ And ".gtd/REVIEW.md" contains:
96
+ """
97
+ ## AC-1 ignores floating point
98
+
99
+ Should subtract round? The criterion does not say.
100
+
101
+ Tick exactly one:
102
+
103
+ - [ ] fix as suggested
104
+ - [ ] won't fix
105
+ - [ ] _your answer_
106
+
107
+ ## Fixed automatically
108
+
109
+ - subtract has no negative test (
110
+ """
111
+ And ".gtd/REVIEW.md" contains the short hash of the commit "gtd(agent): build.fix.quality.fixing → build.health.check"
112
+ And ".gtd/REVIEW.md" contains:
113
+ """
114
+ ## Dropped as noise
115
+
116
+ - add could be a method (p=0.85)
117
+ """
118
+ And ".gtd/REVIEW.md" contains:
119
+ """
120
+ ## Fixed automatically
121
+
122
+ - subtract has no negative test (
123
+ """
124
+ And the commit subjects end with:
125
+ """
126
+ gtd(check): implement.closing → build.quality.correctness.reviewing
127
+ gtd(agent): build.quality.correctness.reviewing → build.quality.triage
128
+ gtd(judge): build.quality.triage → build.quality.sorting
129
+ gtd(check): build.quality.sorting → build.fix.quality.fixing
130
+ gtd(agent): build.fix.quality.fixing → build.health.check
131
+ gtd(check): build.health.check → build.review.composing
132
+ gtd(check): build.review.composing → build.review.await-review
133
+ """
134
+
135
+ Scenario: an unsure verdict makes a finding a note, never a fix or a drop
136
+ Given judge step "build.quality.triage" answers:
137
+ """
138
+ [{"id":"Q1","answer":"mechanical","p":0.5},{"id":"Q2","answer":"noise","p":0.6}]
139
+ """
140
+ When the process is driven
141
+ Then the process rests at "build.review.await-review"
142
+ And ".gtd/REVIEW.md" contains "## subtract has no negative test"
143
+ And ".gtd/REVIEW.md" contains "## add could be a method"
144
+ And ".gtd/REVIEW.md" contains "## AC-1 ignores floating point"
145
+ And ".gtd/REVIEW.md" does not contain "Fixed automatically"
146
+ And no commit body contains "Gtd-Mark: noise="
147
+ And the commit subjects end with:
148
+ """
149
+ gtd(judge): build.quality.triage → build.quality.sorting
150
+ gtd(check): build.quality.sorting → build.review.composing
151
+ gtd(check): build.review.composing → build.review.await-review
152
+ """
153
+
154
+ Scenario: a mechanical finding the fix cap leaves becomes a note
155
+ Given judge step "build.quality.triage" answers:
156
+ """
157
+ [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"mechanical","p":0.9},{"id":"Q3","answer":"mechanical","p":0.9}]
158
+ """
159
+ And step "build.fix.quality.fixing" writes ".gtd/QUALITY.md" with:
160
+ """
161
+ # Quality
162
+
163
+ ## add could be a method
164
+
165
+ A class would read better.
166
+ """
167
+ And step "build.health.check" changes nothing
168
+ When the process is driven
169
+ Then the process rests at "build.review.await-review"
170
+ And ".gtd/QUALITY.md" does not exist
171
+ And ".gtd/REVIEW.md" contains:
172
+ """
173
+ ## add could be a method
174
+
175
+ _The fixer left this unresolved._
176
+
177
+ A class would read better.
178
+ """
179
+ And ".gtd/REVIEW.md" contains "- subtract has no negative test ("
180
+ And ".gtd/REVIEW.md" contains "- AC-1 ignores floating point ("
181
+ And the commit subjects end with:
182
+ """
183
+ gtd(judge): build.quality.triage → build.fix.quality.fixing
184
+ gtd(agent): build.fix.quality.fixing
185
+ gtd(agent): build.fix.quality.fixing
186
+ gtd(agent): build.fix.quality.fixing → build.health.check
187
+ gtd(check): build.health.check → build.review.composing
188
+ gtd(check): build.review.composing → build.review.await-review
189
+ """
190
+
191
+ Scenario: a fixer that renames a chunk it leaves counts nothing fixed
192
+ Given judge step "build.quality.triage" answers:
193
+ """
194
+ [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"mechanical","p":0.9},{"id":"Q3","answer":"mechanical","p":0.9}]
195
+ """
196
+ And step "build.fix.quality.fixing" writes ".gtd/QUALITY.md" with:
197
+ """
198
+ # Quality
199
+
200
+ ## null check in parse()
201
+
202
+ Still open.
203
+ """
204
+ And step "build.health.check" changes nothing
205
+ When the process is driven
206
+ Then the process rests at "build.review.await-review"
207
+ And ".gtd/REVIEW.md" contains "## null check in parse()"
208
+ And ".gtd/REVIEW.md" contains "## subtract has no negative test"
209
+ And ".gtd/REVIEW.md" contains "check whether it was fixed"
210
+ And ".gtd/REVIEW.md" does not contain "Fixed automatically"
211
+
212
+ Scenario: prose the fixer leaves outside every chunk does not hide its fixes
213
+ Given judge step "build.quality.triage" answers:
214
+ """
215
+ [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"mechanical","p":0.9},{"id":"Q3","answer":"mechanical","p":0.9}]
216
+ """
217
+ And step "build.fix.quality.fixing" writes ".gtd/QUALITY.md" with:
218
+ """
219
+ # Quality
220
+
221
+ All fixed.
222
+ """
223
+ And step "build.health.check" changes nothing
224
+ When the process is driven
225
+ Then the process rests at "build.review.await-review"
226
+ And ".gtd/REVIEW.md" contains "- subtract has no negative test ("
227
+ And ".gtd/REVIEW.md" does not contain "check whether it was fixed"
228
+
229
+ Scenario: signing off a composed review ends the process
230
+ Given judge step "build.quality.triage" answers:
231
+ """
232
+ [{"id":"Q1","answer":"noise","p":0.9},{"id":"Q2","answer":"noise","p":0.9},{"id":"Q3","answer":"noise","p":0.9}]
233
+ """
234
+ And step "build.review.closing" runs its script
235
+ When the process is driven
236
+ Then the process rests at "build.review.await-review"
237
+ When gtd lands
238
+ And the process is driven
239
+ Then the process rests at "idle"
240
+ And ".gtd/REVIEW.md" does not exist
241
+ And the commit subjects end with:
242
+ """
243
+ gtd(check): build.review.composing → build.review.await-review
244
+ gtd(human): build.review.await-review → build.review.closing
245
+ gtd(check): build.review.closing → idle
246
+ """
@@ -64,7 +64,7 @@ Feature: a naive pass the judge rules land is itself the implementation
64
64
 
65
65
  Scenario: a land judgment applies the naive pass and runs from idle to the review gate with no rebuild
66
66
  When the process is driven
67
- Then the process rests at "build.review.reviewing"
67
+ Then the process rests at "build.review.composing"
68
68
  And "src/greeting.ts" contains "Hello, world"
69
69
  And "src/acceptance.test.ts" contains "[AC-1] holds"
70
70
  And the commit subjects end with:
@@ -81,7 +81,7 @@ Feature: a naive pass the judge rules land is itself the implementation
81
81
  gtd(check): implement.health.check → implement.coverage
82
82
  gtd(judge): implement.coverage → implement.closing
83
83
  gtd(check): implement.closing → build.quality.correctness.reviewing
84
- gtd(agent): build.quality.correctness.reviewing → build.review.reviewing
84
+ gtd(agent): build.quality.correctness.reviewing → build.review.composing
85
85
  """
86
86
  And the commit "gtd(human): idle → unwind" has a body containing "Gtd-Var: flag_risk_tier=0"
87
87
  And the commit "gtd(agent): seam.naive → seam.check" has a body containing "Gtd-Kept:"
@@ -1,14 +1,16 @@
1
1
  @inmem
2
- Feature: quality findings left unresolved hold a feature process short of its review
2
+ Feature: quality findings left unresolved between slices hold the next slice back
3
3
 
4
- When the quality lap's fix cap leaves `.gtd/QUALITY.md` behind, the process
5
- rests for a person instead of handing findings nobody acted on to the
6
- human review.
4
+ Between slices no review reads the quality lap's leftovers, so when the fix
5
+ cap leaves `.gtd/QUALITY.md` behind the process rests for a person before
6
+ the next slice. The last slice's leftovers become review notes instead (see
7
+ `lens-review.feature`).
7
8
 
8
9
  Background:
9
10
  Given the shipped workflows, as gtd install scaffolds them
10
11
  And an environment variable "GTD_QUALITYREVIEWS" set to "correctness"
11
12
  And an environment variable "GTD_FLAGMODE" set to "false"
13
+ And an environment variable "GTD_SLICEMAXCRITERIA" set to "1"
12
14
  And a file "src/calc.ts" with:
13
15
  """
14
16
  export const add = (a: number, b: number) => a + b
@@ -16,9 +18,9 @@ Feature: quality findings left unresolved hold a feature process short of its re
16
18
  And the working tree is committed as "feat: add calculator"
17
19
  And a file "TODO.md" with:
18
20
  """
19
- # Add subtract
21
+ # More arithmetic
20
22
 
21
- subtract(a, b) returns the difference.
23
+ subtract and multiply.
22
24
  """
23
25
  And step "unwind" changes nothing
24
26
  And step "start-gate.check" changes nothing
@@ -26,41 +28,53 @@ Feature: quality findings left unresolved hold a feature process short of its re
26
28
  """
27
29
  # Requirements
28
30
 
29
- ## Concerns
30
-
31
- ### Subtract
32
-
33
- - `subtract(a, b)` returns `a - b`.
34
-
35
31
  ## Acceptance Criteria
36
32
 
37
33
  - AC-1: subtract(a, b) returns a - b.
34
+ - AC-2: multiply(a, b) returns a * b.
38
35
  """
39
36
  And step "design.gate.answer" changes nothing
40
- And step "seam.naive" writes "src/calc.test.ts" with:
37
+ And step "design.slicing" writes ".gtd/SLICES.md" with:
38
+ """
39
+ # Slices
40
+
41
+ ## Subtract
42
+
43
+ - AC-1
44
+
45
+ ## Multiply
46
+
47
+ - AC-2
48
+ """
49
+ And step "seam.naive", when prompted with "This slice builds AC-1 only", writes "src/sub.test.ts" with:
41
50
  """
42
51
  it("[AC-1] subtracts", () => {})
43
52
  """
44
- And step "seam.naive" writes "src/calc.ts" with:
53
+ And step "seam.naive", when prompted with "This slice builds AC-2 only", writes "src/mul.test.ts" with:
45
54
  """
46
- export const add = (a: number, b: number) => a + b
47
- export const subtract = (a: number, b: number) => a - b
55
+ it("[AC-2] multiplies", () => {})
48
56
  """
49
57
  And step "seam.check" changes nothing
50
58
  And step "implement.applying" runs its script
51
59
  And step "implement.health.check" changes nothing
52
60
  And step "implement.closing" runs its script
53
- And judge step "implement.coverage" answers:
61
+ And judge step "implement.coverage", when its questions contain "AC-1", answers:
54
62
  """
55
63
  [{"id":"AC-1","answer":"yes","p":0.9}]
56
64
  """
65
+ And judge step "implement.coverage", when its questions contain "AC-2", answers:
66
+ """
67
+ [{"id":"AC-2","answer":"yes","p":0.9}]
68
+ """
57
69
 
58
- Scenario: findings the fix cap left unresolved rest at build.quality-unresolved
70
+ Scenario: findings the fix cap left after a slice rest at build.quality-unresolved
59
71
  Given step "build.quality.correctness.reviewing" writes ".gtd/QUALITY.md" with:
60
72
  """
61
73
  # Quality
62
74
 
63
- - subtract has no test
75
+ ## subtract has no negative test
76
+
77
+ Add a test subtracting a larger number.
64
78
  """
65
79
  And step "build.fix.quality.fixing" from now on changes nothing
66
80
  And step "build.health.describe" writes ".gtd/ESCALATION.md" with:
@@ -74,33 +88,34 @@ Feature: quality findings left unresolved hold a feature process short of its re
74
88
  Given step "build.fix" writes "src/calc.ts" with:
75
89
  """
76
90
  export const add = (a: number, b: number) => a + b
77
- export const subtract = (a: number, b: number) => a - b
78
91
  // checked
79
92
  """
80
93
  And step "build.health.check" changes nothing
81
94
  When gtd lands
82
95
  And the process is driven
83
96
  Then the process rests at "build.quality-unresolved"
84
- And ".gtd/QUALITY.md" contains "subtract has no test"
97
+ And ".gtd/QUALITY.md" contains "subtract has no negative test"
85
98
 
86
99
  When gtd lands
87
100
  And the process is driven
88
101
  Then the process rests at "build.quality-unresolved"
89
102
 
90
- Given a file "src/calc.ts" with:
91
- """
92
- export const add = (a: number, b: number) => a + b
93
- export const subtract = (a: number, b: number) => a - b
94
- // checked by hand
95
- """
96
- And the file ".gtd/QUALITY.md" is deleted
97
- And step "build.health.check" changes nothing
103
+ Given the file ".gtd/QUALITY.md" is deleted
104
+ And step "build.quality.correctness.reviewing" from now on changes nothing
105
+ And step "build.review.composing" runs its script
98
106
  When gtd lands
99
107
  And the process is driven
100
- Then the process rests at "build.review.reviewing"
108
+ Then the process rests at "build.review.await-review"
101
109
  And the commit subjects end with:
102
110
  """
103
- gtd(check): build.health.check → build.quality-unresolved
104
111
  gtd(human): build.quality-unresolved → build.health.check
105
- gtd(check): build.health.check → build.review.reviewing
112
+ gtd(check): build.health.check → seam.naive
113
+ gtd(agent): seam.naive → seam.check
114
+ gtd(check): seam.check → implement.applying
115
+ gtd(check): implement.applying → implement.health.check
116
+ gtd(check): implement.health.check → implement.coverage
117
+ gtd(judge): implement.coverage → implement.closing
118
+ gtd(check): implement.closing → build.quality.correctness.reviewing
119
+ gtd(agent): build.quality.correctness.reviewing → build.review.composing
120
+ gtd(check): build.review.composing → build.review.await-review
106
121
  """
@@ -69,7 +69,7 @@ Feature: a refactor that carried the whole feature still gets a quality lap over
69
69
  """
70
70
  And step "refactor.health.check" changes nothing
71
71
  And step "refactor.closing" runs its script
72
- And step "refactor.build.review.reviewing" writes ".gtd/REVIEW.md" with:
72
+ And step "refactor.build.review.composing" writes ".gtd/REVIEW.md" with:
73
73
  """
74
74
  # Review: abc1234
75
75
 
@@ -113,7 +113,7 @@ Feature: a refactor that carried the whole feature still gets a quality lap over
113
113
 
114
114
  Given step "build.quality.correctness.reviewing" changes nothing
115
115
  When the process is driven
116
- Then the process rests at "build.review.reviewing"
116
+ Then the process rests at "build.review.composing"
117
117
  And "src/calc.ts" contains "subtract"
118
118
  And the commit subjects end with:
119
119
  """
@@ -123,7 +123,7 @@ Feature: a refactor that carried the whole feature still gets a quality lap over
123
123
  gtd(check): implement.health.check → implement.coverage
124
124
  gtd(judge): implement.coverage → implement.closing
125
125
  gtd(check): implement.closing → build.quality.correctness.reviewing
126
- gtd(agent): build.quality.correctness.reviewing → build.review.reviewing
126
+ gtd(agent): build.quality.correctness.reviewing → build.review.composing
127
127
  """
128
128
  And the output lines of gtd "slices" start with:
129
129
  """
@@ -72,7 +72,7 @@ Feature: a refactor-first judgment walks one fixed path to the review gate
72
72
  """
73
73
  And step "refactor.health.check" changes nothing
74
74
  And step "refactor.closing" runs its script
75
- And step "refactor.build.review.reviewing" writes ".gtd/REVIEW.md" with:
75
+ And step "refactor.build.review.composing" writes ".gtd/REVIEW.md" with:
76
76
  """
77
77
  # Review: abc1234
78
78
 
@@ -121,7 +121,7 @@ Feature: a refactor-first judgment walks one fixed path to the review gate
121
121
  [{"id":"AC-1","answer":"yes","p":0.9}]
122
122
  """
123
123
  When the process is driven
124
- Then the process rests at "build.review.reviewing"
124
+ Then the process rests at "build.review.composing"
125
125
  And "src/calc.ts" contains "op(a, b, 1)"
126
126
  And "src/calc.ts" contains "subtract"
127
127
  And the commit subjects end with:
@@ -138,14 +138,14 @@ Feature: a refactor-first judgment walks one fixed path to the review gate
138
138
  gtd(check): refactor.deriving → refactor.building
139
139
  gtd(agent): refactor.building → refactor.health.check
140
140
  gtd(check): refactor.health.check → refactor.closing
141
- gtd(check): refactor.closing → refactor.build.review.reviewing
142
- gtd(agent): refactor.build.review.reviewing → refactor.build.review.await-review
141
+ gtd(check): refactor.closing → refactor.build.review.composing
142
+ gtd(check): refactor.build.review.composing → refactor.build.review.await-review
143
143
  gtd(human): refactor.build.review.await-review → refactor.build.review.closing
144
144
  gtd(check): refactor.build.review.closing → implement.building
145
145
  gtd(agent): implement.building → implement.health.check
146
146
  gtd(check): implement.health.check → implement.coverage
147
147
  gtd(judge): implement.coverage → implement.closing
148
- gtd(check): implement.closing → build.review.reviewing
148
+ gtd(check): implement.closing → build.review.composing
149
149
  """
150
150
  And the commit "gtd(human): idle → unwind" has a body containing "Gtd-Var: flag_risk_tier=0"
151
151
  And the commit "gtd(agent): seam.naive → seam.check" has a body containing "Gtd-Kept:"
@@ -83,7 +83,7 @@ Feature: refactor-first writes a refactor note, refactors on its own, then rebui
83
83
  """
84
84
  And step "refactor.health.check" changes nothing
85
85
  And step "refactor.closing" runs its script
86
- And step "refactor.build.review.reviewing" writes ".gtd/REVIEW.md" with:
86
+ And step "refactor.build.review.composing" writes ".gtd/REVIEW.md" with:
87
87
  """
88
88
  # Review: abc1234
89
89
 
@@ -147,7 +147,7 @@ Feature: refactor-first writes a refactor note, refactors on its own, then rebui
147
147
  """
148
148
  And step "refactor.health.check" changes nothing
149
149
  And step "refactor.closing" runs its script
150
- And step "refactor.build.review.reviewing" writes ".gtd/REVIEW.md" with:
150
+ And step "refactor.build.review.composing" writes ".gtd/REVIEW.md" with:
151
151
  """
152
152
  # Review: abc1234
153
153
 
@@ -193,7 +193,7 @@ Feature: refactor-first writes a refactor note, refactors on its own, then rebui
193
193
  """
194
194
  And step "refactor.health.check" changes nothing
195
195
  And step "refactor.closing" runs its script
196
- And step "refactor.build.review.reviewing" writes ".gtd/REVIEW.md" with:
196
+ And step "refactor.build.review.composing" writes ".gtd/REVIEW.md" with:
197
197
  """
198
198
  # Review: abc1234
199
199
 
@@ -242,7 +242,7 @@ Feature: refactor-first writes a refactor note, refactors on its own, then rebui
242
242
  [{"id":"AC-1","answer":"yes","p":0.9}]
243
243
  """
244
244
  When the process is driven
245
- Then the process rests at "build.review.reviewing"
245
+ Then the process rests at "build.review.composing"
246
246
  And "src/calc.ts" contains "op(a, b, -1)"
247
247
  And "src/acceptance.test.ts" contains "[AC-1]"
248
248
  And ".gtd/REFACTOR-NOTE.md" does not exist
@@ -253,14 +253,14 @@ Feature: refactor-first writes a refactor note, refactors on its own, then rebui
253
253
  gtd(check): refactor.deriving → refactor.building
254
254
  gtd(agent): refactor.building → refactor.health.check
255
255
  gtd(check): refactor.health.check → refactor.closing
256
- gtd(check): refactor.closing → refactor.build.review.reviewing
257
- gtd(agent): refactor.build.review.reviewing → refactor.build.review.await-review
256
+ gtd(check): refactor.closing → refactor.build.review.composing
257
+ gtd(check): refactor.build.review.composing → refactor.build.review.await-review
258
258
  gtd(human): refactor.build.review.await-review → refactor.build.review.closing
259
259
  gtd(check): refactor.build.review.closing → implement.building
260
260
  gtd(agent): implement.building → implement.health.check
261
261
  gtd(check): implement.health.check → implement.coverage
262
262
  gtd(judge): implement.coverage → implement.closing
263
- gtd(check): implement.closing → build.review.reviewing
263
+ gtd(check): implement.closing → build.review.composing
264
264
  """
265
265
  And the output lines of gtd "slices" start with:
266
266
  """