@pmelab/gtd 52.1.0 → 54.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 (94) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +91 -129
  3. package/claude/hooks/drive.ts +0 -3
  4. package/claude/hooks/register.tsx +3 -68
  5. package/claude/hooks/ship.ts +85 -1595
  6. package/dist/chunks/{reserved-DxB5CROj.mjs → reserved-CQ7amcKG.mjs} +45 -132
  7. package/dist/chunks/{review-CKMSdvgW.mjs → review-CXzUXJHL.mjs} +12 -5
  8. package/dist/chunks/{tail-QZc7Uz2U.mjs → tail-JZ9PAOwp.mjs} +2 -14
  9. package/dist/chunks/{wire-BJuZWR3C.mjs → wire-C12dahrH.mjs} +2 -130
  10. package/dist/flows.mjs +1 -16
  11. package/dist/gtd.bundle.mjs +476 -982
  12. package/dist/testkit.mjs +58 -417
  13. package/dist/wire.mjs +2 -2
  14. package/dist/workflows/cleanup.mjs +2 -2
  15. package/dist/workflows/feature.mjs +112 -363
  16. package/dist/workflows/fix.mjs +2 -2
  17. package/dist/workflows/review.mjs +3 -3
  18. package/dist/workflows/rollout.mjs +1 -1
  19. package/dist/workflows.mjs +321 -677
  20. package/package.json +1 -1
  21. package/src/cli/Cli.test.ts +1 -86
  22. package/src/cli/Cli.ts +13 -133
  23. package/src/cli/Metrics.test.ts +21 -31
  24. package/src/cli/Metrics.ts +25 -36
  25. package/src/cli/Program.test.ts +1 -35
  26. package/src/cli/Program.ts +5 -64
  27. package/src/cli/ToolCommands.ts +0 -3
  28. package/src/edge/Edge.test.ts +20 -322
  29. package/src/edge/Edge.ts +10 -181
  30. package/src/edge/index.ts +0 -1
  31. package/src/flows/runtime.test.ts +0 -27
  32. package/src/flows/runtime.ts +1 -49
  33. package/src/install/Install.ts +15 -24
  34. package/src/replay/Replay.test.ts +0 -169
  35. package/src/replay/Replay.ts +4 -93
  36. package/src/replay/index.ts +0 -1
  37. package/src/testkit/Layers.ts +0 -1
  38. package/src/testkit/steps.ts +23 -0
  39. package/src/wire/BeatDocument.ts +2 -12
  40. package/src/wire/BeatStatus.ts +0 -3
  41. package/src/wire/WireSchema.test.ts +0 -18
  42. package/src/wire/index.ts +0 -2
  43. package/src/wire/types.ts +0 -7
  44. package/src/workflow/Workflow.ts +1 -9
  45. package/src/workflows/feature/criteria.test.ts +1 -14
  46. package/src/workflows/feature/criteria.ts +6 -38
  47. package/src/workflows/feature/feature.ts +34 -118
  48. package/src/workflows/feature/hands-on-skip.feature +2 -70
  49. package/src/workflows/feature/index.ts +0 -1
  50. package/src/workflows/feature/lens-review.feature +50 -0
  51. package/src/workflows/feature/one-step-land.feature +0 -4
  52. package/src/workflows/feature/prototype-rounds.feature +1 -1
  53. package/src/workflows/feature/prototype.feature +3 -3
  54. package/src/workflows/feature/prototype.ts +18 -29
  55. package/src/workflows/feature/refactor-absorbs.feature +3 -8
  56. package/src/workflows/feature/refactor-first.feature +0 -5
  57. package/src/workflows/feature/refactor-rebuild.feature +0 -6
  58. package/src/workflows/feature/refactor-review.feature +49 -11
  59. package/src/workflows/feature/refactor.ts +30 -64
  60. package/src/workflows/feature/review-gate.feature +1 -1
  61. package/src/workflows/feature/reviewer-walkthrough.feature +0 -31
  62. package/src/workflows/feature/seam-rejection.feature +0 -4
  63. package/src/workflows/feature/seam.test.ts +7 -26
  64. package/src/workflows/feature/seam.ts +52 -165
  65. package/src/workflows/index.ts +0 -1
  66. package/src/workflows/shared/lenses.ts +0 -13
  67. package/src/workflows/shared/options.test.ts +2 -11
  68. package/src/workflows/shared/options.ts +4 -21
  69. package/src/workflows/shared/review.test.ts +3 -3
  70. package/src/workflows/shared/review.ts +12 -2
  71. package/src/workflows/shared/steps.ts +0 -2
  72. package/src/workflows/shared/text.test.ts +10 -80
  73. package/src/workflows/shared/text.ts +35 -211
  74. package/src/workflows/shared/vars.ts +2 -8
  75. package/src/workflows/shared/workflows.steps.ts +0 -13
  76. package/claude/hooks/context.ts +0 -66
  77. package/src/replay/Slices.test.ts +0 -73
  78. package/src/replay/Slices.ts +0 -45
  79. package/src/wire/ContextLimit.fixture.ts +0 -30
  80. package/src/wire/ContextLimit.test.ts +0 -96
  81. package/src/wire/ContextLimit.ts +0 -169
  82. package/src/wire/Slices.ts +0 -25
  83. package/src/wire/golden/1/slices.json +0 -11
  84. package/src/workflows/feature/context-limit.feature +0 -37
  85. package/src/workflows/feature/continuation-cap.feature +0 -69
  86. package/src/workflows/feature/continuation-rebuild.feature +0 -92
  87. package/src/workflows/feature/continuation-slices.feature +0 -68
  88. package/src/workflows/feature/continuation.feature +0 -209
  89. package/src/workflows/feature/slice-findings.feature +0 -256
  90. package/src/workflows/feature/slicing-cap.feature +0 -23
  91. package/src/workflows/feature/slicing.feature +0 -297
  92. package/src/workflows/feature/slicing.test.ts +0 -49
  93. package/src/workflows/feature/slicing.ts +0 -105
  94. package/src/workflows/shared/continuation.ts +0 -92
@@ -1,92 +0,0 @@
1
- @inmem
2
- Feature: a rebuild stopped at its context limit is continued on the branch
3
-
4
- The rebuild's snapshot is its own commit: the continuation finds the work
5
- in the tree, and the health loop greens the whole build afterwards.
6
- `seamAllow` is empty here, so the naive pass's change to an existing test
7
- file is the judge's only stray and refactor-first rebuilds with no refactor.
8
-
9
- Background:
10
- Given the shipped workflows, as gtd install scaffolds them
11
- And an environment variable "GTD_SEAMALLOW" set to ""
12
- And an environment variable "GTD_QUALITYREVIEWS" set to ""
13
- And an environment variable "GTD_REFACTORQUALITYREVIEWS" set to ""
14
- And an environment variable "GTD_FLAG_RISK_TIER" set to "0"
15
- And a file "src/calc.ts" with:
16
- """
17
- export const add = (a: number, b: number) => a + b
18
- """
19
- And a file "tests/calc.test.ts" with:
20
- """
21
- it("adds", () => {})
22
- """
23
- And the working tree is committed as "feat: add calculator"
24
- And a file "TODO.md" with:
25
- """
26
- # Add subtract and multiply
27
- """
28
- And step "unwind" changes nothing
29
- And step "start-gate.check" changes nothing
30
- And step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
31
- """
32
- # Requirements
33
-
34
- ## Impact
35
-
36
- - the greeting module
37
-
38
- ## Acceptance Criteria
39
-
40
- - AC-1: `subtract(5, 3)` returns 2.
41
- - AC-2: `multiply(2, 3)` returns 6.
42
- """
43
- And step "design.gate.answer" changes nothing
44
- And step "seam.check" changes nothing
45
-
46
- Scenario: a rebuild stopped at its context limit lands its snapshot and is continued on the branch
47
- Given step "seam.naive" writes "src/ops.ts" with:
48
- """
49
- export const subtract = (a: number, b: number) => a - b
50
- export const multiply = (a: number, b: number) => a * b
51
- """
52
- And step "seam.naive" writes "tests/calc.test.ts" with:
53
- """
54
- it("adds", () => {})
55
- it("[AC-1] subtracts", () => {})
56
- it("[AC-2] multiplies", () => {})
57
- """
58
- And judge step "seam.judge" answers:
59
- """
60
- [{"id":"shape","answer":"refactor-first","p":0.9}]
61
- """
62
- And step "implement.building" writes "tests/calc.test.ts" with:
63
- """
64
- it("adds", () => {})
65
- it("[AC-1] subtracts", () => {})
66
- """
67
- And step "implement.building" writes ".gtd/HANDOFF.md" with:
68
- """
69
- Rebuilt subtract behind the flag; multiply was next.
70
- """
71
- When the process is driven
72
- Then the process rests at "implement.continue.building"
73
- And the resting step's content contains "Still open: AC-2."
74
- And the resting step's content contains "Its work is already in the tree."
75
- And the resting step's content contains "Delete `.gtd/HANDOFF.md` once you are done"
76
- And "tests/calc.test.ts" contains "[AC-1] subtracts"
77
-
78
- Given step "implement.continue.building" writes "tests/calc.test.ts" with:
79
- """
80
- it("adds", () => {})
81
- it("[AC-1] subtracts", () => {})
82
- it("[AC-2] multiplies", () => {})
83
- """
84
- And step "implement.continue.building" deletes ".gtd/HANDOFF.md"
85
- When the process is driven
86
- Then the process rests at "implement.health.check"
87
- And the commit subjects end with:
88
- """
89
- gtd(agent): implement.building → implement.continue.building
90
- gtd(agent): implement.continue.building → implement.health.check
91
- """
92
-
@@ -1,68 +0,0 @@
1
- @inmem
2
- Feature: a continuation stays inside its coarse slice
3
-
4
- A naive pass of one coarse slice that stops at its context limit is
5
- continued with that slice's criteria still open, never another slice's.
6
-
7
- Background:
8
- Given the shipped workflows, as gtd install scaffolds them
9
- And an environment variable "GTD_QUALITYREVIEWS" set to ""
10
- And an environment variable "GTD_FLAGMODE" set to "false"
11
- And an environment variable "GTD_SLICEMAXCRITERIA" set to "2"
12
- And a file "src/calc.ts" with:
13
- """
14
- export const add = (a: number, b: number) => a + b
15
- """
16
- And the working tree is committed as "feat: add calculator"
17
- And a file "TODO.md" with:
18
- """
19
- # More arithmetic
20
-
21
- subtract, multiply and divide.
22
- """
23
- And step "unwind" changes nothing
24
- And step "start-gate.check" changes nothing
25
- And step "design.gate.answer" changes nothing
26
- And step "seam.check" changes nothing
27
-
28
- Scenario: the first slice's continuation is told only that slice's open criterion
29
- Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
30
- """
31
- # Requirements
32
-
33
- ## Impact
34
-
35
- - the greeting module
36
-
37
- ## Acceptance Criteria
38
-
39
- - AC-1: subtract(a, b) returns a - b.
40
- - AC-2: multiply(a, b) returns a * b.
41
- - AC-3: divide(a, b) returns a / b.
42
- """
43
- And step "design.slicing" writes ".gtd/SLICES.md" with:
44
- """
45
- # Slices
46
-
47
- ## Subtract and divide
48
-
49
- - AC-1
50
- - AC-3
51
-
52
- ## Multiply
53
-
54
- - AC-2
55
- """
56
- And step "seam.naive" writes "src/sub.test.ts" with:
57
- """
58
- it("[AC-1] subtracts", () => {})
59
- """
60
- And step "seam.naive" writes ".gtd/HANDOFF.md" with:
61
- """
62
- Subtract is tested; divide was next.
63
- """
64
- When the process is driven
65
- Then the process rests at "seam.continue.naive"
66
- And the resting step's content contains "This slice builds AC-1, AC-3 only"
67
- And the resting step's content contains "Still open: AC-3."
68
- And the resting step's content does not contain "AC-2"
@@ -1,209 +0,0 @@
1
- @inmem
2
- Feature: a turn stopped at its context limit is snapshotted and continued
3
-
4
- A naive pass, refactor or build turn told to stop at its context limit
5
- writes its handoff note to `.gtd/HANDOFF.md`. That turn is the snapshot —
6
- the naive pass's kept tip, or the refactor's or build's own commit — and a
7
- continuation in a fresh conversation (`<phase>.continue.<step>`) picks up
8
- from it with the note and what is still open. After `continuations` (3) of
9
- them, or `continuationStall` (2) in a row that close nothing still open, the
10
- phase rests at `<phase>.oversized`.
11
-
12
- Background:
13
- Given the shipped workflows, as gtd install scaffolds them
14
- And an environment variable "GTD_QUALITYREVIEWS" set to ""
15
- And an environment variable "GTD_REFACTORQUALITYREVIEWS" set to ""
16
- And an environment variable "GTD_FLAG_RISK_TIER" set to "0"
17
- And a file "src/calc.ts" with:
18
- """
19
- export const add = (a: number, b: number) => a + b
20
- """
21
- And the working tree is committed as "feat: add calculator"
22
- And a file "TODO.md" with:
23
- """
24
- # Add subtract and multiply
25
- """
26
- And step "unwind" changes nothing
27
- And step "start-gate.check" changes nothing
28
- And step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
29
- """
30
- # Requirements
31
-
32
- ## Impact
33
-
34
- - the greeting module
35
-
36
- ## Acceptance Criteria
37
-
38
- - AC-1: `subtract(5, 3)` returns 2.
39
- - AC-2: `multiply(2, 3)` returns 6.
40
- """
41
- And step "design.gate.answer" changes nothing
42
- And step "seam.check" changes nothing
43
-
44
- Scenario: a naive pass stopped at its context limit is continued from its kept tip with the open IDs
45
- Given step "seam.naive" writes "tests/calc.test.ts" with:
46
- """
47
- it("[AC-1] subtracts", () => {})
48
- """
49
- And step "seam.naive" writes ".gtd/HANDOFF.md" with:
50
- """
51
- Wrote subtract and its test; multiply was next.
52
- """
53
- When the process is driven
54
- Then the process rests at "seam.continue.naive"
55
- And the resting step's content contains "Your previous turn stopped at its context limit"
56
- And the resting step's content contains "Still open: AC-2."
57
- And the resting step's content contains "Wrote subtract and its test; multiply was next."
58
- And the resting step's content contains "':(top)' ':(top,exclude).gtd/HANDOFF.md' | git apply"
59
- And ".gtd/HANDOFF.md" does not exist
60
- And the output of gtd "next --json" contains "\"resume\":false"
61
- And the output of gtd "next --json" contains "\"memory\":\"seam.continue#"
62
-
63
- Given step "seam.continue.naive" writes "tests/calc.test.ts" with:
64
- """
65
- it("[AC-1] subtracts", () => {})
66
- it("[AC-2] multiplies", () => {})
67
- """
68
- When the process is driven
69
- Then the process rests at "implement.applying"
70
- And the commit subjects end with:
71
- """
72
- gtd(human): design.gate.answer → seam.naive
73
- gtd(agent): seam.naive → seam.continue.naive
74
- gtd(agent): seam.continue.naive → seam.check
75
- gtd(check): seam.check → implement.applying
76
- """
77
-
78
- Scenario: two continuations in a row that close nothing rest for a person
79
- Given step "seam.naive" writes "tests/calc.test.ts" with:
80
- """
81
- it("[AC-1] subtracts", () => {})
82
- """
83
- And step "seam.naive" writes ".gtd/HANDOFF.md" with:
84
- """
85
- Subtract is tested; multiply was next.
86
- """
87
- And step "seam.continue.naive" writes ".gtd/HANDOFF.md" with:
88
- """
89
- Still on multiply.
90
- """
91
- When the process is driven
92
- Then the process rests at "seam.oversized"
93
- And the resting step's content contains "the last 2 continuations closed nothing still open"
94
- And the commit subjects end with:
95
- """
96
- gtd(human): design.gate.answer → seam.naive
97
- gtd(agent): seam.naive → seam.continue.naive
98
- gtd(agent): seam.continue.naive
99
- gtd(agent): seam.continue.naive → seam.oversized
100
- """
101
-
102
- Scenario: a refactor stopped at its context limit is run green before its continuation
103
- Given step "seam.naive" writes "tests/calc.test.ts" with:
104
- """
105
- it("[AC-1] subtracts", () => {})
106
- it("[AC-2] multiplies", () => {})
107
- """
108
- And step "seam.naive" writes "src/calc.ts" with:
109
- """
110
- export const add = (a: number, b: number) => a + b
111
- export const subtract = (a: number, b: number) => a - b
112
- export const multiply = (a: number, b: number) => a * b
113
- """
114
- And judge step "seam.judge" answers:
115
- """
116
- [{"id":"shape","answer":"refactor-first","p":0.9}]
117
- """
118
- And step "seam.note" writes ".gtd/REFACTOR-NOTE.md" with:
119
- """
120
- Seam: a shared `op` in src/calc.ts.
121
- """
122
- And step "refactor.deriving" runs its script
123
- And step "refactor.building" writes ".gtd/HANDOFF.md" with:
124
- """
125
- Started on op; nothing changed yet.
126
- """
127
- And step "refactor.health.check" changes nothing
128
- When the process is driven
129
- Then the process rests at "refactor.continue.building"
130
- And the resting step's content contains "Still open: src/calc.ts."
131
- And the resting step's content contains "Started on op; nothing changed yet."
132
- And the commit subjects end with:
133
- """
134
- gtd(agent): refactor.building → refactor.health.check
135
- gtd(check): refactor.health.check → refactor.continue.building
136
- """
137
-
138
- Scenario: a refactor continuation that leaves the note in place stopped again
139
- Given step "seam.naive" writes "tests/calc.test.ts" with:
140
- """
141
- it("[AC-1] subtracts", () => {})
142
- it("[AC-2] multiplies", () => {})
143
- """
144
- And step "seam.naive" writes "src/calc.ts" with:
145
- """
146
- export const add = (a: number, b: number) => a + b
147
- export const subtract = (a: number, b: number) => a - b
148
- """
149
- And judge step "seam.judge" answers:
150
- """
151
- [{"id":"shape","answer":"refactor-first","p":0.9}]
152
- """
153
- And step "seam.note" writes ".gtd/REFACTOR-NOTE.md" with:
154
- """
155
- Seam: a shared `op` in src/calc.ts.
156
- """
157
- And step "refactor.deriving" runs its script
158
- And step "refactor.building" writes "src/calc.ts" with:
159
- """
160
- export const op = (a: number, b: number, sign: number) => a + sign * b
161
- export const add = (a: number, b: number) => a + b
162
- """
163
- And step "refactor.building" writes ".gtd/HANDOFF.md" with:
164
- """
165
- op is in; routing add through it was next.
166
- """
167
- And step "refactor.health.check" changes nothing
168
- And step "refactor.continue.building" writes "src/calc.ts" with:
169
- """
170
- export const op = (a: number, b: number, sign: number) => a + sign * b
171
- export const add = (a: number, b: number) => op(a, b, 1)
172
- """
173
- When the process is driven
174
- Then the process rests at "refactor.continue.building"
175
- And the commit subjects end with:
176
- """
177
- gtd(agent): refactor.building → refactor.health.check
178
- gtd(check): refactor.health.check → refactor.continue.building
179
- gtd(agent): refactor.continue.building → refactor.health.check
180
- gtd(check): refactor.health.check → refactor.continue.building
181
- gtd(agent): refactor.continue.building
182
- """
183
-
184
- Scenario: once a naive pass has continued, its retry runs in a fresh conversation, not as a continuation
185
- Given step "seam.naive" writes "tests/calc.test.ts" with:
186
- """
187
- it("[AC-1] subtracts", () => {})
188
- """
189
- And step "seam.naive" writes ".gtd/HANDOFF.md" with:
190
- """
191
- Multiply was next.
192
- """
193
- And step "seam.continue.naive" writes "tests/calc.test.ts" with:
194
- """
195
- it("[AC-1] subtracts", () => {})
196
- it("[AC-2] multiplies", () => {})
197
- """
198
- And step "seam.continue.naive" writes "src/calc.ts" with:
199
- """
200
- export const add = (a: number, b: number) => a - b
201
- """
202
- And judge step "seam.judge" answers:
203
- """
204
- [{"id":"shape","answer":"reject","p":0.9}]
205
- """
206
- When the process is driven
207
- Then the process rests at "seam.fresh.naive"
208
- And the resting step's content contains "rejected"
209
- And the output of gtd "next --json" contains "\"resume\":false"
@@ -1,256 +0,0 @@
1
- @inmem
2
- Feature: every slice's quality lap is triaged, and its leftovers wait for the review
3
-
4
- A judge sorts each slice's findings like the last slice's (see
5
- `lens-review.feature`): mechanical ones are fixed, noise is dropped, design
6
- ones are never sent to the fixer. Nothing between slices asks a person
7
- anything — what a lap leaves is carried to the review after the last slice,
8
- each finding naming its slice and lens.
9
-
10
- Background:
11
- Given the shipped workflows, as gtd install scaffolds them
12
- And an environment variable "GTD_PROTOTYPEROUNDS" set to "0"
13
- And an environment variable "GTD_QUALITYREVIEWS" set to "correctness"
14
- And an environment variable "GTD_FLAGMODE" set to "false"
15
- And an environment variable "GTD_SLICEMAXCRITERIA" set to "1"
16
- And a file "src/calc.ts" with:
17
- """
18
- export const add = (a: number, b: number) => a + b
19
- """
20
- And the working tree is committed as "feat: add calculator"
21
- And a file "TODO.md" with:
22
- """
23
- # More arithmetic
24
-
25
- subtract and multiply.
26
- """
27
- And step "unwind" changes nothing
28
- And step "start-gate.check" changes nothing
29
- And step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
30
- """
31
- # Requirements
32
-
33
- ## Impact
34
-
35
- - the greeting module
36
-
37
- ## Acceptance Criteria
38
-
39
- - AC-1: subtract(a, b) returns a - b.
40
- - AC-2: multiply(a, b) returns a * b.
41
- """
42
- And step "design.gate.answer" changes nothing
43
- And step "design.slicing" writes ".gtd/SLICES.md" with:
44
- """
45
- # Slices
46
-
47
- ## Subtract
48
-
49
- - AC-1
50
-
51
- ## Multiply
52
-
53
- - AC-2
54
- """
55
- And step "seam.naive", when prompted with "This slice builds AC-1 only", writes "src/sub.test.ts" with:
56
- """
57
- it("[AC-1] subtracts", () => {})
58
- """
59
- And step "seam.naive", when prompted with "This slice builds AC-2 only", writes "src/mul.test.ts" with:
60
- """
61
- it("[AC-2] multiplies", () => {})
62
- """
63
- And step "seam.check" changes nothing
64
- And step "implement.applying" runs its script
65
- And step "implement.health.check" changes nothing
66
- And step "implement.closing" runs its script
67
- And step "build.quality.sorting" runs its script
68
- And step "build.quality.closing" runs its script
69
- And step "build.health.check" changes nothing
70
- And step "build.review.carrying" runs its script
71
- And judge step "build.review.ranking" answers:
72
- """
73
- []
74
- """
75
-
76
- Scenario: a finding questioning a criterion reaches the final review, never the fixer
77
- Given step "build.quality.correctness.reviewing" writes ".gtd/QUALITY.md" with:
78
- """
79
- # Quality
80
-
81
- ## AC-1 ignores floating point
82
-
83
- Should subtract round? The criterion does not say.
84
- """
85
- And judge step "build.quality.triage" answers:
86
- """
87
- [{"id":"Q1","answer":"design","p":0.9}]
88
- """
89
- And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
90
- """
91
- # Review: abc1234
92
-
93
- <!-- base: 0000000 -->
94
-
95
- ## Subtract and multiply
96
-
97
- - [ ] ./src/sub.test.ts#1-1 — subtract
98
- - [ ] ./src/mul.test.ts#1-1 — multiply
99
-
100
- ## AC-1 ignores floating point
101
-
102
- - [ ] ./src/sub.test.ts#1-1 — where it applies
103
-
104
- ## AC-1 ignores floating point (2)
105
-
106
- - [ ] ./src/sub.test.ts#1-1 — where it applies
107
- """
108
- When the process is driven
109
- Then the process rests at "build.review.await-review"
110
- And no commit body contains "build.fix.quality.fixing"
111
- And ".gtd/QUALITY.md" does not exist
112
- And ".gtd/REVIEW.md" contains:
113
- """
114
- ### AC-1 ignores floating point
115
-
116
- _critical: judge unsure_
117
-
118
- _From slice 1, lens correctness._
119
-
120
- Should subtract round? The criterion does not say.
121
- """
122
- And ".gtd/REVIEW.md" contains:
123
- """
124
- ### AC-1 ignores floating point (2)
125
-
126
- _critical: judge unsure_
127
-
128
- _From slice 2, lens correctness._
129
- """
130
- And the commit subjects end with:
131
- """
132
- gtd(check): implement.closing → build.quality.correctness.reviewing
133
- gtd(agent): build.quality.correctness.reviewing → build.quality.triage
134
- gtd(judge): build.quality.triage → build.quality.sorting
135
- gtd(check): build.quality.sorting → seam.naive
136
- gtd(agent): seam.naive → seam.check
137
- gtd(check): seam.check → implement.applying
138
- gtd(check): implement.applying → implement.health.check
139
- gtd(check): implement.health.check → implement.closing
140
- gtd(check): implement.closing → build.quality.correctness.reviewing
141
- gtd(agent): build.quality.correctness.reviewing → build.quality.triage
142
- gtd(judge): build.quality.triage → build.quality.sorting
143
- gtd(check): build.quality.sorting → build.review.reviewing
144
- gtd(agent): build.review.reviewing → build.review.ranking
145
- gtd(judge): build.review.ranking → build.review.carrying
146
- gtd(check): build.review.carrying → build.review.await-review
147
- """
148
-
149
- Scenario: a mechanical finding the fix cap leaves in an early slice is carried, never escalated
150
- Given step "build.quality.correctness.reviewing" writes ".gtd/QUALITY.md" with:
151
- """
152
- # Quality
153
-
154
- ## subtract has no negative test
155
-
156
- Add a test subtracting a larger number.
157
- """
158
- And judge step "build.quality.triage" answers:
159
- """
160
- [{"id":"Q1","answer":"mechanical","p":0.9}]
161
- """
162
- And step "build.fix.quality.fixing" changes nothing
163
- And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
164
- """
165
- # Review: abc1234
166
-
167
- <!-- base: 0000000 -->
168
-
169
- ## Subtract and multiply
170
-
171
- - [ ] ./src/sub.test.ts#1-1 — subtract
172
- - [ ] ./src/mul.test.ts#1-1 — multiply
173
-
174
- ## subtract has no negative test
175
-
176
- - [ ] ./src/sub.test.ts#1-1 — where it applies
177
-
178
- ## subtract has no negative test (2)
179
-
180
- - [ ] ./src/sub.test.ts#1-1 — where it applies
181
- """
182
- When the process is driven
183
- Then the process rests at "build.review.await-review"
184
- And no commit body contains "build.health.describe"
185
- And ".gtd/REVIEW.md" contains:
186
- """
187
- ### subtract has no negative test
188
-
189
- _critical: judge unsure_
190
-
191
- _From slice 1, lens correctness._
192
-
193
- _The fixer left this unresolved._
194
- """
195
- And the commit subjects end with:
196
- """
197
- gtd(check): implement.closing → build.quality.correctness.reviewing
198
- gtd(agent): build.quality.correctness.reviewing → build.quality.triage
199
- gtd(judge): build.quality.triage → build.fix.quality.fixing
200
- gtd(agent): build.fix.quality.fixing
201
- gtd(agent): build.fix.quality.fixing
202
- gtd(agent): build.fix.quality.fixing → build.health.check
203
- gtd(check): build.health.check → build.quality.closing
204
- gtd(check): build.quality.closing → seam.naive
205
- gtd(agent): seam.naive → seam.check
206
- gtd(check): seam.check → implement.applying
207
- gtd(check): implement.applying → implement.health.check
208
- gtd(check): implement.health.check → implement.closing
209
- gtd(check): implement.closing → build.quality.correctness.reviewing
210
- gtd(agent): build.quality.correctness.reviewing → build.quality.triage
211
- gtd(judge): build.quality.triage → build.fix.quality.fixing
212
- gtd(agent): build.fix.quality.fixing
213
- gtd(agent): build.fix.quality.fixing
214
- gtd(agent): build.fix.quality.fixing → build.health.check
215
- gtd(check): build.health.check → build.quality.closing
216
- gtd(check): build.quality.closing → build.review.reviewing
217
- gtd(agent): build.review.reviewing → build.review.ranking
218
- gtd(judge): build.review.ranking → build.review.carrying
219
- gtd(check): build.review.carrying → build.review.await-review
220
- """
221
-
222
- Scenario: the final review lists every slice's fixes with their commits
223
- Given step "build.quality.correctness.reviewing" writes ".gtd/QUALITY.md" with:
224
- """
225
- # Quality
226
-
227
- ## subtract has no negative test
228
-
229
- Add a test subtracting a larger number.
230
- """
231
- And judge step "build.quality.triage" answers:
232
- """
233
- [{"id":"Q1","answer":"mechanical","p":0.9}]
234
- """
235
- And step "build.fix.quality.fixing" writes "src/edge.test.ts" with:
236
- """
237
- it("subtracts a larger number", () => {})
238
- """
239
- And step "build.fix.quality.fixing" deletes ".gtd/QUALITY.md"
240
- And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
241
- """
242
- # Review: abc1234
243
-
244
- <!-- base: 0000000 -->
245
-
246
- ## Subtract and multiply
247
-
248
- - [ ] ./src/sub.test.ts#1-1 — subtract
249
- - [ ] ./src/mul.test.ts#1-1 — multiply
250
- """
251
- When the process is driven
252
- Then the process rests at "build.review.await-review"
253
- And ".gtd/REVIEW.md" contains ", slice 1, lens correctness)"
254
- And ".gtd/REVIEW.md" contains ", slice 2, lens correctness)"
255
- And ".gtd/REVIEW.md" contains the short hash of the commit "gtd(agent): build.fix.quality.fixing → build.health.check"
256
- And no commit body contains "build.quality.closing"
@@ -1,23 +0,0 @@
1
- @inmem
2
- Feature: a bad sliceMaxCriteria refuses the landing that would pin it
3
-
4
- The cap is read right after idle, so a value that is not a positive integer
5
- never gets pinned into a process that would refuse every later landing.
6
-
7
- Scenario: a zero cap refuses the idle landing
8
- Given the shipped workflows, as gtd install scaffolds them
9
- And an environment variable "GTD_SLICEMAXCRITERIA" set to "0"
10
- And a file "TODO.md" with:
11
- """
12
- # Something
13
- """
14
- Then driving the process is refused with "sliceMaxCriteria must be a positive integer, got \"0\""
15
-
16
- Scenario: a prototypeRounds that is not a whole number refuses the idle landing
17
- Given the shipped workflows, as gtd install scaffolds them
18
- And an environment variable "GTD_PROTOTYPEROUNDS" set to "-1"
19
- And a file "TODO.md" with:
20
- """
21
- # Something
22
- """
23
- Then driving the process is refused with "prototypeRounds must be a non-negative integer, got \"-1\""