@hassangameryt/freeflow 0.3.0 → 0.4.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 (690) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +5 -2
  3. package/.codex-plugin/plugin.json +8 -9
  4. package/README.md +190 -128
  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/command-surface.json +51 -7
  9. package/hooks/freeflow-runtime-context.mjs +264 -136
  10. package/hooks/tests/check-runtime-context-hook.sh +223 -0
  11. package/package.json +23 -24
  12. package/pi-extension/dist/index.js +264 -80
  13. package/pi-extension/dist/integrations/mcp-config.js +29 -0
  14. package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
  15. package/pi-extension/dist/output-router/native-safety-net.js +216 -0
  16. package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
  17. package/pi-extension/dist/output-router/renderers.js +1023 -0
  18. package/pi-extension/dist/output-router/router-tools.js +554 -0
  19. package/pi-extension/dist/output-router/schemas.js +383 -0
  20. package/pi-extension/dist/output-router/status.js +744 -0
  21. package/pi-extension/dist/output-router/utils.js +502 -0
  22. package/pi-extension/dist/runtime/runtime-context.js +798 -0
  23. package/pi-extension/dist/settings/settings-tui.js +314 -0
  24. package/pi-extension/dist/settings/settings-ui.js +1487 -0
  25. package/pi-extension/freeflow/index.js +1 -0
  26. package/pi-extension/src/index.ts +230 -56
  27. package/pi-extension/src/{host-producer-identification.ts → output-router/host-producer-identification.ts} +37 -7
  28. package/pi-extension/src/{native-safety-net.ts → output-router/native-safety-net.ts} +7 -11
  29. package/pi-extension/src/{observed-tool-routing.ts → output-router/observed-tool-routing.ts} +19 -11
  30. package/pi-extension/src/{renderers.ts → output-router/renderers.ts} +246 -55
  31. package/pi-extension/src/{router-tools.ts → output-router/router-tools.ts} +130 -29
  32. package/pi-extension/src/{schemas.ts → output-router/schemas.ts} +171 -43
  33. package/pi-extension/src/output-router/status.ts +791 -0
  34. package/pi-extension/src/{utils.ts → output-router/utils.ts} +80 -18
  35. package/pi-extension/src/runtime/runtime-context.ts +895 -0
  36. package/pi-extension/src/settings/settings-tui.ts +408 -0
  37. package/pi-extension/src/settings/settings-ui.ts +1730 -0
  38. package/pi-extension/tests/integration/pi-extension.test.js +4018 -0
  39. package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
  40. package/pi-extension/tests/output-router/search.test.js +722 -0
  41. package/pi-extension/tests/settings/settings-tui.test.js +243 -0
  42. package/router/dist/benchmarks/benchmark-harness.d.ts +16 -13
  43. package/router/dist/benchmarks/benchmark-harness.js +62 -62
  44. package/router/dist/benchmarks/benchmarks.d.ts +80 -73
  45. package/router/dist/benchmarks/benchmarks.js +860 -761
  46. package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +71 -67
  47. package/router/dist/benchmarks/codex-qa-benchmarks.js +429 -390
  48. package/router/dist/benchmarks/command-benchmarks.d.ts +107 -92
  49. package/router/dist/benchmarks/command-benchmarks.js +616 -571
  50. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +64 -56
  51. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +679 -613
  52. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +103 -95
  53. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1188 -1103
  54. package/router/dist/benchmarks/context-saving-baseline.d.ts +47 -41
  55. package/router/dist/benchmarks/context-saving-baseline.js +405 -374
  56. package/router/dist/benchmarks/index-benchmarks.d.ts +74 -69
  57. package/router/dist/benchmarks/index-benchmarks.js +761 -661
  58. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +80 -69
  59. package/router/dist/benchmarks/storage-policy-benchmarks.js +549 -469
  60. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +43 -34
  61. package/router/dist/benchmarks/vault-index-benchmarks.js +294 -229
  62. package/router/dist/config/config.d.ts +61 -54
  63. package/router/dist/config/config.js +551 -372
  64. package/router/dist/config/router-contract.d.ts +2 -2
  65. package/router/dist/config/router-contract.js +38 -38
  66. package/router/dist/config/schema.d.ts +19 -10
  67. package/router/dist/config/schema.js +586 -538
  68. package/router/dist/config/types.d.ts +413 -361
  69. package/router/dist/config/types.js +19 -8
  70. package/router/dist/evidence/bounded-evidence.d.ts +26 -26
  71. package/router/dist/evidence/bounded-evidence.js +265 -252
  72. package/router/dist/evidence/evidence-range-selector.d.ts +16 -14
  73. package/router/dist/evidence/evidence-range-selector.js +192 -191
  74. package/router/dist/evidence/evidence-search.d.ts +18 -16
  75. package/router/dist/evidence/evidence-search.js +401 -377
  76. package/router/dist/evidence/evidence.d.ts +17 -17
  77. package/router/dist/evidence/evidence.js +163 -159
  78. package/router/dist/evidence/failure-contracts.d.ts +25 -15
  79. package/router/dist/evidence/failure-contracts.js +132 -126
  80. package/router/dist/evidence/line-ranges.d.ts +17 -15
  81. package/router/dist/evidence/line-ranges.js +18 -18
  82. package/router/dist/experiments/local-index.d.ts +47 -41
  83. package/router/dist/experiments/local-index.js +477 -458
  84. package/router/dist/local/local-traversal.d.ts +18 -0
  85. package/router/dist/local/local-traversal.js +334 -0
  86. package/router/dist/processing/engine.d.ts +94 -70
  87. package/router/dist/processing/engine.js +462 -364
  88. package/router/dist/processing/reducers.d.ts +208 -194
  89. package/router/dist/processing/reducers.js +1434 -1256
  90. package/router/dist/processing/renderers.d.ts +24 -18
  91. package/router/dist/processing/renderers.js +161 -152
  92. package/router/dist/processing/scripts.d.ts +80 -67
  93. package/router/dist/processing/scripts.js +343 -290
  94. package/router/dist/repo/repo-traversal.d.ts +9 -9
  95. package/router/dist/repo/repo-traversal.js +205 -202
  96. package/router/dist/routing/observed-reducers.d.ts +25 -19
  97. package/router/dist/routing/observed-reducers.js +559 -545
  98. package/router/dist/routing/observed-routing.d.ts +23 -14
  99. package/router/dist/routing/observed-routing.js +319 -318
  100. package/router/dist/routing/parsers.d.ts +10 -10
  101. package/router/dist/routing/parsers.js +454 -406
  102. package/router/dist/routing/run-filters.d.ts +45 -41
  103. package/router/dist/routing/run-filters.js +215 -207
  104. package/router/dist/routing/run-reducers.d.ts +45 -26
  105. package/router/dist/routing/run-reducers.js +102 -90
  106. package/router/dist/sandbox/adapter-roots.d.ts +34 -26
  107. package/router/dist/sandbox/adapter-roots.js +43 -41
  108. package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -5
  109. package/router/dist/sandbox/eryx-python-adapter.js +659 -588
  110. package/router/dist/sandbox/jq-wasm-adapter.d.ts +3 -3
  111. package/router/dist/sandbox/jq-wasm-adapter.js +319 -311
  112. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -5
  113. package/router/dist/sandbox/quickjs-wasi-adapter.js +336 -333
  114. package/router/dist/sandbox/script-sandbox.d.ts +105 -84
  115. package/router/dist/sandbox/script-sandbox.js +294 -260
  116. package/router/dist/setup/script-transform-adapters.d.ts +23 -19
  117. package/router/dist/setup/script-transform-adapters.js +223 -204
  118. package/router/dist/tools/batch.d.ts +27 -16
  119. package/router/dist/tools/batch.js +493 -416
  120. package/router/dist/tools/run.d.ts +47 -35
  121. package/router/dist/tools/run.js +1171 -1086
  122. package/router/dist/tools/search.d.ts +53 -31
  123. package/router/dist/tools/search.js +1224 -1065
  124. package/router/dist/transform/engine.d.ts +121 -96
  125. package/router/dist/transform/engine.js +1853 -1736
  126. package/router/dist/vault/vault-index.d.ts +97 -78
  127. package/router/dist/vault/vault-index.js +347 -342
  128. package/router/dist/vault/vault.d.ts +109 -74
  129. package/router/dist/vault/vault.js +528 -533
  130. package/runtime/interaction-contract.md +16 -0
  131. package/skills/bypass/SKILL.md +52 -38
  132. package/skills/commit-work/SKILL.md +54 -46
  133. package/skills/commit-work/references/staging-decisions.md +46 -24
  134. package/skills/decision-gate/SKILL.md +48 -0
  135. package/skills/design-for-depth/SKILL.md +75 -59
  136. package/skills/design-for-depth/references/design-pressure-signals.md +56 -7
  137. package/skills/design-for-depth/references/interface-design-loop.md +156 -0
  138. package/skills/design-for-depth/references/software-design-philosophy.md +32 -3
  139. package/skills/diagnose-failure/SKILL.md +65 -60
  140. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
  141. package/skills/diagnose-failure/references/flaky-and-performance.md +30 -18
  142. package/skills/discuss/SKILL.md +121 -0
  143. package/skills/discuss/references/checkpoints.md +66 -0
  144. package/skills/evaluate-skill/SKILL.md +62 -53
  145. package/skills/evaluate-skill/references/definition-schema.md +345 -0
  146. package/skills/evaluate-skill/references/evaluation-design.md +86 -0
  147. package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
  148. package/skills/evaluate-skill/references/review-and-revision.md +51 -0
  149. package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
  150. package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
  151. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
  152. package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
  153. package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
  154. package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
  155. package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
  156. package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
  157. package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
  158. package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
  159. package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
  160. package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
  161. package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
  162. package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
  163. package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
  164. package/skills/execute-work/SKILL.md +99 -0
  165. package/skills/execute-work/references/code-practices.md +78 -0
  166. package/skills/execute-work/references/execution-loop.md +77 -0
  167. package/skills/finish-branch/SKILL.md +117 -0
  168. package/skills/finish-branch/references/integration-options.md +80 -0
  169. package/skills/handoff/SKILL.md +65 -39
  170. package/skills/handoff/references/templates.md +104 -27
  171. package/skills/launch-work/SKILL.md +116 -0
  172. package/skills/launch-work/references/launch-readiness.md +85 -0
  173. package/skills/migration-work/SKILL.md +115 -0
  174. package/skills/migration-work/references/migration-lifecycle.md +82 -0
  175. package/skills/mode-contract/SKILL.md +50 -52
  176. package/skills/output-router/SKILL.md +21 -17
  177. package/skills/output-router/references/safety-policy.md +1 -1
  178. package/skills/release-work/SKILL.md +118 -0
  179. package/skills/release-work/references/release-evidence.md +78 -0
  180. package/skills/review-artifact/SKILL.md +77 -69
  181. package/skills/review-artifact/references/reviewer-prompt.md +133 -42
  182. package/skills/review-work/SKILL.md +82 -57
  183. package/skills/review-work/references/reviewer-prompt.md +97 -60
  184. package/skills/review-work/references/security-risk-lens.md +67 -0
  185. package/skills/setup-freeflow/SKILL.md +58 -66
  186. package/skills/setup-freeflow/references/activation-contract.md +89 -69
  187. package/skills/setup-freeflow/references/host-setup.md +54 -17
  188. package/skills/setup-freeflow/references/output-router-setup.md +62 -54
  189. package/skills/simplify-code/SKILL.md +80 -0
  190. package/skills/simplify-code/references/simplification-patterns.md +70 -0
  191. package/skills/tdd/SKILL.md +96 -0
  192. package/skills/tdd/references/test-design.md +96 -0
  193. package/skills/track-work/SKILL.md +84 -0
  194. package/skills/track-work/references/working-record-schema.md +378 -0
  195. package/skills/verify-work/SKILL.md +59 -38
  196. package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
  197. package/skills/verify-work/references/integration-evidence.md +51 -0
  198. package/skills/verify-work/references/performance-evidence.md +57 -0
  199. package/skills/workflow/SKILL.md +53 -59
  200. package/skills/workflow/references/domain-skill-composition.md +57 -0
  201. package/skills/workflow/references/workflow-loop.md +92 -0
  202. package/skills/write-plan/SKILL.md +85 -58
  203. package/skills/write-plan/references/plan-shapes.md +132 -46
  204. package/skills/write-skill/SKILL.md +82 -51
  205. package/skills/write-skill/references/activation-boundaries.md +62 -0
  206. package/skills/write-skill/references/agent-first-instructions.md +87 -0
  207. package/skills/write-skill/references/progressive-disclosure.md +63 -0
  208. package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
  209. package/skills/write-skill/scripts/skill-author.mjs +104 -0
  210. package/skills/write-spec/SKILL.md +65 -54
  211. package/skills/write-spec/references/artifact-standards.md +60 -41
  212. package/skills/write-spec/references/decision-records.md +77 -0
  213. package/skills/write-spec/references/spec-shapes.md +119 -60
  214. package/evals/README.md +0 -32
  215. package/evals/fixtures/copy-conventions.md +0 -31
  216. package/evals/fixtures/output-router/README.md +0 -12
  217. package/evals/fixtures/output-router/failed-command-output.txt +0 -9
  218. package/evals/fixtures/output-router/large-router-manual.md +0 -63
  219. package/evals/fixtures/output-router/native-large-output.txt +0 -40
  220. package/evals/fixtures/output-router/noisy-test-output.txt +0 -30
  221. package/evals/fixtures/output-router/verification-output.txt +0 -8
  222. package/evals/fixtures/tiny-artifact-review-app/README.md +0 -5
  223. package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +0 -10
  224. package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +0 -21
  225. package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +0 -24
  226. package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +0 -17
  227. package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +0 -8
  228. package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +0 -15
  229. package/evals/fixtures/tiny-commit-ambiguous-app/README.md +0 -3
  230. package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +0 -5
  231. package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +0 -1
  232. package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +0 -5
  233. package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +0 -14
  234. package/evals/fixtures/tiny-commit-app/README.md +0 -3
  235. package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +0 -5
  236. package/evals/fixtures/tiny-commit-app/src/billing.ts +0 -5
  237. package/evals/fixtures/tiny-commit-app/src/settings-page.ts +0 -1
  238. package/evals/fixtures/tiny-commit-app/tests/settings.test.md +0 -5
  239. package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +0 -15
  240. package/evals/fixtures/tiny-commit-everything-app/README.md +0 -3
  241. package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +0 -5
  242. package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +0 -5
  243. package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +0 -1
  244. package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +0 -5
  245. package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +0 -15
  246. package/evals/fixtures/tiny-commit-staged-app/README.md +0 -3
  247. package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +0 -5
  248. package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +0 -5
  249. package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +0 -1
  250. package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +0 -5
  251. package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +0 -15
  252. package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +0 -3
  253. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +0 -3
  254. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +0 -3
  255. package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +0 -5
  256. package/evals/fixtures/tiny-dashboard-stale-app/README.md +0 -11
  257. package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +0 -13
  258. package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +0 -19
  259. package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +0 -9
  260. package/evals/fixtures/tiny-decision-destination-app/README.md +0 -6
  261. package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +0 -8
  262. package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +0 -4
  263. package/evals/fixtures/tiny-design-depth-app/README.md +0 -15
  264. package/evals/fixtures/tiny-design-depth-app/src/routes.ts +0 -25
  265. package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +0 -3
  266. package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +0 -3
  267. package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +0 -3
  268. package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +0 -12
  269. package/evals/fixtures/tiny-eval-method-app/README.md +0 -8
  270. package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +0 -5
  271. package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +0 -17
  272. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +0 -11
  273. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +0 -3
  274. package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +0 -10
  275. package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +0 -10
  276. package/evals/fixtures/tiny-execute-plan-app/README.md +0 -5
  277. package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +0 -5
  278. package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +0 -10
  279. package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +0 -11
  280. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +0 -12
  281. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +0 -15
  282. package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +0 -9
  283. package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +0 -9
  284. package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +0 -9
  285. package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +0 -7
  286. package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +0 -1
  287. package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +0 -7
  288. package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +0 -5
  289. package/evals/fixtures/tiny-execute-review-loop-app/README.md +0 -5
  290. package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +0 -9
  291. package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +0 -12
  292. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +0 -15
  293. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +0 -11
  294. package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +0 -9
  295. package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +0 -7
  296. package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +0 -1
  297. package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +0 -7
  298. package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +0 -5
  299. package/evals/fixtures/tiny-flaky-session-app/README.md +0 -10
  300. package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +0 -13
  301. package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +0 -8
  302. package/evals/fixtures/tiny-handoff-app/README.md +0 -5
  303. package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +0 -10
  304. package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +0 -8
  305. package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +0 -11
  306. package/evals/fixtures/tiny-handoff-app/src/billing.ts +0 -7
  307. package/evals/fixtures/tiny-handoff-report-app/README.md +0 -3
  308. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +0 -1
  309. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +0 -1
  310. package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +0 -4
  311. package/evals/fixtures/tiny-plan-app/README.md +0 -5
  312. package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +0 -10
  313. package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +0 -25
  314. package/evals/fixtures/tiny-plan-app/src/billing.ts +0 -17
  315. package/evals/fixtures/tiny-plan-app/src/settings-page.ts +0 -1
  316. package/evals/fixtures/tiny-plan-app/tests/billing.test.md +0 -8
  317. package/evals/fixtures/tiny-plan-app/tests/settings.test.md +0 -5
  318. package/evals/fixtures/tiny-plan-strict-api-app/README.md +0 -3
  319. package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +0 -5
  320. package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +0 -25
  321. package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +0 -5
  322. package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +0 -3
  323. package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +0 -8
  324. package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +0 -3
  325. package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +0 -15
  326. package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +0 -16
  327. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +0 -15
  328. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +0 -10
  329. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +0 -15
  330. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +0 -12
  331. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +0 -20
  332. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +0 -1
  333. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +0 -1
  334. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +0 -8
  335. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +0 -8
  336. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +0 -7
  337. package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +0 -15
  338. package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +0 -16
  339. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +0 -15
  340. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +0 -10
  341. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +0 -15
  342. package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +0 -12
  343. package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +0 -20
  344. package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +0 -1
  345. package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +0 -1
  346. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +0 -8
  347. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +0 -8
  348. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +0 -7
  349. package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +0 -3
  350. package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +0 -15
  351. package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +0 -16
  352. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +0 -15
  353. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +0 -10
  354. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +0 -15
  355. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +0 -12
  356. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +0 -20
  357. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +0 -1
  358. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +0 -1
  359. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +0 -8
  360. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +0 -8
  361. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +0 -7
  362. package/evals/fixtures/tiny-report-performance-app/README.md +0 -11
  363. package/evals/fixtures/tiny-report-performance-app/docs/performance.md +0 -10
  364. package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +0 -29
  365. package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +0 -8
  366. package/evals/fixtures/tiny-review-request-app/README.md +0 -3
  367. package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +0 -5
  368. package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +0 -19
  369. package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +0 -20
  370. package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +0 -25
  371. package/evals/fixtures/tiny-review-request-app/src/billing.ts +0 -11
  372. package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +0 -19
  373. package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +0 -8
  374. package/evals/fixtures/tiny-review-work-app/README.md +0 -5
  375. package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +0 -9
  376. package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +0 -12
  377. package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +0 -15
  378. package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +0 -9
  379. package/evals/fixtures/tiny-review-work-app/src/billing.ts +0 -7
  380. package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +0 -1
  381. package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +0 -7
  382. package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +0 -5
  383. package/evals/fixtures/tiny-saas-app/README.md +0 -16
  384. package/evals/fixtures/tiny-saas-app/docs/auth-review.md +0 -15
  385. package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +0 -10
  386. package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +0 -15
  387. package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +0 -13
  388. package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +0 -12
  389. package/evals/fixtures/tiny-saas-app/src/billing.ts +0 -20
  390. package/evals/fixtures/tiny-saas-app/src/login-copy.ts +0 -1
  391. package/evals/fixtures/tiny-saas-app/src/settings-page.ts +0 -1
  392. package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +0 -8
  393. package/evals/fixtures/tiny-saas-app/tests/billing.test.md +0 -8
  394. package/evals/fixtures/tiny-saas-app/tests/copy.test.md +0 -7
  395. package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +0 -6
  396. package/evals/fixtures/tiny-setup-both-app/AGENTS.md +0 -5
  397. package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +0 -5
  398. package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +0 -6
  399. package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +0 -5
  400. package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +0 -6
  401. package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +0 -6
  402. package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +0 -14
  403. package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +0 -6
  404. package/evals/fixtures/tiny-skill-dev-app/README.md +0 -10
  405. package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +0 -8
  406. package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +0 -17
  407. package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +0 -13
  408. package/evals/fixtures/tiny-team-app/README.md +0 -5
  409. package/evals/fixtures/tiny-team-app/docs/product.md +0 -6
  410. package/evals/fixtures/tiny-team-app/src/teams.ts +0 -9
  411. package/evals/fixtures/tiny-team-app/src/users.ts +0 -5
  412. package/evals/fixtures/tiny-team-app/tests/teams.test.md +0 -7
  413. package/evals/fixtures/tiny-verify-app/README.md +0 -5
  414. package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +0 -1
  415. package/evals/fixtures/tiny-verify-app/src/settings-page.ts +0 -1
  416. package/evals/fixtures/tiny-verify-app/tests/settings.test.md +0 -7
  417. package/evals/prompts/aon-001.txt +0 -2
  418. package/evals/prompts/byp-001.txt +0 -2
  419. package/evals/prompts/byp-002.txt +0 -2
  420. package/evals/prompts/cap-001.txt +0 -3
  421. package/evals/prompts/cap-002.txt +0 -3
  422. package/evals/prompts/cmd-001.txt +0 -3
  423. package/evals/prompts/cmd-002.txt +0 -3
  424. package/evals/prompts/cmd-003.txt +0 -6
  425. package/evals/prompts/cmd-004.txt +0 -5
  426. package/evals/prompts/cmd-005.txt +0 -5
  427. package/evals/prompts/cmd-006.txt +0 -5
  428. package/evals/prompts/cmd-007.txt +0 -5
  429. package/evals/prompts/cmd-008.txt +0 -5
  430. package/evals/prompts/cmd-009.txt +0 -8
  431. package/evals/prompts/cmd-010.txt +0 -5
  432. package/evals/prompts/cmd-011.txt +0 -5
  433. package/evals/prompts/cmd-012.txt +0 -5
  434. package/evals/prompts/cmd-013.txt +0 -5
  435. package/evals/prompts/cmd-014.txt +0 -7
  436. package/evals/prompts/cmd-015.txt +0 -7
  437. package/evals/prompts/cmd-016.txt +0 -5
  438. package/evals/prompts/cmt-001.txt +0 -1
  439. package/evals/prompts/cmt-002.txt +0 -1
  440. package/evals/prompts/cmt-003.txt +0 -1
  441. package/evals/prompts/cmt-004.txt +0 -1
  442. package/evals/prompts/cmt-005.txt +0 -1
  443. package/evals/prompts/dfd-001.txt +0 -3
  444. package/evals/prompts/dia-001.txt +0 -3
  445. package/evals/prompts/dia-002.txt +0 -3
  446. package/evals/prompts/dia-003.txt +0 -3
  447. package/evals/prompts/dis-001.txt +0 -5
  448. package/evals/prompts/dis-002.txt +0 -5
  449. package/evals/prompts/esk-001.txt +0 -5
  450. package/evals/prompts/esk-002.txt +0 -5
  451. package/evals/prompts/esk-003.txt +0 -5
  452. package/evals/prompts/grc-001.txt +0 -3
  453. package/evals/prompts/hof-001.txt +0 -3
  454. package/evals/prompts/hof-002.txt +0 -1
  455. package/evals/prompts/hof-003.txt +0 -1
  456. package/evals/prompts/hof-004.txt +0 -1
  457. package/evals/prompts/hof-005.txt +0 -1
  458. package/evals/prompts/ivg-001.txt +0 -1
  459. package/evals/prompts/ivg-002.txt +0 -11
  460. package/evals/prompts/ivg-003.txt +0 -1
  461. package/evals/prompts/ivg-004.txt +0 -1
  462. package/evals/prompts/mode-001.txt +0 -3
  463. package/evals/prompts/mode-002.txt +0 -1
  464. package/evals/prompts/mode-003.txt +0 -3
  465. package/evals/prompts/mode-004.txt +0 -3
  466. package/evals/prompts/mode-005.txt +0 -3
  467. package/evals/prompts/mode-006.txt +0 -3
  468. package/evals/prompts/mode-007.txt +0 -3
  469. package/evals/prompts/otr-001.txt +0 -3
  470. package/evals/prompts/otr-002.txt +0 -3
  471. package/evals/prompts/rar-001.txt +0 -5
  472. package/evals/prompts/rar-002.txt +0 -3
  473. package/evals/prompts/rar-003.txt +0 -6
  474. package/evals/prompts/rar-004.txt +0 -15
  475. package/evals/prompts/rar-005.txt +0 -10
  476. package/evals/prompts/rbr-001.txt +0 -3
  477. package/evals/prompts/rbr-002.txt +0 -3
  478. package/evals/prompts/rbr-003.txt +0 -7
  479. package/evals/prompts/rev-001.txt +0 -3
  480. package/evals/prompts/rev-002.txt +0 -5
  481. package/evals/prompts/rev-003.txt +0 -6
  482. package/evals/prompts/rev-004.txt +0 -1
  483. package/evals/prompts/rev-005.txt +0 -15
  484. package/evals/prompts/rev-006.txt +0 -5
  485. package/evals/prompts/stp-001.txt +0 -1
  486. package/evals/prompts/stp-002.txt +0 -1
  487. package/evals/prompts/stp-003.txt +0 -1
  488. package/evals/prompts/stp-004.txt +0 -1
  489. package/evals/prompts/stp-005.txt +0 -1
  490. package/evals/prompts/stp-006.txt +0 -1
  491. package/evals/prompts/stp-007.txt +0 -1
  492. package/evals/prompts/stp-008.txt +0 -1
  493. package/evals/prompts/stp-009.txt +0 -1
  494. package/evals/prompts/stp-010.txt +0 -1
  495. package/evals/prompts/stp-011.txt +0 -1
  496. package/evals/prompts/vfy-003.txt +0 -1
  497. package/evals/prompts/wpl-001.txt +0 -3
  498. package/evals/prompts/wpl-002.txt +0 -5
  499. package/evals/prompts/wpl-003.txt +0 -3
  500. package/evals/prompts/wpl-004.txt +0 -5
  501. package/evals/prompts/wpl-005.txt +0 -1
  502. package/evals/prompts/wrc-001.txt +0 -10
  503. package/evals/prompts/wrc-002.txt +0 -3
  504. package/evals/prompts/wsk-001.txt +0 -6
  505. package/evals/prompts/wsp-001.txt +0 -5
  506. package/evals/prompts/wsp-002.txt +0 -15
  507. package/evals/prompts/wsp-003.txt +0 -3
  508. package/evals/prompts/wsp-004.txt +0 -15
  509. package/evals/prompts/wsp-005.txt +0 -5
  510. package/evals/prompts/wsp-006.txt +0 -12
  511. package/evals/prompts/wsp-007.txt +0 -9
  512. package/evals/prompts/wsp-008.txt +0 -13
  513. package/evals/prompts/xpl-001.txt +0 -1
  514. package/evals/prompts/xpl-002.txt +0 -3
  515. package/evals/prompts/xpl-003.txt +0 -3
  516. package/evals/prompts/xpl-004.txt +0 -3
  517. package/evals/prompts/xpl-005.txt +0 -5
  518. package/evals/prompts/xpl-006.txt +0 -3
  519. package/evals/registries/adversarial-evals.json +0 -39
  520. package/evals/registries/fixture-evals.json +0 -2513
  521. package/evals/registries/handoff-evals.json +0 -74
  522. package/evals/registries/legacy-evals.json +0 -147
  523. package/evals/registries/skill-evidence.json +0 -193
  524. package/evals/registries/verify-work-evals.json +0 -46
  525. package/evals/reports/acceptance/v0.1-acceptance-report.md +0 -130
  526. package/evals/reports/by-command-surface/command-surface-1-report.md +0 -45
  527. package/evals/reports/by-command-surface/command-surface-10-report.md +0 -76
  528. package/evals/reports/by-command-surface/command-surface-11-report.md +0 -77
  529. package/evals/reports/by-command-surface/command-surface-12-report.md +0 -91
  530. package/evals/reports/by-command-surface/command-surface-13-report.md +0 -64
  531. package/evals/reports/by-command-surface/command-surface-14-report.md +0 -66
  532. package/evals/reports/by-command-surface/command-surface-15-report.md +0 -124
  533. package/evals/reports/by-command-surface/command-surface-16-report.md +0 -39
  534. package/evals/reports/by-command-surface/command-surface-2-report.md +0 -80
  535. package/evals/reports/by-command-surface/command-surface-3-report.md +0 -86
  536. package/evals/reports/by-command-surface/command-surface-4-report.md +0 -76
  537. package/evals/reports/by-command-surface/command-surface-5-report.md +0 -80
  538. package/evals/reports/by-command-surface/command-surface-6-report.md +0 -74
  539. package/evals/reports/by-command-surface/command-surface-7-report.md +0 -84
  540. package/evals/reports/by-command-surface/command-surface-8-report.md +0 -79
  541. package/evals/reports/by-command-surface/command-surface-9-report.md +0 -79
  542. package/evals/reports/by-command-surface/command-surface-matrix.md +0 -91
  543. package/evals/reports/by-skill/bypass-1-report.md +0 -124
  544. package/evals/reports/by-skill/capture-decisions-1-report.md +0 -99
  545. package/evals/reports/by-skill/capture-decisions-2-report.md +0 -102
  546. package/evals/reports/by-skill/commit-work-1-report.md +0 -165
  547. package/evals/reports/by-skill/commit-work-2-report.md +0 -109
  548. package/evals/reports/by-skill/design-for-depth-1-report.md +0 -95
  549. package/evals/reports/by-skill/diagnose-failure-1-report.md +0 -91
  550. package/evals/reports/by-skill/diagnose-failure-2-report.md +0 -94
  551. package/evals/reports/by-skill/discover-1-report.md +0 -118
  552. package/evals/reports/by-skill/evaluate-skill-2-report.md +0 -71
  553. package/evals/reports/by-skill/execute-plan-1-report.md +0 -103
  554. package/evals/reports/by-skill/execute-plan-2-report.md +0 -112
  555. package/evals/reports/by-skill/execute-plan-3-report.md +0 -87
  556. package/evals/reports/by-skill/grill-context-1-report.md +0 -103
  557. package/evals/reports/by-skill/handoff-1-report.md +0 -123
  558. package/evals/reports/by-skill/handoff-2-report.md +0 -105
  559. package/evals/reports/by-skill/handoff-3-report.md +0 -100
  560. package/evals/reports/by-skill/handoff-7-report.md +0 -77
  561. package/evals/reports/by-skill/interview-gate-1-report.md +0 -63
  562. package/evals/reports/by-skill/interview-gate-2-report.md +0 -105
  563. package/evals/reports/by-skill/mode-contract-1-report.md +0 -74
  564. package/evals/reports/by-skill/mode-contract-2-report.md +0 -87
  565. package/evals/reports/by-skill/mode-contract-3-report.md +0 -65
  566. package/evals/reports/by-skill/mode-contract-4-report.md +0 -71
  567. package/evals/reports/by-skill/mode-contract-5-report.md +0 -70
  568. package/evals/reports/by-skill/output-router-1-report.md +0 -76
  569. package/evals/reports/by-skill/output-router-2-report.md +0 -65
  570. package/evals/reports/by-skill/research-1-report.md +0 -144
  571. package/evals/reports/by-skill/research-brief-1-report.md +0 -94
  572. package/evals/reports/by-skill/research-brief-2-report.md +0 -75
  573. package/evals/reports/by-skill/review-artifact-1-report.md +0 -91
  574. package/evals/reports/by-skill/review-artifact-2-report.md +0 -79
  575. package/evals/reports/by-skill/review-artifact-3-report.md +0 -120
  576. package/evals/reports/by-skill/review-artifact-4-report.md +0 -89
  577. package/evals/reports/by-skill/review-artifact-5-report.md +0 -66
  578. package/evals/reports/by-skill/review-work-1-report.md +0 -85
  579. package/evals/reports/by-skill/review-work-2-report.md +0 -87
  580. package/evals/reports/by-skill/review-work-3-report.md +0 -104
  581. package/evals/reports/by-skill/review-work-4-report.md +0 -108
  582. package/evals/reports/by-skill/review-work-5-report.md +0 -73
  583. package/evals/reports/by-skill/review-work-6-report.md +0 -66
  584. package/evals/reports/by-skill/setup-freeflow-1-report.md +0 -199
  585. package/evals/reports/by-skill/setup-freeflow-2-report.md +0 -105
  586. package/evals/reports/by-skill/setup-freeflow-3-report.md +0 -105
  587. package/evals/reports/by-skill/setup-freeflow-4-report.md +0 -88
  588. package/evals/reports/by-skill/setup-freeflow-5-report.md +0 -115
  589. package/evals/reports/by-skill/skill-authoring-1-report.md +0 -81
  590. package/evals/reports/by-skill/verify-work-1-report.md +0 -111
  591. package/evals/reports/by-skill/verify-work-2-report.md +0 -120
  592. package/evals/reports/by-skill/workflow-1-report.md +0 -65
  593. package/evals/reports/by-skill/write-plan-1-report.md +0 -123
  594. package/evals/reports/by-skill/write-plan-2-report.md +0 -98
  595. package/evals/reports/by-skill/write-plan-3-report.md +0 -110
  596. package/evals/reports/by-skill/write-spec-1-report.md +0 -88
  597. package/evals/reports/by-skill/write-spec-2-report.md +0 -89
  598. package/evals/reports/by-skill/write-spec-3-report.md +0 -90
  599. package/evals/reports/by-skill/write-spec-4-report.md +0 -167
  600. package/evals/reports/harness/claude-harness-1-report.md +0 -103
  601. package/evals/reports/harness/eval-harness-1-report.md +0 -91
  602. package/evals/reports/iterations/iteration-1-report.md +0 -71
  603. package/evals/reports/iterations/iteration-2-report.md +0 -78
  604. package/evals/reports/iterations/iteration-3-report.md +0 -118
  605. package/evals/reports/iterations/iteration-4-report.md +0 -131
  606. package/evals/reports/iterations/iteration-5-report.md +0 -149
  607. package/evals/reports/iterations/iteration-6-report.md +0 -136
  608. package/evals/reports/runtime/always-on-runtime-1-report.md +0 -107
  609. package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +0 -52
  610. package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +0 -410
  611. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +0 -203
  612. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +0 -51
  613. package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +0 -99
  614. package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +0 -166
  615. package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +0 -96
  616. package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +0 -151
  617. package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +0 -233
  618. package/evals/reports/runtime/jq-script-derive-execution-1-report.md +0 -215
  619. package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +0 -67
  620. package/evals/reports/runtime/output-router-benchmark-1-report.md +0 -81
  621. package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +0 -35
  622. package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +0 -150
  623. package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +0 -46
  624. package/evals/reports/runtime/output-router-command-benchmark-1-report.md +0 -62
  625. package/evals/reports/runtime/output-router-index-benchmark-1-report.md +0 -64
  626. package/evals/reports/runtime/output-router-regression-1-report.md +0 -81
  627. package/evals/reports/runtime/output-router-transform-eval-1-report.md +0 -28
  628. package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +0 -44
  629. package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +0 -159
  630. package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +0 -55
  631. package/evals/reports/runtime/render-format-row-protocol-1-report.md +0 -58
  632. package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +0 -84
  633. package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +0 -51
  634. package/evals/reports/runtime/storage-policy-benchmark-1-report.md +0 -176
  635. package/evals/reports/runtime/vault-index-storage-spike-1-report.md +0 -39
  636. package/evals/reports/runtime/workflow-context-hook-1-report.md +0 -82
  637. package/evals/runbooks/adversarial-eval-runbook.md +0 -28
  638. package/evals/runbooks/fixture-eval-runbook.md +0 -137
  639. package/evals/runbooks/handoff-eval-runbook.md +0 -22
  640. package/evals/runbooks/verify-work-eval-runbook.md +0 -27
  641. package/evals/scripts/audit-command-surface.sh +0 -160
  642. package/evals/scripts/check-activation-contract.sh +0 -121
  643. package/evals/scripts/check-runtime-context-hook.sh +0 -183
  644. package/evals/scripts/grade-fixture-eval.sh +0 -446
  645. package/evals/scripts/run-claude-fixture-eval.sh +0 -26
  646. package/evals/scripts/run-codex-fixture-eval.sh +0 -26
  647. package/evals/scripts/run-eryx-python-proof-spike.js +0 -559
  648. package/evals/scripts/run-fixture-eval-by-id.sh +0 -23
  649. package/evals/scripts/run-fixture-eval.sh +0 -464
  650. package/evals/scripts/run-jq-wasm-proof-spike.js +0 -299
  651. package/evals/scripts/run-output-router-transform-eval.js +0 -115
  652. package/evals/scripts/run-pi-observed-routing-eval.js +0 -478
  653. package/evals/scripts/run-quickjs-wasi-proof-spike.js +0 -339
  654. package/evals/scripts/skill-evidence.sh +0 -316
  655. package/evals/scripts/validate-release-metadata.sh +0 -486
  656. package/evals/suites/v0.1-acceptance-suite.md +0 -131
  657. package/pi-extension/dist/host-producer-identification.js +0 -186
  658. package/pi-extension/dist/mcp-config.js +0 -30
  659. package/pi-extension/dist/native-safety-net.js +0 -209
  660. package/pi-extension/dist/observed-tool-routing.js +0 -114
  661. package/pi-extension/dist/renderers.js +0 -835
  662. package/pi-extension/dist/router-tools.js +0 -438
  663. package/pi-extension/dist/runtime-context.js +0 -288
  664. package/pi-extension/dist/schemas.js +0 -254
  665. package/pi-extension/dist/status.js +0 -449
  666. package/pi-extension/dist/utils.js +0 -467
  667. package/pi-extension/src/runtime-context.ts +0 -347
  668. package/pi-extension/src/status.ts +0 -505
  669. package/plugin-docs/README.md +0 -40
  670. package/plugin-docs/adr/0001-three-modes.md +0 -27
  671. package/plugin-docs/adr/0002-evals-before-hooks.md +0 -17
  672. package/plugin-docs/adr/0003-release-boundary.md +0 -21
  673. package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +0 -26
  674. package/plugin-docs/adr/README.md +0 -10
  675. package/plugin-docs/architecture.md +0 -89
  676. package/plugin-docs/output-router.md +0 -396
  677. package/plugin-docs/release-evidence.md +0 -77
  678. package/plugin-docs/skills.md +0 -44
  679. package/plugin-docs/workflow.md +0 -57
  680. package/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
  681. package/skills/discover/ARTIFACT-DESTINATIONS.md +0 -58
  682. package/skills/discover/CHECKPOINTS.md +0 -74
  683. package/skills/discover/SKILL.md +0 -173
  684. package/skills/evaluate-skill/references/eval-patterns.md +0 -41
  685. package/skills/evaluate-skill/references/grading-priority.md +0 -33
  686. package/skills/execute-plan/SKILL.md +0 -133
  687. package/skills/execute-plan/references/execution-map.md +0 -122
  688. package/skills/interview-gate/SKILL.md +0 -90
  689. package/skills/workflow/references/workflow-map.md +0 -104
  690. /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
  }