@garygentry/feature-forge 0.3.1 → 0.3.4

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 (421) hide show
  1. package/adapters/claude/.feature-forge-bundle.json +1 -1
  2. package/adapters/claude/agents/forge-verifier.md +3 -1
  3. package/adapters/claude/references/decisions/single-writer-threat-model.md +53 -0
  4. package/adapters/claude/references/epic-manifest-schema.json +6 -1
  5. package/adapters/claude/references/epic-state-schema.json +50 -0
  6. package/adapters/claude/references/forge-config-schema.json +19 -1
  7. package/adapters/claude/references/forge-decisions-schema.json +33 -0
  8. package/adapters/claude/references/pipeline-state-schema.json +38 -4
  9. package/adapters/claude/references/ralph-loop-contract.md +6 -3
  10. package/adapters/claude/references/shared-conventions.md +77 -3
  11. package/adapters/claude/references/stage-exit-protocol.md +391 -143
  12. package/adapters/claude/scripts/epic-manifest.py +495 -91
  13. package/adapters/claude/scripts/fix-sweep.py +1180 -0
  14. package/adapters/claude/scripts/forge-bootstrap.py +57 -5
  15. package/adapters/claude/scripts/forge-session.py +4241 -146
  16. package/adapters/claude/scripts/validate-traceability.py +86 -5
  17. package/adapters/claude/skills/forge/SKILL.md +10 -9
  18. package/adapters/claude/skills/forge/references/pipeline-state-schema.json +38 -4
  19. package/adapters/claude/skills/forge/references/shared-conventions.md +77 -3
  20. package/adapters/claude/skills/forge/references/stage-exit-protocol.md +391 -143
  21. package/adapters/claude/skills/forge-0-epic/SKILL.md +7 -2
  22. package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +29 -25
  23. package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +5 -0
  24. package/adapters/claude/skills/forge-0-epic/references/pipeline-state-schema.json +38 -4
  25. package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +77 -3
  26. package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +391 -143
  27. package/adapters/claude/skills/forge-1-prd/SKILL.md +17 -4
  28. package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +77 -3
  29. package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +391 -143
  30. package/adapters/claude/skills/forge-2-tech/SKILL.md +18 -4
  31. package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +77 -3
  32. package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +391 -143
  33. package/adapters/claude/skills/forge-3-specs/SKILL.md +9 -3
  34. package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +77 -3
  35. package/adapters/claude/skills/forge-3-specs/references/spec-archetypes.md +9 -0
  36. package/adapters/claude/skills/forge-3-specs/references/stage-exit-protocol.md +391 -143
  37. package/adapters/claude/skills/forge-4-backlog/SKILL.md +56 -5
  38. package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +77 -3
  39. package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +391 -143
  40. package/adapters/claude/skills/forge-5-loop/SKILL.md +67 -69
  41. package/adapters/claude/skills/forge-5-loop/references/agent-selection.md +16 -0
  42. package/adapters/claude/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
  43. package/adapters/claude/skills/forge-5-loop/references/recovery-procedure.md +349 -0
  44. package/adapters/claude/skills/forge-5-loop/references/result-reporting.md +101 -33
  45. package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +26 -6
  46. package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +77 -3
  47. package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +391 -143
  48. package/adapters/claude/skills/forge-6-docs/SKILL.md +75 -8
  49. package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +77 -3
  50. package/adapters/claude/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
  51. package/adapters/claude/skills/forge-fix/SKILL.md +119 -33
  52. package/adapters/claude/skills/forge-fix/references/shared-conventions.md +77 -3
  53. package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +391 -143
  54. package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +19 -1
  55. package/adapters/claude/skills/forge-guide/references/ralph-loop-contract.md +6 -3
  56. package/adapters/claude/skills/forge-guide/references/shared-conventions.md +77 -3
  57. package/adapters/claude/skills/forge-verify/SKILL.md +82 -51
  58. package/adapters/claude/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
  59. package/adapters/claude/skills/forge-verify/references/findings-template.md +69 -49
  60. package/adapters/claude/skills/forge-verify/references/shared-conventions.md +77 -3
  61. package/adapters/claude/skills/forge-verify/references/stage-exit-protocol.md +516 -0
  62. package/adapters/claude/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
  63. package/adapters/claude/skills/forge-verify/references/verification-checklists/epic.md +4 -3
  64. package/adapters/claude/skills/forge-verify/references/verification-checklists/impl.md +85 -0
  65. package/adapters/claude/skills/forge-verify/references/verification-checklists/specs.md +45 -1
  66. package/adapters/codex/.feature-forge-bundle.json +1 -1
  67. package/adapters/codex/agents/forge-verifier.toml +3 -1
  68. package/adapters/codex/references/decisions/single-writer-threat-model.md +53 -0
  69. package/adapters/codex/references/epic-manifest-schema.json +6 -1
  70. package/adapters/codex/references/epic-state-schema.json +50 -0
  71. package/adapters/codex/references/forge-config-schema.json +19 -1
  72. package/adapters/codex/references/forge-decisions-schema.json +33 -0
  73. package/adapters/codex/references/pipeline-state-schema.json +38 -4
  74. package/adapters/codex/references/process-overview.md +2 -2
  75. package/adapters/codex/references/ralph-loop-contract.md +6 -3
  76. package/adapters/codex/references/shared-conventions.md +102 -28
  77. package/adapters/codex/references/stage-exit-protocol.md +395 -147
  78. package/adapters/codex/scripts/epic-manifest.py +495 -91
  79. package/adapters/codex/scripts/fix-sweep.py +1180 -0
  80. package/adapters/codex/scripts/forge-bootstrap.py +57 -5
  81. package/adapters/codex/scripts/forge-session.py +4241 -146
  82. package/adapters/codex/scripts/validate-traceability.py +86 -5
  83. package/adapters/codex/skills/forge/SKILL.md +13 -12
  84. package/adapters/codex/skills/forge/references/pipeline-state-schema.json +38 -4
  85. package/adapters/codex/skills/forge/references/process-overview.md +2 -2
  86. package/adapters/codex/skills/forge/references/shared-conventions.md +102 -28
  87. package/adapters/codex/skills/forge/references/stage-exit-protocol.md +395 -147
  88. package/adapters/codex/skills/forge-0-epic/SKILL.md +7 -2
  89. package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +37 -33
  90. package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
  91. package/adapters/codex/skills/forge-0-epic/references/pipeline-state-schema.json +38 -4
  92. package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +102 -28
  93. package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
  94. package/adapters/codex/skills/forge-1-prd/SKILL.md +17 -4
  95. package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +102 -28
  96. package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
  97. package/adapters/codex/skills/forge-2-tech/SKILL.md +18 -4
  98. package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +102 -28
  99. package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
  100. package/adapters/codex/skills/forge-3-specs/SKILL.md +9 -3
  101. package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +102 -28
  102. package/adapters/codex/skills/forge-3-specs/references/spec-archetypes.md +9 -0
  103. package/adapters/codex/skills/forge-3-specs/references/stage-exit-protocol.md +395 -147
  104. package/adapters/codex/skills/forge-4-backlog/SKILL.md +56 -5
  105. package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +102 -28
  106. package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
  107. package/adapters/codex/skills/forge-5-loop/SKILL.md +67 -69
  108. package/adapters/codex/skills/forge-5-loop/references/agent-selection.md +17 -1
  109. package/adapters/codex/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
  110. package/adapters/codex/skills/forge-5-loop/references/recovery-procedure.md +349 -0
  111. package/adapters/codex/skills/forge-5-loop/references/result-reporting.md +101 -33
  112. package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +30 -10
  113. package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +102 -28
  114. package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
  115. package/adapters/codex/skills/forge-6-docs/SKILL.md +75 -8
  116. package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +102 -28
  117. package/adapters/codex/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
  118. package/adapters/codex/skills/forge-fix/SKILL.md +118 -32
  119. package/adapters/codex/skills/forge-fix/references/shared-conventions.md +102 -28
  120. package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +395 -147
  121. package/adapters/codex/skills/forge-guide/SKILL.md +1 -1
  122. package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +19 -1
  123. package/adapters/codex/skills/forge-guide/references/process-overview.md +2 -2
  124. package/adapters/codex/skills/forge-guide/references/ralph-loop-contract.md +6 -3
  125. package/adapters/codex/skills/forge-guide/references/shared-conventions.md +102 -28
  126. package/adapters/codex/skills/forge-init/SKILL.md +1 -1
  127. package/adapters/codex/skills/forge-verify/SKILL.md +82 -51
  128. package/adapters/codex/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
  129. package/adapters/codex/skills/forge-verify/references/findings-template.md +70 -50
  130. package/adapters/codex/skills/forge-verify/references/shared-conventions.md +102 -28
  131. package/adapters/codex/skills/forge-verify/references/stage-exit-protocol.md +516 -0
  132. package/adapters/codex/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
  133. package/adapters/codex/skills/forge-verify/references/verification-checklists/epic.md +5 -4
  134. package/adapters/codex/skills/forge-verify/references/verification-checklists/impl.md +85 -0
  135. package/adapters/codex/skills/forge-verify/references/verification-checklists/specs.md +45 -1
  136. package/adapters/copilot/.feature-forge-bundle.json +1 -1
  137. package/adapters/copilot/agents/forge-verifier.md +3 -1
  138. package/adapters/copilot/references/decisions/single-writer-threat-model.md +53 -0
  139. package/adapters/copilot/references/epic-manifest-schema.json +6 -1
  140. package/adapters/copilot/references/epic-state-schema.json +50 -0
  141. package/adapters/copilot/references/forge-config-schema.json +19 -1
  142. package/adapters/copilot/references/forge-decisions-schema.json +33 -0
  143. package/adapters/copilot/references/pipeline-state-schema.json +38 -4
  144. package/adapters/copilot/references/process-overview.md +2 -2
  145. package/adapters/copilot/references/ralph-loop-contract.md +6 -3
  146. package/adapters/copilot/references/shared-conventions.md +102 -28
  147. package/adapters/copilot/references/stage-exit-protocol.md +395 -147
  148. package/adapters/copilot/scripts/epic-manifest.py +495 -91
  149. package/adapters/copilot/scripts/fix-sweep.py +1180 -0
  150. package/adapters/copilot/scripts/forge-bootstrap.py +57 -5
  151. package/adapters/copilot/scripts/forge-session.py +4241 -146
  152. package/adapters/copilot/scripts/validate-traceability.py +86 -5
  153. package/adapters/copilot/skills/forge/forge.md +13 -12
  154. package/adapters/copilot/skills/forge/references/pipeline-state-schema.json +38 -4
  155. package/adapters/copilot/skills/forge/references/process-overview.md +2 -2
  156. package/adapters/copilot/skills/forge/references/shared-conventions.md +102 -28
  157. package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +395 -147
  158. package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +7 -2
  159. package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +37 -33
  160. package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
  161. package/adapters/copilot/skills/forge-0-epic/references/pipeline-state-schema.json +38 -4
  162. package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +102 -28
  163. package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
  164. package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +17 -4
  165. package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +102 -28
  166. package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
  167. package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +18 -4
  168. package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +102 -28
  169. package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
  170. package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +9 -3
  171. package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +102 -28
  172. package/adapters/copilot/skills/forge-3-specs/references/spec-archetypes.md +9 -0
  173. package/adapters/copilot/skills/forge-3-specs/references/stage-exit-protocol.md +395 -147
  174. package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +56 -5
  175. package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +102 -28
  176. package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
  177. package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +67 -69
  178. package/adapters/copilot/skills/forge-5-loop/references/agent-selection.md +17 -1
  179. package/adapters/copilot/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
  180. package/adapters/copilot/skills/forge-5-loop/references/recovery-procedure.md +349 -0
  181. package/adapters/copilot/skills/forge-5-loop/references/result-reporting.md +101 -33
  182. package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +30 -10
  183. package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +102 -28
  184. package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
  185. package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +75 -8
  186. package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +102 -28
  187. package/adapters/copilot/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
  188. package/adapters/copilot/skills/forge-fix/forge-fix.md +118 -32
  189. package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +102 -28
  190. package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +395 -147
  191. package/adapters/copilot/skills/forge-guide/forge-guide.md +1 -1
  192. package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +19 -1
  193. package/adapters/copilot/skills/forge-guide/references/process-overview.md +2 -2
  194. package/adapters/copilot/skills/forge-guide/references/ralph-loop-contract.md +6 -3
  195. package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +102 -28
  196. package/adapters/copilot/skills/forge-init/forge-init.md +1 -1
  197. package/adapters/copilot/skills/forge-verify/forge-verify.md +82 -51
  198. package/adapters/copilot/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
  199. package/adapters/copilot/skills/forge-verify/references/findings-template.md +70 -50
  200. package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +102 -28
  201. package/adapters/copilot/skills/forge-verify/references/stage-exit-protocol.md +516 -0
  202. package/adapters/copilot/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
  203. package/adapters/copilot/skills/forge-verify/references/verification-checklists/epic.md +5 -4
  204. package/adapters/copilot/skills/forge-verify/references/verification-checklists/impl.md +85 -0
  205. package/adapters/copilot/skills/forge-verify/references/verification-checklists/specs.md +45 -1
  206. package/adapters/cursor/.feature-forge-bundle.json +1 -1
  207. package/adapters/cursor/agents/forge-verifier.mdc +3 -1
  208. package/adapters/cursor/references/decisions/single-writer-threat-model.md +53 -0
  209. package/adapters/cursor/references/epic-manifest-schema.json +6 -1
  210. package/adapters/cursor/references/epic-state-schema.json +50 -0
  211. package/adapters/cursor/references/forge-config-schema.json +19 -1
  212. package/adapters/cursor/references/forge-decisions-schema.json +33 -0
  213. package/adapters/cursor/references/pipeline-state-schema.json +38 -4
  214. package/adapters/cursor/references/process-overview.md +2 -2
  215. package/adapters/cursor/references/ralph-loop-contract.md +6 -3
  216. package/adapters/cursor/references/shared-conventions.md +102 -28
  217. package/adapters/cursor/references/stage-exit-protocol.md +395 -147
  218. package/adapters/cursor/scripts/epic-manifest.py +495 -91
  219. package/adapters/cursor/scripts/fix-sweep.py +1180 -0
  220. package/adapters/cursor/scripts/forge-bootstrap.py +57 -5
  221. package/adapters/cursor/scripts/forge-session.py +4241 -146
  222. package/adapters/cursor/scripts/validate-traceability.py +86 -5
  223. package/adapters/cursor/skills/forge/forge.mdc +13 -12
  224. package/adapters/cursor/skills/forge/references/pipeline-state-schema.json +38 -4
  225. package/adapters/cursor/skills/forge/references/process-overview.md +2 -2
  226. package/adapters/cursor/skills/forge/references/shared-conventions.md +102 -28
  227. package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +395 -147
  228. package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +7 -2
  229. package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +37 -33
  230. package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
  231. package/adapters/cursor/skills/forge-0-epic/references/pipeline-state-schema.json +38 -4
  232. package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +102 -28
  233. package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
  234. package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +17 -4
  235. package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +102 -28
  236. package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
  237. package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +18 -4
  238. package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +102 -28
  239. package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
  240. package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +9 -3
  241. package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +102 -28
  242. package/adapters/cursor/skills/forge-3-specs/references/spec-archetypes.md +9 -0
  243. package/adapters/cursor/skills/forge-3-specs/references/stage-exit-protocol.md +395 -147
  244. package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +56 -5
  245. package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +102 -28
  246. package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
  247. package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +67 -69
  248. package/adapters/cursor/skills/forge-5-loop/references/agent-selection.md +17 -1
  249. package/adapters/cursor/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
  250. package/adapters/cursor/skills/forge-5-loop/references/recovery-procedure.md +349 -0
  251. package/adapters/cursor/skills/forge-5-loop/references/result-reporting.md +101 -33
  252. package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +30 -10
  253. package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +102 -28
  254. package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
  255. package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +75 -8
  256. package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +102 -28
  257. package/adapters/cursor/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
  258. package/adapters/cursor/skills/forge-fix/forge-fix.mdc +118 -32
  259. package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +102 -28
  260. package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +395 -147
  261. package/adapters/cursor/skills/forge-guide/forge-guide.mdc +1 -1
  262. package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +19 -1
  263. package/adapters/cursor/skills/forge-guide/references/process-overview.md +2 -2
  264. package/adapters/cursor/skills/forge-guide/references/ralph-loop-contract.md +6 -3
  265. package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +102 -28
  266. package/adapters/cursor/skills/forge-init/forge-init.mdc +1 -1
  267. package/adapters/cursor/skills/forge-verify/forge-verify.mdc +82 -51
  268. package/adapters/cursor/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
  269. package/adapters/cursor/skills/forge-verify/references/findings-template.md +70 -50
  270. package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +102 -28
  271. package/adapters/cursor/skills/forge-verify/references/stage-exit-protocol.md +516 -0
  272. package/adapters/cursor/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
  273. package/adapters/cursor/skills/forge-verify/references/verification-checklists/epic.md +5 -4
  274. package/adapters/cursor/skills/forge-verify/references/verification-checklists/impl.md +85 -0
  275. package/adapters/cursor/skills/forge-verify/references/verification-checklists/specs.md +45 -1
  276. package/adapters/gemini/.feature-forge-bundle.json +1 -1
  277. package/adapters/gemini/agents/forge-verifier.md +3 -1
  278. package/adapters/gemini/gemini-extension.json +1 -1
  279. package/adapters/gemini/references/decisions/single-writer-threat-model.md +53 -0
  280. package/adapters/gemini/references/epic-manifest-schema.json +6 -1
  281. package/adapters/gemini/references/epic-state-schema.json +50 -0
  282. package/adapters/gemini/references/forge-config-schema.json +19 -1
  283. package/adapters/gemini/references/forge-decisions-schema.json +33 -0
  284. package/adapters/gemini/references/pipeline-state-schema.json +38 -4
  285. package/adapters/gemini/references/process-overview.md +2 -2
  286. package/adapters/gemini/references/ralph-loop-contract.md +6 -3
  287. package/adapters/gemini/references/shared-conventions.md +102 -28
  288. package/adapters/gemini/references/stage-exit-protocol.md +395 -147
  289. package/adapters/gemini/scripts/epic-manifest.py +495 -91
  290. package/adapters/gemini/scripts/fix-sweep.py +1180 -0
  291. package/adapters/gemini/scripts/forge-bootstrap.py +57 -5
  292. package/adapters/gemini/scripts/forge-session.py +4241 -146
  293. package/adapters/gemini/scripts/validate-traceability.py +86 -5
  294. package/adapters/gemini/skills/forge/forge.md +13 -12
  295. package/adapters/gemini/skills/forge/references/pipeline-state-schema.json +38 -4
  296. package/adapters/gemini/skills/forge/references/process-overview.md +2 -2
  297. package/adapters/gemini/skills/forge/references/shared-conventions.md +102 -28
  298. package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +395 -147
  299. package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +7 -2
  300. package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +37 -33
  301. package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
  302. package/adapters/gemini/skills/forge-0-epic/references/pipeline-state-schema.json +38 -4
  303. package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +102 -28
  304. package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
  305. package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +17 -4
  306. package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +102 -28
  307. package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
  308. package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +18 -4
  309. package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +102 -28
  310. package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
  311. package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +9 -3
  312. package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +102 -28
  313. package/adapters/gemini/skills/forge-3-specs/references/spec-archetypes.md +9 -0
  314. package/adapters/gemini/skills/forge-3-specs/references/stage-exit-protocol.md +395 -147
  315. package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +56 -5
  316. package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +102 -28
  317. package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
  318. package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +67 -69
  319. package/adapters/gemini/skills/forge-5-loop/references/agent-selection.md +17 -1
  320. package/adapters/gemini/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
  321. package/adapters/gemini/skills/forge-5-loop/references/recovery-procedure.md +349 -0
  322. package/adapters/gemini/skills/forge-5-loop/references/result-reporting.md +101 -33
  323. package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +30 -10
  324. package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +102 -28
  325. package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
  326. package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +75 -8
  327. package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +102 -28
  328. package/adapters/gemini/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
  329. package/adapters/gemini/skills/forge-fix/forge-fix.md +118 -32
  330. package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +102 -28
  331. package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +395 -147
  332. package/adapters/gemini/skills/forge-guide/forge-guide.md +1 -1
  333. package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +19 -1
  334. package/adapters/gemini/skills/forge-guide/references/process-overview.md +2 -2
  335. package/adapters/gemini/skills/forge-guide/references/ralph-loop-contract.md +6 -3
  336. package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +102 -28
  337. package/adapters/gemini/skills/forge-init/forge-init.md +1 -1
  338. package/adapters/gemini/skills/forge-verify/forge-verify.md +82 -51
  339. package/adapters/gemini/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
  340. package/adapters/gemini/skills/forge-verify/references/findings-template.md +70 -50
  341. package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +102 -28
  342. package/adapters/gemini/skills/forge-verify/references/stage-exit-protocol.md +516 -0
  343. package/adapters/gemini/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
  344. package/adapters/gemini/skills/forge-verify/references/verification-checklists/epic.md +5 -4
  345. package/adapters/gemini/skills/forge-verify/references/verification-checklists/impl.md +85 -0
  346. package/adapters/gemini/skills/forge-verify/references/verification-checklists/specs.md +45 -1
  347. package/adapters/pi/.feature-forge-bundle.json +1 -1
  348. package/adapters/pi/agents/forge-verifier.md +3 -1
  349. package/adapters/pi/references/decisions/single-writer-threat-model.md +53 -0
  350. package/adapters/pi/references/epic-manifest-schema.json +6 -1
  351. package/adapters/pi/references/epic-state-schema.json +50 -0
  352. package/adapters/pi/references/forge-config-schema.json +19 -1
  353. package/adapters/pi/references/forge-decisions-schema.json +33 -0
  354. package/adapters/pi/references/pipeline-state-schema.json +38 -4
  355. package/adapters/pi/references/process-overview.md +2 -2
  356. package/adapters/pi/references/ralph-loop-contract.md +6 -3
  357. package/adapters/pi/references/shared-conventions.md +91 -17
  358. package/adapters/pi/references/stage-exit-protocol.md +395 -147
  359. package/adapters/pi/scripts/epic-manifest.py +495 -91
  360. package/adapters/pi/scripts/fix-sweep.py +1180 -0
  361. package/adapters/pi/scripts/forge-bootstrap.py +57 -5
  362. package/adapters/pi/scripts/forge-session.py +4241 -146
  363. package/adapters/pi/scripts/validate-traceability.py +86 -5
  364. package/adapters/pi/skills/forge/SKILL.md +10 -9
  365. package/adapters/pi/skills/forge/references/pipeline-state-schema.json +38 -4
  366. package/adapters/pi/skills/forge/references/process-overview.md +2 -2
  367. package/adapters/pi/skills/forge/references/shared-conventions.md +91 -17
  368. package/adapters/pi/skills/forge/references/stage-exit-protocol.md +395 -147
  369. package/adapters/pi/skills/forge-0-epic/SKILL.md +7 -2
  370. package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +31 -27
  371. package/adapters/pi/skills/forge-0-epic/references/epic-manifest-subcommands.md +6 -1
  372. package/adapters/pi/skills/forge-0-epic/references/pipeline-state-schema.json +38 -4
  373. package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +91 -17
  374. package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +395 -147
  375. package/adapters/pi/skills/forge-1-prd/SKILL.md +17 -4
  376. package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +91 -17
  377. package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +395 -147
  378. package/adapters/pi/skills/forge-2-tech/SKILL.md +18 -4
  379. package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +91 -17
  380. package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +395 -147
  381. package/adapters/pi/skills/forge-3-specs/SKILL.md +9 -3
  382. package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +91 -17
  383. package/adapters/pi/skills/forge-3-specs/references/spec-archetypes.md +9 -0
  384. package/adapters/pi/skills/forge-3-specs/references/stage-exit-protocol.md +395 -147
  385. package/adapters/pi/skills/forge-4-backlog/SKILL.md +56 -5
  386. package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +91 -17
  387. package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +395 -147
  388. package/adapters/pi/skills/forge-5-loop/SKILL.md +67 -69
  389. package/adapters/pi/skills/forge-5-loop/references/agent-selection.md +16 -0
  390. package/adapters/pi/skills/forge-5-loop/references/ralph-loop-contract.md +6 -3
  391. package/adapters/pi/skills/forge-5-loop/references/recovery-procedure.md +349 -0
  392. package/adapters/pi/skills/forge-5-loop/references/result-reporting.md +101 -33
  393. package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +29 -9
  394. package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +91 -17
  395. package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +395 -147
  396. package/adapters/pi/skills/forge-6-docs/SKILL.md +75 -8
  397. package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +91 -17
  398. package/adapters/pi/skills/forge-6-docs/references/stage-exit-protocol.md +516 -0
  399. package/adapters/pi/skills/forge-fix/SKILL.md +118 -32
  400. package/adapters/pi/skills/forge-fix/references/shared-conventions.md +91 -17
  401. package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +395 -147
  402. package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +19 -1
  403. package/adapters/pi/skills/forge-guide/references/process-overview.md +2 -2
  404. package/adapters/pi/skills/forge-guide/references/ralph-loop-contract.md +6 -3
  405. package/adapters/pi/skills/forge-guide/references/shared-conventions.md +91 -17
  406. package/adapters/pi/skills/forge-verify/SKILL.md +81 -50
  407. package/adapters/pi/skills/forge-verify/references/decisions/single-writer-threat-model.md +53 -0
  408. package/adapters/pi/skills/forge-verify/references/findings-template.md +69 -49
  409. package/adapters/pi/skills/forge-verify/references/shared-conventions.md +91 -17
  410. package/adapters/pi/skills/forge-verify/references/stage-exit-protocol.md +516 -0
  411. package/adapters/pi/skills/forge-verify/references/verification-checklists/backlog.md +73 -0
  412. package/adapters/pi/skills/forge-verify/references/verification-checklists/epic.md +5 -4
  413. package/adapters/pi/skills/forge-verify/references/verification-checklists/impl.md +85 -0
  414. package/adapters/pi/skills/forge-verify/references/verification-checklists/specs.md +45 -1
  415. package/package.json +1 -1
  416. package/adapters/claude/skills/forge-verify/references/pipeline-state-schema.json +0 -191
  417. package/adapters/codex/skills/forge-verify/references/pipeline-state-schema.json +0 -191
  418. package/adapters/copilot/skills/forge-verify/references/pipeline-state-schema.json +0 -191
  419. package/adapters/cursor/skills/forge-verify/references/pipeline-state-schema.json +0 -191
  420. package/adapters/gemini/skills/forge-verify/references/pipeline-state-schema.json +0 -191
  421. package/adapters/pi/skills/forge-verify/references/pipeline-state-schema.json +0 -191
@@ -1,8 +1,10 @@
1
1
  # Stage Exit Protocol
2
2
 
3
- The single source of truth for how every forge **authoring** stage closes. It
4
- replaces the old ad-hoc "Next steps:" bullet lists with one fixed, correctly-ordered
5
- sequence: **verify (if missing or stale) → `/clear` → run the next command.**
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) → `/new` → run the next command.**
6
8
 
7
9
  Two principles this protocol encodes (do not relitigate — they are locked product
8
10
  decisions):
@@ -16,115 +18,319 @@ decisions):
16
18
  session, so the findings digest and any fix decision land where the context to act on
17
19
  them still exists. This holds for auto-verify too: the stage skill dispatches the
18
20
  clean-room verify (and any autoFix) at stage end, in-session, before the exit — it is
19
- **not** deferred to the navigator, which runs *after* the `/clear` with none of the
21
+ **not** deferred to the navigator, which runs *after* the `/new` with none of the
20
22
  authoring context. Clearing first throws that context away.
21
23
 
22
24
  ## How this file is used
23
25
 
24
- The five authoring stages (`forge-0-epic` … `forge-4-backlog`) close with the
25
- **Scripted Stage Exit**: a short stamped block (below) that runs
26
- `forge-session.py stage-exit`, obeys the DIRECTIVES it prints per the **directive
27
- contract** in this file, and prints the script-emitted NEXT-STEPS block verbatim as the
28
- absolute last output. All the conditional logic the old prose blocks asked the model to
29
- compute (effective auto-verify, freshness collapse, gate selection, host wording) now
30
- lives in the script, deterministically; only genuinely interactive work (clean-room
31
- subagent dispatch, `AskUserQuestion` gates) remains prose — specified once here, not
32
- per stage.
33
-
34
- The loop (`forge-5-loop`) keeps its bespoke exits: it stamps the **standard block**
35
- (step-6 epic-member handoff) and the **warm variant** (all-done closing) below,
36
- verbatim. `forge-6-docs` is **terminal** — it stamps no exit block.
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.
37
35
 
38
36
  A drift-guard test (`tests/test_stage_exit_protocol.py`) asserts each stamp site still
39
- contains its block, so an edit here must be mirrored into every stamp site (and
37
+ contains the canonical block, so an edit here must be mirrored into every stamp site (and
40
38
  vice-versa).
41
39
 
42
- ## Stamp sites
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`, `resolved`; optional `--cause dependency-starvation` with `--outcome partial` |
51
+ | `forge-6-docs` | `forge-6-docs` | `--outcome` — `complete`, `blocked`, or `skipped` (deliberate docs skip, persisted via `state-skip` before the exit; routes like `complete` with honest wording) |
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
43
76
 
44
77
  | Stamp site | Block |
45
78
  |---|---|
46
- | `forge-0-epic` … `forge-4-backlog` | scripted-stage-exit stamp |
47
- | `forge-5-loop` (step-6 epic-member handoff) | standard |
48
- | `forge-5-loop` (all-done closing → docs) | warm |
79
+ | all nine covered exits (`forge-0-epic` … `forge-6-docs`, direct `forge-verify`, direct `forge-fix`) | the canonical scripted stage-exit stamp |
49
80
 
50
- The scripted stamp fills one build-time slot, `{stage-exit-args}` — the per-stage
51
- argument list (e.g. `--feature "{feature}" --stage forge-2-tech`; the epic stage passes
52
- `--feature "{epic}" --stage forge-0-epic --next-feature "{first-actionable-feature}"`).
53
- `{feature}` / `{epic}` / `{specsDir}` / `{first-actionable-feature}` remain runtime
54
- placeholders the skill resolves before running the command, exactly as elsewhere.
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.
55
88
 
56
89
  <!-- BEGIN: scripted-stage-exit-stamp -->
57
90
  **Close this stage with the Scripted Stage Exit** (contract: `references/stage-exit-protocol.md`; do not improvise a "Next steps" list). Run:
58
91
 
59
92
  ```bash
60
- 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')"
93
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
61
94
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
62
- python3 "$R/scripts/forge-session.py" stage-exit {stage-exit-args} --specs-dir "{specsDir}" --host claude
95
+ python3 "$R/scripts/forge-session.py" stage-exit {stage-exit-args} --specs-dir "{specsDir}" --host pi --verify-capability "{verify-capability}"
63
96
  ```
64
97
 
65
- Obey the DIRECTIVES it prints, in order, per the directive contract: `runInStageVerify: true` → dispatch the in-stage clean-room verify now (honoring `autoFixEligible`); `verifyGate: "standard"` → present the Standard Verify Gate; `verifyGate: "manual-print"` → print the `verifyCommand` for the user; non-empty `invalidAutoVerifyKeys` → print a one-line warning. Then **print the NEXT-STEPS block verbatim as your absolute last output — nothing after its sentinel line.**
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.
66
99
  <!-- END: scripted-stage-exit-stamp -->
67
100
 
68
- ## Directive contract
101
+ The stamp is shown with `--host pi`; 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 canon
104
+ value of that flag, and the stamp sites are compared byte-for-byte, so it is the one token
105
+ in 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 (Claude's stage-command prefix vs Pi's `/skill:` vs
114
+ host-neutral) and fresh-session wording (Claude's clear command vs Pi's `/new` vs neutral
115
+ prose). Nothing else.
116
+
117
+ **`--verify-capability interactive`** is passed only when **both** of these hold:
118
+
119
+ - **(a)** a question mechanism equivalent to `AskUserQuestion` is available, **and**
120
+ - **(b)** a clean-room `forge-verifier` subagent can be dispatched.
121
+
122
+ If either is absent, or capability cannot be established, pass `manual`.
123
+
124
+ **(b) tests PERMISSION, not tool presence.** The question is not "is a subagent-dispatch
125
+ tool listed in my tool surface" but "**may I dispatch `forge-verifier` right now**". A
126
+ session can carry a standing host instruction against dispatching subagents unless the
127
+ user asked. Such instructions are injected by the harness, sit outside both the user's
128
+ config and this project's control, can be enabled or disabled per session, and **outrank
129
+ this prose**. A model that reads (b) as mere tool presence self-reports `interactive`,
130
+ attempts the dispatch, declines its own attempt, and lands in the recovery path below
131
+ instead of the correct path. Read (b) as permission and classify up front.
132
+
133
+ **A consent requirement is `interactive`, not `manual`.** When dispatch is barred only
134
+ *unless the user asked*, and a question mechanism **is** available, pass `interactive`. The
135
+ Standard Verify Gate's own prompt supplies the missing user request: the user selecting
136
+ "Verify {stageNoun} now" **is** the request, so the dispatch that follows that choice is
137
+ solicited and permitted. Degrading this case to `manual` prints a copy-paste command and
138
+ throws away the in-context digest for no reason. Pass `manual` only when there is **no**
139
+ question mechanism **and** **no** permitted dispatch — genuine incapability, never a
140
+ consent step.
141
+
142
+ **A dispatch bar routes an auto-verify directive through the gate; it never resolves it.**
143
+ When `runInStageVerify: true` arrives and you may not dispatch unsolicited, that directive
144
+ is **presented through the Standard Verify Gate** in its consent form — see "Consent
145
+ variant on a `none` gate" below — and the clean-room `forge-verifier` is **dispatched on
146
+ the affirmative choice**, never merely printed for the user to run later. Such a bar is
147
+ **never grounds to skip verification**, and it is never resolved by **advancing to the
148
+ production successor** while verification is unresolved.
149
+
150
+ **Do not use `host == claude` as a capability proxy.** It is not one in either direction:
151
+
152
+ - a capable Pi session is `--host pi --verify-capability interactive`, and receives the
153
+ same logical gate a capable Claude session does;
154
+ - Pi without a dispatchable verifier is `--host pi --verify-capability manual`;
155
+ - a Claude session that cannot dispatch keeps the Claude host value with
156
+ `--verify-capability manual`.
157
+
158
+ Interactive gate options keep their explicit labels, their recommended default, and their
159
+ one-line trade-off descriptions (below). The manual path prints the verify command as the
160
+ sole fenced primary action and mentions production advancement only as unfenced post-pass
161
+ guidance.
162
+
163
+ ### Clean-room unavailable, or a non-answer
164
+
165
+ If a dispatch advertised as available later returns
166
+ `CLEAN_ROOM_UNAVAILABLE: forge-verifier subagent not dispatchable — verify not run.`, or
167
+ returns a non-answer (a placeholder, a "still running" note, or a delegation message
168
+ instead of a findings block), then **verification failed / did not run**:
169
+
170
+ - do **not** run the verification inline, and do **not** silently accept the non-answer as
171
+ a pass;
172
+ - leave the verification debt **unresolved**, so the navigator catch-up fires later;
173
+ - obtain a **fresh** `stage-exit` payload with `--verify-capability manual` and use that
174
+ verify-first output.
175
+
176
+ **Never reuse an earlier payload that promotes production advancement.** The earlier
177
+ payload was computed under a capability claim that has just been disproved; re-printing it
178
+ advances the pipeline past verification that never happened.
179
+
180
+ ## Branch ownership: the `owner:` token
181
+
182
+ `forge-verify` and `forge-fix` are dispatched through a Skill/Agent invocation, not a CLI,
183
+ so no `--owner` flag arrives on its own — and ownership is **never** inferred from how the
184
+ invocation happened to be phrased.
185
+
186
+ The dispatching caller states ownership in its invocation prompt using a literal token:
187
+
188
+ - **`owner: nested`** — used by in-stage auto-verify chains, the navigator's catch-up
189
+ chain, and a nested re-verify. The branch skill returns its structured result to the
190
+ outer caller and prints no terminal block.
191
+ - **`owner: direct`** — used when the dispatcher intends the branch skill to own the
192
+ terminal block.
193
+
194
+ **Absent the token, the skill treats itself as `direct`.** A user-typed
195
+ `/skill:forge-verify` or `/skill:forge-fix` is the only path that carries
196
+ no dispatcher, so "no token" and "no dispatcher" are the same condition. The skill passes
197
+ the resolved value straight through as `--owner direct|nested`.
198
+
199
+ Getting this wrong is not cosmetic. A nested verify that self-reports `direct` emits a
200
+ second sentinel-terminated block **inside** an outer stage's exit, breaking the
201
+ exactly-one-terminal-block rule — and the canon guard cannot catch it, because both
202
+ wordings legitimately appear in the same file. Judge the token, not the phrasing.
203
+
204
+ ## Caller-side resumption: the declared resume point
205
+
206
+ The `owner:` token and `terminalOwnedBy` arbitrate who prints — but they specify only
207
+ the **callee** side: a nested skill stays quiet and returns its structured result. This
208
+ section is the reciprocal, caller-side half of that contract.
209
+
210
+ **On a sub-skill's return, the caller re-owns the terminal.** Every closing instruction
211
+ in the callee's own body — its report-and-stop posture, its "confirm the result" close,
212
+ its own next-steps habits — is void for this turn. The caller resumes at its **declared
213
+ resume point**, in the same turn, and its remaining steps run to its own terminal.
214
+
215
+ **Every Skill-tool delegation site declares, at the invocation, what happens on
216
+ return.** Suppression without resumption is the failure mode this section closes: the
217
+ callee's closing posture is the freshest instruction in context while the caller's next
218
+ step is the oldest, so an undeclared return silently ends the run one layer too early —
219
+ the caller's remaining steps (validation, state writes, commit, stage exit) dropped,
220
+ with no error surfaced. An implicit "let it run to its natural stopping point" is that
221
+ bug spelled politely, and it is banned on delegation sites. A site takes one of two
222
+ declared postures:
223
+
224
+ - **Delegate-and-resume** — the callee is a sub-step of the caller: the site names the
225
+ caller's own step that control returns to, and the caller continues there in the same
226
+ turn. The callee never owns the caller's terminal. The worked instance is
227
+ `forge-4-backlog` Step 4's **Return contract** for the `author-backlog` delegation
228
+ (control returns at Step 5; the sub-skill's direct-invocation posture — its approval
229
+ gate and its validate-and-confirm close — is explicitly disapplied on the delegated
230
+ path). New delegation sites follow that pattern rather than re-deriving it.
231
+ - **Terminal handoff** — the caller's job ends at the invocation and the invoked skill
232
+ owns the terminal from there on (e.g. the navigator's `autoInvokeNextStage`
233
+ "continue in this session" advance into the next production stage). Declaring the
234
+ handoff is what keeps it distinct from an accidental drop.
235
+
236
+ Scope: this contract governs **Skill-tool delegation within one session**. The
237
+ truncated-verifier-return guard (forge-verify's `findings-template.md`, "Truncated
238
+ Verifier Returns") is a different mechanism — it polices what an **Agent-dispatched
239
+ subagent's** return payload must contain, not where a caller resumes. A dispatch site
240
+ can be subject to both; satisfy each on its own terms.
241
+
242
+ ## Directive consumption order
243
+
244
+ `stage-exit` emits a DIRECTIVES object and (for a direct owner) a NEXT-STEPS block. The
245
+ skill executes the directives **in this order**; the script has already computed every
246
+ conditional, so a directive is an instruction, not a question to re-derive.
247
+
248
+ 1. **Surface `invalidAutoVerifyKeys` and `warnings` first**, before any terminal output.
249
+ `warnings` is a **list**, not a single string, rendered in the fixed order the script
250
+ emits (epic-member state fallback, then debt-metadata, then revision mismatch); more
251
+ than one entry can appear on a single call, so print every entry rather than the first.
252
+ An empty list means checked-and-clean, which is not the same as the key being absent.
253
+ 2. **`runInStageVerify: true`** → execute the nested verify → fix → re-verify chain
254
+ synchronously (see below). This is the **one** directive that asks for an *unsolicited*
255
+ dispatch — auto-verify is authorized by config, not by a live user request — so it is
256
+ exactly where a standing no-unsolicited-dispatch instruction bites. When dispatch
257
+ requires consent and a question mechanism is available, do **not** dispatch silently,
258
+ do **not** treat the bar as a reason to skip verification, and do **not** advance:
259
+ present the Standard Verify Gate first (in its consent form) and dispatch on the
260
+ affirmative choice, then continue the chain unchanged.
261
+ 3. **`verifyGate == "standard"`** → present the Standard Verify Gate. A pass, a findings
262
+ result, or an explicit skip must be **persisted** and the routing recomputed before any
263
+ block is printed. A "stop here" choice emits no advancing block.
264
+ 4. **`verifyGate == "manual-print"`** → do **not** dispatch inline; print `verifyCommand`
265
+ for the user and use the script's verify-first block as-is.
266
+ 5. **Print `nextSteps` byte-for-byte, and only when `terminalOwnedBy == "self"`.**
69
267
 
70
- `stage-exit` emits a DIRECTIVES object and a NEXT-STEPS block. The skill executes the
71
- directives **in this order**; the script has already computed every conditional, so a
72
- directive is an instruction, not a question to re-derive.
268
+ ## Directive contract
73
269
 
74
270
  ### `invalidAutoVerifyKeys` (non-empty)
75
271
 
76
- Print a one-line warning first (e.g. "⚠️ forge.config.json `autoVerifyStages` has
77
- unknown keys: … — they are ignored; fix the typo").
272
+ Each key names a `forge.config.json` `autoVerifyStages` entry that matches no
273
+ verify-capable stage — a config typo. The script already prints one warning line per key,
274
+ in sorted order; surface them and continue. They never fail the exit.
275
+
276
+ ### `warnings` (a list)
277
+
278
+ Non-fatal advisories, each naming both the affected feature/stage/key **and** the recovery
279
+ action. Print every entry, in the emitted order, above the terminal block. Do not
280
+ reformat, merge, or summarize them, and never dump the state file they were derived from.
78
281
 
79
282
  ### `runInStageVerify: true` — in-stage auto-verify {stageNoun}
80
283
 
81
284
  Auto-verify is effective for this stage and verification is outstanding — verify **now,
82
285
  in this session** (principle #2 applied to auto-verify: the digest and any fix decision
83
- land here, where the authoring context still exists — not deferred to a post-`/clear`
84
- navigator):
286
+ land here, where the authoring context still exists — not deferred to a post-`/new`
287
+ navigator). The `auto-verify-pending` debt is already durable on disk at this point, so a
288
+ declined or deferred gate leaves recorded debt rather than a silent pass.
85
289
 
86
290
  1. **Clean-room verify (require-clean).** Dispatch the clean-room `forge-verifier`
87
- subagent from this session in require-clean mode — the same path the navigator uses
88
- (`skills/forge-verify/SKILL.md`). Dispatch it **synchronously and await its digest
89
- inline** — do **not** run it in the background or announce it as "still running";
90
- the digest and any fix decision must land in this session. It inherits none of this
91
- session's context, so no `/clear` is needed and only a compact digest returns.
92
- **Clean-room unavailable** (no `Agent` tool, `forge-verifier` not dispatchable) **or
93
- a non-answer returned** (the verifier returned a placeholder / "still running" /
94
- delegation message instead of a findings block): do **not** run inline and do **not**
95
- silently accept the non-answer as a pass — leave verify **pending** so the navigator
96
- catch-up fires on a later Claude-host `/skill:forge`, print the
97
- `verifyCommand` for the user to run, and continue to the NEXT-STEPS block.
291
+ subagent from this session in require-clean mode with the `owner: nested` token — the
292
+ same path the navigator uses (`skills/forge-verify/SKILL.md`). Dispatch it
293
+ **synchronously and await its digest inline** — do **not** run it in the background or
294
+ announce it as "still running"; the digest and any fix decision must land in this
295
+ session. It inherits none of this session's context, so no `/new` is needed and only
296
+ a compact digest returns.
297
+ **If you may not dispatch unsolicited**, present the consent form of the Standard
298
+ Verify Gate first and dispatch on the affirmative choice — see "Consent variant on a
299
+ `none` gate" below. **Clean-room unavailable or a non-answer returned**: follow
300
+ "Clean-room unavailable, or a non-answer" above — leave verify pending, print the
301
+ `verifyCommand`, and continue to the NEXT-STEPS block.
98
302
  2. **Verify passed / no findings** → the fresh verify state is recorded by the
99
303
  clean-room run; continue to the NEXT-STEPS block.
100
304
  3. **Verify found findings** →
101
305
  - **`autoFixEligible: true` AND the findings document has zero unresolved decision
102
- points** → chain `feature-forge:forge-fix` in-session (it owns its own commit +
103
- step tracking), then run a **mandatory re-verify** in require-clean mode. Continue
104
- to the NEXT-STEPS block only if the re-verify passes. On any precondition miss, a
105
- forge-fix early stop, or a red re-verify, fall through to the digest gate below —
106
- never a silent partial mutation. (`autoFixEligible` already folds in the config
107
- `autoFix` flag and the clean-tree precondition; a dirty tree or
306
+ points** → chain `feature-forge:forge-fix` in-session with the `owner: nested` token
307
+ (it owns its own commit + step tracking), then run a **mandatory re-verify** in
308
+ require-clean mode. Continue to the NEXT-STEPS block only if the re-verify passes. On
309
+ any precondition miss, a forge-fix early stop, or a red re-verify, fall through to the
310
+ digest gate below — never a silent partial mutation. (`autoFixEligible` already folds
311
+ in the config `autoFix` flag and the clean-tree precondition; a dirty tree or
108
312
  `gitCommitAfterStage: false` arrives here as `false`.)
109
313
  - **`autoFixEligible: false`, or unresolved decision points** → surface a **compact
110
- findings digest** as text, then present the gate via `AskUserQuestion`: **Run
111
- `forge-fix` now** *(recommended — you are in-context and the digest is right
112
- here)* / **Clear + advance anyway** (leave the findings for later) / **Stop
113
- here**. Do **not** hard-stop and do **not** silently walk past. Act on the choice,
114
- then continue to the NEXT-STEPS block.
314
+ findings digest** as text, then present the gate: **Run `forge-fix` now**
315
+ *(recommended — you are in-context and the digest is right here)* / **Clear + advance
316
+ anyway** (leave the findings for later) / **Stop here**. Do **not** hard-stop and do
317
+ **not** silently walk past. Act on the choice, then continue to the NEXT-STEPS block.
318
+
319
+ Every nested call in this chain prints no terminal block of its own. This stage is the
320
+ sole terminal owner, and it prints exactly one block after the chain settles.
115
321
 
116
322
  ### `verifyGate: "standard"` — the Standard Verify Gate
117
323
 
118
324
  Auto-verify is off for this stage and verification is outstanding (`verifyState` is
119
- `never`, `stale`, or `failing`). Verify **now, before clearing**, using
120
- `AskUserQuestion` with exactly these three options — but only when the host has a
121
- question mechanism **and** the clean-room path is available (the `Agent` tool plus a
122
- dispatchable `forge-verifier` subagent); otherwise degrade exactly as `manual-print`
123
- below:
325
+ `never`, `stale`, `failing`, or `auto-pending`), and the caller declared
326
+ `--verify-capability interactive`. Verify **now, before clearing**, using the host's
327
+ question mechanism with exactly these **three** labeled choices — the recommended default
328
+ first:
124
329
 
125
330
  - **Verify {stageNoun} now** *(recommended)* — dispatch the clean-room `forge-verifier`
126
- subagent from this session in require-clean mode; the digest returns here so any fix
127
- decision keeps its context. One-time — it does **not** change config.
331
+ subagent from this session in require-clean mode with the `owner: nested` token; the
332
+ digest returns here so any fix decision keeps its context. One-time — it does **not**
333
+ change config.
128
334
  - **Verify now + enable auto-verify going forward** — verify now **and** patch
129
335
  `"autoVerify": true` into `forge.config.json` in place (preserve formatting and every
130
336
  other key) so future stages verify automatically, no prompt. This complements the
@@ -132,24 +338,49 @@ below:
132
338
  `notes`: a user-facing edit the user commits on their own cadence, never folded into
133
339
  a stage's artifact commit.
134
340
  - **Skip for now** — go straight to the NEXT-STEPS block without verifying. Record this
135
- stage's verify status as `"skipped"` in pipeline state (mirroring the existing skip
136
- handling) **only** on an explicit skip — a skip does not go stale.
137
-
138
- If verify runs and finds findings, handle them exactly as in the in-stage flow above
139
- (digest + `AskUserQuestion` gate; `autoFixEligible` applies unchanged).
341
+ stage's verify status as `skipped` in pipeline state (via `state-verify`, never by hand)
342
+ **only** on an explicit skip — a skip does not go stale. Exception: if the existing
343
+ entry records `passed` or `findings-applied` (a resolved result whose freshness has
344
+ merely lapsed), write **nothing** — `state-verify` refuses to demote a resolved status
345
+ to `skipped` (#203), and the recorded result stands on its own; the user's decline is
346
+ honored by simply not re-verifying.
347
+
348
+ **Advancement is allowed only after a pass, or after an explicit skip has been
349
+ persisted.** Choosing to stop, or losing the interaction, produces no advancing terminal
350
+ block. If verify runs and finds findings, handle them exactly as in the in-stage flow
351
+ above (digest + gate; `autoFixEligible` applies unchanged).
352
+
353
+ #### Consent variant on a `none` gate
354
+
355
+ When `runInStageVerify: true` and you may not dispatch unsolicited, the emitted
356
+ `verifyGate` **stays `none`** — changing it to `standard` would alter directive values for
357
+ the existing stages 0–4. Reuse this same gate block for consent, with **choice 2 omitted**:
358
+ auto-verify is already effective on this path, so "enable auto-verify going forward" is a
359
+ no-op, and offering a label with no trade-off behind it is not an accessible choice. The
360
+ consent form is therefore exactly **two** choices:
361
+
362
+ 1. **Verify {stageNoun} now** *(recommended)* — dispatch the clean-room verifier now; this
363
+ choice **is** the user request that authorizes the dispatch.
364
+ 2. **Skip for now** — persisted as an explicit `skipped` before any advancing block.
365
+
366
+ This is the **only** case in which the rendered gate and the emitted `verifyGate` value
367
+ differ, and it exists because the gate here supplies *consent* rather than selecting
368
+ *policy*.
140
369
 
141
370
  ### `verifyGate: "manual-print"`
142
371
 
143
- Verification is outstanding but the host cannot present the gate or dispatch
144
- clean-room. Do **not** run verify inline — print the `verifyCommand` for the user to
145
- run (mirroring `autoInvokeNextStage`), offer the auto-verify enable as plain text only
146
- if a config write is possible, and continue to the NEXT-STEPS block. Verify state stays
147
- outstanding, so the navigator catch-up can fire later.
372
+ Verification is outstanding and the caller declared `--verify-capability manual`. Do
373
+ **not** run verify inline — print the `verifyCommand` for the user to run (mirroring
374
+ `autoInvokeNextStage`), offer the auto-verify enable as plain text only if a config write
375
+ is possible, and continue to the NEXT-STEPS block. Verify state stays outstanding, so the
376
+ navigator catch-up can fire later. The script has already made the verify command the sole
377
+ fenced primary action and demoted production advancement to unfenced prose.
148
378
 
149
379
  ### `verifyGate: "none"`
150
380
 
151
- Verification is already resolved (fresh or explicitly skipped) or the in-stage run
152
- above covers it. Say so in one line and continue to the NEXT-STEPS block.
381
+ Verification is already resolved (fresh or explicitly skipped), the stage carries no
382
+ verification token at all, or the in-stage run above covers it. Say so in one line and
383
+ continue to the NEXT-STEPS block.
153
384
 
154
385
  ### `epicReconcile` (epic backflow — present only when there are open requests)
155
386
 
@@ -159,19 +390,20 @@ Emitted only when the exiting member carries `open` `epicChangeRequests` (record
159
390
  features. The script has already folded the routing into the NEXT-STEPS block, so this
160
391
  directive is informational — you do **not** re-derive the wording:
161
392
 
162
- - `required: true` (at least one `blocksCurrent: true` request) — the NEXT-STEPS block's
163
- fenced **primary** command is the epic reconcile command
164
- (`/skill:forge-0-epic {epic}`), and the normal next stage is demoted to a
165
- follow-up line ("After reconciling, continue with …"). This is *reconcile-before-specs*:
166
- proceeding would author artifacts against a decomposition that is about to change. It is
167
- strongest when exiting `forge-2-tech` (next is `forge-3-specs`, the point of no cheap
168
- return).
393
+ - `required: true` (at least one `blocksCurrent: true` request) — the reconcile command
394
+ (`/skill:forge-0-epic {epic}`) is promoted ahead of the ordinary production
395
+ successor, and that successor is demoted to a follow-up line ("After reconciling,
396
+ continue the pipeline with …"). This is *reconcile-before-specs*: proceeding would author
397
+ artifacts against a decomposition that is about to change. It is strongest when exiting
398
+ `forge-2-tech` (next is `forge-3-specs`, the point of no cheap return). When
399
+ verification is also outstanding, verification stays primary and the reconcile becomes
400
+ the **first** deferred action, ahead of the ordinary successor.
169
401
  - `reminder: true` (only `blocksCurrent: false` requests) — normal next-stage routing is
170
402
  unchanged; the block appends a non-blocking reminder line ("You also flagged N epic
171
403
  change(s) to reconcile when convenient …"). This is *finish-then-edit*.
172
404
 
173
- Either way the added lines are host-neutral (no literal `/clear`) and sit **above** the
174
- sentinel; just print the NEXT-STEPS block verbatim as always.
405
+ Either way the added lines are host-neutral (they name no fresh-session command) and sit
406
+ **above** the sentinel; just print the NEXT-STEPS block verbatim as always.
175
407
 
176
408
  ### Deferred decisions — do not solicit next-stage decisions at this exit
177
409
 
@@ -188,7 +420,7 @@ a `deferredDecisions[]` entry on this feature's `.pipeline-state.json` by runnin
188
420
  epic member — required, per the Pipeline State Protocol in `references/shared-conventions.md`:
189
421
 
190
422
  ```bash
191
- 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')"
423
+ R="$(bash -c 'for d in "${FEATURE_FORGE_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')"
192
424
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
193
425
  python3 "$R/scripts/forge-session.py" state-decision \
194
426
  --feature "{feature}" --question "<phrased for the target stage>" \
@@ -201,68 +433,84 @@ question forward for the owning stage to resolve (it flips `status` to `addresse
201
433
  does). Prefer a `deferredDecisions[]` entry over stuffing the same thing into the free-text
202
434
  `notes` string. This is a recording affordance, not a gate: never block the exit on it.
203
435
 
204
- ### The NEXT-STEPS block (always last)
205
-
206
- Print the script's NEXT-STEPS block **verbatim as your absolute last output**. Nothing
207
- follows its final sentinel line (`─ forge: end of stage ─`) — no caveats, no summary,
208
- no sign-off. The block already carries the `/clear` recommendation (host-aware wording
209
- via `--host`) and the exact next command, so trailing prose can only push the user's
210
- next action out of view.
211
-
212
- ---
436
+ ### The NEXT-STEPS block, and the sentinel-last rule
213
437
 
214
- ## Standard block
438
+ **A direct payload** (`terminalOwnedBy: "self"`) carries exactly **one** occurrence of the
439
+ sentinel `─ forge: end of stage ─`, as the **final line** of `nextSteps`. Print that block
440
+ **verbatim as your absolute last output**. Nothing follows the sentinel — no summary, no
441
+ sign-off, no warning, no command result, no acceptance text, no caveat. The block already
442
+ carries the fresh-session recommendation (host-aware wording via `--host`) and the exact
443
+ next command, so trailing prose can only push the user's next action out of view.
215
444
 
216
- Stamped at the loop's step-6 epic-member handoff (finishing feature A → starting
217
- feature B's PRD). It self-adapts: step 1's verify gate only fires when verification is
218
- actually outstanding, so at a boundary where verify already ran (or was explicitly
219
- skipped, or auto-verify is on) it silently collapses to just the `/clear` →
220
- next-command steps.
221
-
222
- Slots: `{stage}` (a lowercase noun phrase), `{verify-command}`, `{next-command}`.
223
-
224
- <!-- BEGIN: standard-exit-block -->
225
- **This stage is done — walk the user through the Stage Exit Protocol** before moving on. The order is fixed, and step 2 is something only the user can do:
226
-
227
- 1. **Verify {stage} first — if it isn't already verified.** If verify already ran in this session — via the in-stage auto-verify on the authoring stages, or the interactive impl-verify offered above on the loop — or is already fresh on record, or the stage was explicitly skipped, say so and go straight to step 2. Only when `autoVerify` is off for this stage **and** verify is **missing or stale** do you present the **Standard Verify Gate**: verify **now, before clearing**, using `AskUserQuestion` with exactly these three options — but only when the host has a question mechanism **and** the clean-room path is available (the `Agent` tool plus a dispatchable `forge-verifier` subagent):
228
- - **Verify {stage} now** *(recommended)* — dispatch the clean-room `forge-verifier` subagent from this session in require-clean mode; the digest returns here so any fix decision keeps its context. One-time — it does **not** change config.
229
- - **Verify now + enable auto-verify going forward** — verify now **and** patch `"autoVerify": true` into `forge.config.json` in place (preserve formatting and every other key) so future stages verify automatically, no prompt. This complements the `forge-init` opt-in. **Do not auto-commit this config change** — treat it like `notes`: a user-facing edit the user commits on their own cadence, never folded into a stage's artifact commit.
230
- - **Skip for now** — go straight to `/clear` and the next command without verifying. Record this stage's verify status as `"skipped"` in pipeline state (mirroring the existing skip handling) **only** on an explicit skip — a skip does not go stale.
231
-
232
- **Host / clean-room fallback (not a user-selectable option):** if the question mechanism, the `Agent` tool, or the `forge-verifier` subagent is unavailable, do **not** run clean-room — degrade to printing `{verify-command}` for the user to run inline/manually (mirroring `autoInvokeNextStage`), and offer the auto-verify enable as plain text only if a config write is possible.
233
- 2. **Then `/clear`.** Recommended **unconditionally** at this boundary for a clean start — independent of how full the context window is. Every artifact is on disk, so the work survives the clear. **I can't `/clear` for you — you have to run it yourself.**
234
- 3. **Then run the next command** in the fresh session — or re-run `/skill:forge` to let the navigator resume from disk:
235
-
236
- ```
237
- {next-command}
238
- ```
239
- <!-- END: standard-exit-block -->
445
+ **A nested payload** (`terminalOwnedBy: "outer"`) carries `nextSteps: null` and
446
+ `sentinel: null`. It prints **no terminal block at all** — not even an empty one. Return
447
+ your structured result to the outer caller; that caller re-runs `stage-exit` after the
448
+ nested state transitions so its single final block reflects the terminal result.
240
449
 
241
450
  ---
242
451
 
243
- ## Warm-acceptable variant
452
+ ## Re-verify scope and convergence
453
+
454
+ A **re-verify** is any verification run whose served stage's verify entry is
455
+ `findings-applied` — a fix pass preceded it, and its job is to CONFIRM that pass, not to
456
+ re-open the artifact. These rules bind the dispatched `forge-verifier`, the skill that
457
+ synthesizes its digest (`skills/forge-verify/SKILL.md`), and the fix pass that requests
458
+ the re-verify (`skills/forge-fix/SKILL.md` Step 6):
459
+
460
+ - **Scope.** Confirm each finding of the prior report against that finding's own
461
+ acceptance evidence, and examine the fix's delta (the changed lines and what they
462
+ directly touch) for new blocking defects. A re-verify is NOT a fresh full-checklist
463
+ sweep: the full sweep already ran when the report was minted, and re-sweeping mints
464
+ arbitrary new findings against text the fix just wrote — the divergence loop this
465
+ section exists to prevent.
466
+ - **Convergence.** Only an unresolved finding from the prior report, or a new
467
+ **blocking** finding (`error` with behavioral, CLI-output, or decision-bearing
468
+ consequence, or `gap`) introduced by the fix delta itself, may make a re-verify close
469
+ as `reverify-findings`. Every other new observation — advisory-severity anywhere, or
470
+ anything outside the fix delta — is recorded in the report at most and never flips
471
+ the outcome.
472
+ - **Decision immunity.** A finding whose subject carries a recorded decision — a
473
+ `state-decision` entry, a recorded-decision comment in the artifact, or a declared
474
+ non-goal — is never filed, in a re-verify or a fresh sweep. Cite the decision
475
+ instead. Re-filing a decided question costs a round and reverses nothing.
476
+ In particular, a **meta-guard** (a test protecting other tests or prose) is judged
477
+ against its DECLARED protection set: guard-incompleteness against a declared
478
+ non-goal is never a finding — the space of what a guard does not cover is
479
+ unbounded, and enumerating it one round at a time is an arms race, not
480
+ verification (authoring norm: the testing-strategy archetype in
481
+ `skills/forge-3-specs/references/spec-archetypes.md`).
482
+ - **Escalation (the round ledger).** Rounds are counted from the served stage's
483
+ findings documents (`VERIFY-{mode}-{date}.md`, then `-round{N}` — the filename rule
484
+ in `skills/forge-verify/SKILL.md` Step 4), so the ledger is reconstructable from the
485
+ `.verification/` directory alone. On the SECOND consecutive `reverify-findings`
486
+ close for the same served stage, the loop has stopped converging: do NOT recommend
487
+ another fix pass. Present the compact findings digest and ask for explicit
488
+ disposition with exactly these options —
489
+ **Accept the residual findings and advance** *(recommended)*: record the acceptance
490
+ as a `state-decision` naming each accepted finding, then write the stage's verify
491
+ result as `passed` with the report attached (`--findings-file`/`--findings-count`);
492
+ the accepted findings become recorded decisions that decision immunity keeps from
493
+ ever being re-filed. **Run another fix pass**: available, never recommended at this
494
+ point. **Stop here**. The user may still choose to fix — the protocol just stops
495
+ steering into the loop it cannot show is converging. Under `manual` capability
496
+ (no question mechanism), print the digest and the three dispositions as text
497
+ BEFORE the terminal block — the user answers on their own cadence; the terminal
498
+ block still closes the stage mechanically.
244
499
 
245
- Stamp this only at the `forge-5-loop → forge-6-docs` boundary (the all-done result
246
- report). Here clearing is **optional**: the docs stage benefits from the still-warm
247
- context of what the loop actually did, and impl-verify is already offered interactively
248
- by the loop itself, so this block defers rather than re-presenting a gate.
249
-
250
- > **Note — no literal `/clear` here.** The warm block lives in `result-reporting.md`, a
251
- > skill-*own* reference that the adapter build copies **verbatim** (unlike skill bodies,
252
- > it is not host-term translated), so a literal `/clear` would reach non-Claude adapters
253
- > undegraded. The warm variant says "clearing is optional" anyway, so it is phrased
254
- > host-neutrally without the token on purpose — do not reintroduce `/clear` here. (The
255
- > standard block *does* use `/clear`; that is fine because every standard stamp site is a
256
- > skill **body**, where `scripts/build-adapters.py` degrades it.)
257
-
258
- <!-- BEGIN: warm-exit-block -->
259
- **The loop is complete — this is the one boundary where clearing before the next stage is optional.**
260
-
261
- 1. **Verify is already offered above.** Impl-verify is offered interactively right after this report (Step 5b for a standalone feature, Step 6.1 for an epic member) — run it there rather than as a second gate. It runs clean-room, so it needs no fresh session.
262
- 2. **Clearing is optional here — warm is fine.** `forge-6-docs` benefits from the still-warm context of what the loop actually did, so continuing in this same session is the easy default. A cold start also works — every artifact is on disk — but there is no need to force it.
263
- 3. **Then run the next command** — in this warm session, or a fresh one if you prefer:
500
+ ---
264
501
 
265
- ```
266
- {next-command}
267
- ```
268
- <!-- END: warm-exit-block -->
502
+ ## Retired blocks
503
+
504
+ The two bespoke terminal blocks this protocol used to carry — the **standard block** and
505
+ the **warm-acceptable variant**, the latter stamped only at the
506
+ `forge-5-loop → forge-6-docs` boundary — are **gone**. They were the last hand-written
507
+ advancing contract, and their final two stamp sites (`skills/forge-5-loop/SKILL.md`'s
508
+ step-6 epic handoff and `skills/forge-5-loop/references/result-reporting.md`'s all-done
509
+ report) now stamp the canonical scripted stamp instead.
510
+
511
+ Nothing may reintroduce them. A hand-written "walk the user through the Stage Exit
512
+ Protocol" block, a warm "clearing is optional" block, or any other bespoke next-command
513
+ list on a covered surface is a routing fork: the script already decides freshness, gate
514
+ form, host wording, and the next command from live state, and a second block can only
515
+ disagree with it. The canonical scripted stamp above is the **only** advancing contract
516
+ for all nine covered exits.