@pmelab/gtd 32.1.0 → 34.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 (36) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +66 -53
  3. package/dist/chunks/{reserved-2fV0mj14.mjs → reserved-BcJgt5_R.mjs} +79 -12
  4. package/dist/chunks/{tail-BynhCfuv.mjs → tail-CM_fa93v.mjs} +1 -1
  5. package/dist/testkit.mjs +2 -2
  6. package/dist/workflows/cleanup.mjs +2 -2
  7. package/dist/workflows/feature.mjs +174 -40
  8. package/dist/workflows/fix.mjs +2 -2
  9. package/dist/workflows/review.mjs +2 -2
  10. package/dist/workflows/rollout.mjs +1 -1
  11. package/dist/workflows.mjs +249 -48
  12. package/package.json +1 -1
  13. package/skills/authoring/SKILL.md +2 -2
  14. package/src/testkit/steps.ts +4 -0
  15. package/src/workflows/feature/acceptance-criteria.feature +8 -0
  16. package/src/workflows/feature/fast-path.feature +11 -35
  17. package/src/workflows/feature/feature.test.ts +9 -100
  18. package/src/workflows/feature/feature.ts +29 -16
  19. package/src/workflows/feature/flag-mode.feature +2 -91
  20. package/src/workflows/feature/naive-acceptance.feature +140 -0
  21. package/src/workflows/feature/one-step-land.feature +11 -34
  22. package/src/workflows/feature/quality-unresolved.feature +96 -0
  23. package/src/workflows/feature/refactor-absorbs.feature +17 -25
  24. package/src/workflows/feature/refactor-first.feature +11 -35
  25. package/src/workflows/feature/refactor-lens-models.feature +6 -1
  26. package/src/workflows/feature/refactor-review.feature +67 -360
  27. package/src/workflows/feature/refactor.ts +4 -3
  28. package/src/workflows/feature/risk-tier.feature +10 -0
  29. package/src/workflows/feature/seam-rejection.feature +20 -37
  30. package/src/workflows/feature/seam.feature +66 -113
  31. package/src/workflows/feature/seam.test.ts +173 -3
  32. package/src/workflows/feature/seam.ts +196 -31
  33. package/src/workflows/review/review-door.feature +108 -0
  34. package/src/workflows/shared/tail.ts +2 -2
  35. package/src/workflows/shared/text.test.ts +40 -0
  36. package/src/workflows/shared/text.ts +110 -16
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gtd",
3
- "version": "32.1.0",
3
+ "version": "34.0.0",
4
4
  "description": "Drive the gtd loop inside Claude Code: agent turns run as subagents, gtd decides every beat",
5
5
  "author": {
6
6
  "name": "Philipp Melab"
package/README.md CHANGED
@@ -405,9 +405,10 @@ phone UI does not show them).
405
405
 
406
406
  ### The workflow it ships with
407
407
 
408
- One built-in workflow drives all of that. From where you sit, it has four
408
+ One built-in workflow drives all of that. From where you sit, it has three
409
409
  moments — everything between them runs without you, with the judged exceptions
410
- noted in steps 3 and 4 below.
410
+ noted in step 3 below — plus a fourth, review, only on `refactor-first` or when
411
+ you open the `review` door.
411
412
 
412
413
  1. **You sketch.** Change anything, or write the idea into `.gtd/TODO.md`. Rough
413
414
  is fine; it is treated as a sketch, not as work.
@@ -431,13 +432,15 @@ noted in steps 3 and 4 below.
431
432
  [the naive pass](#the-naive-pass) below; with [flag mode](#the-naive-pass)
432
433
  off, neither runs). Then the change is built test-first, checked against the
433
434
  full suite (`testCommand`) and fixed until it passes — so keep that suite
434
- fast; gtd has no lighter one. Scenario wording is not frozen: you sign the
435
- scenarios off once, in the review's `## Scenarios` chunk, where any assertion
436
- an existing scenario lost is marked `Weakened:`. After the build the quality
437
- lap runs. Three points along the process (two with flag mode off) are judged
438
- rather than always asking you outright — each stops and hands you a verdict
439
- to make (`gtd judge answer`, or land with a clean tree to accept the
440
- conservative default, which never skips work;
435
+ fast; gtd has no lighter one. Scenario wording is not frozen: a review's
436
+ `## Scenarios` chunk marks any assertion an existing scenario lost as
437
+ `Weakened:` — **risk: `feature` has no review, so a build turn that weakens a
438
+ scenario reaches `idle` unflagged unless you open the `review` door.** After
439
+ the build the quality lap runs, and the process ends: the feature workflow
440
+ has no human review of the finished change. Two points along the process (one
441
+ with flag mode off) are judged rather than always asking you outright — each
442
+ stops and hands you a verdict to make (`gtd judge answer`, or land with a
443
+ clean tree to accept the conservative default, which never skips work;
441
444
  `gtd judge run --provider fixed --answers <path>` — or the
442
445
  `GTD_JUDGE_ANSWERS` env var, inline JSON — answers one from a file, piped
443
446
  between `gtd judge --json` and `gtd judge answer`;
@@ -456,8 +459,6 @@ noted in steps 3 and 4 below.
456
459
  or get rejected and retried?
457
460
  - Every red round after the first: was the failure identical, new, or
458
461
  progress?
459
- - After you review: is each of your notes an edit, a question, a nit or
460
- praise?
461
462
 
462
463
  gtd itself never calls a judge: `gtd loop`, the Claude Code mod and the
463
464
  reference driver answer these through `gtd judge run` (auto selection: jev
@@ -469,18 +470,22 @@ noted in steps 3 and 4 below.
469
470
  and skip a gate unattended.**
470
471
 
471
472
  Once the change is built, the whole change goes through a qualitative review
472
- lap before you see anything: six lenses, one turn each, in order —
473
- `correctness`, `owasp-security`, `ponytail-review`, `test-audit`,
474
- `conventions`, `spec-challenge`. `correctness`, `owasp-security` and
475
- `spec-challenge` run on the planner model (`smart`), the other three on the
476
- coder model (`base`); a `qualityReviews` entry `<lens>=<model>` picks a
477
- lens's own. Each traces the change from its own angle and records every
478
- finding, blocking or not; one fix turn then fixes ALL of them once, with no
479
- re-review after the fix. A clean turn means approval only when that lens
480
- found nothing at all. This lap is where code quality is looked at, and every
481
- round pays for it. It never replaces step 4 — your review stays the final
482
- gate, and nothing here skips it. The `fix` door (below) repairs a red
483
- baseline through this same lap.
473
+ lap: six lenses, one turn each, in order — `correctness`, `owasp-security`,
474
+ `ponytail-review`, `test-audit`, `conventions`, `spec-challenge`.
475
+ `correctness`, `owasp-security` and `spec-challenge` run on the planner model
476
+ (`smart`), the other three on the coder model (`base`); a `qualityReviews`
477
+ entry `<lens>=<model>` picks a lens's own. Each traces the change from its
478
+ own angle and records every finding, blocking or not; one fix turn then fixes
479
+ ALL of them once, with no re-review after the fix. A clean turn means
480
+ approval only when that lens found nothing at all. This lap is where code
481
+ quality is looked at, and every round pays for it. It is the last look the
482
+ feature workflow takes: the process ends at `idle` once it is clean (and the
483
+ suite green), with no review rest — **risk: nothing re-reads the code the
484
+ single fix turn writes; only the suite gates it.** Findings the fix cap
485
+ leaves in `.gtd/QUALITY.md` rest at `build.quality-unresolved` until you
486
+ delete or empty the file; the suite then runs on any hand edits. **Nobody
487
+ signs the finished change off unless you open the `review` door** (below).
488
+ The `fix` door repairs a red baseline through this same lap.
484
489
 
485
490
  A red suite that keeps failing past a few fix attempts escalates instead of
486
491
  retrying forever: an agent turn reads the failing output and writes
@@ -491,22 +496,28 @@ noted in steps 3 and 4 below.
491
496
  instead of a third being written, and editing it is what gets the next
492
497
  attempt anywhere new.
493
498
 
494
- 4. **You review.** You get a review document listing what changed and what to
495
- look at. Before you see it, an automatic risk-fix pass
496
- (`build.review.fix.risks.fixing`) runs. Any risk the reviewer names (a note
497
- opening with `Risk:`) is fixed first, the suite kept green, and the review
498
- rewritten — once per review round, so a risk the rewrite still names reaches
499
- you unfixed; risk: a fix lands with no check that the risk was real. Tick the
500
- boxes to approve, or write what is wrong. Approving ends the process;
501
- feedback is judged note by note, each as `edit`, `question`, `nit` or
502
- `praise`. An `edit` sends the process back to step 2 for re-derived
503
- requirements, and the implementation is amended to meet them. A `question` is
504
- answered inline under your note and the process stops at the review again —
505
- no new plan. A `nit` is fixed in one batch, the suite must go green (a red
506
- one gets fix turns first), then a fresh review of the change stops at the
507
- review again. `praise` is dropped; a round of only praise signs off. When a
508
- round mixes them, questions are answered and nits fixed first, then the edits
509
- are planned — risk: the planning lap may redo nit fixes it touches.
499
+ 4. **You review — the refactor, or on request.** The feature workflow asks for
500
+ one review only on `refactor-first`: of the refactor slice, before the
501
+ feature is built (see [the naive pass](#the-naive-pass)). For the finished
502
+ change run `gtd door review <commitish>` (`/gtd review [base]`); that review
503
+ hands notes to `fix` instead of re-planning (below). Either way you get a
504
+ review document listing what changed and what to look at. Before you see it,
505
+ an automatic risk-fix pass (`build.review.fix.risks.fixing`) runs. Any risk
506
+ the reviewer names (a note opening with `Risk:`) is fixed first, the suite
507
+ kept green, and the review rewritten — once per review round, so a risk the
508
+ rewrite still names reaches you unfixed; risk: a fix lands with no check that
509
+ the risk was real. Tick the boxes to approve, or write what is wrong. At the
510
+ refactor review, approving moves on to the feature; feedback is judged note
511
+ by note (a third judged point), each as `edit`, `question`, `nit` or
512
+ `praise`. An `edit` re-derives the refactor (in a custom workflow built on
513
+ `buildTail`, it sends the process back to step 2 for re-derived
514
+ requirements). A `question` is answered inline under your note and the
515
+ process stops at the review again — no new plan. A `nit` is fixed in one
516
+ batch, the suite must go green (a red one gets fix turns first), then a fresh
517
+ review of the change stops at the review again. `praise` is dropped; a round
518
+ of only praise signs off. When a round mixes them, questions are answered and
519
+ nits fixed first, then the edits are planned — risk: the planning lap may
520
+ redo nit fixes it touches.
510
521
 
511
522
  Each `edit` note also gets a severity tier from four judge questions
512
523
  (security, reversibility, blast radius, new concept). `critical` and `should`
@@ -526,7 +537,7 @@ noted in steps 3 and 4 below.
526
537
  You never talk to it. Every exchange is a file in `.gtd/` that you edit in your
527
538
  own editor, and every answer you give is a commit. Your test suite is the gate
528
539
  throughout: a red baseline stops the process before it starts, and a red build
529
- is fixed before review.
540
+ is fixed before the process ends.
530
541
 
531
542
  Prefer a phone or another device over your editor? `gtd ui` opens the file whose
532
543
  turn it is as a small web app, over Tailscale — including a step that names no
@@ -588,19 +599,21 @@ home directory — fails every command until you delete it. See
588
599
 
589
600
  #### The naive pass
590
601
 
591
- After design the agent first implements the requirements directly. A judge
592
- checks whether it changed anything outside the expected set (tests, steering
593
- files; see `seamAllow`). Incidental changes land; a needed seam change is
594
- refactored first, in its own slice with its own quality lap
595
- (`refactorQualityReviews`) and review, before the feature is implemented and
596
- reviewed; a wrong approach is retried twice, then rests for you to steer or
597
- overrule it. `gtd slices` lists the `refactor` and `feature` slices. A refactor
598
- that already carried the whole feature leaves the implementation nothing to do:
599
- its empty turn passes, and the feature review covers the whole change. Feedback
600
- at the feature review re-runs design and the implementation, never the naive
601
- pass; feedback at the refactor review re-runs the refactor, never design; a
602
- refactor-review change the refactor cannot build is refused, and the only way
603
- out is `gtd abandon`. A process from 27.5.0 or later whose judge ruled
602
+ After design the agent first implements the requirements directly,
603
+ breadth-first, with a behaviour-level acceptance test per criterion that names
604
+ its ID (`[AC-3] …`) and reaches only code that existed before the pass. The pass
605
+ is sent back while a criterion's ID is missing from its tests, a test imports a
606
+ file it added, or the suite is red on it. A judge checks whether it changed
607
+ anything outside the expected set (tests, steering files; see `seamAllow`).
608
+ Incidental changes land; a needed seam change is refactored first, in its own
609
+ slice with its own quality lap (`refactorQualityReviews`) and review, before the
610
+ feature is implemented; a wrong approach is retried twice, then rests for you to
611
+ steer or overrule it. `gtd slices` lists the `refactor` and `feature` slices. A
612
+ refactor that already carried the whole feature leaves the implementation
613
+ nothing to do: its empty turn passes, and the feature's quality lap covers the
614
+ whole change. Feedback at the refactor review re-runs the refactor, never
615
+ design; a refactor-review change the refactor cannot build is refused, and the
616
+ only way out is `gtd abandon`. A process from 27.5.0 or later whose judge ruled
604
617
  `refactor-first` must `gtd abandon` too. Each slice's quality lap reviews only
605
618
  that slice. Details in
606
619
  [the naive-pass path](docs/configuration.md#the-naive-pass-path).
@@ -416,6 +416,17 @@ carries it.
416
416
  What each change does next (then run \`gtd land\`):
417
417
  - **Continue** — having undone the sketch by hand, check the test baseline is green and start triage (**start-gate.check**).
418
418
  `;
419
+ const qualityUnresolvedMessage = () => `The quality lap's fix turns hit their cap and \`.gtd/QUALITY.md\` still
420
+ holds findings. Nothing reviews the change after this, so the process
421
+ will not end with them open.
422
+
423
+ Fix what matters by hand, then delete or empty \`.gtd/QUALITY.md\` —
424
+ dropping a finding is your call to make.
425
+
426
+ What each change does next (then run \`gtd land\`):
427
+ - **Delete or empty \`.gtd/QUALITY.md\`** — the suite runs on your edits, then the process ends (**idle**).
428
+ - **Anything else** — rests here again.
429
+ `;
419
430
  const startGateBlockedMessage = () => `The test baseline is red — gtd will not start new work on a broken suite.
420
431
  \`.gtd/FEEDBACK.md\` holds the failing output.
421
432
 
@@ -1203,24 +1214,47 @@ Print the closing message and stop — this writes nothing itself.
1203
1214
  `;
1204
1215
  };
1205
1216
  const listed = (paths, unreadable = []) => paths.map((path) => ` - \`${displayPath(path)}\`${unreadable.includes(path) ? " (unreadable)" : ""}`).join("\n");
1217
+ const isRed = (retry) => "red" in retry;
1218
+ const isFault = (retry) => "fault" in retry;
1219
+ const pickUp = (hash) => `Pick it up — \`git diff --binary ${hash}^ ${hash} | git apply\``;
1206
1220
  const criteriaBinding = (refused) => `- Its \`## Acceptance Criteria\` (\`AC-<n>\`) bind this turn: re-read them from
1207
1221
  the file, never from memory, and stop only when each one holds. They are
1208
1222
  settled — ${refused ? "a turn that changes them is refused" : "leave them as they are"}`;
1209
- const naivePassPrompt = (rejection) => `${stateFileRules}
1223
+ const naiveRetry = (retry) => isFault(retry) ? `
1224
+ Your previous attempt's (\`${retry.hash}\`) tests fall short:
1225
+ ${retry.fault}
1226
+ ${pickUp(retry.hash)} — and fix its tests; do not start over.
1227
+ ` : isRed(retry) ? `
1228
+ Your previous attempt (\`${retry.red}\`) left the suite red; \`.gtd/FEEDBACK.md\`
1229
+ holds the output. ${pickUp(retry.red)}
1230
+ — and fix it until the suite is green; do not start over.
1231
+ ` : `
1232
+ Your previous attempt was rejected: the judge answered \`reject\` (p=${retry.p}),
1233
+ meaning the naive pass solved the task the wrong way — discard it and
1234
+ re-implement. It changed these files outside the expected set:
1235
+ ${listed(retry.strays)}
1236
+ Start over and choose a different approach; do not rebuild the same diff.
1237
+ `;
1238
+ const naivePassPrompt = (retry) => `${stateFileRules}
1210
1239
  - Read \`.gtd/REQUIREMENTS.md\`: the settled requirements for this change
1211
1240
  ${criteriaBinding(false)}
1212
1241
  - Implement them the quickest way that works — the naive version. Do not
1213
1242
  restructure, abstract or refactor around the change; a later step judges
1214
1243
  the shape of your diff and a reviewer makes it fit
1215
- - Add tests as you go, and leave \`.gtd/\` untouched
1244
+ - Work breadth-first: rough out every part of the change before finishing any
1245
+ one, so a run cut off midway still shows the whole shape
1246
+ - Write behaviour-level acceptance tests, at least one per criterion, each
1247
+ naming its ID in the test or scenario name (\`[AC-3] …\`). Test through code
1248
+ that existed before this pass — a public entry point, the CLI, an existing
1249
+ module's exports — never a file this pass adds: that is naive structure a
1250
+ later reset and refactor replaces. A pass that leaves a criterion's ID out
1251
+ of its tests, or whose test imports a file it added, is sent back
1252
+ - Run \`${env.testCommand}\` and finish only once it is green with every
1253
+ criterion's test passing: the next step runs it on your diff and sends a red
1254
+ pass back
1255
+ - Leave \`.gtd/\` untouched
1216
1256
  - Leave everything uncommitted and finish your turn — do not commit
1217
- ${rejection === void 0 ? "" : `
1218
- Your previous attempt was rejected: the judge answered \`reject\` (p=${rejection.p}),
1219
- meaning the naive pass solved the task the wrong way — discard it and
1220
- re-implement. It changed these files outside the expected set:
1221
- ${listed(rejection.strays)}
1222
- Start over and choose a different approach; do not rebuild the same diff.
1223
- `}`;
1257
+ ${retry === void 0 ? "" : naiveRetry(retry)}`;
1224
1258
  const implementBuildingPrompt = (reference, tier, amend, afterRefactor, flagMode = true) => `${stateFileRules}
1225
1259
  - Read \`.gtd/REQUIREMENTS.md\`: the settled requirements for this change
1226
1260
  ${criteriaBinding(true)}
@@ -1245,8 +1279,41 @@ const implementFixPrompt = () => `${stateFileRules}
1245
1279
  ${fixFeedbackPrompt}
1246
1280
  - Leave everything uncommitted and finish your turn — do not commit
1247
1281
  `;
1248
- const seamSteerMessage = (rejection) => `The naive pass was rejected three times and the retries are spent.
1249
- The last attempt changed these files outside the expected set:
1282
+ const steerChoices = (overrule) => `Two ways forward (then run \`gtd land\`):
1283
+ - **Steer** — edit \`.gtd/REQUIREMENTS.md\` to redirect the change; the naive
1284
+ pass runs again with a fresh retry budget
1285
+ - **Overrule** — ${overrule}
1286
+
1287
+ An edit together with an approval counts as steer. Only
1288
+ \`.gtd/REQUIREMENTS.md\` is meant to change here: any other edit lands on the
1289
+ branch unjudged.
1290
+ `;
1291
+ const seamSteerMessage = (retry) => isFault(retry) ? `The naive pass failed three times and the retries are spent. The last
1292
+ attempt's tests (\`git show ${retry.hash}\`) fall short:
1293
+ ${retry.fault}
1294
+
1295
+ ${steerChoices(`land a clean tree to go on with the last attempt as it is:
1296
+ \`seam.check\` runs its suite and the seam judge rules on its shape. Use it
1297
+ when the rule cannot fit this change (tests the globs do not see, or no
1298
+ entry point that existed before). Risk: a criterion may have no test that
1299
+ survives a later refactor — the choice is recorded in history.`)}` : isRed(retry) ? `The naive pass failed three times and the retries are spent. The last
1300
+ attempt left the suite red: \`.gtd/FEEDBACK.md\` holds the last run's output; \`git show ${retry.red}\` shows
1301
+ the last attempt.
1302
+
1303
+ Two ways forward (then run \`gtd land\`):
1304
+ - **Steer** — edit \`.gtd/REQUIREMENTS.md\` to redirect the change; the naive
1305
+ pass runs again with a fresh retry budget
1306
+ - **Overrule** — land a clean tree to go on with the last attempt as it is:
1307
+ the seam judge rules on its shape, and the implementation's health loop
1308
+ must turn the suite green. Risk: the criteria's tests never passed on the
1309
+ naive pass — the choice is recorded in history.
1310
+
1311
+ An edit together with an approval counts as steer. Only
1312
+ \`.gtd/REQUIREMENTS.md\` is meant to change here: any other edit lands on the
1313
+ branch unjudged.
1314
+ ` : seamRejectedMessage(retry);
1315
+ const seamRejectedMessage = (rejection) => `The naive pass failed three times and the retries are spent. The judge
1316
+ rejected the last attempt: it changed these files outside the expected set:
1250
1317
  ${listed(rejection.strays)}
1251
1318
 
1252
1319
  Two ways forward (then run \`gtd land\`):
@@ -1573,4 +1640,4 @@ const steering = {
1573
1640
  [REVIEW]: "review"
1574
1641
  };
1575
1642
  //#endregion
1576
- export { reviewEditNotesCapture as $, buildReviewCollectingPrompt as A, designTriagePrompt as B, planner as C, agentWithSkills as D, reviewing as E, clearCriteriaQuestion as F, implementBuildingPrompt as G, fixReviewNotesPrompt as H, criterionLine as I, normaliseCriteriaScript as J, implementFixPrompt as K, deferNotesScript as L, buildReviewTriageMessage as M, builderSystem as N, buildReviewAnswerQuestionsPrompt as O, clearCriteriaMessage as P, refactorRules as Q, designGateAnswerMessage as R, fixRisks as S, reviewQuality as T, handOffAwaitReviewMessage as U, finisherSystem as V, idleMessage as W, refactorDroppedRefusal as X, refactorBuildingPrompt as Y, refactorFixPrompt as Z, REVIEW as _, flagModeOn as a, seamSteerMessage as at, fixCheck as b, baseline as c, unwindFailure as ct, guarded as d, testFileGlobs as dt, reviewEditsCapture as et, healthy as f, flagMentions as ft, REQUIREMENTS as g, requireFlag as gt, REFACTOR as h, registryEntry as ht, skills as i, seamByHandMessage as it, buildReviewFixNitsPrompt as j, buildReviewAwaitAfterDeferMessage as k, escalation as l, defaults as lt, QUALITY as m, flipProblems as mt, summary as n, reviewNotesCapture as nt, flagShipped as o, startGateBlockedMessage as ot, FEEDBACK as p, flagReferences as pt, naivePassPrompt as q, access as r, reviewerSystem as rt, shipped as s, unwindFailedMessage as st, steering as t, reviewGateBlockedMessage as tt, gate as u, envDefaults as ut, awaitReview as v, reviewMissing as w, fixQuality as x, coder as y, designSystem as z };
1643
+ export { refactorRules as $, buildReviewCollectingPrompt as A, designTriagePrompt as B, planner as C, agentWithSkills as D, reviewing as E, clearCriteriaQuestion as F, implementBuildingPrompt as G, fixReviewNotesPrompt as H, criterionLine as I, normaliseCriteriaScript as J, implementFixPrompt as K, deferNotesScript as L, buildReviewTriageMessage as M, builderSystem as N, buildReviewAnswerQuestionsPrompt as O, clearCriteriaMessage as P, refactorFixPrompt as Q, designGateAnswerMessage as R, fixRisks as S, reviewQuality as T, handOffAwaitReviewMessage as U, finisherSystem as V, idleMessage as W, refactorBuildingPrompt as X, qualityUnresolvedMessage as Y, refactorDroppedRefusal as Z, REVIEW as _, requireFlag as _t, flagModeOn as a, seamByHandMessage as at, fixCheck as b, baseline as c, unwindFailedMessage as ct, guarded as d, envDefaults as dt, reviewEditNotesCapture as et, healthy as f, testFileGlobs as ft, REQUIREMENTS as g, registryEntry as gt, REFACTOR as h, flipProblems as ht, skills as i, reviewerSystem as it, buildReviewFixNitsPrompt as j, buildReviewAwaitAfterDeferMessage as k, escalation as l, unwindFailure as lt, QUALITY as m, flagReferences as mt, summary as n, reviewGateBlockedMessage as nt, flagShipped as o, seamSteerMessage as ot, FEEDBACK as p, flagMentions as pt, naivePassPrompt as q, access as r, reviewNotesCapture as rt, shipped as s, startGateBlockedMessage as st, steering as t, reviewEditsCapture as tt, gate as u, defaults as ut, awaitReview as v, reviewMissing as w, fixQuality as x, coder as y, designSystem as z };
@@ -1,6 +1,6 @@
1
1
  import { read, refuse, removeScript, run, scope, showScript, vars } from "../flows.mjs";
2
2
  import { fixFindings, lensEntriesOf, lensOf, qualityLap as qualityLap$1, reviewToHandOff } from "../workflow-kit.mjs";
3
- import { E as reviewing, S as fixRisks, T as reviewQuality, U as handOffAwaitReviewMessage, _ as REVIEW, b as fixCheck, d as guarded, f as healthy, l as escalation, m as QUALITY, v as awaitReview, w as reviewMissing, x as fixQuality } from "./reserved-2fV0mj14.mjs";
3
+ import { E as reviewing, S as fixRisks, T as reviewQuality, U as handOffAwaitReviewMessage, _ as REVIEW, b as fixCheck, d as guarded, f as healthy, l as escalation, m as QUALITY, v as awaitReview, w as reviewMissing, x as fixQuality } from "./reserved-BcJgt5_R.mjs";
4
4
  //#region src/workflows/shared/tail.ts
5
5
  /** The reviewer's own `.gtd/REVIEW.md`, kept beside the human's notes so `fix` can tell them apart. */
6
6
  const REVIEW_ORIG = ".gtd/REVIEW.orig.md";
package/dist/testkit.mjs CHANGED
@@ -5,13 +5,13 @@ import { $ as logWarning, $i as NodeInspectSymbol, $n as map$5, $r as make$19, $
5
5
  import { createRequire } from "node:module";
6
6
  import * as Crypto from "node:crypto";
7
7
  import { createHash } from "node:crypto";
8
+ import * as Path from "node:path";
9
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
8
10
  import { PassThrough } from "node:stream";
9
11
  import * as NFS from "node:fs";
10
12
  import { existsSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, readlinkSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
11
13
  import * as OS from "node:os";
12
14
  import { homedir, tmpdir } from "node:os";
13
- import * as Path from "node:path";
14
- import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
15
15
  import * as ChildProcess from "node:child_process";
16
16
  import { execFileSync, execSync, spawnSync } from "node:child_process";
17
17
  import * as NodeUrl from "node:url";
@@ -1,6 +1,6 @@
1
1
  import { agent, changes, glob, read, refuse, scope, start, vars } from "../flows.mjs";
2
- import { gt as requireFlag, ht as registryEntry, i as skills, lt as defaults, n as summary, o as flagShipped, pt as flagReferences, r as access, t as steering, ut as envDefaults, y as coder } from "../chunks/reserved-2fV0mj14.mjs";
3
- import { a as refusePendingHandOff, r as handOffTail } from "../chunks/tail-BynhCfuv.mjs";
2
+ import { _t as requireFlag, dt as envDefaults, gt as registryEntry, i as skills, mt as flagReferences, n as summary, o as flagShipped, r as access, t as steering, ut as defaults, y as coder } from "../chunks/reserved-BcJgt5_R.mjs";
3
+ import { a as refusePendingHandOff, r as handOffTail } from "../chunks/tail-CM_fa93v.mjs";
4
4
  //#region src/workflows/cleanup/cleanup.ts
5
5
  const removingPrompt = (name, registry) => `Clean up the release flag "${name}", which is default-on: delete its entry in ${registry}, and remove every \`GTD_FLAG_${name.toUpperCase()}\` check from the shipped sources. Keep the flag-on path; delete code only the off path reached, including tests that pin the off path.`;
6
6
  const cleanupFlow = async () => {