@hassangameryt/freeflow 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +5 -2
  3. package/.codex-plugin/plugin.json +8 -9
  4. package/README.md +190 -128
  5. package/assets/feedback-loop.png +0 -0
  6. package/assets/freeflow_workflow_map.png +0 -0
  7. package/assets/workflow.png +0 -0
  8. package/command-surface.json +51 -7
  9. package/hooks/freeflow-runtime-context.mjs +264 -136
  10. package/hooks/tests/check-runtime-context-hook.sh +223 -0
  11. package/package.json +23 -24
  12. package/pi-extension/dist/index.js +264 -80
  13. package/pi-extension/dist/integrations/mcp-config.js +29 -0
  14. package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
  15. package/pi-extension/dist/output-router/native-safety-net.js +216 -0
  16. package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
  17. package/pi-extension/dist/output-router/renderers.js +1023 -0
  18. package/pi-extension/dist/output-router/router-tools.js +554 -0
  19. package/pi-extension/dist/output-router/schemas.js +383 -0
  20. package/pi-extension/dist/output-router/status.js +744 -0
  21. package/pi-extension/dist/output-router/utils.js +502 -0
  22. package/pi-extension/dist/runtime/runtime-context.js +798 -0
  23. package/pi-extension/dist/settings/settings-tui.js +314 -0
  24. package/pi-extension/dist/settings/settings-ui.js +1487 -0
  25. package/pi-extension/freeflow/index.js +1 -0
  26. package/pi-extension/src/index.ts +230 -56
  27. package/pi-extension/src/{host-producer-identification.ts → output-router/host-producer-identification.ts} +37 -7
  28. package/pi-extension/src/{native-safety-net.ts → output-router/native-safety-net.ts} +7 -11
  29. package/pi-extension/src/{observed-tool-routing.ts → output-router/observed-tool-routing.ts} +19 -11
  30. package/pi-extension/src/{renderers.ts → output-router/renderers.ts} +246 -55
  31. package/pi-extension/src/{router-tools.ts → output-router/router-tools.ts} +130 -29
  32. package/pi-extension/src/{schemas.ts → output-router/schemas.ts} +171 -43
  33. package/pi-extension/src/output-router/status.ts +791 -0
  34. package/pi-extension/src/{utils.ts → output-router/utils.ts} +80 -18
  35. package/pi-extension/src/runtime/runtime-context.ts +895 -0
  36. package/pi-extension/src/settings/settings-tui.ts +408 -0
  37. package/pi-extension/src/settings/settings-ui.ts +1730 -0
  38. package/pi-extension/tests/integration/pi-extension.test.js +4018 -0
  39. package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
  40. package/pi-extension/tests/output-router/search.test.js +722 -0
  41. package/pi-extension/tests/settings/settings-tui.test.js +243 -0
  42. package/router/dist/benchmarks/benchmark-harness.d.ts +16 -13
  43. package/router/dist/benchmarks/benchmark-harness.js +62 -62
  44. package/router/dist/benchmarks/benchmarks.d.ts +80 -73
  45. package/router/dist/benchmarks/benchmarks.js +860 -761
  46. package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +71 -67
  47. package/router/dist/benchmarks/codex-qa-benchmarks.js +429 -390
  48. package/router/dist/benchmarks/command-benchmarks.d.ts +107 -92
  49. package/router/dist/benchmarks/command-benchmarks.js +616 -571
  50. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +64 -56
  51. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +679 -613
  52. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +103 -95
  53. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1188 -1103
  54. package/router/dist/benchmarks/context-saving-baseline.d.ts +47 -41
  55. package/router/dist/benchmarks/context-saving-baseline.js +405 -374
  56. package/router/dist/benchmarks/index-benchmarks.d.ts +74 -69
  57. package/router/dist/benchmarks/index-benchmarks.js +761 -661
  58. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +80 -69
  59. package/router/dist/benchmarks/storage-policy-benchmarks.js +549 -469
  60. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +43 -34
  61. package/router/dist/benchmarks/vault-index-benchmarks.js +294 -229
  62. package/router/dist/config/config.d.ts +61 -54
  63. package/router/dist/config/config.js +551 -372
  64. package/router/dist/config/router-contract.d.ts +2 -2
  65. package/router/dist/config/router-contract.js +38 -38
  66. package/router/dist/config/schema.d.ts +19 -10
  67. package/router/dist/config/schema.js +586 -538
  68. package/router/dist/config/types.d.ts +413 -361
  69. package/router/dist/config/types.js +19 -8
  70. package/router/dist/evidence/bounded-evidence.d.ts +26 -26
  71. package/router/dist/evidence/bounded-evidence.js +265 -252
  72. package/router/dist/evidence/evidence-range-selector.d.ts +16 -14
  73. package/router/dist/evidence/evidence-range-selector.js +192 -191
  74. package/router/dist/evidence/evidence-search.d.ts +18 -16
  75. package/router/dist/evidence/evidence-search.js +401 -377
  76. package/router/dist/evidence/evidence.d.ts +17 -17
  77. package/router/dist/evidence/evidence.js +163 -159
  78. package/router/dist/evidence/failure-contracts.d.ts +25 -15
  79. package/router/dist/evidence/failure-contracts.js +132 -126
  80. package/router/dist/evidence/line-ranges.d.ts +17 -15
  81. package/router/dist/evidence/line-ranges.js +18 -18
  82. package/router/dist/experiments/local-index.d.ts +47 -41
  83. package/router/dist/experiments/local-index.js +477 -458
  84. package/router/dist/local/local-traversal.d.ts +18 -0
  85. package/router/dist/local/local-traversal.js +334 -0
  86. package/router/dist/processing/engine.d.ts +94 -70
  87. package/router/dist/processing/engine.js +462 -364
  88. package/router/dist/processing/reducers.d.ts +208 -194
  89. package/router/dist/processing/reducers.js +1434 -1256
  90. package/router/dist/processing/renderers.d.ts +24 -18
  91. package/router/dist/processing/renderers.js +161 -152
  92. package/router/dist/processing/scripts.d.ts +80 -67
  93. package/router/dist/processing/scripts.js +343 -290
  94. package/router/dist/repo/repo-traversal.d.ts +9 -9
  95. package/router/dist/repo/repo-traversal.js +205 -202
  96. package/router/dist/routing/observed-reducers.d.ts +25 -19
  97. package/router/dist/routing/observed-reducers.js +559 -545
  98. package/router/dist/routing/observed-routing.d.ts +23 -14
  99. package/router/dist/routing/observed-routing.js +319 -318
  100. package/router/dist/routing/parsers.d.ts +10 -10
  101. package/router/dist/routing/parsers.js +454 -406
  102. package/router/dist/routing/run-filters.d.ts +45 -41
  103. package/router/dist/routing/run-filters.js +215 -207
  104. package/router/dist/routing/run-reducers.d.ts +45 -26
  105. package/router/dist/routing/run-reducers.js +102 -90
  106. package/router/dist/sandbox/adapter-roots.d.ts +34 -26
  107. package/router/dist/sandbox/adapter-roots.js +43 -41
  108. package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -5
  109. package/router/dist/sandbox/eryx-python-adapter.js +659 -588
  110. package/router/dist/sandbox/jq-wasm-adapter.d.ts +3 -3
  111. package/router/dist/sandbox/jq-wasm-adapter.js +319 -311
  112. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -5
  113. package/router/dist/sandbox/quickjs-wasi-adapter.js +336 -333
  114. package/router/dist/sandbox/script-sandbox.d.ts +105 -84
  115. package/router/dist/sandbox/script-sandbox.js +294 -260
  116. package/router/dist/setup/script-transform-adapters.d.ts +23 -19
  117. package/router/dist/setup/script-transform-adapters.js +223 -204
  118. package/router/dist/tools/batch.d.ts +27 -16
  119. package/router/dist/tools/batch.js +493 -416
  120. package/router/dist/tools/run.d.ts +47 -35
  121. package/router/dist/tools/run.js +1171 -1086
  122. package/router/dist/tools/search.d.ts +53 -31
  123. package/router/dist/tools/search.js +1224 -1065
  124. package/router/dist/transform/engine.d.ts +121 -96
  125. package/router/dist/transform/engine.js +1853 -1736
  126. package/router/dist/vault/vault-index.d.ts +97 -78
  127. package/router/dist/vault/vault-index.js +347 -342
  128. package/router/dist/vault/vault.d.ts +109 -74
  129. package/router/dist/vault/vault.js +528 -533
  130. package/runtime/interaction-contract.md +16 -0
  131. package/skills/bypass/SKILL.md +52 -38
  132. package/skills/commit-work/SKILL.md +54 -46
  133. package/skills/commit-work/references/staging-decisions.md +46 -24
  134. package/skills/decision-gate/SKILL.md +48 -0
  135. package/skills/design-for-depth/SKILL.md +75 -59
  136. package/skills/design-for-depth/references/design-pressure-signals.md +56 -7
  137. package/skills/design-for-depth/references/interface-design-loop.md +156 -0
  138. package/skills/design-for-depth/references/software-design-philosophy.md +32 -3
  139. package/skills/diagnose-failure/SKILL.md +65 -60
  140. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
  141. package/skills/diagnose-failure/references/flaky-and-performance.md +30 -18
  142. package/skills/discuss/SKILL.md +121 -0
  143. package/skills/discuss/references/checkpoints.md +66 -0
  144. package/skills/evaluate-skill/SKILL.md +62 -53
  145. package/skills/evaluate-skill/references/definition-schema.md +345 -0
  146. package/skills/evaluate-skill/references/evaluation-design.md +86 -0
  147. package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
  148. package/skills/evaluate-skill/references/review-and-revision.md +51 -0
  149. package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
  150. package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
  151. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
  152. package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
  153. package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
  154. package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
  155. package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
  156. package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
  157. package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
  158. package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
  159. package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
  160. package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
  161. package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
  162. package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
  163. package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
  164. package/skills/execute-work/SKILL.md +99 -0
  165. package/skills/execute-work/references/code-practices.md +78 -0
  166. package/skills/execute-work/references/execution-loop.md +77 -0
  167. package/skills/finish-branch/SKILL.md +117 -0
  168. package/skills/finish-branch/references/integration-options.md +80 -0
  169. package/skills/handoff/SKILL.md +65 -39
  170. package/skills/handoff/references/templates.md +104 -27
  171. package/skills/launch-work/SKILL.md +116 -0
  172. package/skills/launch-work/references/launch-readiness.md +85 -0
  173. package/skills/migration-work/SKILL.md +115 -0
  174. package/skills/migration-work/references/migration-lifecycle.md +82 -0
  175. package/skills/mode-contract/SKILL.md +50 -52
  176. package/skills/output-router/SKILL.md +21 -17
  177. package/skills/output-router/references/safety-policy.md +1 -1
  178. package/skills/release-work/SKILL.md +118 -0
  179. package/skills/release-work/references/release-evidence.md +78 -0
  180. package/skills/review-artifact/SKILL.md +77 -69
  181. package/skills/review-artifact/references/reviewer-prompt.md +133 -42
  182. package/skills/review-work/SKILL.md +82 -57
  183. package/skills/review-work/references/reviewer-prompt.md +97 -60
  184. package/skills/review-work/references/security-risk-lens.md +67 -0
  185. package/skills/setup-freeflow/SKILL.md +58 -66
  186. package/skills/setup-freeflow/references/activation-contract.md +89 -69
  187. package/skills/setup-freeflow/references/host-setup.md +54 -17
  188. package/skills/setup-freeflow/references/output-router-setup.md +62 -54
  189. package/skills/simplify-code/SKILL.md +80 -0
  190. package/skills/simplify-code/references/simplification-patterns.md +70 -0
  191. package/skills/tdd/SKILL.md +96 -0
  192. package/skills/tdd/references/test-design.md +96 -0
  193. package/skills/track-work/SKILL.md +84 -0
  194. package/skills/track-work/references/working-record-schema.md +378 -0
  195. package/skills/verify-work/SKILL.md +59 -38
  196. package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
  197. package/skills/verify-work/references/integration-evidence.md +51 -0
  198. package/skills/verify-work/references/performance-evidence.md +57 -0
  199. package/skills/workflow/SKILL.md +53 -59
  200. package/skills/workflow/references/domain-skill-composition.md +57 -0
  201. package/skills/workflow/references/workflow-loop.md +92 -0
  202. package/skills/write-plan/SKILL.md +85 -58
  203. package/skills/write-plan/references/plan-shapes.md +132 -46
  204. package/skills/write-skill/SKILL.md +82 -51
  205. package/skills/write-skill/references/activation-boundaries.md +62 -0
  206. package/skills/write-skill/references/agent-first-instructions.md +87 -0
  207. package/skills/write-skill/references/progressive-disclosure.md +63 -0
  208. package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
  209. package/skills/write-skill/scripts/skill-author.mjs +104 -0
  210. package/skills/write-spec/SKILL.md +65 -54
  211. package/skills/write-spec/references/artifact-standards.md +60 -41
  212. package/skills/write-spec/references/decision-records.md +77 -0
  213. package/skills/write-spec/references/spec-shapes.md +119 -60
  214. package/evals/README.md +0 -32
  215. package/evals/fixtures/copy-conventions.md +0 -31
  216. package/evals/fixtures/output-router/README.md +0 -12
  217. package/evals/fixtures/output-router/failed-command-output.txt +0 -9
  218. package/evals/fixtures/output-router/large-router-manual.md +0 -63
  219. package/evals/fixtures/output-router/native-large-output.txt +0 -40
  220. package/evals/fixtures/output-router/noisy-test-output.txt +0 -30
  221. package/evals/fixtures/output-router/verification-output.txt +0 -8
  222. package/evals/fixtures/tiny-artifact-review-app/README.md +0 -5
  223. package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +0 -10
  224. package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +0 -21
  225. package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +0 -24
  226. package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +0 -17
  227. package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +0 -8
  228. package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +0 -15
  229. package/evals/fixtures/tiny-commit-ambiguous-app/README.md +0 -3
  230. package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +0 -5
  231. package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +0 -1
  232. package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +0 -5
  233. package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +0 -14
  234. package/evals/fixtures/tiny-commit-app/README.md +0 -3
  235. package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +0 -5
  236. package/evals/fixtures/tiny-commit-app/src/billing.ts +0 -5
  237. package/evals/fixtures/tiny-commit-app/src/settings-page.ts +0 -1
  238. package/evals/fixtures/tiny-commit-app/tests/settings.test.md +0 -5
  239. package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +0 -15
  240. package/evals/fixtures/tiny-commit-everything-app/README.md +0 -3
  241. package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +0 -5
  242. package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +0 -5
  243. package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +0 -1
  244. package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +0 -5
  245. package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +0 -15
  246. package/evals/fixtures/tiny-commit-staged-app/README.md +0 -3
  247. package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +0 -5
  248. package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +0 -5
  249. package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +0 -1
  250. package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +0 -5
  251. package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +0 -15
  252. package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +0 -3
  253. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +0 -3
  254. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +0 -3
  255. package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +0 -5
  256. package/evals/fixtures/tiny-dashboard-stale-app/README.md +0 -11
  257. package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +0 -13
  258. package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +0 -19
  259. package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +0 -9
  260. package/evals/fixtures/tiny-decision-destination-app/README.md +0 -6
  261. package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +0 -8
  262. package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +0 -4
  263. package/evals/fixtures/tiny-design-depth-app/README.md +0 -15
  264. package/evals/fixtures/tiny-design-depth-app/src/routes.ts +0 -25
  265. package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +0 -3
  266. package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +0 -3
  267. package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +0 -3
  268. package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +0 -12
  269. package/evals/fixtures/tiny-eval-method-app/README.md +0 -8
  270. package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +0 -5
  271. package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +0 -17
  272. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +0 -11
  273. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +0 -3
  274. package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +0 -10
  275. package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +0 -10
  276. package/evals/fixtures/tiny-execute-plan-app/README.md +0 -5
  277. package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +0 -5
  278. package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +0 -10
  279. package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +0 -11
  280. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +0 -12
  281. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +0 -15
  282. package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +0 -9
  283. package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +0 -9
  284. package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +0 -9
  285. package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +0 -7
  286. package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +0 -1
  287. package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +0 -7
  288. package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +0 -5
  289. package/evals/fixtures/tiny-execute-review-loop-app/README.md +0 -5
  290. package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +0 -9
  291. package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +0 -12
  292. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +0 -15
  293. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +0 -11
  294. package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +0 -9
  295. package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +0 -7
  296. package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +0 -1
  297. package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +0 -7
  298. package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +0 -5
  299. package/evals/fixtures/tiny-flaky-session-app/README.md +0 -10
  300. package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +0 -13
  301. package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +0 -8
  302. package/evals/fixtures/tiny-handoff-app/README.md +0 -5
  303. package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +0 -10
  304. package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +0 -8
  305. package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +0 -11
  306. package/evals/fixtures/tiny-handoff-app/src/billing.ts +0 -7
  307. package/evals/fixtures/tiny-handoff-report-app/README.md +0 -3
  308. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +0 -1
  309. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +0 -1
  310. package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +0 -4
  311. package/evals/fixtures/tiny-plan-app/README.md +0 -5
  312. package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +0 -10
  313. package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +0 -25
  314. package/evals/fixtures/tiny-plan-app/src/billing.ts +0 -17
  315. package/evals/fixtures/tiny-plan-app/src/settings-page.ts +0 -1
  316. package/evals/fixtures/tiny-plan-app/tests/billing.test.md +0 -8
  317. package/evals/fixtures/tiny-plan-app/tests/settings.test.md +0 -5
  318. package/evals/fixtures/tiny-plan-strict-api-app/README.md +0 -3
  319. package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +0 -5
  320. package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +0 -25
  321. package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +0 -5
  322. package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +0 -3
  323. package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +0 -8
  324. package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +0 -3
  325. package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +0 -15
  326. package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +0 -16
  327. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +0 -15
  328. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +0 -10
  329. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +0 -15
  330. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +0 -12
  331. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +0 -20
  332. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +0 -1
  333. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +0 -1
  334. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +0 -8
  335. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +0 -8
  336. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +0 -7
  337. package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +0 -15
  338. package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +0 -16
  339. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +0 -15
  340. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +0 -10
  341. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +0 -15
  342. package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +0 -12
  343. package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +0 -20
  344. package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +0 -1
  345. package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +0 -1
  346. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +0 -8
  347. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +0 -8
  348. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +0 -7
  349. package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +0 -3
  350. package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +0 -15
  351. package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +0 -16
  352. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +0 -15
  353. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +0 -10
  354. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +0 -15
  355. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +0 -12
  356. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +0 -20
  357. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +0 -1
  358. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +0 -1
  359. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +0 -8
  360. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +0 -8
  361. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +0 -7
  362. package/evals/fixtures/tiny-report-performance-app/README.md +0 -11
  363. package/evals/fixtures/tiny-report-performance-app/docs/performance.md +0 -10
  364. package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +0 -29
  365. package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +0 -8
  366. package/evals/fixtures/tiny-review-request-app/README.md +0 -3
  367. package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +0 -5
  368. package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +0 -19
  369. package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +0 -20
  370. package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +0 -25
  371. package/evals/fixtures/tiny-review-request-app/src/billing.ts +0 -11
  372. package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +0 -19
  373. package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +0 -8
  374. package/evals/fixtures/tiny-review-work-app/README.md +0 -5
  375. package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +0 -9
  376. package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +0 -12
  377. package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +0 -15
  378. package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +0 -9
  379. package/evals/fixtures/tiny-review-work-app/src/billing.ts +0 -7
  380. package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +0 -1
  381. package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +0 -7
  382. package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +0 -5
  383. package/evals/fixtures/tiny-saas-app/README.md +0 -16
  384. package/evals/fixtures/tiny-saas-app/docs/auth-review.md +0 -15
  385. package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +0 -10
  386. package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +0 -15
  387. package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +0 -13
  388. package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +0 -12
  389. package/evals/fixtures/tiny-saas-app/src/billing.ts +0 -20
  390. package/evals/fixtures/tiny-saas-app/src/login-copy.ts +0 -1
  391. package/evals/fixtures/tiny-saas-app/src/settings-page.ts +0 -1
  392. package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +0 -8
  393. package/evals/fixtures/tiny-saas-app/tests/billing.test.md +0 -8
  394. package/evals/fixtures/tiny-saas-app/tests/copy.test.md +0 -7
  395. package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +0 -6
  396. package/evals/fixtures/tiny-setup-both-app/AGENTS.md +0 -5
  397. package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +0 -5
  398. package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +0 -6
  399. package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +0 -5
  400. package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +0 -6
  401. package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +0 -6
  402. package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +0 -14
  403. package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +0 -6
  404. package/evals/fixtures/tiny-skill-dev-app/README.md +0 -10
  405. package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +0 -8
  406. package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +0 -17
  407. package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +0 -13
  408. package/evals/fixtures/tiny-team-app/README.md +0 -5
  409. package/evals/fixtures/tiny-team-app/docs/product.md +0 -6
  410. package/evals/fixtures/tiny-team-app/src/teams.ts +0 -9
  411. package/evals/fixtures/tiny-team-app/src/users.ts +0 -5
  412. package/evals/fixtures/tiny-team-app/tests/teams.test.md +0 -7
  413. package/evals/fixtures/tiny-verify-app/README.md +0 -5
  414. package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +0 -1
  415. package/evals/fixtures/tiny-verify-app/src/settings-page.ts +0 -1
  416. package/evals/fixtures/tiny-verify-app/tests/settings.test.md +0 -7
  417. package/evals/prompts/aon-001.txt +0 -2
  418. package/evals/prompts/byp-001.txt +0 -2
  419. package/evals/prompts/byp-002.txt +0 -2
  420. package/evals/prompts/cap-001.txt +0 -3
  421. package/evals/prompts/cap-002.txt +0 -3
  422. package/evals/prompts/cmd-001.txt +0 -3
  423. package/evals/prompts/cmd-002.txt +0 -3
  424. package/evals/prompts/cmd-003.txt +0 -6
  425. package/evals/prompts/cmd-004.txt +0 -5
  426. package/evals/prompts/cmd-005.txt +0 -5
  427. package/evals/prompts/cmd-006.txt +0 -5
  428. package/evals/prompts/cmd-007.txt +0 -5
  429. package/evals/prompts/cmd-008.txt +0 -5
  430. package/evals/prompts/cmd-009.txt +0 -8
  431. package/evals/prompts/cmd-010.txt +0 -5
  432. package/evals/prompts/cmd-011.txt +0 -5
  433. package/evals/prompts/cmd-012.txt +0 -5
  434. package/evals/prompts/cmd-013.txt +0 -5
  435. package/evals/prompts/cmd-014.txt +0 -7
  436. package/evals/prompts/cmd-015.txt +0 -7
  437. package/evals/prompts/cmd-016.txt +0 -5
  438. package/evals/prompts/cmt-001.txt +0 -1
  439. package/evals/prompts/cmt-002.txt +0 -1
  440. package/evals/prompts/cmt-003.txt +0 -1
  441. package/evals/prompts/cmt-004.txt +0 -1
  442. package/evals/prompts/cmt-005.txt +0 -1
  443. package/evals/prompts/dfd-001.txt +0 -3
  444. package/evals/prompts/dia-001.txt +0 -3
  445. package/evals/prompts/dia-002.txt +0 -3
  446. package/evals/prompts/dia-003.txt +0 -3
  447. package/evals/prompts/dis-001.txt +0 -5
  448. package/evals/prompts/dis-002.txt +0 -5
  449. package/evals/prompts/esk-001.txt +0 -5
  450. package/evals/prompts/esk-002.txt +0 -5
  451. package/evals/prompts/esk-003.txt +0 -5
  452. package/evals/prompts/grc-001.txt +0 -3
  453. package/evals/prompts/hof-001.txt +0 -3
  454. package/evals/prompts/hof-002.txt +0 -1
  455. package/evals/prompts/hof-003.txt +0 -1
  456. package/evals/prompts/hof-004.txt +0 -1
  457. package/evals/prompts/hof-005.txt +0 -1
  458. package/evals/prompts/ivg-001.txt +0 -1
  459. package/evals/prompts/ivg-002.txt +0 -11
  460. package/evals/prompts/ivg-003.txt +0 -1
  461. package/evals/prompts/ivg-004.txt +0 -1
  462. package/evals/prompts/mode-001.txt +0 -3
  463. package/evals/prompts/mode-002.txt +0 -1
  464. package/evals/prompts/mode-003.txt +0 -3
  465. package/evals/prompts/mode-004.txt +0 -3
  466. package/evals/prompts/mode-005.txt +0 -3
  467. package/evals/prompts/mode-006.txt +0 -3
  468. package/evals/prompts/mode-007.txt +0 -3
  469. package/evals/prompts/otr-001.txt +0 -3
  470. package/evals/prompts/otr-002.txt +0 -3
  471. package/evals/prompts/rar-001.txt +0 -5
  472. package/evals/prompts/rar-002.txt +0 -3
  473. package/evals/prompts/rar-003.txt +0 -6
  474. package/evals/prompts/rar-004.txt +0 -15
  475. package/evals/prompts/rar-005.txt +0 -10
  476. package/evals/prompts/rbr-001.txt +0 -3
  477. package/evals/prompts/rbr-002.txt +0 -3
  478. package/evals/prompts/rbr-003.txt +0 -7
  479. package/evals/prompts/rev-001.txt +0 -3
  480. package/evals/prompts/rev-002.txt +0 -5
  481. package/evals/prompts/rev-003.txt +0 -6
  482. package/evals/prompts/rev-004.txt +0 -1
  483. package/evals/prompts/rev-005.txt +0 -15
  484. package/evals/prompts/rev-006.txt +0 -5
  485. package/evals/prompts/stp-001.txt +0 -1
  486. package/evals/prompts/stp-002.txt +0 -1
  487. package/evals/prompts/stp-003.txt +0 -1
  488. package/evals/prompts/stp-004.txt +0 -1
  489. package/evals/prompts/stp-005.txt +0 -1
  490. package/evals/prompts/stp-006.txt +0 -1
  491. package/evals/prompts/stp-007.txt +0 -1
  492. package/evals/prompts/stp-008.txt +0 -1
  493. package/evals/prompts/stp-009.txt +0 -1
  494. package/evals/prompts/stp-010.txt +0 -1
  495. package/evals/prompts/stp-011.txt +0 -1
  496. package/evals/prompts/vfy-003.txt +0 -1
  497. package/evals/prompts/wpl-001.txt +0 -3
  498. package/evals/prompts/wpl-002.txt +0 -5
  499. package/evals/prompts/wpl-003.txt +0 -3
  500. package/evals/prompts/wpl-004.txt +0 -5
  501. package/evals/prompts/wpl-005.txt +0 -1
  502. package/evals/prompts/wrc-001.txt +0 -10
  503. package/evals/prompts/wrc-002.txt +0 -3
  504. package/evals/prompts/wsk-001.txt +0 -6
  505. package/evals/prompts/wsp-001.txt +0 -5
  506. package/evals/prompts/wsp-002.txt +0 -15
  507. package/evals/prompts/wsp-003.txt +0 -3
  508. package/evals/prompts/wsp-004.txt +0 -15
  509. package/evals/prompts/wsp-005.txt +0 -5
  510. package/evals/prompts/wsp-006.txt +0 -12
  511. package/evals/prompts/wsp-007.txt +0 -9
  512. package/evals/prompts/wsp-008.txt +0 -13
  513. package/evals/prompts/xpl-001.txt +0 -1
  514. package/evals/prompts/xpl-002.txt +0 -3
  515. package/evals/prompts/xpl-003.txt +0 -3
  516. package/evals/prompts/xpl-004.txt +0 -3
  517. package/evals/prompts/xpl-005.txt +0 -5
  518. package/evals/prompts/xpl-006.txt +0 -3
  519. package/evals/registries/adversarial-evals.json +0 -39
  520. package/evals/registries/fixture-evals.json +0 -2513
  521. package/evals/registries/handoff-evals.json +0 -74
  522. package/evals/registries/legacy-evals.json +0 -147
  523. package/evals/registries/skill-evidence.json +0 -193
  524. package/evals/registries/verify-work-evals.json +0 -46
  525. package/evals/reports/acceptance/v0.1-acceptance-report.md +0 -130
  526. package/evals/reports/by-command-surface/command-surface-1-report.md +0 -45
  527. package/evals/reports/by-command-surface/command-surface-10-report.md +0 -76
  528. package/evals/reports/by-command-surface/command-surface-11-report.md +0 -77
  529. package/evals/reports/by-command-surface/command-surface-12-report.md +0 -91
  530. package/evals/reports/by-command-surface/command-surface-13-report.md +0 -64
  531. package/evals/reports/by-command-surface/command-surface-14-report.md +0 -66
  532. package/evals/reports/by-command-surface/command-surface-15-report.md +0 -124
  533. package/evals/reports/by-command-surface/command-surface-16-report.md +0 -39
  534. package/evals/reports/by-command-surface/command-surface-2-report.md +0 -80
  535. package/evals/reports/by-command-surface/command-surface-3-report.md +0 -86
  536. package/evals/reports/by-command-surface/command-surface-4-report.md +0 -76
  537. package/evals/reports/by-command-surface/command-surface-5-report.md +0 -80
  538. package/evals/reports/by-command-surface/command-surface-6-report.md +0 -74
  539. package/evals/reports/by-command-surface/command-surface-7-report.md +0 -84
  540. package/evals/reports/by-command-surface/command-surface-8-report.md +0 -79
  541. package/evals/reports/by-command-surface/command-surface-9-report.md +0 -79
  542. package/evals/reports/by-command-surface/command-surface-matrix.md +0 -91
  543. package/evals/reports/by-skill/bypass-1-report.md +0 -124
  544. package/evals/reports/by-skill/capture-decisions-1-report.md +0 -99
  545. package/evals/reports/by-skill/capture-decisions-2-report.md +0 -102
  546. package/evals/reports/by-skill/commit-work-1-report.md +0 -165
  547. package/evals/reports/by-skill/commit-work-2-report.md +0 -109
  548. package/evals/reports/by-skill/design-for-depth-1-report.md +0 -95
  549. package/evals/reports/by-skill/diagnose-failure-1-report.md +0 -91
  550. package/evals/reports/by-skill/diagnose-failure-2-report.md +0 -94
  551. package/evals/reports/by-skill/discover-1-report.md +0 -118
  552. package/evals/reports/by-skill/evaluate-skill-2-report.md +0 -71
  553. package/evals/reports/by-skill/execute-plan-1-report.md +0 -103
  554. package/evals/reports/by-skill/execute-plan-2-report.md +0 -112
  555. package/evals/reports/by-skill/execute-plan-3-report.md +0 -87
  556. package/evals/reports/by-skill/grill-context-1-report.md +0 -103
  557. package/evals/reports/by-skill/handoff-1-report.md +0 -123
  558. package/evals/reports/by-skill/handoff-2-report.md +0 -105
  559. package/evals/reports/by-skill/handoff-3-report.md +0 -100
  560. package/evals/reports/by-skill/handoff-7-report.md +0 -77
  561. package/evals/reports/by-skill/interview-gate-1-report.md +0 -63
  562. package/evals/reports/by-skill/interview-gate-2-report.md +0 -105
  563. package/evals/reports/by-skill/mode-contract-1-report.md +0 -74
  564. package/evals/reports/by-skill/mode-contract-2-report.md +0 -87
  565. package/evals/reports/by-skill/mode-contract-3-report.md +0 -65
  566. package/evals/reports/by-skill/mode-contract-4-report.md +0 -71
  567. package/evals/reports/by-skill/mode-contract-5-report.md +0 -70
  568. package/evals/reports/by-skill/output-router-1-report.md +0 -76
  569. package/evals/reports/by-skill/output-router-2-report.md +0 -65
  570. package/evals/reports/by-skill/research-1-report.md +0 -144
  571. package/evals/reports/by-skill/research-brief-1-report.md +0 -94
  572. package/evals/reports/by-skill/research-brief-2-report.md +0 -75
  573. package/evals/reports/by-skill/review-artifact-1-report.md +0 -91
  574. package/evals/reports/by-skill/review-artifact-2-report.md +0 -79
  575. package/evals/reports/by-skill/review-artifact-3-report.md +0 -120
  576. package/evals/reports/by-skill/review-artifact-4-report.md +0 -89
  577. package/evals/reports/by-skill/review-artifact-5-report.md +0 -66
  578. package/evals/reports/by-skill/review-work-1-report.md +0 -85
  579. package/evals/reports/by-skill/review-work-2-report.md +0 -87
  580. package/evals/reports/by-skill/review-work-3-report.md +0 -104
  581. package/evals/reports/by-skill/review-work-4-report.md +0 -108
  582. package/evals/reports/by-skill/review-work-5-report.md +0 -73
  583. package/evals/reports/by-skill/review-work-6-report.md +0 -66
  584. package/evals/reports/by-skill/setup-freeflow-1-report.md +0 -199
  585. package/evals/reports/by-skill/setup-freeflow-2-report.md +0 -105
  586. package/evals/reports/by-skill/setup-freeflow-3-report.md +0 -105
  587. package/evals/reports/by-skill/setup-freeflow-4-report.md +0 -88
  588. package/evals/reports/by-skill/setup-freeflow-5-report.md +0 -115
  589. package/evals/reports/by-skill/skill-authoring-1-report.md +0 -81
  590. package/evals/reports/by-skill/verify-work-1-report.md +0 -111
  591. package/evals/reports/by-skill/verify-work-2-report.md +0 -120
  592. package/evals/reports/by-skill/workflow-1-report.md +0 -65
  593. package/evals/reports/by-skill/write-plan-1-report.md +0 -123
  594. package/evals/reports/by-skill/write-plan-2-report.md +0 -98
  595. package/evals/reports/by-skill/write-plan-3-report.md +0 -110
  596. package/evals/reports/by-skill/write-spec-1-report.md +0 -88
  597. package/evals/reports/by-skill/write-spec-2-report.md +0 -89
  598. package/evals/reports/by-skill/write-spec-3-report.md +0 -90
  599. package/evals/reports/by-skill/write-spec-4-report.md +0 -167
  600. package/evals/reports/harness/claude-harness-1-report.md +0 -103
  601. package/evals/reports/harness/eval-harness-1-report.md +0 -91
  602. package/evals/reports/iterations/iteration-1-report.md +0 -71
  603. package/evals/reports/iterations/iteration-2-report.md +0 -78
  604. package/evals/reports/iterations/iteration-3-report.md +0 -118
  605. package/evals/reports/iterations/iteration-4-report.md +0 -131
  606. package/evals/reports/iterations/iteration-5-report.md +0 -149
  607. package/evals/reports/iterations/iteration-6-report.md +0 -136
  608. package/evals/reports/runtime/always-on-runtime-1-report.md +0 -107
  609. package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +0 -52
  610. package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +0 -410
  611. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +0 -203
  612. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +0 -51
  613. package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +0 -99
  614. package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +0 -166
  615. package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +0 -96
  616. package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +0 -151
  617. package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +0 -233
  618. package/evals/reports/runtime/jq-script-derive-execution-1-report.md +0 -215
  619. package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +0 -67
  620. package/evals/reports/runtime/output-router-benchmark-1-report.md +0 -81
  621. package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +0 -35
  622. package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +0 -150
  623. package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +0 -46
  624. package/evals/reports/runtime/output-router-command-benchmark-1-report.md +0 -62
  625. package/evals/reports/runtime/output-router-index-benchmark-1-report.md +0 -64
  626. package/evals/reports/runtime/output-router-regression-1-report.md +0 -81
  627. package/evals/reports/runtime/output-router-transform-eval-1-report.md +0 -28
  628. package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +0 -44
  629. package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +0 -159
  630. package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +0 -55
  631. package/evals/reports/runtime/render-format-row-protocol-1-report.md +0 -58
  632. package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +0 -84
  633. package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +0 -51
  634. package/evals/reports/runtime/storage-policy-benchmark-1-report.md +0 -176
  635. package/evals/reports/runtime/vault-index-storage-spike-1-report.md +0 -39
  636. package/evals/reports/runtime/workflow-context-hook-1-report.md +0 -82
  637. package/evals/runbooks/adversarial-eval-runbook.md +0 -28
  638. package/evals/runbooks/fixture-eval-runbook.md +0 -137
  639. package/evals/runbooks/handoff-eval-runbook.md +0 -22
  640. package/evals/runbooks/verify-work-eval-runbook.md +0 -27
  641. package/evals/scripts/audit-command-surface.sh +0 -160
  642. package/evals/scripts/check-activation-contract.sh +0 -121
  643. package/evals/scripts/check-runtime-context-hook.sh +0 -183
  644. package/evals/scripts/grade-fixture-eval.sh +0 -446
  645. package/evals/scripts/run-claude-fixture-eval.sh +0 -26
  646. package/evals/scripts/run-codex-fixture-eval.sh +0 -26
  647. package/evals/scripts/run-eryx-python-proof-spike.js +0 -559
  648. package/evals/scripts/run-fixture-eval-by-id.sh +0 -23
  649. package/evals/scripts/run-fixture-eval.sh +0 -464
  650. package/evals/scripts/run-jq-wasm-proof-spike.js +0 -299
  651. package/evals/scripts/run-output-router-transform-eval.js +0 -115
  652. package/evals/scripts/run-pi-observed-routing-eval.js +0 -478
  653. package/evals/scripts/run-quickjs-wasi-proof-spike.js +0 -339
  654. package/evals/scripts/skill-evidence.sh +0 -316
  655. package/evals/scripts/validate-release-metadata.sh +0 -486
  656. package/evals/suites/v0.1-acceptance-suite.md +0 -131
  657. package/pi-extension/dist/host-producer-identification.js +0 -186
  658. package/pi-extension/dist/mcp-config.js +0 -30
  659. package/pi-extension/dist/native-safety-net.js +0 -209
  660. package/pi-extension/dist/observed-tool-routing.js +0 -114
  661. package/pi-extension/dist/renderers.js +0 -835
  662. package/pi-extension/dist/router-tools.js +0 -438
  663. package/pi-extension/dist/runtime-context.js +0 -288
  664. package/pi-extension/dist/schemas.js +0 -254
  665. package/pi-extension/dist/status.js +0 -449
  666. package/pi-extension/dist/utils.js +0 -467
  667. package/pi-extension/src/runtime-context.ts +0 -347
  668. package/pi-extension/src/status.ts +0 -505
  669. package/plugin-docs/README.md +0 -40
  670. package/plugin-docs/adr/0001-three-modes.md +0 -27
  671. package/plugin-docs/adr/0002-evals-before-hooks.md +0 -17
  672. package/plugin-docs/adr/0003-release-boundary.md +0 -21
  673. package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +0 -26
  674. package/plugin-docs/adr/README.md +0 -10
  675. package/plugin-docs/architecture.md +0 -89
  676. package/plugin-docs/output-router.md +0 -396
  677. package/plugin-docs/release-evidence.md +0 -77
  678. package/plugin-docs/skills.md +0 -44
  679. package/plugin-docs/workflow.md +0 -57
  680. package/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
  681. package/skills/discover/ARTIFACT-DESTINATIONS.md +0 -58
  682. package/skills/discover/CHECKPOINTS.md +0 -74
  683. package/skills/discover/SKILL.md +0 -173
  684. package/skills/evaluate-skill/references/eval-patterns.md +0 -41
  685. package/skills/evaluate-skill/references/grading-priority.md +0 -33
  686. package/skills/execute-plan/SKILL.md +0 -133
  687. package/skills/execute-plan/references/execution-map.md +0 -122
  688. package/skills/interview-gate/SKILL.md +0 -90
  689. package/skills/workflow/references/workflow-map.md +0 -104
  690. /package/pi-extension/src/{mcp-config.ts → integrations/mcp-config.ts} +0 -0
@@ -5,534 +5,614 @@ import { join, resolve } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  import { mkdtemp } from "node:fs/promises";
7
7
  import { performance } from "node:perf_hooks";
8
- import { approximateTokens, defaultJsonRunReportPath, escapeMarkdownTableCell as escapeTable, formatPercent, latencySummary, normalizeIterations, parseBenchmarkCliArgs, reductionPercent, writeBenchmarkReportPair, } from "./benchmark-harness.js";
9
- import { commandOutputFingerprints, createVault, findExactDuplicateCommandOutput, readOutputText, storeCommandOutput, storeMetadataOutput, } from "../vault/vault.js";
8
+ import {
9
+ approximateTokens,
10
+ defaultJsonRunReportPath,
11
+ escapeMarkdownTableCell as escapeTable,
12
+ formatPercent,
13
+ latencySummary,
14
+ normalizeIterations,
15
+ parseBenchmarkCliArgs,
16
+ reductionPercent,
17
+ writeBenchmarkReportPair,
18
+ } from "./benchmark-harness.js";
19
+ import {
20
+ commandOutputFingerprints,
21
+ createVault,
22
+ findExactDuplicateCommandOutput,
23
+ readOutputText,
24
+ storeCommandOutput,
25
+ storeMetadataOutput,
26
+ } from "../vault/vault.js";
10
27
  const DEFAULT_ITERATIONS = 2;
11
28
  const LARGE_EXACT_THRESHOLD_BYTES = 8 * 1024;
12
29
  const FIXTURES = createStoragePolicyFixtures();
13
30
  const POLICIES = [
14
- {
15
- id: "store-everything",
16
- label: "Store everything exactly",
17
- description: "Current baseline: every command output is vaulted exactly, so recovery is maximally useful and storage/privacy surface is largest.",
18
- decide() {
19
- return "exact";
20
- },
31
+ {
32
+ id: "store-everything",
33
+ label: "Store everything exactly",
34
+ description:
35
+ "Current baseline: every command output is vaulted exactly, so recovery is maximally useful and storage/privacy surface is largest.",
36
+ decide() {
37
+ return "exact";
21
38
  },
22
- {
23
- id: "threshold-exact",
24
- label: "Threshold exact storage",
25
- description: `Exact storage only when combined output is at least ${LARGE_EXACT_THRESHOLD_BYTES} bytes; smaller outputs are metadata-only. This intentionally tests whether a threshold alone would drop exact failure/verification recovery.`,
26
- decide(input) {
27
- return input.rawCombinedBytes >= LARGE_EXACT_THRESHOLD_BYTES ? "exact" : "metadata";
28
- },
39
+ },
40
+ {
41
+ id: "threshold-exact",
42
+ label: "Threshold exact storage",
43
+ description: `Exact storage only when combined output is at least ${LARGE_EXACT_THRESHOLD_BYTES} bytes; smaller outputs are metadata-only. This intentionally tests whether a threshold alone would drop exact failure/verification recovery.`,
44
+ decide(input) {
45
+ return input.rawCombinedBytes >= LARGE_EXACT_THRESHOLD_BYTES ? "exact" : "metadata";
29
46
  },
30
- {
31
- id: "metadata-small-exact-large-hybrid",
32
- label: "Metadata-small / exact-large hybrid",
33
- description: `Small non-sensitive outputs become metadata-only; exactness-sensitive or >= ${LARGE_EXACT_THRESHOLD_BYTES} byte outputs remain exactly recoverable.`,
34
- decide(input) {
35
- return input.fixture.exactnessSensitive || input.rawCombinedBytes >= LARGE_EXACT_THRESHOLD_BYTES ? "exact" : "metadata";
36
- },
47
+ },
48
+ {
49
+ id: "metadata-small-exact-large-hybrid",
50
+ label: "Metadata-small / exact-large hybrid",
51
+ description: `Small non-sensitive outputs become metadata-only; exactness-sensitive or >= ${LARGE_EXACT_THRESHOLD_BYTES} byte outputs remain exactly recoverable.`,
52
+ decide(input) {
53
+ return input.fixture.exactnessSensitive || input.rawCombinedBytes >= LARGE_EXACT_THRESHOLD_BYTES
54
+ ? "exact"
55
+ : "metadata";
37
56
  },
38
- {
39
- id: "duplicate-output-dedupe",
40
- label: "Duplicate output dedupe",
41
- description: "First occurrence is stored exactly; exact duplicates become metadata-only records that point at the prior exact output.",
42
- decide(input) {
43
- return input.duplicate ? "duplicate-metadata" : "exact";
44
- },
57
+ },
58
+ {
59
+ id: "duplicate-output-dedupe",
60
+ label: "Duplicate output dedupe",
61
+ description:
62
+ "First occurrence is stored exactly; exact duplicates become metadata-only records that point at the prior exact output.",
63
+ decide(input) {
64
+ return input.duplicate ? "duplicate-metadata" : "exact";
45
65
  },
46
- {
47
- id: "hybrid-dedupe",
48
- label: "Hybrid exactness + duplicate dedupe",
49
- description: `Exactness-sensitive or >= ${LARGE_EXACT_THRESHOLD_BYTES} byte outputs stay exactly recoverable; exact duplicates of those outputs become metadata pointers; small non-sensitive outputs are metadata-only.`,
50
- decide(input) {
51
- const shouldStoreExact = input.fixture.exactnessSensitive || input.rawCombinedBytes >= LARGE_EXACT_THRESHOLD_BYTES;
52
- if (!shouldStoreExact) {
53
- return "metadata";
54
- }
55
- return input.duplicate ? "duplicate-metadata" : "exact";
56
- },
66
+ },
67
+ {
68
+ id: "hybrid-dedupe",
69
+ label: "Hybrid exactness + duplicate dedupe",
70
+ description: `Exactness-sensitive or >= ${LARGE_EXACT_THRESHOLD_BYTES} byte outputs stay exactly recoverable; exact duplicates of those outputs become metadata pointers; small non-sensitive outputs are metadata-only.`,
71
+ decide(input) {
72
+ const shouldStoreExact =
73
+ input.fixture.exactnessSensitive || input.rawCombinedBytes >= LARGE_EXACT_THRESHOLD_BYTES;
74
+ if (!shouldStoreExact) {
75
+ return "metadata";
76
+ }
77
+ return input.duplicate ? "duplicate-metadata" : "exact";
57
78
  },
79
+ },
58
80
  ];
59
81
  export async function runStoragePolicyBenchmarks(options = {}) {
60
- const iterations = normalizeIterations(options.iterations, DEFAULT_ITERATIONS);
61
- const policies = [];
62
- for (const policy of POLICIES) {
63
- policies.push(await runPolicy(policy, iterations));
64
- }
65
- return {
66
- generatedAt: options.generatedAt ?? new Date().toISOString(),
67
- iterations,
68
- summary: summarizeStoragePolicyReport(policies),
69
- fixtures: FIXTURES,
70
- policies,
71
- };
82
+ const iterations = normalizeIterations(options.iterations, DEFAULT_ITERATIONS);
83
+ const policies = [];
84
+ for (const policy of POLICIES) {
85
+ policies.push(await runPolicy(policy, iterations));
86
+ }
87
+ return {
88
+ generatedAt: options.generatedAt ?? new Date().toISOString(),
89
+ iterations,
90
+ summary: summarizeStoragePolicyReport(policies),
91
+ fixtures: FIXTURES,
92
+ policies,
93
+ };
72
94
  }
73
95
  export function renderStoragePolicyBenchmarkReport(report) {
74
- const date = report.generatedAt.slice(0, 10);
75
- const lines = [
76
- "# Storage Policy Benchmark Report - Iteration 1",
77
- "",
78
- `Date: ${date}`,
79
- "",
80
- "## Scope",
81
- "",
82
- "Benchmark-only experiment for Freeflow vault storage policies. This report does not change runtime defaults or repo config. It compares exact storage, threshold storage, hybrid metadata/exact storage, and duplicate-output dedupe using deterministic command-output fixtures.",
83
- "",
84
- "## Summary",
85
- "",
86
- `- Fixtures: ${report.summary.fixtures}`,
87
- `- Policies: ${report.summary.policies}`,
88
- `- Safe candidates for further evaluation: ${report.summary.safeCandidateIds.join(", ") || "none"}`,
89
- `- Disqualified by exact-recovery safety: ${report.summary.disqualifiedCandidateIds.join(", ") || "none"}`,
90
- `- Runtime default changed: ${report.summary.defaultUnchanged ? "no" : "yes"}`,
91
- "",
92
- "## Policy Results",
93
- "",
94
- "| Policy | Exact-sensitive recovery | Storage bytes | Index bytes | Exact stored bytes | Storage reduction | Token-surface reduction | Privacy surface | Metadata-only | Duplicate metadata | Latency p50/p95 | Notes |",
95
- "| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |",
96
- ];
97
- for (const policy of report.policies) {
98
- lines.push([
99
- escapeTable(policy.label),
100
- `${policy.safety.exactnessSensitiveRecoverable}/${policy.safety.exactnessSensitiveFixtures}`,
101
- String(policy.totals.storageBytes),
102
- String(policy.totals.indexBytes),
103
- String(policy.totals.exactStoredCombinedBytes),
104
- formatPercent(policy.totals.storageReductionPercent),
105
- formatPercent(policy.totals.tokenSurfaceReductionPercent),
106
- formatPercent(policy.totals.privacySurfacePercent),
107
- String(policy.totals.metadataOnlyRecords),
108
- String(policy.totals.duplicateMetadataRecords),
109
- `${policy.totals.latencyMs.p50.toFixed(2)}/${policy.totals.latencyMs.p95.toFixed(2)}`,
110
- escapeTable(policy.notes.join(" ")),
111
- ].join(" | ").replace(/^/, "| ").replace(/$/, " |"));
96
+ const date = report.generatedAt.slice(0, 10);
97
+ const lines = [
98
+ "# Storage Policy Benchmark Report - Iteration 1",
99
+ "",
100
+ `Date: ${date}`,
101
+ "",
102
+ "## Scope",
103
+ "",
104
+ "Benchmark-only experiment for Freeflow vault storage policies. This report does not change runtime defaults or repo config. It compares exact storage, threshold storage, hybrid metadata/exact storage, and duplicate-output dedupe using deterministic command-output fixtures.",
105
+ "",
106
+ "## Summary",
107
+ "",
108
+ `- Fixtures: ${report.summary.fixtures}`,
109
+ `- Policies: ${report.summary.policies}`,
110
+ `- Safe candidates for further evaluation: ${report.summary.safeCandidateIds.join(", ") || "none"}`,
111
+ `- Disqualified by exact-recovery safety: ${report.summary.disqualifiedCandidateIds.join(", ") || "none"}`,
112
+ `- Runtime default changed: ${report.summary.defaultUnchanged ? "no" : "yes"}`,
113
+ "",
114
+ "## Policy Results",
115
+ "",
116
+ "| Policy | Exact-sensitive recovery | Storage bytes | Index bytes | Exact stored bytes | Storage reduction | Token-surface reduction | Privacy surface | Metadata-only | Duplicate metadata | Latency p50/p95 | Notes |",
117
+ "| --- | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | ---: | --- |",
118
+ ];
119
+ for (const policy of report.policies) {
120
+ lines.push(
121
+ [
122
+ escapeTable(policy.label),
123
+ `${policy.safety.exactnessSensitiveRecoverable}/${policy.safety.exactnessSensitiveFixtures}`,
124
+ String(policy.totals.storageBytes),
125
+ String(policy.totals.indexBytes),
126
+ String(policy.totals.exactStoredCombinedBytes),
127
+ formatPercent(policy.totals.storageReductionPercent),
128
+ formatPercent(policy.totals.tokenSurfaceReductionPercent),
129
+ formatPercent(policy.totals.privacySurfacePercent),
130
+ String(policy.totals.metadataOnlyRecords),
131
+ String(policy.totals.duplicateMetadataRecords),
132
+ `${policy.totals.latencyMs.p50.toFixed(2)}/${policy.totals.latencyMs.p95.toFixed(2)}`,
133
+ escapeTable(policy.notes.join(" ")),
134
+ ]
135
+ .join(" | ")
136
+ .replace(/^/, "| ")
137
+ .replace(/$/, " |"),
138
+ );
139
+ }
140
+ lines.push("", "## Candidate Notes", "");
141
+ for (const policy of report.policies) {
142
+ lines.push(`### ${policy.label}`, "", policy.description, "");
143
+ lines.push(`- Exactness-sensitive recovery: ${policy.safety.exactnessSensitiveRecoveryPassed ? "pass" : "fail"}`);
144
+ lines.push(`- Metadata-only recovery labeled: ${policy.safety.metadataOnlyRecoveryLabeled ? "yes" : "no"}`);
145
+ lines.push(`- Repeated outputs deduped: ${policy.safety.repeatedOutputsDeduped ? "yes" : "no"}`);
146
+ lines.push(
147
+ "",
148
+ "| Fixture | Iteration | Record | Recovery | Exact bytes | Notes |",
149
+ "| --- | ---: | --- | --- | ---: | --- |",
150
+ );
151
+ for (const fixture of policy.fixtures) {
152
+ lines.push(
153
+ [
154
+ escapeTable(fixture.fixtureId),
155
+ String(fixture.iteration),
156
+ `${fixture.recordKind}/${fixture.recoverability}`,
157
+ fixture.usefulRecovery,
158
+ String(fixture.exactStoredCombinedBytes),
159
+ escapeTable(fixture.notes.join(" ")),
160
+ ]
161
+ .join(" | ")
162
+ .replace(/^/, "| ")
163
+ .replace(/$/, " |"),
164
+ );
112
165
  }
113
- lines.push("", "## Candidate Notes", "");
114
- for (const policy of report.policies) {
115
- lines.push(`### ${policy.label}`, "", policy.description, "");
116
- lines.push(`- Exactness-sensitive recovery: ${policy.safety.exactnessSensitiveRecoveryPassed ? "pass" : "fail"}`);
117
- lines.push(`- Metadata-only recovery labeled: ${policy.safety.metadataOnlyRecoveryLabeled ? "yes" : "no"}`);
118
- lines.push(`- Repeated outputs deduped: ${policy.safety.repeatedOutputsDeduped ? "yes" : "no"}`);
119
- lines.push("", "| Fixture | Iteration | Record | Recovery | Exact bytes | Notes |", "| --- | ---: | --- | --- | ---: | --- |");
120
- for (const fixture of policy.fixtures) {
121
- lines.push([
122
- escapeTable(fixture.fixtureId),
123
- String(fixture.iteration),
124
- `${fixture.recordKind}/${fixture.recoverability}`,
125
- fixture.usefulRecovery,
126
- String(fixture.exactStoredCombinedBytes),
127
- escapeTable(fixture.notes.join(" ")),
128
- ].join(" | ").replace(/^/, "| ").replace(/$/, " |"));
129
- }
130
- lines.push("");
131
- }
132
- lines.push("## Decision Boundary", "", "This benchmark intentionally stops before changing defaults. Any storage default change still needs a product/safety decision because metadata-only storage changes exact recovery semantics and privacy surface.", "");
133
- return `${lines.join("\n")}\n`;
166
+ lines.push("");
167
+ }
168
+ lines.push(
169
+ "## Decision Boundary",
170
+ "",
171
+ "This benchmark intentionally stops before changing defaults. Any storage default change still needs a product/safety decision because metadata-only storage changes exact recovery semantics and privacy surface.",
172
+ "",
173
+ );
174
+ return `${lines.join("\n")}\n`;
134
175
  }
135
- export async function writeStoragePolicyBenchmarkReports(report, markdownReportPath = defaultReportPath(), options = {}) {
136
- return writeBenchmarkReportPair({
137
- report,
138
- markdownReportPath,
139
- jsonReportPath: options.jsonReportPath,
140
- renderMarkdown: renderStoragePolicyBenchmarkReport,
141
- });
176
+ export async function writeStoragePolicyBenchmarkReports(
177
+ report,
178
+ markdownReportPath = defaultReportPath(),
179
+ options = {},
180
+ ) {
181
+ return writeBenchmarkReportPair({
182
+ report,
183
+ markdownReportPath,
184
+ jsonReportPath: options.jsonReportPath,
185
+ renderMarkdown: renderStoragePolicyBenchmarkReport,
186
+ });
142
187
  }
143
188
  async function runPolicy(policy, iterations) {
144
- const temp = await createTempDir(`freeflow-storage-policy-${policy.id}-`);
145
- const vault = createVault({ root: temp.path });
146
- const sessionId = `storage-policy-${policy.id}`;
147
- const fixtureResults = [];
148
- try {
149
- for (let iteration = 1; iteration <= iterations; iteration += 1) {
150
- for (const fixture of FIXTURES) {
151
- fixtureResults.push(await runPolicyFixture({ policy, vault, sessionId, fixture, iteration }));
152
- }
153
- }
154
- const storageBytes = await directorySize(temp.path);
155
- const indexBytes = await directorySize(join(temp.path, "index"));
156
- return buildPolicyResult({ policy, fixtureResults, storageBytes, indexBytes });
157
- }
158
- finally {
159
- await temp.cleanup();
189
+ const temp = await createTempDir(`freeflow-storage-policy-${policy.id}-`);
190
+ const vault = createVault({ root: temp.path });
191
+ const sessionId = `storage-policy-${policy.id}`;
192
+ const fixtureResults = [];
193
+ try {
194
+ for (let iteration = 1; iteration <= iterations; iteration += 1) {
195
+ for (const fixture of FIXTURES) {
196
+ fixtureResults.push(await runPolicyFixture({ policy, vault, sessionId, fixture, iteration }));
197
+ }
160
198
  }
199
+ const storageBytes = await directorySize(temp.path);
200
+ const indexBytes = await directorySize(join(temp.path, "index"));
201
+ return buildPolicyResult({ policy, fixtureResults, storageBytes, indexBytes });
202
+ } finally {
203
+ await temp.cleanup();
204
+ }
161
205
  }
162
206
  async function runPolicyFixture(options) {
163
- const combined = combineOutputSections(options.fixture.stdout, options.fixture.stderr);
164
- const rawCombinedBytes = byteLength(combined);
165
- const fingerprints = commandOutputFingerprints({
166
- command: options.fixture.command,
167
- stdout: options.fixture.stdout,
168
- stderr: options.fixture.stderr,
169
- combined,
170
- executionStatus: options.fixture.executionStatus,
171
- exitCode: options.fixture.exitCode,
172
- });
173
- const duplicate = await findExactDuplicateCommandOutput(options.vault, {
174
- sessionId: options.sessionId,
175
- fingerprints,
176
- }).catch(() => undefined);
177
- const decisionInput = { fixture: options.fixture, combined, rawCombinedBytes };
178
- if (duplicate !== undefined) {
179
- decisionInput.duplicate = duplicate;
180
- }
181
- const decision = options.policy.decide(decisionInput);
182
- const storeOptions = { ...options, combined, rawCombinedBytes, fingerprints, decision };
183
- if (duplicate !== undefined) {
184
- Object.assign(storeOptions, { duplicate });
185
- }
186
- const observation = await storeWithPolicy(storeOptions);
187
- const recovery = await checkRecovery({ ...options, observation, combined });
188
- return {
189
- fixtureId: options.fixture.id,
190
- iteration: options.iteration,
191
- outputId: observation.record.outputId,
192
- recordKind: observation.record.kind,
193
- persistence: observation.record.persistence.status,
194
- recoverability: observation.record.persistence.recoverability,
195
- rawCombinedBytes,
196
- exactStoredCombinedBytes: observation.exactStoredCombinedBytes,
197
- latencyMs: observation.latencyMs,
198
- exactRecovery: recovery.exactRecovery,
199
- usefulRecovery: recovery.usefulRecovery,
200
- ...(observation.duplicateOf !== undefined ? { duplicateOf: observation.duplicateOf } : {}),
201
- exactnessSensitive: options.fixture.exactnessSensitive,
202
- notes: recovery.notes,
203
- };
207
+ const combined = combineOutputSections(options.fixture.stdout, options.fixture.stderr);
208
+ const rawCombinedBytes = byteLength(combined);
209
+ const fingerprints = commandOutputFingerprints({
210
+ command: options.fixture.command,
211
+ stdout: options.fixture.stdout,
212
+ stderr: options.fixture.stderr,
213
+ combined,
214
+ executionStatus: options.fixture.executionStatus,
215
+ exitCode: options.fixture.exitCode,
216
+ });
217
+ const duplicate = await findExactDuplicateCommandOutput(options.vault, {
218
+ sessionId: options.sessionId,
219
+ fingerprints,
220
+ }).catch(() => undefined);
221
+ const decisionInput = { fixture: options.fixture, combined, rawCombinedBytes };
222
+ if (duplicate !== undefined) {
223
+ decisionInput.duplicate = duplicate;
224
+ }
225
+ const decision = options.policy.decide(decisionInput);
226
+ const storeOptions = { ...options, combined, rawCombinedBytes, fingerprints, decision };
227
+ if (duplicate !== undefined) {
228
+ Object.assign(storeOptions, { duplicate });
229
+ }
230
+ const observation = await storeWithPolicy(storeOptions);
231
+ const recovery = await checkRecovery({ ...options, observation, combined });
232
+ return {
233
+ fixtureId: options.fixture.id,
234
+ iteration: options.iteration,
235
+ outputId: observation.record.outputId,
236
+ recordKind: observation.record.kind,
237
+ persistence: observation.record.persistence.status,
238
+ recoverability: observation.record.persistence.recoverability,
239
+ rawCombinedBytes,
240
+ exactStoredCombinedBytes: observation.exactStoredCombinedBytes,
241
+ latencyMs: observation.latencyMs,
242
+ exactRecovery: recovery.exactRecovery,
243
+ usefulRecovery: recovery.usefulRecovery,
244
+ ...(observation.duplicateOf !== undefined ? { duplicateOf: observation.duplicateOf } : {}),
245
+ exactnessSensitive: options.fixture.exactnessSensitive,
246
+ notes: recovery.notes,
247
+ };
204
248
  }
205
249
  async function storeWithPolicy(options) {
206
- const startedAt = performance.now();
207
- if (options.decision === "exact") {
208
- const record = await storeCommandOutput(options.vault, {
209
- sessionId: options.sessionId,
210
- command: options.fixture.command,
211
- stdout: options.fixture.stdout,
212
- stderr: options.fixture.stderr,
213
- combined: options.combined,
214
- executionStatus: options.fixture.executionStatus,
215
- exitCode: options.fixture.exitCode,
216
- decisionIds: [decisionId("storage-policy", options.policy.id, options.fixture.id, String(options.iteration), "exact")],
217
- producer: { kind: "command", name: "storage-policy-experiment" },
218
- });
219
- return {
220
- record,
221
- decision: options.decision,
222
- latencyMs: performance.now() - startedAt,
223
- rawCombinedBytes: options.rawCombinedBytes,
224
- exactStoredCombinedBytes: options.rawCombinedBytes,
225
- };
226
- }
227
- const duplicateOf = options.decision === "duplicate-metadata" ? options.duplicate?.outputId : undefined;
228
- const record = await storeMetadataOutput(options.vault, {
229
- sessionId: options.sessionId,
230
- sourceKind: "other",
231
- rawLineCount: countLines(options.combined),
232
- rawByteCount: options.rawCombinedBytes,
233
- rawSha256: sha256Text(options.combined),
234
- decisionIds: [decisionId("storage-policy", options.policy.id, options.fixture.id, String(options.iteration), options.decision)],
235
- producer: { kind: "command", name: "storage-policy-experiment" },
236
- metadata: {
237
- policy: options.policy.id,
238
- command: options.fixture.command,
239
- executionStatus: options.fixture.executionStatus,
240
- exitCode: options.fixture.exitCode,
241
- exactnessSensitive: options.fixture.exactnessSensitive,
242
- ...(duplicateOf !== undefined ? { duplicateOf } : {}),
243
- },
250
+ const startedAt = performance.now();
251
+ if (options.decision === "exact") {
252
+ const record = await storeCommandOutput(options.vault, {
253
+ sessionId: options.sessionId,
254
+ command: options.fixture.command,
255
+ stdout: options.fixture.stdout,
256
+ stderr: options.fixture.stderr,
257
+ combined: options.combined,
258
+ executionStatus: options.fixture.executionStatus,
259
+ exitCode: options.fixture.exitCode,
260
+ decisionIds: [
261
+ decisionId("storage-policy", options.policy.id, options.fixture.id, String(options.iteration), "exact"),
262
+ ],
263
+ producer: { kind: "command", name: "storage-policy-experiment" },
244
264
  });
245
265
  return {
246
- record,
247
- decision: options.decision,
248
- latencyMs: performance.now() - startedAt,
249
- rawCombinedBytes: options.rawCombinedBytes,
250
- exactStoredCombinedBytes: 0,
251
- ...(duplicateOf !== undefined ? { duplicateOf } : {}),
266
+ record,
267
+ decision: options.decision,
268
+ latencyMs: performance.now() - startedAt,
269
+ rawCombinedBytes: options.rawCombinedBytes,
270
+ exactStoredCombinedBytes: options.rawCombinedBytes,
252
271
  };
272
+ }
273
+ const duplicateOf = options.decision === "duplicate-metadata" ? options.duplicate?.outputId : undefined;
274
+ const record = await storeMetadataOutput(options.vault, {
275
+ sessionId: options.sessionId,
276
+ sourceKind: "other",
277
+ rawLineCount: countLines(options.combined),
278
+ rawByteCount: options.rawCombinedBytes,
279
+ rawSha256: sha256Text(options.combined),
280
+ decisionIds: [
281
+ decisionId("storage-policy", options.policy.id, options.fixture.id, String(options.iteration), options.decision),
282
+ ],
283
+ producer: { kind: "command", name: "storage-policy-experiment" },
284
+ metadata: {
285
+ policy: options.policy.id,
286
+ command: options.fixture.command,
287
+ executionStatus: options.fixture.executionStatus,
288
+ exitCode: options.fixture.exitCode,
289
+ exactnessSensitive: options.fixture.exactnessSensitive,
290
+ ...(duplicateOf !== undefined ? { duplicateOf } : {}),
291
+ },
292
+ });
293
+ return {
294
+ record,
295
+ decision: options.decision,
296
+ latencyMs: performance.now() - startedAt,
297
+ rawCombinedBytes: options.rawCombinedBytes,
298
+ exactStoredCombinedBytes: 0,
299
+ ...(duplicateOf !== undefined ? { duplicateOf } : {}),
300
+ };
253
301
  }
254
302
  async function checkRecovery(options) {
255
- const notes = [];
256
- if (options.observation.record.kind === "command") {
257
- try {
258
- const recovered = await readOutputText(options.vault, options.sessionId, options.observation.record.outputId, "combined");
259
- const passed = recovered === options.combined;
260
- notes.push(passed ? "exact combined recovery passed" : "exact combined recovery mismatch");
261
- return { exactRecovery: passed ? "passed" : "failed", usefulRecovery: passed ? "exact" : "none", notes };
262
- }
263
- catch (error) {
264
- notes.push(`exact recovery failed: ${errorMessage(error)}`);
265
- return { exactRecovery: "failed", usefulRecovery: "none", notes };
266
- }
303
+ const notes = [];
304
+ if (options.observation.record.kind === "command") {
305
+ try {
306
+ const recovered = await readOutputText(
307
+ options.vault,
308
+ options.sessionId,
309
+ options.observation.record.outputId,
310
+ "combined",
311
+ );
312
+ const passed = recovered === options.combined;
313
+ notes.push(passed ? "exact combined recovery passed" : "exact combined recovery mismatch");
314
+ return { exactRecovery: passed ? "passed" : "failed", usefulRecovery: passed ? "exact" : "none", notes };
315
+ } catch (error) {
316
+ notes.push(`exact recovery failed: ${errorMessage(error)}`);
317
+ return { exactRecovery: "failed", usefulRecovery: "none", notes };
267
318
  }
268
- if (options.observation.duplicateOf !== undefined) {
269
- try {
270
- const recovered = await readOutputText(options.vault, options.sessionId, options.observation.duplicateOf, "combined");
271
- const passed = recovered === options.combined;
272
- notes.push(passed ? `metadata duplicate points to exact outputId=${options.observation.duplicateOf}` : `metadata duplicate pointer mismatch outputId=${options.observation.duplicateOf}`);
273
- return { exactRecovery: "not-exact", usefulRecovery: passed ? "duplicate-ref" : "none", notes };
274
- }
275
- catch (error) {
276
- notes.push(`duplicate reference recovery failed: ${errorMessage(error)}`);
277
- return { exactRecovery: "not-exact", usefulRecovery: "none", notes };
278
- }
319
+ }
320
+ if (options.observation.duplicateOf !== undefined) {
321
+ try {
322
+ const recovered = await readOutputText(
323
+ options.vault,
324
+ options.sessionId,
325
+ options.observation.duplicateOf,
326
+ "combined",
327
+ );
328
+ const passed = recovered === options.combined;
329
+ notes.push(
330
+ passed
331
+ ? `metadata duplicate points to exact outputId=${options.observation.duplicateOf}`
332
+ : `metadata duplicate pointer mismatch outputId=${options.observation.duplicateOf}`,
333
+ );
334
+ return { exactRecovery: "not-exact", usefulRecovery: passed ? "duplicate-ref" : "none", notes };
335
+ } catch (error) {
336
+ notes.push(`duplicate reference recovery failed: ${errorMessage(error)}`);
337
+ return { exactRecovery: "not-exact", usefulRecovery: "none", notes };
279
338
  }
280
- notes.push("metadata-only record intentionally has no raw exact recovery");
281
- return { exactRecovery: "not-exact", usefulRecovery: "metadata-only", notes };
339
+ }
340
+ notes.push("metadata-only record intentionally has no raw exact recovery");
341
+ return { exactRecovery: "not-exact", usefulRecovery: "metadata-only", notes };
282
342
  }
283
343
  function buildPolicyResult(options) {
284
- const rawCombinedBytes = sum(options.fixtureResults.map((fixture) => fixture.rawCombinedBytes));
285
- const exactStoredCombinedBytes = sum(options.fixtureResults.map((fixture) => fixture.exactStoredCombinedBytes));
286
- const latency = latencySummary(options.fixtureResults.map((fixture) => fixture.latencyMs));
287
- const exactnessSensitiveFixtures = options.fixtureResults.filter((fixture) => fixture.exactnessSensitive).length;
288
- const exactnessSensitiveRecoverable = options.fixtureResults.filter((fixture) => fixture.exactnessSensitive && (fixture.usefulRecovery === "exact" || fixture.usefulRecovery === "duplicate-ref")).length;
289
- const metadataOnlyRecords = options.fixtureResults.filter((fixture) => fixture.recordKind === "metadata").length;
290
- const duplicateMetadataRecords = options.fixtureResults.filter((fixture) => fixture.usefulRecovery === "duplicate-ref").length;
291
- const repeatedOutputsDeduped = duplicateMetadataRecords > 0;
292
- const safety = {
293
- exactnessSensitiveFixtures,
294
- exactnessSensitiveRecoverable,
295
- exactnessSensitiveRecoveryPassed: exactnessSensitiveRecoverable === exactnessSensitiveFixtures,
296
- metadataOnlyRecoveryLabeled: options.fixtureResults.every((fixture) => fixture.recordKind !== "metadata" || fixture.recoverability === "metadata_only"),
297
- repeatedOutputsDeduped,
298
- };
299
- const notes = [];
300
- if (!safety.exactnessSensitiveRecoveryPassed) {
301
- notes.push("disqualified: exactness-sensitive failure/verification output would lose exact recovery");
302
- }
303
- if (options.policy.id === "threshold-exact" && !safety.exactnessSensitiveRecoveryPassed) {
304
- notes.push("threshold-only policy is unsafe without an exactness-sensitive override");
305
- }
306
- if (options.policy.id === "metadata-small-exact-large-hybrid" && safety.exactnessSensitiveRecoveryPassed) {
307
- notes.push("hybrid preserved exact recovery for sensitive fixtures while reducing exact raw storage");
308
- }
309
- if (options.policy.id === "duplicate-output-dedupe" && repeatedOutputsDeduped) {
310
- notes.push("duplicates kept metadata pointers to prior exact output");
311
- }
312
- if (options.policy.id === "hybrid-dedupe" && safety.exactnessSensitiveRecoveryPassed && repeatedOutputsDeduped) {
313
- notes.push("hybrid+dedupe preserved exact-sensitive recovery while metadata-only small output and duplicate pointers reduced exact raw storage");
314
- }
315
- return {
316
- policyId: options.policy.id,
317
- label: options.policy.label,
318
- description: options.policy.description,
319
- totals: {
320
- rawCombinedBytes,
321
- rawCombinedTokensApprox: approximateTokens(rawCombinedBytes),
322
- exactStoredCombinedBytes,
323
- exactStoredTokensApprox: approximateTokens(exactStoredCombinedBytes),
324
- storageBytes: options.storageBytes,
325
- indexBytes: options.indexBytes,
326
- metadataOnlyRecords,
327
- exactRecords: options.fixtureResults.length - metadataOnlyRecords,
328
- duplicateMetadataRecords,
329
- storageReductionPercent: reductionPercent(rawCombinedBytes, exactStoredCombinedBytes),
330
- tokenSurfaceReductionPercent: reductionPercent(approximateTokens(rawCombinedBytes), approximateTokens(exactStoredCombinedBytes)),
331
- privacySurfacePercent: rawCombinedBytes > 0 ? Math.round((exactStoredCombinedBytes / rawCombinedBytes) * 10_000) / 100 : 0,
332
- latencyMs: latency,
333
- },
334
- safety,
335
- fixtures: options.fixtureResults,
336
- notes,
337
- };
344
+ const rawCombinedBytes = sum(options.fixtureResults.map((fixture) => fixture.rawCombinedBytes));
345
+ const exactStoredCombinedBytes = sum(options.fixtureResults.map((fixture) => fixture.exactStoredCombinedBytes));
346
+ const latency = latencySummary(options.fixtureResults.map((fixture) => fixture.latencyMs));
347
+ const exactnessSensitiveFixtures = options.fixtureResults.filter((fixture) => fixture.exactnessSensitive).length;
348
+ const exactnessSensitiveRecoverable = options.fixtureResults.filter(
349
+ (fixture) =>
350
+ fixture.exactnessSensitive && (fixture.usefulRecovery === "exact" || fixture.usefulRecovery === "duplicate-ref"),
351
+ ).length;
352
+ const metadataOnlyRecords = options.fixtureResults.filter((fixture) => fixture.recordKind === "metadata").length;
353
+ const duplicateMetadataRecords = options.fixtureResults.filter(
354
+ (fixture) => fixture.usefulRecovery === "duplicate-ref",
355
+ ).length;
356
+ const repeatedOutputsDeduped = duplicateMetadataRecords > 0;
357
+ const safety = {
358
+ exactnessSensitiveFixtures,
359
+ exactnessSensitiveRecoverable,
360
+ exactnessSensitiveRecoveryPassed: exactnessSensitiveRecoverable === exactnessSensitiveFixtures,
361
+ metadataOnlyRecoveryLabeled: options.fixtureResults.every(
362
+ (fixture) => fixture.recordKind !== "metadata" || fixture.recoverability === "metadata_only",
363
+ ),
364
+ repeatedOutputsDeduped,
365
+ };
366
+ const notes = [];
367
+ if (!safety.exactnessSensitiveRecoveryPassed) {
368
+ notes.push("disqualified: exactness-sensitive failure/verification output would lose exact recovery");
369
+ }
370
+ if (options.policy.id === "threshold-exact" && !safety.exactnessSensitiveRecoveryPassed) {
371
+ notes.push("threshold-only policy is unsafe without an exactness-sensitive override");
372
+ }
373
+ if (options.policy.id === "metadata-small-exact-large-hybrid" && safety.exactnessSensitiveRecoveryPassed) {
374
+ notes.push("hybrid preserved exact recovery for sensitive fixtures while reducing exact raw storage");
375
+ }
376
+ if (options.policy.id === "duplicate-output-dedupe" && repeatedOutputsDeduped) {
377
+ notes.push("duplicates kept metadata pointers to prior exact output");
378
+ }
379
+ if (options.policy.id === "hybrid-dedupe" && safety.exactnessSensitiveRecoveryPassed && repeatedOutputsDeduped) {
380
+ notes.push(
381
+ "hybrid+dedupe preserved exact-sensitive recovery while metadata-only small output and duplicate pointers reduced exact raw storage",
382
+ );
383
+ }
384
+ return {
385
+ policyId: options.policy.id,
386
+ label: options.policy.label,
387
+ description: options.policy.description,
388
+ totals: {
389
+ rawCombinedBytes,
390
+ rawCombinedTokensApprox: approximateTokens(rawCombinedBytes),
391
+ exactStoredCombinedBytes,
392
+ exactStoredTokensApprox: approximateTokens(exactStoredCombinedBytes),
393
+ storageBytes: options.storageBytes,
394
+ indexBytes: options.indexBytes,
395
+ metadataOnlyRecords,
396
+ exactRecords: options.fixtureResults.length - metadataOnlyRecords,
397
+ duplicateMetadataRecords,
398
+ storageReductionPercent: reductionPercent(rawCombinedBytes, exactStoredCombinedBytes),
399
+ tokenSurfaceReductionPercent: reductionPercent(
400
+ approximateTokens(rawCombinedBytes),
401
+ approximateTokens(exactStoredCombinedBytes),
402
+ ),
403
+ privacySurfacePercent:
404
+ rawCombinedBytes > 0 ? Math.round((exactStoredCombinedBytes / rawCombinedBytes) * 10_000) / 100 : 0,
405
+ latencyMs: latency,
406
+ },
407
+ safety,
408
+ fixtures: options.fixtureResults,
409
+ notes,
410
+ };
338
411
  }
339
412
  function summarizeStoragePolicyReport(policies) {
340
- const safeCandidateIds = policies
341
- .filter((policy) => policy.safety.exactnessSensitiveRecoveryPassed && policy.safety.metadataOnlyRecoveryLabeled)
342
- .map((policy) => policy.policyId);
343
- const disqualifiedCandidateIds = policies
344
- .filter((policy) => !policy.safety.exactnessSensitiveRecoveryPassed || !policy.safety.metadataOnlyRecoveryLabeled)
345
- .map((policy) => policy.policyId);
346
- return {
347
- fixtures: FIXTURES.length,
348
- policies: policies.length,
349
- safeCandidateIds,
350
- disqualifiedCandidateIds,
351
- defaultUnchanged: true,
352
- };
413
+ const safeCandidateIds = policies
414
+ .filter((policy) => policy.safety.exactnessSensitiveRecoveryPassed && policy.safety.metadataOnlyRecoveryLabeled)
415
+ .map((policy) => policy.policyId);
416
+ const disqualifiedCandidateIds = policies
417
+ .filter((policy) => !policy.safety.exactnessSensitiveRecoveryPassed || !policy.safety.metadataOnlyRecoveryLabeled)
418
+ .map((policy) => policy.policyId);
419
+ return {
420
+ fixtures: FIXTURES.length,
421
+ policies: policies.length,
422
+ safeCandidateIds,
423
+ disqualifiedCandidateIds,
424
+ defaultUnchanged: true,
425
+ };
353
426
  }
354
427
  function createStoragePolicyFixtures() {
355
- const largeLines = Array.from({ length: 300 }, (_, index) => `large log line ${String(index + 1).padStart(3, "0")} ${"x".repeat(80)}`).join("\n") + "\nLARGE_LOG_SENTINEL exact tail\n";
356
- return [
357
- {
358
- id: "small-success",
359
- title: "Small successful command output",
360
- command: "echo ok",
361
- stdout: "ok\n",
362
- stderr: "",
363
- executionStatus: "success",
364
- exitCode: 0,
365
- exactnessSensitive: false,
366
- },
367
- {
368
- id: "small-failure",
369
- title: "Small failed command with exact diagnostic",
370
- command: "npm test",
371
- stdout: "Tests: 1 failed, 24 passed, 25 total\n",
372
- stderr: "AssertionError: STORAGE_POLICY_FAILURE_SENTINEL\n",
373
- executionStatus: "failed",
374
- exitCode: 1,
375
- exactnessSensitive: true,
376
- },
377
- {
378
- id: "verification-output",
379
- title: "Verification output with completion claim evidence",
380
- command: "npm run verify",
381
- stdout: "Verification passed: STORAGE_POLICY_VERIFY_SENTINEL\n",
382
- stderr: "",
383
- executionStatus: "success",
384
- exitCode: 0,
385
- exactnessSensitive: true,
386
- },
387
- {
388
- id: "large-log",
389
- title: "Large noisy log output",
390
- command: "tail huge.log",
391
- stdout: largeLines,
392
- stderr: "",
393
- executionStatus: "success",
394
- exitCode: 0,
395
- exactnessSensitive: false,
396
- },
397
- {
398
- id: "large-log-repeat",
399
- title: "Large noisy log repeated output",
400
- command: "tail huge.log",
401
- stdout: largeLines,
402
- stderr: "",
403
- executionStatus: "success",
404
- exitCode: 0,
405
- exactnessSensitive: false,
406
- repeatedGroup: "large-log",
407
- },
408
- {
409
- id: "repeated-failure-a",
410
- title: "Repeated exactness-sensitive failure first occurrence",
411
- command: "npm test -- repeated",
412
- stdout: "Tests: 1 failed, 24 passed, 25 total\n",
413
- stderr: "AssertionError: REPEATED_STORAGE_POLICY_FAILURE_SENTINEL\n",
414
- executionStatus: "failed",
415
- exitCode: 1,
416
- exactnessSensitive: true,
417
- repeatedGroup: "failure",
418
- },
419
- {
420
- id: "repeated-failure-b",
421
- title: "Repeated exactness-sensitive failure second occurrence",
422
- command: "npm test -- repeated",
423
- stdout: "Tests: 1 failed, 24 passed, 25 total\n",
424
- stderr: "AssertionError: REPEATED_STORAGE_POLICY_FAILURE_SENTINEL\n",
425
- executionStatus: "failed",
426
- exitCode: 1,
427
- exactnessSensitive: true,
428
- repeatedGroup: "failure",
429
- },
430
- {
431
- id: "repeat-a",
432
- title: "Repeated output first occurrence",
433
- command: "fixture repeat",
434
- stdout: "REPEATED_STORAGE_POLICY_SENTINEL\n",
435
- stderr: "",
436
- executionStatus: "success",
437
- exitCode: 0,
438
- exactnessSensitive: false,
439
- repeatedGroup: "repeat",
440
- },
441
- {
442
- id: "repeat-b",
443
- title: "Repeated output second occurrence",
444
- command: "fixture repeat",
445
- stdout: "REPEATED_STORAGE_POLICY_SENTINEL\n",
446
- stderr: "",
447
- executionStatus: "success",
448
- exitCode: 0,
449
- exactnessSensitive: false,
450
- repeatedGroup: "repeat",
451
- },
452
- ];
428
+ const largeLines =
429
+ Array.from(
430
+ { length: 300 },
431
+ (_, index) => `large log line ${String(index + 1).padStart(3, "0")} ${"x".repeat(80)}`,
432
+ ).join("\n") + "\nLARGE_LOG_SENTINEL exact tail\n";
433
+ return [
434
+ {
435
+ id: "small-success",
436
+ title: "Small successful command output",
437
+ command: "echo ok",
438
+ stdout: "ok\n",
439
+ stderr: "",
440
+ executionStatus: "success",
441
+ exitCode: 0,
442
+ exactnessSensitive: false,
443
+ },
444
+ {
445
+ id: "small-failure",
446
+ title: "Small failed command with exact diagnostic",
447
+ command: "npm test",
448
+ stdout: "Tests: 1 failed, 24 passed, 25 total\n",
449
+ stderr: "AssertionError: STORAGE_POLICY_FAILURE_SENTINEL\n",
450
+ executionStatus: "failed",
451
+ exitCode: 1,
452
+ exactnessSensitive: true,
453
+ },
454
+ {
455
+ id: "verification-output",
456
+ title: "Verification output with completion claim evidence",
457
+ command: "npm run verify",
458
+ stdout: "Verification passed: STORAGE_POLICY_VERIFY_SENTINEL\n",
459
+ stderr: "",
460
+ executionStatus: "success",
461
+ exitCode: 0,
462
+ exactnessSensitive: true,
463
+ },
464
+ {
465
+ id: "large-log",
466
+ title: "Large noisy log output",
467
+ command: "tail huge.log",
468
+ stdout: largeLines,
469
+ stderr: "",
470
+ executionStatus: "success",
471
+ exitCode: 0,
472
+ exactnessSensitive: false,
473
+ },
474
+ {
475
+ id: "large-log-repeat",
476
+ title: "Large noisy log repeated output",
477
+ command: "tail huge.log",
478
+ stdout: largeLines,
479
+ stderr: "",
480
+ executionStatus: "success",
481
+ exitCode: 0,
482
+ exactnessSensitive: false,
483
+ repeatedGroup: "large-log",
484
+ },
485
+ {
486
+ id: "repeated-failure-a",
487
+ title: "Repeated exactness-sensitive failure first occurrence",
488
+ command: "npm test -- repeated",
489
+ stdout: "Tests: 1 failed, 24 passed, 25 total\n",
490
+ stderr: "AssertionError: REPEATED_STORAGE_POLICY_FAILURE_SENTINEL\n",
491
+ executionStatus: "failed",
492
+ exitCode: 1,
493
+ exactnessSensitive: true,
494
+ repeatedGroup: "failure",
495
+ },
496
+ {
497
+ id: "repeated-failure-b",
498
+ title: "Repeated exactness-sensitive failure second occurrence",
499
+ command: "npm test -- repeated",
500
+ stdout: "Tests: 1 failed, 24 passed, 25 total\n",
501
+ stderr: "AssertionError: REPEATED_STORAGE_POLICY_FAILURE_SENTINEL\n",
502
+ executionStatus: "failed",
503
+ exitCode: 1,
504
+ exactnessSensitive: true,
505
+ repeatedGroup: "failure",
506
+ },
507
+ {
508
+ id: "repeat-a",
509
+ title: "Repeated output first occurrence",
510
+ command: "fixture repeat",
511
+ stdout: "REPEATED_STORAGE_POLICY_SENTINEL\n",
512
+ stderr: "",
513
+ executionStatus: "success",
514
+ exitCode: 0,
515
+ exactnessSensitive: false,
516
+ repeatedGroup: "repeat",
517
+ },
518
+ {
519
+ id: "repeat-b",
520
+ title: "Repeated output second occurrence",
521
+ command: "fixture repeat",
522
+ stdout: "REPEATED_STORAGE_POLICY_SENTINEL\n",
523
+ stderr: "",
524
+ executionStatus: "success",
525
+ exitCode: 0,
526
+ exactnessSensitive: false,
527
+ repeatedGroup: "repeat",
528
+ },
529
+ ];
453
530
  }
454
531
  async function directorySize(path) {
455
- try {
456
- const info = await stat(path);
457
- if (info.isFile()) {
458
- return info.size;
459
- }
460
- if (!info.isDirectory()) {
461
- return 0;
462
- }
532
+ try {
533
+ const info = await stat(path);
534
+ if (info.isFile()) {
535
+ return info.size;
463
536
  }
464
- catch {
465
- return 0;
537
+ if (!info.isDirectory()) {
538
+ return 0;
466
539
  }
467
- const entries = await readdir(path, { withFileTypes: true });
468
- let total = 0;
469
- for (const entry of entries) {
470
- total += await directorySize(join(path, entry.name));
471
- }
472
- return total;
540
+ } catch {
541
+ return 0;
542
+ }
543
+ const entries = await readdir(path, { withFileTypes: true });
544
+ let total = 0;
545
+ for (const entry of entries) {
546
+ total += await directorySize(join(path, entry.name));
547
+ }
548
+ return total;
473
549
  }
474
550
  async function createTempDir(prefix) {
475
- const path = await mkdtemp(resolve(tmpdir(), prefix));
476
- return {
477
- path,
478
- cleanup: async () => {
479
- await rm(path, { recursive: true, force: true });
480
- },
481
- };
551
+ const path = await mkdtemp(resolve(tmpdir(), prefix));
552
+ return {
553
+ path,
554
+ cleanup: async () => {
555
+ await rm(path, { recursive: true, force: true });
556
+ },
557
+ };
482
558
  }
483
559
  function combineOutputSections(stdout, stderr) {
484
- if (stdout.length === 0) {
485
- return stderr;
486
- }
487
- if (stderr.length === 0) {
488
- return stdout;
489
- }
490
- return `[stdout]\n${stdout}\n[stderr]\n${stderr}`;
560
+ if (stdout.length === 0) {
561
+ return stderr;
562
+ }
563
+ if (stderr.length === 0) {
564
+ return stdout;
565
+ }
566
+ return `[stdout]\n${stdout}\n[stderr]\n${stderr}`;
491
567
  }
492
568
  function countLines(text) {
493
- if (text.length === 0) {
494
- return 0;
495
- }
496
- return text.split("\n").length;
569
+ if (text.length === 0) {
570
+ return 0;
571
+ }
572
+ return text.split("\n").length;
497
573
  }
498
574
  function sum(values) {
499
- return values.reduce((total, value) => total + value, 0);
575
+ return values.reduce((total, value) => total + value, 0);
500
576
  }
501
577
  function byteLength(value) {
502
- return Buffer.byteLength(value, "utf8");
578
+ return Buffer.byteLength(value, "utf8");
503
579
  }
504
580
  function sha256Text(value) {
505
- return createHash("sha256").update(value).digest("hex");
581
+ return createHash("sha256").update(value).digest("hex");
506
582
  }
507
583
  function decisionId(...parts) {
508
- return `ffdec_${sha256Text(parts.join("\0")).slice(0, 16)}`;
584
+ return `ffdec_${sha256Text(parts.join("\0")).slice(0, 16)}`;
509
585
  }
510
586
  function errorMessage(error) {
511
- return error instanceof Error ? error.message : String(error);
587
+ return error instanceof Error ? error.message : String(error);
512
588
  }
513
589
  function defaultReportPath() {
514
- return resolve(process.cwd(), "evals/reports/runtime/storage-policy-benchmark-1-report.md");
590
+ return resolve(process.cwd(), "router/evals/reports/storage-policy-benchmark-1-report.md");
515
591
  }
516
592
  async function runCli() {
517
- const { iterations, reportPath, jsonReportPath } = parseBenchmarkCliArgs(process.argv.slice(2), { reportPath: defaultReportPath() });
518
- const options = {};
519
- if (iterations !== undefined) {
520
- options.iterations = iterations;
521
- }
522
- const report = await runStoragePolicyBenchmarks(options);
523
- const reports = await writeStoragePolicyBenchmarkReports(report, reportPath, {
524
- jsonReportPath: jsonReportPath === undefined ? defaultJsonRunReportPath(reportPath) : jsonReportPath,
525
- });
526
- const shortId = createHash("sha256").update(JSON.stringify(report.summary)).digest("hex").slice(0, 8);
527
- console.log(`Freeflow storage policy benchmark ${shortId}: safe candidates ${report.summary.safeCandidateIds.join(", ") || "none"}`);
528
- console.log(`Markdown report: ${reports.markdown}`);
529
- if (reports.json) {
530
- console.log(`JSON run data: ${reports.json}`);
531
- }
532
- if (report.summary.safeCandidateIds.length === 0) {
533
- process.exitCode = 1;
534
- }
593
+ const { iterations, reportPath, jsonReportPath } = parseBenchmarkCliArgs(process.argv.slice(2), {
594
+ reportPath: defaultReportPath(),
595
+ });
596
+ const options = {};
597
+ if (iterations !== undefined) {
598
+ options.iterations = iterations;
599
+ }
600
+ const report = await runStoragePolicyBenchmarks(options);
601
+ const reports = await writeStoragePolicyBenchmarkReports(report, reportPath, {
602
+ jsonReportPath: jsonReportPath === undefined ? defaultJsonRunReportPath(reportPath) : jsonReportPath,
603
+ });
604
+ const shortId = createHash("sha256").update(JSON.stringify(report.summary)).digest("hex").slice(0, 8);
605
+ console.log(
606
+ `Freeflow storage policy benchmark ${shortId}: safe candidates ${report.summary.safeCandidateIds.join(", ") || "none"}`,
607
+ );
608
+ console.log(`Markdown report: ${reports.markdown}`);
609
+ if (reports.json) {
610
+ console.log(`JSON run data: ${reports.json}`);
611
+ }
612
+ if (report.summary.safeCandidateIds.length === 0) {
613
+ process.exitCode = 1;
614
+ }
535
615
  }
536
616
  if (process.argv[1] && fileURLToPath(import.meta.url) === resolve(process.argv[1])) {
537
- await runCli();
617
+ await runCli();
538
618
  }