@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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +109 -104
- package/dist/chunks/{reserved-CQ7amcKG.mjs → reserved-B8EC-WE8.mjs} +124 -230
- package/dist/chunks/{review-CXzUXJHL.mjs → review-HdrX0FJ7.mjs} +30 -125
- package/dist/chunks/{steering-CLhu8C7q.mjs → steering-CCNvngSH.mjs} +256 -65
- package/dist/chunks/{tail-JZ9PAOwp.mjs → tail-BSLah2mA.mjs} +155 -63
- package/dist/gtd.bundle.mjs +259 -22
- package/dist/steering.mjs +2 -2
- package/dist/testkit.mjs +6 -6
- package/dist/web/main.css +1 -1
- package/dist/web/main.js +551 -66
- package/dist/workflow-kit.mjs +1 -1
- package/dist/workflows/cleanup.mjs +2 -2
- package/dist/workflows/feature.mjs +47 -102
- package/dist/workflows/fix.mjs +3 -3
- package/dist/workflows/review.mjs +3 -3
- package/dist/workflows/rollout.mjs +1 -1
- package/dist/workflows.mjs +614 -574
- package/package.json +1 -1
- package/skills/authoring/SKILL.md +3 -3
- package/src/cli/Cli.ts +5 -5
- package/src/edge/Edge.test.ts +1 -1
- package/src/steering/FORMATS.md +5 -1
- package/src/steering/SteeringFormats.test.ts +2 -2
- package/src/steering/contract.test.ts +1 -0
- package/src/steering/findings.test.ts +47 -0
- package/src/steering/findings.ts +350 -0
- package/src/steering/fixtures/findings/gate.md +34 -0
- package/src/steering/fixtures/findings/gate.read.json +87 -0
- package/src/steering/index.test.ts +2 -2
- package/src/steering/index.ts +4 -3
- package/src/steering/review.test.ts +1 -75
- package/src/steering/review.ts +1 -74
- package/src/workflow/compile.test.ts +1 -0
- package/src/workflows/feature/criteria-coverage.feature +104 -0
- package/src/workflows/feature/feature.test.ts +1 -1
- package/src/workflows/feature/feature.ts +17 -20
- package/src/workflows/feature/green.ts +2 -5
- package/src/workflows/feature/lens-review.feature +323 -171
- package/src/workflows/feature/naive-acceptance.feature +31 -32
- package/src/workflows/feature/prototype.ts +5 -8
- package/src/workflows/feature/refactor-absorbs.feature +1 -7
- package/src/workflows/feature/refactor-first.feature +2 -10
- package/src/workflows/feature/refactor-rebuild.feature +20 -36
- package/src/workflows/feature/refactor-review.feature +33 -117
- package/src/workflows/feature/refactor.test.ts +0 -2
- package/src/workflows/feature/refactor.ts +0 -1
- package/src/workflows/feature/review-gate.feature +6 -22
- package/src/workflows/feature/reviewer-walkthrough.feature +16 -103
- package/src/workflows/feature/seam.test.ts +19 -101
- package/src/workflows/feature/seam.ts +13 -89
- package/src/workflows/feature/standards.feature +75 -34
- package/src/workflows/fix/fix-lens-origin.feature +20 -7
- package/src/workflows/fix/fix-quality.feature +104 -23
- package/src/workflows/review/review-door.feature +62 -59
- package/src/workflows/shared/access.test.ts +1 -0
- package/src/workflows/shared/learn.test.ts +0 -14
- package/src/workflows/shared/learn.ts +1 -6
- package/src/workflows/shared/lenses.ts +149 -43
- package/src/workflows/shared/review.test.ts +30 -27
- package/src/workflows/shared/review.ts +29 -196
- package/src/workflows/shared/skills.test.ts +3 -1
- package/src/workflows/shared/steps.test.ts +9 -6
- package/src/workflows/shared/steps.ts +12 -3
- package/src/workflows/shared/tail.test.ts +20 -2
- package/src/workflows/shared/tail.ts +38 -16
- package/src/workflows/shared/text.test.ts +122 -294
- package/src/workflows/shared/text.ts +181 -358
- package/src/workflows/shared/vars.ts +1 -1
- package/src/workflows/feature/review-answers.feature +0 -324
- package/src/workflows/feature/severity-budget.feature +0 -116
- 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
|
|
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,
|
|
6
|
-
|
|
7
|
-
|
|
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
|
|
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.
|
|
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 ".
|
|
87
|
+
And no commit body contains "build.quality.criteria-coverage"
|
|
88
|
+
And ".gtd/QUALITY.md" contains:
|
|
85
89
|
"""
|
|
86
|
-
## sum
|
|
90
|
+
## sum should be named plus
|
|
87
91
|
|
|
88
92
|
_From lens correctness._
|
|
89
93
|
|
|
90
|
-
|
|
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
|
-
|
|
106
|
+
Given a file ".gtd/QUALITY.md" with:
|
|
93
107
|
"""
|
|
94
|
-
|
|
108
|
+
# Quality
|
|
95
109
|
|
|
96
|
-
|
|
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(
|
|
103
|
-
gtd(
|
|
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.
|
|
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
|
|
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
|
|
6
|
-
|
|
7
|
-
review comes back. A sign-off ends
|
|
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.
|
|
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
|
|
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.
|
|
45
|
-
gtd(check): build.quality.
|
|
46
|
-
gtd(
|
|
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
|
-
##
|
|
51
|
-
|
|
52
|
-
Add a test for add.
|
|
66
|
+
## Calculator
|
|
53
67
|
|
|
54
|
-
|
|
68
|
+
- [ ] ./src/calc.ts#1-1 — add(a, b)
|
|
55
69
|
|
|
56
|
-
|
|
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
|
-
|
|
74
|
+
Dropped at the finding gate:
|
|
75
|
+
|
|
76
|
+
- add has no test (lens correctness)
|
|
65
77
|
"""
|
|
66
|
-
|
|
67
|
-
|
|
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
|
|
76
|
-
Given step "build.review.
|
|
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 "
|
|
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.
|
|
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.
|
|
92
|
-
gtd(
|
|
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:
|
|
103
|
-
Given judge step "build.review.
|
|
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":"
|
|
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 "
|
|
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.
|
|
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.
|
|
145
|
-
gtd(check): build.quality.
|
|
146
|
-
gtd(
|
|
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
|
|
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.
|
|
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.
|
|
194
|
-
gtd(
|
|
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)
|
|
36
|
+
const text = oneLine(body)
|
|
42
37
|
return text.length > SUMMARY_MAX ? `${text.slice(0, SUMMARY_MAX - 1)}…` : text
|
|
43
38
|
}
|
|
44
39
|
|