@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.
Files changed (143) hide show
  1. package/bin/forge.mjs +100 -0
  2. package/bin/forgekit.mjs +84 -0
  3. package/bin/review.mjs +82 -0
  4. package/package.json +46 -0
  5. package/scripts/prepack.mjs +78 -0
  6. package/scripts/run-tests.mjs +43 -0
  7. package/src/adr.mjs +236 -0
  8. package/src/adr.test.mjs +170 -0
  9. package/src/change.mjs +234 -0
  10. package/src/change.test.mjs +83 -0
  11. package/src/cleanup-sessions.mjs +70 -0
  12. package/src/config.mjs +103 -0
  13. package/src/defer.mjs +75 -0
  14. package/src/doctor.mjs +341 -0
  15. package/src/doctor.test.mjs +114 -0
  16. package/src/init.mjs +575 -0
  17. package/src/install.mjs +777 -0
  18. package/src/install.test.mjs +104 -0
  19. package/src/integrity-check.mjs +58 -0
  20. package/src/integrity.mjs +317 -0
  21. package/src/integrity.test.mjs +296 -0
  22. package/src/lib/workspaces.mjs +55 -0
  23. package/src/lib.mjs +138 -0
  24. package/src/models.defaults.json +41 -0
  25. package/src/new-session.mjs +82 -0
  26. package/src/openspec-overlays/README.md +19 -0
  27. package/src/openspec-overlays/openspec-apply-change-footer.md +14 -0
  28. package/src/openspec-overlays/opsx-apply-completion-step.md +1 -0
  29. package/src/openspec-overlays/opsx-apply-implement-step.md +11 -0
  30. package/src/paths.mjs +92 -0
  31. package/src/plan-engine.mjs +260 -0
  32. package/src/plan-engine.test.mjs +245 -0
  33. package/src/preferences.defaults.json +78 -0
  34. package/src/preferences.mjs +438 -0
  35. package/src/preferences.test.mjs +174 -0
  36. package/src/record-evidence.mjs +204 -0
  37. package/src/record-evidence.test.mjs +260 -0
  38. package/src/resolve-model.mjs +312 -0
  39. package/src/resolve-model.test.mjs +194 -0
  40. package/src/review/carryforward.mjs +413 -0
  41. package/src/review/carryforward.test.mjs +587 -0
  42. package/src/review/cli.test.mjs +117 -0
  43. package/src/review/export.mjs +172 -0
  44. package/src/review/export.test.mjs +197 -0
  45. package/src/review/fixtures/valid-review.json +42 -0
  46. package/src/review/lib.mjs +894 -0
  47. package/src/review/lib.test.mjs +266 -0
  48. package/src/review/merge-tentative.mjs +292 -0
  49. package/src/review/merge-tentative.test.mjs +363 -0
  50. package/src/review/new-review.mjs +200 -0
  51. package/src/review/render.mjs +108 -0
  52. package/src/review/schema-consistency.test.mjs +83 -0
  53. package/src/review/schema.json +196 -0
  54. package/src/review/signals.mjs +144 -0
  55. package/src/review/signals.test.mjs +62 -0
  56. package/src/score-cli.mjs +68 -0
  57. package/src/score.mjs +489 -0
  58. package/src/score.test.mjs +253 -0
  59. package/src/session-reminder.mjs +168 -0
  60. package/src/session-status.mjs +70 -0
  61. package/src/set-models.mjs +186 -0
  62. package/src/set-phase.mjs +177 -0
  63. package/src/set-phase.test.mjs +317 -0
  64. package/src/set-prefs.mjs +294 -0
  65. package/src/spine.mjs +91 -0
  66. package/src/triage-prompt.mjs +175 -0
  67. package/src/triage-prompt.test.mjs +50 -0
  68. package/src/vendor-openspec-overlays.mjs +176 -0
  69. package/src/vendor-openspec-overlays.test.mjs +62 -0
  70. package/vendor/skills/archive-to-adr/SKILL.md +149 -0
  71. package/vendor/skills/forge/SKILL.md +136 -0
  72. package/vendor/skills/forge/phases/brainstorm.md +23 -0
  73. package/vendor/skills/forge/phases/finish.md +87 -0
  74. package/vendor/skills/forge/phases/implement.md +76 -0
  75. package/vendor/skills/forge/phases/plan-openspec.md +40 -0
  76. package/vendor/skills/forge/phases/plan-specs.md +97 -0
  77. package/vendor/skills/forge/phases/review.md +25 -0
  78. package/vendor/skills/forge/phases/verify.md +120 -0
  79. package/vendor/skills/forge/references/forge-layout.md +85 -0
  80. package/vendor/skills/forge/references/pace.md +115 -0
  81. package/vendor/skills/forge/references/plan-routing.md +51 -0
  82. package/vendor/skills/forge/references/runtime-integrity.md +157 -0
  83. package/vendor/skills/forge/references/substantial-work.md +37 -0
  84. package/vendor/skills/forge/references/tdd-core.md +29 -0
  85. package/vendor/skills/forge/references/test-evidence.md +30 -0
  86. package/vendor/skills/forge/references/test-strategy.md +68 -0
  87. package/vendor/skills/forge/skills/NOTICE.md +17 -0
  88. package/vendor/skills/forge/skills/brainstorming/SKILL.md +120 -0
  89. package/vendor/skills/forge/skills/requesting-code-review/SKILL.md +67 -0
  90. package/vendor/skills/forge/skills/requesting-code-review/code-reviewer.md +146 -0
  91. package/vendor/skills/forge/skills/subagent-driven-development/SKILL.md +87 -0
  92. package/vendor/skills/forge/skills/systematic-debugging/SKILL.md +234 -0
  93. package/vendor/skills/forge/skills/systematic-debugging/condition-based-waiting.md +115 -0
  94. package/vendor/skills/forge/skills/systematic-debugging/defense-in-depth.md +122 -0
  95. package/vendor/skills/forge/skills/systematic-debugging/find-polluter.sh +63 -0
  96. package/vendor/skills/forge/skills/systematic-debugging/root-cause-tracing.md +169 -0
  97. package/vendor/skills/forge/skills/test-driven-development/SKILL.md +290 -0
  98. package/vendor/skills/forge/skills/test-driven-development/testing-anti-patterns.md +299 -0
  99. package/vendor/skills/forge/skills/verification-before-completion/SKILL.md +59 -0
  100. package/vendor/skills/forge/subagents/final-reviewer-prompt.md +53 -0
  101. package/vendor/skills/forge/subagents/implementer-prompt.md +38 -0
  102. package/vendor/skills/forge/subagents/task-reviewer-prompt.md +61 -0
  103. package/vendor/skills/git-resolve-adr-conflict/SKILL.md +132 -0
  104. package/vendor/skills/thorough-code-review/SKILL.md +290 -0
  105. package/vendor/skills/thorough-code-review/examples/accepted-risks-janus.md +32 -0
  106. package/vendor/skills/thorough-code-review/examples.md +133 -0
  107. package/vendor/skills/thorough-code-review/reference/accepted-risks.md +26 -0
  108. package/vendor/skills/thorough-code-review/reference/lenses.md +96 -0
  109. package/vendor/skills/thorough-code-review/reference/phase1-scout.md +62 -0
  110. package/vendor/skills/thorough-code-review/reference/phase1c-coverage.md +44 -0
  111. package/vendor/skills/thorough-code-review/reference/phase2-skeptic.md +105 -0
  112. package/vendor/skills/thorough-code-review/reference/report-schema.json +222 -0
  113. package/vendor/skills/thorough-code-review/reference/report-template.md +115 -0
  114. package/vendor/skills/thorough-code-review/reference/severity-rubric.md +49 -0
  115. package/vendor/skills/thorough-code-review/reference/signals-preflight.md +55 -0
  116. package/vendor/templates/adr/README.md +7 -0
  117. package/vendor/templates/adr/decisions.md +141 -0
  118. package/vendor/templates/adr/hooks/check-pending-adrs.mjs +74 -0
  119. package/vendor/templates/adr/hooks/check-pending-adrs.sh +3 -0
  120. package/vendor/templates/adr/hooks/openspec-archive-agent-message.mjs +52 -0
  121. package/vendor/templates/adr/hooks/openspec-archive-agent-message.sh +3 -0
  122. package/vendor/templates/project/claude/commands/forge-apply.md +75 -0
  123. package/vendor/templates/project/claude/commands/forge-brainstorm.md +7 -0
  124. package/vendor/templates/project/claude/commands/forge-build.md +17 -0
  125. package/vendor/templates/project/claude/commands/forge-plan.md +12 -0
  126. package/vendor/templates/project/claude/commands/forge-skip.md +14 -0
  127. package/vendor/templates/project/claude/commands/forge-status.md +16 -0
  128. package/vendor/templates/project/claude/commands/forge.md +16 -0
  129. package/vendor/templates/project/claude/hooks/forge-prompt-hook.mjs +73 -0
  130. package/vendor/templates/project/claude/hooks/forge-session-start.mjs +19 -0
  131. package/vendor/templates/project/claude/hooks/forge-triage-hook.mjs +77 -0
  132. package/vendor/templates/project/claude/rules/forge.md +16 -0
  133. package/vendor/templates/project/codex/rules/forge.md +10 -0
  134. package/vendor/templates/project/cursor/commands/forge-apply.md +75 -0
  135. package/vendor/templates/project/cursor/commands/forge-brainstorm.md +10 -0
  136. package/vendor/templates/project/cursor/commands/forge-build.md +17 -0
  137. package/vendor/templates/project/cursor/commands/forge-plan.md +15 -0
  138. package/vendor/templates/project/cursor/commands/forge-skip.md +14 -0
  139. package/vendor/templates/project/cursor/commands/forge-status.md +16 -0
  140. package/vendor/templates/project/cursor/commands/forge.md +16 -0
  141. package/vendor/templates/project/cursor/hooks/forge-session-start.mjs +30 -0
  142. package/vendor/templates/project/cursor/hooks/forge-session-start.sh +3 -0
  143. 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.