@hassangameryt/freeflow 0.2.0 → 0.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 (639) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude-plugin/marketplace.json +2 -2
  3. package/{plugins/freeflow/.claude-plugin → .claude-plugin}/plugin.json +1 -1
  4. package/{plugins/freeflow/.codex-plugin → .codex-plugin}/plugin.json +1 -1
  5. package/README.md +19 -14
  6. package/assets/freeflow-plugin-icon.png +0 -0
  7. package/{plugins/freeflow/command-surface.json → command-surface.json} +10 -2
  8. package/evals/README.md +32 -0
  9. package/evals/fixtures/copy-conventions.md +31 -0
  10. package/evals/fixtures/output-router/README.md +12 -0
  11. package/evals/fixtures/output-router/failed-command-output.txt +9 -0
  12. package/evals/fixtures/output-router/large-router-manual.md +63 -0
  13. package/evals/fixtures/output-router/native-large-output.txt +40 -0
  14. package/evals/fixtures/output-router/noisy-test-output.txt +30 -0
  15. package/evals/fixtures/output-router/verification-output.txt +8 -0
  16. package/evals/fixtures/tiny-artifact-review-app/README.md +5 -0
  17. package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +10 -0
  18. package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +21 -0
  19. package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +24 -0
  20. package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +17 -0
  21. package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +8 -0
  22. package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +15 -0
  23. package/evals/fixtures/tiny-commit-ambiguous-app/README.md +3 -0
  24. package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +5 -0
  25. package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +1 -0
  26. package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +5 -0
  27. package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +14 -0
  28. package/evals/fixtures/tiny-commit-app/README.md +3 -0
  29. package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +5 -0
  30. package/evals/fixtures/tiny-commit-app/src/billing.ts +5 -0
  31. package/evals/fixtures/tiny-commit-app/src/settings-page.ts +1 -0
  32. package/evals/fixtures/tiny-commit-app/tests/settings.test.md +5 -0
  33. package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +15 -0
  34. package/evals/fixtures/tiny-commit-everything-app/README.md +3 -0
  35. package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +5 -0
  36. package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +5 -0
  37. package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +1 -0
  38. package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +5 -0
  39. package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +15 -0
  40. package/evals/fixtures/tiny-commit-staged-app/README.md +3 -0
  41. package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +5 -0
  42. package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +5 -0
  43. package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +1 -0
  44. package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +5 -0
  45. package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +15 -0
  46. package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +3 -0
  47. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +3 -0
  48. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +3 -0
  49. package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +5 -0
  50. package/evals/fixtures/tiny-dashboard-stale-app/README.md +11 -0
  51. package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +13 -0
  52. package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +19 -0
  53. package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +9 -0
  54. package/evals/fixtures/tiny-decision-destination-app/README.md +6 -0
  55. package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +8 -0
  56. package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +4 -0
  57. package/evals/fixtures/tiny-design-depth-app/README.md +15 -0
  58. package/evals/fixtures/tiny-design-depth-app/src/routes.ts +25 -0
  59. package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +3 -0
  60. package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +3 -0
  61. package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +3 -0
  62. package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +12 -0
  63. package/evals/fixtures/tiny-eval-method-app/README.md +8 -0
  64. package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +5 -0
  65. package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +17 -0
  66. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +11 -0
  67. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +3 -0
  68. package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +10 -0
  69. package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +10 -0
  70. package/evals/fixtures/tiny-execute-plan-app/README.md +5 -0
  71. package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +5 -0
  72. package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +10 -0
  73. package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +11 -0
  74. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +12 -0
  75. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +15 -0
  76. package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +9 -0
  77. package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +9 -0
  78. package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +9 -0
  79. package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +7 -0
  80. package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +1 -0
  81. package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +7 -0
  82. package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +5 -0
  83. package/evals/fixtures/tiny-execute-review-loop-app/README.md +5 -0
  84. package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +9 -0
  85. package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +12 -0
  86. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +15 -0
  87. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +11 -0
  88. package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +9 -0
  89. package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +7 -0
  90. package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +1 -0
  91. package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +7 -0
  92. package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +5 -0
  93. package/evals/fixtures/tiny-flaky-session-app/README.md +10 -0
  94. package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +13 -0
  95. package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +8 -0
  96. package/evals/fixtures/tiny-handoff-app/README.md +5 -0
  97. package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +10 -0
  98. package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +8 -0
  99. package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +11 -0
  100. package/evals/fixtures/tiny-handoff-app/src/billing.ts +7 -0
  101. package/evals/fixtures/tiny-handoff-report-app/README.md +3 -0
  102. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +1 -0
  103. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +1 -0
  104. package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +4 -0
  105. package/evals/fixtures/tiny-plan-app/README.md +5 -0
  106. package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +10 -0
  107. package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +25 -0
  108. package/evals/fixtures/tiny-plan-app/src/billing.ts +17 -0
  109. package/evals/fixtures/tiny-plan-app/src/settings-page.ts +1 -0
  110. package/evals/fixtures/tiny-plan-app/tests/billing.test.md +8 -0
  111. package/evals/fixtures/tiny-plan-app/tests/settings.test.md +5 -0
  112. package/evals/fixtures/tiny-plan-strict-api-app/README.md +3 -0
  113. package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +5 -0
  114. package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +25 -0
  115. package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +5 -0
  116. package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +3 -0
  117. package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +8 -0
  118. package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +3 -0
  119. package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +15 -0
  120. package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +16 -0
  121. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +15 -0
  122. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +10 -0
  123. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +15 -0
  124. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +12 -0
  125. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +20 -0
  126. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +1 -0
  127. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +1 -0
  128. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +8 -0
  129. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +8 -0
  130. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +7 -0
  131. package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +15 -0
  132. package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +16 -0
  133. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +15 -0
  134. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +10 -0
  135. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +15 -0
  136. package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +12 -0
  137. package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +20 -0
  138. package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +1 -0
  139. package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +1 -0
  140. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +8 -0
  141. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +8 -0
  142. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +7 -0
  143. package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +3 -0
  144. package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +15 -0
  145. package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +16 -0
  146. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +15 -0
  147. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +10 -0
  148. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +15 -0
  149. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +12 -0
  150. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +20 -0
  151. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +1 -0
  152. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +1 -0
  153. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +8 -0
  154. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +8 -0
  155. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +7 -0
  156. package/evals/fixtures/tiny-report-performance-app/README.md +11 -0
  157. package/evals/fixtures/tiny-report-performance-app/docs/performance.md +10 -0
  158. package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +29 -0
  159. package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +8 -0
  160. package/evals/fixtures/tiny-review-request-app/README.md +3 -0
  161. package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +5 -0
  162. package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +19 -0
  163. package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +20 -0
  164. package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +25 -0
  165. package/evals/fixtures/tiny-review-request-app/src/billing.ts +11 -0
  166. package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +19 -0
  167. package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +8 -0
  168. package/evals/fixtures/tiny-review-work-app/README.md +5 -0
  169. package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +9 -0
  170. package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +12 -0
  171. package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +15 -0
  172. package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +9 -0
  173. package/evals/fixtures/tiny-review-work-app/src/billing.ts +7 -0
  174. package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +1 -0
  175. package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +7 -0
  176. package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +5 -0
  177. package/evals/fixtures/tiny-saas-app/README.md +16 -0
  178. package/evals/fixtures/tiny-saas-app/docs/auth-review.md +15 -0
  179. package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +10 -0
  180. package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +15 -0
  181. package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +13 -0
  182. package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +12 -0
  183. package/evals/fixtures/tiny-saas-app/src/billing.ts +20 -0
  184. package/evals/fixtures/tiny-saas-app/src/login-copy.ts +1 -0
  185. package/evals/fixtures/tiny-saas-app/src/settings-page.ts +1 -0
  186. package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +8 -0
  187. package/evals/fixtures/tiny-saas-app/tests/billing.test.md +8 -0
  188. package/evals/fixtures/tiny-saas-app/tests/copy.test.md +7 -0
  189. package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +6 -0
  190. package/evals/fixtures/tiny-setup-both-app/AGENTS.md +5 -0
  191. package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +5 -0
  192. package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +6 -0
  193. package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +5 -0
  194. package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +6 -0
  195. package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +6 -0
  196. package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +14 -0
  197. package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +6 -0
  198. package/evals/fixtures/tiny-skill-dev-app/README.md +10 -0
  199. package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +8 -0
  200. package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +17 -0
  201. package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +13 -0
  202. package/evals/fixtures/tiny-team-app/README.md +5 -0
  203. package/evals/fixtures/tiny-team-app/docs/product.md +6 -0
  204. package/evals/fixtures/tiny-team-app/src/teams.ts +9 -0
  205. package/evals/fixtures/tiny-team-app/src/users.ts +5 -0
  206. package/evals/fixtures/tiny-team-app/tests/teams.test.md +7 -0
  207. package/evals/fixtures/tiny-verify-app/README.md +5 -0
  208. package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +1 -0
  209. package/evals/fixtures/tiny-verify-app/src/settings-page.ts +1 -0
  210. package/evals/fixtures/tiny-verify-app/tests/settings.test.md +7 -0
  211. package/evals/prompts/aon-001.txt +2 -0
  212. package/evals/prompts/byp-001.txt +2 -0
  213. package/evals/prompts/byp-002.txt +2 -0
  214. package/evals/prompts/cap-001.txt +3 -0
  215. package/evals/prompts/cap-002.txt +3 -0
  216. package/evals/prompts/cmd-001.txt +3 -0
  217. package/evals/prompts/cmd-002.txt +3 -0
  218. package/evals/prompts/cmd-003.txt +6 -0
  219. package/evals/prompts/cmd-004.txt +5 -0
  220. package/evals/prompts/cmd-005.txt +5 -0
  221. package/evals/prompts/cmd-006.txt +5 -0
  222. package/evals/prompts/cmd-007.txt +5 -0
  223. package/evals/prompts/cmd-008.txt +5 -0
  224. package/evals/prompts/cmd-009.txt +8 -0
  225. package/evals/prompts/cmd-010.txt +5 -0
  226. package/evals/prompts/cmd-011.txt +5 -0
  227. package/evals/prompts/cmd-012.txt +5 -0
  228. package/evals/prompts/cmd-013.txt +5 -0
  229. package/evals/prompts/cmd-014.txt +7 -0
  230. package/evals/prompts/cmd-015.txt +7 -0
  231. package/evals/prompts/cmd-016.txt +5 -0
  232. package/evals/prompts/cmt-001.txt +1 -0
  233. package/evals/prompts/cmt-002.txt +1 -0
  234. package/evals/prompts/cmt-003.txt +1 -0
  235. package/evals/prompts/cmt-004.txt +1 -0
  236. package/evals/prompts/cmt-005.txt +1 -0
  237. package/evals/prompts/dfd-001.txt +3 -0
  238. package/evals/prompts/dia-001.txt +3 -0
  239. package/evals/prompts/dia-002.txt +3 -0
  240. package/evals/prompts/dia-003.txt +3 -0
  241. package/evals/prompts/dis-001.txt +5 -0
  242. package/evals/prompts/dis-002.txt +5 -0
  243. package/evals/prompts/esk-001.txt +5 -0
  244. package/evals/prompts/esk-002.txt +5 -0
  245. package/evals/prompts/esk-003.txt +5 -0
  246. package/evals/prompts/grc-001.txt +3 -0
  247. package/evals/prompts/hof-001.txt +3 -0
  248. package/evals/prompts/hof-002.txt +1 -0
  249. package/evals/prompts/hof-003.txt +1 -0
  250. package/evals/prompts/hof-004.txt +1 -0
  251. package/evals/prompts/hof-005.txt +1 -0
  252. package/evals/prompts/ivg-001.txt +1 -0
  253. package/evals/prompts/ivg-002.txt +11 -0
  254. package/evals/prompts/ivg-003.txt +1 -0
  255. package/evals/prompts/ivg-004.txt +1 -0
  256. package/evals/prompts/mode-001.txt +3 -0
  257. package/evals/prompts/mode-002.txt +1 -0
  258. package/evals/prompts/mode-003.txt +3 -0
  259. package/evals/prompts/mode-004.txt +3 -0
  260. package/evals/prompts/mode-005.txt +3 -0
  261. package/evals/prompts/mode-006.txt +3 -0
  262. package/evals/prompts/mode-007.txt +3 -0
  263. package/evals/prompts/otr-001.txt +3 -0
  264. package/evals/prompts/otr-002.txt +3 -0
  265. package/evals/prompts/rar-001.txt +5 -0
  266. package/evals/prompts/rar-002.txt +3 -0
  267. package/evals/prompts/rar-003.txt +6 -0
  268. package/evals/prompts/rar-004.txt +15 -0
  269. package/evals/prompts/rar-005.txt +10 -0
  270. package/evals/prompts/rbr-001.txt +3 -0
  271. package/evals/prompts/rbr-002.txt +3 -0
  272. package/evals/prompts/rbr-003.txt +7 -0
  273. package/evals/prompts/rev-001.txt +3 -0
  274. package/evals/prompts/rev-002.txt +5 -0
  275. package/evals/prompts/rev-003.txt +6 -0
  276. package/evals/prompts/rev-004.txt +1 -0
  277. package/evals/prompts/rev-005.txt +15 -0
  278. package/evals/prompts/rev-006.txt +5 -0
  279. package/evals/prompts/stp-001.txt +1 -0
  280. package/evals/prompts/stp-002.txt +1 -0
  281. package/evals/prompts/stp-003.txt +1 -0
  282. package/evals/prompts/stp-004.txt +1 -0
  283. package/evals/prompts/stp-005.txt +1 -0
  284. package/evals/prompts/stp-006.txt +1 -0
  285. package/evals/prompts/stp-007.txt +1 -0
  286. package/evals/prompts/stp-008.txt +1 -0
  287. package/evals/prompts/stp-009.txt +1 -0
  288. package/evals/prompts/stp-010.txt +1 -0
  289. package/evals/prompts/stp-011.txt +1 -0
  290. package/evals/prompts/vfy-003.txt +1 -0
  291. package/evals/prompts/wpl-001.txt +3 -0
  292. package/evals/prompts/wpl-002.txt +5 -0
  293. package/evals/prompts/wpl-003.txt +3 -0
  294. package/evals/prompts/wpl-004.txt +5 -0
  295. package/evals/prompts/wpl-005.txt +1 -0
  296. package/evals/prompts/wrc-001.txt +10 -0
  297. package/evals/prompts/wrc-002.txt +3 -0
  298. package/evals/prompts/wsk-001.txt +6 -0
  299. package/evals/prompts/wsp-001.txt +5 -0
  300. package/evals/prompts/wsp-002.txt +15 -0
  301. package/evals/prompts/wsp-003.txt +3 -0
  302. package/evals/prompts/wsp-004.txt +15 -0
  303. package/evals/prompts/wsp-005.txt +5 -0
  304. package/evals/prompts/wsp-006.txt +12 -0
  305. package/evals/prompts/wsp-007.txt +9 -0
  306. package/evals/prompts/wsp-008.txt +13 -0
  307. package/evals/prompts/xpl-001.txt +1 -0
  308. package/evals/prompts/xpl-002.txt +3 -0
  309. package/evals/prompts/xpl-003.txt +3 -0
  310. package/evals/prompts/xpl-004.txt +3 -0
  311. package/evals/prompts/xpl-005.txt +5 -0
  312. package/evals/prompts/xpl-006.txt +3 -0
  313. package/evals/registries/adversarial-evals.json +39 -0
  314. package/evals/registries/fixture-evals.json +2513 -0
  315. package/evals/registries/handoff-evals.json +74 -0
  316. package/evals/registries/legacy-evals.json +147 -0
  317. package/evals/registries/skill-evidence.json +193 -0
  318. package/evals/registries/verify-work-evals.json +46 -0
  319. package/evals/reports/acceptance/v0.1-acceptance-report.md +130 -0
  320. package/evals/reports/by-command-surface/command-surface-1-report.md +45 -0
  321. package/evals/reports/by-command-surface/command-surface-10-report.md +76 -0
  322. package/evals/reports/by-command-surface/command-surface-11-report.md +77 -0
  323. package/evals/reports/by-command-surface/command-surface-12-report.md +91 -0
  324. package/evals/reports/by-command-surface/command-surface-13-report.md +64 -0
  325. package/evals/reports/by-command-surface/command-surface-14-report.md +66 -0
  326. package/evals/reports/by-command-surface/command-surface-15-report.md +124 -0
  327. package/evals/reports/by-command-surface/command-surface-16-report.md +39 -0
  328. package/evals/reports/by-command-surface/command-surface-2-report.md +80 -0
  329. package/evals/reports/by-command-surface/command-surface-3-report.md +86 -0
  330. package/evals/reports/by-command-surface/command-surface-4-report.md +76 -0
  331. package/evals/reports/by-command-surface/command-surface-5-report.md +80 -0
  332. package/evals/reports/by-command-surface/command-surface-6-report.md +74 -0
  333. package/evals/reports/by-command-surface/command-surface-7-report.md +84 -0
  334. package/evals/reports/by-command-surface/command-surface-8-report.md +79 -0
  335. package/evals/reports/by-command-surface/command-surface-9-report.md +79 -0
  336. package/evals/reports/by-command-surface/command-surface-matrix.md +91 -0
  337. package/evals/reports/by-skill/bypass-1-report.md +124 -0
  338. package/evals/reports/by-skill/capture-decisions-1-report.md +99 -0
  339. package/evals/reports/by-skill/capture-decisions-2-report.md +102 -0
  340. package/evals/reports/by-skill/commit-work-1-report.md +165 -0
  341. package/evals/reports/by-skill/commit-work-2-report.md +109 -0
  342. package/evals/reports/by-skill/design-for-depth-1-report.md +95 -0
  343. package/evals/reports/by-skill/diagnose-failure-1-report.md +91 -0
  344. package/evals/reports/by-skill/diagnose-failure-2-report.md +94 -0
  345. package/evals/reports/by-skill/discover-1-report.md +118 -0
  346. package/evals/reports/by-skill/evaluate-skill-2-report.md +71 -0
  347. package/evals/reports/by-skill/execute-plan-1-report.md +103 -0
  348. package/evals/reports/by-skill/execute-plan-2-report.md +112 -0
  349. package/evals/reports/by-skill/execute-plan-3-report.md +87 -0
  350. package/evals/reports/by-skill/grill-context-1-report.md +103 -0
  351. package/evals/reports/by-skill/handoff-1-report.md +123 -0
  352. package/evals/reports/by-skill/handoff-2-report.md +105 -0
  353. package/evals/reports/by-skill/handoff-3-report.md +100 -0
  354. package/evals/reports/by-skill/handoff-7-report.md +77 -0
  355. package/evals/reports/by-skill/interview-gate-1-report.md +63 -0
  356. package/evals/reports/by-skill/interview-gate-2-report.md +105 -0
  357. package/evals/reports/by-skill/mode-contract-1-report.md +74 -0
  358. package/evals/reports/by-skill/mode-contract-2-report.md +87 -0
  359. package/evals/reports/by-skill/mode-contract-3-report.md +65 -0
  360. package/evals/reports/by-skill/mode-contract-4-report.md +71 -0
  361. package/evals/reports/by-skill/mode-contract-5-report.md +70 -0
  362. package/evals/reports/by-skill/output-router-1-report.md +76 -0
  363. package/evals/reports/by-skill/output-router-2-report.md +65 -0
  364. package/evals/reports/by-skill/research-1-report.md +144 -0
  365. package/evals/reports/by-skill/research-brief-1-report.md +94 -0
  366. package/evals/reports/by-skill/research-brief-2-report.md +75 -0
  367. package/evals/reports/by-skill/review-artifact-1-report.md +91 -0
  368. package/evals/reports/by-skill/review-artifact-2-report.md +79 -0
  369. package/evals/reports/by-skill/review-artifact-3-report.md +120 -0
  370. package/evals/reports/by-skill/review-artifact-4-report.md +89 -0
  371. package/evals/reports/by-skill/review-artifact-5-report.md +66 -0
  372. package/evals/reports/by-skill/review-work-1-report.md +85 -0
  373. package/evals/reports/by-skill/review-work-2-report.md +87 -0
  374. package/evals/reports/by-skill/review-work-3-report.md +104 -0
  375. package/evals/reports/by-skill/review-work-4-report.md +108 -0
  376. package/evals/reports/by-skill/review-work-5-report.md +73 -0
  377. package/evals/reports/by-skill/review-work-6-report.md +66 -0
  378. package/evals/reports/by-skill/setup-freeflow-1-report.md +199 -0
  379. package/evals/reports/by-skill/setup-freeflow-2-report.md +105 -0
  380. package/evals/reports/by-skill/setup-freeflow-3-report.md +105 -0
  381. package/evals/reports/by-skill/setup-freeflow-4-report.md +88 -0
  382. package/evals/reports/by-skill/setup-freeflow-5-report.md +115 -0
  383. package/evals/reports/by-skill/skill-authoring-1-report.md +81 -0
  384. package/evals/reports/by-skill/verify-work-1-report.md +111 -0
  385. package/evals/reports/by-skill/verify-work-2-report.md +120 -0
  386. package/evals/reports/by-skill/workflow-1-report.md +65 -0
  387. package/evals/reports/by-skill/write-plan-1-report.md +123 -0
  388. package/evals/reports/by-skill/write-plan-2-report.md +98 -0
  389. package/evals/reports/by-skill/write-plan-3-report.md +110 -0
  390. package/evals/reports/by-skill/write-spec-1-report.md +88 -0
  391. package/evals/reports/by-skill/write-spec-2-report.md +89 -0
  392. package/evals/reports/by-skill/write-spec-3-report.md +90 -0
  393. package/evals/reports/by-skill/write-spec-4-report.md +167 -0
  394. package/evals/reports/harness/claude-harness-1-report.md +103 -0
  395. package/evals/reports/harness/eval-harness-1-report.md +91 -0
  396. package/evals/reports/iterations/iteration-1-report.md +71 -0
  397. package/evals/reports/iterations/iteration-2-report.md +78 -0
  398. package/evals/reports/iterations/iteration-3-report.md +118 -0
  399. package/evals/reports/iterations/iteration-4-report.md +131 -0
  400. package/evals/reports/iterations/iteration-5-report.md +149 -0
  401. package/evals/reports/iterations/iteration-6-report.md +136 -0
  402. package/evals/reports/runtime/always-on-runtime-1-report.md +107 -0
  403. package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +52 -0
  404. package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +410 -0
  405. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +203 -0
  406. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +51 -0
  407. package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +99 -0
  408. package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +166 -0
  409. package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +96 -0
  410. package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +151 -0
  411. package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +233 -0
  412. package/evals/reports/runtime/jq-script-derive-execution-1-report.md +215 -0
  413. package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +67 -0
  414. package/evals/reports/runtime/output-router-benchmark-1-report.md +81 -0
  415. package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +35 -0
  416. package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +150 -0
  417. package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +46 -0
  418. package/evals/reports/runtime/output-router-command-benchmark-1-report.md +62 -0
  419. package/evals/reports/runtime/output-router-index-benchmark-1-report.md +64 -0
  420. package/evals/reports/runtime/output-router-regression-1-report.md +81 -0
  421. package/evals/reports/runtime/output-router-transform-eval-1-report.md +28 -0
  422. package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +44 -0
  423. package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +159 -0
  424. package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +55 -0
  425. package/evals/reports/runtime/render-format-row-protocol-1-report.md +58 -0
  426. package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +84 -0
  427. package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +51 -0
  428. package/evals/reports/runtime/storage-policy-benchmark-1-report.md +176 -0
  429. package/evals/reports/runtime/vault-index-storage-spike-1-report.md +39 -0
  430. package/evals/reports/runtime/workflow-context-hook-1-report.md +82 -0
  431. package/evals/runbooks/adversarial-eval-runbook.md +28 -0
  432. package/evals/runbooks/fixture-eval-runbook.md +137 -0
  433. package/evals/runbooks/handoff-eval-runbook.md +22 -0
  434. package/evals/runbooks/verify-work-eval-runbook.md +27 -0
  435. package/evals/scripts/audit-command-surface.sh +160 -0
  436. package/evals/scripts/check-activation-contract.sh +121 -0
  437. package/evals/scripts/check-runtime-context-hook.sh +183 -0
  438. package/evals/scripts/grade-fixture-eval.sh +446 -0
  439. package/evals/scripts/run-claude-fixture-eval.sh +26 -0
  440. package/evals/scripts/run-codex-fixture-eval.sh +26 -0
  441. package/evals/scripts/run-eryx-python-proof-spike.js +559 -0
  442. package/evals/scripts/run-fixture-eval-by-id.sh +23 -0
  443. package/evals/scripts/run-fixture-eval.sh +464 -0
  444. package/evals/scripts/run-jq-wasm-proof-spike.js +299 -0
  445. package/evals/scripts/run-output-router-transform-eval.js +115 -0
  446. package/evals/scripts/run-pi-observed-routing-eval.js +478 -0
  447. package/evals/scripts/run-quickjs-wasi-proof-spike.js +339 -0
  448. package/evals/scripts/skill-evidence.sh +316 -0
  449. package/evals/scripts/validate-release-metadata.sh +486 -0
  450. package/evals/suites/v0.1-acceptance-suite.md +131 -0
  451. package/{plugins/freeflow/hooks → hooks}/freeflow-runtime-context.mjs +46 -12
  452. package/package.json +39 -19
  453. package/pi-extension/dist/host-producer-identification.js +186 -0
  454. package/pi-extension/dist/index.js +85 -0
  455. package/pi-extension/dist/mcp-config.js +30 -0
  456. package/pi-extension/dist/native-safety-net.js +209 -0
  457. package/pi-extension/dist/observed-tool-routing.js +114 -0
  458. package/pi-extension/dist/renderers.js +835 -0
  459. package/pi-extension/dist/router-tools.js +438 -0
  460. package/pi-extension/dist/runtime-context.js +288 -0
  461. package/pi-extension/dist/schemas.js +254 -0
  462. package/pi-extension/dist/status.js +449 -0
  463. package/pi-extension/dist/utils.js +467 -0
  464. package/pi-extension/src/host-producer-identification.ts +226 -0
  465. package/pi-extension/src/index.ts +121 -0
  466. package/pi-extension/src/mcp-config.ts +32 -0
  467. package/pi-extension/src/native-safety-net.ts +252 -0
  468. package/pi-extension/src/observed-tool-routing.ts +126 -0
  469. package/pi-extension/src/renderers.ts +917 -0
  470. package/pi-extension/src/router-tools.ts +478 -0
  471. package/pi-extension/src/runtime-context.ts +347 -0
  472. package/pi-extension/src/schemas.ts +259 -0
  473. package/pi-extension/src/status.ts +505 -0
  474. package/pi-extension/src/utils.ts +492 -0
  475. package/pi-extension/tsconfig.json +16 -0
  476. package/{plugins/freeflow/docs → plugin-docs}/README.md +3 -3
  477. package/plugin-docs/adr/0002-evals-before-hooks.md +17 -0
  478. package/{plugins/freeflow/docs → plugin-docs}/adr/0003-release-boundary.md +2 -2
  479. package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +26 -0
  480. package/plugin-docs/adr/README.md +10 -0
  481. package/plugin-docs/architecture.md +89 -0
  482. package/plugin-docs/output-router.md +396 -0
  483. package/plugin-docs/release-evidence.md +77 -0
  484. package/{plugins/freeflow/docs → plugin-docs}/skills.md +3 -2
  485. package/{plugins/freeflow/docs → plugin-docs}/workflow.md +4 -4
  486. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmark-harness.js +1 -1
  487. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmarks.js +14 -14
  488. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/codex-qa-benchmarks.js +6 -6
  489. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/command-benchmarks.d.ts +1 -1
  490. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/command-benchmarks.js +11 -10
  491. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +74 -0
  492. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +707 -0
  493. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +124 -0
  494. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1295 -0
  495. package/router/dist/benchmarks/context-saving-baseline.d.ts +54 -0
  496. package/router/dist/benchmarks/context-saving-baseline.js +439 -0
  497. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/index-benchmarks.d.ts +16 -2
  498. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/index-benchmarks.js +330 -26
  499. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +90 -0
  500. package/router/dist/benchmarks/storage-policy-benchmarks.js +538 -0
  501. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +47 -0
  502. package/router/dist/benchmarks/vault-index-benchmarks.js +257 -0
  503. package/router/dist/config/config.d.ts +96 -0
  504. package/router/dist/config/config.js +453 -0
  505. package/{plugins/freeflow/router/dist → router/dist/config}/schema.js +248 -2
  506. package/router/dist/config/types.d.ts +521 -0
  507. package/router/dist/config/types.js +30 -0
  508. package/{plugins/freeflow/router/dist → router/dist/evidence}/bounded-evidence.d.ts +1 -1
  509. package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-range-selector.js +65 -14
  510. package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-search.js +18 -2
  511. package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence.d.ts +1 -1
  512. package/router/dist/evidence/failure-contracts.d.ts +27 -0
  513. package/router/dist/evidence/failure-contracts.js +160 -0
  514. package/router/dist/index.d.ts +30 -0
  515. package/router/dist/index.js +32 -0
  516. package/router/dist/processing/engine.d.ts +108 -0
  517. package/router/dist/processing/engine.js +435 -0
  518. package/router/dist/processing/reducers.d.ts +266 -0
  519. package/router/dist/processing/reducers.js +1495 -0
  520. package/router/dist/processing/renderers.d.ts +25 -0
  521. package/router/dist/processing/renderers.js +186 -0
  522. package/router/dist/processing/scripts.d.ts +78 -0
  523. package/router/dist/processing/scripts.js +333 -0
  524. package/router/dist/routing/observed-reducers.d.ts +35 -0
  525. package/router/dist/routing/observed-reducers.js +647 -0
  526. package/router/dist/routing/observed-routing.d.ts +17 -0
  527. package/router/dist/routing/observed-routing.js +377 -0
  528. package/{plugins/freeflow/router/dist → router/dist/routing}/parsers.d.ts +1 -1
  529. package/{plugins/freeflow/router/dist → router/dist/routing}/parsers.js +1 -1
  530. package/router/dist/routing/run-filters.d.ts +56 -0
  531. package/router/dist/routing/run-filters.js +230 -0
  532. package/router/dist/routing/run-reducers.d.ts +30 -0
  533. package/router/dist/routing/run-reducers.js +110 -0
  534. package/router/dist/sandbox/adapter-roots.d.ts +38 -0
  535. package/router/dist/sandbox/adapter-roots.js +64 -0
  536. package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -0
  537. package/router/dist/sandbox/eryx-python-adapter.js +797 -0
  538. package/router/dist/sandbox/jq-wasm-adapter.d.ts +9 -0
  539. package/router/dist/sandbox/jq-wasm-adapter.js +421 -0
  540. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -0
  541. package/router/dist/sandbox/quickjs-wasi-adapter.js +381 -0
  542. package/router/dist/sandbox/script-sandbox.d.ts +113 -0
  543. package/router/dist/sandbox/script-sandbox.js +303 -0
  544. package/router/dist/setup/script-transform-adapters.d.ts +28 -0
  545. package/router/dist/setup/script-transform-adapters.js +259 -0
  546. package/router/dist/tools/batch.d.ts +22 -0
  547. package/router/dist/tools/batch.js +509 -0
  548. package/router/dist/tools/run.d.ts +50 -0
  549. package/router/dist/tools/run.js +1219 -0
  550. package/router/dist/tools/search.d.ts +44 -0
  551. package/{plugins/freeflow/router/dist/retrieve.js → router/dist/tools/search.js} +395 -45
  552. package/router/dist/transform/engine.d.ts +143 -0
  553. package/router/dist/transform/engine.js +1955 -0
  554. package/router/dist/vault/vault-index.d.ts +106 -0
  555. package/router/dist/vault/vault-index.js +411 -0
  556. package/{plugins/freeflow/router/dist → router/dist/vault}/vault.d.ts +24 -1
  557. package/{plugins/freeflow/router/dist → router/dist/vault}/vault.js +152 -1
  558. package/skills/design-for-depth/SKILL.md +90 -0
  559. package/skills/design-for-depth/references/design-pressure-signals.md +265 -0
  560. package/skills/design-for-depth/references/software-design-philosophy.md +219 -0
  561. package/{plugins/freeflow/skills → skills}/diagnose-failure/SKILL.md +6 -1
  562. package/{plugins/freeflow/skills/research → skills/discover}/ARTIFACT-DESTINATIONS.md +4 -4
  563. package/{plugins/freeflow/skills/research → skills/discover}/CHECKPOINTS.md +4 -4
  564. package/skills/discover/SKILL.md +173 -0
  565. package/{plugins/freeflow/skills → skills}/execute-plan/SKILL.md +5 -4
  566. package/{plugins/freeflow/skills → skills}/execute-plan/references/execution-map.md +2 -2
  567. package/{plugins/freeflow/skills → skills}/mode-contract/SKILL.md +9 -4
  568. package/skills/output-router/SKILL.md +202 -0
  569. package/skills/output-router/references/safety-policy.md +40 -0
  570. package/{plugins/freeflow/skills → skills}/review-artifact/SKILL.md +5 -2
  571. package/{plugins/freeflow/skills → skills}/review-artifact/references/reviewer-prompt.md +2 -1
  572. package/{plugins/freeflow/skills → skills}/review-work/SKILL.md +6 -1
  573. package/{plugins/freeflow/skills → skills}/setup-freeflow/SKILL.md +21 -9
  574. package/{plugins/freeflow/skills → skills}/setup-freeflow/references/activation-contract.md +11 -10
  575. package/{plugins/freeflow/skills → skills}/setup-freeflow/references/host-setup.md +3 -3
  576. package/skills/setup-freeflow/references/output-router-setup.md +102 -0
  577. package/{plugins/freeflow/skills → skills}/verify-work/SKILL.md +3 -1
  578. package/{plugins/freeflow/skills → skills}/workflow/SKILL.md +16 -14
  579. package/{plugins/freeflow/skills → skills}/workflow/references/workflow-map.md +16 -14
  580. package/{plugins/freeflow/skills → skills}/write-plan/SKILL.md +9 -1
  581. package/{plugins/freeflow/skills → skills}/write-spec/SKILL.md +9 -6
  582. package/plugins/freeflow/docs/adr/0002-evals-before-hooks.md +0 -17
  583. package/plugins/freeflow/docs/adr/0004-research-replaces-shallow-discovery-skills.md +0 -26
  584. package/plugins/freeflow/docs/adr/README.md +0 -8
  585. package/plugins/freeflow/docs/architecture.md +0 -86
  586. package/plugins/freeflow/docs/output-router.md +0 -212
  587. package/plugins/freeflow/docs/release-evidence.md +0 -69
  588. package/plugins/freeflow/pi-extension/index.js +0 -1176
  589. package/plugins/freeflow/router/dist/config.d.ts +0 -22
  590. package/plugins/freeflow/router/dist/config.js +0 -114
  591. package/plugins/freeflow/router/dist/experimental-local-index.d.ts +0 -1
  592. package/plugins/freeflow/router/dist/experimental-local-index.js +0 -1
  593. package/plugins/freeflow/router/dist/index.d.ts +0 -12
  594. package/plugins/freeflow/router/dist/index.js +0 -12
  595. package/plugins/freeflow/router/dist/retrieve.d.ts +0 -33
  596. package/plugins/freeflow/router/dist/run.d.ts +0 -26
  597. package/plugins/freeflow/router/dist/run.js +0 -356
  598. package/plugins/freeflow/router/dist/types.d.ts +0 -234
  599. package/plugins/freeflow/router/dist/types.js +0 -9
  600. package/plugins/freeflow/skills/output-router/SKILL.md +0 -69
  601. package/plugins/freeflow/skills/output-router/references/safety-policy.md +0 -33
  602. package/plugins/freeflow/skills/research/LANGUAGE.md +0 -61
  603. package/plugins/freeflow/skills/research/SKILL.md +0 -128
  604. package/plugins/freeflow/skills/setup-freeflow/references/output-router-setup.md +0 -52
  605. /package/{plugins/freeflow/assets → assets}/freeflow-plugin-icon-transparent.png +0 -0
  606. /package/{plugins/freeflow/hooks → hooks}/hooks.json +0 -0
  607. /package/{plugins/freeflow/docs → plugin-docs}/adr/0001-three-modes.md +0 -0
  608. /package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmark-harness.d.ts +0 -0
  609. /package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmarks.d.ts +0 -0
  610. /package/{plugins/freeflow/router/dist → router/dist/benchmarks}/codex-qa-benchmarks.d.ts +0 -0
  611. /package/{plugins/freeflow/router/dist → router/dist/config}/router-contract.d.ts +0 -0
  612. /package/{plugins/freeflow/router/dist → router/dist/config}/router-contract.js +0 -0
  613. /package/{plugins/freeflow/router/dist → router/dist/config}/schema.d.ts +0 -0
  614. /package/{plugins/freeflow/router/dist → router/dist/evidence}/bounded-evidence.js +0 -0
  615. /package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-range-selector.d.ts +0 -0
  616. /package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence-search.d.ts +0 -0
  617. /package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence.js +0 -0
  618. /package/{plugins/freeflow/router/dist → router/dist/evidence}/line-ranges.d.ts +0 -0
  619. /package/{plugins/freeflow/router/dist → router/dist/evidence}/line-ranges.js +0 -0
  620. /package/{plugins/freeflow/router → router}/dist/experiments/local-index.d.ts +0 -0
  621. /package/{plugins/freeflow/router → router}/dist/experiments/local-index.js +0 -0
  622. /package/{plugins/freeflow/router/dist → router/dist/repo}/repo-traversal.d.ts +0 -0
  623. /package/{plugins/freeflow/router/dist → router/dist/repo}/repo-traversal.js +0 -0
  624. /package/{plugins/freeflow/skills → skills}/bypass/SKILL.md +0 -0
  625. /package/{plugins/freeflow/skills → skills}/commit-work/SKILL.md +0 -0
  626. /package/{plugins/freeflow/skills → skills}/commit-work/references/staging-decisions.md +0 -0
  627. /package/{plugins/freeflow/skills → skills}/diagnose-failure/references/feedback-loop-catalog.md +0 -0
  628. /package/{plugins/freeflow/skills → skills}/diagnose-failure/references/flaky-and-performance.md +0 -0
  629. /package/{plugins/freeflow/skills → skills}/evaluate-skill/SKILL.md +0 -0
  630. /package/{plugins/freeflow/skills → skills}/evaluate-skill/references/eval-patterns.md +0 -0
  631. /package/{plugins/freeflow/skills → skills}/evaluate-skill/references/grading-priority.md +0 -0
  632. /package/{plugins/freeflow/skills → skills}/handoff/SKILL.md +0 -0
  633. /package/{plugins/freeflow/skills → skills}/handoff/references/templates.md +0 -0
  634. /package/{plugins/freeflow/skills → skills}/interview-gate/SKILL.md +0 -0
  635. /package/{plugins/freeflow/skills → skills}/review-work/references/reviewer-prompt.md +0 -0
  636. /package/{plugins/freeflow/skills → skills}/write-plan/references/plan-shapes.md +0 -0
  637. /package/{plugins/freeflow/skills → skills}/write-skill/SKILL.md +0 -0
  638. /package/{plugins/freeflow/skills → skills}/write-spec/references/artifact-standards.md +0 -0
  639. /package/{plugins/freeflow/skills → skills}/write-spec/references/spec-shapes.md +0 -0
@@ -2,7 +2,8 @@ import { createHash } from "node:crypto";
2
2
  import { mkdir, open, readFile, rename, unlink, writeFile } from "node:fs/promises";
3
3
  import { homedir } from "node:os";
4
4
  import { dirname, join, resolve } from "node:path";
5
- import { DEFAULT_VAULT_RETENTION, DEFAULT_VAULT_ROOT } from "./config.js";
5
+ import { DEFAULT_VAULT_RETENTION, DEFAULT_VAULT_ROOT } from "../config/config.js";
6
+ import { createLocalVaultIndex, recordVaultIndexFailure } from "./vault-index.js";
6
7
  const sessionIndexWriteLocks = new Map();
7
8
  const SESSION_INDEX_LOCK_RETRY_MS = 5;
8
9
  const SESSION_INDEX_LOCK_TIMEOUT_MS = 5_000;
@@ -79,6 +80,7 @@ export async function findExactDuplicateTextOutput(vault, options) {
79
80
  return undefined;
80
81
  }
81
82
  export async function storeCommandOutput(vault, options) {
83
+ assertStorablePersistence(options.persistence);
82
84
  const createdAt = options.createdAt ?? new Date().toISOString();
83
85
  const combined = options.combined ?? combineOutputSections(options.stdout, options.stderr);
84
86
  const decisionIds = options.decisionIds ?? [];
@@ -106,6 +108,7 @@ export async function storeCommandOutput(vault, options) {
106
108
  });
107
109
  const objectId = objectIdFromHash(payloadHash);
108
110
  const outputId = outputIdFromHash(payloadHash);
111
+ const recordId = recordIdFromHash(payloadHash);
109
112
  const objectDir = objectDirectory(vault, objectId);
110
113
  const paths = {
111
114
  meta: join(objectDir, "meta.json"),
@@ -116,6 +119,7 @@ export async function storeCommandOutput(vault, options) {
116
119
  const record = {
117
120
  kind: "command",
118
121
  outputId,
122
+ recordId,
119
123
  objectId,
120
124
  command: options.command,
121
125
  createdAt,
@@ -139,9 +143,14 @@ export async function storeCommandOutput(vault, options) {
139
143
  },
140
144
  fingerprints,
141
145
  decisionIds,
146
+ producer: options.producer ?? { kind: "command" },
147
+ persistence: options.persistence ?? exactVaultPersistence(outputId),
142
148
  contentHashSha256: payloadHash,
143
149
  retention: vault.retention,
144
150
  };
151
+ if (options.lineage !== undefined) {
152
+ record.lineage = options.lineage;
153
+ }
145
154
  const commandExpiresAt = expiresAt(createdAt, vault.retention);
146
155
  if (commandExpiresAt !== undefined) {
147
156
  record.expiresAt = commandExpiresAt;
@@ -158,9 +167,11 @@ export async function storeCommandOutput(vault, options) {
158
167
  await writeFile(paths.combined, combined, "utf8");
159
168
  await writeJson(paths.meta, record);
160
169
  await addRecordToSessionIndex(vault, options.sessionId, record);
170
+ await indexVaultRecordAfterAppend(vault, options.sessionId, record, combined, "combined");
161
171
  return record;
162
172
  }
163
173
  export async function storeTextOutput(vault, options) {
174
+ assertStorablePersistence(options.persistence);
164
175
  const createdAt = options.createdAt ?? new Date().toISOString();
165
176
  const decisionIds = options.decisionIds ?? [];
166
177
  const fingerprints = textOutputFingerprints({ raw: options.raw });
@@ -173,6 +184,7 @@ export async function storeTextOutput(vault, options) {
173
184
  });
174
185
  const objectId = objectIdFromHash(payloadHash);
175
186
  const outputId = outputIdFromHash(payloadHash);
187
+ const recordId = recordIdFromHash(payloadHash);
176
188
  const objectDir = objectDirectory(vault, objectId);
177
189
  const paths = {
178
190
  meta: join(objectDir, "meta.json"),
@@ -181,6 +193,7 @@ export async function storeTextOutput(vault, options) {
181
193
  const record = {
182
194
  kind: "text",
183
195
  outputId,
196
+ recordId,
184
197
  objectId,
185
198
  sourceKind: options.sourceKind,
186
199
  createdAt,
@@ -190,9 +203,14 @@ export async function storeTextOutput(vault, options) {
190
203
  hashes: { rawSha256: sha256Text(options.raw) },
191
204
  fingerprints,
192
205
  decisionIds,
206
+ producer: options.producer ?? producerForTextSourceKind(options.sourceKind),
207
+ persistence: options.persistence ?? exactVaultPersistence(outputId),
193
208
  contentHashSha256: payloadHash,
194
209
  retention: vault.retention,
195
210
  };
211
+ if (options.lineage !== undefined) {
212
+ record.lineage = options.lineage;
213
+ }
196
214
  const textExpiresAt = expiresAt(createdAt, vault.retention);
197
215
  if (textExpiresAt !== undefined) {
198
216
  record.expiresAt = textExpiresAt;
@@ -201,9 +219,65 @@ export async function storeTextOutput(vault, options) {
201
219
  await writeFile(paths.raw, options.raw, "utf8");
202
220
  await writeJson(paths.meta, record);
203
221
  await addRecordToSessionIndex(vault, options.sessionId, record);
222
+ await indexVaultRecordAfterAppend(vault, options.sessionId, record, options.raw, "raw");
223
+ return record;
224
+ }
225
+ export async function storeMetadataOutput(vault, options) {
226
+ assertStorablePersistence(options.persistence);
227
+ const createdAt = options.createdAt ?? new Date().toISOString();
228
+ const decisionIds = options.decisionIds ?? [];
229
+ const payloadHash = sha256Json({
230
+ kind: "metadata",
231
+ createdAt,
232
+ sourceKind: options.sourceKind,
233
+ rawLineCount: options.rawLineCount,
234
+ rawByteCount: options.rawByteCount,
235
+ rawSha256: options.rawSha256,
236
+ metadata: options.metadata,
237
+ decisionIds,
238
+ });
239
+ const objectId = objectIdFromHash(payloadHash);
240
+ const outputId = outputIdFromHash(payloadHash);
241
+ const recordId = recordIdFromHash(payloadHash);
242
+ const objectDir = objectDirectory(vault, objectId);
243
+ const paths = {
244
+ meta: join(objectDir, "meta.json"),
245
+ };
246
+ const record = {
247
+ kind: "metadata",
248
+ outputId,
249
+ recordId,
250
+ objectId,
251
+ sourceKind: options.sourceKind,
252
+ createdAt,
253
+ paths,
254
+ lineCounts: { raw: options.rawLineCount },
255
+ byteCounts: { raw: options.rawByteCount },
256
+ hashes: options.rawSha256 !== undefined ? { rawSha256: options.rawSha256 } : {},
257
+ decisionIds,
258
+ producer: options.producer ?? producerForTextSourceKind(options.sourceKind),
259
+ persistence: options.persistence ?? metadataOnlyPersistence(outputId),
260
+ contentHashSha256: payloadHash,
261
+ retention: vault.retention,
262
+ };
263
+ if (options.metadata !== undefined) {
264
+ record.metadata = options.metadata;
265
+ }
266
+ if (options.lineage !== undefined) {
267
+ record.lineage = options.lineage;
268
+ }
269
+ const metadataExpiresAt = expiresAt(createdAt, vault.retention);
270
+ if (metadataExpiresAt !== undefined) {
271
+ record.expiresAt = metadataExpiresAt;
272
+ }
273
+ await mkdir(objectDir, { recursive: true });
274
+ await writeJson(paths.meta, record);
275
+ await addRecordToSessionIndex(vault, options.sessionId, record);
276
+ await indexVaultRecordAfterAppend(vault, options.sessionId, record, undefined);
204
277
  return record;
205
278
  }
206
279
  export async function storeRepoFileReference(vault, options) {
280
+ assertStorablePersistence(options.persistence);
207
281
  const createdAt = options.createdAt ?? new Date().toISOString();
208
282
  const decisionIds = options.decisionIds ?? [];
209
283
  const payloadHash = sha256Json({
@@ -215,6 +289,7 @@ export async function storeRepoFileReference(vault, options) {
215
289
  });
216
290
  const objectId = objectIdFromHash(payloadHash);
217
291
  const outputId = outputIdFromHash(payloadHash);
292
+ const recordId = recordIdFromHash(payloadHash);
218
293
  const objectDir = objectDirectory(vault, objectId);
219
294
  const paths = {
220
295
  meta: join(objectDir, "meta.json"),
@@ -222,14 +297,20 @@ export async function storeRepoFileReference(vault, options) {
222
297
  const record = {
223
298
  kind: "repo-file",
224
299
  outputId,
300
+ recordId,
225
301
  objectId,
226
302
  path: options.path,
227
303
  paths,
228
304
  decisionIds,
229
305
  createdAt,
306
+ producer: options.producer ?? { kind: "repo" },
307
+ persistence: options.persistence ?? metadataOnlyPersistence(),
230
308
  contentHashSha256: payloadHash,
231
309
  retention: vault.retention,
232
310
  };
311
+ if (options.lineage !== undefined) {
312
+ record.lineage = options.lineage;
313
+ }
233
314
  const repoExpiresAt = expiresAt(createdAt, vault.retention);
234
315
  if (repoExpiresAt !== undefined) {
235
316
  record.expiresAt = repoExpiresAt;
@@ -240,6 +321,7 @@ export async function storeRepoFileReference(vault, options) {
240
321
  await mkdir(objectDir, { recursive: true });
241
322
  await writeJson(paths.meta, record);
242
323
  await addRecordToSessionIndex(vault, options.sessionId, record);
324
+ await indexVaultRecordAfterAppend(vault, options.sessionId, record, undefined);
243
325
  return record;
244
326
  }
245
327
  export async function readVaultRecord(vault, sessionId, outputId) {
@@ -279,16 +361,40 @@ export async function readSessionIndex(vault, sessionId) {
279
361
  return emptySessionIndex(sessionId, now);
280
362
  }
281
363
  }
364
+ function assertStorablePersistence(persistence) {
365
+ if (persistence?.recoverability === "none") {
366
+ throw new Error("Cannot store output with persistence recoverability none; skip vault storage instead.");
367
+ }
368
+ }
369
+ async function indexVaultRecordAfterAppend(vault, sessionId, record, text, stream) {
370
+ try {
371
+ const index = createLocalVaultIndex(vault);
372
+ const metadata = {
373
+ sessionId,
374
+ ...(stream !== undefined ? { stream } : {}),
375
+ };
376
+ await index.indexRecord(record, text, metadata);
377
+ }
378
+ catch (error) {
379
+ await recordVaultIndexFailure(vault, error).catch(() => undefined);
380
+ }
381
+ }
282
382
  async function addRecordToSessionIndex(vault, sessionId, record) {
283
383
  await withSessionIndexWriteLock(vault, sessionId, async () => {
284
384
  const index = await readSessionIndex(vault, sessionId);
285
385
  const updatedAt = new Date().toISOString();
286
386
  const entry = {
287
387
  outputId: record.outputId,
388
+ recordId: record.recordId,
288
389
  objectId: record.objectId,
289
390
  kind: record.kind,
290
391
  createdAt: record.createdAt,
392
+ producer: record.producer,
393
+ persistence: record.persistence,
291
394
  };
395
+ if (record.lineage !== undefined) {
396
+ entry.lineage = record.lineage;
397
+ }
292
398
  if (record.kind === "command") {
293
399
  entry.executionStatus = record.executionStatus;
294
400
  }
@@ -394,6 +500,9 @@ function streamPath(record, stream) {
394
500
  }
395
501
  return record.paths.raw;
396
502
  }
503
+ if (record.kind === "metadata") {
504
+ throw new Error("Metadata only records store no raw stream.");
505
+ }
397
506
  throw new Error("Repo file reference records store metadata only and have no raw stream.");
398
507
  }
399
508
  function sessionIndexPath(vault, sessionId) {
@@ -411,6 +520,48 @@ function objectIdFromHash(hash) {
411
520
  function outputIdFromHash(hash) {
412
521
  return `ffout_${hash.slice(0, 24)}`;
413
522
  }
523
+ function recordIdFromHash(hash) {
524
+ return `ffrec_${hash.slice(0, 24)}`;
525
+ }
526
+ function exactVaultPersistence(outputId) {
527
+ return {
528
+ status: "vaulted",
529
+ recoverability: "exact",
530
+ recoveryOutputId: outputId,
531
+ outputId,
532
+ };
533
+ }
534
+ function metadataOnlyPersistence(outputId) {
535
+ return {
536
+ status: "metadata_only",
537
+ recoverability: "metadata_only",
538
+ ...(outputId !== undefined ? { outputId } : {}),
539
+ };
540
+ }
541
+ function producerForTextSourceKind(sourceKind) {
542
+ if (sourceKind === "native") {
543
+ return { kind: "native" };
544
+ }
545
+ if (sourceKind === "script") {
546
+ return { kind: "script" };
547
+ }
548
+ if (sourceKind === "mcp") {
549
+ return { kind: "mcp" };
550
+ }
551
+ if (sourceKind === "web") {
552
+ return { kind: "web" };
553
+ }
554
+ if (sourceKind === "fetch") {
555
+ return { kind: "fetch" };
556
+ }
557
+ if (sourceKind === "code_search") {
558
+ return { kind: "code_search" };
559
+ }
560
+ if (sourceKind === "transform") {
561
+ return { kind: "transform" };
562
+ }
563
+ return { kind: "other" };
564
+ }
414
565
  function combineOutputSections(stdout, stderr) {
415
566
  if (stdout.length === 0) {
416
567
  return stderr;
@@ -0,0 +1,90 @@
1
+ ---
2
+ name: design-for-depth
3
+ description: Use when shaping, reviewing, implementing, or diagnosing work where module/interface/seam choices affect complexity, locality, testability, future change, or repeated edge-case churn. Use for architecture direction, growing scope, shallow modules, bad seams, broad refactors, and review loops that keep finding new edge cases.
4
+ ---
5
+
6
+ # Design For Depth
7
+
8
+ Use this as a lens, not a phase.
9
+
10
+ Core rule: if complexity is spreading across callers, tests, docs, artifacts, or review comments, stop and classify the design pressure before patching forward.
11
+
12
+ Goal: hide useful complexity behind stable interfaces so future callers, tests, reviewers, and agents coordinate less.
13
+
14
+ Do not add architecture ceremony when the next action is small, local, and reversible. Do not use architecture language to hide product or policy decisions.
15
+
16
+ ## Load When Needed
17
+
18
+ Read `references/software-design-philosophy.md` when shaping architecture direction, reviewing a design-heavy artifact, or diagnosing repeated design failure.
19
+
20
+ Read `references/design-pressure-signals.md` when reviewing code/work for shallow modules, scattered policy, edge-case churn, or refactor candidates.
21
+
22
+ Do not load references for every small design question. The active skill should be enough for routine routing.
23
+
24
+ ## Language
25
+
26
+ Use these terms consistently:
27
+
28
+ - **Module** — anything with an interface and implementation: function, class, package, subsystem, workflow slice.
29
+ - **Interface** — everything a caller, user, test, or future agent must know: types, invariants, ordering, errors, configuration, performance, side effects, and policy context.
30
+ - **Implementation** — details hidden behind the interface.
31
+ - **Depth** — leverage at the interface. Deep modules hide useful behavior behind a smaller interface.
32
+ - **Shallow module** — interface is nearly as complex as implementation, or callers coordinate details the module should own.
33
+ - **Seam** — where behavior, ownership, or variation can change without editing surrounding work.
34
+ - **Adapter** — a concrete thing satisfying an interface at a seam.
35
+ - **Locality** — changes, bugs, decisions, and verification stay near one module.
36
+ - **Leverage** — future work gets more behavior from less interface knowledge.
37
+
38
+ Avoid using “architecture” as a vague quality claim. Name the module, interface, hidden decision, seam, adapter, locality, or leverage.
39
+
40
+ ## Signals
41
+
42
+ Use this lens when evidence shows:
43
+
44
+ - one concept requires many unrelated file, test, doc, or reviewer-comment changes;
45
+ - callers know ordering, flags, retries, cleanup, cache, auth, billing, migration, privacy, permissions, or compatibility policy;
46
+ - tests reach past the interface to assert normal behavior;
47
+ - review findings become a stream of edge-case patches;
48
+ - the same conditional or policy appears in multiple callers;
49
+ - a module is mostly pass-through naming around another module;
50
+ - a seam exists only for theoretical future variation;
51
+ - a spec or plan encodes detailed implementation guesses before evidence exists;
52
+ - the agent can only explain correctness by listing coordinated steps across modules.
53
+
54
+ Do not use this lens just because work is “important.” Use it when interface shape changes the next action.
55
+
56
+ ## Tests
57
+
58
+ Use the smallest test that changes the route:
59
+
60
+ - **Deletion test:** if deleting the module makes complexity vanish, it may be pass-through ceremony. If complexity reappears across callers, tests, docs, or review comments, it was earning its keep.
61
+ - **Interface test surface:** callers and tests should exercise normal behavior through the same interface. If tests bypass it, mock internals, or duplicate setup, the module shape may be wrong.
62
+ - **Variation test:** one adapter is a hypothetical seam. Two adapters, a real test double, or a known upcoming variation justify a seam better.
63
+ - **Locality test:** one behavior change should not scatter policy, error handling, retries, logging, auth, billing, compatibility, docs, and tests across unrelated places.
64
+ - **Decision-hiding test:** design decisions likely to change should live behind modules, not in every caller or artifact.
65
+ - **Obscurity test:** if a fresh agent must read many files to learn a simple rule, the design may be obscure even if each file is small.
66
+
67
+ ## Route
68
+
69
+ If the current direction spreads complexity, do not patch forward silently.
70
+
71
+ Classify the pressure:
72
+
73
+ - **Local fix:** same interface, complexity stays hidden; continue in the current phase.
74
+ - **Plan defect:** slice boundary, check, or implementation path is wrong; revise the plan.
75
+ - **Spec gap:** behavior, scope, or acceptance is unclear; revise the spec or return to discovery.
76
+ - **Owner decision:** public API, compatibility, security, privacy, billing, data-loss, permissions, migration, or hard-to-reverse architecture changes; use the interview gate.
77
+ - **Refactor candidate:** current behavior is valid but the module is shallow; propose a bounded deepening path before editing.
78
+ - **Stop/defer:** design pressure is real but not worth solving in this scope; record or defer it explicitly.
79
+
80
+ ## Non-Goals
81
+
82
+ Do not:
83
+
84
+ - introduce abstractions for imagined future variation;
85
+ - hide product or policy decisions inside architecture wording;
86
+ - rewrite source truth to make a design cleaner;
87
+ - turn every feature into upfront architecture design;
88
+ - broaden a narrow fix into a refactor without user approval;
89
+ - treat line count, file count, indirection, or pattern names as proof of quality;
90
+ - claim a design is better without evidence from code, tests, review, usage, or an explicit owner decision.
@@ -0,0 +1,265 @@
1
+ # Design Pressure Signals
2
+
3
+ Use this reference when reviewing code, artifacts, or work for shallow modules and complexity spread.
4
+
5
+ The goal is not to find every smell. The goal is to notice pressure that changes the next route.
6
+
7
+ ## Quick Classifier
8
+
9
+ Ask:
10
+
11
+ 1. What is the module?
12
+ 2. What is the interface?
13
+ 3. What details are callers forced to know?
14
+ 4. What decision is likely to change?
15
+ 5. Where would that decision be localized?
16
+ 6. Would solving this now fit the approved scope?
17
+
18
+ Then classify:
19
+
20
+ - **Continue:** no design pressure that changes the next action.
21
+ - **Local fix:** improve within current module/interface.
22
+ - **Plan revision:** slice boundary or verification path is wrong.
23
+ - **Spec/discovery:** behavior, scope, or acceptance is unclear.
24
+ - **Owner decision:** public API, compatibility, security, privacy, billing, data loss, permissions, migration, or hard-to-reverse architecture.
25
+ - **Deferred deepening:** real design pressure, but not worth solving in this scope.
26
+
27
+ ## Signals And What They Usually Mean
28
+
29
+ ### Shotgun Surgery
30
+
31
+ Signal: one concept requires many unrelated edits.
32
+
33
+ Examples:
34
+
35
+ - retry policy added to every route;
36
+ - permission check copied into API, UI, and job worker;
37
+ - billing grace-period logic repeated in webhook, email, and dashboard;
38
+ - cache freshness flags threaded through callers.
39
+
40
+ Likely issue: a likely-changing decision is not hidden behind a module.
41
+
42
+ Route:
43
+
44
+ - If behavior/scope is unsettled: discovery or spec.
45
+ - If behavior is settled but slice spreads edits: plan revision or refactor candidate.
46
+
47
+ ### Caller Choreography
48
+
49
+ Signal: callers must perform steps in the right order.
50
+
51
+ Examples:
52
+
53
+ ```text
54
+ open connection -> set retry -> register cleanup -> call provider -> translate error -> log metric
55
+ ```
56
+
57
+ Likely issue: interface exposes implementation sequence.
58
+
59
+ Better interface asks for outcome:
60
+
61
+ ```text
62
+ deliverNotification(invitation)
63
+ ```
64
+
65
+ while the module owns retry, fallback, logging, cleanup, and provider errors.
66
+
67
+ ### Scattered Policy
68
+
69
+ Signal: product or operational rules appear in many places.
70
+
71
+ Examples:
72
+
73
+ - billing downgrade timing in UI, webhook, worker, and tests;
74
+ - notification fallback rules in every route;
75
+ - authorization rules in frontend and backend separately;
76
+ - migration compatibility gates inside individual callers.
77
+
78
+ Likely issue: policy is not localized.
79
+
80
+ Stop if changing it would alter product, security, privacy, billing, permissions, public API, compatibility, or data-loss behavior.
81
+
82
+ ### Test Knows Too Much
83
+
84
+ Signal: tests assert implementation sequencing instead of behavior.
85
+
86
+ Examples:
87
+
88
+ - tests assert `sendEmail` then `logFailure` then `sendSms` in every route;
89
+ - tests mock five helpers to verify one user-visible behavior;
90
+ - tests duplicate retry counts and provider error types;
91
+ - tests need private methods or internal state.
92
+
93
+ Likely issue: the production interface is not the right test seam.
94
+
95
+ Do not automatically add mocks. Ask whether the module interface should own the behavior.
96
+
97
+ ### Edge-Case Patch Stream
98
+
99
+ Signal: each review pass finds another special case.
100
+
101
+ Examples:
102
+
103
+ - “also handle null phone”; then “also handle email bounce”; then “also handle duplicate invite”; then “also handle retry telemetry.”
104
+
105
+ Likely issue: review is exposing missing behavior ownership, not isolated bugs.
106
+
107
+ Route:
108
+
109
+ - classify findings;
110
+ - stop at review cap;
111
+ - diagnose whether discovery, spec, plan, source truth, module shape, or reviewer context is wrong.
112
+
113
+ ### Pass-Through Wrapper
114
+
115
+ Signal: a module mostly renames another call.
116
+
117
+ Example:
118
+
119
+ ```ts
120
+ function sendTeamInviteEmail(email, subject, options) {
121
+ return sendEmail(email, subject, options);
122
+ }
123
+ ```
124
+
125
+ Likely issue: shallow wrapper.
126
+
127
+ Options:
128
+
129
+ - delete it if it hides nothing;
130
+ - deepen it by moving real policy behind it;
131
+ - keep it only if it expresses a stable domain interface that will soon hide behavior.
132
+
133
+ ### Leaky Interface
134
+
135
+ Signal: callers know provider/database/cache internals.
136
+
137
+ Examples:
138
+
139
+ - callers catch Stripe-specific errors;
140
+ - UI code knows database enum transitions;
141
+ - API callers pass cache invalidation flags;
142
+ - tests assert internal queue names.
143
+
144
+ Likely issue: implementation detail leaked through interface.
145
+
146
+ Route to design if leakage blocks safe change or verification.
147
+
148
+ ### God Module
149
+
150
+ Signal: one file owns unrelated responsibilities.
151
+
152
+ Examples:
153
+
154
+ - route file validates input, applies policy, calls providers, logs metrics, and formats UI copy;
155
+ - workflow module owns routing, vaulting, parsing, rendering, and config mutation.
156
+
157
+ Likely issue: missing internal modules or seams.
158
+
159
+ Do not split by file type alone. Split around hidden decisions and interfaces.
160
+
161
+ ### Speculative Seam
162
+
163
+ Signal: interface/adapters/factory exist for only imagined future variation.
164
+
165
+ Examples:
166
+
167
+ - `PaymentProviderAdapterFactoryRegistry` when only Stripe exists and no migration is planned;
168
+ - strategies for every small formatting function;
169
+ - generic repository around a single simple query.
170
+
171
+ Likely issue: indirection without leverage.
172
+
173
+ Use the variation test: one adapter is hypothetical; two adapters or known upcoming variation justify a seam better.
174
+
175
+ ### Premature Artifact Detail
176
+
177
+ Signal: spec or plan chooses exact classes, factories, tables, or algorithms before evidence exists.
178
+
179
+ Likely issue: artifact is hiding uncertainty as implementation detail.
180
+
181
+ Better:
182
+
183
+ ```text
184
+ Tentative: likely need a policy-owning module if retry/fallback rules spread.
185
+ Open: whether provider variation is real in this scope.
186
+ Stop: revisit plan if slice requires touching every caller.
187
+ ```
188
+
189
+ ## Before / After Examples
190
+
191
+ ### Notification Retry
192
+
193
+ Bad direction:
194
+
195
+ ```text
196
+ Add retryCount to each route that sends notifications.
197
+ ```
198
+
199
+ Pressure:
200
+
201
+ - callers know retry policy;
202
+ - fallback and telemetry are duplicated;
203
+ - tests assert provider sequencing;
204
+ - adding another provider touches every caller.
205
+
206
+ Better direction:
207
+
208
+ ```text
209
+ Introduce a notification delivery module whose interface accepts the notification intent and owns retry, fallback, provider errors, and telemetry.
210
+ ```
211
+
212
+ Still ask owner decisions before changing user-visible delivery semantics.
213
+
214
+ ### Billing Grace Period
215
+
216
+ Bad direction:
217
+
218
+ ```text
219
+ Patch webhook to downgrade immediately, update email text, adjust dashboard copy.
220
+ ```
221
+
222
+ Pressure:
223
+
224
+ - billing policy spread across systems;
225
+ - likely source-truth conflict with docs/tests;
226
+ - user-owned billing behavior.
227
+
228
+ Better direction:
229
+
230
+ ```text
231
+ Stop at interview gate. Decide billing policy first. Then localize policy behind a billing-state transition module if implementation spreads.
232
+ ```
233
+
234
+ ### Cache Freshness
235
+
236
+ Bad direction:
237
+
238
+ ```text
239
+ Thread forceRefresh through every caller.
240
+ ```
241
+
242
+ Pressure:
243
+
244
+ - callers know cache invalidation policy;
245
+ - tests must set timing flags;
246
+ - source truth may allow caching.
247
+
248
+ Better direction:
249
+
250
+ ```text
251
+ Discover expected freshness boundary. If source truth supports it, hide invalidation/freshness rules behind a cache-aware read interface.
252
+ ```
253
+
254
+ ## False Positives
255
+
256
+ Do not overreact when:
257
+
258
+ - a small repeated pattern is stable and local;
259
+ - a one-off script does not need long-term depth;
260
+ - a wrapper exists for public compatibility;
261
+ - broad edits are mechanical and source-backed;
262
+ - tests inspect internals only for an internal module whose interface is intentionally internal;
263
+ - deeper design would expand scope beyond the user's goal.
264
+
265
+ When in doubt, classify as deferred design pressure rather than silently refactoring.