@hassangameryt/freeflow 0.3.0 → 0.5.0

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