@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.
Files changed (74) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +46 -40
  3. package/dist/chunks/{reserved-CUkk9XgL.mjs → reserved-DxB5CROj.mjs} +73 -38
  4. package/dist/chunks/{review-BaCXlIT2.mjs → review-CKMSdvgW.mjs} +11 -9
  5. package/dist/chunks/{steering-DtUVUz9l.mjs → steering-CLhu8C7q.mjs} +262 -52
  6. package/dist/chunks/{tail-CX6Pdsql.mjs → tail-QZc7Uz2U.mjs} +1 -1
  7. package/dist/gtd.bundle.mjs +198 -43
  8. package/dist/steering.mjs +2 -2
  9. package/dist/testkit.mjs +1 -1
  10. package/dist/web/main.css +1 -1
  11. package/dist/web/main.js +510 -147
  12. package/dist/workflow-kit.mjs +1 -1
  13. package/dist/workflows/cleanup.mjs +2 -2
  14. package/dist/workflows/feature.mjs +228 -222
  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 +570 -317
  19. package/package.json +5 -4
  20. package/src/steering/FORMATS.md +4 -1
  21. package/src/steering/SteeringFormat.ts +7 -1
  22. package/src/steering/contract.test.ts +2 -1
  23. package/src/steering/fixtures/review/sectioned.md +31 -0
  24. package/src/steering/fixtures/review/sectioned.read.json +119 -0
  25. package/src/steering/index.ts +4 -0
  26. package/src/steering/qa.ts +1 -1
  27. package/src/steering/review.test.ts +270 -4
  28. package/src/steering/review.ts +328 -69
  29. package/src/testkit/steps.ts +13 -0
  30. package/src/workflows/feature/acceptance-criteria.feature +159 -3
  31. package/src/workflows/feature/continuation-cap.feature +4 -0
  32. package/src/workflows/feature/continuation-rebuild.feature +4 -0
  33. package/src/workflows/feature/continuation-slices.feature +4 -0
  34. package/src/workflows/feature/continuation.feature +4 -0
  35. package/src/workflows/feature/criteria.test.ts +60 -1
  36. package/src/workflows/feature/criteria.ts +87 -8
  37. package/src/workflows/feature/fast-path.feature +5 -6
  38. package/src/workflows/feature/feature.test.ts +6 -5
  39. package/src/workflows/feature/feature.ts +1 -2
  40. package/src/workflows/feature/flag-mode.feature +5 -6
  41. package/src/workflows/feature/green.ts +22 -0
  42. package/src/workflows/feature/hands-on-skip.feature +384 -0
  43. package/src/workflows/feature/lens-models.feature +4 -4
  44. package/src/workflows/feature/lens-review.feature +10 -8
  45. package/src/workflows/feature/naive-acceptance.feature +4 -0
  46. package/src/workflows/feature/one-step-land.feature +5 -6
  47. package/src/workflows/feature/planning.ts +2 -1
  48. package/src/workflows/feature/prototype-rounds.feature +5 -1
  49. package/src/workflows/feature/prototype.feature +18 -9
  50. package/src/workflows/feature/prototype.ts +48 -17
  51. package/src/workflows/feature/refactor-absorbs.feature +7 -8
  52. package/src/workflows/feature/refactor-first.feature +7 -8
  53. package/src/workflows/feature/refactor-lens-models.feature +4 -0
  54. package/src/workflows/feature/refactor-rebuild.feature +11 -12
  55. package/src/workflows/feature/refactor-review.feature +72 -72
  56. package/src/workflows/feature/review-answers.feature +94 -5
  57. package/src/workflows/feature/review-gate.feature +23 -53
  58. package/src/workflows/feature/reviewer-walkthrough.feature +33 -12
  59. package/src/workflows/feature/risk-tier.feature +32 -0
  60. package/src/workflows/feature/seam-rejection.feature +9 -6
  61. package/src/workflows/feature/seam.feature +9 -6
  62. package/src/workflows/feature/seam.test.ts +5 -3
  63. package/src/workflows/feature/seam.ts +2 -3
  64. package/src/workflows/feature/severity-budget.feature +11 -7
  65. package/src/workflows/feature/severity-sorted-review.feature +54 -54
  66. package/src/workflows/feature/slice-findings.feature +9 -15
  67. package/src/workflows/feature/slicing.feature +36 -24
  68. package/src/workflows/feature/standards.feature +4 -4
  69. package/src/workflows/feature/tier-pin.feature +4 -0
  70. package/src/workflows/shared/review.ts +26 -6
  71. package/src/workflows/shared/text.test.ts +85 -11
  72. package/src/workflows/shared/text.ts +95 -42
  73. package/src/workflows/feature/coverage.feature +0 -165
  74. 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
- ## Subtract
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
- ## AC-1 ignores floating point
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.coverage
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.coverage
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 = "# R\n\n## Acceptance Criteria\n\n- AC-1: adds.\n- AC-2: subtracts.\n"
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 = "# R\n\n## Acceptance Criteria\n\n- AC-1: adds.\n- AC-2: subtracts.\n"
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 after coverage has its own scenarios.
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, requireCoverage } from "./coverage.js"
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
- /** Where the slice began: the coverage judge reads only the tests changed since. */
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
- ## AC-1 ignores floating point
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
- ## Subtract
104
+ ## Walkthrough
103
105
 
104
- _could_
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 what matters most first
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 — a
5
- walkthrough chunk or a carried quality finding — on the same four questions
6
- as a human's note (`build.review.ranking`): critical (security, or a one-way
7
- door), should (a contract, or a new concept), could. The review lists them
8
- in that order, security before one-way doors, each led by its tier and
9
- reason. A chunk the judge cannot rate is critical, so it is shown first.
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: security and one-way doors come first, a carried finding sorted among the rest
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
- ## Saved format
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-2 — what callers persist
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":"yes","p":0.9},{"id":"C2.reversibility","answer":"two-way","p":0.9},{"id":"C2.blastRadius","answer":"module","p":0.9},{"id":"C2.newConcept","answer":"no","p":0.9},{"id":"C3.security","answer":"no","p":0.9},{"id":"C3.reversibility","answer":"two-way","p":0.9},{"id":"C3.blastRadius","answer":"contract","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}]
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
- ## Session token
109
+ <!-- base: 0000000 -->
105
110
 
106
- _critical: security_
111
+ ## Findings
107
112
 
108
- - [ ] ./src/calc.ts#1-1 — reads the caller's token
109
-
110
- ## Saved format
113
+ ### Token in logs
111
114
 
112
115
  _critical: one-way door_
113
116
 
114
- - [ ] ./src/calc.ts#1-2 — what callers persist
117
+ The caller's token reaches the log.
118
+ """
119
+ And ".gtd/REVIEW.md" contains:
120
+ """
121
+ - [ ] _your answer_
115
122
 
116
- ## AC-1 ignores floating point
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
- ## Subtract
133
+ ## Walkthrough
127
134
 
128
- _could_
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 chunk the judge is unsure about is listed as critical
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
- ## Saved format
171
+ ## Session token
172
+
173
+ - [ ] ./src/calc.ts#1-1 — reads the caller's token
162
174
 
163
- - [ ] ./src/calc.ts#1-2 — what callers persist
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":"no","p":0.9},{"id":"C3.reversibility","answer":"two-way","p":0.9},{"id":"C3.blastRadius","answer":"contract","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}]
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
- # Review: abc1234
174
-
175
- <!-- base: 0000000 -->
187
+ ## Findings
176
188
 
177
- ## Session token
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
- ## AC-1 ignores floating point
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
- ## AC-1 ignores floating point
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
- ## AC-1 ignores floating point (2)
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.coverage
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
- ## subtract has no negative test
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.coverage
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