@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
@@ -0,0 +1,349 @@
1
+ # forge-5-loop — Post-Run Recovery Procedure
2
+
3
+ The named procedure that turns a needs-human / blocked loop stop into a resumable backlog
4
+ without losing the operator's decision. It runs **after** a loop run ends — entered
5
+ **unconditionally** from SKILL Step 4c on every run close, whatever the counts say (the
6
+ `needs_human` / `item_blocked` live-event handling in `runner-contract.md` collects
7
+ answers early for it, but is **not** the entry condition) — and it runs again as the
8
+ **re-entry point** on a fresh session (§3).
9
+ Its seven ordered steps: **enumerate → cluster → consolidated prompts →
10
+ record-at-collection → apply → prove → gate & exit**.
11
+
12
+ Notation: `{backlogDir}` is the resolved backlog directory (SKILL Step 2b);
13
+ `{stateDir}` is the effective-config `loopRunner.stateDir` (default `.rauf`); `$R` is the
14
+ plugin root the SKILL's bootstrap prelude resolves; runner commands are the substituted
15
+ `loopRunner.*Command` forms with the SKILL's token substitution (`{bin}` etc.).
16
+
17
+ ## 1. Scope and the failure rule
18
+
19
+ The procedure orchestrates scripted substrate; it never improvises state. Decisions live
20
+ in `{backlogDir}/{stateDir}/forge-decisions.json` — append-only, written **only** by the
21
+ `decision-record` / `decision-list` / `decision-apply` verbs of
22
+ `scripts/forge-session.py` (schema: `references/forge-decisions-schema.json`), never by
23
+ hand. Being under the git-ignored state dir, the record survives session end and context
24
+ clear but never dirties the working tree that §4 inspects.
25
+
26
+ **The failure rule (applies to every step).** Any scripted step that exits non-zero, and
27
+ any runner invocation that errors or returns unparseable output, is surfaced **verbatim**
28
+ and **STOPS** the procedure with a **failed recovery** report — never reported as
29
+ recorded/succeeded. A failed *apply* (step 5) is distinguishable from a
30
+ ran-but-nothing-moved *proof* failure (step 6) because the former never reaches step 6
31
+ (§6).
32
+
33
+ ## 2. The seven steps
34
+
35
+ ### Step 1 — Enumerate
36
+
37
+ - **Input:** `{backlogDir}`; the runner's authoritative item list.
38
+ - **CLI:**
39
+ ```
40
+ python3 "$R/scripts/forge-session.py" decision-list --backlog-dir {backlogDir} --unapplied --json
41
+ {bin} backlog list . --backlog {backlogDir} --json # the substituted listCommand
42
+ ```
43
+ The unapplied set is the **latest entry per `itemId` with `appliedAt == null`** —
44
+ deferrals included, applied items excluded.
45
+ - **Decision point:** if the unapplied set is **empty** and no item is
46
+ `blocked`/`needsHuman`, there is nothing to decide or apply: **skip steps 2–6 and go
47
+ straight to step 7 — never exit around it.** Step 7's §4 tree reconciliation still
48
+ runs (it is what catches work stranded without any signal), and its `resolved` gate
49
+ does not apply — **an empty affected set never selects `resolved`**; the SKILL Step 7
50
+ ladder falls through to its count-based rungs. Combined with the clean-tree silence
51
+ of §4.1, this keeps a happy-path run free of any new prompt; the only new happy-path
52
+ output is the Step 2a depth line.
53
+ - **Output:** the unapplied-decision set (each entry's `itemId`, `question`,
54
+ `answer|null`, `deferred`, `clusterId?`), and the live blocked/needs-human item set.
55
+ - **Error:** a `decision-list` exit 2 (unknown dir, unparseable record) stops the
56
+ procedure. A failed `listCommand` read stops it as a failed recovery.
57
+
58
+ ### Step 2 — Cluster
59
+
60
+ - **Input:** the blocked/needs-human items from step 1, each carrying its
61
+ `blockedReason` (where the runner lands the `RAUF_NEEDS_HUMAN:<reason>` text).
62
+ - **CLI:**
63
+ ```
64
+ python3 "$R/scripts/forge-session.py" backlog-topology --items-stdin --cluster --json < items.json
65
+ ```
66
+ fed the **same** `listCommand` JSON already obtained (single data source — never a
67
+ `backlog.json` path). Returns `clusters[]`: each with `memberIds`, `memberReasons`,
68
+ `sharedTokens`, and the **union** of members' gated subtrees (`gatedIds` +
69
+ `gatedCount`).
70
+ - **Decision point:** you **may merge or refine** candidate clusters by judgment —
71
+ under-clustering is the deliberately-chosen failure direction of the scripted helper,
72
+ so its clusters are a floor, not a ceiling. You have no scripted *split* authority.
73
+ - **Output:** the final cluster set (scripted candidates ± your merges), each with its
74
+ member ids and blast-radius numbers.
75
+ - **Error:** a `backlog-topology` exit 2 stops the procedure.
76
+
77
+ ### Step 3 — Consolidated prompts
78
+
79
+ - **Input:** the final cluster set from step 2.
80
+ - **Mechanism:** `AskUserQuestion` (never inline prose).
81
+ - For any cluster of **two or more** items: emit **exactly one** consolidated question
82
+ that **names every affected item id** and states the **full gated subtree** the
83
+ cluster gates. Frame it by **blast radius** — e.g. *"This one decision gates 13 of
84
+ 16 backlog items (items 2, 3, …). Answer it once."* — never one prompt per member.
85
+ - Singleton clusters prompt per item (today's per-item shape).
86
+ - **Security:** prompts **MUST NOT solicit secrets**. Ask for the *decision* (which
87
+ path, which policy), never a credential/token/key value. The decision record has no
88
+ credential-shaped field and is treated as repo-visible content.
89
+ - **Decision point:** the operator may **answer**, **defer** the decision, or request
90
+ **cancel the run early** — all three branches proceed to step 4 (nothing is acted on
91
+ before it is recorded).
92
+ - **Output:** per cluster/item, one of {answer text, deferral, cancel-early}.
93
+ - **Citation:** the blast-radius framing is derived from `backlog-topology --cluster`
94
+ gated-subtree output (member ids + counts) — the prompt cites that source; a
95
+ "gates N/M" claim the topology output contradicts is a defect.
96
+
97
+ ### Step 4 — Record at collection
98
+
99
+ - **Input:** every branch outcome from step 3.
100
+ - **CLI (one call per decision, BEFORE anything is applied):**
101
+ ```
102
+ # answered singleton
103
+ python3 "$R/scripts/forge-session.py" decision-record --backlog-dir {backlogDir} \
104
+ --item ID --question "Q" --answer "A"
105
+ # deferred, or cancel-early (both record a deferral: no --answer)
106
+ python3 "$R/scripts/forge-session.py" decision-record --backlog-dir {backlogDir} \
107
+ --item ID --question "Q" --deferred
108
+ # consolidated answer: one entry per affected item, shared clusterId
109
+ python3 "$R/scripts/forge-session.py" decision-record --backlog-dir {backlogDir} \
110
+ --item ID1 --item ID2 --item ID3 --question "Q" --answer "A" --cluster c1
111
+ ```
112
+ (`--actor` defaults to `forge-5-loop@<host>` — a machine label, never user identity.)
113
+ - **Decision point:** a decision is recorded on **every** branch — answered, deferred,
114
+ **and** cancel-early — and it is recorded **before** step 5 acts on anything. A
115
+ cancel-early is recorded as a **deferral** (`answer: null`, `deferred: true`,
116
+ `question` carrying the original needs-human text) — there is no third entry form. A
117
+ recorded-but-unapplied entry (`appliedAt == null`) is exactly what step 1 re-surfaces
118
+ on the next launch (§3).
119
+ - **Consolidated:** one entry per affected item, all sharing one `clusterId` (minted
120
+ `c` + lowest member id). Items stay **independently re-decidable**: a later per-item
121
+ entry supersedes the cluster entry for that item only.
122
+ - **Output:** durable append-only entries in `forge-decisions.json`; the write is
123
+ atomic.
124
+ - **Error:** any `decision-record` exit 2 (both/neither of `--answer`/`--deferred`,
125
+ unknown dir, failed atomic write) is surfaced verbatim and stops the procedure. The
126
+ answer is **not** applied if it was not recorded.
127
+
128
+ ### Step 5 — Apply
129
+
130
+ - **Version probe (once, at the start of this step):** run the substituted
131
+ `loopRunner.versionCommand` (default `{bin} version --json`), parse
132
+ `{ "version": "<semver>" }`, and numerically semver-compare it against
133
+ `RECOVERY_MIN_RUNNER_VERSION` (a `scripts/forge-session.py` module constant, `0.14.0`
134
+ — the capability threshold for `{bin} backlog answer`; **not**
135
+ `loopRunner.minRunnerVersion`, which stays the launch floor). A probe miss
136
+ (missing/old/unparseable version) is **never** a hard failure — it selects the
137
+ degraded path and is reported with `loopRunner.installHint`.
138
+ - **Apply per item** (full dispatch table in §5):
139
+ - needs-human item, runner **≥** threshold →
140
+ `{bin} backlog answer . {id} "{answer}" --backlog {backlogDir} --json`
141
+ (the answer text is threaded into the next iteration's prompt).
142
+ - needs-human item, runner **<** threshold → **degraded path:**
143
+ `{bin} backlog unblock . {id} --backlog {backlogDir} --json` — the item is genuinely
144
+ unblocked and the answer stays durable in `forge-decisions.json`, but the recovery
145
+ report **must state explicitly** that the answer was **not** injected into the next
146
+ iteration's prompt, with the `installHint` upgrade hint attached.
147
+ - plain (non-needs-human) blocked item → `{bin} backlog unblock` at **every** runner
148
+ version.
149
+ - **Stamp:** after each runner apply **succeeds**, run
150
+ ```
151
+ python3 "$R/scripts/forge-session.py" decision-apply --backlog-dir {backlogDir} --item ID
152
+ ```
153
+ which stamps `appliedAt`/`appliedBy` on the item's latest entry. `decision-apply` is
154
+ called **only after** the runner apply returned success — a stamped record means the
155
+ runner actually accepted the change.
156
+ - **Error:** a runner apply that **errors** (non-zero exit — item missing, not
157
+ `blocked`, or any failure) is a **failed apply**: surface it verbatim, do **not** call
158
+ `decision-apply`, stop the procedure, report failed recovery. This is distinct from a
159
+ version-probe miss (which routes to the degraded path, not a failure) and from step
160
+ 6's ran-but-nothing-moved failure (§6).
161
+
162
+ ### Step 6 — Prove
163
+
164
+ - **Input:** the affected item set that step 5 applied.
165
+ - **CLI:** re-read per-item state via the substituted `loopRunner.listCommand`
166
+ (`{bin} backlog list . --backlog {backlogDir} --json`) and test **each** affected
167
+ item: `status != "blocked"` — which, per the runner's derivation
168
+ (needs-human ⇔ `status=="blocked" && needsHuman==true`), also removes it from the
169
+ needs-human count, so the single test covers both flags. Aggregate `backlogSummary`
170
+ counts are **never** the test. An affected item **missing** from the re-read counts
171
+ as a non-mover.
172
+ - **Decision point:** **all** affected items moved → proceed to step 7. **Any**
173
+ non-mover — including a partial move where some items moved and others did not — is a
174
+ **failed recovery**: report it, **naming the movers and the non-movers** from their
175
+ item `status` fields.
176
+ - **Output:** either "all moved → continue" or a failed-recovery report.
177
+ - **Citation:** the movers/non-movers are named from the per-item `listCommand` re-read
178
+ (`status` fields), never from aggregate counts — a report that contradicts the
179
+ per-item read is a defect.
180
+
181
+ ### Step 7 — Gate & exit
182
+
183
+ - **Tree reconciliation first.** Before any outcome is selected, run the **Post-Run
184
+ Tree Reconciliation** section (§4). It runs on every recovery pass — including passes
185
+ with no needs-human items — and is silent on a clean tree.
186
+ - **Evaluate the `resolved` gate — all three must hold:**
187
+ 1. `decision-list --unapplied` is **empty for the affected items**. The verb returns
188
+ the **global** latest-unapplied-per-item set, so **intersect** that payload's
189
+ entries (each carries `itemId`) with this session's affected-item set and test
190
+ only that intersection for emptiness — an unrelated item's stray deferral must not
191
+ suppress a legitimate `resolved`.
192
+ 2. `git status --porcelain` is **clean** (git-ignored `{stateDir}` artifacts are
193
+ invisible to porcelain — the exclusion holds by construction).
194
+ 3. the per-item re-read (step 6) shows **every** affected item left
195
+ `blocked`/`needsHuman`.
196
+ - **Select the outcome:** on all-three-pass, select `resolved` — the first rung of the
197
+ ladder in `result-reporting.md`, so a resolved stop never re-triggers the needs-human
198
+ branch its own recovery just cleared. **Any one gate failing falls the ladder
199
+ through** to `needs-human` / `blocked` / `deferred` / `partial` / `complete` exactly
200
+ as today. `resolved` routes **resume** — its NEXT-STEPS block fences
201
+ `/skill:forge-5-loop {feature}`, never the navigator.
202
+ - **CLI:** the close runs through the Scripted Stage Exit (SKILL Step 7):
203
+ `stage-exit … --outcome resolved …`. `stage-exit` does **not** re-verify the gate
204
+ server-side (it has no runner access) — enforcement is procedural: this step.
205
+ - **Citation:** the `resolved` outcome text cites the three gate evaluations
206
+ (`decision-list --unapplied` empty, porcelain empty, per-item re-read all-moved).
207
+ Claiming `resolved` without those preconditions is a reportable defect.
208
+
209
+ ## 3. Fresh-session re-entry
210
+
211
+ The procedure is the **re-entry point** on a fresh session / next launch — this is what
212
+ makes a decision survive session end and context clear.
213
+
214
+ On a new session, **step 1** enumerates every entry with `appliedAt == null` from a
215
+ *previous* session — answered-but-not-yet-applied decisions, deferrals, and cancel-early
216
+ deferrals alike. Those entries are re-surfaced:
217
+
218
+ - An entry that already carries an **answer** (`answer != null`, `deferred == false`,
219
+ `appliedAt == null`) **skips step 3's prompt** for that item — the operator already
220
+ decided; the procedure proceeds straight to step 5 (apply) and step 6 (prove). The
221
+ answer collected last session is applied this session without re-asking.
222
+ - A **deferral** (`deferred == true`) re-surfaces through step 3 as an open decision —
223
+ the operator is asked again, and their new answer appends a **new** entry
224
+ (append-only); the deferral's audit fields are never destroyed.
225
+
226
+ Because entries are durable and untracked, a session boundary, crash, or context clear
227
+ between "operator answered" and "answer applied" never costs the decision — step 1 of
228
+ the next launch finds it.
229
+
230
+ ## 4. Post-Run Tree Reconciliation
231
+
232
+ Invoked from step 7 after the run ends and **before** any outcome is selected. It runs
233
+ on **every** recovery pass — including passes with no needs-human items, which step 1
234
+ routes here directly, and SKILL Step 4c enters the procedure on every run close —
235
+ because it is the "tree" half of recovery. Four sub-steps.
236
+
237
+ ### 4.1 Detect
238
+
239
+ - **CLI:** `git status --porcelain`.
240
+ - **Clean tree → SILENT.** Empty output ⇒ no prompt, no output, no operator decision.
241
+ The decision record and all runner state under `{stateDir}` are git-ignored and
242
+ therefore never appear in porcelain output — decision writes never dirty the tree
243
+ this step inspects.
244
+ - **Dirty tree → proceed to 4.2.**
245
+ - **Error:** a `git status` failure (not a git repo, git error) is surfaced verbatim;
246
+ reconciliation is skipped (there is nothing git-native to reconcile), the rest of the
247
+ procedure continues.
248
+
249
+ ### 4.2 Attribute (best-effort, runner-native)
250
+
251
+ Best-effort attribution of dirty paths to the backlog item(s) that produced them, from
252
+ runner-native evidence — reliable per-item provenance is **not** a prerequisite.
253
+
254
+ - **Read `{backlogDir}/{stateDir}/state.json`** (the runner's loop state):
255
+ `baseCommitHash` (the HEAD captured at run start — the baseline for
256
+ `git log {baseCommitHash}..HEAD`), `completedItems` / `blockedItems` (item ids that
257
+ finished / blocked), `currentItem` (the item in flight when the run stopped — a
258
+ strong candidate for uncommitted changes), `startedAt` and
259
+ `iteration`/`maxIterations` (run identity + budget).
260
+ - **Read `{backlogDir}/{stateDir}/events.ndjson`** — one JSON object per line; parse
261
+ line-by-line (there is **no** runner CLI for events; the file is read directly). The
262
+ per-iteration `item_selected`, `llm_spawned`, and `llm_exited` records — each
263
+ carrying an `itemId` and a `timestamp` — name which items ran during the window and
264
+ in what order.
265
+ - **Map dirty paths → candidate items:** the `currentItem` and the most recent
266
+ `item_selected`/`llm_spawned` without a matching clean `llm_exited` are the items "in
267
+ flight when the run died"; `git log {baseCommitHash}..HEAD` names what was already
268
+ committed for which item (the runner commits `[rauf] <id>: <title>`). Present the
269
+ mapping as **CANDIDATES, never asserted**.
270
+ - **Degradation (detection never aborts):** if `state.json` or `events.ndjson` is
271
+ missing, unreadable, or unparseable, **degrade** to the fully-unattributed path —
272
+ everything goes into 4.3's single consolidated decision. Detection (4.1) is never
273
+ aborted by an evidence-parse failure.
274
+ - **Citation:** the presentation cites `git status --porcelain` paths +
275
+ `{stateDir}/state.json` / `events.ndjson` run evidence, with every attribution
276
+ explicitly labelled a **candidate**.
277
+
278
+ ### 4.3 Decide
279
+
280
+ - **Mechanism:** `AskUserQuestion` (never inline prose).
281
+ - **One question per attributed item-group:** for each candidate item-group from 4.2,
282
+ offer **commit-for-that-item** / **stash** / **discard**.
283
+ - **Unattributable changes → ONE consolidated decision:** everything that could not
284
+ be attributed is presented as a single grouped question, not dropped.
285
+ - **Discard guard:** **discard is NEVER the default** and requires its **own explicit
286
+ confirmation** — a second, dedicated question via `AskUserQuestion` confirming the specific paths
287
+ to be discarded before any `git checkout`/`git restore`/`git clean` runs. No path is
288
+ discarded on a single click.
289
+ - **Output:** per group, an executed reconciliation (commit / stash / confirmed
290
+ discard) or a deferral the operator can revisit.
291
+
292
+ ### 4.4 Launch blocker
293
+
294
+ The next launch's `### 1g. Stranded-Work Pre-flight` (SKILL Step 1) STOPS on a dirty
295
+ tree when a prior run's `{backlogDir}/{stateDir}/state.json` exists, names that run
296
+ (its `startedAt`, `currentItem`, `blockedItems`), and points at this section to
297
+ commit / stash / discard the stranded work before relaunch. The runner's own
298
+ uncommitted-changes launch refusal remains the backstop for a dirty tree with no
299
+ prior-run state.
300
+
301
+ ## 5. Apply-mechanism dispatch (version gate & the degraded path)
302
+
303
+ | Runner version | Item kind | Apply mechanism | What the report says |
304
+ |---|---|---|---|
305
+ | `≥ RECOVERY_MIN_RUNNER_VERSION` | needs-human (has an answer) | `{bin} backlog answer . {id} "{answer}" --backlog {backlogDir} --json` | Answer applied and threaded into the next iteration's prompt. |
306
+ | `≥ RECOVERY_MIN_RUNNER_VERSION` | plain blocked | `{bin} backlog unblock . {id} --backlog {backlogDir} --json` | Item unblocked. |
307
+ | `< RECOVERY_MIN_RUNNER_VERSION` (or probe miss) | needs-human | **DEGRADE:** `{bin} backlog unblock . {id} --backlog {backlogDir} --json` | Item unblocked; **answer was NOT injected into the next prompt** (durable in `forge-decisions.json`); `{installHint}` — upgrade to a runner that ships `backlog answer` to thread it. |
308
+ | any version (incl. probe miss) | plain blocked | `{bin} backlog unblock . {id} --backlog {backlogDir} --json` | Item unblocked. |
309
+
310
+ Key properties:
311
+
312
+ - **Plain blocked items always use `unblock`, at every version** — they carry no answer
313
+ to thread. The version gate only ever changes the needs-human path.
314
+ - **The degraded needs-human path genuinely unblocks** (the runner clears
315
+ `status`/`blockedReason`/`needsHuman`/`deferred`), so recovery works across the whole
316
+ supported runner floor. The only capability lost below the threshold is
317
+ prompt-threading — the answer remains durable in the decision record and re-surfaces
318
+ via `decision-list --unapplied` if re-decided.
319
+ - **The report is honest either way:** the degraded path states explicitly that the
320
+ answer was not threaded, with the upgrade hint.
321
+
322
+ ## 6. Failure taxonomy
323
+
324
+ | Failure | When it occurs | Reaches the step-6 per-item test? | Report |
325
+ |---|---|---|---|
326
+ | **Failed apply** | `{bin} backlog answer` / `unblock` exits non-zero (corrupt backlog, I/O error, not-blocked/not-found refusal); or the post-apply re-read is unparseable | **No** — stops *before* the test | Verbatim runner error + which item; **failed recovery**; procedure stops; never claimed succeeded |
327
+ | **Ran-but-nothing-moved** | Every apply exited 0, but the step-6 per-item test finds a non-mover | **Yes** — *is* the test failing | Movers/non-movers named from `status` fields; **failed recovery** |
328
+ | **Version-probe miss** | `versionCommand` missing/unparseable, or version `< RECOVERY_MIN_RUNNER_VERSION` | N/A — selects the degraded path (§5) | Degraded path proceeds; not-threaded caveat + `installHint`; **not** a failed recovery |
329
+
330
+ Rules: never report recorded/succeeded past a failed step; a failed apply stops before
331
+ the per-item test, so a runner that errored is never conflated with a runner that ran
332
+ cleanly but moved nothing; `decision-apply` is not called for a failed item — the record
333
+ stays unapplied and re-surfaces next launch; a probe miss degrades, it never fails
334
+ recovery.
335
+
336
+ ## 7. Report citations (REQ-OBS-01)
337
+
338
+ Every report surface this procedure produces names the authoritative source it derived
339
+ its claims from; a claim that source contradicts is a reportable defect. Each report
340
+ surface names the authoritative source it derives its claims from:
341
+
342
+ | Report surface | Authoritative citation basis |
343
+ |---|---|
344
+ | Pending / starvation template | `backlogSummary` counts + `backlog-topology` output over `listCommand` JSON; iteration counters from `state.json` (`iteration`/`maxIterations`) |
345
+ | Failed-recovery report (§2 step 6) | The per-item `listCommand` re-read — movers/non-movers named from item `status`, never aggregate counts |
346
+ | `resolved` outcome text | The three gate evaluations: `decision-list --unapplied` (empty), `git status --porcelain` (empty), per-item re-read (all affected left `blocked`) |
347
+ | Consolidated blast-radius prompt (§2 step 3) | `backlog-topology --cluster` gated-subtree output (member ids + counts) |
348
+ | Tree-reconciliation presentation (§4) | `git status --porcelain` paths + `state.json`/`events.ndjson` run evidence, attributions explicitly presented as **candidates** |
349
+ | Step 2a depth line | The same `backlog-topology` output (`maxChainDepth`) |
@@ -1,32 +1,31 @@
1
- # forge-5-loop — Step 4b Result-Report Templates
1
+ # forge-5-loop — Result Reports and Loop-Outcome Selection
2
2
 
3
- These are the five verbatim result-report output templates for **Step 4b** of
4
- `forge-5-loop/SKILL.md`. Pick **every** branch that applies (a run can be both
5
- blocked and needs-human) and render its report.
3
+ This file carries two things for `forge-5-loop/SKILL.md`:
6
4
 
7
- **All items done.** Print the completion summary, then close with the **warm-acceptable
8
- variant** of the Stage Exit Protocol (single-sourced in
9
- `references/stage-exit-protocol.md`) — the `forge-5-loop → forge-6-docs` boundary is the
10
- one place where clearing before the next stage is optional:
11
- ```
12
- Loop completed for {feature}. All {N} items implemented successfully.
13
- ```
5
+ 1. the verbatim **result-report templates** for **Step 4b** — factual counts only; and
6
+ 2. the deterministic **`LoopOutcome` ladder** for **Step 7**, which picks the single
7
+ value the scripted stage exit is invoked with.
14
8
 
15
- **The loop is complete — this is the one boundary where clearing before the next stage is optional.**
9
+ The reports describe what the run did. They never carry a next command, a retry
10
+ command, or a "continue to docs" suggestion: routing is the scripted stage exit's
11
+ job, and a loop run emits exactly **one** `stage-exit` invocation and **one**
12
+ terminal block.
16
13
 
17
- 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.
18
- 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.
19
- 3. **Then run the next command** — in this warm session, or a fresh one if you prefer:
14
+ ## Result reports (Step 4b)
20
15
 
21
- ```
22
- /skill:forge-6-docs {feature}
23
- ```
16
+ Pick **every** branch that applies — a run can be both blocked and needs-human — and
17
+ render its report. These are descriptive; none of them ends the turn.
18
+
19
+ **All items done.**
20
+ ```
21
+ Loop completed for {feature}. All {N} items implemented successfully.
22
+ ```
24
23
 
25
24
  **Runner review pass.** A review flag (e.g. rauf's `--review`) makes the runner run
26
25
  a post-loop review that **auto-creates and implements fix items** rather than handing
27
26
  findings to the user — distinct from `forge-verify impl` (a clean-context audit that
28
27
  writes a findings doc). When Step 4a captured a `review_completed` event, add a line
29
- **above** "Next steps" so the pass's effect is visible and not mistaken for "nothing
28
+ below the counts so the pass's effect is visible and not mistaken for "nothing
30
29
  happened":
31
30
  ```
32
31
  Runner review pass: {itemsCreated} fix item(s) created and implemented.
@@ -43,10 +42,6 @@ Loop completed for {feature}.
43
42
 
44
43
  These items asked a question the loop couldn't answer:
45
44
  - {id}: {title} — {reason}
46
-
47
- Resolve, then retry:
48
- - Answer the question(s) above, then re-run `/skill:forge-5-loop {feature}`
49
- (add --retry-blocked to pick the set-aside items back up).
50
45
  ```
51
46
 
52
47
  **Some items blocked:**
@@ -59,10 +54,7 @@ Blocked items:
59
54
  - {id}: {title}
60
55
  - {id}: {title}
61
56
 
62
- Options:
63
- - Re-run with --retry-blocked to retry blocked items
64
- - Review blocked items manually: {bin} backlog show . {id} --backlog {backlogDir}
65
- - Continue to docs if blocking items are non-critical
57
+ Inspect one with: {bin} backlog show . {id} --backlog {backlogDir}
66
58
  ```
67
59
 
68
60
  **Some items deferred (runner gave up after retries — "false blocks"):**
@@ -70,16 +62,92 @@ Options:
70
62
  Loop completed for {feature}.
71
63
  Completed: {done}/{total}
72
64
  Deferred: {deferred} items (no signal after retries — likely just need another pass)
73
-
74
- Re-run `/skill:forge-5-loop {feature}` to retry deferred items.
75
65
  ```
76
66
 
77
- **Some items still pending (iteration limit reached):**
67
+ **Some items still pending** — the parenthetical cause is chosen, never hardcoded:
78
68
  ```
79
69
  Loop completed for {feature}.
80
70
  Completed: {done}/{total}
81
- Pending: {pending} items (iteration limit reached)
71
+ Pending: {pending} items ({cause})
82
72
  Blocked: {blocked} items
83
-
84
- Re-run `/skill:forge-5-loop {feature}` to continue with remaining items.
85
73
  ```
74
+ Render `{cause}` as "iteration limit reached" **only** when `iteration == maxIterations`
75
+ AND `selectable > 0` — cite the `iteration`/`maxIterations` counters from
76
+ `{loopRunner.stateDir}/state.json` and `selectable` from `backlog-topology --items-stdin
77
+ --json` run over the same authoritative item JSON as the counts above. Otherwise —
78
+ `selectable == 0` with items still pending while `iteration < maxIterations` — the
79
+ iteration limit was NOT the constraint: drop the parenthetical and render this
80
+ dependency-starvation report instead, naming each blocking root and its gated-subtree
81
+ size from `backlog-topology`'s `starvation.blockingRoots[].{id, gatedCount}` and
82
+ `itemCount`, then close the stage with `--cause dependency-starvation` in Step 7:
83
+ ```
84
+ Loop stopped for {feature} with {pending} item(s) still pending, but the iteration
85
+ limit was NOT the constraint ({iteration}/{maxIterations} iterations used).
86
+ No pending item was selectable — every one is gated behind unblocked roots:
87
+ - {rootId}: {rootTitle} — gates {gatedCount}/{itemCount} items
88
+ Unblock these roots (their subtrees free up on the next run), then run the loop again.
89
+ ```
90
+ Both branches cite their authoritative source: the iteration-limit branch the
91
+ `state.json` iteration counters, the starvation branch the backlog summary counts plus
92
+ the `backlog-topology` output (`selectable`, `blockingRoots`, `gatedCount`,
93
+ `itemCount`). A cause any of those counters contradicts — e.g. "iteration limit
94
+ reached" while `iteration < maxIterations` — is a reportable defect.
95
+
96
+ ## Selecting the one `LoopOutcome` (Step 7)
97
+
98
+ After Step 5's `state-complete`, select exactly **one** `LoopOutcome` from Step 4a's
99
+ authoritative final counts. Walk this ladder in order and stop at the first match:
100
+
101
+ 1. **`resolved`** — the Post-Run Recovery Procedure
102
+ (`references/recovery-procedure.md`) ran this session with a **non-empty**
103
+ affected-item set and its gate passed: every affected needs-human item has an
104
+ applied decision record, the working tree is clean, and each affected item left
105
+ `blocked`/`needsHuman` per the per-item re-read. This outranks `needs-human` so a
106
+ stop the recovery just cleared is not re-reported as still needing a human. (Step
107
+ 4c runs the procedure on every close, so an empty affected set is the common case —
108
+ it never selects `resolved`; fall through.)
109
+ 2. **`needs-human`** — otherwise, `needsHuman > 0`. This wins even when blocked
110
+ items also exist: a decision only a human can make outranks work that merely
111
+ could not proceed.
112
+ 3. **`blocked`** — otherwise, genuine `blocked > 0`.
113
+ 4. **`deferred`** — otherwise, runner-deferred items exist (the "false blocks" the
114
+ runner gave up on after retries).
115
+ 5. **`partial`** — otherwise, `pending`/`in_progress` items remain because the
116
+ iteration limit was reached.
117
+ 6. **`complete`** — otherwise, and **only** when every item is `done`.
118
+
119
+ This is a priority order, not a set. A run reporting both a needs-human and a blocked
120
+ count renders both reports above and still exits `needs-human`.
121
+
122
+ **The runner's process exit code is not the outcome.** A loop runner that exits 0 has
123
+ reported only that its process finished; the final backlog state decides. A clean
124
+ exit 0 that still leaves pending items is `partial`, never `complete` — and
125
+ `complete` is legitimate only when the counts show every item `done`.
126
+
127
+ **Retrying the non-complete outcomes.** `partial`, `deferred`, and `resolved` fence
128
+ the loop resume; `blocked` and `needs-human` fence the navigator. Whichever you land on, the
129
+ runner's own retry flags still apply to the next run — e.g. rauf's `--retry-blocked`
130
+ picks the set-aside blocked and deferred items back up at Step 2d. Mention that as
131
+ plain prose in the report if it helps; never as a second command block.
132
+
133
+ ## Operational failure before the counts are known
134
+
135
+ If the run cannot produce authoritative counts at all — the status/list command fails,
136
+ its output does not parse, the state directory is gone, or the process died in a way
137
+ that leaves the backlog unreadable — **do not pick an outcome and do not close the
138
+ stage.** There is nothing to select from, and guessing one would record a pipeline
139
+ position that never happened.
140
+
141
+ Instead: say plainly what failed, show the command's own output, and name the
142
+ recovery (re-run the status command, or re-run the loop once the runner is healthy).
143
+ Emit no `stage-exit` invocation and no terminal block. The stage stays `in-progress`
144
+ on disk, which is exactly the state the navigator can resume from.
145
+
146
+ ## Closing the stage
147
+
148
+ Pass the selected value to the single scripted stage exit in **Step 7** of
149
+ `forge-5-loop/SKILL.md` as `--outcome {LoopOutcome}`, and print its NEXT-STEPS block
150
+ verbatim as the absolute last output. Append nothing after it — no summary, no retry
151
+ line, no docs suggestion. For a completed epic member, the exit consumes the epic's
152
+ live status itself, so announce the rollup **before** invoking it and add no
153
+ hand-authored handoff of your own afterwards.
@@ -19,8 +19,10 @@ item.model > --model / options > project default > provider default
19
19
 
20
20
  So a backlog item's own `model` field overrides a `--model` flag passed to the
21
21
  run, which overrides the project's configured default, which overrides the
22
- runner/provider default. Pass `--model <model>` (optional flag below) to override
23
- the project default for the whole run.
22
+ runner/provider default. Pass `--model <model>` to override the project default for
23
+ the whole run; it is catalogued with the run's other optional flags under
24
+ `## Optional flags catalog (Step 2d, rauf)` in `references/agent-selection.md` —
25
+ read that file only when Step 2d's `loopRunner.agentArgument` capability gate is on.
24
26
 
25
27
  ## Run mode (Step 2d, rauf)
26
28
 
@@ -29,7 +31,7 @@ pass after all iterations complete (an extra agent session that re-examines the
29
31
  finished work and can file follow-up backlog items). feature-forge treats **running
30
32
  with review as the recommended default** — a review pass is cheap relative to the
31
33
  loop it audits, and catches gaps before the pipeline moves on to docs. So Step 2d
32
- adds a **"Run mode"** question to the confirmation's `AskUserQuestion` surface with a
34
+ adds a **"Run mode"** question, via `AskUserQuestion`, to the confirmation surface with a
33
35
  **fixed, non-improvised option order** (determinism is the point — the option set
34
36
  must not vary run-to-run):
35
37
 
@@ -45,6 +47,19 @@ Run mode:
45
47
  review pass and also unblocks/retries the previously blocked items.
46
48
  ```
47
49
 
50
+ **`loopRunner.reviewMode` gate (`"prompt"` default | `"always"` | `"never"`).**
51
+ The Run-mode question above is presented only when the effective
52
+ `loopRunner.reviewMode` is `"prompt"` — the default, byte-identical to today.
53
+ `"always"` **skips the question** and appends `--review` unconditionally; the
54
+ confirmation's rendered command line still shows `--review`, so the choice is
55
+ never hidden. `"never"` **skips the question** and launches the bare rendered
56
+ command. Under `"always"`/`"never"`, when — and only when — the Step 2a tally has
57
+ `blocked > 0`, present a **narrower situational question** in the question's
58
+ place offering only the retry-blocked choice (on yes, additionally append
59
+ `--retry-blocked`; the `--review` decision is already fixed by the mode and is
60
+ **not** re-asked); with no blocked items, the Run-mode surface asks nothing. An
61
+ unrecognized value behaves as `"prompt"`.
62
+
48
63
  Notes:
49
64
 
50
65
  - **Option 1 is the default** and the confirmation's rendered command line shows
@@ -101,7 +116,7 @@ a descriptor on the file the runner immediately rotates away, so the redirected
101
116
  rotation timing. So:
102
117
 
103
118
  - **Self-persisting runner (default — rauf writes `{stateDir}/events.ndjson`):**
104
- launch the **plain `runCommand`** with `run_in_background: true` and **no
119
+ launch the **plain `runCommand`** with the host's background-execution mechanism and **no
105
120
  redirect** — the Bash tool already captures the run's stdout/stderr to the
106
121
  background task's output file (use it to diagnose a launch refusal). Supervise by
107
122
  arming the Monitor on the runner's **native** `{backlogDir}/{stateDir}/events.ndjson`
@@ -127,8 +142,8 @@ backlog size).
127
142
 
128
143
  ## Arm a Monitor on the event stream (Step 3d)
129
144
 
130
- Arm the **`Monitor` tool** on the structured event stream so events flow back into
131
- this session as they happen. Use **`persistent: true`** — runs can exceed `Monitor`'s
145
+ Arm the **host's monitoring mechanism** on the structured event stream so events flow back into
146
+ this session as they happen. Use **`persistent: true`** — runs can exceed the host's monitoring mechanism's
132
147
  maximum `timeout_ms` (1 hour), and a bounded timeout would silently stop watching a
133
148
  still-running loop.
134
149
 
@@ -177,12 +192,17 @@ high and the noise low:
177
192
  immediately** and send a **`PushNotification`** (an hours-long run means the user has
178
193
  likely stepped away). **Important — the loop is NOT paused:** the runner has set that
179
194
  item aside and kept working other items. So report *what* needs a human and *which*
180
- item, then either (a) collect the user's answer via `AskUserQuestion` to **stage a
181
- post-run retry**, or (b) offer to **cancel the run early** if the answer changes the
182
- whole plan. Do not tell the user the loop is waiting on their reply — it isn't.
195
+ item, then either (a) collect the user's answer via `AskUserQuestion` and **record it via
196
+ `decision-record` now** — SKILL Step 4c's unconditional **Post-Run Recovery Procedure**
197
+ pass (`references/recovery-procedure.md`) applies it after the run ends — or (b) offer
198
+ to **cancel the run early** (also recorded via `decision-record` — a deferral) if the
199
+ answer changes the whole plan. Do not tell the user the loop is waiting on their reply
200
+ — it isn't.
183
201
  - **`item_blocked`** → surface the blocked item + reason now (visibility) and
184
202
  accumulate for the final summary. Use `{rendered statusJsonCommand}` to distinguish a
185
203
  genuine `blocked` from a runner-`deferred` "false block" (`backlogSummary.deferred`).
204
+ No action is needed now: Step 4c's recovery pass offers the unblock after the run
205
+ ends — a blocked-only run (no `needs_human` event) still enters it.
186
206
  - **`loop_error`** → a real failure (this is also what a circuit-breaker halt — too many
187
207
  consecutive infra failures — emits). Surface now and `PushNotification`. Offer
188
208
  inspection / `--force` / re-run as appropriate.