@pmelab/gtd 52.0.0 → 53.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 (108) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +96 -131
  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-D0MKVFFa.mjs → reserved-CQ7amcKG.mjs} +87 -133
  7. package/dist/chunks/{review-ZzUQH1KZ.mjs → review-CNgN_V8T.mjs} +2 -2
  8. package/dist/chunks/{tail-I1-vVq0P.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 +159 -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 +400 -675
  20. package/package.json +5 -4
  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 +13 -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/acceptance-criteria.feature +159 -3
  46. package/src/workflows/feature/criteria.test.ts +23 -15
  47. package/src/workflows/feature/criteria.ts +72 -39
  48. package/src/workflows/feature/fast-path.feature +4 -0
  49. package/src/workflows/feature/feature.test.ts +6 -5
  50. package/src/workflows/feature/feature.ts +34 -118
  51. package/src/workflows/feature/flag-mode.feature +4 -0
  52. package/src/workflows/feature/hands-on-skip.feature +37 -65
  53. package/src/workflows/feature/index.ts +0 -1
  54. package/src/workflows/feature/lens-models.feature +4 -0
  55. package/src/workflows/feature/lens-review.feature +4 -0
  56. package/src/workflows/feature/naive-acceptance.feature +4 -0
  57. package/src/workflows/feature/one-step-land.feature +4 -4
  58. package/src/workflows/feature/planning.ts +2 -1
  59. package/src/workflows/feature/prototype-rounds.feature +5 -1
  60. package/src/workflows/feature/prototype.feature +11 -3
  61. package/src/workflows/feature/prototype.ts +18 -29
  62. package/src/workflows/feature/refactor-absorbs.feature +7 -8
  63. package/src/workflows/feature/refactor-first.feature +4 -5
  64. package/src/workflows/feature/refactor-lens-models.feature +4 -0
  65. package/src/workflows/feature/refactor-rebuild.feature +4 -6
  66. package/src/workflows/feature/refactor-review.feature +31 -11
  67. package/src/workflows/feature/refactor.ts +30 -64
  68. package/src/workflows/feature/review-answers.feature +4 -0
  69. package/src/workflows/feature/review-gate.feature +13 -1
  70. package/src/workflows/feature/reviewer-walkthrough.feature +4 -0
  71. package/src/workflows/feature/risk-tier.feature +32 -0
  72. package/src/workflows/feature/seam-rejection.feature +8 -4
  73. package/src/workflows/feature/seam.feature +8 -0
  74. package/src/workflows/feature/seam.test.ts +11 -28
  75. package/src/workflows/feature/seam.ts +52 -165
  76. package/src/workflows/feature/severity-budget.feature +4 -0
  77. package/src/workflows/feature/severity-sorted-review.feature +4 -0
  78. package/src/workflows/feature/standards.feature +4 -0
  79. package/src/workflows/feature/tier-pin.feature +4 -0
  80. package/src/workflows/index.ts +0 -1
  81. package/src/workflows/shared/lenses.ts +0 -13
  82. package/src/workflows/shared/options.test.ts +2 -11
  83. package/src/workflows/shared/options.ts +4 -21
  84. package/src/workflows/shared/review.test.ts +3 -3
  85. package/src/workflows/shared/steps.ts +0 -2
  86. package/src/workflows/shared/text.test.ts +41 -71
  87. package/src/workflows/shared/text.ts +82 -212
  88. package/src/workflows/shared/vars.ts +2 -8
  89. package/src/workflows/shared/workflows.steps.ts +0 -13
  90. package/claude/hooks/context.ts +0 -66
  91. package/src/replay/Slices.test.ts +0 -73
  92. package/src/replay/Slices.ts +0 -45
  93. package/src/wire/ContextLimit.fixture.ts +0 -30
  94. package/src/wire/ContextLimit.test.ts +0 -96
  95. package/src/wire/ContextLimit.ts +0 -169
  96. package/src/wire/Slices.ts +0 -25
  97. package/src/wire/golden/1/slices.json +0 -11
  98. package/src/workflows/feature/context-limit.feature +0 -37
  99. package/src/workflows/feature/continuation-cap.feature +0 -65
  100. package/src/workflows/feature/continuation-rebuild.feature +0 -88
  101. package/src/workflows/feature/continuation-slices.feature +0 -64
  102. package/src/workflows/feature/continuation.feature +0 -205
  103. package/src/workflows/feature/slice-findings.feature +0 -252
  104. package/src/workflows/feature/slicing-cap.feature +0 -23
  105. package/src/workflows/feature/slicing.feature +0 -265
  106. package/src/workflows/feature/slicing.test.ts +0 -49
  107. package/src/workflows/feature/slicing.ts +0 -105
  108. package/src/workflows/shared/continuation.ts +0 -92
@@ -3,10 +3,10 @@
3
3
  Feature: a refactor that carried the whole feature still gets a quality lap over all of it
4
4
 
5
5
  With GTD_FLAG_RISK_TIER off, a refactor-first
6
- refactor can land everything the requirements ask for. The feature slice's
6
+ refactor can land everything the requirements ask for. The feature's
7
7
  implement turn then has only the naive pass's acceptance tests to carry
8
- over, and with no code but tests changed since the refactor the feature
9
- slice's quality lap covers the whole change, refactor included.
8
+ over, and with no code but tests changed since the refactor the feature's
9
+ quality lap covers the whole change, refactor included.
10
10
 
11
11
  Background:
12
12
  Given the shipped workflows, as gtd install scaffolds them
@@ -37,6 +37,10 @@ Feature: a refactor that carried the whole feature still gets a quality lap over
37
37
 
38
38
  - `subtract(a, b)` returns `a - b`.
39
39
 
40
+ ## Impact
41
+
42
+ - the greeting module
43
+
40
44
  ## Acceptance Criteria
41
45
 
42
46
  - AC-1: the change behaves as described.
@@ -128,8 +132,3 @@ Feature: a refactor that carried the whole feature still gets a quality lap over
128
132
  gtd(check): implement.closing → build.quality.correctness.reviewing
129
133
  gtd(agent): build.quality.correctness.reviewing → build.review.reviewing
130
134
  """
131
- And the output lines of gtd "slices" start with:
132
- """
133
- refactor
134
- feature
135
- """
@@ -36,6 +36,10 @@ Feature: a refactor-first judgment walks one fixed path to the review gate
36
36
 
37
37
  - `subtract(a, b)` returns `a - b`.
38
38
 
39
+ ## Impact
40
+
41
+ - the greeting module
42
+
39
43
  ## Acceptance Criteria
40
44
 
41
45
  - AC-1: the change behaves as described.
@@ -156,9 +160,4 @@ Feature: a refactor-first judgment walks one fixed path to the review gate
156
160
  And the commit "gtd(agent): seam.naive → seam.check" has a body containing "Gtd-Kept:"
157
161
  And the commit "gtd(judge): seam.judge → seam.note" has a body containing "\"answer\":\"refactor-first\""
158
162
  And no commit body contains "Gtd-Approved:"
159
- And the output lines of gtd "slices" start with:
160
- """
161
- refactor
162
- feature
163
- """
164
163
  And no commit body contains "Gtd-Workflow:"
@@ -29,6 +29,10 @@ Feature: the refactor review's lenses take their model hints from refactorQualit
29
29
 
30
30
  - `subtract(a, b)` returns `a - b`.
31
31
 
32
+ ## Impact
33
+
34
+ - the greeting module
35
+
32
36
  ## Acceptance Criteria
33
37
 
34
38
  - AC-1: the change behaves as described.
@@ -37,6 +37,10 @@ Feature: refactor-first writes a refactor note, refactors on its own, then rebui
37
37
 
38
38
  - `subtract(a, b)` returns `a - b`.
39
39
 
40
+ ## Impact
41
+
42
+ - the greeting module
43
+
40
44
  ## Acceptance Criteria
41
45
 
42
46
  - AC-1: subtract returns the difference.
@@ -193,7 +197,6 @@ Feature: refactor-first writes a refactor note, refactors on its own, then rebui
193
197
  Then the process rests at "implement.building"
194
198
  And "src/calc.ts" contains "op(a, b, 1)"
195
199
  And "src/calc.ts" does not contain "subtract"
196
- And the output of gtd "slices" contains "refactor "
197
200
 
198
201
  Scenario: the rebuild lands only once it carries the naive pass's acceptance tests, green
199
202
  Given step "seam.note" writes ".gtd/REFACTOR-NOTE.md" with:
@@ -281,8 +284,3 @@ Feature: refactor-first writes a refactor note, refactors on its own, then rebui
281
284
  gtd(check): implement.health.check → implement.closing
282
285
  gtd(check): implement.closing → build.review.reviewing
283
286
  """
284
- And the output lines of gtd "slices" start with:
285
- """
286
- refactor
287
- feature
288
- """
@@ -1,9 +1,9 @@
1
1
  @inmem
2
- Feature: the refactor slice is reviewed on its own before the feature is implemented
2
+ Feature: the refactor is reviewed on its own before the feature is implemented
3
3
 
4
4
  After a refactor-first judgment the refactor is built, quality-lapped and
5
- reviewed in its own slice. Review edits re-run the refactor, never the design;
6
- the feature slice that follows is quality-lapped from the refactor's
5
+ reviewed on its own. Review edits re-run the refactor, never the design;
6
+ the feature that follows is quality-lapped from the refactor's
7
7
  sign-off, then reviewed. The flags are pinned so the per-flag test runs never move it off
8
8
  its path.
9
9
 
@@ -48,6 +48,10 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
48
48
 
49
49
  - `subtract(a, b)` returns `a - b`.
50
50
 
51
+ ## Impact
52
+
53
+ - the greeting module
54
+
51
55
  ## Acceptance Criteria
52
56
 
53
57
  - AC-1: the change behaves as described.
@@ -146,6 +150,10 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
146
150
 
147
151
  - `subtract(a, b)` returns `a - b`.
148
152
 
153
+ ## Impact
154
+
155
+ - the greeting module
156
+
149
157
  ## Acceptance Criteria
150
158
 
151
159
  - AC-1: the change behaves as described.
@@ -245,6 +253,10 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
245
253
 
246
254
  - `subtract(a, b)` returns `a - b`.
247
255
 
256
+ ## Impact
257
+
258
+ - the greeting module
259
+
248
260
  ## Acceptance Criteria
249
261
 
250
262
  - AC-1: the change behaves as described.
@@ -602,7 +614,7 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
602
614
  And ".gtd/REFACTOR.md" does not exist
603
615
  And ".gtd/REVIEW.md" contains "A: add and subtract differ only by sign."
604
616
 
605
- Scenario: a no-change landing after the in-gate reply signs off and the feature slice follows
617
+ Scenario: a no-change landing after the in-gate reply signs off and the feature follows
606
618
  Given step "implement.building" writes "src/calc.ts" with:
607
619
  """
608
620
  export const op = (a: number, b: number, sign: number) => a + sign * b
@@ -685,7 +697,7 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
685
697
  Then the process rests at "build.review.reviewing"
686
698
  And "src/calc.ts" contains "subtract"
687
699
 
688
- Scenario: a praise-only one-shot footnote signs off and the feature slice follows
700
+ Scenario: a praise-only one-shot footnote signs off and the feature follows
689
701
  Given step "implement.building" writes "src/calc.ts" with:
690
702
  """
691
703
  export const op = (a: number, b: number, sign: number) => a + sign * b
@@ -967,7 +979,7 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
967
979
  Then driving the process is refused with "refactor-feedback"
968
980
  And driving the process is refused with "hand-edited src/calc.ts"
969
981
 
970
- Scenario: a praise note and a concluded thread on a settled round sign off and the feature slice follows
982
+ Scenario: a praise note and a concluded thread on a settled round sign off and the feature follows
971
983
  Given step "implement.building" writes "src/calc.ts" with:
972
984
  """
973
985
  export const op = (a: number, b: number, sign: number) => a + sign * b
@@ -1054,7 +1066,7 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
1054
1066
  Then the process rests at "build.review.reviewing"
1055
1067
  And "src/calc.ts" contains "subtract"
1056
1068
 
1057
- Scenario: a praise-only refactor review still signs off and the feature slice follows
1069
+ Scenario: a praise-only refactor review still signs off and the feature follows
1058
1070
  Given step "implement.building" writes "src/calc.ts" with:
1059
1071
  """
1060
1072
  export const op = (a: number, b: number, sign: number) => a + sign * b
@@ -1087,7 +1099,7 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
1087
1099
  Then the process rests at "build.review.reviewing"
1088
1100
  And "src/calc.ts" contains "subtract"
1089
1101
 
1090
- Scenario: a nit fix in the refactor slice that changes a non-stray is refused, though a glob stray widens the write access
1102
+ Scenario: a nit fix in the refactor that changes a non-stray is refused, though a glob stray widens the write access
1091
1103
  Given step "seam.naive" writes "src/*.ts" with:
1092
1104
  """
1093
1105
  export const literalGlobName = 2
@@ -1118,7 +1130,7 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
1118
1130
  When gtd lands
1119
1131
  Then driving the process is refused with "refactor-scope"
1120
1132
 
1121
- Scenario: the nit-fix turn in the refactor slice may write the strays and .gtd/** only
1133
+ Scenario: the nit-fix turn in the refactor may write the strays and .gtd/** only
1122
1134
  Given step "seam.naive" writes "src/*.ts" with:
1123
1135
  """
1124
1136
  export const literalGlobName = 2
@@ -1173,7 +1185,7 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
1173
1185
  """
1174
1186
  And no commit body contains "refactor.build.review.composing"
1175
1187
 
1176
- Rule: with a quality lens on both slices
1188
+ Rule: with a quality lens on both the refactor and the feature
1177
1189
 
1178
1190
  Background:
1179
1191
  Given an environment variable "GTD_REFACTORQUALITYREVIEWS" set to "correctness"
@@ -1210,6 +1222,10 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
1210
1222
 
1211
1223
  - `subtract(a, b)` returns `a - b`.
1212
1224
 
1225
+ ## Impact
1226
+
1227
+ - the greeting module
1228
+
1213
1229
  ## Acceptance Criteria
1214
1230
 
1215
1231
  - AC-1: the change behaves as described.
@@ -1259,7 +1275,7 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
1259
1275
  """
1260
1276
  And step "refactor.build.review.closing" runs its script
1261
1277
 
1262
- Scenario: each slice's quality lap reviews from that slice's base
1278
+ Scenario: the refactor's and the feature's quality laps each review from their own base
1263
1279
  When the process is driven
1264
1280
  Then the process rests at "refactor.build.quality.correctness.reviewing"
1265
1281
  And the resting step's content contains the hash of the commit "gtd(agent): seam.note → refactor.deriving"
@@ -1337,6 +1353,10 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
1337
1353
 
1338
1354
  - `subtract(a, b)` returns `a - b`.
1339
1355
 
1356
+ ## Impact
1357
+
1358
+ - the greeting module
1359
+
1340
1360
  ## Acceptance Criteria
1341
1361
 
1342
1362
  - AC-1: the change behaves as described.
@@ -15,9 +15,8 @@ import {
15
15
  } from "../../flows/index.js"
16
16
  import { lensEntriesOf } from "../../workflow-kit/index.js"
17
17
  import { markFenced } from "../shared/fences.js"
18
- import { continuing, phase, type Phase } from "../shared/continuation.js"
19
18
  import { healthy, type Guard } from "../shared/health.js"
20
- import { coder, FEEDBACK, HANDOFF, REFACTOR } from "../shared/steps.js"
19
+ import { coder, FEEDBACK, REFACTOR } from "../shared/steps.js"
21
20
  import * as t from "../shared/text.js"
22
21
  import { defaults, testFileGlobs } from "../shared/vars.js"
23
22
  import { buildTail, reUnwind, type FeedbackTarget } from "../shared/review.js"
@@ -264,12 +263,7 @@ const guardOf =
264
263
  }
265
264
 
266
265
  /** Derive, build, check and close one refactor lap; `feedback` is the collected review text of the lap before. */
267
- const refactorLap = async (
268
- p: Plan,
269
- guard: Guard,
270
- refactor: Phase,
271
- feedback?: string,
272
- ): Promise<void> => {
266
+ const refactorLap = async (p: Plan, guard: Guard, feedback?: string): Promise<void> => {
273
267
  const { pattern, strays, reference, note } = p
274
268
  await run(
275
269
  "deriving",
@@ -282,59 +276,32 @@ const refactorLap = async (
282
276
  ]),
283
277
  { label: "Deriving the refactor package", file: REFACTOR_PACKAGE },
284
278
  )
285
- const reached = new Set<string>()
286
- // Each snapshot is greened before its continuation: every sub-step keeps the old suite green.
287
- await continuing(refactor, async (from, fresh) => {
288
- await fresh(() =>
289
- t.agentWithSkills(
290
- "building",
291
- t.refactorBuildingPrompt({
292
- pkg: REFACTOR_PACKAGE,
293
- strays,
294
- pattern,
295
- reference,
296
- feedback: feedback !== undefined,
297
- note: note !== undefined,
298
- from,
299
- }),
300
- {
301
- label: from === undefined ? "Refactoring" : "Continuing the refactor",
302
- model: coder(),
303
- system: t.builderSystem(),
304
- },
305
- ),
306
- )
307
- // Committed by the snapshot, so a turn stopped again may leave it as it was: present means stopped.
308
- const left = read(HANDOFF)
309
- guard()
310
- const snapshot = head()
311
- // The building turns' own changes only: a fix turn reaching a path is not the refactor reaching it.
312
- for (const c of changes()) reached.add(c.path)
313
- await healthy(
314
- async () => {
315
- await t.agentWithSkills("fix.suite.fixing", t.refactorFixPrompt(strays, pattern), {
316
- label: "Fixing the check",
317
- file: FEEDBACK,
318
- model: coder(),
319
- system: t.builderSystem(),
320
- })
321
- guard()
322
- },
323
- { describeGuard: guard, rules: t.refactorRules(strays, pattern) },
324
- )
325
- if (left === undefined) return { result: undefined }
326
- return {
327
- result: undefined,
328
- handoff: {
329
- snapshot,
330
- note: left.trim(),
331
- open: strays.filter((path) => !reached.has(path)),
332
- },
333
- }
334
- })
335
- await run("closing", removeScript([REFACTOR_PACKAGE, HANDOFF]), {
336
- label: "Closing out the refactor",
337
- })
279
+ await t.agentWithSkills(
280
+ "building",
281
+ t.refactorBuildingPrompt({
282
+ pkg: REFACTOR_PACKAGE,
283
+ strays,
284
+ pattern,
285
+ reference,
286
+ feedback: feedback !== undefined,
287
+ note: note !== undefined,
288
+ }),
289
+ { label: "Refactoring", model: coder(), system: t.builderSystem() },
290
+ )
291
+ guard()
292
+ await healthy(
293
+ async () => {
294
+ await t.agentWithSkills("fix.suite.fixing", t.refactorFixPrompt(strays, pattern), {
295
+ label: "Fixing the check",
296
+ file: FEEDBACK,
297
+ model: coder(),
298
+ system: t.builderSystem(),
299
+ })
300
+ guard()
301
+ },
302
+ { describeGuard: guard, rules: t.refactorRules(strays, pattern) },
303
+ )
304
+ await run("closing", removeScript([REFACTOR_PACKAGE]), { label: "Closing out the refactor" })
338
305
  }
339
306
 
340
307
  const strayAccess = (strays: readonly string[]) => ({
@@ -348,7 +315,7 @@ export const refactorFirst = async (
348
315
  const p = plan(shape, options)
349
316
  if (p === undefined) return false
350
317
  return scope({ name: "refactor", access: strayAccess(p.strays) }, async () => {
351
- await refactorLap(p, guardOf(p, head()), phase("refactor"))
318
+ await refactorLap(p, guardOf(p, head()))
352
319
  return true
353
320
  })
354
321
  }
@@ -375,10 +342,9 @@ export const reviewedRefactor = async (
375
342
  "gtd land: refactor-feedback: the review feedback changed files but wrote no .gtd/REFACTOR.md — a refactor cannot act on it; revert the change, or `gtd abandon` and restart",
376
343
  dropped: t.refactorDroppedRefusal,
377
344
  }
378
- const refactor = phase("refactor")
379
345
  let collected: string | undefined
380
346
  for (;;) {
381
- await refactorLap(p, guard, refactor, collected)
347
+ await refactorLap(p, guard, collected)
382
348
  // A person's edit at an escalation rest is never refused, as in the lap.
383
349
  const outcome = await buildTail(entry, {
384
350
  green: true,
@@ -36,6 +36,10 @@ Feature: every note in the review is answered with one tick
36
36
 
37
37
  - `subtract(a, b)` returns `a - b`.
38
38
 
39
+ ## Impact
40
+
41
+ - the greeting module
42
+
39
43
  ## Acceptance Criteria
40
44
 
41
45
  - AC-1: subtract(a, b) returns a - b.
@@ -1,7 +1,7 @@
1
1
  @inmem
2
2
  Feature: a feature process ends at the human review
3
3
 
4
- After the last slice's quality lap the process rests at the review gate,
4
+ After the quality lap the process rests at the review gate,
5
5
  `.gtd/REVIEW.md`. A sign-off ends the process. A note asking for a change in
6
6
  behaviour starts a feedback lap — design, then implement with no new naive
7
7
  pass or seam judge, the hands-on test, the quality lap — and the review
@@ -36,6 +36,10 @@ Feature: a feature process ends at the human review
36
36
 
37
37
  - `subtract(a, b)` returns `a - b`.
38
38
 
39
+ ## Impact
40
+
41
+ - the greeting module
42
+
39
43
  ## Acceptance Criteria
40
44
 
41
45
  - AC-1: subtract(a, b) returns a - b.
@@ -192,6 +196,10 @@ Feature: a feature process ends at the human review
192
196
 
193
197
  - `multiply(a, b)` returns `a * b`.
194
198
 
199
+ ## Impact
200
+
201
+ - the greeting module
202
+
195
203
  ## Acceptance Criteria
196
204
 
197
205
  - AC-1: subtract(a, b) returns a - b.
@@ -238,6 +246,10 @@ Feature: a feature process ends at the human review
238
246
 
239
247
  - `multiply(a, b)` returns `a * b`.
240
248
 
249
+ ## Impact
250
+
251
+ - the greeting module
252
+
241
253
  ## Acceptance Criteria
242
254
 
243
255
  - AC-0: multiply(a, b) returns a * b.
@@ -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.
@@ -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.
@@ -76,6 +80,10 @@ Feature: rejected naive passes walk one fixed path through the steer gate to the
76
80
 
77
81
  - `subtract(a, b)` returns `a - b`, in the calculator module.
78
82
 
83
+ ## Impact
84
+
85
+ - the greeting module
86
+
79
87
  ## Acceptance Criteria
80
88
 
81
89
  - AC-1: the change behaves as described.
@@ -128,8 +136,4 @@ Feature: rejected naive passes walk one fixed path through the steer gate to the
128
136
  And the commit "gtd(judge): seam.judge → seam.steer" has a body containing "\"answer\":\"reject\""
129
137
  And the commit "gtd(judge): seam.judge → implement.applying" has a body containing "\"answer\":\"land\""
130
138
  And no commit body contains "Gtd-Approved:"
131
- And the output lines of gtd "slices" start with:
132
- """
133
- feature
134
- """
135
139
  And no commit body contains "Gtd-Workflow:"
@@ -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.
@@ -234,6 +238,10 @@ Feature: the naive pass and seam judge decide how a feature is built
234
238
 
235
239
  - `subtract(a, b)` returns `a - b`, in a new module.
236
240
 
241
+ ## Impact
242
+
243
+ - the greeting module
244
+
237
245
  ## Acceptance Criteria
238
246
 
239
247
  - AC-1: the change behaves as described.