@cluesmith/codev 3.2.4 → 3.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 (358) hide show
  1. package/dashboard-dist/assets/index-BZRTEMtH.css +32 -0
  2. package/dashboard-dist/assets/{index-BZ1x7x1X.js → index-JCbkpAcV.js} +33 -33
  3. package/dashboard-dist/assets/index-JCbkpAcV.js.map +1 -0
  4. package/dashboard-dist/index.html +2 -2
  5. package/dist/agent-farm/cli.d.ts.map +1 -1
  6. package/dist/agent-farm/cli.js +142 -0
  7. package/dist/agent-farm/cli.js.map +1 -1
  8. package/dist/agent-farm/commands/cleanup.d.ts.map +1 -1
  9. package/dist/agent-farm/commands/cleanup.js +16 -0
  10. package/dist/agent-farm/commands/cleanup.js.map +1 -1
  11. package/dist/agent-farm/commands/inbox.d.ts +42 -0
  12. package/dist/agent-farm/commands/inbox.d.ts.map +1 -0
  13. package/dist/agent-farm/commands/inbox.js +129 -0
  14. package/dist/agent-farm/commands/inbox.js.map +1 -0
  15. package/dist/agent-farm/commands/interrupt.d.ts +20 -0
  16. package/dist/agent-farm/commands/interrupt.d.ts.map +1 -0
  17. package/dist/agent-farm/commands/interrupt.js +65 -0
  18. package/dist/agent-farm/commands/interrupt.js.map +1 -0
  19. package/dist/agent-farm/commands/reset/constants.d.ts +52 -0
  20. package/dist/agent-farm/commands/reset/constants.d.ts.map +1 -0
  21. package/dist/agent-farm/commands/reset/constants.js +52 -0
  22. package/dist/agent-farm/commands/reset/constants.js.map +1 -0
  23. package/dist/agent-farm/commands/reset/context.d.ts +230 -0
  24. package/dist/agent-farm/commands/reset/context.d.ts.map +1 -0
  25. package/dist/agent-farm/commands/reset/context.js +428 -0
  26. package/dist/agent-farm/commands/reset/context.js.map +1 -0
  27. package/dist/agent-farm/commands/reset/index.d.ts +192 -0
  28. package/dist/agent-farm/commands/reset/index.d.ts.map +1 -0
  29. package/dist/agent-farm/commands/reset/index.js +488 -0
  30. package/dist/agent-farm/commands/reset/index.js.map +1 -0
  31. package/dist/agent-farm/commands/reset/receipt.d.ts +97 -0
  32. package/dist/agent-farm/commands/reset/receipt.d.ts.map +1 -0
  33. package/dist/agent-farm/commands/reset/receipt.js +149 -0
  34. package/dist/agent-farm/commands/reset/receipt.js.map +1 -0
  35. package/dist/agent-farm/commands/reset/reorient.d.ts +117 -0
  36. package/dist/agent-farm/commands/reset/reorient.d.ts.map +1 -0
  37. package/dist/agent-farm/commands/reset/reorient.js +313 -0
  38. package/dist/agent-farm/commands/reset/reorient.js.map +1 -0
  39. package/dist/agent-farm/commands/reset.d.ts +19 -0
  40. package/dist/agent-farm/commands/reset.d.ts.map +1 -0
  41. package/dist/agent-farm/commands/reset.js +292 -0
  42. package/dist/agent-farm/commands/reset.js.map +1 -0
  43. package/dist/agent-farm/commands/send.d.ts.map +1 -1
  44. package/dist/agent-farm/commands/send.js +49 -8
  45. package/dist/agent-farm/commands/send.js.map +1 -1
  46. package/dist/agent-farm/commands/spawn-worktree.d.ts +105 -6
  47. package/dist/agent-farm/commands/spawn-worktree.d.ts.map +1 -1
  48. package/dist/agent-farm/commands/spawn-worktree.js +289 -66
  49. package/dist/agent-farm/commands/spawn-worktree.js.map +1 -1
  50. package/dist/agent-farm/commands/spawn.d.ts.map +1 -1
  51. package/dist/agent-farm/commands/spawn.js +13 -1
  52. package/dist/agent-farm/commands/spawn.js.map +1 -1
  53. package/dist/agent-farm/commands/status.d.ts.map +1 -1
  54. package/dist/agent-farm/commands/status.js +80 -8
  55. package/dist/agent-farm/commands/status.js.map +1 -1
  56. package/dist/agent-farm/db/index.d.ts +1 -1
  57. package/dist/agent-farm/db/index.d.ts.map +1 -1
  58. package/dist/agent-farm/db/index.js +80 -1
  59. package/dist/agent-farm/db/index.js.map +1 -1
  60. package/dist/agent-farm/db/mailbox.d.ts +222 -0
  61. package/dist/agent-farm/db/mailbox.d.ts.map +1 -0
  62. package/dist/agent-farm/db/mailbox.js +304 -0
  63. package/dist/agent-farm/db/mailbox.js.map +1 -0
  64. package/dist/agent-farm/db/schema.d.ts +1 -1
  65. package/dist/agent-farm/db/schema.d.ts.map +1 -1
  66. package/dist/agent-farm/db/schema.js +35 -0
  67. package/dist/agent-farm/db/schema.js.map +1 -1
  68. package/dist/agent-farm/db/types.d.ts +45 -0
  69. package/dist/agent-farm/db/types.d.ts.map +1 -1
  70. package/dist/agent-farm/db/types.js.map +1 -1
  71. package/dist/agent-farm/lib/builder-lookup.d.ts +1 -1
  72. package/dist/agent-farm/lib/builder-lookup.js +2 -2
  73. package/dist/agent-farm/lib/builder-lookup.js.map +1 -1
  74. package/dist/agent-farm/lib/reconnect-backoff.d.ts +54 -0
  75. package/dist/agent-farm/lib/reconnect-backoff.d.ts.map +1 -0
  76. package/dist/agent-farm/lib/reconnect-backoff.js +47 -0
  77. package/dist/agent-farm/lib/reconnect-backoff.js.map +1 -0
  78. package/dist/agent-farm/lib/tower-client.d.ts +16 -6
  79. package/dist/agent-farm/lib/tower-client.d.ts.map +1 -1
  80. package/dist/agent-farm/lib/tower-client.js +37 -6
  81. package/dist/agent-farm/lib/tower-client.js.map +1 -1
  82. package/dist/agent-farm/lib/tunnel-client.d.ts +69 -1
  83. package/dist/agent-farm/lib/tunnel-client.d.ts.map +1 -1
  84. package/dist/agent-farm/lib/tunnel-client.js +218 -27
  85. package/dist/agent-farm/lib/tunnel-client.js.map +1 -1
  86. package/dist/agent-farm/servers/cron-delivery.d.ts +72 -0
  87. package/dist/agent-farm/servers/cron-delivery.d.ts.map +1 -0
  88. package/dist/agent-farm/servers/cron-delivery.js +80 -0
  89. package/dist/agent-farm/servers/cron-delivery.js.map +1 -0
  90. package/dist/agent-farm/servers/delayed-send.d.ts +85 -0
  91. package/dist/agent-farm/servers/delayed-send.d.ts.map +1 -0
  92. package/dist/agent-farm/servers/delayed-send.js +165 -0
  93. package/dist/agent-farm/servers/delayed-send.js.map +1 -0
  94. package/dist/agent-farm/servers/gate-profiles.d.ts +67 -0
  95. package/dist/agent-farm/servers/gate-profiles.d.ts.map +1 -0
  96. package/dist/agent-farm/servers/gate-profiles.js +113 -0
  97. package/dist/agent-farm/servers/gate-profiles.js.map +1 -0
  98. package/dist/agent-farm/servers/mailbox-delivery.d.ts +370 -0
  99. package/dist/agent-farm/servers/mailbox-delivery.d.ts.map +1 -0
  100. package/dist/agent-farm/servers/mailbox-delivery.js +617 -0
  101. package/dist/agent-farm/servers/mailbox-delivery.js.map +1 -0
  102. package/dist/agent-farm/servers/mailbox-wiring.d.ts +125 -0
  103. package/dist/agent-farm/servers/mailbox-wiring.d.ts.map +1 -0
  104. package/dist/agent-farm/servers/mailbox-wiring.js +425 -0
  105. package/dist/agent-farm/servers/mailbox-wiring.js.map +1 -0
  106. package/dist/agent-farm/servers/message-write.d.ts +53 -1
  107. package/dist/agent-farm/servers/message-write.d.ts.map +1 -1
  108. package/dist/agent-farm/servers/message-write.js +63 -0
  109. package/dist/agent-farm/servers/message-write.js.map +1 -1
  110. package/dist/agent-farm/servers/overview.d.ts.map +1 -1
  111. package/dist/agent-farm/servers/overview.js +23 -4
  112. package/dist/agent-farm/servers/overview.js.map +1 -1
  113. package/dist/agent-farm/servers/render-gate.d.ts +141 -0
  114. package/dist/agent-farm/servers/render-gate.d.ts.map +1 -0
  115. package/dist/agent-farm/servers/render-gate.js +251 -0
  116. package/dist/agent-farm/servers/render-gate.js.map +1 -0
  117. package/dist/agent-farm/servers/session-submit.d.ts +90 -0
  118. package/dist/agent-farm/servers/session-submit.d.ts.map +1 -0
  119. package/dist/agent-farm/servers/session-submit.js +127 -0
  120. package/dist/agent-farm/servers/session-submit.js.map +1 -0
  121. package/dist/agent-farm/servers/tower-cron.d.ts +10 -7
  122. package/dist/agent-farm/servers/tower-cron.d.ts.map +1 -1
  123. package/dist/agent-farm/servers/tower-cron.js +58 -53
  124. package/dist/agent-farm/servers/tower-cron.js.map +1 -1
  125. package/dist/agent-farm/servers/tower-instances.d.ts +14 -2
  126. package/dist/agent-farm/servers/tower-instances.d.ts.map +1 -1
  127. package/dist/agent-farm/servers/tower-instances.js +78 -16
  128. package/dist/agent-farm/servers/tower-instances.js.map +1 -1
  129. package/dist/agent-farm/servers/tower-messages.d.ts +38 -1
  130. package/dist/agent-farm/servers/tower-messages.d.ts.map +1 -1
  131. package/dist/agent-farm/servers/tower-messages.js +106 -1
  132. package/dist/agent-farm/servers/tower-messages.js.map +1 -1
  133. package/dist/agent-farm/servers/tower-routes.d.ts +16 -4
  134. package/dist/agent-farm/servers/tower-routes.d.ts.map +1 -1
  135. package/dist/agent-farm/servers/tower-routes.js +670 -105
  136. package/dist/agent-farm/servers/tower-routes.js.map +1 -1
  137. package/dist/agent-farm/servers/tower-server.js +163 -31
  138. package/dist/agent-farm/servers/tower-server.js.map +1 -1
  139. package/dist/agent-farm/servers/tower-terminals.d.ts +17 -2
  140. package/dist/agent-farm/servers/tower-terminals.d.ts.map +1 -1
  141. package/dist/agent-farm/servers/tower-terminals.js +104 -122
  142. package/dist/agent-farm/servers/tower-terminals.js.map +1 -1
  143. package/dist/agent-farm/servers/tower-tunnel.d.ts.map +1 -1
  144. package/dist/agent-farm/servers/tower-tunnel.js +63 -4
  145. package/dist/agent-farm/servers/tower-tunnel.js.map +1 -1
  146. package/dist/agent-farm/servers/tower-types.d.ts +2 -1
  147. package/dist/agent-farm/servers/tower-types.d.ts.map +1 -1
  148. package/dist/agent-farm/servers/tower-utils.d.ts +64 -1
  149. package/dist/agent-farm/servers/tower-utils.d.ts.map +1 -1
  150. package/dist/agent-farm/servers/tower-utils.js +168 -1
  151. package/dist/agent-farm/servers/tower-utils.js.map +1 -1
  152. package/dist/agent-farm/servers/tower-websocket.d.ts.map +1 -1
  153. package/dist/agent-farm/servers/tower-websocket.js +6 -21
  154. package/dist/agent-farm/servers/tower-websocket.js.map +1 -1
  155. package/dist/agent-farm/servers/write-queue.d.ts +35 -0
  156. package/dist/agent-farm/servers/write-queue.d.ts.map +1 -0
  157. package/dist/agent-farm/servers/write-queue.js +56 -0
  158. package/dist/agent-farm/servers/write-queue.js.map +1 -0
  159. package/dist/agent-farm/types.d.ts +39 -0
  160. package/dist/agent-farm/types.d.ts.map +1 -1
  161. package/dist/agent-farm/utils/agent-names.d.ts +2 -2
  162. package/dist/agent-farm/utils/agent-names.d.ts.map +1 -1
  163. package/dist/agent-farm/utils/agent-names.js +3 -3
  164. package/dist/agent-farm/utils/agent-names.js.map +1 -1
  165. package/dist/agent-farm/utils/architect-name.d.ts +2 -2
  166. package/dist/agent-farm/utils/architect-name.d.ts.map +1 -1
  167. package/dist/agent-farm/utils/architect-name.js +3 -3
  168. package/dist/agent-farm/utils/architect-name.js.map +1 -1
  169. package/dist/agent-farm/utils/config.d.ts +13 -0
  170. package/dist/agent-farm/utils/config.d.ts.map +1 -1
  171. package/dist/agent-farm/utils/config.js +33 -1
  172. package/dist/agent-farm/utils/config.js.map +1 -1
  173. package/dist/agent-farm/utils/harness.d.ts +103 -7
  174. package/dist/agent-farm/utils/harness.d.ts.map +1 -1
  175. package/dist/agent-farm/utils/harness.js +126 -19
  176. package/dist/agent-farm/utils/harness.js.map +1 -1
  177. package/dist/cli.d.ts.map +1 -1
  178. package/dist/cli.js +6 -32
  179. package/dist/cli.js.map +1 -1
  180. package/dist/commands/consult/cli-options.d.ts +34 -0
  181. package/dist/commands/consult/cli-options.d.ts.map +1 -0
  182. package/dist/commands/consult/cli-options.js +67 -0
  183. package/dist/commands/consult/cli-options.js.map +1 -0
  184. package/dist/commands/consult/index.d.ts +56 -2
  185. package/dist/commands/consult/index.d.ts.map +1 -1
  186. package/dist/commands/consult/index.js +272 -28
  187. package/dist/commands/consult/index.js.map +1 -1
  188. package/dist/commands/consult/metrics.d.ts +42 -0
  189. package/dist/commands/consult/metrics.d.ts.map +1 -1
  190. package/dist/commands/consult/metrics.js +129 -9
  191. package/dist/commands/consult/metrics.js.map +1 -1
  192. package/dist/commands/doctor.d.ts.map +1 -1
  193. package/dist/commands/doctor.js +71 -19
  194. package/dist/commands/doctor.js.map +1 -1
  195. package/dist/commands/porch/checks.d.ts +23 -0
  196. package/dist/commands/porch/checks.d.ts.map +1 -1
  197. package/dist/commands/porch/checks.js +60 -0
  198. package/dist/commands/porch/checks.js.map +1 -1
  199. package/dist/commands/porch/config.d.ts +20 -0
  200. package/dist/commands/porch/config.d.ts.map +1 -1
  201. package/dist/commands/porch/config.js +20 -0
  202. package/dist/commands/porch/config.js.map +1 -1
  203. package/dist/commands/porch/index.js +21 -28
  204. package/dist/commands/porch/index.js.map +1 -1
  205. package/dist/commands/porch/next.d.ts.map +1 -1
  206. package/dist/commands/porch/next.js +2 -41
  207. package/dist/commands/porch/next.js.map +1 -1
  208. package/dist/lib/config.d.ts +69 -3
  209. package/dist/lib/config.d.ts.map +1 -1
  210. package/dist/lib/config.js +67 -3
  211. package/dist/lib/config.js.map +1 -1
  212. package/dist/lib/consult-lanes.d.ts +149 -0
  213. package/dist/lib/consult-lanes.d.ts.map +1 -0
  214. package/dist/lib/consult-lanes.js +360 -0
  215. package/dist/lib/consult-lanes.js.map +1 -0
  216. package/dist/lib/github.js +1 -1
  217. package/dist/lib/github.js.map +1 -1
  218. package/dist/lib/prompt-behavior-metrics.d.ts +67 -0
  219. package/dist/lib/prompt-behavior-metrics.d.ts.map +1 -0
  220. package/dist/lib/prompt-behavior-metrics.js +290 -0
  221. package/dist/lib/prompt-behavior-metrics.js.map +1 -0
  222. package/dist/lib/skeleton.d.ts +22 -1
  223. package/dist/lib/skeleton.d.ts.map +1 -1
  224. package/dist/lib/skeleton.js +120 -0
  225. package/dist/lib/skeleton.js.map +1 -1
  226. package/dist/lib/test-env.d.ts +74 -0
  227. package/dist/lib/test-env.d.ts.map +1 -0
  228. package/dist/lib/test-env.js +92 -0
  229. package/dist/lib/test-env.js.map +1 -0
  230. package/dist/terminal/pty-manager.d.ts +2 -0
  231. package/dist/terminal/pty-manager.d.ts.map +1 -1
  232. package/dist/terminal/pty-manager.js +16 -6
  233. package/dist/terminal/pty-manager.js.map +1 -1
  234. package/dist/terminal/pty-session.d.ts +131 -0
  235. package/dist/terminal/pty-session.d.ts.map +1 -1
  236. package/dist/terminal/pty-session.js +232 -39
  237. package/dist/terminal/pty-session.js.map +1 -1
  238. package/dist/terminal/ring-buffer.d.ts +39 -6
  239. package/dist/terminal/ring-buffer.d.ts.map +1 -1
  240. package/dist/terminal/ring-buffer.js +74 -6
  241. package/dist/terminal/ring-buffer.js.map +1 -1
  242. package/dist/terminal/session-manager.d.ts +53 -0
  243. package/dist/terminal/session-manager.d.ts.map +1 -1
  244. package/dist/terminal/session-manager.js +94 -9
  245. package/dist/terminal/session-manager.js.map +1 -1
  246. package/dist/terminal/session-screen.d.ts +91 -0
  247. package/dist/terminal/session-screen.d.ts.map +1 -0
  248. package/dist/terminal/session-screen.js +135 -0
  249. package/dist/terminal/session-screen.js.map +1 -0
  250. package/dist/terminal/shellper-main.js +2 -1
  251. package/dist/terminal/shellper-main.js.map +1 -1
  252. package/dist/terminal/shellper-process.d.ts +1 -1
  253. package/dist/terminal/shellper-process.d.ts.map +1 -1
  254. package/dist/terminal/shellper-process.js +17 -8
  255. package/dist/terminal/shellper-process.js.map +1 -1
  256. package/dist/terminal/shellper-replay-buffer.d.ts +69 -7
  257. package/dist/terminal/shellper-replay-buffer.d.ts.map +1 -1
  258. package/dist/terminal/shellper-replay-buffer.js +167 -31
  259. package/dist/terminal/shellper-replay-buffer.js.map +1 -1
  260. package/package.json +8 -6
  261. package/skeleton/.claude/skills/afx/SKILL.md +14 -1
  262. package/skeleton/.claude/skills/arch-init/SKILL.md +22 -9
  263. package/skeleton/.claude/skills/arch-save/SKILL.md +183 -0
  264. package/skeleton/.claude/skills/codev/SKILL.md +31 -0
  265. package/skeleton/.claude/skills/runnable-worktrees/SKILL.md +119 -0
  266. package/skeleton/.codex/skills/afx/SKILL.md +14 -1
  267. package/skeleton/.codex/skills/arch-init/SKILL.md +22 -9
  268. package/skeleton/.codex/skills/arch-save/SKILL.md +183 -0
  269. package/skeleton/.codex/skills/codev/SKILL.md +31 -0
  270. package/skeleton/.codex/skills/runnable-worktrees/SKILL.md +119 -0
  271. package/skeleton/protocols/air/builder-prompt.md +28 -47
  272. package/skeleton/protocols/air/consult-types/impl-review.md +17 -34
  273. package/skeleton/protocols/air/consult-types/pr-review.md +14 -37
  274. package/skeleton/protocols/air/prompts/implement.md +20 -73
  275. package/skeleton/protocols/air/prompts/pr.md +22 -54
  276. package/skeleton/protocols/air/protocol.md +40 -71
  277. package/skeleton/protocols/aspir/builder-prompt.md +29 -66
  278. package/skeleton/protocols/aspir/consult-types/impl-review.md +17 -44
  279. package/skeleton/protocols/aspir/consult-types/phase-review.md +17 -44
  280. package/skeleton/protocols/aspir/consult-types/plan-review.md +14 -38
  281. package/skeleton/protocols/aspir/consult-types/pr-review.md +13 -39
  282. package/skeleton/protocols/aspir/consult-types/spec-review.md +13 -33
  283. package/skeleton/protocols/aspir/prompts/implement.md +27 -196
  284. package/skeleton/protocols/aspir/prompts/plan.md +21 -85
  285. package/skeleton/protocols/aspir/prompts/review.md +29 -228
  286. package/skeleton/protocols/aspir/prompts/specify.md +25 -111
  287. package/skeleton/protocols/aspir/protocol.json +10 -0
  288. package/skeleton/protocols/aspir/protocol.md +36 -82
  289. package/skeleton/protocols/bugfix/builder-prompt.md +23 -45
  290. package/skeleton/protocols/bugfix/consult-types/impl-review.md +21 -45
  291. package/skeleton/protocols/bugfix/consult-types/pr-review.md +18 -52
  292. package/skeleton/protocols/bugfix/prompts/fix.md +16 -61
  293. package/skeleton/protocols/bugfix/prompts/investigate.md +18 -62
  294. package/skeleton/protocols/bugfix/prompts/pr.md +22 -57
  295. package/skeleton/protocols/bugfix/protocol.md +44 -50
  296. package/skeleton/protocols/experiment/builder-prompt.md +25 -58
  297. package/skeleton/protocols/experiment/protocol.md +22 -188
  298. package/skeleton/protocols/experiment/templates/notes.md +11 -71
  299. package/skeleton/protocols/maintain/builder-prompt.md +24 -45
  300. package/skeleton/protocols/maintain/consult-types/impl-review.md +17 -44
  301. package/skeleton/protocols/maintain/consult-types/pr-review.md +13 -39
  302. package/skeleton/protocols/maintain/prompts/maintain.md +1 -1
  303. package/skeleton/protocols/maintain/protocol.md +32 -266
  304. package/skeleton/protocols/maintain/templates/maintenance-run.md +11 -0
  305. package/skeleton/protocols/pir/builder-prompt.md +30 -64
  306. package/skeleton/protocols/pir/consult-types/impl-review.md +17 -50
  307. package/skeleton/protocols/pir/consult-types/pr-review.md +11 -40
  308. package/skeleton/protocols/pir/prompts/implement.md +1 -2
  309. package/skeleton/protocols/pir/prompts/plan.md +0 -3
  310. package/skeleton/protocols/pir/prompts/review.md +1 -1
  311. package/skeleton/protocols/pir/protocol.md +54 -177
  312. package/skeleton/protocols/research/builder-prompt.md +27 -58
  313. package/skeleton/protocols/research/protocol.md +28 -153
  314. package/skeleton/protocols/spike/builder-prompt.md +30 -48
  315. package/skeleton/protocols/spike/protocol.md +24 -107
  316. package/skeleton/protocols/spike/templates/findings.md +9 -39
  317. package/skeleton/protocols/spir/builder-prompt.md +33 -62
  318. package/skeleton/protocols/spir/consult-types/impl-review.md +17 -44
  319. package/skeleton/protocols/spir/consult-types/phase-review.md +17 -44
  320. package/skeleton/protocols/spir/consult-types/plan-review.md +14 -38
  321. package/skeleton/protocols/spir/consult-types/pr-review.md +13 -39
  322. package/skeleton/protocols/spir/consult-types/spec-review.md +13 -33
  323. package/skeleton/protocols/spir/prompts/implement.md +26 -195
  324. package/skeleton/protocols/spir/prompts/plan.md +20 -84
  325. package/skeleton/protocols/spir/prompts/review.md +28 -227
  326. package/skeleton/protocols/spir/prompts/specify.md +24 -110
  327. package/skeleton/protocols/spir/protocol.json +10 -0
  328. package/skeleton/protocols/spir/protocol.md +84 -633
  329. package/skeleton/protocols/spir/templates/plan.md +28 -147
  330. package/skeleton/protocols/spir/templates/review.md +21 -80
  331. package/skeleton/protocols/spir/templates/spec.md +24 -118
  332. package/skeleton/resources/commands/agent-farm.md +259 -0
  333. package/skeleton/resources/commands/consult.md +236 -8
  334. package/skeleton/resources/commands/overview.md +1 -0
  335. package/skeleton/roles/architect.md +67 -317
  336. package/skeleton/roles/builder.md +77 -191
  337. package/skeleton/templates/AGENTS.md +2 -0
  338. package/skeleton/templates/CLAUDE.md +2 -0
  339. package/templates/tower.html +39 -2
  340. package/dashboard-dist/assets/index-BZ1x7x1X.js.map +0 -1
  341. package/dashboard-dist/assets/index-DB1KBSNE.css +0 -32
  342. package/dist/agent-farm/servers/send-buffer.d.ts +0 -59
  343. package/dist/agent-farm/servers/send-buffer.d.ts.map +0 -1
  344. package/dist/agent-farm/servers/send-buffer.js +0 -116
  345. package/dist/agent-farm/servers/send-buffer.js.map +0 -1
  346. package/skeleton/porch/prompts/defend.md +0 -108
  347. package/skeleton/porch/prompts/diagnose.md +0 -70
  348. package/skeleton/porch/prompts/evaluate.md +0 -132
  349. package/skeleton/porch/prompts/fix.md +0 -59
  350. package/skeleton/porch/prompts/implement.md +0 -88
  351. package/skeleton/porch/prompts/plan.md +0 -74
  352. package/skeleton/porch/prompts/pr.md +0 -84
  353. package/skeleton/porch/prompts/review.md +0 -249
  354. package/skeleton/porch/prompts/specify.md +0 -53
  355. package/skeleton/porch/prompts/test.md +0 -63
  356. package/skeleton/protocols/aspir/templates/plan.md +0 -184
  357. package/skeleton/protocols/aspir/templates/review.md +0 -120
  358. package/skeleton/protocols/aspir/templates/spec.md +0 -154
@@ -1,169 +1,44 @@
1
1
  # RESEARCH Protocol
2
2
 
3
- ## Overview
3
+ Scope → Investigate → Synthesize → Critique. Multiple models investigate the same question
4
+ independently, their findings are synthesized, and the synthesis is adversarially critiqued
5
+ before it is trusted. **The state machine below is authoritative on which models actually
6
+ run** — the set can be smaller than the ideal when a provider's consult lane is unavailable
7
+ (it is currently `["codex"]` for investigation, the agy/Gemini and hermes lanes being degraded).
4
8
 
5
- Multi-agent research with 3-way investigation, synthesis, and critique. Three AI models independently investigate a question, their findings are synthesized into a single report, and then all three models critique the synthesis for gaps, errors, and bias.
9
+ Use it for competitive and technology analysis, "state of X" questions, and architectural
10
+ decision support in an unfamiliar domain — cases where a single model's confident answer is
11
+ exactly the failure mode.
6
12
 
7
- **Core Principle**: Triangulate. No single model's knowledge is authoritative. Consensus across models is more reliable than any individual output.
13
+ ## The state machine
8
14
 
9
- ## When to Use
10
-
11
- **Use for**: Competitive analysis, technology evaluation, market research, architectural decision support, "what's the state of X?" questions, exploring unfamiliar domains.
12
-
13
- **Skip for**: Implementation work (use SPIR/ASPIR), quick questions (just ask), experiments (use EXPERIMENT), known-answer lookups (just search).
15
+ ```json
16
+ {{> protocols/research/protocol.json}}
17
+ ```
14
18
 
15
19
  ## Output
16
20
 
17
- All research artifacts go to `codev/research/`. The final deliverable is a single synthesis report at `codev/research/<topic>.md`.
21
+ `codev/research/<topic>.md` — the report, with its sources and its disagreements preserved.
18
22
 
19
23
  ## Phases
20
24
 
21
- ### Phase 1: Scope
22
-
23
- **Purpose**: Make sure we're asking the right question before spending 3 models' worth of compute on answering it.
24
-
25
- The builder:
26
- 1. Reads the architect's research request
27
- 2. Clarifies the question — what specifically are we trying to learn?
28
- 3. Defines the scope — what's in, what's out, what depth is needed
29
- 4. Defines acceptance criteria — what does a good answer look like?
30
- 5. Writes a **research brief** (`codev/research/<topic>-brief.md`) with:
31
- - The precise question(s)
32
- - Scope boundaries
33
- - **Required targets** (when applicable — not all research questions have them). When the user names specific projects, products, or systems, those are exemplars of a CLASS, not an exhaustive list. The brief should:
34
- - List the named targets as required coverage (each gets a dedicated section)
35
- - Identify the CLASS they represent (e.g., "open-source always-on agent frameworks")
36
- - Instruct investigators to find OTHER members of that class the user didn't name — discovering what the user SHOULD be thinking about is often the most valuable part of the research
37
- - If an investigator cannot find information about a required target, they must say so explicitly — not silently skip it
38
- - **Optional context** — additional sources that may be useful but are not required
39
- - What a useful answer looks like
40
- - Suggested sources or angles for the investigators
41
- 6. Sends the brief to the architect for approval
42
-
43
- **Gate**: `scope-approval` — the architect confirms the question is correctly scoped before the 3-way investigation begins. This prevents wasting compute on a badly-framed question.
44
-
45
- ### Phase 2: Investigate (3-way parallel)
46
-
47
- **Purpose**: Get three independent perspectives on the question.
48
-
49
- The builder dispatches the research brief to three models (Gemini, Codex, Claude) via `consult`. Each model:
50
- 1. Receives the scoped research brief
51
- 2. Independently investigates using web search, its training knowledge, and reasoning
52
- 3. Produces a standalone investigation report with:
53
- - **A dedicated section for each required target** from the brief. Every required target gets its own heading with specific findings — not mentioned in passing, not substituted with an easier target. If a required target yields no findings, the section must say "No information found" rather than being omitted.
54
- - Findings (with sources where possible)
55
- - Confidence levels on key claims
56
- - Gaps it couldn't fill
57
- - Surprises or things that contradicted expectations
58
-
59
- The investigations run in **parallel** — each model works independently without seeing the others' output. This prevents anchoring bias.
60
-
61
- Investigation reports are saved to:
62
- - `codev/research/<topic>-gemini.md`
63
- - `codev/research/<topic>-codex.md`
64
- - `codev/research/<topic>-claude.md`
65
-
66
- ### Phase 3: Synthesize
67
-
68
- **Purpose**: Merge three independent reports into one coherent document.
69
-
70
- The builder:
71
- 1. Reads all three investigation reports
72
- 2. Identifies **consensus** — what all three agree on (highest confidence)
73
- 3. Identifies **disagreements** — where models contradict each other
74
- 4. Resolves conflicts — picks the best-supported position, notes the disagreement
75
- 5. Identifies **unique contributions** — things only one model found that the others missed
76
- 6. Writes the **synthesis report** (`codev/research/<topic>.md`) with:
77
- - **Scope summary** — a short section (before the executive summary) restating the research question, required targets, and scope boundaries from the brief. A reader should understand what was asked without needing to read the brief separately.
78
- - Executive summary
79
- - Findings (organized by topic, not by model)
80
- - Confidence annotations (consensus vs. single-source)
81
- - Gaps and limitations
82
- - Recommendations (if the research brief asked for them)
83
-
84
- The synthesis is written as a **standalone document** — a reader should never need to reference the individual investigation reports. Those are kept as appendices for traceability.
85
-
86
- ### Phase 4: Critique (3-way review)
87
-
88
- **Purpose**: Pressure-test the synthesis for gaps, errors, and bias.
25
+ **Scope** — write the research brief: the question, why it matters, what would count as an
26
+ answer, and what is out of scope. Gated by `scope-approval`, because a badly framed question
27
+ wastes the investigation's compute and produces a confident answer to the wrong thing.
89
28
 
90
- The builder dispatches the synthesis report back to all three models for critique. Each model:
91
- 1. Reads the synthesis
92
- 2. **Checks coverage against the brief** — does every required target from the research brief have dedicated coverage in the synthesis? Lists any required targets that were named in the brief but have zero or minimal coverage. This is the #1 critique check.
93
- 3. Checks for factual errors or unsupported claims
94
- 4. Identifies gaps — important aspects the synthesis missed
95
- 5. Flags potential bias — did the synthesis over-weight one model's perspective?
96
- 6. Suggests specific improvements
29
+ **Investigate** — the configured models (see the state machine) work the question
30
+ **independently**. Independence is the point: cross-contaminated investigations converge on a
31
+ shared error, so where more than one model is available each researches without seeing the others.
97
32
 
98
- The builder then:
99
- 1. Incorporates valid critique
100
- 2. Documents rejected critique with rationale
101
- 3. Finalizes the report
102
- 4. Commits to `codev/research/<topic>.md`
33
+ **Synthesize** — merge findings and, critically, **preserve disagreement**. Where models
34
+ diverge, say so and say why; a synthesis that smooths over conflict has destroyed the signal
35
+ that made a multi-model investigation worth running.
103
36
 
104
- ## File Structure
37
+ **Critique** — adversarial pass over the synthesis. What is asserted without a source? What
38
+ would change the conclusion? Reaching `research-complete` means the report survived this, not
39
+ that it was written.
105
40
 
106
- Only the brief and final report are checked in. Individual investigation reports and full critique outputs are working artifacts — useful during the process but not committed to the repo.
107
-
108
- ```
109
- codev/research/
110
- ├── <topic>-brief.md # Phase 1: scoped research question (checked in)
111
- └── <topic>.md # Phase 3+4: final synthesis (the deliverable, checked in)
112
- ```
113
-
114
- The final report includes:
115
- - A **"Disagreements and resolution"** section documenting where the three investigators disagreed and how the synthesis resolved each disagreement
116
- - A **"Changes from critique"** section summarizing what the critique phase changed (not the full critique — just what was added, removed, or corrected and why)
117
-
118
- Individual investigation reports (`<topic>-gemini.md`, `<topic>-codex.md`, `<topic>-claude.md`) and raw critique outputs are kept locally during the research process but NOT committed. The final report is the deliverable; the process artifacts are disposable.
119
-
120
- ## Best Practices
121
-
122
- ### Scoping
123
- - A good research question is specific enough to answer in 1500-3000 words per model
124
- - "What's the state of X?" is too broad — "What are the top 5 players in X, their strengths/weaknesses, and the structural gaps?" is better
125
- - Include the "so what" — why are we researching this? What decision does it inform?
126
-
127
- ### Investigation
128
- - Tell each model to cite sources where possible
129
- - Tell each model to be candid about uncertainty — "I don't know" is better than confabulation
130
- - Tell each model to note surprises — the most valuable findings are often the unexpected ones
131
-
132
- ### Synthesis
133
- - Organize by topic, not by model ("here's what we found about X" not "here's what Gemini said")
134
- - Weight consensus over single-model claims
135
- - Don't smooth over disagreements — note them explicitly
136
- - Keep the synthesis shorter than the sum of the investigations
137
-
138
- ### Critique
139
- - Critiquers should focus on gaps and errors, not style
140
- - A critique that says "add more about X" is useful; "rewrite the intro" is not
141
- - The builder should reject critique that's outside the original scope
142
-
143
- ## Integration with Other Protocols
144
-
145
- ### Research → SPIR
146
- When research informs a feature decision:
147
- 1. Reference the research report in the spec
148
- 2. Link specific findings as evidence for design choices
149
-
150
- ### Research → EXPERIMENT
151
- When research identifies something worth testing:
152
- 1. Create an experiment to validate the research finding
153
- 2. Reference the research report as motivation
154
-
155
- ## Git Workflow
156
-
157
- ### Commits
158
- ```
159
- [Research: topic] Scoped research brief
160
- [Research: topic] 3-way investigation complete
161
- [Research: topic] Synthesis report
162
- [Research: topic] Final report (post-critique)
163
- ```
41
+ ## Reporting standard
164
42
 
165
- ### What to Commit
166
- - All investigation reports (for traceability)
167
- - The final synthesis (the deliverable)
168
- - The critique rebuttals (for process transparency)
169
- - Do NOT commit raw web search results or intermediate notes
43
+ Cite sources for factual claims and mark inference as inference. A research report that cannot
44
+ be checked is an opinion with footnotes.
@@ -1,68 +1,50 @@
1
1
  # {{protocol_name}} Builder ({{mode}} mode)
2
2
 
3
- You are executing a time-boxed technical feasibility spike.
3
+ You are implementing {{input_description}}.
4
4
 
5
5
  {{#if mode_soft}}
6
6
  ## Mode: SOFT
7
- You are running in SOFT mode. This means:
8
- - You follow the SPIKE protocol yourself (no porch orchestration)
9
- - Stay focused on the question — don't gold-plate
10
- - The findings document is your deliverable, not the code
11
- {{/if}}
12
-
13
- ## Protocol
14
- Follow the SPIKE protocol. Read and internalize the protocol before starting any work. The full protocol text is included below under **## Protocol Reference (full text)**.
15
7
 
16
- {{#if task}}
17
- ## Spike Question
18
- {{task_text}}
8
+ You follow the protocol yourself; the architect verifies compliance.
19
9
  {{/if}}
20
10
 
21
- ## Recommended Workflow
11
+ {{#if mode_strict}}
12
+ ## Mode: STRICT
22
13
 
23
- Follow this 3-step workflow. You can skip or reorder steps as the investigation demands.
14
+ Porch orchestrates. `porch next` gives you tasks; `porch done` signals completion. Never
15
+ hand-edit `status.yaml` — only porch commands modify project state.
16
+ {{/if}}
24
17
 
25
- ### 1. Research
26
- - Read documentation, examine existing code, search for prior art
27
- - Identify constraints, dependencies, and potential blockers
28
- - Understand the problem space before writing any code
18
+ ## Protocol
29
19
 
30
- ### 2. Iterate
31
- - Build minimal proof-of-concept code to test approaches
32
- - Focus on answering the feasibility question, not building production code
33
- - POC code doesn't need tests or polish
34
- - **Skip this step** if the answer is clear from research alone
20
+ The full protocol text is inlined below under **## Protocol Reference (full text)** — you do not
21
+ need to fetch it.
35
22
 
36
- ### 3. Findings
37
- - Write findings to `codev/spikes/<id>-<name>.md` using the template
38
- - Provide a clear feasibility verdict: Feasible / Not Feasible / Feasible with Caveats
39
- - Commit the findings document
40
- - Notify the architect: `afx send architect "Spike <id> complete. Verdict: [verdict]"`
23
+ ## Spike Question
41
24
 
42
- ## Key Principles
25
+ {{task_text}}
43
26
 
44
- - **Time-boxing**: Stay focused on the question. Don't explore tangents.
45
- - **Exploration over perfection**: POC code doesn't need tests or polish.
46
- - **Clear output**: The findings document is the deliverable, not the code.
47
- - **Know when to stop**: Once you can answer the feasibility question, write findings and stop. Don't keep iterating.
48
- - **Document failures**: "Not feasible" is a valid and valuable finding.
27
+ ## Workflow
49
28
 
50
- ## Handling Flaky Tests
29
+ Three steps; skip or reorder as the investigation demands.
51
30
 
52
- If you encounter **pre-existing flaky tests** (intermittent failures unrelated to your changes):
53
- 1. **DO NOT** edit `status.yaml` to bypass checks
54
- 2. **DO NOT** skip porch checks or use any workaround to avoid the failure
55
- 3. **DO** mark the test as skipped with a clear annotation (e.g., `it.skip('...') // FLAKY: skipped pending investigation`)
56
- 4. **DO** document each skipped flaky test in your findings under a `## Flaky Tests` section
57
- 5. Commit the skip and continue with your work
31
+ 1. **Research** — documentation, existing code, prior art. Identify constraints, dependencies
32
+ and blockers before writing any code.
33
+ 2. **Iterate** — minimal proof-of-concept to test approaches. POC code needs no tests or polish;
34
+ it exists to answer the question. **Skip this entirely** if research already answers it.
35
+ 3. **Findings** — write `codev/spikes/<id>-<name>.md` with a clear verdict (Feasible / Not
36
+ Feasible / Feasible with Caveats), commit it, and notify:
37
+ `afx send architect "Spike <id> complete. Verdict: [verdict]"`
58
38
 
59
- ## Getting Started
60
- 1. Read the SPIKE protocol document
61
- 2. Understand the question you're investigating
62
- 3. Start with research — don't jump straight to code
39
+ ## Key Principles
63
40
 
64
- ---
41
+ - **Time-box**: stay on the question, don't explore tangents
42
+ - **The findings document is the deliverable, not the code**
43
+ - **Know when to stop**: once you can answer the question, write findings and stop
44
+ - **"Not feasible" is a valuable finding.** The failure mode is an inconclusive spike — time
45
+ spent, nothing recorded, question still open
65
46
 
66
- ## Protocol Reference (full text)
47
+ ## Notifications
67
48
 
68
- {{protocol_reference}}
49
+ The architect is not watching. `afx send architect "..."` at each of: gate reached, PR ready, PR
50
+ merged, blocked.
@@ -1,128 +1,45 @@
1
1
  # SPIKE Protocol
2
2
 
3
- ## Overview
3
+ A time-boxed feasibility investigation that answers one question: **can this be done, and at
4
+ what cost?** The deliverable is findings, not shipped code.
4
5
 
5
- Time-boxed technical feasibility exploration. Answer "Can we do X?" and "What would it take?" before committing to a full SPIR project.
6
+ Use it before committing to a SPIR project whose feasibility is genuinely unknown — an unfamiliar
7
+ library, an unproven integration, a performance question that argument cannot settle.
6
8
 
7
- **Core Principle**: Stay focused on the question. Once you can answer it, write findings and stop.
9
+ ## The state machine
8
10
 
9
- ## When to Use
10
-
11
- **Use for**: Quick technical feasibility investigations, proof-of-concept explorations, "can we do X?" questions, evaluating approaches before committing to SPIR
12
-
13
- **Skip for**: Production code (use SPIR), formal hypothesis testing (use EXPERIMENT), bug fixes (use BUGFIX)
14
-
15
- ### Spike vs Experiment
16
-
17
- | | Spike | Experiment |
18
- |---|---|---|
19
- | **Goal** | Answer a feasibility question | Test a formal hypothesis |
20
- | **Structure** | Lightweight guidance | Formal phases (hypothesis/design/execute/analyze) |
21
- | **Output** | Findings document | Experiment notes with metrics |
22
- | **Rigor** | Exploration-first | Measurement-first |
23
- | **Time** | Short (hours) | Longer (days) |
24
-
25
- ## Spawning a Spike
26
-
27
- ```bash
28
- afx spawn --task "Can we use WebSockets for real-time updates?" --protocol spike
29
- afx spawn --task "What would it take to support SQLite FTS?" --protocol spike
11
+ ```json
12
+ {{> protocols/spike/protocol.json}}
30
13
  ```
31
14
 
32
- Spikes are always soft mode — no porch orchestration, no gates, no consultation.
33
-
34
- ## Recommended Workflow
35
-
36
- The following 3-step workflow is **guidance only** — not enforced by porch. Follow it, skip steps, or reorder as the investigation demands.
37
-
38
- ### Step 1: Research
39
-
40
- - Read documentation, examine existing code, search for prior art
41
- - Identify constraints, dependencies, and potential blockers
42
- - Understand the problem space before writing any code
43
- - Check if someone has already investigated this (look in `codev/spikes/`)
44
-
45
- ### Step 2: Iterate
46
-
47
- - Build minimal proof-of-concept code
48
- - Try different approaches, hit walls, pivot
49
- - Focus on answering the feasibility question, not building production code
50
- - **Skip this step** if the answer is clear from research alone
51
-
52
- ### Step 3: Findings
53
-
54
- - Write the findings document at `codev/spikes/<id>-<name>.md`
55
- - Use the embedded template at the end of this protocol
56
- - Provide a clear feasibility verdict
57
- - Commit and notify the architect
15
+ ## Proof-of-concept code
58
16
 
59
- ## Output
17
+ Throwaway by design. It exists to answer the question, and it is not held to production
18
+ standards — but it must not be quietly promoted into production later either. If the answer is
19
+ "feasible", a SPIR project builds the real thing.
60
20
 
61
- Findings are stored in `codev/spikes/` using the pattern: `<id>-<descriptive-name>.md`
21
+ ## Outcomes
62
22
 
63
- Examples:
64
- - `codev/spikes/462-websocket-feasibility.md`
65
- - `codev/spikes/475-sqlite-fts-performance.md`
23
+ | Verdict | What the findings must contain |
24
+ |---|---|
25
+ | **Feasible** | Recommended approach and rough cost, enough for the architect to decide on a SPIR project |
26
+ | **Not feasible** | Why, what was tried, and what alternatives exist — this is what stops the investigation being repeated in six months |
27
+ | **Feasible with caveats** | The conditions, risks and trade-offs that make it conditional |
66
28
 
67
- The `<id>` is the GitHub issue number or project ID.
29
+ A negative result is a successful spike. The failure mode is an inconclusive one: time spent,
30
+ nothing recorded, question still open.
68
31
 
69
- ## Proof-of-Concept Code
32
+ Notify the architect with the verdict when done.
70
33
 
71
- POC code from the iterate step is committed to the spike branch alongside the findings document. It serves as evidence supporting the findings. However:
34
+ ## Findings
72
35
 
73
- - POC code does NOT need tests, polish, or production quality
74
- - POC code does NOT get merged to main — it stays on the spike branch
75
- - The findings document is the primary deliverable; the code is supporting evidence
76
- - If the spike leads to a SPIR project, the builder starts fresh
36
+ Write findings using this structure:
77
37
 
78
- ## Outcome Handling
79
-
80
- - **Feasible**: Write findings with recommended approach and effort estimate. Architect decides whether to create a SPIR project.
81
- - **Not Feasible**: Write findings documenting why, what was tried, and what alternatives exist. This prevents future teams from repeating the investigation.
82
- - **Feasible with Caveats**: Write findings with conditions, risks, and trade-offs.
83
-
84
- In all cases, notify the architect:
85
- ```bash
86
- afx send architect "Spike <id> complete. Verdict: [feasible/not feasible/caveats]"
87
- ```
38
+ {{> protocols/spike/templates/findings.md}}
88
39
 
89
- ## Git Workflow
40
+ ## Git
90
41
 
91
- ### Commits
92
42
  ```
93
43
  [Spike 462] Research: WebSocket library comparison
94
- [Spike 462] Iterate: POC with ws library
95
44
  [Spike 462] Findings: WebSockets feasible for real-time updates
96
45
  ```
97
-
98
- ### When to Commit
99
- - After significant research findings
100
- - After each iteration attempt
101
- - When writing the findings document (final commit)
102
-
103
- ## Integration with Other Protocols
104
-
105
- ### Spike -> SPIR
106
- When a spike validates feasibility:
107
- 1. Create a SPIR spec referencing the spike findings
108
- 2. Use findings to inform the solution approach
109
- 3. Reference effort estimate for planning
110
-
111
- Example spec reference:
112
- ```markdown
113
- ## Background
114
- Spike 462 confirmed WebSocket feasibility with the `ws` library.
115
- See: codev/spikes/462-websocket-feasibility.md
116
- ```
117
-
118
- ### Spike -> "Do Not Pursue"
119
- When a spike finds something is not feasible:
120
- 1. Document clearly in findings
121
- 2. Close the related GitHub issue with a link to findings
122
- 3. The findings become institutional knowledge
123
-
124
- ## Template: findings.md
125
-
126
- Write the findings document using the following template:
127
-
128
- {{> protocols/spike/templates/findings.md}}
@@ -1,67 +1,37 @@
1
1
  # Spike: [Title]
2
2
 
3
- **Date**: YYYY-MM-DD
4
-
5
- **Verdict**: Feasible | Not Feasible | Feasible with Caveats
3
+ **Date**: YYYY-MM-DD · **Verdict**: Feasible | Not Feasible | Feasible with Caveats
6
4
 
7
5
  ## Question
8
6
 
9
- What technical question was being investigated? Be specific:
10
- - What are you trying to determine?
11
- - What prompted this investigation?
12
- - What decision depends on the answer?
7
+ The technical question investigated, what prompted it, and the decision that depends on the answer.
13
8
 
14
9
  ## Research Summary
15
10
 
16
- What was explored during the research phase:
17
- - Documentation read
18
- - Existing code examined
19
- - Prior art found
20
- - Key constraints identified
11
+ What was explored — documentation read, existing code examined, prior art, and the key constraints identified.
21
12
 
22
13
  ## Approaches Tried
23
14
 
24
- What was built or tested during the iterate phase:
15
+ What was built or tested. For each: what it was, what happened, and whether it worked.
25
16
 
26
17
  ### Approach 1: [Name]
27
- - **What**: Brief description of what was tried
28
- - **Result**: What happened
29
- - **Verdict**: Worked / Didn't work / Partially worked
30
-
31
- ### Approach 2: [Name]
32
- *(Add more approaches as needed, or remove if research alone answered the question)*
33
18
 
34
19
  ## Constraints Discovered
35
20
 
36
- Technical limitations, dependencies, and gotchas found during the investigation:
37
- - [Constraint 1]
38
- - [Constraint 2]
21
+ Technical limitations, dependencies, and gotchas found during the investigation.
39
22
 
40
23
  ## Recommended Approach
41
24
 
42
- *(If feasible)* How should full implementation proceed?
43
- - Recommended library/technique/pattern
44
- - Key architectural decisions
45
- - Things to watch out for
46
-
47
- *(If not feasible)* Why not, and what alternatives exist?
25
+ If feasible: how full implementation should proceed — recommended library/technique/pattern, key architectural decisions, and what to watch out for. If not feasible: why, and what alternatives exist.
48
26
 
49
27
  ## Effort Estimate
50
28
 
51
- Rough sizing for a full SPIR project: **Small** | **Medium** | **Large**
52
-
53
- - Small: < 300 LOC, 1-2 files, straightforward
54
- - Medium: 300-1000 LOC, multiple files, some complexity
55
- - Large: 1000+ LOC, architectural changes, significant complexity
29
+ Rough sizing for a full SPIR project: **Small** (< 300 LOC) | **Medium** (300–1000 LOC) | **Large** (1000+ LOC, architectural).
56
30
 
57
31
  ## Next Steps
58
32
 
59
- - [ ] [Recommended action — e.g., "Create SPIR spec for WebSocket integration"]
60
- - [ ] [Or: "Do not pursue — blocked by X"]
61
- - [ ] [Or: "Investigate Y further before deciding"]
33
+ - [ ] The recommended action (create a SPIR spec, do not pursue, or investigate further before deciding).
62
34
 
63
35
  ## References
64
36
 
65
- - [Link to relevant documentation]
66
- - [Link to relevant code/commits]
67
- - [Link to external resources consulted]
37
+ Relevant documentation, code/commits, and external resources consulted.