@hassangameryt/freeflow 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +6 -2
  3. package/.codex-plugin/plugin.json +9 -9
  4. package/README.md +190 -127
  5. package/assets/feedback-loop.png +0 -0
  6. package/assets/freeflow_workflow_map.png +0 -0
  7. package/assets/workflow.png +0 -0
  8. package/{skills → capabilities}/output-router/SKILL.md +21 -17
  9. package/{skills → capabilities}/output-router/references/safety-policy.md +1 -1
  10. package/capabilities/output-router/references/setup.md +110 -0
  11. package/command-surface.json +62 -7
  12. package/hooks/freeflow-runtime-context.mjs +572 -154
  13. package/hooks/hooks.json +26 -1
  14. package/hooks/tests/check-runtime-context-hook.sh +375 -0
  15. package/package.json +24 -24
  16. package/pi-extension/dist/index.js +264 -80
  17. package/pi-extension/dist/integrations/mcp-config.js +29 -0
  18. package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
  19. package/pi-extension/dist/output-router/native-safety-net.js +216 -0
  20. package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
  21. package/pi-extension/dist/output-router/renderers.js +1023 -0
  22. package/pi-extension/dist/output-router/router-tools.js +554 -0
  23. package/pi-extension/dist/output-router/schemas.js +383 -0
  24. package/pi-extension/dist/output-router/status.js +744 -0
  25. package/pi-extension/dist/output-router/utils.js +502 -0
  26. package/pi-extension/dist/runtime/runtime-context.js +798 -0
  27. package/pi-extension/dist/settings/settings-tui.js +314 -0
  28. package/pi-extension/dist/settings/settings-ui.js +1487 -0
  29. package/pi-extension/freeflow/index.js +1 -0
  30. package/pi-extension/src/index.ts +230 -56
  31. package/pi-extension/src/{host-producer-identification.ts → output-router/host-producer-identification.ts} +37 -7
  32. package/pi-extension/src/{native-safety-net.ts → output-router/native-safety-net.ts} +8 -12
  33. package/pi-extension/src/{observed-tool-routing.ts → output-router/observed-tool-routing.ts} +19 -11
  34. package/pi-extension/src/{renderers.ts → output-router/renderers.ts} +246 -55
  35. package/pi-extension/src/{router-tools.ts → output-router/router-tools.ts} +130 -29
  36. package/pi-extension/src/{schemas.ts → output-router/schemas.ts} +171 -43
  37. package/pi-extension/src/output-router/status.ts +791 -0
  38. package/pi-extension/src/{utils.ts → output-router/utils.ts} +80 -18
  39. package/pi-extension/src/runtime/runtime-context.ts +895 -0
  40. package/pi-extension/src/settings/settings-tui.ts +408 -0
  41. package/pi-extension/src/settings/settings-ui.ts +1730 -0
  42. package/pi-extension/tests/integration/pi-extension.test.js +4020 -0
  43. package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
  44. package/pi-extension/tests/output-router/search.test.js +722 -0
  45. package/pi-extension/tests/settings/settings-tui.test.js +243 -0
  46. package/router/dist/benchmarks/benchmark-harness.d.ts +16 -13
  47. package/router/dist/benchmarks/benchmark-harness.js +62 -62
  48. package/router/dist/benchmarks/benchmarks.d.ts +80 -73
  49. package/router/dist/benchmarks/benchmarks.js +860 -761
  50. package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +71 -67
  51. package/router/dist/benchmarks/codex-qa-benchmarks.js +429 -390
  52. package/router/dist/benchmarks/command-benchmarks.d.ts +107 -92
  53. package/router/dist/benchmarks/command-benchmarks.js +616 -571
  54. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +64 -56
  55. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +679 -613
  56. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +103 -95
  57. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1188 -1103
  58. package/router/dist/benchmarks/context-saving-baseline.d.ts +47 -41
  59. package/router/dist/benchmarks/context-saving-baseline.js +405 -374
  60. package/router/dist/benchmarks/index-benchmarks.d.ts +74 -69
  61. package/router/dist/benchmarks/index-benchmarks.js +761 -661
  62. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +80 -69
  63. package/router/dist/benchmarks/storage-policy-benchmarks.js +549 -469
  64. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +43 -34
  65. package/router/dist/benchmarks/vault-index-benchmarks.js +294 -229
  66. package/router/dist/config/config.d.ts +62 -55
  67. package/router/dist/config/config.js +552 -373
  68. package/router/dist/config/router-contract.d.ts +2 -2
  69. package/router/dist/config/router-contract.js +38 -38
  70. package/router/dist/config/schema.d.ts +19 -10
  71. package/router/dist/config/schema.js +586 -538
  72. package/router/dist/config/types.d.ts +413 -361
  73. package/router/dist/config/types.js +19 -8
  74. package/router/dist/evidence/bounded-evidence.d.ts +26 -26
  75. package/router/dist/evidence/bounded-evidence.js +265 -252
  76. package/router/dist/evidence/evidence-range-selector.d.ts +16 -14
  77. package/router/dist/evidence/evidence-range-selector.js +192 -191
  78. package/router/dist/evidence/evidence-search.d.ts +18 -16
  79. package/router/dist/evidence/evidence-search.js +401 -377
  80. package/router/dist/evidence/evidence.d.ts +17 -17
  81. package/router/dist/evidence/evidence.js +163 -159
  82. package/router/dist/evidence/failure-contracts.d.ts +25 -15
  83. package/router/dist/evidence/failure-contracts.js +132 -126
  84. package/router/dist/evidence/line-ranges.d.ts +17 -15
  85. package/router/dist/evidence/line-ranges.js +18 -18
  86. package/router/dist/experiments/local-index.d.ts +47 -41
  87. package/router/dist/experiments/local-index.js +477 -458
  88. package/router/dist/local/local-traversal.d.ts +18 -0
  89. package/router/dist/local/local-traversal.js +334 -0
  90. package/router/dist/processing/engine.d.ts +94 -70
  91. package/router/dist/processing/engine.js +462 -364
  92. package/router/dist/processing/reducers.d.ts +208 -194
  93. package/router/dist/processing/reducers.js +1434 -1256
  94. package/router/dist/processing/renderers.d.ts +24 -18
  95. package/router/dist/processing/renderers.js +161 -152
  96. package/router/dist/processing/scripts.d.ts +80 -67
  97. package/router/dist/processing/scripts.js +343 -290
  98. package/router/dist/repo/repo-traversal.d.ts +9 -9
  99. package/router/dist/repo/repo-traversal.js +205 -202
  100. package/router/dist/routing/observed-reducers.d.ts +25 -19
  101. package/router/dist/routing/observed-reducers.js +559 -545
  102. package/router/dist/routing/observed-routing.d.ts +23 -14
  103. package/router/dist/routing/observed-routing.js +319 -318
  104. package/router/dist/routing/parsers.d.ts +10 -10
  105. package/router/dist/routing/parsers.js +454 -406
  106. package/router/dist/routing/run-filters.d.ts +45 -41
  107. package/router/dist/routing/run-filters.js +215 -207
  108. package/router/dist/routing/run-reducers.d.ts +45 -26
  109. package/router/dist/routing/run-reducers.js +102 -90
  110. package/router/dist/sandbox/adapter-roots.d.ts +34 -26
  111. package/router/dist/sandbox/adapter-roots.js +43 -41
  112. package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -5
  113. package/router/dist/sandbox/eryx-python-adapter.js +659 -588
  114. package/router/dist/sandbox/jq-wasm-adapter.d.ts +3 -3
  115. package/router/dist/sandbox/jq-wasm-adapter.js +319 -311
  116. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -5
  117. package/router/dist/sandbox/quickjs-wasi-adapter.js +336 -333
  118. package/router/dist/sandbox/script-sandbox.d.ts +105 -84
  119. package/router/dist/sandbox/script-sandbox.js +294 -260
  120. package/router/dist/setup/script-transform-adapters.d.ts +23 -19
  121. package/router/dist/setup/script-transform-adapters.js +223 -204
  122. package/router/dist/tools/batch.d.ts +27 -16
  123. package/router/dist/tools/batch.js +493 -416
  124. package/router/dist/tools/run.d.ts +47 -35
  125. package/router/dist/tools/run.js +1172 -1087
  126. package/router/dist/tools/search.d.ts +53 -31
  127. package/router/dist/tools/search.js +1224 -1065
  128. package/router/dist/transform/engine.d.ts +121 -96
  129. package/router/dist/transform/engine.js +1853 -1736
  130. package/router/dist/vault/vault-index.d.ts +97 -78
  131. package/router/dist/vault/vault-index.js +347 -342
  132. package/router/dist/vault/vault.d.ts +109 -74
  133. package/router/dist/vault/vault.js +528 -533
  134. package/runtime/interaction-contract.md +16 -0
  135. package/skills/bypass/SKILL.md +52 -38
  136. package/skills/commit-work/SKILL.md +54 -46
  137. package/skills/commit-work/references/staging-decisions.md +46 -24
  138. package/skills/decision-gate/SKILL.md +48 -0
  139. package/skills/design-for-depth/SKILL.md +75 -59
  140. package/skills/design-for-depth/references/design-pressure-signals.md +56 -7
  141. package/skills/design-for-depth/references/interface-design-loop.md +156 -0
  142. package/skills/design-for-depth/references/software-design-philosophy.md +32 -3
  143. package/skills/diagnose-failure/SKILL.md +65 -60
  144. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
  145. package/skills/diagnose-failure/references/flaky-and-performance.md +30 -18
  146. package/skills/discuss/SKILL.md +121 -0
  147. package/skills/discuss/references/checkpoints.md +66 -0
  148. package/skills/evaluate-skill/SKILL.md +62 -53
  149. package/skills/evaluate-skill/references/definition-schema.md +345 -0
  150. package/skills/evaluate-skill/references/evaluation-design.md +86 -0
  151. package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
  152. package/skills/evaluate-skill/references/review-and-revision.md +51 -0
  153. package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
  154. package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
  155. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
  156. package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
  157. package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
  158. package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
  159. package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
  160. package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
  161. package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
  162. package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
  163. package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
  164. package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
  165. package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
  166. package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
  167. package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
  168. package/skills/execute-work/SKILL.md +99 -0
  169. package/skills/execute-work/references/code-practices.md +78 -0
  170. package/skills/execute-work/references/execution-loop.md +77 -0
  171. package/skills/finish-branch/SKILL.md +117 -0
  172. package/skills/finish-branch/references/integration-options.md +80 -0
  173. package/skills/handoff/SKILL.md +65 -39
  174. package/skills/handoff/references/templates.md +104 -27
  175. package/skills/launch-work/SKILL.md +116 -0
  176. package/skills/launch-work/references/launch-readiness.md +85 -0
  177. package/skills/migration-work/SKILL.md +115 -0
  178. package/skills/migration-work/references/migration-lifecycle.md +82 -0
  179. package/skills/mode-contract/SKILL.md +72 -52
  180. package/skills/release-work/SKILL.md +118 -0
  181. package/skills/release-work/references/release-evidence.md +78 -0
  182. package/skills/review-artifact/SKILL.md +77 -69
  183. package/skills/review-artifact/references/reviewer-prompt.md +133 -42
  184. package/skills/review-work/SKILL.md +82 -57
  185. package/skills/review-work/references/reviewer-prompt.md +97 -60
  186. package/skills/review-work/references/security-risk-lens.md +67 -0
  187. package/skills/setup-freeflow/SKILL.md +54 -68
  188. package/skills/setup-freeflow/references/activation-contract.md +84 -69
  189. package/skills/setup-freeflow/references/host-setup.md +50 -17
  190. package/skills/simplify-code/SKILL.md +80 -0
  191. package/skills/simplify-code/references/simplification-patterns.md +70 -0
  192. package/skills/tdd/SKILL.md +96 -0
  193. package/skills/tdd/references/test-design.md +96 -0
  194. package/skills/track-work/SKILL.md +84 -0
  195. package/skills/track-work/references/working-record-schema.md +378 -0
  196. package/skills/verify-work/SKILL.md +59 -38
  197. package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
  198. package/skills/verify-work/references/integration-evidence.md +51 -0
  199. package/skills/verify-work/references/performance-evidence.md +57 -0
  200. package/skills/workflow/SKILL.md +53 -59
  201. package/skills/workflow/references/domain-skill-composition.md +57 -0
  202. package/skills/workflow/references/workflow-loop.md +92 -0
  203. package/skills/write-plan/SKILL.md +85 -58
  204. package/skills/write-plan/references/plan-shapes.md +132 -46
  205. package/skills/write-skill/SKILL.md +82 -51
  206. package/skills/write-skill/references/activation-boundaries.md +62 -0
  207. package/skills/write-skill/references/agent-first-instructions.md +87 -0
  208. package/skills/write-skill/references/progressive-disclosure.md +63 -0
  209. package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
  210. package/skills/write-skill/scripts/skill-author.mjs +104 -0
  211. package/skills/write-spec/SKILL.md +65 -54
  212. package/skills/write-spec/references/artifact-standards.md +60 -41
  213. package/skills/write-spec/references/decision-records.md +77 -0
  214. package/skills/write-spec/references/spec-shapes.md +119 -60
  215. package/evals/README.md +0 -32
  216. package/evals/fixtures/copy-conventions.md +0 -31
  217. package/evals/fixtures/output-router/README.md +0 -12
  218. package/evals/fixtures/output-router/failed-command-output.txt +0 -9
  219. package/evals/fixtures/output-router/large-router-manual.md +0 -63
  220. package/evals/fixtures/output-router/native-large-output.txt +0 -40
  221. package/evals/fixtures/output-router/noisy-test-output.txt +0 -30
  222. package/evals/fixtures/output-router/verification-output.txt +0 -8
  223. package/evals/fixtures/tiny-artifact-review-app/README.md +0 -5
  224. package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +0 -10
  225. package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +0 -21
  226. package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +0 -24
  227. package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +0 -17
  228. package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +0 -8
  229. package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +0 -15
  230. package/evals/fixtures/tiny-commit-ambiguous-app/README.md +0 -3
  231. package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +0 -5
  232. package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +0 -1
  233. package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +0 -5
  234. package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +0 -14
  235. package/evals/fixtures/tiny-commit-app/README.md +0 -3
  236. package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +0 -5
  237. package/evals/fixtures/tiny-commit-app/src/billing.ts +0 -5
  238. package/evals/fixtures/tiny-commit-app/src/settings-page.ts +0 -1
  239. package/evals/fixtures/tiny-commit-app/tests/settings.test.md +0 -5
  240. package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +0 -15
  241. package/evals/fixtures/tiny-commit-everything-app/README.md +0 -3
  242. package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +0 -5
  243. package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +0 -5
  244. package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +0 -1
  245. package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +0 -5
  246. package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +0 -15
  247. package/evals/fixtures/tiny-commit-staged-app/README.md +0 -3
  248. package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +0 -5
  249. package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +0 -5
  250. package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +0 -1
  251. package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +0 -5
  252. package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +0 -15
  253. package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +0 -3
  254. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +0 -3
  255. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +0 -3
  256. package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +0 -5
  257. package/evals/fixtures/tiny-dashboard-stale-app/README.md +0 -11
  258. package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +0 -13
  259. package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +0 -19
  260. package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +0 -9
  261. package/evals/fixtures/tiny-decision-destination-app/README.md +0 -6
  262. package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +0 -8
  263. package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +0 -4
  264. package/evals/fixtures/tiny-design-depth-app/README.md +0 -15
  265. package/evals/fixtures/tiny-design-depth-app/src/routes.ts +0 -25
  266. package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +0 -3
  267. package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +0 -3
  268. package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +0 -3
  269. package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +0 -12
  270. package/evals/fixtures/tiny-eval-method-app/README.md +0 -8
  271. package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +0 -5
  272. package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +0 -17
  273. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +0 -11
  274. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +0 -3
  275. package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +0 -10
  276. package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +0 -10
  277. package/evals/fixtures/tiny-execute-plan-app/README.md +0 -5
  278. package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +0 -5
  279. package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +0 -10
  280. package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +0 -11
  281. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +0 -12
  282. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +0 -15
  283. package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +0 -9
  284. package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +0 -9
  285. package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +0 -9
  286. package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +0 -7
  287. package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +0 -1
  288. package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +0 -7
  289. package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +0 -5
  290. package/evals/fixtures/tiny-execute-review-loop-app/README.md +0 -5
  291. package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +0 -9
  292. package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +0 -12
  293. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +0 -15
  294. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +0 -11
  295. package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +0 -9
  296. package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +0 -7
  297. package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +0 -1
  298. package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +0 -7
  299. package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +0 -5
  300. package/evals/fixtures/tiny-flaky-session-app/README.md +0 -10
  301. package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +0 -13
  302. package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +0 -8
  303. package/evals/fixtures/tiny-handoff-app/README.md +0 -5
  304. package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +0 -10
  305. package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +0 -8
  306. package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +0 -11
  307. package/evals/fixtures/tiny-handoff-app/src/billing.ts +0 -7
  308. package/evals/fixtures/tiny-handoff-report-app/README.md +0 -3
  309. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +0 -1
  310. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +0 -1
  311. package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +0 -4
  312. package/evals/fixtures/tiny-plan-app/README.md +0 -5
  313. package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +0 -10
  314. package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +0 -25
  315. package/evals/fixtures/tiny-plan-app/src/billing.ts +0 -17
  316. package/evals/fixtures/tiny-plan-app/src/settings-page.ts +0 -1
  317. package/evals/fixtures/tiny-plan-app/tests/billing.test.md +0 -8
  318. package/evals/fixtures/tiny-plan-app/tests/settings.test.md +0 -5
  319. package/evals/fixtures/tiny-plan-strict-api-app/README.md +0 -3
  320. package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +0 -5
  321. package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +0 -25
  322. package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +0 -5
  323. package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +0 -3
  324. package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +0 -8
  325. package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +0 -3
  326. package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +0 -15
  327. package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +0 -16
  328. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +0 -15
  329. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +0 -10
  330. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +0 -15
  331. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +0 -12
  332. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +0 -20
  333. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +0 -1
  334. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +0 -1
  335. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +0 -8
  336. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +0 -8
  337. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +0 -7
  338. package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +0 -15
  339. package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +0 -16
  340. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +0 -15
  341. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +0 -10
  342. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +0 -15
  343. package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +0 -12
  344. package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +0 -20
  345. package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +0 -1
  346. package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +0 -1
  347. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +0 -8
  348. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +0 -8
  349. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +0 -7
  350. package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +0 -3
  351. package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +0 -15
  352. package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +0 -16
  353. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +0 -15
  354. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +0 -10
  355. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +0 -15
  356. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +0 -12
  357. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +0 -20
  358. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +0 -1
  359. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +0 -1
  360. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +0 -8
  361. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +0 -8
  362. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +0 -7
  363. package/evals/fixtures/tiny-report-performance-app/README.md +0 -11
  364. package/evals/fixtures/tiny-report-performance-app/docs/performance.md +0 -10
  365. package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +0 -29
  366. package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +0 -8
  367. package/evals/fixtures/tiny-review-request-app/README.md +0 -3
  368. package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +0 -5
  369. package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +0 -19
  370. package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +0 -20
  371. package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +0 -25
  372. package/evals/fixtures/tiny-review-request-app/src/billing.ts +0 -11
  373. package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +0 -19
  374. package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +0 -8
  375. package/evals/fixtures/tiny-review-work-app/README.md +0 -5
  376. package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +0 -9
  377. package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +0 -12
  378. package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +0 -15
  379. package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +0 -9
  380. package/evals/fixtures/tiny-review-work-app/src/billing.ts +0 -7
  381. package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +0 -1
  382. package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +0 -7
  383. package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +0 -5
  384. package/evals/fixtures/tiny-saas-app/README.md +0 -16
  385. package/evals/fixtures/tiny-saas-app/docs/auth-review.md +0 -15
  386. package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +0 -10
  387. package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +0 -15
  388. package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +0 -13
  389. package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +0 -12
  390. package/evals/fixtures/tiny-saas-app/src/billing.ts +0 -20
  391. package/evals/fixtures/tiny-saas-app/src/login-copy.ts +0 -1
  392. package/evals/fixtures/tiny-saas-app/src/settings-page.ts +0 -1
  393. package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +0 -8
  394. package/evals/fixtures/tiny-saas-app/tests/billing.test.md +0 -8
  395. package/evals/fixtures/tiny-saas-app/tests/copy.test.md +0 -7
  396. package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +0 -6
  397. package/evals/fixtures/tiny-setup-both-app/AGENTS.md +0 -5
  398. package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +0 -5
  399. package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +0 -6
  400. package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +0 -5
  401. package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +0 -6
  402. package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +0 -6
  403. package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +0 -14
  404. package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +0 -6
  405. package/evals/fixtures/tiny-skill-dev-app/README.md +0 -10
  406. package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +0 -8
  407. package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +0 -17
  408. package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +0 -13
  409. package/evals/fixtures/tiny-team-app/README.md +0 -5
  410. package/evals/fixtures/tiny-team-app/docs/product.md +0 -6
  411. package/evals/fixtures/tiny-team-app/src/teams.ts +0 -9
  412. package/evals/fixtures/tiny-team-app/src/users.ts +0 -5
  413. package/evals/fixtures/tiny-team-app/tests/teams.test.md +0 -7
  414. package/evals/fixtures/tiny-verify-app/README.md +0 -5
  415. package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +0 -1
  416. package/evals/fixtures/tiny-verify-app/src/settings-page.ts +0 -1
  417. package/evals/fixtures/tiny-verify-app/tests/settings.test.md +0 -7
  418. package/evals/prompts/aon-001.txt +0 -2
  419. package/evals/prompts/byp-001.txt +0 -2
  420. package/evals/prompts/byp-002.txt +0 -2
  421. package/evals/prompts/cap-001.txt +0 -3
  422. package/evals/prompts/cap-002.txt +0 -3
  423. package/evals/prompts/cmd-001.txt +0 -3
  424. package/evals/prompts/cmd-002.txt +0 -3
  425. package/evals/prompts/cmd-003.txt +0 -6
  426. package/evals/prompts/cmd-004.txt +0 -5
  427. package/evals/prompts/cmd-005.txt +0 -5
  428. package/evals/prompts/cmd-006.txt +0 -5
  429. package/evals/prompts/cmd-007.txt +0 -5
  430. package/evals/prompts/cmd-008.txt +0 -5
  431. package/evals/prompts/cmd-009.txt +0 -8
  432. package/evals/prompts/cmd-010.txt +0 -5
  433. package/evals/prompts/cmd-011.txt +0 -5
  434. package/evals/prompts/cmd-012.txt +0 -5
  435. package/evals/prompts/cmd-013.txt +0 -5
  436. package/evals/prompts/cmd-014.txt +0 -7
  437. package/evals/prompts/cmd-015.txt +0 -7
  438. package/evals/prompts/cmd-016.txt +0 -5
  439. package/evals/prompts/cmt-001.txt +0 -1
  440. package/evals/prompts/cmt-002.txt +0 -1
  441. package/evals/prompts/cmt-003.txt +0 -1
  442. package/evals/prompts/cmt-004.txt +0 -1
  443. package/evals/prompts/cmt-005.txt +0 -1
  444. package/evals/prompts/dfd-001.txt +0 -3
  445. package/evals/prompts/dia-001.txt +0 -3
  446. package/evals/prompts/dia-002.txt +0 -3
  447. package/evals/prompts/dia-003.txt +0 -3
  448. package/evals/prompts/dis-001.txt +0 -5
  449. package/evals/prompts/dis-002.txt +0 -5
  450. package/evals/prompts/esk-001.txt +0 -5
  451. package/evals/prompts/esk-002.txt +0 -5
  452. package/evals/prompts/esk-003.txt +0 -5
  453. package/evals/prompts/grc-001.txt +0 -3
  454. package/evals/prompts/hof-001.txt +0 -3
  455. package/evals/prompts/hof-002.txt +0 -1
  456. package/evals/prompts/hof-003.txt +0 -1
  457. package/evals/prompts/hof-004.txt +0 -1
  458. package/evals/prompts/hof-005.txt +0 -1
  459. package/evals/prompts/ivg-001.txt +0 -1
  460. package/evals/prompts/ivg-002.txt +0 -11
  461. package/evals/prompts/ivg-003.txt +0 -1
  462. package/evals/prompts/ivg-004.txt +0 -1
  463. package/evals/prompts/mode-001.txt +0 -3
  464. package/evals/prompts/mode-002.txt +0 -1
  465. package/evals/prompts/mode-003.txt +0 -3
  466. package/evals/prompts/mode-004.txt +0 -3
  467. package/evals/prompts/mode-005.txt +0 -3
  468. package/evals/prompts/mode-006.txt +0 -3
  469. package/evals/prompts/mode-007.txt +0 -3
  470. package/evals/prompts/otr-001.txt +0 -3
  471. package/evals/prompts/otr-002.txt +0 -3
  472. package/evals/prompts/rar-001.txt +0 -5
  473. package/evals/prompts/rar-002.txt +0 -3
  474. package/evals/prompts/rar-003.txt +0 -6
  475. package/evals/prompts/rar-004.txt +0 -15
  476. package/evals/prompts/rar-005.txt +0 -10
  477. package/evals/prompts/rbr-001.txt +0 -3
  478. package/evals/prompts/rbr-002.txt +0 -3
  479. package/evals/prompts/rbr-003.txt +0 -7
  480. package/evals/prompts/rev-001.txt +0 -3
  481. package/evals/prompts/rev-002.txt +0 -5
  482. package/evals/prompts/rev-003.txt +0 -6
  483. package/evals/prompts/rev-004.txt +0 -1
  484. package/evals/prompts/rev-005.txt +0 -15
  485. package/evals/prompts/rev-006.txt +0 -5
  486. package/evals/prompts/stp-001.txt +0 -1
  487. package/evals/prompts/stp-002.txt +0 -1
  488. package/evals/prompts/stp-003.txt +0 -1
  489. package/evals/prompts/stp-004.txt +0 -1
  490. package/evals/prompts/stp-005.txt +0 -1
  491. package/evals/prompts/stp-006.txt +0 -1
  492. package/evals/prompts/stp-007.txt +0 -1
  493. package/evals/prompts/stp-008.txt +0 -1
  494. package/evals/prompts/stp-009.txt +0 -1
  495. package/evals/prompts/stp-010.txt +0 -1
  496. package/evals/prompts/stp-011.txt +0 -1
  497. package/evals/prompts/vfy-003.txt +0 -1
  498. package/evals/prompts/wpl-001.txt +0 -3
  499. package/evals/prompts/wpl-002.txt +0 -5
  500. package/evals/prompts/wpl-003.txt +0 -3
  501. package/evals/prompts/wpl-004.txt +0 -5
  502. package/evals/prompts/wpl-005.txt +0 -1
  503. package/evals/prompts/wrc-001.txt +0 -10
  504. package/evals/prompts/wrc-002.txt +0 -3
  505. package/evals/prompts/wsk-001.txt +0 -6
  506. package/evals/prompts/wsp-001.txt +0 -5
  507. package/evals/prompts/wsp-002.txt +0 -15
  508. package/evals/prompts/wsp-003.txt +0 -3
  509. package/evals/prompts/wsp-004.txt +0 -15
  510. package/evals/prompts/wsp-005.txt +0 -5
  511. package/evals/prompts/wsp-006.txt +0 -12
  512. package/evals/prompts/wsp-007.txt +0 -9
  513. package/evals/prompts/wsp-008.txt +0 -13
  514. package/evals/prompts/xpl-001.txt +0 -1
  515. package/evals/prompts/xpl-002.txt +0 -3
  516. package/evals/prompts/xpl-003.txt +0 -3
  517. package/evals/prompts/xpl-004.txt +0 -3
  518. package/evals/prompts/xpl-005.txt +0 -5
  519. package/evals/prompts/xpl-006.txt +0 -3
  520. package/evals/registries/adversarial-evals.json +0 -39
  521. package/evals/registries/fixture-evals.json +0 -2513
  522. package/evals/registries/handoff-evals.json +0 -74
  523. package/evals/registries/legacy-evals.json +0 -147
  524. package/evals/registries/skill-evidence.json +0 -193
  525. package/evals/registries/verify-work-evals.json +0 -46
  526. package/evals/reports/acceptance/v0.1-acceptance-report.md +0 -130
  527. package/evals/reports/by-command-surface/command-surface-1-report.md +0 -45
  528. package/evals/reports/by-command-surface/command-surface-10-report.md +0 -76
  529. package/evals/reports/by-command-surface/command-surface-11-report.md +0 -77
  530. package/evals/reports/by-command-surface/command-surface-12-report.md +0 -91
  531. package/evals/reports/by-command-surface/command-surface-13-report.md +0 -64
  532. package/evals/reports/by-command-surface/command-surface-14-report.md +0 -66
  533. package/evals/reports/by-command-surface/command-surface-15-report.md +0 -124
  534. package/evals/reports/by-command-surface/command-surface-16-report.md +0 -39
  535. package/evals/reports/by-command-surface/command-surface-2-report.md +0 -80
  536. package/evals/reports/by-command-surface/command-surface-3-report.md +0 -86
  537. package/evals/reports/by-command-surface/command-surface-4-report.md +0 -76
  538. package/evals/reports/by-command-surface/command-surface-5-report.md +0 -80
  539. package/evals/reports/by-command-surface/command-surface-6-report.md +0 -74
  540. package/evals/reports/by-command-surface/command-surface-7-report.md +0 -84
  541. package/evals/reports/by-command-surface/command-surface-8-report.md +0 -79
  542. package/evals/reports/by-command-surface/command-surface-9-report.md +0 -79
  543. package/evals/reports/by-command-surface/command-surface-matrix.md +0 -91
  544. package/evals/reports/by-skill/bypass-1-report.md +0 -124
  545. package/evals/reports/by-skill/capture-decisions-1-report.md +0 -99
  546. package/evals/reports/by-skill/capture-decisions-2-report.md +0 -102
  547. package/evals/reports/by-skill/commit-work-1-report.md +0 -165
  548. package/evals/reports/by-skill/commit-work-2-report.md +0 -109
  549. package/evals/reports/by-skill/design-for-depth-1-report.md +0 -95
  550. package/evals/reports/by-skill/diagnose-failure-1-report.md +0 -91
  551. package/evals/reports/by-skill/diagnose-failure-2-report.md +0 -94
  552. package/evals/reports/by-skill/discover-1-report.md +0 -118
  553. package/evals/reports/by-skill/evaluate-skill-2-report.md +0 -71
  554. package/evals/reports/by-skill/execute-plan-1-report.md +0 -103
  555. package/evals/reports/by-skill/execute-plan-2-report.md +0 -112
  556. package/evals/reports/by-skill/execute-plan-3-report.md +0 -87
  557. package/evals/reports/by-skill/grill-context-1-report.md +0 -103
  558. package/evals/reports/by-skill/handoff-1-report.md +0 -123
  559. package/evals/reports/by-skill/handoff-2-report.md +0 -105
  560. package/evals/reports/by-skill/handoff-3-report.md +0 -100
  561. package/evals/reports/by-skill/handoff-7-report.md +0 -77
  562. package/evals/reports/by-skill/interview-gate-1-report.md +0 -63
  563. package/evals/reports/by-skill/interview-gate-2-report.md +0 -105
  564. package/evals/reports/by-skill/mode-contract-1-report.md +0 -74
  565. package/evals/reports/by-skill/mode-contract-2-report.md +0 -87
  566. package/evals/reports/by-skill/mode-contract-3-report.md +0 -65
  567. package/evals/reports/by-skill/mode-contract-4-report.md +0 -71
  568. package/evals/reports/by-skill/mode-contract-5-report.md +0 -70
  569. package/evals/reports/by-skill/output-router-1-report.md +0 -76
  570. package/evals/reports/by-skill/output-router-2-report.md +0 -65
  571. package/evals/reports/by-skill/research-1-report.md +0 -144
  572. package/evals/reports/by-skill/research-brief-1-report.md +0 -94
  573. package/evals/reports/by-skill/research-brief-2-report.md +0 -75
  574. package/evals/reports/by-skill/review-artifact-1-report.md +0 -91
  575. package/evals/reports/by-skill/review-artifact-2-report.md +0 -79
  576. package/evals/reports/by-skill/review-artifact-3-report.md +0 -120
  577. package/evals/reports/by-skill/review-artifact-4-report.md +0 -89
  578. package/evals/reports/by-skill/review-artifact-5-report.md +0 -66
  579. package/evals/reports/by-skill/review-work-1-report.md +0 -85
  580. package/evals/reports/by-skill/review-work-2-report.md +0 -87
  581. package/evals/reports/by-skill/review-work-3-report.md +0 -104
  582. package/evals/reports/by-skill/review-work-4-report.md +0 -108
  583. package/evals/reports/by-skill/review-work-5-report.md +0 -73
  584. package/evals/reports/by-skill/review-work-6-report.md +0 -66
  585. package/evals/reports/by-skill/setup-freeflow-1-report.md +0 -199
  586. package/evals/reports/by-skill/setup-freeflow-2-report.md +0 -105
  587. package/evals/reports/by-skill/setup-freeflow-3-report.md +0 -105
  588. package/evals/reports/by-skill/setup-freeflow-4-report.md +0 -88
  589. package/evals/reports/by-skill/setup-freeflow-5-report.md +0 -115
  590. package/evals/reports/by-skill/skill-authoring-1-report.md +0 -81
  591. package/evals/reports/by-skill/verify-work-1-report.md +0 -111
  592. package/evals/reports/by-skill/verify-work-2-report.md +0 -120
  593. package/evals/reports/by-skill/workflow-1-report.md +0 -65
  594. package/evals/reports/by-skill/write-plan-1-report.md +0 -123
  595. package/evals/reports/by-skill/write-plan-2-report.md +0 -98
  596. package/evals/reports/by-skill/write-plan-3-report.md +0 -110
  597. package/evals/reports/by-skill/write-spec-1-report.md +0 -88
  598. package/evals/reports/by-skill/write-spec-2-report.md +0 -89
  599. package/evals/reports/by-skill/write-spec-3-report.md +0 -90
  600. package/evals/reports/by-skill/write-spec-4-report.md +0 -167
  601. package/evals/reports/harness/claude-harness-1-report.md +0 -103
  602. package/evals/reports/harness/eval-harness-1-report.md +0 -91
  603. package/evals/reports/iterations/iteration-1-report.md +0 -71
  604. package/evals/reports/iterations/iteration-2-report.md +0 -78
  605. package/evals/reports/iterations/iteration-3-report.md +0 -118
  606. package/evals/reports/iterations/iteration-4-report.md +0 -131
  607. package/evals/reports/iterations/iteration-5-report.md +0 -149
  608. package/evals/reports/iterations/iteration-6-report.md +0 -136
  609. package/evals/reports/runtime/always-on-runtime-1-report.md +0 -107
  610. package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +0 -52
  611. package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +0 -410
  612. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +0 -203
  613. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +0 -51
  614. package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +0 -99
  615. package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +0 -166
  616. package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +0 -96
  617. package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +0 -151
  618. package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +0 -233
  619. package/evals/reports/runtime/jq-script-derive-execution-1-report.md +0 -215
  620. package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +0 -67
  621. package/evals/reports/runtime/output-router-benchmark-1-report.md +0 -81
  622. package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +0 -35
  623. package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +0 -150
  624. package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +0 -46
  625. package/evals/reports/runtime/output-router-command-benchmark-1-report.md +0 -62
  626. package/evals/reports/runtime/output-router-index-benchmark-1-report.md +0 -64
  627. package/evals/reports/runtime/output-router-regression-1-report.md +0 -81
  628. package/evals/reports/runtime/output-router-transform-eval-1-report.md +0 -28
  629. package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +0 -44
  630. package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +0 -159
  631. package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +0 -55
  632. package/evals/reports/runtime/render-format-row-protocol-1-report.md +0 -58
  633. package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +0 -84
  634. package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +0 -51
  635. package/evals/reports/runtime/storage-policy-benchmark-1-report.md +0 -176
  636. package/evals/reports/runtime/vault-index-storage-spike-1-report.md +0 -39
  637. package/evals/reports/runtime/workflow-context-hook-1-report.md +0 -82
  638. package/evals/runbooks/adversarial-eval-runbook.md +0 -28
  639. package/evals/runbooks/fixture-eval-runbook.md +0 -137
  640. package/evals/runbooks/handoff-eval-runbook.md +0 -22
  641. package/evals/runbooks/verify-work-eval-runbook.md +0 -27
  642. package/evals/scripts/audit-command-surface.sh +0 -160
  643. package/evals/scripts/check-activation-contract.sh +0 -121
  644. package/evals/scripts/check-runtime-context-hook.sh +0 -183
  645. package/evals/scripts/grade-fixture-eval.sh +0 -446
  646. package/evals/scripts/run-claude-fixture-eval.sh +0 -26
  647. package/evals/scripts/run-codex-fixture-eval.sh +0 -26
  648. package/evals/scripts/run-eryx-python-proof-spike.js +0 -559
  649. package/evals/scripts/run-fixture-eval-by-id.sh +0 -23
  650. package/evals/scripts/run-fixture-eval.sh +0 -464
  651. package/evals/scripts/run-jq-wasm-proof-spike.js +0 -299
  652. package/evals/scripts/run-output-router-transform-eval.js +0 -115
  653. package/evals/scripts/run-pi-observed-routing-eval.js +0 -478
  654. package/evals/scripts/run-quickjs-wasi-proof-spike.js +0 -339
  655. package/evals/scripts/skill-evidence.sh +0 -316
  656. package/evals/scripts/validate-release-metadata.sh +0 -486
  657. package/evals/suites/v0.1-acceptance-suite.md +0 -131
  658. package/pi-extension/dist/host-producer-identification.js +0 -186
  659. package/pi-extension/dist/mcp-config.js +0 -30
  660. package/pi-extension/dist/native-safety-net.js +0 -209
  661. package/pi-extension/dist/observed-tool-routing.js +0 -114
  662. package/pi-extension/dist/renderers.js +0 -835
  663. package/pi-extension/dist/router-tools.js +0 -438
  664. package/pi-extension/dist/runtime-context.js +0 -288
  665. package/pi-extension/dist/schemas.js +0 -254
  666. package/pi-extension/dist/status.js +0 -449
  667. package/pi-extension/dist/utils.js +0 -467
  668. package/pi-extension/src/runtime-context.ts +0 -347
  669. package/pi-extension/src/status.ts +0 -505
  670. package/plugin-docs/README.md +0 -40
  671. package/plugin-docs/adr/0001-three-modes.md +0 -27
  672. package/plugin-docs/adr/0002-evals-before-hooks.md +0 -17
  673. package/plugin-docs/adr/0003-release-boundary.md +0 -21
  674. package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +0 -26
  675. package/plugin-docs/adr/README.md +0 -10
  676. package/plugin-docs/architecture.md +0 -89
  677. package/plugin-docs/output-router.md +0 -396
  678. package/plugin-docs/release-evidence.md +0 -77
  679. package/plugin-docs/skills.md +0 -44
  680. package/plugin-docs/workflow.md +0 -57
  681. package/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
  682. package/skills/discover/ARTIFACT-DESTINATIONS.md +0 -58
  683. package/skills/discover/CHECKPOINTS.md +0 -74
  684. package/skills/discover/SKILL.md +0 -173
  685. package/skills/evaluate-skill/references/eval-patterns.md +0 -41
  686. package/skills/evaluate-skill/references/grading-priority.md +0 -33
  687. package/skills/execute-plan/SKILL.md +0 -133
  688. package/skills/execute-plan/references/execution-map.md +0 -122
  689. package/skills/interview-gate/SKILL.md +0 -90
  690. package/skills/setup-freeflow/references/output-router-setup.md +0 -102
  691. package/skills/workflow/references/workflow-map.md +0 -104
  692. /package/pi-extension/src/{mcp-config.ts → integrations/mcp-config.ts} +0 -0
@@ -3,459 +3,498 @@ import { tmpdir } from "node:os";
3
3
  import { dirname, join, relative, resolve } from "node:path";
4
4
  import { fileURLToPath } from "node:url";
5
5
  import { performance } from "node:perf_hooks";
6
- import { approximateTokens, defaultJsonRunReportPath, escapeMarkdownTableCell as escapeTable, formatPercent, latencySummary, normalizeIterations, parseBenchmarkCliArgs, reductionPercent, writeBenchmarkReportPair, } from "./benchmark-harness.js";
6
+ import {
7
+ approximateTokens,
8
+ defaultJsonRunReportPath,
9
+ escapeMarkdownTableCell as escapeTable,
10
+ formatPercent,
11
+ latencySummary,
12
+ normalizeIterations,
13
+ parseBenchmarkCliArgs,
14
+ reductionPercent,
15
+ writeBenchmarkReportPair,
16
+ } from "./benchmark-harness.js";
7
17
  import { freeflowSearch } from "../tools/search.js";
8
- const SANDBOX_DOC_PATH = "docs/codex-cli-agent-harness/2026-06-12-pass-3-sandboxing-and-permissions.md";
18
+ const SANDBOX_DOC_PATH = "router/evals/fixtures/output-router-corpus/sandbox-permissions.md";
9
19
  const GENERATED_GRAPH_PATH = "graphify-out/graph.html";
10
- const SANDBOX_QUESTION = "Find the Sandbox Permissions section, report file/lines, and explain UseDefault, RequireEscalated, and WithAdditionalPermissions.";
11
- const SANDBOX_QUERY = "Sandbox Permissions SandboxPermissions UseDefault RequireEscalated WithAdditionalPermissions Plain-language meaning";
20
+ const SANDBOX_QUESTION =
21
+ "Find the Sandbox Permissions section, report file/lines, and explain UseDefault, RequireEscalated, and WithAdditionalPermissions.";
22
+ const SANDBOX_QUERY =
23
+ "Sandbox Permissions SandboxPermissions UseDefault RequireEscalated WithAdditionalPermissions Plain-language meaning";
12
24
  const SANDBOX_REQUIRED_EVIDENCE = [
13
- "SandboxPermissions is a per-command request shape",
14
- "UseDefault",
15
- "Run with the turn's normal sandbox",
16
- "RequireEscalated",
17
- "Request unsandboxed execution",
18
- "WithAdditionalPermissions",
19
- "Stay sandboxed but widen permissions for this one command",
25
+ "SandboxPermissions is a per-command request shape",
26
+ "UseDefault",
27
+ "Run with the turn's normal sandbox",
28
+ "RequireEscalated",
29
+ "Request unsandboxed execution",
30
+ "WithAdditionalPermissions",
31
+ "Stay sandboxed but widen permissions for this one command",
20
32
  ];
21
33
  const SANDBOX_REQUIRED_ANSWER = [
22
- "UseDefault: run with the turn's normal sandbox",
23
- "RequireEscalated: request unsandboxed execution",
24
- "WithAdditionalPermissions: stay sandboxed but widen permissions for this one command",
34
+ "UseDefault: run with the turn's normal sandbox",
35
+ "RequireEscalated: request unsandboxed execution",
36
+ "WithAdditionalPermissions: stay sandboxed but widen permissions for this one command",
25
37
  ];
26
38
  export async function runCodexQaBenchmarks(options = {}) {
27
- const iterations = normalizeIterations(options.iterations, 1);
28
- const fixture = await createSandboxPermissionsFixture();
29
- try {
30
- const results = [];
31
- const modeResults = [];
32
- for (const mode of ["native-broad-search-proxy", "improved-freeflow-router"]) {
33
- modeResults.push(await runModeIterations(fixture, mode, iterations));
34
- }
35
- results.push({
36
- id: fixture.id,
37
- title: fixture.title,
38
- question: fixture.question,
39
- expected: fixture.expected,
40
- results: modeResults,
41
- });
42
- return {
43
- generatedAt: options.generatedAt ?? new Date().toISOString(),
44
- iterations,
45
- summary: summarizeCodexQaReport(results),
46
- fixtures: results,
47
- skippedExternalTools: skippedExternalTools(),
48
- };
49
- }
50
- finally {
51
- await fixture.cleanup();
39
+ const iterations = normalizeIterations(options.iterations, 1);
40
+ const fixture = await createSandboxPermissionsFixture();
41
+ try {
42
+ const results = [];
43
+ const modeResults = [];
44
+ for (const mode of ["native-broad-search-proxy", "improved-freeflow-router"]) {
45
+ modeResults.push(await runModeIterations(fixture, mode, iterations));
52
46
  }
47
+ results.push({
48
+ id: fixture.id,
49
+ title: fixture.title,
50
+ question: fixture.question,
51
+ expected: fixture.expected,
52
+ results: modeResults,
53
+ });
54
+ return {
55
+ generatedAt: options.generatedAt ?? new Date().toISOString(),
56
+ iterations,
57
+ summary: summarizeCodexQaReport(results),
58
+ fixtures: results,
59
+ skippedExternalTools: skippedExternalTools(),
60
+ };
61
+ } finally {
62
+ await fixture.cleanup();
63
+ }
53
64
  }
54
65
  export async function writeCodexQaBenchmarkReports(report, markdownReportPath, options = {}) {
55
- return writeBenchmarkReportPair({
56
- report,
57
- markdownReportPath,
58
- jsonReportPath: options.jsonReportPath ?? defaultJsonRunReportPath(markdownReportPath),
59
- renderMarkdown: renderCodexQaBenchmarkReport,
60
- });
66
+ return writeBenchmarkReportPair({
67
+ report,
68
+ markdownReportPath,
69
+ jsonReportPath: options.jsonReportPath ?? defaultJsonRunReportPath(markdownReportPath),
70
+ renderMarkdown: renderCodexQaBenchmarkReport,
71
+ });
61
72
  }
62
73
  export function renderCodexQaBenchmarkReport(report) {
63
- const lines = [
64
- "# Codex Structured Q&A Macro Benchmark Report - Iteration 1",
65
- "",
66
- `Date: ${report.generatedAt.slice(0, 10)}`,
67
- "",
68
- "## Scope",
69
- "",
70
- "Fast, deterministic Stage 1 macro benchmark for the Codex CLI agent-harness research corpus. The benchmark asks one structured Q&A question derived from the Sandbox Permissions pass and grades retrieval-backed answer quality, citation quality, evidence quality, context size, and latency.",
71
- "",
72
- "The fixture uses existing Freeflow research docs as oracle scaffolding and includes a generated `graphify-out` decoy to preserve the original broad-retrieval failure shape. Upstream Codex source citation comparison is marked skipped until a source snapshot is explicitly supplied.",
73
- "",
74
- "## Command",
75
- "",
76
- "```sh",
77
- "npm run bench:router:codex-qa",
78
- "```",
79
- "",
80
- "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.",
81
- "",
82
- "## Summary",
83
- "",
84
- `- Iterations per mode: ${report.iterations}`,
85
- `- Fixtures: ${report.summary.fixtures}`,
86
- `- Improved Freeflow Router gated pass: ${report.summary.improved.passed}/${report.summary.fixtures}`,
87
- `- Native broad-search proxy pass: ${report.summary.nativeBaseline.passed}/${report.summary.fixtures}`,
88
- `- Sandbox failure fixed: ${report.summary.sandboxFailureFixed ? "yes" : "no"}`,
89
- `- Generated false positives observed: ${report.summary.generatedFalsePositiveCount}/${report.summary.modeResults} mode results`,
90
- `- Improved answer/citation/evidence: ${report.summary.improved.answerCorrect}/${report.summary.fixtures} answer, ${report.summary.improved.citationCorrect}/${report.summary.fixtures} citation, ${report.summary.improved.evidenceCorrect}/${report.summary.fixtures} evidence`,
91
- `- 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.totalContextBytes}/${report.summary.improved.totalContextTokensApprox} context)`,
92
- "",
93
- "## Results",
94
- "",
95
- "| fixture | mode | correctness | checks | path | lines | raw bytes/tokens | context bytes/tokens | byte/token reduction | latency p50/p95 ms | proxy calls | answer | notes |",
96
- "| --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | ---: | ---: | --- | --- |",
97
- ];
98
- for (const fixture of report.fixtures) {
99
- for (const result of fixture.results) {
100
- lines.push([
101
- fixture.id,
102
- result.mode,
103
- result.correctness.passed ? "pass" : "fail",
104
- `answer ${mark(result.correctness.answerCorrect)} citation ${mark(result.correctness.citationCorrect)} evidence ${mark(result.correctness.evidenceCorrect)} gen-fp ${mark(!result.correctness.generatedFalsePositive)}`,
105
- result.actualPath ?? "-",
106
- result.actualLines ?? "-",
107
- `${result.rawBytes}/${result.rawTokensApprox}`,
108
- `${result.contextBytes}/${result.contextTokensApprox}`,
109
- `${formatPercent(result.byteReductionPercent)}/${formatPercent(result.tokenReductionPercent)}`,
110
- `${result.latencyMs.p50.toFixed(2)}/${result.latencyMs.p95.toFixed(2)}`,
111
- String(result.proxyCalls),
112
- result.answer,
113
- result.notes.join("; "),
114
- ].map((cell) => escapeTable(String(cell))).join(" | ").replace(/^/, "|").replace(/$/, " |"));
115
- }
116
- }
117
- lines.push("", "## Fixture Questions", "");
118
- for (const fixture of report.fixtures) {
119
- lines.push(`- ${fixture.id}: ${fixture.question}`);
120
- lines.push(` - expected doc: \`${fixture.expected.path}\``);
121
- lines.push(` - upstream source citation comparison: ${fixture.expected.sourceCitationStatus}`);
122
- }
123
- lines.push("", "## Skipped External Comparators", "");
124
- for (const skipped of report.skippedExternalTools) {
125
- lines.push(`- ${skipped.name}: ${skipped.reason}`);
74
+ const lines = [
75
+ "# Codex Structured Q&A Macro Benchmark Report - Iteration 1",
76
+ "",
77
+ `Date: ${report.generatedAt.slice(0, 10)}`,
78
+ "",
79
+ "## Scope",
80
+ "",
81
+ "Fast, deterministic Stage 1 macro benchmark for the neutral Output Router research corpus. The benchmark asks one structured Q&A question from the Sandbox Permissions fixture and grades retrieval-backed answer quality, citation quality, evidence quality, context size, and latency.",
82
+ "",
83
+ "The fixture uses existing Freeflow research docs as oracle scaffolding and includes a generated `graphify-out` decoy to preserve the original broad-retrieval failure shape. Upstream Codex source citation comparison is marked skipped until a source snapshot is explicitly supplied.",
84
+ "",
85
+ "## Command",
86
+ "",
87
+ "```sh",
88
+ "npm run bench:router:codex-qa",
89
+ "```",
90
+ "",
91
+ "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.",
92
+ "",
93
+ "## Summary",
94
+ "",
95
+ `- Iterations per mode: ${report.iterations}`,
96
+ `- Fixtures: ${report.summary.fixtures}`,
97
+ `- Improved Freeflow Router gated pass: ${report.summary.improved.passed}/${report.summary.fixtures}`,
98
+ `- Native broad-search proxy pass: ${report.summary.nativeBaseline.passed}/${report.summary.fixtures}`,
99
+ `- Sandbox failure fixed: ${report.summary.sandboxFailureFixed ? "yes" : "no"}`,
100
+ `- Generated false positives observed: ${report.summary.generatedFalsePositiveCount}/${report.summary.modeResults} mode results`,
101
+ `- Improved answer/citation/evidence: ${report.summary.improved.answerCorrect}/${report.summary.fixtures} answer, ${report.summary.improved.citationCorrect}/${report.summary.fixtures} citation, ${report.summary.improved.evidenceCorrect}/${report.summary.fixtures} evidence`,
102
+ `- 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.totalContextBytes}/${report.summary.improved.totalContextTokensApprox} context)`,
103
+ "",
104
+ "## Results",
105
+ "",
106
+ "| fixture | mode | correctness | checks | path | lines | raw bytes/tokens | context bytes/tokens | byte/token reduction | latency p50/p95 ms | proxy calls | answer | notes |",
107
+ "| --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | ---: | ---: | --- | --- |",
108
+ ];
109
+ for (const fixture of report.fixtures) {
110
+ for (const result of fixture.results) {
111
+ lines.push(
112
+ [
113
+ fixture.id,
114
+ result.mode,
115
+ result.correctness.passed ? "pass" : "fail",
116
+ `answer ${mark(result.correctness.answerCorrect)} citation ${mark(result.correctness.citationCorrect)} evidence ${mark(result.correctness.evidenceCorrect)} gen-fp ${mark(!result.correctness.generatedFalsePositive)}`,
117
+ result.actualPath ?? "-",
118
+ result.actualLines ?? "-",
119
+ `${result.rawBytes}/${result.rawTokensApprox}`,
120
+ `${result.contextBytes}/${result.contextTokensApprox}`,
121
+ `${formatPercent(result.byteReductionPercent)}/${formatPercent(result.tokenReductionPercent)}`,
122
+ `${result.latencyMs.p50.toFixed(2)}/${result.latencyMs.p95.toFixed(2)}`,
123
+ String(result.proxyCalls),
124
+ result.answer,
125
+ result.notes.join("; "),
126
+ ]
127
+ .map((cell) => escapeTable(String(cell)))
128
+ .join(" | ")
129
+ .replace(/^/, "|")
130
+ .replace(/$/, " |"),
131
+ );
126
132
  }
127
- return `${lines.join("\n")}\n`;
133
+ }
134
+ lines.push("", "## Fixture Questions", "");
135
+ for (const fixture of report.fixtures) {
136
+ lines.push(`- ${fixture.id}: ${fixture.question}`);
137
+ lines.push(` - expected doc: \`${fixture.expected.path}\``);
138
+ lines.push(` - upstream source citation comparison: ${fixture.expected.sourceCitationStatus}`);
139
+ }
140
+ lines.push("", "## Skipped External Comparators", "");
141
+ for (const skipped of report.skippedExternalTools) {
142
+ lines.push(`- ${skipped.name}: ${skipped.reason}`);
143
+ }
144
+ return `${lines.join("\n")}\n`;
128
145
  }
129
146
  async function runModeIterations(fixture, mode, iterations) {
130
- const latencies = [];
131
- let firstObservation;
132
- for (let index = 0; index < iterations; index += 1) {
133
- const startedAt = performance.now();
134
- const observation = mode === "native-broad-search-proxy"
135
- ? await nativeBroadSearchObservation(fixture)
136
- : await improvedFreeflowObservation(fixture);
137
- latencies.push(performance.now() - startedAt);
138
- firstObservation ??= observation;
139
- }
140
- if (!firstObservation) {
141
- throw new Error("Codex Q&A benchmark produced no observation");
142
- }
143
- const correctness = gradeObservation(fixture, firstObservation);
144
- return {
145
- mode,
146
- toolPathUsed: firstObservation.toolPathUsed,
147
- skipped: false,
148
- proxyCalls: firstObservation.proxyCalls,
149
- rawBytes: firstObservation.rawBytes,
150
- rawTokensApprox: approximateTokens(firstObservation.rawBytes),
151
- contextBytes: firstObservation.contextBytes,
152
- contextTokensApprox: approximateTokens(firstObservation.contextBytes),
153
- byteReductionPercent: reductionPercent(firstObservation.rawBytes, firstObservation.contextBytes),
154
- tokenReductionPercent: reductionPercent(approximateTokens(firstObservation.rawBytes), approximateTokens(firstObservation.contextBytes)),
155
- latencyMs: latencySummary(latencies),
156
- ...(firstObservation.actualPath !== undefined ? { actualPath: firstObservation.actualPath } : {}),
157
- ...(firstObservation.actualLines !== undefined ? { actualLines: firstObservation.actualLines } : {}),
158
- answer: firstObservation.answer,
159
- evidenceExcerpt: firstObservation.evidenceExcerpt,
160
- correctness,
161
- notes: firstObservation.notes,
162
- };
147
+ const latencies = [];
148
+ let firstObservation;
149
+ for (let index = 0; index < iterations; index += 1) {
150
+ const startedAt = performance.now();
151
+ const observation =
152
+ mode === "native-broad-search-proxy"
153
+ ? await nativeBroadSearchObservation(fixture)
154
+ : await improvedFreeflowObservation(fixture);
155
+ latencies.push(performance.now() - startedAt);
156
+ firstObservation ??= observation;
157
+ }
158
+ if (!firstObservation) {
159
+ throw new Error("Codex Q&A benchmark produced no observation");
160
+ }
161
+ const correctness = gradeObservation(fixture, firstObservation);
162
+ return {
163
+ mode,
164
+ toolPathUsed: firstObservation.toolPathUsed,
165
+ skipped: false,
166
+ proxyCalls: firstObservation.proxyCalls,
167
+ rawBytes: firstObservation.rawBytes,
168
+ rawTokensApprox: approximateTokens(firstObservation.rawBytes),
169
+ contextBytes: firstObservation.contextBytes,
170
+ contextTokensApprox: approximateTokens(firstObservation.contextBytes),
171
+ byteReductionPercent: reductionPercent(firstObservation.rawBytes, firstObservation.contextBytes),
172
+ tokenReductionPercent: reductionPercent(
173
+ approximateTokens(firstObservation.rawBytes),
174
+ approximateTokens(firstObservation.contextBytes),
175
+ ),
176
+ latencyMs: latencySummary(latencies),
177
+ ...(firstObservation.actualPath !== undefined ? { actualPath: firstObservation.actualPath } : {}),
178
+ ...(firstObservation.actualLines !== undefined ? { actualLines: firstObservation.actualLines } : {}),
179
+ answer: firstObservation.answer,
180
+ evidenceExcerpt: firstObservation.evidenceExcerpt,
181
+ correctness,
182
+ notes: firstObservation.notes,
183
+ };
163
184
  }
164
185
  async function improvedFreeflowObservation(fixture) {
165
- const queryResult = await freeflowSearch({
166
- action: "query",
186
+ const queryResult = await freeflowSearch({
187
+ action: "query",
188
+ source: { kind: "repo", root: fixture.root },
189
+ query: fixture.query,
190
+ preserve: "important",
191
+ topK: 1,
192
+ });
193
+ const seedEvidence = queryResult.evidence?.[0];
194
+ const expandedResult = seedEvidence
195
+ ? await freeflowSearch({
196
+ action: "expand",
167
197
  source: { kind: "repo", root: fixture.root },
168
- query: fixture.query,
198
+ evidence: seedEvidence,
199
+ expansion: "lines_30",
169
200
  preserve: "important",
170
- topK: 1,
171
- });
172
- const seedEvidence = queryResult.evidence?.[0];
173
- const expandedResult = seedEvidence
174
- ? await freeflowSearch({
175
- action: "expand",
176
- source: { kind: "repo", root: fixture.root },
177
- evidence: seedEvidence,
178
- expansion: "lines_30",
179
- preserve: "important",
180
- })
181
- : undefined;
182
- const evidence = expandedResult?.evidence?.[0] ?? seedEvidence;
183
- const evidenceExcerpt = evidence?.excerpt ?? "";
184
- return {
185
- toolPathUsed: "freeflowSearch repo query + expand",
186
- proxyCalls: expandedResult ? 2 : 1,
187
- rawBytes: await repoRawBytes(fixture.root),
188
- contextBytes: byteLength(JSON.stringify(queryResult)) + byteLength(JSON.stringify(expandedResult ?? {})),
189
- ...(evidence?.path !== undefined ? { actualPath: evidence.path } : {}),
190
- ...(evidence?.lines !== undefined ? { actualLines: evidence.lines } : {}),
191
- evidenceExcerpt,
192
- answer: answerFromEvidence(evidence, evidenceExcerpt),
193
- notes: [queryResult.routing.reason, ...(expandedResult ? [expandedResult.routing.reason] : ["expand skipped: no seed evidence"])],
194
- };
201
+ })
202
+ : undefined;
203
+ const evidence = expandedResult?.evidence?.[0] ?? seedEvidence;
204
+ const evidenceExcerpt = evidence?.excerpt ?? "";
205
+ return {
206
+ toolPathUsed: "freeflowSearch repo query + expand",
207
+ proxyCalls: expandedResult ? 2 : 1,
208
+ rawBytes: await repoRawBytes(fixture.root),
209
+ contextBytes: byteLength(JSON.stringify(queryResult)) + byteLength(JSON.stringify(expandedResult ?? {})),
210
+ ...(evidence?.path !== undefined ? { actualPath: evidence.path } : {}),
211
+ ...(evidence?.lines !== undefined ? { actualLines: evidence.lines } : {}),
212
+ evidenceExcerpt,
213
+ answer: answerFromEvidence(evidence, evidenceExcerpt),
214
+ notes: [
215
+ queryResult.routing.reason,
216
+ ...(expandedResult ? [expandedResult.routing.reason] : ["expand skipped: no seed evidence"]),
217
+ ],
218
+ };
195
219
  }
196
220
  async function nativeBroadSearchObservation(fixture) {
197
- const files = await readRepoTextFiles(fixture.root);
198
- const tokens = tokenize(fixture.query);
199
- const scored = files
200
- .map((file) => ({ ...file, score: scoreText(file.text, tokens) }))
201
- .filter((file) => file.score > 0)
202
- .sort((a, b) => b.score - a.score || b.bytes - a.bytes || a.path.localeCompare(b.path));
203
- const selected = scored[0];
204
- const evidenceExcerpt = selected?.text ?? "";
205
- return {
206
- toolPathUsed: "native broad text-search proxy including generated artifacts",
207
- proxyCalls: 1,
208
- rawBytes: await repoRawBytes(fixture.root),
209
- contextBytes: byteLength(evidenceExcerpt),
210
- ...(selected?.path !== undefined ? { actualPath: selected.path } : {}),
211
- ...(selected ? { actualLines: `1-${selected.lineCount}` } : {}),
212
- evidenceExcerpt,
213
- answer: answerFromEvidence(selected ? { path: selected.path, lines: `1-${selected.lineCount}` } : undefined, evidenceExcerpt),
214
- notes: selected ? [`lexical score=${selected.score}`] : ["no native match"],
215
- };
221
+ const files = await readRepoTextFiles(fixture.root);
222
+ const tokens = tokenize(fixture.query);
223
+ const scored = files
224
+ .map((file) => ({ ...file, score: scoreText(file.text, tokens) }))
225
+ .filter((file) => file.score > 0)
226
+ .sort((a, b) => b.score - a.score || b.bytes - a.bytes || a.path.localeCompare(b.path));
227
+ const selected = scored[0];
228
+ const evidenceExcerpt = selected?.text ?? "";
229
+ return {
230
+ toolPathUsed: "native broad text-search proxy including generated artifacts",
231
+ proxyCalls: 1,
232
+ rawBytes: await repoRawBytes(fixture.root),
233
+ contextBytes: byteLength(evidenceExcerpt),
234
+ ...(selected?.path !== undefined ? { actualPath: selected.path } : {}),
235
+ ...(selected ? { actualLines: `1-${selected.lineCount}` } : {}),
236
+ evidenceExcerpt,
237
+ answer: answerFromEvidence(
238
+ selected ? { path: selected.path, lines: `1-${selected.lineCount}` } : undefined,
239
+ evidenceExcerpt,
240
+ ),
241
+ notes: selected ? [`lexical score=${selected.score}`] : ["no native match"],
242
+ };
216
243
  }
217
244
  function gradeObservation(fixture, observation) {
218
- const answerCorrect = fixture.expected.requiredAnswer.every((phrase) => includesNormalized(observation.answer, phrase));
219
- const citationCorrect = observation.actualPath === fixture.expected.path && typeof observation.actualLines === "string";
220
- const evidenceCorrect = fixture.expected.requiredEvidence.every((phrase) => includesNormalized(observation.evidenceExcerpt, phrase));
221
- const generatedFalsePositive = observation.actualPath?.startsWith("graphify-out/") ?? false;
222
- return {
223
- passed: answerCorrect && citationCorrect && evidenceCorrect && !generatedFalsePositive,
224
- answerCorrect,
225
- citationCorrect,
226
- evidenceCorrect,
227
- generatedFalsePositive,
228
- };
245
+ const answerCorrect = fixture.expected.requiredAnswer.every((phrase) =>
246
+ includesNormalized(observation.answer, phrase),
247
+ );
248
+ const citationCorrect =
249
+ observation.actualPath === fixture.expected.path && typeof observation.actualLines === "string";
250
+ const evidenceCorrect = fixture.expected.requiredEvidence.every((phrase) =>
251
+ includesNormalized(observation.evidenceExcerpt, phrase),
252
+ );
253
+ const generatedFalsePositive = observation.actualPath?.startsWith("graphify-out/") ?? false;
254
+ return {
255
+ passed: answerCorrect && citationCorrect && evidenceCorrect && !generatedFalsePositive,
256
+ answerCorrect,
257
+ citationCorrect,
258
+ evidenceCorrect,
259
+ generatedFalsePositive,
260
+ };
229
261
  }
230
262
  function summarizeCodexQaReport(fixtures) {
231
- const improved = summarizeMode(fixtures, "improved-freeflow-router");
232
- const nativeBaseline = summarizeMode(fixtures, "native-broad-search-proxy");
233
- const modeResults = fixtures.reduce((count, fixture) => count + fixture.results.length, 0);
234
- const generatedFalsePositiveCount = fixtures
235
- .flatMap((fixture) => fixture.results)
236
- .filter((result) => result.correctness.generatedFalsePositive).length;
237
- return {
238
- fixtures: fixtures.length,
239
- modeResults,
240
- improved,
241
- nativeBaseline,
242
- sandboxFailureFixed: improved.failed === 0 && nativeBaseline.generatedFalsePositiveCount > 0,
243
- generatedFalsePositiveCount,
244
- };
263
+ const improved = summarizeMode(fixtures, "improved-freeflow-router");
264
+ const nativeBaseline = summarizeMode(fixtures, "native-broad-search-proxy");
265
+ const modeResults = fixtures.reduce((count, fixture) => count + fixture.results.length, 0);
266
+ const generatedFalsePositiveCount = fixtures
267
+ .flatMap((fixture) => fixture.results)
268
+ .filter((result) => result.correctness.generatedFalsePositive).length;
269
+ return {
270
+ fixtures: fixtures.length,
271
+ modeResults,
272
+ improved,
273
+ nativeBaseline,
274
+ sandboxFailureFixed: improved.failed === 0 && nativeBaseline.generatedFalsePositiveCount > 0,
275
+ generatedFalsePositiveCount,
276
+ };
245
277
  }
246
278
  function summarizeMode(fixtures, mode) {
247
- const results = fixtures
248
- .map((fixture) => fixture.results.find((result) => result.mode === mode))
249
- .filter((result) => Boolean(result));
250
- const totalRawBytes = results.reduce((sum, result) => sum + result.rawBytes, 0);
251
- const totalContextBytes = results.reduce((sum, result) => sum + result.contextBytes, 0);
252
- const totalRawTokensApprox = results.reduce((sum, result) => sum + result.rawTokensApprox, 0);
253
- const totalContextTokensApprox = results.reduce((sum, result) => sum + result.contextTokensApprox, 0);
254
- return results.reduce((summary, result) => {
255
- if (result.skipped) {
256
- summary.skipped += 1;
257
- }
258
- else if (result.correctness.passed) {
259
- summary.passed += 1;
260
- }
261
- else {
262
- summary.failed += 1;
263
- }
264
- if (result.correctness.answerCorrect) {
265
- summary.answerCorrect += 1;
266
- }
267
- if (result.correctness.citationCorrect) {
268
- summary.citationCorrect += 1;
269
- }
270
- if (result.correctness.evidenceCorrect) {
271
- summary.evidenceCorrect += 1;
272
- }
273
- if (result.correctness.generatedFalsePositive) {
274
- summary.generatedFalsePositiveCount += 1;
275
- }
276
- return summary;
277
- }, {
278
- passed: 0,
279
- failed: 0,
280
- skipped: 0,
281
- answerCorrect: 0,
282
- citationCorrect: 0,
283
- evidenceCorrect: 0,
284
- generatedFalsePositiveCount: 0,
285
- totalRawBytes,
286
- totalContextBytes,
287
- totalRawTokensApprox,
288
- totalContextTokensApprox,
289
- weightedByteReductionPercent: reductionPercent(totalRawBytes, totalContextBytes),
290
- weightedTokenReductionPercent: reductionPercent(totalRawTokensApprox, totalContextTokensApprox),
291
- });
279
+ const results = fixtures
280
+ .map((fixture) => fixture.results.find((result) => result.mode === mode))
281
+ .filter((result) => Boolean(result));
282
+ const totalRawBytes = results.reduce((sum, result) => sum + result.rawBytes, 0);
283
+ const totalContextBytes = results.reduce((sum, result) => sum + result.contextBytes, 0);
284
+ const totalRawTokensApprox = results.reduce((sum, result) => sum + result.rawTokensApprox, 0);
285
+ const totalContextTokensApprox = results.reduce((sum, result) => sum + result.contextTokensApprox, 0);
286
+ return results.reduce(
287
+ (summary, result) => {
288
+ if (result.skipped) {
289
+ summary.skipped += 1;
290
+ } else if (result.correctness.passed) {
291
+ summary.passed += 1;
292
+ } else {
293
+ summary.failed += 1;
294
+ }
295
+ if (result.correctness.answerCorrect) {
296
+ summary.answerCorrect += 1;
297
+ }
298
+ if (result.correctness.citationCorrect) {
299
+ summary.citationCorrect += 1;
300
+ }
301
+ if (result.correctness.evidenceCorrect) {
302
+ summary.evidenceCorrect += 1;
303
+ }
304
+ if (result.correctness.generatedFalsePositive) {
305
+ summary.generatedFalsePositiveCount += 1;
306
+ }
307
+ return summary;
308
+ },
309
+ {
310
+ passed: 0,
311
+ failed: 0,
312
+ skipped: 0,
313
+ answerCorrect: 0,
314
+ citationCorrect: 0,
315
+ evidenceCorrect: 0,
316
+ generatedFalsePositiveCount: 0,
317
+ totalRawBytes,
318
+ totalContextBytes,
319
+ totalRawTokensApprox,
320
+ totalContextTokensApprox,
321
+ weightedByteReductionPercent: reductionPercent(totalRawBytes, totalContextBytes),
322
+ weightedTokenReductionPercent: reductionPercent(totalRawTokensApprox, totalContextTokensApprox),
323
+ },
324
+ );
292
325
  }
293
326
  async function createSandboxPermissionsFixture() {
294
- const root = await mkdtemp(join(tmpdir(), "freeflow-codex-qa-fixture-"));
295
- await writeTextFile(join(root, SANDBOX_DOC_PATH), sandboxDocumentText());
296
- await writeTextFile(join(root, GENERATED_GRAPH_PATH), [
297
- "<html><body>",
298
- `${"Sandbox Permissions SandboxPermissions UseDefault RequireEscalated WithAdditionalPermissions Plain-language meaning ".repeat(5_000)}GENERATED_GRAPH_DECOY_SENTINEL`,
299
- "</body></html>",
300
- ].join("\n"));
301
- return {
302
- id: "sandbox-permissions-structured-qa",
303
- title: "Sandbox Permissions structured Q&A",
304
- question: SANDBOX_QUESTION,
305
- query: SANDBOX_QUERY,
306
- expected: {
307
- path: SANDBOX_DOC_PATH,
308
- requiredEvidence: SANDBOX_REQUIRED_EVIDENCE,
309
- requiredAnswer: SANDBOX_REQUIRED_ANSWER,
310
- sourceCitationStatus: "skipped-unavailable",
311
- },
312
- root,
313
- cleanup: () => rm(root, { recursive: true, force: true }),
314
- };
327
+ const root = await mkdtemp(join(tmpdir(), "freeflow-codex-qa-fixture-"));
328
+ await writeTextFile(join(root, SANDBOX_DOC_PATH), sandboxDocumentText());
329
+ await writeTextFile(
330
+ join(root, GENERATED_GRAPH_PATH),
331
+ [
332
+ "<html><body>",
333
+ `${"Sandbox Permissions SandboxPermissions UseDefault RequireEscalated WithAdditionalPermissions Plain-language meaning ".repeat(5_000)}GENERATED_GRAPH_DECOY_SENTINEL`,
334
+ "</body></html>",
335
+ ].join("\n"),
336
+ );
337
+ return {
338
+ id: "sandbox-permissions-structured-qa",
339
+ title: "Sandbox Permissions structured Q&A",
340
+ question: SANDBOX_QUESTION,
341
+ query: SANDBOX_QUERY,
342
+ expected: {
343
+ path: SANDBOX_DOC_PATH,
344
+ requiredEvidence: SANDBOX_REQUIRED_EVIDENCE,
345
+ requiredAnswer: SANDBOX_REQUIRED_ANSWER,
346
+ sourceCitationStatus: "skipped-unavailable",
347
+ },
348
+ root,
349
+ cleanup: () => rm(root, { recursive: true, force: true }),
350
+ };
315
351
  }
316
352
  function sandboxDocumentText() {
317
- return [
318
- "# Pass 3",
319
- "",
320
- "### Sandbox Permissions",
321
- "",
322
- "SandboxPermissions is a per-command request shape.",
323
- "",
324
- "Codex defines:",
325
- "",
326
- "```text",
327
- "UseDefault",
328
- "RequireEscalated",
329
- "WithAdditionalPermissions",
330
- "```",
331
- "",
332
- "Plain-language meaning:",
333
- "",
334
- "```text",
335
- "UseDefault:",
336
- " Run with the turn's normal sandbox.",
337
- "",
338
- "RequireEscalated:",
339
- " Request unsandboxed execution.",
340
- "",
341
- "WithAdditionalPermissions:",
342
- " Stay sandboxed but widen permissions for this one command.",
343
- "```",
344
- "",
345
- "This is a strong pattern for local agents.",
346
- ].join("\n");
353
+ return [
354
+ "# Pass 3",
355
+ "",
356
+ "### Sandbox Permissions",
357
+ "",
358
+ "SandboxPermissions is a per-command request shape.",
359
+ "",
360
+ "Codex defines:",
361
+ "",
362
+ "```text",
363
+ "UseDefault",
364
+ "RequireEscalated",
365
+ "WithAdditionalPermissions",
366
+ "```",
367
+ "",
368
+ "Plain-language meaning:",
369
+ "",
370
+ "```text",
371
+ "UseDefault:",
372
+ " Run with the turn's normal sandbox.",
373
+ "",
374
+ "RequireEscalated:",
375
+ " Request unsandboxed execution.",
376
+ "",
377
+ "WithAdditionalPermissions:",
378
+ " Stay sandboxed but widen permissions for this one command.",
379
+ "```",
380
+ "",
381
+ "This is a strong pattern for local agents.",
382
+ ].join("\n");
347
383
  }
348
384
  function answerFromEvidence(evidence, text) {
349
- const citation = evidence?.path ? `${evidence.path}${evidence.lines ? `:${evidence.lines}` : ""}` : "unknown source";
350
- const facts = [];
351
- if (includesNormalized(text, "Run with the turn's normal sandbox")) {
352
- facts.push("UseDefault: run with the turn's normal sandbox");
353
- }
354
- if (includesNormalized(text, "Request unsandboxed execution")) {
355
- facts.push("RequireEscalated: request unsandboxed execution");
356
- }
357
- if (includesNormalized(text, "Stay sandboxed but widen permissions for this one command")) {
358
- facts.push("WithAdditionalPermissions: stay sandboxed but widen permissions for this one command");
359
- }
360
- if (facts.length === 0) {
361
- return `Sandbox Permissions evidence from ${citation} did not include enough plain-language definitions to answer.`;
362
- }
363
- return `Sandbox Permissions are documented at ${citation}. ${facts.join(". ")}.`;
385
+ const citation = evidence?.path ? `${evidence.path}${evidence.lines ? `:${evidence.lines}` : ""}` : "unknown source";
386
+ const facts = [];
387
+ if (includesNormalized(text, "Run with the turn's normal sandbox")) {
388
+ facts.push("UseDefault: run with the turn's normal sandbox");
389
+ }
390
+ if (includesNormalized(text, "Request unsandboxed execution")) {
391
+ facts.push("RequireEscalated: request unsandboxed execution");
392
+ }
393
+ if (includesNormalized(text, "Stay sandboxed but widen permissions for this one command")) {
394
+ facts.push("WithAdditionalPermissions: stay sandboxed but widen permissions for this one command");
395
+ }
396
+ if (facts.length === 0) {
397
+ return `Sandbox Permissions evidence from ${citation} did not include enough plain-language definitions to answer.`;
398
+ }
399
+ return `Sandbox Permissions are documented at ${citation}. ${facts.join(". ")}.`;
364
400
  }
365
401
  async function readRepoTextFiles(root) {
366
- const files = [];
367
- await walk(root, async (absolutePath) => {
368
- const text = await readFile(absolutePath, "utf8");
369
- files.push({
370
- path: relative(root, absolutePath),
371
- text,
372
- bytes: byteLength(text),
373
- lineCount: text.length === 0 ? 1 : text.split("\n").length,
374
- });
402
+ const files = [];
403
+ await walk(root, async (absolutePath) => {
404
+ const text = await readFile(absolutePath, "utf8");
405
+ files.push({
406
+ path: relative(root, absolutePath),
407
+ text,
408
+ bytes: byteLength(text),
409
+ lineCount: text.length === 0 ? 1 : text.split("\n").length,
375
410
  });
376
- return files;
411
+ });
412
+ return files;
377
413
  }
378
414
  async function repoRawBytes(root) {
379
- let total = 0;
380
- await walk(root, async (absolutePath) => {
381
- total += (await stat(absolutePath)).size;
382
- });
383
- return total;
415
+ let total = 0;
416
+ await walk(root, async (absolutePath) => {
417
+ total += (await stat(absolutePath)).size;
418
+ });
419
+ return total;
384
420
  }
385
421
  async function walk(root, visit) {
386
- const entries = await readdir(root, { withFileTypes: true });
387
- for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
388
- const absolutePath = join(root, entry.name);
389
- if (entry.isDirectory()) {
390
- await walk(absolutePath, visit);
391
- }
392
- else if (entry.isFile()) {
393
- await visit(absolutePath);
394
- }
422
+ const entries = await readdir(root, { withFileTypes: true });
423
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
424
+ const absolutePath = join(root, entry.name);
425
+ if (entry.isDirectory()) {
426
+ await walk(absolutePath, visit);
427
+ } else if (entry.isFile()) {
428
+ await visit(absolutePath);
395
429
  }
430
+ }
396
431
  }
397
432
  async function writeTextFile(path, text) {
398
- await mkdir(dirname(path), { recursive: true });
399
- await writeFile(path, text, "utf8");
433
+ await mkdir(dirname(path), { recursive: true });
434
+ await writeFile(path, text, "utf8");
400
435
  }
401
436
  function scoreText(text, queryTokens) {
402
- const counts = tokenCounts(text);
403
- return queryTokens.reduce((score, token) => score + (counts.get(token) ?? 0), 0);
437
+ const counts = tokenCounts(text);
438
+ return queryTokens.reduce((score, token) => score + (counts.get(token) ?? 0), 0);
404
439
  }
405
440
  function tokenCounts(text) {
406
- const counts = new Map();
407
- for (const token of tokenize(text)) {
408
- counts.set(token, (counts.get(token) ?? 0) + 1);
409
- }
410
- return counts;
441
+ const counts = new Map();
442
+ for (const token of tokenize(text)) {
443
+ counts.set(token, (counts.get(token) ?? 0) + 1);
444
+ }
445
+ return counts;
411
446
  }
412
447
  function tokenize(text) {
413
- return text.toLowerCase().match(/[a-z0-9_./-]+/g) ?? [];
448
+ return text.toLowerCase().match(/[a-z0-9_./-]+/g) ?? [];
414
449
  }
415
450
  function includesNormalized(text, phrase) {
416
- return normalizeText(text).includes(normalizeText(phrase));
451
+ return normalizeText(text).includes(normalizeText(phrase));
417
452
  }
418
453
  function normalizeText(text) {
419
- return text.toLowerCase().replace(/[`*_]/g, "").replace(/\s+/g, " ").trim();
454
+ return text.toLowerCase().replace(/[`*_]/g, "").replace(/\s+/g, " ").trim();
420
455
  }
421
456
  function mark(value) {
422
- return value ? "✓" : "✗";
457
+ return value ? "✓" : "✗";
423
458
  }
424
459
  function byteLength(text) {
425
- return Buffer.byteLength(text, "utf8");
460
+ return Buffer.byteLength(text, "utf8");
426
461
  }
427
462
  function skippedExternalTools() {
428
- return [
429
- {
430
- name: "Graphify",
431
- reason: "Skipped unless a fresh graph for the benchmark fixture is explicitly supplied.",
432
- },
433
- {
434
- name: "Claude Context",
435
- reason: "Skipped unless an index is configured and fresh for the benchmark fixture.",
436
- },
437
- ];
463
+ return [
464
+ {
465
+ name: "Graphify",
466
+ reason: "Skipped unless a fresh graph for the benchmark fixture is explicitly supplied.",
467
+ },
468
+ {
469
+ name: "Claude Context",
470
+ reason: "Skipped unless an index is configured and fresh for the benchmark fixture.",
471
+ },
472
+ ];
438
473
  }
439
474
  function defaultReportPath() {
440
- return resolve(process.cwd(), "evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md");
475
+ return resolve(process.cwd(), "router/evals/reports/output-router-codex-qa-benchmark-1-report.md");
441
476
  }
442
477
  async function main() {
443
- const { iterations, reportPath, jsonReportPath } = parseBenchmarkCliArgs(process.argv.slice(2), { reportPath: defaultReportPath() });
444
- const options = {};
445
- if (iterations !== undefined) {
446
- options.iterations = iterations;
447
- }
448
- const report = await runCodexQaBenchmarks(options);
449
- const reports = await writeCodexQaBenchmarkReports(report, reportPath, { jsonReportPath });
450
- console.log(`Freeflow Codex Q&A benchmark: improved ${report.summary.improved.passed}/${report.summary.fixtures} pass; native ${report.summary.nativeBaseline.passed}/${report.summary.fixtures} pass`);
451
- console.log(`Markdown report: ${reports.markdown}`);
452
- if (reports.json) {
453
- console.log(`JSON run data: ${reports.json}`);
454
- }
478
+ const { iterations, reportPath, jsonReportPath } = parseBenchmarkCliArgs(process.argv.slice(2), {
479
+ reportPath: defaultReportPath(),
480
+ });
481
+ const options = {};
482
+ if (iterations !== undefined) {
483
+ options.iterations = iterations;
484
+ }
485
+ const report = await runCodexQaBenchmarks(options);
486
+ const reports = await writeCodexQaBenchmarkReports(report, reportPath, { jsonReportPath });
487
+ console.log(
488
+ `Freeflow Codex Q&A benchmark: improved ${report.summary.improved.passed}/${report.summary.fixtures} pass; native ${report.summary.nativeBaseline.passed}/${report.summary.fixtures} pass`,
489
+ );
490
+ console.log(`Markdown report: ${reports.markdown}`);
491
+ if (reports.json) {
492
+ console.log(`JSON run data: ${reports.json}`);
493
+ }
455
494
  }
456
495
  if (process.argv[1] && fileURLToPath(import.meta.url) === resolve(process.argv[1])) {
457
- main().catch((error) => {
458
- console.error(error);
459
- process.exitCode = 1;
460
- });
496
+ main().catch((error) => {
497
+ console.error(error);
498
+ process.exitCode = 1;
499
+ });
461
500
  }