@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.
- package/bin/forge.mjs +107 -107
- package/bin/forgekit.mjs +83 -83
- package/bin/review.mjs +81 -81
- package/package.json +1 -1
- package/scripts/prepack.mjs +78 -78
- package/scripts/run-tests.mjs +50 -50
- package/src/adr.mjs +236 -236
- package/src/adr.test.mjs +170 -170
- package/src/change.mjs +327 -234
- package/src/change.test.mjs +145 -83
- package/src/cleanup-sessions.mjs +84 -84
- package/src/config.mjs +103 -103
- package/src/defer.mjs +75 -75
- package/src/doctor.mjs +350 -341
- package/src/doctor.test.mjs +114 -114
- package/src/init.mjs +680 -621
- package/src/install.mjs +815 -815
- package/src/install.test.mjs +180 -180
- package/src/integrity-check.mjs +60 -60
- package/src/integrity.mjs +682 -682
- package/src/integrity.test.mjs +566 -566
- package/src/lib.mjs +143 -143
- package/src/models.defaults.json +41 -41
- package/src/new-session.mjs +99 -99
- package/src/openspec-overlays/README.md +19 -19
- package/src/openspec-overlays/openspec-apply-change-footer.md +14 -14
- package/src/openspec-overlays/opsx-apply-completion-step.md +1 -1
- package/src/openspec-overlays/opsx-apply-implement-step.md +11 -11
- package/src/paths.mjs +92 -92
- package/src/plan-engine.mjs +321 -278
- package/src/plan-engine.test.mjs +447 -283
- package/src/preferences.defaults.json +78 -78
- package/src/preferences.mjs +438 -438
- package/src/preferences.test.mjs +174 -174
- package/src/record-evidence.mjs +204 -204
- package/src/resolve-model.mjs +312 -312
- package/src/resolve-model.test.mjs +194 -194
- package/src/review/cli.test.mjs +117 -117
- package/src/review/export.mjs +172 -172
- package/src/review/export.test.mjs +197 -197
- package/src/review/fixtures/valid-review.json +42 -42
- package/src/review/lib.mjs +894 -894
- package/src/review/lib.test.mjs +266 -266
- package/src/review/schema.json +196 -196
- package/src/review/signals.test.mjs +62 -62
- package/src/score-cli.mjs +68 -68
- package/src/score.mjs +568 -568
- package/src/score.test.mjs +366 -366
- package/src/session-reminder.mjs +207 -207
- package/src/session-status.mjs +70 -70
- package/src/set-models.mjs +186 -186
- package/src/set-phase.mjs +205 -205
- package/src/set-prefs.mjs +294 -294
- package/src/specs-sync.mjs +234 -0
- package/src/specs-sync.test.mjs +114 -0
- package/src/spine.mjs +93 -93
- package/src/triage-prompt.mjs +175 -175
- package/src/triage-prompt.test.mjs +50 -50
- package/src/vendor-openspec-overlays.mjs +176 -176
- package/src/vendor-openspec-overlays.test.mjs +62 -62
- package/vendor/skills/archive-to-adr/SKILL.md +149 -149
- package/vendor/skills/forge/SKILL.md +136 -136
- package/vendor/skills/forge/docs/forge.md +650 -647
- package/vendor/skills/forge/phases/brainstorm.md +23 -23
- package/vendor/skills/forge/phases/finish.md +90 -87
- package/vendor/skills/forge/phases/implement.md +77 -77
- package/vendor/skills/forge/phases/plan-openspec.md +60 -60
- package/vendor/skills/forge/phases/plan-specs.md +163 -117
- package/vendor/skills/forge/phases/review.md +25 -25
- package/vendor/skills/forge/phases/verify.md +124 -124
- package/vendor/skills/forge/references/forge-layout.md +85 -85
- package/vendor/skills/forge/references/pace.md +115 -115
- package/vendor/skills/forge/references/plan-routing.md +52 -51
- package/vendor/skills/forge/references/runtime-integrity.md +232 -232
- package/vendor/skills/forge/references/substantial-work.md +37 -37
- package/vendor/skills/forge/references/test-evidence.md +30 -30
- package/vendor/skills/forge/references/test-strategy.md +68 -68
- package/vendor/skills/forge/skills/subagent-driven-development/SKILL.md +87 -87
- package/vendor/skills/forge/subagents/final-reviewer-prompt.md +56 -56
- package/vendor/skills/forge/subagents/implementer-prompt.md +38 -38
- package/vendor/skills/git-resolve-adr-conflict/SKILL.md +132 -132
- package/vendor/skills/thorough-code-review/SKILL.md +290 -290
- package/vendor/skills/thorough-code-review/examples.md +133 -133
- package/vendor/skills/thorough-code-review/reference/accepted-risks.md +26 -26
- package/vendor/skills/thorough-code-review/reference/lenses.md +96 -96
- package/vendor/skills/thorough-code-review/reference/phase1-scout.md +62 -62
- package/vendor/skills/thorough-code-review/reference/phase2-skeptic.md +105 -105
- package/vendor/skills/thorough-code-review/reference/report-schema.json +222 -222
- package/vendor/skills/thorough-code-review/reference/report-template.md +115 -115
- package/vendor/skills/thorough-code-review/reference/severity-rubric.md +49 -49
- package/vendor/skills/thorough-code-review/reference/signals-preflight.md +55 -55
- package/vendor/templates/adr/README.md +7 -7
- package/vendor/templates/adr/decisions.md +141 -141
- package/vendor/templates/adr/hooks/check-pending-adrs.mjs +74 -74
- package/vendor/templates/adr/hooks/check-pending-adrs.sh +3 -3
- package/vendor/templates/adr/hooks/openspec-archive-agent-message.mjs +52 -52
- package/vendor/templates/adr/hooks/openspec-archive-agent-message.sh +3 -3
- package/vendor/templates/project/claude/commands/forge-apply.md +75 -75
- package/vendor/templates/project/claude/commands/forge-brainstorm.md +7 -7
- package/vendor/templates/project/claude/commands/forge-build.md +17 -17
- package/vendor/templates/project/claude/commands/forge-plan.md +12 -12
- package/vendor/templates/project/claude/commands/forge-skip.md +14 -14
- package/vendor/templates/project/claude/commands/forge-status.md +16 -16
- package/vendor/templates/project/claude/commands/forge.md +16 -16
- package/vendor/templates/project/claude/hooks/forge-prompt-hook.mjs +73 -73
- package/vendor/templates/project/claude/hooks/forge-session-start.mjs +19 -19
- package/vendor/templates/project/claude/hooks/forge-triage-hook.mjs +77 -77
- package/vendor/templates/project/cursor/commands/forge-apply.md +75 -75
- package/vendor/templates/project/cursor/commands/forge-brainstorm.md +10 -10
- package/vendor/templates/project/cursor/commands/forge-build.md +17 -17
- package/vendor/templates/project/cursor/commands/forge-plan.md +15 -15
- package/vendor/templates/project/cursor/commands/forge-skip.md +14 -14
- package/vendor/templates/project/cursor/commands/forge-status.md +16 -16
- package/vendor/templates/project/cursor/commands/forge.md +16 -16
- package/vendor/templates/project/cursor/hooks/forge-session-start.mjs +30 -30
- 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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
the
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
or
|
|
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.
|