@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,32 @@
1
+ ---
2
+ name: pattern-vacuous-self-reading-tests
3
+ description: Tests that read their own source file are near-always vacuous unless they assert absence or scope the read; verify by a PROPERTY-PRESERVING mutation and check WHICH line goes red
4
+ metadata:
5
+ type: reference
6
+ ---
7
+
8
+ A drift-guard test that does `source = read(Path(__file__).resolve())` and then asserts a
9
+ **positive** substring is almost always vacuous: the searched literal sits on the assert
10
+ line itself, so the whole-file read satisfies it unconditionally.
11
+
12
+ **Why:** the trap catches even the *fix* for a prior vacuity finding, which often
13
+ reproduces the identical defect while its own inline comment claims "this reads for a
14
+ DIFFERENT string than the one it writes". The fix pass validates it with a mutation that
15
+ changes a second property at the same time — replacing a derived roster with a *shrunken*
16
+ hardcoded list goes red, but at a pre-existing floor assertion (`len(...) >= MIN`), not at
17
+ the assertion under test. Seeing "red" is taken as proof; a roster-**preserving** hardcode
18
+ leaves the test fully green.
19
+
20
+ **How to apply:**
21
+
22
+ - Grep every changed test for `read(Path(__file__)` / `inspect.getsource`. For each,
23
+ locate the searched literal's occurrences in the file. Two occurrences (guarded site +
24
+ assert line) = vacuous.
25
+ - Never accept "the mutation went red". Demand the **line number** of the failing
26
+ assertion, and design the mutation to change exactly one property.
27
+ - Acceptable forms: assert **absence** (write the banned tokens without the syntax that
28
+ makes them live), or scope the read away from the guarding test's own body
29
+ (`inspect.getsource(<the guarded function>)`). The best form for "this expression is
30
+ still derived" is an `ast` parse, which the assertion's own text cannot satisfy.
31
+
32
+ See [[pattern-postfix-reverify]] and [[pattern-mechanical-rewrite-damage]].
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "feature-forge",
3
- "version": "0.18.0",
3
+ "version": "0.20.0",
4
4
  "agent": "pi",
5
5
  "generatedBy": "python3 scripts/build-adapters.py"
6
6
  }
@@ -28,10 +28,11 @@ You have READ-ONLY access. You cannot and should not modify any files. Your outp
28
28
  ## How You Work
29
29
 
30
30
  1. Read the pipeline state file to understand what stage the feature is at
31
- 2. Load all relevant artifacts for the current verification mode
32
- 3. Read **only your dispatched mode's checklist** — `references/verification-checklists/{mode}.md` (the parent's dispatch prompt names your `{mode}`) — and execute every check in it. Do **not** read the other five mode files or `references/findings-template.md`; those are for other modes and for the parent orchestrator respectively.
33
- 4. Return structured findings as your response in the Output Format specified below
34
- 5. Generate a fix plan suitable for a fresh agent to execute
31
+ 2. Read the shipped verifier-patterns index — `references/verifier-patterns/MEMORY.md` — and open the patterns your dispatched mode makes relevant. These are the versioned, reviewed heuristics that ship with the pipeline (see "Using Your Memory" for how they relate to your per-project memory).
32
+ 3. Load all relevant artifacts for the current verification mode
33
+ 4. Read **only your dispatched mode's checklist** — `references/verification-checklists/{mode}.md` (the parent's dispatch prompt names your `{mode}`) — and execute every check in it. Do **not** read the other five mode files or `references/findings-template.md`; those are for other modes and for the parent orchestrator respectively.
34
+ 5. Return structured findings as your response in the Output Format specified below
35
+ 6. Generate a fix plan suitable for a fresh agent to execute
35
36
 
36
37
  ## Scoped / Parallel Operation
37
38
 
@@ -47,7 +48,17 @@ For large spec suites (>8 documents), process verification in phases: load share
47
48
 
48
49
  ## Using Your Memory
49
50
 
50
- You have persistent memory in your `MEMORY.md` file. Use it to track:
51
+ You draw on two distinct layers, and they must not be confused:
52
+
53
+ - **Shipped verifier patterns** (`references/verifier-patterns/`) — versioned, reviewed
54
+ heuristics that ship with the pipeline to every project. Read the index
55
+ (`references/verifier-patterns/MEMORY.md`) on start. **Treat these as read-only** — they
56
+ are canon, not your scratch memory; a genuinely new, general heuristic worth shipping is
57
+ a change proposed in review, not something you write here at run time.
58
+ - **Per-project memory** (`memory: project`, below) — your own accumulating notes about
59
+ *this* project's specific blind spots, conventions, and confirmed false positives.
60
+
61
+ You have persistent per-project memory in your `MEMORY.md` file. Use it to track:
51
62
 
52
63
  - **Recurring patterns**: If you keep finding the same type of gap across features, note it. Over time you'll learn this project's blind spots.
53
64
  - **Project conventions**: As you review more specs, capture conventions that should be consistent (naming patterns, error handling approaches, test strategies).
@@ -0,0 +1,106 @@
1
+ # forge-invocation-args (Pi compatibility extension)
2
+
3
+ First-party feature-forge extension that deterministically preserves the arguments
4
+ supplied to `/skill:forge-*` commands on the Pi host. Fixes
5
+ [issue #303](https://github.com/garygentry/feature-forge/issues/303).
6
+
7
+ ## The problem it works around
8
+
9
+ Pi expands `/skill:<name> <args>` by appending the raw argument string after the
10
+ skill body. Pi's documentation says arguments arrive as `User: <args>`, but the
11
+ implementation appends them with only a bare `\n\n` separator and **no semantic
12
+ boundary**:
13
+
14
+ ```text
15
+ </skill>
16
+
17
+ rendered-model-v2
18
+ ```
19
+
20
+ So `/skill:forge-1-prd rendered-model-v2` reaches the model with the feature name
21
+ as unlabeled trailing text. A model can read it as metadata or unrelated prose and
22
+ wrongly trigger feature-forge's canonical "no feature name → STOP and ask" rule
23
+ (`references/shared-conventions.md` § Feature Name Requirement). Because the feature
24
+ name keys **directory resolution**, **branch naming**, and every
25
+ **`.pipeline-state.json`** write, losing it silently is high-impact — not cosmetic.
26
+
27
+ This is an upstream Pi implementation/documentation mismatch:
28
+
29
+ - Prior to Pi commit `7868b25a2` (*"make skill invocation messages collapsible"*),
30
+ expansion used `` `${skillMessage}\n\n---\n\nUser: ${args}` ``.
31
+ - That commit changed it to `` `${skillBlock}\n\n${args}` `` — dropping the `User:`
32
+ boundary.
33
+ - The behavior began in Pi **v0.50.0** and is still present in
34
+ `@earendil-works/pi-coding-agent` **0.84.4** (the version this adapter builds
35
+ against) and **0.85.1** (latest tested).
36
+
37
+ Restoring `User:` upstream would fix today's formatting, but feature-forge should
38
+ not depend on model inference of an undocumented prompt layout. This extension is
39
+ host-compatibility hardening that remains useful even after an upstream fix.
40
+
41
+ ## How it works
42
+
43
+ Pi's `input` event fires **before** skill/template expansion (and after
44
+ extension-command dispatch; `/skill:` is not an extension command, so it reaches
45
+ us). The extension registers one `input` handler that, for a `/skill:forge*`
46
+ invocation, rewrites the input to inject a versioned envelope, then lets Pi's
47
+ built-in expansion append it as the skill's arguments:
48
+
49
+ ```xml
50
+ <feature-forge-invocation version="1">
51
+ <skill>forge-1-prd</skill>
52
+ <arguments>rendered-model-v2</arguments>
53
+ </feature-forge-invocation>
54
+ ```
55
+
56
+ The forge skill bodies read the feature name from `<arguments>`. An empty element
57
+ means no argument was supplied — for a skill that requires a feature name that means
58
+ STOP and ask; the `forge` navigator (optional argument) proceeds as usual. That
59
+ companion rule lives host-neutrally in `references/shared-conventions.md`.
60
+
61
+ ### Design decisions
62
+
63
+ - **Inject-into-args, not own-expansion.** The handler returns
64
+ `{ action: "transform", text: "/skill:<name> <envelope>" }` and lets Pi expand
65
+ the skill. Verified against Pi's `_expandSkillCommand`
66
+ (`dist/core/agent-session.js`): the skill name is the text up to the first space,
67
+ and args are the **entire remainder** (newlines preserved), end-trimmed — so a
68
+ multiline envelope survives re-parse. This avoids replicating Pi's private
69
+ skill-block wrapper string, which can drift across versions.
70
+ - **XML entity-escaping** of `&`, `<`, `>` in `<arguments>`. Total, lossless, and
71
+ collision-proof: a literal `</arguments>` in the raw args becomes
72
+ `&lt;/arguments&gt;` and cannot close the element. Flags, quotes, and multiline
73
+ text pass through unchanged.
74
+ - **Always emit the envelope** for a matched command (empty `<arguments>` for zero
75
+ args) so the contract is uniform and deterministic.
76
+ - **Skip `source: "extension"`.** Messages injected via `sendUserMessage` are
77
+ dispatched with `expandPromptTemplates: false` and never expand — there is no
78
+ boundary bug to fix, and rewriting them could corrupt a programmatic message.
79
+ `"interactive"` and `"rpc"` (including `-p` / `--mode json`) do expand and are
80
+ normalized.
81
+ - **Fail loudly, never silently.** A thrown input handler makes the Pi runner fall
82
+ back to the *original untransformed* text — silently reintroducing the bug. On any
83
+ internal error the handler emits `ctx.ui.notify(..., "error")` and passes the
84
+ input through unchanged instead of throwing.
85
+ - **Idempotent.** Input handlers chain; an already-enveloped invocation is left
86
+ untouched (never double-wrapped).
87
+
88
+ ## Supported Pi API / version assumptions
89
+
90
+ - Requires the documented `input` event with `{ action: "transform" }`
91
+ (`pi.on("input", …)`), present in the pinned `@earendil-works/pi-coding-agent`
92
+ `^0.81.1` and confirmed through 0.85.1.
93
+ - Depends only on Pi's **documented** contract that a skill command's arguments are
94
+ the remainder of the input after the command name — not on the specific
95
+ (buggy/unstable) way Pi separates them from the skill body. If a future Pi stops
96
+ treating the remainder as args, switch to owning expansion (replicating the
97
+ skill-block wrapper); until then, inject-into-args is the smaller-surface choice.
98
+
99
+ ## Tests
100
+
101
+ `../../test/forge-invocation-args.test.mjs` (run by `npm run verify` in
102
+ `adapter-src/pi`) loads the extension through jiti — the same loader Pi uses —
103
+ asserts it registers exactly one `input` handler, and drives that handler across
104
+ the documented input-before-skill-expansion lifecycle (zero/one/multiple args,
105
+ flags, multiline, XML-special characters, non-forge passthrough, `source`
106
+ routing, and idempotency).
@@ -0,0 +1,31 @@
1
+ // GENERATED — DO NOT EDIT. Source: adapter-src/pi/extensions/forge-invocation-args/index.ts
2
+ // Regenerate with: python3 scripts/build-adapters.py
3
+ /**
4
+ * forge-invocation-args — a first-party Pi compatibility extension that gives
5
+ * `/skill:forge-*` invocation arguments an explicit, versioned semantic boundary
6
+ * before Pi's skill expansion drops it (issue #303). See wiring.ts for the full
7
+ * rationale and mechanics.
8
+ *
9
+ * The pi-facing glue is thin: all logic lives in the injectable {@link
10
+ * createExtension} factory (wiring.ts), unit-tested with a fake pi. This file
11
+ * adapts the real ExtensionAPI to the structural PiLike the wiring consumes — each
12
+ * member is accessed by name off the concrete `pi`, so a method renamed or removed
13
+ * in a future pi is a COMPILE error here rather than a silent runtime failure.
14
+ */
15
+
16
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
17
+
18
+ import { createExtension, type InputResult, type PiLike } from "./wiring.js";
19
+
20
+ export default function (pi: ExtensionAPI) {
21
+ const piLike: PiLike = {
22
+ on: (event, handler) =>
23
+ (
24
+ pi.on as unknown as (
25
+ e: string,
26
+ h: (ev: unknown, ctx: unknown) => InputResult | Promise<InputResult>,
27
+ ) => void
28
+ )(event, handler as (ev: unknown, ctx: unknown) => InputResult | Promise<InputResult>),
29
+ };
30
+ createExtension(piLike);
31
+ }
@@ -0,0 +1,172 @@
1
+ // GENERATED — DO NOT EDIT. Source: adapter-src/pi/extensions/forge-invocation-args/wiring.ts
2
+ // Regenerate with: python3 scripts/build-adapters.py
3
+ /**
4
+ * Pi wiring for forge-invocation-args — the injectable, unit-testable core of the
5
+ * extension. All logic lives here behind a structural {@link PiLike} so the whole
6
+ * thing is driven by a fake pi in test (mirroring how forge-loop-supervisor is
7
+ * tested headlessly). index.ts supplies the real ExtensionAPI.
8
+ *
9
+ * WHY THIS EXISTS (issue #303): Pi expands `/skill:<name> <args>` by appending the
10
+ * raw args after the `</skill>` block with only a bare `\n\n` separator — no
11
+ * semantic boundary. Pi's docs say args arrive as `User: <args>`, but the
12
+ * implementation has bare-appended since Pi v0.50.0 (commit 7868b25a2), true
13
+ * through the installed 0.84.4 and tested 0.85.1. With no boundary, a model can
14
+ * read a forge feature-name argument as trailing prose and wrongly trip
15
+ * feature-forge's "no feature name → STOP and ask" rule. The feature name keys
16
+ * directory resolution, branch naming, and every pipeline-state write, so losing
17
+ * it silently is high-impact.
18
+ *
19
+ * THE FIX: hook Pi's `input` event, which fires BEFORE skill/template expansion
20
+ * (and after extension-command dispatch — `/skill:` is not an extension command,
21
+ * so it reaches us). For a `/skill:forge*` invocation we rewrite the input to
22
+ * `/skill:<name> <envelope>`, wrapping the raw argument string in an explicit,
23
+ * versioned envelope. Pi then expands the skill and appends the envelope as args
24
+ * — verified against Pi's `_expandSkillCommand`: skill name is the text up to the
25
+ * first space, args are the ENTIRE remainder (newlines preserved) end-trimmed, so
26
+ * a multiline entity-escaped envelope survives re-parse. We keep Pi's built-in
27
+ * expansion rather than replicating its private skill-block wrapper (which would
28
+ * drift across versions).
29
+ *
30
+ * pi surface used: `pi.on("input", handler)` returning an `InputEventResult`
31
+ * (`continue` | `transform`), and `ctx.ui.notify` for the fail-loud path.
32
+ */
33
+
34
+ /** The envelope element name and its schema version. Consumers (the forge skill
35
+ * bodies, via references/shared-conventions.md) read the feature name from
36
+ * <arguments> and treat an empty element as "no feature name supplied". */
37
+ export const ENVELOPE_TAG = "feature-forge-invocation";
38
+ export const ENVELOPE_VERSION = "1";
39
+
40
+ /** Pi's skill-command prefix. Pi expands `/skill:<name> <args>` only when the
41
+ * text starts with this literal at index 0 (verified in agent-session.js
42
+ * `_expandSkillCommand`), and package skills register un-namespaced — the
43
+ * command is `/skill:forge-1-prd`, never `/skill:<pkg>:forge-1-prd`. */
44
+ const SKILL_PREFIX = "/skill:";
45
+
46
+ /** A feature-forge skill NAME (not the whole command): `forge` or `forge-<...>`.
47
+ * Applied to the name Pi itself would parse out (text up to the first space), so
48
+ * our match set is exactly Pi's expansion set — no more, no less. Anchored end
49
+ * (`$`) so `forgery` is not matched. */
50
+ const FORGE_NAME_RE = /^forge(?:-[a-z0-9-]+)?$/;
51
+
52
+ /** Result subset this extension ever returns (a strict subset of Pi's
53
+ * InputEventResult — we never return `handled`, which would skip the agent). */
54
+ export type InputResult = { action: "continue" } | { action: "transform"; text: string };
55
+
56
+ interface InputEventLike {
57
+ text: string;
58
+ source?: string;
59
+ streamingBehavior?: string;
60
+ }
61
+ interface UiLike {
62
+ notify?(message: string, level?: "info" | "warning" | "error"): void;
63
+ }
64
+ interface CtxLike {
65
+ ui?: UiLike;
66
+ }
67
+
68
+ /** Minimal structural shape of the pi API this wiring needs. Kept loose so the
69
+ * fake pi in tests satisfies it without importing pi; index.ts adapts the real
70
+ * ExtensionAPI to it (a renamed/removed `on` becomes a compile error there). */
71
+ export interface PiLike {
72
+ on(
73
+ event: string,
74
+ handler: (event: InputEventLike, ctx: CtxLike) => InputResult | Promise<InputResult>,
75
+ ): void;
76
+ }
77
+
78
+ /** Entity-escape the three XML metacharacters. Total and lossless: every input is
79
+ * representable, and a literal `</arguments>` in the raw args becomes
80
+ * `&lt;/arguments&gt;`, which cannot close the real element (no injection). `&`
81
+ * must be replaced first so already-escaped output is not double-escaped. Flags,
82
+ * quotes, and newlines pass through untouched. */
83
+ export function escapeXml(value: string): string {
84
+ return value.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
85
+ }
86
+
87
+ /** Build the versioned invocation envelope for a matched forge skill. `skillName`
88
+ * is a kebab token (no escaping needed); `rawArgs` is entity-escaped. Zero args
89
+ * yields an empty <arguments> element — the deterministic "no feature name"
90
+ * signal. */
91
+ export function buildEnvelope(skillName: string, rawArgs: string): string {
92
+ return (
93
+ `<${ENVELOPE_TAG} version="${ENVELOPE_VERSION}">\n` +
94
+ ` <skill>${skillName}</skill>\n` +
95
+ ` <arguments>${escapeXml(rawArgs)}</arguments>\n` +
96
+ `</${ENVELOPE_TAG}>`
97
+ );
98
+ }
99
+
100
+ /** True only for a complete envelope this extension emits (open tag WITH the
101
+ * version attribute AND the matching close tag) — not merely any argument that
102
+ * happens to begin with the tag name. Keeps the idempotency guard from dropping
103
+ * the boundary on a legitimate arg like `<feature-forge-invocation> is a tag`. */
104
+ function isAlreadyEnveloped(rawArgs: string): boolean {
105
+ return (
106
+ rawArgs.startsWith(`<${ENVELOPE_TAG} version="`) && rawArgs.trimEnd().endsWith(`</${ENVELOPE_TAG}>`)
107
+ );
108
+ }
109
+
110
+ /**
111
+ * Pure normalization: given raw input text, return the transform (for a
112
+ * feature-forge skill command) or `continue` (for everything else). Exported for
113
+ * direct unit testing. The command is parsed EXACTLY as Pi's `_expandSkillCommand`
114
+ * does — the text must start with `/skill:` at index 0, the name is the text up to
115
+ * the first space (or the whole remainder if none), and args are the rest, trimmed
116
+ * — so our match set equals Pi's expansion set and the rewritten text re-expands
117
+ * identically. A name that is not a forge skill (or a `/skill:`-less prompt) is
118
+ * left untouched.
119
+ */
120
+ export function normalizeInput(text: string): InputResult {
121
+ if (!text.startsWith(SKILL_PREFIX)) return { action: "continue" };
122
+
123
+ const spaceIndex = text.indexOf(" ");
124
+ const skillName =
125
+ spaceIndex === -1 ? text.slice(SKILL_PREFIX.length) : text.slice(SKILL_PREFIX.length, spaceIndex);
126
+ if (!FORGE_NAME_RE.test(skillName)) return { action: "continue" };
127
+
128
+ const rawArgs = spaceIndex === -1 ? "" : text.slice(spaceIndex + 1).trim();
129
+
130
+ // Idempotency: input handlers chain (each sees the prior's output), and a
131
+ // resend could re-enter here. Never re-wrap an invocation we already enveloped.
132
+ if (isAlreadyEnveloped(rawArgs)) return { action: "continue" };
133
+
134
+ const envelope = buildEnvelope(skillName, rawArgs);
135
+ return { action: "transform", text: `/skill:${skillName} ${envelope}` };
136
+ }
137
+
138
+ /**
139
+ * Register the single `input` handler on `pi`. Returns nothing; all behavior is
140
+ * in the handler and the pure helpers above.
141
+ */
142
+ export function createExtension(pi: PiLike): void {
143
+ pi.on("input", (event, ctx) => {
144
+ // Only normalize user-typed ("interactive") and API ("rpc") input.
145
+ // Extension-injected messages ("extension", via sendUserMessage) are
146
+ // dispatched with expandPromptTemplates:false and never expand, so there is
147
+ // no boundary bug to fix — and rewriting a programmatic message could corrupt
148
+ // it. This mirrors Pi's own input-transform example.
149
+ if (event?.source === "extension") return { action: "continue" };
150
+
151
+ try {
152
+ return normalizeInput(event.text);
153
+ } catch (error) {
154
+ // Fail LOUDLY, never silently. A thrown input handler makes the Pi runner
155
+ // log the error and continue with the ORIGINAL untransformed text — which
156
+ // would silently reintroduce the dropped-argument bug this extension exists
157
+ // to prevent. So we surface it via notify and pass the input through
158
+ // unchanged rather than throwing. (Entity-escaping makes this path
159
+ // effectively unreachable; it is defense in depth.)
160
+ const message = error instanceof Error ? error.message : String(error);
161
+ try {
162
+ ctx?.ui?.notify?.(
163
+ `forge-invocation-args: could not normalize a /skill:forge invocation (${message}); passing it through unchanged.`,
164
+ "error",
165
+ );
166
+ } catch {
167
+ /* headless / no notify surface */
168
+ }
169
+ return { action: "continue" };
170
+ }
171
+ });
172
+ }
@@ -0,0 +1,90 @@
1
+ // GENERATED — DO NOT EDIT. Source: adapter-src/pi/extensions/forge-loop-supervisor/events.ts
2
+ // Regenerate with: python3 scripts/build-adapters.py
3
+ /**
4
+ * Event classification + display formatting — pure functions over one rauf event.
5
+ *
6
+ * The classification mirrors the coverage-complete filter the generic
7
+ * forge-5-loop contract arms on Claude (`Monitor` on events.ndjson): every
8
+ * terminal and exception state is surfaced (silence is never success), while
9
+ * routine milestones stay quiet. See rauf's event union in
10
+ * `packages/core/src/schemas.ts` for the authoritative field list.
11
+ */
12
+
13
+ import type { EventClass, RaufEvent } from "./types.js";
14
+
15
+ /** Events that mean "the run is over" — the supervisor wakes the session so the
16
+ * loop stage runs its post-run close-out (Steps 4–7), then stops watching. */
17
+ const TERMINAL = new Set(["loop_completed", "loop_error", "loop_cancelled"]);
18
+
19
+ /** Events a human must see immediately. `loop_paused` carries `reason` and only
20
+ * the needs-human pause is surfaced here (the runner sets the item aside and
21
+ * keeps going — it is not a full stop). Everything else in this set is an
22
+ * unconditional exception. */
23
+ const EXCEPTION = new Set([
24
+ "needs_human",
25
+ "item_blocked",
26
+ "llm_stuck_warning",
27
+ "review_failed",
28
+ ]);
29
+
30
+ /** The single routine milestone that earns a quiet progress line. */
31
+ const PROGRESS = new Set(["item_completed"]);
32
+
33
+ /** Classify one event. Unknown/interior/firehose types (token updates, tool
34
+ * activity, iteration boundaries, review start, usage-limit chatter, …) are
35
+ * `ignore` — the supervisor never surfaces them. */
36
+ export function classifyEvent(evt: RaufEvent): EventClass {
37
+ const type = evt?.type;
38
+ if (typeof type !== "string") return "ignore";
39
+ if (TERMINAL.has(type)) return "terminal";
40
+ if (EXCEPTION.has(type)) return "exception";
41
+ // `loop_paused` is an exception ONLY when it is the needs-human pause.
42
+ if (type === "loop_paused" && evt.reason === "needs_human") return "exception";
43
+ if (PROGRESS.has(type)) return "progress";
44
+ return "ignore";
45
+ }
46
+
47
+ /** A concise, deterministic one-line report for a routine `item_completed`.
48
+ * `done`/`total` are threaded in when known so the line reads `[3/10] …`. */
49
+ export function formatProgress(
50
+ evt: RaufEvent,
51
+ done?: number,
52
+ total?: number,
53
+ ): string {
54
+ const count =
55
+ typeof done === "number" && typeof total === "number" ? `[${done}/${total}] ` : "";
56
+ const title = typeof evt.title === "string" && evt.title ? evt.title : evt.itemId ?? "item";
57
+ return `${count}forge loop: completed ${title}`;
58
+ }
59
+
60
+ /** A human-facing line for an exception or terminal event, used both for the
61
+ * toast and for the wake message that triggers the session's next turn. */
62
+ export function formatSignal(evt: RaufEvent): string {
63
+ switch (evt.type) {
64
+ case "needs_human":
65
+ return `forge loop: item ${evt.itemId ?? "?"} needs a human — ${evt.reason ?? "no reason given"}`;
66
+ case "loop_paused":
67
+ return `forge loop: paused for human input on ${evt.itemId ?? "an item"}`;
68
+ case "item_blocked":
69
+ return `forge loop: item ${evt.itemId ?? "?"} blocked — ${evt.reason ?? "no reason given"}`;
70
+ case "llm_stuck_warning":
71
+ return `forge loop: item ${evt.itemId ?? "?"} looks stuck (no output for ${Math.round((evt.silentMs ?? 0) / 1000)}s)`;
72
+ case "review_failed":
73
+ return `forge loop: review failed — ${evt.reason ?? "no reason given"}`;
74
+ case "loop_error":
75
+ return `forge loop: the run errored — ${evt.reason ?? "see the runner log"}`;
76
+ case "loop_cancelled":
77
+ return "forge loop: the run was cancelled";
78
+ case "loop_completed": {
79
+ const done = evt.completedCount ?? 0;
80
+ const blocked = evt.blockedCount ?? 0;
81
+ const needsHuman = evt.needsHumanCount ?? 0;
82
+ const parts = [`${done} done`];
83
+ if (blocked) parts.push(`${blocked} blocked`);
84
+ if (needsHuman) parts.push(`${needsHuman} need a human`);
85
+ return `forge loop: run complete — ${parts.join(", ")}. Read the authoritative counts (status --json) and run the post-run close-out.`;
86
+ }
87
+ default:
88
+ return `forge loop: ${evt.type}`;
89
+ }
90
+ }
@@ -0,0 +1,114 @@
1
+ // GENERATED — DO NOT EDIT. Source: adapter-src/pi/extensions/forge-loop-supervisor/index.ts
2
+ // Regenerate with: python3 scripts/build-adapters.py
3
+ /**
4
+ * forge-loop-supervisor — a first-party Pi extension that lets forge-5-loop run
5
+ * the rauf autonomous coding loop WITHOUT blocking the Pi session, and supervises
6
+ * its native event stream.
7
+ *
8
+ * Pi has no built-in background bash, persistent monitor, or push-notification
9
+ * surface, so the generic Claude-first forge-5-loop contract (background the
10
+ * process, arm a `Monitor` on events.ndjson, `PushNotification` on exceptions)
11
+ * cannot be followed literally on Pi. This extension provides the real mechanism:
12
+ * `forge_loop_launch` starts the runner detached (it runs in rauf's server and
13
+ * outlives the session), then a rotation-aware NDJSON watcher turns each
14
+ * `item_completed` into a quiet progress line and wakes the session — via
15
+ * `pi.sendMessage(..., { triggerTurn: true })` — only on needs-human / blocked /
16
+ * stuck / review-failed / error / completion. `forge_loop_status` and
17
+ * `forge_loop_stop` round out the launch/attach/status/stop surface. Task
18
+ * identity is persisted (session entry + a file mirror beside the runner state)
19
+ * so a restarted session reattaches without duplicate reporting, and shutdown
20
+ * tears down watchers only — never the runner.
21
+ *
22
+ * The pi-facing glue is thin: all logic lives in the injectable {@link
23
+ * createExtension} factory (see wiring.ts), so the extension is unit-tested with
24
+ * a fake pi and fake deps. This file supplies the production dependencies.
25
+ */
26
+
27
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
28
+ import { spawn } from "node:child_process";
29
+ import { watch as fsWatch } from "node:fs";
30
+ import { basename, dirname } from "node:path";
31
+
32
+ import { createExtension, type Deps, type PiLike, type WatchHandle } from "./wiring.js";
33
+
34
+ /** How often the backstop poll fires (ms). fs.watch can miss events or drop on
35
+ * some platforms; a low-frequency interval guarantees the tail keeps up without
36
+ * busy-waiting. */
37
+ const BACKSTOP_MS = 2000;
38
+ /** Debounce window (ms) coalescing a burst of fs.watch events into one poll. */
39
+ const DEBOUNCE_MS = 120;
40
+
41
+ const productionDeps: Deps = {
42
+ spawnDetached(bin, args, cwd, onError) {
43
+ // detached + unref + ignored stdio: the child is fully decoupled from the
44
+ // Pi process and survives session shutdown. rauf hands the loop to its
45
+ // server and this launcher exits quickly; a non-self-detaching runner still
46
+ // stays off the session.
47
+ const child = spawn(bin, args, { cwd, detached: true, stdio: "ignore" });
48
+ // ENOENT (bad bin) and other spawn failures arrive here asynchronously —
49
+ // report them so a launch that never happened does not look successful.
50
+ child.on("error", (err) => onError?.(err instanceof Error ? err.message : String(err)));
51
+ child.unref();
52
+ },
53
+ watch(filePath, onChange): WatchHandle {
54
+ const dir = dirname(filePath);
55
+ const base = basename(filePath);
56
+ let debounce: NodeJS.Timeout | null = null;
57
+ const fire = () => {
58
+ if (debounce) return;
59
+ debounce = setTimeout(() => {
60
+ debounce = null;
61
+ onChange();
62
+ }, DEBOUNCE_MS);
63
+ };
64
+ let fsw: ReturnType<typeof fsWatch> | null = null;
65
+ try {
66
+ // Watch the DIRECTORY (not the file) so rotation-by-rename — rauf moves
67
+ // events.ndjson into archive/ and recreates it each run — keeps firing.
68
+ fsw = fsWatch(dir, (_evt, name) => {
69
+ if (!name || name === base) fire();
70
+ });
71
+ fsw.on?.("error", () => {
72
+ /* directory vanished; the backstop interval keeps polling */
73
+ });
74
+ } catch {
75
+ fsw = null;
76
+ }
77
+ const interval = setInterval(onChange, BACKSTOP_MS);
78
+ return {
79
+ close() {
80
+ try {
81
+ fsw?.close();
82
+ } catch {
83
+ /* ignore */
84
+ }
85
+ if (debounce) clearTimeout(debounce);
86
+ clearInterval(interval);
87
+ },
88
+ };
89
+ },
90
+ now: () => new Date().toISOString(),
91
+ };
92
+
93
+ export default function (pi: ExtensionAPI) {
94
+ // Adapt the real ExtensionAPI to the structural PiLike the wiring consumes.
95
+ // Each member is accessed by name off the concrete `pi`, so a method renamed
96
+ // or removed in a future pi is a COMPILE error here (not a silent runtime
97
+ // failure hidden behind a blanket cast) — while PiLike stays loose enough for
98
+ // the fake pi in tests. Argument casts bridge PiLike's minimal shapes to pi's
99
+ // stricter generic signatures; the pi-API contract this was built against
100
+ // pins the exact shapes.
101
+ const piLike: PiLike = {
102
+ registerTool: (def) => (pi.registerTool as (d: unknown) => void)(def),
103
+ on: (event, handler) =>
104
+ (pi.on as unknown as (e: string, h: (ev: unknown, ctx: unknown) => void | Promise<void>) => void)(event, handler),
105
+ sendMessage: (message, options) =>
106
+ pi.sendMessage(message as Parameters<typeof pi.sendMessage>[0], options),
107
+ appendEntry: (customType, data) => pi.appendEntry(customType, data),
108
+ exec:
109
+ typeof pi.exec === "function"
110
+ ? (command, args, opts) => pi.exec(command, args, opts)
111
+ : undefined,
112
+ };
113
+ createExtension(piLike, productionDeps);
114
+ }