@garygentry/feature-forge 0.3.0 → 0.3.2

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 (404) hide show
  1. package/adapters/claude/.feature-forge-bundle.json +1 -1
  2. package/adapters/claude/agents/forge-verifier.md +1 -1
  3. package/adapters/claude/references/epic-manifest-schema.json +6 -1
  4. package/adapters/claude/references/forge-config-schema.json +1 -1
  5. package/adapters/claude/references/pipeline-state-schema.json +5 -3
  6. package/adapters/claude/references/shared-conventions.md +125 -12
  7. package/adapters/claude/references/stage-exit-protocol.md +358 -144
  8. package/adapters/claude/references/vendor-construct-inventory.md +1 -1
  9. package/adapters/claude/scripts/epic-manifest.py +459 -90
  10. package/adapters/claude/scripts/forge-bootstrap.py +57 -5
  11. package/adapters/claude/scripts/forge-session.py +4346 -201
  12. package/adapters/claude/scripts/validate-traceability.py +92 -6
  13. package/adapters/claude/skills/forge/SKILL.md +18 -11
  14. package/adapters/claude/skills/forge/references/pipeline-state-schema.json +5 -3
  15. package/adapters/claude/skills/forge/references/shared-conventions.md +125 -12
  16. package/adapters/claude/skills/forge/references/stage-exit-protocol.md +358 -144
  17. package/adapters/claude/skills/forge-0-epic/SKILL.md +8 -3
  18. package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +24 -24
  19. package/adapters/claude/skills/forge-0-epic/references/pipeline-state-schema.json +5 -3
  20. package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +125 -12
  21. package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +358 -144
  22. package/adapters/claude/skills/forge-1-prd/SKILL.md +39 -11
  23. package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +125 -12
  24. package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +358 -144
  25. package/adapters/claude/skills/forge-2-tech/SKILL.md +38 -10
  26. package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +125 -12
  27. package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +358 -144
  28. package/adapters/claude/skills/forge-3-specs/SKILL.md +28 -9
  29. package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +125 -12
  30. package/adapters/claude/skills/forge-3-specs/references/spec-archetypes.md +9 -0
  31. package/adapters/claude/skills/forge-3-specs/references/stage-exit-protocol.md +358 -144
  32. package/adapters/claude/skills/forge-4-backlog/SKILL.md +39 -10
  33. package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +125 -12
  34. package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +358 -144
  35. package/adapters/claude/skills/forge-5-loop/SKILL.md +65 -67
  36. package/adapters/claude/skills/forge-5-loop/references/agent-selection.md +116 -0
  37. package/adapters/claude/skills/forge-5-loop/references/result-reporting.md +70 -31
  38. package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +18 -109
  39. package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +125 -12
  40. package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +358 -144
  41. package/adapters/claude/skills/forge-6-docs/SKILL.md +59 -9
  42. package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +125 -12
  43. package/adapters/claude/skills/forge-6-docs/references/stage-exit-protocol.md +472 -0
  44. package/adapters/claude/skills/forge-fix/SKILL.md +85 -33
  45. package/adapters/claude/skills/forge-fix/references/shared-conventions.md +125 -12
  46. package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +358 -144
  47. package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +1 -1
  48. package/adapters/claude/skills/forge-guide/references/shared-conventions.md +125 -12
  49. package/adapters/claude/skills/forge-verify/SKILL.md +86 -44
  50. package/adapters/claude/skills/forge-verify/references/findings-template.md +147 -0
  51. package/adapters/claude/skills/forge-verify/references/shared-conventions.md +125 -12
  52. package/adapters/claude/skills/forge-verify/references/stage-exit-protocol.md +472 -0
  53. package/adapters/claude/skills/forge-verify/references/verification-checklists/backlog.md +97 -0
  54. package/adapters/claude/skills/forge-verify/references/verification-checklists/epic.md +80 -0
  55. package/adapters/claude/skills/forge-verify/references/verification-checklists/impl.md +48 -0
  56. package/adapters/claude/skills/forge-verify/references/verification-checklists/prd.md +31 -0
  57. package/adapters/claude/skills/forge-verify/references/verification-checklists/specs.md +66 -0
  58. package/adapters/claude/skills/forge-verify/references/verification-checklists/tech.md +35 -0
  59. package/adapters/codex/.feature-forge-bundle.json +1 -1
  60. package/adapters/codex/agents/forge-verifier.toml +1 -1
  61. package/adapters/codex/references/epic-manifest-schema.json +6 -1
  62. package/adapters/codex/references/forge-config-schema.json +1 -1
  63. package/adapters/codex/references/pipeline-state-schema.json +5 -3
  64. package/adapters/codex/references/shared-conventions.md +125 -12
  65. package/adapters/codex/references/stage-exit-protocol.md +358 -144
  66. package/adapters/codex/references/vendor-construct-inventory.md +1 -1
  67. package/adapters/codex/scripts/epic-manifest.py +459 -90
  68. package/adapters/codex/scripts/forge-bootstrap.py +57 -5
  69. package/adapters/codex/scripts/forge-session.py +4346 -201
  70. package/adapters/codex/scripts/validate-traceability.py +92 -6
  71. package/adapters/codex/skills/forge/SKILL.md +18 -11
  72. package/adapters/codex/skills/forge/references/pipeline-state-schema.json +5 -3
  73. package/adapters/codex/skills/forge/references/shared-conventions.md +125 -12
  74. package/adapters/codex/skills/forge/references/stage-exit-protocol.md +358 -144
  75. package/adapters/codex/skills/forge-0-epic/SKILL.md +8 -3
  76. package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +24 -24
  77. package/adapters/codex/skills/forge-0-epic/references/pipeline-state-schema.json +5 -3
  78. package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +125 -12
  79. package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +358 -144
  80. package/adapters/codex/skills/forge-1-prd/SKILL.md +39 -11
  81. package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +125 -12
  82. package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +358 -144
  83. package/adapters/codex/skills/forge-2-tech/SKILL.md +38 -10
  84. package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +125 -12
  85. package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +358 -144
  86. package/adapters/codex/skills/forge-3-specs/SKILL.md +28 -9
  87. package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +125 -12
  88. package/adapters/codex/skills/forge-3-specs/references/spec-archetypes.md +9 -0
  89. package/adapters/codex/skills/forge-3-specs/references/stage-exit-protocol.md +358 -144
  90. package/adapters/codex/skills/forge-4-backlog/SKILL.md +39 -10
  91. package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +125 -12
  92. package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +358 -144
  93. package/adapters/codex/skills/forge-5-loop/SKILL.md +65 -67
  94. package/adapters/codex/skills/forge-5-loop/references/agent-selection.md +116 -0
  95. package/adapters/codex/skills/forge-5-loop/references/result-reporting.md +70 -31
  96. package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +18 -109
  97. package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +125 -12
  98. package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +358 -144
  99. package/adapters/codex/skills/forge-6-docs/SKILL.md +59 -9
  100. package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +125 -12
  101. package/adapters/codex/skills/forge-6-docs/references/stage-exit-protocol.md +472 -0
  102. package/adapters/codex/skills/forge-fix/SKILL.md +84 -32
  103. package/adapters/codex/skills/forge-fix/references/shared-conventions.md +125 -12
  104. package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +358 -144
  105. package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +1 -1
  106. package/adapters/codex/skills/forge-guide/references/shared-conventions.md +125 -12
  107. package/adapters/codex/skills/forge-verify/SKILL.md +85 -43
  108. package/adapters/codex/skills/forge-verify/references/findings-template.md +147 -0
  109. package/adapters/codex/skills/forge-verify/references/shared-conventions.md +125 -12
  110. package/adapters/codex/skills/forge-verify/references/stage-exit-protocol.md +472 -0
  111. package/adapters/codex/skills/forge-verify/references/verification-checklists/backlog.md +97 -0
  112. package/adapters/codex/skills/forge-verify/references/verification-checklists/epic.md +80 -0
  113. package/adapters/codex/skills/forge-verify/references/verification-checklists/impl.md +48 -0
  114. package/adapters/codex/skills/forge-verify/references/verification-checklists/prd.md +31 -0
  115. package/adapters/codex/skills/forge-verify/references/verification-checklists/specs.md +66 -0
  116. package/adapters/codex/skills/forge-verify/references/verification-checklists/tech.md +35 -0
  117. package/adapters/copilot/.feature-forge-bundle.json +1 -1
  118. package/adapters/copilot/agents/forge-verifier.md +1 -1
  119. package/adapters/copilot/references/epic-manifest-schema.json +6 -1
  120. package/adapters/copilot/references/forge-config-schema.json +1 -1
  121. package/adapters/copilot/references/pipeline-state-schema.json +5 -3
  122. package/adapters/copilot/references/shared-conventions.md +125 -12
  123. package/adapters/copilot/references/stage-exit-protocol.md +358 -144
  124. package/adapters/copilot/references/vendor-construct-inventory.md +1 -1
  125. package/adapters/copilot/scripts/epic-manifest.py +459 -90
  126. package/adapters/copilot/scripts/forge-bootstrap.py +57 -5
  127. package/adapters/copilot/scripts/forge-session.py +4346 -201
  128. package/adapters/copilot/scripts/validate-traceability.py +92 -6
  129. package/adapters/copilot/skills/forge/forge.md +18 -11
  130. package/adapters/copilot/skills/forge/references/pipeline-state-schema.json +5 -3
  131. package/adapters/copilot/skills/forge/references/shared-conventions.md +125 -12
  132. package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +358 -144
  133. package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +8 -3
  134. package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +24 -24
  135. package/adapters/copilot/skills/forge-0-epic/references/pipeline-state-schema.json +5 -3
  136. package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +125 -12
  137. package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +358 -144
  138. package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +39 -11
  139. package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +125 -12
  140. package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +358 -144
  141. package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +38 -10
  142. package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +125 -12
  143. package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +358 -144
  144. package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +28 -9
  145. package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +125 -12
  146. package/adapters/copilot/skills/forge-3-specs/references/spec-archetypes.md +9 -0
  147. package/adapters/copilot/skills/forge-3-specs/references/stage-exit-protocol.md +358 -144
  148. package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +39 -10
  149. package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +125 -12
  150. package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +358 -144
  151. package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +65 -67
  152. package/adapters/copilot/skills/forge-5-loop/references/agent-selection.md +116 -0
  153. package/adapters/copilot/skills/forge-5-loop/references/result-reporting.md +70 -31
  154. package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +18 -109
  155. package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +125 -12
  156. package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +358 -144
  157. package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +59 -9
  158. package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +125 -12
  159. package/adapters/copilot/skills/forge-6-docs/references/stage-exit-protocol.md +472 -0
  160. package/adapters/copilot/skills/forge-fix/forge-fix.md +84 -32
  161. package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +125 -12
  162. package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +358 -144
  163. package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +1 -1
  164. package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +125 -12
  165. package/adapters/copilot/skills/forge-verify/forge-verify.md +85 -43
  166. package/adapters/copilot/skills/forge-verify/references/findings-template.md +147 -0
  167. package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +125 -12
  168. package/adapters/copilot/skills/forge-verify/references/stage-exit-protocol.md +472 -0
  169. package/adapters/copilot/skills/forge-verify/references/verification-checklists/backlog.md +97 -0
  170. package/adapters/copilot/skills/forge-verify/references/verification-checklists/epic.md +80 -0
  171. package/adapters/copilot/skills/forge-verify/references/verification-checklists/impl.md +48 -0
  172. package/adapters/copilot/skills/forge-verify/references/verification-checklists/prd.md +31 -0
  173. package/adapters/copilot/skills/forge-verify/references/verification-checklists/specs.md +66 -0
  174. package/adapters/copilot/skills/forge-verify/references/verification-checklists/tech.md +35 -0
  175. package/adapters/cursor/.feature-forge-bundle.json +1 -1
  176. package/adapters/cursor/agents/forge-verifier.mdc +1 -1
  177. package/adapters/cursor/references/epic-manifest-schema.json +6 -1
  178. package/adapters/cursor/references/forge-config-schema.json +1 -1
  179. package/adapters/cursor/references/pipeline-state-schema.json +5 -3
  180. package/adapters/cursor/references/shared-conventions.md +125 -12
  181. package/adapters/cursor/references/stage-exit-protocol.md +358 -144
  182. package/adapters/cursor/references/vendor-construct-inventory.md +1 -1
  183. package/adapters/cursor/scripts/epic-manifest.py +459 -90
  184. package/adapters/cursor/scripts/forge-bootstrap.py +57 -5
  185. package/adapters/cursor/scripts/forge-session.py +4346 -201
  186. package/adapters/cursor/scripts/validate-traceability.py +92 -6
  187. package/adapters/cursor/skills/forge/forge.mdc +18 -11
  188. package/adapters/cursor/skills/forge/references/pipeline-state-schema.json +5 -3
  189. package/adapters/cursor/skills/forge/references/shared-conventions.md +125 -12
  190. package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +358 -144
  191. package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +8 -3
  192. package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +24 -24
  193. package/adapters/cursor/skills/forge-0-epic/references/pipeline-state-schema.json +5 -3
  194. package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +125 -12
  195. package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +358 -144
  196. package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +39 -11
  197. package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +125 -12
  198. package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +358 -144
  199. package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +38 -10
  200. package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +125 -12
  201. package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +358 -144
  202. package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +28 -9
  203. package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +125 -12
  204. package/adapters/cursor/skills/forge-3-specs/references/spec-archetypes.md +9 -0
  205. package/adapters/cursor/skills/forge-3-specs/references/stage-exit-protocol.md +358 -144
  206. package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +39 -10
  207. package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +125 -12
  208. package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +358 -144
  209. package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +65 -67
  210. package/adapters/cursor/skills/forge-5-loop/references/agent-selection.md +116 -0
  211. package/adapters/cursor/skills/forge-5-loop/references/result-reporting.md +70 -31
  212. package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +18 -109
  213. package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +125 -12
  214. package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +358 -144
  215. package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +59 -9
  216. package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +125 -12
  217. package/adapters/cursor/skills/forge-6-docs/references/stage-exit-protocol.md +472 -0
  218. package/adapters/cursor/skills/forge-fix/forge-fix.mdc +84 -32
  219. package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +125 -12
  220. package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +358 -144
  221. package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +1 -1
  222. package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +125 -12
  223. package/adapters/cursor/skills/forge-verify/forge-verify.mdc +85 -43
  224. package/adapters/cursor/skills/forge-verify/references/findings-template.md +147 -0
  225. package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +125 -12
  226. package/adapters/cursor/skills/forge-verify/references/stage-exit-protocol.md +472 -0
  227. package/adapters/cursor/skills/forge-verify/references/verification-checklists/backlog.md +97 -0
  228. package/adapters/cursor/skills/forge-verify/references/verification-checklists/epic.md +80 -0
  229. package/adapters/cursor/skills/forge-verify/references/verification-checklists/impl.md +48 -0
  230. package/adapters/cursor/skills/forge-verify/references/verification-checklists/prd.md +31 -0
  231. package/adapters/cursor/skills/forge-verify/references/verification-checklists/specs.md +66 -0
  232. package/adapters/cursor/skills/forge-verify/references/verification-checklists/tech.md +35 -0
  233. package/adapters/gemini/.feature-forge-bundle.json +1 -1
  234. package/adapters/gemini/agents/forge-verifier.md +1 -1
  235. package/adapters/gemini/gemini-extension.json +1 -1
  236. package/adapters/gemini/references/epic-manifest-schema.json +6 -1
  237. package/adapters/gemini/references/forge-config-schema.json +1 -1
  238. package/adapters/gemini/references/pipeline-state-schema.json +5 -3
  239. package/adapters/gemini/references/shared-conventions.md +125 -12
  240. package/adapters/gemini/references/stage-exit-protocol.md +358 -144
  241. package/adapters/gemini/references/vendor-construct-inventory.md +1 -1
  242. package/adapters/gemini/scripts/epic-manifest.py +459 -90
  243. package/adapters/gemini/scripts/forge-bootstrap.py +57 -5
  244. package/adapters/gemini/scripts/forge-session.py +4346 -201
  245. package/adapters/gemini/scripts/validate-traceability.py +92 -6
  246. package/adapters/gemini/skills/forge/forge.md +18 -11
  247. package/adapters/gemini/skills/forge/references/pipeline-state-schema.json +5 -3
  248. package/adapters/gemini/skills/forge/references/shared-conventions.md +125 -12
  249. package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +358 -144
  250. package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +8 -3
  251. package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +24 -24
  252. package/adapters/gemini/skills/forge-0-epic/references/pipeline-state-schema.json +5 -3
  253. package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +125 -12
  254. package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +358 -144
  255. package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +39 -11
  256. package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +125 -12
  257. package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +358 -144
  258. package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +38 -10
  259. package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +125 -12
  260. package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +358 -144
  261. package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +28 -9
  262. package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +125 -12
  263. package/adapters/gemini/skills/forge-3-specs/references/spec-archetypes.md +9 -0
  264. package/adapters/gemini/skills/forge-3-specs/references/stage-exit-protocol.md +358 -144
  265. package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +39 -10
  266. package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +125 -12
  267. package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +358 -144
  268. package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +65 -67
  269. package/adapters/gemini/skills/forge-5-loop/references/agent-selection.md +116 -0
  270. package/adapters/gemini/skills/forge-5-loop/references/result-reporting.md +70 -31
  271. package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +18 -109
  272. package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +125 -12
  273. package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +358 -144
  274. package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +59 -9
  275. package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +125 -12
  276. package/adapters/gemini/skills/forge-6-docs/references/stage-exit-protocol.md +472 -0
  277. package/adapters/gemini/skills/forge-fix/forge-fix.md +84 -32
  278. package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +125 -12
  279. package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +358 -144
  280. package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +1 -1
  281. package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +125 -12
  282. package/adapters/gemini/skills/forge-verify/forge-verify.md +85 -43
  283. package/adapters/gemini/skills/forge-verify/references/findings-template.md +147 -0
  284. package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +125 -12
  285. package/adapters/gemini/skills/forge-verify/references/stage-exit-protocol.md +472 -0
  286. package/adapters/gemini/skills/forge-verify/references/verification-checklists/backlog.md +97 -0
  287. package/adapters/gemini/skills/forge-verify/references/verification-checklists/epic.md +80 -0
  288. package/adapters/gemini/skills/forge-verify/references/verification-checklists/impl.md +48 -0
  289. package/adapters/gemini/skills/forge-verify/references/verification-checklists/prd.md +31 -0
  290. package/adapters/gemini/skills/forge-verify/references/verification-checklists/specs.md +66 -0
  291. package/adapters/gemini/skills/forge-verify/references/verification-checklists/tech.md +35 -0
  292. package/adapters/pi/.feature-forge-bundle.json +1 -1
  293. package/adapters/pi/agents/forge-verifier.md +1 -1
  294. package/adapters/pi/references/epic-manifest-schema.json +6 -1
  295. package/adapters/pi/references/forge-config-schema.json +1 -1
  296. package/adapters/pi/references/pipeline-state-schema.json +5 -3
  297. package/adapters/pi/references/shared-conventions.md +125 -12
  298. package/adapters/pi/references/stage-exit-protocol.md +358 -144
  299. package/adapters/pi/references/vendor-construct-inventory.md +1 -1
  300. package/adapters/pi/scripts/epic-manifest.py +459 -90
  301. package/adapters/pi/scripts/forge-bootstrap.py +57 -5
  302. package/adapters/pi/scripts/forge-session.py +4346 -201
  303. package/adapters/pi/scripts/validate-traceability.py +92 -6
  304. package/adapters/pi/skills/forge/SKILL.md +18 -11
  305. package/adapters/pi/skills/forge/references/pipeline-state-schema.json +5 -3
  306. package/adapters/pi/skills/forge/references/shared-conventions.md +125 -12
  307. package/adapters/pi/skills/forge/references/stage-exit-protocol.md +358 -144
  308. package/adapters/pi/skills/forge-0-epic/SKILL.md +8 -3
  309. package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +24 -24
  310. package/adapters/pi/skills/forge-0-epic/references/pipeline-state-schema.json +5 -3
  311. package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +125 -12
  312. package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +358 -144
  313. package/adapters/pi/skills/forge-1-prd/SKILL.md +39 -11
  314. package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +125 -12
  315. package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +358 -144
  316. package/adapters/pi/skills/forge-2-tech/SKILL.md +38 -10
  317. package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +125 -12
  318. package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +358 -144
  319. package/adapters/pi/skills/forge-3-specs/SKILL.md +28 -9
  320. package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +125 -12
  321. package/adapters/pi/skills/forge-3-specs/references/spec-archetypes.md +9 -0
  322. package/adapters/pi/skills/forge-3-specs/references/stage-exit-protocol.md +358 -144
  323. package/adapters/pi/skills/forge-4-backlog/SKILL.md +39 -10
  324. package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +125 -12
  325. package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +358 -144
  326. package/adapters/pi/skills/forge-5-loop/SKILL.md +65 -67
  327. package/adapters/pi/skills/forge-5-loop/references/agent-selection.md +116 -0
  328. package/adapters/pi/skills/forge-5-loop/references/result-reporting.md +70 -31
  329. package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +18 -109
  330. package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +125 -12
  331. package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +358 -144
  332. package/adapters/pi/skills/forge-6-docs/SKILL.md +59 -9
  333. package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +125 -12
  334. package/adapters/pi/skills/forge-6-docs/references/stage-exit-protocol.md +472 -0
  335. package/adapters/pi/skills/forge-fix/SKILL.md +84 -32
  336. package/adapters/pi/skills/forge-fix/references/shared-conventions.md +125 -12
  337. package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +358 -144
  338. package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +1 -1
  339. package/adapters/pi/skills/forge-guide/references/shared-conventions.md +125 -12
  340. package/adapters/pi/skills/forge-verify/SKILL.md +85 -43
  341. package/adapters/pi/skills/forge-verify/references/findings-template.md +147 -0
  342. package/adapters/pi/skills/forge-verify/references/shared-conventions.md +125 -12
  343. package/adapters/pi/skills/forge-verify/references/stage-exit-protocol.md +472 -0
  344. package/adapters/pi/skills/forge-verify/references/verification-checklists/backlog.md +97 -0
  345. package/adapters/pi/skills/forge-verify/references/verification-checklists/epic.md +80 -0
  346. package/adapters/pi/skills/forge-verify/references/verification-checklists/impl.md +48 -0
  347. package/adapters/pi/skills/forge-verify/references/verification-checklists/prd.md +31 -0
  348. package/adapters/pi/skills/forge-verify/references/verification-checklists/specs.md +66 -0
  349. package/adapters/pi/skills/forge-verify/references/verification-checklists/tech.md +35 -0
  350. package/package.json +1 -1
  351. package/adapters/claude/skills/forge-1-prd/references/pipeline-state-schema.json +0 -191
  352. package/adapters/claude/skills/forge-2-tech/references/pipeline-state-schema.json +0 -191
  353. package/adapters/claude/skills/forge-3-specs/references/pipeline-state-schema.json +0 -191
  354. package/adapters/claude/skills/forge-4-backlog/references/forge-config-schema.json +0 -236
  355. package/adapters/claude/skills/forge-4-backlog/references/pipeline-state-schema.json +0 -191
  356. package/adapters/claude/skills/forge-5-loop/references/forge-config-schema.json +0 -236
  357. package/adapters/claude/skills/forge-6-docs/references/pipeline-state-schema.json +0 -191
  358. package/adapters/claude/skills/forge-verify/references/pipeline-state-schema.json +0 -191
  359. package/adapters/claude/skills/forge-verify/references/verification-checklists.md +0 -477
  360. package/adapters/codex/skills/forge-1-prd/references/pipeline-state-schema.json +0 -191
  361. package/adapters/codex/skills/forge-2-tech/references/pipeline-state-schema.json +0 -191
  362. package/adapters/codex/skills/forge-3-specs/references/pipeline-state-schema.json +0 -191
  363. package/adapters/codex/skills/forge-4-backlog/references/forge-config-schema.json +0 -236
  364. package/adapters/codex/skills/forge-4-backlog/references/pipeline-state-schema.json +0 -191
  365. package/adapters/codex/skills/forge-5-loop/references/forge-config-schema.json +0 -236
  366. package/adapters/codex/skills/forge-6-docs/references/pipeline-state-schema.json +0 -191
  367. package/adapters/codex/skills/forge-verify/references/pipeline-state-schema.json +0 -191
  368. package/adapters/codex/skills/forge-verify/references/verification-checklists.md +0 -477
  369. package/adapters/copilot/skills/forge-1-prd/references/pipeline-state-schema.json +0 -191
  370. package/adapters/copilot/skills/forge-2-tech/references/pipeline-state-schema.json +0 -191
  371. package/adapters/copilot/skills/forge-3-specs/references/pipeline-state-schema.json +0 -191
  372. package/adapters/copilot/skills/forge-4-backlog/references/forge-config-schema.json +0 -236
  373. package/adapters/copilot/skills/forge-4-backlog/references/pipeline-state-schema.json +0 -191
  374. package/adapters/copilot/skills/forge-5-loop/references/forge-config-schema.json +0 -236
  375. package/adapters/copilot/skills/forge-6-docs/references/pipeline-state-schema.json +0 -191
  376. package/adapters/copilot/skills/forge-verify/references/pipeline-state-schema.json +0 -191
  377. package/adapters/copilot/skills/forge-verify/references/verification-checklists.md +0 -477
  378. package/adapters/cursor/skills/forge-1-prd/references/pipeline-state-schema.json +0 -191
  379. package/adapters/cursor/skills/forge-2-tech/references/pipeline-state-schema.json +0 -191
  380. package/adapters/cursor/skills/forge-3-specs/references/pipeline-state-schema.json +0 -191
  381. package/adapters/cursor/skills/forge-4-backlog/references/forge-config-schema.json +0 -236
  382. package/adapters/cursor/skills/forge-4-backlog/references/pipeline-state-schema.json +0 -191
  383. package/adapters/cursor/skills/forge-5-loop/references/forge-config-schema.json +0 -236
  384. package/adapters/cursor/skills/forge-6-docs/references/pipeline-state-schema.json +0 -191
  385. package/adapters/cursor/skills/forge-verify/references/pipeline-state-schema.json +0 -191
  386. package/adapters/cursor/skills/forge-verify/references/verification-checklists.md +0 -477
  387. package/adapters/gemini/skills/forge-1-prd/references/pipeline-state-schema.json +0 -191
  388. package/adapters/gemini/skills/forge-2-tech/references/pipeline-state-schema.json +0 -191
  389. package/adapters/gemini/skills/forge-3-specs/references/pipeline-state-schema.json +0 -191
  390. package/adapters/gemini/skills/forge-4-backlog/references/forge-config-schema.json +0 -236
  391. package/adapters/gemini/skills/forge-4-backlog/references/pipeline-state-schema.json +0 -191
  392. package/adapters/gemini/skills/forge-5-loop/references/forge-config-schema.json +0 -236
  393. package/adapters/gemini/skills/forge-6-docs/references/pipeline-state-schema.json +0 -191
  394. package/adapters/gemini/skills/forge-verify/references/pipeline-state-schema.json +0 -191
  395. package/adapters/gemini/skills/forge-verify/references/verification-checklists.md +0 -477
  396. package/adapters/pi/skills/forge-1-prd/references/pipeline-state-schema.json +0 -191
  397. package/adapters/pi/skills/forge-2-tech/references/pipeline-state-schema.json +0 -191
  398. package/adapters/pi/skills/forge-3-specs/references/pipeline-state-schema.json +0 -191
  399. package/adapters/pi/skills/forge-4-backlog/references/forge-config-schema.json +0 -236
  400. package/adapters/pi/skills/forge-4-backlog/references/pipeline-state-schema.json +0 -191
  401. package/adapters/pi/skills/forge-5-loop/references/forge-config-schema.json +0 -236
  402. package/adapters/pi/skills/forge-6-docs/references/pipeline-state-schema.json +0 -191
  403. package/adapters/pi/skills/forge-verify/references/pipeline-state-schema.json +0 -191
  404. package/adapters/pi/skills/forge-verify/references/verification-checklists.md +0 -477
@@ -0,0 +1,472 @@
1
+ # Stage Exit Protocol
2
+
3
+ The single source of truth for how every forge stage closes. **One** scripted contract
4
+ covers all **nine** covered direct exits — the seven production stages `forge-0-epic`
5
+ through `forge-6-docs`, plus direct `forge-verify` and direct `forge-fix`. It replaces the
6
+ old ad-hoc "Next steps:" bullet lists with one fixed, correctly-ordered sequence:
7
+ **verify (if missing or stale) → `/clear` → run the next command.**
8
+
9
+ Two principles this protocol encodes (do not relitigate — they are locked product
10
+ decisions):
11
+
12
+ 1. **Clearing is recommended on its own merits at every stage boundary** — a clean
13
+ start for the next stage — *not* as a proxy for a full context window. Window
14
+ fullness only changes *how emphatically* the clear is recommended, never *whether*
15
+ it is.
16
+ 2. **Verify happens before the clear, never after** — in the authoring session, whether
17
+ manual **or** auto. Verify's clean-room subagent is dispatched from the *current*
18
+ session, so the findings digest and any fix decision land where the context to act on
19
+ them still exists. This holds for auto-verify too: the stage skill dispatches the
20
+ clean-room verify (and any autoFix) at stage end, in-session, before the exit — it is
21
+ **not** deferred to the navigator, which runs *after* the `/clear` with none of the
22
+ authoring context. Clearing first throws that context away.
23
+
24
+ ## How this file is used
25
+
26
+ Every covered exit closes with the **Scripted Stage Exit**: the single stamped block
27
+ below, which runs `forge-session.py stage-exit`, obeys the DIRECTIVES it prints per the
28
+ **directive contract** in this file, and — only when this call owns the terminal block —
29
+ prints the script-emitted NEXT-STEPS block verbatim as the absolute last output. All the
30
+ conditional logic the old prose blocks asked the model to compute (effective auto-verify,
31
+ freshness collapse, gate selection, host wording, branch rejoin, loop and docs routing)
32
+ now lives in the script, deterministically; only genuinely interactive work (clean-room
33
+ subagent dispatch, question-tool gates) remains prose — specified once here, not per
34
+ stage.
35
+
36
+ A drift-guard test (`tests/test_stage_exit_protocol.py`) asserts each stamp site still
37
+ contains the canonical block, so an edit here must be mirrored into every stamp site (and
38
+ vice-versa).
39
+
40
+ ### The nine covered exits and their stage-specific flags
41
+
42
+ Every caller passes the same identity and capability flags — `--feature`, `--stage`,
43
+ `--specs-dir`, `--host`, `--verify-capability`, plus `--epic "{epic}"` when the feature is
44
+ an epic member. Only the flags below are stage-specific; pass no others.
45
+
46
+ | Caller | `--stage` | Stage-specific typed flags |
47
+ |---|---|---|
48
+ | `forge-0-epic` | `forge-0-epic` | `--next-feature "{member}"` when a concrete member exists |
49
+ | `forge-1-prd` … `forge-4-backlog` | that stage's own id | none beyond identity/capability |
50
+ | `forge-5-loop` | `forge-5-loop` | `--outcome` — one of `complete`, `partial`, `blocked`, `needs-human`, `deferred` |
51
+ | `forge-6-docs` | `forge-6-docs` | `--outcome` — `complete` or `blocked` |
52
+ | direct `forge-verify` | `forge-verify` | `--owner direct`, `--outcome` (`passed`, `findings`, `skipped`, `failed`), and served-stage metadata |
53
+ | nested `forge-verify` | `forge-verify` | `--owner nested`, plus the same outcome and served-stage metadata |
54
+ | direct/nested `forge-fix` | `forge-fix` | the matching `--owner`, a `FixOutcome` (`no-findings`, `decisions`, `failed`, `applied`, `reverified`, `reverify-findings`, `deferred`), and served-stage metadata |
55
+
56
+ "Served-stage metadata" means `--served-stage` (the production stage this diversion
57
+ served) and/or `--verify-mode` (`epic`, `prd`, `tech`, `specs`, `backlog`, `impl`), which
58
+ maps to a served stage when unambiguous. If both are supplied they must agree; if neither
59
+ is, the script exits 2 rather than guessing. Conversational context and `currentStage` are
60
+ never valid inference sources.
61
+
62
+ An invalid or missing enum, a conflicting served-stage mapping, or an unresolvable
63
+ identity is surfaced as the script's `Error:` line on stderr with exit 2. The skill
64
+ surfaces that line and **stops without inventing next steps** — there is no payload and no
65
+ sentinel to print.
66
+
67
+ An exit 2 from `stage-exit` itself is **not** a no-write guarantee: the
68
+ `auto-verify-pending` debt marker is persisted at the scheduling boundary *before* the
69
+ payload is built, deliberately, so an interrupted exit still leaves the verification
70
+ obligation durable on disk. Do not retry on the assumption that nothing landed — the
71
+ marker is idempotent and the re-run will read it. (The narrower "nothing was recorded"
72
+ guarantee belongs to `state-verify`, whose validation all precedes its single atomic
73
+ write.)
74
+
75
+ ### Stamp sites
76
+
77
+ | Stamp site | Block |
78
+ |---|---|
79
+ | all nine covered exits (`forge-0-epic` … `forge-6-docs`, direct `forge-verify`, direct `forge-fix`) | the canonical scripted stage-exit stamp |
80
+
81
+ The scripted stamp fills one build-time slot, `{stage-exit-args}` — the per-stage argument
82
+ list from the table above (e.g. `--feature "{feature}" --stage forge-2-tech`; the epic
83
+ stage passes `--feature "{epic}" --stage forge-0-epic --next-feature
84
+ "{first-actionable-feature}"`; the loop passes `--feature "{feature}" --stage forge-5-loop
85
+ --outcome "{LoopOutcome}"`). `{feature}` / `{epic}` / `{specsDir}` /
86
+ `{first-actionable-feature}` / `{verify-capability}` remain runtime placeholders the skill
87
+ resolves before running the command, exactly as elsewhere.
88
+
89
+ <!-- BEGIN: scripted-stage-exit-stamp -->
90
+ **Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
91
+
92
+ ```bash
93
+ 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')"
94
+ [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
95
+ python3 "$R/scripts/forge-session.py" stage-exit {stage-exit-args} --specs-dir "{specsDir}" --host claude --verify-capability "{verify-capability}"
96
+ ```
97
+
98
+ Obey the DIRECTIVES it prints, in the consumption order this protocol fixes: surface `invalidAutoVerifyKeys` and every `warnings` entry first; `runInStageVerify: true` → run the in-stage clean-room verify chain now (honoring `autoFixEligible`, and asking through the Standard Verify Gate first when you may not dispatch unsolicited); `verifyGate: "standard"` → present the Standard Verify Gate; `verifyGate: "manual-print"` → print the `verifyCommand` for the user and do **not** dispatch inline. Then, and only when `terminalOwnedBy` is `"self"`, **print the NEXT-STEPS block verbatim as your absolute last output — nothing after its sentinel line.** A `terminalOwnedBy: "outer"` payload carries `nextSteps: null`: return your structured result to the caller and print no terminal block at all.
99
+ <!-- END: scripted-stage-exit-stamp -->
100
+
101
+ The stamp is shown with `--host claude`; the adapter build substitutes `pi`/`generic` per
102
+ target, and §"Host and capability determination" below governs the value. The literal is
103
+ deliberate — `scripts/build-adapters.py` keys its host translation on the exact string
104
+ `--host claude`, and the stamp sites are compared byte-for-byte, so it is the one token in
105
+ that line that is not a placeholder.
106
+
107
+ ## Host and capability determination
108
+
109
+ Before the call, compute the two inputs independently. They are unrelated: **a host never
110
+ implies a capability**, and the script takes `--verify-capability` at face value.
111
+
112
+ **`--host`** describes only the active adapter command surface — `claude`, `pi`, or
113
+ `generic`. It selects command syntax (`/skill:` vs `/skill:` vs host-neutral) and
114
+ fresh-session wording (`/clear` vs `/new` vs neutral prose). Nothing else.
115
+
116
+ **`--verify-capability interactive`** is passed only when **both** of these hold:
117
+
118
+ - **(a)** a question mechanism equivalent to `AskUserQuestion` is available, **and**
119
+ - **(b)** a clean-room `forge-verifier` subagent can be dispatched.
120
+
121
+ If either is absent, or capability cannot be established, pass `manual`.
122
+
123
+ **(b) tests PERMISSION, not tool presence.** The question is not "is a subagent-dispatch
124
+ tool listed in my tool surface" but "**may I dispatch `forge-verifier` right now**". A
125
+ session can carry a standing host instruction against dispatching subagents unless the
126
+ user asked. Such instructions are injected by the harness, sit outside both the user's
127
+ config and this project's control, can be enabled or disabled per session, and **outrank
128
+ this prose**. A model that reads (b) as mere tool presence self-reports `interactive`,
129
+ attempts the dispatch, declines its own attempt, and lands in the recovery path below
130
+ instead of the correct path. Read (b) as permission and classify up front.
131
+
132
+ **A consent requirement is `interactive`, not `manual`.** When dispatch is barred only
133
+ *unless the user asked*, and a question mechanism **is** available, pass `interactive`. The
134
+ Standard Verify Gate's own prompt supplies the missing user request: the user selecting
135
+ "Verify {stageNoun} now" **is** the request, so the dispatch that follows that choice is
136
+ solicited and permitted. Degrading this case to `manual` prints a copy-paste command and
137
+ throws away the in-context digest for no reason. Pass `manual` only when there is **no**
138
+ question mechanism **and** **no** permitted dispatch — genuine incapability, never a
139
+ consent step.
140
+
141
+ **A dispatch bar routes an auto-verify directive through the gate; it never resolves it.**
142
+ When `runInStageVerify: true` arrives and you may not dispatch unsolicited, that directive
143
+ is **presented through the Standard Verify Gate** in its consent form — see "Consent
144
+ variant on a `none` gate" below — and the clean-room `forge-verifier` is **dispatched on
145
+ the affirmative choice**, never merely printed for the user to run later. Such a bar is
146
+ **never grounds to skip verification**, and it is never resolved by **advancing to the
147
+ production successor** while verification is unresolved.
148
+
149
+ **Do not use `host == claude` as a capability proxy.** It is not one in either direction:
150
+
151
+ - a capable Pi session is `--host pi --verify-capability interactive`, and receives the
152
+ same logical gate a capable Claude session does;
153
+ - Pi without a dispatchable verifier is `--host pi --verify-capability manual`;
154
+ - a Claude session that cannot dispatch is `--host claude --verify-capability manual`.
155
+
156
+ Interactive gate options keep their explicit labels, their recommended default, and their
157
+ one-line trade-off descriptions (below). The manual path prints the verify command as the
158
+ sole fenced primary action and mentions production advancement only as unfenced post-pass
159
+ guidance.
160
+
161
+ ### Clean-room unavailable, or a non-answer
162
+
163
+ If a dispatch advertised as available later returns
164
+ `CLEAN_ROOM_UNAVAILABLE: forge-verifier subagent not dispatchable — verify not run.`, or
165
+ returns a non-answer (a placeholder, a "still running" note, or a delegation message
166
+ instead of a findings block), then **verification failed / did not run**:
167
+
168
+ - do **not** run the verification inline, and do **not** silently accept the non-answer as
169
+ a pass;
170
+ - leave the verification debt **unresolved**, so the navigator catch-up fires later;
171
+ - obtain a **fresh** `stage-exit` payload with `--verify-capability manual` and use that
172
+ verify-first output.
173
+
174
+ **Never reuse an earlier payload that promotes production advancement.** The earlier
175
+ payload was computed under a capability claim that has just been disproved; re-printing it
176
+ advances the pipeline past verification that never happened.
177
+
178
+ ## Branch ownership: the `owner:` token
179
+
180
+ `forge-verify` and `forge-fix` are dispatched through a Skill/Agent invocation, not a CLI,
181
+ so no `--owner` flag arrives on its own — and ownership is **never** inferred from how the
182
+ invocation happened to be phrased.
183
+
184
+ The dispatching caller states ownership in its invocation prompt using a literal token:
185
+
186
+ - **`owner: nested`** — used by in-stage auto-verify chains, the navigator's catch-up
187
+ chain, and a nested re-verify. The branch skill returns its structured result to the
188
+ outer caller and prints no terminal block.
189
+ - **`owner: direct`** — used when the dispatcher intends the branch skill to own the
190
+ terminal block.
191
+
192
+ **Absent the token, the skill treats itself as `direct`.** A user-typed
193
+ `/skill:forge-verify` or `/skill:forge-fix` is the only path that carries
194
+ no dispatcher, so "no token" and "no dispatcher" are the same condition. The skill passes
195
+ the resolved value straight through as `--owner direct|nested`.
196
+
197
+ Getting this wrong is not cosmetic. A nested verify that self-reports `direct` emits a
198
+ second sentinel-terminated block **inside** an outer stage's exit, breaking the
199
+ exactly-one-terminal-block rule — and the canon guard cannot catch it, because both
200
+ wordings legitimately appear in the same file. Judge the token, not the phrasing.
201
+
202
+ ## Directive consumption order
203
+
204
+ `stage-exit` emits a DIRECTIVES object and (for a direct owner) a NEXT-STEPS block. The
205
+ skill executes the directives **in this order**; the script has already computed every
206
+ conditional, so a directive is an instruction, not a question to re-derive.
207
+
208
+ 1. **Surface `invalidAutoVerifyKeys` and `warnings` first**, before any terminal output.
209
+ `warnings` is a **list**, not a single string, rendered in the fixed order the script
210
+ emits (epic-member state fallback, then debt-metadata, then revision mismatch); more
211
+ than one entry can appear on a single call, so print every entry rather than the first.
212
+ An empty list means checked-and-clean, which is not the same as the key being absent.
213
+ 2. **`runInStageVerify: true`** → execute the nested verify → fix → re-verify chain
214
+ synchronously (see below). This is the **one** directive that asks for an *unsolicited*
215
+ dispatch — auto-verify is authorized by config, not by a live user request — so it is
216
+ exactly where a standing no-unsolicited-dispatch instruction bites. When dispatch
217
+ requires consent and a question mechanism is available, do **not** dispatch silently,
218
+ do **not** treat the bar as a reason to skip verification, and do **not** advance:
219
+ present the Standard Verify Gate first (in its consent form) and dispatch on the
220
+ affirmative choice, then continue the chain unchanged.
221
+ 3. **`verifyGate == "standard"`** → present the Standard Verify Gate. A pass, a findings
222
+ result, or an explicit skip must be **persisted** and the routing recomputed before any
223
+ block is printed. A "stop here" choice emits no advancing block.
224
+ 4. **`verifyGate == "manual-print"`** → do **not** dispatch inline; print `verifyCommand`
225
+ for the user and use the script's verify-first block as-is.
226
+ 5. **Print `nextSteps` byte-for-byte, and only when `terminalOwnedBy == "self"`.**
227
+
228
+ ## Directive contract
229
+
230
+ ### `invalidAutoVerifyKeys` (non-empty)
231
+
232
+ Each key names a `forge.config.json` `autoVerifyStages` entry that matches no
233
+ verify-capable stage — a config typo. The script already prints one warning line per key,
234
+ in sorted order; surface them and continue. They never fail the exit.
235
+
236
+ ### `warnings` (a list)
237
+
238
+ Non-fatal advisories, each naming both the affected feature/stage/key **and** the recovery
239
+ action. Print every entry, in the emitted order, above the terminal block. Do not
240
+ reformat, merge, or summarize them, and never dump the state file they were derived from.
241
+
242
+ ### `runInStageVerify: true` — in-stage auto-verify {stageNoun}
243
+
244
+ Auto-verify is effective for this stage and verification is outstanding — verify **now,
245
+ in this session** (principle #2 applied to auto-verify: the digest and any fix decision
246
+ land here, where the authoring context still exists — not deferred to a post-`/clear`
247
+ navigator). The `auto-verify-pending` debt is already durable on disk at this point, so a
248
+ declined or deferred gate leaves recorded debt rather than a silent pass.
249
+
250
+ 1. **Clean-room verify (require-clean).** Dispatch the clean-room `forge-verifier`
251
+ subagent from this session in require-clean mode with the `owner: nested` token — the
252
+ same path the navigator uses (`skills/forge-verify/SKILL.md`). Dispatch it
253
+ **synchronously and await its digest inline** — do **not** run it in the background or
254
+ announce it as "still running"; the digest and any fix decision must land in this
255
+ session. It inherits none of this session's context, so no `/clear` is needed and only
256
+ a compact digest returns.
257
+ **If you may not dispatch unsolicited**, present the consent form of the Standard
258
+ Verify Gate first and dispatch on the affirmative choice — see "Consent variant on a
259
+ `none` gate" below. **Clean-room unavailable or a non-answer returned**: follow
260
+ "Clean-room unavailable, or a non-answer" above — leave verify pending, print the
261
+ `verifyCommand`, and continue to the NEXT-STEPS block.
262
+ 2. **Verify passed / no findings** → the fresh verify state is recorded by the
263
+ clean-room run; continue to the NEXT-STEPS block.
264
+ 3. **Verify found findings** →
265
+ - **`autoFixEligible: true` AND the findings document has zero unresolved decision
266
+ points** → chain `feature-forge:forge-fix` in-session with the `owner: nested` token
267
+ (it owns its own commit + step tracking), then run a **mandatory re-verify** in
268
+ require-clean mode. Continue to the NEXT-STEPS block only if the re-verify passes. On
269
+ any precondition miss, a forge-fix early stop, or a red re-verify, fall through to the
270
+ digest gate below — never a silent partial mutation. (`autoFixEligible` already folds
271
+ in the config `autoFix` flag and the clean-tree precondition; a dirty tree or
272
+ `gitCommitAfterStage: false` arrives here as `false`.)
273
+ - **`autoFixEligible: false`, or unresolved decision points** → surface a **compact
274
+ findings digest** as text, then present the gate: **Run `forge-fix` now**
275
+ *(recommended — you are in-context and the digest is right here)* / **Clear + advance
276
+ anyway** (leave the findings for later) / **Stop here**. Do **not** hard-stop and do
277
+ **not** silently walk past. Act on the choice, then continue to the NEXT-STEPS block.
278
+
279
+ Every nested call in this chain prints no terminal block of its own. This stage is the
280
+ sole terminal owner, and it prints exactly one block after the chain settles.
281
+
282
+ ### `verifyGate: "standard"` — the Standard Verify Gate
283
+
284
+ Auto-verify is off for this stage and verification is outstanding (`verifyState` is
285
+ `never`, `stale`, `failing`, or `auto-pending`), and the caller declared
286
+ `--verify-capability interactive`. Verify **now, before clearing**, using the host's
287
+ question mechanism with exactly these **three** labeled choices — the recommended default
288
+ first:
289
+
290
+ - **Verify {stageNoun} now** *(recommended)* — dispatch the clean-room `forge-verifier`
291
+ subagent from this session in require-clean mode with the `owner: nested` token; the
292
+ digest returns here so any fix decision keeps its context. One-time — it does **not**
293
+ change config.
294
+ - **Verify now + enable auto-verify going forward** — verify now **and** patch
295
+ `"autoVerify": true` into `forge.config.json` in place (preserve formatting and every
296
+ other key) so future stages verify automatically, no prompt. This complements the
297
+ `forge-init` opt-in. **Do not auto-commit this config change** — treat it like
298
+ `notes`: a user-facing edit the user commits on their own cadence, never folded into
299
+ a stage's artifact commit.
300
+ - **Skip for now** — go straight to the NEXT-STEPS block without verifying. Record this
301
+ stage's verify status as `skipped` in pipeline state (via `state-verify`, never by hand)
302
+ **only** on an explicit skip — a skip does not go stale.
303
+
304
+ **Advancement is allowed only after a pass, or after an explicit skip has been
305
+ persisted.** Choosing to stop, or losing the interaction, produces no advancing terminal
306
+ block. If verify runs and finds findings, handle them exactly as in the in-stage flow
307
+ above (digest + gate; `autoFixEligible` applies unchanged).
308
+
309
+ #### Consent variant on a `none` gate
310
+
311
+ When `runInStageVerify: true` and you may not dispatch unsolicited, the emitted
312
+ `verifyGate` **stays `none`** — changing it to `standard` would alter directive values for
313
+ the existing stages 0–4. Reuse this same gate block for consent, with **choice 2 omitted**:
314
+ auto-verify is already effective on this path, so "enable auto-verify going forward" is a
315
+ no-op, and offering a label with no trade-off behind it is not an accessible choice. The
316
+ consent form is therefore exactly **two** choices:
317
+
318
+ 1. **Verify {stageNoun} now** *(recommended)* — dispatch the clean-room verifier now; this
319
+ choice **is** the user request that authorizes the dispatch.
320
+ 2. **Skip for now** — persisted as an explicit `skipped` before any advancing block.
321
+
322
+ This is the **only** case in which the rendered gate and the emitted `verifyGate` value
323
+ differ, and it exists because the gate here supplies *consent* rather than selecting
324
+ *policy*.
325
+
326
+ ### `verifyGate: "manual-print"`
327
+
328
+ Verification is outstanding and the caller declared `--verify-capability manual`. Do
329
+ **not** run verify inline — print the `verifyCommand` for the user to run (mirroring
330
+ `autoInvokeNextStage`), offer the auto-verify enable as plain text only if a config write
331
+ is possible, and continue to the NEXT-STEPS block. Verify state stays outstanding, so the
332
+ navigator catch-up can fire later. The script has already made the verify command the sole
333
+ fenced primary action and demoted production advancement to unfenced prose.
334
+
335
+ ### `verifyGate: "none"`
336
+
337
+ Verification is already resolved (fresh or explicitly skipped), the stage carries no
338
+ verification token at all, or the in-stage run above covers it. Say so in one line and
339
+ continue to the NEXT-STEPS block.
340
+
341
+ ### `epicReconcile` (epic backflow — present only when there are open requests)
342
+
343
+ Emitted only when the exiting member carries `open` `epicChangeRequests` (recorded by
344
+ `forge-1-prd`/`forge-2-tech` when the epic *decomposition* itself must change — see
345
+ `references/pipeline-state-schema.json`). Absent on the common path and for standalone
346
+ features. The script has already folded the routing into the NEXT-STEPS block, so this
347
+ directive is informational — you do **not** re-derive the wording:
348
+
349
+ - `required: true` (at least one `blocksCurrent: true` request) — the reconcile command
350
+ (`/skill:forge-0-epic {epic}`) is promoted ahead of the ordinary production
351
+ successor, and that successor is demoted to a follow-up line ("After reconciling,
352
+ continue the pipeline with …"). This is *reconcile-before-specs*: proceeding would author
353
+ artifacts against a decomposition that is about to change. It is strongest when exiting
354
+ `forge-2-tech` (next is `forge-3-specs`, the point of no cheap return). When
355
+ verification is also outstanding, verification stays primary and the reconcile becomes
356
+ the **first** deferred action, ahead of the ordinary successor.
357
+ - `reminder: true` (only `blocksCurrent: false` requests) — normal next-stage routing is
358
+ unchanged; the block appends a non-blocking reminder line ("You also flagged N epic
359
+ change(s) to reconcile when convenient …"). This is *finish-then-edit*.
360
+
361
+ Either way the added lines are host-neutral (no literal `/clear`) and sit **above** the
362
+ sentinel; just print the NEXT-STEPS block verbatim as always.
363
+
364
+ ### Deferred decisions — do not solicit next-stage decisions at this exit
365
+
366
+ Each stage owns its own decisions. At a stage exit, do **not** pull a *later* stage's
367
+ decision forward — do not ask the user (or decide unilaterally) something that properly
368
+ belongs to the next stage's interview (e.g. at `forge-1-prd` exit, don't settle the
369
+ concrete cache backend that `forge-2-tech` will design). Soliciting it here guesses ahead
370
+ of the stage that owns the context, and the answer has nowhere durable to live.
371
+
372
+ Instead, when you notice a decision that belongs downstream, **record it structurally** as
373
+ a `deferredDecisions[]` entry on this feature's `.pipeline-state.json` by running
374
+ `state-decision` (`--rationale` and `--target-stage` are optional; the verb stamps
375
+ `raisedAt` and `status: "open"` for you). Add `--epic "{epic}"` when this feature is an
376
+ epic member — required, per the Pipeline State Protocol in `references/shared-conventions.md`:
377
+
378
+ ```bash
379
+ 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')"
380
+ [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
381
+ python3 "$R/scripts/forge-session.py" state-decision \
382
+ --feature "{feature}" --question "<phrased for the target stage>" \
383
+ --rationale "<why it belongs downstream>" --target-stage "<owning stage>" \
384
+ --raised-by "{stage}" --specs-dir "{specsDir}"
385
+ ```
386
+
387
+ This keeps the exit focused on *this* stage's next-step routing while carrying the open
388
+ question forward for the owning stage to resolve (it flips `status` to `addressed` when it
389
+ does). Prefer a `deferredDecisions[]` entry over stuffing the same thing into the free-text
390
+ `notes` string. This is a recording affordance, not a gate: never block the exit on it.
391
+
392
+ ### The NEXT-STEPS block, and the sentinel-last rule
393
+
394
+ **A direct payload** (`terminalOwnedBy: "self"`) carries exactly **one** occurrence of the
395
+ sentinel `─ forge: end of stage ─`, as the **final line** of `nextSteps`. Print that block
396
+ **verbatim as your absolute last output**. Nothing follows the sentinel — no summary, no
397
+ sign-off, no warning, no command result, no acceptance text, no caveat. The block already
398
+ carries the fresh-session recommendation (host-aware wording via `--host`) and the exact
399
+ next command, so trailing prose can only push the user's next action out of view.
400
+
401
+ **A nested payload** (`terminalOwnedBy: "outer"`) carries `nextSteps: null` and
402
+ `sentinel: null`. It prints **no terminal block at all** — not even an empty one. Return
403
+ your structured result to the outer caller; that caller re-runs `stage-exit` after the
404
+ nested state transitions so its single final block reflects the terminal result.
405
+
406
+ ---
407
+
408
+ ## Re-verify scope and convergence
409
+
410
+ A **re-verify** is any verification run whose served stage's verify entry is
411
+ `findings-applied` — a fix pass preceded it, and its job is to CONFIRM that pass, not to
412
+ re-open the artifact. These rules bind the dispatched `forge-verifier`, the skill that
413
+ synthesizes its digest (`skills/forge-verify/SKILL.md`), and the fix pass that requests
414
+ the re-verify (`skills/forge-fix/SKILL.md` Step 6):
415
+
416
+ - **Scope.** Confirm each finding of the prior report against that finding's own
417
+ acceptance evidence, and examine the fix's delta (the changed lines and what they
418
+ directly touch) for new blocking defects. A re-verify is NOT a fresh full-checklist
419
+ sweep: the full sweep already ran when the report was minted, and re-sweeping mints
420
+ arbitrary new findings against text the fix just wrote — the divergence loop this
421
+ section exists to prevent.
422
+ - **Convergence.** Only an unresolved finding from the prior report, or a new
423
+ **blocking** finding (`error` with behavioral, CLI-output, or decision-bearing
424
+ consequence, or `gap`) introduced by the fix delta itself, may make a re-verify close
425
+ as `reverify-findings`. Every other new observation — advisory-severity anywhere, or
426
+ anything outside the fix delta — is recorded in the report at most and never flips
427
+ the outcome.
428
+ - **Decision immunity.** A finding whose subject carries a recorded decision — a
429
+ `state-decision` entry, a recorded-decision comment in the artifact, or a declared
430
+ non-goal — is never filed, in a re-verify or a fresh sweep. Cite the decision
431
+ instead. Re-filing a decided question costs a round and reverses nothing.
432
+ In particular, a **meta-guard** (a test protecting other tests or prose) is judged
433
+ against its DECLARED protection set: guard-incompleteness against a declared
434
+ non-goal is never a finding — the space of what a guard does not cover is
435
+ unbounded, and enumerating it one round at a time is an arms race, not
436
+ verification (authoring norm: the testing-strategy archetype in
437
+ `skills/forge-3-specs/references/spec-archetypes.md`).
438
+ - **Escalation (the round ledger).** Rounds are counted from the served stage's
439
+ findings documents (`VERIFY-{mode}-{date}.md`, then `-round{N}` — the filename rule
440
+ in `skills/forge-verify/SKILL.md` Step 4), so the ledger is reconstructable from the
441
+ `.verification/` directory alone. On the SECOND consecutive `reverify-findings`
442
+ close for the same served stage, the loop has stopped converging: do NOT recommend
443
+ another fix pass. Present the compact findings digest and ask for explicit
444
+ disposition with exactly these options —
445
+ **Accept the residual findings and advance** *(recommended)*: record the acceptance
446
+ as a `state-decision` naming each accepted finding, then write the stage's verify
447
+ result as `passed` with the report attached (`--findings-file`/`--findings-count`);
448
+ the accepted findings become recorded decisions that decision immunity keeps from
449
+ ever being re-filed. **Run another fix pass**: available, never recommended at this
450
+ point. **Stop here**. The user may still choose to fix — the protocol just stops
451
+ steering into the loop it cannot show is converging. Under `manual` capability
452
+ (no question mechanism), print the digest and the three dispositions as text
453
+ BEFORE the terminal block — the user answers on their own cadence; the terminal
454
+ block still closes the stage mechanically.
455
+
456
+ ---
457
+
458
+ ## Retired blocks
459
+
460
+ The two bespoke terminal blocks this protocol used to carry — the **standard block** and
461
+ the **warm-acceptable variant**, the latter stamped only at the
462
+ `forge-5-loop → forge-6-docs` boundary — are **gone**. They were the last hand-written
463
+ advancing contract, and their final two stamp sites (`skills/forge-5-loop/SKILL.md`'s
464
+ step-6 epic handoff and `skills/forge-5-loop/references/result-reporting.md`'s all-done
465
+ report) now stamp the canonical scripted stamp instead.
466
+
467
+ Nothing may reintroduce them. A hand-written "walk the user through the Stage Exit
468
+ Protocol" block, a warm "clearing is optional" block, or any other bespoke next-command
469
+ list on a covered surface is a routing fork: the script already decides freshness, gate
470
+ form, host wording, and the next command from live state, and a second block can only
471
+ disagree with it. The canonical scripted stamp above is the **only** advancing contract
472
+ for all nine covered exits.
@@ -0,0 +1,97 @@
1
+ # Backlog Verification Checklist
2
+
3
+ Detailed checklist for the **backlog** verification mode, loaded by the `forge-verifier` leaf subagent dispatched for that mode. Execute EVERY check — do not skip.
4
+
5
+ > **Stack-specific details:** When a stack profile exists at `references/stacks/{stack}.md`, load it alongside this checklist for language-specific check criteria (e.g., what "valid syntax" means, what the type check command is, how module exports work).
6
+
7
+ ## Backlog Mode Checklist
8
+
9
+ ### Schema Compliance
10
+ - [ ] **CHECK-B01**: backlog.json is valid JSON
11
+ - [ ] **CHECK-B02**: Every item has all required fields: id, type, priority, title, description, acceptanceCriteria, status, dependsOn, specReferences
12
+ - [ ] **CHECK-B03**: All `id` values are unique
13
+ - [ ] **CHECK-B04**: All `type` values are valid (feature, bugfix, chore, etc.)
14
+ - [ ] **CHECK-B05**: All `priority` values are valid numbers
15
+ - [ ] **CHECK-B06**: All `status` values are valid (pending, in-progress, complete, etc.)
16
+
17
+ ### Spec Coverage
18
+ - [ ] **CHECK-B07**: Every implementation spec document is referenced by at least one backlog item
19
+ - [ ] **CHECK-B08**: Every P0 PRD requirement is covered by at least one backlog item's acceptance criteria
20
+ - [ ] **CHECK-B09**: No backlog item references a spec file that doesn't exist
21
+ - [ ] **CHECK-B10**: specReferences paths are valid relative paths to actual files
22
+
23
+ ### Task Quality
24
+ - [ ] **CHECK-B11**: Each item is scoped to be completable in a single rauf loop iteration
25
+ - [ ] **CHECK-B12**: Descriptions are detailed enough for a fresh agent with no prior context
26
+ - [ ] **CHECK-B13**: Acceptance criteria are objectively verifiable (not subjective like "works well")
27
+ - [ ] **CHECK-B14**: Each item specifies what files to create or modify
28
+
29
+ ### Dependency Ordering
30
+ - [ ] **CHECK-B15**: `dependsOn` references are valid item IDs
31
+ - [ ] **CHECK-B16**: No circular dependencies exist
32
+ - [ ] **CHECK-B17**: Foundation items (types, scaffold) have no dependencies
33
+ - [ ] **CHECK-B18**: Items that depend on types/interfaces reference the item that creates them
34
+ - [ ] **CHECK-B19**: Priority ordering is consistent with dependency ordering (dependencies should have equal or higher priority)
35
+
36
+ ### Completeness
37
+ - [ ] **CHECK-B20**: There is an item for the initial package scaffold
38
+ - [ ] **CHECK-B21**: There is an item for shared types and error hierarchy
39
+ - [ ] **CHECK-B22**: There are items for each major subsystem
40
+ - [ ] **CHECK-B23**: There are items for integration wiring (not just isolated subsystems)
41
+ - [ ] **CHECK-B24**: There are items for tests (or testing is included in each feature item's acceptance criteria)
42
+ - [ ] **CHECK-B25**: No large items that try to do too many things (should be broken down)
43
+
44
+ ### Generated-Artifact Freshness
45
+ - [ ] **CHECK-B26**: **Generated-artifact freshness vs. `testCommand` `--check` gates** (#145). When a
46
+ project's configured `testCommand` (forge.config.json) gates on **staleness of generated artifacts**
47
+ — sub-commands of the shape `<generator> --check` / `--verify` / `:check` that fail if a checked-in
48
+ generated file is out of date with its source — every backlog item that regenerates *one* gated
49
+ artifact must regenerate (and commit) **all** the sibling artifacts those same `--check` gates
50
+ depend on, or the item will pass locally yet red-gate on the stale-generated check. Verify
51
+ heuristically:
52
+ 1. **Enumerate the gates.** String-scan `testCommand` for `--check`-style freshness sub-commands and
53
+ collect the generator/artifact each one guards (e.g. `build-benchmarks --check` guards
54
+ `partner-program-benchmarks`). If the command shape is unrecognized (no parseable `--check`
55
+ tokens), this check is **advisory / not-applicable** — never a hard fail.
56
+ 2. **A gate with no regenerator.** If a `--check` gate guards an artifact that **no** backlog item
57
+ regenerates, and some item edits that artifact's *source*, flag a `gap`: the source change will
58
+ trip the freshness gate with nothing scheduled to refresh the output.
59
+ 3. **Partial regeneration.** If an item regenerates a proper subset of the artifacts gated by the
60
+ `--check` set it touches (e.g. runs `build-partner-programs` + `build-analysis` but the gate also
61
+ covers `build-benchmarks`), flag an `inconsistency` naming the missing generator(s) and
62
+ recommending they be added to that item's execute + commit sequence. Same posture as the authoring
63
+ guidance in `forge-4-backlog` / rauf `author-backlog`: enumerate the whole `--check`-gated set, not
64
+ just the artifact the item is "about".
65
+
66
+ ### Artifact Lifecycle Consistency
67
+ - [ ] **CHECK-B27**: **No test item forcing a lifecycle transition another item forbids** (#150).
68
+ *Advisory heuristic — keyword/artifact-name based; **not-applicable** when no lifecycle vocabulary is
69
+ present, **never** a hard fail.* A **lifecycle state** (draft / published / released / approved /
70
+ reviewed / signed-off / gated) is a downstream-project concept forge does not itself track — but a
71
+ backlog can still encode a **contradiction** about one named artifact: item A pins artifact `X` as
72
+ *draft* / *unpublished* / *unreviewed* while item B asserts (in its acceptance criteria or a test it
73
+ adds) that `X` is *published* / *released* / *approved*, with **no** publishing/review item for `X`
74
+ anywhere in B's dependency closure. That leaves a **test/e2e item as the only thing forcing the
75
+ transition** — and since the autonomous loop can neither publish a package nor stand in for a human
76
+ reviewer, asked to make such a test green it **fabricates** the publication or sign-off (a provenance
77
+ defect a `--review` pass has caught in the wild). Verify heuristically:
78
+ 1. **Find lifecycle assertions.** Scan item titles/descriptions/`acceptanceCriteria` for a named
79
+ artifact paired with a lifecycle-state keyword — earlier states (`draft` / `unpublished` /
80
+ `pending review` / `unreleased`) vs later states (`published` / `released` / `approved` / `live` /
81
+ `signed-off` / `gated`). If **no** item carries such vocabulary, this check is **not-applicable**.
82
+ 2. **Pair by artifact name.** Group assertions that reference the **same named artifact**. A pair
83
+ where one item requires the *earlier* state and another asserts the *later* state is a candidate.
84
+ 3. **Check the dependency closure.** If the later-state item has **no** publish / review / human-gated
85
+ item for that artifact in its transitive `dependsOn`, flag an `inconsistency`: name the artifact,
86
+ both items, and recommend either (a) adding a `dependsOn` on an explicit human-gated publish/review
87
+ item that legitimately produces the state, or (b) re-asserting the state via a dev-build / fixture
88
+ path — never letting a test item be the sole driver of the transition (mirrors the authoring
89
+ guidance in `forge-4-backlog` / rauf `author-backlog`). **Report, do not repair.**
90
+
91
+ > **Anti-pattern (visible even where the heuristic can't fire):** a test/e2e item whose pass condition
92
+ > is "artifact `X` is published / approved / reviewed" while the backlog contains no human-gated
93
+ > publish or review item producing that state. The autonomous loop cannot publish or sign off on
94
+ > behalf of a human; asked to make such a test green it will **fabricate** the published/reviewed
95
+ > provenance. Any item asserting a human-gated lifecycle state must trace — via `dependsOn` — to the
96
+ > item that legitimately produces it, or assert the state through a dev-build / fixture path instead.
97
+