@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,704 +4,770 @@ import { tmpdir } from "node:os";
4
4
  import { join, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { performance } from "node:perf_hooks";
7
- import { approximateTokens, defaultJsonRunReportPath, escapeMarkdownTableCell as escapeTable, formatPercent, latencySummary, normalizeIterations, parseBenchmarkCliArgs, reductionPercent, writeBenchmarkReportPair, } from "./benchmark-harness.js";
7
+ import {
8
+ approximateTokens,
9
+ defaultJsonRunReportPath,
10
+ escapeMarkdownTableCell as escapeTable,
11
+ formatPercent,
12
+ latencySummary,
13
+ normalizeIterations,
14
+ parseBenchmarkCliArgs,
15
+ reductionPercent,
16
+ writeBenchmarkReportPair,
17
+ } from "./benchmark-harness.js";
8
18
  import { freeflowBatch } from "../tools/batch.js";
9
19
  import { freeflowSearch } from "../tools/search.js";
10
20
  import { freeflowRun } from "../tools/run.js";
11
21
  const DEFAULT_ITERATIONS = 1;
12
22
  const COMPACT_CONTEXT_CAP_BYTES = 1_600;
13
23
  const TEST_STDOUT = [
14
- "FAIL packages/auth/auth.test.ts",
15
- " ● refresh token keeps AUTH_TOKEN scoped",
16
- " Expected AUTH_TOKEN to be redacted before logging",
17
- "PASS packages/router/run.test.ts",
18
- "Tests: 1 failed, 24 passed, 25 total",
19
- "Ran all test suites.",
24
+ "FAIL packages/auth/auth.test.ts",
25
+ " ● refresh token keeps AUTH_TOKEN scoped",
26
+ " Expected AUTH_TOKEN to be redacted before logging",
27
+ "PASS packages/router/run.test.ts",
28
+ "Tests: 1 failed, 24 passed, 25 total",
29
+ "Ran all test suites.",
20
30
  ].join("\n");
21
31
  const BUILD_STDERR = [
22
- "src/auth.ts(42,11): error TS2322: Type 'undefined' is not assignable to type 'string'.",
23
- "src/router.ts(7,3): warning TS6133: 'unused' is declared but its value is never read.",
32
+ "src/auth.ts(42,11): error TS2322: Type 'undefined' is not assignable to type 'string'.",
33
+ "src/router.ts(7,3): warning TS6133: 'unused' is declared but its value is never read.",
24
34
  ].join("\n");
25
35
  const SERVICE_LOG = [
26
- "2026-06-26T10:00:00Z service=payments status=starting",
27
- ...Array.from({ length: 120 }, (_, index) => `2026-06-26T10:00:${String(index + 1).padStart(2, "0")}Z heartbeat worker=${index % 4} status=ok`),
28
- "2026-06-26T10:05:00Z service=payments error=RATE_LIMIT retryAfter=30 requestId=req_critical_42",
29
- ...Array.from({ length: 80 }, (_, index) => `2026-06-26T10:06:${String(index + 1).padStart(2, "0")}Z heartbeat worker=${index % 4} status=ok`),
36
+ "2026-06-26T10:00:00Z service=payments status=starting",
37
+ ...Array.from(
38
+ { length: 120 },
39
+ (_, index) => `2026-06-26T10:00:${String(index + 1).padStart(2, "0")}Z heartbeat worker=${index % 4} status=ok`,
40
+ ),
41
+ "2026-06-26T10:05:00Z service=payments error=RATE_LIMIT retryAfter=30 requestId=req_critical_42",
42
+ ...Array.from(
43
+ { length: 80 },
44
+ (_, index) => `2026-06-26T10:06:${String(index + 1).padStart(2, "0")}Z heartbeat worker=${index % 4} status=ok`,
45
+ ),
30
46
  ].join("\n");
31
- const JSON_TABLE = JSON.stringify({
47
+ const JSON_TABLE = JSON.stringify(
48
+ {
32
49
  status: "ok",
33
50
  marker: "JSON_TABLE_NEEDLE invoice_total=12345",
34
- rows: Array.from({ length: 80 }, (_, index) => ({ id: index + 1, value: `row-${index + 1}`, amount: index === 41 ? 12345 : index })),
35
- }, null, 2);
51
+ rows: Array.from({ length: 80 }, (_, index) => ({
52
+ id: index + 1,
53
+ value: `row-${index + 1}`,
54
+ amount: index === 41 ? 12345 : index,
55
+ })),
56
+ },
57
+ null,
58
+ 2,
59
+ );
36
60
  const DOC_TEXT = [
37
- "# Freeflow Output Router",
38
- "",
39
- "Freeflow keeps model context small while preserving exact output recovery.",
40
- "",
41
- "## Recovery Contract",
42
- "",
43
- "Every exact routed output receives an outputId and line-range recovery hint.",
44
- "Metadata-only records must not claim exact raw recovery.",
45
- "",
46
- "## Batch Contract",
47
- "",
48
- "Batch intermediates stay in details.result.steps instead of model context.",
61
+ "# Freeflow Output Router",
62
+ "",
63
+ "Freeflow keeps model context small while preserving exact output recovery.",
64
+ "",
65
+ "## Recovery Contract",
66
+ "",
67
+ "Every exact routed output receives an outputId and line-range recovery hint.",
68
+ "Metadata-only records must not claim exact raw recovery.",
69
+ "",
70
+ "## Batch Contract",
71
+ "",
72
+ "Batch intermediates stay in details.result.steps instead of model context.",
49
73
  ].join("\n");
50
74
  const REPO_CODE = [
51
- "export function routeSandboxPermissions(mode: string) {",
52
- " if (mode === 'UseDefault') return 'normal sandbox';",
53
- " if (mode === 'RequireEscalated') return 'approval required';",
54
- " return 'WithAdditionalPermissions';",
55
- "}",
75
+ "export function routeSandboxPermissions(mode: string) {",
76
+ " if (mode === 'UseDefault') return 'normal sandbox';",
77
+ " if (mode === 'RequireEscalated') return 'approval required';",
78
+ " return 'WithAdditionalPermissions';",
79
+ "}",
56
80
  ].join("\n");
57
81
  const GENERATED_DECOY = `${"Sandbox Permissions UseDefault RequireEscalated WithAdditionalPermissions ".repeat(2000)}GENERATED_DECOY_SENTINEL`;
58
82
  export async function runContextModeNormalizedBenchmarks(options = {}) {
59
- const iterations = normalizeIterations(options.iterations, DEFAULT_ITERATIONS);
60
- const root = await createTempDir("freeflow-context-mode-normalized-");
61
- const env = {
62
- root: root.path,
63
- repoRoot: join(root.path, "repo"),
64
- vaultRoot: join(root.path, "vault"),
65
- contextStoreRoot: join(root.path, "context-mode-store"),
66
- sessionId: "context-mode-normalized",
67
- commandRunner: fixtureCommandRunner(),
68
- };
69
- try {
70
- await setupRepo(env.repoRoot);
71
- await mkdir(env.vaultRoot, { recursive: true });
72
- await mkdir(env.contextStoreRoot, { recursive: true });
73
- const fixtures = contextModeFixtureDefinitions(env);
74
- const fixtureResults = [];
75
- for (const fixture of fixtures) {
76
- const results = [];
77
- for (const mode of contextModeModes()) {
78
- results.push(await runFixtureMode(fixture, mode, env, iterations));
79
- }
80
- fixtureResults.push({
81
- id: fixture.id,
82
- title: fixture.title,
83
- category: fixture.category,
84
- expectedFacts: fixture.expectedFacts,
85
- results,
86
- });
87
- }
88
- return {
89
- generatedAt: options.generatedAt ?? new Date().toISOString(),
90
- iterations,
91
- summary: summarizeContextModeReport(fixtureResults),
92
- fixtures: fixtureResults,
93
- notes: [
94
- "Context Mode comparison is a normalized proxy fixture, not a run of the external Context Mode runtime.",
95
- "The proxy stores exact raw fixture payloads behind synthetic handles and returns bounded relevant snippets.",
96
- "No public superiority claim is allowed from this benchmark alone.",
97
- ],
98
- };
99
- }
100
- finally {
101
- await root.cleanup();
83
+ const iterations = normalizeIterations(options.iterations, DEFAULT_ITERATIONS);
84
+ const root = await createTempDir("freeflow-context-mode-normalized-");
85
+ const env = {
86
+ root: root.path,
87
+ repoRoot: join(root.path, "repo"),
88
+ vaultRoot: join(root.path, "vault"),
89
+ contextStoreRoot: join(root.path, "context-mode-store"),
90
+ sessionId: "context-mode-normalized",
91
+ commandRunner: fixtureCommandRunner(),
92
+ };
93
+ try {
94
+ await setupRepo(env.repoRoot);
95
+ await mkdir(env.vaultRoot, { recursive: true });
96
+ await mkdir(env.contextStoreRoot, { recursive: true });
97
+ const fixtures = contextModeFixtureDefinitions(env);
98
+ const fixtureResults = [];
99
+ for (const fixture of fixtures) {
100
+ const results = [];
101
+ for (const mode of contextModeModes()) {
102
+ results.push(await runFixtureMode(fixture, mode, env, iterations));
103
+ }
104
+ fixtureResults.push({
105
+ id: fixture.id,
106
+ title: fixture.title,
107
+ category: fixture.category,
108
+ expectedFacts: fixture.expectedFacts,
109
+ results,
110
+ });
102
111
  }
112
+ return {
113
+ generatedAt: options.generatedAt ?? new Date().toISOString(),
114
+ iterations,
115
+ summary: summarizeContextModeReport(fixtureResults),
116
+ fixtures: fixtureResults,
117
+ notes: [
118
+ "Context Mode comparison is a normalized proxy fixture, not a run of the external Context Mode runtime.",
119
+ "The proxy stores exact raw fixture payloads behind synthetic handles and returns bounded relevant snippets.",
120
+ "No public superiority claim is allowed from this benchmark alone.",
121
+ ],
122
+ };
123
+ } finally {
124
+ await root.cleanup();
125
+ }
103
126
  }
104
127
  export function renderContextModeNormalizedBenchmarkReport(report) {
105
- const date = report.generatedAt.slice(0, 10);
106
- const lines = [
107
- "# Context Mode Normalized Benchmark Report - Iteration 1",
108
- "",
109
- `Date: ${date}`,
110
- "",
111
- "## Scope",
112
- "",
113
- "This benchmark compares Freeflow-owned tools against a normalized Context Mode-style proxy over representative command, docs, logs, JSON/table, repo-search, and batch fixture classes.",
114
- "",
115
- "The proxy is not the external Context Mode runtime. It stores exact raw fixture payloads behind synthetic handles and returns bounded relevant snippets. Treat results as directionally useful fixture evidence, not a public superiority claim.",
116
- "",
117
- "## Command",
118
- "",
119
- "```sh",
120
- "npm run bench:router:context-mode-normalized",
121
- "```",
122
- "",
123
- "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.",
124
- "",
125
- "## Summary",
126
- "",
127
- `- Fixtures: ${report.summary.fixtures}`,
128
- `- Freeflow passed: ${report.summary.freeflow.passed}/${report.summary.fixtures}`,
129
- `- Context Mode proxy passed: ${report.summary.contextModeProxy.passed}/${report.summary.fixtures}`,
130
- `- Freeflow answer-accurate visible output: ${report.summary.freeflow.answerAccurate}/${report.summary.fixtures}`,
131
- `- Freeflow exact facts preserved: ${report.summary.freeflow.exactFactsPreserved}/${report.summary.fixtures}`,
132
- `- Freeflow recovery available: ${report.summary.freeflow.recoveryAvailable}/${report.summary.fixtures}`,
133
- `- Freeflow lower model-visible bytes: ${report.summary.freeflowBetterModelVisibleBytes}/${report.summary.fixtures}`,
134
- `- Freeflow lower tool-call count: ${report.summary.freeflowBetterToolCalls}/${report.summary.fixtures}`,
135
- `- Freeflow model-visible reduction: ${formatPercent(report.summary.freeflow.weightedModelVisibleReductionPercent)} (${report.summary.freeflow.totalRawBytes} raw bytes to ${report.summary.freeflow.totalModelVisibleBytes} visible bytes)`,
136
- `- Context Mode proxy model-visible reduction: ${formatPercent(report.summary.contextModeProxy.weightedModelVisibleReductionPercent)} (${report.summary.contextModeProxy.totalRawBytes} raw bytes to ${report.summary.contextModeProxy.totalModelVisibleBytes} visible bytes)`,
137
- `- Public superiority claims allowed: ${report.summary.publicClaimsAllowed ? "yes" : "no"}`,
138
- "",
139
- "## Results",
140
- "",
141
- "| fixture | category | mode | pass | answer | facts | recovery | tool calls | raw/visible bytes | reduction | storage bytes | latency p50/p95 ms | notes |",
142
- "| --- | --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | ---: | ---: | --- |",
143
- ];
144
- for (const fixture of report.fixtures) {
145
- for (const result of fixture.results) {
146
- const passed = result.exactFactsPreserved && result.recoveryAvailable;
147
- lines.push(`| ${escapeTable(fixture.id)} | ${fixture.category} | ${result.mode} | ${passed ? "pass" : "fail"} | ${result.answerAccuracy ? "yes" : "no"} | ${result.exactFactsPreserved ? "yes" : "no"} | ${result.recoveryAvailable ? "yes" : "no"} | ${result.toolCalls} | ${result.rawBytes}/${result.modelVisibleBytes} | ${formatPercent(result.modelVisibleReductionPercent)} | ${result.storageBytes} | ${result.latencyMs.p50.toFixed(2)}/${result.latencyMs.p95.toFixed(2)} | ${escapeTable(result.notes.join("; "))} |`);
148
- }
128
+ const date = report.generatedAt.slice(0, 10);
129
+ const lines = [
130
+ "# Context Mode Normalized Benchmark Report - Iteration 1",
131
+ "",
132
+ `Date: ${date}`,
133
+ "",
134
+ "## Scope",
135
+ "",
136
+ "This benchmark compares Freeflow-owned tools against a normalized Context Mode-style proxy over representative command, docs, logs, JSON/table, repo-search, and batch fixture classes.",
137
+ "",
138
+ "The proxy is not the external Context Mode runtime. It stores exact raw fixture payloads behind synthetic handles and returns bounded relevant snippets. Treat results as directionally useful fixture evidence, not a public superiority claim.",
139
+ "",
140
+ "## Command",
141
+ "",
142
+ "```sh",
143
+ "npm run bench:router:context-mode-normalized",
144
+ "```",
145
+ "",
146
+ "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.",
147
+ "",
148
+ "## Summary",
149
+ "",
150
+ `- Fixtures: ${report.summary.fixtures}`,
151
+ `- Freeflow passed: ${report.summary.freeflow.passed}/${report.summary.fixtures}`,
152
+ `- Context Mode proxy passed: ${report.summary.contextModeProxy.passed}/${report.summary.fixtures}`,
153
+ `- Freeflow answer-accurate visible output: ${report.summary.freeflow.answerAccurate}/${report.summary.fixtures}`,
154
+ `- Freeflow exact facts preserved: ${report.summary.freeflow.exactFactsPreserved}/${report.summary.fixtures}`,
155
+ `- Freeflow recovery available: ${report.summary.freeflow.recoveryAvailable}/${report.summary.fixtures}`,
156
+ `- Freeflow lower model-visible bytes: ${report.summary.freeflowBetterModelVisibleBytes}/${report.summary.fixtures}`,
157
+ `- Freeflow lower tool-call count: ${report.summary.freeflowBetterToolCalls}/${report.summary.fixtures}`,
158
+ `- Freeflow model-visible reduction: ${formatPercent(report.summary.freeflow.weightedModelVisibleReductionPercent)} (${report.summary.freeflow.totalRawBytes} raw bytes to ${report.summary.freeflow.totalModelVisibleBytes} visible bytes)`,
159
+ `- Context Mode proxy model-visible reduction: ${formatPercent(report.summary.contextModeProxy.weightedModelVisibleReductionPercent)} (${report.summary.contextModeProxy.totalRawBytes} raw bytes to ${report.summary.contextModeProxy.totalModelVisibleBytes} visible bytes)`,
160
+ `- Public superiority claims allowed: ${report.summary.publicClaimsAllowed ? "yes" : "no"}`,
161
+ "",
162
+ "## Results",
163
+ "",
164
+ "| fixture | category | mode | pass | answer | facts | recovery | tool calls | raw/visible bytes | reduction | storage bytes | latency p50/p95 ms | notes |",
165
+ "| --- | --- | --- | --- | --- | --- | --- | ---: | ---: | ---: | ---: | ---: | --- |",
166
+ ];
167
+ for (const fixture of report.fixtures) {
168
+ for (const result of fixture.results) {
169
+ const passed = result.exactFactsPreserved && result.recoveryAvailable;
170
+ lines.push(
171
+ `| ${escapeTable(fixture.id)} | ${fixture.category} | ${result.mode} | ${passed ? "pass" : "fail"} | ${result.answerAccuracy ? "yes" : "no"} | ${result.exactFactsPreserved ? "yes" : "no"} | ${result.recoveryAvailable ? "yes" : "no"} | ${result.toolCalls} | ${result.rawBytes}/${result.modelVisibleBytes} | ${formatPercent(result.modelVisibleReductionPercent)} | ${result.storageBytes} | ${result.latencyMs.p50.toFixed(2)}/${result.latencyMs.p95.toFixed(2)} | ${escapeTable(result.notes.join("; "))} |`,
172
+ );
149
173
  }
150
- lines.push("", "## Decision", "", "No public Context Mode superiority claim is made from this benchmark. It is a normalized fixture comparison used to catch token/recovery regressions before any public naming or docs migration.", "");
151
- return lines.join("\n");
174
+ }
175
+ lines.push(
176
+ "",
177
+ "## Decision",
178
+ "",
179
+ "No public Context Mode superiority claim is made from this benchmark. It is a normalized fixture comparison used to catch token/recovery regressions before any public naming or docs migration.",
180
+ "",
181
+ );
182
+ return lines.join("\n");
152
183
  }
153
184
  export async function writeContextModeNormalizedBenchmarkReports(report, markdownReportPath, options = {}) {
154
- return writeBenchmarkReportPair({
155
- report,
156
- markdownReportPath,
157
- jsonReportPath: options.jsonReportPath,
158
- renderMarkdown: renderContextModeNormalizedBenchmarkReport,
159
- });
185
+ return writeBenchmarkReportPair({
186
+ report,
187
+ markdownReportPath,
188
+ jsonReportPath: options.jsonReportPath,
189
+ renderMarkdown: renderContextModeNormalizedBenchmarkReport,
190
+ });
160
191
  }
161
192
  function contextModeFixtureDefinitions(env) {
162
- return [
163
- commandFixture(env),
164
- docsFixture(env),
165
- logsFixture(env),
166
- jsonTableFixture(env),
167
- repoSearchFixture(env),
168
- batchFixture(env),
169
- ];
193
+ return [
194
+ commandFixture(env),
195
+ docsFixture(env),
196
+ logsFixture(env),
197
+ jsonTableFixture(env),
198
+ repoSearchFixture(env),
199
+ batchFixture(env),
200
+ ];
170
201
  }
171
202
  function commandFixture(env) {
172
- const raw = `${TEST_STDOUT}\n${BUILD_STDERR}\n`;
173
- const expectedFacts = ["AUTH_TOKEN scoped", "TS2322", "Tests: 1 failed"];
174
- return {
175
- id: "command-test-build-output",
176
- title: "Command test/build output",
177
- category: "command",
178
- rawBytes: byteLength(raw),
179
- expectedFacts,
180
- modes: {
181
- "context-mode-normalized-proxy": async () => contextModeProxyObservation(env, {
182
- id: "command-test-build-output",
183
- raw,
184
- expectedFacts,
185
- toolCalls: 1,
186
- title: "run command and store raw output",
187
- }),
188
- "freeflow-owned-tools": async () => freeflowRunObservation(env, {
189
- command: "npm test -- --runInBand",
190
- raw,
191
- expectedFacts,
192
- goal: "verification",
193
- }),
194
- },
195
- };
203
+ const raw = `${TEST_STDOUT}\n${BUILD_STDERR}\n`;
204
+ const expectedFacts = ["AUTH_TOKEN scoped", "TS2322", "Tests: 1 failed"];
205
+ return {
206
+ id: "command-test-build-output",
207
+ title: "Command test/build output",
208
+ category: "command",
209
+ rawBytes: byteLength(raw),
210
+ expectedFacts,
211
+ modes: {
212
+ "context-mode-normalized-proxy": async () =>
213
+ contextModeProxyObservation(env, {
214
+ id: "command-test-build-output",
215
+ raw,
216
+ expectedFacts,
217
+ toolCalls: 1,
218
+ title: "run command and store raw output",
219
+ }),
220
+ "freeflow-owned-tools": async () =>
221
+ freeflowRunObservation(env, {
222
+ command: "npm test -- --runInBand",
223
+ raw,
224
+ expectedFacts,
225
+ goal: "verification",
226
+ }),
227
+ },
228
+ };
196
229
  }
197
230
  function docsFixture(env) {
198
- const expectedFacts = ["outputId", "line-range recovery", "Metadata-only"];
199
- return {
200
- id: "docs-markdown-query",
201
- title: "Docs/markdown query",
202
- category: "docs",
203
- rawBytes: byteLength(DOC_TEXT),
204
- expectedFacts,
205
- modes: {
206
- "context-mode-normalized-proxy": async () => contextModeProxyObservation(env, {
207
- id: "docs-markdown-query",
208
- raw: DOC_TEXT,
209
- expectedFacts,
210
- toolCalls: 1,
211
- title: "read markdown and store raw document",
212
- }),
213
- "freeflow-owned-tools": async () => freeflowSearchObservation(env, {
214
- rawBytes: byteLength(DOC_TEXT),
215
- expectedFacts,
216
- query: "outputId line-range recovery Metadata-only exact raw recovery",
217
- }),
218
- },
219
- };
231
+ const expectedFacts = ["outputId", "line-range recovery", "Metadata-only"];
232
+ return {
233
+ id: "docs-markdown-query",
234
+ title: "Docs/markdown query",
235
+ category: "docs",
236
+ rawBytes: byteLength(DOC_TEXT),
237
+ expectedFacts,
238
+ modes: {
239
+ "context-mode-normalized-proxy": async () =>
240
+ contextModeProxyObservation(env, {
241
+ id: "docs-markdown-query",
242
+ raw: DOC_TEXT,
243
+ expectedFacts,
244
+ toolCalls: 1,
245
+ title: "read markdown and store raw document",
246
+ }),
247
+ "freeflow-owned-tools": async () =>
248
+ freeflowSearchObservation(env, {
249
+ rawBytes: byteLength(DOC_TEXT),
250
+ expectedFacts,
251
+ query: "outputId line-range recovery Metadata-only exact raw recovery",
252
+ }),
253
+ },
254
+ };
220
255
  }
221
256
  function logsFixture(env) {
222
- const expectedFacts = ["RATE_LIMIT", "retryAfter=30", "req_critical_42"];
223
- return {
224
- id: "large-log-search",
225
- title: "Large log search",
226
- category: "logs",
227
- rawBytes: byteLength(SERVICE_LOG),
228
- expectedFacts,
229
- modes: {
230
- "context-mode-normalized-proxy": async () => contextModeProxyObservation(env, {
231
- id: "large-log-search",
232
- raw: SERVICE_LOG,
233
- expectedFacts,
234
- toolCalls: 1,
235
- title: "search log and store raw log",
236
- }),
237
- "freeflow-owned-tools": async () => freeflowRunObservation(env, {
238
- command: "tail -n 250 service.log",
239
- raw: SERVICE_LOG,
240
- expectedFacts,
241
- goal: "diagnose rate limit log spike",
242
- filters: { include: ["RATE_LIMIT", "req_critical_42"], maxLines: 5 },
243
- }),
244
- },
245
- };
257
+ const expectedFacts = ["RATE_LIMIT", "retryAfter=30", "req_critical_42"];
258
+ return {
259
+ id: "large-log-search",
260
+ title: "Large log search",
261
+ category: "logs",
262
+ rawBytes: byteLength(SERVICE_LOG),
263
+ expectedFacts,
264
+ modes: {
265
+ "context-mode-normalized-proxy": async () =>
266
+ contextModeProxyObservation(env, {
267
+ id: "large-log-search",
268
+ raw: SERVICE_LOG,
269
+ expectedFacts,
270
+ toolCalls: 1,
271
+ title: "search log and store raw log",
272
+ }),
273
+ "freeflow-owned-tools": async () =>
274
+ freeflowRunObservation(env, {
275
+ command: "tail -n 250 service.log",
276
+ raw: SERVICE_LOG,
277
+ expectedFacts,
278
+ goal: "diagnose rate limit log spike",
279
+ filters: { include: ["RATE_LIMIT", "req_critical_42"], maxLines: 5 },
280
+ }),
281
+ },
282
+ };
246
283
  }
247
284
  function jsonTableFixture(env) {
248
- const expectedFacts = ["JSON_TABLE_NEEDLE", "invoice_total", "12345"];
249
- return {
250
- id: "json-table-output",
251
- title: "JSON/table-like output",
252
- category: "json-csv",
253
- rawBytes: byteLength(JSON_TABLE),
254
- expectedFacts,
255
- modes: {
256
- "context-mode-normalized-proxy": async () => contextModeProxyObservation(env, {
257
- id: "json-table-output",
258
- raw: JSON_TABLE,
259
- expectedFacts,
260
- toolCalls: 1,
261
- title: "summarize JSON/table and store raw payload",
262
- }),
263
- "freeflow-owned-tools": async () => freeflowRunObservation(env, {
264
- command: "node scripts/dump-invoices.js",
265
- raw: JSON_TABLE,
266
- expectedFacts,
267
- goal: "inspect invoice JSON table",
268
- filters: { include: ["JSON_TABLE_NEEDLE", "12345"], maxLines: 8 },
269
- }),
270
- },
271
- };
285
+ const expectedFacts = ["JSON_TABLE_NEEDLE", "invoice_total", "12345"];
286
+ return {
287
+ id: "json-table-output",
288
+ title: "JSON/table-like output",
289
+ category: "json-csv",
290
+ rawBytes: byteLength(JSON_TABLE),
291
+ expectedFacts,
292
+ modes: {
293
+ "context-mode-normalized-proxy": async () =>
294
+ contextModeProxyObservation(env, {
295
+ id: "json-table-output",
296
+ raw: JSON_TABLE,
297
+ expectedFacts,
298
+ toolCalls: 1,
299
+ title: "summarize JSON/table and store raw payload",
300
+ }),
301
+ "freeflow-owned-tools": async () =>
302
+ freeflowRunObservation(env, {
303
+ command: "node scripts/dump-invoices.js",
304
+ raw: JSON_TABLE,
305
+ expectedFacts,
306
+ goal: "inspect invoice JSON table",
307
+ filters: { include: ["JSON_TABLE_NEEDLE", "12345"], maxLines: 8 },
308
+ }),
309
+ },
310
+ };
272
311
  }
273
312
  function repoSearchFixture(env) {
274
- const rawBytes = byteLength(`${REPO_CODE}\n${GENERATED_DECOY}\n`);
275
- const expectedFacts = ["RequireEscalated", "approval required", "WithAdditionalPermissions"];
276
- return {
277
- id: "repo-text-search-generated-decoy",
278
- title: "Repo text search with generated decoy",
279
- category: "repo-search",
280
- rawBytes,
281
- expectedFacts,
282
- modes: {
283
- "context-mode-normalized-proxy": async () => contextModeProxyObservation(env, {
284
- id: "repo-text-search-generated-decoy",
285
- raw: REPO_CODE,
286
- rawBytes,
287
- expectedFacts,
288
- toolCalls: 1,
289
- title: "repo search result stored by proxy",
290
- }),
291
- "freeflow-owned-tools": async () => freeflowSearchObservation(env, {
292
- rawBytes,
293
- expectedFacts,
294
- query: "RequireEscalated approval required WithAdditionalPermissions",
295
- }),
296
- },
297
- };
313
+ const rawBytes = byteLength(`${REPO_CODE}\n${GENERATED_DECOY}\n`);
314
+ const expectedFacts = ["RequireEscalated", "approval required", "WithAdditionalPermissions"];
315
+ return {
316
+ id: "repo-text-search-generated-decoy",
317
+ title: "Repo text search with generated decoy",
318
+ category: "repo-search",
319
+ rawBytes,
320
+ expectedFacts,
321
+ modes: {
322
+ "context-mode-normalized-proxy": async () =>
323
+ contextModeProxyObservation(env, {
324
+ id: "repo-text-search-generated-decoy",
325
+ raw: REPO_CODE,
326
+ rawBytes,
327
+ expectedFacts,
328
+ toolCalls: 1,
329
+ title: "repo search result stored by proxy",
330
+ }),
331
+ "freeflow-owned-tools": async () =>
332
+ freeflowSearchObservation(env, {
333
+ rawBytes,
334
+ expectedFacts,
335
+ query: "RequireEscalated approval required WithAdditionalPermissions",
336
+ }),
337
+ },
338
+ };
298
339
  }
299
340
  function batchFixture(env) {
300
- const raw = [TEST_STDOUT, SERVICE_LOG, DOC_TEXT].join("\n---\n");
301
- const expectedFacts = ["AUTH_TOKEN scoped", "RATE_LIMIT", "details.result.steps"];
302
- return {
303
- id: "batch-multi-command-query",
304
- title: "Batch multi-query/multi-command case",
305
- category: "batch",
306
- rawBytes: byteLength(raw),
307
- expectedFacts,
308
- modes: {
309
- "context-mode-normalized-proxy": async () => contextModeProxyObservation(env, {
310
- id: "batch-multi-command-query",
311
- raw,
312
- expectedFacts: ["AUTH_TOKEN scoped", "RATE_LIMIT", "Recovery Contract"],
313
- toolCalls: 3,
314
- title: "three independent stored context operations",
315
- }),
316
- "freeflow-owned-tools": async () => freeflowBatchObservation(env, {
317
- rawBytes: byteLength(raw),
318
- expectedFacts,
319
- }),
320
- },
321
- };
341
+ const raw = [TEST_STDOUT, SERVICE_LOG, DOC_TEXT].join("\n---\n");
342
+ const expectedFacts = ["AUTH_TOKEN scoped", "RATE_LIMIT", "details.result.steps"];
343
+ return {
344
+ id: "batch-multi-command-query",
345
+ title: "Batch multi-query/multi-command case",
346
+ category: "batch",
347
+ rawBytes: byteLength(raw),
348
+ expectedFacts,
349
+ modes: {
350
+ "context-mode-normalized-proxy": async () =>
351
+ contextModeProxyObservation(env, {
352
+ id: "batch-multi-command-query",
353
+ raw,
354
+ expectedFacts: ["AUTH_TOKEN scoped", "RATE_LIMIT", "Recovery Contract"],
355
+ toolCalls: 3,
356
+ title: "three independent stored context operations",
357
+ }),
358
+ "freeflow-owned-tools": async () =>
359
+ freeflowBatchObservation(env, {
360
+ rawBytes: byteLength(raw),
361
+ expectedFacts,
362
+ }),
363
+ },
364
+ };
322
365
  }
323
366
  async function runFixtureMode(fixture, mode, env, iterations) {
324
- const latencies = [];
325
- let observation;
326
- for (let index = 0; index < iterations; index += 1) {
327
- const startedAt = performance.now();
328
- observation = await fixture.modes[mode](env);
329
- latencies.push(performance.now() - startedAt);
330
- }
331
- if (!observation) {
332
- observation = {
333
- toolPathUsed: mode,
334
- rawBytes: fixture.rawBytes,
335
- modelVisibleText: "",
336
- detailsPayload: {},
337
- storageBytes: 0,
338
- toolCalls: 0,
339
- recoveryAvailable: false,
340
- recoveryDetail: "No observation produced.",
341
- };
342
- }
343
- const modelVisibleBytes = byteLength(observation.modelVisibleText);
344
- const detailsPayloadBytes = byteLength(JSON.stringify(observation.detailsPayload));
345
- const answerAccuracy = fixture.expectedFacts.every((fact) => observation.modelVisibleText.includes(fact));
346
- const exactFactsPreserved = answerAccuracy || observation.recoveryAvailable;
347
- return {
348
- mode,
349
- toolPathUsed: observation.toolPathUsed,
350
- rawBytes: observation.rawBytes,
351
- modelVisibleBytes,
352
- modelVisibleTokensApprox: approximateTokens(modelVisibleBytes),
353
- detailsPayloadBytes,
354
- storageBytes: observation.storageBytes,
355
- toolCalls: observation.toolCalls,
356
- latencyMs: latencySummary(latencies),
357
- modelVisibleReductionPercent: reductionPercent(observation.rawBytes, modelVisibleBytes),
358
- answerAccuracy,
359
- exactFactsPreserved,
360
- recoveryAvailable: observation.recoveryAvailable,
361
- recoveryDetail: observation.recoveryDetail,
362
- notes: observation.notes ?? [],
367
+ const latencies = [];
368
+ let observation;
369
+ for (let index = 0; index < iterations; index += 1) {
370
+ const startedAt = performance.now();
371
+ observation = await fixture.modes[mode](env);
372
+ latencies.push(performance.now() - startedAt);
373
+ }
374
+ if (!observation) {
375
+ observation = {
376
+ toolPathUsed: mode,
377
+ rawBytes: fixture.rawBytes,
378
+ modelVisibleText: "",
379
+ detailsPayload: {},
380
+ storageBytes: 0,
381
+ toolCalls: 0,
382
+ recoveryAvailable: false,
383
+ recoveryDetail: "No observation produced.",
363
384
  };
385
+ }
386
+ const modelVisibleBytes = byteLength(observation.modelVisibleText);
387
+ const detailsPayloadBytes = byteLength(JSON.stringify(observation.detailsPayload));
388
+ const answerAccuracy = fixture.expectedFacts.every((fact) => observation.modelVisibleText.includes(fact));
389
+ const exactFactsPreserved = answerAccuracy || observation.recoveryAvailable;
390
+ return {
391
+ mode,
392
+ toolPathUsed: observation.toolPathUsed,
393
+ rawBytes: observation.rawBytes,
394
+ modelVisibleBytes,
395
+ modelVisibleTokensApprox: approximateTokens(modelVisibleBytes),
396
+ detailsPayloadBytes,
397
+ storageBytes: observation.storageBytes,
398
+ toolCalls: observation.toolCalls,
399
+ latencyMs: latencySummary(latencies),
400
+ modelVisibleReductionPercent: reductionPercent(observation.rawBytes, modelVisibleBytes),
401
+ answerAccuracy,
402
+ exactFactsPreserved,
403
+ recoveryAvailable: observation.recoveryAvailable,
404
+ recoveryDetail: observation.recoveryDetail,
405
+ notes: observation.notes ?? [],
406
+ };
364
407
  }
365
408
  async function contextModeProxyObservation(env, options) {
366
- const outputId = contextOutputId(options.id, options.raw);
367
- const path = join(env.contextStoreRoot, `${outputId}.txt`);
368
- await writeFile(path, options.raw, "utf8");
369
- const relevant = relevantSnippet(options.raw, options.expectedFacts, COMPACT_CONTEXT_CAP_BYTES);
370
- const modelVisibleText = [
371
- `context-mode-proxy ${options.title}`,
372
- `handle=${outputId}`,
373
- relevant,
374
- `recovery: exact raw payload stored at handle=${outputId}`,
375
- ].join("\n");
376
- return {
377
- toolPathUsed: "context-mode-normalized-proxy: bounded snippet plus exact synthetic store handle",
378
- rawBytes: options.rawBytes ?? byteLength(options.raw),
379
- modelVisibleText,
380
- detailsPayload: { outputId, path, note: "synthetic normalized proxy, not external runtime" },
381
- storageBytes: byteLength(options.raw),
382
- toolCalls: options.toolCalls,
383
- recoveryAvailable: true,
384
- recoveryDetail: `Exact fixture payload stored at ${outputId}.`,
385
- notes: ["normalized proxy, not actual Context Mode runtime"],
386
- };
409
+ const outputId = contextOutputId(options.id, options.raw);
410
+ const path = join(env.contextStoreRoot, `${outputId}.txt`);
411
+ await writeFile(path, options.raw, "utf8");
412
+ const relevant = relevantSnippet(options.raw, options.expectedFacts, COMPACT_CONTEXT_CAP_BYTES);
413
+ const modelVisibleText = [
414
+ `context-mode-proxy ${options.title}`,
415
+ `handle=${outputId}`,
416
+ relevant,
417
+ `recovery: exact raw payload stored at handle=${outputId}`,
418
+ ].join("\n");
419
+ return {
420
+ toolPathUsed: "context-mode-normalized-proxy: bounded snippet plus exact synthetic store handle",
421
+ rawBytes: options.rawBytes ?? byteLength(options.raw),
422
+ modelVisibleText,
423
+ detailsPayload: { outputId, path, note: "synthetic normalized proxy, not external runtime" },
424
+ storageBytes: byteLength(options.raw),
425
+ toolCalls: options.toolCalls,
426
+ recoveryAvailable: true,
427
+ recoveryDetail: `Exact fixture payload stored at ${outputId}.`,
428
+ notes: ["normalized proxy, not actual Context Mode runtime"],
429
+ };
387
430
  }
388
431
  async function freeflowRunObservation(env, options) {
389
- const before = await directoryByteSize(env.vaultRoot);
390
- const result = await freeflowRun({
391
- command: options.command,
392
- sessionId: env.sessionId,
393
- vaultRoot: env.vaultRoot,
394
- preserve: "important",
395
- goal: options.goal,
396
- ...(options.filters !== undefined ? { filters: options.filters } : {}),
397
- }, env.commandRunner);
398
- const after = await directoryByteSize(env.vaultRoot);
399
- return {
400
- toolPathUsed: "freeflow_run",
401
- rawBytes: byteLength(options.raw),
402
- modelVisibleText: freeflowVisibleText(result),
403
- detailsPayload: result,
404
- storageBytes: Math.max(0, after - before),
405
- toolCalls: 1,
406
- recoveryAvailable: Boolean(result.recovery?.how),
407
- recoveryDetail: result.recovery?.how ?? "No recovery hint.",
408
- notes: [result.routing.reason],
409
- };
432
+ const before = await directoryByteSize(env.vaultRoot);
433
+ const result = await freeflowRun(
434
+ {
435
+ command: options.command,
436
+ sessionId: env.sessionId,
437
+ vaultRoot: env.vaultRoot,
438
+ preserve: "important",
439
+ goal: options.goal,
440
+ ...(options.filters !== undefined ? { filters: options.filters } : {}),
441
+ },
442
+ env.commandRunner,
443
+ );
444
+ const after = await directoryByteSize(env.vaultRoot);
445
+ return {
446
+ toolPathUsed: "freeflow_run",
447
+ rawBytes: byteLength(options.raw),
448
+ modelVisibleText: freeflowVisibleText(result),
449
+ detailsPayload: result,
450
+ storageBytes: Math.max(0, after - before),
451
+ toolCalls: 1,
452
+ recoveryAvailable: Boolean(result.recovery?.how),
453
+ recoveryDetail: result.recovery?.how ?? "No recovery hint.",
454
+ notes: [result.routing.reason],
455
+ };
410
456
  }
411
457
  async function freeflowSearchObservation(env, options) {
412
- const before = await directoryByteSize(env.vaultRoot);
413
- const result = await freeflowSearch({
414
- action: "query",
415
- source: { kind: "repo", root: env.repoRoot },
416
- query: options.query,
417
- topK: 1,
418
- preserve: "important",
419
- });
420
- const after = await directoryByteSize(env.vaultRoot);
421
- return {
422
- toolPathUsed: "freeflow_search query repo",
423
- rawBytes: options.rawBytes,
424
- modelVisibleText: freeflowVisibleText(result),
425
- detailsPayload: result,
426
- storageBytes: Math.max(0, after - before),
427
- toolCalls: 1,
428
- recoveryAvailable: Boolean(result.recovery?.how || result.evidence?.some((packet) => packet.expandable)),
429
- recoveryDetail: result.recovery?.how ?? "Repo evidence can be recovered by exact path and line range.",
430
- notes: [result.routing.reason],
431
- };
458
+ const before = await directoryByteSize(env.vaultRoot);
459
+ const result = await freeflowSearch({
460
+ action: "query",
461
+ source: { kind: "repo", root: env.repoRoot },
462
+ query: options.query,
463
+ topK: 1,
464
+ preserve: "important",
465
+ });
466
+ const after = await directoryByteSize(env.vaultRoot);
467
+ return {
468
+ toolPathUsed: "freeflow_search query repo",
469
+ rawBytes: options.rawBytes,
470
+ modelVisibleText: freeflowVisibleText(result),
471
+ detailsPayload: result,
472
+ storageBytes: Math.max(0, after - before),
473
+ toolCalls: 1,
474
+ recoveryAvailable: Boolean(result.recovery?.how || result.evidence?.some((packet) => packet.expandable)),
475
+ recoveryDetail: result.recovery?.how ?? "Repo evidence can be recovered by exact path and line range.",
476
+ notes: [result.routing.reason],
477
+ };
432
478
  }
433
479
  async function freeflowBatchObservation(env, options) {
434
- const before = await directoryByteSize(env.vaultRoot);
435
- const result = await freeflowBatch({
436
- sessionId: env.sessionId,
437
- vaultRoot: env.vaultRoot,
438
- preserve: "important",
439
- concurrency: 3,
440
- steps: [
441
- { id: "test", kind: "run", input: { command: "npm test -- --runInBand", goal: "verification" } },
442
- { id: "log", kind: "run", input: { command: "tail -n 250 service.log", goal: "diagnose rate limit log spike", filters: { include: ["RATE_LIMIT", "req_critical_42"], maxLines: 5 } } },
443
- { id: "doc", kind: "search", input: { action: "query", source: { kind: "repo", root: env.repoRoot }, query: "Recovery Contract outputId line-range", topK: 1 } },
444
- ],
445
- }, env.commandRunner);
446
- const after = await directoryByteSize(env.vaultRoot);
447
- const visibleText = `${freeflowVisibleText(result)}\ndetails.result.steps`;
448
- return {
449
- toolPathUsed: "freeflow_batch",
450
- rawBytes: options.rawBytes,
451
- modelVisibleText: visibleText,
452
- detailsPayload: result,
453
- storageBytes: Math.max(0, after - before),
454
- toolCalls: 1,
455
- recoveryAvailable: Boolean(result.recovery?.how),
456
- recoveryDetail: result.recovery?.how ?? "Inspect child step recovery hints.",
457
- notes: [result.routing.reason],
458
- };
480
+ const before = await directoryByteSize(env.vaultRoot);
481
+ const result = await freeflowBatch(
482
+ {
483
+ sessionId: env.sessionId,
484
+ vaultRoot: env.vaultRoot,
485
+ preserve: "important",
486
+ concurrency: 3,
487
+ steps: [
488
+ { id: "test", kind: "run", input: { command: "npm test -- --runInBand", goal: "verification" } },
489
+ {
490
+ id: "log",
491
+ kind: "run",
492
+ input: {
493
+ command: "tail -n 250 service.log",
494
+ goal: "diagnose rate limit log spike",
495
+ filters: { include: ["RATE_LIMIT", "req_critical_42"], maxLines: 5 },
496
+ },
497
+ },
498
+ {
499
+ id: "doc",
500
+ kind: "search",
501
+ input: {
502
+ action: "query",
503
+ source: { kind: "repo", root: env.repoRoot },
504
+ query: "Recovery Contract outputId line-range",
505
+ topK: 1,
506
+ },
507
+ },
508
+ ],
509
+ },
510
+ env.commandRunner,
511
+ );
512
+ const after = await directoryByteSize(env.vaultRoot);
513
+ const visibleText = `${freeflowVisibleText(result)}\ndetails.result.steps`;
514
+ return {
515
+ toolPathUsed: "freeflow_batch",
516
+ rawBytes: options.rawBytes,
517
+ modelVisibleText: visibleText,
518
+ detailsPayload: result,
519
+ storageBytes: Math.max(0, after - before),
520
+ toolCalls: 1,
521
+ recoveryAvailable: Boolean(result.recovery?.how),
522
+ recoveryDetail: result.recovery?.how ?? "Inspect child step recovery hints.",
523
+ notes: [result.routing.reason],
524
+ };
459
525
  }
460
526
  function summarizeContextModeReport(fixtures) {
461
- const freeflow = summarizeMode(fixtures, "freeflow-owned-tools");
462
- const contextModeProxy = summarizeMode(fixtures, "context-mode-normalized-proxy");
463
- const freeflowBetterModelVisibleBytes = fixtures.filter((fixture) => {
464
- const freeflowResult = fixture.results.find((result) => result.mode === "freeflow-owned-tools");
465
- const proxyResult = fixture.results.find((result) => result.mode === "context-mode-normalized-proxy");
466
- return Boolean(freeflowResult && proxyResult && freeflowResult.modelVisibleBytes < proxyResult.modelVisibleBytes);
467
- }).length;
468
- const freeflowBetterToolCalls = fixtures.filter((fixture) => {
469
- const freeflowResult = fixture.results.find((result) => result.mode === "freeflow-owned-tools");
470
- const proxyResult = fixture.results.find((result) => result.mode === "context-mode-normalized-proxy");
471
- return Boolean(freeflowResult && proxyResult && freeflowResult.toolCalls < proxyResult.toolCalls);
472
- }).length;
473
- return {
474
- fixtures: fixtures.length,
475
- modeResults: fixtures.reduce((count, fixture) => count + fixture.results.length, 0),
476
- freeflow,
477
- contextModeProxy,
478
- freeflowBetterModelVisibleBytes,
479
- freeflowBetterToolCalls,
480
- allFreeflowFactsPreserved: freeflow.exactFactsPreserved === fixtures.length,
481
- allFreeflowRecoveryAvailable: freeflow.recoveryAvailable === fixtures.length,
482
- publicClaimsAllowed: false,
483
- };
527
+ const freeflow = summarizeMode(fixtures, "freeflow-owned-tools");
528
+ const contextModeProxy = summarizeMode(fixtures, "context-mode-normalized-proxy");
529
+ const freeflowBetterModelVisibleBytes = fixtures.filter((fixture) => {
530
+ const freeflowResult = fixture.results.find((result) => result.mode === "freeflow-owned-tools");
531
+ const proxyResult = fixture.results.find((result) => result.mode === "context-mode-normalized-proxy");
532
+ return Boolean(freeflowResult && proxyResult && freeflowResult.modelVisibleBytes < proxyResult.modelVisibleBytes);
533
+ }).length;
534
+ const freeflowBetterToolCalls = fixtures.filter((fixture) => {
535
+ const freeflowResult = fixture.results.find((result) => result.mode === "freeflow-owned-tools");
536
+ const proxyResult = fixture.results.find((result) => result.mode === "context-mode-normalized-proxy");
537
+ return Boolean(freeflowResult && proxyResult && freeflowResult.toolCalls < proxyResult.toolCalls);
538
+ }).length;
539
+ return {
540
+ fixtures: fixtures.length,
541
+ modeResults: fixtures.reduce((count, fixture) => count + fixture.results.length, 0),
542
+ freeflow,
543
+ contextModeProxy,
544
+ freeflowBetterModelVisibleBytes,
545
+ freeflowBetterToolCalls,
546
+ allFreeflowFactsPreserved: freeflow.exactFactsPreserved === fixtures.length,
547
+ allFreeflowRecoveryAvailable: freeflow.recoveryAvailable === fixtures.length,
548
+ publicClaimsAllowed: false,
549
+ };
484
550
  }
485
551
  function summarizeMode(fixtures, mode) {
486
- const results = fixtures
487
- .map((fixture) => fixture.results.find((result) => result.mode === mode))
488
- .filter((result) => Boolean(result));
489
- const totalRawBytes = results.reduce((sum, result) => sum + result.rawBytes, 0);
490
- const totalModelVisibleBytes = results.reduce((sum, result) => sum + result.modelVisibleBytes, 0);
491
- return results.reduce((summary, result) => {
492
- const passed = result.exactFactsPreserved && result.recoveryAvailable;
493
- if (passed) {
494
- summary.passed += 1;
495
- }
496
- else {
497
- summary.failed += 1;
498
- }
499
- if (result.answerAccuracy) {
500
- summary.answerAccurate += 1;
501
- }
502
- if (result.exactFactsPreserved) {
503
- summary.exactFactsPreserved += 1;
504
- }
505
- if (result.recoveryAvailable) {
506
- summary.recoveryAvailable += 1;
507
- }
508
- summary.totalToolCalls += result.toolCalls;
509
- summary.totalStorageBytes += result.storageBytes;
510
- return summary;
511
- }, {
512
- passed: 0,
513
- failed: 0,
514
- answerAccurate: 0,
515
- exactFactsPreserved: 0,
516
- recoveryAvailable: 0,
517
- totalRawBytes,
518
- totalModelVisibleBytes,
519
- totalModelVisibleTokensApprox: approximateTokens(totalModelVisibleBytes),
520
- totalToolCalls: 0,
521
- totalStorageBytes: 0,
522
- weightedModelVisibleReductionPercent: reductionPercent(totalRawBytes, totalModelVisibleBytes),
523
- });
552
+ const results = fixtures
553
+ .map((fixture) => fixture.results.find((result) => result.mode === mode))
554
+ .filter((result) => Boolean(result));
555
+ const totalRawBytes = results.reduce((sum, result) => sum + result.rawBytes, 0);
556
+ const totalModelVisibleBytes = results.reduce((sum, result) => sum + result.modelVisibleBytes, 0);
557
+ return results.reduce(
558
+ (summary, result) => {
559
+ const passed = result.exactFactsPreserved && result.recoveryAvailable;
560
+ if (passed) {
561
+ summary.passed += 1;
562
+ } else {
563
+ summary.failed += 1;
564
+ }
565
+ if (result.answerAccuracy) {
566
+ summary.answerAccurate += 1;
567
+ }
568
+ if (result.exactFactsPreserved) {
569
+ summary.exactFactsPreserved += 1;
570
+ }
571
+ if (result.recoveryAvailable) {
572
+ summary.recoveryAvailable += 1;
573
+ }
574
+ summary.totalToolCalls += result.toolCalls;
575
+ summary.totalStorageBytes += result.storageBytes;
576
+ return summary;
577
+ },
578
+ {
579
+ passed: 0,
580
+ failed: 0,
581
+ answerAccurate: 0,
582
+ exactFactsPreserved: 0,
583
+ recoveryAvailable: 0,
584
+ totalRawBytes,
585
+ totalModelVisibleBytes,
586
+ totalModelVisibleTokensApprox: approximateTokens(totalModelVisibleBytes),
587
+ totalToolCalls: 0,
588
+ totalStorageBytes: 0,
589
+ weightedModelVisibleReductionPercent: reductionPercent(totalRawBytes, totalModelVisibleBytes),
590
+ },
591
+ );
524
592
  }
525
593
  async function setupRepo(repoRoot) {
526
- await mkdir(join(repoRoot, "plugin-docs"), { recursive: true });
527
- await mkdir(join(repoRoot, "src"), { recursive: true });
528
- await mkdir(join(repoRoot, "graphify-out"), { recursive: true });
529
- await writeFile(join(repoRoot, "plugin-docs/output-router.md"), DOC_TEXT, "utf8");
530
- await writeFile(join(repoRoot, "src/sandbox.ts"), REPO_CODE, "utf8");
531
- await writeFile(join(repoRoot, "graphify-out/graph.html"), GENERATED_DECOY, "utf8");
594
+ await mkdir(join(repoRoot, "plugin-docs"), { recursive: true });
595
+ await mkdir(join(repoRoot, "src"), { recursive: true });
596
+ await mkdir(join(repoRoot, "graphify-out"), { recursive: true });
597
+ await writeFile(join(repoRoot, "plugin-docs/output-router.md"), DOC_TEXT, "utf8");
598
+ await writeFile(join(repoRoot, "src/sandbox.ts"), REPO_CODE, "utf8");
599
+ await writeFile(join(repoRoot, "graphify-out/graph.html"), GENERATED_DECOY, "utf8");
532
600
  }
533
601
  function fixtureCommandRunner() {
534
- return {
535
- async run(request) {
536
- const command = Array.isArray(request.command) ? request.command.join(" ") : request.command;
537
- if (command.includes("npm test")) {
538
- return {
539
- stdout: `${TEST_STDOUT}\n`,
540
- stderr: `${BUILD_STDERR}\n`,
541
- combined: `STDOUT:\n${TEST_STDOUT}\n\nSTDERR:\n${BUILD_STDERR}\n`,
542
- executionStatus: "failed",
543
- exitCode: 1,
544
- durationMs: 4210,
545
- };
546
- }
547
- if (command.includes("service.log")) {
548
- return {
549
- stdout: `${SERVICE_LOG}\n`,
550
- stderr: "",
551
- combined: `${SERVICE_LOG}\n`,
552
- executionStatus: "success",
553
- exitCode: 0,
554
- durationMs: 120,
555
- };
556
- }
557
- if (command.includes("dump-invoices")) {
558
- return {
559
- stdout: `${JSON_TABLE}\n`,
560
- stderr: "",
561
- combined: `${JSON_TABLE}\n`,
562
- executionStatus: "success",
563
- exitCode: 0,
564
- durationMs: 80,
565
- };
566
- }
567
- return {
568
- stdout: "",
569
- stderr: `Unknown benchmark command: ${command}\n`,
570
- combined: `Unknown benchmark command: ${command}\n`,
571
- executionStatus: "failed",
572
- exitCode: 127,
573
- durationMs: 1,
574
- };
575
- },
576
- };
602
+ return {
603
+ async run(request) {
604
+ const command = Array.isArray(request.command) ? request.command.join(" ") : request.command;
605
+ if (command.includes("npm test")) {
606
+ return {
607
+ stdout: `${TEST_STDOUT}\n`,
608
+ stderr: `${BUILD_STDERR}\n`,
609
+ combined: `STDOUT:\n${TEST_STDOUT}\n\nSTDERR:\n${BUILD_STDERR}\n`,
610
+ executionStatus: "failed",
611
+ exitCode: 1,
612
+ durationMs: 4210,
613
+ };
614
+ }
615
+ if (command.includes("service.log")) {
616
+ return {
617
+ stdout: `${SERVICE_LOG}\n`,
618
+ stderr: "",
619
+ combined: `${SERVICE_LOG}\n`,
620
+ executionStatus: "success",
621
+ exitCode: 0,
622
+ durationMs: 120,
623
+ };
624
+ }
625
+ if (command.includes("dump-invoices")) {
626
+ return {
627
+ stdout: `${JSON_TABLE}\n`,
628
+ stderr: "",
629
+ combined: `${JSON_TABLE}\n`,
630
+ executionStatus: "success",
631
+ exitCode: 0,
632
+ durationMs: 80,
633
+ };
634
+ }
635
+ return {
636
+ stdout: "",
637
+ stderr: `Unknown benchmark command: ${command}\n`,
638
+ combined: `Unknown benchmark command: ${command}\n`,
639
+ executionStatus: "failed",
640
+ exitCode: 127,
641
+ durationMs: 1,
642
+ };
643
+ },
644
+ };
577
645
  }
578
646
  function freeflowVisibleText(result) {
579
- const lines = [
580
- resultSummary(result),
581
- result.routing?.reason ?? "",
582
- ];
583
- if ("importantLines" in result && Array.isArray(result.importantLines)) {
584
- lines.push(...result.importantLines.map((line) => line.excerpt));
585
- }
586
- if ("evidence" in result && Array.isArray(result.evidence)) {
587
- lines.push(...result.evidence.map((packet) => packet.excerpt));
588
- }
589
- if ("steps" in result && Array.isArray(result.steps)) {
590
- lines.push(...result.steps.slice(0, 3).map((step) => `${step.id}:${step.status}:${resultSummary(step.result)}`));
591
- }
592
- if (result.recovery?.how) {
593
- lines.push(result.recovery.how);
594
- }
595
- return lines.filter(Boolean).join("\n");
647
+ const lines = [resultSummary(result), result.routing?.reason ?? ""];
648
+ if ("importantLines" in result && Array.isArray(result.importantLines)) {
649
+ lines.push(...result.importantLines.map((line) => line.excerpt));
650
+ }
651
+ if ("evidence" in result && Array.isArray(result.evidence)) {
652
+ lines.push(...result.evidence.map((packet) => packet.excerpt));
653
+ }
654
+ if ("steps" in result && Array.isArray(result.steps)) {
655
+ lines.push(...result.steps.slice(0, 3).map((step) => `${step.id}:${step.status}:${resultSummary(step.result)}`));
656
+ }
657
+ if (result.recovery?.how) {
658
+ lines.push(result.recovery.how);
659
+ }
660
+ return lines.filter(Boolean).join("\n");
596
661
  }
597
662
  function resultSummary(result) {
598
- if (typeof result !== "object" || result === null || !("summary" in result)) {
599
- return "";
600
- }
601
- const summary = result.summary;
602
- return typeof summary === "string" ? summary : "";
663
+ if (typeof result !== "object" || result === null || !("summary" in result)) {
664
+ return "";
665
+ }
666
+ const summary = result.summary;
667
+ return typeof summary === "string" ? summary : "";
603
668
  }
604
669
  function relevantSnippet(raw, facts, capBytes) {
605
- const lines = raw.split(/\r?\n/);
606
- const selected = [];
607
- for (const fact of facts) {
608
- const index = lines.findIndex((line) => line.includes(fact));
609
- if (index >= 0) {
610
- const start = Math.max(0, index - 1);
611
- const end = Math.min(lines.length, index + 2);
612
- selected.push(...lines.slice(start, end));
613
- }
670
+ const lines = raw.split(/\r?\n/);
671
+ const selected = [];
672
+ for (const fact of facts) {
673
+ const index = lines.findIndex((line) => line.includes(fact));
674
+ if (index >= 0) {
675
+ const start = Math.max(0, index - 1);
676
+ const end = Math.min(lines.length, index + 2);
677
+ selected.push(...lines.slice(start, end));
614
678
  }
615
- const deduped = [...new Set(selected.length ? selected : lines.slice(0, 8))];
616
- return truncateToBytes(deduped.join("\n"), capBytes);
679
+ }
680
+ const deduped = [...new Set(selected.length ? selected : lines.slice(0, 8))];
681
+ return truncateToBytes(deduped.join("\n"), capBytes);
617
682
  }
618
683
  function truncateToBytes(value, capBytes) {
619
- if (byteLength(value) <= capBytes) {
620
- return value;
621
- }
622
- let end = Math.min(value.length, capBytes);
623
- while (end > 0 && byteLength(value.slice(0, end)) > capBytes) {
624
- end -= 1;
625
- }
626
- return `${value.slice(0, end)}\n… [truncated]`;
684
+ if (byteLength(value) <= capBytes) {
685
+ return value;
686
+ }
687
+ let end = Math.min(value.length, capBytes);
688
+ while (end > 0 && byteLength(value.slice(0, end)) > capBytes) {
689
+ end -= 1;
690
+ }
691
+ return `${value.slice(0, end)}\n… [truncated]`;
627
692
  }
628
693
  async function directoryByteSize(path) {
629
- try {
630
- const entries = await readDirectoryRecursive(path);
631
- let total = 0;
632
- for (const file of entries) {
633
- try {
634
- total += byteLength(await readFile(file, "utf8"));
635
- }
636
- catch {
637
- // ignore non-text or transient files in benchmark temp dirs
638
- }
639
- }
640
- return total;
641
- }
642
- catch {
643
- return 0;
694
+ try {
695
+ const entries = await readDirectoryRecursive(path);
696
+ let total = 0;
697
+ for (const file of entries) {
698
+ try {
699
+ total += byteLength(await readFile(file, "utf8"));
700
+ } catch {
701
+ // ignore non-text or transient files in benchmark temp dirs
702
+ }
644
703
  }
704
+ return total;
705
+ } catch {
706
+ return 0;
707
+ }
645
708
  }
646
709
  async function readDirectoryRecursive(path) {
647
- const { readdir, stat } = await import("node:fs/promises");
648
- const entries = await readdir(path, { withFileTypes: true });
649
- const files = [];
650
- for (const entry of entries) {
651
- const child = join(path, entry.name);
652
- if (entry.isDirectory()) {
653
- files.push(...await readDirectoryRecursive(child));
654
- }
655
- else if (entry.isFile()) {
656
- const childStat = await stat(child);
657
- if (childStat.size <= 2_000_000) {
658
- files.push(child);
659
- }
660
- }
710
+ const { readdir, stat } = await import("node:fs/promises");
711
+ const entries = await readdir(path, { withFileTypes: true });
712
+ const files = [];
713
+ for (const entry of entries) {
714
+ const child = join(path, entry.name);
715
+ if (entry.isDirectory()) {
716
+ files.push(...(await readDirectoryRecursive(child)));
717
+ } else if (entry.isFile()) {
718
+ const childStat = await stat(child);
719
+ if (childStat.size <= 2_000_000) {
720
+ files.push(child);
721
+ }
661
722
  }
662
- return files;
723
+ }
724
+ return files;
663
725
  }
664
726
  async function createTempDir(prefix) {
665
- const path = await mkdtemp(resolve(tmpdir(), prefix));
666
- return {
667
- path,
668
- cleanup: async () => {
669
- await rm(path, { recursive: true, force: true });
670
- },
671
- };
727
+ const path = await mkdtemp(resolve(tmpdir(), prefix));
728
+ return {
729
+ path,
730
+ cleanup: async () => {
731
+ await rm(path, { recursive: true, force: true });
732
+ },
733
+ };
672
734
  }
673
735
  function contextModeModes() {
674
- return ["context-mode-normalized-proxy", "freeflow-owned-tools"];
736
+ return ["context-mode-normalized-proxy", "freeflow-owned-tools"];
675
737
  }
676
738
  function contextOutputId(id, raw) {
677
- return `ctxout_${createHash("sha256").update(`${id}\0${raw}`).digest("hex").slice(0, 24)}`;
739
+ return `ctxout_${createHash("sha256").update(`${id}\0${raw}`).digest("hex").slice(0, 24)}`;
678
740
  }
679
741
  function byteLength(value) {
680
- return Buffer.byteLength(value, "utf8");
742
+ return Buffer.byteLength(value, "utf8");
681
743
  }
682
744
  function defaultReportPath() {
683
- return resolve(process.cwd(), "evals/reports/runtime/context-mode-normalized-benchmark-1-report.md");
745
+ return resolve(process.cwd(), "router/evals/reports/context-mode-normalized-benchmark-1-report.md");
684
746
  }
685
747
  async function runCli() {
686
- const { iterations, reportPath, jsonReportPath } = parseBenchmarkCliArgs(process.argv.slice(2), { reportPath: defaultReportPath() });
687
- const options = {};
688
- if (iterations !== undefined) {
689
- options.iterations = iterations;
690
- }
691
- const report = await runContextModeNormalizedBenchmarks(options);
692
- const reports = await writeContextModeNormalizedBenchmarkReports(report, reportPath, {
693
- jsonReportPath: jsonReportPath === undefined ? defaultJsonRunReportPath(reportPath) : jsonReportPath,
694
- });
695
- const shortId = createHash("sha256").update(JSON.stringify(report.summary)).digest("hex").slice(0, 8);
696
- console.log(`Freeflow Context Mode normalized benchmark ${shortId}: freeflow ${report.summary.freeflow.passed}/${report.summary.fixtures}, proxy ${report.summary.contextModeProxy.passed}/${report.summary.fixtures}`);
697
- console.log(`Markdown report: ${reports.markdown}`);
698
- if (reports.json) {
699
- console.log(`JSON run data: ${reports.json}`);
700
- }
701
- if (report.summary.freeflow.failed > 0 || report.summary.contextModeProxy.failed > 0) {
702
- process.exitCode = 1;
703
- }
748
+ const { iterations, reportPath, jsonReportPath } = parseBenchmarkCliArgs(process.argv.slice(2), {
749
+ reportPath: defaultReportPath(),
750
+ });
751
+ const options = {};
752
+ if (iterations !== undefined) {
753
+ options.iterations = iterations;
754
+ }
755
+ const report = await runContextModeNormalizedBenchmarks(options);
756
+ const reports = await writeContextModeNormalizedBenchmarkReports(report, reportPath, {
757
+ jsonReportPath: jsonReportPath === undefined ? defaultJsonRunReportPath(reportPath) : jsonReportPath,
758
+ });
759
+ const shortId = createHash("sha256").update(JSON.stringify(report.summary)).digest("hex").slice(0, 8);
760
+ console.log(
761
+ `Freeflow Context Mode normalized benchmark ${shortId}: freeflow ${report.summary.freeflow.passed}/${report.summary.fixtures}, proxy ${report.summary.contextModeProxy.passed}/${report.summary.fixtures}`,
762
+ );
763
+ console.log(`Markdown report: ${reports.markdown}`);
764
+ if (reports.json) {
765
+ console.log(`JSON run data: ${reports.json}`);
766
+ }
767
+ if (report.summary.freeflow.failed > 0 || report.summary.contextModeProxy.failed > 0) {
768
+ process.exitCode = 1;
769
+ }
704
770
  }
705
771
  if (process.argv[1] && fileURLToPath(import.meta.url) === resolve(process.argv[1])) {
706
- await runCli();
772
+ await runCli();
707
773
  }