@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,355 @@
1
+ """The ``decision-*`` verbs: the ``forge-decisions.json`` reader/writer.
2
+
3
+ Carved out of the ``forge-session.py`` monolith (#279 P4.1). This module owns the
4
+ one persistent artifact the loop-recovery feature adds — ``forge-decisions.json`` —
5
+ and the three verbs that read and write it (``decision-record``, ``decision-list``,
6
+ ``decision-apply``). It is a pure move: verb names, flags, exit codes, and JSON
7
+ shapes are frozen, and the shim re-exports every symbol here so path-loaded tests
8
+ resolve them unchanged.
9
+
10
+ Every shared primitive it needs (``UsageError``, ``_now_iso``, ``_commit_state``,
11
+ ``resolve_loop_runner``) is imported FROM ``forge_session._common`` — never from the
12
+ shim, which would be a circular import. Stdlib only, 3.10 baseline, Google-style
13
+ docstrings, matching the conventions of the monolith it was carved out of.
14
+ """
15
+
16
+ from __future__ import annotations
17
+
18
+ import json
19
+ import socket
20
+ from pathlib import Path
21
+ from typing import Final
22
+
23
+ from forge_session._common import (
24
+ UsageError,
25
+ _commit_state,
26
+ _now_iso,
27
+ resolve_loop_runner,
28
+ )
29
+
30
+ #: The one persistent artifact this feature adds; only decision-* verbs write it.
31
+ DECISIONS_FILENAME: Final[str] = "forge-decisions.json"
32
+ #: Enum-locked at references/forge-decisions-schema.json; a bump is a breaking change.
33
+ DECISIONS_SCHEMA_VERSION: Final[str] = "1"
34
+
35
+
36
+ def _resolve_decisions_path(
37
+ backlog_dir: Path,
38
+ state_dir: str | None,
39
+ config_path: Path,
40
+ schema_path: Path,
41
+ ) -> Path:
42
+ """Resolve `{backlog_dir}/{stateDir}/forge-decisions.json`.
43
+
44
+ When ``state_dir`` is None, ``stateDir`` is taken from the effective loopRunner
45
+ config (schema default ``.rauf``) via ``resolve_loop_runner`` — the same resolver
46
+ the loop itself uses — so the record lands beside the runner's own state and is
47
+ covered by the ``**/.rauf/*`` ignore rule with zero ``.gitignore`` edits.
48
+
49
+ Args:
50
+ backlog_dir: The resolved backlog directory (e.g. ``specs/loop-recovery``).
51
+ state_dir: An explicit state-dir name, or None to resolve from config.
52
+ config_path: ``forge.config.json`` path (``_load_config`` tolerates absent).
53
+ schema_path: ``forge-config-schema.json`` path (source of the default).
54
+
55
+ Returns:
56
+ The resolved path to the decision record (its parent may not yet exist).
57
+ """
58
+ if state_dir is None:
59
+ resolved = resolve_loop_runner(config_path, schema_path)
60
+ state_dir = str(resolved["stateDir"])
61
+ return backlog_dir / state_dir / DECISIONS_FILENAME
62
+
63
+
64
+ def _read_decisions_for_write(path: Path, feature: str) -> dict:
65
+ """Load the decisions document for mutation, or seed a fresh one on first write.
66
+
67
+ A MISSING file is the first-write case → return a fresh skeleton whose parent
68
+ dir is created on commit. An UNPARSEABLE or non-object existing file is a HARD
69
+ failure (exit 2) — a write path must not inherit ``_read_state``'s corrupt→{}
70
+ tolerance, which would atomically replace a recoverable record with a
71
+ near-empty one.
72
+
73
+ Args:
74
+ path: The resolved decision-record path.
75
+ feature: The feature label to stamp on a first write (backlog dir basename).
76
+
77
+ Returns:
78
+ The loaded (or freshly-seeded) decisions document, ready to mutate.
79
+
80
+ Raises:
81
+ UsageError: The existing file is unreadable/unparseable or not a JSON object.
82
+ """
83
+ if not path.exists():
84
+ return {
85
+ "schemaVersion": DECISIONS_SCHEMA_VERSION,
86
+ "feature": feature,
87
+ "createdAt": _now_iso(),
88
+ "decisions": [],
89
+ }
90
+ try:
91
+ parsed = json.loads(path.read_text(encoding="utf-8"))
92
+ except (OSError, json.JSONDecodeError) as exc:
93
+ raise UsageError(f"unparseable decision record at {path}: {exc}") from exc
94
+ if not isinstance(parsed, dict):
95
+ raise UsageError(f"decision record at {path} is not a JSON object")
96
+ return parsed
97
+
98
+
99
+ def _new_decision_entry(
100
+ item_id: str,
101
+ question: str,
102
+ answer: str | None,
103
+ deferred: bool,
104
+ cluster_id: str | None,
105
+ actor: str,
106
+ ) -> dict:
107
+ """Build one decision entry conforming to references/forge-decisions-schema.json.
108
+
109
+ Args:
110
+ item_id: The backlog item the decision answers.
111
+ question: The needs-human question text (original text on a deferral).
112
+ answer: The operator's answer, or None for a deferral.
113
+ deferred: True iff this is a deferral / cancel-early entry.
114
+ cluster_id: Shared clusterId for a consolidated decision, or None.
115
+ actor: The session/actor label for ``recordedBy`` (never user identity).
116
+
117
+ Returns:
118
+ A dict carrying all eight required fields (``appliedAt``/``appliedBy`` null),
119
+ plus ``clusterId`` when supplied.
120
+ """
121
+ entry: dict = {
122
+ "itemId": item_id,
123
+ "question": question,
124
+ "answer": answer,
125
+ "deferred": deferred,
126
+ "decidedAt": _now_iso(),
127
+ "recordedBy": actor,
128
+ "appliedAt": None,
129
+ "appliedBy": None,
130
+ }
131
+ if cluster_id is not None:
132
+ entry["clusterId"] = cluster_id
133
+ return entry
134
+
135
+
136
+ def _default_actor() -> str:
137
+ """Return the default recordedBy/appliedBy label: ``forge-5-loop@<host>``.
138
+
139
+ The host segment is a machine label, not a user identity (REQ-SEC-01).
140
+ """
141
+ return f"forge-5-loop@{socket.gethostname()}"
142
+
143
+
144
+ def _unapplied_decisions(decisions: list[dict]) -> list[dict]:
145
+ """Return the latest entry per itemId whose ``appliedAt`` is None (REQ-DEC-05).
146
+
147
+ Walks entries in stored (append) order keeping the LAST entry seen per itemId,
148
+ then keeps only those still unapplied. Deferrals (never applied) are included
149
+ (REQ-DEC-06); an item whose latest entry is applied drops out; a later
150
+ per-item entry supersedes an earlier consolidated (clusterId) one for that item
151
+ only (REQ-DEC-07). Output is sorted by itemId for deterministic reporting.
152
+
153
+ Args:
154
+ decisions: The document's ``decisions`` array, in stored order.
155
+
156
+ Returns:
157
+ The unapplied entries, one per item, sorted by ``itemId``.
158
+ """
159
+ latest: dict[str, dict] = {}
160
+ for entry in decisions:
161
+ latest[entry["itemId"]] = entry
162
+ return [
163
+ entry for _item_id, entry in sorted(latest.items())
164
+ if entry.get("appliedAt") is None
165
+ ]
166
+
167
+
168
+ def cmd_decision_record(
169
+ backlog_dir: Path,
170
+ item_ids: list[str],
171
+ question: str,
172
+ answer: str | None,
173
+ deferred: bool,
174
+ cluster_id: str | None,
175
+ actor: str,
176
+ state_dir: str | None,
177
+ config_path: Path,
178
+ schema_path: Path,
179
+ ) -> dict:
180
+ """Append one needs-human decision entry per ``--item`` (append-only).
181
+
182
+ Records a decision at the moment it is collected (REQ-DEC-01), on EVERY branch:
183
+ an answered decision (``--answer``), and a deferral or cancel-early
184
+ (``--deferred`` → ``answer: null``, REQ-DEC-06). With ``--cluster`` the per-item
185
+ entries of ONE consolidated decision share a ``clusterId`` (REQ-CLU-04) yet stay
186
+ independently re-decidable (REQ-DEC-07). The file and its
187
+ ``schemaVersion``/``feature``/``createdAt`` stamp are created on first write.
188
+ Existing entries are never mutated (append-only).
189
+
190
+ Args:
191
+ backlog_dir: The resolved backlog directory; its basename stamps ``feature``.
192
+ item_ids: One or more backlog item ids; one entry is appended per id.
193
+ question: The needs-human question text (original text on a deferral).
194
+ answer: The operator's answer, or None for a deferral.
195
+ deferred: True iff this is a deferral / cancel-early entry.
196
+ cluster_id: Shared ``clusterId`` for a consolidated decision, or None.
197
+ actor: Session/actor label for ``recordedBy`` (never user identity).
198
+ state_dir: State-dir name override, or None to resolve from config.
199
+ config_path: ``forge.config.json`` path (for the stateDir default).
200
+ schema_path: ``forge-config-schema.json`` path (source of the default).
201
+
202
+ Returns:
203
+ The mutated decisions document (for the ``--json`` echo).
204
+
205
+ Raises:
206
+ UsageError: Missing backlog dir; both/neither of ``--answer``/``--deferred``;
207
+ an unparseable existing record; or a failed atomic write (→ exit 2).
208
+ """
209
+ # Defense in depth: the argparse mutually-exclusive group rejects both/neither
210
+ # first, but a direct call must fail the same way. Valid states are exactly
211
+ # (answered, not deferred) or (deferred, no answer).
212
+ if deferred == (answer is not None):
213
+ raise UsageError("exactly one of --answer or --deferred is required")
214
+ if not backlog_dir.is_dir():
215
+ raise UsageError(f"no backlog directory at {backlog_dir}")
216
+
217
+ path = _resolve_decisions_path(backlog_dir, state_dir, config_path, schema_path)
218
+ doc = _read_decisions_for_write(path, backlog_dir.resolve().name)
219
+ for item_id in item_ids:
220
+ doc["decisions"].append(
221
+ _new_decision_entry(item_id, question, answer, deferred, cluster_id, actor)
222
+ )
223
+ path.parent.mkdir(parents=True, exist_ok=True)
224
+ return _commit_state(path, doc)
225
+
226
+
227
+ def cmd_decision_list(
228
+ backlog_dir: Path,
229
+ unapplied: bool,
230
+ state_dir: str | None,
231
+ config_path: Path,
232
+ schema_path: Path,
233
+ ) -> dict:
234
+ """Read the decision record back — the full log, or the unapplied set.
235
+
236
+ With ``--unapplied`` returns the REQ-DEC-05 set (``_unapplied_decisions``).
237
+ Without it, echoes the full on-disk document. A missing record returns an
238
+ empty result at exit 0 (nothing recorded yet is not a failure). This verb
239
+ never mutates the file; it parses an existing record **strictly** (exit 2 on
240
+ corruption) for both the plain and ``--unapplied`` forms — it never
241
+ downgrades a corrupt record to ``{}``.
242
+
243
+ Args:
244
+ backlog_dir: The resolved backlog directory.
245
+ unapplied: Return only the latest-unapplied-per-item set.
246
+ state_dir: State-dir name override, or None to resolve from config.
247
+ config_path: ``forge.config.json`` path (for the stateDir default).
248
+ schema_path: ``forge-config-schema.json`` path (source of the default).
249
+
250
+ Returns:
251
+ On a plain read: the full document ``{schemaVersion, feature, createdAt,
252
+ updatedAt, decisions}`` (or ``{"decisions": []}`` when none recorded).
253
+ On ``--unapplied``: a report view ``{"feature", "unapplied": [...],
254
+ "count": N}`` (NOT the on-disk shape; it is never written).
255
+
256
+ Raises:
257
+ UsageError: Missing backlog dir, or an unparseable existing record (→ exit 2).
258
+ """
259
+ if not backlog_dir.is_dir():
260
+ raise UsageError(f"no backlog directory at {backlog_dir}")
261
+ path = _resolve_decisions_path(backlog_dir, state_dir, config_path, schema_path)
262
+
263
+ if not path.exists():
264
+ return {"feature": backlog_dir.resolve().name, "unapplied": [], "count": 0} \
265
+ if unapplied else {"decisions": []}
266
+
267
+ try:
268
+ doc = json.loads(path.read_text(encoding="utf-8"))
269
+ except (OSError, json.JSONDecodeError) as exc:
270
+ raise UsageError(f"unparseable decision record at {path}: {exc}") from exc
271
+
272
+ if not unapplied:
273
+ return doc
274
+ pending = _unapplied_decisions(doc.get("decisions", []))
275
+ return {"feature": doc.get("feature"), "unapplied": pending, "count": len(pending)}
276
+
277
+
278
+ def cmd_decision_apply(
279
+ backlog_dir: Path,
280
+ item_id: str,
281
+ actor: str,
282
+ state_dir: str | None,
283
+ config_path: Path,
284
+ schema_path: Path,
285
+ ) -> dict:
286
+ """Stamp ``appliedAt``/``appliedBy`` on the LATEST entry for ``item_id``.
287
+
288
+ Append-only mutation (REQ-DEC-07): only the most recent entry for the item is
289
+ touched, and only its ``appliedAt`` (→ ``_now_iso()``) and ``appliedBy``
290
+ (→ ``actor``) fields. Called by the Post-Run Recovery Procedure only AFTER
291
+ the runner apply for the item succeeded, so the record's applied state
292
+ tracks the runner's (REQ-UNB-01).
293
+
294
+ Args:
295
+ backlog_dir: The resolved backlog directory.
296
+ item_id: The backlog item whose latest decision to stamp applied.
297
+ actor: The session/actor label for ``appliedBy``.
298
+ state_dir: State-dir name override, or None to resolve from config.
299
+ config_path: ``forge.config.json`` path (for the stateDir default).
300
+ schema_path: ``forge-config-schema.json`` path (source of the default).
301
+
302
+ Returns:
303
+ The mutated decisions document (for the ``--json`` echo).
304
+
305
+ Raises:
306
+ UsageError: Missing backlog dir; no decision recorded for the item; the
307
+ item's latest entry is already applied (nothing unapplied); an
308
+ unparseable record; or a failed atomic write (→ exit 2).
309
+ """
310
+ if not backlog_dir.is_dir():
311
+ raise UsageError(f"no backlog directory at {backlog_dir}")
312
+ path = _resolve_decisions_path(backlog_dir, state_dir, config_path, schema_path)
313
+ doc = _read_decisions_for_write(path, backlog_dir.resolve().name)
314
+
315
+ latest_index: int | None = None
316
+ for index, entry in enumerate(doc["decisions"]):
317
+ if entry["itemId"] == item_id:
318
+ latest_index = index # keep the LAST match — stored order is chronological
319
+ if latest_index is None:
320
+ raise UsageError(f"no decision recorded for item {item_id!r}")
321
+ entry = doc["decisions"][latest_index]
322
+ if entry["appliedAt"] is not None:
323
+ raise UsageError(
324
+ f"latest decision for item {item_id!r} is already applied "
325
+ f"(at {entry['appliedAt']}) — nothing unapplied"
326
+ )
327
+
328
+ entry["appliedAt"] = _now_iso()
329
+ entry["appliedBy"] = actor
330
+ path.parent.mkdir(parents=True, exist_ok=True)
331
+ return _commit_state(path, doc)
332
+
333
+
334
+ def _print_decision_record(doc: dict) -> None:
335
+ """One-line human summary for ``decision-record``."""
336
+ print(f"decision recorded — {len(doc['decisions'])} entr"
337
+ f"{'y' if len(doc['decisions']) == 1 else 'ies'} on record for {doc['feature']}")
338
+
339
+
340
+ def _print_decision_list(view: dict) -> None:
341
+ """One-line-per-entry human summary for ``decision-list``."""
342
+ if "unapplied" in view:
343
+ print(f"{view['count']} unapplied decision(s)")
344
+ for entry in view["unapplied"]:
345
+ kind = "deferred" if entry["deferred"] else "answered"
346
+ print(f" {entry['itemId']}: {kind} — {entry['question']}")
347
+ else:
348
+ print(f"{len(view.get('decisions', []))} decision(s) on record")
349
+
350
+
351
+ def _print_decision_apply(doc: dict) -> None:
352
+ """One-line human summary naming the just-applied entry (max appliedAt)."""
353
+ applied = [d for d in doc["decisions"] if d["appliedAt"] is not None]
354
+ entry = max(applied, key=lambda d: d["appliedAt"])
355
+ print(f"applied decision for item {entry['itemId']} ({entry['appliedBy']})")