@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,11 +1,12 @@
1
1
  @inmem
2
- Feature: fix's quality lap is triaged, and its leftovers go to the hand-off review
2
+ Feature: fix's quality lap is triaged, and its leftovers are decided at the finding gate
3
3
 
4
4
  A judge sorts the lap's findings: mechanical ones are fixed for up to three
5
- turns, noise is dropped, and design ones — with whatever the fix turns left —
6
- are added to the reviewer's `.gtd/REVIEW.md` by gtd, never to a person's
7
- gate before the review. With no requirements to check against, the
8
- `criteria-coverage` lens runs no turn.
5
+ turns, and the design ones — with whatever the fix turns left, and the
6
+ noise — wait at the finding gate, never at an escalation. A ticked one is
7
+ fixed on the spot; the hand-off review lists what became of each in its
8
+ summary and carries no finding on to the next `fix`. With no requirements
9
+ to check against, the `criteria-coverage` lens runs no turn.
9
10
 
10
11
  Background:
11
12
  Given the shipped workflows, as gtd install scaffolds them
@@ -57,6 +58,8 @@ Feature: fix's quality lap is triaged, and its leftovers go to the hand-off revi
57
58
  The glossary says plus.
58
59
  """
59
60
  And step "build.quality.sorting" runs its script
61
+ And step "build.quality.gating" runs its script
62
+ And step "build.quality.picking" runs its script
60
63
  And step "build.quality.closing" runs its script
61
64
  And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
62
65
  """
@@ -71,7 +74,7 @@ Feature: fix's quality lap is triaged, and its leftovers go to the hand-off revi
71
74
  """
72
75
  And step "build.review.carrying" runs its script
73
76
 
74
- Scenario: a design finding and one the fix cap left reach the reviewer, never an escalation
77
+ Scenario: a design finding and one the fix cap left reach the finding gate, and a ticked one is fixed there
75
78
  Given judge step "build.quality.triage" answers:
76
79
  """
77
80
  [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"design","p":0.9}]
@@ -79,36 +82,72 @@ Feature: fix's quality lap is triaged, and its leftovers go to the hand-off revi
79
82
  And step "build.fix.quality.fixing" changes nothing
80
83
  When gtd opens door "fix"
81
84
  And the process is driven
82
- Then the process rests at "build.review.await-review"
83
- And ".gtd/QUALITY.md" does not exist
85
+ Then the process rests at "build.quality.gate"
84
86
  And no commit body contains "build.health.describe"
85
87
  And no commit body contains "build.quality.criteria-coverage"
86
- And ".gtd/REVIEW.md" contains:
88
+ And ".gtd/QUALITY.md" contains:
87
89
  """
88
- ## sum has no negative test
90
+ ## sum should be named plus
89
91
 
90
92
  _From lens correctness._
91
93
 
92
- _The fixer left this unresolved._
94
+ The glossary says plus.
95
+
96
+ - [ ] fix
97
+
98
+ ## sum has no negative test
99
+
100
+ _From lens correctness. The fixer left it unresolved._
101
+
102
+ Add a test summing negative numbers.
103
+
104
+ - [ ] fix
93
105
  """
94
- And ".gtd/REVIEW.md" contains:
106
+ Given a file ".gtd/QUALITY.md" with:
95
107
  """
96
- ## sum should be named plus
108
+ # Quality
97
109
 
98
- _From lens correctness._
110
+ ## sum should be named plus
99
111
 
100
112
  The glossary says plus.
113
+
114
+ - [x] fix
115
+
116
+ ## sum has no negative test
117
+
118
+ Add a test summing negative numbers.
119
+
120
+ - [ ] fix
121
+ """
122
+ And step "build.fix.quality.fixing" is no longer scripted
123
+ And step "build.fix.quality.fixing" writes "src/calc.ts" with:
124
+ """
125
+ export const plus = (a: number, b: number) => a + b
126
+ """
127
+ And step "build.fix.quality.fixing" deletes ".gtd/QUALITY.md"
128
+ When gtd lands
129
+ And the process is driven
130
+ Then the process rests at "build.review.await-review"
131
+ And ".gtd/QUALITY.md" does not exist
132
+ And ".gtd/REVIEW.md" contains:
101
133
  """
134
+ Fixed at the finding gate:
135
+
136
+ - sum should be named plus (
137
+ """
138
+ And ".gtd/REVIEW.md" contains:
139
+ """
140
+ Dropped at the finding gate:
141
+
142
+ - sum has no negative test (lens correctness)
143
+ """
144
+ And ".gtd/REVIEW.md" does not contain "Tick exactly one:"
102
145
  And the commit subjects end with:
103
146
  """
104
- gtd(agent): build.quality.correctness.reviewing → build.quality.triage
105
- gtd(judge): build.quality.triage → build.quality.sorting
106
- gtd(check): build.quality.sorting → build.fix.quality.fixing
107
- gtd(agent): build.fix.quality.fixing
108
- gtd(agent): build.fix.quality.fixing
147
+ gtd(human): build.quality.gate → build.quality.picking
148
+ gtd(check): build.quality.picking → build.fix.quality.fixing
109
149
  gtd(agent): build.fix.quality.fixing → build.health.check
110
- gtd(check): build.health.check → build.quality.closing
111
- gtd(check): build.quality.closing → build.review.reviewing
150
+ gtd(check): build.health.check → build.review.reviewing
112
151
  gtd(agent): build.review.reviewing → build.review.carrying
113
152
  gtd(check): build.review.carrying → build.review.await-review
114
153
  """
@@ -123,11 +162,51 @@ Feature: fix's quality lap is triaged, and its leftovers go to the hand-off revi
123
162
  it("sums negative numbers", () => {})
124
163
  """
125
164
  And step "build.fix.quality.fixing" deletes ".gtd/QUALITY.md"
165
+ And step "build.quality.gate" changes nothing
126
166
  When gtd opens door "fix"
127
167
  And the process is driven
128
168
  Then the process rests at "build.review.await-review"
129
- And no commit body contains "build.quality.closing"
130
- And ".gtd/REVIEW.md" contains "## Fixed automatically"
169
+ And ".gtd/REVIEW.md" contains "Fixed automatically:"
131
170
  And ".gtd/REVIEW.md" contains "- sum has no negative test ("
132
171
  And ".gtd/REVIEW.md" contains the short hash of the commit "gtd(agent): build.fix.quality.fixing → build.health.check"
133
172
  And ".gtd/REVIEW.md" contains "- sum should be named plus (p=0.9, lens correctness)"
173
+
174
+ Scenario: a risk the hand-off reviewer marks is fixed and re-reviewed in its own draft, the summary added once
175
+ Given judge step "build.quality.triage" answers:
176
+ """
177
+ [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"noise","p":0.9}]
178
+ """
179
+ And step "build.fix.quality.fixing" deletes ".gtd/QUALITY.md"
180
+ And step "build.quality.gate" changes nothing
181
+ And step "build.review.reviewing" is no longer scripted
182
+ And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
183
+ """
184
+ # Review: abc1234
185
+
186
+ <!-- base: 0000000 -->
187
+
188
+ ## calc
189
+
190
+ - [ ] ./src/calc.ts#1-1 — Risk: overflows on large numbers
191
+ """
192
+ When gtd opens door "fix"
193
+ And the process is driven
194
+ Then the process rests at "build.review.fix.risks.fixing"
195
+ And ".gtd/REVIEW.md" does not contain "## Quality lap"
196
+ Given step "build.review.reviewing" is no longer scripted
197
+ And step "build.review.reviewing" replaces the text "Risk: overflows on large numbers" in ".gtd/REVIEW.md" with "sum, now guarded"
198
+ And step "build.review.fix.risks.fixing" changes nothing
199
+ When the process is driven
200
+ Then the process rests at "build.review.await-review"
201
+ And ".gtd/REVIEW.md" contains "sum, now guarded"
202
+ And ".gtd/REVIEW.md" contains "## Quality lap" exactly once
203
+ And ".gtd/REVIEW.md" contains "## calc" exactly once
204
+ And the commit subjects end with:
205
+ """
206
+ gtd(check): build.quality.closing → build.review.reviewing
207
+ gtd(agent): build.review.reviewing → build.review.fix.risks.fixing
208
+ gtd(agent): build.review.fix.risks.fixing → build.health.check
209
+ gtd(check): build.health.check → build.review.reviewing
210
+ gtd(agent): build.review.reviewing → build.review.carrying
211
+ gtd(check): build.review.carrying → build.review.await-review
212
+ """
@@ -2,9 +2,10 @@
2
2
  Feature: the review door fixes its notes in the same process
3
3
 
4
4
  `gtd door review` runs the feature's review over everything since its base:
5
- the triaged quality lap writes `.gtd/REVIEW.md`, the human answers each note,
6
- and what they ask for is fixed in place under the health loop before the
7
- review comes back. A sign-off ends the process; nothing is left for `fix`.
5
+ the triaged quality lap and its finding gate, then a reviewer's walkthrough
6
+ of the change with the lap's summary, where the human's notes are fixed in
7
+ place under the health loop before the review comes back. A sign-off ends
8
+ the process; nothing is left for `fix`.
8
9
 
9
10
  Background:
10
11
  Given the shipped workflows, as gtd install scaffolds them
@@ -24,15 +25,27 @@ Feature: the review door fixes its notes in the same process
24
25
 
25
26
  Add a test for add.
26
27
  """
27
- And step "build.quality.sorting" runs its script
28
28
  And judge step "build.quality.triage" answers:
29
29
  """
30
30
  [{"id":"Q1","answer":"design","p":0.9}]
31
31
  """
32
- And step "build.review.composing" runs its script
32
+ And step "build.quality.gating" runs its script
33
+ And step "build.quality.gate" changes nothing
34
+ And step "build.quality.closing" runs its script
35
+ And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
36
+ """
37
+ # Review: abc1234
38
+
39
+ <!-- base: 0000000 -->
40
+
41
+ ## Calculator
42
+
43
+ - [ ] ./src/calc.ts#1-1 — add(a, b)
44
+ """
45
+ And step "build.review.carrying" runs its script
33
46
  And step "build.review.closing" runs its script
34
47
 
35
- Scenario: the review is composed from the lap's notes, with answer boxes
48
+ Scenario: the review is a walkthrough, its summary listing what the finding gate dropped
36
49
  When gtd opens door "review" with "HEAD~1"
37
50
  And the process is driven
38
51
  Then the process rests at "build.review.await-review"
@@ -41,72 +54,65 @@ Feature: the review door fixes its notes in the same process
41
54
  gtd(human): review-gate.check
42
55
  gtd(check): review-gate.check → build.quality.correctness.reviewing
43
56
  gtd(agent): build.quality.correctness.reviewing → build.quality.triage
44
- gtd(judge): build.quality.triage → build.quality.sorting
45
- gtd(check): build.quality.sorting → build.review.composing
46
- gtd(check): build.review.composing → build.review.await-review
57
+ gtd(judge): build.quality.triage → build.quality.gating
58
+ gtd(check): build.quality.gating → build.quality.gate
59
+ gtd(human): build.quality.gate → build.quality.closing
60
+ gtd(check): build.quality.closing → build.review.reviewing
61
+ gtd(agent): build.review.reviewing → build.review.carrying
62
+ gtd(check): build.review.carrying → build.review.await-review
47
63
  """
48
64
  And ".gtd/REVIEW.md" contains:
49
65
  """
50
- ## add has no test
51
-
52
- Add a test for add.
66
+ ## Calculator
53
67
 
54
- Tick exactly one:
68
+ - [ ] ./src/calc.ts#1-1 — add(a, b)
55
69
 
56
- - [ ] fix as suggested
57
- - [ ] won't fix
58
- - [ ] _your answer_
70
+ ## Quality lap
59
71
  """
60
-
61
- Scenario: a won't-fix signs off, and no review is left for fix
62
- Given judge step "build.review.standards.judge" answers:
72
+ And ".gtd/REVIEW.md" contains:
63
73
  """
64
- [{"id":"standard-1","answer":"no","p":0.9}]
74
+ Dropped at the finding gate:
75
+
76
+ - add has no test (lens correctness)
65
77
  """
66
- When gtd opens door "review" with "HEAD~1"
67
- And the process is driven
68
- And the text "- [ ] won't fix" in ".gtd/REVIEW.md" is replaced with "- [x] won't fix"
69
- And gtd lands
78
+ And ".gtd/REVIEW.md" does not contain "Tick exactly one:"
79
+ When gtd lands
70
80
  And the process is driven
71
81
  Then the process rests at "idle"
72
82
  And ".gtd/REVIEW.md" does not exist
73
83
  And ".gtd/REVIEW.orig.md" does not exist
74
84
 
75
- Scenario: a note ticked fix as suggested is fixed in place, then reviewed again
76
- Given step "build.review.fix.nits.fixing" writes "src/calc.test.ts" with:
85
+ Scenario: a nit note is fixed in place, then reviewed again
86
+ Given judge step "build.review.triage" answers:
87
+ """
88
+ [{"id":"note-1","answer":"nit","p":0.9}]
89
+ """
90
+ And step "build.review.fix.nits.fixing" writes "src/calc.test.ts" with:
77
91
  """
78
92
  it("adds", () => {})
79
93
  """
80
94
  When gtd opens door "review" with "HEAD~1"
81
95
  And the process is driven
82
- And the text "- [ ] fix as suggested" in ".gtd/REVIEW.md" is replaced with "- [x] fix as suggested"
96
+ And the text "— add(a, b)" in ".gtd/REVIEW.md" is replaced with "— add(a, b) — add a test for it"
83
97
  And gtd lands
84
98
  And the process is driven
85
99
  Then the process rests at "build.review.await-review"
86
100
  And the commit subjects end with:
87
101
  """
88
- gtd(human): build.review.await-review → build.review.fix.nits.fixing
102
+ gtd(human): build.review.await-review → build.review.triage
103
+ gtd(judge): build.review.triage → build.review.fix.nits.fixing
89
104
  gtd(agent): build.review.fix.nits.fixing → build.health.check
90
105
  gtd(check): build.health.check → build.review.closing
91
- gtd(check): build.review.closing → build.review.composing
92
- gtd(check): build.review.composing → build.review.await-review
106
+ gtd(check): build.review.closing → build.review.reviewing
107
+ gtd(agent): build.review.reviewing → build.review.carrying
108
+ gtd(check): build.review.carrying → build.review.await-review
93
109
  """
94
- And ".gtd/REVIEW.md" contains "## Fixed from your notes"
95
110
  And "src/calc.test.ts" contains "adds"
96
- When gtd lands
97
- And the process is driven
98
- Then the process rests at "idle"
99
- And ".gtd/REVIEW.md" does not exist
100
- And ".gtd/REVIEW.orig.md" does not exist
101
111
 
102
- Scenario: an own answer asking for a change is fixed in place, then reviewed again
103
- Given judge step "build.review.standards.judge" answers:
104
- """
105
- [{"id":"standard-1","answer":"no","p":0.9}]
106
- """
107
- And judge step "build.review.triage" answers:
112
+ Scenario: a note asking for a change is fixed in place, then reviewed again
113
+ Given judge step "build.review.triage" answers:
108
114
  """
109
- [{"id":"answer-1","answer":"edit","p":0.9}]
115
+ [{"id":"note-1","answer":"edit","p":0.9}]
110
116
  """
111
117
  And step "build.review.collecting" writes ".gtd/REQUIREMENTS.md" with:
112
118
  """
@@ -125,14 +131,13 @@ Feature: the review door fixes its notes in the same process
125
131
  And step "feedback.closing" runs its script
126
132
  When gtd opens door "review" with "HEAD~1"
127
133
  And the process is driven
128
- And the text "- [ ] _your answer_" in ".gtd/REVIEW.md" is replaced with "- [x] test negatives too"
134
+ And the text "— add(a, b)" in ".gtd/REVIEW.md" is replaced with "— add(a, b) — test negatives too"
129
135
  And gtd lands
130
136
  And the process is driven
131
137
  Then the process rests at "build.review.await-review"
132
138
  And the commit subjects end with:
133
139
  """
134
- gtd(human): build.review.await-review → build.review.standards.judge
135
- gtd(judge): build.review.standards.judge → build.review.triage
140
+ gtd(human): build.review.await-review → build.review.triage
136
141
  gtd(judge): build.review.triage → build.review.closing
137
142
  gtd(check): build.review.closing → build.review.collecting
138
143
  gtd(agent): build.review.collecting → re-unwind
@@ -141,9 +146,12 @@ Feature: the review door fixes its notes in the same process
141
146
  gtd(check): feedback.closing → build.health.check
142
147
  gtd(check): build.health.check → build.quality.correctness.reviewing
143
148
  gtd(agent): build.quality.correctness.reviewing → build.quality.triage
144
- gtd(judge): build.quality.triage → build.quality.sorting
145
- gtd(check): build.quality.sorting → build.review.composing
146
- gtd(check): build.review.composing → build.review.await-review
149
+ gtd(judge): build.quality.triage → build.quality.gating
150
+ gtd(check): build.quality.gating → build.quality.gate
151
+ gtd(human): build.quality.gate → build.quality.closing
152
+ gtd(check): build.quality.closing → build.review.reviewing
153
+ gtd(agent): build.review.reviewing → build.review.carrying
154
+ gtd(check): build.review.carrying → build.review.await-review
147
155
  """
148
156
  And ".gtd/REQUIREMENTS.md" does not exist
149
157
  And "src/calc.test.ts" contains "adds negatives"
@@ -158,17 +166,12 @@ Feature: the review door fixes its notes in the same process
158
166
  Then opening door "review" is refused with ".gtd/REQUIREMENTS.md is left over"
159
167
 
160
168
  Scenario: a note added with its own boxes is fixed as ticked, never judged
161
- Given judge step "build.review.standards.judge" answers:
162
- """
163
- [{"id":"standard-1","answer":"no","p":0.9}]
164
- """
165
- And step "build.review.fix.nits.fixing" writes "src/calc.ts" with:
169
+ Given step "build.review.fix.nits.fixing" writes "src/calc.ts" with:
166
170
  """
167
171
  export const add = (a: number, b: number): number => a + b
168
172
  """
169
173
  When gtd opens door "review" with "HEAD~1"
170
174
  And the process is driven
171
- And the text "- [ ] won't fix" in ".gtd/REVIEW.md" is replaced with "- [x] won't fix"
172
175
  And ".gtd/REVIEW.md" gets appended:
173
176
  """
174
177
  ## src/calc.ts:1 (thread PRRT_1)
@@ -186,11 +189,11 @@ Feature: the review door fixes its notes in the same process
186
189
  Then the process rests at "build.review.await-review"
187
190
  And the commit subjects end with:
188
191
  """
189
- gtd(human): build.review.await-review → build.review.standards.judge
190
- gtd(judge): build.review.standards.judge → build.review.fix.nits.fixing
192
+ gtd(human): build.review.await-review → build.review.fix.nits.fixing
191
193
  gtd(agent): build.review.fix.nits.fixing → build.health.check
192
194
  gtd(check): build.health.check → build.review.closing
193
- gtd(check): build.review.closing → build.review.composing
194
- gtd(check): build.review.composing → build.review.await-review
195
+ gtd(check): build.review.closing → build.review.reviewing
196
+ gtd(agent): build.review.reviewing → build.review.carrying
197
+ gtd(check): build.review.carrying → build.review.await-review
195
198
  """
196
199
  And "src/calc.ts" contains "): number =>"
@@ -117,20 +117,6 @@ describe("learnStandards", () => {
117
117
  })
118
118
 
119
119
  describe("learnStandards, from a won't-fix", () => {
120
- it("states the finding, not gtd's banner", async () => {
121
- state.answers = { "standard-1": yes }
122
- await learnStandards([
123
- {
124
- anchor: "Slow loop",
125
- // As the review parser hands it over: paragraphs joined by a space.
126
- body: "_The fixer left this unresolved._ The loop is quadratic.",
127
- choice: "wontfix",
128
- text: "",
129
- },
130
- ])
131
- expect(kept()).toBe(file("- Won't fix: Slow loop — The loop is quadratic."))
132
- })
133
-
134
120
  it("replaces an old standard hand-edited in case only", async () => {
135
121
  state.files[STANDARDS] = file(
136
122
  "- use classes.",
@@ -32,13 +32,8 @@ interface Candidate {
32
32
 
33
33
  const SUMMARY_MAX = 200
34
34
 
35
- // The banners composedReview opens a note with say nothing about the finding; the
36
- // parsed body has its paragraphs joined, so they are matched by their own text.
37
- const BANNER =
38
- /^_(?:The fixer left this unresolved\.|A fix turn removed this while renaming another finding — check whether it was fixed\.|No detail given\.)_\s*/
39
-
40
35
  const summary = (body: string): string => {
41
- const text = oneLine(body).replace(BANNER, "")
36
+ const text = oneLine(body)
42
37
  return text.length > SUMMARY_MAX ? `${text.slice(0, SUMMARY_MAX - 1)}…` : text
43
38
  }
44
39