@garygentry/feature-forge 0.2.14 → 0.3.1

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 (486) hide show
  1. package/README.md +6 -3
  2. package/adapters/GENERATION-REPORT.md +20 -0
  3. package/adapters/claude/.feature-forge-bundle.json +1 -1
  4. package/adapters/claude/agents/forge-verifier.md +1 -1
  5. package/adapters/claude/references/forge-config-schema.json +2 -2
  6. package/adapters/claude/references/pipeline-state-schema.json +1 -1
  7. package/adapters/claude/references/shared-conventions.md +62 -12
  8. package/adapters/claude/references/stage-exit-protocol.md +14 -4
  9. package/adapters/claude/references/vendor-construct-inventory.md +1 -1
  10. package/adapters/claude/scripts/epic-manifest.py +49 -6
  11. package/adapters/claude/scripts/forge-root.sh +47 -3
  12. package/adapters/claude/scripts/forge-session.py +1179 -9
  13. package/adapters/claude/scripts/validate-traceability.py +6 -1
  14. package/adapters/claude/skills/forge/SKILL.md +11 -5
  15. package/adapters/claude/skills/forge/references/pipeline-state-schema.json +1 -1
  16. package/adapters/claude/skills/forge/references/shared-conventions.md +62 -12
  17. package/adapters/claude/skills/forge/references/stage-exit-protocol.md +14 -4
  18. package/adapters/claude/skills/forge-0-epic/SKILL.md +1 -1
  19. package/adapters/claude/skills/forge-0-epic/references/pipeline-state-schema.json +1 -1
  20. package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +62 -12
  21. package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +14 -4
  22. package/adapters/claude/skills/forge-1-prd/SKILL.md +25 -8
  23. package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +62 -12
  24. package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +14 -4
  25. package/adapters/claude/skills/forge-2-tech/SKILL.md +25 -7
  26. package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +62 -12
  27. package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +14 -4
  28. package/adapters/claude/skills/forge-3-specs/SKILL.md +24 -7
  29. package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +62 -12
  30. package/adapters/claude/skills/forge-3-specs/references/stage-exit-protocol.md +14 -4
  31. package/adapters/claude/skills/forge-4-backlog/SKILL.md +23 -7
  32. package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +62 -12
  33. package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +14 -4
  34. package/adapters/claude/skills/forge-5-loop/SKILL.md +25 -25
  35. package/adapters/claude/skills/forge-5-loop/references/agent-selection.md +116 -0
  36. package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +14 -107
  37. package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +62 -12
  38. package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +14 -4
  39. package/adapters/claude/skills/forge-6-docs/SKILL.md +11 -5
  40. package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +62 -12
  41. package/adapters/claude/skills/forge-fix/references/shared-conventions.md +62 -12
  42. package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +14 -4
  43. package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +2 -2
  44. package/adapters/claude/skills/forge-guide/references/shared-conventions.md +62 -12
  45. package/adapters/claude/skills/forge-verify/SKILL.md +22 -12
  46. package/adapters/claude/skills/forge-verify/references/findings-template.md +157 -0
  47. package/adapters/claude/skills/forge-verify/references/pipeline-state-schema.json +1 -1
  48. package/adapters/claude/skills/forge-verify/references/shared-conventions.md +62 -12
  49. package/adapters/claude/skills/forge-verify/references/verification-checklists/backlog.md +97 -0
  50. package/adapters/claude/skills/forge-verify/references/verification-checklists/epic.md +79 -0
  51. package/adapters/claude/skills/forge-verify/references/verification-checklists/impl.md +48 -0
  52. package/adapters/claude/skills/forge-verify/references/verification-checklists/prd.md +31 -0
  53. package/adapters/claude/skills/forge-verify/references/verification-checklists/specs.md +64 -0
  54. package/adapters/claude/skills/forge-verify/references/verification-checklists/tech.md +35 -0
  55. package/adapters/codex/.feature-forge-bundle.json +1 -1
  56. package/adapters/codex/agents/forge-verifier.toml +1 -1
  57. package/adapters/codex/references/forge-config-schema.json +2 -2
  58. package/adapters/codex/references/pipeline-state-schema.json +1 -1
  59. package/adapters/codex/references/shared-conventions.md +62 -12
  60. package/adapters/codex/references/stage-exit-protocol.md +14 -4
  61. package/adapters/codex/references/vendor-construct-inventory.md +1 -1
  62. package/adapters/codex/scripts/epic-manifest.py +49 -6
  63. package/adapters/codex/scripts/forge-root.sh +47 -3
  64. package/adapters/codex/scripts/forge-session.py +1179 -9
  65. package/adapters/codex/scripts/validate-traceability.py +6 -1
  66. package/adapters/codex/skills/forge/SKILL.md +11 -5
  67. package/adapters/codex/skills/forge/references/pipeline-state-schema.json +1 -1
  68. package/adapters/codex/skills/forge/references/shared-conventions.md +62 -12
  69. package/adapters/codex/skills/forge/references/stage-exit-protocol.md +14 -4
  70. package/adapters/codex/skills/forge-0-epic/SKILL.md +1 -1
  71. package/adapters/codex/skills/forge-0-epic/references/pipeline-state-schema.json +1 -1
  72. package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +62 -12
  73. package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +14 -4
  74. package/adapters/codex/skills/forge-1-prd/SKILL.md +25 -8
  75. package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +62 -12
  76. package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +14 -4
  77. package/adapters/codex/skills/forge-2-tech/SKILL.md +25 -7
  78. package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +62 -12
  79. package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +14 -4
  80. package/adapters/codex/skills/forge-3-specs/SKILL.md +24 -7
  81. package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +62 -12
  82. package/adapters/codex/skills/forge-3-specs/references/stage-exit-protocol.md +14 -4
  83. package/adapters/codex/skills/forge-4-backlog/SKILL.md +23 -7
  84. package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +62 -12
  85. package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +14 -4
  86. package/adapters/codex/skills/forge-5-loop/SKILL.md +25 -25
  87. package/adapters/codex/skills/forge-5-loop/references/agent-selection.md +116 -0
  88. package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +14 -107
  89. package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +62 -12
  90. package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +14 -4
  91. package/adapters/codex/skills/forge-6-docs/SKILL.md +11 -5
  92. package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +62 -12
  93. package/adapters/codex/skills/forge-fix/references/shared-conventions.md +62 -12
  94. package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +14 -4
  95. package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +2 -2
  96. package/adapters/codex/skills/forge-guide/references/shared-conventions.md +62 -12
  97. package/adapters/codex/skills/forge-verify/SKILL.md +22 -12
  98. package/adapters/codex/skills/forge-verify/references/findings-template.md +157 -0
  99. package/adapters/codex/skills/forge-verify/references/pipeline-state-schema.json +1 -1
  100. package/adapters/codex/skills/forge-verify/references/shared-conventions.md +62 -12
  101. package/adapters/codex/skills/forge-verify/references/verification-checklists/backlog.md +97 -0
  102. package/adapters/codex/skills/forge-verify/references/verification-checklists/epic.md +79 -0
  103. package/adapters/codex/skills/forge-verify/references/verification-checklists/impl.md +48 -0
  104. package/adapters/codex/skills/forge-verify/references/verification-checklists/prd.md +31 -0
  105. package/adapters/codex/skills/forge-verify/references/verification-checklists/specs.md +64 -0
  106. package/adapters/codex/skills/forge-verify/references/verification-checklists/tech.md +35 -0
  107. package/adapters/copilot/.feature-forge-bundle.json +1 -1
  108. package/adapters/copilot/agents/forge-verifier.md +1 -1
  109. package/adapters/copilot/references/forge-config-schema.json +2 -2
  110. package/adapters/copilot/references/pipeline-state-schema.json +1 -1
  111. package/adapters/copilot/references/shared-conventions.md +62 -12
  112. package/adapters/copilot/references/stage-exit-protocol.md +14 -4
  113. package/adapters/copilot/references/vendor-construct-inventory.md +1 -1
  114. package/adapters/copilot/scripts/epic-manifest.py +49 -6
  115. package/adapters/copilot/scripts/forge-root.sh +47 -3
  116. package/adapters/copilot/scripts/forge-session.py +1179 -9
  117. package/adapters/copilot/scripts/validate-traceability.py +6 -1
  118. package/adapters/copilot/skills/forge/forge.md +11 -5
  119. package/adapters/copilot/skills/forge/references/pipeline-state-schema.json +1 -1
  120. package/adapters/copilot/skills/forge/references/shared-conventions.md +62 -12
  121. package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +14 -4
  122. package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +1 -1
  123. package/adapters/copilot/skills/forge-0-epic/references/pipeline-state-schema.json +1 -1
  124. package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +62 -12
  125. package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +14 -4
  126. package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +25 -8
  127. package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +62 -12
  128. package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +14 -4
  129. package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +25 -7
  130. package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +62 -12
  131. package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +14 -4
  132. package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +24 -7
  133. package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +62 -12
  134. package/adapters/copilot/skills/forge-3-specs/references/stage-exit-protocol.md +14 -4
  135. package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +23 -7
  136. package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +62 -12
  137. package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +14 -4
  138. package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +25 -25
  139. package/adapters/copilot/skills/forge-5-loop/references/agent-selection.md +116 -0
  140. package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +14 -107
  141. package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +62 -12
  142. package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +14 -4
  143. package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +11 -5
  144. package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +62 -12
  145. package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +62 -12
  146. package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +14 -4
  147. package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +2 -2
  148. package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +62 -12
  149. package/adapters/copilot/skills/forge-verify/forge-verify.md +22 -12
  150. package/adapters/copilot/skills/forge-verify/references/findings-template.md +157 -0
  151. package/adapters/copilot/skills/forge-verify/references/pipeline-state-schema.json +1 -1
  152. package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +62 -12
  153. package/adapters/copilot/skills/forge-verify/references/verification-checklists/backlog.md +97 -0
  154. package/adapters/copilot/skills/forge-verify/references/verification-checklists/epic.md +79 -0
  155. package/adapters/copilot/skills/forge-verify/references/verification-checklists/impl.md +48 -0
  156. package/adapters/copilot/skills/forge-verify/references/verification-checklists/prd.md +31 -0
  157. package/adapters/copilot/skills/forge-verify/references/verification-checklists/specs.md +64 -0
  158. package/adapters/copilot/skills/forge-verify/references/verification-checklists/tech.md +35 -0
  159. package/adapters/cursor/.feature-forge-bundle.json +1 -1
  160. package/adapters/cursor/agents/forge-verifier.mdc +1 -1
  161. package/adapters/cursor/references/forge-config-schema.json +2 -2
  162. package/adapters/cursor/references/pipeline-state-schema.json +1 -1
  163. package/adapters/cursor/references/shared-conventions.md +62 -12
  164. package/adapters/cursor/references/stage-exit-protocol.md +14 -4
  165. package/adapters/cursor/references/vendor-construct-inventory.md +1 -1
  166. package/adapters/cursor/scripts/epic-manifest.py +49 -6
  167. package/adapters/cursor/scripts/forge-root.sh +47 -3
  168. package/adapters/cursor/scripts/forge-session.py +1179 -9
  169. package/adapters/cursor/scripts/validate-traceability.py +6 -1
  170. package/adapters/cursor/skills/forge/forge.mdc +11 -5
  171. package/adapters/cursor/skills/forge/references/pipeline-state-schema.json +1 -1
  172. package/adapters/cursor/skills/forge/references/shared-conventions.md +62 -12
  173. package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +14 -4
  174. package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +1 -1
  175. package/adapters/cursor/skills/forge-0-epic/references/pipeline-state-schema.json +1 -1
  176. package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +62 -12
  177. package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +14 -4
  178. package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +25 -8
  179. package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +62 -12
  180. package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +14 -4
  181. package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +25 -7
  182. package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +62 -12
  183. package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +14 -4
  184. package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +24 -7
  185. package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +62 -12
  186. package/adapters/cursor/skills/forge-3-specs/references/stage-exit-protocol.md +14 -4
  187. package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +23 -7
  188. package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +62 -12
  189. package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +14 -4
  190. package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +25 -25
  191. package/adapters/cursor/skills/forge-5-loop/references/agent-selection.md +116 -0
  192. package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +14 -107
  193. package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +62 -12
  194. package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +14 -4
  195. package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +11 -5
  196. package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +62 -12
  197. package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +62 -12
  198. package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +14 -4
  199. package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +2 -2
  200. package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +62 -12
  201. package/adapters/cursor/skills/forge-verify/forge-verify.mdc +22 -12
  202. package/adapters/cursor/skills/forge-verify/references/findings-template.md +157 -0
  203. package/adapters/cursor/skills/forge-verify/references/pipeline-state-schema.json +1 -1
  204. package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +62 -12
  205. package/adapters/cursor/skills/forge-verify/references/verification-checklists/backlog.md +97 -0
  206. package/adapters/cursor/skills/forge-verify/references/verification-checklists/epic.md +79 -0
  207. package/adapters/cursor/skills/forge-verify/references/verification-checklists/impl.md +48 -0
  208. package/adapters/cursor/skills/forge-verify/references/verification-checklists/prd.md +31 -0
  209. package/adapters/cursor/skills/forge-verify/references/verification-checklists/specs.md +64 -0
  210. package/adapters/cursor/skills/forge-verify/references/verification-checklists/tech.md +35 -0
  211. package/adapters/gemini/.feature-forge-bundle.json +1 -1
  212. package/adapters/gemini/agents/forge-verifier.md +1 -1
  213. package/adapters/gemini/gemini-extension.json +1 -1
  214. package/adapters/gemini/references/forge-config-schema.json +2 -2
  215. package/adapters/gemini/references/pipeline-state-schema.json +1 -1
  216. package/adapters/gemini/references/shared-conventions.md +62 -12
  217. package/adapters/gemini/references/stage-exit-protocol.md +14 -4
  218. package/adapters/gemini/references/vendor-construct-inventory.md +1 -1
  219. package/adapters/gemini/scripts/epic-manifest.py +49 -6
  220. package/adapters/gemini/scripts/forge-root.sh +47 -3
  221. package/adapters/gemini/scripts/forge-session.py +1179 -9
  222. package/adapters/gemini/scripts/validate-traceability.py +6 -1
  223. package/adapters/gemini/skills/forge/forge.md +11 -5
  224. package/adapters/gemini/skills/forge/references/pipeline-state-schema.json +1 -1
  225. package/adapters/gemini/skills/forge/references/shared-conventions.md +62 -12
  226. package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +14 -4
  227. package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +1 -1
  228. package/adapters/gemini/skills/forge-0-epic/references/pipeline-state-schema.json +1 -1
  229. package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +62 -12
  230. package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +14 -4
  231. package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +25 -8
  232. package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +62 -12
  233. package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +14 -4
  234. package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +25 -7
  235. package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +62 -12
  236. package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +14 -4
  237. package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +24 -7
  238. package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +62 -12
  239. package/adapters/gemini/skills/forge-3-specs/references/stage-exit-protocol.md +14 -4
  240. package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +23 -7
  241. package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +62 -12
  242. package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +14 -4
  243. package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +25 -25
  244. package/adapters/gemini/skills/forge-5-loop/references/agent-selection.md +116 -0
  245. package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +14 -107
  246. package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +62 -12
  247. package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +14 -4
  248. package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +11 -5
  249. package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +62 -12
  250. package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +62 -12
  251. package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +14 -4
  252. package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +2 -2
  253. package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +62 -12
  254. package/adapters/gemini/skills/forge-verify/forge-verify.md +22 -12
  255. package/adapters/gemini/skills/forge-verify/references/findings-template.md +157 -0
  256. package/adapters/gemini/skills/forge-verify/references/pipeline-state-schema.json +1 -1
  257. package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +62 -12
  258. package/adapters/gemini/skills/forge-verify/references/verification-checklists/backlog.md +97 -0
  259. package/adapters/gemini/skills/forge-verify/references/verification-checklists/epic.md +79 -0
  260. package/adapters/gemini/skills/forge-verify/references/verification-checklists/impl.md +48 -0
  261. package/adapters/gemini/skills/forge-verify/references/verification-checklists/prd.md +31 -0
  262. package/adapters/gemini/skills/forge-verify/references/verification-checklists/specs.md +64 -0
  263. package/adapters/gemini/skills/forge-verify/references/verification-checklists/tech.md +35 -0
  264. package/adapters/pi/.feature-forge-bundle.json +6 -0
  265. package/adapters/pi/agents/forge-researcher.md +139 -0
  266. package/adapters/pi/agents/forge-spec-writer.md +116 -0
  267. package/adapters/pi/agents/forge-verifier.md +126 -0
  268. package/adapters/pi/extensions/ask-user-question/LICENSE +21 -0
  269. package/adapters/pi/extensions/ask-user-question/README.md +91 -0
  270. package/adapters/pi/extensions/ask-user-question/ask-user-question.ts +298 -0
  271. package/adapters/pi/extensions/ask-user-question/config.ts +78 -0
  272. package/adapters/pi/extensions/ask-user-question/events.ts +57 -0
  273. package/adapters/pi/extensions/ask-user-question/index.ts +61 -0
  274. package/adapters/pi/extensions/ask-user-question/locales/de.json +27 -0
  275. package/adapters/pi/extensions/ask-user-question/locales/en.json +27 -0
  276. package/adapters/pi/extensions/ask-user-question/locales/es.json +27 -0
  277. package/adapters/pi/extensions/ask-user-question/locales/fr.json +27 -0
  278. package/adapters/pi/extensions/ask-user-question/locales/pt-BR.json +27 -0
  279. package/adapters/pi/extensions/ask-user-question/locales/pt.json +27 -0
  280. package/adapters/pi/extensions/ask-user-question/locales/ru.json +27 -0
  281. package/adapters/pi/extensions/ask-user-question/locales/uk.json +27 -0
  282. package/adapters/pi/extensions/ask-user-question/locales/zh.json +29 -0
  283. package/adapters/pi/extensions/ask-user-question/reconcile.ts +49 -0
  284. package/adapters/pi/extensions/ask-user-question/rpc-fallback.ts +168 -0
  285. package/adapters/pi/extensions/ask-user-question/state/build-questionnaire.ts +302 -0
  286. package/adapters/pi/extensions/ask-user-question/state/i18n-bridge.ts +53 -0
  287. package/adapters/pi/extensions/ask-user-question/state/key-router.ts +277 -0
  288. package/adapters/pi/extensions/ask-user-question/state/questionnaire-session.ts +234 -0
  289. package/adapters/pi/extensions/ask-user-question/state/row-intent.ts +145 -0
  290. package/adapters/pi/extensions/ask-user-question/state/selectors/contract.ts +26 -0
  291. package/adapters/pi/extensions/ask-user-question/state/selectors/derivations.ts +42 -0
  292. package/adapters/pi/extensions/ask-user-question/state/selectors/focus.ts +19 -0
  293. package/adapters/pi/extensions/ask-user-question/state/selectors/projections.ts +101 -0
  294. package/adapters/pi/extensions/ask-user-question/state/state-reducer.ts +292 -0
  295. package/adapters/pi/extensions/ask-user-question/state/state.ts +55 -0
  296. package/adapters/pi/extensions/ask-user-question/tool/format-answer.ts +31 -0
  297. package/adapters/pi/extensions/ask-user-question/tool/response-envelope.ts +49 -0
  298. package/adapters/pi/extensions/ask-user-question/tool/types.ts +147 -0
  299. package/adapters/pi/extensions/ask-user-question/tool/validate-questionnaire.ts +58 -0
  300. package/adapters/pi/extensions/ask-user-question/vendor-config-shim.ts +65 -0
  301. package/adapters/pi/extensions/ask-user-question/view/component-binding.ts +47 -0
  302. package/adapters/pi/extensions/ask-user-question/view/components/inline-input.ts +98 -0
  303. package/adapters/pi/extensions/ask-user-question/view/components/multi-select-view.ts +193 -0
  304. package/adapters/pi/extensions/ask-user-question/view/components/option-list-view.ts +70 -0
  305. package/adapters/pi/extensions/ask-user-question/view/components/preview/markdown-content-cache.ts +79 -0
  306. package/adapters/pi/extensions/ask-user-question/view/components/preview/preview-block-renderer.ts +111 -0
  307. package/adapters/pi/extensions/ask-user-question/view/components/preview/preview-box-renderer.ts +88 -0
  308. package/adapters/pi/extensions/ask-user-question/view/components/preview/preview-layout-decider.ts +202 -0
  309. package/adapters/pi/extensions/ask-user-question/view/components/preview/preview-pane.ts +228 -0
  310. package/adapters/pi/extensions/ask-user-question/view/components/submit-picker.ts +67 -0
  311. package/adapters/pi/extensions/ask-user-question/view/components/tab-bar.ts +59 -0
  312. package/adapters/pi/extensions/ask-user-question/view/components/wrapping-select.ts +293 -0
  313. package/adapters/pi/extensions/ask-user-question/view/dialog-builder.ts +224 -0
  314. package/adapters/pi/extensions/ask-user-question/view/props-adapter.ts +125 -0
  315. package/adapters/pi/extensions/ask-user-question/view/stateful-view.ts +26 -0
  316. package/adapters/pi/extensions/ask-user-question/view/tab-components.ts +18 -0
  317. package/adapters/pi/extensions/ask-user-question/view/tab-content-strategy.ts +252 -0
  318. package/adapters/pi/package.json +26 -0
  319. package/adapters/pi/references/epic-manifest-schema.json +125 -0
  320. package/adapters/{claude/skills/forge-5-loop → pi}/references/forge-config-schema.json +4 -4
  321. package/adapters/{claude/skills/forge-1-prd → pi}/references/pipeline-state-schema.json +1 -1
  322. package/adapters/pi/references/portable-root.md +71 -0
  323. package/adapters/pi/references/process-overview.md +143 -0
  324. package/adapters/pi/references/ralph-loop-contract.md +221 -0
  325. package/adapters/pi/references/shared-conventions.md +345 -0
  326. package/adapters/pi/references/skill-frontmatter.schema.json +17 -0
  327. package/adapters/pi/references/stack-resolution.md +54 -0
  328. package/adapters/pi/references/stacks/_generic.md +111 -0
  329. package/adapters/pi/references/stacks/go.md +157 -0
  330. package/adapters/pi/references/stacks/python.md +184 -0
  331. package/adapters/pi/references/stacks/rust.md +170 -0
  332. package/adapters/pi/references/stacks/typescript.md +134 -0
  333. package/adapters/pi/references/stage-exit-protocol.md +268 -0
  334. package/adapters/pi/references/templates/specs-hygiene/AGENTS.md +32 -0
  335. package/adapters/pi/references/templates/specs-hygiene/CLAUDE.md +31 -0
  336. package/adapters/pi/references/vendor-construct-inventory.md +50 -0
  337. package/adapters/pi/scripts/epic-manifest.py +1737 -0
  338. package/adapters/pi/scripts/forge-bootstrap.py +1070 -0
  339. package/adapters/pi/scripts/forge-init.sh +58 -0
  340. package/adapters/pi/scripts/forge-root.sh +179 -0
  341. package/adapters/pi/scripts/forge-session.py +3036 -0
  342. package/adapters/pi/scripts/validate-traceability.py +155 -0
  343. package/adapters/pi/skills/forge/SKILL.md +249 -0
  344. package/adapters/{claude/skills/forge-4-backlog → pi/skills/forge}/references/pipeline-state-schema.json +1 -1
  345. package/adapters/pi/skills/forge/references/process-overview.md +143 -0
  346. package/adapters/pi/skills/forge/references/shared-conventions.md +345 -0
  347. package/adapters/pi/skills/forge/references/stage-exit-protocol.md +268 -0
  348. package/adapters/pi/skills/forge-0-epic/SKILL.md +308 -0
  349. package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +266 -0
  350. package/adapters/pi/skills/forge-0-epic/references/epic-manifest-subcommands.md +75 -0
  351. package/adapters/{claude/skills/forge-2-tech → pi/skills/forge-0-epic}/references/pipeline-state-schema.json +1 -1
  352. package/adapters/pi/skills/forge-0-epic/references/portable-root.md +71 -0
  353. package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +345 -0
  354. package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +268 -0
  355. package/adapters/pi/skills/forge-1-prd/SKILL.md +181 -0
  356. package/adapters/pi/skills/forge-1-prd/references/prd-template.md +106 -0
  357. package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +345 -0
  358. package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +268 -0
  359. package/adapters/pi/skills/forge-2-tech/SKILL.md +243 -0
  360. package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +345 -0
  361. package/adapters/pi/skills/forge-2-tech/references/stack-discovery-checklist.md +95 -0
  362. package/adapters/pi/skills/forge-2-tech/references/stack-resolution.md +54 -0
  363. package/adapters/pi/skills/forge-2-tech/references/stacks/_generic.md +111 -0
  364. package/adapters/pi/skills/forge-2-tech/references/stacks/go.md +157 -0
  365. package/adapters/pi/skills/forge-2-tech/references/stacks/python.md +184 -0
  366. package/adapters/pi/skills/forge-2-tech/references/stacks/rust.md +170 -0
  367. package/adapters/pi/skills/forge-2-tech/references/stacks/typescript.md +134 -0
  368. package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +268 -0
  369. package/adapters/pi/skills/forge-3-specs/SKILL.md +195 -0
  370. package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +345 -0
  371. package/adapters/pi/skills/forge-3-specs/references/spec-archetypes.md +106 -0
  372. package/adapters/pi/skills/forge-3-specs/references/spec-examples.md +71 -0
  373. package/adapters/pi/skills/forge-3-specs/references/stacks/_generic.md +111 -0
  374. package/adapters/pi/skills/forge-3-specs/references/stacks/go.md +157 -0
  375. package/adapters/pi/skills/forge-3-specs/references/stacks/python.md +184 -0
  376. package/adapters/pi/skills/forge-3-specs/references/stacks/rust.md +170 -0
  377. package/adapters/pi/skills/forge-3-specs/references/stacks/typescript.md +134 -0
  378. package/adapters/pi/skills/forge-3-specs/references/stage-exit-protocol.md +268 -0
  379. package/adapters/pi/skills/forge-4-backlog/SKILL.md +191 -0
  380. package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +345 -0
  381. package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +268 -0
  382. package/adapters/pi/skills/forge-5-loop/SKILL.md +314 -0
  383. package/adapters/pi/skills/forge-5-loop/references/agent-selection.md +116 -0
  384. package/adapters/pi/skills/forge-5-loop/references/ralph-loop-contract.md +221 -0
  385. package/adapters/pi/skills/forge-5-loop/references/result-reporting.md +85 -0
  386. package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +248 -0
  387. package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +345 -0
  388. package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +268 -0
  389. package/adapters/pi/skills/forge-6-docs/SKILL.md +208 -0
  390. package/adapters/pi/skills/forge-6-docs/references/doc-conventions.md +126 -0
  391. package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +345 -0
  392. package/adapters/pi/skills/forge-bootstrap/SKILL.md +250 -0
  393. package/adapters/pi/skills/forge-bootstrap/references/templates/ci/github-actions.yml +12 -0
  394. package/adapters/pi/skills/forge-bootstrap/references/templates/generic/run.sh +3 -0
  395. package/adapters/pi/skills/forge-bootstrap/references/templates/generic/test.sh +13 -0
  396. package/adapters/pi/skills/forge-bootstrap/references/templates/go/go.mod +3 -0
  397. package/adapters/pi/skills/forge-bootstrap/references/templates/go/main.go +12 -0
  398. package/adapters/pi/skills/forge-bootstrap/references/templates/go/main_test.go +11 -0
  399. package/adapters/pi/skills/forge-bootstrap/references/templates/hygiene/AGENTS.md +35 -0
  400. package/adapters/pi/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +36 -0
  401. package/adapters/pi/skills/forge-bootstrap/references/templates/hygiene/README.md +11 -0
  402. package/adapters/pi/skills/forge-bootstrap/references/templates/licenses/Apache-2.0/LICENSE +198 -0
  403. package/adapters/pi/skills/forge-bootstrap/references/templates/licenses/MIT/LICENSE +21 -0
  404. package/adapters/pi/skills/forge-bootstrap/references/templates/python/pyproject.toml +24 -0
  405. package/adapters/pi/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/__init__.py +5 -0
  406. package/adapters/pi/skills/forge-bootstrap/references/templates/python/src/{{PKG}}/main.py +13 -0
  407. package/adapters/pi/skills/forge-bootstrap/references/templates/python/tests/test_smoke.py +8 -0
  408. package/adapters/pi/skills/forge-bootstrap/references/templates/rust/Cargo.toml +15 -0
  409. package/adapters/pi/skills/forge-bootstrap/references/templates/rust/src/lib.rs +7 -0
  410. package/adapters/pi/skills/forge-bootstrap/references/templates/rust/src/main.rs +5 -0
  411. package/adapters/pi/skills/forge-bootstrap/references/templates/rust/tests/smoke.rs +6 -0
  412. package/adapters/pi/skills/forge-bootstrap/references/templates/typescript/package.json +15 -0
  413. package/adapters/pi/skills/forge-bootstrap/references/templates/typescript/src/index.ts +4 -0
  414. package/adapters/pi/skills/forge-bootstrap/references/templates/typescript/test/smoke.test.ts +6 -0
  415. package/adapters/pi/skills/forge-bootstrap/references/templates/typescript/tsconfig.json +14 -0
  416. package/adapters/pi/skills/forge-fix/SKILL.md +98 -0
  417. package/adapters/pi/skills/forge-fix/references/shared-conventions.md +345 -0
  418. package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +268 -0
  419. package/adapters/pi/skills/forge-guide/SKILL.md +192 -0
  420. package/adapters/{codex/skills/forge-4-backlog → pi/skills/forge-guide}/references/forge-config-schema.json +4 -4
  421. package/adapters/pi/skills/forge-guide/references/process-overview.md +143 -0
  422. package/adapters/pi/skills/forge-guide/references/ralph-loop-contract.md +221 -0
  423. package/adapters/pi/skills/forge-guide/references/shared-conventions.md +345 -0
  424. package/adapters/pi/skills/forge-guide/references/stack-resolution.md +54 -0
  425. package/adapters/pi/skills/forge-guide/references/stacks/_generic.md +111 -0
  426. package/adapters/pi/skills/forge-guide/references/stacks/go.md +157 -0
  427. package/adapters/pi/skills/forge-guide/references/stacks/python.md +184 -0
  428. package/adapters/pi/skills/forge-guide/references/stacks/rust.md +170 -0
  429. package/adapters/pi/skills/forge-guide/references/stacks/typescript.md +134 -0
  430. package/adapters/pi/skills/forge-init/SKILL.md +72 -0
  431. package/adapters/pi/skills/forge-verify/SKILL.md +283 -0
  432. package/adapters/pi/skills/forge-verify/references/findings-template.md +157 -0
  433. package/adapters/{claude/skills/forge-3-specs → pi/skills/forge-verify}/references/pipeline-state-schema.json +1 -1
  434. package/adapters/pi/skills/forge-verify/references/shared-conventions.md +345 -0
  435. package/adapters/pi/skills/forge-verify/references/verification-checklists/backlog.md +97 -0
  436. package/adapters/pi/skills/forge-verify/references/verification-checklists/epic.md +79 -0
  437. package/adapters/pi/skills/forge-verify/references/verification-checklists/impl.md +48 -0
  438. package/adapters/pi/skills/forge-verify/references/verification-checklists/prd.md +31 -0
  439. package/adapters/pi/skills/forge-verify/references/verification-checklists/specs.md +64 -0
  440. package/adapters/pi/skills/forge-verify/references/verification-checklists/tech.md +35 -0
  441. package/dist/agent-targets.d.ts +1 -1
  442. package/dist/agent-targets.js +23 -3
  443. package/dist/detect.d.ts +1 -1
  444. package/dist/detect.js +2 -1
  445. package/dist/manifest.d.ts +1 -1
  446. package/dist/manifest.js +2 -2
  447. package/dist/placements.js +5 -1
  448. package/dist/rauf.d.ts +4 -4
  449. package/dist/rauf.js +3 -3
  450. package/dist/types.d.ts +31 -6
  451. package/dist/types.js +6 -3
  452. package/package.json +14 -3
  453. package/adapters/claude/skills/forge-4-backlog/references/forge-config-schema.json +0 -236
  454. package/adapters/claude/skills/forge-6-docs/references/pipeline-state-schema.json +0 -191
  455. package/adapters/claude/skills/forge-verify/references/verification-checklists.md +0 -477
  456. package/adapters/codex/skills/forge-1-prd/references/pipeline-state-schema.json +0 -191
  457. package/adapters/codex/skills/forge-2-tech/references/pipeline-state-schema.json +0 -191
  458. package/adapters/codex/skills/forge-3-specs/references/pipeline-state-schema.json +0 -191
  459. package/adapters/codex/skills/forge-4-backlog/references/pipeline-state-schema.json +0 -191
  460. package/adapters/codex/skills/forge-5-loop/references/forge-config-schema.json +0 -236
  461. package/adapters/codex/skills/forge-6-docs/references/pipeline-state-schema.json +0 -191
  462. package/adapters/codex/skills/forge-verify/references/verification-checklists.md +0 -477
  463. package/adapters/copilot/skills/forge-1-prd/references/pipeline-state-schema.json +0 -191
  464. package/adapters/copilot/skills/forge-2-tech/references/pipeline-state-schema.json +0 -191
  465. package/adapters/copilot/skills/forge-3-specs/references/pipeline-state-schema.json +0 -191
  466. package/adapters/copilot/skills/forge-4-backlog/references/forge-config-schema.json +0 -236
  467. package/adapters/copilot/skills/forge-4-backlog/references/pipeline-state-schema.json +0 -191
  468. package/adapters/copilot/skills/forge-5-loop/references/forge-config-schema.json +0 -236
  469. package/adapters/copilot/skills/forge-6-docs/references/pipeline-state-schema.json +0 -191
  470. package/adapters/copilot/skills/forge-verify/references/verification-checklists.md +0 -477
  471. package/adapters/cursor/skills/forge-1-prd/references/pipeline-state-schema.json +0 -191
  472. package/adapters/cursor/skills/forge-2-tech/references/pipeline-state-schema.json +0 -191
  473. package/adapters/cursor/skills/forge-3-specs/references/pipeline-state-schema.json +0 -191
  474. package/adapters/cursor/skills/forge-4-backlog/references/forge-config-schema.json +0 -236
  475. package/adapters/cursor/skills/forge-4-backlog/references/pipeline-state-schema.json +0 -191
  476. package/adapters/cursor/skills/forge-5-loop/references/forge-config-schema.json +0 -236
  477. package/adapters/cursor/skills/forge-6-docs/references/pipeline-state-schema.json +0 -191
  478. package/adapters/cursor/skills/forge-verify/references/verification-checklists.md +0 -477
  479. package/adapters/gemini/skills/forge-1-prd/references/pipeline-state-schema.json +0 -191
  480. package/adapters/gemini/skills/forge-2-tech/references/pipeline-state-schema.json +0 -191
  481. package/adapters/gemini/skills/forge-3-specs/references/pipeline-state-schema.json +0 -191
  482. package/adapters/gemini/skills/forge-4-backlog/references/forge-config-schema.json +0 -236
  483. package/adapters/gemini/skills/forge-4-backlog/references/pipeline-state-schema.json +0 -191
  484. package/adapters/gemini/skills/forge-5-loop/references/forge-config-schema.json +0 -236
  485. package/adapters/gemini/skills/forge-6-docs/references/pipeline-state-schema.json +0 -191
  486. package/adapters/gemini/skills/forge-verify/references/verification-checklists.md +0 -477
@@ -0,0 +1,125 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "https://feature-forge/references/epic-manifest-schema.json",
4
+ "title": "Feature Forge Epic Manifest",
5
+ "description": "Canonical record of an epic's membership, dependency edges, charters, and contracts. Lives at {specsDir}/{epic}/epic-manifest.json. Carries NO per-feature status field (REQ-STATE-02); status is derived live from each member's .pipeline-state.json.",
6
+ "type": "object",
7
+ "required": ["schemaVersion", "epic", "description", "status", "narrativeDoc", "createdAt", "updatedAt", "features"],
8
+ "additionalProperties": false,
9
+ "properties": {
10
+ "schemaVersion": {
11
+ "const": 1,
12
+ "description": "Schema evolution guard."
13
+ },
14
+ "epic": {
15
+ "type": "string",
16
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
17
+ "description": "Matches the epic subtree directory name. Globally unique, kebab-case."
18
+ },
19
+ "description": {
20
+ "type": "string",
21
+ "description": "One-paragraph epic summary."
22
+ },
23
+ "status": {
24
+ "type": "string",
25
+ "enum": ["active", "paused", "abandoned", "complete"],
26
+ "description": "Epic lifecycle state (REQ-ORCH-05)."
27
+ },
28
+ "narrativeDoc": {
29
+ "const": "EPIC.md",
30
+ "description": "Relative pointer to the narrative document (REQ-EPIC-03)."
31
+ },
32
+ "createdAt": {
33
+ "type": "string",
34
+ "format": "date-time",
35
+ "description": "Set once at creation."
36
+ },
37
+ "updatedAt": {
38
+ "type": "string",
39
+ "format": "date-time",
40
+ "description": "Bumped by every mutator on each atomic write (REQ-OBS-01)."
41
+ },
42
+ "features": {
43
+ "type": "array",
44
+ "items": { "$ref": "#/definitions/feature" },
45
+ "description": "Ordered. Order is the user-declared sequence; it is NOT a dependency ordering."
46
+ }
47
+ },
48
+ "definitions": {
49
+ "feature": {
50
+ "type": "object",
51
+ "required": ["name", "charter", "dependsOn", "exposes", "consumes"],
52
+ "additionalProperties": false,
53
+ "properties": {
54
+ "name": {
55
+ "type": "string",
56
+ "pattern": "^[a-z0-9]+(?:-[a-z0-9]+)*$",
57
+ "description": "Globally unique across the whole specs tree, kebab-case (REQ-DIR-04)."
58
+ },
59
+ "charter": {
60
+ "type": "string",
61
+ "description": "One-paragraph scope statement + contract obligations (REQ-EPIC-04). No full PRD at creation."
62
+ },
63
+ "dependsOn": {
64
+ "type": "array",
65
+ "items": { "type": "string" },
66
+ "description": "Names of sibling features in this epic (REQ-EPIC-02). Every entry must be a name in features[]. May be empty."
67
+ },
68
+ "exposes": {
69
+ "type": "array",
70
+ "items": { "$ref": "#/definitions/contract" },
71
+ "description": "What this feature provides to dependents (REQ-EPIC-03). May be empty."
72
+ },
73
+ "consumes": {
74
+ "type": "array",
75
+ "items": { "$ref": "#/definitions/consumedContract" },
76
+ "description": "What this feature relies on from its dependencies (REQ-EPIC-03). May be empty."
77
+ },
78
+ "mutatesShared": {
79
+ "type": "array",
80
+ "items": { "type": "string" },
81
+ "description": "OPTIONAL precision hint for cross-member coupling detection (#144): project-root-relative file/glob paths this feature writes or migrates that are shared across the epic (e.g. a corpus a sibling's tests pin). When present, forge-verify CHECK-E10 uses it directly; when absent, CHECK-E10 falls back to grepping specs/backlog for mutated paths. Not a dependency edge — declarative only. May be omitted entirely."
82
+ }
83
+ }
84
+ },
85
+ "contract": {
86
+ "type": "object",
87
+ "required": ["name", "kind", "summary"],
88
+ "additionalProperties": false,
89
+ "properties": {
90
+ "name": {
91
+ "type": "string",
92
+ "description": "Identifier of the exposed artifact (e.g. verifyJwt, JWT_SECRET)."
93
+ },
94
+ "kind": {
95
+ "type": "string",
96
+ "enum": ["function", "type", "endpoint", "module", "event"],
97
+ "description": "Kind of exposed artifact."
98
+ },
99
+ "summary": {
100
+ "type": "string",
101
+ "description": "One-line human description."
102
+ }
103
+ }
104
+ },
105
+ "consumedContract": {
106
+ "type": "object",
107
+ "required": ["from", "name", "summary"],
108
+ "additionalProperties": false,
109
+ "properties": {
110
+ "from": {
111
+ "type": "string",
112
+ "description": "Name of the sibling feature providing this. Must be present in features[]."
113
+ },
114
+ "name": {
115
+ "type": "string",
116
+ "description": "Identifier being consumed; should match an exposes[].name of the from feature."
117
+ },
118
+ "summary": {
119
+ "type": "string",
120
+ "description": "One-line human description."
121
+ }
122
+ }
123
+ }
124
+ }
125
+ }
@@ -65,12 +65,12 @@
65
65
  "autoInvokeNextStage": {
66
66
  "type": "boolean",
67
67
  "default": true,
68
- "description": "When true (default), the /feature-forge:forge navigator auto-invokes the next pipeline stage via the Skill tool after the user confirms it, instead of only printing the command to copy. Set false to keep the old copy-paste behavior (the navigator suggests the command but never launches it). Ignored on non-Claude hosts, which always fall back to printing the command."
68
+ "description": "When true (default), the /skill:forge navigator auto-invokes the next pipeline stage via the Skill tool after the user confirms it, instead of only printing the command to copy. Set false to keep the old copy-paste behavior (the navigator suggests the command but never launches it). Ignored on non-Claude hosts, which always fall back to printing the command."
69
69
  },
70
70
  "autoVerify": {
71
71
  "type": "boolean",
72
72
  "default": false,
73
- "description": "When true, the /feature-forge:forge navigator automatically runs forge-verify after a stage completes, with no prompt. forge-verify runs in a fresh forge-verifier subagent (clean-room), so it never needs a context clear and costs the current session only a compact findings digest. Default false preserves today's manual-gate behavior. Ignored on non-Claude hosts, which always fall back to printing the verify command. Per-stage overrides in autoVerifyStages take precedence."
73
+ "description": "When true, the /skill:forge navigator automatically runs forge-verify after a stage completes, with no prompt. forge-verify runs in a fresh forge-verifier subagent (clean-room), so it never needs a context clear and costs the current session only a compact findings digest. Default false preserves today's manual-gate behavior. Ignored on non-Claude hosts, which always fall back to printing the verify command. Per-stage overrides in autoVerifyStages take precedence."
74
74
  },
75
75
  "autoVerifyStages": {
76
76
  "type": "object",
@@ -217,8 +217,8 @@
217
217
  },
218
218
  "installHint": {
219
219
  "type": "string",
220
- "default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned @garygentry/rauf@0.12.0 default). Or install/upgrade just the rauf CLI: `npx @garygentry/rauf@0.12.0 --version`, or `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
221
- "description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins @garygentry/rauf@0.12.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
220
+ "default": "Provision rauf for a multi-agent setup with the cross-agent installer: `npx @garygentry/feature-forge install` (records the pinned @garygentry/rauf@0.13.0 default). Or install/upgrade just the rauf CLI: `npx @garygentry/rauf@0.13.0 --version`, or `curl -fsSL https://raw.githubusercontent.com/garygentry/rauf/main/scripts/install-binary.sh | bash`.",
221
+ "description": "Shown when the runner BINARY is missing or too old (version gate fails, minRunnerVersion floor) — how to obtain/upgrade the CLI itself. Names two distinct binary-provisioning paths: (1) the cross-agent installer (`npx @garygentry/feature-forge install`, the multi-agent provisioning path that pins @garygentry/rauf@0.13.0), and (2) the direct rauf-CLI install/upgrade one-liner. Distinct from setupHint (which installs per-project artifacts); a version-gate failure is ALWAYS this hint, never setupHint."
222
222
  },
223
223
  "schemaVersion": {
224
224
  "type": "string",
@@ -33,7 +33,7 @@
33
33
  "currentStage": {
34
34
  "type": "string",
35
35
  "enum": ["forge-1-prd", "forge-2-tech", "forge-3-specs", "forge-4-backlog", "forge-5-loop", "forge-6-docs", "complete", "forge-verify-prd", "forge-verify-tech", "forge-verify-specs", "forge-verify-backlog", "forge-verify-impl", "forge-0-epic", "forge-verify-epic"],
36
- "description": "Where the pipeline IS: the most recently started stage — its `stages[<currentStage>].status` is `in-progress` while that stage is being authored, then `complete` once its artifacts are committed. A stage skill sets this to its own id when it starts. This is deliberately NOT 'the next stage to run': the next stage is DERIVED, never stored — it is the first production stage whose `stages[].status` is not `complete` (see `next_stage()` in forge-session.py, surfaced as the navigator/doctor `nextStage`). Consumers that need 'what runs next' compute it from `stages[].status`, not from this field. `complete` here means the whole pipeline is done. (Legacy/absent value: tools fall back to the derived next stage for display only — `build_rows` in forge-session.py.)"
36
+ "description": "Where the pipeline IS: the most recently started stage — its `stages[<currentStage>].status` is `in-progress` while that stage is being authored, then `complete` once its artifacts are committed. A stage skill sets this to its own id when it starts. This is deliberately NOT 'the next stage to run': the next stage is DERIVED, never stored — it is the first production stage whose `stages[].status` is not `complete` (see `next_stage()` in forge-session.py, surfaced as the navigator/doctor `nextStage`). Consumers that need 'what runs next' compute it from `stages[].status`, not from this field. `complete` is a LEGACY enum value, retained so pre-0.14 state files still validate: no writer produces it (the `state-*` verbs are the only writers, and only `state-enter` touches this field, setting it to the stage being entered). A finished pipeline therefore records the last stage it started — `forge-6-docs` — and 'the whole pipeline is done' is DERIVED too: `next_stage()` returns null (surfaced as `nextStage: null` / `complete: true`). Never test this field against `complete` to decide whether a pipeline finished. (Legacy/absent value: tools fall back to the derived next stage for display only — `build_rows` in forge-session.py.)"
37
37
  },
38
38
  "notes": {
39
39
  "type": "string",
@@ -0,0 +1,71 @@
1
+ # Portable Script-Root Resolution
2
+
3
+ This file is the **single canonical home** of the feature-forge bootstrap prelude and the
4
+ portable invocation convention. Each fenced shell block an agent runs is a separate process
5
+ with no persisted state, so the plugin root must be re-resolved within the same block as every
6
+ bundled-script call. The prelude below is the fixed, byte-identical snippet that does this by
7
+ discovering and delegating to `scripts/forge-root.sh`. Downstream consumers
8
+ (`forge-agent-adapters-build`, `cross-agent-installer`) and the spec-purity checker treat this
9
+ file as authoritative: the checker's rule 5 compares every prelude occurrence across the canon
10
+ against the fenced block here, byte-for-byte.
11
+
12
+ ## Canonical bootstrap prelude
13
+
14
+ ```bash
15
+ R="$(bash -c 'for d in "${CLAUDE_PLUGIN_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/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
+ ```
18
+
19
+ ## Usage
20
+
21
+ Prepend the prelude to a fenced shell block once, then invoke bundled scripts via `$R`:
22
+ `python3 "$R/scripts/<x>"` or `bash "$R/scripts/<x>"`. One prelude per fenced block — if a block
23
+ makes several calls, add the prelude once and reuse `$R` for each. A fresh block gets its own
24
+ prelude (per-block re-resolution). Worked example:
25
+
26
+ ```bash
27
+ R="$(bash -c 'for d in "${CLAUDE_PLUGIN_ROOT:-}" "$HOME"/.claude/skills/feature-forge "$HOME"/.claude/plugins/cache/*/feature-forge/* "$HOME"/.claude/plugins/*/feature-forge "$HOME"/.agents/skills/feature-forge ./.agents/skills/feature-forge; do [ -x "$d/scripts/forge-root.sh" ] && exec "$d/scripts/forge-root.sh"; done')"
28
+ [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
29
+ python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
30
+ ```
31
+
32
+ ## Invariants (do NOT "fix" these)
33
+
34
+ 1. **First hint is the Claude plugin-root env var; the rest are paths.** The prelude's
35
+ `for d in …` list leads with the `CLAUDE_PLUGIN_ROOT` env var (in default-empty `:-` form)
36
+ — the exact bundle dir Claude exports in every marketplace/plugin session — followed by the
37
+ directory-path candidates. The hint gives exact, glob-free resolution on any current/future
38
+ Claude layout (no version-skew window); when unset it expands to empty and is harmlessly
39
+ skipped, so other hosts fall through to the path candidates unchanged. This is the **one
40
+ sanctioned** appearance of that variable in canonical surfaces: spec-purity rule 3 allows it
41
+ by stripping the byte-pinned prelude before its residual-var scan (so a stray var anywhere
42
+ else — including the default-empty form — still fails), and `forge-agent-adapters-build`
43
+ translates it to `FEATURE_FORGE_ROOT` for non-Claude bundles (which `forge-root.sh` already
44
+ prefers). The exact literal is shown only in the fenced prelude above and audited in
45
+ `vendor-construct-inventory.md`.
46
+ 2. **First-discoverable-resolver-wins.** The `exec` inside the `$(…)` command substitution means
47
+ the loop stops at the first directory holding an executable `forge-root.sh` and delegates ALL
48
+ final root resolution to that script. The `for` list is a discovery order for `forge-root.sh`
49
+ itself, not a fallback chain for the plugin root. Removing the `exec` to "keep looping" is a
50
+ regression — once `exec`'d, the loop is replaced by the resolver process and never advances.
51
+ 3. **Prelude candidate set is an agent-neutral bootstrap subset (after the env hint).** The
52
+ prelude's `for d` list exists only to bootstrap-discover `forge-root.sh`; the authoritative
53
+ multi-root probe lives in `forge-root.sh` step 2. After the leading env-var hint (invariant 1),
54
+ the list enumerates install roots across agents — the Claude
55
+ skill/plugin dirs — including the marketplace-cache layout
56
+ `~/.claude/plugins/cache/<marketplace>/feature-forge/<version>/`, listed before the
57
+ single-star plugins glob so a versioned cache install always beats the marketplace clone —
58
+ **and** the agent-neutral `.agents/skills/feature-forge` dirs (`$HOME` and the
59
+ project-relative `./.agents/...`) — so a non-Claude install (e.g. Codex under `.agents/skills`)
60
+ can still discover the resolver. When adding an install root, update `forge-root.sh` first;
61
+ extend the prelude only if the new root is needed to bootstrap-discover `forge-root.sh` itself.
62
+
63
+ ## The resolver
64
+
65
+ The prelude delegates to [`scripts/forge-root.sh`](../scripts/forge-root.sh) — the portable
66
+ skill/plugin-root resolver. It takes no arguments, prints the absolute plugin root to stdout and
67
+ exits `0`, or writes an actionable message to stderr and exits `1`. It resolves the root by
68
+ self-location → candidate-root probe → plugin-root environment-variable fallback → actionable failure,
69
+ and never sources or executes a discovered path — it only ever prints a directory string. The
70
+ spec-purity checker (rule 5) enforces that every prelude occurrence across the canon is
71
+ byte-identical to the fenced block in this file.
@@ -0,0 +1,143 @@
1
+ # Feature Forge Pipeline Overview
2
+
3
+ This document describes the end-to-end feature development pipeline managed by the feature-forge plugin. All forge skills reference this document to understand the overall flow and their position within it.
4
+
5
+ The pipeline compiles a fuzzy feature idea into a machine-executable `backlog.json`. Each stage narrows the idea down and adds structure, verification gates catch gaps before they reach later stages, and a swappable autonomous loop runner (rauf by default) implements the backlog in fresh per-item sessions.
6
+
7
+ ## Pipeline Stages
8
+
9
+ ```
10
+ [forge-0-epic] → forge-1-prd → forge-2-tech → forge-3-specs → forge-verify → forge-4-backlog → forge-verify → forge-5-loop → forge-verify → forge-6-docs
11
+ (optional)
12
+ ```
13
+
14
+ ### Stage 0: Epic (`/skill:forge-0-epic <epic>`), optional
15
+ **Input:** A change too large for one feature
16
+ **Output:** `{specsDir}/{epic}/epic-manifest.json` + `EPIC.md` + one member-feature dir per feature
17
+ **Method:** Decomposition interview splitting the change into member features with declared dependencies and `exposes`/`consumes` contracts. Purely additive: single-feature flows are unchanged. See [docs/architecture/epic-orchestration/README.md](../docs/architecture/epic-orchestration/README.md).
18
+
19
+ ### Stage 1: PRD (`/skill:forge-1-prd <feature>`)
20
+ **Input:** User's feature idea and domain knowledge
21
+ **Output:** `{specsDir}/{feature}/PRD.md`
22
+ **Method:** Structured interview focused exclusively on requirements. No technology decisions.
23
+
24
+ ### Stage 2: Tech Spec (`/skill:forge-2-tech <feature>`)
25
+ **Input:** PRD.md
26
+ **Output:** `{specsDir}/{feature}/tech-spec.md`
27
+ **Method:** Structured interview for technology decisions, grounded in PRD requirements.
28
+
29
+ ### Stage 3: Implementation Specs (`/skill:forge-3-specs <feature>`)
30
+ **Input:** PRD.md + tech-spec.md
31
+ **Output:** `{specsDir}/{feature}/##-<name>.md` (suite of numbered documents)
32
+ **Method:** Generate detailed implementation documents from spec archetypes.
33
+
34
+ ### Verification Gate (`/skill:forge-verify <feature>`)
35
+ **Input:** All artifacts from current and prior stages
36
+ **Output:** `{specsDir}/{feature}/.verification/VERIFY-<stage>-<timestamp>.md` (includes both findings and a Fix Execution Plan)
37
+ **Method:** Clean-context analysis producing actionable findings with an ordered fix plan.
38
+
39
+ **Manual or automatic.** By default the navigator offers verification after each stage. Because
40
+ it runs in a fresh, read-only subagent (clean-room by construction, never needs a `/clear`), it is
41
+ safe to automate: set `autoVerify: true` (or per-stage via `autoVerifyStages`) in
42
+ `forge.config.json` and the navigator runs `forge-verify` automatically once a stage completes,
43
+ returning only a compact digest to the session. The freshness ledger (verify entries record the
44
+ artifact `version` they ran against) means a stage is re-verified only when its artifact changes,
45
+ and an explicitly `skipped` verify is respected. Fixing stays human-gated unless `autoFix: true` is
46
+ also set, which chains `forge-fix` only when preconditions hold (zero unresolved decisions, clean
47
+ tree, passing re-verify). See `references/shared-conventions.md` for the config keys.
48
+
49
+ After verification, fixes can be applied via:
50
+ - `/skill:forge-fix <feature>` — reads the Fix Execution Plan from the findings document and applies changes (works in any session)
51
+ - Plan mode workflow — enter plan mode, run verify, review plan, exit and execute
52
+ - Manual — read findings and apply fixes by hand
53
+
54
+ ### Stage 4: Backlog (`/skill:forge-4-backlog <feature>`)
55
+ **Input:** Full spec suite
56
+ **Output:** `{specsDir}/{feature}/backlog.json` (or `{backlogDir}/{feature}/backlog.json` if backlogDir is configured)
57
+ **Method:** Generate structured backlog items with spec references, acceptance criteria, and dependencies. Backlog is collocated with feature specs by default.
58
+
59
+ ### Stage 5: Rauf Loop (`/skill:forge-5-loop <feature>`)
60
+ **Input:** `backlog.json` from Stage 4
61
+ **Output:** Implemented source code (committed per-item by rauf)
62
+ **Method:** Execute the autonomous coding loop against the feature's backlog. Spawns a fresh session per backlog item with full spec context. rauf is the default runner but is swappable via the `loopRunner` block in `forge.config.json`; see [`references/ralph-loop-contract.md`](./ralph-loop-contract.md).
63
+
64
+ ### Stage 6: Documentation (`/skill:forge-6-docs <feature>`)
65
+ **Input:** Specs + implementation
66
+ **Output:** `{docsDir}/{feature}/` documentation suite
67
+ **Method:** Generate developer-focused architecture documentation.
68
+
69
+ ## Pipeline State
70
+
71
+ State is tracked in `{specsDir}/{feature}/.pipeline-state.json` and persists across session clears. The `/skill:forge <feature>` navigator reads this file to show current progress.
72
+
73
+ ## Git Discipline
74
+
75
+ Every stage completion should be followed by a git commit:
76
+ - Commit message format: `{commitPrefix}({feature}): <action>`
77
+ - Examples: `forge(auth): complete PRD v1`, `forge(auth): apply spec verification fixes`
78
+ - Before applying verification fixes, commit current state first (so pre-fix state is recoverable)
79
+ - After applying fixes, commit again
80
+
81
+ ## Configuration
82
+
83
+ Read `forge.config.json` from project root for path overrides. See `references/forge-config-schema.json` for the full schema. If no config file exists, use defaults:
84
+ - specsDir: `./specs`
85
+ - docsDir: `./docs/architecture`
86
+ - backlogDir: (null — backlog defaults to {specsDir}/{feature}/backlog.json)
87
+ - gitCommitAfterStage: `true`
88
+ - commitPrefix: `forge`
89
+
90
+ ## Git Workflow
91
+
92
+ Recommended: forge work lives on an isolated `forge/{feature}` (or `forge/{epic}`) branch so all commits land together and review as one branch. The entry stages (`forge-1-prd`, `forge-0-epic`) detect whether you're on the default branch (main/master) and **strongly recommend** creating that branch when you are — still letting you decline and stay. The chosen branch is recorded in `.pipeline-state.json`, and `forge-5-loop` re-checks it before the autonomous loop starts committing per item. After implementation, merge to your development branch.
93
+
94
+ To customize: `branchPrefix` (default `forge/`) sets the branch name, and `branchPerFeature: false` disables the prompt entirely (forge then works on whatever branch is checked out). Branch Setup is gated only on the project using git — independent of `gitCommitAfterStage`.
95
+
96
+ If you prefer manual commit control, set `gitCommitAfterStage: false` in `forge.config.json`.
97
+
98
+ ## Cross-Cutting Concerns
99
+
100
+ ### Feature Name is Required
101
+ Every forge skill requires a feature name as the first argument. If not provided, STOP and ask. Never guess.
102
+
103
+ ### Reference Existing Code
104
+ When creating specs, always examine the existing codebase for patterns, conventions, and integration points. Check:
105
+ - Other feature specs in `{specsDir}/`
106
+ - Existing documentation in `{docsDir}/`
107
+ - Module/package structure and exports in the project
108
+ - Shared types, utilities, and conventions
109
+
110
+ ### Stack Context
111
+ The project's stack is detected during forge-2-tech and persisted in `forge.config.json` (the `stack`, `typeCheckCommand`, and `testCommand` fields). See `references/stack-resolution.md` for the full resolution protocol. The project may also have a `stack-decisions.md` (preferred at `.feature-forge/`; legacy `.claude/references/`) with established technology decisions — if present, it takes highest precedence.
112
+
113
+ ## Subagents
114
+
115
+ The plugin includes three specialized subagents in `agents/` that enhance specific
116
+ pipeline steps. They use **model aliases** (`opus`/`sonnet`) rather than pinned IDs, so
117
+ they track the current model tier automatically.
118
+
119
+ ### forge-verifier
120
+ - **Purpose:** Read-only verification of pipeline artifacts
121
+ - **Used by:** `forge-verify` skill (delegation via Agent tool)
122
+ - **Tools:** Read, Glob, Grep, Bash (read-only operations only)
123
+ - **Model:** Opus (judgement-heavy gap/inconsistency analysis)
124
+ - **Memory:** Project-scoped persistent memory — accumulates knowledge about recurring issues and project-specific patterns across sessions
125
+ - **Parallel:** For large modes (specs/backlog/impl), `forge-verify` dispatches several instances in parallel, one per **dimension group** (e.g. types/contracts, traceability, testing), and the parent merges their findings. An opt-in adversarial "deep verify" pass re-checks high-severity findings with a skeptic instance to cut false positives. A purely mechanical dimension (e.g. traceability validation) could run on a cheaper tier (Haiku) if cost matters.
126
+ - **Why a subagent:** Verification reads the entire spec suite, backlog, and potentially source code. Running this in a separate context window prevents context pressure on the main conversation. The read-only tool restriction also makes it impossible to accidentally modify specs during verification.
127
+
128
+ ### forge-researcher
129
+ - **Purpose:** Codebase exploration and integration mapping
130
+ - **Used by:** `forge-2-tech` skill (spawned before the tech-spec interview)
131
+ - **Tools:** Read, Glob, Grep, Bash (read-only)
132
+ - **Model:** Sonnet (cost-efficient for exploration tasks)
133
+ - **Parallel:** For a large codebase or uncertain scope, `forge-2-tech` may dispatch several researchers in parallel, each with a disjoint focus (structure/conventions, per-subsystem integration surfaces), and merge the reports.
134
+ - **Why a subagent:** Tech-spec planning requires reading many files across the project to understand integration points. Running this in a separate context returns a concise report without consuming the main session's context, keeping the interview focused.
135
+
136
+ ### forge-spec-writer
137
+ - **Purpose:** Author exactly one numbered implementation spec document to the forge-3-specs quality bar
138
+ - **Used by:** `forge-3-specs` skill (parallel fan-out after the shared foundation docs are written)
139
+ - **Tools:** Read, Glob, Grep, Bash, **Write** (the only authoring agent — constrained to write its single assigned file)
140
+ - **Model:** Opus (spec authoring is detail- and judgement-heavy)
141
+ - **Why a subagent:** Authoring the whole suite in the main session serializes the work and pressures context. Writing the foundation (00/01) first, then fanning out one writer per remaining doc, parallelizes authoring while the parent keeps the cross-reference + traceability finish in view.
142
+
143
+ All three subagents are optional. If the agents are not installed or the environment doesn't support subagents, the corresponding skills fall back to running inline (or, for spec authoring, batched in the main session).
@@ -0,0 +1,221 @@
1
+ # The Loop-Runner Contract (consumer side)
2
+
3
+ feature-forge's pipeline ends by handing a `backlog.json` to an autonomous
4
+ **loop runner** that implements each item. feature-forge does not embed any
5
+ runner's internals — it talks to the runner through one indirection point: the
6
+ **`loopRunner`** block in `forge.config.json`.
7
+
8
+ ## The seam
9
+
10
+ Every command feature-forge runs against the runner is a template in
11
+ `loopRunner`, with `{bin}`, `{backlogDir}`, `{specsDir}`, and `{iterations}`
12
+ substituted at call time. `forge-5-loop` (execution), `forge-4-backlog`
13
+ (validation), and `forge-verify` (backlog validation) all render their commands
14
+ from this block — there are no hardcoded `rauf …` commands in the skills, and
15
+ even the human log filename is tokenized via `{loopRunner.logFile}`.
16
+
17
+ When `forge.config.json` has no `loopRunner` block, feature-forge uses the
18
+ built-in defaults (see `references/forge-config-schema.json`) and announces
19
+ "defaulting to the rauf loop runner."
20
+
21
+ ## The contract a runner MUST satisfy
22
+
23
+ A conforming runner MUST implement the **backlog-tool / loop-runner contract**
24
+ defined authoritatively in rauf's
25
+ [`SPEC-BACKLOG-TOOL-CONTRACT.md`](https://github.com/garygentry/rauf/blob/main/docs/SPEC-BACKLOG-TOOL-CONTRACT.md)
26
+ (Part A). In summary, it must provide:
27
+
28
+ - **A backlog schema** with the published `$id` and an optional `schemaVersion`,
29
+ whose `type`/`status` vocabularies match the contract
30
+ (`type ∈ bug|bugfix|refactor|feature|chore|test`,
31
+ `status ∈ pending|in_progress|done|blocked`).
32
+ - **A `validate` verb** with exit codes `0` (valid) / `1` (findings) / `2`
33
+ (usage/IO) that emits `{ valid, findings[] }` under `--json`. This is the
34
+ single check feature-forge trusts — it never re-implements validation.
35
+ - **The signal protocol** (`RAUF_DONE` / `RAUF_BLOCKED` / `RAUF_NEEDS_HUMAN` /
36
+ `RAUF_REVIEW`). These are emitted by the *coding agent* into its stdout and
37
+ parsed by the runner — they are not runner-authored log lines, so consumers key
38
+ off the runner's parsed events (below), never the raw `RAUF_*` tokens (which can
39
+ also appear inside an agent's prose and produce false matches).
40
+ - **A machine-readable event stream** for live supervision (`loopRunner.eventStreamCommand`,
41
+ rauf: `loop run … --ndjson`): one JSON event per line with a stable `type`
42
+ vocabulary — `item_completed` / `item_blocked` / `needs_human` / `signal_parsed`
43
+ / `loop_completed` / `loop_error` / `loop_cancelled` / `llm_stuck_warning` (a
44
+ circuit-breaker halt surfaces as `loop_error`) — plus a
45
+ derived-status JSON (`loopRunner.statusJsonCommand`, rauf: `status … --json`) and
46
+ per-iteration telemetry with a `stuckWarning` flag (`loopRunner.watchCommand`,
47
+ rauf: `status … --json` — the `loop watch` verb was removed in v0.5.0). `forge-5-loop` supervises the run through these,
48
+ **not** by parsing the human log. `followCommand` / `logCommand` are
49
+ human-formatted streams for a person watching in a terminal, not machine surfaces.
50
+ - **The state-dir layout** (per-`--backlog` isolation under `loopRunner.stateDir`).
51
+ - **The CLI verbs** mapped by `loopRunner`: run (+ event-stream) / validate /
52
+ status (+ `--json`) / list / follow / log / version.
53
+ - **A `version` verb** (`{bin} version --json` → `{ version: <semver> }`) so
54
+ feature-forge can enforce `loopRunner.minRunnerVersion` before running.
55
+
56
+ > **The runner does not pause for human input.** When the coding agent signals
57
+ > `RAUF_NEEDS_HUMAN`/`RAUF_BLOCKED`/`RAUF_REVIEW`, a conforming runner sets that
58
+ > item aside and **keeps working other runnable items to completion** (rauf:
59
+ > `runner.ts` needs_human handler). So a supervising session can surface those
60
+ > events live (visibility) and cancel early, but it cannot inject an answer and
61
+ > resume the set-aside item mid-run — resolution is a follow-up retry pass. A
62
+ > first-class pause/resume-with-answer capability is a desirable runner
63
+ > enhancement (see `plans/rauf-enhancement-recommendations.md`).
64
+
65
+ ## rauf is the default and reference implementation
66
+
67
+ rauf owns the contract spec and is the runner feature-forge defaults to. The
68
+ authoring craft itself (how to decompose specs into well-scoped, verifiable
69
+ items) lives in rauf's **`author-backlog`** skill, which `forge-4-backlog`
70
+ delegates to — so the only thing binding feature-forge to a particular runner is
71
+ the schema + `validate` verb that this contract formalizes. A future runner swap
72
+ supplies its own `loopRunner` block (its own `bin`, schema, and `validate`
73
+ command) without touching any pipeline skill.
74
+
75
+ The coding-agent dimension this contract adds (below) is **additive and
76
+ presence-gated**: it exists only when the `loopRunner` block advertises it via
77
+ `agentArgument`. A runner that omits that field has no agent dimension at all —
78
+ the seam degrades to exactly today's behavior with no error, so default-to-rauf
79
+ and pluggability are unchanged. See `## Agent selection`.
80
+
81
+ ## Agent selection
82
+
83
+ This section is **contract-level**: it states what a conforming runner exposes
84
+ and what forge does with it, and defers every algorithm to the owning specs
85
+ (`02`/`03`/`04`/`05`).
86
+
87
+ ### What a conforming runner exposes (the consumed surface)
88
+
89
+ A runner that carries a coding-agent dimension exposes, in its `loopRunner`
90
+ block:
91
+
92
+ - an **`agentArgument`** template (rauf default `--agent {agent}`) — the
93
+ tokenized launch-time flag; its **presence** advertises the agent surface;
94
+ - an **`agentsProbeCommand`** (rauf default `{bin} agents --json`) emitting
95
+ `{ agents: [{ id, displayName, available, detail? }] }` and **always exiting
96
+ 0**;
97
+ - an optional **`defaultAgent`** project-default id.
98
+
99
+ These three fields are specified in full in `references/forge-config-schema.json`
100
+ and are the schema half of this contract. forge consumes rauf's existing
101
+ `--agent <id>` flag, `rauf agents` probe, `BacklogItem.provider`, and 5-layer
102
+ precedence — it conforms to them, it does not redesign them.
103
+
104
+ ### Precedence and the run-layer mapping
105
+
106
+ The agent-selection precedence is **`item > run > project > default`**,
107
+ deliberately parallel to the model-selection precedence (`item.model >
108
+ --model/options > project default > provider default`). It is realized as:
109
+
110
+ - **item** — `BacklogItem.provider`, applied by **rauf** from the backlog. forge
111
+ **never reads, writes, or overrides** it (pass-through), so a deliberate
112
+ per-item agent always wins.
113
+ - **run** — forge's per-run selector (`forge-5-loop` Step 2d).
114
+ - **project** — forge's `loopRunner.defaultAgent`.
115
+ - **default** — the runner's own default (`claude-cli` for rauf) when forge sends
116
+ nothing.
117
+
118
+ forge owns **only** the run and project layers. It collapses run-over-project
119
+ *inside itself* into the **single** `--agent {agent}` value it emits at the
120
+ **run layer**, and lets rauf apply the item override *above* that. forge **never
121
+ re-implements rauf's resolver**. The resolution algorithm itself lives in
122
+ `03-selection-resolution-observability.md`.
123
+
124
+ ### Availability probe + unknown/unavailable disambiguation
125
+
126
+ When the resolved agent is a **non-default** id, forge runs `agentsProbeCommand`
127
+ **once (no retries)** before any loop side-effect, parses the advertised
128
+ `agents[]`, and builds the advertised id set. Because the probe **always exits
129
+ 0**, an unknown id is distinguished from a known-but-unavailable one **only by
130
+ set membership**, not by exit code:
131
+
132
+ - **Unknown id** (not in the advertised set — a typo or unsupported agent):
133
+ **hard-reject before launch**, listing the valid ids. No proceed-anyway path.
134
+ No value is interpolated into `{agent}`.
135
+ - **Known but unavailable** (`available: false`): **warn** (showing the probe's
136
+ `detail`) and let the user **proceed-anyway or choose another** — never
137
+ silently abort, never silently proceed.
138
+ - **Available**: proceed.
139
+
140
+ The advertised id set is also the **allow-list**: the only value ever
141
+ interpolated into `{agent}` is a validated, advertised id. The **default /
142
+ claude path never reaches the probe** — it incurs no extra cost. The
143
+ `classify(...)` algorithm and the rejection-error text live in
144
+ `04-availability-precheck.md`.
145
+
146
+ ### Capability gate + version floor
147
+
148
+ Agent selection is **capability-gated** on the runner advertising
149
+ `agentArgument`: a runner whose `loopRunner` omits (or empties) that field
150
+ exposes no agent surface, so the per-run selector, the probe, and any `{agent}`
151
+ substitution **vanish entirely** and no agent argument is sent — byte-identical
152
+ to today. Degradation is **silent, not an error**, keeping alternate (non-rauf)
153
+ runners first-class. The gate condition is owned by
154
+ `02-config-schema-and-gating.md`.
155
+
156
+ Independently, the **version gate** floors at the runner version that ships the
157
+ agent surface. For rauf that is **0.6.0** (`loopRunner.minRunnerVersion`): the
158
+ `--agent` flag, the `agents` probe, and the preset agent registry are present in
159
+ rauf source at 0.6.0. A successful gate therefore guarantees those surfaces
160
+ exist before any run. See `## Version gating` and
161
+ `05-runner-discovery-version-gate.md`.
162
+
163
+ **This document — the `## Agent selection` section, the `## Per-stage agent
164
+ applicability` table, and the `## validate is agent-agnostic` note — together
165
+ with the augmented `loopRunner` schema block in
166
+ `references/forge-config-schema.json` constitute the `forge-loop-runner-contract`
167
+ expose, consumed by the `packaging-docs-ci` capstone as documentation input.**
168
+
169
+ ## Per-stage agent applicability
170
+
171
+ Every forge stage that invokes the loop runner is classified here. Only
172
+ `forge-5-loop` (execution) carries the coding-agent dimension; the two
173
+ validation-only stages are agent-agnostic.
174
+
175
+ | Stage | Runner verbs | Agent dimension |
176
+ |-------|-------------|-----------------|
177
+ | `forge-5-loop` | run / eventStream / status / version | **Full** — selector, probe, `--agent` |
178
+ | `forge-4-backlog` | `validate` | **None** — agent-agnostic |
179
+ | `forge-verify` | `validate` | **None** — agent-agnostic |
180
+
181
+ - **`forge-5-loop`** is the executor: it drives the run, so it renders the run /
182
+ event-stream / status / version verbs (and `list`) and carries the full agent
183
+ surface — the Step 2d selector, the availability probe, and the rendered
184
+ `agentArgument`.
185
+ - **`forge-4-backlog`** authors and then *validates* the backlog; its only runner
186
+ call is `validateCommand`. It also reads `versionCommand` for a graceful-degrade
187
+ check, but **passes no agent** and never runs `loop run`.
188
+ - **`forge-verify`** (backlog mode) re-runs the same `validateCommand` to surface
189
+ validation findings. It carries no agent dimension. This is **contract
190
+ coverage** of forge-verify (it is classified here), with an explicit agnostic
191
+ note (below) — **not** a new agent-driven run in forge-verify.
192
+
193
+ ### `validate` is agent-agnostic
194
+
195
+ The `validate` verb (`loopRunner.validateCommand`) checks a `backlog.json`
196
+ against the backlog schema and spec references. **It does not run a coding agent
197
+ and has no agent dimension.** No agent argument — `--agent`, the `{agent}` token,
198
+ or any agent id — may **ever** be passed to backlog validation, in **any** stage
199
+ (`forge-4-backlog`, `forge-verify`, or any future caller). Backlog validation is
200
+ a pure, deterministic check; the coding agent is irrelevant to it. A contributor
201
+ who later adds agent selection to a *new* stage MUST confirm that stage runs the
202
+ *execution* surface (like `forge-5-loop`), not `validate` — agent selection
203
+ belongs to execution only. If you find yourself adding `--agent` near a
204
+ `validateCommand` render, that is a bug.
205
+
206
+ ## Version gating
207
+
208
+ feature-forge requires a runner exposing `backlog validate` + backlog
209
+ `schemaVersion`, and the unified exit-code/status contract it reads. The floor is
210
+ now the **agent-surface floor**: the runner version that ships the `--agent`
211
+ flag, the `agents` probe, and the preset agent registry. For rauf that is
212
+ **0.6.0** (`loopRunner.minRunnerVersion`).
213
+ `forge-5-loop` runs `{bin} version --json`, semver-compares the reported version
214
+ against `minRunnerVersion`, and on a missing-or-too-old runner stops with
215
+ `loopRunner.installHint` (the CLI install/upgrade command) — **before** invoking
216
+ the loop. See `COMPATIBILITY.md` for the version matrix.
217
+
218
+ > **Two different "installs."** `installHint` obtains/upgrades the runner **CLI
219
+ > binary** (e.g. rauf's `install-binary.sh`). `setupHint` installs the runner's
220
+ > **per-project artifacts** (rauf: `rauf install .`). A failing version gate is
221
+ > always the former, never the latter.