@izkac/forgekit 0.3.12 → 0.3.13

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 (116) hide show
  1. package/bin/forge.mjs +107 -107
  2. package/bin/forgekit.mjs +83 -83
  3. package/bin/review.mjs +81 -81
  4. package/package.json +1 -1
  5. package/scripts/prepack.mjs +78 -78
  6. package/scripts/run-tests.mjs +50 -50
  7. package/src/adr.mjs +236 -236
  8. package/src/adr.test.mjs +170 -170
  9. package/src/change.mjs +327 -234
  10. package/src/change.test.mjs +145 -83
  11. package/src/cleanup-sessions.mjs +84 -84
  12. package/src/config.mjs +103 -103
  13. package/src/defer.mjs +75 -75
  14. package/src/doctor.mjs +350 -341
  15. package/src/doctor.test.mjs +114 -114
  16. package/src/init.mjs +680 -621
  17. package/src/install.mjs +815 -815
  18. package/src/install.test.mjs +180 -180
  19. package/src/integrity-check.mjs +60 -60
  20. package/src/integrity.mjs +682 -682
  21. package/src/integrity.test.mjs +566 -566
  22. package/src/lib.mjs +143 -143
  23. package/src/models.defaults.json +41 -41
  24. package/src/new-session.mjs +99 -99
  25. package/src/openspec-overlays/README.md +19 -19
  26. package/src/openspec-overlays/openspec-apply-change-footer.md +14 -14
  27. package/src/openspec-overlays/opsx-apply-completion-step.md +1 -1
  28. package/src/openspec-overlays/opsx-apply-implement-step.md +11 -11
  29. package/src/paths.mjs +92 -92
  30. package/src/plan-engine.mjs +321 -278
  31. package/src/plan-engine.test.mjs +447 -283
  32. package/src/preferences.defaults.json +78 -78
  33. package/src/preferences.mjs +438 -438
  34. package/src/preferences.test.mjs +174 -174
  35. package/src/record-evidence.mjs +204 -204
  36. package/src/resolve-model.mjs +312 -312
  37. package/src/resolve-model.test.mjs +194 -194
  38. package/src/review/cli.test.mjs +117 -117
  39. package/src/review/export.mjs +172 -172
  40. package/src/review/export.test.mjs +197 -197
  41. package/src/review/fixtures/valid-review.json +42 -42
  42. package/src/review/lib.mjs +894 -894
  43. package/src/review/lib.test.mjs +266 -266
  44. package/src/review/schema.json +196 -196
  45. package/src/review/signals.test.mjs +62 -62
  46. package/src/score-cli.mjs +68 -68
  47. package/src/score.mjs +568 -568
  48. package/src/score.test.mjs +366 -366
  49. package/src/session-reminder.mjs +207 -207
  50. package/src/session-status.mjs +70 -70
  51. package/src/set-models.mjs +186 -186
  52. package/src/set-phase.mjs +205 -205
  53. package/src/set-prefs.mjs +294 -294
  54. package/src/specs-sync.mjs +234 -0
  55. package/src/specs-sync.test.mjs +114 -0
  56. package/src/spine.mjs +93 -93
  57. package/src/triage-prompt.mjs +175 -175
  58. package/src/triage-prompt.test.mjs +50 -50
  59. package/src/vendor-openspec-overlays.mjs +176 -176
  60. package/src/vendor-openspec-overlays.test.mjs +62 -62
  61. package/vendor/skills/archive-to-adr/SKILL.md +149 -149
  62. package/vendor/skills/forge/SKILL.md +136 -136
  63. package/vendor/skills/forge/docs/forge.md +650 -647
  64. package/vendor/skills/forge/phases/brainstorm.md +23 -23
  65. package/vendor/skills/forge/phases/finish.md +90 -87
  66. package/vendor/skills/forge/phases/implement.md +77 -77
  67. package/vendor/skills/forge/phases/plan-openspec.md +60 -60
  68. package/vendor/skills/forge/phases/plan-specs.md +163 -117
  69. package/vendor/skills/forge/phases/review.md +25 -25
  70. package/vendor/skills/forge/phases/verify.md +124 -124
  71. package/vendor/skills/forge/references/forge-layout.md +85 -85
  72. package/vendor/skills/forge/references/pace.md +115 -115
  73. package/vendor/skills/forge/references/plan-routing.md +52 -51
  74. package/vendor/skills/forge/references/runtime-integrity.md +232 -232
  75. package/vendor/skills/forge/references/substantial-work.md +37 -37
  76. package/vendor/skills/forge/references/test-evidence.md +30 -30
  77. package/vendor/skills/forge/references/test-strategy.md +68 -68
  78. package/vendor/skills/forge/skills/subagent-driven-development/SKILL.md +87 -87
  79. package/vendor/skills/forge/subagents/final-reviewer-prompt.md +56 -56
  80. package/vendor/skills/forge/subagents/implementer-prompt.md +38 -38
  81. package/vendor/skills/git-resolve-adr-conflict/SKILL.md +132 -132
  82. package/vendor/skills/thorough-code-review/SKILL.md +290 -290
  83. package/vendor/skills/thorough-code-review/examples.md +133 -133
  84. package/vendor/skills/thorough-code-review/reference/accepted-risks.md +26 -26
  85. package/vendor/skills/thorough-code-review/reference/lenses.md +96 -96
  86. package/vendor/skills/thorough-code-review/reference/phase1-scout.md +62 -62
  87. package/vendor/skills/thorough-code-review/reference/phase2-skeptic.md +105 -105
  88. package/vendor/skills/thorough-code-review/reference/report-schema.json +222 -222
  89. package/vendor/skills/thorough-code-review/reference/report-template.md +115 -115
  90. package/vendor/skills/thorough-code-review/reference/severity-rubric.md +49 -49
  91. package/vendor/skills/thorough-code-review/reference/signals-preflight.md +55 -55
  92. package/vendor/templates/adr/README.md +7 -7
  93. package/vendor/templates/adr/decisions.md +141 -141
  94. package/vendor/templates/adr/hooks/check-pending-adrs.mjs +74 -74
  95. package/vendor/templates/adr/hooks/check-pending-adrs.sh +3 -3
  96. package/vendor/templates/adr/hooks/openspec-archive-agent-message.mjs +52 -52
  97. package/vendor/templates/adr/hooks/openspec-archive-agent-message.sh +3 -3
  98. package/vendor/templates/project/claude/commands/forge-apply.md +75 -75
  99. package/vendor/templates/project/claude/commands/forge-brainstorm.md +7 -7
  100. package/vendor/templates/project/claude/commands/forge-build.md +17 -17
  101. package/vendor/templates/project/claude/commands/forge-plan.md +12 -12
  102. package/vendor/templates/project/claude/commands/forge-skip.md +14 -14
  103. package/vendor/templates/project/claude/commands/forge-status.md +16 -16
  104. package/vendor/templates/project/claude/commands/forge.md +16 -16
  105. package/vendor/templates/project/claude/hooks/forge-prompt-hook.mjs +73 -73
  106. package/vendor/templates/project/claude/hooks/forge-session-start.mjs +19 -19
  107. package/vendor/templates/project/claude/hooks/forge-triage-hook.mjs +77 -77
  108. package/vendor/templates/project/cursor/commands/forge-apply.md +75 -75
  109. package/vendor/templates/project/cursor/commands/forge-brainstorm.md +10 -10
  110. package/vendor/templates/project/cursor/commands/forge-build.md +17 -17
  111. package/vendor/templates/project/cursor/commands/forge-plan.md +15 -15
  112. package/vendor/templates/project/cursor/commands/forge-skip.md +14 -14
  113. package/vendor/templates/project/cursor/commands/forge-status.md +16 -16
  114. package/vendor/templates/project/cursor/commands/forge.md +16 -16
  115. package/vendor/templates/project/cursor/hooks/forge-session-start.mjs +30 -30
  116. package/vendor/templates/project/cursor/hooks/forge-session-start.sh +3 -3
@@ -1,85 +1,85 @@
1
- # `.forge/` session layout
2
-
3
- Gitignored scratch space. Only [`.forge/README.md`](../../../.forge/README.md) is committed.
4
-
5
- ## Per-checkout active session
6
-
7
- `.forge/active.json`:
8
-
9
- ```json
10
- {
11
- "sessionId": "2026-06-05T143022Z-my-feature-a3f9b2",
12
- "sessionPath": ".forge/sessions/2026-06-05T143022Z-my-feature-a3f9b2",
13
- "updatedAt": "2026-06-05T14:30:22.000Z"
14
- }
15
- ```
16
-
17
- One active session per checkout (same pattern as `.impeccable/active.json`).
18
- Optional `cursorChatId` on `session.json` when available — not required.
19
-
20
- ## Session directory
21
-
22
- ```
23
- .forge/
24
- active.json
25
- models.local.json ← optional; only after `forge:models -- <lane>`
26
- preferences.local.json ← optional; only after `forge:prefs -- <pace>`
27
- sessions/<session-id>/
28
- session.json
29
- status.json
30
- brainstorm/
31
- notes.md
32
- decisions.md
33
- plan.md ← throwaway plans only
34
- verify-evidence.md ← tier 3 (scope from pace)
35
- tasks/
36
- 01-<slug>/
37
- brief.md
38
- test-evidence.md
39
- task-review.md
40
- reviews/
41
- final-review.md
42
- ```
43
-
44
- Bare `forge models` / `forge:prefs` **print** effective values from committed
45
- defaults and do **not** create the `*.local.json` files. See [pace.md](./pace.md) and
46
- [docs/forge.md](../docs/forge.md) § Checkout-local overrides.
47
-
48
- ## session.json fields
49
-
50
- | Field | Description |
51
- | ----- | ----------- |
52
- | `id` | Session directory name |
53
- | `slug` | Short kebab label |
54
- | `phase` | Current Forge phase |
55
- | `planType` | `openspec` (default for new work), or legacy `throwaway` / `direct` |
56
- | `openspecChange` | Change folder name when `planType: openspec` |
57
- | `forgeSkipped` | `true` if user invoked `/forge:skip` |
58
- | `tasksTotal` / `tasksComplete` | Implementation progress |
59
- | `pace` | Requested pace (`auto` \| `thorough` \| `standard` \| `brisk` \| `lite`) |
60
- | `resolvedPace` | Concrete pace after auto resolve or pin |
61
- | `paceReason` | Why auto picked this pace |
62
- | `paceSignal` | Text used for auto resolve |
63
- | `pacePinned` | `true` when checkout/session set an explicit concrete pace |
64
-
65
- Under `standard` (`review.perTask: per-group`), also write `group-review.md` when an OpenSpec `tasks.md` section completes (see [pace.md](./pace.md)).
66
-
67
- | `preferencesOverride` | Optional session-only prefs patch |
68
- | `createdAt` / `updatedAt` | ISO timestamps |
69
-
70
- ## Retention
71
-
72
- **14 days.** Run `forge cleanup` to prune old or finished sessions.
73
-
74
- ## Scripts
75
-
76
- | Script | Purpose |
77
- | ------ | ------- |
78
- | `forge new <slug>` | Create session + set active (resolves pace; warn-only doctor) |
79
- | `forge status` | Read active session (+ effective pace) |
80
- | `forge prefs` | Get/set pace preferences |
81
- | `forge doctor` | OpenSpec project + CLI check |
82
- | `forge phase <phase>` | Update phase |
83
- | `forge cleanup` | Prune stale sessions |
84
-
85
- Pace matrix: [pace.md](./pace.md).
1
+ # `.forge/` session layout
2
+
3
+ Gitignored scratch space. Only [`.forge/README.md`](../../../.forge/README.md) is committed.
4
+
5
+ ## Per-checkout active session
6
+
7
+ `.forge/active.json`:
8
+
9
+ ```json
10
+ {
11
+ "sessionId": "2026-06-05T143022Z-my-feature-a3f9b2",
12
+ "sessionPath": ".forge/sessions/2026-06-05T143022Z-my-feature-a3f9b2",
13
+ "updatedAt": "2026-06-05T14:30:22.000Z"
14
+ }
15
+ ```
16
+
17
+ One active session per checkout (same pattern as `.impeccable/active.json`).
18
+ Optional `cursorChatId` on `session.json` when available — not required.
19
+
20
+ ## Session directory
21
+
22
+ ```
23
+ .forge/
24
+ active.json
25
+ models.local.json ← optional; only after `forge:models -- <lane>`
26
+ preferences.local.json ← optional; only after `forge:prefs -- <pace>`
27
+ sessions/<session-id>/
28
+ session.json
29
+ status.json
30
+ brainstorm/
31
+ notes.md
32
+ decisions.md
33
+ plan.md ← throwaway plans only
34
+ verify-evidence.md ← tier 3 (scope from pace)
35
+ tasks/
36
+ 01-<slug>/
37
+ brief.md
38
+ test-evidence.md
39
+ task-review.md
40
+ reviews/
41
+ final-review.md
42
+ ```
43
+
44
+ Bare `forge models` / `forge:prefs` **print** effective values from committed
45
+ defaults and do **not** create the `*.local.json` files. See [pace.md](./pace.md) and
46
+ [docs/forge.md](../docs/forge.md) § Checkout-local overrides.
47
+
48
+ ## session.json fields
49
+
50
+ | Field | Description |
51
+ | ----- | ----------- |
52
+ | `id` | Session directory name |
53
+ | `slug` | Short kebab label |
54
+ | `phase` | Current Forge phase |
55
+ | `planType` | `openspec` (default for new work), or legacy `throwaway` / `direct` |
56
+ | `openspecChange` | Change folder name when `planType: openspec` |
57
+ | `forgeSkipped` | `true` if user invoked `/forge:skip` |
58
+ | `tasksTotal` / `tasksComplete` | Implementation progress |
59
+ | `pace` | Requested pace (`auto` \| `thorough` \| `standard` \| `brisk` \| `lite`) |
60
+ | `resolvedPace` | Concrete pace after auto resolve or pin |
61
+ | `paceReason` | Why auto picked this pace |
62
+ | `paceSignal` | Text used for auto resolve |
63
+ | `pacePinned` | `true` when checkout/session set an explicit concrete pace |
64
+
65
+ Under `standard` (`review.perTask: per-group`), also write `group-review.md` when an OpenSpec `tasks.md` section completes (see [pace.md](./pace.md)).
66
+
67
+ | `preferencesOverride` | Optional session-only prefs patch |
68
+ | `createdAt` / `updatedAt` | ISO timestamps |
69
+
70
+ ## Retention
71
+
72
+ **14 days.** Run `forge cleanup` to prune old or finished sessions.
73
+
74
+ ## Scripts
75
+
76
+ | Script | Purpose |
77
+ | ------ | ------- |
78
+ | `forge new <slug>` | Create session + set active (resolves pace; warn-only doctor) |
79
+ | `forge status` | Read active session (+ effective pace) |
80
+ | `forge prefs` | Get/set pace preferences |
81
+ | `forge doctor` | OpenSpec project + CLI check |
82
+ | `forge phase <phase>` | Update phase |
83
+ | `forge cleanup` | Prune stale sessions |
84
+
85
+ Pace matrix: [pace.md](./pace.md).
@@ -1,115 +1,115 @@
1
- # Forge pace (thoroughness)
2
-
3
- Checkout-local preferences control how much review/verify ceremony Forge runs.
4
- Defaults live in `preferences.defaults.json`; optional overrides in
5
- gitignored `.forge/preferences.local.json` (**file appears only after a set**).
6
-
7
- ```bash
8
- forge prefs # print effective — does NOT write a file
9
- forge prefs -- auto|thorough|standard|brisk|lite # WRITE preferences.local.json
10
- forge prefs -- --set review.perTask=always
11
- forge prefs --session-set brisk # this session only (no local file)
12
- forge prefs -- --resolve --signal "add stripe refund"
13
- forge doctor # OpenSpec project + CLI
14
- ```
15
-
16
- Billing lane (orthogonal): `forge models` prints only;
17
- `forge models included|metered` writes `.forge/models.local.json`.
18
- See [docs/forge.md](../docs/forge.md) § Checkout-local overrides.
19
-
20
- ## Announce
21
-
22
- At session start: `Using Forge for this work. Pace: auto → brisk (…)` (use
23
- `resolved` from `forge status` / session reminder).
24
-
25
- ## Presets (effort matrix)
26
-
27
- | Knob | `thorough` | `standard` | `brisk` | `lite` |
28
- |------|------------|------------|---------|--------|
29
- | **review.perTask** | always | per-group | high-risk-only | never\* |
30
- | **review.final** | always | always | high-risk-only | never\* |
31
- | **review.depth** | full | full | spec-only | spec-only |
32
- | **review.maxRounds** | 3 | 2 | 1 | 0 |
33
- | **verify.tier3** | full-workspace | full-workspace | affected-only | audit-tier2-only |
34
- | **models.bias** | default | default | prefer-fast | prefer-fast |
35
- | **brainstorm.depth** | full | full | short (≤2–3 options) | minimal |
36
-
37
- \*Hard floor: money / auth / shared contracts / migrations / secrets **always**
38
- get a per-task review (and final review if the session touched high-risk work),
39
- even under `lite` / `brisk` / mid-group `standard`.
40
-
41
- **`thorough` vs `standard`:** thorough reviews **every task**; standard reviews once per **OpenSpec group** (top-level `##` section in `tasks.md`), except high-risk tasks which still get an immediate per-task review.
42
-
43
- **`auto`:** resolve once at session start from signals; sticky for the session (not a separate knob matrix).
44
-
45
- ## Auto signals (stricter wins)
46
-
47
- 1. money, payment, stripe, billing, auth, oauth, hmac, secret, migration, contract, gdpr → **thorough**
48
- 2. ecosystem, cross-workspace, multi-file, openapi, public API, shared package, **worker**, **job queue**, **pipeline**, **etl**, **service(s)**, **platform**, **orchestration**, **openspec**, **forge:apply**, **harmonization** → **standard**
49
- 3. docs, readme, rename, typo, scaffold, wording, comment, changelog → **lite**
50
- 4. fix, tweak, button, toolbar, style, padding, alignment, copy, label (explicitly small) → **brisk**
51
- 5. else (including empty / unrecognized scope) → **standard** (fail closed — never default to brisk)
52
-
53
- ### Task-count escalation
54
-
55
- When `forge phase … --tasks-total N` sets **N ≥ 15** and the session's
56
- `resolvedPace` is still `brisk` or `lite` (and pace is **not** user-pinned),
57
- Forge escalates the session to **`standard`** with
58
- `paceReason: "escalated: N tasks"`. Slug keywords are a poor proxy for scope;
59
- task count is known at plan time.
60
-
61
- ## Runtime integrity
62
-
63
- Always-on rules (all paces): [runtime-integrity.md](./runtime-integrity.md) —
64
- no stubs / false success, runtime owner required, tests must fail on a no-op,
65
- specs beat narrow tasks, E2E-or-BLOCKED before done. Defaults:
66
- `integrity.forbidStubs`, `integrity.specsBeatNarrowTasks`,
67
- `integrity.requireE2E` in `preferences.defaults.json` (surfaced by `forge status`).
68
-
69
- ## Agent rules by knob
70
-
71
- ### `review.perTask`
72
-
73
- Cadence for the task/group reviewer (name is historical — values cover more than “per task”):
74
-
75
- - `always` — dispatch task reviewer after **every** implementer (`thorough`).
76
- - `per-group` — dispatch one reviewer when an OpenSpec **group** completes (`standard`). A group is a top-level `##` section in `openspec/changes/<name>/tasks.md` (all `- [ ]` items under that heading until the next `##`). Mid-group low-risk tasks get a pace self-check `task-review.md` only. If `tasks.md` has **no** section headings, treat the whole file as one group (review once when all tasks are done). High-risk tasks still get an **immediate** per-task review (hard floor).
77
- - `high-risk-only` — skip reviewer for low-risk tasks; still write a short self-check note in `task-review.md` (`APPROVED (pace: brisk/lite — self-check)`).
78
- - `never` — same as high-risk-only after hard floor (low-risk may self-check only).
79
-
80
- ### `review.final`
81
-
82
- - Skip final reviewer subagent when `never` / `high-risk-only` and session is not high-risk; write `reviews/final-review.md` noting `SKIPPED (pace=…)`.
83
-
84
- ### `review.depth`
85
-
86
- - `spec-only` — task reviewer checks spec compliance + tests evidence; skip broad quality essay.
87
- - `full` — spec then quality (existing task-reviewer prompt).
88
-
89
- ### `review.maxRounds`
90
-
91
- - Cap fix→re-review loops; after the cap, escalate to the human with remaining findings.
92
-
93
- ### `verify.tier3`
94
-
95
- - `full-workspace` — current verify.md behavior.
96
- - `affected-only` — run tests only for workspaces touched by the change (still record `verify-evidence.md`).
97
- - `audit-tier2-only` — audit per-task evidence; do **not** run full suite; note deferred to push/CI in `verify-evidence.md`.
98
-
99
- ### `models.bias`
100
-
101
- - `prefer-fast` — prefer `--tier fast` for implementers when the brief is mechanical; reviewers use `fast` unless high-risk (then `standard`).
102
- - `default` — existing role-based tiers.
103
-
104
- ### `brainstorm.depth`
105
-
106
- - `full` — existing brainstorming skill.
107
- - `short` — at most 2–3 approaches; faster approval.
108
- - `minimal` — confirm intent + one approach; skip long exploration when design is obvious.
109
-
110
- ## Unchanged (all paces)
111
-
112
- - Tier 1 TDD + tier 2 `test-evidence.md` for behavior changes.
113
- - No autonomous git commit/push.
114
- - OpenSpec propose/apply/archive when in Forge.
115
- - `/forge:skip` still exits Forge entirely.
1
+ # Forge pace (thoroughness)
2
+
3
+ Checkout-local preferences control how much review/verify ceremony Forge runs.
4
+ Defaults live in `preferences.defaults.json`; optional overrides in
5
+ gitignored `.forge/preferences.local.json` (**file appears only after a set**).
6
+
7
+ ```bash
8
+ forge prefs # print effective — does NOT write a file
9
+ forge prefs -- auto|thorough|standard|brisk|lite # WRITE preferences.local.json
10
+ forge prefs -- --set review.perTask=always
11
+ forge prefs --session-set brisk # this session only (no local file)
12
+ forge prefs -- --resolve --signal "add stripe refund"
13
+ forge doctor # OpenSpec project + CLI
14
+ ```
15
+
16
+ Billing lane (orthogonal): `forge models` prints only;
17
+ `forge models included|metered` writes `.forge/models.local.json`.
18
+ See [docs/forge.md](../docs/forge.md) § Checkout-local overrides.
19
+
20
+ ## Announce
21
+
22
+ At session start: `Using Forge for this work. Pace: auto → brisk (…)` (use
23
+ `resolved` from `forge status` / session reminder).
24
+
25
+ ## Presets (effort matrix)
26
+
27
+ | Knob | `thorough` | `standard` | `brisk` | `lite` |
28
+ |------|------------|------------|---------|--------|
29
+ | **review.perTask** | always | per-group | high-risk-only | never\* |
30
+ | **review.final** | always | always | high-risk-only | never\* |
31
+ | **review.depth** | full | full | spec-only | spec-only |
32
+ | **review.maxRounds** | 3 | 2 | 1 | 0 |
33
+ | **verify.tier3** | full-workspace | full-workspace | affected-only | audit-tier2-only |
34
+ | **models.bias** | default | default | prefer-fast | prefer-fast |
35
+ | **brainstorm.depth** | full | full | short (≤2–3 options) | minimal |
36
+
37
+ \*Hard floor: money / auth / shared contracts / migrations / secrets **always**
38
+ get a per-task review (and final review if the session touched high-risk work),
39
+ even under `lite` / `brisk` / mid-group `standard`.
40
+
41
+ **`thorough` vs `standard`:** thorough reviews **every task**; standard reviews once per **OpenSpec group** (top-level `##` section in `tasks.md`), except high-risk tasks which still get an immediate per-task review.
42
+
43
+ **`auto`:** resolve once at session start from signals; sticky for the session (not a separate knob matrix).
44
+
45
+ ## Auto signals (stricter wins)
46
+
47
+ 1. money, payment, stripe, billing, auth, oauth, hmac, secret, migration, contract, gdpr → **thorough**
48
+ 2. ecosystem, cross-workspace, multi-file, openapi, public API, shared package, **worker**, **job queue**, **pipeline**, **etl**, **service(s)**, **platform**, **orchestration**, **openspec**, **forge:apply**, **harmonization** → **standard**
49
+ 3. docs, readme, rename, typo, scaffold, wording, comment, changelog → **lite**
50
+ 4. fix, tweak, button, toolbar, style, padding, alignment, copy, label (explicitly small) → **brisk**
51
+ 5. else (including empty / unrecognized scope) → **standard** (fail closed — never default to brisk)
52
+
53
+ ### Task-count escalation
54
+
55
+ When `forge phase … --tasks-total N` sets **N ≥ 15** and the session's
56
+ `resolvedPace` is still `brisk` or `lite` (and pace is **not** user-pinned),
57
+ Forge escalates the session to **`standard`** with
58
+ `paceReason: "escalated: N tasks"`. Slug keywords are a poor proxy for scope;
59
+ task count is known at plan time.
60
+
61
+ ## Runtime integrity
62
+
63
+ Always-on rules (all paces): [runtime-integrity.md](./runtime-integrity.md) —
64
+ no stubs / false success, runtime owner required, tests must fail on a no-op,
65
+ specs beat narrow tasks, E2E-or-BLOCKED before done. Defaults:
66
+ `integrity.forbidStubs`, `integrity.specsBeatNarrowTasks`,
67
+ `integrity.requireE2E` in `preferences.defaults.json` (surfaced by `forge status`).
68
+
69
+ ## Agent rules by knob
70
+
71
+ ### `review.perTask`
72
+
73
+ Cadence for the task/group reviewer (name is historical — values cover more than “per task”):
74
+
75
+ - `always` — dispatch task reviewer after **every** implementer (`thorough`).
76
+ - `per-group` — dispatch one reviewer when an OpenSpec **group** completes (`standard`). A group is a top-level `##` section in `openspec/changes/<name>/tasks.md` (all `- [ ]` items under that heading until the next `##`). Mid-group low-risk tasks get a pace self-check `task-review.md` only. If `tasks.md` has **no** section headings, treat the whole file as one group (review once when all tasks are done). High-risk tasks still get an **immediate** per-task review (hard floor).
77
+ - `high-risk-only` — skip reviewer for low-risk tasks; still write a short self-check note in `task-review.md` (`APPROVED (pace: brisk/lite — self-check)`).
78
+ - `never` — same as high-risk-only after hard floor (low-risk may self-check only).
79
+
80
+ ### `review.final`
81
+
82
+ - Skip final reviewer subagent when `never` / `high-risk-only` and session is not high-risk; write `reviews/final-review.md` noting `SKIPPED (pace=…)`.
83
+
84
+ ### `review.depth`
85
+
86
+ - `spec-only` — task reviewer checks spec compliance + tests evidence; skip broad quality essay.
87
+ - `full` — spec then quality (existing task-reviewer prompt).
88
+
89
+ ### `review.maxRounds`
90
+
91
+ - Cap fix→re-review loops; after the cap, escalate to the human with remaining findings.
92
+
93
+ ### `verify.tier3`
94
+
95
+ - `full-workspace` — current verify.md behavior.
96
+ - `affected-only` — run tests only for workspaces touched by the change (still record `verify-evidence.md`).
97
+ - `audit-tier2-only` — audit per-task evidence; do **not** run full suite; note deferred to push/CI in `verify-evidence.md`.
98
+
99
+ ### `models.bias`
100
+
101
+ - `prefer-fast` — prefer `--tier fast` for implementers when the brief is mechanical; reviewers use `fast` unless high-risk (then `standard`).
102
+ - `default` — existing role-based tiers.
103
+
104
+ ### `brainstorm.depth`
105
+
106
+ - `full` — existing brainstorming skill.
107
+ - `short` — at most 2–3 approaches; faster approval.
108
+ - `minimal` — confirm intent + one approach; skip long exploration when design is obvious.
109
+
110
+ ## Unchanged (all paces)
111
+
112
+ - Tier 1 TDD + tier 2 `test-evidence.md` for behavior changes.
113
+ - No autonomous git commit/push.
114
+ - OpenSpec propose/apply/archive when in Forge.
115
+ - `/forge:skip` still exits Forge entirely.
@@ -1,51 +1,52 @@
1
- # Plan routing — engine from project config
2
-
3
- Forge always produces a tracked change; the **engine** comes from
4
- `.forge/config.json` → `plan.engine` (written by `forge init`):
5
-
6
- | `plan.engine` | Plan phase | Change location |
7
- | ------------- | ---------- | --------------- |
8
- | `openspec` (or config missing + `openspec/config.yaml` present) | [../phases/plan-openspec.md](../phases/plan-openspec.md) | `openspec/changes/<name>/` |
9
- | `specs` | [../phases/plan-specs.md](../phases/plan-specs.md) | `<plan.dir>/changes/<name>/` (default `specs/`) |
10
-
11
- <HARD-GATE>
12
- Do NOT ask the user to choose a plan mode or engine. The engine is project
13
- config, not conversation. After brainstorm approval, proceed directly to the
14
- configured engine's propose flow.
15
- </HARD-GATE>
16
-
17
- ## Rule
18
-
19
- **If work warrants Forge, it warrants a tracked change.** Work that is too
20
- small for a tracked change should **not** enter Forge execute directly or
21
- use `/forge:skip`.
22
-
23
- ## After brainstorm approval
24
-
25
- Follow the phase file for the configured engine — prefix (OpenSpec projects),
26
- propose, set-phase, approval. Do **not** offer throwaway `.forge/.../plan.md`
27
- or direct-from-brainstorm implementation paths.
28
-
29
- ## Engine not configured
30
-
31
- If `.forge/config.json` has no `plan` block and there is no
32
- `openspec/config.yaml`, tell the user to run `forge init` (which offers
33
- OpenSpec setup or the built-in specs engine) do not invent a layout.
34
-
35
- ## Triage alignment
36
-
37
- Triage rules live in [substantial-work.md](./substantial-work.md). Before
38
- bootstrapping a session, confirm the work would produce a tracked change under
39
- the configured engine; when ambiguous, ask one clarifying question.
40
-
41
- ## Legacy plan types
42
-
43
- `planType: throwaway` and `planType: direct` on **existing** sessions may
44
- finish per [../phases/finish.md](../phases/finish.md). Do not start new
45
- sessions with those modes.
46
-
47
- ## Scope growth mid-session
48
-
49
- If implement scope grows beyond the approved change, stop and extend the
50
- current change (or propose a follow-up change) do not fall back to throwaway
51
- or direct planning.
1
+ # Plan routing — engine from project config
2
+
3
+ Forge always produces a tracked change; the **engine** comes from
4
+ `.forge/config.json` → `plan.engine` (written by `forge init`):
5
+
6
+ | `plan.engine` | Plan phase | Change location |
7
+ | ------------- | ---------- | --------------- |
8
+ | `openspec` (or config missing + `openspec/config.yaml` present) | [../phases/plan-openspec.md](../phases/plan-openspec.md) | `openspec/changes/<name>/` |
9
+ | `specs` | [../phases/plan-specs.md](../phases/plan-specs.md) | `<plan.dir>/changes/<name>/` (default `specs/`; set `plan.dir: openspec` to reuse an OpenSpec tree) |
10
+
11
+
12
+ <HARD-GATE>
13
+ Do NOT ask the user to choose a plan mode or engine. The engine is project
14
+ config, not conversation. After brainstorm approval, proceed directly to the
15
+ configured engine's propose flow.
16
+ </HARD-GATE>
17
+
18
+ ## Rule
19
+
20
+ **If work warrants Forge, it warrants a tracked change.** Work that is too
21
+ small for a tracked change should **not** enter Forge — execute directly or
22
+ use `/forge:skip`.
23
+
24
+ ## After brainstorm approval
25
+
26
+ Follow the phase file for the configured engine — prefix (OpenSpec projects),
27
+ propose, set-phase, approval. Do **not** offer throwaway `.forge/.../plan.md`
28
+ or direct-from-brainstorm implementation paths.
29
+
30
+ ## Engine not configured
31
+
32
+ If `.forge/config.json` has no `plan` block and there is no
33
+ `openspec/config.yaml`, tell the user to run `forge init` (which offers
34
+ OpenSpec setup or the built-in specs engine) — do not invent a layout.
35
+
36
+ ## Triage alignment
37
+
38
+ Triage rules live in [substantial-work.md](./substantial-work.md). Before
39
+ bootstrapping a session, confirm the work would produce a tracked change under
40
+ the configured engine; when ambiguous, ask one clarifying question.
41
+
42
+ ## Legacy plan types
43
+
44
+ `planType: throwaway` and `planType: direct` on **existing** sessions may
45
+ finish per [../phases/finish.md](../phases/finish.md). Do not start new
46
+ sessions with those modes.
47
+
48
+ ## Scope growth mid-session
49
+
50
+ If implement scope grows beyond the approved change, stop and extend the
51
+ current change (or propose a follow-up change) — do not fall back to throwaway
52
+ or direct planning.