@garygentry/feature-forge 0.3.5 → 0.3.7

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 (778) hide show
  1. package/README.md +1 -1
  2. package/adapters/GENERATION-REPORT.md +20 -0
  3. package/adapters/claude/.claude-plugin/plugin.json +16 -0
  4. package/adapters/claude/.feature-forge-bundle.json +1 -1
  5. package/adapters/claude/agents/forge-verifier.md +16 -5
  6. package/adapters/claude/references/forge-config-schema.json +5 -5
  7. package/adapters/claude/references/portable-root.md +20 -16
  8. package/adapters/claude/references/preflight-and-self-heal.md +183 -0
  9. package/adapters/claude/references/process-overview.md +1 -1
  10. package/adapters/claude/references/ralph-loop-contract.md +12 -8
  11. package/adapters/claude/references/select-outcome.md +138 -0
  12. package/adapters/claude/references/shared-conventions.md +176 -23
  13. package/adapters/claude/references/skill-frontmatter.schema.json +3 -1
  14. package/adapters/claude/references/stack-resolution.md +1 -1
  15. package/adapters/claude/references/stage-exit-protocol.md +19 -4
  16. package/adapters/claude/references/templates/root-hygiene/AGENTS.md +14 -0
  17. package/adapters/claude/references/templates/root-hygiene/CLAUDE.md +14 -0
  18. package/adapters/claude/references/templates/specs-hygiene/AGENTS.md +3 -1
  19. package/adapters/claude/references/templates/specs-hygiene/CLAUDE.md +2 -1
  20. package/adapters/claude/references/verifier-patterns/MEMORY.md +35 -0
  21. package/adapters/claude/references/verifier-patterns/pattern_absence_claims.md +36 -0
  22. package/adapters/claude/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
  23. package/adapters/claude/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
  24. package/adapters/claude/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
  25. package/adapters/claude/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
  26. package/adapters/claude/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
  27. package/adapters/claude/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
  28. package/adapters/claude/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
  29. package/adapters/claude/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
  30. package/adapters/claude/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
  31. package/adapters/claude/references/verifier-patterns/pattern_self_referential_control.md +26 -0
  32. package/adapters/claude/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
  33. package/adapters/claude/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
  34. package/adapters/claude/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
  35. package/adapters/claude/references/verifier-patterns/pattern_test_count_units.md +20 -0
  36. package/adapters/claude/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
  37. package/adapters/claude/references/verify-state.md +98 -0
  38. package/adapters/claude/scripts/forge-bootstrap.py +23 -2
  39. package/adapters/claude/scripts/forge-root.sh +104 -21
  40. package/adapters/claude/scripts/forge-session.py +620 -6969
  41. package/adapters/claude/scripts/forge_session/__init__.py +11 -0
  42. package/adapters/claude/scripts/forge_session/_common.py +1566 -0
  43. package/adapters/claude/scripts/forge_session/_doctor_util.py +218 -0
  44. package/adapters/claude/scripts/forge_session/cli.py +1067 -0
  45. package/adapters/claude/scripts/forge_session/decisions.py +355 -0
  46. package/adapters/claude/scripts/forge_session/discover.py +472 -0
  47. package/adapters/claude/scripts/forge_session/doctor.py +2144 -0
  48. package/adapters/claude/scripts/forge_session/exit.py +1081 -0
  49. package/adapters/claude/scripts/forge_session/outcomes.py +574 -0
  50. package/adapters/claude/scripts/forge_session/routes.py +1162 -0
  51. package/adapters/claude/scripts/forge_session/state.py +1479 -0
  52. package/adapters/claude/scripts/forge_session/topology.py +443 -0
  53. package/adapters/claude/skills/forge/SKILL.md +7 -7
  54. package/adapters/claude/skills/forge/references/process-overview.md +1 -1
  55. package/adapters/claude/skills/forge/references/shared-conventions.md +176 -23
  56. package/adapters/claude/skills/forge/references/stage-exit-protocol.md +19 -4
  57. package/adapters/claude/skills/forge-0-epic/SKILL.md +7 -7
  58. package/adapters/claude/skills/forge-0-epic/references/edit-mode.md +9 -5
  59. package/adapters/claude/skills/forge-0-epic/references/epic-manifest-subcommands.md +6 -1
  60. package/adapters/claude/skills/forge-0-epic/references/portable-root.md +20 -16
  61. package/adapters/claude/skills/forge-0-epic/references/shared-conventions.md +176 -23
  62. package/adapters/claude/skills/forge-0-epic/references/stage-exit-protocol.md +19 -4
  63. package/adapters/claude/skills/forge-1-prd/SKILL.md +7 -7
  64. package/adapters/claude/skills/forge-1-prd/references/shared-conventions.md +176 -23
  65. package/adapters/claude/skills/forge-1-prd/references/stage-exit-protocol.md +19 -4
  66. package/adapters/claude/skills/forge-2-tech/SKILL.md +7 -7
  67. package/adapters/claude/skills/forge-2-tech/references/shared-conventions.md +176 -23
  68. package/adapters/claude/skills/forge-2-tech/references/stack-resolution.md +1 -1
  69. package/adapters/claude/skills/forge-2-tech/references/stage-exit-protocol.md +19 -4
  70. package/adapters/claude/skills/forge-3-specs/SKILL.md +5 -5
  71. package/adapters/claude/skills/forge-3-specs/references/shared-conventions.md +176 -23
  72. package/adapters/claude/skills/forge-3-specs/references/stage-exit-protocol.md +19 -4
  73. package/adapters/claude/skills/forge-4-backlog/SKILL.md +16 -8
  74. package/adapters/claude/skills/forge-4-backlog/references/shared-conventions.md +176 -23
  75. package/adapters/claude/skills/forge-4-backlog/references/stage-exit-protocol.md +19 -4
  76. package/adapters/claude/skills/forge-4-backlog/references/verify-state.md +98 -0
  77. package/adapters/claude/skills/forge-5-loop/SKILL.md +36 -41
  78. package/adapters/claude/skills/forge-5-loop/references/agent-selection.md +4 -0
  79. package/adapters/claude/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
  80. package/adapters/claude/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
  81. package/adapters/claude/skills/forge-5-loop/references/recovery-procedure.md +10 -0
  82. package/adapters/claude/skills/forge-5-loop/references/runner-contract.md +17 -7
  83. package/adapters/claude/skills/forge-5-loop/references/shared-conventions.md +176 -23
  84. package/adapters/claude/skills/forge-5-loop/references/stage-exit-protocol.md +19 -4
  85. package/adapters/claude/skills/forge-5-loop/references/verify-state.md +98 -0
  86. package/adapters/claude/skills/forge-6-docs/SKILL.md +21 -14
  87. package/adapters/claude/skills/forge-6-docs/references/shared-conventions.md +176 -23
  88. package/adapters/claude/skills/forge-6-docs/references/stage-exit-protocol.md +19 -4
  89. package/adapters/claude/skills/forge-6-docs/references/verify-state.md +98 -0
  90. package/adapters/claude/skills/forge-bootstrap/SKILL.md +19 -10
  91. package/adapters/claude/skills/forge-bootstrap/references/shared-conventions.md +572 -0
  92. package/adapters/claude/skills/forge-fix/SKILL.md +15 -18
  93. package/adapters/claude/skills/forge-fix/references/select-outcome.md +138 -0
  94. package/adapters/claude/skills/forge-fix/references/shared-conventions.md +176 -23
  95. package/adapters/claude/skills/forge-fix/references/stage-exit-protocol.md +19 -4
  96. package/adapters/claude/skills/forge-guide/SKILL.md +87 -1
  97. package/adapters/claude/skills/forge-guide/references/forge-config-schema.json +5 -5
  98. package/adapters/claude/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
  99. package/adapters/claude/skills/forge-guide/references/process-overview.md +1 -1
  100. package/adapters/claude/skills/forge-guide/references/ralph-loop-contract.md +12 -8
  101. package/adapters/claude/skills/forge-guide/references/shared-conventions.md +176 -23
  102. package/adapters/claude/skills/forge-guide/references/stack-resolution.md +1 -1
  103. package/adapters/claude/skills/forge-init/SKILL.md +58 -7
  104. package/adapters/claude/skills/forge-init/references/preflight-and-self-heal.md +183 -0
  105. package/adapters/claude/skills/forge-init/references/shared-conventions.md +572 -0
  106. package/adapters/claude/skills/forge-verify/SKILL.md +25 -26
  107. package/adapters/claude/skills/forge-verify/references/findings-template.md +8 -8
  108. package/adapters/claude/skills/forge-verify/references/select-outcome.md +138 -0
  109. package/adapters/claude/skills/forge-verify/references/shared-conventions.md +176 -23
  110. package/adapters/claude/skills/forge-verify/references/stage-exit-protocol.md +19 -4
  111. package/adapters/claude/skills/forge-verify/references/verification-checklists/epic.md +1 -1
  112. package/adapters/claude/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
  113. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
  114. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
  115. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
  116. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
  117. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
  118. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
  119. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
  120. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
  121. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
  122. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
  123. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
  124. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
  125. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
  126. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
  127. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
  128. package/adapters/claude/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
  129. package/adapters/codex/.feature-forge-bundle.json +1 -1
  130. package/adapters/codex/agents/forge-researcher.toml +1 -1
  131. package/adapters/codex/agents/forge-verifier.toml +17 -6
  132. package/adapters/codex/references/forge-config-schema.json +7 -7
  133. package/adapters/codex/references/portable-root.md +20 -16
  134. package/adapters/codex/references/preflight-and-self-heal.md +183 -0
  135. package/adapters/codex/references/process-overview.md +10 -10
  136. package/adapters/codex/references/ralph-loop-contract.md +12 -8
  137. package/adapters/codex/references/select-outcome.md +138 -0
  138. package/adapters/codex/references/shared-conventions.md +189 -36
  139. package/adapters/codex/references/skill-frontmatter.schema.json +3 -1
  140. package/adapters/codex/references/stack-resolution.md +1 -1
  141. package/adapters/codex/references/stage-exit-protocol.md +22 -7
  142. package/adapters/codex/references/templates/root-hygiene/AGENTS.md +14 -0
  143. package/adapters/codex/references/templates/root-hygiene/CLAUDE.md +14 -0
  144. package/adapters/codex/references/templates/specs-hygiene/AGENTS.md +3 -1
  145. package/adapters/codex/references/templates/specs-hygiene/CLAUDE.md +2 -1
  146. package/adapters/codex/references/verifier-patterns/MEMORY.md +35 -0
  147. package/adapters/codex/references/verifier-patterns/pattern_absence_claims.md +36 -0
  148. package/adapters/codex/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
  149. package/adapters/codex/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
  150. package/adapters/codex/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
  151. package/adapters/codex/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
  152. package/adapters/codex/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
  153. package/adapters/codex/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
  154. package/adapters/codex/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
  155. package/adapters/codex/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
  156. package/adapters/codex/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
  157. package/adapters/codex/references/verifier-patterns/pattern_self_referential_control.md +26 -0
  158. package/adapters/codex/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
  159. package/adapters/codex/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
  160. package/adapters/codex/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
  161. package/adapters/codex/references/verifier-patterns/pattern_test_count_units.md +20 -0
  162. package/adapters/codex/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
  163. package/adapters/codex/references/verify-state.md +98 -0
  164. package/adapters/codex/scripts/forge-bootstrap.py +23 -2
  165. package/adapters/codex/scripts/forge-root.sh +104 -21
  166. package/adapters/codex/scripts/forge-session.py +620 -6969
  167. package/adapters/codex/scripts/forge_session/__init__.py +11 -0
  168. package/adapters/codex/scripts/forge_session/_common.py +1566 -0
  169. package/adapters/codex/scripts/forge_session/_doctor_util.py +218 -0
  170. package/adapters/codex/scripts/forge_session/cli.py +1067 -0
  171. package/adapters/codex/scripts/forge_session/decisions.py +355 -0
  172. package/adapters/codex/scripts/forge_session/discover.py +472 -0
  173. package/adapters/codex/scripts/forge_session/doctor.py +2144 -0
  174. package/adapters/codex/scripts/forge_session/exit.py +1081 -0
  175. package/adapters/codex/scripts/forge_session/outcomes.py +574 -0
  176. package/adapters/codex/scripts/forge_session/routes.py +1162 -0
  177. package/adapters/codex/scripts/forge_session/state.py +1479 -0
  178. package/adapters/codex/scripts/forge_session/topology.py +443 -0
  179. package/adapters/codex/skills/forge/SKILL.md +40 -40
  180. package/adapters/codex/skills/forge/references/process-overview.md +10 -10
  181. package/adapters/codex/skills/forge/references/shared-conventions.md +189 -36
  182. package/adapters/codex/skills/forge/references/stage-exit-protocol.md +22 -7
  183. package/adapters/codex/skills/forge-0-epic/SKILL.md +15 -15
  184. package/adapters/codex/skills/forge-0-epic/references/edit-mode.md +14 -10
  185. package/adapters/codex/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
  186. package/adapters/codex/skills/forge-0-epic/references/portable-root.md +20 -16
  187. package/adapters/codex/skills/forge-0-epic/references/shared-conventions.md +189 -36
  188. package/adapters/codex/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
  189. package/adapters/codex/skills/forge-1-prd/SKILL.md +15 -15
  190. package/adapters/codex/skills/forge-1-prd/references/shared-conventions.md +189 -36
  191. package/adapters/codex/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
  192. package/adapters/codex/skills/forge-2-tech/SKILL.md +15 -15
  193. package/adapters/codex/skills/forge-2-tech/references/shared-conventions.md +189 -36
  194. package/adapters/codex/skills/forge-2-tech/references/stack-resolution.md +1 -1
  195. package/adapters/codex/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
  196. package/adapters/codex/skills/forge-3-specs/SKILL.md +10 -10
  197. package/adapters/codex/skills/forge-3-specs/references/shared-conventions.md +189 -36
  198. package/adapters/codex/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
  199. package/adapters/codex/skills/forge-4-backlog/SKILL.md +19 -11
  200. package/adapters/codex/skills/forge-4-backlog/references/shared-conventions.md +189 -36
  201. package/adapters/codex/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
  202. package/adapters/codex/skills/forge-4-backlog/references/verify-state.md +98 -0
  203. package/adapters/codex/skills/forge-5-loop/SKILL.md +48 -53
  204. package/adapters/codex/skills/forge-5-loop/references/agent-selection.md +5 -1
  205. package/adapters/codex/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
  206. package/adapters/codex/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
  207. package/adapters/codex/skills/forge-5-loop/references/recovery-procedure.md +14 -4
  208. package/adapters/codex/skills/forge-5-loop/references/runner-contract.md +20 -10
  209. package/adapters/codex/skills/forge-5-loop/references/shared-conventions.md +189 -36
  210. package/adapters/codex/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
  211. package/adapters/codex/skills/forge-5-loop/references/verify-state.md +98 -0
  212. package/adapters/codex/skills/forge-6-docs/SKILL.md +27 -20
  213. package/adapters/codex/skills/forge-6-docs/references/shared-conventions.md +189 -36
  214. package/adapters/codex/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
  215. package/adapters/codex/skills/forge-6-docs/references/verify-state.md +98 -0
  216. package/adapters/codex/skills/forge-bootstrap/SKILL.md +23 -15
  217. package/adapters/codex/skills/forge-bootstrap/references/shared-conventions.md +572 -0
  218. package/adapters/codex/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
  219. package/adapters/codex/skills/forge-fix/SKILL.md +27 -30
  220. package/adapters/codex/skills/forge-fix/references/select-outcome.md +138 -0
  221. package/adapters/codex/skills/forge-fix/references/shared-conventions.md +189 -36
  222. package/adapters/codex/skills/forge-fix/references/stage-exit-protocol.md +22 -7
  223. package/adapters/codex/skills/forge-guide/SKILL.md +84 -7
  224. package/adapters/codex/skills/forge-guide/references/forge-config-schema.json +7 -7
  225. package/adapters/codex/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
  226. package/adapters/codex/skills/forge-guide/references/process-overview.md +10 -10
  227. package/adapters/codex/skills/forge-guide/references/ralph-loop-contract.md +12 -8
  228. package/adapters/codex/skills/forge-guide/references/shared-conventions.md +189 -36
  229. package/adapters/codex/skills/forge-guide/references/stack-resolution.md +1 -1
  230. package/adapters/codex/skills/forge-init/SKILL.md +62 -12
  231. package/adapters/codex/skills/forge-init/references/preflight-and-self-heal.md +183 -0
  232. package/adapters/codex/skills/forge-init/references/shared-conventions.md +572 -0
  233. package/adapters/codex/skills/forge-verify/SKILL.md +32 -33
  234. package/adapters/codex/skills/forge-verify/references/findings-template.md +8 -8
  235. package/adapters/codex/skills/forge-verify/references/select-outcome.md +138 -0
  236. package/adapters/codex/skills/forge-verify/references/shared-conventions.md +189 -36
  237. package/adapters/codex/skills/forge-verify/references/stage-exit-protocol.md +22 -7
  238. package/adapters/codex/skills/forge-verify/references/verification-checklists/epic.md +2 -2
  239. package/adapters/codex/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
  240. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
  241. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
  242. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
  243. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
  244. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
  245. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
  246. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
  247. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
  248. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
  249. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
  250. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
  251. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
  252. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
  253. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
  254. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
  255. package/adapters/codex/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
  256. package/adapters/copilot/.feature-forge-bundle.json +1 -1
  257. package/adapters/copilot/agents/forge-researcher.md +1 -1
  258. package/adapters/copilot/agents/forge-verifier.md +17 -6
  259. package/adapters/copilot/references/forge-config-schema.json +7 -7
  260. package/adapters/copilot/references/portable-root.md +20 -16
  261. package/adapters/copilot/references/preflight-and-self-heal.md +183 -0
  262. package/adapters/copilot/references/process-overview.md +10 -10
  263. package/adapters/copilot/references/ralph-loop-contract.md +12 -8
  264. package/adapters/copilot/references/select-outcome.md +138 -0
  265. package/adapters/copilot/references/shared-conventions.md +189 -36
  266. package/adapters/copilot/references/skill-frontmatter.schema.json +3 -1
  267. package/adapters/copilot/references/stack-resolution.md +1 -1
  268. package/adapters/copilot/references/stage-exit-protocol.md +22 -7
  269. package/adapters/copilot/references/templates/root-hygiene/AGENTS.md +14 -0
  270. package/adapters/copilot/references/templates/root-hygiene/CLAUDE.md +14 -0
  271. package/adapters/copilot/references/templates/specs-hygiene/AGENTS.md +3 -1
  272. package/adapters/copilot/references/templates/specs-hygiene/CLAUDE.md +2 -1
  273. package/adapters/copilot/references/verifier-patterns/MEMORY.md +35 -0
  274. package/adapters/copilot/references/verifier-patterns/pattern_absence_claims.md +36 -0
  275. package/adapters/copilot/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
  276. package/adapters/copilot/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
  277. package/adapters/copilot/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
  278. package/adapters/copilot/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
  279. package/adapters/copilot/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
  280. package/adapters/copilot/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
  281. package/adapters/copilot/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
  282. package/adapters/copilot/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
  283. package/adapters/copilot/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
  284. package/adapters/copilot/references/verifier-patterns/pattern_self_referential_control.md +26 -0
  285. package/adapters/copilot/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
  286. package/adapters/copilot/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
  287. package/adapters/copilot/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
  288. package/adapters/copilot/references/verifier-patterns/pattern_test_count_units.md +20 -0
  289. package/adapters/copilot/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
  290. package/adapters/copilot/references/verify-state.md +98 -0
  291. package/adapters/copilot/scripts/forge-bootstrap.py +23 -2
  292. package/adapters/copilot/scripts/forge-root.sh +104 -21
  293. package/adapters/copilot/scripts/forge-session.py +620 -6969
  294. package/adapters/copilot/scripts/forge_session/__init__.py +11 -0
  295. package/adapters/copilot/scripts/forge_session/_common.py +1566 -0
  296. package/adapters/copilot/scripts/forge_session/_doctor_util.py +218 -0
  297. package/adapters/copilot/scripts/forge_session/cli.py +1067 -0
  298. package/adapters/copilot/scripts/forge_session/decisions.py +355 -0
  299. package/adapters/copilot/scripts/forge_session/discover.py +472 -0
  300. package/adapters/copilot/scripts/forge_session/doctor.py +2144 -0
  301. package/adapters/copilot/scripts/forge_session/exit.py +1081 -0
  302. package/adapters/copilot/scripts/forge_session/outcomes.py +574 -0
  303. package/adapters/copilot/scripts/forge_session/routes.py +1162 -0
  304. package/adapters/copilot/scripts/forge_session/state.py +1479 -0
  305. package/adapters/copilot/scripts/forge_session/topology.py +443 -0
  306. package/adapters/copilot/skills/forge/forge.md +40 -40
  307. package/adapters/copilot/skills/forge/references/process-overview.md +10 -10
  308. package/adapters/copilot/skills/forge/references/shared-conventions.md +189 -36
  309. package/adapters/copilot/skills/forge/references/stage-exit-protocol.md +22 -7
  310. package/adapters/copilot/skills/forge-0-epic/forge-0-epic.md +15 -15
  311. package/adapters/copilot/skills/forge-0-epic/references/edit-mode.md +14 -10
  312. package/adapters/copilot/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
  313. package/adapters/copilot/skills/forge-0-epic/references/portable-root.md +20 -16
  314. package/adapters/copilot/skills/forge-0-epic/references/shared-conventions.md +189 -36
  315. package/adapters/copilot/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
  316. package/adapters/copilot/skills/forge-1-prd/forge-1-prd.md +15 -15
  317. package/adapters/copilot/skills/forge-1-prd/references/shared-conventions.md +189 -36
  318. package/adapters/copilot/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
  319. package/adapters/copilot/skills/forge-2-tech/forge-2-tech.md +15 -15
  320. package/adapters/copilot/skills/forge-2-tech/references/shared-conventions.md +189 -36
  321. package/adapters/copilot/skills/forge-2-tech/references/stack-resolution.md +1 -1
  322. package/adapters/copilot/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
  323. package/adapters/copilot/skills/forge-3-specs/forge-3-specs.md +10 -10
  324. package/adapters/copilot/skills/forge-3-specs/references/shared-conventions.md +189 -36
  325. package/adapters/copilot/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
  326. package/adapters/copilot/skills/forge-4-backlog/forge-4-backlog.md +19 -11
  327. package/adapters/copilot/skills/forge-4-backlog/references/shared-conventions.md +189 -36
  328. package/adapters/copilot/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
  329. package/adapters/copilot/skills/forge-4-backlog/references/verify-state.md +98 -0
  330. package/adapters/copilot/skills/forge-5-loop/forge-5-loop.md +48 -53
  331. package/adapters/copilot/skills/forge-5-loop/references/agent-selection.md +5 -1
  332. package/adapters/copilot/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
  333. package/adapters/copilot/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
  334. package/adapters/copilot/skills/forge-5-loop/references/recovery-procedure.md +14 -4
  335. package/adapters/copilot/skills/forge-5-loop/references/runner-contract.md +20 -10
  336. package/adapters/copilot/skills/forge-5-loop/references/shared-conventions.md +189 -36
  337. package/adapters/copilot/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
  338. package/adapters/copilot/skills/forge-5-loop/references/verify-state.md +98 -0
  339. package/adapters/copilot/skills/forge-6-docs/forge-6-docs.md +27 -20
  340. package/adapters/copilot/skills/forge-6-docs/references/shared-conventions.md +189 -36
  341. package/adapters/copilot/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
  342. package/adapters/copilot/skills/forge-6-docs/references/verify-state.md +98 -0
  343. package/adapters/copilot/skills/forge-bootstrap/forge-bootstrap.md +23 -15
  344. package/adapters/copilot/skills/forge-bootstrap/references/shared-conventions.md +572 -0
  345. package/adapters/copilot/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
  346. package/adapters/copilot/skills/forge-fix/forge-fix.md +27 -30
  347. package/adapters/copilot/skills/forge-fix/references/select-outcome.md +138 -0
  348. package/adapters/copilot/skills/forge-fix/references/shared-conventions.md +189 -36
  349. package/adapters/copilot/skills/forge-fix/references/stage-exit-protocol.md +22 -7
  350. package/adapters/copilot/skills/forge-guide/forge-guide.md +84 -7
  351. package/adapters/copilot/skills/forge-guide/references/forge-config-schema.json +7 -7
  352. package/adapters/copilot/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
  353. package/adapters/copilot/skills/forge-guide/references/process-overview.md +10 -10
  354. package/adapters/copilot/skills/forge-guide/references/ralph-loop-contract.md +12 -8
  355. package/adapters/copilot/skills/forge-guide/references/shared-conventions.md +189 -36
  356. package/adapters/copilot/skills/forge-guide/references/stack-resolution.md +1 -1
  357. package/adapters/copilot/skills/forge-init/forge-init.md +62 -12
  358. package/adapters/copilot/skills/forge-init/references/preflight-and-self-heal.md +183 -0
  359. package/adapters/copilot/skills/forge-init/references/shared-conventions.md +572 -0
  360. package/adapters/copilot/skills/forge-verify/forge-verify.md +32 -33
  361. package/adapters/copilot/skills/forge-verify/references/findings-template.md +8 -8
  362. package/adapters/copilot/skills/forge-verify/references/select-outcome.md +138 -0
  363. package/adapters/copilot/skills/forge-verify/references/shared-conventions.md +189 -36
  364. package/adapters/copilot/skills/forge-verify/references/stage-exit-protocol.md +22 -7
  365. package/adapters/copilot/skills/forge-verify/references/verification-checklists/epic.md +2 -2
  366. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
  367. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
  368. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
  369. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
  370. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
  371. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
  372. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
  373. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
  374. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
  375. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
  376. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
  377. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
  378. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
  379. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
  380. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
  381. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
  382. package/adapters/copilot/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
  383. package/adapters/cursor/.feature-forge-bundle.json +1 -1
  384. package/adapters/cursor/agents/forge-researcher.mdc +1 -1
  385. package/adapters/cursor/agents/forge-verifier.mdc +17 -6
  386. package/adapters/cursor/references/forge-config-schema.json +7 -7
  387. package/adapters/cursor/references/portable-root.md +20 -16
  388. package/adapters/cursor/references/preflight-and-self-heal.md +183 -0
  389. package/adapters/cursor/references/process-overview.md +10 -10
  390. package/adapters/cursor/references/ralph-loop-contract.md +12 -8
  391. package/adapters/cursor/references/select-outcome.md +138 -0
  392. package/adapters/cursor/references/shared-conventions.md +189 -36
  393. package/adapters/cursor/references/skill-frontmatter.schema.json +3 -1
  394. package/adapters/cursor/references/stack-resolution.md +1 -1
  395. package/adapters/cursor/references/stage-exit-protocol.md +22 -7
  396. package/adapters/cursor/references/templates/root-hygiene/AGENTS.md +14 -0
  397. package/adapters/cursor/references/templates/root-hygiene/CLAUDE.md +14 -0
  398. package/adapters/cursor/references/templates/specs-hygiene/AGENTS.md +3 -1
  399. package/adapters/cursor/references/templates/specs-hygiene/CLAUDE.md +2 -1
  400. package/adapters/cursor/references/verifier-patterns/MEMORY.md +35 -0
  401. package/adapters/cursor/references/verifier-patterns/pattern_absence_claims.md +36 -0
  402. package/adapters/cursor/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
  403. package/adapters/cursor/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
  404. package/adapters/cursor/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
  405. package/adapters/cursor/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
  406. package/adapters/cursor/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
  407. package/adapters/cursor/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
  408. package/adapters/cursor/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
  409. package/adapters/cursor/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
  410. package/adapters/cursor/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
  411. package/adapters/cursor/references/verifier-patterns/pattern_self_referential_control.md +26 -0
  412. package/adapters/cursor/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
  413. package/adapters/cursor/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
  414. package/adapters/cursor/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
  415. package/adapters/cursor/references/verifier-patterns/pattern_test_count_units.md +20 -0
  416. package/adapters/cursor/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
  417. package/adapters/cursor/references/verify-state.md +98 -0
  418. package/adapters/cursor/scripts/forge-bootstrap.py +23 -2
  419. package/adapters/cursor/scripts/forge-root.sh +104 -21
  420. package/adapters/cursor/scripts/forge-session.py +620 -6969
  421. package/adapters/cursor/scripts/forge_session/__init__.py +11 -0
  422. package/adapters/cursor/scripts/forge_session/_common.py +1566 -0
  423. package/adapters/cursor/scripts/forge_session/_doctor_util.py +218 -0
  424. package/adapters/cursor/scripts/forge_session/cli.py +1067 -0
  425. package/adapters/cursor/scripts/forge_session/decisions.py +355 -0
  426. package/adapters/cursor/scripts/forge_session/discover.py +472 -0
  427. package/adapters/cursor/scripts/forge_session/doctor.py +2144 -0
  428. package/adapters/cursor/scripts/forge_session/exit.py +1081 -0
  429. package/adapters/cursor/scripts/forge_session/outcomes.py +574 -0
  430. package/adapters/cursor/scripts/forge_session/routes.py +1162 -0
  431. package/adapters/cursor/scripts/forge_session/state.py +1479 -0
  432. package/adapters/cursor/scripts/forge_session/topology.py +443 -0
  433. package/adapters/cursor/skills/forge/forge.mdc +40 -40
  434. package/adapters/cursor/skills/forge/references/process-overview.md +10 -10
  435. package/adapters/cursor/skills/forge/references/shared-conventions.md +189 -36
  436. package/adapters/cursor/skills/forge/references/stage-exit-protocol.md +22 -7
  437. package/adapters/cursor/skills/forge-0-epic/forge-0-epic.mdc +15 -15
  438. package/adapters/cursor/skills/forge-0-epic/references/edit-mode.md +14 -10
  439. package/adapters/cursor/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
  440. package/adapters/cursor/skills/forge-0-epic/references/portable-root.md +20 -16
  441. package/adapters/cursor/skills/forge-0-epic/references/shared-conventions.md +189 -36
  442. package/adapters/cursor/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
  443. package/adapters/cursor/skills/forge-1-prd/forge-1-prd.mdc +15 -15
  444. package/adapters/cursor/skills/forge-1-prd/references/shared-conventions.md +189 -36
  445. package/adapters/cursor/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
  446. package/adapters/cursor/skills/forge-2-tech/forge-2-tech.mdc +15 -15
  447. package/adapters/cursor/skills/forge-2-tech/references/shared-conventions.md +189 -36
  448. package/adapters/cursor/skills/forge-2-tech/references/stack-resolution.md +1 -1
  449. package/adapters/cursor/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
  450. package/adapters/cursor/skills/forge-3-specs/forge-3-specs.mdc +10 -10
  451. package/adapters/cursor/skills/forge-3-specs/references/shared-conventions.md +189 -36
  452. package/adapters/cursor/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
  453. package/adapters/cursor/skills/forge-4-backlog/forge-4-backlog.mdc +19 -11
  454. package/adapters/cursor/skills/forge-4-backlog/references/shared-conventions.md +189 -36
  455. package/adapters/cursor/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
  456. package/adapters/cursor/skills/forge-4-backlog/references/verify-state.md +98 -0
  457. package/adapters/cursor/skills/forge-5-loop/forge-5-loop.mdc +48 -53
  458. package/adapters/cursor/skills/forge-5-loop/references/agent-selection.md +5 -1
  459. package/adapters/cursor/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
  460. package/adapters/cursor/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
  461. package/adapters/cursor/skills/forge-5-loop/references/recovery-procedure.md +14 -4
  462. package/adapters/cursor/skills/forge-5-loop/references/runner-contract.md +20 -10
  463. package/adapters/cursor/skills/forge-5-loop/references/shared-conventions.md +189 -36
  464. package/adapters/cursor/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
  465. package/adapters/cursor/skills/forge-5-loop/references/verify-state.md +98 -0
  466. package/adapters/cursor/skills/forge-6-docs/forge-6-docs.mdc +27 -20
  467. package/adapters/cursor/skills/forge-6-docs/references/shared-conventions.md +189 -36
  468. package/adapters/cursor/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
  469. package/adapters/cursor/skills/forge-6-docs/references/verify-state.md +98 -0
  470. package/adapters/cursor/skills/forge-bootstrap/forge-bootstrap.mdc +23 -15
  471. package/adapters/cursor/skills/forge-bootstrap/references/shared-conventions.md +572 -0
  472. package/adapters/cursor/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
  473. package/adapters/cursor/skills/forge-fix/forge-fix.mdc +27 -30
  474. package/adapters/cursor/skills/forge-fix/references/select-outcome.md +138 -0
  475. package/adapters/cursor/skills/forge-fix/references/shared-conventions.md +189 -36
  476. package/adapters/cursor/skills/forge-fix/references/stage-exit-protocol.md +22 -7
  477. package/adapters/cursor/skills/forge-guide/forge-guide.mdc +84 -7
  478. package/adapters/cursor/skills/forge-guide/references/forge-config-schema.json +7 -7
  479. package/adapters/cursor/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
  480. package/adapters/cursor/skills/forge-guide/references/process-overview.md +10 -10
  481. package/adapters/cursor/skills/forge-guide/references/ralph-loop-contract.md +12 -8
  482. package/adapters/cursor/skills/forge-guide/references/shared-conventions.md +189 -36
  483. package/adapters/cursor/skills/forge-guide/references/stack-resolution.md +1 -1
  484. package/adapters/cursor/skills/forge-init/forge-init.mdc +62 -12
  485. package/adapters/cursor/skills/forge-init/references/preflight-and-self-heal.md +183 -0
  486. package/adapters/cursor/skills/forge-init/references/shared-conventions.md +572 -0
  487. package/adapters/cursor/skills/forge-verify/forge-verify.mdc +32 -33
  488. package/adapters/cursor/skills/forge-verify/references/findings-template.md +8 -8
  489. package/adapters/cursor/skills/forge-verify/references/select-outcome.md +138 -0
  490. package/adapters/cursor/skills/forge-verify/references/shared-conventions.md +189 -36
  491. package/adapters/cursor/skills/forge-verify/references/stage-exit-protocol.md +22 -7
  492. package/adapters/cursor/skills/forge-verify/references/verification-checklists/epic.md +2 -2
  493. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
  494. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
  495. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
  496. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
  497. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
  498. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
  499. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
  500. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
  501. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
  502. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
  503. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
  504. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
  505. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
  506. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
  507. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
  508. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
  509. package/adapters/cursor/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
  510. package/adapters/gemini/.feature-forge-bundle.json +1 -1
  511. package/adapters/gemini/agents/forge-researcher.md +1 -1
  512. package/adapters/gemini/agents/forge-verifier.md +17 -6
  513. package/adapters/gemini/gemini-extension.json +13 -13
  514. package/adapters/gemini/references/forge-config-schema.json +7 -7
  515. package/adapters/gemini/references/portable-root.md +20 -16
  516. package/adapters/gemini/references/preflight-and-self-heal.md +183 -0
  517. package/adapters/gemini/references/process-overview.md +10 -10
  518. package/adapters/gemini/references/ralph-loop-contract.md +12 -8
  519. package/adapters/gemini/references/select-outcome.md +138 -0
  520. package/adapters/gemini/references/shared-conventions.md +189 -36
  521. package/adapters/gemini/references/skill-frontmatter.schema.json +3 -1
  522. package/adapters/gemini/references/stack-resolution.md +1 -1
  523. package/adapters/gemini/references/stage-exit-protocol.md +22 -7
  524. package/adapters/gemini/references/templates/root-hygiene/AGENTS.md +14 -0
  525. package/adapters/gemini/references/templates/root-hygiene/CLAUDE.md +14 -0
  526. package/adapters/gemini/references/templates/specs-hygiene/AGENTS.md +3 -1
  527. package/adapters/gemini/references/templates/specs-hygiene/CLAUDE.md +2 -1
  528. package/adapters/gemini/references/verifier-patterns/MEMORY.md +35 -0
  529. package/adapters/gemini/references/verifier-patterns/pattern_absence_claims.md +36 -0
  530. package/adapters/gemini/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
  531. package/adapters/gemini/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
  532. package/adapters/gemini/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
  533. package/adapters/gemini/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
  534. package/adapters/gemini/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
  535. package/adapters/gemini/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
  536. package/adapters/gemini/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
  537. package/adapters/gemini/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
  538. package/adapters/gemini/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
  539. package/adapters/gemini/references/verifier-patterns/pattern_self_referential_control.md +26 -0
  540. package/adapters/gemini/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
  541. package/adapters/gemini/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
  542. package/adapters/gemini/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
  543. package/adapters/gemini/references/verifier-patterns/pattern_test_count_units.md +20 -0
  544. package/adapters/gemini/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
  545. package/adapters/gemini/references/verify-state.md +98 -0
  546. package/adapters/gemini/scripts/forge-bootstrap.py +23 -2
  547. package/adapters/gemini/scripts/forge-root.sh +104 -21
  548. package/adapters/gemini/scripts/forge-session.py +620 -6969
  549. package/adapters/gemini/scripts/forge_session/__init__.py +11 -0
  550. package/adapters/gemini/scripts/forge_session/_common.py +1566 -0
  551. package/adapters/gemini/scripts/forge_session/_doctor_util.py +218 -0
  552. package/adapters/gemini/scripts/forge_session/cli.py +1067 -0
  553. package/adapters/gemini/scripts/forge_session/decisions.py +355 -0
  554. package/adapters/gemini/scripts/forge_session/discover.py +472 -0
  555. package/adapters/gemini/scripts/forge_session/doctor.py +2144 -0
  556. package/adapters/gemini/scripts/forge_session/exit.py +1081 -0
  557. package/adapters/gemini/scripts/forge_session/outcomes.py +574 -0
  558. package/adapters/gemini/scripts/forge_session/routes.py +1162 -0
  559. package/adapters/gemini/scripts/forge_session/state.py +1479 -0
  560. package/adapters/gemini/scripts/forge_session/topology.py +443 -0
  561. package/adapters/gemini/skills/forge/forge.md +40 -40
  562. package/adapters/gemini/skills/forge/references/process-overview.md +10 -10
  563. package/adapters/gemini/skills/forge/references/shared-conventions.md +189 -36
  564. package/adapters/gemini/skills/forge/references/stage-exit-protocol.md +22 -7
  565. package/adapters/gemini/skills/forge-0-epic/forge-0-epic.md +15 -15
  566. package/adapters/gemini/skills/forge-0-epic/references/edit-mode.md +14 -10
  567. package/adapters/gemini/skills/forge-0-epic/references/epic-manifest-subcommands.md +8 -3
  568. package/adapters/gemini/skills/forge-0-epic/references/portable-root.md +20 -16
  569. package/adapters/gemini/skills/forge-0-epic/references/shared-conventions.md +189 -36
  570. package/adapters/gemini/skills/forge-0-epic/references/stage-exit-protocol.md +22 -7
  571. package/adapters/gemini/skills/forge-1-prd/forge-1-prd.md +15 -15
  572. package/adapters/gemini/skills/forge-1-prd/references/shared-conventions.md +189 -36
  573. package/adapters/gemini/skills/forge-1-prd/references/stage-exit-protocol.md +22 -7
  574. package/adapters/gemini/skills/forge-2-tech/forge-2-tech.md +15 -15
  575. package/adapters/gemini/skills/forge-2-tech/references/shared-conventions.md +189 -36
  576. package/adapters/gemini/skills/forge-2-tech/references/stack-resolution.md +1 -1
  577. package/adapters/gemini/skills/forge-2-tech/references/stage-exit-protocol.md +22 -7
  578. package/adapters/gemini/skills/forge-3-specs/forge-3-specs.md +10 -10
  579. package/adapters/gemini/skills/forge-3-specs/references/shared-conventions.md +189 -36
  580. package/adapters/gemini/skills/forge-3-specs/references/stage-exit-protocol.md +22 -7
  581. package/adapters/gemini/skills/forge-4-backlog/forge-4-backlog.md +19 -11
  582. package/adapters/gemini/skills/forge-4-backlog/references/shared-conventions.md +189 -36
  583. package/adapters/gemini/skills/forge-4-backlog/references/stage-exit-protocol.md +22 -7
  584. package/adapters/gemini/skills/forge-4-backlog/references/verify-state.md +98 -0
  585. package/adapters/gemini/skills/forge-5-loop/forge-5-loop.md +48 -53
  586. package/adapters/gemini/skills/forge-5-loop/references/agent-selection.md +5 -1
  587. package/adapters/gemini/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
  588. package/adapters/gemini/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
  589. package/adapters/gemini/skills/forge-5-loop/references/recovery-procedure.md +14 -4
  590. package/adapters/gemini/skills/forge-5-loop/references/runner-contract.md +20 -10
  591. package/adapters/gemini/skills/forge-5-loop/references/shared-conventions.md +189 -36
  592. package/adapters/gemini/skills/forge-5-loop/references/stage-exit-protocol.md +22 -7
  593. package/adapters/gemini/skills/forge-5-loop/references/verify-state.md +98 -0
  594. package/adapters/gemini/skills/forge-6-docs/forge-6-docs.md +27 -20
  595. package/adapters/gemini/skills/forge-6-docs/references/shared-conventions.md +189 -36
  596. package/adapters/gemini/skills/forge-6-docs/references/stage-exit-protocol.md +22 -7
  597. package/adapters/gemini/skills/forge-6-docs/references/verify-state.md +98 -0
  598. package/adapters/gemini/skills/forge-bootstrap/forge-bootstrap.md +23 -15
  599. package/adapters/gemini/skills/forge-bootstrap/references/shared-conventions.md +572 -0
  600. package/adapters/gemini/skills/forge-bootstrap/references/templates/hygiene/CLAUDE.md +2 -2
  601. package/adapters/gemini/skills/forge-fix/forge-fix.md +27 -30
  602. package/adapters/gemini/skills/forge-fix/references/select-outcome.md +138 -0
  603. package/adapters/gemini/skills/forge-fix/references/shared-conventions.md +189 -36
  604. package/adapters/gemini/skills/forge-fix/references/stage-exit-protocol.md +22 -7
  605. package/adapters/gemini/skills/forge-guide/forge-guide.md +84 -7
  606. package/adapters/gemini/skills/forge-guide/references/forge-config-schema.json +7 -7
  607. package/adapters/gemini/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
  608. package/adapters/gemini/skills/forge-guide/references/process-overview.md +10 -10
  609. package/adapters/gemini/skills/forge-guide/references/ralph-loop-contract.md +12 -8
  610. package/adapters/gemini/skills/forge-guide/references/shared-conventions.md +189 -36
  611. package/adapters/gemini/skills/forge-guide/references/stack-resolution.md +1 -1
  612. package/adapters/gemini/skills/forge-init/forge-init.md +62 -12
  613. package/adapters/gemini/skills/forge-init/references/preflight-and-self-heal.md +183 -0
  614. package/adapters/gemini/skills/forge-init/references/shared-conventions.md +572 -0
  615. package/adapters/gemini/skills/forge-verify/forge-verify.md +32 -33
  616. package/adapters/gemini/skills/forge-verify/references/findings-template.md +8 -8
  617. package/adapters/gemini/skills/forge-verify/references/select-outcome.md +138 -0
  618. package/adapters/gemini/skills/forge-verify/references/shared-conventions.md +189 -36
  619. package/adapters/gemini/skills/forge-verify/references/stage-exit-protocol.md +22 -7
  620. package/adapters/gemini/skills/forge-verify/references/verification-checklists/epic.md +2 -2
  621. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
  622. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
  623. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
  624. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
  625. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
  626. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
  627. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
  628. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
  629. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
  630. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
  631. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
  632. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
  633. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
  634. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
  635. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
  636. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
  637. package/adapters/gemini/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
  638. package/adapters/pi/.feature-forge-bundle.json +1 -1
  639. package/adapters/pi/agents/forge-verifier.md +16 -5
  640. package/adapters/pi/extensions/forge-invocation-args/README.md +106 -0
  641. package/adapters/pi/extensions/forge-invocation-args/index.ts +31 -0
  642. package/adapters/pi/extensions/forge-invocation-args/wiring.ts +172 -0
  643. package/adapters/pi/extensions/forge-loop-supervisor/events.ts +90 -0
  644. package/adapters/pi/extensions/forge-loop-supervisor/index.ts +114 -0
  645. package/adapters/pi/extensions/forge-loop-supervisor/registry.ts +137 -0
  646. package/adapters/pi/extensions/forge-loop-supervisor/supervisor.ts +185 -0
  647. package/adapters/pi/extensions/forge-loop-supervisor/tailer.ts +137 -0
  648. package/adapters/pi/extensions/forge-loop-supervisor/types.ts +87 -0
  649. package/adapters/pi/extensions/forge-loop-supervisor/wiring.ts +423 -0
  650. package/adapters/pi/package.json +3 -1
  651. package/adapters/pi/references/forge-config-schema.json +5 -5
  652. package/adapters/pi/references/portable-root.md +20 -16
  653. package/adapters/pi/references/preflight-and-self-heal.md +183 -0
  654. package/adapters/pi/references/ralph-loop-contract.md +12 -8
  655. package/adapters/pi/references/select-outcome.md +138 -0
  656. package/adapters/pi/references/shared-conventions.md +176 -23
  657. package/adapters/pi/references/skill-frontmatter.schema.json +3 -1
  658. package/adapters/pi/references/stack-resolution.md +1 -1
  659. package/adapters/pi/references/stage-exit-protocol.md +19 -4
  660. package/adapters/pi/references/templates/root-hygiene/AGENTS.md +14 -0
  661. package/adapters/pi/references/templates/root-hygiene/CLAUDE.md +14 -0
  662. package/adapters/pi/references/templates/specs-hygiene/AGENTS.md +3 -1
  663. package/adapters/pi/references/templates/specs-hygiene/CLAUDE.md +2 -1
  664. package/adapters/pi/references/verifier-patterns/MEMORY.md +35 -0
  665. package/adapters/pi/references/verifier-patterns/pattern_absence_claims.md +36 -0
  666. package/adapters/pi/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
  667. package/adapters/pi/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
  668. package/adapters/pi/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
  669. package/adapters/pi/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
  670. package/adapters/pi/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
  671. package/adapters/pi/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
  672. package/adapters/pi/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
  673. package/adapters/pi/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
  674. package/adapters/pi/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
  675. package/adapters/pi/references/verifier-patterns/pattern_self_referential_control.md +26 -0
  676. package/adapters/pi/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
  677. package/adapters/pi/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
  678. package/adapters/pi/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
  679. package/adapters/pi/references/verifier-patterns/pattern_test_count_units.md +20 -0
  680. package/adapters/pi/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
  681. package/adapters/pi/references/verify-state.md +98 -0
  682. package/adapters/pi/scripts/forge-bootstrap.py +23 -2
  683. package/adapters/pi/scripts/forge-root.sh +104 -21
  684. package/adapters/pi/scripts/forge-session.py +620 -6969
  685. package/adapters/pi/scripts/forge_session/__init__.py +11 -0
  686. package/adapters/pi/scripts/forge_session/_common.py +1566 -0
  687. package/adapters/pi/scripts/forge_session/_doctor_util.py +218 -0
  688. package/adapters/pi/scripts/forge_session/cli.py +1067 -0
  689. package/adapters/pi/scripts/forge_session/decisions.py +355 -0
  690. package/adapters/pi/scripts/forge_session/discover.py +472 -0
  691. package/adapters/pi/scripts/forge_session/doctor.py +2144 -0
  692. package/adapters/pi/scripts/forge_session/exit.py +1081 -0
  693. package/adapters/pi/scripts/forge_session/outcomes.py +574 -0
  694. package/adapters/pi/scripts/forge_session/routes.py +1162 -0
  695. package/adapters/pi/scripts/forge_session/state.py +1479 -0
  696. package/adapters/pi/scripts/forge_session/topology.py +443 -0
  697. package/adapters/pi/skills/forge/SKILL.md +13 -9
  698. package/adapters/pi/skills/forge/references/shared-conventions.md +176 -23
  699. package/adapters/pi/skills/forge/references/stage-exit-protocol.md +19 -4
  700. package/adapters/pi/skills/forge-0-epic/SKILL.md +13 -9
  701. package/adapters/pi/skills/forge-0-epic/references/edit-mode.md +9 -5
  702. package/adapters/pi/skills/forge-0-epic/references/epic-manifest-subcommands.md +6 -1
  703. package/adapters/pi/skills/forge-0-epic/references/portable-root.md +20 -16
  704. package/adapters/pi/skills/forge-0-epic/references/shared-conventions.md +176 -23
  705. package/adapters/pi/skills/forge-0-epic/references/stage-exit-protocol.md +19 -4
  706. package/adapters/pi/skills/forge-1-prd/SKILL.md +13 -9
  707. package/adapters/pi/skills/forge-1-prd/references/shared-conventions.md +176 -23
  708. package/adapters/pi/skills/forge-1-prd/references/stage-exit-protocol.md +19 -4
  709. package/adapters/pi/skills/forge-2-tech/SKILL.md +12 -8
  710. package/adapters/pi/skills/forge-2-tech/references/shared-conventions.md +176 -23
  711. package/adapters/pi/skills/forge-2-tech/references/stack-resolution.md +1 -1
  712. package/adapters/pi/skills/forge-2-tech/references/stage-exit-protocol.md +19 -4
  713. package/adapters/pi/skills/forge-3-specs/SKILL.md +11 -7
  714. package/adapters/pi/skills/forge-3-specs/references/shared-conventions.md +176 -23
  715. package/adapters/pi/skills/forge-3-specs/references/stage-exit-protocol.md +19 -4
  716. package/adapters/pi/skills/forge-4-backlog/SKILL.md +22 -10
  717. package/adapters/pi/skills/forge-4-backlog/references/shared-conventions.md +176 -23
  718. package/adapters/pi/skills/forge-4-backlog/references/stage-exit-protocol.md +19 -4
  719. package/adapters/pi/skills/forge-4-backlog/references/verify-state.md +98 -0
  720. package/adapters/pi/skills/forge-5-loop/SKILL.md +47 -45
  721. package/adapters/pi/skills/forge-5-loop/references/agent-selection.md +4 -0
  722. package/adapters/pi/skills/forge-5-loop/references/preflight-and-self-heal.md +183 -0
  723. package/adapters/pi/skills/forge-5-loop/references/ralph-loop-contract.md +12 -8
  724. package/adapters/pi/skills/forge-5-loop/references/recovery-procedure.md +10 -0
  725. package/adapters/pi/skills/forge-5-loop/references/runner-contract.md +22 -9
  726. package/adapters/pi/skills/forge-5-loop/references/shared-conventions.md +176 -23
  727. package/adapters/pi/skills/forge-5-loop/references/stage-exit-protocol.md +19 -4
  728. package/adapters/pi/skills/forge-5-loop/references/verify-state.md +98 -0
  729. package/adapters/pi/skills/forge-6-docs/SKILL.md +27 -16
  730. package/adapters/pi/skills/forge-6-docs/references/shared-conventions.md +176 -23
  731. package/adapters/pi/skills/forge-6-docs/references/stage-exit-protocol.md +19 -4
  732. package/adapters/pi/skills/forge-6-docs/references/verify-state.md +98 -0
  733. package/adapters/pi/skills/forge-bootstrap/SKILL.md +24 -12
  734. package/adapters/pi/skills/forge-bootstrap/references/shared-conventions.md +572 -0
  735. package/adapters/pi/skills/forge-fix/SKILL.md +21 -20
  736. package/adapters/pi/skills/forge-fix/references/select-outcome.md +138 -0
  737. package/adapters/pi/skills/forge-fix/references/shared-conventions.md +176 -23
  738. package/adapters/pi/skills/forge-fix/references/stage-exit-protocol.md +19 -4
  739. package/adapters/pi/skills/forge-guide/SKILL.md +83 -2
  740. package/adapters/pi/skills/forge-guide/references/forge-config-schema.json +5 -5
  741. package/adapters/pi/skills/forge-guide/references/preflight-and-self-heal.md +183 -0
  742. package/adapters/pi/skills/forge-guide/references/ralph-loop-contract.md +12 -8
  743. package/adapters/pi/skills/forge-guide/references/shared-conventions.md +176 -23
  744. package/adapters/pi/skills/forge-guide/references/stack-resolution.md +1 -1
  745. package/adapters/pi/skills/forge-init/SKILL.md +63 -9
  746. package/adapters/pi/skills/forge-init/references/preflight-and-self-heal.md +183 -0
  747. package/adapters/pi/skills/forge-init/references/shared-conventions.md +572 -0
  748. package/adapters/pi/skills/forge-verify/SKILL.md +26 -23
  749. package/adapters/pi/skills/forge-verify/references/findings-template.md +7 -7
  750. package/adapters/pi/skills/forge-verify/references/select-outcome.md +138 -0
  751. package/adapters/pi/skills/forge-verify/references/shared-conventions.md +176 -23
  752. package/adapters/pi/skills/forge-verify/references/stage-exit-protocol.md +19 -4
  753. package/adapters/pi/skills/forge-verify/references/verification-checklists/epic.md +1 -1
  754. package/adapters/pi/skills/forge-verify/references/verifier-patterns/MEMORY.md +35 -0
  755. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_absence_claims.md +36 -0
  756. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_carveout_sibling_semantics.md +34 -0
  757. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_deviation_judgment.md +36 -0
  758. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_enum_vocabulary_ripple.md +43 -0
  759. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_extend_the_existing.md +31 -0
  760. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_guard_substitution_detection.md +34 -0
  761. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_mechanical_rewrite_damage.md +30 -0
  762. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_postfix_reverify.md +82 -0
  763. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_proximity_window_guards.md +26 -0
  764. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_scratch_root_probes.md +40 -0
  765. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_self_referential_control.md +26 -0
  766. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_sibling_docstring_sweep.md +28 -0
  767. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_spec_literals_are_claims.md +45 -0
  768. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_stale_counts_after_split.md +36 -0
  769. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_test_count_units.md +20 -0
  770. package/adapters/pi/skills/forge-verify/references/verifier-patterns/pattern_vacuous_self_reading_tests.md +32 -0
  771. package/dist/manifest.d.ts +1 -1
  772. package/dist/rauf.d.ts +3 -3
  773. package/dist/rauf.js +2 -2
  774. package/dist/source.d.ts +5 -2
  775. package/dist/source.js +5 -2
  776. package/dist/types.d.ts +1 -1
  777. package/dist/types.js +1 -1
  778. package/package.json +9 -2
@@ -0,0 +1,443 @@
1
+ """Dependency graph & blocked-item clustering — the ``backlog-topology`` verb.
2
+
3
+ Pure, stdlib-only flat functions over the loop runner's item array (the
4
+ ``listCommand`` JSON the caller already holds) — same precedent as
5
+ rank-features/reconcile-branch, no class. Nothing here reads backlog.json off
6
+ disk: single data source, so every derived claim cites the runner's
7
+ authoritative counts. All ordering flows through ``_id_key``, never dict/hash
8
+ iteration, which is what makes the output deterministic and testable.
9
+
10
+ Extracted from the ``forge-session.py`` monolith (#279); imports the shared
11
+ ``UsageError`` from :mod:`forge_session._common`, never from the shim.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import argparse
17
+ import json
18
+ import math
19
+ import re
20
+ import sys
21
+ from pathlib import Path
22
+ from typing import Final
23
+
24
+ from forge_session._common import UsageError
25
+
26
+ #: Token-set Jaccard edge threshold for ``cluster_blocked``: two blocked items whose
27
+ #: normalized blockedReason token sets score >= this join one systemic-cause cluster
28
+ #: candidate. Calibrated against a real one-cause-three-phrasings incident — the
29
+ #: binding pair clears 0.5 by only ~0.028, and tests/test_decision_clustering.py
30
+ #: vendors those strings verbatim so a threshold change that would re-split the
31
+ #: incident is caught. Under-clustering is the deliberately chosen failure direction:
32
+ #: the agent holds merge authority, so the scripted floor must never over-merge.
33
+ CLUSTER_JACCARD_THRESHOLD: Final[float] = 0.5
34
+ #: Advisory topology warn triggers for ``compute_topology`` — a single root whose
35
+ #: gated subtree is >= ceil(ratio * itemCount) items trips "single-root-fanout";
36
+ #: a dependsOn chain of >= ceil(ratio * itemCount) nodes trips "chain-depth".
37
+ #: math.ceil keeps the ratios the single source of the thresholds even if a
38
+ #: future ratio is non-half. Advisory only: no consumer blocks on them.
39
+ TOPOLOGY_FANOUT_WARN_RATIO: Final[float] = 0.5
40
+ TOPOLOGY_DEPTH_WARN_RATIO: Final[float] = 0.5
41
+
42
+
43
+ def _id_key(item_id: object) -> tuple[int, object]:
44
+ """Deterministic sort key for backlog ids.
45
+
46
+ All-digit ids sort numerically ("2" before "10"); everything else sorts
47
+ lexically, after the numeric block. Used everywhere an ordering must not
48
+ depend on dict/hash iteration.
49
+
50
+ Args:
51
+ item_id: A backlog item id (usually ``str``; coerced defensively).
52
+
53
+ Returns:
54
+ A ``(bucket, value)`` tuple that is a total order across mixed id shapes.
55
+ """
56
+ s = str(item_id)
57
+ return (0, int(s)) if s.isdigit() else (1, s)
58
+
59
+
60
+ def _build_dep_index(
61
+ items: list[dict],
62
+ ) -> tuple[dict[str, dict], dict[str, list[str]], dict[str, list[str]]]:
63
+ """Build the in-backlog dependency adjacency from ``dependsOn`` edges.
64
+
65
+ Edges pointing at ids **not present** in this backlog are dropped (an item
66
+ whose only ``dependsOn`` targets are external is therefore a root).
67
+
68
+ Args:
69
+ items: The runner's item array (each a dict with at least ``id``; optional
70
+ ``dependsOn``, ``status``, ``blockedReason``).
71
+
72
+ Returns:
73
+ ``(by_id, deps, dependents)`` where ``by_id`` maps id → item, ``deps`` maps
74
+ id → the ids it depends on (in-backlog only), and ``dependents`` maps id →
75
+ the ids that directly depend on it.
76
+ """
77
+ by_id = {str(it["id"]): it for it in items}
78
+ deps: dict[str, list[str]] = {
79
+ i: [str(d) for d in (by_id[i].get("dependsOn") or []) if str(d) in by_id]
80
+ for i in by_id
81
+ }
82
+ dependents: dict[str, list[str]] = {i: [] for i in by_id}
83
+ for i, ds in deps.items():
84
+ for d in ds:
85
+ dependents[d].append(i)
86
+ return by_id, deps, dependents
87
+
88
+
89
+ def _transitive_dependents(
90
+ dependents: dict[str, list[str]],
91
+ ) -> dict[str, set[str]]:
92
+ """Memoized transitive-dependents (gated-subtree) closure for every node.
93
+
94
+ ``dependents[x]`` lists items that directly depend on ``x``; the returned map
95
+ gives, for each item, the set of items that **transitively** depend on it — the
96
+ gated subtree that item's completion would unblock ("gates").
97
+
98
+ Cycle-safe: a node re-encountered on the current DFS path contributes nothing
99
+ and is not memoized (rauf rejects cycles upstream, so this only hardens against
100
+ malformed input; it never fires on validated backlogs).
101
+
102
+ Args:
103
+ dependents: The reverse adjacency from :func:`_build_dep_index`.
104
+
105
+ Returns:
106
+ A map id → set of transitively-dependent ids. O(V + E) overall (each edge
107
+ is walked once thanks to memoization).
108
+ """
109
+ memo: dict[str, set[str]] = {}
110
+
111
+ def visit(node: str, on_path: set[str]) -> set[str]:
112
+ if node in memo:
113
+ return memo[node]
114
+ if node in on_path: # cycle guard — unreachable on validated backlogs
115
+ return set()
116
+ on_path.add(node)
117
+ acc: set[str] = set()
118
+ for child in dependents[node]:
119
+ acc.add(child)
120
+ acc |= visit(child, on_path)
121
+ on_path.discard(node)
122
+ memo[node] = acc
123
+ return acc
124
+
125
+ for n in dependents:
126
+ visit(n, set())
127
+ return memo
128
+
129
+
130
+ #: A token that is a pure number or item-id-shaped (``42``, ``req12``, ``t7``) —
131
+ #: noise carrying no cause signal, dropped by _normalize_reason.
132
+ _ID_SHAPED_TOKEN = re.compile(r"^(?:\d+|[a-z]*\d+)$")
133
+
134
+
135
+ def _normalize_reason(text: str | None) -> set[str]:
136
+ """Normalize a ``blockedReason`` into its comparison token set.
137
+
138
+ Lowercases, splits on any run of non-alphanumeric characters, and drops noise
139
+ tokens — pure numbers and item-id-shaped tokens (``42``, ``req12``, ``t7``) —
140
+ which carry no cause signal and would spuriously separate or merge reasons.
141
+
142
+ Args:
143
+ text: The item's ``blockedReason`` (may be ``None``/empty).
144
+
145
+ Returns:
146
+ The set of meaningful lowercased tokens (possibly empty).
147
+ """
148
+ tokens = re.split(r"[^a-z0-9]+", (text or "").lower())
149
+ return {t for t in tokens if t and not _ID_SHAPED_TOKEN.match(t)}
150
+
151
+
152
+ def _jaccard(a: set[str], b: set[str]) -> float:
153
+ """Jaccard similarity |A∩B| / |A∪B| of two token sets.
154
+
155
+ Symmetric and order-insensitive. Two empty sets score ``0.0`` — an item with
156
+ no meaningful reason tokens never clusters with anything.
157
+
158
+ Args:
159
+ a: First token set.
160
+ b: Second token set.
161
+
162
+ Returns:
163
+ A similarity in ``[0.0, 1.0]``.
164
+ """
165
+ union = a | b
166
+ return len(a & b) / len(union) if union else 0.0
167
+
168
+
169
+ def cluster_blocked(items: list[dict]) -> list[dict]:
170
+ """Cluster blocked items by ``blockedReason`` similarity.
171
+
172
+ Union-find over every pair of ``status == "blocked"`` items whose normalized
173
+ token-set Jaccard is ``>= CLUSTER_JACCARD_THRESHOLD``. Each emitted component
174
+ carries its member ids, the members' raw reasons, the shared token core, and
175
+ the **union** of the members' gated subtrees for blast-radius framing.
176
+ Components of size 1 are emitted too — the recovery procedure consolidates
177
+ only components of >= 2, prompting singletons per item.
178
+
179
+ The result is the deterministic *substrate*: the agent may merge components it
180
+ judges to share a cause (under-clustering is the deliberately chosen failure
181
+ direction). It never reads disk; ``items`` is the runner's array.
182
+
183
+ Args:
184
+ items: The runner's ``listCommand`` item array.
185
+
186
+ Returns:
187
+ A list of cluster dicts, sorted by lowest member id:
188
+ ``{clusterId, memberIds, memberReasons, sharedTokens, gatedIds, gatedCount}``.
189
+ """
190
+ by_id, _deps, dependents = _build_dep_index(items)
191
+ gated = _transitive_dependents(dependents)
192
+ blocked = sorted(
193
+ (i for i, it in by_id.items() if it.get("status") == "blocked"),
194
+ key=_id_key,
195
+ )
196
+ tokens = {i: _normalize_reason(by_id[i].get("blockedReason")) for i in blocked}
197
+
198
+ parent = {i: i for i in blocked}
199
+
200
+ def find(x: str) -> str:
201
+ while parent[x] != x:
202
+ parent[x] = parent[parent[x]] # path halving
203
+ x = parent[x]
204
+ return x
205
+
206
+ def union(a: str, b: str) -> None:
207
+ ra, rb = find(a), find(b)
208
+ if ra == rb:
209
+ return
210
+ lo, hi = sorted((ra, rb), key=_id_key) # lowest id is the component root
211
+ parent[hi] = lo
212
+
213
+ for idx, a in enumerate(blocked):
214
+ for b in blocked[idx + 1:]:
215
+ if _jaccard(tokens[a], tokens[b]) >= CLUSTER_JACCARD_THRESHOLD:
216
+ union(a, b)
217
+
218
+ groups: dict[str, list[str]] = {}
219
+ for i in blocked:
220
+ groups.setdefault(find(i), []).append(i)
221
+
222
+ clusters: list[dict] = []
223
+ for root in sorted(groups, key=_id_key):
224
+ members = sorted(groups[root], key=_id_key)
225
+ shared = set.intersection(*(tokens[m] for m in members)) if members else set()
226
+ union_gated: set[str] = set()
227
+ for m in members:
228
+ union_gated |= gated[m]
229
+ union_gated -= set(members) # a member gating a sibling is not its own blast radius
230
+ clusters.append(
231
+ {
232
+ "clusterId": "c" + members[0], # "c" + lowest member id: stable across runs
233
+ "memberIds": members,
234
+ "memberReasons": [by_id[m].get("blockedReason") or "" for m in members],
235
+ "sharedTokens": sorted(shared),
236
+ "gatedIds": sorted(union_gated, key=_id_key),
237
+ "gatedCount": len(union_gated),
238
+ }
239
+ )
240
+ return clusters
241
+
242
+
243
+ def _max_chain_depth(by_id: dict[str, dict], deps: dict[str, list[str]]) -> int:
244
+ """Longest ``dependsOn`` chain length (node count), memoized and cycle-safe.
245
+
246
+ Depth of a node = ``1 + max(depth(dep) …)`` over its in-backlog dependencies;
247
+ the result is the maximum over all nodes. A node re-seen on the current path
248
+ contributes ``0`` (cycle guard; unreachable on validated backlogs).
249
+
250
+ Args:
251
+ by_id: id → item, from :func:`_build_dep_index`.
252
+ deps: id → dependency ids, from :func:`_build_dep_index`.
253
+
254
+ Returns:
255
+ The longest chain length; ``0`` for an empty backlog.
256
+ """
257
+ memo: dict[str, int] = {}
258
+
259
+ def depth(node: str, on_path: set[str]) -> int:
260
+ if node in memo:
261
+ return memo[node]
262
+ if node in on_path: # cycle guard
263
+ return 0
264
+ on_path.add(node)
265
+ d = 1 + max((depth(x, on_path) for x in deps[node]), default=0)
266
+ on_path.discard(node)
267
+ memo[node] = d
268
+ return d
269
+
270
+ return max((depth(n, set()) for n in by_id), default=0)
271
+
272
+
273
+ def compute_topology(items: list[dict]) -> dict:
274
+ """Compute dependency-topology metrics + advisory warnings (REQ-TOPO-01..03).
275
+
276
+ Pure function over the runner's item array (single data source, decision
277
+ V-007) — it never reads ``backlog.json`` off disk, so every derived count
278
+ cites the runner's authoritative array (REQ-ATTR-01, REQ-OBS-01). Linear via
279
+ the memoized DFS helpers above (REQ-PERF-01).
280
+
281
+ Args:
282
+ items: The runner's ``listCommand`` item array. Each item may carry
283
+ ``id``, ``dependsOn`` (list of ids), and ``status`` (``pending``/
284
+ ``done``/``blocked``/…).
285
+
286
+ Returns:
287
+ The ``backlog-topology`` output shape (without ``clusters`` — that is
288
+ appended by the verb under ``--cluster``): ``{itemCount, rootCount,
289
+ roots, maxChainDepth, selectable, starvation, warnings}``.
290
+ """
291
+ by_id, deps, dependents = _build_dep_index(items)
292
+ item_count = len(by_id)
293
+ gated = _transitive_dependents(dependents)
294
+
295
+ roots = [i for i in by_id if not deps[i]] # no in-backlog dependsOn edges
296
+ roots_out = sorted(
297
+ (
298
+ {
299
+ "id": r,
300
+ "gatedCount": len(gated[r]),
301
+ "gatedIds": sorted(gated[r], key=_id_key),
302
+ }
303
+ for r in roots
304
+ ),
305
+ key=lambda row: _id_key(row["id"]),
306
+ )
307
+
308
+ max_depth = _max_chain_depth(by_id, deps)
309
+
310
+ selectable = sum(
311
+ 1
312
+ for i, it in by_id.items()
313
+ if it.get("status") == "pending"
314
+ and all(by_id[d].get("status") == "done" for d in deps[i])
315
+ )
316
+ pending = sum(1 for it in by_id.values() if it.get("status") == "pending")
317
+
318
+ fanout_threshold = math.ceil(TOPOLOGY_FANOUT_WARN_RATIO * item_count)
319
+ depth_threshold = math.ceil(TOPOLOGY_DEPTH_WARN_RATIO * item_count)
320
+
321
+ # A trivial graph (0-1 items, or no dependsOn edges at all) has no topology
322
+ # to warn about — a single node's depth of 1 would otherwise trip the
323
+ # ceil(0.5 * 1) = 1 depth threshold on every one-item backlog.
324
+ warnings: list[str] = []
325
+ if item_count > 1 and any(deps[i] for i in by_id):
326
+ if any(row["gatedCount"] >= fanout_threshold for row in roots_out):
327
+ warnings.append("single-root-fanout")
328
+ if max_depth >= depth_threshold:
329
+ warnings.append("chain-depth")
330
+
331
+ starvation = None
332
+ if selectable == 0 and pending > 0:
333
+ starvation = {
334
+ "starved": True,
335
+ "blockingRoots": [
336
+ {"id": row["id"], "gatedCount": row["gatedCount"]}
337
+ for row in roots_out
338
+ if row["gatedCount"] > 0 and by_id[row["id"]].get("status") != "done"
339
+ ],
340
+ }
341
+
342
+ return {
343
+ "itemCount": item_count,
344
+ "rootCount": len(roots),
345
+ "roots": roots_out,
346
+ "maxChainDepth": max_depth,
347
+ "selectable": selectable,
348
+ "starvation": starvation,
349
+ "warnings": warnings,
350
+ }
351
+
352
+
353
+ def cmd_backlog_topology(items: list[dict], *, with_clusters: bool) -> dict:
354
+ """Assemble the ``backlog-topology`` payload.
355
+
356
+ Args:
357
+ items: The runner's ``listCommand`` item array.
358
+ with_clusters: When true, append the ``clusters`` section.
359
+
360
+ Returns:
361
+ The topology dict; with ``clusters`` appended iff ``with_clusters``.
362
+ """
363
+ result = compute_topology(items)
364
+ if with_clusters:
365
+ result["clusters"] = cluster_blocked(items)
366
+ return result
367
+
368
+
369
+ def _load_topology_items(args: argparse.Namespace) -> list[dict]:
370
+ """Read and parse the runner item array for ``backlog-topology``.
371
+
372
+ Accepts either a top-level JSON array or an object with an ``items`` array
373
+ (rauf ``backlog list --json`` emits the array; the object form is tolerated
374
+ for forward-compatibility). All failures raise ``UsageError`` → exit 2,
375
+ never a partial/guessed result. This is the ONLY input path for the
376
+ topology verb — it never opens ``backlog.json`` off disk (single data
377
+ source, decision V-007).
378
+
379
+ Args:
380
+ args: Parsed namespace with ``items_stdin`` / ``items_json``.
381
+
382
+ Returns:
383
+ The item list.
384
+
385
+ Raises:
386
+ UsageError: unreadable ``--items-json``, invalid JSON, or a shape that is
387
+ neither an array nor an object carrying an ``items`` array.
388
+ """
389
+ if args.items_stdin:
390
+ raw = sys.stdin.read()
391
+ else:
392
+ try:
393
+ raw = Path(args.items_json).read_text(encoding="utf-8")
394
+ except OSError as exc:
395
+ raise UsageError(f"cannot read --items-json {args.items_json}: {exc}") from exc
396
+ try:
397
+ data = json.loads(raw)
398
+ except json.JSONDecodeError as exc:
399
+ raise UsageError(f"invalid items JSON: {exc}") from exc
400
+ items = data.get("items", []) if isinstance(data, dict) else data
401
+ if not isinstance(items, list):
402
+ raise UsageError("items JSON must be an array or an object with an 'items' array")
403
+ return items
404
+
405
+
406
+ def _print_topology(payload: dict) -> None:
407
+ """Human-readable topology summary (machine consumers pass ``--json``)."""
408
+ print(
409
+ f"Topology: {payload['itemCount']} items, {payload['rootCount']} roots, "
410
+ f"max chain depth {payload['maxChainDepth']}, selectable {payload['selectable']}"
411
+ )
412
+ for row in sorted(payload["roots"], key=lambda r: -r["gatedCount"]):
413
+ print(f" root {row['id']} gates {row['gatedCount']} item(s)")
414
+ for warning in payload["warnings"]:
415
+ print(f" warning: {warning}")
416
+ starvation = payload.get("starvation")
417
+ if starvation:
418
+ blocking = ", ".join(r["id"] for r in starvation["blockingRoots"])
419
+ print(f" starved: no selectable item; blocking roots: {blocking}")
420
+ for cluster in payload.get("clusters", []):
421
+ members = ", ".join(cluster["memberIds"])
422
+ print(
423
+ f" cluster {cluster['clusterId']}: members {members} "
424
+ f"(gates {cluster['gatedCount']} item(s))"
425
+ )
426
+
427
+
428
+ __all__ = [
429
+ "CLUSTER_JACCARD_THRESHOLD",
430
+ "TOPOLOGY_FANOUT_WARN_RATIO",
431
+ "TOPOLOGY_DEPTH_WARN_RATIO",
432
+ "_id_key",
433
+ "_build_dep_index",
434
+ "_transitive_dependents",
435
+ "_normalize_reason",
436
+ "_jaccard",
437
+ "cluster_blocked",
438
+ "_max_chain_depth",
439
+ "compute_topology",
440
+ "cmd_backlog_topology",
441
+ "_load_topology_items",
442
+ "_print_topology",
443
+ ]
@@ -12,7 +12,7 @@ You are the navigator for the feature-forge development pipeline. Your job is to
12
12
 
13
13
  ### 1. Read Configuration
14
14
 
15
- Read and follow `references/shared-conventions.md` for configuration reading (feature name validation, config defaults, force mode).
15
+ Read and follow `references/shared-conventions.md` for configuration reading (feature name validation, config defaults, force mode) and, at rung 2/3, the Interaction Capability Ladder.
16
16
 
17
17
  ### 2. Determine Context
18
18
 
@@ -28,7 +28,7 @@ Read and follow `references/shared-conventions.md` for configuration reading (fe
28
28
 
29
29
  1. **Epics first.** Identify epic directories as any `{specsDir}/*/` that directly contains an `epic-manifest.json` **and no `.pipeline-state.json` of its own** (an epic root is never itself a feature). For each epic, run:
30
30
  ```bash
31
- 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')"
31
+ R="$(bash -c '[ -z "${FEATURE_FORGE_ROOT:-}" ] || [ -x "$FEATURE_FORGE_ROOT/scripts/forge-root.sh" ] || { echo "feature-forge: FEATURE_FORGE_ROOT=$FEATURE_FORGE_ROOT has no scripts/forge-root.sh" >&2; exit 2; }; for d in "${FEATURE_FORGE_ROOT:-}" "${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')"
32
32
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
33
33
  python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
34
34
  ```
@@ -36,7 +36,7 @@ python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specs
36
36
  2. **Standalone features below.** Scan the remaining `{specsDir}/*/` that directly contain a `.pipeline-state.json` **without** an `epic` back-pointer. A nested member's `.pipeline-state.json` is **attributed to its epic (Tier 1), never listed as a standalone feature**.
37
37
  - **Rank by recency.** Run the recency ranker so the most-recently-touched active feature is the default — the user rarely has to type a name (especially on mobile after a `/new`):
38
38
  ```bash
39
- 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')"
39
+ R="$(bash -c '[ -z "${FEATURE_FORGE_ROOT:-}" ] || [ -x "$FEATURE_FORGE_ROOT/scripts/forge-root.sh" ] || { echo "feature-forge: FEATURE_FORGE_ROOT=$FEATURE_FORGE_ROOT has no scripts/forge-root.sh" >&2; exit 2; }; for d in "${FEATURE_FORGE_ROOT:-}" "${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')"
40
40
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
41
41
  python3 "$R/scripts/forge-session.py" rank-features --specs-dir "{specsDir}" --json
42
42
  ```
@@ -101,7 +101,7 @@ After rendering a **per-feature** dashboard for an **active** pipeline (skip thi
101
101
 
102
102
  **2. Check the context window.** Run the context-usage helper so you can advise whether to continue here or start the next stage in a fresh session:
103
103
  ```bash
104
- 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')"
104
+ R="$(bash -c '[ -z "${FEATURE_FORGE_ROOT:-}" ] || [ -x "$FEATURE_FORGE_ROOT/scripts/forge-root.sh" ] || { echo "feature-forge: FEATURE_FORGE_ROOT=$FEATURE_FORGE_ROOT has no scripts/forge-root.sh" >&2; exit 2; }; for d in "${FEATURE_FORGE_ROOT:-}" "${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')"
105
105
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
106
106
  python3 "$R/scripts/forge-session.py" context-usage --json
107
107
  ```
@@ -141,7 +141,7 @@ This applies whether the feature was named explicitly (`/skill:forge {feature}`)
141
141
  When the named argument is an epic (`{specsDir}/{name}/epic-manifest.json` exists), render the epic dashboard instead of a per-feature one. Run:
142
142
 
143
143
  ```bash
144
- 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')"
144
+ R="$(bash -c '[ -z "${FEATURE_FORGE_ROOT:-}" ] || [ -x "$FEATURE_FORGE_ROOT/scripts/forge-root.sh" ] || { echo "feature-forge: FEATURE_FORGE_ROOT=$FEATURE_FORGE_ROOT has no scripts/forge-root.sh" >&2; exit 2; }; for d in "${FEATURE_FORGE_ROOT:-}" "${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')"
145
145
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
146
146
  python3 "$R/scripts/epic-manifest.py" render-status "{epic}" --specs-dir "{specsDir}" --json
147
147
  ```
@@ -183,7 +183,7 @@ All of this is reconstructed **purely from disk** — the manifest plus each mem
183
183
  If the user says something like "note: switching to jose for JWT" or "remember: we decided X", update the `notes` field by running `state-note` (below). This helps preserve context across session clears. Add `--epic "{epic}"` when the feature is an epic member — required, per the Pipeline State Protocol in `references/shared-conventions.md`.
184
184
 
185
185
  ```bash
186
- 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')"
186
+ R="$(bash -c '[ -z "${FEATURE_FORGE_ROOT:-}" ] || [ -x "$FEATURE_FORGE_ROOT/scripts/forge-root.sh" ] || { echo "feature-forge: FEATURE_FORGE_ROOT=$FEATURE_FORGE_ROOT has no scripts/forge-root.sh" >&2; exit 2; }; for d in "${FEATURE_FORGE_ROOT:-}" "${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')"
187
187
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
188
188
  python3 "$R/scripts/forge-session.py" state-note --feature "{feature}" --note "<what the user said>" --specs-dir "{specsDir}"
189
189
  ```
@@ -222,7 +222,7 @@ Support these sub-commands for pipeline lifecycle management:
222
222
 
223
223
  - Set the manifest's top-level `status` (`paused` / `active` / `abandoned`) via the helper's `set-status` mutator — an atomic write that also bumps `updatedAt`:
224
224
  ```bash
225
- 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')"
225
+ R="$(bash -c '[ -z "${FEATURE_FORGE_ROOT:-}" ] || [ -x "$FEATURE_FORGE_ROOT/scripts/forge-root.sh" ] || { echo "feature-forge: FEATURE_FORGE_ROOT=$FEATURE_FORGE_ROOT has no scripts/forge-root.sh" >&2; exit 2; }; for d in "${FEATURE_FORGE_ROOT:-}" "${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')"
226
226
  [ -n "$R" ] || { echo "feature-forge: cannot locate plugin root" >&2; exit 1; }
227
227
  python3 "$R/scripts/epic-manifest.py" set-status "{epic}" --status paused --specs-dir "{specsDir}"
228
228
  ```
@@ -245,6 +245,10 @@ When listing features, show active pipelines by default. Include a count of paus
245
245
  This Pi bundle preserves Claude's `AskUserQuestion` references because it ships a Pi compatibility extension registering an `AskUserQuestion` tool. On Pi:
246
246
 
247
247
  - **User input:** use `AskUserQuestion` for genuine user decisions. It supports multiple questions, option descriptions, recommended ordering, multi-select, previews, and free-form Other/custom answers.
248
- - **Skill dispatch:** Pi uses `/skill:<name>` commands. If you cannot invoke a skill directly, print the exact `/skill:<name> ...` command for the user to run.
248
+ - **Non-interactive (`-p`/`--mode json`):** `AskUserQuestion` is stripped from the tool list, so its absence alone cannot tell you the rung — read that from the Interaction Capability Ladder's `interaction-mode` record. A call attempted anyway fails with `Error: UI not available (running in non-interactive mode)` — never read that as a decline. Take the Interaction Capability Ladder's declared conservative default, state it in your output, and use `no-default: abort — <question> requires a human answer` for an interview question with no sane default (`references/shared-conventions.md`).
249
+ - **Skill dispatch:** Pi uses `/skill:<name>` commands. If you cannot invoke a skill directly, print the exact `/skill:<name> ...` command for the user to run. A **forge-invocation-args** compatibility extension wraps the arguments of a `/skill:forge-*` command in a `<feature-forge-invocation>` envelope before Pi expands it, so read the feature name from that envelope's `<arguments>` element (an empty element means none was supplied) rather than from unlabeled trailing text — see `references/shared-conventions.md` § Feature Name Requirement.
249
250
  - **Subagents:** this bundle declares its custom agents (`forge-researcher`, `forge-spec-writer`, `forge-verifier`) as package agents. If a `subagent` tool is registered, dispatch one with `{ agent: "forge-verifier", task: "..." }`, or fan several out concurrently with `{ tasks: [{ agent: "forge-spec-writer", task: "..." }, ...] }`. If no `subagent` tool is available, run that step inline yourself.
250
- - **Background / monitoring:** run long-lived commands in the foreground and report progress as it arrives.
251
+ - **Background / monitoring (forge-5-loop):** Pi has no built-in background bash, persistent monitor, or push-notification, so do **not** run the loop runner in the foreground and do **not** try to arm one. This bundle registers a **forge-loop-supervisor** extension that IS the "background-execution mechanism" and "monitoring mechanism" Steps 3b–3f refer to. Concretely:
252
+ - **Launch (Step 3b):** call **`forge_loop_launch`** with the backlog dir (and `review` / `agent` / `iterations` as resolved from config). It starts the loop **detached** — it runs in rauf's server and outlives this session — and returns immediately; you do not build or redirect a command yourself.
253
+ - **Supervise (Steps 3d–3f):** the extension then watches the runner's `events.ndjson` for you. It reports each completed item as one quiet line and **wakes this session automatically** on needs-human, blocked, stuck, review-failed, error, and completion — so do **not** arm a monitor, set a continuous tail, send a notification, poll, or foreground-sleep, and do not treat any manual stop as the terminal signal. When completion wakes you, go straight to Step 4 and read the authoritative counts with the status/list command. Use **`forge_loop_status`** to check progress on demand.
254
+ - **Stop / session end:** **`forge_loop_stop`** deliberately stops the runner; use it only when the user wants the loop to actually stop. Ending the Pi session does **not** stop the loop (it is detached), and the next session **reattaches automatically** without re-reporting what you already saw.