@izkac/forgekit 0.1.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/bin/forge.mjs +100 -0
- package/bin/forgekit.mjs +84 -0
- package/bin/review.mjs +82 -0
- package/package.json +46 -0
- package/scripts/prepack.mjs +78 -0
- package/scripts/run-tests.mjs +43 -0
- package/src/adr.mjs +236 -0
- package/src/adr.test.mjs +170 -0
- package/src/change.mjs +234 -0
- package/src/change.test.mjs +83 -0
- package/src/cleanup-sessions.mjs +70 -0
- package/src/config.mjs +103 -0
- package/src/defer.mjs +75 -0
- package/src/doctor.mjs +341 -0
- package/src/doctor.test.mjs +114 -0
- package/src/init.mjs +575 -0
- package/src/install.mjs +777 -0
- package/src/install.test.mjs +104 -0
- package/src/integrity-check.mjs +58 -0
- package/src/integrity.mjs +317 -0
- package/src/integrity.test.mjs +296 -0
- package/src/lib/workspaces.mjs +55 -0
- package/src/lib.mjs +138 -0
- package/src/models.defaults.json +41 -0
- package/src/new-session.mjs +82 -0
- package/src/openspec-overlays/README.md +19 -0
- package/src/openspec-overlays/openspec-apply-change-footer.md +14 -0
- package/src/openspec-overlays/opsx-apply-completion-step.md +1 -0
- package/src/openspec-overlays/opsx-apply-implement-step.md +11 -0
- package/src/paths.mjs +92 -0
- package/src/plan-engine.mjs +260 -0
- package/src/plan-engine.test.mjs +245 -0
- package/src/preferences.defaults.json +78 -0
- package/src/preferences.mjs +438 -0
- package/src/preferences.test.mjs +174 -0
- package/src/record-evidence.mjs +204 -0
- package/src/record-evidence.test.mjs +260 -0
- package/src/resolve-model.mjs +312 -0
- package/src/resolve-model.test.mjs +194 -0
- package/src/review/carryforward.mjs +413 -0
- package/src/review/carryforward.test.mjs +587 -0
- package/src/review/cli.test.mjs +117 -0
- package/src/review/export.mjs +172 -0
- package/src/review/export.test.mjs +197 -0
- package/src/review/fixtures/valid-review.json +42 -0
- package/src/review/lib.mjs +894 -0
- package/src/review/lib.test.mjs +266 -0
- package/src/review/merge-tentative.mjs +292 -0
- package/src/review/merge-tentative.test.mjs +363 -0
- package/src/review/new-review.mjs +200 -0
- package/src/review/render.mjs +108 -0
- package/src/review/schema-consistency.test.mjs +83 -0
- package/src/review/schema.json +196 -0
- package/src/review/signals.mjs +144 -0
- package/src/review/signals.test.mjs +62 -0
- package/src/score-cli.mjs +68 -0
- package/src/score.mjs +489 -0
- package/src/score.test.mjs +253 -0
- package/src/session-reminder.mjs +168 -0
- package/src/session-status.mjs +70 -0
- package/src/set-models.mjs +186 -0
- package/src/set-phase.mjs +177 -0
- package/src/set-phase.test.mjs +317 -0
- package/src/set-prefs.mjs +294 -0
- package/src/spine.mjs +91 -0
- package/src/triage-prompt.mjs +175 -0
- package/src/triage-prompt.test.mjs +50 -0
- package/src/vendor-openspec-overlays.mjs +176 -0
- package/src/vendor-openspec-overlays.test.mjs +62 -0
- package/vendor/skills/archive-to-adr/SKILL.md +149 -0
- package/vendor/skills/forge/SKILL.md +136 -0
- package/vendor/skills/forge/phases/brainstorm.md +23 -0
- package/vendor/skills/forge/phases/finish.md +87 -0
- package/vendor/skills/forge/phases/implement.md +76 -0
- package/vendor/skills/forge/phases/plan-openspec.md +40 -0
- package/vendor/skills/forge/phases/plan-specs.md +97 -0
- package/vendor/skills/forge/phases/review.md +25 -0
- package/vendor/skills/forge/phases/verify.md +120 -0
- package/vendor/skills/forge/references/forge-layout.md +85 -0
- package/vendor/skills/forge/references/pace.md +115 -0
- package/vendor/skills/forge/references/plan-routing.md +51 -0
- package/vendor/skills/forge/references/runtime-integrity.md +157 -0
- package/vendor/skills/forge/references/substantial-work.md +37 -0
- package/vendor/skills/forge/references/tdd-core.md +29 -0
- package/vendor/skills/forge/references/test-evidence.md +30 -0
- package/vendor/skills/forge/references/test-strategy.md +68 -0
- package/vendor/skills/forge/skills/NOTICE.md +17 -0
- package/vendor/skills/forge/skills/brainstorming/SKILL.md +120 -0
- package/vendor/skills/forge/skills/requesting-code-review/SKILL.md +67 -0
- package/vendor/skills/forge/skills/requesting-code-review/code-reviewer.md +146 -0
- package/vendor/skills/forge/skills/subagent-driven-development/SKILL.md +87 -0
- package/vendor/skills/forge/skills/systematic-debugging/SKILL.md +234 -0
- package/vendor/skills/forge/skills/systematic-debugging/condition-based-waiting.md +115 -0
- package/vendor/skills/forge/skills/systematic-debugging/defense-in-depth.md +122 -0
- package/vendor/skills/forge/skills/systematic-debugging/find-polluter.sh +63 -0
- package/vendor/skills/forge/skills/systematic-debugging/root-cause-tracing.md +169 -0
- package/vendor/skills/forge/skills/test-driven-development/SKILL.md +290 -0
- package/vendor/skills/forge/skills/test-driven-development/testing-anti-patterns.md +299 -0
- package/vendor/skills/forge/skills/verification-before-completion/SKILL.md +59 -0
- package/vendor/skills/forge/subagents/final-reviewer-prompt.md +53 -0
- package/vendor/skills/forge/subagents/implementer-prompt.md +38 -0
- package/vendor/skills/forge/subagents/task-reviewer-prompt.md +61 -0
- package/vendor/skills/git-resolve-adr-conflict/SKILL.md +132 -0
- package/vendor/skills/thorough-code-review/SKILL.md +290 -0
- package/vendor/skills/thorough-code-review/examples/accepted-risks-janus.md +32 -0
- package/vendor/skills/thorough-code-review/examples.md +133 -0
- package/vendor/skills/thorough-code-review/reference/accepted-risks.md +26 -0
- package/vendor/skills/thorough-code-review/reference/lenses.md +96 -0
- package/vendor/skills/thorough-code-review/reference/phase1-scout.md +62 -0
- package/vendor/skills/thorough-code-review/reference/phase1c-coverage.md +44 -0
- package/vendor/skills/thorough-code-review/reference/phase2-skeptic.md +105 -0
- package/vendor/skills/thorough-code-review/reference/report-schema.json +222 -0
- package/vendor/skills/thorough-code-review/reference/report-template.md +115 -0
- package/vendor/skills/thorough-code-review/reference/severity-rubric.md +49 -0
- package/vendor/skills/thorough-code-review/reference/signals-preflight.md +55 -0
- package/vendor/templates/adr/README.md +7 -0
- package/vendor/templates/adr/decisions.md +141 -0
- package/vendor/templates/adr/hooks/check-pending-adrs.mjs +74 -0
- package/vendor/templates/adr/hooks/check-pending-adrs.sh +3 -0
- package/vendor/templates/adr/hooks/openspec-archive-agent-message.mjs +52 -0
- package/vendor/templates/adr/hooks/openspec-archive-agent-message.sh +3 -0
- package/vendor/templates/project/claude/commands/forge-apply.md +75 -0
- package/vendor/templates/project/claude/commands/forge-brainstorm.md +7 -0
- package/vendor/templates/project/claude/commands/forge-build.md +17 -0
- package/vendor/templates/project/claude/commands/forge-plan.md +12 -0
- package/vendor/templates/project/claude/commands/forge-skip.md +14 -0
- package/vendor/templates/project/claude/commands/forge-status.md +16 -0
- package/vendor/templates/project/claude/commands/forge.md +16 -0
- package/vendor/templates/project/claude/hooks/forge-prompt-hook.mjs +73 -0
- package/vendor/templates/project/claude/hooks/forge-session-start.mjs +19 -0
- package/vendor/templates/project/claude/hooks/forge-triage-hook.mjs +77 -0
- package/vendor/templates/project/claude/rules/forge.md +16 -0
- package/vendor/templates/project/codex/rules/forge.md +10 -0
- package/vendor/templates/project/cursor/commands/forge-apply.md +75 -0
- package/vendor/templates/project/cursor/commands/forge-brainstorm.md +10 -0
- package/vendor/templates/project/cursor/commands/forge-build.md +17 -0
- package/vendor/templates/project/cursor/commands/forge-plan.md +15 -0
- package/vendor/templates/project/cursor/commands/forge-skip.md +14 -0
- package/vendor/templates/project/cursor/commands/forge-status.md +16 -0
- package/vendor/templates/project/cursor/commands/forge.md +16 -0
- package/vendor/templates/project/cursor/hooks/forge-session-start.mjs +30 -0
- package/vendor/templates/project/cursor/hooks/forge-session-start.sh +3 -0
- package/vendor/templates/project/cursor/rules/forge.mdc +21 -0
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Implement phase
|
|
2
|
+
|
|
3
|
+
Read and follow [../skills/subagent-driven-development/SKILL.md](../skills/subagent-driven-development/SKILL.md).
|
|
4
|
+
|
|
5
|
+
Every implementer subagent must follow [../references/tdd-core.md](../references/tdd-core.md) (condensed TDD rules — the brief includes the pointer; full skill only when stuck).
|
|
6
|
+
|
|
7
|
+
On test failures or unexpected behavior, use [../skills/systematic-debugging/SKILL.md](../skills/systematic-debugging/SKILL.md) before proposing fixes.
|
|
8
|
+
|
|
9
|
+
**Test strategy:** [../references/test-strategy.md](../references/test-strategy.md) — tier 1 (scoped TDD) + tier 2 (narrow task evidence) during implement; **tier 3 (full workspace) runs once at verify**, not per task.
|
|
10
|
+
|
|
11
|
+
**Pace:** Read `resolvedPace` / effective knobs from `forge status` (or [../references/pace.md](../references/pace.md)). After each task, decide whether to dispatch a reviewer via `review.perTask` + hard floor:
|
|
12
|
+
|
|
13
|
+
| `review.perTask` | When to dispatch reviewer |
|
|
14
|
+
| ---------------- | ------------------------- |
|
|
15
|
+
| `always` | After every task (`thorough`) |
|
|
16
|
+
| `per-group` | When the task closes a `tasks.md` group (`##` section — OpenSpec or specs engine), or immediately if the task is high-risk (`standard`) |
|
|
17
|
+
| `high-risk-only` / `never` | Only when hard-floor high-risk |
|
|
18
|
+
|
|
19
|
+
When skipping the reviewer, still write `task-review.md` with `APPROVED (pace self-check)` and keep tier-2 evidence mandatory for behavior changes. For `per-group` reviews, cover all tasks in that section in one reviewer pass; save as `group-review.md` next to the group’s tasks (or under `.forge/sessions/<id>/tasks/group-<nn>-<slug>/group-review.md`). Prefer `--tier fast` when `models.bias` is `prefer-fast` and the task is mechanical. Cap fix→re-review loops at `review.maxRounds`.
|
|
20
|
+
|
|
21
|
+
## Plan source
|
|
22
|
+
|
|
23
|
+
| planType | Task list |
|
|
24
|
+
| -------- | --------- |
|
|
25
|
+
| `openspec` | `openspec/changes/<name>/tasks.md` via **`/forge:apply`** (preferred), **`openspec-apply-change`** / `/opsx:apply` |
|
|
26
|
+
| `specs` | `<specsDir>/changes/<name>/tasks.md` (default `specs/`) — read directly; no vendor CLI steps |
|
|
27
|
+
|
|
28
|
+
Legacy sessions with planType `throwaway` or `direct`: resume from the session's own artefacts (`plan.md` / `brainstorm/notes.md`); new work always uses the configured engine (`openspec` or `specs`).
|
|
29
|
+
|
|
30
|
+
For OpenSpec: follow `openspec-apply-change` for CLI steps, but **wrap each task** in the subagent loop (do not implement all tasks inline in coordinator context). For specs: read `proposal.md` / `design.md` / `tasks.md` from the change dir as context, then run the same subagent loop.
|
|
31
|
+
|
|
32
|
+
## Runtime integrity (hard)
|
|
33
|
+
|
|
34
|
+
Honor [../references/runtime-integrity.md](../references/runtime-integrity.md) in every brief and review packet:
|
|
35
|
+
|
|
36
|
+
- Briefs **must never** contain “stub OK”, “later task”, “minimal poll loop only”, or equivalent. Shrink scope only by stopping and asking the user.
|
|
37
|
+
- Capability specs beat narrow task wording. Fill reviewer `{CAPABILITY_SPEC_EXCERPT}` from the change's capability specs — not only the task line.
|
|
38
|
+
- Do not mark a section complete if libraries exist but nothing in the production path calls them.
|
|
39
|
+
- **Deferrals:** if wiring genuinely lands in a later task, register it — `forge defer add --task <id> --reason "…"` — and resolve it when that task lands. Unregistered "later" is a REJECT; unresolved deferrals block `forge phase done`.
|
|
40
|
+
- **Spine:** when a task wires a capability into production, update its `spine.json` row (runtimeOwner / writes / evidence). `forge spine check` must pass before verify ends.
|
|
41
|
+
|
|
42
|
+
## Per-task loop
|
|
43
|
+
|
|
44
|
+
1. Extract full task text + file paths + relevant **capability** spec sections (not only the task checkbox line).
|
|
45
|
+
2. Write `.forge/sessions/<id>/tasks/<nn>-<slug>/brief.md` using [../subagents/implementer-prompt.md](../subagents/implementer-prompt.md).
|
|
46
|
+
3. Dispatch **implementer** subagent — brief includes [../references/tdd-core.md](../references/tdd-core.md). **Model:** resolve via `forge resolve-model --tier <fast|standard|capable>` (billing defaults to **`included`** — subscription/first-party pool; never invent API model slugs). Use `fast` for mechanical tasks (1–2 files, complete spec) and batched small tasks; `standard` for multi-file integration; escalate one capability tier (still `included`) when re-dispatching after `BLOCKED`. If `omitModel` is true, omit the Task `model` parameter.
|
|
47
|
+
4. **Reviewer** (unless pace skips it):
|
|
48
|
+
- **`always` / high-risk hard floor:** dispatch [../subagents/task-reviewer-prompt.md](../subagents/task-reviewer-prompt.md) for this task → `task-review.md`.
|
|
49
|
+
- **`per-group` at group boundary:** dispatch one reviewer covering **all tasks in the just-finished `tasks.md` group** → `group-review.md` (include each task id + paths). Mid-group low-risk tasks: self-check `task-review.md` only.
|
|
50
|
+
- If `review.depth` is `spec-only`, focus on spec + tests evidence. Fill `{DIFF_RANGE}` and `{CAPABILITY_SPEC_EXCERPT}` — read actual code, not the implementer's summary. **Model:** `forge resolve-model --tier standard` (or `capable` for money/auth/contracts; use `fast` when `models.bias` is `prefer-fast` and not high-risk). Do **not** skip high-risk tasks.
|
|
51
|
+
5. Fix loop until the reviewer approves (max `review.maxRounds` from pace; then escalate to the human). For group reviews, fix any rejected task in the group before continuing to the next group.
|
|
52
|
+
6. Record **test evidence** from the implementer's report (every task, even when review is deferred to group end):
|
|
53
|
+
```bash
|
|
54
|
+
forge evidence --task <nn>-<slug> --command "<tier-2 cmd>" --exit 0 --summary "<pass summary>"
|
|
55
|
+
```
|
|
56
|
+
(Refuses non-zero exit without `--allow-fail`; template + rules in [../references/test-evidence.md](../references/test-evidence.md).)
|
|
57
|
+
7. Mark task complete (`tasks.md` `- [x]` or update `tasksComplete`). Detect group boundary: next line in `tasks.md` is a new `##` heading, or no remaining tasks under the current heading.
|
|
58
|
+
8. Repeat.
|
|
59
|
+
|
|
60
|
+
**Batching:** consecutive small same-area tasks (docs, config, wording) may share one implementer brief + one review — see the batching rules in [subagent-driven-development](../skills/subagent-driven-development/SKILL.md). Never batch money/auth/contract/migration tasks.
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
forge phase implement --tasks-complete <N> --subagents <total dispatched so far>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## Forge constraints (include in every brief)
|
|
67
|
+
|
|
68
|
+
- **No** autonomous `git commit` or `git push`
|
|
69
|
+
- **Tier 2 tests only** before claiming task done — narrowest command for this task ([test-strategy.md](../references/test-strategy.md)); **not** the full workspace suite unless the task requires it
|
|
70
|
+
- Trace ecosystem consumers when contracts change
|
|
71
|
+
- Minimal diff — surgical changes only
|
|
72
|
+
- Runtime integrity: no stubs / false success; name the runtime caller; tests must fail on a no-op ([runtime-integrity.md](../references/runtime-integrity.md))
|
|
73
|
+
|
|
74
|
+
## After all tasks
|
|
75
|
+
|
|
76
|
+
Proceed to [verify.md](./verify.md) then [review.md](./review.md).
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Plan phase — OpenSpec
|
|
2
|
+
|
|
3
|
+
Thin wrapper around the project **`openspec-propose`** skill (or `/opsx:propose`).
|
|
4
|
+
|
|
5
|
+
## Steps
|
|
6
|
+
|
|
7
|
+
1. Derive change name with correct product prefix (`openspec/config.yaml` (if the project uses OpenSpec prefixes)).
|
|
8
|
+
2. Run `openspec-propose` / `/opsx:propose <prefix>-<slug>`.
|
|
9
|
+
3. Confirm `tasks.md` exists and change is apply-ready.
|
|
10
|
+
4. **Spine (always) + orchestration seam** — see [../references/runtime-integrity.md](../references/runtime-integrity.md):
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
forge spine init # mandatory every change — fill rows or set notApplicable
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Sync-only / docs-only: `"notApplicable": "<reason>"`. Capability work: one row
|
|
17
|
+
per REQ cluster (library → runtime owner → writes → evidence).
|
|
18
|
+
|
|
19
|
+
If the change also involves workers, job queues, handlers, or cross-runtime
|
|
20
|
+
calls, `tasks.md` MUST include:
|
|
21
|
+
|
|
22
|
+
- Explicit **wiring** tasks per job kind / entry point → domain pipeline
|
|
23
|
+
- One **product-loop acceptance** task (last implement task, before verify)
|
|
24
|
+
|
|
25
|
+
Missing spine = plan **not** ready. (`forge phase done` refuses without a
|
|
26
|
+
valid spine — keyword sniffing does not decide.)
|
|
27
|
+
|
|
28
|
+
5. Update session:
|
|
29
|
+
```bash
|
|
30
|
+
forge phase plan --plan-type openspec --openspec <change-name>
|
|
31
|
+
forge phase implement --tasks-total <N>
|
|
32
|
+
```
|
|
33
|
+
Count tasks from `tasks.md` checkboxes.
|
|
34
|
+
|
|
35
|
+
6. Get user approval to proceed to implement (unless they already said "go").
|
|
36
|
+
|
|
37
|
+
## Session tracking
|
|
38
|
+
|
|
39
|
+
Forge session holds orchestration artefacts; canonical plan lives under
|
|
40
|
+
`openspec/changes/<name>/`.
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
# Plan phase — built-in specs engine
|
|
2
|
+
|
|
3
|
+
For projects with `.forge/config.json` → `plan.engine: specs`. Mirrors the
|
|
4
|
+
OpenSpec propose flow without the vendor CLI. Change lives under
|
|
5
|
+
`<specsDir>/changes/<change-name>/` (default `specs/changes/…`).
|
|
6
|
+
|
|
7
|
+
## Steps
|
|
8
|
+
|
|
9
|
+
1. Derive a kebab-case change name from the brainstorm outcome (e.g.
|
|
10
|
+
`add-stripe-refunds`). No date prefix while active.
|
|
11
|
+
2. Create the change directory (preferred: CLI scaffold):
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
forge change new <change-name>
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Or create manually under `<specsDir>/changes/<change-name>/` with:
|
|
18
|
+
|
|
19
|
+
**`proposal.md`** (required)
|
|
20
|
+
|
|
21
|
+
```markdown
|
|
22
|
+
# <Change title>
|
|
23
|
+
|
|
24
|
+
## Why
|
|
25
|
+
One or two paragraphs: problem / pressure.
|
|
26
|
+
|
|
27
|
+
## What Changes
|
|
28
|
+
Bulleted scope — behavior, contracts, data.
|
|
29
|
+
|
|
30
|
+
## Impact
|
|
31
|
+
Affected code/areas, risks, migration notes.
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
**`design.md`** (only when there are real design decisions)
|
|
35
|
+
|
|
36
|
+
Context, decisions with alternatives, risks. Skip for mechanical changes.
|
|
37
|
+
|
|
38
|
+
**`tasks.md`** (required)
|
|
39
|
+
|
|
40
|
+
```markdown
|
|
41
|
+
# Tasks
|
|
42
|
+
|
|
43
|
+
## 1. <Group name>
|
|
44
|
+
- [ ] 1.1 <Bite-sized task — exact files, expected tests>
|
|
45
|
+
- [ ] 1.2 …
|
|
46
|
+
|
|
47
|
+
## 2. <Group name>
|
|
48
|
+
- [ ] 2.1 …
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Task-writing rules (from writing-plans practice):
|
|
52
|
+
- Bite-sized: one task = one reviewable step (a test + the code to pass it).
|
|
53
|
+
- Name exact file paths where known.
|
|
54
|
+
- Each task states its verification (test command or observable behavior).
|
|
55
|
+
- Group with `##` sections — Forge reviews per group under `standard` pace.
|
|
56
|
+
|
|
57
|
+
3. Confirm `tasks.md` exists and the change is apply-ready.
|
|
58
|
+
4. **Spine (always) + orchestration seam** — see [../references/runtime-integrity.md](../references/runtime-integrity.md):
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
forge spine init # mandatory every change — fill rows or set notApplicable
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
Sync-only / docs-only: `"notApplicable": "<reason>"`. Capability work: one row
|
|
65
|
+
per REQ cluster (library → runtime owner → writes → evidence).
|
|
66
|
+
|
|
67
|
+
If the change also involves workers, job queues, handlers, or cross-runtime
|
|
68
|
+
calls, `tasks.md` MUST include:
|
|
69
|
+
|
|
70
|
+
- Explicit **wiring** tasks per job kind / entry point → domain pipeline
|
|
71
|
+
- One **product-loop acceptance** task (last implement task, before verify)
|
|
72
|
+
|
|
73
|
+
Missing spine = plan **not** ready. (`forge phase done` refuses without a
|
|
74
|
+
valid spine — keyword sniffing does not decide.)
|
|
75
|
+
|
|
76
|
+
5. Update session:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
forge phase plan --plan-type specs --openspec <change-name>
|
|
80
|
+
forge phase implement --tasks-total <N>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Count tasks from `tasks.md` checkboxes. (`--openspec` carries the change
|
|
84
|
+
name for both engines.)
|
|
85
|
+
|
|
86
|
+
6. Get user approval on the artefacts before implementing (unless they already said "go").
|
|
87
|
+
|
|
88
|
+
## Compatibility
|
|
89
|
+
|
|
90
|
+
Layout and conventions are deliberately identical to OpenSpec
|
|
91
|
+
(`proposal.md` / `design.md` / `tasks.md`, archive on finish). Migration:
|
|
92
|
+
`openspec init`, then move `specs/changes/*` into `openspec/changes/`.
|
|
93
|
+
|
|
94
|
+
## Session tracking
|
|
95
|
+
|
|
96
|
+
Forge session holds orchestration artefacts; the canonical plan lives under
|
|
97
|
+
`<specsDir>/changes/<change-name>/`.
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# Review phase
|
|
2
|
+
|
|
3
|
+
Per-task reviews happen inside [implement.md](./implement.md). This phase covers **final** review before finish.
|
|
4
|
+
|
|
5
|
+
Read and follow [../skills/requesting-code-review/SKILL.md](../skills/requesting-code-review/SKILL.md).
|
|
6
|
+
|
|
7
|
+
**Pace:** Check `review.final` via [../references/pace.md](../references/pace.md) / `forge status`. If pace skips final review and the session is not high-risk, write `.forge/sessions/<id>/reviews/final-review.md` with `SKIPPED (pace=…)` and proceed. High-risk sessions (money/auth/contracts/migrations) always get a final review (hard floor).
|
|
8
|
+
|
|
9
|
+
Otherwise dispatch the final reviewer using [../subagents/final-reviewer-prompt.md](../subagents/final-reviewer-prompt.md) (whole-session verdict; the reviewer applies the checklist from [code-reviewer.md](../skills/requesting-code-review/code-reviewer.md)).
|
|
10
|
+
|
|
11
|
+
**Model:** `forge resolve-model --tier capable` (or `standard`/`fast` when `models.bias` is `prefer-fast` and not high-risk; billing **`included`** by default). If `omitModel` is true, omit the Task `model` parameter; otherwise pass `model` exactly. Do not use metered/API models unless the user explicitly requests them.
|
|
12
|
+
|
|
13
|
+
<HARD-GATE>
|
|
14
|
+
Do NOT hand-pick a model slug for the final reviewer — not even "the most capable" from the host's model list. Resolver output only. On dispatch failure, re-resolve; do not substitute a slug yourself.
|
|
15
|
+
</HARD-GATE>
|
|
16
|
+
|
|
17
|
+
Save output to `.forge/sessions/<id>/reviews/final-review.md`.
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
forge phase review
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Address Critical and Important findings before finish.
|
|
24
|
+
|
|
25
|
+
Then proceed to [finish.md](./finish.md).
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Verify phase
|
|
2
|
+
|
|
3
|
+
Read and follow [../skills/verification-before-completion/SKILL.md](../skills/verification-before-completion/SKILL.md) and [../references/test-strategy.md](../references/test-strategy.md).
|
|
4
|
+
|
|
5
|
+
## Required checks
|
|
6
|
+
|
|
7
|
+
### 1. Audit tier 2 evidence (per task)
|
|
8
|
+
|
|
9
|
+
For each completed task under `.forge/sessions/<id>/tasks/<nn>-<slug>/`:
|
|
10
|
+
|
|
11
|
+
- `test-evidence.md` exists with command, exit code `0`, and pass summary (or key output lines).
|
|
12
|
+
- `task-review.md` shows **APPROVED** (legacy sessions: `spec-review.md` + `quality-review.md`).
|
|
13
|
+
- Evidence uses tier 2 scope (narrow) unless the task documented a tier-2 full-workspace exception.
|
|
14
|
+
|
|
15
|
+
If any task lacks evidence, shows non-zero exit, or reviewers rejected test coverage → **stop** and fix or re-dispatch that task's implementer.
|
|
16
|
+
|
|
17
|
+
**Do not** re-run tier 2 commands here — audit the artifacts.
|
|
18
|
+
|
|
19
|
+
### 2. Tier 3 (scope from pace)
|
|
20
|
+
|
|
21
|
+
After tier 2 audit passes, honor `verify.tier3` from [../references/pace.md](../references/pace.md) / `forge status`:
|
|
22
|
+
|
|
23
|
+
| `verify.tier3` | Action |
|
|
24
|
+
| -------------- | ------ |
|
|
25
|
+
| `full-workspace` | One fresh full test per affected workspace (default thorough/standard) |
|
|
26
|
+
| `affected-only` | Full test only for workspaces touched by this change |
|
|
27
|
+
| `audit-tier2-only` | Do **not** run the suite; record deferral to push/CI in `verify-evidence.md` |
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
npm test (affected package/workspace)
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
When contracts changed and tier3 is not `audit-tier2-only`, also run tests in downstream consumer workspaces (project ecosystem-impact policy).
|
|
34
|
+
|
|
35
|
+
Save to `.forge/sessions/<id>/verify-evidence.md`:
|
|
36
|
+
|
|
37
|
+
```markdown
|
|
38
|
+
# Verify evidence — tier 3
|
|
39
|
+
|
|
40
|
+
- **Workspaces:** your-workspace, …
|
|
41
|
+
- **Command:** `npm test -- path/to/scoped.test.ts`
|
|
42
|
+
- **Exit code:** 0
|
|
43
|
+
- **Summary:** 142/142 pass (or paste last ~30 lines)
|
|
44
|
+
- **Run at:** 2026-06-07T12:00:00Z
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Cite this file when claiming the implementation passes. Exit code must be `0` before leaving verify.
|
|
48
|
+
|
|
49
|
+
### 2b. Strict typecheck — enforced at the gate, not here
|
|
50
|
+
|
|
51
|
+
Tier 3 runs **tests**, and Vitest transpiles without type-checking — so green tests do
|
|
52
|
+
**not** prove the code compiles under strict `tsc`. You do **not** need to run the full
|
|
53
|
+
build gate to leave verify — strict typecheck is enforced automatically by the `pre-push`
|
|
54
|
+
hook (diff-scoped, on every push / launcher **Publish**) and the full typecheck + tests on
|
|
55
|
+
`development` by CI. If you want local certainty on the types you touched, optionally run:
|
|
56
|
+
|
|
57
|
+
```bash
|
|
58
|
+
npm run build:packages # fresh dist/ so dependents resolve current .d.ts
|
|
59
|
+
node scripts/agent-check.mjs # strict typecheck + tests for the diff-affected workspaces
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
— but a clean tier-3 test audit is the bar to leave verify; the Publish/push + CI gate
|
|
63
|
+
(`shared-build-gate` capability) catches any strict-mode breakage before it's shared.
|
|
64
|
+
|
|
65
|
+
### 3. Runtime wiring audit
|
|
66
|
+
|
|
67
|
+
Honor [../references/runtime-integrity.md](../references/runtime-integrity.md).
|
|
68
|
+
|
|
69
|
+
For each requirement in the change's **capability specs** (not only `tasks.md`):
|
|
70
|
+
|
|
71
|
+
- Name the **production caller** (job kind, endpoint, CLI, …) that invokes the implementing code.
|
|
72
|
+
- Library-only / stub handler / false success / enqueueable-but-unhandled kind → **stop**. Add wiring or mark explicit gaps; do not advance.
|
|
73
|
+
|
|
74
|
+
Record the trace in `verify-evidence.md` (a short REQ → caller table is enough).
|
|
75
|
+
|
|
76
|
+
### 4. Product-loop E2E or BLOCKED
|
|
77
|
+
|
|
78
|
+
Before leaving verify / claiming the change complete:
|
|
79
|
+
|
|
80
|
+
1. Run (or document exact commands for) the **closed product loop** — not a single job slice. When the design has a producer/consumer split (analyze vs execute, proposals vs ratify), the loop is: produce artifact → consumer reads it → decision/state change → **next run's output differs from baseline**. Record it under a `## Product loop` heading in `verify-evidence.md` (the done gate greps for it). **Or**
|
|
81
|
+
2. Leave an explicit **`BLOCKED`** list in `verify-evidence.md` explaining why E2E cannot run here — the done gate then refuses `done` until unblocked or the user signs `--allow-incomplete`.
|
|
82
|
+
|
|
83
|
+
Also enforce **job-kind closure**: every product-surface job kind is wired end-to-end or deleted from enums/API/UI before complete. And the **consumer–producer rule**: anything the UI/API reads must be proven written by the production path.
|
|
84
|
+
|
|
85
|
+
Do **not** mark the change complete or advance to `done` while a critical path is stubbed, unwired, or unverified without `BLOCKED`. Green unit/tier-3 suites alone are not enough when jobs/workers/orchestration are in scope (`integrity.requireE2E`).
|
|
86
|
+
|
|
87
|
+
### 5. Mechanical gate
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
forge spine check # every capability row wired (library → runtime owner → writes → evidence)
|
|
91
|
+
forge defer list # no unresolved deferrals
|
|
92
|
+
forge integrity-check # combined; forge phase done runs the same checks
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
Fix any failure before proceeding — `forge phase done|finish` refuses on the same problems.
|
|
96
|
+
|
|
97
|
+
### 6. Plan completeness
|
|
98
|
+
|
|
99
|
+
- Confirm every plan task is marked complete.
|
|
100
|
+
- Confirm no tier 2 evidence contradicts another.
|
|
101
|
+
- For OpenSpec: `openspec instructions apply --change "<name>" --json` shows expected progress.
|
|
102
|
+
- Requirements met = line-by-line vs **capability specs**, not vs a narrowed task reading.
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
forge phase verify
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## When to re-run tier 3
|
|
109
|
+
|
|
110
|
+
- Tier 3 failed (fix, then re-run tier 3)
|
|
111
|
+
- Coordinator edited code after `verify-evidence.md` was recorded
|
|
112
|
+
- Quality or final reviewer flagged test gaps
|
|
113
|
+
- User explicitly asks for a fresh run
|
|
114
|
+
|
|
115
|
+
## When NOT to re-run
|
|
116
|
+
|
|
117
|
+
- Tier 2 narrow commands — already audited; duplicating them is slow and redundant
|
|
118
|
+
- Tier 3 passed and nothing changed since — do not run full suite again "for freshness"
|
|
119
|
+
|
|
120
|
+
Then proceed to [review.md](./review.md) if not already done per task.
|
|
@@ -0,0 +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).
|
|
@@ -0,0 +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.
|
|
@@ -0,0 +1,51 @@
|
|
|
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.
|