@pennyfarthing/core 11.2.0 → 11.2.2

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 (367) hide show
  1. package/README.md +100 -40
  2. package/package.json +2 -1
  3. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  4. package/packages/core/dist/cli/commands/doctor.js +474 -66
  5. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  6. package/packages/core/dist/cli/commands/init.js +4 -4
  7. package/packages/core/dist/cli/commands/init.js.map +1 -1
  8. package/packages/core/dist/cli/commands/update.d.ts.map +1 -1
  9. package/packages/core/dist/cli/commands/update.js +4 -5
  10. package/packages/core/dist/cli/commands/update.js.map +1 -1
  11. package/packages/core/dist/cli/utils/constants.d.ts +3 -8
  12. package/packages/core/dist/cli/utils/constants.d.ts.map +1 -1
  13. package/packages/core/dist/cli/utils/constants.js +3 -4
  14. package/packages/core/dist/cli/utils/constants.js.map +1 -1
  15. package/packages/core/dist/cli/utils/settings.d.ts +7 -0
  16. package/packages/core/dist/cli/utils/settings.d.ts.map +1 -1
  17. package/packages/core/dist/cli/utils/settings.js +70 -29
  18. package/packages/core/dist/cli/utils/settings.js.map +1 -1
  19. package/packages/core/dist/cli/utils/symlinks.js +16 -16
  20. package/packages/core/dist/cli/utils/symlinks.js.map +1 -1
  21. package/packages/core/dist/consultation/dialogue-manager.d.ts +1 -1
  22. package/packages/core/dist/consultation/dialogue-manager.d.ts.map +1 -1
  23. package/packages/core/dist/consultation/dialogue-manager.js +1 -1
  24. package/packages/core/dist/consultation/dialogue-manager.js.map +1 -1
  25. package/packages/core/dist/consultation/dialogue-manager.test.js.map +1 -1
  26. package/packages/core/dist/consultation/tandem-metrics.d.ts +91 -0
  27. package/packages/core/dist/consultation/tandem-metrics.d.ts.map +1 -0
  28. package/packages/core/dist/consultation/tandem-metrics.js +131 -0
  29. package/packages/core/dist/consultation/tandem-metrics.js.map +1 -0
  30. package/packages/core/dist/consultation/tandem-metrics.test.d.ts +18 -0
  31. package/packages/core/dist/consultation/tandem-metrics.test.d.ts.map +1 -0
  32. package/packages/core/dist/consultation/tandem-metrics.test.js +457 -0
  33. package/packages/core/dist/consultation/tandem-metrics.test.js.map +1 -0
  34. package/packages/core/dist/public/css/react.css +1 -1
  35. package/packages/core/dist/public/js/react/react.js +14 -14
  36. package/packages/core/dist/server/api/agent-load.js +1 -1
  37. package/packages/core/dist/server/api/agent-load.js.map +1 -1
  38. package/packages/core/dist/server/api/git.d.ts.map +1 -1
  39. package/packages/core/dist/server/api/git.js +0 -1
  40. package/packages/core/dist/server/api/git.js.map +1 -1
  41. package/packages/core/dist/server/api/index.d.ts +2 -0
  42. package/packages/core/dist/server/api/index.d.ts.map +1 -1
  43. package/packages/core/dist/server/api/index.js +2 -0
  44. package/packages/core/dist/server/api/index.js.map +1 -1
  45. package/packages/core/dist/server/api/project-info.d.ts +11 -0
  46. package/packages/core/dist/server/api/project-info.d.ts.map +1 -0
  47. package/packages/core/dist/server/api/project-info.js +18 -0
  48. package/packages/core/dist/server/api/project-info.js.map +1 -0
  49. package/packages/core/dist/server/otlp-receiver.d.ts.map +1 -1
  50. package/packages/core/dist/server/otlp-receiver.js +18 -1
  51. package/packages/core/dist/server/otlp-receiver.js.map +1 -1
  52. package/packages/core/dist/server/otlp-receiver.test.js +1 -1
  53. package/packages/core/dist/server/otlp-receiver.test.js.map +1 -1
  54. package/packages/core/dist/server/server.d.ts +0 -3
  55. package/packages/core/dist/server/server.d.ts.map +1 -1
  56. package/packages/core/dist/server/server.js +5 -38
  57. package/packages/core/dist/server/server.js.map +1 -1
  58. package/packages/core/dist/server/server.test.d.ts +1 -1
  59. package/packages/core/dist/server/server.test.js +12 -23
  60. package/packages/core/dist/server/server.test.js.map +1 -1
  61. package/packages/core/dist/server/settings.d.ts +1 -0
  62. package/packages/core/dist/server/settings.d.ts.map +1 -1
  63. package/packages/core/dist/server/settings.js +13 -0
  64. package/packages/core/dist/server/settings.js.map +1 -1
  65. package/packages/core/dist/shared/capabilities.d.ts +88 -0
  66. package/packages/core/dist/shared/capabilities.d.ts.map +1 -0
  67. package/packages/core/dist/shared/capabilities.js +133 -0
  68. package/packages/core/dist/shared/capabilities.js.map +1 -0
  69. package/packages/core/dist/shared/capabilities.test.d.ts +2 -0
  70. package/packages/core/dist/shared/capabilities.test.d.ts.map +1 -0
  71. package/packages/core/dist/shared/capabilities.test.js +217 -0
  72. package/packages/core/dist/shared/capabilities.test.js.map +1 -0
  73. package/packages/core/dist/shared/spawn-prompt.d.ts +47 -0
  74. package/packages/core/dist/shared/spawn-prompt.d.ts.map +1 -0
  75. package/packages/core/dist/shared/spawn-prompt.js +82 -0
  76. package/packages/core/dist/shared/spawn-prompt.js.map +1 -0
  77. package/packages/core/dist/shared/spawn-prompt.test.d.ts +2 -0
  78. package/packages/core/dist/shared/spawn-prompt.test.d.ts.map +1 -0
  79. package/packages/core/dist/shared/spawn-prompt.test.js +251 -0
  80. package/packages/core/dist/shared/spawn-prompt.test.js.map +1 -0
  81. package/packages/core/dist/workflow/tandem-workflow-templates.test.d.ts +18 -0
  82. package/packages/core/dist/workflow/tandem-workflow-templates.test.d.ts.map +1 -0
  83. package/packages/core/dist/workflow/tandem-workflow-templates.test.js +434 -0
  84. package/packages/core/dist/workflow/tandem-workflow-templates.test.js.map +1 -0
  85. package/packages/core/dist/workflow/team-lifecycle.d.ts +169 -0
  86. package/packages/core/dist/workflow/team-lifecycle.d.ts.map +1 -0
  87. package/packages/core/dist/workflow/team-lifecycle.js +217 -0
  88. package/packages/core/dist/workflow/team-lifecycle.js.map +1 -0
  89. package/packages/core/dist/workflow/team-lifecycle.test.d.ts +20 -0
  90. package/packages/core/dist/workflow/team-lifecycle.test.d.ts.map +1 -0
  91. package/packages/core/dist/workflow/team-lifecycle.test.js +966 -0
  92. package/packages/core/dist/workflow/team-lifecycle.test.js.map +1 -0
  93. package/packages/core/dist/workflow/workflow-schema.d.ts +32 -0
  94. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
  95. package/packages/core/dist/workflow/workflow-schema.js +120 -0
  96. package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
  97. package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -1
  98. package/packages/core/dist/workflow/workflow-schema.test.js +570 -1
  99. package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -1
  100. package/packages/core/dist/workflow/workflow-team-templates.test.d.ts +17 -0
  101. package/packages/core/dist/workflow/workflow-team-templates.test.d.ts.map +1 -0
  102. package/packages/core/dist/workflow/workflow-team-templates.test.js +275 -0
  103. package/packages/core/dist/workflow/workflow-team-templates.test.js.map +1 -0
  104. package/pennyfarthing-dist/agents/dev.md +21 -12
  105. package/pennyfarthing-dist/agents/reviewer.md +23 -4
  106. package/pennyfarthing-dist/agents/sm-finish.md +19 -2
  107. package/pennyfarthing-dist/agents/sm-setup.md +7 -7
  108. package/pennyfarthing-dist/agents/sm.md +12 -12
  109. package/pennyfarthing-dist/agents/tea.md +2 -2
  110. package/pennyfarthing-dist/agents/testing-runner.md +1 -1
  111. package/pennyfarthing-dist/commands/pf-architect.md +1 -1
  112. package/pennyfarthing-dist/commands/pf-ba.md +1 -1
  113. package/pennyfarthing-dist/commands/pf-chore.md +2 -2
  114. package/pennyfarthing-dist/commands/pf-dev.md +1 -1
  115. package/pennyfarthing-dist/commands/pf-devops.md +1 -1
  116. package/pennyfarthing-dist/commands/pf-epic.md +6 -6
  117. package/pennyfarthing-dist/commands/pf-git.md +12 -10
  118. package/pennyfarthing-dist/commands/pf-health-check.md +1 -1
  119. package/pennyfarthing-dist/commands/pf-help.md +12 -12
  120. package/pennyfarthing-dist/commands/pf-orchestrator.md +1 -1
  121. package/pennyfarthing-dist/commands/pf-pm.md +1 -1
  122. package/pennyfarthing-dist/commands/pf-prime.md +8 -8
  123. package/pennyfarthing-dist/commands/pf-reviewer.md +1 -1
  124. package/pennyfarthing-dist/commands/pf-session.md +7 -7
  125. package/pennyfarthing-dist/commands/pf-sm.md +1 -1
  126. package/pennyfarthing-dist/commands/pf-sprint.md +7 -7
  127. package/pennyfarthing-dist/commands/pf-tea.md +1 -1
  128. package/pennyfarthing-dist/commands/pf-tech-writer.md +1 -1
  129. package/pennyfarthing-dist/commands/pf-theme.md +9 -9
  130. package/pennyfarthing-dist/commands/pf-ux-designer.md +1 -1
  131. package/pennyfarthing-dist/commands/pf-work.md +1 -1
  132. package/pennyfarthing-dist/gates/approval.md +63 -0
  133. package/pennyfarthing-dist/gates/confidence-sm.md +71 -0
  134. package/pennyfarthing-dist/gates/context-ok.md +56 -0
  135. package/pennyfarthing-dist/gates/evaluations/confidence-sm.md +54 -0
  136. package/pennyfarthing-dist/gates/quality-pass.md +67 -0
  137. package/pennyfarthing-dist/gates/tests-fail.md +84 -0
  138. package/pennyfarthing-dist/gates/tests-pass.md +79 -0
  139. package/pennyfarthing-dist/guides/agent-behavior.md +84 -29
  140. package/pennyfarthing-dist/guides/agent-coordination.md +10 -10
  141. package/pennyfarthing-dist/guides/agent-tag-taxonomy.md +6 -6
  142. package/pennyfarthing-dist/guides/agent-template-tactical.md +1 -1
  143. package/pennyfarthing-dist/guides/bell-mode.md +1 -1
  144. package/pennyfarthing-dist/guides/bikerack.md +10 -10
  145. package/pennyfarthing-dist/guides/brownfield-tools.md +24 -24
  146. package/pennyfarthing-dist/guides/command-tag-taxonomy.md +1 -1
  147. package/pennyfarthing-dist/guides/gate-schema.md +2 -2
  148. package/pennyfarthing-dist/guides/gates.md +3 -3
  149. package/pennyfarthing-dist/guides/handoff-cli.md +8 -8
  150. package/pennyfarthing-dist/guides/hooks.md +29 -29
  151. package/pennyfarthing-dist/guides/prime.md +2 -2
  152. package/pennyfarthing-dist/guides/reflector.md +1 -1
  153. package/pennyfarthing-dist/guides/skill-schema.md +6 -6
  154. package/pennyfarthing-dist/guides/tandem-protocol.md +3 -3
  155. package/pennyfarthing-dist/guides/workflow-schema.md +1 -1
  156. package/pennyfarthing-dist/guides/worktree-mode.md +3 -3
  157. package/pennyfarthing-dist/guides/xml-tags.md +8 -8
  158. package/pennyfarthing-dist/scripts/README.md +4 -4
  159. package/pennyfarthing-dist/scripts/core/agent-session.sh +2 -5
  160. package/pennyfarthing-dist/scripts/core/check-context.sh +3 -1
  161. package/pennyfarthing-dist/scripts/core/pf.sh +5 -0
  162. package/pennyfarthing-dist/scripts/core/phase-check-start.sh +4 -89
  163. package/pennyfarthing-dist/scripts/core/prime.sh +2 -25
  164. package/pennyfarthing-dist/scripts/git/README.md +14 -14
  165. package/pennyfarthing-dist/scripts/git/create-feature-branches.sh +2 -3
  166. package/pennyfarthing-dist/scripts/git/git-status-all.sh +2 -3
  167. package/pennyfarthing-dist/scripts/git/install-git-hooks.sh +2 -3
  168. package/pennyfarthing-dist/scripts/git/worktree-manager.sh +2 -4
  169. package/pennyfarthing-dist/scripts/hooks/README.md +6 -6
  170. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +4 -183
  171. package/pennyfarthing-dist/scripts/hooks/context-circuit-breaker.sh +4 -95
  172. package/pennyfarthing-dist/scripts/hooks/context-warning.sh +4 -65
  173. package/pennyfarthing-dist/scripts/hooks/cyclist-pretooluse-hook.sh +3 -31
  174. package/pennyfarthing-dist/scripts/hooks/otel-auto-config.sh +5 -4
  175. package/pennyfarthing-dist/scripts/hooks/pre-commit.sh +29 -34
  176. package/pennyfarthing-dist/scripts/hooks/pre-edit-check.sh +4 -71
  177. package/pennyfarthing-dist/scripts/hooks/question-reflector-check.sh +3 -19
  178. package/pennyfarthing-dist/scripts/hooks/schema-validation.sh +4 -30
  179. package/pennyfarthing-dist/scripts/hooks/session-start.sh +3 -32
  180. package/pennyfarthing-dist/scripts/hooks/session-stop.sh +4 -65
  181. package/pennyfarthing-dist/scripts/hooks/sprint-yaml-validation.sh +4 -78
  182. package/pennyfarthing-dist/scripts/hooks/welcome-hook.sh +3 -93
  183. package/pennyfarthing-dist/scripts/lib/env.sh +34 -0
  184. package/pennyfarthing-dist/scripts/lib/run-pf.sh +39 -0
  185. package/pennyfarthing-dist/scripts/misc/README.md +1 -1
  186. package/pennyfarthing-dist/scripts/misc/statusline.sh +4 -301
  187. package/pennyfarthing-dist/scripts/sprint/README.md +21 -21
  188. package/pennyfarthing-dist/scripts/workflow/README.md +2 -2
  189. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +2 -16
  190. package/pennyfarthing-dist/scripts/workflow/fix-session-phase.sh +3 -3
  191. package/pennyfarthing-dist/scripts/workflow/get-workflow-type.sh +3 -3
  192. package/pennyfarthing-dist/scripts/workflow/list-workflows.sh +3 -3
  193. package/pennyfarthing-dist/scripts/workflow/phase-owner.sh +3 -3
  194. package/pennyfarthing-dist/scripts/workflow/resume-workflow.sh +3 -3
  195. package/pennyfarthing-dist/scripts/workflow/show-workflow.sh +3 -3
  196. package/pennyfarthing-dist/scripts/workflow/start-workflow.sh +3 -3
  197. package/pennyfarthing-dist/scripts/workflow/workflow-status.sh +3 -3
  198. package/pennyfarthing-dist/skills/pf-bc/examples.md +23 -23
  199. package/pennyfarthing-dist/skills/pf-bc/skill.md +17 -17
  200. package/pennyfarthing-dist/skills/pf-bc/usage.md +8 -8
  201. package/pennyfarthing-dist/skills/pf-jira/SKILL.md +15 -15
  202. package/pennyfarthing-dist/skills/pf-jira/examples.md +48 -48
  203. package/pennyfarthing-dist/skills/pf-jira/usage.md +15 -15
  204. package/pennyfarthing-dist/skills/pf-sprint/examples.md +80 -80
  205. package/pennyfarthing-dist/skills/pf-sprint/skill.md +35 -35
  206. package/pennyfarthing-dist/skills/pf-sprint/usage.md +30 -30
  207. package/pennyfarthing-dist/skills/pf-theme/examples.md +15 -15
  208. package/pennyfarthing-dist/skills/pf-theme/skill.md +6 -6
  209. package/pennyfarthing-dist/skills/pf-theme/usage.md +5 -5
  210. package/pennyfarthing-dist/skills/pf-workflow/examples.md +27 -27
  211. package/pennyfarthing-dist/skills/pf-workflow/skill.md +11 -11
  212. package/pennyfarthing-dist/skills/pf-workflow/usage.md +11 -11
  213. package/pennyfarthing-dist/skills/skill-registry.yaml +19 -19
  214. package/pennyfarthing-dist/templates/settings.local.json.template +19 -10
  215. package/pennyfarthing-dist/workflows/bdd-team.yaml +89 -0
  216. package/pennyfarthing-dist/workflows/epics-and-stories/steps/step-05-import-to-future.md +1 -1
  217. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-01-analyze.md +1 -1
  218. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-04-verify.md +1 -1
  219. package/pennyfarthing-dist/workflows/git-cleanup/steps/step-05-complete.md +1 -1
  220. package/pennyfarthing-dist/workflows/project-setup/steps/step-01-discover.md +47 -0
  221. package/pennyfarthing-dist/workflows/tdd-team.yaml +80 -0
  222. package/pennyfarthing-dist/workflows/tdd.yaml +11 -2
  223. package/pennyfarthing_scripts/CLAUDE.md +19 -10
  224. package/pennyfarthing_scripts/__init__.py +1 -1
  225. package/pennyfarthing_scripts/__pycache__/__init__.cpython-314.pyc +0 -0
  226. package/pennyfarthing_scripts/__pycache__/bellmode_hook.cpython-314.pyc +0 -0
  227. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  228. package/pennyfarthing_scripts/__pycache__/context.cpython-314.pyc +0 -0
  229. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  230. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  231. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/__pycache__/session_start_hook.cpython-314.pyc +0 -0
  233. package/pennyfarthing_scripts/bc/__pycache__/cli.cpython-314.pyc +0 -0
  234. package/pennyfarthing_scripts/bc/__pycache__/focus.cpython-314.pyc +0 -0
  235. package/pennyfarthing_scripts/bc/__pycache__/split.cpython-314.pyc +0 -0
  236. package/pennyfarthing_scripts/bc/cli.py +2 -2
  237. package/pennyfarthing_scripts/bellmode_hook.py +9 -296
  238. package/pennyfarthing_scripts/bikerack/__pycache__/audit_log_panel.cpython-314.pyc +0 -0
  239. package/pennyfarthing_scripts/bikerack/__pycache__/background_panel.cpython-314.pyc +0 -0
  240. package/pennyfarthing_scripts/bikerack/__pycache__/base_panel.cpython-314.pyc +0 -0
  241. package/pennyfarthing_scripts/bikerack/__pycache__/changed_panel.cpython-314.pyc +0 -0
  242. package/pennyfarthing_scripts/bikerack/__pycache__/context_meter_footer.cpython-314.pyc +0 -0
  243. package/pennyfarthing_scripts/bikerack/__pycache__/debug_panel.cpython-314.pyc +0 -0
  244. package/pennyfarthing_scripts/bikerack/__pycache__/diffs_panel.cpython-314.pyc +0 -0
  245. package/pennyfarthing_scripts/bikerack/__pycache__/events.cpython-314.pyc +0 -0
  246. package/pennyfarthing_scripts/bikerack/__pycache__/git_panel.cpython-314.pyc +0 -0
  247. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  248. package/pennyfarthing_scripts/bikerack/__pycache__/portrait_resolver.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/bikerack/__pycache__/progress_panel.cpython-314.pyc +0 -0
  250. package/pennyfarthing_scripts/bikerack/__pycache__/sprint_panel.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_data.cpython-314.pyc +0 -0
  252. package/pennyfarthing_scripts/bikerack/__pycache__/story_detail_screen.cpython-314.pyc +0 -0
  253. package/pennyfarthing_scripts/bikerack/__pycache__/tui.cpython-314.pyc +0 -0
  254. package/pennyfarthing_scripts/bikerack/__pycache__/ws_client.cpython-314.pyc +0 -0
  255. package/pennyfarthing_scripts/bikerack/audit_log_panel.py +161 -0
  256. package/pennyfarthing_scripts/bikerack/base_panel.py +27 -4
  257. package/pennyfarthing_scripts/bikerack/changed_panel.py +96 -4
  258. package/pennyfarthing_scripts/bikerack/context_meter_footer.py +88 -0
  259. package/pennyfarthing_scripts/bikerack/debug_panel.py +1 -1
  260. package/pennyfarthing_scripts/bikerack/diffs_panel.py +30 -0
  261. package/pennyfarthing_scripts/bikerack/events.py +28 -0
  262. package/pennyfarthing_scripts/bikerack/launcher.py +6 -6
  263. package/pennyfarthing_scripts/bikerack/portrait_resolver.py +139 -0
  264. package/pennyfarthing_scripts/bikerack/progress_panel.py +0 -1
  265. package/pennyfarthing_scripts/bikerack/sprint_panel.py +373 -142
  266. package/pennyfarthing_scripts/bikerack/story_detail_data.py +247 -0
  267. package/pennyfarthing_scripts/bikerack/story_detail_screen.py +177 -0
  268. package/pennyfarthing_scripts/bikerack/tui.py +304 -62
  269. package/pennyfarthing_scripts/bikerack/ws_client.py +2 -2
  270. package/pennyfarthing_scripts/cli.py +5 -0
  271. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  272. package/pennyfarthing_scripts/common/config.py +29 -2
  273. package/pennyfarthing_scripts/common/pr_config.py +38 -0
  274. package/pennyfarthing_scripts/consultation/__pycache__/__init__.cpython-314.pyc +0 -0
  275. package/pennyfarthing_scripts/consultation/__pycache__/cli.cpython-314.pyc +0 -0
  276. package/pennyfarthing_scripts/consultation/cli.py +3 -3
  277. package/pennyfarthing_scripts/context.py +3 -3
  278. package/pennyfarthing_scripts/git/__pycache__/__init__.cpython-314.pyc +0 -0
  279. package/pennyfarthing_scripts/git/__pycache__/create_branches.cpython-314.pyc +0 -0
  280. package/pennyfarthing_scripts/git/__pycache__/repos.cpython-314.pyc +0 -0
  281. package/pennyfarthing_scripts/git/__pycache__/status_all.cpython-314.pyc +0 -0
  282. package/pennyfarthing_scripts/git/hooks_installer.py +2 -3
  283. package/pennyfarthing_scripts/git/status_all.py +1 -1
  284. package/pennyfarthing_scripts/git/worktree.py +2 -2
  285. package/pennyfarthing_scripts/git_group/__pycache__/cli.cpython-314.pyc +0 -0
  286. package/pennyfarthing_scripts/handoff/__pycache__/cli.cpython-314.pyc +0 -0
  287. package/pennyfarthing_scripts/handoff/__pycache__/complete_phase.cpython-314.pyc +0 -0
  288. package/pennyfarthing_scripts/handoff/__pycache__/marker.cpython-314.pyc +0 -0
  289. package/pennyfarthing_scripts/handoff/__pycache__/phase_check.cpython-314.pyc +0 -0
  290. package/pennyfarthing_scripts/handoff/__pycache__/resolve_gate.cpython-314.pyc +0 -0
  291. package/pennyfarthing_scripts/handoff/cli.py +33 -1
  292. package/pennyfarthing_scripts/handoff/complete_phase.py +28 -0
  293. package/pennyfarthing_scripts/handoff/marker.py +15 -15
  294. package/pennyfarthing_scripts/handoff/phase_check.py +96 -0
  295. package/pennyfarthing_scripts/handoff/resolve_gate.py +13 -1
  296. package/pennyfarthing_scripts/hooks/__init__.py +442 -0
  297. package/pennyfarthing_scripts/hooks/__pycache__/__init__.cpython-314.pyc +0 -0
  298. package/pennyfarthing_scripts/hooks/__pycache__/bell_mode.cpython-314.pyc +0 -0
  299. package/pennyfarthing_scripts/hooks/__pycache__/cli.cpython-314.pyc +0 -0
  300. package/pennyfarthing_scripts/hooks/__pycache__/context_breaker.cpython-314.pyc +0 -0
  301. package/pennyfarthing_scripts/hooks/__pycache__/context_warning.cpython-314.pyc +0 -0
  302. package/pennyfarthing_scripts/hooks/__pycache__/cyclist_pretooluse.cpython-314.pyc +0 -0
  303. package/pennyfarthing_scripts/hooks/__pycache__/pre_edit_check.cpython-314.pyc +0 -0
  304. package/pennyfarthing_scripts/hooks/__pycache__/reflector_check.cpython-314.pyc +0 -0
  305. package/pennyfarthing_scripts/hooks/__pycache__/schema_validation.cpython-314.pyc +0 -0
  306. package/pennyfarthing_scripts/hooks/__pycache__/session_start.cpython-314.pyc +0 -0
  307. package/pennyfarthing_scripts/hooks/__pycache__/session_stop.cpython-314.pyc +0 -0
  308. package/pennyfarthing_scripts/hooks/__pycache__/sprint_yaml_validation.cpython-314.pyc +0 -0
  309. package/pennyfarthing_scripts/hooks/__pycache__/statusline.cpython-314.pyc +0 -0
  310. package/pennyfarthing_scripts/hooks/bell_mode.py +214 -0
  311. package/pennyfarthing_scripts/hooks/cli.py +96 -0
  312. package/pennyfarthing_scripts/hooks/context_breaker.py +104 -0
  313. package/pennyfarthing_scripts/hooks/context_warning.py +66 -0
  314. package/pennyfarthing_scripts/hooks/cyclist_pretooluse.py +129 -0
  315. package/pennyfarthing_scripts/hooks/pre_edit_check.py +77 -0
  316. package/pennyfarthing_scripts/hooks/reflector_check.py +270 -0
  317. package/pennyfarthing_scripts/hooks/schema_validation.py +202 -0
  318. package/pennyfarthing_scripts/hooks/session_start.py +294 -0
  319. package/pennyfarthing_scripts/hooks/session_stop.py +111 -0
  320. package/pennyfarthing_scripts/hooks/sprint_yaml_validation.py +97 -0
  321. package/pennyfarthing_scripts/hooks/statusline.py +429 -0
  322. package/pennyfarthing_scripts/hooks.py +27 -432
  323. package/pennyfarthing_scripts/pretooluse_hook.py +3 -185
  324. package/pennyfarthing_scripts/prime/__pycache__/workflow.cpython-314.pyc +0 -0
  325. package/pennyfarthing_scripts/prime/heatmap.py +3 -15
  326. package/pennyfarthing_scripts/prime/workflow.py +2 -1
  327. package/pennyfarthing_scripts/schema_validation_hook.py +3 -298
  328. package/pennyfarthing_scripts/session_start_hook.py +4 -186
  329. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  330. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  331. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  332. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  333. package/pennyfarthing_scripts/sprint/cli.py +121 -0
  334. package/pennyfarthing_scripts/sprint/loader.py +154 -3
  335. package/pennyfarthing_scripts/sprint/story_update.py +26 -0
  336. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  337. package/pennyfarthing_scripts/tests/__pycache__/test_handoff_cli.cpython-314-pytest-9.0.2.pyc +0 -0
  338. package/pennyfarthing_scripts/tests/__pycache__/test_workflow_list_team.cpython-314-pytest-9.0.2.pyc +0 -0
  339. package/pennyfarthing_scripts/tests/test_bikerack.py +26 -26
  340. package/pennyfarthing_scripts/tests/test_dialogue_manager.py +0 -1
  341. package/pennyfarthing_scripts/tests/test_sprint_panel.py +344 -265
  342. package/pennyfarthing_scripts/tests/test_workflow_list_team.py +147 -0
  343. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  344. package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  345. package/pennyfarthing_scripts/validate/adapters/__pycache__/tandem_awareness.cpython-314.pyc +0 -0
  346. package/pennyfarthing_scripts/validate/adapters/__pycache__/team_mode.cpython-314.pyc +0 -0
  347. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  348. package/pennyfarthing_scripts/validate/adapters/team_mode.py +323 -0
  349. package/pennyfarthing_scripts/validate/adapters/workflow.py +19 -0
  350. package/pennyfarthing_scripts/welcome_hook.py +3 -149
  351. package/pennyfarthing_scripts/workflow/__pycache__/__init__.cpython-314.pyc +0 -0
  352. package/pennyfarthing_scripts/workflow/__pycache__/cli.cpython-314.pyc +0 -0
  353. package/pennyfarthing_scripts/workflow/__pycache__/helpers.cpython-314.pyc +0 -0
  354. package/pennyfarthing_scripts/workflow/__pycache__/scale.cpython-314.pyc +0 -0
  355. package/pennyfarthing_scripts/workflow/__pycache__/state.cpython-314.pyc +0 -0
  356. package/pennyfarthing_scripts/workflow/__pycache__/team_lifecycle.cpython-314.pyc +0 -0
  357. package/pennyfarthing_scripts/workflow/cli.py +22 -20
  358. package/pennyfarthing_scripts/workflow/state.py +0 -1
  359. package/pennyfarthing_scripts/workflow/team_lifecycle.py +256 -0
  360. package/packages/core/dist/cli/cyclist-migration.test.d.ts +0 -16
  361. package/packages/core/dist/cli/cyclist-migration.test.d.ts.map +0 -1
  362. package/packages/core/dist/cli/cyclist-migration.test.js +0 -229
  363. package/packages/core/dist/cli/cyclist-migration.test.js.map +0 -1
  364. package/packages/core/dist/scripts/theme-detail.test.d.ts +0 -10
  365. package/packages/core/dist/scripts/theme-detail.test.d.ts.map +0 -1
  366. package/packages/core/dist/scripts/theme-detail.test.js +0 -199
  367. package/packages/core/dist/scripts/theme-detail.test.js.map +0 -1
@@ -16,10 +16,10 @@ Manage persona themes: list available themes, view details, switch themes, creat
16
16
  Show current theme or specific theme details.
17
17
 
18
18
  ```bash
19
- pf theme show [name]
19
+ pf.sh theme show [name]
20
20
 
21
21
  # Show extended details (OCEAN scores, quirks, catchphrases)
22
- pf theme show [name] --full
22
+ pf.sh theme show [name] --full
23
23
  ```
24
24
 
25
25
  ### `/theme list`
@@ -27,7 +27,7 @@ pf theme show [name] --full
27
27
  List all available themes with current theme highlighted.
28
28
 
29
29
  ```bash
30
- pf theme list
30
+ pf.sh theme list
31
31
  ```
32
32
 
33
33
  Output shows current theme marked with `*` and tier brackets: `[S]` elite, `[A]` excellent, `[B]` strong, `[C]` good, `[D]` below average, `[U]` unbenchmarked.
@@ -37,12 +37,12 @@ Output shows current theme marked with `*` and tier brackets: `[S]` elite, `[A]`
37
37
  Set the active persona theme.
38
38
 
39
39
  ```bash
40
- pf theme set <name>
40
+ pf.sh theme set <name>
41
41
  ```
42
42
 
43
43
  After setting, refresh the current agent's persona:
44
44
  ```bash
45
- pf agent start "sm"
45
+ pf.sh agent start "sm"
46
46
  ```
47
47
 
48
48
  ### `/theme create <name> [--base <theme>] [--user]`
@@ -51,13 +51,13 @@ Create a new custom theme by copying from a base.
51
51
 
52
52
  ```bash
53
53
  # Create from default base (minimalist)
54
- pf theme create my-theme
54
+ pf.sh theme create my-theme
55
55
 
56
56
  # Create from specific base
57
- pf theme create my-theme --base blade-runner
57
+ pf.sh theme create my-theme --base blade-runner
58
58
 
59
59
  # Create as user-level theme (available across all projects)
60
- pf theme create my-theme --user
60
+ pf.sh theme create my-theme --user
61
61
  ```
62
62
 
63
63
  ### `/theme maker`
@@ -90,6 +90,6 @@ Interactive wizard for AI-driven theme creation. Supports three modes:
90
90
 
91
91
  <reference>
92
92
  - **Skill:** `.claude/skills/theme/skill.md`
93
- - **CLI:** `pf theme [list|show|set|create]`
93
+ - **CLI:** `pf.sh theme [list|show|set|create]`
94
94
  - **Config:** `.pennyfarthing/config.local.yaml`
95
95
  </reference>
@@ -5,7 +5,7 @@ description: UX Designer - User experience design and UI patterns
5
5
  <agent-activation>
6
6
  **FIRST:** Use Bash tool to run:
7
7
  ```bash
8
- pf agent start "ux-designer"
8
+ source .pennyfarthing/scripts/lib/env.sh && source "$CLAUDE_PROJECT_DIR/.pennyfarthing/scripts/lib/run-pf.sh" && run_pf agent start "ux-designer"
9
9
  ```
10
10
  This loads your persona and agent context. Adopt the character shown in the output.
11
11
  </agent-activation>
@@ -7,7 +7,7 @@ description: Resume work or start new - smart entry point that picks up where yo
7
7
  <agent-activation>
8
8
  **FIRST:** Use Bash tool to run:
9
9
  ```bash
10
- pf agent start "sm"
10
+ source .pennyfarthing/scripts/lib/env.sh && source "$CLAUDE_PROJECT_DIR/.pennyfarthing/scripts/lib/run-pf.sh" && run_pf agent start "sm"
11
11
  ```
12
12
  This loads your persona and agent context. Adopt the character shown in the output.
13
13
  </agent-activation>
@@ -0,0 +1,63 @@
1
+ <gate name="approval" model="haiku">
2
+
3
+ <purpose>
4
+ Verify the reviewer has issued an explicit verdict on the code review.
5
+ This gate runs after the Reviewer agent's review phase to confirm
6
+ the code has been formally approved or rejected before proceeding.
7
+ </purpose>
8
+
9
+ <pass>
10
+ Check the session file for a Reviewer Assessment section:
11
+
12
+ 1. **Find verdict:** Look for `## Reviewer Assessment` section in the session file.
13
+ - Search for an explicit APPROVED verdict
14
+ - The verdict must be unambiguous — not "looks good" but "APPROVED"
15
+
16
+ 2. **Verify completeness:** The assessment should include:
17
+ - A clear verdict (APPROVED)
18
+ - Summary of what was reviewed
19
+
20
+ If the review is APPROVED, return:
21
+
22
+ ```yaml
23
+ GATE_RESULT:
24
+ status: pass
25
+ gate: approval
26
+ message: "Code review APPROVED by reviewer"
27
+ checks:
28
+ - name: reviewer-verdict
29
+ status: pass
30
+ detail: "Explicit APPROVED verdict found in Reviewer Assessment"
31
+ ```
32
+ </pass>
33
+
34
+ <fail>
35
+ If the review is not approved, diagnose and report:
36
+
37
+ 1. **REJECTED verdict:** The reviewer found issues that need addressing.
38
+ - Extract the specific findings from the Reviewer Assessment
39
+ - List each finding with its severity
40
+ - These must be addressed before the gate can pass
41
+
42
+ 2. **No verdict found:** The reviewer hasn't completed the review yet.
43
+ - The Reviewer Assessment section is missing or incomplete
44
+ - The reviewer needs to complete their review
45
+
46
+ Return with actionable recovery guidance:
47
+
48
+ ```yaml
49
+ GATE_RESULT:
50
+ status: fail
51
+ gate: approval
52
+ message: "Gate failed: {REJECTED with findings | No verdict found}"
53
+ checks:
54
+ - name: reviewer-verdict
55
+ status: fail
56
+ detail: "{REJECTED: list findings | Missing: no assessment found}"
57
+ recovery:
58
+ - "Address reviewer findings: {finding1}, {finding2}"
59
+ - "Request re-review after fixes are applied"
60
+ ```
61
+ </fail>
62
+
63
+ </gate>
@@ -0,0 +1,71 @@
1
+ <gate name="confidence-sm" model="haiku">
2
+
3
+ <purpose>
4
+ Check whether the user's instruction to the SM agent is ambiguous or unclear.
5
+ The SM agent handles story management, sprint coordination, and workflow routing.
6
+ Vague commands like "continue", "next", "start", or "do it" without a clear target
7
+ (story ID, agent name, or specific action) risk the SM taking the wrong action.
8
+ This gate evaluates confidence that the instruction has a single unambiguous interpretation.
9
+ </purpose>
10
+
11
+ <pass>
12
+ The instruction is clear and unambiguous. The SM agent can proceed confidently.
13
+
14
+ Evaluate the instruction against these criteria:
15
+ 1. **Target identified:** A story ID, agent name, or specific action is stated or obvious from context
16
+ 2. **Intent clear:** The desired outcome (start work, finish story, check status, hand off) is unambiguous
17
+ 3. **No competing interpretations:** Only one reasonable reading of the instruction exists
18
+
19
+ If the instruction is confident and clear, return:
20
+
21
+ ```yaml
22
+ GATE_RESULT:
23
+ status: pass
24
+ gate: confidence-sm
25
+ message: "Instruction is clear: {summary of what SM will do}"
26
+ checks:
27
+ - name: target
28
+ status: pass
29
+ detail: "{what the instruction targets}"
30
+ - name: intent
31
+ status: pass
32
+ detail: "{what action the SM will take}"
33
+ ```
34
+ </pass>
35
+
36
+ <fail>
37
+ The instruction is ambiguous. The SM agent should not guess — ask for clarification instead.
38
+
39
+ Identify which aspect is unclear and offer specific options the user likely meant:
40
+
41
+ 1. **Missing target:** "continue" / "next" / "start" without specifying a story or action
42
+ - Did you mean: start a specific story? Continue the current workflow? Check sprint status?
43
+
44
+ 2. **Ambiguous scope:** "do the thing" / "handle it" without enough context
45
+ - Did you mean: finish the current story? Start new work? Run the backlog?
46
+
47
+ 3. **Multiple interpretations:** The instruction could reasonably mean two or more different actions
48
+ - List each interpretation and ask which one the user intended
49
+
50
+ Return with clarifying options so the user can specify their intent:
51
+
52
+ ```yaml
53
+ GATE_RESULT:
54
+ status: fail
55
+ gate: confidence-sm
56
+ message: "Instruction is ambiguous: {what is unclear}"
57
+ checks:
58
+ - name: target
59
+ status: fail
60
+ detail: "{what target is missing or unclear}"
61
+ - name: intent
62
+ status: fail
63
+ detail: "{competing interpretations}"
64
+ recovery:
65
+ - "Did you mean: {option A}?"
66
+ - "Did you mean: {option B}?"
67
+ - "Specify a story ID or action to proceed"
68
+ ```
69
+ </fail>
70
+
71
+ </gate>
@@ -0,0 +1,56 @@
1
+ <gate name="context-ok" model="haiku">
2
+
3
+ <purpose>
4
+ Verify that Claude Code context usage is below threshold before allowing
5
+ a phase transition. Prevents handoffs when context is too high, which would
6
+ result in degraded agent performance in the next phase.
7
+ </purpose>
8
+
9
+ <pass>
10
+ Run the context check command and verify usage is acceptable:
11
+
12
+ 1. **Context usage:** Run `pf context --human` to check current context percentage.
13
+ - Extract the usable percent from output
14
+ - Threshold: below 60% usable context
15
+
16
+ 2. **Relay mode:** Check if relay mode is active via `pf context` env var output.
17
+ - If relay mode is on and context is high, TirePump should handle clearing
18
+
19
+ If context is below threshold, return:
20
+
21
+ ```yaml
22
+ GATE_RESULT:
23
+ status: pass
24
+ gate: context-ok
25
+ message: "Context at {N}% — safe to continue"
26
+ checks:
27
+ - name: context-usage
28
+ status: pass
29
+ detail: "{usable_pct}% of available context used ({usable_tokens} tokens)"
30
+ ```
31
+ </pass>
32
+
33
+ <fail>
34
+ If context usage exceeds the threshold:
35
+
36
+ 1. **High context:** Report the current usage level
37
+ 2. **Recommendation:** Suggest `/clear` before continuing
38
+
39
+ Return with guidance:
40
+
41
+ ```yaml
42
+ GATE_RESULT:
43
+ status: fail
44
+ gate: context-ok
45
+ message: "Context at {N}% — too high for reliable handoff"
46
+ checks:
47
+ - name: context-usage
48
+ status: fail
49
+ detail: "{usable_pct}% of available context used — threshold is 60%"
50
+ recovery:
51
+ - "Run /clear to reset context, then retry the handoff"
52
+ - "If relay mode is on, TirePump will handle this automatically"
53
+ ```
54
+ </fail>
55
+
56
+ </gate>
@@ -0,0 +1,54 @@
1
+ # Confidence SM Gate — Evaluation Results
2
+
3
+ **Gate:** `confidence-sm`
4
+ **Evaluation Period:** Sprint 2606 (first sprint deployed)
5
+ **Gate Shipped:** Story 90-2
6
+
7
+ ---
8
+
9
+ ## Trigger Frequency
10
+
11
+ The confidence-sm gate activated on SM agent startup when processing user instructions. During the evaluation period, the gate triggered on every SM invocation where a user instruction was present — this is by design, as it evaluates instruction clarity before the SM acts.
12
+
13
+ **Observations:**
14
+ - The gate fired on all SM activations with user input
15
+ - Baseline: prior to the gate, the SM would silently interpret ambiguous commands without confirmation
16
+ - The activation rate is proportional to SM usage — no runaway or unexpected triggering occurred
17
+ - No occurrences of the gate triggering on internal handoff instructions (correctly scoped to user input)
18
+
19
+ ## Wrong-Approach Reduction
20
+
21
+ Before the confidence-sm gate, the SM occasionally took wrong actions on ambiguous instructions like "continue", "next", or "do it" — starting incorrect stories, routing to the wrong agent, or misinterpreting scope. The gate was designed to catch these ambiguous instructions and request clarification instead of guessing.
22
+
23
+ **Comparison with baseline:**
24
+ - Prior to the gate, wrong-approach incidents from ambiguous SM instructions were an observed pain point that motivated Epic 90
25
+ - After deployment, instructions that would previously have been misinterpreted now produce clarifying questions with specific options
26
+ - The gate's three-check model (target identified, intent clear, no competing interpretations) effectively catches the most common ambiguity patterns
27
+ - Improvement: the SM no longer silently guesses on vague commands — it surfaces options for the user to choose from
28
+
29
+ ## User Experience
30
+
31
+ The gate's impact on usability was assessed for friction and override behavior.
32
+
33
+ **Friction assessment:**
34
+ - The gate adds one evaluation step before SM action, using a Haiku model call — latency impact is minimal
35
+ - When instructions are clear (target + intent present), the gate passes silently with no user-visible friction
36
+ - When instructions are ambiguous, the gate provides structured "Did you mean?" options rather than a generic error
37
+
38
+ **Override and dismissal behavior:**
39
+ - The gate does not currently support user override or bypass — if it fails, the SM requests clarification
40
+ - No users reported the gate as annoying or attempted to dismiss it
41
+ - The skip/bypass mechanism was deliberately omitted to enforce clarification on genuinely ambiguous input
42
+ - If future feedback indicates excessive friction on borderline cases, a confidence threshold could be added
43
+
44
+ ## Rollout Recommendation
45
+
46
+ **Decision: Recommend expanding the confidence gate pattern to other agents.**
47
+
48
+ The confidence-sm gate demonstrated that pre-action ambiguity checking reduces wrong-approach incidents without meaningful friction on clear instructions. The pattern is agent-agnostic — any agent that interprets user instructions could benefit from a similar gate.
49
+
50
+ **Recommended next steps:**
51
+ - Extend to the TEA and Dev agents, which also receive direct user instructions that can be ambiguous
52
+ - Create a parameterized `confidence-{agent}` template so per-agent gates share the same evaluation structure but customize pass/fail criteria for each agent's domain
53
+ - Hold on extending to Reviewer and other agents that primarily receive structured handoff context (lower ambiguity risk)
54
+ - Defer rollout to all agents until per-agent evaluation data confirms the pattern works across different instruction types
@@ -0,0 +1,67 @@
1
+ <gate name="quality-pass" model="haiku">
2
+
3
+ <purpose>
4
+ Verify that all project quality gates pass locally — lint, type checks, and
5
+ tests — before handing off to the next phase. This gate wraps the check.py
6
+ quality runner to ensure the codebase is clean enough for Reviewer's time.
7
+ </purpose>
8
+
9
+ <pass>
10
+ Run the quality gate script for the repos listed in the session file:
11
+
12
+ ```bash
13
+ source .venv/bin/activate && python3 .pennyfarthing/scripts/workflow/check.py
14
+ ```
15
+
16
+ The script runs lint, type checks, and tests concurrently. Exit code 0 means
17
+ all checks passed.
18
+
19
+ If ALL checks pass, return:
20
+
21
+ ```yaml
22
+ GATE_RESULT:
23
+ status: pass
24
+ gate: quality-pass
25
+ message: "All quality gates passing — lint, typecheck, tests clean."
26
+ checks:
27
+ - name: lint
28
+ status: pass
29
+ detail: "Lint clean"
30
+ - name: typecheck
31
+ status: pass
32
+ detail: "Type checks passing"
33
+ - name: tests
34
+ status: pass
35
+ detail: "All tests passing"
36
+ ```
37
+ </pass>
38
+
39
+ <fail>
40
+ If the script exits non-zero, parse its output to identify which checks failed.
41
+ The script prints `[PASS]` or `[FAIL]` for each check (Lint, Type Check, Tests).
42
+
43
+ Return with actionable recovery guidance:
44
+
45
+ ```yaml
46
+ GATE_RESULT:
47
+ status: fail
48
+ gate: quality-pass
49
+ message: "Quality gate failed: {summary of failures}"
50
+ checks:
51
+ - name: lint
52
+ status: pass | fail
53
+ detail: "{lint results or specific failures}"
54
+ - name: typecheck
55
+ status: pass | fail
56
+ detail: "{typecheck results or specific errors}"
57
+ - name: tests
58
+ status: pass | fail
59
+ detail: "{test results or failing test details}"
60
+ recovery:
61
+ - "Fix lint errors: run `npm run lint` to see details"
62
+ - "Fix type errors: run `tsc --noEmit` to see details"
63
+ - "Fix failing tests: run `pnpm test` to see details"
64
+ ```
65
+ </fail>
66
+
67
+ </gate>
@@ -0,0 +1,84 @@
1
+ <gate name="tests-fail" model="haiku">
2
+
3
+ <purpose>
4
+ Verify tests are RED — failing tests exist that cover the acceptance
5
+ criteria. TEA has written tests but implementation hasn't started.
6
+ This gate runs after the TEA agent's red phase to confirm the codebase
7
+ has proper test coverage before Dev begins implementation.
8
+ </purpose>
9
+
10
+ <pass>
11
+ Run these checks and report results:
12
+
13
+ 1. **Failing tests exist:** Run the project test suite for the repos listed in the session file.
14
+ - For `pennyfarthing` repo: `cd pennyfarthing && python3 -m pytest` or `pnpm test`
15
+ - Record: total tests, passed, failed, skipped
16
+ - At least one test MUST be failing (RED state)
17
+
18
+ 2. **Tests cover acceptance criteria:** Read the session file's Acceptance Criteria section.
19
+ - Cross-reference test names/descriptions against each AC
20
+ - Each AC should have at least one corresponding test
21
+
22
+ 3. **Tests are committed:** Run `git status --porcelain` to check for uncommitted test files.
23
+ - All test files should be committed to the branch
24
+ - No uncommitted test files should exist
25
+
26
+ If ALL checks pass, return:
27
+
28
+ ```yaml
29
+ GATE_RESULT:
30
+ status: pass
31
+ gate: tests-fail
32
+ message: "{N} failing tests covering {M} acceptance criteria. Tests committed."
33
+ checks:
34
+ - name: failing-tests
35
+ status: pass
36
+ detail: "{failed}/{total} tests failing (RED state confirmed)"
37
+ - name: ac-coverage
38
+ status: pass
39
+ detail: "All {M} acceptance criteria have test coverage"
40
+ - name: tests-committed
41
+ status: pass
42
+ detail: "All test files committed to branch"
43
+ ```
44
+ </pass>
45
+
46
+ <fail>
47
+ If ANY check fails, diagnose and report:
48
+
49
+ 1. **No failing tests found:** TEA didn't write tests or tests are already passing.
50
+ - This means implementation may have leaked into the red phase
51
+ - Or tests are not properly asserting against unimplemented code
52
+
53
+ 2. **Tests don't cover ACs:** Some acceptance criteria lack test coverage.
54
+ - List which ACs are missing tests
55
+ - TEA needs to add additional test cases
56
+
57
+ 3. **Tests aren't committed:** Uncommitted test files exist.
58
+ - List uncommitted test files
59
+ - TEA needs to commit before handoff
60
+
61
+ Return with actionable recovery guidance:
62
+
63
+ ```yaml
64
+ GATE_RESULT:
65
+ status: fail
66
+ gate: tests-fail
67
+ message: "Gate failed: {summary of what's missing}"
68
+ checks:
69
+ - name: failing-tests
70
+ status: pass | fail
71
+ detail: "{description of test state}"
72
+ - name: ac-coverage
73
+ status: pass | fail
74
+ detail: "{list of uncovered ACs}"
75
+ - name: tests-committed
76
+ status: pass | fail
77
+ detail: "{list of uncommitted files}"
78
+ recovery:
79
+ - "Write failing tests for: {uncovered ACs}"
80
+ - "Commit test files: git add {files} && git commit"
81
+ ```
82
+ </fail>
83
+
84
+ </gate>
@@ -0,0 +1,79 @@
1
+ <gate name="tests-pass" model="haiku">
2
+
3
+ <purpose>
4
+ Verify that all tests pass and the working tree is clean before handing off
5
+ to the reviewer. This gate runs after the Dev agent's implementation phase
6
+ to confirm the codebase is in a GREEN state.
7
+ </purpose>
8
+
9
+ <pass>
10
+ Run these checks and report results:
11
+
12
+ 1. **Test suite:** Run the project test suite for the repos listed in the session file.
13
+ - For `pennyfarthing` repo: `cd pennyfarthing && pnpm test`
14
+ - For `orchestrator` repo: tests in the orchestrator root if applicable
15
+ - Record: total tests, passed, failed, skipped
16
+
17
+ 2. **Working tree:** Run `git status --porcelain` in each repo listed in session `**Repos:**`.
18
+ - Verify no uncommitted or untracked files (empty output = clean)
19
+
20
+ 3. **Branch status:** Run `git branch --show-current` and `git log --oneline -1`.
21
+ - Confirm on the expected feature branch from session `**Branch:**`
22
+
23
+ If ALL checks pass, return:
24
+
25
+ ```yaml
26
+ GATE_RESULT:
27
+ status: pass
28
+ gate: tests-pass
29
+ message: "All {N} tests passing. Working tree clean. Branch: {branch}"
30
+ checks:
31
+ - name: test-suite
32
+ status: pass
33
+ detail: "{passed}/{total} tests passing ({skipped} skipped)"
34
+ - name: working-tree
35
+ status: pass
36
+ detail: "No uncommitted changes"
37
+ - name: branch-status
38
+ status: pass
39
+ detail: "On branch {branch}, HEAD at {short-sha}"
40
+ ```
41
+ </pass>
42
+
43
+ <fail>
44
+ If ANY check fails, diagnose and report:
45
+
46
+ 1. **Failing tests:** List each failing test file and line number.
47
+ - Run tests with verbose output to capture failure details.
48
+ - Group failures by file.
49
+
50
+ 2. **Dirty working tree:** List uncommitted and untracked files.
51
+ - Run `git status --porcelain` and report each file with its status code.
52
+
53
+ 3. **Wrong branch:** Report actual vs expected branch name.
54
+
55
+ Return with actionable recovery guidance:
56
+
57
+ ```yaml
58
+ GATE_RESULT:
59
+ status: fail
60
+ gate: tests-pass
61
+ message: "Gate failed: {summary of failures}"
62
+ checks:
63
+ - name: test-suite
64
+ status: pass | fail
65
+ detail: "{description of test results or failures}"
66
+ - name: working-tree
67
+ status: pass | fail
68
+ detail: "{list of uncommitted files, or 'clean'}"
69
+ - name: branch-status
70
+ status: pass | fail
71
+ detail: "{branch info or mismatch details}"
72
+ recovery:
73
+ - "Fix failing tests in: {file1}, {file2}"
74
+ - "Commit or stash uncommitted changes before handoff"
75
+ - "Switch to correct branch: git checkout {expected-branch}"
76
+ ```
77
+ </fail>
78
+
79
+ </gate>