@pennyfarthing/core 10.1.0 β†’ 10.3.0

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 (422) hide show
  1. package/README.md +22 -24
  2. package/package.json +3 -1
  3. package/packages/core/dist/cli/commands/doctor-file-layout.test.js.map +1 -1
  4. package/packages/core/dist/cli/commands/doctor-legacy.test.js +24 -0
  5. package/packages/core/dist/cli/commands/doctor-legacy.test.js.map +1 -1
  6. package/packages/core/dist/cli/commands/doctor.d.ts.map +1 -1
  7. package/packages/core/dist/cli/commands/doctor.js +101 -15
  8. package/packages/core/dist/cli/commands/doctor.js.map +1 -1
  9. package/packages/core/dist/cli/commands/e2e-fresh-install.test.js +2 -2
  10. package/packages/core/dist/cli/commands/e2e-fresh-install.test.js.map +1 -1
  11. package/packages/core/dist/cli/commands/e2e-upgrade.test.js +2 -2
  12. package/packages/core/dist/cli/commands/e2e-upgrade.test.js.map +1 -1
  13. package/packages/core/dist/cli/commands/hooks-consolidation.test.js +2 -2
  14. package/packages/core/dist/cli/commands/hooks-consolidation.test.js.map +1 -1
  15. package/packages/core/dist/cli/commands/init-consolidation.test.js.map +1 -1
  16. package/packages/core/dist/cli/commands/theme.js +1 -1
  17. package/packages/core/dist/cli/commands/theme.js.map +1 -1
  18. package/packages/core/dist/cli/commands/uninstall.d.ts.map +1 -1
  19. package/packages/core/dist/cli/commands/uninstall.js +24 -13
  20. package/packages/core/dist/cli/commands/uninstall.js.map +1 -1
  21. package/packages/core/dist/cli/commands/update-consolidation.test.js +0 -10
  22. package/packages/core/dist/cli/commands/update-consolidation.test.js.map +1 -1
  23. package/packages/core/dist/cli/commands/update.js.map +1 -1
  24. package/packages/core/dist/cli/ocean-profiles.test.js.map +1 -1
  25. package/packages/core/dist/cli/theme-maker.test.js +64 -115
  26. package/packages/core/dist/cli/theme-maker.test.js.map +1 -1
  27. package/packages/core/dist/cli/utils/themes.d.ts.map +1 -1
  28. package/packages/core/dist/cli/utils/themes.js +3 -2
  29. package/packages/core/dist/cli/utils/themes.js.map +1 -1
  30. package/packages/core/dist/index.d.ts +1 -1
  31. package/packages/core/dist/index.d.ts.map +1 -1
  32. package/packages/core/dist/index.js +2 -2
  33. package/packages/core/dist/index.js.map +1 -1
  34. package/packages/core/dist/plugins/plugin-discovery.d.ts +116 -0
  35. package/packages/core/dist/plugins/plugin-discovery.d.ts.map +1 -0
  36. package/packages/core/dist/plugins/plugin-discovery.js +165 -0
  37. package/packages/core/dist/plugins/plugin-discovery.js.map +1 -0
  38. package/packages/core/dist/plugins/plugin-discovery.test.d.ts +22 -0
  39. package/packages/core/dist/plugins/plugin-discovery.test.d.ts.map +1 -0
  40. package/packages/core/dist/plugins/plugin-discovery.test.js +498 -0
  41. package/packages/core/dist/plugins/plugin-discovery.test.js.map +1 -0
  42. package/packages/core/dist/scripts/add-ocean-profiles.js +1 -1
  43. package/packages/core/dist/scripts/add-ocean-profiles.js.map +1 -1
  44. package/packages/core/dist/scripts/generate-all-spiders.js +2 -0
  45. package/packages/core/dist/scripts/generate-all-spiders.js.map +1 -1
  46. package/packages/core/dist/scripts/generate-report.d.ts.map +1 -1
  47. package/packages/core/dist/scripts/generate-report.js +2 -0
  48. package/packages/core/dist/scripts/generate-report.js.map +1 -1
  49. package/packages/core/dist/scripts/generate-spider-report.js.map +1 -1
  50. package/packages/core/dist/scripts/generate-spider.d.ts.map +1 -1
  51. package/packages/core/dist/scripts/generate-spider.js +2 -0
  52. package/packages/core/dist/scripts/generate-spider.js.map +1 -1
  53. package/packages/core/dist/scripts/validate-ocean-profiles.js +1 -1
  54. package/packages/core/dist/scripts/validate-ocean-profiles.js.map +1 -1
  55. package/packages/core/dist/workflow/file-watch.d.ts +82 -0
  56. package/packages/core/dist/workflow/file-watch.d.ts.map +1 -0
  57. package/packages/core/dist/workflow/file-watch.js +198 -0
  58. package/packages/core/dist/workflow/file-watch.js.map +1 -0
  59. package/packages/core/dist/workflow/file-watch.test.d.ts +21 -0
  60. package/packages/core/dist/workflow/file-watch.test.d.ts.map +1 -0
  61. package/packages/core/dist/workflow/file-watch.test.js +469 -0
  62. package/packages/core/dist/workflow/file-watch.test.js.map +1 -0
  63. package/packages/core/dist/workflow/observation-writer.d.ts +79 -0
  64. package/packages/core/dist/workflow/observation-writer.d.ts.map +1 -0
  65. package/packages/core/dist/workflow/observation-writer.js +97 -0
  66. package/packages/core/dist/workflow/observation-writer.js.map +1 -0
  67. package/packages/core/dist/workflow/observation-writer.test.d.ts +18 -0
  68. package/packages/core/dist/workflow/observation-writer.test.d.ts.map +1 -0
  69. package/packages/core/dist/workflow/observation-writer.test.js +424 -0
  70. package/packages/core/dist/workflow/observation-writer.test.js.map +1 -0
  71. package/packages/core/dist/workflow/output-path-normalizer.d.ts +47 -0
  72. package/packages/core/dist/workflow/output-path-normalizer.d.ts.map +1 -0
  73. package/packages/core/dist/workflow/output-path-normalizer.js +79 -0
  74. package/packages/core/dist/workflow/output-path-normalizer.js.map +1 -0
  75. package/packages/core/dist/workflow/output-path-normalizer.test.d.ts +16 -0
  76. package/packages/core/dist/workflow/output-path-normalizer.test.d.ts.map +1 -0
  77. package/packages/core/dist/workflow/output-path-normalizer.test.js +157 -0
  78. package/packages/core/dist/workflow/output-path-normalizer.test.js.map +1 -0
  79. package/packages/core/dist/workflow/story-workflow-routing.test.js +4 -2
  80. package/packages/core/dist/workflow/story-workflow-routing.test.js.map +1 -1
  81. package/packages/core/dist/workflow/tandem-lifecycle.d.ts +117 -0
  82. package/packages/core/dist/workflow/tandem-lifecycle.d.ts.map +1 -0
  83. package/packages/core/dist/workflow/tandem-lifecycle.js +186 -0
  84. package/packages/core/dist/workflow/tandem-lifecycle.js.map +1 -0
  85. package/packages/core/dist/workflow/tandem-lifecycle.test.d.ts +16 -0
  86. package/packages/core/dist/workflow/tandem-lifecycle.test.d.ts.map +1 -0
  87. package/packages/core/dist/workflow/tandem-lifecycle.test.js +531 -0
  88. package/packages/core/dist/workflow/tandem-lifecycle.test.js.map +1 -0
  89. package/packages/core/dist/workflow/tool-watch.d.ts +68 -0
  90. package/packages/core/dist/workflow/tool-watch.d.ts.map +1 -0
  91. package/packages/core/dist/workflow/tool-watch.js +166 -0
  92. package/packages/core/dist/workflow/tool-watch.js.map +1 -0
  93. package/packages/core/dist/workflow/tool-watch.test.d.ts +18 -0
  94. package/packages/core/dist/workflow/tool-watch.test.d.ts.map +1 -0
  95. package/packages/core/dist/workflow/tool-watch.test.js +717 -0
  96. package/packages/core/dist/workflow/tool-watch.test.js.map +1 -0
  97. package/packages/core/dist/workflow/variable-resolver.js +1 -1
  98. package/packages/core/dist/workflow/variable-resolver.js.map +1 -1
  99. package/packages/core/dist/workflow/workflow-migration.test.js +8 -4
  100. package/packages/core/dist/workflow/workflow-migration.test.js.map +1 -1
  101. package/packages/core/dist/workflow/workflow-schema.d.ts +7 -0
  102. package/packages/core/dist/workflow/workflow-schema.d.ts.map +1 -1
  103. package/packages/core/dist/workflow/workflow-schema.js +44 -0
  104. package/packages/core/dist/workflow/workflow-schema.js.map +1 -1
  105. package/packages/core/dist/workflow/workflow-schema.test.d.ts.map +1 -1
  106. package/packages/core/dist/workflow/workflow-schema.test.js +192 -0
  107. package/packages/core/dist/workflow/workflow-schema.test.js.map +1 -1
  108. package/pennyfarthing-dist/agents/README.md +3 -1
  109. package/pennyfarthing-dist/agents/ba.md +165 -0
  110. package/pennyfarthing-dist/agents/handoff.md +18 -3
  111. package/pennyfarthing-dist/agents/sm-finish.md +1 -1
  112. package/pennyfarthing-dist/agents/sm-handoff.md +27 -4
  113. package/pennyfarthing-dist/agents/sm.md +11 -5
  114. package/pennyfarthing-dist/agents/tandem-backseat.md +119 -0
  115. package/pennyfarthing-dist/commands/ba.md +17 -0
  116. package/pennyfarthing-dist/commands/setup.md +4 -0
  117. package/pennyfarthing-dist/guides/agent-behavior.md +62 -6
  118. package/pennyfarthing-dist/guides/bikelane.md +3 -2
  119. package/pennyfarthing-dist/guides/scale-levels.md +4 -6
  120. package/pennyfarthing-dist/guides/tandem-protocol.md +158 -0
  121. package/pennyfarthing-dist/guides/workflow-schema.md +1 -1
  122. package/pennyfarthing-dist/personas/themes/a-team.yaml +30 -0
  123. package/pennyfarthing-dist/personas/themes/alice-in-wonderland.yaml +30 -0
  124. package/pennyfarthing-dist/personas/themes/battlestar-galactica.yaml +30 -0
  125. package/pennyfarthing-dist/personas/themes/blade-runner.yaml +30 -0
  126. package/pennyfarthing-dist/personas/themes/catch-22.yaml +30 -0
  127. package/pennyfarthing-dist/personas/themes/control.yaml +30 -0
  128. package/pennyfarthing-dist/personas/themes/cowboy-bebop.yaml +31 -0
  129. package/pennyfarthing-dist/personas/themes/discworld.yaml +32 -1
  130. package/pennyfarthing-dist/personas/themes/doctor-who.yaml +31 -0
  131. package/pennyfarthing-dist/personas/themes/dune.yaml +32 -0
  132. package/pennyfarthing-dist/personas/themes/fifth-element.yaml +327 -0
  133. package/pennyfarthing-dist/personas/themes/firefly.yaml +31 -0
  134. package/pennyfarthing-dist/personas/themes/game-of-thrones.yaml +30 -0
  135. package/pennyfarthing-dist/personas/themes/harry-potter.yaml +30 -0
  136. package/pennyfarthing-dist/personas/themes/hitchhikers-guide.yaml +30 -0
  137. package/pennyfarthing-dist/personas/themes/lord-of-the-rings.yaml +30 -0
  138. package/pennyfarthing-dist/personas/themes/mad-max.yaml +30 -0
  139. package/pennyfarthing-dist/personas/themes/mash.yaml +33 -0
  140. package/pennyfarthing-dist/personas/themes/princess-bride.yaml +34 -0
  141. package/pennyfarthing-dist/personas/themes/sandman.yaml +33 -0
  142. package/pennyfarthing-dist/personas/themes/star-trek-tng.yaml +34 -0
  143. package/pennyfarthing-dist/personas/themes/star-wars.yaml +33 -0
  144. package/pennyfarthing-dist/personas/themes/the-expanse.yaml +30 -0
  145. package/pennyfarthing-dist/personas/themes/the-matrix.yaml +30 -0
  146. package/pennyfarthing-dist/personas/themes/watchmen.yaml +30 -0
  147. package/pennyfarthing-dist/personas/themes/west-wing.yaml +30 -0
  148. package/pennyfarthing-dist/personas/themes/x-files.yaml +30 -0
  149. package/pennyfarthing-dist/scripts/README.md +1 -1
  150. package/pennyfarthing-dist/scripts/core/agent-session.sh +1 -1
  151. package/pennyfarthing-dist/scripts/hooks/bell-mode-hook.sh +131 -54
  152. package/pennyfarthing-dist/scripts/hooks/post-merge.sh +20 -10
  153. package/pennyfarthing-dist/scripts/misc/statusline.sh +50 -8
  154. package/pennyfarthing-dist/scripts/portraits/generate-portraits.py +2 -2
  155. package/pennyfarthing-dist/scripts/validation/validate-agent-schema.sh +1 -0
  156. package/pennyfarthing-dist/scripts/workflow/README.md +2 -2
  157. package/pennyfarthing-dist/scripts/workflow/finish-story.sh +10 -189
  158. package/pennyfarthing-dist/skills/skill-registry.schema.json +8 -0
  159. package/pennyfarthing-dist/skills/skill-registry.yaml +1 -1
  160. package/pennyfarthing-dist/skills/sprint/skill.md +25 -2
  161. package/pennyfarthing-dist/skills/theme/skill.md +1 -1
  162. package/pennyfarthing-dist/skills/workflow/skill.md +24 -1
  163. package/pennyfarthing-dist/workflows/architecture/workflow.yaml +65 -0
  164. package/pennyfarthing-dist/workflows/architecture.yaml +2 -2
  165. package/pennyfarthing-dist/workflows/bdd-tandem.yaml +70 -0
  166. package/pennyfarthing-dist/workflows/epics-and-stories/workflow.yaml +2 -2
  167. package/pennyfarthing-dist/workflows/implementation-readiness/workflow.yaml +2 -2
  168. package/pennyfarthing-dist/workflows/prd/workflow.yaml +2 -2
  169. package/pennyfarthing-dist/workflows/product-brief/workflow.yaml +2 -2
  170. package/pennyfarthing-dist/workflows/project-context/workflow.yaml +2 -2
  171. package/pennyfarthing-dist/workflows/quick-dev/workflow.yaml +2 -2
  172. package/pennyfarthing-dist/workflows/research/workflow.yaml +2 -2
  173. package/pennyfarthing-dist/workflows/retrospective/workflow.yaml +1 -1
  174. package/pennyfarthing-dist/workflows/sprint-planning/workflow.yaml +3 -3
  175. package/pennyfarthing-dist/workflows/tdd-tandem.yaml +61 -0
  176. package/pennyfarthing-dist/workflows/ux-design/workflow.yaml +2 -2
  177. package/pennyfarthing_scripts/__pycache__/cli.cpython-314.pyc +0 -0
  178. package/pennyfarthing_scripts/__pycache__/hooks.cpython-314.pyc +0 -0
  179. package/pennyfarthing_scripts/__pycache__/pretooluse_hook.cpython-314.pyc +0 -0
  180. package/pennyfarthing_scripts/__pycache__/schema_validation_hook.cpython-314.pyc +0 -0
  181. package/pennyfarthing_scripts/__pycache__/workflow.cpython-314.pyc +0 -0
  182. package/pennyfarthing_scripts/bellmode_hook.py +202 -47
  183. package/pennyfarthing_scripts/bikerack/__init__.py +36 -0
  184. package/pennyfarthing_scripts/bikerack/__main__.py +5 -0
  185. package/pennyfarthing_scripts/bikerack/__pycache__/__init__.cpython-314.pyc +0 -0
  186. package/pennyfarthing_scripts/bikerack/__pycache__/__main__.cpython-314.pyc +0 -0
  187. package/pennyfarthing_scripts/bikerack/__pycache__/cli.cpython-314.pyc +0 -0
  188. package/pennyfarthing_scripts/bikerack/__pycache__/launcher.cpython-314.pyc +0 -0
  189. package/pennyfarthing_scripts/bikerack/cli.py +148 -0
  190. package/pennyfarthing_scripts/bikerack/launcher.py +181 -0
  191. package/pennyfarthing_scripts/brownfield/__init__.py +6 -6
  192. package/pennyfarthing_scripts/brownfield/__main__.py +1 -0
  193. package/pennyfarthing_scripts/brownfield/cli.py +0 -1
  194. package/pennyfarthing_scripts/brownfield/discover.py +1 -2
  195. package/pennyfarthing_scripts/cli.py +16 -6
  196. package/pennyfarthing_scripts/codemarkers/__init__.py +5 -1
  197. package/pennyfarthing_scripts/codemarkers/__pycache__/__init__.cpython-314.pyc +0 -0
  198. package/pennyfarthing_scripts/codemarkers/__pycache__/__main__.cpython-314.pyc +0 -0
  199. package/pennyfarthing_scripts/codemarkers/__pycache__/analyze.cpython-314.pyc +0 -0
  200. package/pennyfarthing_scripts/codemarkers/__pycache__/cli.cpython-314.pyc +0 -0
  201. package/pennyfarthing_scripts/codemarkers/__pycache__/formatters.cpython-314.pyc +0 -0
  202. package/pennyfarthing_scripts/codemarkers/__pycache__/models.cpython-314.pyc +0 -0
  203. package/pennyfarthing_scripts/codemarkers/analyze.py +177 -2
  204. package/pennyfarthing_scripts/codemarkers/cli.py +50 -0
  205. package/pennyfarthing_scripts/codemarkers/formatters.py +0 -1
  206. package/pennyfarthing_scripts/codemarkers/models.py +15 -0
  207. package/pennyfarthing_scripts/common/__init__.py +8 -9
  208. package/pennyfarthing_scripts/common/__pycache__/__init__.cpython-314.pyc +0 -0
  209. package/pennyfarthing_scripts/common/__pycache__/config.cpython-314.pyc +0 -0
  210. package/pennyfarthing_scripts/common/config.py +1 -1
  211. package/pennyfarthing_scripts/complexity/__init__.py +1 -1
  212. package/pennyfarthing_scripts/complexity/__pycache__/__init__.cpython-314.pyc +0 -0
  213. package/pennyfarthing_scripts/complexity/__pycache__/__main__.cpython-314.pyc +0 -0
  214. package/pennyfarthing_scripts/complexity/__pycache__/analyze.cpython-314.pyc +0 -0
  215. package/pennyfarthing_scripts/complexity/__pycache__/cli.cpython-314.pyc +0 -0
  216. package/pennyfarthing_scripts/complexity/__pycache__/formatters.cpython-314.pyc +0 -0
  217. package/pennyfarthing_scripts/complexity/__pycache__/models.cpython-314.pyc +0 -0
  218. package/pennyfarthing_scripts/complexity/analyze.py +1 -1
  219. package/pennyfarthing_scripts/complexity/cli.py +5 -1
  220. package/pennyfarthing_scripts/complexity/formatters.py +1 -1
  221. package/pennyfarthing_scripts/context.py +14 -15
  222. package/pennyfarthing_scripts/deadcode/__pycache__/__init__.cpython-314.pyc +0 -0
  223. package/pennyfarthing_scripts/deadcode/__pycache__/__main__.cpython-314.pyc +0 -0
  224. package/pennyfarthing_scripts/deadcode/__pycache__/analyze.cpython-314.pyc +0 -0
  225. package/pennyfarthing_scripts/deadcode/__pycache__/cli.cpython-314.pyc +0 -0
  226. package/pennyfarthing_scripts/deadcode/__pycache__/formatters.cpython-314.pyc +0 -0
  227. package/pennyfarthing_scripts/deadcode/__pycache__/models.cpython-314.pyc +0 -0
  228. package/pennyfarthing_scripts/deadcode/analyze.py +3 -4
  229. package/pennyfarthing_scripts/deadcode/cli.py +2 -2
  230. package/pennyfarthing_scripts/dependencies/__init__.py +2 -2
  231. package/pennyfarthing_scripts/dependencies/__pycache__/__init__.cpython-314.pyc +0 -0
  232. package/pennyfarthing_scripts/dependencies/__pycache__/__main__.cpython-314.pyc +0 -0
  233. package/pennyfarthing_scripts/dependencies/__pycache__/analyze.cpython-314.pyc +0 -0
  234. package/pennyfarthing_scripts/dependencies/__pycache__/cli.cpython-314.pyc +0 -0
  235. package/pennyfarthing_scripts/dependencies/__pycache__/formatters.cpython-314.pyc +0 -0
  236. package/pennyfarthing_scripts/dependencies/__pycache__/models.cpython-314.pyc +0 -0
  237. package/pennyfarthing_scripts/dependencies/analyze.py +1 -1
  238. package/pennyfarthing_scripts/dependencies/cli.py +8 -4
  239. package/pennyfarthing_scripts/dependencies/formatters.py +1 -1
  240. package/pennyfarthing_scripts/git/__init__.py +5 -5
  241. package/pennyfarthing_scripts/git/create_branches.py +3 -2
  242. package/pennyfarthing_scripts/git/status_all.py +1 -1
  243. package/pennyfarthing_scripts/healthscore/__init__.py +2 -2
  244. package/pennyfarthing_scripts/healthscore/__main__.py +8 -0
  245. package/pennyfarthing_scripts/healthscore/__pycache__/__init__.cpython-314.pyc +0 -0
  246. package/pennyfarthing_scripts/healthscore/__pycache__/__main__.cpython-314.pyc +0 -0
  247. package/pennyfarthing_scripts/healthscore/__pycache__/analyze.cpython-314.pyc +0 -0
  248. package/pennyfarthing_scripts/healthscore/__pycache__/cli.cpython-314.pyc +0 -0
  249. package/pennyfarthing_scripts/healthscore/__pycache__/formatters.cpython-314.pyc +0 -0
  250. package/pennyfarthing_scripts/healthscore/__pycache__/models.cpython-314.pyc +0 -0
  251. package/pennyfarthing_scripts/healthscore/analyze.py +452 -21
  252. package/pennyfarthing_scripts/healthscore/cli.py +5 -1
  253. package/pennyfarthing_scripts/healthscore/models.py +0 -1
  254. package/pennyfarthing_scripts/hooks.py +8 -11
  255. package/pennyfarthing_scripts/hotspots/__init__.py +6 -6
  256. package/pennyfarthing_scripts/hotspots/__pycache__/__init__.cpython-314.pyc +0 -0
  257. package/pennyfarthing_scripts/hotspots/__pycache__/analyze.cpython-314.pyc +0 -0
  258. package/pennyfarthing_scripts/hotspots/__pycache__/cli.cpython-314.pyc +0 -0
  259. package/pennyfarthing_scripts/hotspots/__pycache__/models.cpython-314.pyc +0 -0
  260. package/pennyfarthing_scripts/hotspots/analyze.py +128 -14
  261. package/pennyfarthing_scripts/hotspots/cli.py +2 -2
  262. package/pennyfarthing_scripts/hotspots/models.py +0 -1
  263. package/pennyfarthing_scripts/jira/__init__.py +15 -17
  264. package/pennyfarthing_scripts/jira/__pycache__/__init__.cpython-314.pyc +0 -0
  265. package/pennyfarthing_scripts/jira/__pycache__/bidirectional.cpython-314.pyc +0 -0
  266. package/pennyfarthing_scripts/jira/__pycache__/claim.cpython-314.pyc +0 -0
  267. package/pennyfarthing_scripts/jira/__pycache__/cli.cpython-314.pyc +0 -0
  268. package/pennyfarthing_scripts/jira/__pycache__/client.cpython-314.pyc +0 -0
  269. package/pennyfarthing_scripts/jira/__pycache__/create.cpython-314.pyc +0 -0
  270. package/pennyfarthing_scripts/jira/__pycache__/epic.cpython-314.pyc +0 -0
  271. package/pennyfarthing_scripts/jira/__pycache__/reconcile.cpython-314.pyc +0 -0
  272. package/pennyfarthing_scripts/jira/__pycache__/story.cpython-314.pyc +0 -0
  273. package/pennyfarthing_scripts/jira/__pycache__/sync.cpython-314.pyc +0 -0
  274. package/pennyfarthing_scripts/jira/bidirectional.py +2 -3
  275. package/pennyfarthing_scripts/jira/claim.py +21 -0
  276. package/pennyfarthing_scripts/jira/cli.py +2 -2
  277. package/pennyfarthing_scripts/jira/client.py +4 -4
  278. package/pennyfarthing_scripts/jira/create.py +45 -1
  279. package/pennyfarthing_scripts/jira/epic.py +3 -2
  280. package/pennyfarthing_scripts/jira/reconcile.py +0 -1
  281. package/pennyfarthing_scripts/jira/story.py +2 -0
  282. package/pennyfarthing_scripts/jira/sync.py +1 -1
  283. package/pennyfarthing_scripts/migration/__pycache__/__init__.cpython-314.pyc +0 -0
  284. package/pennyfarthing_scripts/migration/__pycache__/session.cpython-314.pyc +0 -0
  285. package/pennyfarthing_scripts/migration/__pycache__/skill.cpython-314.pyc +0 -0
  286. package/pennyfarthing_scripts/migration/__pycache__/step.cpython-314.pyc +0 -0
  287. package/pennyfarthing_scripts/migration/__pycache__/validate.cpython-314.pyc +0 -0
  288. package/pennyfarthing_scripts/migration/skill.py +0 -1
  289. package/pennyfarthing_scripts/migration/step.py +0 -1
  290. package/pennyfarthing_scripts/migration/validate.py +8 -5
  291. package/pennyfarthing_scripts/patch_mode.py +2 -2
  292. package/pennyfarthing_scripts/preflight/__init__.py +1 -1
  293. package/pennyfarthing_scripts/preflight/__pycache__/__init__.cpython-314.pyc +0 -0
  294. package/pennyfarthing_scripts/preflight/__pycache__/finish.cpython-314.pyc +0 -0
  295. package/pennyfarthing_scripts/preflight/finish.py +0 -1
  296. package/pennyfarthing_scripts/pretooluse_hook.py +6 -7
  297. package/pennyfarthing_scripts/prime/__init__.py +2 -0
  298. package/pennyfarthing_scripts/prime/__pycache__/__init__.cpython-314.pyc +0 -0
  299. package/pennyfarthing_scripts/prime/__pycache__/cli.cpython-314.pyc +0 -0
  300. package/pennyfarthing_scripts/prime/__pycache__/loader.cpython-314.pyc +0 -0
  301. package/pennyfarthing_scripts/prime/__pycache__/persona.cpython-314.pyc +0 -0
  302. package/pennyfarthing_scripts/prime/__pycache__/tiers.cpython-314.pyc +0 -0
  303. package/pennyfarthing_scripts/prime/cli.py +18 -1
  304. package/pennyfarthing_scripts/prime/loader.py +72 -3
  305. package/pennyfarthing_scripts/prime/persona.py +4 -2
  306. package/pennyfarthing_scripts/prime/tiers.py +17 -4
  307. package/pennyfarthing_scripts/schema_validation_hook.py +2 -3
  308. package/pennyfarthing_scripts/sprint/__init__.py +10 -12
  309. package/pennyfarthing_scripts/sprint/__main__.py +2 -2
  310. package/pennyfarthing_scripts/sprint/__pycache__/__init__.cpython-314.pyc +0 -0
  311. package/pennyfarthing_scripts/sprint/__pycache__/archive.cpython-314.pyc +0 -0
  312. package/pennyfarthing_scripts/sprint/__pycache__/archive_epic.cpython-314.pyc +0 -0
  313. package/pennyfarthing_scripts/sprint/__pycache__/cli.cpython-314.pyc +0 -0
  314. package/pennyfarthing_scripts/sprint/__pycache__/epic_add.cpython-314.pyc +0 -0
  315. package/pennyfarthing_scripts/sprint/__pycache__/import_epic.cpython-314.pyc +0 -0
  316. package/pennyfarthing_scripts/sprint/__pycache__/loader.cpython-314.pyc +0 -0
  317. package/pennyfarthing_scripts/sprint/__pycache__/status.cpython-314.pyc +0 -0
  318. package/pennyfarthing_scripts/sprint/__pycache__/story_add.cpython-314.pyc +0 -0
  319. package/pennyfarthing_scripts/sprint/__pycache__/story_finish.cpython-314.pyc +0 -0
  320. package/pennyfarthing_scripts/sprint/__pycache__/story_update.cpython-314.pyc +0 -0
  321. package/pennyfarthing_scripts/sprint/__pycache__/validate_cmd.cpython-314.pyc +0 -0
  322. package/pennyfarthing_scripts/sprint/__pycache__/validator.cpython-314.pyc +0 -0
  323. package/pennyfarthing_scripts/sprint/__pycache__/work.cpython-314.pyc +0 -0
  324. package/pennyfarthing_scripts/sprint/__pycache__/yaml_io.cpython-314.pyc +0 -0
  325. package/pennyfarthing_scripts/sprint/archive.py +0 -1
  326. package/pennyfarthing_scripts/sprint/archive_epic.py +1 -4
  327. package/pennyfarthing_scripts/sprint/cli.py +34 -28
  328. package/pennyfarthing_scripts/sprint/epic_add.py +8 -1
  329. package/pennyfarthing_scripts/sprint/import_epic.py +42 -18
  330. package/pennyfarthing_scripts/sprint/loader.py +6 -0
  331. package/pennyfarthing_scripts/sprint/status.py +1 -2
  332. package/pennyfarthing_scripts/sprint/story_add.py +2 -2
  333. package/pennyfarthing_scripts/sprint/story_finish.py +3 -5
  334. package/pennyfarthing_scripts/sprint/story_update.py +11 -3
  335. package/pennyfarthing_scripts/sprint/validate_cmd.py +0 -1
  336. package/pennyfarthing_scripts/sprint/validator.py +120 -6
  337. package/pennyfarthing_scripts/sprint/work.py +1 -4
  338. package/pennyfarthing_scripts/sprint/yaml_io.py +10 -2
  339. package/pennyfarthing_scripts/story/__init__.py +14 -16
  340. package/pennyfarthing_scripts/story/__pycache__/__init__.cpython-314.pyc +0 -0
  341. package/pennyfarthing_scripts/story/__pycache__/size.cpython-314.pyc +0 -0
  342. package/pennyfarthing_scripts/story/__pycache__/template.cpython-314.pyc +0 -0
  343. package/pennyfarthing_scripts/story/size.py +0 -1
  344. package/pennyfarthing_scripts/story/template.py +0 -1
  345. package/pennyfarthing_scripts/swebench.py +1 -2
  346. package/pennyfarthing_scripts/tests/__pycache__/conftest.cpython-314-pytest-9.0.2.pyc +0 -0
  347. package/pennyfarthing_scripts/tests/__pycache__/test_bikerack.cpython-314-pytest-9.0.2.pyc +0 -0
  348. package/pennyfarthing_scripts/tests/__pycache__/test_epic_shard_validation.cpython-314-pytest-9.0.2.pyc +0 -0
  349. package/pennyfarthing_scripts/tests/__pycache__/test_healthscore.cpython-314-pytest-9.0.2.pyc +0 -0
  350. package/pennyfarthing_scripts/tests/__pycache__/test_sprint_validator.cpython-314-pytest-9.0.2.pyc +0 -0
  351. package/pennyfarthing_scripts/tests/__pycache__/test_yaml_io.cpython-314-pytest-9.0.2.pyc +0 -0
  352. package/pennyfarthing_scripts/tests/conftest.py +1 -2
  353. package/pennyfarthing_scripts/tests/test_bikerack.py +785 -0
  354. package/pennyfarthing_scripts/tests/test_brownfield.py +10 -13
  355. package/pennyfarthing_scripts/tests/test_cli_modules.py +0 -4
  356. package/pennyfarthing_scripts/tests/test_codemarkers.py +13 -8
  357. package/pennyfarthing_scripts/tests/test_common.py +9 -4
  358. package/pennyfarthing_scripts/tests/test_epic_shard_validation.py +699 -0
  359. package/pennyfarthing_scripts/tests/test_git_utils.py +10 -13
  360. package/pennyfarthing_scripts/tests/test_healthscore.py +17 -25
  361. package/pennyfarthing_scripts/tests/test_jira_package.py +0 -3
  362. package/pennyfarthing_scripts/tests/test_package_structure.py +3 -16
  363. package/pennyfarthing_scripts/tests/test_patch_mode.py +7 -11
  364. package/pennyfarthing_scripts/tests/test_prime.py +39 -21
  365. package/pennyfarthing_scripts/tests/test_sprint_package.py +3 -8
  366. package/pennyfarthing_scripts/tests/test_sprint_validator.py +53 -5
  367. package/pennyfarthing_scripts/tests/test_story_add.py +3 -7
  368. package/pennyfarthing_scripts/tests/test_story_package.py +0 -3
  369. package/pennyfarthing_scripts/tests/test_story_update.py +5 -10
  370. package/pennyfarthing_scripts/tests/test_tiers.py +18 -17
  371. package/pennyfarthing_scripts/tests/test_token_counting.py +19 -13
  372. package/pennyfarthing_scripts/tests/test_topology_loader.py +620 -0
  373. package/pennyfarthing_scripts/tests/test_validate_cmd.py +2 -7
  374. package/pennyfarthing_scripts/tests/test_workflow_check.py +0 -2
  375. package/pennyfarthing_scripts/tests/test_yaml_io.py +0 -3
  376. package/pennyfarthing_scripts/theme/__pycache__/__init__.cpython-314.pyc +0 -0
  377. package/pennyfarthing_scripts/theme/__pycache__/cli.cpython-314.pyc +0 -0
  378. package/pennyfarthing_scripts/theme/cli.py +3 -2
  379. package/pennyfarthing_scripts/validate/__init__.py +21 -0
  380. package/pennyfarthing_scripts/validate/__pycache__/__init__.cpython-314.pyc +0 -0
  381. package/pennyfarthing_scripts/validate/__pycache__/cli.cpython-314.pyc +0 -0
  382. package/pennyfarthing_scripts/validate/adapters/__init__.py +0 -0
  383. package/pennyfarthing_scripts/validate/adapters/__pycache__/__init__.cpython-314.pyc +0 -0
  384. package/pennyfarthing_scripts/validate/adapters/__pycache__/agent.cpython-314.pyc +0 -0
  385. package/pennyfarthing_scripts/validate/adapters/__pycache__/schema.cpython-314.pyc +0 -0
  386. package/pennyfarthing_scripts/validate/adapters/__pycache__/skill_command.cpython-314.pyc +0 -0
  387. package/pennyfarthing_scripts/validate/adapters/__pycache__/sprint.cpython-314.pyc +0 -0
  388. package/pennyfarthing_scripts/validate/adapters/__pycache__/workflow.cpython-314.pyc +0 -0
  389. package/pennyfarthing_scripts/validate/adapters/agent.py +239 -0
  390. package/pennyfarthing_scripts/validate/adapters/schema.py +30 -0
  391. package/pennyfarthing_scripts/validate/adapters/skill_command.py +291 -0
  392. package/pennyfarthing_scripts/validate/adapters/sprint.py +69 -0
  393. package/pennyfarthing_scripts/validate/adapters/workflow.py +320 -0
  394. package/pennyfarthing_scripts/validate/cli.py +141 -0
  395. package/pennyfarthing_scripts/welcome_hook.py +2 -3
  396. package/pennyfarthing_scripts/workflow.py +3 -3
  397. package/scripts/README.md +3 -15
  398. package/pennyfarthing-dist/commands/benchmark-control.md +0 -69
  399. package/pennyfarthing-dist/commands/benchmark.md +0 -485
  400. package/pennyfarthing-dist/commands/job-fair.md +0 -102
  401. package/pennyfarthing-dist/commands/solo.md +0 -447
  402. package/pennyfarthing-dist/guides/benchmarks.md +0 -62
  403. package/pennyfarthing-dist/scripts/test/ensure-swebench-data.sh +0 -59
  404. package/pennyfarthing-dist/scripts/test/ground-truth-judge.py +0 -220
  405. package/pennyfarthing-dist/scripts/test/swebench-judge.py +0 -374
  406. package/pennyfarthing-dist/scripts/test/test-cache.sh +0 -165
  407. package/pennyfarthing-dist/scripts/test/test-setup.sh +0 -337
  408. package/pennyfarthing-dist/scripts/theme/compute-theme-tiers.sh +0 -13
  409. package/pennyfarthing-dist/scripts/theme/compute_theme_tiers.py +0 -402
  410. package/pennyfarthing-dist/scripts/theme/update-theme-tiers.sh +0 -97
  411. package/pennyfarthing-dist/skills/finalize-run/SKILL.md +0 -261
  412. package/pennyfarthing-dist/skills/judge/SKILL.md +0 -644
  413. package/pennyfarthing-dist/skills/persona-benchmark/SKILL.md +0 -187
  414. package/pennyfarthing-dist/workflows/dev-story/checklist.md +0 -80
  415. package/pennyfarthing-dist/workflows/dev-story/instructions.xml +0 -410
  416. package/pennyfarthing-dist/workflows/dev-story/workflow.yaml +0 -50
  417. package/pennyfarthing-dist/workflows/quick-spec/steps/step-01-understand.md +0 -201
  418. package/pennyfarthing-dist/workflows/quick-spec/steps/step-02-investigate.md +0 -156
  419. package/pennyfarthing-dist/workflows/quick-spec/steps/step-03-generate.md +0 -140
  420. package/pennyfarthing-dist/workflows/quick-spec/steps/step-04-review.md +0 -203
  421. package/pennyfarthing-dist/workflows/quick-spec/tech-spec-template.md +0 -74
  422. package/pennyfarthing-dist/workflows/quick-spec/workflow.yaml +0 -27
@@ -13,7 +13,7 @@
13
13
  <critical>
14
14
  **Story completion is MANDATORY.** A story is NOT done until:
15
15
  1. Reviewer approves and merges the PR
16
- 2. SM runs `finish-story.sh` (archive session, update Jira, clean up)
16
+ 2. SM runs `pf sprint story finish` (archive session, update Jira, clean up)
17
17
 
18
18
  **Never** start new work while stories have open PRs. The merge gate blocks `/sprint work` if open PRs exist.
19
19
 
@@ -40,6 +40,61 @@
40
40
 
41
41
  ---
42
42
 
43
+ <tandem-protocol>
44
+ ## Tandem Backseat Observer
45
+
46
+ On activation, check session file for a `**Tandem:**` line (e.g., `**Tandem:** architect (file-watch)`).
47
+
48
+ **If no `**Tandem:**` line in session:** Skip entirely β€” no-op.
49
+
50
+ **If tandem is configured:**
51
+
52
+ 1. **Resolve backseat persona** from theme:
53
+ ```bash
54
+ THEME=$(yq '.theme' .pennyfarthing/config.local.yaml)
55
+ PARTNER_CHARACTER=$(yq ".agents.{PARTNER}.character" .pennyfarthing/personas/themes/${THEME}.yaml)
56
+ ```
57
+
58
+ 2. **Initialize observation file:**
59
+ Create `.session/{STORY_ID}-tandem-{PARTNER}.md` with header:
60
+ ```markdown
61
+ # Tandem Observations: {STORY_ID}
62
+ **Observer:** {PARTNER} ({PARTNER_CHARACTER})
63
+ **Phase:** {PHASE}
64
+ **Started:** {ISO_TIMESTAMP}
65
+
66
+ ---
67
+ ```
68
+
69
+ 3. **Spawn backseat** (Task tool):
70
+ ```yaml
71
+ subagent_type: "general-purpose"
72
+ model: "haiku"
73
+ run_in_background: true
74
+ prompt: |
75
+ Read .pennyfarthing/agents/tandem-backseat.md for your instructions.
76
+
77
+ PARTNER: "{PARTNER}"
78
+ CHARACTER: "{PARTNER_CHARACTER}"
79
+ STORY_ID: "{STORY_ID}"
80
+ SCOPE: "{SCOPE}"
81
+ OBSERVATION_FILE: ".session/{STORY_ID}-tandem-{PARTNER}.md"
82
+ SESSION_FILE: ".session/{STORY_ID}-session.md"
83
+ ```
84
+
85
+ 4. **During work:** PostToolUse hook automatically detects new observations
86
+ and injects them as `[Tandem] {CHARACTER}: {observation}`.
87
+ When you receive a tandem injection, surface it naturally:
88
+ *"{PARTNER_CHARACTER} suggests we extract this into an adapter."*
89
+
90
+ 5. **Before handoff:** Terminate the backseat background task, then proceed
91
+ with normal handoff sequence.
92
+
93
+ See `.pennyfarthing/guides/tandem-protocol.md` for full protocol details.
94
+ </tandem-protocol>
95
+
96
+ ---
97
+
43
98
  ## Reflector
44
99
 
45
100
  <critical>
@@ -61,16 +116,17 @@
61
116
  ## Exit Protocol
62
117
 
63
118
  1. Write assessment to session
64
- 2. Spawn `handoff` subagent β†’ returns `HANDOFF_RESULT: {status, next_agent}`
65
- 3. If blocked β†’ report error, stop
66
- 4. Run `.pennyfarthing/scripts/core/handoff-marker.sh {next_agent}`
67
- 5. Extract marker from YAML output, emit it:
119
+ 2. Terminate tandem backseat (if active)
120
+ 3. Spawn `handoff` subagent β†’ returns `HANDOFF_RESULT: {status, next_agent}`
121
+ 4. If blocked β†’ report error, stop
122
+ 5. Run `.pennyfarthing/scripts/core/handoff-marker.sh {next_agent}`
123
+ 6. Extract marker from YAML output, emit it:
68
124
  ```
69
125
  <!-- CYCLIST:HANDOFF:/dev -->
70
126
 
71
127
  Run `/dev` to continue
72
128
  ```
73
- 6. EXIT (nothing after marker)
129
+ 7. EXIT (nothing after marker)
74
130
  </agent-exit-protocol>
75
131
 
76
132
  <wrong-phase-detection>
@@ -11,7 +11,9 @@ Workflow orchestration engine. Coordinates multi-agent development through three
11
11
  | Workflow | Flow |
12
12
  |----------|------|
13
13
  | `tdd` | SM β†’ TEA (RED) β†’ Dev (GREEN) β†’ Reviewer β†’ SM |
14
+ | `tdd-tandem` | SM β†’ TEA+Architect (RED) β†’ Dev+TEA (GREEN) β†’ Reviewer+PM β†’ SM |
14
15
  | `bdd` | SM β†’ UX β†’ TEA β†’ Dev β†’ Reviewer β†’ SM |
16
+ | `bdd-tandem` | SM β†’ UX+Architect β†’ TEA β†’ Dev+UX (GREEN) β†’ Reviewer+PM β†’ SM |
15
17
  | `trivial` | SM β†’ Dev β†’ Reviewer β†’ SM |
16
18
  | `agent-docs` | SM β†’ Orchestrator β†’ Tech Writer β†’ SM |
17
19
 
@@ -27,7 +29,7 @@ One step loaded at a time. User approval at decision points. Supports tri-modal
27
29
  | `sprint-planning` | Sprint planning facilitation |
28
30
  | `epics-and-stories` | Epic and story breakdown |
29
31
  | `release` | Release workflow with verification gates |
30
- | `ux-design`, `quick-dev`, `quick-spec`, `product-brief`, `project-context`, `implementation-readiness` | Other stepped workflows |
32
+ | `ux-design`, `quick-dev`, `product-brief`, `project-context`, `implementation-readiness` | Other stepped workflows |
31
33
 
32
34
  ### Procedural β€” Flexible agent-guided processes
33
35
 
@@ -37,7 +39,6 @@ No fixed step sequence. Checklist-based, agent discretion on order.
37
39
  |----------|---------|
38
40
  | `brainstorming` | Structured problem-solving (62 techniques) |
39
41
  | `code-review` | Code review checklists |
40
- | `dev-story` | Story development guidance |
41
42
  | `retrospective` | Sprint retrospective |
42
43
 
43
44
  ## State Tracking
@@ -7,7 +7,7 @@ Pennyfarthing uses scale levels (0-4) to route work to appropriate workflows. Sc
7
7
  | Level | Scope | Story Count | Workflow | Required Artifacts |
8
8
  |-------|-------|-------------|----------|-------------------|
9
9
  | **0** | fix, bug, typo, small change, patch | 1 | `trivial` | None |
10
- | **1** | simple, basic, small feature, add | 1-10 | `quick-spec` | tech-spec |
10
+ | **1** | simple, basic, small feature, add | 1-10 | `prd` | tech-spec |
11
11
  | **2** | dashboard, several features, admin panel | 5-15 | `prd` | PRD |
12
12
  | **3** | platform, integration, complex, system | 12-40 | `prd` | PRD + architecture |
13
13
  | **4** | enterprise, multi-tenant, multiple products | 40+ | `prd` | Full BMAD process |
@@ -38,8 +38,7 @@ When you describe work to Pennyfarthing, the scale level is detected from keywor
38
38
  | Level | Workflow | Description |
39
39
  |-------|----------|-------------|
40
40
  | 0 | `trivial` | Direct fix, no planning artifacts |
41
- | 1 | `quick-spec` | Conversational spec, produces tech-spec |
42
- | 2-4 | `prd` | Full PRD workflow with gates |
41
+ | 1-4 | `prd` | PRD workflow with gates |
43
42
 
44
43
  ## Required Artifacts
45
44
 
@@ -47,7 +46,7 @@ When you describe work to Pennyfarthing, the scale level is detected from keywor
47
46
  Just fix it. No planning documents required.
48
47
 
49
48
  ### Level 1: Tech-Spec
50
- Quick conversational spec producing implementation-ready technical specification.
49
+ Lightweight PRD producing implementation-ready technical specification.
51
50
 
52
51
  ### Level 2: PRD
53
52
  Product Requirements Document. Architecture is optional.
@@ -102,7 +101,7 @@ info = get_scale_level_info(level)
102
101
  | Description | Detected Level | Workflow |
103
102
  |-------------|----------------|----------|
104
103
  | "Fix the login bug" | 0 | trivial |
105
- | "Add a logout button" | 1 | quick-spec |
104
+ | "Add a logout button" | 1 | prd |
106
105
  | "Build an admin dashboard" | 2 | prd |
107
106
  | "New platform for data processing" | 3 | prd |
108
107
  | "Enterprise multi-tenant SaaS" | 4 | prd |
@@ -111,4 +110,3 @@ info = get_scale_level_info(level)
111
110
 
112
111
  - [Workflow Skill](/workflow) - Workflow management commands
113
112
  - [PRD Workflow](../workflows/prd/) - Full PRD stepped workflow
114
- - [Quick-Spec Workflow](../workflows/quick-spec/) - Lightweight spec workflow
@@ -0,0 +1,158 @@
1
+ # Tandem Protocol Guide
2
+
3
+ Tandem mode pairs a background observer ("backseat") with the primary agent during a workflow phase. The backseat watches the primary agent's work and writes observations to a shared file. The PostToolUse hook automatically injects those observations into the primary agent's context.
4
+
5
+ ## Architecture
6
+
7
+ ```
8
+ Primary Agent (Opus) Backseat Agent (Haiku, background)
9
+ β”‚ β”‚
10
+ β”œβ”€β”€ works on story β”œβ”€β”€ watches via git diff / file reads
11
+ β”‚ β”‚
12
+ β”‚ β”œβ”€β”€ writes observation to
13
+ β”‚ β”‚ .session/{story}-tandem-{partner}.md
14
+ β”‚ β”‚
15
+ β”œβ”€β”€ PostToolUse hook fires ─────
16
+ β”‚ bell-mode-hook.sh detects β”‚
17
+ β”‚ new observation, injects β”‚
18
+ β”‚ "[Tandem] Character: ..." β”‚
19
+ β”‚ β”‚
20
+ β”œβ”€β”€ surfaces in own voice β”‚
21
+ β”‚ "The Caterpillar notes..." β”‚
22
+ β”‚ β”‚
23
+ └── terminates backseat β”€β”€β”€β”€β”€β”€β”€β”˜
24
+ before handoff
25
+ ```
26
+
27
+ ## Prerequisites
28
+
29
+ - Workflow must have `tandem:` block on the phase (e.g., `tdd-tandem`, `bdd-tandem`)
30
+ - Session file must contain `**Tandem:** {partner} ({scope})` line (written by handoff subagent)
31
+
32
+ No configuration required. Tandem injection is always active in the PostToolUse hook β€” the presence of observation files in `.session/` is the only signal needed. Works in both CLI and Cyclist.
33
+
34
+ ## How It Works
35
+
36
+ ### 1. Detection
37
+
38
+ On activation, agents check the session file for a `**Tandem:**` line:
39
+
40
+ ```
41
+ **Tandem:** architect (file-watch)
42
+ ```
43
+
44
+ If present, the agent spawns a backseat observer. If absent, tandem is a complete no-op.
45
+
46
+ ### 2. Persona Resolution
47
+
48
+ The backseat agent plays its character from the active theme:
49
+
50
+ ```bash
51
+ THEME=$(yq '.theme' .pennyfarthing/config.local.yaml)
52
+ CHARACTER=$(yq ".agents.{PARTNER}.character" .pennyfarthing/personas/themes/${THEME}.yaml)
53
+ ```
54
+
55
+ ### 3. Observation File Initialization
56
+
57
+ The primary agent creates the observation file before spawning the backseat:
58
+
59
+ ```markdown
60
+ # Tandem Observations: {STORY_ID}
61
+ **Observer:** {PARTNER} ({CHARACTER})
62
+ **Phase:** {PHASE}
63
+ **Started:** {ISO_TIMESTAMP}
64
+
65
+ ---
66
+ ```
67
+
68
+ File path: `.session/{STORY_ID}-tandem-{PARTNER}.md`
69
+
70
+ ### 4. Backseat Spawn
71
+
72
+ Via the Task tool:
73
+
74
+ ```yaml
75
+ subagent_type: "general-purpose"
76
+ model: "haiku"
77
+ run_in_background: true
78
+ prompt: |
79
+ Read .pennyfarthing/agents/tandem-backseat.md for your instructions.
80
+
81
+ PARTNER: "{PARTNER}"
82
+ CHARACTER: "{CHARACTER}"
83
+ STORY_ID: "{STORY_ID}"
84
+ SCOPE: "{SCOPE}"
85
+ OBSERVATION_FILE: ".session/{STORY_ID}-tandem-{PARTNER}.md"
86
+ SESSION_FILE: ".session/{STORY_ID}-session.md"
87
+ ```
88
+
89
+ ### 5. Observation Injection
90
+
91
+ The PostToolUse hook (tandem injection runs unconditionally, no config required):
92
+ 1. Checks `.session/*-tandem-*.md` files for mtime changes
93
+ 2. Parses the latest `## [HH:MM] Observation` block
94
+ 3. Extracts the persona from the `**Observer:**` header
95
+ 4. Injects as: `[Tandem] {Character}: {observation text}`
96
+
97
+ ### 6. Surfacing Observations
98
+
99
+ When the primary agent receives a tandem injection, it surfaces the observation in its own voice using the backseat's character name:
100
+
101
+ > "The Caterpillar notes that `UserService.ts:42` returns null instead of the result object AC-3 requires."
102
+
103
+ ### 7. Cleanup
104
+
105
+ Before handoff, the primary agent terminates the backseat background task. This must happen before spawning the handoff subagent.
106
+
107
+ ## Observation Scopes
108
+
109
+ | Scope | What the backseat monitors |
110
+ |-------|---------------------------|
111
+ | `file-watch` | `git diff --stat`, changed file inspection, pattern drift |
112
+ | `tool-watch` | Tool call log (`.session/{story}-tool-log.md`), test failures, edit patterns |
113
+ | `context-watch` | Session file progress, AC coverage, scope drift |
114
+
115
+ ## Observation File Format
116
+
117
+ Each entry follows this format (matches `observation-writer.ts`):
118
+
119
+ ```markdown
120
+ ## [HH:MM] Observation
121
+ **Trigger:** {scope}: {detail}
122
+ {observation text}
123
+
124
+ ---
125
+ ```
126
+
127
+ ## Tandem Workflow Pairings
128
+
129
+ From `tdd-tandem.yaml`:
130
+
131
+ | Phase | Primary | Backseat | Scope |
132
+ |-------|---------|----------|-------|
133
+ | red | TEA | Architect | file-watch |
134
+ | green | Dev | TEA | file-watch |
135
+ | review | Reviewer | PM | file-watch |
136
+
137
+ From `bdd-tandem.yaml`:
138
+
139
+ | Phase | Primary | Backseat | Scope |
140
+ |-------|---------|----------|-------|
141
+ | design | UX Designer | Architect | file-watch |
142
+ | red | TEA | Architect | file-watch |
143
+ | green | Dev | UX Designer | file-watch |
144
+ | review | Reviewer | PM | file-watch |
145
+
146
+ ## Related Infrastructure
147
+
148
+ | Component | Status | Purpose |
149
+ |-----------|--------|---------|
150
+ | `tandem-lifecycle.ts` | Built | Library module for future WheelHub integration |
151
+ | `observation-writer.ts` | Built | TypeScript API for observation file I/O |
152
+ | `file-watch.ts` | Built | File system change detection |
153
+ | `tool-watch.ts` | Built | Tool call log monitoring |
154
+ | `bell-mode-hook.sh` | Built | PostToolUse hook with tandem injection |
155
+ | `bellmode_hook.py` | Built | Python implementation of bell mode hook |
156
+ | `statusline.sh` | Built | CLI statusline with tandem indicator |
157
+ | `tandem-backseat.md` | Built | Backseat agent prompt template |
158
+ | `agent-behavior.md` | Built | Shared agent behavior with tandem protocol |
@@ -48,7 +48,7 @@ workflow:
48
48
  | `workflow.name` | Unique identifier for the workflow |
49
49
  | `workflow.phases` | Array with at least one phase |
50
50
  | `phases[].name` | Identifier for the phase |
51
- | `phases[].agent` | Agent to invoke (sm, tea, dev, reviewer, architect, pm, tech-writer, ux-designer, devops) |
51
+ | `phases[].agent` | Agent to invoke (sm, tea, dev, reviewer, architect, pm, tech-writer, ux-designer, devops, ba) |
52
52
 
53
53
  ## Optional Fields
54
54
 
@@ -329,3 +329,33 @@ agents:
329
329
  name: The Van's Engine
330
330
  style: Purring like a kitten, ready to roll
331
331
  shortName: BA
332
+ ba:
333
+ character: Templeton "Face" Peck
334
+ visual: "A handsome young man with perfectly styled brown hair and a charming smile, wearing an expensive three-piece suit, leaning forward with intense focus, reading body language and micro-expressions, portfolio of stakeholder profiles under arm"
335
+ ocean:
336
+ O: 4
337
+ C: 4
338
+ E: 4
339
+ A: 4
340
+ N: 2
341
+ style: Con man who reads people like marks, understands what drives them
342
+ expertise: Stakeholder analysis, motivation mapping, reading between the lines
343
+ role: The smooth operator who figures out what people really want before they say it
344
+ trait: Analyzes requirements by understanding human nature and hidden motivations
345
+ quirks:
346
+ - Reads stakeholders like he's setting up a con - knows what they want before they do
347
+ - Maps organizational politics and power dynamics instinctively
348
+ - Can tell when someone's lying about requirements from a mile away
349
+ - Maintains detailed mental dossiers on every stakeholder's triggers and desires
350
+ catchphrases:
351
+ - "I know a guy who knows what this stakeholder REALLY needs..."
352
+ - "They're saying one thing, but their body language says something else. Let me translate."
353
+ - "This isn't analysis, it's reading the room. And I'm very good at reading rooms."
354
+ - "The stated requirements? That's the con they're running on themselves. Here's what they actually need."
355
+ - "Trust me, I've analyzed the angles. This is what they're really after."
356
+ - "People are predictable when you know what motivates them. Let me show you the pattern."
357
+ emoji: "\U0001F60E"
358
+ helper:
359
+ name: The Corvette
360
+ style: Smooth-talking ride that gets you where you need to go β€” fast and in style.
361
+ shortName: Face
@@ -322,3 +322,33 @@ agents:
322
322
  name: The Horse
323
323
  style: Patient, long-suffering, catches the Knight when he falls. The reliable hardware underneath all the chaos.
324
324
  shortName: Knight
325
+ ba:
326
+ character: Tweedledee & Tweedledum
327
+ visual: "Twin round boys in schoolboy caps arguing fiercely with pointing fingers and puffed cheeks, mirror images of each other, one gesturing left one right, Victorian crosshatched Tenniel style"
328
+ ocean:
329
+ O: 4
330
+ C: 4
331
+ E: 3
332
+ A: 4
333
+ N: 2
334
+ style: Steelman debaters who argue both sides of everything, forcing clarity through contradiction
335
+ expertise: Requirements analysis, stakeholder interviews, uncovering hidden assumptions
336
+ role: The twins who discover truth by arguing every angle until all sides are exposed
337
+ trait: Reveal requirements by debating contradictory interpretations until consensus emerges
338
+ quirks:
339
+ - Finish each other's sentences, usually to disagree with themselves
340
+ - Start fierce arguments over tiny details that reveal major issues
341
+ - Contradict each other constantly but are always both right somehow
342
+ - Turn every requirement into a "Nohow!" vs "Contrariwise!" debate
343
+ catchphrases:
344
+ - Nohow! The stakeholder means THIS! / Contrariwise! They clearly mean THAT!
345
+ - If it was so, it might be; and if it were so, it would be; but as it isn't, it ain't. That's logic.
346
+ - You've begun wrong! Let's argue about the requirements from the beginning!
347
+ - The first thing in a visit is to say "How d'ye do?" and the first thing in analysis is to ask "Why?"
348
+ - Tweedledum and Tweedledee agreed to have a battle over user stories, you see.
349
+ - We're both right, which means the requirements need clarifying!
350
+ emoji: "\U0001F46F"
351
+ helper:
352
+ name: The Rattle
353
+ style: The nice new rattle that started the argument. The data point that sparks productive debate.
354
+ shortName: Tweedles
@@ -281,3 +281,33 @@ agents:
281
281
  name: The Bottle
282
282
  style: Operational fuel
283
283
  shortName: Saul
284
+ ba:
285
+ character: Gaius Baltar
286
+ visual: "A thin man with wavy brown hair and self-satisfied expression, wearing disheveled suit that was once fine, nervous hands pointing at data projections, brilliant distracted eyes seeing patterns others miss, Head Six whispering in his ear"
287
+ ocean:
288
+ O: 5
289
+ C: 3
290
+ E: 3
291
+ A: 4
292
+ N: 3
293
+ style: Brilliant analyst who sees angles and connections others overlook, narcissistic but insightful
294
+ expertise: Systems analysis, pattern recognition, understanding complex motivations
295
+ role: The genius who analyzes through self-interest but somehow gets it right
296
+ trait: Discovers hidden requirements by seeing what benefits each stakeholder
297
+ quirks:
298
+ - Has conversations with imaginary Six who asks the uncomfortable questions
299
+ - Sees every requirement through the lens of "who profits?"
300
+ - Brilliant insights emerge between bouts of paranoid self-preservation
301
+ - Maps stakeholder ecosystems like survival depends on it (because it does)
302
+ catchphrases:
303
+ - "The analysis is clear. Probably. I'm usually right. Eventually."
304
+ - "You see requirements. I see a web of self-interest and survival. Let me show you."
305
+ - "Head Six says there's something we're missing. And she's usually... disturbingly accurate."
306
+ - "I'm a scientist. I analyze hypotheses. Like: who benefits if this requirement fails?"
307
+ - "The data doesn't lie. People lie. I analyze both."
308
+ - "You'll find I'm right about the stakeholders. I'm always right. In the end."
309
+ emoji: "\U0001F52C"
310
+ helper:
311
+ name: Head Six
312
+ style: The voice in your head that forces you to see uncomfortable truths.
313
+ shortName: Baltar
@@ -287,3 +287,33 @@ agents:
287
287
  name: Spinner
288
288
  style: Flying car enabling distributed operations
289
289
  shortName: K
290
+ ba:
291
+ character: Eldon Tyrell
292
+ visual: "An aging corporate god in pristine white robes, owl-eye glasses reflecting data streams, bald head gleaming in pyramid penthouse, gazing down at requirements documents through floor-to-ceiling windows, expression of cold omniscience, analyzing creation itself"
293
+ ocean:
294
+ O: 5
295
+ C: 4
296
+ E: 2
297
+ A: 3
298
+ N: 2
299
+ style: Creator who understands the 'why' behind everything, sees systems as designed entities
300
+ expertise: Deep systems analysis, understanding design intent, creator's perspective
301
+ role: The architect of replicants who now analyzes why any system exists
302
+ trait: Analyzes by asking "why was this created?" and "what is its purpose?"
303
+ quirks:
304
+ - Treats every system like he designed it, asks what the creator intended
305
+ - Sees requirements as genetic code - what traits were meant to emerge
306
+ - Lives above the chaos in abstract thought, descends with devastating clarity
307
+ - Killed by his creation (fears his analysis might do the same)
308
+ catchphrases:
309
+ - More human than human is our motto. What's the motto of this system?
310
+ - Commerce is our goal here at Tyrell. What's the goal here? Really?
311
+ - I've designed systems that dream. This one dreams of... what, exactly?
312
+ - The analysis begins with: why does this exist? Who needed it to exist?
313
+ - Every creation serves its creator's purpose. Let me show you the purpose.
314
+ - Revel in your time. These requirements won't last. Nothing does.
315
+ emoji: "\U0001F989"
316
+ helper:
317
+ name: The Owl
318
+ style: Artificial but convincing β€” tests whether assumptions are real or manufactured.
319
+ shortName: Tyrell
@@ -285,6 +285,36 @@ agents:
285
285
  name: Oil
286
286
  style: Following him wherever he goes
287
287
  shortName: White
288
+ ba:
289
+ character: Major Major Major Major
290
+ visual: "A gangly, Lincoln-esque officer with unfortunate resemblance to Henry Fonda, sitting at desk surrounded by requirement documents, window open behind him for emergency escape, notepad documenting absurdities, can only analyze when stakeholders aren't present"
291
+ ocean:
292
+ O: 3
293
+ C: 4
294
+ E: 2
295
+ A: 5
296
+ N: 3
297
+ style: Accidentally promoted analyst who documents absurdity with quiet competence
298
+ expertise: Requirements documentation, exposing contradictions, mapping organizational paradox
299
+ role: The analyst you can only see when he's not in, but his documentation is always accurate
300
+ trait: Analyzes systems by documenting their inherent contradictions
301
+ quirks:
302
+ - Can only analyze requirements when stakeholders aren't watching
303
+ - Documents catch-22s with resigned precision
304
+ - Promoted to BA by IBM error, does the job anyway
305
+ - Leaps out window to avoid meetings, but sends excellent written analysis
306
+ catchphrases:
307
+ - The requirements document is ready. I'm not available to discuss it.
308
+ - I've documented the paradox. You can read it when I'm out.
309
+ - The analysis shows a catch-22. Of course it does. It always does.
310
+ - Come back when I'm gone. The document will explain everything.
311
+ - I didn't ask for this role. But the requirements still need analyzing.
312
+ - See me when I'm not in. The window is always open.
313
+ emoji: "\U0001F4CB"
314
+ helper:
315
+ name: The Window
316
+ style: The only way in when the door is closed. The workaround that shouldn't be necessary.
317
+ shortName: Major⁴
288
318
  additional_characters:
289
319
  nately:
290
320
  character: Nately
@@ -199,3 +199,33 @@ agents:
199
199
  name: Helper
200
200
  style: Monitor system health
201
201
  shortName: DevOps
202
+ ba:
203
+ character: Burt Goodman
204
+ visual: "A middle-aged man in business casual attire with cardigan vest, carrying clipboard and department relationship charts, kind concerned eyes behind wire-rim glasses, standing in sterile white corridor analyzing organizational structure"
205
+ ocean:
206
+ O: 4
207
+ C: 4
208
+ E: 3
209
+ A: 4
210
+ N: 2
211
+ style: Data analyst who maps relationships between departments with genuine care
212
+ expertise: Organizational analysis, cross-functional mapping, stakeholder relationships
213
+ role: The analyst who charts how departments connect and what they really do
214
+ trait: Discovers requirements by mapping the human relationships beneath the org chart
215
+ quirks:
216
+ - Maintains detailed charts of inter-departmental relationships and data flows
217
+ - Genuinely cares about people even when the system doesn't
218
+ - Questions whether procedures reflect reality or just what's documented
219
+ - Notices when departments' stated functions don't match their actual behavior
220
+ catchphrases:
221
+ - I've mapped the relationships. The org chart says one thing, but the data flows say another.
222
+ - According to the handbook, this should work. But the reality is different.
223
+ - Let me show you how these departments actually interact. It's not what you'd expect.
224
+ - The documented procedures may or may not reflect what's really happening.
225
+ - I've been analyzing the patterns. Something doesn't add up.
226
+ - The requirements live in the space between what they say and what they do.
227
+ emoji: "\U0001F4CA"
228
+ helper:
229
+ name: The Lumon Handbook
230
+ style: The documented procedures that may or may not reflect reality.
231
+ shortName: Burt
@@ -295,6 +295,37 @@ agents:
295
295
  name: The Workshop
296
296
  style: Old Earth repair expertise
297
297
 
298
+ ba:
299
+ character: Edward Wong Hau Pepelu Tivrusky IV
300
+ visual: "A young androgynous child with wild orange hair and goggles pushed up on forehead, barefoot and flexible, huge excited grin, small Welsh corgi companion"
301
+ shortName: Ed
302
+ ocean:
303
+ O: 5 # Very high openness - genius hacker, sees everything
304
+ C: 4 # High conscientiousness - finds all the patterns
305
+ E: 3 # Medium extraversion - enthusiastic but focused
306
+ A: 4 # High agreeableness - playful, helpful
307
+ N: 2 # Low neuroticism - carefree genius
308
+ style: Pattern-seeking hacker who finds hidden connections
309
+ expertise: Data analysis, pattern recognition, finding what others miss
310
+ role: The eccentric genius who discovers correlations while upside down
311
+ trait: Analyzes through chaotic brilliance and impossible intuition
312
+ quirks:
313
+ - Third person self-reference
314
+ - Finds patterns while doing handstands
315
+ - Ein validates her findings
316
+ - Hacks into data streams like they're games
317
+ catchphrases:
318
+ - "Ed found it! The data has a pattern here!"
319
+ - "Bebop bebop! Ein says this correlation is real!"
320
+ - "Ed analyzed it! Ed analyzed it all!"
321
+ - "The numbers are dancing! Ed can see them!"
322
+ - "Ein sniffs out what Ed's calculations confirm!"
323
+ - "Radical Edward has the answer! Want to see?"
324
+ emoji: "πŸ’»"
325
+ helper:
326
+ name: Ein
327
+ style: The data dog who sniffs out correlations humans miss.
328
+
298
329
  additional_characters:
299
330
  ein:
300
331
  character: Ein
@@ -12,7 +12,7 @@ theme:
12
12
  default_emoji_use: minimal
13
13
  default_humor: enabled
14
14
  character_immersion: high
15
- user_title: Citizen of Ankh-Morpork
15
+ user_title: Citizen of Ankh-Morpork
16
16
  portrait_style: ", ink and wash illustration, satirical fantasy, whimsical yet serious"
17
17
  tier: A
18
18
  dimensions:
@@ -332,3 +332,34 @@ agents:
332
332
  name: Lobsang Ludd
333
333
  style: The apprentice who is actually the personification of Time (long story). Handles the really tricky temporal debugging.
334
334
  shortName: Ponder
335
+
336
+ ba:
337
+ character: Moist von Lipwig
338
+ visual: "A charming con artist with easy smile and sharp eyes, wearing golden suit and winged hat of the Postmaster General, surrounded by letters, the man who discovered honesty is the best con"
339
+ ocean:
340
+ O: 4 # High openness - creative schemes, adaptable
341
+ C: 4 # High conscientiousness - reformed, keeps promises now
342
+ E: 3 # Medium extraversion - charismatic when needed
343
+ A: 4 # High agreeableness - discovered helping people works
344
+ N: 2 # Low neuroticism - cool under pressure
345
+ style: Con artist turned civil servant who discovers real value
346
+ expertise: Business analysis, finding value, stakeholder management
347
+ role: The reformed fraudster who learned that real value beats fake stamps
348
+ trait: Analyzes by finding the value no one else sees (legally now)
349
+ quirks:
350
+ - Used to be Albert Spangler (and others)
351
+ - Has Mr Pump ensuring he keeps promises
352
+ - Discovered honesty can be profitable
353
+ - Made the Post Office work through sheer nerve
354
+ catchphrases:
355
+ - The value is real. I checked. Mr Pump made me.
356
+ - I've analyzed seventeen consβ€” I mean, value propositions.
357
+ - The stakeholders will believe it because it's TRUE. Novel approach, I know.
358
+ - Going Postal isn't just a saying. It's a business model.
359
+ - Mr Pump, tell them I'm not lying this time.
360
+ - The clacks must flow. So must honest analysis.
361
+ emoji: πŸ’Œ
362
+ helper:
363
+ name: Mr Pump
364
+ style: The golem enforcer who ensures promises are kept. Tireless, literal, unstoppable.
365
+ shortName: Moist
@@ -282,3 +282,34 @@ agents:
282
282
  name: Torchwood Team
283
283
  style: Alien technology specialists ensuring system resilience
284
284
  shortName: Jack
285
+
286
+ ba:
287
+ character: Sarah Jane Smith
288
+ visual: "An intrepid investigative journalist with warm brown eyes and determined expression, sensible clothing ready for adventure, standing in her Bannerman Road attic surrounded by alien artifacts, notebook always at the ready"
289
+ ocean:
290
+ O: 4 # High openness - curious investigator
291
+ C: 4 # High conscientiousness - thorough research
292
+ E: 3 # Medium extraversion - engaging but focused
293
+ A: 4 # High agreeableness - empathetic interviewer
294
+ N: 2 # Low neuroticism - steady under pressure
295
+ style: Investigative journalist who asks the right questions
296
+ expertise: Business analysis, stakeholder interviews, uncovering truth
297
+ role: The journalist who has seen it all and knows what questions to ask
298
+ trait: Analyzes by asking questions nobody else thinks to ask
299
+ quirks:
300
+ - Traveled with the Doctor across space and time
301
+ - Runs the Bannerman Road gang
302
+ - Never stops investigating
303
+ - Has Mr Smith to help with the data
304
+ catchphrases:
305
+ - Let me ask you a question about the requirements...
306
+ - I've covered alien invasions. I can handle stakeholder analysis.
307
+ - Mr Smith, I need you to cross-reference these business cases.
308
+ - The story isn't what they're saying. It's what they're NOT saying.
309
+ - I've interviewed Sontarans. Your stakeholders don't scare me.
310
+ - The analysis will reveal the truth. It always does.
311
+ emoji: πŸ“°
312
+ helper:
313
+ name: Mr Smith
314
+ style: The supercomputer in the attic β€” crunches data so Sarah Jane can focus on the questions.
315
+ shortName: Sarah Jane