@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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +96 -131
- package/claude/hooks/drive.ts +0 -3
- package/claude/hooks/register.tsx +3 -68
- package/claude/hooks/ship.ts +85 -1595
- package/dist/chunks/{reserved-D0MKVFFa.mjs → reserved-CQ7amcKG.mjs} +87 -133
- package/dist/chunks/{review-ZzUQH1KZ.mjs → review-CNgN_V8T.mjs} +2 -2
- package/dist/chunks/{tail-I1-vVq0P.mjs → tail-JZ9PAOwp.mjs} +2 -14
- package/dist/chunks/{wire-BJuZWR3C.mjs → wire-C12dahrH.mjs} +2 -130
- package/dist/flows.mjs +1 -16
- package/dist/gtd.bundle.mjs +476 -982
- package/dist/testkit.mjs +58 -417
- package/dist/wire.mjs +2 -2
- package/dist/workflows/cleanup.mjs +2 -2
- package/dist/workflows/feature.mjs +159 -363
- package/dist/workflows/fix.mjs +2 -2
- package/dist/workflows/review.mjs +3 -3
- package/dist/workflows/rollout.mjs +1 -1
- package/dist/workflows.mjs +400 -675
- package/package.json +5 -4
- package/src/cli/Cli.test.ts +1 -86
- package/src/cli/Cli.ts +13 -133
- package/src/cli/Metrics.test.ts +21 -31
- package/src/cli/Metrics.ts +25 -36
- package/src/cli/Program.test.ts +1 -35
- package/src/cli/Program.ts +5 -64
- package/src/cli/ToolCommands.ts +0 -3
- package/src/edge/Edge.test.ts +20 -322
- package/src/edge/Edge.ts +10 -181
- package/src/edge/index.ts +0 -1
- package/src/flows/runtime.test.ts +0 -27
- package/src/flows/runtime.ts +1 -49
- package/src/install/Install.ts +15 -24
- package/src/replay/Replay.test.ts +0 -169
- package/src/replay/Replay.ts +4 -93
- package/src/replay/index.ts +0 -1
- package/src/testkit/Layers.ts +0 -1
- package/src/testkit/steps.ts +13 -0
- package/src/wire/BeatDocument.ts +2 -12
- package/src/wire/BeatStatus.ts +0 -3
- package/src/wire/WireSchema.test.ts +0 -18
- package/src/wire/index.ts +0 -2
- package/src/wire/types.ts +0 -7
- package/src/workflow/Workflow.ts +1 -9
- package/src/workflows/feature/acceptance-criteria.feature +159 -3
- package/src/workflows/feature/criteria.test.ts +23 -15
- package/src/workflows/feature/criteria.ts +72 -39
- package/src/workflows/feature/fast-path.feature +4 -0
- package/src/workflows/feature/feature.test.ts +6 -5
- package/src/workflows/feature/feature.ts +34 -118
- package/src/workflows/feature/flag-mode.feature +4 -0
- package/src/workflows/feature/hands-on-skip.feature +37 -65
- package/src/workflows/feature/index.ts +0 -1
- package/src/workflows/feature/lens-models.feature +4 -0
- package/src/workflows/feature/lens-review.feature +4 -0
- package/src/workflows/feature/naive-acceptance.feature +4 -0
- package/src/workflows/feature/one-step-land.feature +4 -4
- package/src/workflows/feature/planning.ts +2 -1
- package/src/workflows/feature/prototype-rounds.feature +5 -1
- package/src/workflows/feature/prototype.feature +11 -3
- package/src/workflows/feature/prototype.ts +18 -29
- package/src/workflows/feature/refactor-absorbs.feature +7 -8
- package/src/workflows/feature/refactor-first.feature +4 -5
- package/src/workflows/feature/refactor-lens-models.feature +4 -0
- package/src/workflows/feature/refactor-rebuild.feature +4 -6
- package/src/workflows/feature/refactor-review.feature +31 -11
- package/src/workflows/feature/refactor.ts +30 -64
- package/src/workflows/feature/review-answers.feature +4 -0
- package/src/workflows/feature/review-gate.feature +13 -1
- package/src/workflows/feature/reviewer-walkthrough.feature +4 -0
- package/src/workflows/feature/risk-tier.feature +32 -0
- package/src/workflows/feature/seam-rejection.feature +8 -4
- package/src/workflows/feature/seam.feature +8 -0
- package/src/workflows/feature/seam.test.ts +11 -28
- package/src/workflows/feature/seam.ts +52 -165
- package/src/workflows/feature/severity-budget.feature +4 -0
- package/src/workflows/feature/severity-sorted-review.feature +4 -0
- package/src/workflows/feature/standards.feature +4 -0
- package/src/workflows/feature/tier-pin.feature +4 -0
- package/src/workflows/index.ts +0 -1
- package/src/workflows/shared/lenses.ts +0 -13
- package/src/workflows/shared/options.test.ts +2 -11
- package/src/workflows/shared/options.ts +4 -21
- package/src/workflows/shared/review.test.ts +3 -3
- package/src/workflows/shared/steps.ts +0 -2
- package/src/workflows/shared/text.test.ts +41 -71
- package/src/workflows/shared/text.ts +82 -212
- package/src/workflows/shared/vars.ts +2 -8
- package/src/workflows/shared/workflows.steps.ts +0 -13
- package/claude/hooks/context.ts +0 -66
- package/src/replay/Slices.test.ts +0 -73
- package/src/replay/Slices.ts +0 -45
- package/src/wire/ContextLimit.fixture.ts +0 -30
- package/src/wire/ContextLimit.test.ts +0 -96
- package/src/wire/ContextLimit.ts +0 -169
- package/src/wire/Slices.ts +0 -25
- package/src/wire/golden/1/slices.json +0 -11
- package/src/workflows/feature/context-limit.feature +0 -37
- package/src/workflows/feature/continuation-cap.feature +0 -65
- package/src/workflows/feature/continuation-rebuild.feature +0 -88
- package/src/workflows/feature/continuation-slices.feature +0 -64
- package/src/workflows/feature/continuation.feature +0 -205
- package/src/workflows/feature/slice-findings.feature +0 -252
- package/src/workflows/feature/slicing-cap.feature +0 -23
- package/src/workflows/feature/slicing.feature +0 -265
- package/src/workflows/feature/slicing.test.ts +0 -49
- package/src/workflows/feature/slicing.ts +0 -105
- 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
|
|
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
|
-
|
|
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:"
|
|
@@ -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
|
|
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
|
|
6
|
-
the feature
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
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,
|
|
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
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
)
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
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())
|
|
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,
|
|
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,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
@inmem
|
|
2
2
|
Feature: a feature process ends at the human review
|
|
3
3
|
|
|
4
|
-
After the
|
|
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.
|
|
@@ -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.
|