@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 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, decompose it into work
9
- packages, execute with parallel subagents, test, agentically review each
10
- package, and finally walk a human through a review — squashing the whole cycle
11
- into one conventional-commits commit at the end.
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 16 states, plus which actor (human or agent) is awaited there. A
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`), work
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/SQUASH_MSG.md`).
33
- One rule follows for every agent in the loop: **never touch `.gtd/`** except the
34
- single file a prompt explicitly grants. A `TODO.md` or `REVIEW.md` at the
35
- repository root is the project's own file — gtd never reads, consumes, or
36
- deletes it. (Corollary: don't gitignore `.gtd/` — the workflow commits its state
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`, annotating
59
- `.gtd/REVIEW.md`, fixing code) and then running `gtd step` to capture the edit
60
- as their turn and hand control back to the agent side of the loop.
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: grilled
169
- state: grilled
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": "grilled",
302
+ "state": "architecting",
299
303
  "actions": ["capture the human turn as \"gtd(human): grilling\""],
300
- "commits": ["gtd(human): grilling", "gtd: grilled"]
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 **16 states**: `grilling`, `grilled`,
432
- `planning`, `building`, `testing`, `fixing`, `escalate`, `agentic-review`,
433
- `close-package`, `review`, `await-review`, `done`, `squashing`, `idle`,
434
- `health-check`, `health-fixing`. Each state has a fixed awaited actor (see
435
- `awaitedActor` in `src/Machine.ts`): `idle`, `escalate`, and `await-review`
436
- await the **human**; every other state awaits the **agent**.
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: grilled`, `gtd: planning`, `gtd: tests green`,
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 one turn**,
481
- proposing a **suggested default** for every open question, and leaves
482
- `.gtd/TODO.md` uncommitted for `gtd(agent): grilling`.
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: grilled` lands
488
- automatically, and `gtd next` emits the decompose prompt.
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`, `grilled`,
529
- `building`, `fixing`, `agentic-review`, `review`, and `squashing` while
530
- `.gtd/SQUASH_MSG.md` still holds the unmodified template) is inert: zero
531
- commits, no state consumed; `gtd next` re-emits the same prompt. This is
532
- load-bearing for the loop protocol, whose every iteration opens with
533
- `gtd step-agent` before the agent has acted: without the guard that opening beat
534
- would author junk empty turns and worse, consume workflow state (an empty
535
- decompose turn would delete `.gtd/TODO.md` with no packages written; an empty
536
- squashing turn would squash the cycle under the placeholder template). The same
537
- guards hold at the classification layer for histories that already carry such
538
- turns: a `gtd(agent): grilled` HEAD only routes to `gtd: planning` when packages
539
- exist, a `gtd(agent): review` HEAD only routes to `gtd: awaiting review` when
540
- `.gtd/REVIEW.md` exists, and a squashing turn only squashes once the template
541
- has been overwritten. The one deliberate exception is `health-fixing`, whose
542
- empty turn is meaningful (the failure may have been environmental the machine
543
- removes `.gtd/HEALTH.md` and re-tests). Human gates are unaffected: an empty
544
- **human** turn stays a signal (accept-defaults at grilling, clean approval at
545
- review).
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` is **not** a rest — the same
592
- chain continues straight to `gtd: squash template`, writing and committing a
593
- `.gtd/SQUASH_MSG.md` template. `gtd next` then emits the squashing prompt: the
594
- agent overwrites `.gtd/SQUASH_MSG.md` with a real conventional-commits message
595
- (drawing on grilling-round decisions from history) and finishes its turn.
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: the squash base is the cycle's
599
- ORIGINAL start (the first grilling run since the previous `gtd: done` boundary,
600
- or the `gtd: reviewing <hash>` anchor for an ad-hoc review cycle), not the most
601
- recent re-grilling round the collapse folds the whole cycle into one, using
602
- the overwritten message's content verbatim (turn position, not message content,
603
- triggers the squash). With `squash: false`, `gtd: done` is the resting boundary
604
- and no template is ever written.
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 squash (if enabled) or idle; red
614
- repeats the health-fix loop; red at the cap writes `.gtd/ERRORS.md` and
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 | Awaits | Turn/routing subject at rest |
628
- | ---------------- | -------------- | ---------------------------------------------------------------- |
629
- | `grilling` | human or agent | `gtd(human): grilling` / `gtd(agent): grilling` |
630
- | `grilled` | agent | `gtd: grilled` |
631
- | `planning` | agent | `.gtd/` modified |
632
- | `building` | agent | `gtd: planning` / `gtd: package done` |
633
- | `testing` | — (edge-only) | mid-chain only |
634
- | `fixing` | agent | `gtd: errors` |
635
- | `escalate` | human | `.gtd/ERRORS.md` present |
636
- | `agentic-review` | agent | `gtd: tests green` |
637
- | `close-package` | — (edge-only) | mid-chain only |
638
- | `review` | agent | `gtd: package done` (no more packages) / `gtd: reviewing <hash>` |
639
- | `await-review` | human | `gtd: awaiting review` |
640
- | `done` | — (edge-only) | `gtd: done` |
641
- | `squashing` | agent | `gtd: squash template` |
642
- | `idle` | human | no steering files, green health check |
643
- | `health-check` | — (edge-only) | mid-chain only |
644
- | `health-fixing` | agent | `.gtd/HEALTH.md` present |
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`, collapse the
678
- cycle's `gtd: *` commits into a single conventional-commits commit. Set
679
- `false` to keep the granular history.
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`, `agentic-review`,
683
- and `clean` (the `review`/`squashing` states).
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 `states` keys are
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/TODO.md` into executable work packages under `.gtd/`:
839
+ `.gtd/ARCHITECTURE.md` into executable work packages under `.gtd/`:
776
840
 
777
841
  ```
778
842
  .gtd/