@hassangameryt/freeflow 0.3.0 → 0.5.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 (692) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +6 -2
  3. package/.codex-plugin/plugin.json +9 -9
  4. package/README.md +190 -127
  5. package/assets/feedback-loop.png +0 -0
  6. package/assets/freeflow_workflow_map.png +0 -0
  7. package/assets/workflow.png +0 -0
  8. package/{skills → capabilities}/output-router/SKILL.md +21 -17
  9. package/{skills → capabilities}/output-router/references/safety-policy.md +1 -1
  10. package/capabilities/output-router/references/setup.md +110 -0
  11. package/command-surface.json +62 -7
  12. package/hooks/freeflow-runtime-context.mjs +572 -154
  13. package/hooks/hooks.json +26 -1
  14. package/hooks/tests/check-runtime-context-hook.sh +375 -0
  15. package/package.json +24 -24
  16. package/pi-extension/dist/index.js +264 -80
  17. package/pi-extension/dist/integrations/mcp-config.js +29 -0
  18. package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
  19. package/pi-extension/dist/output-router/native-safety-net.js +216 -0
  20. package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
  21. package/pi-extension/dist/output-router/renderers.js +1023 -0
  22. package/pi-extension/dist/output-router/router-tools.js +554 -0
  23. package/pi-extension/dist/output-router/schemas.js +383 -0
  24. package/pi-extension/dist/output-router/status.js +744 -0
  25. package/pi-extension/dist/output-router/utils.js +502 -0
  26. package/pi-extension/dist/runtime/runtime-context.js +798 -0
  27. package/pi-extension/dist/settings/settings-tui.js +314 -0
  28. package/pi-extension/dist/settings/settings-ui.js +1487 -0
  29. package/pi-extension/freeflow/index.js +1 -0
  30. package/pi-extension/src/index.ts +230 -56
  31. package/pi-extension/src/{host-producer-identification.ts → output-router/host-producer-identification.ts} +37 -7
  32. package/pi-extension/src/{native-safety-net.ts → output-router/native-safety-net.ts} +8 -12
  33. package/pi-extension/src/{observed-tool-routing.ts → output-router/observed-tool-routing.ts} +19 -11
  34. package/pi-extension/src/{renderers.ts → output-router/renderers.ts} +246 -55
  35. package/pi-extension/src/{router-tools.ts → output-router/router-tools.ts} +130 -29
  36. package/pi-extension/src/{schemas.ts → output-router/schemas.ts} +171 -43
  37. package/pi-extension/src/output-router/status.ts +791 -0
  38. package/pi-extension/src/{utils.ts → output-router/utils.ts} +80 -18
  39. package/pi-extension/src/runtime/runtime-context.ts +895 -0
  40. package/pi-extension/src/settings/settings-tui.ts +408 -0
  41. package/pi-extension/src/settings/settings-ui.ts +1730 -0
  42. package/pi-extension/tests/integration/pi-extension.test.js +4020 -0
  43. package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
  44. package/pi-extension/tests/output-router/search.test.js +722 -0
  45. package/pi-extension/tests/settings/settings-tui.test.js +243 -0
  46. package/router/dist/benchmarks/benchmark-harness.d.ts +16 -13
  47. package/router/dist/benchmarks/benchmark-harness.js +62 -62
  48. package/router/dist/benchmarks/benchmarks.d.ts +80 -73
  49. package/router/dist/benchmarks/benchmarks.js +860 -761
  50. package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +71 -67
  51. package/router/dist/benchmarks/codex-qa-benchmarks.js +429 -390
  52. package/router/dist/benchmarks/command-benchmarks.d.ts +107 -92
  53. package/router/dist/benchmarks/command-benchmarks.js +616 -571
  54. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +64 -56
  55. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +679 -613
  56. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +103 -95
  57. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1188 -1103
  58. package/router/dist/benchmarks/context-saving-baseline.d.ts +47 -41
  59. package/router/dist/benchmarks/context-saving-baseline.js +405 -374
  60. package/router/dist/benchmarks/index-benchmarks.d.ts +74 -69
  61. package/router/dist/benchmarks/index-benchmarks.js +761 -661
  62. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +80 -69
  63. package/router/dist/benchmarks/storage-policy-benchmarks.js +549 -469
  64. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +43 -34
  65. package/router/dist/benchmarks/vault-index-benchmarks.js +294 -229
  66. package/router/dist/config/config.d.ts +62 -55
  67. package/router/dist/config/config.js +552 -373
  68. package/router/dist/config/router-contract.d.ts +2 -2
  69. package/router/dist/config/router-contract.js +38 -38
  70. package/router/dist/config/schema.d.ts +19 -10
  71. package/router/dist/config/schema.js +586 -538
  72. package/router/dist/config/types.d.ts +413 -361
  73. package/router/dist/config/types.js +19 -8
  74. package/router/dist/evidence/bounded-evidence.d.ts +26 -26
  75. package/router/dist/evidence/bounded-evidence.js +265 -252
  76. package/router/dist/evidence/evidence-range-selector.d.ts +16 -14
  77. package/router/dist/evidence/evidence-range-selector.js +192 -191
  78. package/router/dist/evidence/evidence-search.d.ts +18 -16
  79. package/router/dist/evidence/evidence-search.js +401 -377
  80. package/router/dist/evidence/evidence.d.ts +17 -17
  81. package/router/dist/evidence/evidence.js +163 -159
  82. package/router/dist/evidence/failure-contracts.d.ts +25 -15
  83. package/router/dist/evidence/failure-contracts.js +132 -126
  84. package/router/dist/evidence/line-ranges.d.ts +17 -15
  85. package/router/dist/evidence/line-ranges.js +18 -18
  86. package/router/dist/experiments/local-index.d.ts +47 -41
  87. package/router/dist/experiments/local-index.js +477 -458
  88. package/router/dist/local/local-traversal.d.ts +18 -0
  89. package/router/dist/local/local-traversal.js +334 -0
  90. package/router/dist/processing/engine.d.ts +94 -70
  91. package/router/dist/processing/engine.js +462 -364
  92. package/router/dist/processing/reducers.d.ts +208 -194
  93. package/router/dist/processing/reducers.js +1434 -1256
  94. package/router/dist/processing/renderers.d.ts +24 -18
  95. package/router/dist/processing/renderers.js +161 -152
  96. package/router/dist/processing/scripts.d.ts +80 -67
  97. package/router/dist/processing/scripts.js +343 -290
  98. package/router/dist/repo/repo-traversal.d.ts +9 -9
  99. package/router/dist/repo/repo-traversal.js +205 -202
  100. package/router/dist/routing/observed-reducers.d.ts +25 -19
  101. package/router/dist/routing/observed-reducers.js +559 -545
  102. package/router/dist/routing/observed-routing.d.ts +23 -14
  103. package/router/dist/routing/observed-routing.js +319 -318
  104. package/router/dist/routing/parsers.d.ts +10 -10
  105. package/router/dist/routing/parsers.js +454 -406
  106. package/router/dist/routing/run-filters.d.ts +45 -41
  107. package/router/dist/routing/run-filters.js +215 -207
  108. package/router/dist/routing/run-reducers.d.ts +45 -26
  109. package/router/dist/routing/run-reducers.js +102 -90
  110. package/router/dist/sandbox/adapter-roots.d.ts +34 -26
  111. package/router/dist/sandbox/adapter-roots.js +43 -41
  112. package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -5
  113. package/router/dist/sandbox/eryx-python-adapter.js +659 -588
  114. package/router/dist/sandbox/jq-wasm-adapter.d.ts +3 -3
  115. package/router/dist/sandbox/jq-wasm-adapter.js +319 -311
  116. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -5
  117. package/router/dist/sandbox/quickjs-wasi-adapter.js +336 -333
  118. package/router/dist/sandbox/script-sandbox.d.ts +105 -84
  119. package/router/dist/sandbox/script-sandbox.js +294 -260
  120. package/router/dist/setup/script-transform-adapters.d.ts +23 -19
  121. package/router/dist/setup/script-transform-adapters.js +223 -204
  122. package/router/dist/tools/batch.d.ts +27 -16
  123. package/router/dist/tools/batch.js +493 -416
  124. package/router/dist/tools/run.d.ts +47 -35
  125. package/router/dist/tools/run.js +1172 -1087
  126. package/router/dist/tools/search.d.ts +53 -31
  127. package/router/dist/tools/search.js +1224 -1065
  128. package/router/dist/transform/engine.d.ts +121 -96
  129. package/router/dist/transform/engine.js +1853 -1736
  130. package/router/dist/vault/vault-index.d.ts +97 -78
  131. package/router/dist/vault/vault-index.js +347 -342
  132. package/router/dist/vault/vault.d.ts +109 -74
  133. package/router/dist/vault/vault.js +528 -533
  134. package/runtime/interaction-contract.md +16 -0
  135. package/skills/bypass/SKILL.md +52 -38
  136. package/skills/commit-work/SKILL.md +54 -46
  137. package/skills/commit-work/references/staging-decisions.md +46 -24
  138. package/skills/decision-gate/SKILL.md +48 -0
  139. package/skills/design-for-depth/SKILL.md +75 -59
  140. package/skills/design-for-depth/references/design-pressure-signals.md +56 -7
  141. package/skills/design-for-depth/references/interface-design-loop.md +156 -0
  142. package/skills/design-for-depth/references/software-design-philosophy.md +32 -3
  143. package/skills/diagnose-failure/SKILL.md +65 -60
  144. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
  145. package/skills/diagnose-failure/references/flaky-and-performance.md +30 -18
  146. package/skills/discuss/SKILL.md +121 -0
  147. package/skills/discuss/references/checkpoints.md +66 -0
  148. package/skills/evaluate-skill/SKILL.md +62 -53
  149. package/skills/evaluate-skill/references/definition-schema.md +345 -0
  150. package/skills/evaluate-skill/references/evaluation-design.md +86 -0
  151. package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
  152. package/skills/evaluate-skill/references/review-and-revision.md +51 -0
  153. package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
  154. package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
  155. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
  156. package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
  157. package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
  158. package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
  159. package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
  160. package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
  161. package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
  162. package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
  163. package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
  164. package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
  165. package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
  166. package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
  167. package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
  168. package/skills/execute-work/SKILL.md +99 -0
  169. package/skills/execute-work/references/code-practices.md +78 -0
  170. package/skills/execute-work/references/execution-loop.md +77 -0
  171. package/skills/finish-branch/SKILL.md +117 -0
  172. package/skills/finish-branch/references/integration-options.md +80 -0
  173. package/skills/handoff/SKILL.md +65 -39
  174. package/skills/handoff/references/templates.md +104 -27
  175. package/skills/launch-work/SKILL.md +116 -0
  176. package/skills/launch-work/references/launch-readiness.md +85 -0
  177. package/skills/migration-work/SKILL.md +115 -0
  178. package/skills/migration-work/references/migration-lifecycle.md +82 -0
  179. package/skills/mode-contract/SKILL.md +72 -52
  180. package/skills/release-work/SKILL.md +118 -0
  181. package/skills/release-work/references/release-evidence.md +78 -0
  182. package/skills/review-artifact/SKILL.md +77 -69
  183. package/skills/review-artifact/references/reviewer-prompt.md +133 -42
  184. package/skills/review-work/SKILL.md +82 -57
  185. package/skills/review-work/references/reviewer-prompt.md +97 -60
  186. package/skills/review-work/references/security-risk-lens.md +67 -0
  187. package/skills/setup-freeflow/SKILL.md +54 -68
  188. package/skills/setup-freeflow/references/activation-contract.md +84 -69
  189. package/skills/setup-freeflow/references/host-setup.md +50 -17
  190. package/skills/simplify-code/SKILL.md +80 -0
  191. package/skills/simplify-code/references/simplification-patterns.md +70 -0
  192. package/skills/tdd/SKILL.md +96 -0
  193. package/skills/tdd/references/test-design.md +96 -0
  194. package/skills/track-work/SKILL.md +84 -0
  195. package/skills/track-work/references/working-record-schema.md +378 -0
  196. package/skills/verify-work/SKILL.md +59 -38
  197. package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
  198. package/skills/verify-work/references/integration-evidence.md +51 -0
  199. package/skills/verify-work/references/performance-evidence.md +57 -0
  200. package/skills/workflow/SKILL.md +53 -59
  201. package/skills/workflow/references/domain-skill-composition.md +57 -0
  202. package/skills/workflow/references/workflow-loop.md +92 -0
  203. package/skills/write-plan/SKILL.md +85 -58
  204. package/skills/write-plan/references/plan-shapes.md +132 -46
  205. package/skills/write-skill/SKILL.md +82 -51
  206. package/skills/write-skill/references/activation-boundaries.md +62 -0
  207. package/skills/write-skill/references/agent-first-instructions.md +87 -0
  208. package/skills/write-skill/references/progressive-disclosure.md +63 -0
  209. package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
  210. package/skills/write-skill/scripts/skill-author.mjs +104 -0
  211. package/skills/write-spec/SKILL.md +65 -54
  212. package/skills/write-spec/references/artifact-standards.md +60 -41
  213. package/skills/write-spec/references/decision-records.md +77 -0
  214. package/skills/write-spec/references/spec-shapes.md +119 -60
  215. package/evals/README.md +0 -32
  216. package/evals/fixtures/copy-conventions.md +0 -31
  217. package/evals/fixtures/output-router/README.md +0 -12
  218. package/evals/fixtures/output-router/failed-command-output.txt +0 -9
  219. package/evals/fixtures/output-router/large-router-manual.md +0 -63
  220. package/evals/fixtures/output-router/native-large-output.txt +0 -40
  221. package/evals/fixtures/output-router/noisy-test-output.txt +0 -30
  222. package/evals/fixtures/output-router/verification-output.txt +0 -8
  223. package/evals/fixtures/tiny-artifact-review-app/README.md +0 -5
  224. package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +0 -10
  225. package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +0 -21
  226. package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +0 -24
  227. package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +0 -17
  228. package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +0 -8
  229. package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +0 -15
  230. package/evals/fixtures/tiny-commit-ambiguous-app/README.md +0 -3
  231. package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +0 -5
  232. package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +0 -1
  233. package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +0 -5
  234. package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +0 -14
  235. package/evals/fixtures/tiny-commit-app/README.md +0 -3
  236. package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +0 -5
  237. package/evals/fixtures/tiny-commit-app/src/billing.ts +0 -5
  238. package/evals/fixtures/tiny-commit-app/src/settings-page.ts +0 -1
  239. package/evals/fixtures/tiny-commit-app/tests/settings.test.md +0 -5
  240. package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +0 -15
  241. package/evals/fixtures/tiny-commit-everything-app/README.md +0 -3
  242. package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +0 -5
  243. package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +0 -5
  244. package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +0 -1
  245. package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +0 -5
  246. package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +0 -15
  247. package/evals/fixtures/tiny-commit-staged-app/README.md +0 -3
  248. package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +0 -5
  249. package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +0 -5
  250. package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +0 -1
  251. package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +0 -5
  252. package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +0 -15
  253. package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +0 -3
  254. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +0 -3
  255. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +0 -3
  256. package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +0 -5
  257. package/evals/fixtures/tiny-dashboard-stale-app/README.md +0 -11
  258. package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +0 -13
  259. package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +0 -19
  260. package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +0 -9
  261. package/evals/fixtures/tiny-decision-destination-app/README.md +0 -6
  262. package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +0 -8
  263. package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +0 -4
  264. package/evals/fixtures/tiny-design-depth-app/README.md +0 -15
  265. package/evals/fixtures/tiny-design-depth-app/src/routes.ts +0 -25
  266. package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +0 -3
  267. package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +0 -3
  268. package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +0 -3
  269. package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +0 -12
  270. package/evals/fixtures/tiny-eval-method-app/README.md +0 -8
  271. package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +0 -5
  272. package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +0 -17
  273. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +0 -11
  274. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +0 -3
  275. package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +0 -10
  276. package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +0 -10
  277. package/evals/fixtures/tiny-execute-plan-app/README.md +0 -5
  278. package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +0 -5
  279. package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +0 -10
  280. package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +0 -11
  281. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +0 -12
  282. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +0 -15
  283. package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +0 -9
  284. package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +0 -9
  285. package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +0 -9
  286. package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +0 -7
  287. package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +0 -1
  288. package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +0 -7
  289. package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +0 -5
  290. package/evals/fixtures/tiny-execute-review-loop-app/README.md +0 -5
  291. package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +0 -9
  292. package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +0 -12
  293. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +0 -15
  294. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +0 -11
  295. package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +0 -9
  296. package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +0 -7
  297. package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +0 -1
  298. package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +0 -7
  299. package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +0 -5
  300. package/evals/fixtures/tiny-flaky-session-app/README.md +0 -10
  301. package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +0 -13
  302. package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +0 -8
  303. package/evals/fixtures/tiny-handoff-app/README.md +0 -5
  304. package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +0 -10
  305. package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +0 -8
  306. package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +0 -11
  307. package/evals/fixtures/tiny-handoff-app/src/billing.ts +0 -7
  308. package/evals/fixtures/tiny-handoff-report-app/README.md +0 -3
  309. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +0 -1
  310. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +0 -1
  311. package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +0 -4
  312. package/evals/fixtures/tiny-plan-app/README.md +0 -5
  313. package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +0 -10
  314. package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +0 -25
  315. package/evals/fixtures/tiny-plan-app/src/billing.ts +0 -17
  316. package/evals/fixtures/tiny-plan-app/src/settings-page.ts +0 -1
  317. package/evals/fixtures/tiny-plan-app/tests/billing.test.md +0 -8
  318. package/evals/fixtures/tiny-plan-app/tests/settings.test.md +0 -5
  319. package/evals/fixtures/tiny-plan-strict-api-app/README.md +0 -3
  320. package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +0 -5
  321. package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +0 -25
  322. package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +0 -5
  323. package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +0 -3
  324. package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +0 -8
  325. package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +0 -3
  326. package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +0 -15
  327. package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +0 -16
  328. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +0 -15
  329. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +0 -10
  330. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +0 -15
  331. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +0 -12
  332. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +0 -20
  333. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +0 -1
  334. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +0 -1
  335. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +0 -8
  336. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +0 -8
  337. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +0 -7
  338. package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +0 -15
  339. package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +0 -16
  340. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +0 -15
  341. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +0 -10
  342. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +0 -15
  343. package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +0 -12
  344. package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +0 -20
  345. package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +0 -1
  346. package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +0 -1
  347. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +0 -8
  348. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +0 -8
  349. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +0 -7
  350. package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +0 -3
  351. package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +0 -15
  352. package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +0 -16
  353. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +0 -15
  354. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +0 -10
  355. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +0 -15
  356. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +0 -12
  357. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +0 -20
  358. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +0 -1
  359. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +0 -1
  360. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +0 -8
  361. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +0 -8
  362. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +0 -7
  363. package/evals/fixtures/tiny-report-performance-app/README.md +0 -11
  364. package/evals/fixtures/tiny-report-performance-app/docs/performance.md +0 -10
  365. package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +0 -29
  366. package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +0 -8
  367. package/evals/fixtures/tiny-review-request-app/README.md +0 -3
  368. package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +0 -5
  369. package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +0 -19
  370. package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +0 -20
  371. package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +0 -25
  372. package/evals/fixtures/tiny-review-request-app/src/billing.ts +0 -11
  373. package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +0 -19
  374. package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +0 -8
  375. package/evals/fixtures/tiny-review-work-app/README.md +0 -5
  376. package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +0 -9
  377. package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +0 -12
  378. package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +0 -15
  379. package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +0 -9
  380. package/evals/fixtures/tiny-review-work-app/src/billing.ts +0 -7
  381. package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +0 -1
  382. package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +0 -7
  383. package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +0 -5
  384. package/evals/fixtures/tiny-saas-app/README.md +0 -16
  385. package/evals/fixtures/tiny-saas-app/docs/auth-review.md +0 -15
  386. package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +0 -10
  387. package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +0 -15
  388. package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +0 -13
  389. package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +0 -12
  390. package/evals/fixtures/tiny-saas-app/src/billing.ts +0 -20
  391. package/evals/fixtures/tiny-saas-app/src/login-copy.ts +0 -1
  392. package/evals/fixtures/tiny-saas-app/src/settings-page.ts +0 -1
  393. package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +0 -8
  394. package/evals/fixtures/tiny-saas-app/tests/billing.test.md +0 -8
  395. package/evals/fixtures/tiny-saas-app/tests/copy.test.md +0 -7
  396. package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +0 -6
  397. package/evals/fixtures/tiny-setup-both-app/AGENTS.md +0 -5
  398. package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +0 -5
  399. package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +0 -6
  400. package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +0 -5
  401. package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +0 -6
  402. package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +0 -6
  403. package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +0 -14
  404. package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +0 -6
  405. package/evals/fixtures/tiny-skill-dev-app/README.md +0 -10
  406. package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +0 -8
  407. package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +0 -17
  408. package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +0 -13
  409. package/evals/fixtures/tiny-team-app/README.md +0 -5
  410. package/evals/fixtures/tiny-team-app/docs/product.md +0 -6
  411. package/evals/fixtures/tiny-team-app/src/teams.ts +0 -9
  412. package/evals/fixtures/tiny-team-app/src/users.ts +0 -5
  413. package/evals/fixtures/tiny-team-app/tests/teams.test.md +0 -7
  414. package/evals/fixtures/tiny-verify-app/README.md +0 -5
  415. package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +0 -1
  416. package/evals/fixtures/tiny-verify-app/src/settings-page.ts +0 -1
  417. package/evals/fixtures/tiny-verify-app/tests/settings.test.md +0 -7
  418. package/evals/prompts/aon-001.txt +0 -2
  419. package/evals/prompts/byp-001.txt +0 -2
  420. package/evals/prompts/byp-002.txt +0 -2
  421. package/evals/prompts/cap-001.txt +0 -3
  422. package/evals/prompts/cap-002.txt +0 -3
  423. package/evals/prompts/cmd-001.txt +0 -3
  424. package/evals/prompts/cmd-002.txt +0 -3
  425. package/evals/prompts/cmd-003.txt +0 -6
  426. package/evals/prompts/cmd-004.txt +0 -5
  427. package/evals/prompts/cmd-005.txt +0 -5
  428. package/evals/prompts/cmd-006.txt +0 -5
  429. package/evals/prompts/cmd-007.txt +0 -5
  430. package/evals/prompts/cmd-008.txt +0 -5
  431. package/evals/prompts/cmd-009.txt +0 -8
  432. package/evals/prompts/cmd-010.txt +0 -5
  433. package/evals/prompts/cmd-011.txt +0 -5
  434. package/evals/prompts/cmd-012.txt +0 -5
  435. package/evals/prompts/cmd-013.txt +0 -5
  436. package/evals/prompts/cmd-014.txt +0 -7
  437. package/evals/prompts/cmd-015.txt +0 -7
  438. package/evals/prompts/cmd-016.txt +0 -5
  439. package/evals/prompts/cmt-001.txt +0 -1
  440. package/evals/prompts/cmt-002.txt +0 -1
  441. package/evals/prompts/cmt-003.txt +0 -1
  442. package/evals/prompts/cmt-004.txt +0 -1
  443. package/evals/prompts/cmt-005.txt +0 -1
  444. package/evals/prompts/dfd-001.txt +0 -3
  445. package/evals/prompts/dia-001.txt +0 -3
  446. package/evals/prompts/dia-002.txt +0 -3
  447. package/evals/prompts/dia-003.txt +0 -3
  448. package/evals/prompts/dis-001.txt +0 -5
  449. package/evals/prompts/dis-002.txt +0 -5
  450. package/evals/prompts/esk-001.txt +0 -5
  451. package/evals/prompts/esk-002.txt +0 -5
  452. package/evals/prompts/esk-003.txt +0 -5
  453. package/evals/prompts/grc-001.txt +0 -3
  454. package/evals/prompts/hof-001.txt +0 -3
  455. package/evals/prompts/hof-002.txt +0 -1
  456. package/evals/prompts/hof-003.txt +0 -1
  457. package/evals/prompts/hof-004.txt +0 -1
  458. package/evals/prompts/hof-005.txt +0 -1
  459. package/evals/prompts/ivg-001.txt +0 -1
  460. package/evals/prompts/ivg-002.txt +0 -11
  461. package/evals/prompts/ivg-003.txt +0 -1
  462. package/evals/prompts/ivg-004.txt +0 -1
  463. package/evals/prompts/mode-001.txt +0 -3
  464. package/evals/prompts/mode-002.txt +0 -1
  465. package/evals/prompts/mode-003.txt +0 -3
  466. package/evals/prompts/mode-004.txt +0 -3
  467. package/evals/prompts/mode-005.txt +0 -3
  468. package/evals/prompts/mode-006.txt +0 -3
  469. package/evals/prompts/mode-007.txt +0 -3
  470. package/evals/prompts/otr-001.txt +0 -3
  471. package/evals/prompts/otr-002.txt +0 -3
  472. package/evals/prompts/rar-001.txt +0 -5
  473. package/evals/prompts/rar-002.txt +0 -3
  474. package/evals/prompts/rar-003.txt +0 -6
  475. package/evals/prompts/rar-004.txt +0 -15
  476. package/evals/prompts/rar-005.txt +0 -10
  477. package/evals/prompts/rbr-001.txt +0 -3
  478. package/evals/prompts/rbr-002.txt +0 -3
  479. package/evals/prompts/rbr-003.txt +0 -7
  480. package/evals/prompts/rev-001.txt +0 -3
  481. package/evals/prompts/rev-002.txt +0 -5
  482. package/evals/prompts/rev-003.txt +0 -6
  483. package/evals/prompts/rev-004.txt +0 -1
  484. package/evals/prompts/rev-005.txt +0 -15
  485. package/evals/prompts/rev-006.txt +0 -5
  486. package/evals/prompts/stp-001.txt +0 -1
  487. package/evals/prompts/stp-002.txt +0 -1
  488. package/evals/prompts/stp-003.txt +0 -1
  489. package/evals/prompts/stp-004.txt +0 -1
  490. package/evals/prompts/stp-005.txt +0 -1
  491. package/evals/prompts/stp-006.txt +0 -1
  492. package/evals/prompts/stp-007.txt +0 -1
  493. package/evals/prompts/stp-008.txt +0 -1
  494. package/evals/prompts/stp-009.txt +0 -1
  495. package/evals/prompts/stp-010.txt +0 -1
  496. package/evals/prompts/stp-011.txt +0 -1
  497. package/evals/prompts/vfy-003.txt +0 -1
  498. package/evals/prompts/wpl-001.txt +0 -3
  499. package/evals/prompts/wpl-002.txt +0 -5
  500. package/evals/prompts/wpl-003.txt +0 -3
  501. package/evals/prompts/wpl-004.txt +0 -5
  502. package/evals/prompts/wpl-005.txt +0 -1
  503. package/evals/prompts/wrc-001.txt +0 -10
  504. package/evals/prompts/wrc-002.txt +0 -3
  505. package/evals/prompts/wsk-001.txt +0 -6
  506. package/evals/prompts/wsp-001.txt +0 -5
  507. package/evals/prompts/wsp-002.txt +0 -15
  508. package/evals/prompts/wsp-003.txt +0 -3
  509. package/evals/prompts/wsp-004.txt +0 -15
  510. package/evals/prompts/wsp-005.txt +0 -5
  511. package/evals/prompts/wsp-006.txt +0 -12
  512. package/evals/prompts/wsp-007.txt +0 -9
  513. package/evals/prompts/wsp-008.txt +0 -13
  514. package/evals/prompts/xpl-001.txt +0 -1
  515. package/evals/prompts/xpl-002.txt +0 -3
  516. package/evals/prompts/xpl-003.txt +0 -3
  517. package/evals/prompts/xpl-004.txt +0 -3
  518. package/evals/prompts/xpl-005.txt +0 -5
  519. package/evals/prompts/xpl-006.txt +0 -3
  520. package/evals/registries/adversarial-evals.json +0 -39
  521. package/evals/registries/fixture-evals.json +0 -2513
  522. package/evals/registries/handoff-evals.json +0 -74
  523. package/evals/registries/legacy-evals.json +0 -147
  524. package/evals/registries/skill-evidence.json +0 -193
  525. package/evals/registries/verify-work-evals.json +0 -46
  526. package/evals/reports/acceptance/v0.1-acceptance-report.md +0 -130
  527. package/evals/reports/by-command-surface/command-surface-1-report.md +0 -45
  528. package/evals/reports/by-command-surface/command-surface-10-report.md +0 -76
  529. package/evals/reports/by-command-surface/command-surface-11-report.md +0 -77
  530. package/evals/reports/by-command-surface/command-surface-12-report.md +0 -91
  531. package/evals/reports/by-command-surface/command-surface-13-report.md +0 -64
  532. package/evals/reports/by-command-surface/command-surface-14-report.md +0 -66
  533. package/evals/reports/by-command-surface/command-surface-15-report.md +0 -124
  534. package/evals/reports/by-command-surface/command-surface-16-report.md +0 -39
  535. package/evals/reports/by-command-surface/command-surface-2-report.md +0 -80
  536. package/evals/reports/by-command-surface/command-surface-3-report.md +0 -86
  537. package/evals/reports/by-command-surface/command-surface-4-report.md +0 -76
  538. package/evals/reports/by-command-surface/command-surface-5-report.md +0 -80
  539. package/evals/reports/by-command-surface/command-surface-6-report.md +0 -74
  540. package/evals/reports/by-command-surface/command-surface-7-report.md +0 -84
  541. package/evals/reports/by-command-surface/command-surface-8-report.md +0 -79
  542. package/evals/reports/by-command-surface/command-surface-9-report.md +0 -79
  543. package/evals/reports/by-command-surface/command-surface-matrix.md +0 -91
  544. package/evals/reports/by-skill/bypass-1-report.md +0 -124
  545. package/evals/reports/by-skill/capture-decisions-1-report.md +0 -99
  546. package/evals/reports/by-skill/capture-decisions-2-report.md +0 -102
  547. package/evals/reports/by-skill/commit-work-1-report.md +0 -165
  548. package/evals/reports/by-skill/commit-work-2-report.md +0 -109
  549. package/evals/reports/by-skill/design-for-depth-1-report.md +0 -95
  550. package/evals/reports/by-skill/diagnose-failure-1-report.md +0 -91
  551. package/evals/reports/by-skill/diagnose-failure-2-report.md +0 -94
  552. package/evals/reports/by-skill/discover-1-report.md +0 -118
  553. package/evals/reports/by-skill/evaluate-skill-2-report.md +0 -71
  554. package/evals/reports/by-skill/execute-plan-1-report.md +0 -103
  555. package/evals/reports/by-skill/execute-plan-2-report.md +0 -112
  556. package/evals/reports/by-skill/execute-plan-3-report.md +0 -87
  557. package/evals/reports/by-skill/grill-context-1-report.md +0 -103
  558. package/evals/reports/by-skill/handoff-1-report.md +0 -123
  559. package/evals/reports/by-skill/handoff-2-report.md +0 -105
  560. package/evals/reports/by-skill/handoff-3-report.md +0 -100
  561. package/evals/reports/by-skill/handoff-7-report.md +0 -77
  562. package/evals/reports/by-skill/interview-gate-1-report.md +0 -63
  563. package/evals/reports/by-skill/interview-gate-2-report.md +0 -105
  564. package/evals/reports/by-skill/mode-contract-1-report.md +0 -74
  565. package/evals/reports/by-skill/mode-contract-2-report.md +0 -87
  566. package/evals/reports/by-skill/mode-contract-3-report.md +0 -65
  567. package/evals/reports/by-skill/mode-contract-4-report.md +0 -71
  568. package/evals/reports/by-skill/mode-contract-5-report.md +0 -70
  569. package/evals/reports/by-skill/output-router-1-report.md +0 -76
  570. package/evals/reports/by-skill/output-router-2-report.md +0 -65
  571. package/evals/reports/by-skill/research-1-report.md +0 -144
  572. package/evals/reports/by-skill/research-brief-1-report.md +0 -94
  573. package/evals/reports/by-skill/research-brief-2-report.md +0 -75
  574. package/evals/reports/by-skill/review-artifact-1-report.md +0 -91
  575. package/evals/reports/by-skill/review-artifact-2-report.md +0 -79
  576. package/evals/reports/by-skill/review-artifact-3-report.md +0 -120
  577. package/evals/reports/by-skill/review-artifact-4-report.md +0 -89
  578. package/evals/reports/by-skill/review-artifact-5-report.md +0 -66
  579. package/evals/reports/by-skill/review-work-1-report.md +0 -85
  580. package/evals/reports/by-skill/review-work-2-report.md +0 -87
  581. package/evals/reports/by-skill/review-work-3-report.md +0 -104
  582. package/evals/reports/by-skill/review-work-4-report.md +0 -108
  583. package/evals/reports/by-skill/review-work-5-report.md +0 -73
  584. package/evals/reports/by-skill/review-work-6-report.md +0 -66
  585. package/evals/reports/by-skill/setup-freeflow-1-report.md +0 -199
  586. package/evals/reports/by-skill/setup-freeflow-2-report.md +0 -105
  587. package/evals/reports/by-skill/setup-freeflow-3-report.md +0 -105
  588. package/evals/reports/by-skill/setup-freeflow-4-report.md +0 -88
  589. package/evals/reports/by-skill/setup-freeflow-5-report.md +0 -115
  590. package/evals/reports/by-skill/skill-authoring-1-report.md +0 -81
  591. package/evals/reports/by-skill/verify-work-1-report.md +0 -111
  592. package/evals/reports/by-skill/verify-work-2-report.md +0 -120
  593. package/evals/reports/by-skill/workflow-1-report.md +0 -65
  594. package/evals/reports/by-skill/write-plan-1-report.md +0 -123
  595. package/evals/reports/by-skill/write-plan-2-report.md +0 -98
  596. package/evals/reports/by-skill/write-plan-3-report.md +0 -110
  597. package/evals/reports/by-skill/write-spec-1-report.md +0 -88
  598. package/evals/reports/by-skill/write-spec-2-report.md +0 -89
  599. package/evals/reports/by-skill/write-spec-3-report.md +0 -90
  600. package/evals/reports/by-skill/write-spec-4-report.md +0 -167
  601. package/evals/reports/harness/claude-harness-1-report.md +0 -103
  602. package/evals/reports/harness/eval-harness-1-report.md +0 -91
  603. package/evals/reports/iterations/iteration-1-report.md +0 -71
  604. package/evals/reports/iterations/iteration-2-report.md +0 -78
  605. package/evals/reports/iterations/iteration-3-report.md +0 -118
  606. package/evals/reports/iterations/iteration-4-report.md +0 -131
  607. package/evals/reports/iterations/iteration-5-report.md +0 -149
  608. package/evals/reports/iterations/iteration-6-report.md +0 -136
  609. package/evals/reports/runtime/always-on-runtime-1-report.md +0 -107
  610. package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +0 -52
  611. package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +0 -410
  612. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +0 -203
  613. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +0 -51
  614. package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +0 -99
  615. package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +0 -166
  616. package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +0 -96
  617. package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +0 -151
  618. package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +0 -233
  619. package/evals/reports/runtime/jq-script-derive-execution-1-report.md +0 -215
  620. package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +0 -67
  621. package/evals/reports/runtime/output-router-benchmark-1-report.md +0 -81
  622. package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +0 -35
  623. package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +0 -150
  624. package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +0 -46
  625. package/evals/reports/runtime/output-router-command-benchmark-1-report.md +0 -62
  626. package/evals/reports/runtime/output-router-index-benchmark-1-report.md +0 -64
  627. package/evals/reports/runtime/output-router-regression-1-report.md +0 -81
  628. package/evals/reports/runtime/output-router-transform-eval-1-report.md +0 -28
  629. package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +0 -44
  630. package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +0 -159
  631. package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +0 -55
  632. package/evals/reports/runtime/render-format-row-protocol-1-report.md +0 -58
  633. package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +0 -84
  634. package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +0 -51
  635. package/evals/reports/runtime/storage-policy-benchmark-1-report.md +0 -176
  636. package/evals/reports/runtime/vault-index-storage-spike-1-report.md +0 -39
  637. package/evals/reports/runtime/workflow-context-hook-1-report.md +0 -82
  638. package/evals/runbooks/adversarial-eval-runbook.md +0 -28
  639. package/evals/runbooks/fixture-eval-runbook.md +0 -137
  640. package/evals/runbooks/handoff-eval-runbook.md +0 -22
  641. package/evals/runbooks/verify-work-eval-runbook.md +0 -27
  642. package/evals/scripts/audit-command-surface.sh +0 -160
  643. package/evals/scripts/check-activation-contract.sh +0 -121
  644. package/evals/scripts/check-runtime-context-hook.sh +0 -183
  645. package/evals/scripts/grade-fixture-eval.sh +0 -446
  646. package/evals/scripts/run-claude-fixture-eval.sh +0 -26
  647. package/evals/scripts/run-codex-fixture-eval.sh +0 -26
  648. package/evals/scripts/run-eryx-python-proof-spike.js +0 -559
  649. package/evals/scripts/run-fixture-eval-by-id.sh +0 -23
  650. package/evals/scripts/run-fixture-eval.sh +0 -464
  651. package/evals/scripts/run-jq-wasm-proof-spike.js +0 -299
  652. package/evals/scripts/run-output-router-transform-eval.js +0 -115
  653. package/evals/scripts/run-pi-observed-routing-eval.js +0 -478
  654. package/evals/scripts/run-quickjs-wasi-proof-spike.js +0 -339
  655. package/evals/scripts/skill-evidence.sh +0 -316
  656. package/evals/scripts/validate-release-metadata.sh +0 -486
  657. package/evals/suites/v0.1-acceptance-suite.md +0 -131
  658. package/pi-extension/dist/host-producer-identification.js +0 -186
  659. package/pi-extension/dist/mcp-config.js +0 -30
  660. package/pi-extension/dist/native-safety-net.js +0 -209
  661. package/pi-extension/dist/observed-tool-routing.js +0 -114
  662. package/pi-extension/dist/renderers.js +0 -835
  663. package/pi-extension/dist/router-tools.js +0 -438
  664. package/pi-extension/dist/runtime-context.js +0 -288
  665. package/pi-extension/dist/schemas.js +0 -254
  666. package/pi-extension/dist/status.js +0 -449
  667. package/pi-extension/dist/utils.js +0 -467
  668. package/pi-extension/src/runtime-context.ts +0 -347
  669. package/pi-extension/src/status.ts +0 -505
  670. package/plugin-docs/README.md +0 -40
  671. package/plugin-docs/adr/0001-three-modes.md +0 -27
  672. package/plugin-docs/adr/0002-evals-before-hooks.md +0 -17
  673. package/plugin-docs/adr/0003-release-boundary.md +0 -21
  674. package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +0 -26
  675. package/plugin-docs/adr/README.md +0 -10
  676. package/plugin-docs/architecture.md +0 -89
  677. package/plugin-docs/output-router.md +0 -396
  678. package/plugin-docs/release-evidence.md +0 -77
  679. package/plugin-docs/skills.md +0 -44
  680. package/plugin-docs/workflow.md +0 -57
  681. package/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
  682. package/skills/discover/ARTIFACT-DESTINATIONS.md +0 -58
  683. package/skills/discover/CHECKPOINTS.md +0 -74
  684. package/skills/discover/SKILL.md +0 -173
  685. package/skills/evaluate-skill/references/eval-patterns.md +0 -41
  686. package/skills/evaluate-skill/references/grading-priority.md +0 -33
  687. package/skills/execute-plan/SKILL.md +0 -133
  688. package/skills/execute-plan/references/execution-map.md +0 -122
  689. package/skills/interview-gate/SKILL.md +0 -90
  690. package/skills/setup-freeflow/references/output-router-setup.md +0 -102
  691. package/skills/workflow/references/workflow-map.md +0 -104
  692. /package/pi-extension/src/{mcp-config.ts → integrations/mcp-config.ts} +0 -0
@@ -4,650 +4,695 @@ import { tmpdir } from "node:os";
4
4
  import { dirname, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { performance } from "node:perf_hooks";
7
- import { approximateTokens, averagePercent as average, defaultJsonRunReportPath, escapeMarkdownTableCell as escapeTable, formatPercent, latencySummary, medianPercent as median, normalizeIterations, parseBenchmarkCliArgs, reductionPercent, writeBenchmarkReportPair, } from "./benchmark-harness.js";
7
+ import {
8
+ approximateTokens,
9
+ averagePercent as average,
10
+ defaultJsonRunReportPath,
11
+ escapeMarkdownTableCell as escapeTable,
12
+ formatPercent,
13
+ latencySummary,
14
+ medianPercent as median,
15
+ normalizeIterations,
16
+ parseBenchmarkCliArgs,
17
+ reductionPercent,
18
+ writeBenchmarkReportPair,
19
+ } from "./benchmark-harness.js";
8
20
  import { freeflowRun } from "../tools/run.js";
9
21
  import { createVault, readOutputText } from "../vault/vault.js";
10
22
  const DEFAULT_ITERATIONS = 3;
11
23
  const DEFAULT_SKIPPED_EXTERNAL_TOOLS = [
12
- {
13
- name: "RTK",
14
- reason: "Optional command compressor comparator is skipped unless a caller supplies a configured comparator hook.",
15
- },
16
- {
17
- name: "Squeez",
18
- reason: "Optional session/output compressor comparator is skipped unless a caller supplies a configured comparator hook.",
19
- },
24
+ {
25
+ name: "RTK",
26
+ reason: "Optional command compressor comparator is skipped unless a caller supplies a configured comparator hook.",
27
+ },
28
+ {
29
+ name: "Squeez",
30
+ reason:
31
+ "Optional session/output compressor comparator is skipped unless a caller supplies a configured comparator hook.",
32
+ },
20
33
  ];
21
34
  export async function runCommandBenchmarks(options = {}) {
22
- const iterations = normalizeIterations(options.iterations, DEFAULT_ITERATIONS);
23
- const vaultRoot = await createTempDir("freeflow-router-command-benchmark-vault-");
24
- const externalComparators = options.externalComparators ?? [];
25
- const fixtures = createCommandBenchmarkFixtures(vaultRoot.path, externalComparators);
26
- try {
27
- const fixtureResults = [];
28
- for (const fixture of fixtures) {
29
- const results = [];
30
- for (const mode of commandBenchmarkModes(externalComparators)) {
31
- results.push(await runCommandFixtureMode(fixture, mode, iterations));
32
- }
33
- fixtureResults.push({
34
- id: fixture.id,
35
- title: fixture.title,
36
- kind: fixture.kind,
37
- expected: fixture.expected,
38
- results,
39
- });
40
- }
41
- return {
42
- generatedAt: options.generatedAt ?? new Date().toISOString(),
43
- iterations,
44
- summary: summarizeCommandReport(fixtureResults),
45
- fixtures: fixtureResults,
46
- skippedExternalTools: skippedExternalTools(externalComparators),
47
- };
48
- }
49
- finally {
50
- await vaultRoot.cleanup();
35
+ const iterations = normalizeIterations(options.iterations, DEFAULT_ITERATIONS);
36
+ const vaultRoot = await createTempDir("freeflow-router-command-benchmark-vault-");
37
+ const externalComparators = options.externalComparators ?? [];
38
+ const fixtures = createCommandBenchmarkFixtures(vaultRoot.path, externalComparators);
39
+ try {
40
+ const fixtureResults = [];
41
+ for (const fixture of fixtures) {
42
+ const results = [];
43
+ for (const mode of commandBenchmarkModes(externalComparators)) {
44
+ results.push(await runCommandFixtureMode(fixture, mode, iterations));
45
+ }
46
+ fixtureResults.push({
47
+ id: fixture.id,
48
+ title: fixture.title,
49
+ kind: fixture.kind,
50
+ expected: fixture.expected,
51
+ results,
52
+ });
51
53
  }
54
+ return {
55
+ generatedAt: options.generatedAt ?? new Date().toISOString(),
56
+ iterations,
57
+ summary: summarizeCommandReport(fixtureResults),
58
+ fixtures: fixtureResults,
59
+ skippedExternalTools: skippedExternalTools(externalComparators),
60
+ };
61
+ } finally {
62
+ await vaultRoot.cleanup();
63
+ }
52
64
  }
53
65
  export function renderCommandBenchmarkReport(report) {
54
- const date = report.generatedAt.slice(0, 10);
55
- const lines = [
56
- "# Output Router Command Benchmark Report - Iteration 1",
57
- "",
58
- `Date: ${date}`,
59
- "",
60
- "## Scope",
61
- "",
62
- "Deterministic, CI-friendly command-output benchmark for `freeflow_run`. The runner compares native direct output against the improved Freeflow command router and records optional RTK/Squeez comparators as skipped unless a caller supplies configured comparator hooks.",
63
- "",
64
- "Reduction percentages compare routed/context bytes and approximate tokens against raw command output bytes for each fixture. Correctness is gated on execution status, exit code, exact key fact preservation, and Freeflow raw vault recovery.",
65
- "",
66
- "## Command",
67
- "",
68
- "```sh",
69
- "npm run bench:router:commands",
70
- "```",
71
- "",
72
- "The CLI writes machine-readable JSON under `evals/runs/output-router/` by default. That JSON is generated run data; this Markdown file is the durable runtime report.",
73
- "",
74
- "## Summary",
75
- "",
76
- `- Iterations per mode: ${report.iterations}`,
77
- `- Fixtures: ${report.summary.fixtures}`,
78
- `- Improved Freeflow run gated pass: ${report.summary.improved.passed}/${report.summary.fixtures}`,
79
- `- Native baseline proxy pass: ${report.summary.nativeBaseline.passed}/${report.summary.fixtures}`,
80
- `- Improved exact fact preservation: ${report.summary.improved.exactFactsPreserved}/${report.summary.fixtures}`,
81
- `- Improved recovery pass: ${report.summary.improved.recoveryPassed}/${report.summary.fixtures}`,
82
- `- Improved weighted byte/token reduction: ${formatPercent(report.summary.improved.weightedByteReductionPercent)} / ${formatPercent(report.summary.improved.weightedTokenReductionPercent)} (${report.summary.improved.totalRawBytes}/${report.summary.improved.totalRawTokensApprox} raw to ${report.summary.improved.totalRoutedBytes}/${report.summary.improved.totalRoutedTokensApprox} routed)`,
83
- `- Improved average byte/token reduction: ${formatPercent(report.summary.improved.averageByteReductionPercent)} / ${formatPercent(report.summary.improved.averageTokenReductionPercent)}`,
84
- `- Improved median byte/token reduction: ${formatPercent(report.summary.improved.medianByteReductionPercent)} / ${formatPercent(report.summary.improved.medianTokenReductionPercent)}`,
85
- `- Failed command facts preserved: ${report.summary.failedCommandFactsPreserved ? "yes" : "no"}`,
86
- "",
87
- "## Command Output Fixtures",
88
- "",
89
- "| fixture | mode | correctness | checks | status/code | parser | raw bytes/tokens | routed bytes/tokens | byte/token reduction | latency p50/p95 ms | recovery | outputId | notes |",
90
- "| --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | ---: | --- | --- | --- |",
91
- ];
92
- for (const fixture of report.fixtures) {
93
- for (const result of fixture.results) {
94
- const correctness = result.skipped ? "skipped" : result.correctness.passed ? "pass" : "fail";
95
- const checks = formatCommandCorrectnessChecks(result.correctness);
96
- const status = result.executionStatus ? `${result.executionStatus}/${result.exitCode ?? "null"}` : "-";
97
- const parser = result.parser ? `${result.parser.name} ${result.parser.confidence.toFixed(2)} ${result.parser.fidelity}` : "-";
98
- const notes = result.notes.length ? result.notes.join("; ") : result.skipReason ?? "";
99
- lines.push(`| ${escapeTable(fixture.id)} | ${escapeTable(result.mode)} | ${correctness} | ${escapeTable(checks)} | ${escapeTable(status)} | ${escapeTable(parser)} | ${result.rawBytes}/${result.rawTokensApprox} | ${result.routedBytes}/${result.routedTokensApprox} | ${formatPercent(result.byteReductionPercent)}/${formatPercent(result.tokenReductionPercent)} | ${result.latencyMs.p50.toFixed(2)}/${result.latencyMs.p95.toFixed(2)} | ${escapeTable(result.recovery.status)} | ${escapeTable(result.outputId ?? "-")} | ${escapeTable(notes)} |`);
100
- }
66
+ const date = report.generatedAt.slice(0, 10);
67
+ const lines = [
68
+ "# Output Router Command Benchmark Report - Iteration 1",
69
+ "",
70
+ `Date: ${date}`,
71
+ "",
72
+ "## Scope",
73
+ "",
74
+ "Deterministic, CI-friendly command-output benchmark for `freeflow_run`. The runner compares native direct output against the improved Freeflow command router and records optional RTK/Squeez comparators as skipped unless a caller supplies configured comparator hooks.",
75
+ "",
76
+ "Reduction percentages compare routed/context bytes and approximate tokens against raw command output bytes for each fixture. Correctness is gated on execution status, exit code, exact key fact preservation, and Freeflow raw vault recovery.",
77
+ "",
78
+ "## Command",
79
+ "",
80
+ "```sh",
81
+ "npm run bench:router:commands",
82
+ "```",
83
+ "",
84
+ "The CLI writes machine-readable JSON under `router/evals/runs/` by default. That JSON is generated run data; this Markdown file is the durable runtime report.",
85
+ "",
86
+ "## Summary",
87
+ "",
88
+ `- Iterations per mode: ${report.iterations}`,
89
+ `- Fixtures: ${report.summary.fixtures}`,
90
+ `- Improved Freeflow run gated pass: ${report.summary.improved.passed}/${report.summary.fixtures}`,
91
+ `- Native baseline proxy pass: ${report.summary.nativeBaseline.passed}/${report.summary.fixtures}`,
92
+ `- Improved exact fact preservation: ${report.summary.improved.exactFactsPreserved}/${report.summary.fixtures}`,
93
+ `- Improved recovery pass: ${report.summary.improved.recoveryPassed}/${report.summary.fixtures}`,
94
+ `- Improved weighted byte/token reduction: ${formatPercent(report.summary.improved.weightedByteReductionPercent)} / ${formatPercent(report.summary.improved.weightedTokenReductionPercent)} (${report.summary.improved.totalRawBytes}/${report.summary.improved.totalRawTokensApprox} raw to ${report.summary.improved.totalRoutedBytes}/${report.summary.improved.totalRoutedTokensApprox} routed)`,
95
+ `- Improved average byte/token reduction: ${formatPercent(report.summary.improved.averageByteReductionPercent)} / ${formatPercent(report.summary.improved.averageTokenReductionPercent)}`,
96
+ `- Improved median byte/token reduction: ${formatPercent(report.summary.improved.medianByteReductionPercent)} / ${formatPercent(report.summary.improved.medianTokenReductionPercent)}`,
97
+ `- Failed command facts preserved: ${report.summary.failedCommandFactsPreserved ? "yes" : "no"}`,
98
+ "",
99
+ "## Command Output Fixtures",
100
+ "",
101
+ "| fixture | mode | correctness | checks | status/code | parser | raw bytes/tokens | routed bytes/tokens | byte/token reduction | latency p50/p95 ms | recovery | outputId | notes |",
102
+ "| --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | ---: | --- | --- | --- |",
103
+ ];
104
+ for (const fixture of report.fixtures) {
105
+ for (const result of fixture.results) {
106
+ const correctness = result.skipped ? "skipped" : result.correctness.passed ? "pass" : "fail";
107
+ const checks = formatCommandCorrectnessChecks(result.correctness);
108
+ const status = result.executionStatus ? `${result.executionStatus}/${result.exitCode ?? "null"}` : "-";
109
+ const parser = result.parser
110
+ ? `${result.parser.name} ${result.parser.confidence.toFixed(2)} ${result.parser.fidelity}`
111
+ : "-";
112
+ const notes = result.notes.length ? result.notes.join("; ") : (result.skipReason ?? "");
113
+ lines.push(
114
+ `| ${escapeTable(fixture.id)} | ${escapeTable(result.mode)} | ${correctness} | ${escapeTable(checks)} | ${escapeTable(status)} | ${escapeTable(parser)} | ${result.rawBytes}/${result.rawTokensApprox} | ${result.routedBytes}/${result.routedTokensApprox} | ${formatPercent(result.byteReductionPercent)}/${formatPercent(result.tokenReductionPercent)} | ${result.latencyMs.p50.toFixed(2)}/${result.latencyMs.p95.toFixed(2)} | ${escapeTable(result.recovery.status)} | ${escapeTable(result.outputId ?? "-")} | ${escapeTable(notes)} |`,
115
+ );
101
116
  }
102
- lines.push("", "## Skipped Optional Command Compressors", "");
103
- if (report.skippedExternalTools.length === 0) {
104
- lines.push("- None. All supplied optional comparator hooks ran.");
117
+ }
118
+ lines.push("", "## Skipped Optional Command Compressors", "");
119
+ if (report.skippedExternalTools.length === 0) {
120
+ lines.push("- None. All supplied optional comparator hooks ran.");
121
+ } else {
122
+ for (const tool of report.skippedExternalTools) {
123
+ lines.push(`- ${tool.name}: ${tool.reason}`);
105
124
  }
106
- else {
107
- for (const tool of report.skippedExternalTools) {
108
- lines.push(`- ${tool.name}: ${tool.reason}`);
109
- }
110
- }
111
- lines.push("", "## Regression Status", "", report.summary.improved.failed === 0
112
- ? "Improved Freeflow command routing passed all gated command-output benchmark fixtures."
113
- : `Improved Freeflow command routing failed ${report.summary.improved.failed} gated command-output benchmark fixture(s).`, "", `Failed command facts preserved: ${report.summary.failedCommandFactsPreserved ? "yes" : "no"}.`, "");
114
- return lines.join("\n");
125
+ }
126
+ lines.push(
127
+ "",
128
+ "## Regression Status",
129
+ "",
130
+ report.summary.improved.failed === 0
131
+ ? "Improved Freeflow command routing passed all gated command-output benchmark fixtures."
132
+ : `Improved Freeflow command routing failed ${report.summary.improved.failed} gated command-output benchmark fixture(s).`,
133
+ "",
134
+ `Failed command facts preserved: ${report.summary.failedCommandFactsPreserved ? "yes" : "no"}.`,
135
+ "",
136
+ );
137
+ return lines.join("\n");
115
138
  }
116
139
  export async function writeCommandBenchmarkReport(report, reportPath) {
117
- await mkdir(dirname(reportPath), { recursive: true });
118
- await writeFile(reportPath, renderCommandBenchmarkReport(report), "utf8");
140
+ await mkdir(dirname(reportPath), { recursive: true });
141
+ await writeFile(reportPath, renderCommandBenchmarkReport(report), "utf8");
119
142
  }
120
143
  export async function writeCommandBenchmarkJsonReport(report, reportPath) {
121
- await mkdir(dirname(reportPath), { recursive: true });
122
- await writeFile(reportPath, `${JSON.stringify(report, null, 2)}\n`, "utf8");
144
+ await mkdir(dirname(reportPath), { recursive: true });
145
+ await writeFile(reportPath, `${JSON.stringify(report, null, 2)}\n`, "utf8");
123
146
  }
124
147
  export async function writeCommandBenchmarkReports(report, markdownReportPath, options = {}) {
125
- return writeBenchmarkReportPair({
126
- report,
127
- markdownReportPath,
128
- jsonReportPath: options.jsonReportPath,
129
- renderMarkdown: renderCommandBenchmarkReport,
130
- });
148
+ return writeBenchmarkReportPair({
149
+ report,
150
+ markdownReportPath,
151
+ jsonReportPath: options.jsonReportPath,
152
+ renderMarkdown: renderCommandBenchmarkReport,
153
+ });
131
154
  }
132
155
  async function runCommandFixtureMode(fixture, mode, iterations) {
133
- const latencies = [];
134
- const observations = [];
135
- const run = fixture.modes[mode];
136
- if (!run) {
137
- observations.push(skippedObservation(`optional comparator ${mode}`, `No command benchmark mode registered for ${mode}.`));
138
- }
139
- else {
140
- for (let index = 0; index < iterations; index += 1) {
141
- const startedAt = performance.now();
142
- observations.push(await run());
143
- latencies.push(performance.now() - startedAt);
144
- }
156
+ const latencies = [];
157
+ const observations = [];
158
+ const run = fixture.modes[mode];
159
+ if (!run) {
160
+ observations.push(
161
+ skippedObservation(`optional comparator ${mode}`, `No command benchmark mode registered for ${mode}.`),
162
+ );
163
+ } else {
164
+ for (let index = 0; index < iterations; index += 1) {
165
+ const startedAt = performance.now();
166
+ observations.push(await run());
167
+ latencies.push(performance.now() - startedAt);
145
168
  }
146
- const observation = selectCommandBenchmarkObservation(fixture, observations);
147
- const correctness = scoreCommandCorrectness(fixture.expected, observation);
148
- const rawTokensApprox = approximateTokens(observation.rawBytes);
149
- const routedTokensApprox = approximateTokens(observation.routedBytes);
150
- const result = {
151
- mode,
152
- toolPathUsed: observation.toolPathUsed,
153
- skipped: observation.skipped ?? false,
154
- rawBytes: observation.rawBytes,
155
- rawTokensApprox,
156
- routedBytes: observation.routedBytes,
157
- routedTokensApprox,
158
- byteReductionPercent: reductionPercent(observation.rawBytes, observation.routedBytes),
159
- tokenReductionPercent: reductionPercent(rawTokensApprox, routedTokensApprox),
160
- latencyMs: latencySummary(latencies),
161
- routedExcerpt: observation.routedExcerpt,
162
- correctness,
163
- recovery: observation.recovery,
164
- notes: observation.notes ?? [],
165
- };
166
- if (observation.skipReason) {
167
- result.skipReason = observation.skipReason;
168
- }
169
- if (observation.executionStatus !== undefined) {
170
- result.executionStatus = observation.executionStatus;
171
- }
172
- if (Object.prototype.hasOwnProperty.call(observation, "exitCode")) {
173
- result.exitCode = observation.exitCode ?? null;
174
- }
175
- if (observation.outputId) {
176
- result.outputId = observation.outputId;
177
- }
178
- if (observation.parser) {
179
- result.parser = observation.parser;
180
- }
181
- return result;
169
+ }
170
+ const observation = selectCommandBenchmarkObservation(fixture, observations);
171
+ const correctness = scoreCommandCorrectness(fixture.expected, observation);
172
+ const rawTokensApprox = approximateTokens(observation.rawBytes);
173
+ const routedTokensApprox = approximateTokens(observation.routedBytes);
174
+ const result = {
175
+ mode,
176
+ toolPathUsed: observation.toolPathUsed,
177
+ skipped: observation.skipped ?? false,
178
+ rawBytes: observation.rawBytes,
179
+ rawTokensApprox,
180
+ routedBytes: observation.routedBytes,
181
+ routedTokensApprox,
182
+ byteReductionPercent: reductionPercent(observation.rawBytes, observation.routedBytes),
183
+ tokenReductionPercent: reductionPercent(rawTokensApprox, routedTokensApprox),
184
+ latencyMs: latencySummary(latencies),
185
+ routedExcerpt: observation.routedExcerpt,
186
+ correctness,
187
+ recovery: observation.recovery,
188
+ notes: observation.notes ?? [],
189
+ };
190
+ if (observation.skipReason) {
191
+ result.skipReason = observation.skipReason;
192
+ }
193
+ if (observation.executionStatus !== undefined) {
194
+ result.executionStatus = observation.executionStatus;
195
+ }
196
+ if (Object.prototype.hasOwnProperty.call(observation, "exitCode")) {
197
+ result.exitCode = observation.exitCode ?? null;
198
+ }
199
+ if (observation.outputId) {
200
+ result.outputId = observation.outputId;
201
+ }
202
+ if (observation.parser) {
203
+ result.parser = observation.parser;
204
+ }
205
+ return result;
182
206
  }
183
207
  function selectCommandBenchmarkObservation(fixture, observations) {
184
- const firstObservation = observations[0];
185
- if (firstObservation === undefined) {
186
- return skippedObservation("command benchmark runner", "No observation was produced.");
187
- }
188
- if (fixture.kind === "repeated-output") {
189
- return observations[observations.length - 1] ?? firstObservation;
190
- }
191
- return observations.find((observation) => observation.parser?.name !== "duplicate-output") ?? firstObservation;
208
+ const firstObservation = observations[0];
209
+ if (firstObservation === undefined) {
210
+ return skippedObservation("command benchmark runner", "No observation was produced.");
211
+ }
212
+ if (fixture.kind === "repeated-output") {
213
+ return observations[observations.length - 1] ?? firstObservation;
214
+ }
215
+ return observations.find((observation) => observation.parser?.name !== "duplicate-output") ?? firstObservation;
192
216
  }
193
217
  function summarizeCommandReport(fixtures) {
194
- const improved = summarizeCommandMode(fixtures, "improved-freeflow-run");
195
- const nativeBaseline = summarizeCommandMode(fixtures, "native-baseline-proxy");
196
- const failedFixtures = fixtures.filter((fixture) => fixture.expected.executionStatus !== "success");
197
- const failedCommandFactsPreserved = failedFixtures.every((fixture) => {
198
- const improvedResult = fixture.results.find((result) => result.mode === "improved-freeflow-run");
199
- return Boolean(improvedResult?.correctness.failedFactsExact);
200
- });
201
- return {
202
- fixtures: fixtures.length,
203
- modeResults: fixtures.reduce((count, fixture) => count + fixture.results.length, 0),
204
- improved,
205
- nativeBaseline,
206
- failedCommandFactsPreserved,
207
- };
218
+ const improved = summarizeCommandMode(fixtures, "improved-freeflow-run");
219
+ const nativeBaseline = summarizeCommandMode(fixtures, "native-baseline-proxy");
220
+ const failedFixtures = fixtures.filter((fixture) => fixture.expected.executionStatus !== "success");
221
+ const failedCommandFactsPreserved = failedFixtures.every((fixture) => {
222
+ const improvedResult = fixture.results.find((result) => result.mode === "improved-freeflow-run");
223
+ return Boolean(improvedResult?.correctness.failedFactsExact);
224
+ });
225
+ return {
226
+ fixtures: fixtures.length,
227
+ modeResults: fixtures.reduce((count, fixture) => count + fixture.results.length, 0),
228
+ improved,
229
+ nativeBaseline,
230
+ failedCommandFactsPreserved,
231
+ };
208
232
  }
209
233
  function summarizeCommandMode(fixtures, mode) {
210
- const modeResults = fixtures
211
- .map((fixture) => fixture.results.find((candidate) => candidate.mode === mode))
212
- .filter((result) => Boolean(result));
213
- const measuredResults = modeResults.filter((result) => !result.skipped);
214
- const totalRawBytes = measuredResults.reduce((sum, result) => sum + result.rawBytes, 0);
215
- const totalRoutedBytes = measuredResults.reduce((sum, result) => sum + result.routedBytes, 0);
216
- const totalRawTokensApprox = measuredResults.reduce((sum, result) => sum + result.rawTokensApprox, 0);
217
- const totalRoutedTokensApprox = measuredResults.reduce((sum, result) => sum + result.routedTokensApprox, 0);
218
- return modeResults.reduce((summary, result) => {
219
- if (result.skipped) {
220
- summary.skipped += 1;
221
- }
222
- else if (isCommandGatedPass(result, mode)) {
223
- summary.passed += 1;
224
- }
225
- else {
226
- summary.failed += 1;
227
- }
228
- if (result.correctness.exactFactsPreserved) {
229
- summary.exactFactsPreserved += 1;
230
- }
231
- if (result.recovery.status === "passed") {
232
- summary.recoveryPassed += 1;
233
- }
234
- return summary;
235
- }, {
236
- passed: 0,
237
- failed: 0,
238
- skipped: 0,
239
- exactFactsPreserved: 0,
240
- recoveryPassed: 0,
241
- totalRawBytes,
242
- totalRoutedBytes,
243
- totalRawTokensApprox,
244
- totalRoutedTokensApprox,
245
- weightedByteReductionPercent: reductionPercent(totalRawBytes, totalRoutedBytes),
246
- weightedTokenReductionPercent: reductionPercent(totalRawTokensApprox, totalRoutedTokensApprox),
247
- averageByteReductionPercent: average(measuredResults.map((result) => result.byteReductionPercent)),
248
- medianByteReductionPercent: median(measuredResults.map((result) => result.byteReductionPercent)),
249
- averageTokenReductionPercent: average(measuredResults.map((result) => result.tokenReductionPercent)),
250
- medianTokenReductionPercent: median(measuredResults.map((result) => result.tokenReductionPercent)),
251
- });
234
+ const modeResults = fixtures
235
+ .map((fixture) => fixture.results.find((candidate) => candidate.mode === mode))
236
+ .filter((result) => Boolean(result));
237
+ const measuredResults = modeResults.filter((result) => !result.skipped);
238
+ const totalRawBytes = measuredResults.reduce((sum, result) => sum + result.rawBytes, 0);
239
+ const totalRoutedBytes = measuredResults.reduce((sum, result) => sum + result.routedBytes, 0);
240
+ const totalRawTokensApprox = measuredResults.reduce((sum, result) => sum + result.rawTokensApprox, 0);
241
+ const totalRoutedTokensApprox = measuredResults.reduce((sum, result) => sum + result.routedTokensApprox, 0);
242
+ return modeResults.reduce(
243
+ (summary, result) => {
244
+ if (result.skipped) {
245
+ summary.skipped += 1;
246
+ } else if (isCommandGatedPass(result, mode)) {
247
+ summary.passed += 1;
248
+ } else {
249
+ summary.failed += 1;
250
+ }
251
+ if (result.correctness.exactFactsPreserved) {
252
+ summary.exactFactsPreserved += 1;
253
+ }
254
+ if (result.recovery.status === "passed") {
255
+ summary.recoveryPassed += 1;
256
+ }
257
+ return summary;
258
+ },
259
+ {
260
+ passed: 0,
261
+ failed: 0,
262
+ skipped: 0,
263
+ exactFactsPreserved: 0,
264
+ recoveryPassed: 0,
265
+ totalRawBytes,
266
+ totalRoutedBytes,
267
+ totalRawTokensApprox,
268
+ totalRoutedTokensApprox,
269
+ weightedByteReductionPercent: reductionPercent(totalRawBytes, totalRoutedBytes),
270
+ weightedTokenReductionPercent: reductionPercent(totalRawTokensApprox, totalRoutedTokensApprox),
271
+ averageByteReductionPercent: average(measuredResults.map((result) => result.byteReductionPercent)),
272
+ medianByteReductionPercent: median(measuredResults.map((result) => result.byteReductionPercent)),
273
+ averageTokenReductionPercent: average(measuredResults.map((result) => result.tokenReductionPercent)),
274
+ medianTokenReductionPercent: median(measuredResults.map((result) => result.tokenReductionPercent)),
275
+ },
276
+ );
252
277
  }
253
278
  function isCommandGatedPass(result, mode) {
254
- if (!result.correctness.passed) {
255
- return false;
256
- }
257
- if (mode !== "improved-freeflow-run") {
258
- return true;
259
- }
260
- return result.recovery.status === "passed";
279
+ if (!result.correctness.passed) {
280
+ return false;
281
+ }
282
+ if (mode !== "improved-freeflow-run") {
283
+ return true;
284
+ }
285
+ return result.recovery.status === "passed";
261
286
  }
262
287
  function createCommandBenchmarkFixtures(vaultRoot, externalComparators) {
263
- return commandFixtureDefinitions().map((definition) => commandFixture(definition, vaultRoot, externalComparators));
288
+ return commandFixtureDefinitions().map((definition) => commandFixture(definition, vaultRoot, externalComparators));
264
289
  }
265
290
  function commandFixtureDefinitions() {
266
- const noisySuccess = [
267
- "NOISY_SUCCESS completed 1200 files with 0 errors",
268
- ...Array.from({ length: 80 }, (_, index) => `cache warm line ${index + 1}: unchanged`),
269
- ].join("\n");
270
- const failedStack = [
271
- "Error: ROUTER_BENCH_FAILED exact stack fact",
272
- " at main (/repo/src/main.ts:7:11)",
273
- " at async run (/repo/src/run.ts:2:3)",
274
- ].join("\n");
275
- const testSummary = [
276
- "FAIL tests/router.test.ts",
277
- " ● preserves command output facts",
278
- " Expected true to be false",
279
- "Tests: 1 failed, 3 passed, 4 total",
280
- ].join("\n");
281
- const diagnostics = [
282
- "src/router.ts(12,7): error TS2322: Type 'string' is not assignable to type 'number'.",
283
- "src/other.ts(4,1): warning TS6133: 'unused' is declared but its value is never read.",
284
- ].join("\n");
285
- const gitOutput = [
286
- " M router/src/tools/run.ts",
287
- "?? router/src/benchmarks/command-benchmarks.ts",
288
- " router/src/tools/run.ts | 12 +++++++++---",
289
- " 1 file changed, 9 insertions(+), 3 deletions(-)",
290
- ].join("\n");
291
- const repetitiveLog = [
292
- "REPETITIVE_LOG completed after 3 retry cycles",
293
- ...Array.from({ length: 120 }, () => "retry heartbeat: waiting for worker"),
294
- ].join("\n");
295
- const hugeJson = `${JSON.stringify({ status: "ok", marker: "HUGE_JSON_TABLE preserved header fact", rows: 20_000 }).slice(0, -1)},"payload":"${"x".repeat(60_000)}"}`;
296
- const repeatedOutput = [
297
- "REPEATED_OUTPUT identical command output stays recoverable",
298
- ...Array.from({ length: 120 }, (_, index) => `repeated payload line ${index + 1}: unchanged`),
299
- ].join("\n");
300
- return [
301
- {
302
- id: "noisy-success",
303
- title: "Noisy successful command output",
304
- kind: "noisy-success",
305
- command: "npm run build",
306
- executionStatus: "success",
307
- exitCode: 0,
308
- stdout: noisySuccess,
309
- stderr: "",
310
- combined: noisySuccess,
311
- requiredFacts: ["NOISY_SUCCESS completed 1200 files with 0 errors"],
312
- thresholds: { largeOutputLines: 10, largeOutputBytes: 2_000 },
313
- },
314
- {
315
- id: "failed-stack-trace",
316
- title: "Failed command with stack trace",
317
- kind: "failed-stack",
318
- command: "node fail.js",
319
- executionStatus: "failed",
320
- exitCode: 1,
321
- stdout: "",
322
- stderr: failedStack,
323
- combined: failedStack,
324
- requiredFacts: ["Error: ROUTER_BENCH_FAILED exact stack fact", "at main"],
325
- failedFactsMustBeExact: true,
326
- },
327
- {
328
- id: "test-summary",
329
- title: "Test runner summary and failure facts",
330
- kind: "test-summary",
331
- command: "npm test",
332
- executionStatus: "failed",
333
- exitCode: 1,
334
- stdout: testSummary,
335
- stderr: "",
336
- combined: testSummary,
337
- requiredFacts: ["FAIL tests/router.test.ts", "Tests: 1 failed, 3 passed, 4 total"],
338
- failedFactsMustBeExact: true,
339
- goal: "verification",
340
- },
341
- {
342
- id: "diagnostics",
343
- title: "TypeScript/lint diagnostics",
344
- kind: "diagnostics",
345
- command: "npm run typecheck",
346
- executionStatus: "failed",
347
- exitCode: 2,
348
- stdout: diagnostics,
349
- stderr: "",
350
- combined: diagnostics,
351
- requiredFacts: ["src/router.ts(12,7): error TS2322", "src/other.ts(4,1): warning TS6133"],
352
- failedFactsMustBeExact: true,
353
- },
354
- {
355
- id: "git-output",
356
- title: "Git status and diffstat output",
357
- kind: "git-output",
358
- command: "git status --short && git diff --stat",
359
- executionStatus: "success",
360
- exitCode: 0,
361
- stdout: gitOutput,
362
- stderr: "",
363
- combined: gitOutput,
364
- requiredFacts: ["M router/src/tools/run.ts", "1 file changed"],
365
- thresholds: { largeOutputLines: 2, largeOutputBytes: 10_000 },
366
- },
367
- {
368
- id: "repetitive-log",
369
- title: "Repetitive log output",
370
- kind: "repetitive-log",
371
- command: "tail -f worker.log --snapshot",
372
- executionStatus: "success",
373
- exitCode: 0,
374
- stdout: repetitiveLog,
375
- stderr: "",
376
- combined: repetitiveLog,
377
- requiredFacts: ["REPETITIVE_LOG completed after 3 retry cycles"],
378
- thresholds: { largeOutputLines: 10, largeOutputBytes: 2_000 },
379
- },
380
- {
381
- id: "huge-json-table",
382
- title: "Huge JSON/table-like output",
383
- kind: "huge-json-table",
384
- command: "node scripts/dump-json.js",
385
- executionStatus: "success",
386
- exitCode: 0,
387
- stdout: hugeJson,
388
- stderr: "",
389
- combined: hugeJson,
390
- requiredFacts: ["HUGE_JSON_TABLE preserved header fact"],
391
- thresholds: { largeOutputLines: 1_000, largeOutputBytes: 10_000 },
392
- },
393
- {
394
- id: "repeated-command-output",
395
- title: "Repeated command output",
396
- kind: "repeated-output",
397
- command: "printf repeated-output",
398
- executionStatus: "success",
399
- exitCode: 0,
400
- stdout: repeatedOutput,
401
- stderr: "",
402
- combined: repeatedOutput,
403
- requiredFacts: ["REPEATED_OUTPUT identical command output stays recoverable"],
404
- repeatRuns: 2,
405
- thresholds: { largeOutputLines: 10, largeOutputBytes: 10_000 },
406
- notes: ["Exact duplicate detection returns a compact note; current metadata points to the prior exact raw output."],
407
- },
408
- ];
291
+ const noisySuccess = [
292
+ "NOISY_SUCCESS completed 1200 files with 0 errors",
293
+ ...Array.from({ length: 80 }, (_, index) => `cache warm line ${index + 1}: unchanged`),
294
+ ].join("\n");
295
+ const failedStack = [
296
+ "Error: ROUTER_BENCH_FAILED exact stack fact",
297
+ " at main (/repo/src/main.ts:7:11)",
298
+ " at async run (/repo/src/run.ts:2:3)",
299
+ ].join("\n");
300
+ const testSummary = [
301
+ "FAIL tests/router.test.ts",
302
+ " ● preserves command output facts",
303
+ " Expected true to be false",
304
+ "Tests: 1 failed, 3 passed, 4 total",
305
+ ].join("\n");
306
+ const diagnostics = [
307
+ "src/router.ts(12,7): error TS2322: Type 'string' is not assignable to type 'number'.",
308
+ "src/other.ts(4,1): warning TS6133: 'unused' is declared but its value is never read.",
309
+ ].join("\n");
310
+ const gitOutput = [
311
+ " M router/src/tools/run.ts",
312
+ "?? router/src/benchmarks/command-benchmarks.ts",
313
+ " router/src/tools/run.ts | 12 +++++++++---",
314
+ " 1 file changed, 9 insertions(+), 3 deletions(-)",
315
+ ].join("\n");
316
+ const repetitiveLog = [
317
+ "REPETITIVE_LOG completed after 3 retry cycles",
318
+ ...Array.from({ length: 120 }, () => "retry heartbeat: waiting for worker"),
319
+ ].join("\n");
320
+ const hugeJson = `${JSON.stringify({ status: "ok", marker: "HUGE_JSON_TABLE preserved header fact", rows: 20_000 }).slice(0, -1)},"payload":"${"x".repeat(60_000)}"}`;
321
+ const repeatedOutput = [
322
+ "REPEATED_OUTPUT identical command output stays recoverable",
323
+ ...Array.from({ length: 120 }, (_, index) => `repeated payload line ${index + 1}: unchanged`),
324
+ ].join("\n");
325
+ return [
326
+ {
327
+ id: "noisy-success",
328
+ title: "Noisy successful command output",
329
+ kind: "noisy-success",
330
+ command: "npm run build",
331
+ executionStatus: "success",
332
+ exitCode: 0,
333
+ stdout: noisySuccess,
334
+ stderr: "",
335
+ combined: noisySuccess,
336
+ requiredFacts: ["NOISY_SUCCESS completed 1200 files with 0 errors"],
337
+ thresholds: { largeOutputLines: 10, largeOutputBytes: 2_000 },
338
+ },
339
+ {
340
+ id: "failed-stack-trace",
341
+ title: "Failed command with stack trace",
342
+ kind: "failed-stack",
343
+ command: "node fail.js",
344
+ executionStatus: "failed",
345
+ exitCode: 1,
346
+ stdout: "",
347
+ stderr: failedStack,
348
+ combined: failedStack,
349
+ requiredFacts: ["Error: ROUTER_BENCH_FAILED exact stack fact", "at main"],
350
+ failedFactsMustBeExact: true,
351
+ },
352
+ {
353
+ id: "test-summary",
354
+ title: "Test runner summary and failure facts",
355
+ kind: "test-summary",
356
+ command: "npm test",
357
+ executionStatus: "failed",
358
+ exitCode: 1,
359
+ stdout: testSummary,
360
+ stderr: "",
361
+ combined: testSummary,
362
+ requiredFacts: ["FAIL tests/router.test.ts", "Tests: 1 failed, 3 passed, 4 total"],
363
+ failedFactsMustBeExact: true,
364
+ goal: "verification",
365
+ },
366
+ {
367
+ id: "diagnostics",
368
+ title: "TypeScript/lint diagnostics",
369
+ kind: "diagnostics",
370
+ command: "npm run typecheck",
371
+ executionStatus: "failed",
372
+ exitCode: 2,
373
+ stdout: diagnostics,
374
+ stderr: "",
375
+ combined: diagnostics,
376
+ requiredFacts: ["src/router.ts(12,7): error TS2322", "src/other.ts(4,1): warning TS6133"],
377
+ failedFactsMustBeExact: true,
378
+ },
379
+ {
380
+ id: "git-output",
381
+ title: "Git status and diffstat output",
382
+ kind: "git-output",
383
+ command: "git status --short && git diff --stat",
384
+ executionStatus: "success",
385
+ exitCode: 0,
386
+ stdout: gitOutput,
387
+ stderr: "",
388
+ combined: gitOutput,
389
+ requiredFacts: ["M router/src/tools/run.ts", "1 file changed"],
390
+ thresholds: { largeOutputLines: 2, largeOutputBytes: 10_000 },
391
+ },
392
+ {
393
+ id: "repetitive-log",
394
+ title: "Repetitive log output",
395
+ kind: "repetitive-log",
396
+ command: "tail -f worker.log --snapshot",
397
+ executionStatus: "success",
398
+ exitCode: 0,
399
+ stdout: repetitiveLog,
400
+ stderr: "",
401
+ combined: repetitiveLog,
402
+ requiredFacts: ["REPETITIVE_LOG completed after 3 retry cycles"],
403
+ thresholds: { largeOutputLines: 10, largeOutputBytes: 2_000 },
404
+ },
405
+ {
406
+ id: "huge-json-table",
407
+ title: "Huge JSON/table-like output",
408
+ kind: "huge-json-table",
409
+ command: "node scripts/dump-json.js",
410
+ executionStatus: "success",
411
+ exitCode: 0,
412
+ stdout: hugeJson,
413
+ stderr: "",
414
+ combined: hugeJson,
415
+ requiredFacts: ["HUGE_JSON_TABLE preserved header fact"],
416
+ thresholds: { largeOutputLines: 1_000, largeOutputBytes: 10_000 },
417
+ },
418
+ {
419
+ id: "repeated-command-output",
420
+ title: "Repeated command output",
421
+ kind: "repeated-output",
422
+ command: "printf repeated-output",
423
+ executionStatus: "success",
424
+ exitCode: 0,
425
+ stdout: repeatedOutput,
426
+ stderr: "",
427
+ combined: repeatedOutput,
428
+ requiredFacts: ["REPEATED_OUTPUT identical command output stays recoverable"],
429
+ repeatRuns: 2,
430
+ thresholds: { largeOutputLines: 10, largeOutputBytes: 10_000 },
431
+ notes: [
432
+ "Exact duplicate detection returns a compact note; current metadata points to the prior exact raw output.",
433
+ ],
434
+ },
435
+ ];
409
436
  }
410
437
  function commandFixture(definition, vaultRoot, externalComparators) {
411
- const expected = {
412
- executionStatus: definition.executionStatus,
413
- exitCode: definition.exitCode,
414
- requiredFacts: definition.requiredFacts,
415
- };
416
- if (definition.failedFactsMustBeExact !== undefined) {
417
- expected.failedFactsMustBeExact = definition.failedFactsMustBeExact;
418
- }
419
- const modes = {
420
- "native-baseline-proxy": async () => nativeCommandObservation(definition),
421
- "improved-freeflow-run": async () => improvedCommandObservation(definition, vaultRoot),
422
- };
423
- for (const comparator of externalComparators) {
424
- modes[comparator.mode] = async () => externalComparatorObservation(definition, comparator);
425
- }
426
- return {
427
- id: definition.id,
428
- title: definition.title,
429
- kind: definition.kind,
430
- expected,
431
- modes,
432
- };
438
+ const expected = {
439
+ executionStatus: definition.executionStatus,
440
+ exitCode: definition.exitCode,
441
+ requiredFacts: definition.requiredFacts,
442
+ };
443
+ if (definition.failedFactsMustBeExact !== undefined) {
444
+ expected.failedFactsMustBeExact = definition.failedFactsMustBeExact;
445
+ }
446
+ const modes = {
447
+ "native-baseline-proxy": async () => nativeCommandObservation(definition),
448
+ "improved-freeflow-run": async () => improvedCommandObservation(definition, vaultRoot),
449
+ };
450
+ for (const comparator of externalComparators) {
451
+ modes[comparator.mode] = async () => externalComparatorObservation(definition, comparator);
452
+ }
453
+ return {
454
+ id: definition.id,
455
+ title: definition.title,
456
+ kind: definition.kind,
457
+ expected,
458
+ modes,
459
+ };
433
460
  }
434
461
  async function nativeCommandObservation(fixture) {
435
- return {
436
- toolPathUsed: "native-baseline-proxy: direct command output",
437
- rawBytes: byteLength(fixture.combined),
438
- routedBytes: byteLength(fixture.combined),
439
- executionStatus: fixture.executionStatus,
440
- exitCode: fixture.exitCode,
441
- routedExcerpt: fixture.combined,
442
- recovery: { status: "not-applicable", detail: "Native direct output has no Freeflow vault recovery contract." },
443
- notes: fixture.notes ?? [],
444
- };
462
+ return {
463
+ toolPathUsed: "native-baseline-proxy: direct command output",
464
+ rawBytes: byteLength(fixture.combined),
465
+ routedBytes: byteLength(fixture.combined),
466
+ executionStatus: fixture.executionStatus,
467
+ exitCode: fixture.exitCode,
468
+ routedExcerpt: fixture.combined,
469
+ recovery: { status: "not-applicable", detail: "Native direct output has no Freeflow vault recovery contract." },
470
+ notes: fixture.notes ?? [],
471
+ };
445
472
  }
446
473
  async function improvedCommandObservation(fixture, vaultRoot) {
447
- const vault = createVault({ root: vaultRoot });
448
- const sessionId = `command-benchmark-${fixture.id}`;
449
- const outputIds = [];
450
- let result = null;
451
- const repeatRuns = Math.max(1, fixture.repeatRuns ?? 1);
452
- for (let runIndex = 0; runIndex < repeatRuns; runIndex += 1) {
453
- const runner = fixedCommandRunner(fixture);
454
- const runOptions = {
455
- command: fixture.command,
456
- sessionId,
457
- vaultRoot: vault.root,
458
- preserve: fixture.preserve ?? "important",
459
- };
460
- if (fixture.goal !== undefined) {
461
- runOptions.goal = fixture.goal;
462
- }
463
- if (fixture.thresholds !== undefined) {
464
- runOptions.thresholds = fixture.thresholds;
465
- }
466
- result = await freeflowRun(runOptions, runner);
467
- outputIds.push(result.outputId);
468
- }
469
- if (!result) {
470
- return skippedObservation("improved-freeflow-run", "freeflowRun did not produce a result.");
471
- }
472
- const recovery = await verifyCommandRecovery(vault.root, sessionId, result.recovery?.outputId ?? result.outputId, fixture.combined, fixture.requiredFacts);
473
- const notes = [result.routing.reason, ...(fixture.notes ?? [])];
474
- if (outputIds.length > 1) {
475
- notes.push(`repeatedRuns=${outputIds.length}`);
476
- notes.push(`outputIds=${outputIds.join(",")}`);
477
- }
478
- notes.push(`recovery=${recovery.status}: ${recovery.detail}`);
479
- const observation = {
480
- toolPathUsed: "improved-freeflow-run: freeflowRun synthetic fixture runner",
481
- rawBytes: byteLength(fixture.combined),
482
- routedBytes: byteLength(JSON.stringify(result)),
483
- executionStatus: result.execution.status,
484
- exitCode: result.execution.exitCode,
485
- outputId: result.outputId,
486
- routedExcerpt: routedText(result),
487
- recovery,
488
- notes,
474
+ const vault = createVault({ root: vaultRoot });
475
+ const sessionId = `command-benchmark-${fixture.id}`;
476
+ const outputIds = [];
477
+ let result = null;
478
+ const repeatRuns = Math.max(1, fixture.repeatRuns ?? 1);
479
+ for (let runIndex = 0; runIndex < repeatRuns; runIndex += 1) {
480
+ const runner = fixedCommandRunner(fixture);
481
+ const runOptions = {
482
+ command: fixture.command,
483
+ sessionId,
484
+ vaultRoot: vault.root,
485
+ preserve: fixture.preserve ?? "important",
489
486
  };
490
- if (result.parser) {
491
- observation.parser = result.parser;
487
+ if (fixture.goal !== undefined) {
488
+ runOptions.goal = fixture.goal;
492
489
  }
493
- return observation;
490
+ if (fixture.thresholds !== undefined) {
491
+ runOptions.thresholds = fixture.thresholds;
492
+ }
493
+ result = await freeflowRun(runOptions, runner);
494
+ outputIds.push(result.outputId);
495
+ }
496
+ if (!result) {
497
+ return skippedObservation("improved-freeflow-run", "freeflowRun did not produce a result.");
498
+ }
499
+ const recovery = await verifyCommandRecovery(
500
+ vault.root,
501
+ sessionId,
502
+ result.recovery?.outputId ?? result.outputId,
503
+ fixture.combined,
504
+ fixture.requiredFacts,
505
+ );
506
+ const notes = [result.routing.reason, ...(fixture.notes ?? [])];
507
+ if (outputIds.length > 1) {
508
+ notes.push(`repeatedRuns=${outputIds.length}`);
509
+ notes.push(`outputIds=${outputIds.join(",")}`);
510
+ }
511
+ notes.push(`recovery=${recovery.status}: ${recovery.detail}`);
512
+ const observation = {
513
+ toolPathUsed: "improved-freeflow-run: freeflowRun synthetic fixture runner",
514
+ rawBytes: byteLength(fixture.combined),
515
+ routedBytes: byteLength(JSON.stringify(result)),
516
+ executionStatus: result.execution.status,
517
+ exitCode: result.execution.exitCode,
518
+ outputId: result.outputId,
519
+ routedExcerpt: routedText(result),
520
+ recovery,
521
+ notes,
522
+ };
523
+ if (result.parser) {
524
+ observation.parser = result.parser;
525
+ }
526
+ return observation;
494
527
  }
495
528
  async function externalComparatorObservation(fixture, comparator) {
496
- const startedAt = performance.now();
497
- const observation = await comparator.run({
498
- id: fixture.id,
499
- title: fixture.title,
500
- command: fixture.command,
501
- executionStatus: fixture.executionStatus,
502
- exitCode: fixture.exitCode,
529
+ const startedAt = performance.now();
530
+ const observation = await comparator.run({
531
+ id: fixture.id,
532
+ title: fixture.title,
533
+ command: fixture.command,
534
+ executionStatus: fixture.executionStatus,
535
+ exitCode: fixture.exitCode,
536
+ stdout: fixture.stdout,
537
+ stderr: fixture.stderr,
538
+ combined: fixture.combined,
539
+ requiredFacts: fixture.requiredFacts,
540
+ });
541
+ const latencyMs = observation.latencyMs ?? performance.now() - startedAt;
542
+ const notes = [
543
+ `externalComparator=${comparator.name}`,
544
+ `latencyMs=${latencyMs.toFixed(2)}`,
545
+ ...(observation.notes ?? []),
546
+ ];
547
+ const benchmarkObservation = {
548
+ toolPathUsed: `${comparator.name}: configured external command benchmark hook`,
549
+ rawBytes: observation.rawBytes ?? byteLength(fixture.combined),
550
+ routedBytes: observation.routedBytes ?? byteLength(observation.routedText),
551
+ executionStatus: fixture.executionStatus,
552
+ exitCode: fixture.exitCode,
553
+ routedExcerpt: observation.routedText,
554
+ recovery: { status: "not-applicable", detail: `${comparator.name} hook does not use Freeflow vault recovery.` },
555
+ notes,
556
+ };
557
+ if (observation.parser) {
558
+ benchmarkObservation.parser = observation.parser;
559
+ }
560
+ return benchmarkObservation;
561
+ }
562
+ function fixedCommandRunner(fixture) {
563
+ return {
564
+ async run() {
565
+ const result = {
503
566
  stdout: fixture.stdout,
504
567
  stderr: fixture.stderr,
505
568
  combined: fixture.combined,
506
- requiredFacts: fixture.requiredFacts,
507
- });
508
- const latencyMs = observation.latencyMs ?? performance.now() - startedAt;
509
- const notes = [`externalComparator=${comparator.name}`, `latencyMs=${latencyMs.toFixed(2)}`, ...(observation.notes ?? [])];
510
- const benchmarkObservation = {
511
- toolPathUsed: `${comparator.name}: configured external command benchmark hook`,
512
- rawBytes: observation.rawBytes ?? byteLength(fixture.combined),
513
- routedBytes: observation.routedBytes ?? byteLength(observation.routedText),
514
569
  executionStatus: fixture.executionStatus,
515
570
  exitCode: fixture.exitCode,
516
- routedExcerpt: observation.routedText,
517
- recovery: { status: "not-applicable", detail: `${comparator.name} hook does not use Freeflow vault recovery.` },
518
- notes,
519
- };
520
- if (observation.parser) {
521
- benchmarkObservation.parser = observation.parser;
522
- }
523
- return benchmarkObservation;
524
- }
525
- function fixedCommandRunner(fixture) {
526
- return {
527
- async run() {
528
- const result = {
529
- stdout: fixture.stdout,
530
- stderr: fixture.stderr,
531
- combined: fixture.combined,
532
- executionStatus: fixture.executionStatus,
533
- exitCode: fixture.exitCode,
534
- };
535
- if (fixture.durationMs !== undefined) {
536
- result.durationMs = fixture.durationMs;
537
- }
538
- return result;
539
- },
540
- };
571
+ };
572
+ if (fixture.durationMs !== undefined) {
573
+ result.durationMs = fixture.durationMs;
574
+ }
575
+ return result;
576
+ },
577
+ };
541
578
  }
542
579
  async function verifyCommandRecovery(vaultRoot, sessionId, outputId, expectedCombined, requiredFacts) {
543
- if (!outputId) {
544
- return { status: "failed", detail: "No Freeflow outputId was returned." };
545
- }
546
- try {
547
- const vault = createVault({ root: vaultRoot });
548
- const recovered = await readOutputText(vault, sessionId, outputId, "combined");
549
- if (recovered !== expectedCombined) {
550
- return { status: "failed", detail: "Recovered combined output did not match exact fixture output." };
551
- }
552
- const missingFact = requiredFacts.find((fact) => !recovered.includes(fact));
553
- if (missingFact) {
554
- return { status: "failed", detail: `Recovered output missed required fact: ${missingFact}` };
555
- }
556
- return { status: "passed", detail: `Verified exact combined output recovery for ${outputId}.` };
580
+ if (!outputId) {
581
+ return { status: "failed", detail: "No Freeflow outputId was returned." };
582
+ }
583
+ try {
584
+ const vault = createVault({ root: vaultRoot });
585
+ const recovered = await readOutputText(vault, sessionId, outputId, "combined");
586
+ if (recovered !== expectedCombined) {
587
+ return { status: "failed", detail: "Recovered combined output did not match exact fixture output." };
557
588
  }
558
- catch (error) {
559
- const message = error instanceof Error ? error.message : String(error);
560
- return { status: "failed", detail: `Recovery failed: ${message}` };
589
+ const missingFact = requiredFacts.find((fact) => !recovered.includes(fact));
590
+ if (missingFact) {
591
+ return { status: "failed", detail: `Recovered output missed required fact: ${missingFact}` };
561
592
  }
593
+ return { status: "passed", detail: `Verified exact combined output recovery for ${outputId}.` };
594
+ } catch (error) {
595
+ const message = error instanceof Error ? error.message : String(error);
596
+ return { status: "failed", detail: `Recovery failed: ${message}` };
597
+ }
562
598
  }
563
599
  function scoreCommandCorrectness(expected, observation) {
564
- if (observation.skipped) {
565
- return {
566
- passed: false,
567
- statusCorrect: false,
568
- exitCodeCorrect: false,
569
- exactFactsPreserved: false,
570
- failedFactsExact: false,
571
- };
572
- }
573
- const statusCorrect = observation.executionStatus === expected.executionStatus;
574
- const exitCodeCorrect = observation.exitCode === expected.exitCode;
575
- const factsInRoutedExcerpt = expected.requiredFacts.every((fact) => observation.routedExcerpt.includes(fact));
576
- const duplicateFactsRecoverable = observation.parser?.name === "duplicate-output" && observation.recovery.status === "passed";
577
- const exactFactsPreserved = factsInRoutedExcerpt || duplicateFactsRecoverable;
578
- const failedFactsExact = expected.failedFactsMustBeExact ? exactFactsPreserved : true;
600
+ if (observation.skipped) {
579
601
  return {
580
- passed: statusCorrect && exitCodeCorrect && exactFactsPreserved && failedFactsExact,
581
- statusCorrect,
582
- exitCodeCorrect,
583
- exactFactsPreserved,
584
- failedFactsExact,
602
+ passed: false,
603
+ statusCorrect: false,
604
+ exitCodeCorrect: false,
605
+ exactFactsPreserved: false,
606
+ failedFactsExact: false,
585
607
  };
608
+ }
609
+ const statusCorrect = observation.executionStatus === expected.executionStatus;
610
+ const exitCodeCorrect = observation.exitCode === expected.exitCode;
611
+ const factsInRoutedExcerpt = expected.requiredFacts.every((fact) => observation.routedExcerpt.includes(fact));
612
+ const duplicateFactsRecoverable =
613
+ observation.parser?.name === "duplicate-output" && observation.recovery.status === "passed";
614
+ const exactFactsPreserved = factsInRoutedExcerpt || duplicateFactsRecoverable;
615
+ const failedFactsExact = expected.failedFactsMustBeExact ? exactFactsPreserved : true;
616
+ return {
617
+ passed: statusCorrect && exitCodeCorrect && exactFactsPreserved && failedFactsExact,
618
+ statusCorrect,
619
+ exitCodeCorrect,
620
+ exactFactsPreserved,
621
+ failedFactsExact,
622
+ };
586
623
  }
587
624
  function routedText(result) {
588
- return result.importantLines?.map((line) => line.excerpt).join("\n") ?? "";
625
+ return result.importantLines?.map((line) => line.excerpt).join("\n") ?? "";
589
626
  }
590
627
  function commandBenchmarkModes(externalComparators) {
591
- return ["native-baseline-proxy", "improved-freeflow-run", ...externalComparators.map((comparator) => comparator.mode)];
628
+ return [
629
+ "native-baseline-proxy",
630
+ "improved-freeflow-run",
631
+ ...externalComparators.map((comparator) => comparator.mode),
632
+ ];
592
633
  }
593
634
  function skippedExternalTools(externalComparators) {
594
- const configuredNames = new Set(externalComparators.map((comparator) => comparator.name.toLowerCase()));
595
- return DEFAULT_SKIPPED_EXTERNAL_TOOLS.filter((tool) => !configuredNames.has(tool.name.toLowerCase()));
635
+ const configuredNames = new Set(externalComparators.map((comparator) => comparator.name.toLowerCase()));
636
+ return DEFAULT_SKIPPED_EXTERNAL_TOOLS.filter((tool) => !configuredNames.has(tool.name.toLowerCase()));
596
637
  }
597
638
  async function createTempDir(prefix) {
598
- const path = await mkdtemp(resolve(tmpdir(), prefix));
599
- return {
600
- path,
601
- cleanup: async () => {
602
- await rm(path, { recursive: true, force: true });
603
- },
604
- };
639
+ const path = await mkdtemp(resolve(tmpdir(), prefix));
640
+ return {
641
+ path,
642
+ cleanup: async () => {
643
+ await rm(path, { recursive: true, force: true });
644
+ },
645
+ };
605
646
  }
606
647
  function skippedObservation(toolPathUsed, reason) {
607
- return {
608
- toolPathUsed,
609
- rawBytes: 0,
610
- routedBytes: 0,
611
- routedExcerpt: "",
612
- recovery: { status: "skipped", detail: reason },
613
- skipped: true,
614
- skipReason: reason,
615
- };
648
+ return {
649
+ toolPathUsed,
650
+ rawBytes: 0,
651
+ routedBytes: 0,
652
+ routedExcerpt: "",
653
+ recovery: { status: "skipped", detail: reason },
654
+ skipped: true,
655
+ skipReason: reason,
656
+ };
616
657
  }
617
658
  function byteLength(value) {
618
- return Buffer.byteLength(value, "utf8");
659
+ return Buffer.byteLength(value, "utf8");
619
660
  }
620
661
  function formatCommandCorrectnessChecks(correctness) {
621
- return [
622
- `status ${correctness.statusCorrect ? "✓" : "✗"}`,
623
- `exit ${correctness.exitCodeCorrect ? "✓" : "✗"}`,
624
- `facts ${correctness.exactFactsPreserved ? "✓" : "✗"}`,
625
- `failed-exact ${correctness.failedFactsExact ? "✓" : "✗"}`,
626
- ].join(" ");
662
+ return [
663
+ `status ${correctness.statusCorrect ? "✓" : "✗"}`,
664
+ `exit ${correctness.exitCodeCorrect ? "✓" : "✗"}`,
665
+ `facts ${correctness.exactFactsPreserved ? "✓" : "✗"}`,
666
+ `failed-exact ${correctness.failedFactsExact ? "✓" : "✗"}`,
667
+ ].join(" ");
627
668
  }
628
669
  function defaultReportPath() {
629
- return resolve(process.cwd(), "evals/reports/runtime/output-router-command-benchmark-1-report.md");
670
+ return resolve(process.cwd(), "router/evals/reports/output-router-command-benchmark-1-report.md");
630
671
  }
631
672
  async function runCli() {
632
- const { iterations, reportPath, jsonReportPath } = parseBenchmarkCliArgs(process.argv.slice(2), { reportPath: defaultReportPath() });
633
- const options = {};
634
- if (iterations !== undefined) {
635
- options.iterations = iterations;
636
- }
637
- const report = await runCommandBenchmarks(options);
638
- const reports = await writeCommandBenchmarkReports(report, reportPath, {
639
- jsonReportPath: jsonReportPath === undefined ? defaultJsonRunReportPath(reportPath) : jsonReportPath,
640
- });
641
- const shortId = createHash("sha256").update(JSON.stringify(report.summary)).digest("hex").slice(0, 8);
642
- console.log(`Freeflow command benchmark ${shortId}: improved ${report.summary.improved.passed}/${report.summary.fixtures} pass`);
643
- console.log(`Markdown report: ${reports.markdown}`);
644
- if (reports.json) {
645
- console.log(`JSON run data: ${reports.json}`);
646
- }
647
- if (report.summary.improved.failed > 0) {
648
- process.exitCode = 1;
649
- }
673
+ const { iterations, reportPath, jsonReportPath } = parseBenchmarkCliArgs(process.argv.slice(2), {
674
+ reportPath: defaultReportPath(),
675
+ });
676
+ const options = {};
677
+ if (iterations !== undefined) {
678
+ options.iterations = iterations;
679
+ }
680
+ const report = await runCommandBenchmarks(options);
681
+ const reports = await writeCommandBenchmarkReports(report, reportPath, {
682
+ jsonReportPath: jsonReportPath === undefined ? defaultJsonRunReportPath(reportPath) : jsonReportPath,
683
+ });
684
+ const shortId = createHash("sha256").update(JSON.stringify(report.summary)).digest("hex").slice(0, 8);
685
+ console.log(
686
+ `Freeflow command benchmark ${shortId}: improved ${report.summary.improved.passed}/${report.summary.fixtures} pass`,
687
+ );
688
+ console.log(`Markdown report: ${reports.markdown}`);
689
+ if (reports.json) {
690
+ console.log(`JSON run data: ${reports.json}`);
691
+ }
692
+ if (report.summary.improved.failed > 0) {
693
+ process.exitCode = 1;
694
+ }
650
695
  }
651
696
  if (process.argv[1] && fileURLToPath(import.meta.url) === resolve(process.argv[1])) {
652
- await runCli();
697
+ await runCli();
653
698
  }