@garygentry/feature-forge 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 (231) hide show
  1. package/LICENSE +21 -0
  2. package/adapters/GENERATION-REPORT.md +128 -0
  3. package/adapters/claude/agents/forge-researcher.md +137 -0
  4. package/adapters/claude/agents/forge-spec-writer.md +115 -0
  5. package/adapters/claude/agents/forge-verifier.md +121 -0
  6. package/adapters/claude/references/epic-manifest-schema.json +120 -0
  7. package/adapters/claude/references/forge-config-schema.json +166 -0
  8. package/adapters/claude/references/pipeline-state-schema.json +110 -0
  9. package/adapters/claude/references/portable-root.md +56 -0
  10. package/adapters/claude/references/process-overview.md +123 -0
  11. package/adapters/claude/references/ralph-loop-contract.md +221 -0
  12. package/adapters/claude/references/shared-conventions.md +144 -0
  13. package/adapters/claude/references/skill-frontmatter.schema.json +17 -0
  14. package/adapters/claude/references/stack-resolution.md +51 -0
  15. package/adapters/claude/references/stacks/_generic.md +90 -0
  16. package/adapters/claude/references/stacks/go.md +138 -0
  17. package/adapters/claude/references/stacks/python.md +163 -0
  18. package/adapters/claude/references/stacks/rust.md +151 -0
  19. package/adapters/claude/references/stacks/typescript.md +111 -0
  20. package/adapters/claude/references/vendor-construct-inventory.md +49 -0
  21. package/adapters/claude/scripts/forge-root.sh +50 -0
  22. package/adapters/claude/skills/forge/SKILL.md +165 -0
  23. package/adapters/claude/skills/forge-0-epic/SKILL.md +303 -0
  24. package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +222 -0
  25. package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
  26. package/adapters/claude/skills/forge-1-prd/SKILL.md +121 -0
  27. package/adapters/claude/skills/forge-1-prd/references/prd-template.md +106 -0
  28. package/adapters/claude/skills/forge-2-tech/SKILL.md +198 -0
  29. package/adapters/claude/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
  30. package/adapters/claude/skills/forge-3-specs/SKILL.md +154 -0
  31. package/adapters/claude/skills/forge-3-specs/references/spec-archetypes.md +106 -0
  32. package/adapters/claude/skills/forge-3-specs/references/spec-examples.md +71 -0
  33. package/adapters/claude/skills/forge-4-backlog/SKILL.md +146 -0
  34. package/adapters/claude/skills/forge-5-loop/SKILL.md +303 -0
  35. package/adapters/claude/skills/forge-5-loop/references/result-reporting.md +63 -0
  36. package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +214 -0
  37. package/adapters/claude/skills/forge-6-docs/SKILL.md +179 -0
  38. package/adapters/claude/skills/forge-6-docs/references/doc-conventions.md +126 -0
  39. package/adapters/claude/skills/forge-fix/SKILL.md +65 -0
  40. package/adapters/claude/skills/forge-init/SKILL.md +29 -0
  41. package/adapters/claude/skills/forge-verify/SKILL.md +219 -0
  42. package/adapters/claude/skills/forge-verify/references/verification-checklists.md +379 -0
  43. package/adapters/codex/agents/forge-researcher.md +133 -0
  44. package/adapters/codex/agents/forge-spec-writer.md +112 -0
  45. package/adapters/codex/agents/forge-verifier.md +115 -0
  46. package/adapters/codex/agents/openai.yaml +10 -0
  47. package/adapters/codex/references/epic-manifest-schema.json +120 -0
  48. package/adapters/codex/references/forge-config-schema.json +166 -0
  49. package/adapters/codex/references/pipeline-state-schema.json +110 -0
  50. package/adapters/codex/references/portable-root.md +56 -0
  51. package/adapters/codex/references/process-overview.md +123 -0
  52. package/adapters/codex/references/ralph-loop-contract.md +221 -0
  53. package/adapters/codex/references/shared-conventions.md +144 -0
  54. package/adapters/codex/references/skill-frontmatter.schema.json +17 -0
  55. package/adapters/codex/references/stack-resolution.md +51 -0
  56. package/adapters/codex/references/stacks/_generic.md +90 -0
  57. package/adapters/codex/references/stacks/go.md +138 -0
  58. package/adapters/codex/references/stacks/python.md +163 -0
  59. package/adapters/codex/references/stacks/rust.md +151 -0
  60. package/adapters/codex/references/stacks/typescript.md +111 -0
  61. package/adapters/codex/references/vendor-construct-inventory.md +49 -0
  62. package/adapters/codex/scripts/forge-root.sh +50 -0
  63. package/adapters/codex/skills/forge/forge.md +164 -0
  64. package/adapters/codex/skills/forge-0-epic/forge-0-epic.md +302 -0
  65. package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +222 -0
  66. package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
  67. package/adapters/codex/skills/forge-1-prd/forge-1-prd.md +120 -0
  68. package/adapters/codex/skills/forge-1-prd/references/prd-template.md +106 -0
  69. package/adapters/codex/skills/forge-2-tech/forge-2-tech.md +197 -0
  70. package/adapters/codex/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
  71. package/adapters/codex/skills/forge-3-specs/forge-3-specs.md +153 -0
  72. package/adapters/codex/skills/forge-3-specs/references/spec-archetypes.md +106 -0
  73. package/adapters/codex/skills/forge-3-specs/references/spec-examples.md +71 -0
  74. package/adapters/codex/skills/forge-4-backlog/forge-4-backlog.md +145 -0
  75. package/adapters/codex/skills/forge-5-loop/forge-5-loop.md +302 -0
  76. package/adapters/codex/skills/forge-5-loop/references/result-reporting.md +63 -0
  77. package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +214 -0
  78. package/adapters/codex/skills/forge-6-docs/forge-6-docs.md +178 -0
  79. package/adapters/codex/skills/forge-6-docs/references/doc-conventions.md +126 -0
  80. package/adapters/codex/skills/forge-fix/forge-fix.md +64 -0
  81. package/adapters/codex/skills/forge-init/forge-init.md +29 -0
  82. package/adapters/codex/skills/forge-verify/forge-verify.md +218 -0
  83. package/adapters/codex/skills/forge-verify/references/verification-checklists.md +379 -0
  84. package/adapters/copilot/agents/forge-researcher.md +133 -0
  85. package/adapters/copilot/agents/forge-spec-writer.md +112 -0
  86. package/adapters/copilot/agents/forge-verifier.md +115 -0
  87. package/adapters/copilot/references/epic-manifest-schema.json +120 -0
  88. package/adapters/copilot/references/forge-config-schema.json +166 -0
  89. package/adapters/copilot/references/pipeline-state-schema.json +110 -0
  90. package/adapters/copilot/references/portable-root.md +56 -0
  91. package/adapters/copilot/references/process-overview.md +123 -0
  92. package/adapters/copilot/references/ralph-loop-contract.md +221 -0
  93. package/adapters/copilot/references/shared-conventions.md +144 -0
  94. package/adapters/copilot/references/skill-frontmatter.schema.json +17 -0
  95. package/adapters/copilot/references/stack-resolution.md +51 -0
  96. package/adapters/copilot/references/stacks/_generic.md +90 -0
  97. package/adapters/copilot/references/stacks/go.md +138 -0
  98. package/adapters/copilot/references/stacks/python.md +163 -0
  99. package/adapters/copilot/references/stacks/rust.md +151 -0
  100. package/adapters/copilot/references/stacks/typescript.md +111 -0
  101. package/adapters/copilot/references/vendor-construct-inventory.md +49 -0
  102. package/adapters/copilot/scripts/forge-root.sh +50 -0
  103. package/adapters/copilot/skills/forge/forge.md +164 -0
  104. package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +302 -0
  105. package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +222 -0
  106. package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
  107. package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +120 -0
  108. package/adapters/copilot/skills/forge-1-prd/references/prd-template.md +106 -0
  109. package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +197 -0
  110. package/adapters/copilot/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
  111. package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +153 -0
  112. package/adapters/copilot/skills/forge-3-specs/references/spec-archetypes.md +106 -0
  113. package/adapters/copilot/skills/forge-3-specs/references/spec-examples.md +71 -0
  114. package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +145 -0
  115. package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +302 -0
  116. package/adapters/copilot/skills/forge-5-loop/references/result-reporting.md +63 -0
  117. package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +214 -0
  118. package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +178 -0
  119. package/adapters/copilot/skills/forge-6-docs/references/doc-conventions.md +126 -0
  120. package/adapters/copilot/skills/forge-fix/forge-fix.md +64 -0
  121. package/adapters/copilot/skills/forge-init/forge-init.md +29 -0
  122. package/adapters/copilot/skills/forge-verify/forge-verify.md +218 -0
  123. package/adapters/copilot/skills/forge-verify/references/verification-checklists.md +379 -0
  124. package/adapters/cursor/agents/forge-researcher.mdc +134 -0
  125. package/adapters/cursor/agents/forge-spec-writer.mdc +113 -0
  126. package/adapters/cursor/agents/forge-verifier.mdc +116 -0
  127. package/adapters/cursor/references/epic-manifest-schema.json +120 -0
  128. package/adapters/cursor/references/forge-config-schema.json +166 -0
  129. package/adapters/cursor/references/pipeline-state-schema.json +110 -0
  130. package/adapters/cursor/references/portable-root.md +56 -0
  131. package/adapters/cursor/references/process-overview.md +123 -0
  132. package/adapters/cursor/references/ralph-loop-contract.md +221 -0
  133. package/adapters/cursor/references/shared-conventions.md +144 -0
  134. package/adapters/cursor/references/skill-frontmatter.schema.json +17 -0
  135. package/adapters/cursor/references/stack-resolution.md +51 -0
  136. package/adapters/cursor/references/stacks/_generic.md +90 -0
  137. package/adapters/cursor/references/stacks/go.md +138 -0
  138. package/adapters/cursor/references/stacks/python.md +163 -0
  139. package/adapters/cursor/references/stacks/rust.md +151 -0
  140. package/adapters/cursor/references/stacks/typescript.md +111 -0
  141. package/adapters/cursor/references/vendor-construct-inventory.md +49 -0
  142. package/adapters/cursor/scripts/forge-root.sh +50 -0
  143. package/adapters/cursor/skills/forge/forge.mdc +165 -0
  144. package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +303 -0
  145. package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +222 -0
  146. package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
  147. package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +121 -0
  148. package/adapters/cursor/skills/forge-1-prd/references/prd-template.md +106 -0
  149. package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +198 -0
  150. package/adapters/cursor/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
  151. package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +154 -0
  152. package/adapters/cursor/skills/forge-3-specs/references/spec-archetypes.md +106 -0
  153. package/adapters/cursor/skills/forge-3-specs/references/spec-examples.md +71 -0
  154. package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +146 -0
  155. package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +303 -0
  156. package/adapters/cursor/skills/forge-5-loop/references/result-reporting.md +63 -0
  157. package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +214 -0
  158. package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +179 -0
  159. package/adapters/cursor/skills/forge-6-docs/references/doc-conventions.md +126 -0
  160. package/adapters/cursor/skills/forge-fix/forge-fix.mdc +65 -0
  161. package/adapters/cursor/skills/forge-init/forge-init.mdc +30 -0
  162. package/adapters/cursor/skills/forge-verify/forge-verify.mdc +219 -0
  163. package/adapters/cursor/skills/forge-verify/references/verification-checklists.md +379 -0
  164. package/adapters/gemini/agents/forge-researcher.md +133 -0
  165. package/adapters/gemini/agents/forge-spec-writer.md +112 -0
  166. package/adapters/gemini/agents/forge-verifier.md +115 -0
  167. package/adapters/gemini/gemini-extension.json +54 -0
  168. package/adapters/gemini/references/epic-manifest-schema.json +120 -0
  169. package/adapters/gemini/references/forge-config-schema.json +166 -0
  170. package/adapters/gemini/references/pipeline-state-schema.json +110 -0
  171. package/adapters/gemini/references/portable-root.md +56 -0
  172. package/adapters/gemini/references/process-overview.md +123 -0
  173. package/adapters/gemini/references/ralph-loop-contract.md +221 -0
  174. package/adapters/gemini/references/shared-conventions.md +144 -0
  175. package/adapters/gemini/references/skill-frontmatter.schema.json +17 -0
  176. package/adapters/gemini/references/stack-resolution.md +51 -0
  177. package/adapters/gemini/references/stacks/_generic.md +90 -0
  178. package/adapters/gemini/references/stacks/go.md +138 -0
  179. package/adapters/gemini/references/stacks/python.md +163 -0
  180. package/adapters/gemini/references/stacks/rust.md +151 -0
  181. package/adapters/gemini/references/stacks/typescript.md +111 -0
  182. package/adapters/gemini/references/vendor-construct-inventory.md +49 -0
  183. package/adapters/gemini/scripts/forge-root.sh +50 -0
  184. package/adapters/gemini/skills/forge/forge.md +164 -0
  185. package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +302 -0
  186. package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +222 -0
  187. package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +64 -0
  188. package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +120 -0
  189. package/adapters/gemini/skills/forge-1-prd/references/prd-template.md +106 -0
  190. package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +197 -0
  191. package/adapters/gemini/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
  192. package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +153 -0
  193. package/adapters/gemini/skills/forge-3-specs/references/spec-archetypes.md +106 -0
  194. package/adapters/gemini/skills/forge-3-specs/references/spec-examples.md +71 -0
  195. package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +145 -0
  196. package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +302 -0
  197. package/adapters/gemini/skills/forge-5-loop/references/result-reporting.md +63 -0
  198. package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +214 -0
  199. package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +178 -0
  200. package/adapters/gemini/skills/forge-6-docs/references/doc-conventions.md +126 -0
  201. package/adapters/gemini/skills/forge-fix/forge-fix.md +64 -0
  202. package/adapters/gemini/skills/forge-init/forge-init.md +29 -0
  203. package/adapters/gemini/skills/forge-verify/forge-verify.md +218 -0
  204. package/adapters/gemini/skills/forge-verify/references/verification-checklists.md +379 -0
  205. package/dist/agent-targets.d.ts +70 -0
  206. package/dist/agent-targets.js +111 -0
  207. package/dist/apply.d.ts +49 -0
  208. package/dist/apply.js +246 -0
  209. package/dist/cli.d.ts +94 -0
  210. package/dist/cli.js +508 -0
  211. package/dist/detect.d.ts +45 -0
  212. package/dist/detect.js +72 -0
  213. package/dist/fsutil.d.ts +56 -0
  214. package/dist/fsutil.js +175 -0
  215. package/dist/hash.d.ts +50 -0
  216. package/dist/hash.js +107 -0
  217. package/dist/index.d.ts +8 -0
  218. package/dist/index.js +9 -0
  219. package/dist/manifest.d.ts +72 -0
  220. package/dist/manifest.js +222 -0
  221. package/dist/plan.d.ts +66 -0
  222. package/dist/plan.js +166 -0
  223. package/dist/rauf.d.ts +83 -0
  224. package/dist/rauf.js +118 -0
  225. package/dist/report.d.ts +35 -0
  226. package/dist/report.js +110 -0
  227. package/dist/source.d.ts +69 -0
  228. package/dist/source.js +164 -0
  229. package/dist/types.d.ts +264 -0
  230. package/dist/types.js +57 -0
  231. package/package.json +42 -0
@@ -0,0 +1,222 @@
1
+ # forge-0-epic — Edit Mode (E1–E6) + Observability / Pipeline State & Commit
2
+
3
+ Lookup detail relocated out of the `forge-0-epic` SKILL.md body. The skill body keeps the
4
+ entry condition (the **EXISTS** branch from Step 0) and the high-level "every mutation is
5
+ committed individually" rule, and points here for the full mechanics. The exact mutator flag
6
+ surface and per-subcommand exit-code handling live in `references/epic-manifest-subcommands.md`.
7
+
8
+ Entered from Step 0 when `{specsDir}/{epic}/epic-manifest.json` already exists (the **EXISTS**
9
+ branch). The edit branch mutates the manifest **only** through helper mutators — the skill never
10
+ hand-rolls an in-place write. Every mutator is atomic (temp file + `os.replace`) and re-validates
11
+ the edited graph internally, so a refused write leaves the manifest **byte-identical**. Every
12
+ question goes through `AskUserQuestion`.
13
+
14
+ ## Step E1 — Load + Validate, Refuse if Invalid
15
+
16
+ Before offering any edit, validate the existing manifest:
17
+
18
+ ```bash
19
+ R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
20
+ [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
21
+ python3 "$R/scripts/epic-manifest.py" validate "{epic}" --specs-dir "{specsDir}" --json
22
+ ```
23
+
24
+ - Exit `0` → the manifest is well-formed; proceed to E2.
25
+ - Exit `1` or `2` → the manifest is corrupt or invalid (hand-edited, `corrupt-json`, `cycle`,
26
+ `dangling-ref`, `duplicate-name`, `cached-status`, `unsafe-name`, …). Surface **every**
27
+ `findings[]` entry **verbatim**, then **refuse ALL mutation** until the user repairs the
28
+ manifest by hand. **Never auto-repair**, never offer an edit operation, and never proceed past
29
+ this gate. Tell the user what is wrong and STOP.
30
+
31
+ ## Step E2 — Choose Operation
32
+
33
+ Use `AskUserQuestion` to offer the edit operations, each mapping to one helper mutator:
34
+
35
+ | Operation | Helper subcommand |
36
+ |-----------|-------------------|
37
+ | Add a feature | `add-feature` |
38
+ | Remove a feature | `remove-feature` |
39
+ | Reorder features | `reorder` |
40
+ | Change a dependency edge | `set-dep` |
41
+ | Change epic lifecycle status | `set-status` |
42
+
43
+ For **add-feature**, first run `check-name "{feature}"` (exactly as C2) so no new duplicate is
44
+ introduced — surface a `duplicate-name`/`unsafe-name` finding verbatim and re-prompt — then
45
+ elicit the new feature's **charter** + **`exposes`/`consumes`** + **`dependsOn`** exactly as in
46
+ C3/C4.
47
+
48
+ ## Step E3 — Apply via Helper Mutator (re-validated)
49
+
50
+ Issue the chosen mutator. Each writes atomically and re-runs full validation internally, refusing
51
+ the write if it would introduce a cycle, dangling ref, duplicate, or schema violation. For the
52
+ exact `epic-manifest.py` mutator flag surface and per-subcommand exit-code handling, read
53
+ `references/epic-manifest-subcommands.md`.
54
+
55
+ **Contracts have no mutator.** `add-feature` seeds empty `exposes`/`consumes`. To populate the
56
+ new feature's contracts, edit its `exposes`/`consumes` arrays **directly in the composed manifest
57
+ entry** (exactly as creation C5 does), then re-run `validate "{epic}" --json` to confirm — there
58
+ is intentionally no `--exposes-json`/`--consumes-json` flag.
59
+
60
+ **remove-feature leaves the member directory in place (§7.5).** The mutator drops only the
61
+ manifest entry. The skill does **not** delete or relocate `{specsDir}/{epic}/{feature}/`. WARN the
62
+ user verbatim:
63
+
64
+ > Removed `{feature}` from the manifest. Its directory `{specsDir}/{epic}/{feature}/` is left in
65
+ > place; move it to `{specsDir}/{feature}/` by hand if you want it as a standalone feature.
66
+ > Relocation is manual — there is no migration tooling.
67
+
68
+ The orphaned subdir still holds a `.pipeline-state.json` with an `epic` back-pointer the manifest
69
+ no longer lists; per the conflict rule the **manifest wins**, and `forge-verify` epic mode
70
+ CHECK-E07 reports the inconsistency non-fatally. The skill does **not** silently edit the orphaned
71
+ state file.
72
+
73
+ ## Step E4 — Impact Warning (in-flight / completed features)
74
+
75
+ Before applying — or immediately after eliciting — a mutation that affects a feature whose derived
76
+ status is **not** `not-started`, warn the user. Read the **live** status (never re-derive
77
+ completion in prose):
78
+
79
+ ```bash
80
+ R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
81
+ [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
82
+ python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
83
+ ```
84
+
85
+ If the operation removes, reorders-around, or re-deps a feature whose derived status is
86
+ `in-progress` or `complete`, use `AskUserQuestion` with an explicit warning naming the affected
87
+ in-flight/completed feature(s) and **require confirmation** before applying. Example: "`token-service`
88
+ is already in-progress (forge-3-specs). Removing `config-store`, which it consumes `JWT_SECRET`
89
+ from, may invalidate its in-flight specs. Proceed?" If `render-status` exits `≥ 1`, surface the
90
+ findings and STOP (do not mutate over an invalid graph).
91
+
92
+ ## Step E5 — Patch EPIC.md
93
+
94
+ Patch **only** the affected feature/Contracts section(s) — the section(s) for the added, removed,
95
+ or changed feature and any feature whose `dependsOn`/`consumes` changed — applying the §C6 mirror
96
+ rule (one bullet per `exposes`/`consumes` entry). **Full regeneration happens only on explicit
97
+ user request**: offer it via `AskUserQuestion` but default to the targeted patch. The skill keeps
98
+ EPIC.md in sync but does not itself diff it against the manifest — drift detection is `forge-verify`
99
+ epic mode CHECK-E06.
100
+
101
+ ## Step E6 — Pipeline State & Commit
102
+
103
+ Proceed to the **Observability, Pipeline State & Commit** section below. Each edit-mode mutation is
104
+ committed individually so git history is the audit trail.
105
+
106
+ ## Observability, Pipeline State & Commit
107
+
108
+ ### Manifest `updatedAt`
109
+
110
+ Every helper mutator bumps the manifest's top-level `updatedAt` to the current ISO-8601 UTC
111
+ timestamp as part of the same atomic write. The skill does **not** bump it manually in edit mode.
112
+ For the initial creation write (C5) the skill sets `createdAt == updatedAt`.
113
+
114
+ ### Pipeline state
115
+
116
+ - **Epic-level:** the epic subtree has **no `.pipeline-state.json` of its own** (that is what
117
+ distinguishes an epic root from a feature). The epic's lifecycle lives in the manifest `status`
118
+ field. The `forge-0-epic` run is recorded in **member** states, not in an epic-level state file.
119
+ - **Member-level (creation):** each member's `.pipeline-state.json` records
120
+ `stages["forge-0-epic"].status = "complete"` and `currentStage = "forge-1-prd"` (see C7).
121
+ - **Edit mode:** edits mutate the **manifest**, not member pipeline states — except the
122
+ newly-created subdir for `add-feature`, which follows C7 (create the member subdir + back-pointer
123
+ state). The skill does **not** rewrite existing members' `stages` on an edit.
124
+ - **`.epic-state.json` (lazily created, written by skills — NOT the helper):** epic-*scoped* stage
125
+ entries that belong to no single member — currently only `forge-verify-epic` — are persisted in a
126
+ dedicated `{specsDir}/{epic}/.epic-state.json`. It holds **only** epic-scoped stage entries,
127
+ never derived per-feature status (so it does not violate REQ-STATE-02). `forge-0-epic` does
128
+ **not** create this file — no epic-scoped stage runs during creation or edit; it appears only once
129
+ `forge-verify` epic mode runs. When a skill does write it (e.g. forge-verify epic mode), it writes
130
+ **directly** using an atomic temp-file + `os.replace` pattern — the helper exposes no subcommand
131
+ for it. On I/O failure the skill reports and leaves any prior file intact (never a partial write).
132
+ Minimal schema:
133
+
134
+ ```jsonc
135
+ {
136
+ "epic": "auth-overhaul", // matches manifest `epic`
137
+ "stages": {
138
+ "forge-verify-epic": {
139
+ "status": "findings-reported", // "findings-reported" | "passed" | "findings-applied"
140
+ "findingsFile": ".verification/VERIFY-epic-2026-06-12.md",
141
+ "findingsCount": 3,
142
+ "verifiedAt": "2026-06-12T00:00:00Z"
143
+ }
144
+ }
145
+ }
146
+ ```
147
+
148
+ The git-commit step below stages the whole epic subtree, so `.epic-state.json` is captured
149
+ automatically when present.
150
+
151
+ ### Git Commit Protocol
152
+
153
+ After creation (C8) **and after each edit-mode mutation (E6)**, if `gitCommitAfterStage` is true,
154
+ follow the Git Commit Protocol in shared-conventions:
155
+
156
+ 1. Stage the whole epic subtree only: `git add {specsDir}/{epic}/` — **never** `git add -A`. This
157
+ captures `epic-manifest.json`, `EPIC.md`, member `.pipeline-state.json` files, and any
158
+ `.epic-state.json` together atomically.
159
+ 2. Commit with message `"{commitPrefix}({epic}): <action>"`, e.g.
160
+ `"forge({epic}): create epic with 4 features"`, `"forge({epic}): add feature api-gateway"`,
161
+ `"forge({epic}): remove feature legacy-session"`, `"forge({epic}): reorder features"`,
162
+ `"forge({epic}): set dependency on token-service"`, or `"forge({epic}): set status paused"`.
163
+ 3. On success, capture the commit hash. On failure (pre-commit hook, conflict), report and do
164
+ **not** mark complete; never use `--no-verify`/`--force`.
165
+
166
+ Because every mutation is committed, the git history of `epic-manifest.json` is the audit trail; no
167
+ separate in-manifest audit log is kept.
168
+
169
+ ### Closing message
170
+
171
+ After a successful **creation**, present the next-steps message (already specified in C8). After a
172
+ successful **edit-mode mutation**, confirm the change and re-surface the dashboard pointer:
173
+
174
+ > Epic `{epic}` updated (`<action>`). Run `/feature-forge:forge {epic}` to see the refreshed
175
+ > dashboard, or re-run `/feature-forge:forge-0-epic {epic}` to make another change.
176
+
177
+ ## EPIC.md Mirror Template (creation C6 / edit E5)
178
+
179
+ `forge-0-epic` Step C6 generates `{specsDir}/{epic}/EPIC.md` from the **validated** manifest; the
180
+ edit-mode E5 patch applies the **same mirror rule** to the affected sections. The full skeleton:
181
+
182
+ ```markdown
183
+ # {epic} — Epic
184
+
185
+ ## Overall Goal
186
+ {the epic goal from C1, expanded into narrative prose}
187
+
188
+ ## Decomposition Rationale
189
+ {why the change was split this way; right-sizing notes; ordering rationale}
190
+
191
+ ## Features
192
+ {for each feature, in manifest order:}
193
+
194
+ ### {feature.name}
195
+ {feature.charter, as prose}
196
+
197
+ **Depends on:** {comma-separated dependsOn, or "nothing"}
198
+
199
+ #### Contracts
200
+ **Exposes:**
201
+ - `{exposes[i].name}` ({exposes[i].kind}) — {exposes[i].summary}
202
+ {… or "Nothing exposed." if the exposes array is empty}
203
+
204
+ **Consumes:**
205
+ - `{consumes[i].name}` from `{consumes[i].from}` — {consumes[i].summary}
206
+ {… or "Nothing consumed." if the consumes array is empty}
207
+ ```
208
+
209
+ ## Member State Example (creation C7)
210
+
211
+ Each member's `.pipeline-state.json` (created in Step C7) conforms to
212
+ `references/pipeline-state-schema.json`. Example member state:
213
+
214
+ ```json
215
+ {
216
+ "epic": "{epic}",
217
+ "currentStage": "forge-1-prd",
218
+ "stages": {
219
+ "forge-0-epic": { "status": "complete", "version": 1, "completedAt": "<iso-8601-utc>" }
220
+ }
221
+ }
222
+ ```
@@ -0,0 +1,64 @@
1
+ # forge-0-epic — `epic-manifest.py` Subcommand Reference
2
+
3
+ Lookup detail relocated out of the `forge-0-epic` SKILL.md body (Step E3 command
4
+ catalog + exit-code disposition, and the Error Handling table). The skill body keeps
5
+ the decision logic and step ordering; this file is the flag-surface catalog and the
6
+ per-subcommand exit-code reference.
7
+
8
+ ## Edit-Mode Mutator Flag Surface (Step E3)
9
+
10
+ Issue the chosen mutator. Each writes atomically and re-runs full validation internally, refusing
11
+ the write if it would introduce a cycle, dangling ref, duplicate, or schema violation. The exact
12
+ flag surface (owned by 02 §7):
13
+
14
+ ```bash
15
+ R="$(for d in "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/*/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done)"
16
+ [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
17
+ # Add a feature — seeds EMPTY exposes/consumes; contracts are populated below.
18
+ python3 "$R/scripts/epic-manifest.py" add-feature "{epic}" "{feature}" \
19
+ --charter "…" --specs-dir "{specsDir}" [--depends-on a,b]
20
+
21
+ # Remove a feature (drops its manifest entry; directory is left in place — see E3 note).
22
+ python3 "$R/scripts/epic-manifest.py" remove-feature "{epic}" "{feature}" \
23
+ --specs-dir "{specsDir}"
24
+
25
+ # Reorder the features[] sequence (must be an exact permutation of current member names).
26
+ python3 "$R/scripts/epic-manifest.py" reorder "{epic}" \
27
+ --order "feat-a,feat-c,feat-b" --specs-dir "{specsDir}"
28
+
29
+ # Change a dependency edge (--depends-on "" clears it).
30
+ python3 "$R/scripts/epic-manifest.py" set-dep "{epic}" "{feature}" \
31
+ --depends-on "config-store,token-service" --specs-dir "{specsDir}"
32
+
33
+ # Change epic lifecycle status (active|paused|abandoned|complete).
34
+ python3 "$R/scripts/epic-manifest.py" set-status "{epic}" \
35
+ --status paused --specs-dir "{specsDir}"
36
+ ```
37
+
38
+ ### Per-Subcommand Exit-Code Disposition (Step E3)
39
+
40
+ - Exit `0` → the mutator wrote the manifest and bumped `updatedAt`. Proceed to E4/E5.
41
+ - Exit `1` → surface the `findings[]` **verbatim** and **abort the edit**. The manifest is
42
+ unchanged (the write was refused atomically — byte-identical). Loop back to E2 or re-elicit.
43
+ - Exit `2` → unsafe name / missing|corrupt manifest / bad `--status` value / write failure.
44
+ Surface and STOP.
45
+
46
+ ## Error Handling
47
+
48
+ The skill **never** repairs a corrupt manifest automatically and **never** proceeds past a gating
49
+ helper exit `≥ 1`. All findings are surfaced **verbatim**.
50
+
51
+ | Condition | Helper signal | Skill behavior |
52
+ |-----------|---------------|----------------|
53
+ | Epic name duplicates an existing name | `check-name` exit 1 (`duplicate-name`) | STOP creation; surface finding; ask for a new name via `AskUserQuestion` |
54
+ | Member feature name duplicates | `check-name` exit 1 (`duplicate-name`) | Reject that name in C2 / add-feature; surface verbatim; re-prompt |
55
+ | Unsafe name (`/`, `..`, absolute) | `check-name`/mutator exit 2 (`unsafe-name`) | Reject; surface; re-prompt |
56
+ | Composed manifest has a cycle | `validate` exit 1 (`cycle`) | Surface verbatim; re-open the dependency interview (C4); never finalize |
57
+ | Dangling `dependsOn`/`consumes.from` | `validate` exit 1 (`dangling-ref`) | Surface verbatim; re-open C4 (bad `dependsOn`) or C3 (bad `consumes.from`) |
58
+ | Corrupt/unparseable manifest (edit) | `validate` exit 1 (`corrupt-json`) | Surface ALL findings verbatim; **refuse all mutation** until repaired; never auto-repair |
59
+ | Existing manifest otherwise invalid (edit) | `validate` exit 1/2 | Surface ALL findings verbatim; **refuse all mutation** (E1) |
60
+ | Mutator would introduce cycle/dangling ref/duplicate | mutator exit 1 | Abort the edit; manifest byte-identical (atomic refusal); surface finding |
61
+ | Bad `--status` value | `set-status` exit 2 (argparse) | Surface; re-prompt via `AskUserQuestion` with the valid choices |
62
+ | Edit affects in-flight/completed feature | `render-status` derived status (`in-progress`/`complete`) | Warn naming the affected feature(s); require confirmation before applying (E4) |
63
+ | `render-status` over an invalid graph | `render-status` exit ≥ 1 | Surface findings; STOP (do not mutate over an invalid graph) |
64
+ | Git commit fails | — | Report; leave state `in-progress`; never bypass hooks (`--no-verify`/`--force`) |
@@ -0,0 +1,121 @@
1
+ ---
2
+ # GENERATED — DO NOT EDIT. Source: skills/forge-1-prd/SKILL.md. Regenerate: python3 scripts/build-adapters.py
3
+ name: forge-1-prd
4
+ description: Create a requirements PRD for a feature through structured interview. Use when user runs /feature-forge:forge-1-prd or explicitly asks to start the forge pipeline for a new feature. Do NOT trigger for general requirements discussions, project scoping outside forge, or PRD questions unrelated to the forge pipeline.
5
+ argument-hint: <feature-name>
6
+ ---
7
+
8
+ # forge-1-prd — Requirements Interviewer
9
+
10
+ Create a thorough, requirements-only PRD through relentless structured interviewing. The PRD captures WHAT the feature must do, not HOW it will be built.
11
+
12
+ ## Prerequisites
13
+
14
+ Read and follow `references/shared-conventions.md` for feature name validation, configuration reading, and force mode handling before proceeding.
15
+
16
+ ## Step 1: Read Configuration and Check State
17
+
18
+ ### Branch Setup (if using git)
19
+ If `gitCommitAfterStage` is true and the project uses git, use `AskUserQuestion` to offer: "Want me to create a `forge/{feature}` branch for this pipeline? (Recommended — keeps forge work isolated.)" If yes, create and checkout the branch before proceeding.
20
+
21
+ Set the working directory by invoking the **Feature Directory Resolution** block in `references/shared-conventions.md`, which yields `{resolvedFeatureDir}`. Note one PRD-specific caveat: at PRD time a brand-new standalone feature may have NO directory yet, so resolution is expected to fail `not-found` for a never-started standalone feature — in that case forge-1 creates `{specsDir}/{feature}/` as today. For an epic member the directory already exists (created empty by forge-0-epic with an `epic` back-pointer), so resolution succeeds and yields the nested path.
22
+
23
+ If `.pipeline-state.json` exists for this feature and `forge-1-prd` is already marked complete, use `AskUserQuestion` to warn: "A PRD already exists for '{feature}'. Continuing will create a new version. Proceed?"
24
+
25
+ ## Step 2: Examine Existing Context
26
+
27
+ Before starting the interview, invoke the **Epic Context Injection** block in `references/shared-conventions.md`. This block self-gates: it skips entirely if the feature has no `epic` back-pointer, so standalone behavior is unchanged. If this feature is an epic member, the injected charter's `exposes`/`consumes` are requirement inputs — every contract obligation must appear as a REQ in the PRD.
28
+
29
+ 1. **Check the project structure**: Read the project's build configuration and dependency manifests to understand what modules/packages exist. Look for `package.json`, `pyproject.toml`, `go.mod`, `Cargo.toml`, `pom.xml`, workspace configs, or equivalent.
30
+ 2. **Check existing specs**: Look at `{specsDir}/` for other features' PRDs to understand conventions and the overall system
31
+ 3. **Check existing docs**: Look at the docs directory for architecture documentation
32
+ 4. **Note integration surfaces**: Identify which existing packages might be relevant to this feature
33
+
34
+ This context helps you ask informed questions and spot gaps the user might not think of.
35
+
36
+ ## Step 3: Conduct the Interview
37
+
38
+ Interview the user relentlessly. Your goal is to extract complete, unambiguous requirements.
39
+
40
+ Read `references/prd-template.md` for the interview structure and question categories. Cover every category. Don't rush — missing a requirement now costs 10x to fix later.
41
+
42
+ ### CRITICAL GUARDRAIL: No Technology Decisions
43
+
44
+ The PRD is EXCLUSIVELY about requirements. You MUST enforce this boundary:
45
+
46
+ **When the user says something like:**
47
+ - "I want to use Zod for validation" → Capture as: "Runtime schema validation with type inference is required." Note their Zod preference as a constraint but not a requirement.
48
+ - "We'll store it in Drizzle/PostgreSQL" → Capture as: "Persistent storage required for X data with Y query patterns."
49
+ - "I want a React component that..." → Capture as: "A user interface is required that allows users to..."
50
+ - "We should use WebSockets for..." → Capture as: "Real-time updates are required when X changes, with latency under Y."
51
+ - "I want a REST API" → Capture as: "An HTTP-accessible interface is required for X operations"
52
+ - "We need a microservice for X" → Capture as: "X must be independently deployable and scalable"
53
+ - "Use a queue for Y" → Capture as: "Y must be processed asynchronously with guaranteed delivery"
54
+
55
+ **When YOU start drifting into technology:**
56
+ If you catch yourself writing about specific libraries, API designs, database schemas, or implementation patterns — STOP. Ask yourself: "Is this a requirement or an implementation choice?" Rewrite it as the underlying requirement.
57
+
58
+ **The one exception:** When a technology choice IS the requirement (e.g., "must integrate with the existing @repo/auth package" or "must work with our Hono backend"). These are constraints, and they belong in the Constraints section of the PRD, clearly labeled as such.
59
+
60
+ A technology constraint is valid when it stems from organizational mandate, existing infrastructure, or team expertise — not from preference. Ask "Why must it be X specifically?" If the answer is "because we already run X in production," that's a legitimate constraint. If the answer is "because it's fast," capture the performance requirement instead.
61
+
62
+ ### Interview Approach
63
+
64
+ **Turn structure:** Output your analysis or context as regular text, then use `AskUserQuestion` for the actual questions. NEVER put questions in your text output — they MUST go through `AskUserQuestion`.
65
+
66
+ **Pacing:** Cover one topic area at a time, asking 2-3 related questions per `AskUserQuestion` call. After receiving answers, probe deeper on anything incomplete before moving to the next topic. Signal progress in your text before the next question batch.
67
+
68
+ **Question strategies** (use these as content for `AskUserQuestion`, not as inline prose):
69
+ - Probe deeper after each answer: failure modes, stakeholders, minimum viable version
70
+ - Challenge assumptions: which users specifically, what does "fast" mean quantitatively
71
+ - Identify edge cases: empty input, concurrent access, scale
72
+ - Capture non-functional requirements: performance, security, accessibility, observability
73
+ - Ask about what's OUT of scope — as important as what's in scope
74
+
75
+ **Completion criteria:** The interview is complete when:
76
+ 1. Every category in `references/prd-template.md` has been covered with at least one question
77
+ 2. The user has confirmed there's nothing else to add
78
+ 3. You can draft every PRD section without leaving TBD placeholders
79
+
80
+ Before moving to Step 4, summarize your coverage as text, then use `AskUserQuestion` to ask: "Anything I'm missing?"
81
+
82
+ **Parking lot:** If the user raises a concern that belongs to a different pipeline stage, acknowledge it and note it in the pipeline state's `notes` field: "Good point — I've noted that for the [tech spec/implementation specs]. Let's continue with [current stage]."
83
+
84
+ ## Step 4: Write the PRD
85
+
86
+ Once the interview is thorough, write `{resolvedFeatureDir}/PRD.md` following the structure in `references/prd-template.md`.
87
+
88
+ Every requirement MUST have a unique ID (e.g., REQ-AUTH-01, REQ-PERF-01). These IDs are referenced by all downstream documents.
89
+
90
+ ## Step 5: Review with User
91
+
92
+ Present the complete PRD to the user. Ask:
93
+ - "Does this capture everything? Any requirements missing?"
94
+ - "Are the priorities correct?"
95
+ - "Anything in here that should be out of scope?"
96
+
97
+ Use `AskUserQuestion` to collect this feedback.
98
+
99
+ Iterate until the user confirms the PRD is complete.
100
+
101
+ ## Step 6: Update Pipeline State and Commit
102
+
103
+ Write pipeline state conforming to `references/pipeline-state-schema.json`.
104
+
105
+ 1. Create or update `{resolvedFeatureDir}/.pipeline-state.json`:
106
+ - Set `currentStage` to `forge-2-tech`
107
+ - Set `stages.forge-1-prd.version` to 1 (or increment if revising)
108
+ - Record `artifacts`, `completedAt`
109
+ - Set `stages.forge-1-prd.basedOnVersions` to `{}` (no upstream dependencies)
110
+ - Check downstream stages (`forge-2-tech`, `forge-3-specs`, `forge-4-backlog`, `forge-5-loop`, `forge-6-docs`). If any have `basedOnVersions` referencing an older version of `forge-1-prd`, set their status to `stale`.
111
+ 2. Use `AskUserQuestion` to ask: "Anything you want to note before we wrap? (preserved across sessions)"
112
+ - If yes, store in the `notes` field
113
+ 3. If `gitCommitAfterStage` is true, follow the Git Commit Protocol in `references/shared-conventions.md`: stage files, attempt commit with message `"{commitPrefix}({feature}): complete PRD v{n}"`, then set `stages.forge-1-prd.status` to `complete` with commit hash only on success. If commit fails, leave status as `in-progress`.
114
+ 5. Tell the user: "PRD complete. Next steps:\n - `/feature-forge:forge-verify {feature}` to verify the PRD\n - `/feature-forge:forge-2-tech {feature}` to start the tech spec\n - `/feature-forge:forge {feature}` to see full pipeline status"
115
+
116
+ ## Gotchas
117
+
118
+ - Users often front-load their feature description with tech decisions because that's how engineers think. Gently but firmly redirect to requirements. Don't be preachy about it — just reframe what they said.
119
+ - If the user provides a very detailed initial description, don't skip the interview. Use their description as a starting point but probe for what's missing. Long descriptions often have big gaps in edge cases and non-functional requirements.
120
+ - Don't number requirements sequentially across categories (REQ-01, REQ-02...). Use category prefixes (REQ-AUTH-01, REQ-PERF-01) so inserting new requirements doesn't require renumbering.
121
+ - The PRD should be readable by a non-technical stakeholder. If a section requires deep technical knowledge to understand, it probably belongs in the tech spec, not the PRD.
@@ -0,0 +1,106 @@
1
+ # PRD Template and Interview Guide
2
+
3
+ This reference defines the standard PRD structure and the interview questions to cover for each section.
4
+
5
+ ## PRD Document Structure
6
+
7
+ ```markdown
8
+ # {Feature Name} — Product Requirements Document
9
+
10
+ ## 1. Problem Statement
11
+ What problem does this feature solve? Who has this problem? Why does it matter now?
12
+
13
+ ## 2. User Stories
14
+ As a [role], I want [capability], so that [benefit].
15
+ - Include primary actors and secondary actors
16
+ - Include admin/operator stories, not just end-user stories
17
+
18
+ ## 3. Functional Requirements
19
+
20
+ ### 3.1 {Capability Area}
21
+ - REQ-{CAT}-01: {Requirement description}
22
+ - Priority: P0 (must have) | P1 (should have) | P2 (nice to have)
23
+ - Notes: {Any clarification}
24
+
25
+ ### 3.2 {Another Capability Area}
26
+ ...
27
+
28
+ ## 4. Non-Functional Requirements
29
+
30
+ ### 4.1 Performance
31
+ - REQ-PERF-01: ...
32
+
33
+ ### 4.2 Security
34
+ - REQ-SEC-01: ...
35
+
36
+ ### 4.3 Observability
37
+ - REQ-OBS-01: ...
38
+
39
+ ### 4.4 Accessibility
40
+ - REQ-A11Y-01: ...
41
+
42
+ ### 4.5 Scalability
43
+ - REQ-SCALE-01: ...
44
+
45
+ ## 5. Constraints
46
+ Technical, organizational, or external constraints that must be respected.
47
+ (This is where technology mandates go — e.g., "must integrate with existing @repo/auth package")
48
+
49
+ ## 6. Out of Scope
50
+ Explicitly list what this feature will NOT do in this version.
51
+
52
+ ## 7. Open Questions
53
+ Unresolved items that need answers before or during implementation.
54
+
55
+ ## 8. Success Criteria
56
+ How do we know this feature is done and working correctly?
57
+ ```
58
+
59
+ ## Interview Question Categories
60
+
61
+ Cover ALL of these areas during the interview. Don't move on until each is addressed.
62
+
63
+ ### Core Understanding
64
+ - What is the feature in one sentence?
65
+ - Who are the primary users? Secondary users? Admins/operators?
66
+ - What workflow or process does this support?
67
+ - What exists today that this replaces or augments?
68
+
69
+ ### Functional Depth
70
+ - Walk me through the happy path end to end
71
+ - What are the key data entities involved?
72
+ - What inputs does the system accept? What are valid/invalid inputs?
73
+ - What outputs does the system produce?
74
+ - What states can things be in? What transitions are allowed?
75
+ - What happens when the user makes a mistake?
76
+
77
+ ### Error and Edge Cases
78
+ - What happens when X is unavailable?
79
+ - What if two users do Y at the same time?
80
+ - What happens with empty inputs? Huge inputs? Malformed inputs?
81
+ - What does partial failure look like?
82
+ - How should the system recover from crashes mid-operation?
83
+
84
+ ### Integration
85
+ - What existing parts of the system does this interact with?
86
+ - What data does it need from other features?
87
+ - What data does it provide to other features?
88
+ - Are there external systems or APIs involved?
89
+
90
+ ### Non-Functional
91
+ - What's the expected load? (requests/sec, concurrent users, data volume)
92
+ - What are the latency requirements?
93
+ - What security considerations exist? (authn, authz, data sensitivity)
94
+ - What needs to be logged, monitored, or alerted on?
95
+ - Are there accessibility requirements?
96
+
97
+ ### Scope and Priority
98
+ - What's the minimum viable version of this?
99
+ - What would you cut if you had to ship in half the time?
100
+ - What's explicitly NOT part of this feature?
101
+ - Are there follow-up features that depend on decisions made here?
102
+
103
+ ### Success
104
+ - How do you know this feature is working correctly?
105
+ - What would a user complain about if we got it wrong?
106
+ - Are there quantitative targets? (latency < Xms, uptime > Y%)