@pmelab/gtd 58.1.0 → 59.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 (142) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +115 -390
  3. package/dist/chunks/{Schema-B3o6eRNU.mjs → testkit-CMBAAyRK.mjs} +13409 -3351
  4. package/dist/gtd.bundle.mjs +76 -59
  5. package/dist/testkit/gherkin.mjs +30 -2
  6. package/dist/testkit.mjs +1 -1
  7. package/package.json +3 -42
  8. package/skills/authoring/SKILL.md +31 -25
  9. package/src/cli/Cli.test.ts +15 -19
  10. package/src/cli/Cli.ts +2 -4
  11. package/src/cli/Program.test.ts +60 -29
  12. package/src/cli/Program.ts +5 -7
  13. package/src/edge/Edge.ts +3 -3
  14. package/src/flags/index.test.ts +0 -13
  15. package/src/flags/index.ts +1 -3
  16. package/src/gherkin/git-control.feature +78 -0
  17. package/src/gherkin/index.ts +35 -1
  18. package/src/install/Install.test.ts +14 -11
  19. package/src/install/Install.ts +38 -15
  20. package/src/install/index.ts +1 -2
  21. package/src/replay/Replay.test.ts +1 -1
  22. package/src/replay/index.ts +1 -1
  23. package/src/step/planStart.ts +6 -1
  24. package/src/testkit/TestRepo.test.ts +118 -2
  25. package/src/testkit/TestRepo.ts +57 -6
  26. package/src/testkit/index.ts +1 -0
  27. package/src/twins/EmittedScriptRecognizer.ts +12 -14
  28. package/src/twins/FlowScripts.ts +10 -9
  29. package/src/twins/InMemRepo.ts +26 -1
  30. package/src/twins/Layers.ts +12 -1
  31. package/src/twins/index.ts +6 -1
  32. package/src/workflow/index.ts +1 -0
  33. package/src/workflow/load.test.ts +138 -113
  34. package/src/workflow/load.ts +1 -1
  35. package/src/workflow/vars.test.ts +30 -3
  36. package/src/workflow/vars.ts +34 -2
  37. package/src/workflow-kit/index.ts +1 -1
  38. package/dist/chunks/reserved-lMYCaapY.mjs +0 -1990
  39. package/dist/chunks/review-Bfaror38.mjs +0 -427
  40. package/dist/chunks/tail-Bd7L940p.mjs +0 -355
  41. package/dist/chunks/testkit-D1-auYau.mjs +0 -10362
  42. package/dist/workflows/cleanup.mjs +0 -36
  43. package/dist/workflows/feature.mjs +0 -1018
  44. package/dist/workflows/fix.mjs +0 -41
  45. package/dist/workflows/review.mjs +0 -45
  46. package/dist/workflows/rollout.mjs +0 -48
  47. package/dist/workflows.mjs +0 -40651
  48. package/src/install/ConfigScaffold.ts +0 -22
  49. package/src/workflows/cleanup/cleanup-path.feature +0 -94
  50. package/src/workflows/cleanup/cleanup.feature +0 -315
  51. package/src/workflows/cleanup/cleanup.test.ts +0 -276
  52. package/src/workflows/cleanup/cleanup.ts +0 -52
  53. package/src/workflows/cleanup/index.ts +0 -6
  54. package/src/workflows/feature/acceptance-criteria-tier.feature +0 -25
  55. package/src/workflows/feature/acceptance-criteria.feature +0 -389
  56. package/src/workflows/feature/criteria-coverage.feature +0 -102
  57. package/src/workflows/feature/criteria.test.ts +0 -147
  58. package/src/workflows/feature/criteria.ts +0 -267
  59. package/src/workflows/feature/fast-path.feature +0 -93
  60. package/src/workflows/feature/feature.test.ts +0 -338
  61. package/src/workflows/feature/feature.ts +0 -156
  62. package/src/workflows/feature/green.ts +0 -19
  63. package/src/workflows/feature/index.ts +0 -18
  64. package/src/workflows/feature/lens-models.feature +0 -69
  65. package/src/workflows/feature/lens-review.feature +0 -566
  66. package/src/workflows/feature/naive-acceptance.feature +0 -147
  67. package/src/workflows/feature/naive-test.feature +0 -263
  68. package/src/workflows/feature/one-step-land.feature +0 -93
  69. package/src/workflows/feature/planning.ts +0 -41
  70. package/src/workflows/feature/refactor-absorbs.feature +0 -131
  71. package/src/workflows/feature/refactor-first.feature +0 -158
  72. package/src/workflows/feature/refactor-lens-models.feature +0 -79
  73. package/src/workflows/feature/refactor-rebuild.feature +0 -273
  74. package/src/workflows/feature/refactor-review.feature +0 -1528
  75. package/src/workflows/feature/refactor.test.ts +0 -1220
  76. package/src/workflows/feature/refactor.ts +0 -368
  77. package/src/workflows/feature/release-flag.feature +0 -167
  78. package/src/workflows/feature/release-flag.test.ts +0 -49
  79. package/src/workflows/feature/release-flag.ts +0 -46
  80. package/src/workflows/feature/review-gate.feature +0 -241
  81. package/src/workflows/feature/reviewer-walkthrough.feature +0 -142
  82. package/src/workflows/feature/risk-tier.feature +0 -351
  83. package/src/workflows/feature/seam-rejection.feature +0 -146
  84. package/src/workflows/feature/seam.feature +0 -297
  85. package/src/workflows/feature/seam.test.ts +0 -527
  86. package/src/workflows/feature/seam.ts +0 -426
  87. package/src/workflows/feature/standards.feature +0 -354
  88. package/src/workflows/feature/steps.test.ts +0 -65
  89. package/src/workflows/feature/steps.ts +0 -45
  90. package/src/workflows/feature/tier-pin.feature +0 -66
  91. package/src/workflows/feature/tier.test.ts +0 -166
  92. package/src/workflows/feature/tier.ts +0 -56
  93. package/src/workflows/fix/fix-lens-origin.feature +0 -114
  94. package/src/workflows/fix/fix-quality.feature +0 -212
  95. package/src/workflows/fix/fix.feature +0 -79
  96. package/src/workflows/fix/fix.test.ts +0 -74
  97. package/src/workflows/fix/fix.ts +0 -52
  98. package/src/workflows/fix/index.ts +0 -6
  99. package/src/workflows/index.ts +0 -47
  100. package/src/workflows/review/index.ts +0 -6
  101. package/src/workflows/review/review-door.feature +0 -199
  102. package/src/workflows/review/review.test.ts +0 -27
  103. package/src/workflows/review/review.ts +0 -60
  104. package/src/workflows/rollout/index.ts +0 -6
  105. package/src/workflows/rollout/rollout.feature +0 -510
  106. package/src/workflows/rollout/rollout.test.ts +0 -263
  107. package/src/workflows/rollout/rollout.ts +0 -82
  108. package/src/workflows/shared/__fixtures__/feature-collecting-prompt.txt +0 -98
  109. package/src/workflows/shared/access.test.ts +0 -62
  110. package/src/workflows/shared/access.ts +0 -24
  111. package/src/workflows/shared/config.fixture.ts +0 -12
  112. package/src/workflows/shared/fences.ts +0 -24
  113. package/src/workflows/shared/health.test.ts +0 -148
  114. package/src/workflows/shared/health.ts +0 -191
  115. package/src/workflows/shared/learn.test.ts +0 -140
  116. package/src/workflows/shared/learn.ts +0 -201
  117. package/src/workflows/shared/lenses.test.ts +0 -39
  118. package/src/workflows/shared/lenses.ts +0 -294
  119. package/src/workflows/shared/options.test.ts +0 -157
  120. package/src/workflows/shared/options.ts +0 -92
  121. package/src/workflows/shared/progress.feature +0 -124
  122. package/src/workflows/shared/prose.ts +0 -263
  123. package/src/workflows/shared/recheck.feature +0 -60
  124. package/src/workflows/shared/registry.test.ts +0 -345
  125. package/src/workflows/shared/registry.ts +0 -183
  126. package/src/workflows/shared/reserved.ts +0 -11
  127. package/src/workflows/shared/review.test.ts +0 -1062
  128. package/src/workflows/shared/review.ts +0 -446
  129. package/src/workflows/shared/skills.test.ts +0 -121
  130. package/src/workflows/shared/skills.ts +0 -49
  131. package/src/workflows/shared/standards.test.ts +0 -90
  132. package/src/workflows/shared/standards.ts +0 -156
  133. package/src/workflows/shared/steps.test.ts +0 -219
  134. package/src/workflows/shared/steps.ts +0 -201
  135. package/src/workflows/shared/tail.test.ts +0 -454
  136. package/src/workflows/shared/tail.ts +0 -264
  137. package/src/workflows/shared/text.fixture.ts +0 -128
  138. package/src/workflows/shared/text.test.ts +0 -1430
  139. package/src/workflows/shared/text.ts +0 -1700
  140. package/src/workflows/shared/threads.test.ts +0 -129
  141. package/src/workflows/shared/vars.ts +0 -47
  142. package/src/workflows/shared/workflows.steps.ts +0 -54
@@ -1,351 +0,0 @@
1
- @inmem
2
- Feature: the risk tier is proposed at triage and recorded behind GTD_FLAG_RISK_TIER
3
-
4
- With GTD_FLAG_RISK_TIER on, design.triage asks
5
- for a risk tier and production signals, and the design gate's exit lands them
6
- as Gtd-Mark trailers: one `risk-tier=<low|high>`, one `production-signal`
7
- per signal. A missing or unreadable tier is high. With the flag off, nothing
8
- is asked and no commit carries a Gtd-Mark.
9
-
10
- Background:
11
- Given the shipped workflows, as gtd install scaffolds them
12
- And an environment variable "GTD_QUALITYREVIEWS" set to ""
13
-
14
- Rule: with GTD_FLAG_RISK_TIER on
15
-
16
- Background:
17
- Given an environment variable "GTD_FLAG_RISK_TIER" set to "1"
18
- And a file "src/calc.ts" with:
19
- """
20
- export const add = (a: number, b: number) => a + b
21
- """
22
- And a file "src/calc.test.ts" with:
23
- """
24
- import { expect, it } from "vitest"
25
- it("adds", () => expect(1 + 1).toBe(2))
26
- """
27
- And the working tree is committed as "feat: add calculator"
28
- And a file "TODO.md" with:
29
- """
30
- # Add subtract
31
-
32
- subtract(a, b) returns the difference.
33
- """
34
- And step "unwind" changes nothing
35
- And step "start-gate.check" changes nothing
36
-
37
- Scenario: with the flag on the triage prompt asks for the tier and the signals
38
- When the process is driven
39
- Then the process rests at "design.triage"
40
- And the resting step's content contains "## Risk Tier"
41
- And the resting step's content contains "## Production Signals"
42
- And the resting step's content contains "unsure means `high`"
43
-
44
- Scenario: a low tier marks risk-tier=low on the design-exit commit
45
- Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
46
- """
47
- # Requirements
48
-
49
- ## Risk Tier
50
-
51
- low — trivial copy change
52
-
53
- ## Impact
54
-
55
- - the greeting module
56
-
57
- ## Release Flag
58
-
59
- new
60
-
61
- ## Acceptance Criteria
62
-
63
- - AC-1: the change behaves as described.
64
- """
65
- And step "design.gate.answer" changes nothing
66
- When the process is driven
67
- Then the process rests at "seam.naive"
68
- And the last commit subject is "gtd(human): design.gate.answer → seam.naive"
69
- And the last commit body contains "Gtd-Mark: risk-tier=low"
70
-
71
- Scenario: a high tier marks the design-exit commit
72
- Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
73
- """
74
- # Requirements
75
-
76
- ## Risk Tier
77
-
78
- high — touches payments
79
-
80
- ## Impact
81
-
82
- - the greeting module
83
-
84
- ## Release Flag
85
-
86
- new
87
-
88
- ## Acceptance Criteria
89
-
90
- - AC-1: the change behaves as described.
91
- """
92
- And step "design.gate.answer" changes nothing
93
- When the process is driven
94
- Then the process rests at "seam.naive"
95
- And the last commit subject is "gtd(human): design.gate.answer → seam.naive"
96
- And the last commit body contains "Gtd-Mark: risk-tier=high"
97
-
98
- Scenario Outline: a missing section or an unknown word counts as high
99
- Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
100
- """
101
- # Requirements
102
-
103
- <tier section>
104
- ## Concerns
105
-
106
- ### Subtract
107
-
108
- ## Impact
109
-
110
- - the greeting module
111
-
112
- ## Release Flag
113
-
114
- new
115
-
116
- ## Acceptance Criteria
117
-
118
- - AC-1: the change behaves as described.
119
- """
120
- And step "design.gate.answer" changes nothing
121
- When the process is driven
122
- Then the process rests at "seam.naive"
123
- And the last commit body contains "Gtd-Mark: risk-tier=high"
124
-
125
- Examples:
126
- | tier section |
127
- | |
128
- | ## Risk Tier\n\nmedium — hmm |
129
- | ```\n## Risk Tier\n\nlow\n```\n |
130
-
131
- Scenario Outline: signals written at triage land as marks for either tier
132
- Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
133
- """
134
- # Requirements
135
-
136
- ## Risk Tier
137
-
138
- <tier> — reason
139
-
140
- ## Production Signals
141
-
142
- - error rate on /subtract stays flat
143
- - p95 latency
144
-
145
- ## Impact
146
-
147
- - the greeting module
148
-
149
- ## Release Flag
150
-
151
- new
152
-
153
- ## Acceptance Criteria
154
-
155
- - AC-1: the change behaves as described.
156
- """
157
- And step "design.gate.answer" changes nothing
158
- When the process is driven
159
- Then the process rests at "seam.naive"
160
- And the last commit body contains "Gtd-Mark: production-signal=error rate on /subtract stays flat"
161
- And the last commit body contains "Gtd-Mark: production-signal=p95 latency"
162
-
163
- Examples:
164
- | tier |
165
- | low |
166
- | high |
167
-
168
- Scenario: the tier a rebuilt pass is told comes from the requirements the final design gate lap accepted
169
- Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
170
- """
171
- # Requirements
172
-
173
- ## Risk Tier
174
-
175
- low — trivial copy change
176
-
177
- ## Impact
178
-
179
- - the greeting module
180
-
181
- ## Release Flag
182
-
183
- new
184
-
185
- ## Acceptance Criteria
186
-
187
- - AC-1: the change behaves as described.
188
- """
189
- And step "seam.check" writes "src/acceptance.test.ts" with:
190
- """
191
- it("[AC-1] holds elsewhere", () => {})
192
- """
193
- And step "implement.applying" runs its script
194
- And step "seam.naive" writes "src/acceptance.test.ts" with:
195
- """
196
- it("[AC-1] holds", () => {})
197
- """
198
- And step "seam.naive" writes "src/calc.ts" with:
199
- """
200
- export const add = (a: number, b: number) => a + b
201
- export const subtract = (a: number, b: number) => a - b
202
- """
203
- And judge step "seam.judge" answers:
204
- """
205
- [{"id":"shape","answer":"land","p":0.9}]
206
- """
207
- When the process is driven
208
- Then the process rests at "design.gate.answer"
209
- Given a file ".gtd/REQUIREMENTS.md" with:
210
- """
211
- # Requirements
212
-
213
- ## Risk Tier
214
-
215
- high — touches payments
216
- """
217
- And step "design.triage" from now on changes nothing
218
- And step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
219
- """
220
- # Requirements
221
-
222
- ## Risk Tier
223
-
224
- high — touches payments
225
-
226
- ## Concerns
227
-
228
- ### Subtract
229
-
230
- ## Impact
231
-
232
- - the greeting module
233
-
234
- ## Release Flag
235
-
236
- new
237
-
238
- ## Acceptance Criteria
239
-
240
- - AC-1: the change behaves as described.
241
- """
242
- And step "design.gate.answer" changes nothing
243
- When the process is driven
244
- Then the process rests at "implement.building"
245
- And the resting step's content contains "Put the new behaviour behind a new release flag"
246
- And the resting step's content does not contain "Add no release flag"
247
-
248
- Rule: with GTD_FLAG_RISK_TIER off
249
-
250
- Background:
251
- Given an environment variable "GTD_FLAG_RISK_TIER" set to "0"
252
- And a file "src/calc.ts" with:
253
- """
254
- export const add = (a: number, b: number) => a + b
255
- """
256
- And a file "src/calc.test.ts" with:
257
- """
258
- import { expect, it } from "vitest"
259
- it("adds", () => expect(1 + 1).toBe(2))
260
- """
261
- And the working tree is committed as "feat: add calculator"
262
- And a file "TODO.md" with:
263
- """
264
- # Add subtract
265
-
266
- subtract(a, b) returns the difference.
267
- """
268
- And step "unwind" changes nothing
269
- And step "start-gate.check" changes nothing
270
-
271
- Scenario: the flag-off twin asks for no tier and marks no commit
272
- Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
273
- """
274
- # Requirements
275
-
276
- ## Risk Tier
277
-
278
- low — trivial
279
-
280
- ## Production Signals
281
-
282
- - error rate stays flat
283
-
284
- ## Impact
285
-
286
- - the greeting module
287
-
288
- ## Release Flag
289
-
290
- new
291
-
292
- ## Acceptance Criteria
293
-
294
- - AC-1: the change behaves as described.
295
- """
296
- And step "design.gate.answer" changes nothing
297
- When the process is driven
298
- Then the process rests at "seam.naive"
299
- And no commit body contains "Gtd-Mark"
300
-
301
- Scenario: the flag-off twin's triage prompt has no tier section
302
- When the process is driven
303
- Then the process rests at "design.triage"
304
- And the resting step's content does not contain "## Risk Tier"
305
- And the resting step's content does not contain "## Production Signals"
306
-
307
-
308
- Scenario: the flag-off twin keeps today's flag demand on a rebuilt pass
309
- Given step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
310
- """
311
- # Requirements
312
-
313
- ## Risk Tier
314
-
315
- low — trivial
316
-
317
- ## Impact
318
-
319
- - the greeting module
320
-
321
- ## Release Flag
322
-
323
- new
324
-
325
- ## Acceptance Criteria
326
-
327
- - AC-1: the change behaves as described.
328
- """
329
- And step "design.gate.answer" changes nothing
330
- And step "seam.check" writes "src/acceptance.test.ts" with:
331
- """
332
- it("[AC-1] holds elsewhere", () => {})
333
- """
334
- And step "implement.applying" runs its script
335
- And step "seam.naive" writes "src/acceptance.test.ts" with:
336
- """
337
- it("[AC-1] holds", () => {})
338
- """
339
- And step "seam.naive" writes "src/calc.ts" with:
340
- """
341
- export const add = (a: number, b: number) => a + b
342
- export const subtract = (a: number, b: number) => a - b
343
- """
344
- And judge step "seam.judge" answers:
345
- """
346
- [{"id":"shape","answer":"land","p":0.9}]
347
- """
348
- When the process is driven
349
- Then the process rests at "implement.building"
350
- And the resting step's content contains "Put the new behaviour behind a new release flag"
351
- And the resting step's content does not contain "Add no release flag"
@@ -1,146 +0,0 @@
1
- # One SDLC path per file, so a changed path reds exactly one fixture — do not merge.
2
- @inmem
3
- Feature: rejected naive passes walk one fixed path through the steer gate to the review gate
4
-
5
- With GTD_FLAG_RISK_TIER off, three rejected naive
6
- passes rest at the steer gate, where a human edit restarts the seam and the
7
- steered rerun lands. The flags are pinned so the per-flag test runs never
8
- move it off its path.
9
-
10
- Background:
11
- Given the shipped workflows, as gtd install scaffolds them
12
- And an environment variable "GTD_QUALITYREVIEWS" set to ""
13
- And an environment variable "GTD_FLAG_RISK_TIER" set to "0"
14
- And a file "src/calc.ts" with:
15
- """
16
- export const add = (a: number, b: number) => a + b
17
- """
18
- And the working tree is committed as "feat: add calculator"
19
- And a file "TODO.md" with:
20
- """
21
- # Add subtract
22
-
23
- subtract(a, b) returns the difference.
24
- """
25
- And step "unwind" changes nothing
26
- And step "start-gate.check" changes nothing
27
- And step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
28
- """
29
- # Requirements
30
-
31
- ## Concerns
32
-
33
- ### Subtract
34
-
35
- - `subtract(a, b)` returns `a - b`.
36
-
37
- ## Impact
38
-
39
- - the greeting module
40
-
41
- ## Release Flag
42
-
43
- new
44
-
45
- ## Acceptance Criteria
46
-
47
- - AC-1: the change behaves as described.
48
- """
49
- And step "design.gate.answer" changes nothing
50
-
51
- Scenario: three rejects rest at the steer gate, a steered rerun lands and runs to the review gate
52
- Given step "seam.check" changes nothing
53
- And step "seam.naive" writes "src/acceptance.test.ts" with:
54
- """
55
- it("[AC-1] holds", () => {})
56
- """
57
- And step "seam.naive" writes "src/calc.ts" with:
58
- """
59
- export const add = (a: number, b: number) => b + a
60
- """
61
- And step "implement.health.check" changes nothing
62
- And step "implement.closing" runs its script
63
- When the process is driven
64
- Then the process rests at "seam.judge"
65
-
66
- Given step "seam.naive" is prompted with "Your previous attempt was rejected"
67
- And judge step "seam.judge" answers:
68
- """
69
- [{"id":"shape","answer":"reject","p":0.9}]
70
- """
71
- When the process is driven
72
- Then the process rests at "seam.steer"
73
- And the resting step's content contains "Overrule"
74
- And the resting step's content contains "src/calc.ts"
75
-
76
- Given a file ".gtd/REQUIREMENTS.md" with:
77
- """
78
- # Requirements
79
-
80
- ## Concerns
81
-
82
- ### Subtract
83
-
84
- - `subtract(a, b)` returns `a - b`, in the calculator module.
85
-
86
- ## Impact
87
-
88
- - the greeting module
89
-
90
- ## Release Flag
91
-
92
- new
93
-
94
- ## Acceptance Criteria
95
-
96
- - AC-1: the change behaves as described.
97
- """
98
- And step "seam.naive" from now on changes nothing
99
- And step "seam.naive" writes "src/acceptance.test.ts" with:
100
- """
101
- it("[AC-1] holds", () => {})
102
- """
103
- And step "seam.naive" writes "src/calc.ts" with:
104
- """
105
- export const add = (a: number, b: number) => a + b
106
- export const subtract = (a: number, b: number) => a - b
107
- """
108
- And judge step "seam.judge" answers:
109
- """
110
- [{"id":"shape","answer":"land","p":0.9}]
111
- """
112
- And step "implement.applying" runs its script
113
- When gtd lands
114
- And the process is driven
115
- Then the process rests at "build.review.reviewing"
116
- And the commit subjects end with:
117
- """
118
- gtd(human): idle → unwind
119
- gtd(check): unwind → start-gate.check
120
- gtd(check): start-gate.check → design.triage
121
- gtd(agent): design.triage → design.gate.answer
122
- gtd(human): design.gate.answer → seam.naive
123
- gtd(agent): seam.naive → seam.check
124
- gtd(check): seam.check → seam.judge
125
- gtd(judge): seam.judge → seam.naive
126
- gtd(agent): seam.naive → seam.check
127
- gtd(check): seam.check → seam.judge
128
- gtd(judge): seam.judge → seam.naive
129
- gtd(agent): seam.naive → seam.check
130
- gtd(check): seam.check → seam.judge
131
- gtd(judge): seam.judge → seam.steer
132
- gtd(human): seam.steer → seam.naive
133
- gtd(agent): seam.naive → seam.check
134
- gtd(check): seam.check → seam.judge
135
- gtd(judge): seam.judge → implement.applying
136
- gtd(check): implement.applying → implement.health.check
137
- gtd(check): implement.health.check → implement.closing
138
- gtd(check): implement.closing → build.review.reviewing
139
- """
140
- And the commit "gtd(human): idle → unwind" has a body containing "Gtd-Var: flag_risk_tier=0"
141
- And the commit "gtd(agent): seam.naive → seam.check" has a body containing "Gtd-Kept:"
142
- And the commit "gtd(judge): seam.judge → seam.naive" has a body containing "\"answer\":\"reject\""
143
- And the commit "gtd(judge): seam.judge → seam.steer" has a body containing "\"answer\":\"reject\""
144
- And the commit "gtd(judge): seam.judge → implement.applying" has a body containing "\"answer\":\"land\""
145
- And no commit body contains "Gtd-Approved:"
146
- And no commit body contains "Gtd-Workflow:"