@pmelab/gtd 51.0.1 → 52.1.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 +46 -40
- package/dist/chunks/{reserved-CUkk9XgL.mjs → reserved-DxB5CROj.mjs} +73 -38
- package/dist/chunks/{review-BaCXlIT2.mjs → review-CKMSdvgW.mjs} +11 -9
- package/dist/chunks/{steering-DtUVUz9l.mjs → steering-CLhu8C7q.mjs} +262 -52
- package/dist/chunks/{tail-CX6Pdsql.mjs → tail-QZc7Uz2U.mjs} +1 -1
- package/dist/gtd.bundle.mjs +198 -43
- package/dist/steering.mjs +2 -2
- package/dist/testkit.mjs +1 -1
- package/dist/web/main.css +1 -1
- package/dist/web/main.js +510 -147
- package/dist/workflow-kit.mjs +1 -1
- package/dist/workflows/cleanup.mjs +2 -2
- package/dist/workflows/feature.mjs +228 -222
- 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 +570 -317
- package/package.json +5 -4
- package/src/steering/FORMATS.md +4 -1
- package/src/steering/SteeringFormat.ts +7 -1
- package/src/steering/contract.test.ts +2 -1
- package/src/steering/fixtures/review/sectioned.md +31 -0
- package/src/steering/fixtures/review/sectioned.read.json +119 -0
- package/src/steering/index.ts +4 -0
- package/src/steering/qa.ts +1 -1
- package/src/steering/review.test.ts +270 -4
- package/src/steering/review.ts +328 -69
- package/src/testkit/steps.ts +13 -0
- package/src/workflows/feature/acceptance-criteria.feature +159 -3
- package/src/workflows/feature/continuation-cap.feature +4 -0
- package/src/workflows/feature/continuation-rebuild.feature +4 -0
- package/src/workflows/feature/continuation-slices.feature +4 -0
- package/src/workflows/feature/continuation.feature +4 -0
- package/src/workflows/feature/criteria.test.ts +60 -1
- package/src/workflows/feature/criteria.ts +87 -8
- package/src/workflows/feature/fast-path.feature +5 -6
- package/src/workflows/feature/feature.test.ts +6 -5
- package/src/workflows/feature/feature.ts +1 -2
- package/src/workflows/feature/flag-mode.feature +5 -6
- package/src/workflows/feature/green.ts +22 -0
- package/src/workflows/feature/hands-on-skip.feature +384 -0
- package/src/workflows/feature/lens-models.feature +4 -4
- package/src/workflows/feature/lens-review.feature +10 -8
- package/src/workflows/feature/naive-acceptance.feature +4 -0
- package/src/workflows/feature/one-step-land.feature +5 -6
- package/src/workflows/feature/planning.ts +2 -1
- package/src/workflows/feature/prototype-rounds.feature +5 -1
- package/src/workflows/feature/prototype.feature +18 -9
- package/src/workflows/feature/prototype.ts +48 -17
- package/src/workflows/feature/refactor-absorbs.feature +7 -8
- package/src/workflows/feature/refactor-first.feature +7 -8
- package/src/workflows/feature/refactor-lens-models.feature +4 -0
- package/src/workflows/feature/refactor-rebuild.feature +11 -12
- package/src/workflows/feature/refactor-review.feature +72 -72
- package/src/workflows/feature/review-answers.feature +94 -5
- package/src/workflows/feature/review-gate.feature +23 -53
- package/src/workflows/feature/reviewer-walkthrough.feature +33 -12
- package/src/workflows/feature/risk-tier.feature +32 -0
- package/src/workflows/feature/seam-rejection.feature +9 -6
- package/src/workflows/feature/seam.feature +9 -6
- package/src/workflows/feature/seam.test.ts +5 -3
- package/src/workflows/feature/seam.ts +2 -3
- package/src/workflows/feature/severity-budget.feature +11 -7
- package/src/workflows/feature/severity-sorted-review.feature +54 -54
- package/src/workflows/feature/slice-findings.feature +9 -15
- package/src/workflows/feature/slicing.feature +36 -24
- package/src/workflows/feature/standards.feature +4 -4
- package/src/workflows/feature/tier-pin.feature +4 -0
- package/src/workflows/shared/review.ts +26 -6
- package/src/workflows/shared/text.test.ts +85 -11
- package/src/workflows/shared/text.ts +95 -42
- package/src/workflows/feature/coverage.feature +0 -165
- package/src/workflows/feature/coverage.ts +0 -120
|
@@ -31,6 +31,10 @@ Feature: a reviewer walks the human through the feature's code
|
|
|
31
31
|
"""
|
|
32
32
|
# Requirements
|
|
33
33
|
|
|
34
|
+
## Impact
|
|
35
|
+
|
|
36
|
+
- the greeting module
|
|
37
|
+
|
|
34
38
|
## Acceptance Criteria
|
|
35
39
|
|
|
36
40
|
- AC-1: subtract(a, b) returns a - b.
|
|
@@ -49,10 +53,6 @@ Feature: a reviewer walks the human through the feature's code
|
|
|
49
53
|
And step "implement.applying" runs its script
|
|
50
54
|
And step "implement.health.check" changes nothing
|
|
51
55
|
And step "implement.closing" runs its script
|
|
52
|
-
And judge step "implement.coverage" answers:
|
|
53
|
-
"""
|
|
54
|
-
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
55
|
-
"""
|
|
56
56
|
And step "build.quality.correctness.reviewing" writes ".gtd/QUALITY.md" with:
|
|
57
57
|
"""
|
|
58
58
|
# Quality
|
|
@@ -96,15 +96,9 @@ Feature: a reviewer walks the human through the feature's code
|
|
|
96
96
|
Then the process rests at "build.review.await-review"
|
|
97
97
|
And ".gtd/REVIEW.md" contains:
|
|
98
98
|
"""
|
|
99
|
-
##
|
|
100
|
-
|
|
101
|
-
_critical: judge unsure_
|
|
102
|
-
|
|
103
|
-
The new export.
|
|
104
|
-
|
|
105
|
-
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
99
|
+
## Findings
|
|
106
100
|
|
|
107
|
-
|
|
101
|
+
### AC-1 ignores floating point
|
|
108
102
|
|
|
109
103
|
_critical: judge unsure_
|
|
110
104
|
|
|
@@ -119,6 +113,14 @@ Feature: a reviewer walks the human through the feature's code
|
|
|
119
113
|
- [ ] fix as suggested
|
|
120
114
|
- [ ] won't fix
|
|
121
115
|
- [ ] _your answer_
|
|
116
|
+
|
|
117
|
+
## Walkthrough
|
|
118
|
+
|
|
119
|
+
### Subtract
|
|
120
|
+
|
|
121
|
+
The new export.
|
|
122
|
+
|
|
123
|
+
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
122
124
|
"""
|
|
123
125
|
And no commit body contains "build.review.composing"
|
|
124
126
|
And the commit subjects end with:
|
|
@@ -145,6 +147,25 @@ Feature: a reviewer walks the human through the feature's code
|
|
|
145
147
|
"""
|
|
146
148
|
Then driving the process is refused with "Subtract — points at no code"
|
|
147
149
|
|
|
150
|
+
Scenario: a review the reviewer sorts into sections itself is refused
|
|
151
|
+
Given step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
152
|
+
"""
|
|
153
|
+
# Review: abc1234
|
|
154
|
+
|
|
155
|
+
<!-- base: 0000000 -->
|
|
156
|
+
|
|
157
|
+
## Walkthrough
|
|
158
|
+
|
|
159
|
+
### Subtract
|
|
160
|
+
|
|
161
|
+
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
162
|
+
|
|
163
|
+
### AC-1 ignores floating point
|
|
164
|
+
|
|
165
|
+
- [ ] ./src/calc.ts#2-2 — returns the raw difference
|
|
166
|
+
"""
|
|
167
|
+
Then driving the process is refused with "Walkthrough — gtd sorts the chunks into sections; write `## ` chunks only"
|
|
168
|
+
|
|
148
169
|
Scenario: a finding the reviewer left out is refused
|
|
149
170
|
Given step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
150
171
|
"""
|
|
@@ -50,6 +50,10 @@ Feature: the risk tier is proposed at triage and recorded behind GTD_FLAG_RISK_T
|
|
|
50
50
|
|
|
51
51
|
low — trivial copy change
|
|
52
52
|
|
|
53
|
+
## Impact
|
|
54
|
+
|
|
55
|
+
- the greeting module
|
|
56
|
+
|
|
53
57
|
## Acceptance Criteria
|
|
54
58
|
|
|
55
59
|
- AC-1: the change behaves as described.
|
|
@@ -69,6 +73,10 @@ Feature: the risk tier is proposed at triage and recorded behind GTD_FLAG_RISK_T
|
|
|
69
73
|
|
|
70
74
|
high — touches payments
|
|
71
75
|
|
|
76
|
+
## Impact
|
|
77
|
+
|
|
78
|
+
- the greeting module
|
|
79
|
+
|
|
72
80
|
## Acceptance Criteria
|
|
73
81
|
|
|
74
82
|
- AC-1: the change behaves as described.
|
|
@@ -89,6 +97,10 @@ Feature: the risk tier is proposed at triage and recorded behind GTD_FLAG_RISK_T
|
|
|
89
97
|
|
|
90
98
|
### Subtract
|
|
91
99
|
|
|
100
|
+
## Impact
|
|
101
|
+
|
|
102
|
+
- the greeting module
|
|
103
|
+
|
|
92
104
|
## Acceptance Criteria
|
|
93
105
|
|
|
94
106
|
- AC-1: the change behaves as described.
|
|
@@ -118,6 +130,10 @@ Feature: the risk tier is proposed at triage and recorded behind GTD_FLAG_RISK_T
|
|
|
118
130
|
- error rate on /subtract stays flat
|
|
119
131
|
- p95 latency
|
|
120
132
|
|
|
133
|
+
## Impact
|
|
134
|
+
|
|
135
|
+
- the greeting module
|
|
136
|
+
|
|
121
137
|
## Acceptance Criteria
|
|
122
138
|
|
|
123
139
|
- AC-1: the change behaves as described.
|
|
@@ -142,6 +158,10 @@ Feature: the risk tier is proposed at triage and recorded behind GTD_FLAG_RISK_T
|
|
|
142
158
|
|
|
143
159
|
low — trivial copy change
|
|
144
160
|
|
|
161
|
+
## Impact
|
|
162
|
+
|
|
163
|
+
- the greeting module
|
|
164
|
+
|
|
145
165
|
## Acceptance Criteria
|
|
146
166
|
|
|
147
167
|
- AC-1: the change behaves as described.
|
|
@@ -187,6 +207,10 @@ Feature: the risk tier is proposed at triage and recorded behind GTD_FLAG_RISK_T
|
|
|
187
207
|
|
|
188
208
|
### Subtract
|
|
189
209
|
|
|
210
|
+
## Impact
|
|
211
|
+
|
|
212
|
+
- the greeting module
|
|
213
|
+
|
|
190
214
|
## Acceptance Criteria
|
|
191
215
|
|
|
192
216
|
- AC-1: the change behaves as described.
|
|
@@ -233,6 +257,10 @@ Feature: the risk tier is proposed at triage and recorded behind GTD_FLAG_RISK_T
|
|
|
233
257
|
|
|
234
258
|
- error rate stays flat
|
|
235
259
|
|
|
260
|
+
## Impact
|
|
261
|
+
|
|
262
|
+
- the greeting module
|
|
263
|
+
|
|
236
264
|
## Acceptance Criteria
|
|
237
265
|
|
|
238
266
|
- AC-1: the change behaves as described.
|
|
@@ -258,6 +286,10 @@ Feature: the risk tier is proposed at triage and recorded behind GTD_FLAG_RISK_T
|
|
|
258
286
|
|
|
259
287
|
low — trivial
|
|
260
288
|
|
|
289
|
+
## Impact
|
|
290
|
+
|
|
291
|
+
- the greeting module
|
|
292
|
+
|
|
261
293
|
## Acceptance Criteria
|
|
262
294
|
|
|
263
295
|
- AC-1: the change behaves as described.
|
|
@@ -35,6 +35,10 @@ Feature: rejected naive passes walk one fixed path through the steer gate to the
|
|
|
35
35
|
|
|
36
36
|
- `subtract(a, b)` returns `a - b`.
|
|
37
37
|
|
|
38
|
+
## Impact
|
|
39
|
+
|
|
40
|
+
- the greeting module
|
|
41
|
+
|
|
38
42
|
## Acceptance Criteria
|
|
39
43
|
|
|
40
44
|
- AC-1: the change behaves as described.
|
|
@@ -53,10 +57,6 @@ Feature: rejected naive passes walk one fixed path through the steer gate to the
|
|
|
53
57
|
"""
|
|
54
58
|
And step "implement.health.check" changes nothing
|
|
55
59
|
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
60
|
When the process is driven
|
|
61
61
|
Then the process rests at "seam.judge"
|
|
62
62
|
|
|
@@ -80,6 +80,10 @@ Feature: rejected naive passes walk one fixed path through the steer gate to the
|
|
|
80
80
|
|
|
81
81
|
- `subtract(a, b)` returns `a - b`, in the calculator module.
|
|
82
82
|
|
|
83
|
+
## Impact
|
|
84
|
+
|
|
85
|
+
- the greeting module
|
|
86
|
+
|
|
83
87
|
## Acceptance Criteria
|
|
84
88
|
|
|
85
89
|
- AC-1: the change behaves as described.
|
|
@@ -123,8 +127,7 @@ Feature: rejected naive passes walk one fixed path through the steer gate to the
|
|
|
123
127
|
gtd(check): seam.check → seam.judge
|
|
124
128
|
gtd(judge): seam.judge → implement.applying
|
|
125
129
|
gtd(check): implement.applying → implement.health.check
|
|
126
|
-
gtd(check): implement.health.check → implement.
|
|
127
|
-
gtd(judge): implement.coverage → implement.closing
|
|
130
|
+
gtd(check): implement.health.check → implement.closing
|
|
128
131
|
gtd(check): implement.closing → build.review.reviewing
|
|
129
132
|
"""
|
|
130
133
|
And the commit "gtd(human): idle → unwind" has a body containing "Gtd-Var: flag_risk_tier=0"
|
|
@@ -45,6 +45,10 @@ Feature: the naive pass and seam judge decide how a feature is built
|
|
|
45
45
|
|
|
46
46
|
- `subtract(a, b)` returns `a - b`.
|
|
47
47
|
|
|
48
|
+
## Impact
|
|
49
|
+
|
|
50
|
+
- the greeting module
|
|
51
|
+
|
|
48
52
|
## Acceptance Criteria
|
|
49
53
|
|
|
50
54
|
- AC-1: the change behaves as described.
|
|
@@ -148,10 +152,6 @@ Feature: the naive pass and seam judge decide how a feature is built
|
|
|
148
152
|
And step "implement.applying" runs its script
|
|
149
153
|
And step "implement.health.check" changes nothing
|
|
150
154
|
And step "implement.closing" runs its script
|
|
151
|
-
And judge step "implement.coverage" answers:
|
|
152
|
-
"""
|
|
153
|
-
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
154
|
-
"""
|
|
155
155
|
When the process is driven
|
|
156
156
|
Then the process rests at "build.review.reviewing"
|
|
157
157
|
And "src/calc.ts" contains "subtract"
|
|
@@ -159,8 +159,7 @@ Feature: the naive pass and seam judge decide how a feature is built
|
|
|
159
159
|
"""
|
|
160
160
|
gtd(judge): seam.judge → implement.applying
|
|
161
161
|
gtd(check): implement.applying → implement.health.check
|
|
162
|
-
gtd(check): implement.health.check → implement.
|
|
163
|
-
gtd(judge): implement.coverage → implement.closing
|
|
162
|
+
gtd(check): implement.health.check → implement.closing
|
|
164
163
|
gtd(check): implement.closing → build.review.reviewing
|
|
165
164
|
"""
|
|
166
165
|
And ".gtd/REQUIREMENTS.md" does not exist
|
|
@@ -239,6 +238,10 @@ Feature: the naive pass and seam judge decide how a feature is built
|
|
|
239
238
|
|
|
240
239
|
- `subtract(a, b)` returns `a - b`, in a new module.
|
|
241
240
|
|
|
241
|
+
## Impact
|
|
242
|
+
|
|
243
|
+
- the greeting module
|
|
244
|
+
|
|
242
245
|
## Acceptance Criteria
|
|
243
246
|
|
|
244
247
|
- AC-1: the change behaves as described.
|
|
@@ -109,7 +109,8 @@ describe("naivePass", () => {
|
|
|
109
109
|
})
|
|
110
110
|
|
|
111
111
|
describe("naiveAcceptance and requireAcceptance", () => {
|
|
112
|
-
const requirements =
|
|
112
|
+
const requirements =
|
|
113
|
+
"# R\n\n## Impact\n\n- the module\n\n## Acceptance Criteria\n\n- AC-1: adds.\n- AC-2: subtracts.\n"
|
|
113
114
|
const file = (path: string, before: string | undefined, after: string): Change => ({
|
|
114
115
|
path,
|
|
115
116
|
status: before === undefined ? "added" : "modified",
|
|
@@ -170,7 +171,8 @@ describe("naiveAcceptance and requireAcceptance", () => {
|
|
|
170
171
|
})
|
|
171
172
|
|
|
172
173
|
describe("acceptanceFault", () => {
|
|
173
|
-
const requirements =
|
|
174
|
+
const requirements =
|
|
175
|
+
"# R\n\n## Impact\n\n- the module\n\n## Acceptance Criteria\n\n- AC-1: adds.\n- AC-2: subtracts.\n"
|
|
174
176
|
const file = (path: string, status: Change["status"], after: string): Change => ({
|
|
175
177
|
path,
|
|
176
178
|
status,
|
|
@@ -500,7 +502,7 @@ describe("implement", () => {
|
|
|
500
502
|
lastOptions = undefined
|
|
501
503
|
installContext(
|
|
502
504
|
fixtureContext(
|
|
503
|
-
// The hands-on test
|
|
505
|
+
// The hands-on test has its own scenarios.
|
|
504
506
|
{ vars: { prototypeRounds: "0" } },
|
|
505
507
|
{
|
|
506
508
|
step: (request: StepRequest) => {
|
|
@@ -37,7 +37,7 @@ import {
|
|
|
37
37
|
} from "../shared/steps.js"
|
|
38
38
|
import * as t from "../shared/text.js"
|
|
39
39
|
import { defaults } from "../shared/vars.js"
|
|
40
|
-
import { green
|
|
40
|
+
import { green } from "./green.js"
|
|
41
41
|
import { prototypeTest } from "./prototype.js"
|
|
42
42
|
import {
|
|
43
43
|
criterionIds,
|
|
@@ -289,7 +289,7 @@ export interface ImplementOptions {
|
|
|
289
289
|
readonly rebuild?: t.Rebuild | undefined
|
|
290
290
|
/** The criteria this slice builds, when the change has more than one slice. */
|
|
291
291
|
readonly slice?: CriteriaSlice | undefined
|
|
292
|
-
/**
|
|
292
|
+
/** @deprecated Ignored since the coverage judge is gone. */
|
|
293
293
|
readonly base?: string | undefined
|
|
294
294
|
/** Not the last slice: `.gtd/REQUIREMENTS.md` and `.gtd/SLICES.md` stay for the next one. */
|
|
295
295
|
readonly more?: boolean | (() => boolean) | undefined
|
|
@@ -385,7 +385,6 @@ export const implementing = (options: ImplementOptions): Promise<readonly string
|
|
|
385
385
|
const keepsTests =
|
|
386
386
|
built && acceptance !== undefined ? () => requireAcceptanceKept(acceptance) : undefined
|
|
387
387
|
await green(keepsTests)
|
|
388
|
-
await requireCoverage(options.base, options.slice)
|
|
389
388
|
await prototypeTest(options.slice, keepsTests)
|
|
390
389
|
const ids = criterionIds(read(REQUIREMENTS) ?? "")
|
|
391
390
|
await closing(moreToBuild(options.more))
|
|
@@ -28,6 +28,10 @@ Feature: the review's ranking is batched to the judge's budget
|
|
|
28
28
|
"""
|
|
29
29
|
# Requirements
|
|
30
30
|
|
|
31
|
+
## Impact
|
|
32
|
+
|
|
33
|
+
- the greeting module
|
|
34
|
+
|
|
31
35
|
## Acceptance Criteria
|
|
32
36
|
|
|
33
37
|
- AC-1: subtract(a, b) returns a - b.
|
|
@@ -46,10 +50,6 @@ Feature: the review's ranking is batched to the judge's budget
|
|
|
46
50
|
And step "implement.applying" runs its script
|
|
47
51
|
And step "implement.health.check" changes nothing
|
|
48
52
|
And step "implement.closing" runs its script
|
|
49
|
-
And judge step "implement.coverage" answers:
|
|
50
|
-
"""
|
|
51
|
-
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
52
|
-
"""
|
|
53
53
|
And step "build.quality.correctness.reviewing" writes ".gtd/QUALITY.md" with:
|
|
54
54
|
"""
|
|
55
55
|
# Quality
|
|
@@ -93,15 +93,19 @@ Feature: the review's ranking is batched to the judge's budget
|
|
|
93
93
|
Then the process rests at "build.review.await-review"
|
|
94
94
|
And ".gtd/REVIEW.md" contains:
|
|
95
95
|
"""
|
|
96
|
-
##
|
|
96
|
+
## Findings
|
|
97
|
+
|
|
98
|
+
### AC-1 ignores floating point
|
|
97
99
|
|
|
98
100
|
_critical: judge unsure_
|
|
99
101
|
"""
|
|
100
102
|
And ".gtd/REVIEW.md" contains:
|
|
101
103
|
"""
|
|
102
|
-
##
|
|
104
|
+
## Walkthrough
|
|
103
105
|
|
|
104
|
-
|
|
106
|
+
### Subtract
|
|
107
|
+
|
|
108
|
+
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
105
109
|
"""
|
|
106
110
|
And the commit subjects end with:
|
|
107
111
|
"""
|
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
@inmem
|
|
2
|
-
Feature: the final review lists
|
|
2
|
+
Feature: the final review lists the findings that matter most first
|
|
3
3
|
|
|
4
|
-
Before the review rests, the judge rates every chunk the reviewer wrote
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
Before the review rests, the judge rates every chunk the reviewer wrote on
|
|
5
|
+
the same four questions as a human's note (`build.review.ranking`): critical
|
|
6
|
+
(security, or a one-way door), should (a contract, or a new concept), could.
|
|
7
|
+
The quality findings go under `## Findings` in that order, security before
|
|
8
|
+
one-way doors, each led by its tier and reason; a finding the judge cannot
|
|
9
|
+
rate is critical. The walkthrough goes under `## Walkthrough` in the
|
|
10
|
+
reviewer's order, with no tier.
|
|
10
11
|
|
|
11
12
|
Background:
|
|
12
13
|
Given the shipped workflows, as gtd install scaffolds them
|
|
@@ -30,6 +31,10 @@ Feature: the final review lists what matters most first
|
|
|
30
31
|
"""
|
|
31
32
|
# Requirements
|
|
32
33
|
|
|
34
|
+
## Impact
|
|
35
|
+
|
|
36
|
+
- the greeting module
|
|
37
|
+
|
|
33
38
|
## Acceptance Criteria
|
|
34
39
|
|
|
35
40
|
- AC-1: subtract(a, b) returns a - b.
|
|
@@ -48,10 +53,6 @@ Feature: the final review lists what matters most first
|
|
|
48
53
|
And step "implement.applying" runs its script
|
|
49
54
|
And step "implement.health.check" changes nothing
|
|
50
55
|
And step "implement.closing" runs its script
|
|
51
|
-
And judge step "implement.coverage" answers:
|
|
52
|
-
"""
|
|
53
|
-
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
54
|
-
"""
|
|
55
56
|
And step "build.quality.correctness.reviewing" writes ".gtd/QUALITY.md" with:
|
|
56
57
|
"""
|
|
57
58
|
# Quality
|
|
@@ -59,16 +60,20 @@ Feature: the final review lists what matters most first
|
|
|
59
60
|
## AC-1 ignores floating point
|
|
60
61
|
|
|
61
62
|
Should subtract round? The criterion does not say.
|
|
63
|
+
|
|
64
|
+
## Token in logs
|
|
65
|
+
|
|
66
|
+
The caller's token reaches the log.
|
|
62
67
|
"""
|
|
63
68
|
And judge step "build.quality.triage" answers:
|
|
64
69
|
"""
|
|
65
|
-
[{"id":"Q1","answer":"design","p":0.9}]
|
|
70
|
+
[{"id":"Q1","answer":"design","p":0.9},{"id":"Q2","answer":"design","p":0.9}]
|
|
66
71
|
"""
|
|
67
72
|
And step "build.quality.sorting" runs its script
|
|
68
73
|
And step "build.quality.closing" runs its script
|
|
69
74
|
And step "build.review.carrying" runs its script
|
|
70
75
|
|
|
71
|
-
Scenario:
|
|
76
|
+
Scenario: findings are sorted by tier, the walkthrough kept in the reviewer's order
|
|
72
77
|
Given step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
73
78
|
"""
|
|
74
79
|
# Review: abc1234
|
|
@@ -81,39 +86,41 @@ Feature: the final review lists what matters most first
|
|
|
81
86
|
|
|
82
87
|
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
83
88
|
|
|
84
|
-
## Session token
|
|
85
|
-
|
|
86
|
-
- [ ] ./src/calc.ts#1-1 — reads the caller's token
|
|
87
|
-
|
|
88
89
|
## AC-1 ignores floating point
|
|
89
90
|
|
|
90
91
|
- [ ] ./src/calc.ts#2-2 — returns the raw difference
|
|
91
92
|
|
|
92
|
-
##
|
|
93
|
+
## Session token
|
|
94
|
+
|
|
95
|
+
- [ ] ./src/calc.ts#1-1 — reads the caller's token
|
|
96
|
+
|
|
97
|
+
## Token in logs
|
|
93
98
|
|
|
94
|
-
- [ ] ./src/calc.ts#1-
|
|
99
|
+
- [ ] ./src/calc.ts#1-1 — where it is logged
|
|
95
100
|
"""
|
|
96
101
|
And judge step "build.review.ranking" answers:
|
|
97
102
|
"""
|
|
98
|
-
[{"id":"C1.security","answer":"no","p":0.9},{"id":"C1.reversibility","answer":"two-way","p":0.9},{"id":"C1.blastRadius","answer":"local","p":0.9},{"id":"C1.newConcept","answer":"no","p":0.9},{"id":"C2.security","answer":"
|
|
103
|
+
[{"id":"C1.security","answer":"no","p":0.9},{"id":"C1.reversibility","answer":"two-way","p":0.9},{"id":"C1.blastRadius","answer":"local","p":0.9},{"id":"C1.newConcept","answer":"no","p":0.9},{"id":"C2.security","answer":"no","p":0.9},{"id":"C2.reversibility","answer":"two-way","p":0.9},{"id":"C2.blastRadius","answer":"contract","p":0.9},{"id":"C2.newConcept","answer":"no","p":0.9},{"id":"C3.security","answer":"yes","p":0.9},{"id":"C3.reversibility","answer":"two-way","p":0.9},{"id":"C3.blastRadius","answer":"module","p":0.9},{"id":"C3.newConcept","answer":"no","p":0.9},{"id":"C4.security","answer":"no","p":0.9},{"id":"C4.reversibility","answer":"one-way","p":0.9},{"id":"C4.blastRadius","answer":"contract","p":0.9},{"id":"C4.newConcept","answer":"no","p":0.9}]
|
|
99
104
|
"""
|
|
100
105
|
When the process is driven
|
|
101
106
|
Then the process rests at "build.review.await-review"
|
|
102
107
|
And ".gtd/REVIEW.md" contains:
|
|
103
108
|
"""
|
|
104
|
-
|
|
109
|
+
<!-- base: 0000000 -->
|
|
105
110
|
|
|
106
|
-
|
|
111
|
+
## Findings
|
|
107
112
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
## Saved format
|
|
113
|
+
### Token in logs
|
|
111
114
|
|
|
112
115
|
_critical: one-way door_
|
|
113
116
|
|
|
114
|
-
|
|
117
|
+
The caller's token reaches the log.
|
|
118
|
+
"""
|
|
119
|
+
And ".gtd/REVIEW.md" contains:
|
|
120
|
+
"""
|
|
121
|
+
- [ ] _your answer_
|
|
115
122
|
|
|
116
|
-
|
|
123
|
+
### AC-1 ignores floating point
|
|
117
124
|
|
|
118
125
|
_should: contract_
|
|
119
126
|
|
|
@@ -123,12 +130,19 @@ Feature: the final review lists what matters most first
|
|
|
123
130
|
"""
|
|
124
131
|
- [ ] _your answer_
|
|
125
132
|
|
|
126
|
-
##
|
|
133
|
+
## Walkthrough
|
|
127
134
|
|
|
128
|
-
|
|
135
|
+
### Subtract
|
|
129
136
|
|
|
130
137
|
The new export.
|
|
138
|
+
|
|
139
|
+
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
140
|
+
|
|
141
|
+
### Session token
|
|
142
|
+
|
|
143
|
+
- [ ] ./src/calc.ts#1-1 — reads the caller's token
|
|
131
144
|
"""
|
|
145
|
+
And ".gtd/REVIEW.md" does not contain "_critical: security_"
|
|
132
146
|
And the commit "gtd(judge): build.review.ranking → build.review.carrying" has a body containing "Gtd-Judge:"
|
|
133
147
|
And the commit subjects end with:
|
|
134
148
|
"""
|
|
@@ -137,7 +151,7 @@ Feature: the final review lists what matters most first
|
|
|
137
151
|
gtd(check): build.review.carrying → build.review.await-review
|
|
138
152
|
"""
|
|
139
153
|
|
|
140
|
-
Scenario: a
|
|
154
|
+
Scenario: a finding the judge is unsure about is listed as critical
|
|
141
155
|
Given step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
142
156
|
"""
|
|
143
157
|
# Review: abc1234
|
|
@@ -150,49 +164,35 @@ Feature: the final review lists what matters most first
|
|
|
150
164
|
|
|
151
165
|
- [ ] ./src/calc.ts#2-2 — subtract(a, b)
|
|
152
166
|
|
|
153
|
-
## Session token
|
|
154
|
-
|
|
155
|
-
- [ ] ./src/calc.ts#1-1 — reads the caller's token
|
|
156
|
-
|
|
157
167
|
## AC-1 ignores floating point
|
|
158
168
|
|
|
159
169
|
- [ ] ./src/calc.ts#2-2 — returns the raw difference
|
|
160
170
|
|
|
161
|
-
##
|
|
171
|
+
## Session token
|
|
172
|
+
|
|
173
|
+
- [ ] ./src/calc.ts#1-1 — reads the caller's token
|
|
162
174
|
|
|
163
|
-
|
|
175
|
+
## Token in logs
|
|
176
|
+
|
|
177
|
+
- [ ] ./src/calc.ts#1-1 — where it is logged
|
|
164
178
|
"""
|
|
165
179
|
And judge step "build.review.ranking" answers:
|
|
166
180
|
"""
|
|
167
|
-
[{"id":"C1.security","answer":"no","p":0.9},{"id":"C1.reversibility","answer":"two-way","p":0.9},{"id":"C1.blastRadius","answer":"local","p":0.9},{"id":"C1.newConcept","answer":"no","p":0.9},{"id":"C2.security","answer":"no","p":0.4},{"id":"C2.reversibility","answer":"two-way","p":0.9},{"id":"C2.blastRadius","answer":"local","p":0.9},{"id":"C2.newConcept","answer":"no","p":0.9},{"id":"C3.security","answer":"
|
|
181
|
+
[{"id":"C1.security","answer":"no","p":0.9},{"id":"C1.reversibility","answer":"two-way","p":0.9},{"id":"C1.blastRadius","answer":"local","p":0.9},{"id":"C1.newConcept","answer":"no","p":0.9},{"id":"C2.security","answer":"no","p":0.4},{"id":"C2.reversibility","answer":"two-way","p":0.9},{"id":"C2.blastRadius","answer":"local","p":0.9},{"id":"C2.newConcept","answer":"no","p":0.9},{"id":"C3.security","answer":"yes","p":0.9},{"id":"C3.reversibility","answer":"two-way","p":0.9},{"id":"C3.blastRadius","answer":"local","p":0.9},{"id":"C3.newConcept","answer":"no","p":0.9},{"id":"C4.security","answer":"no","p":0.9},{"id":"C4.reversibility","answer":"two-way","p":0.9},{"id":"C4.blastRadius","answer":"local","p":0.9},{"id":"C4.newConcept","answer":"yes","p":0.9}]
|
|
168
182
|
"""
|
|
169
183
|
When the process is driven
|
|
170
184
|
Then the process rests at "build.review.await-review"
|
|
171
185
|
And ".gtd/REVIEW.md" contains:
|
|
172
186
|
"""
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
<!-- base: 0000000 -->
|
|
187
|
+
## Findings
|
|
176
188
|
|
|
177
|
-
|
|
189
|
+
### AC-1 ignores floating point
|
|
178
190
|
|
|
179
191
|
_critical: judge unsure_
|
|
180
192
|
"""
|
|
181
193
|
And ".gtd/REVIEW.md" contains:
|
|
182
194
|
"""
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
_should: contract_
|
|
186
|
-
"""
|
|
187
|
-
And ".gtd/REVIEW.md" contains:
|
|
188
|
-
"""
|
|
189
|
-
## Saved format
|
|
195
|
+
### Token in logs
|
|
190
196
|
|
|
191
197
|
_should: new concept_
|
|
192
198
|
"""
|
|
193
|
-
And ".gtd/REVIEW.md" contains:
|
|
194
|
-
"""
|
|
195
|
-
## Subtract
|
|
196
|
-
|
|
197
|
-
_could_
|
|
198
|
-
"""
|
|
@@ -30,6 +30,10 @@ Feature: every slice's quality lap is triaged, and its leftovers wait for the re
|
|
|
30
30
|
"""
|
|
31
31
|
# Requirements
|
|
32
32
|
|
|
33
|
+
## Impact
|
|
34
|
+
|
|
35
|
+
- the greeting module
|
|
36
|
+
|
|
33
37
|
## Acceptance Criteria
|
|
34
38
|
|
|
35
39
|
- AC-1: subtract(a, b) returns a - b.
|
|
@@ -60,14 +64,6 @@ Feature: every slice's quality lap is triaged, and its leftovers wait for the re
|
|
|
60
64
|
And step "implement.applying" runs its script
|
|
61
65
|
And step "implement.health.check" changes nothing
|
|
62
66
|
And step "implement.closing" runs its script
|
|
63
|
-
And judge step "implement.coverage", when its questions contain "AC-1", answers:
|
|
64
|
-
"""
|
|
65
|
-
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
66
|
-
"""
|
|
67
|
-
And judge step "implement.coverage", when its questions contain "AC-2", answers:
|
|
68
|
-
"""
|
|
69
|
-
[{"id":"AC-2","answer":"yes","p":0.9}]
|
|
70
|
-
"""
|
|
71
67
|
And step "build.quality.sorting" runs its script
|
|
72
68
|
And step "build.quality.closing" runs its script
|
|
73
69
|
And step "build.health.check" changes nothing
|
|
@@ -115,7 +111,7 @@ Feature: every slice's quality lap is triaged, and its leftovers wait for the re
|
|
|
115
111
|
And ".gtd/QUALITY.md" does not exist
|
|
116
112
|
And ".gtd/REVIEW.md" contains:
|
|
117
113
|
"""
|
|
118
|
-
|
|
114
|
+
### AC-1 ignores floating point
|
|
119
115
|
|
|
120
116
|
_critical: judge unsure_
|
|
121
117
|
|
|
@@ -125,7 +121,7 @@ Feature: every slice's quality lap is triaged, and its leftovers wait for the re
|
|
|
125
121
|
"""
|
|
126
122
|
And ".gtd/REVIEW.md" contains:
|
|
127
123
|
"""
|
|
128
|
-
|
|
124
|
+
### AC-1 ignores floating point (2)
|
|
129
125
|
|
|
130
126
|
_critical: judge unsure_
|
|
131
127
|
|
|
@@ -140,8 +136,7 @@ Feature: every slice's quality lap is triaged, and its leftovers wait for the re
|
|
|
140
136
|
gtd(agent): seam.naive → seam.check
|
|
141
137
|
gtd(check): seam.check → implement.applying
|
|
142
138
|
gtd(check): implement.applying → implement.health.check
|
|
143
|
-
gtd(check): implement.health.check → implement.
|
|
144
|
-
gtd(judge): implement.coverage → implement.closing
|
|
139
|
+
gtd(check): implement.health.check → implement.closing
|
|
145
140
|
gtd(check): implement.closing → build.quality.correctness.reviewing
|
|
146
141
|
gtd(agent): build.quality.correctness.reviewing → build.quality.triage
|
|
147
142
|
gtd(judge): build.quality.triage → build.quality.sorting
|
|
@@ -189,7 +184,7 @@ Feature: every slice's quality lap is triaged, and its leftovers wait for the re
|
|
|
189
184
|
And no commit body contains "build.health.describe"
|
|
190
185
|
And ".gtd/REVIEW.md" contains:
|
|
191
186
|
"""
|
|
192
|
-
|
|
187
|
+
### subtract has no negative test
|
|
193
188
|
|
|
194
189
|
_critical: judge unsure_
|
|
195
190
|
|
|
@@ -210,8 +205,7 @@ Feature: every slice's quality lap is triaged, and its leftovers wait for the re
|
|
|
210
205
|
gtd(agent): seam.naive → seam.check
|
|
211
206
|
gtd(check): seam.check → implement.applying
|
|
212
207
|
gtd(check): implement.applying → implement.health.check
|
|
213
|
-
gtd(check): implement.health.check → implement.
|
|
214
|
-
gtd(judge): implement.coverage → implement.closing
|
|
208
|
+
gtd(check): implement.health.check → implement.closing
|
|
215
209
|
gtd(check): implement.closing → build.quality.correctness.reviewing
|
|
216
210
|
gtd(agent): build.quality.correctness.reviewing → build.quality.triage
|
|
217
211
|
gtd(judge): build.quality.triage → build.fix.quality.fixing
|