@hassangameryt/freeflow 0.3.0 → 0.5.0

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