@pmelab/gtd 33.0.0 → 35.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 +65 -50
- package/dist/chunks/{reserved-BU5Zi-nX.mjs → reserved-C8Fm3s72.mjs} +45 -2
- package/dist/chunks/{tail-DuXanjIY.mjs → tail-oaYewBN_.mjs} +1 -1
- package/dist/workflows/cleanup.mjs +2 -2
- package/dist/workflows/feature.mjs +99 -19
- package/dist/workflows/fix.mjs +2 -2
- package/dist/workflows/review.mjs +2 -2
- package/dist/workflows/rollout.mjs +1 -1
- package/dist/workflows.mjs +144 -21
- package/package.json +1 -1
- package/skills/authoring/SKILL.md +2 -2
- package/src/testkit/steps.ts +4 -0
- package/src/workflows/feature/coverage.feature +161 -0
- package/src/workflows/feature/coverage.ts +106 -0
- package/src/workflows/feature/fast-path.feature +8 -33
- package/src/workflows/feature/feature.test.ts +1 -101
- package/src/workflows/feature/feature.ts +34 -17
- package/src/workflows/feature/flag-mode.feature +8 -92
- package/src/workflows/feature/lens-models.feature +4 -0
- package/src/workflows/feature/one-step-land.feature +8 -32
- package/src/workflows/feature/quality-unresolved.feature +100 -0
- package/src/workflows/feature/refactor-absorbs.feature +15 -23
- package/src/workflows/feature/refactor-first.feature +7 -32
- package/src/workflows/feature/refactor-review.feature +31 -345
- package/src/workflows/feature/seam-rejection.feature +5 -30
- package/src/workflows/feature/seam.feature +8 -104
- package/src/workflows/feature/seam.test.ts +3 -1
- package/src/workflows/feature/seam.ts +4 -12
- package/src/workflows/review/review-door.feature +113 -0
- package/src/workflows/shared/tail.ts +2 -2
- package/src/workflows/shared/text.ts +56 -1
|
@@ -3,8 +3,8 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
3
3
|
|
|
4
4
|
After a refactor-first judgment the refactor is built, quality-lapped and
|
|
5
5
|
reviewed in its own slice. Review edits re-run the refactor, never the design;
|
|
6
|
-
the feature
|
|
7
|
-
sign-off. The flags are pinned so the per-flag test runs never move it off
|
|
6
|
+
the feature slice that follows is quality-lapped from the refactor's
|
|
7
|
+
sign-off, with no feature review. The flags are pinned so the per-flag test runs never move it off
|
|
8
8
|
its path.
|
|
9
9
|
|
|
10
10
|
Background:
|
|
@@ -337,7 +337,7 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
337
337
|
gtd(agent): refactor.build.review.reviewing → refactor.build.review.await-review
|
|
338
338
|
"""
|
|
339
339
|
|
|
340
|
-
Scenario: the refactor review says the whole refactor on its second round
|
|
340
|
+
Scenario: the refactor review says the whole refactor on its second round
|
|
341
341
|
Given step "refactor.build.review.reviewing" is prompted with "it covers the whole refactor since it started, on every round"
|
|
342
342
|
And step "implement.building" writes "src/calc.ts" with:
|
|
343
343
|
"""
|
|
@@ -347,16 +347,9 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
347
347
|
"""
|
|
348
348
|
And step "implement.health.check" changes nothing
|
|
349
349
|
And step "implement.closing" runs its script
|
|
350
|
-
And step "
|
|
350
|
+
And judge step "implement.coverage" answers:
|
|
351
351
|
"""
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
<!-- base: 0000000 -->
|
|
355
|
-
|
|
356
|
-
## calc
|
|
357
|
-
|
|
358
|
-
- [ ] ./src/calc.ts#1-3
|
|
359
|
-
subtract built on the shared op
|
|
352
|
+
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
360
353
|
"""
|
|
361
354
|
When the process is driven
|
|
362
355
|
Then the process rests at "refactor.build.review.await-review"
|
|
@@ -419,79 +412,7 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
419
412
|
Then the process rests at "refactor.build.review.await-review"
|
|
420
413
|
When gtd lands
|
|
421
414
|
And the process is driven
|
|
422
|
-
Then the process rests at "
|
|
423
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
424
|
-
"""
|
|
425
|
-
# Review: abc1234
|
|
426
|
-
|
|
427
|
-
<!-- base: 0000000 -->
|
|
428
|
-
|
|
429
|
-
## calc
|
|
430
|
-
|
|
431
|
-
- [ ] ./src/calc.ts#1-3
|
|
432
|
-
subtract built on the shared op[^m]
|
|
433
|
-
|
|
434
|
-
[^m]:
|
|
435
|
-
- H: also export multiply
|
|
436
|
-
"""
|
|
437
|
-
And step "build.review.collecting" writes ".gtd/REQUIREMENTS.md" with:
|
|
438
|
-
"""
|
|
439
|
-
# Requirements
|
|
440
|
-
|
|
441
|
-
- multiply
|
|
442
|
-
"""
|
|
443
|
-
And step "build.review.collecting" writes ".gtd/REVIEW.md" with:
|
|
444
|
-
"""
|
|
445
|
-
# Review: abc1234
|
|
446
|
-
|
|
447
|
-
<!-- base: 0000000 -->
|
|
448
|
-
|
|
449
|
-
## calc
|
|
450
|
-
|
|
451
|
-
- [ ] ./src/calc.ts#1-3
|
|
452
|
-
subtract built on the shared op[^m]
|
|
453
|
-
|
|
454
|
-
[^m]:
|
|
455
|
-
- H: also export multiply
|
|
456
|
-
- A: noted.
|
|
457
|
-
"""
|
|
458
|
-
When gtd lands
|
|
459
|
-
And the process is driven
|
|
460
|
-
Then the process rests at "build.review.await-review"
|
|
461
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
462
|
-
"""
|
|
463
|
-
# Review: abc1234
|
|
464
|
-
|
|
465
|
-
<!-- base: 0000000 -->
|
|
466
|
-
|
|
467
|
-
## calc
|
|
468
|
-
|
|
469
|
-
- [ ] ./src/calc.ts#1-3
|
|
470
|
-
subtract built on the shared op
|
|
471
|
-
"""
|
|
472
|
-
And step "build.review.closing" runs its script
|
|
473
|
-
And step "re-unwind" runs its script
|
|
474
|
-
And step "design.triage" writes ".gtd/REQUIREMENTS.md" with:
|
|
475
|
-
"""
|
|
476
|
-
# Requirements
|
|
477
|
-
|
|
478
|
-
- multiply, designed
|
|
479
|
-
|
|
480
|
-
## Acceptance Criteria
|
|
481
|
-
|
|
482
|
-
- AC-1: the change behaves as described.
|
|
483
|
-
"""
|
|
484
|
-
And step "implement.building" writes "src/calc.ts" with:
|
|
485
|
-
"""
|
|
486
|
-
export const op = (a: number, b: number, sign: number) => a + sign * b
|
|
487
|
-
export const add = (a: number, b: number) => op(a, b, 1)
|
|
488
|
-
export const subtract = (a: number, b: number) => op(a, b, -1)
|
|
489
|
-
export const multiply = (a: number, b: number) => a * b
|
|
490
|
-
"""
|
|
491
|
-
And step "build.review.reviewing" is prompted with "it covers only what is new since the previous review"
|
|
492
|
-
When gtd lands
|
|
493
|
-
And the process is driven
|
|
494
|
-
Then the process rests at "build.review.await-review"
|
|
415
|
+
Then the process rests at "idle"
|
|
495
416
|
|
|
496
417
|
Scenario: a question answered at the refactor review reaches the re-derived package as ### Answered Questions
|
|
497
418
|
When the process is driven
|
|
@@ -719,16 +640,9 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
719
640
|
"""
|
|
720
641
|
And step "implement.health.check" changes nothing
|
|
721
642
|
And step "implement.closing" runs its script
|
|
722
|
-
And step "
|
|
643
|
+
And judge step "implement.coverage" answers:
|
|
723
644
|
"""
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
<!-- base: 0000000 -->
|
|
727
|
-
|
|
728
|
-
## calc
|
|
729
|
-
|
|
730
|
-
- [ ] ./src/calc.ts#1-3
|
|
731
|
-
subtract built on the shared op
|
|
645
|
+
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
732
646
|
"""
|
|
733
647
|
When the process is driven
|
|
734
648
|
Then the process rests at "refactor.build.review.await-review"
|
|
@@ -793,7 +707,8 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
793
707
|
"""
|
|
794
708
|
When gtd lands
|
|
795
709
|
And the process is driven
|
|
796
|
-
Then the process rests at "
|
|
710
|
+
Then the process rests at "idle"
|
|
711
|
+
And "src/calc.ts" contains "subtract"
|
|
797
712
|
|
|
798
713
|
Scenario: a praise-only one-shot footnote signs off and the feature slice follows
|
|
799
714
|
Given step "implement.building" writes "src/calc.ts" with:
|
|
@@ -804,16 +719,9 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
804
719
|
"""
|
|
805
720
|
And step "implement.health.check" changes nothing
|
|
806
721
|
And step "implement.closing" runs its script
|
|
807
|
-
And step "
|
|
722
|
+
And judge step "implement.coverage" answers:
|
|
808
723
|
"""
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
<!-- base: 0000000 -->
|
|
812
|
-
|
|
813
|
-
## calc
|
|
814
|
-
|
|
815
|
-
- [ ] ./src/calc.ts#1-3
|
|
816
|
-
subtract built on the shared op
|
|
724
|
+
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
817
725
|
"""
|
|
818
726
|
When the process is driven
|
|
819
727
|
Then the process rests at "refactor.build.review.await-review"
|
|
@@ -837,7 +745,8 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
837
745
|
"""
|
|
838
746
|
When gtd lands
|
|
839
747
|
And the process is driven
|
|
840
|
-
Then the process rests at "
|
|
748
|
+
Then the process rests at "idle"
|
|
749
|
+
And "src/calc.ts" contains "subtract"
|
|
841
750
|
|
|
842
751
|
Scenario: a one-shot footnote judged edit that collecting leaves out refuses naming its anchor
|
|
843
752
|
When the process is driven
|
|
@@ -1076,16 +985,9 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
1076
985
|
"""
|
|
1077
986
|
And step "implement.health.check" changes nothing
|
|
1078
987
|
And step "implement.closing" runs its script
|
|
1079
|
-
And step "
|
|
988
|
+
And judge step "implement.coverage" answers:
|
|
1080
989
|
"""
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
<!-- base: 0000000 -->
|
|
1084
|
-
|
|
1085
|
-
## calc
|
|
1086
|
-
|
|
1087
|
-
- [ ] ./src/calc.ts#1-3
|
|
1088
|
-
subtract built on the shared op
|
|
990
|
+
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
1089
991
|
"""
|
|
1090
992
|
When the process is driven
|
|
1091
993
|
Then the process rests at "refactor.build.review.await-review"
|
|
@@ -1154,7 +1056,8 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
1154
1056
|
"""
|
|
1155
1057
|
When gtd lands
|
|
1156
1058
|
And the process is driven
|
|
1157
|
-
Then the process rests at "
|
|
1059
|
+
Then the process rests at "idle"
|
|
1060
|
+
And "src/calc.ts" contains "subtract"
|
|
1158
1061
|
|
|
1159
1062
|
Scenario: a praise-only refactor review still signs off and the feature slice follows
|
|
1160
1063
|
Given step "implement.building" writes "src/calc.ts" with:
|
|
@@ -1165,16 +1068,9 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
1165
1068
|
"""
|
|
1166
1069
|
And step "implement.health.check" changes nothing
|
|
1167
1070
|
And step "implement.closing" runs its script
|
|
1168
|
-
And step "
|
|
1071
|
+
And judge step "implement.coverage" answers:
|
|
1169
1072
|
"""
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
<!-- base: 0000000 -->
|
|
1173
|
-
|
|
1174
|
-
## calc
|
|
1175
|
-
|
|
1176
|
-
- [ ] ./src/calc.ts#1-3
|
|
1177
|
-
subtract built on the shared op
|
|
1073
|
+
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
1178
1074
|
"""
|
|
1179
1075
|
When the process is driven
|
|
1180
1076
|
Then the process rests at "refactor.build.review.await-review"
|
|
@@ -1191,147 +1087,8 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
1191
1087
|
"""
|
|
1192
1088
|
When gtd lands
|
|
1193
1089
|
And the process is driven
|
|
1194
|
-
Then the process rests at "
|
|
1195
|
-
|
|
1196
|
-
Scenario: the feature review after a refactor covers only the commits since the refactor's sign-off
|
|
1197
|
-
Given step "implement.building" writes "src/calc.ts" with:
|
|
1198
|
-
"""
|
|
1199
|
-
export const op = (a: number, b: number, sign: number) => a + sign * b
|
|
1200
|
-
export const add = (a: number, b: number) => op(a, b, 1)
|
|
1201
|
-
export const subtract = (a: number, b: number) => op(a, b, -1)
|
|
1202
|
-
"""
|
|
1203
|
-
And step "implement.health.check" changes nothing
|
|
1204
|
-
And step "implement.closing" runs its script
|
|
1205
|
-
And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
1206
|
-
"""
|
|
1207
|
-
# Review: abc1234
|
|
1208
|
-
|
|
1209
|
-
<!-- base: 0000000 -->
|
|
1210
|
-
|
|
1211
|
-
## calc
|
|
1212
|
-
|
|
1213
|
-
- [ ] ./src/calc.ts#1-3
|
|
1214
|
-
subtract built on the shared op
|
|
1215
|
-
"""
|
|
1216
|
-
When the process is driven
|
|
1217
|
-
Then the process rests at "refactor.build.review.await-review"
|
|
1218
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
1219
|
-
"""
|
|
1220
|
-
# Review: abc1234
|
|
1221
|
-
|
|
1222
|
-
<!-- base: 0000000 -->
|
|
1223
|
-
|
|
1224
|
-
## calc
|
|
1225
|
-
|
|
1226
|
-
- [x] ./src/calc.ts#1-2
|
|
1227
|
-
add built on the shared op
|
|
1228
|
-
"""
|
|
1229
|
-
When gtd lands
|
|
1230
|
-
And the process is driven
|
|
1231
|
-
Then the process rests at "build.review.await-review"
|
|
1232
|
-
And the resting step's content contains the hash of the commit "gtd(check): refactor.build.review.closing → implement.building"
|
|
1233
|
-
|
|
1234
|
-
Scenario: feature feedback after a refactor re-plans design and implement, never the seam phase
|
|
1235
|
-
Given step "implement.building" writes "src/calc.ts" with:
|
|
1236
|
-
"""
|
|
1237
|
-
export const op = (a: number, b: number, sign: number) => a + sign * b
|
|
1238
|
-
export const add = (a: number, b: number) => op(a, b, 1)
|
|
1239
|
-
export const subtract = (a: number, b: number) => op(a, b, -1)
|
|
1240
|
-
"""
|
|
1241
|
-
And step "implement.health.check" changes nothing
|
|
1242
|
-
And step "implement.closing" runs its script
|
|
1243
|
-
And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
1244
|
-
"""
|
|
1245
|
-
# Review: abc1234
|
|
1246
|
-
|
|
1247
|
-
<!-- base: 0000000 -->
|
|
1248
|
-
|
|
1249
|
-
## calc
|
|
1250
|
-
|
|
1251
|
-
- [ ] ./src/calc.ts#1-3
|
|
1252
|
-
subtract built on the shared op
|
|
1253
|
-
"""
|
|
1254
|
-
When the process is driven
|
|
1255
|
-
Then the process rests at "refactor.build.review.await-review"
|
|
1256
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
1257
|
-
"""
|
|
1258
|
-
# Review: abc1234
|
|
1259
|
-
|
|
1260
|
-
<!-- base: 0000000 -->
|
|
1261
|
-
|
|
1262
|
-
## calc
|
|
1263
|
-
|
|
1264
|
-
- [x] ./src/calc.ts#1-2
|
|
1265
|
-
add built on the shared op
|
|
1266
|
-
"""
|
|
1267
|
-
When gtd lands
|
|
1268
|
-
And the process is driven
|
|
1269
|
-
Then the process rests at "build.review.await-review"
|
|
1270
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
1271
|
-
"""
|
|
1272
|
-
# Review: abc1234
|
|
1273
|
-
|
|
1274
|
-
<!-- base: 0000000 -->
|
|
1275
|
-
|
|
1276
|
-
## calc
|
|
1277
|
-
|
|
1278
|
-
- [ ] ./src/calc.ts#1-3
|
|
1279
|
-
subtract built on the shared op[^why]
|
|
1280
|
-
|
|
1281
|
-
[^why]:
|
|
1282
|
-
- H: also export multiply
|
|
1283
|
-
"""
|
|
1284
|
-
And step "build.review.collecting" writes ".gtd/REQUIREMENTS.md" with:
|
|
1285
|
-
"""
|
|
1286
|
-
# Requirements
|
|
1287
|
-
|
|
1288
|
-
## Concerns
|
|
1289
|
-
|
|
1290
|
-
### Multiply
|
|
1291
|
-
|
|
1292
|
-
- Export `multiply()`.
|
|
1293
|
-
"""
|
|
1294
|
-
And step "build.review.collecting" writes ".gtd/REVIEW.md" with:
|
|
1295
|
-
"""
|
|
1296
|
-
# Review: abc1234
|
|
1297
|
-
|
|
1298
|
-
<!-- base: 0000000 -->
|
|
1299
|
-
|
|
1300
|
-
## calc
|
|
1301
|
-
|
|
1302
|
-
- [ ] ./src/calc.ts#1-3
|
|
1303
|
-
subtract built on the shared op[^why]
|
|
1304
|
-
|
|
1305
|
-
[^why]:
|
|
1306
|
-
- H: also export multiply
|
|
1307
|
-
- A: noted in the requirements.
|
|
1308
|
-
"""
|
|
1309
|
-
When gtd lands
|
|
1310
|
-
And the process is driven
|
|
1311
|
-
Then the process rests at "build.review.await-review"
|
|
1312
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
1313
|
-
"""
|
|
1314
|
-
# Review: abc1234
|
|
1315
|
-
|
|
1316
|
-
<!-- base: 0000000 -->
|
|
1317
|
-
|
|
1318
|
-
## calc
|
|
1319
|
-
|
|
1320
|
-
- [ ] ./src/calc.ts#1-3
|
|
1321
|
-
subtract built on the shared op
|
|
1322
|
-
"""
|
|
1323
|
-
And step "build.review.closing" runs its script
|
|
1324
|
-
And step "re-unwind" runs its script
|
|
1325
|
-
When gtd lands
|
|
1326
|
-
And the process is driven
|
|
1327
|
-
Then the process rests at "implement.building"
|
|
1328
|
-
And the commit subjects end with:
|
|
1329
|
-
"""
|
|
1330
|
-
gtd(check): re-unwind → design.triage
|
|
1331
|
-
gtd(agent): design.triage → design.gate.answer
|
|
1332
|
-
gtd(human): design.gate.answer → implement.building
|
|
1333
|
-
gtd(agent): implement.building
|
|
1334
|
-
"""
|
|
1090
|
+
Then the process rests at "idle"
|
|
1091
|
+
And "src/calc.ts" contains "subtract"
|
|
1335
1092
|
|
|
1336
1093
|
Scenario: a nit fix in the refactor slice that changes a non-stray is refused, though a glob stray widens the write access
|
|
1337
1094
|
Given step "seam.naive" writes "src/*.ts" with:
|
|
@@ -1476,7 +1233,7 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
1476
1233
|
"""
|
|
1477
1234
|
And step "refactor.build.review.closing" runs its script
|
|
1478
1235
|
|
|
1479
|
-
Scenario: each slice's quality lap reviews from that slice's base
|
|
1236
|
+
Scenario: each slice's quality lap reviews from that slice's base
|
|
1480
1237
|
When the process is driven
|
|
1481
1238
|
Then the process rests at "refactor.build.quality.correctness.reviewing"
|
|
1482
1239
|
And the resting step's content contains the hash of the commit "gtd(judge): seam.judge → refactor.deriving"
|
|
@@ -1489,6 +1246,10 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
1489
1246
|
"""
|
|
1490
1247
|
And step "implement.health.check" changes nothing
|
|
1491
1248
|
And step "implement.closing" runs its script
|
|
1249
|
+
And judge step "implement.coverage" answers:
|
|
1250
|
+
"""
|
|
1251
|
+
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
1252
|
+
"""
|
|
1492
1253
|
When the process is driven
|
|
1493
1254
|
Then the process rests at "refactor.build.review.await-review"
|
|
1494
1255
|
Given a file ".gtd/REVIEW.md" with:
|
|
@@ -1507,88 +1268,13 @@ Feature: the refactor slice is reviewed on its own before the feature is impleme
|
|
|
1507
1268
|
Then the process rests at "build.quality.correctness.reviewing"
|
|
1508
1269
|
And the resting step's content contains the hash of the commit "gtd(check): refactor.build.review.closing → implement.building"
|
|
1509
1270
|
Given step "build.quality.correctness.reviewing" changes nothing
|
|
1510
|
-
And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
1511
|
-
"""
|
|
1512
|
-
# Review: abc1234
|
|
1513
|
-
|
|
1514
|
-
<!-- base: 0000000 -->
|
|
1515
|
-
|
|
1516
|
-
## calc
|
|
1517
|
-
|
|
1518
|
-
- [ ] ./src/calc.ts#1-3
|
|
1519
|
-
subtract built on the shared op
|
|
1520
|
-
"""
|
|
1521
1271
|
When the process is driven
|
|
1522
|
-
Then the process rests at "
|
|
1523
|
-
|
|
1524
|
-
"""
|
|
1525
|
-
# Review: abc1234
|
|
1526
|
-
|
|
1527
|
-
<!-- base: 0000000 -->
|
|
1528
|
-
|
|
1529
|
-
## calc
|
|
1530
|
-
|
|
1531
|
-
- [ ] ./src/calc.ts#1-3
|
|
1532
|
-
subtract built on the shared op[^why]
|
|
1533
|
-
|
|
1534
|
-
[^why]:
|
|
1535
|
-
- H: also export multiply
|
|
1536
|
-
"""
|
|
1537
|
-
And step "build.review.collecting" writes ".gtd/REQUIREMENTS.md" with:
|
|
1538
|
-
"""
|
|
1539
|
-
# Requirements
|
|
1540
|
-
|
|
1541
|
-
## Concerns
|
|
1542
|
-
|
|
1543
|
-
### Multiply
|
|
1544
|
-
|
|
1545
|
-
- Export `multiply()`.
|
|
1546
|
-
"""
|
|
1547
|
-
And step "build.review.collecting" writes ".gtd/REVIEW.md" with:
|
|
1548
|
-
"""
|
|
1549
|
-
# Review: abc1234
|
|
1550
|
-
|
|
1551
|
-
<!-- base: 0000000 -->
|
|
1552
|
-
|
|
1553
|
-
## calc
|
|
1554
|
-
|
|
1555
|
-
- [ ] ./src/calc.ts#1-3
|
|
1556
|
-
subtract built on the shared op[^why]
|
|
1557
|
-
|
|
1558
|
-
[^why]:
|
|
1559
|
-
- H: also export multiply
|
|
1560
|
-
- A: noted in the requirements.
|
|
1561
|
-
"""
|
|
1562
|
-
When gtd lands
|
|
1563
|
-
And the process is driven
|
|
1564
|
-
Then the process rests at "build.review.await-review"
|
|
1565
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
1566
|
-
"""
|
|
1567
|
-
# Review: abc1234
|
|
1568
|
-
|
|
1569
|
-
<!-- base: 0000000 -->
|
|
1570
|
-
|
|
1571
|
-
## calc
|
|
1572
|
-
|
|
1573
|
-
- [ ] ./src/calc.ts#1-3
|
|
1574
|
-
subtract built on the shared op
|
|
1272
|
+
Then the process rests at "idle"
|
|
1273
|
+
And the commit subjects end with:
|
|
1575
1274
|
"""
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
And step "build.quality.correctness.reviewing" is no longer scripted
|
|
1579
|
-
And step "implement.building" writes "src/calc.ts" with:
|
|
1275
|
+
gtd(check): implement.closing → build.quality.correctness.reviewing
|
|
1276
|
+
gtd(agent): build.quality.correctness.reviewing → idle
|
|
1580
1277
|
"""
|
|
1581
|
-
export const op = (a: number, b: number, sign: number) => a + sign * b
|
|
1582
|
-
export const add = (a: number, b: number) => op(a, b, 1)
|
|
1583
|
-
export const subtract = (a: number, b: number) => op(a, b, -1)
|
|
1584
|
-
export const multiply = (a: number, b: number) => a * b
|
|
1585
|
-
"""
|
|
1586
|
-
And step "implement.health.check" changes nothing
|
|
1587
|
-
And step "implement.closing" runs its script
|
|
1588
|
-
When gtd lands
|
|
1589
|
-
And the process is driven
|
|
1590
|
-
Then the process rests at "build.quality.correctness.reviewing"
|
|
1591
|
-
And the resting step's content contains the hash of the commit "gtd(check): refactor.build.review.closing → implement.building"
|
|
1592
1278
|
|
|
1593
1279
|
Rule: a refactor package never carries a test file, and demoted headings stop at ######
|
|
1594
1280
|
|
|
@@ -52,18 +52,10 @@ Feature: rejected naive passes walk one fixed path through the steer gate to idl
|
|
|
52
52
|
"""
|
|
53
53
|
And step "implement.health.check" changes nothing
|
|
54
54
|
And step "implement.closing" runs its script
|
|
55
|
-
And step "
|
|
55
|
+
And judge step "implement.coverage" answers:
|
|
56
56
|
"""
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
<!-- base: 0000000 -->
|
|
60
|
-
|
|
61
|
-
## calc
|
|
62
|
-
|
|
63
|
-
- [ ] ./src/calc.ts#1-2
|
|
64
|
-
subtract added
|
|
57
|
+
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
65
58
|
"""
|
|
66
|
-
And step "build.review.closing" runs its script
|
|
67
59
|
When the process is driven
|
|
68
60
|
Then the process rests at "seam.judge"
|
|
69
61
|
|
|
@@ -113,21 +105,6 @@ Feature: rejected naive passes walk one fixed path through the steer gate to idl
|
|
|
113
105
|
"""
|
|
114
106
|
When gtd lands
|
|
115
107
|
And the process is driven
|
|
116
|
-
Then the process rests at "build.review.await-review"
|
|
117
|
-
|
|
118
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
119
|
-
"""
|
|
120
|
-
# Review: abc1234
|
|
121
|
-
|
|
122
|
-
<!-- base: 0000000 -->
|
|
123
|
-
|
|
124
|
-
## calc
|
|
125
|
-
|
|
126
|
-
- [x] ./src/calc.ts#1-2
|
|
127
|
-
subtract added
|
|
128
|
-
"""
|
|
129
|
-
When gtd lands
|
|
130
|
-
And the process is driven
|
|
131
108
|
Then the process rests at "idle"
|
|
132
109
|
And the commit subjects end with:
|
|
133
110
|
"""
|
|
@@ -150,11 +127,9 @@ Feature: rejected naive passes walk one fixed path through the steer gate to idl
|
|
|
150
127
|
gtd(check): seam.check → seam.judge
|
|
151
128
|
gtd(judge): seam.judge → implement.building
|
|
152
129
|
gtd(agent): implement.building → implement.health.check
|
|
153
|
-
gtd(check): implement.health.check → implement.
|
|
154
|
-
gtd(
|
|
155
|
-
gtd(
|
|
156
|
-
gtd(human): build.review.await-review → build.review.closing
|
|
157
|
-
gtd(check): build.review.closing → idle
|
|
130
|
+
gtd(check): implement.health.check → implement.coverage
|
|
131
|
+
gtd(judge): implement.coverage → implement.closing
|
|
132
|
+
gtd(check): implement.closing → idle
|
|
158
133
|
"""
|
|
159
134
|
And the commit "gtd(human): idle → unwind" has a body containing "Gtd-Var: flag_risk_tier=0"
|
|
160
135
|
And the commit "gtd(agent): seam.naive → seam.check" has a body containing "Gtd-Kept:"
|
|
@@ -145,14 +145,19 @@ Feature: the naive pass and seam judge decide how a feature is built
|
|
|
145
145
|
"""
|
|
146
146
|
And step "implement.health.check" changes nothing
|
|
147
147
|
And step "implement.closing" runs its script
|
|
148
|
+
And judge step "implement.coverage" answers:
|
|
149
|
+
"""
|
|
150
|
+
[{"id":"AC-1","answer":"yes","p":0.9}]
|
|
151
|
+
"""
|
|
148
152
|
When the process is driven
|
|
149
|
-
Then the process rests at "
|
|
153
|
+
Then the process rests at "idle"
|
|
150
154
|
And the commit subjects end with:
|
|
151
155
|
"""
|
|
152
156
|
gtd(judge): seam.judge → implement.building
|
|
153
157
|
gtd(agent): implement.building → implement.health.check
|
|
154
|
-
gtd(check): implement.health.check → implement.
|
|
155
|
-
gtd(
|
|
158
|
+
gtd(check): implement.health.check → implement.coverage
|
|
159
|
+
gtd(judge): implement.coverage → implement.closing
|
|
160
|
+
gtd(check): implement.closing → idle
|
|
156
161
|
"""
|
|
157
162
|
And ".gtd/REQUIREMENTS.md" does not exist
|
|
158
163
|
|
|
@@ -276,104 +281,3 @@ Feature: the naive pass and seam judge decide how a feature is built
|
|
|
276
281
|
gtd(judge): seam.judge → seam.steer
|
|
277
282
|
gtd(human): seam.steer → implement.building
|
|
278
283
|
"""
|
|
279
|
-
|
|
280
|
-
Scenario: review feedback after land re-runs design and implement, never the seam phase
|
|
281
|
-
Given step "seam.check" changes nothing
|
|
282
|
-
And step "seam.naive" writes "src/acceptance.test.ts" with:
|
|
283
|
-
"""
|
|
284
|
-
it("[AC-1] holds", () => {})
|
|
285
|
-
"""
|
|
286
|
-
And step "seam.naive" writes "src/calc.ts" with:
|
|
287
|
-
"""
|
|
288
|
-
export const add = (a: number, b: number) => b + a
|
|
289
|
-
"""
|
|
290
|
-
And judge step "seam.judge" answers:
|
|
291
|
-
"""
|
|
292
|
-
[{"id":"shape","answer":"land","p":0.9}]
|
|
293
|
-
"""
|
|
294
|
-
And step "implement.building" writes "src/calc.ts" with:
|
|
295
|
-
"""
|
|
296
|
-
export const add = (a: number, b: number) => a + b
|
|
297
|
-
export const SUBTRACT = process.env.GTD_FLAG_SUBTRACT === "1"
|
|
298
|
-
"""
|
|
299
|
-
And step "implement.health.check" changes nothing
|
|
300
|
-
And step "implement.closing" runs its script
|
|
301
|
-
And step "build.review.reviewing" writes ".gtd/REVIEW.md" with:
|
|
302
|
-
"""
|
|
303
|
-
# Review: abc1234
|
|
304
|
-
|
|
305
|
-
<!-- base: 0000000 -->
|
|
306
|
-
|
|
307
|
-
## calc
|
|
308
|
-
|
|
309
|
-
- [ ] ./src/calc.ts#1-1
|
|
310
|
-
new add function
|
|
311
|
-
"""
|
|
312
|
-
When the process is driven
|
|
313
|
-
Then the process rests at "build.review.await-review"
|
|
314
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
315
|
-
"""
|
|
316
|
-
# Review: abc1234
|
|
317
|
-
|
|
318
|
-
<!-- base: 0000000 -->
|
|
319
|
-
|
|
320
|
-
## calc
|
|
321
|
-
|
|
322
|
-
- [ ] ./src/calc.ts#1-1
|
|
323
|
-
new add function[^why]
|
|
324
|
-
|
|
325
|
-
[^why]:
|
|
326
|
-
- H: also export multiply
|
|
327
|
-
"""
|
|
328
|
-
And step "build.review.collecting" writes ".gtd/REQUIREMENTS.md" with:
|
|
329
|
-
"""
|
|
330
|
-
# Requirements
|
|
331
|
-
|
|
332
|
-
## Concerns
|
|
333
|
-
|
|
334
|
-
### Multiply
|
|
335
|
-
|
|
336
|
-
- Export `multiply()`.
|
|
337
|
-
"""
|
|
338
|
-
And step "build.review.collecting" writes ".gtd/REVIEW.md" with:
|
|
339
|
-
"""
|
|
340
|
-
# Review: abc1234
|
|
341
|
-
|
|
342
|
-
<!-- base: 0000000 -->
|
|
343
|
-
|
|
344
|
-
## calc
|
|
345
|
-
|
|
346
|
-
- [ ] ./src/calc.ts#1-1
|
|
347
|
-
new add function[^why]
|
|
348
|
-
|
|
349
|
-
[^why]:
|
|
350
|
-
- H: also export multiply
|
|
351
|
-
- A: noted in the requirements.
|
|
352
|
-
"""
|
|
353
|
-
When gtd lands
|
|
354
|
-
And the process is driven
|
|
355
|
-
Then the process rests at "build.review.await-review"
|
|
356
|
-
Given a file ".gtd/REVIEW.md" with:
|
|
357
|
-
"""
|
|
358
|
-
# Review: abc1234
|
|
359
|
-
|
|
360
|
-
<!-- base: 0000000 -->
|
|
361
|
-
|
|
362
|
-
## calc
|
|
363
|
-
|
|
364
|
-
- [ ] ./src/calc.ts#1-1
|
|
365
|
-
new add function
|
|
366
|
-
"""
|
|
367
|
-
And step "build.review.closing" runs its script
|
|
368
|
-
And step "re-unwind" runs its script
|
|
369
|
-
When gtd lands
|
|
370
|
-
And the process is driven
|
|
371
|
-
Then the process rests at "implement.building"
|
|
372
|
-
And the commit subjects end with:
|
|
373
|
-
"""
|
|
374
|
-
gtd(check): build.review.closing → re-unwind
|
|
375
|
-
gtd(check): re-unwind → design.triage
|
|
376
|
-
gtd(agent): design.triage → design.gate.answer
|
|
377
|
-
gtd(human): design.gate.answer → implement.building
|
|
378
|
-
gtd(agent): implement.building
|
|
379
|
-
"""
|
|
@@ -417,7 +417,9 @@ describe("implement", () => {
|
|
|
417
417
|
{
|
|
418
418
|
step: (request: StepRequest) => {
|
|
419
419
|
requests.push(request)
|
|
420
|
-
return Promise.resolve(
|
|
420
|
+
return Promise.resolve(
|
|
421
|
+
request.kind === "judge" ? { answers: {}, truncated: [] } : undefined,
|
|
422
|
+
)
|
|
421
423
|
},
|
|
422
424
|
pushScope: () => undefined,
|
|
423
425
|
popScope: () => undefined,
|