@pmelab/gtd 54.0.0 → 56.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +109 -104
  3. package/dist/chunks/{reserved-CQ7amcKG.mjs → reserved-B8EC-WE8.mjs} +124 -230
  4. package/dist/chunks/{review-CXzUXJHL.mjs → review-HdrX0FJ7.mjs} +30 -125
  5. package/dist/chunks/{steering-CLhu8C7q.mjs → steering-CCNvngSH.mjs} +256 -65
  6. package/dist/chunks/{tail-JZ9PAOwp.mjs → tail-BSLah2mA.mjs} +155 -63
  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 +47 -102
  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 +614 -574
  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 +104 -0
  36. package/src/workflows/feature/feature.test.ts +1 -1
  37. package/src/workflows/feature/feature.ts +17 -20
  38. package/src/workflows/feature/green.ts +2 -5
  39. package/src/workflows/feature/lens-review.feature +323 -171
  40. package/src/workflows/feature/naive-acceptance.feature +31 -32
  41. package/src/workflows/feature/prototype.ts +5 -8
  42. package/src/workflows/feature/refactor-absorbs.feature +1 -7
  43. package/src/workflows/feature/refactor-first.feature +2 -10
  44. package/src/workflows/feature/refactor-rebuild.feature +20 -36
  45. package/src/workflows/feature/refactor-review.feature +33 -117
  46. package/src/workflows/feature/refactor.test.ts +0 -2
  47. package/src/workflows/feature/refactor.ts +0 -1
  48. package/src/workflows/feature/review-gate.feature +6 -22
  49. package/src/workflows/feature/reviewer-walkthrough.feature +16 -103
  50. package/src/workflows/feature/seam.test.ts +19 -101
  51. package/src/workflows/feature/seam.ts +13 -89
  52. package/src/workflows/feature/standards.feature +75 -34
  53. package/src/workflows/fix/fix-lens-origin.feature +20 -7
  54. package/src/workflows/fix/fix-quality.feature +104 -23
  55. package/src/workflows/review/review-door.feature +62 -59
  56. package/src/workflows/shared/access.test.ts +1 -0
  57. package/src/workflows/shared/learn.test.ts +0 -14
  58. package/src/workflows/shared/learn.ts +1 -6
  59. package/src/workflows/shared/lenses.ts +149 -43
  60. package/src/workflows/shared/review.test.ts +30 -27
  61. package/src/workflows/shared/review.ts +29 -196
  62. package/src/workflows/shared/skills.test.ts +3 -1
  63. package/src/workflows/shared/steps.test.ts +9 -6
  64. package/src/workflows/shared/steps.ts +12 -3
  65. package/src/workflows/shared/tail.test.ts +20 -2
  66. package/src/workflows/shared/tail.ts +38 -16
  67. package/src/workflows/shared/text.test.ts +122 -294
  68. package/src/workflows/shared/text.ts +181 -358
  69. package/src/workflows/shared/vars.ts +1 -1
  70. package/src/workflows/feature/review-answers.feature +0 -324
  71. package/src/workflows/feature/severity-budget.feature +0 -116
  72. package/src/workflows/feature/severity-sorted-review.feature +0 -198
@@ -1,14 +1,16 @@
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.
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.
8
10
 
9
11
  Background:
10
12
  Given the shipped workflows, as gtd install scaffolds them
11
- And an environment variable "GTD_QUALITYREVIEWS" set to "correctness"
13
+ And an environment variable "GTD_QUALITYREVIEWS" set to "criteria-coverage, correctness"
12
14
  And a file "src/calc.ts" with:
13
15
  """
14
16
  export const add = (a: number, b: number) => a + b
@@ -56,6 +58,8 @@ Feature: fix's quality lap is triaged, and its leftovers go to the hand-off revi
56
58
  The glossary says plus.
57
59
  """
58
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
59
63
  And step "build.quality.closing" runs its script
60
64
  And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
61
65
  """
@@ -70,7 +74,7 @@ Feature: fix's quality lap is triaged, and its leftovers go to the hand-off revi
70
74
  """
71
75
  And step "build.review.carrying" runs its script
72
76
 
73
- 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
74
78
  Given judge step "build.quality.triage" answers:
75
79
  """
76
80
  [{"id":"Q1","answer":"mechanical","p":0.9},{"id":"Q2","answer":"design","p":0.9}]
@@ -78,35 +82,72 @@ Feature: fix's quality lap is triaged, and its leftovers go to the hand-off revi
78
82
  And step "build.fix.quality.fixing" changes nothing
79
83
  When gtd opens door "fix"
80
84
  And the process is driven
81
- Then the process rests at "build.review.await-review"
82
- And ".gtd/QUALITY.md" does not exist
85
+ Then the process rests at "build.quality.gate"
83
86
  And no commit body contains "build.health.describe"
84
- And ".gtd/REVIEW.md" contains:
87
+ And no commit body contains "build.quality.criteria-coverage"
88
+ And ".gtd/QUALITY.md" contains:
85
89
  """
86
- ## sum has no negative test
90
+ ## sum should be named plus
87
91
 
88
92
  _From lens correctness._
89
93
 
90
- _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
91
105
  """
92
- And ".gtd/REVIEW.md" contains:
106
+ Given a file ".gtd/QUALITY.md" with:
93
107
  """
94
- ## sum should be named plus
108
+ # Quality
95
109
 
96
- _From lens correctness._
110
+ ## sum should be named plus
97
111
 
98
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:
99
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:"
100
145
  And the commit subjects end with:
101
146
  """
102
- gtd(agent): build.quality.correctness.reviewing → build.quality.triage
103
- gtd(judge): build.quality.triage → build.quality.sorting
104
- gtd(check): build.quality.sorting → build.fix.quality.fixing
105
- gtd(agent): build.fix.quality.fixing
106
- 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
107
149
  gtd(agent): build.fix.quality.fixing → build.health.check
108
- gtd(check): build.health.check → build.quality.closing
109
- gtd(check): build.quality.closing → build.review.reviewing
150
+ gtd(check): build.health.check → build.review.reviewing
110
151
  gtd(agent): build.review.reviewing → build.review.carrying
111
152
  gtd(check): build.review.carrying → build.review.await-review
112
153
  """
@@ -121,11 +162,51 @@ Feature: fix's quality lap is triaged, and its leftovers go to the hand-off revi
121
162
  it("sums negative numbers", () => {})
122
163
  """
123
164
  And step "build.fix.quality.fixing" deletes ".gtd/QUALITY.md"
165
+ And step "build.quality.gate" changes nothing
124
166
  When gtd opens door "fix"
125
167
  And the process is driven
126
168
  Then the process rests at "build.review.await-review"
127
- And no commit body contains "build.quality.closing"
128
- And ".gtd/REVIEW.md" contains "## Fixed automatically"
169
+ And ".gtd/REVIEW.md" contains "Fixed automatically:"
129
170
  And ".gtd/REVIEW.md" contains "- sum has no negative test ("
130
171
  And ".gtd/REVIEW.md" contains the short hash of the commit "gtd(agent): build.fix.quality.fixing → build.health.check"
131
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 =>"
@@ -19,6 +19,7 @@ describe("the bundled workflow's access export", () => {
19
19
  "build.quality.test-audit": { write: [] },
20
20
  "build.quality.conventions": { write: [] },
21
21
  "build.quality.spec-challenge": { write: [] },
22
+ "build.quality.criteria-coverage": { write: [] },
22
23
  "refactor.build.review": { write: [".gtd/REVIEW.md"] },
23
24
  "refactor.build.quality.correctness": { write: [] },
24
25
  "refactor.build.quality.ponytail-review": { write: [] },
@@ -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