@pmelab/gtd 2.2.0 → 2.4.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/README.md +158 -94
- package/dist/gtd.bundle.mjs +285 -55
- package/package.json +1 -1
- package/schema.json +6 -0
package/README.md
CHANGED
|
@@ -5,10 +5,12 @@
|
|
|
5
5
|
> in the first place. Now I have something that actually helps me.
|
|
6
6
|
|
|
7
7
|
A git-aware CLI that drives a turn-taking loop between a human and an autonomous
|
|
8
|
-
coding agent: capture an idea, grill it into a plan,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
coding agent: capture an idea, grill it into a product-level plan, grill that
|
|
9
|
+
into a technical architecture, decompose it into work packages, execute with
|
|
10
|
+
parallel subagents, test, agentically review each package, walk a human through
|
|
11
|
+
a review, distill durable lessons from the cycle into the project's own docs,
|
|
12
|
+
and finally squash the whole cycle into one conventional-commits commit at the
|
|
13
|
+
end.
|
|
12
14
|
|
|
13
15
|
Internally, gtd is a **pure fold** over git history. The decision core
|
|
14
16
|
(`src/Machine.ts`) is a single IO-free function, `resolve(events)` — **no
|
|
@@ -18,7 +20,7 @@ merge-base with the default branch (whole-history fallback when there is no
|
|
|
18
20
|
default branch, when HEAD equals the merge-base, or when there is no merge-base)
|
|
19
21
|
plus the working tree, turns them into a `COMMIT[]` + single terminal `RESOLVE`
|
|
20
22
|
event stream, and folds them through the machine. The fold lands on exactly
|
|
21
|
-
**one** of
|
|
23
|
+
**one** of 21 states, plus which actor (human or agent) is awaited there. A
|
|
22
24
|
single call resolves to a single state.
|
|
23
25
|
|
|
24
26
|
Steering is entirely **machine-authored commit subjects** — there are no marker
|
|
@@ -27,14 +29,15 @@ files, sentinels, or auto-advance tails to parse. A turn commit looks like
|
|
|
27
29
|
the machine performs itself between turns) looks like `gtd: tests green`.
|
|
28
30
|
`src/Subjects.ts` is the closed grammar both the machine and the edge read.
|
|
29
31
|
|
|
30
|
-
All workflow state lives under **`.gtd/`**: the plan (`.gtd/TODO.md`),
|
|
32
|
+
All workflow state lives under **`.gtd/`**: the product plan (`.gtd/TODO.md`),
|
|
33
|
+
the technical architecture it converges into (`.gtd/ARCHITECTURE.md`), work
|
|
31
34
|
packages (`.gtd/01-…/`), review records (`.gtd/REVIEW.md`, `.gtd/FEEDBACK.md`),
|
|
32
|
-
and loop bookkeeping (`.gtd/ERRORS.md`, `.gtd/HEALTH.md`, `.gtd/
|
|
33
|
-
One rule follows for every agent in the loop: **never
|
|
34
|
-
single file a prompt explicitly grants. A `TODO.md`
|
|
35
|
-
repository root is the project's own file — gtd never
|
|
36
|
-
deletes it. (Corollary: don't gitignore `.gtd/` — the
|
|
37
|
-
through it.)
|
|
35
|
+
and loop bookkeeping (`.gtd/ERRORS.md`, `.gtd/HEALTH.md`, `.gtd/LEARNINGS.md`,
|
|
36
|
+
`.gtd/SQUASH_MSG.md`). One rule follows for every agent in the loop: **never
|
|
37
|
+
touch `.gtd/`** except the single file a prompt explicitly grants. A `TODO.md`
|
|
38
|
+
or `REVIEW.md` at the repository root is the project's own file — gtd never
|
|
39
|
+
reads, consumes, or deletes it. (Corollary: don't gitignore `.gtd/` — the
|
|
40
|
+
workflow commits its state through it.)
|
|
38
41
|
|
|
39
42
|
## Quick start: the two-beat loop
|
|
40
43
|
|
|
@@ -55,9 +58,10 @@ An agent loop is a two-beat protocol repeated forever:
|
|
|
55
58
|
act, then go back to step 1; at a pending checkpoint (`prompt` is null) go
|
|
56
59
|
straight back to step 1.
|
|
57
60
|
|
|
58
|
-
A human acts by editing files (answering questions in `.gtd/TODO.md
|
|
59
|
-
`.gtd/REVIEW.md`, fixing code) and then
|
|
60
|
-
as their turn and hand control back to
|
|
61
|
+
A human acts by editing files (answering questions in `.gtd/TODO.md` or
|
|
62
|
+
`.gtd/ARCHITECTURE.md`, annotating `.gtd/REVIEW.md`, fixing code) and then
|
|
63
|
+
running `gtd step` to capture the edit as their turn and hand control back to
|
|
64
|
+
the agent side of the loop.
|
|
61
65
|
|
|
62
66
|
```bash
|
|
63
67
|
gtd step-agent # advance the machine's own bookkeeping
|
|
@@ -165,8 +169,8 @@ invocation authored (oldest→newest), then a final `state: <state>` line:
|
|
|
165
169
|
|
|
166
170
|
```
|
|
167
171
|
committed: gtd(human): grilling
|
|
168
|
-
committed: gtd:
|
|
169
|
-
state:
|
|
172
|
+
committed: gtd: architecting
|
|
173
|
+
state: architecting
|
|
170
174
|
```
|
|
171
175
|
|
|
172
176
|
`--json` emits `{state, actions, commits}` instead (see
|
|
@@ -295,9 +299,9 @@ single-line JSON output instead of plain text.
|
|
|
295
299
|
|
|
296
300
|
```json
|
|
297
301
|
{
|
|
298
|
-
"state": "
|
|
302
|
+
"state": "architecting",
|
|
299
303
|
"actions": ["capture the human turn as \"gtd(human): grilling\""],
|
|
300
|
-
"commits": ["gtd(human): grilling", "gtd:
|
|
304
|
+
"commits": ["gtd(human): grilling", "gtd: architecting"]
|
|
301
305
|
}
|
|
302
306
|
```
|
|
303
307
|
|
|
@@ -428,12 +432,14 @@ GTD_LOOP_AGENT_CMD='my-agent-cli --prompt "$GTD_LOOP_PROMPT"' gtd-loop
|
|
|
428
432
|
|
|
429
433
|
## States & subjects overview
|
|
430
434
|
|
|
431
|
-
`resolve()` lands on exactly one of **
|
|
432
|
-
`planning`, `building`, `testing`, `fixing`, `escalate`,
|
|
433
|
-
`close-package`, `review`, `await-review`, `done`, `
|
|
434
|
-
`
|
|
435
|
-
`
|
|
436
|
-
|
|
435
|
+
`resolve()` lands on exactly one of **21 states**: `grilling`, `architecting`,
|
|
436
|
+
`grilled`, `planning`, `building`, `testing`, `fixing`, `escalate`,
|
|
437
|
+
`agentic-review`, `close-package`, `review`, `await-review`, `done`, `learning`,
|
|
438
|
+
`await-learning-review`, `learning-apply`, `learning-applied`, `squashing`,
|
|
439
|
+
`idle`, `health-check`, `health-fixing`. Each state has a fixed awaited actor
|
|
440
|
+
(see `awaitedActor` in `src/Machine.ts`): `idle`, `escalate`, `await-review`,
|
|
441
|
+
and `await-learning-review` await the **human**; every other state awaits the
|
|
442
|
+
**agent**.
|
|
437
443
|
|
|
438
444
|
For the full precedence ladder, illegal combinations, and the counter folds that
|
|
439
445
|
drive the fix loops, see [STATES.md](STATES.md) — this section is a summary.
|
|
@@ -445,24 +451,28 @@ The closed set of gates:
|
|
|
445
451
|
|
|
446
452
|
| Gate | Authored by |
|
|
447
453
|
| ---------------- | ------------------------------------------------------------------ |
|
|
448
|
-
| `grilling` | human (answers) / agent (plan iteration)
|
|
454
|
+
| `grilling` | human (answers) / agent (product-plan iteration) |
|
|
455
|
+
| `architecting` | human (answers) / agent (architecture iteration) |
|
|
449
456
|
| `grilled` | agent (converged, ready to decompose) |
|
|
450
457
|
| `building` | agent (package work, or human feedback while agent is out of turn) |
|
|
451
458
|
| `fixing` | agent (test-fix or review-fix round) |
|
|
452
459
|
| `agentic-review` | agent (writes .gtd/FEEDBACK.md verdict) |
|
|
453
460
|
| `review` | agent (writes .gtd/REVIEW.md) / human (approves or gives feedback) |
|
|
454
461
|
| `squashing` | agent (overwrites .gtd/SQUASH_MSG.md) |
|
|
462
|
+
| `learning` | agent (overwrites .gtd/LEARNINGS.md) / human (accepts or edits) |
|
|
463
|
+
| `learning-apply` | agent (integrates .gtd/LEARNINGS.md into CLAUDE.md/AGENTS.md/docs) |
|
|
455
464
|
| `health-fixing` | agent (idle health-check repair) |
|
|
456
465
|
| `escalate` | human (deletes .gtd/ERRORS.md to resume) |
|
|
457
466
|
|
|
458
467
|
### Routing commits — `gtd: <phase>`
|
|
459
468
|
|
|
460
469
|
Bookkeeping the machine authors itself between turns, never a turn a human or
|
|
461
|
-
agent "wins": `gtd:
|
|
462
|
-
`gtd: errors`, `gtd: package done`, `gtd: awaiting review`,
|
|
470
|
+
agent "wins": `gtd: architecting`, `gtd: grilled`, `gtd: planning`,
|
|
471
|
+
`gtd: tests green`, `gtd: errors`, `gtd: package done`, `gtd: awaiting review`,
|
|
463
472
|
`gtd: review feedback`, `gtd: done`, `gtd: squash template`,
|
|
464
473
|
`gtd: reviewing <hash>` (parameterized, from `gtd review`), `gtd: health-check`,
|
|
465
|
-
`gtd: health-fix
|
|
474
|
+
`gtd: health-fix`, `gtd: learning template`, `gtd: learning drafted`,
|
|
475
|
+
`gtd: learning approved`, `gtd: learning applied`.
|
|
466
476
|
|
|
467
477
|
Everything else — any non-`gtd` subject, and any `gtd: *` subject outside this
|
|
468
478
|
closed set — is a **boundary commit**: inert as far as the machine's grammar is
|
|
@@ -471,25 +481,39 @@ this matters on upgrade.
|
|
|
471
481
|
|
|
472
482
|
## Workflow walkthroughs
|
|
473
483
|
|
|
474
|
-
### Grilling
|
|
484
|
+
### Grilling: two phases, product then architecture
|
|
475
485
|
|
|
476
486
|
A dirty tree at a boundary HEAD (a fresh idea, sketched in a file or just left
|
|
477
487
|
as pending code) is captured in **one** human turn: `gtd step` commits
|
|
478
488
|
everything pending as `gtd(human): grilling` — nothing is reverted or seeded,
|
|
479
489
|
the captured files stay in history. `gtd next` hands the agent that turn's diff;
|
|
480
|
-
the agent develops `.gtd/TODO.md` into a concrete plan **in
|
|
481
|
-
|
|
482
|
-
`.gtd/TODO.md`
|
|
490
|
+
the agent develops `.gtd/TODO.md` into a concrete **product-level** plan **in
|
|
491
|
+
one turn** — user-facing decisions only, no architecture — proposing a
|
|
492
|
+
**suggested default** for every open question, and leaves `.gtd/TODO.md`
|
|
493
|
+
uncommitted for `gtd(agent): grilling`.
|
|
483
494
|
|
|
484
495
|
There are no markers to answer — the human either:
|
|
485
496
|
|
|
486
497
|
- **Accepts the suggested defaults**: runs a clean `gtd step` at the answer
|
|
487
|
-
gate. An empty `gtd(human): grilling` turn plus routing `gtd:
|
|
488
|
-
automatically
|
|
498
|
+
gate. An empty `gtd(human): grilling` turn plus routing `gtd: architecting`
|
|
499
|
+
lands automatically — `.gtd/ARCHITECTURE.md` is seeded from the converged
|
|
500
|
+
`.gtd/TODO.md` content and `.gtd/TODO.md` is deleted, in that one commit.
|
|
489
501
|
- **Edits `.gtd/TODO.md`** with real answers, then runs `gtd step`, which
|
|
490
502
|
captures the edit as a fresh `gtd(human): grilling` turn and hands it back to
|
|
491
503
|
the agent for another round.
|
|
492
504
|
|
|
505
|
+
Technical architecting works exactly the same way, one file later: the agent
|
|
506
|
+
develops `.gtd/ARCHITECTURE.md` into a concrete **technical** plan — file/module
|
|
507
|
+
structure, data model, tech-stack choices — and the human answers or accepts
|
|
508
|
+
defaults at the `architecting` gate. Accepting converges to `gtd: grilled` and
|
|
509
|
+
`gtd next` emits the decompose prompt (which now reads `.gtd/ARCHITECTURE.md`).
|
|
510
|
+
|
|
511
|
+
**Escape hatch for already-technical input:** if the human's initial dirty tree
|
|
512
|
+
already contains `.gtd/ARCHITECTURE.md` (their own technical sketch), `gtd step`
|
|
513
|
+
captures the entry turn as `gtd(human): architecting` directly, skipping product
|
|
514
|
+
grilling for that cycle entirely — no CLI flag needed, it's driven purely by
|
|
515
|
+
which steering file is present.
|
|
516
|
+
|
|
493
517
|
### Build lifecycle: budgets
|
|
494
518
|
|
|
495
519
|
Once decomposed, `.gtd/` holds ordered work packages. `gtd next` at
|
|
@@ -525,24 +549,26 @@ the threshold simply closes the package as usual.) Setting
|
|
|
525
549
|
`agenticReview: false` force-approves every package immediately.
|
|
526
550
|
|
|
527
551
|
A **do-nothing agent invocation** — `gtd step-agent` on a clean tree at ANY
|
|
528
|
-
agent-awaited rest whose move is a file artifact (`grilling`, `
|
|
529
|
-
`building`, `fixing`, `agentic-review`, `review`,
|
|
530
|
-
`.gtd/SQUASH_MSG.md` still holds the unmodified template
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
552
|
+
agent-awaited rest whose move is a file artifact (`grilling`, `architecting`,
|
|
553
|
+
`grilled`, `building`, `fixing`, `agentic-review`, `review`, `squashing` while
|
|
554
|
+
`.gtd/SQUASH_MSG.md` still holds the unmodified template, `learning` while
|
|
555
|
+
`.gtd/LEARNINGS.md` still holds the unmodified template, and `learning-apply`
|
|
556
|
+
unconditionally) — is inert: zero commits, no state consumed; `gtd next`
|
|
557
|
+
re-emits the same prompt. This is load-bearing for the loop protocol, whose
|
|
558
|
+
every iteration opens with `gtd step-agent` before the agent has acted: without
|
|
559
|
+
the guard that opening beat would author junk empty turns — and worse, consume
|
|
560
|
+
workflow state (an empty decompose turn would delete `.gtd/ARCHITECTURE.md` with
|
|
561
|
+
no packages written; an empty squashing turn would squash the cycle under the
|
|
562
|
+
placeholder template). The same guards hold at the classification layer for
|
|
563
|
+
histories that already carry such turns: a `gtd(agent): grilled` HEAD only
|
|
564
|
+
routes to `gtd: planning` when packages exist, a `gtd(agent): review` HEAD only
|
|
565
|
+
routes to `gtd: awaiting review` when `.gtd/REVIEW.md` exists, and a squashing
|
|
566
|
+
(or learning) turn only proceeds once its template has been overwritten. The one
|
|
567
|
+
deliberate exception is `health-fixing`, whose empty turn is meaningful (the
|
|
568
|
+
failure may have been environmental — the machine removes `.gtd/HEALTH.md` and
|
|
569
|
+
re-tests). Human gates are unaffected: an empty **human** turn stays a signal
|
|
570
|
+
(accept-defaults at grilling/architecting, clean approval at review,
|
|
571
|
+
accept-the-draft-as-is at the learning review gate).
|
|
546
572
|
|
|
547
573
|
### Human review gate
|
|
548
574
|
|
|
@@ -586,22 +612,47 @@ their commit message is discarded; linked `git worktree` checkouts are
|
|
|
586
612
|
unsupported. If you switch branches mid-review, gtd refuses to touch the foreign
|
|
587
613
|
branch and prints the manual recovery command.
|
|
588
614
|
|
|
615
|
+
### Learning
|
|
616
|
+
|
|
617
|
+
With `learning: true` (the default), `gtd: done` (or the health-fix path's green
|
|
618
|
+
re-test) is **not** a rest — the chain continues straight to
|
|
619
|
+
`gtd: learning template`, writing and committing a `.gtd/LEARNINGS.md` template,
|
|
620
|
+
running _before_ the squash decision so it still sees the pre-squash history.
|
|
621
|
+
`gtd next` then emits the learning prompt: the agent walks the cycle's test
|
|
622
|
+
failures, review feedback, and health-check rounds, keeps only
|
|
623
|
+
durable/generalizable lessons, and overwrites `.gtd/LEARNINGS.md` with them.
|
|
624
|
+
Once `gtd step-agent` captures that draft (`gtd(agent): learning`), it rests at
|
|
625
|
+
**await-learning-review** for a human — who either accepts the draft as-is (an
|
|
626
|
+
empty turn) or edits it; there is no reject path, so the very next `gtd step`
|
|
627
|
+
always proceeds (`gtd(human): learning` → `gtd: learning approved`), resting at
|
|
628
|
+
**learning-apply** for the agent. The agent integrates the approved learnings
|
|
629
|
+
into the project's own docs (`CLAUDE.md`/`AGENTS.md`/wherever fits, its
|
|
630
|
+
judgment); its turn (`gtd(agent): learning-apply`) removes `.gtd/LEARNINGS.md`
|
|
631
|
+
and lands at `gtd: learning applied`, which then runs the same squash decision
|
|
632
|
+
`gtd: done` runs today. With `learning: false`, `gtd: done` behaves exactly as
|
|
633
|
+
it does without this section: no `.gtd/LEARNINGS.md` is ever written. Learning
|
|
634
|
+
and squash are independent flags — either can be on without the other.
|
|
635
|
+
|
|
589
636
|
### Squash
|
|
590
637
|
|
|
591
|
-
With `squash: true` (the default), `gtd: done`
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
638
|
+
With `squash: true` (the default), `gtd: done` (or, once learning has run,
|
|
639
|
+
`gtd: learning applied`) is **not** a rest — the same chain continues straight
|
|
640
|
+
to `gtd: squash template`, writing and committing a `.gtd/SQUASH_MSG.md`
|
|
641
|
+
template. `gtd next` then emits the squashing prompt: the agent overwrites
|
|
642
|
+
`.gtd/SQUASH_MSG.md` with a real conventional-commits message (drawing on
|
|
643
|
+
grilling- and architecting-round decisions from history) and finishes its turn.
|
|
596
644
|
`gtd step-agent` then performs the squash itself: `git reset --soft <base>` +
|
|
597
645
|
`git commit`, collapsing every intermediate `gtd: *` commit of the cycle into
|
|
598
|
-
one — including any review-feedback detours
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
the
|
|
603
|
-
|
|
604
|
-
|
|
646
|
+
one — including any review-feedback detours, and the learning phase's own
|
|
647
|
+
commits if learning ran: the squash base is the cycle's ORIGINAL start (the
|
|
648
|
+
first grilling or, via the escape hatch, architecting turn since the previous
|
|
649
|
+
`gtd: done` boundary, or the `gtd: reviewing <hash>` anchor for an ad-hoc review
|
|
650
|
+
cycle), not the most recent re-grilling round — the collapse folds the whole
|
|
651
|
+
cycle into one, using the overwritten message's content verbatim (turn position,
|
|
652
|
+
not message content, triggers the squash). Doc edits made during
|
|
653
|
+
`learning-apply` survive in the squashed tree, not as their own commit. With
|
|
654
|
+
`squash: false`, `gtd: done` (or `gtd: learning applied`) is the resting
|
|
655
|
+
boundary and no template is ever written.
|
|
605
656
|
|
|
606
657
|
### Health check
|
|
607
658
|
|
|
@@ -610,9 +661,9 @@ runs `testCommand` as a health check rather than settling immediately. Green
|
|
|
610
661
|
settles idle with zero commits. Red below `fixAttemptCap` writes
|
|
611
662
|
`.gtd/HEALTH.md` and rests at **Health Fixing** for the agent; the fixer's own
|
|
612
663
|
turn (`gtd(agent): health-fixing`) removes `.gtd/HEALTH.md` and re-tests in the
|
|
613
|
-
same chain — a green re-test continues to
|
|
614
|
-
repeats the health-fix loop; red at the cap writes
|
|
615
|
-
escalates.
|
|
664
|
+
same chain — a green re-test continues to learning (if enabled), then squash (if
|
|
665
|
+
enabled), or idle; red repeats the health-fix loop; red at the cap writes
|
|
666
|
+
`.gtd/ERRORS.md` and escalates.
|
|
616
667
|
|
|
617
668
|
### Escalate / budget reset
|
|
618
669
|
|
|
@@ -624,24 +675,29 @@ fix-attempt budget to zero.
|
|
|
624
675
|
|
|
625
676
|
## States & subjects: overview table
|
|
626
677
|
|
|
627
|
-
| State
|
|
628
|
-
|
|
|
629
|
-
| `grilling`
|
|
630
|
-
| `
|
|
631
|
-
| `
|
|
632
|
-
| `
|
|
633
|
-
| `
|
|
634
|
-
| `
|
|
635
|
-
| `
|
|
636
|
-
| `
|
|
637
|
-
| `
|
|
638
|
-
| `
|
|
639
|
-
| `
|
|
640
|
-
| `
|
|
641
|
-
| `
|
|
642
|
-
| `
|
|
643
|
-
| `
|
|
644
|
-
| `
|
|
678
|
+
| State | Awaits | Turn/routing subject at rest |
|
|
679
|
+
| ----------------------- | -------------- | ---------------------------------------------------------------- |
|
|
680
|
+
| `grilling` | human or agent | `gtd(human): grilling` / `gtd(agent): grilling` |
|
|
681
|
+
| `architecting` | human or agent | `gtd: architecting` / `gtd(agent): architecting` |
|
|
682
|
+
| `grilled` | agent | `gtd: grilled` |
|
|
683
|
+
| `planning` | agent | `.gtd/` modified |
|
|
684
|
+
| `building` | agent | `gtd: planning` / `gtd: package done` |
|
|
685
|
+
| `testing` | — (edge-only) | mid-chain only |
|
|
686
|
+
| `fixing` | agent | `gtd: errors` |
|
|
687
|
+
| `escalate` | human | `.gtd/ERRORS.md` present |
|
|
688
|
+
| `agentic-review` | agent | `gtd: tests green` |
|
|
689
|
+
| `close-package` | — (edge-only) | mid-chain only |
|
|
690
|
+
| `review` | agent | `gtd: package done` (no more packages) / `gtd: reviewing <hash>` |
|
|
691
|
+
| `await-review` | human | `gtd: awaiting review` |
|
|
692
|
+
| `done` | — (edge-only) | `gtd: done` |
|
|
693
|
+
| `learning` | agent | `gtd: learning template` |
|
|
694
|
+
| `await-learning-review` | human | `gtd: learning drafted` |
|
|
695
|
+
| `learning-apply` | agent | `gtd: learning approved` |
|
|
696
|
+
| `learning-applied` | — (edge-only) | `gtd: learning applied` |
|
|
697
|
+
| `squashing` | agent | `gtd: squash template` |
|
|
698
|
+
| `idle` | human | no steering files, green health check |
|
|
699
|
+
| `health-check` | — (edge-only) | mid-chain only |
|
|
700
|
+
| `health-fixing` | agent | `.gtd/HEALTH.md` present |
|
|
645
701
|
|
|
646
702
|
See [STATES.md](STATES.md) for the full precedence ladder, the counter folds,
|
|
647
703
|
and every illegal steering-file combination.
|
|
@@ -674,18 +730,25 @@ built-in defaults apply. Supported filenames (searched in this order):
|
|
|
674
730
|
- **`agenticReview`** (boolean, default `true`) — kill-switch for the
|
|
675
731
|
per-package Agentic Review gate. Set `false` to force-approve every package
|
|
676
732
|
and proceed directly to human review.
|
|
677
|
-
- **`squash`** (boolean, default `true`) — after `gtd: done
|
|
678
|
-
cycle's `gtd: *` commits into
|
|
679
|
-
`false` to keep the granular
|
|
733
|
+
- **`squash`** (boolean, default `true`) — after `gtd: done` (or, once learning
|
|
734
|
+
has run, `gtd: learning applied`), collapse the cycle's `gtd: *` commits into
|
|
735
|
+
a single conventional-commits commit. Set `false` to keep the granular
|
|
736
|
+
history.
|
|
737
|
+
- **`learning`** (boolean, default `true`) — after `gtd: done` (or the
|
|
738
|
+
health-fix path's green re-test), distill durable lessons from the cycle into
|
|
739
|
+
`.gtd/LEARNINGS.md`, have a human review them, then integrate them into the
|
|
740
|
+
project's own docs before the squash decision runs. Set `false` to skip the
|
|
741
|
+
phase entirely — independent of `squash`.
|
|
680
742
|
- **`models`** — model selection for the subagent-spawning states:
|
|
681
743
|
- `planning` — high-reasoning tier (default `claude-opus-4-8`), used by
|
|
682
|
-
`decompose` (the `grilled`/`planning` states), `grilling`, `
|
|
683
|
-
and `clean` (the `review`/`squashing
|
|
744
|
+
`decompose` (the `grilled`/`planning` states), `grilling`, `architecting`,
|
|
745
|
+
`agentic-review`, and `clean` (the `review`/`squashing`/`learning`/
|
|
746
|
+
`learning-apply` states).
|
|
684
747
|
- `execution` — everyday tier (default `claude-sonnet-4-8`), used by
|
|
685
748
|
`building` and `fixing`.
|
|
686
749
|
- `states.*` — per-state overrides keyed by `decompose`, `grilling`,
|
|
687
|
-
`building`, `fixing`, `agentic-review`, `clean`. Unknown
|
|
688
|
-
**rejected**.
|
|
750
|
+
`architecting`, `building`, `fixing`, `agentic-review`, `clean`. Unknown
|
|
751
|
+
`states` keys are **rejected**.
|
|
689
752
|
- **`$schema`** (string, optional) — stripped before validation, so it never
|
|
690
753
|
counts as an unknown key. Point it at the published schema for editor-backed
|
|
691
754
|
autocompletion. A `schema.json` is generated from the config schema at build
|
|
@@ -739,6 +802,7 @@ fixAttemptCap: 3
|
|
|
739
802
|
reviewThreshold: 3
|
|
740
803
|
agenticReview: true
|
|
741
804
|
squash: true
|
|
805
|
+
learning: true
|
|
742
806
|
models:
|
|
743
807
|
planning: claude-opus-4-8
|
|
744
808
|
execution: claude-sonnet-4-8
|
|
@@ -772,7 +836,7 @@ models:
|
|
|
772
836
|
### Decompose
|
|
773
837
|
|
|
774
838
|
The Grilled/Planning states spawn a planning-model subagent that breaks
|
|
775
|
-
`.gtd/
|
|
839
|
+
`.gtd/ARCHITECTURE.md` into executable work packages under `.gtd/`:
|
|
776
840
|
|
|
777
841
|
```
|
|
778
842
|
.gtd/
|