@hassangameryt/freeflow 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +5 -2
  3. package/.codex-plugin/plugin.json +8 -9
  4. package/README.md +190 -128
  5. package/assets/feedback-loop.png +0 -0
  6. package/assets/freeflow_workflow_map.png +0 -0
  7. package/assets/workflow.png +0 -0
  8. package/command-surface.json +51 -7
  9. package/hooks/freeflow-runtime-context.mjs +264 -136
  10. package/hooks/tests/check-runtime-context-hook.sh +223 -0
  11. package/package.json +23 -24
  12. package/pi-extension/dist/index.js +264 -80
  13. package/pi-extension/dist/integrations/mcp-config.js +29 -0
  14. package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
  15. package/pi-extension/dist/output-router/native-safety-net.js +216 -0
  16. package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
  17. package/pi-extension/dist/output-router/renderers.js +1023 -0
  18. package/pi-extension/dist/output-router/router-tools.js +554 -0
  19. package/pi-extension/dist/output-router/schemas.js +383 -0
  20. package/pi-extension/dist/output-router/status.js +744 -0
  21. package/pi-extension/dist/output-router/utils.js +502 -0
  22. package/pi-extension/dist/runtime/runtime-context.js +798 -0
  23. package/pi-extension/dist/settings/settings-tui.js +314 -0
  24. package/pi-extension/dist/settings/settings-ui.js +1487 -0
  25. package/pi-extension/freeflow/index.js +1 -0
  26. package/pi-extension/src/index.ts +230 -56
  27. package/pi-extension/src/{host-producer-identification.ts → output-router/host-producer-identification.ts} +37 -7
  28. package/pi-extension/src/{native-safety-net.ts → output-router/native-safety-net.ts} +7 -11
  29. package/pi-extension/src/{observed-tool-routing.ts → output-router/observed-tool-routing.ts} +19 -11
  30. package/pi-extension/src/{renderers.ts → output-router/renderers.ts} +246 -55
  31. package/pi-extension/src/{router-tools.ts → output-router/router-tools.ts} +130 -29
  32. package/pi-extension/src/{schemas.ts → output-router/schemas.ts} +171 -43
  33. package/pi-extension/src/output-router/status.ts +791 -0
  34. package/pi-extension/src/{utils.ts → output-router/utils.ts} +80 -18
  35. package/pi-extension/src/runtime/runtime-context.ts +895 -0
  36. package/pi-extension/src/settings/settings-tui.ts +408 -0
  37. package/pi-extension/src/settings/settings-ui.ts +1730 -0
  38. package/pi-extension/tests/integration/pi-extension.test.js +4018 -0
  39. package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
  40. package/pi-extension/tests/output-router/search.test.js +722 -0
  41. package/pi-extension/tests/settings/settings-tui.test.js +243 -0
  42. package/router/dist/benchmarks/benchmark-harness.d.ts +16 -13
  43. package/router/dist/benchmarks/benchmark-harness.js +62 -62
  44. package/router/dist/benchmarks/benchmarks.d.ts +80 -73
  45. package/router/dist/benchmarks/benchmarks.js +860 -761
  46. package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +71 -67
  47. package/router/dist/benchmarks/codex-qa-benchmarks.js +429 -390
  48. package/router/dist/benchmarks/command-benchmarks.d.ts +107 -92
  49. package/router/dist/benchmarks/command-benchmarks.js +616 -571
  50. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +64 -56
  51. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +679 -613
  52. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +103 -95
  53. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1188 -1103
  54. package/router/dist/benchmarks/context-saving-baseline.d.ts +47 -41
  55. package/router/dist/benchmarks/context-saving-baseline.js +405 -374
  56. package/router/dist/benchmarks/index-benchmarks.d.ts +74 -69
  57. package/router/dist/benchmarks/index-benchmarks.js +761 -661
  58. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +80 -69
  59. package/router/dist/benchmarks/storage-policy-benchmarks.js +549 -469
  60. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +43 -34
  61. package/router/dist/benchmarks/vault-index-benchmarks.js +294 -229
  62. package/router/dist/config/config.d.ts +61 -54
  63. package/router/dist/config/config.js +551 -372
  64. package/router/dist/config/router-contract.d.ts +2 -2
  65. package/router/dist/config/router-contract.js +38 -38
  66. package/router/dist/config/schema.d.ts +19 -10
  67. package/router/dist/config/schema.js +586 -538
  68. package/router/dist/config/types.d.ts +413 -361
  69. package/router/dist/config/types.js +19 -8
  70. package/router/dist/evidence/bounded-evidence.d.ts +26 -26
  71. package/router/dist/evidence/bounded-evidence.js +265 -252
  72. package/router/dist/evidence/evidence-range-selector.d.ts +16 -14
  73. package/router/dist/evidence/evidence-range-selector.js +192 -191
  74. package/router/dist/evidence/evidence-search.d.ts +18 -16
  75. package/router/dist/evidence/evidence-search.js +401 -377
  76. package/router/dist/evidence/evidence.d.ts +17 -17
  77. package/router/dist/evidence/evidence.js +163 -159
  78. package/router/dist/evidence/failure-contracts.d.ts +25 -15
  79. package/router/dist/evidence/failure-contracts.js +132 -126
  80. package/router/dist/evidence/line-ranges.d.ts +17 -15
  81. package/router/dist/evidence/line-ranges.js +18 -18
  82. package/router/dist/experiments/local-index.d.ts +47 -41
  83. package/router/dist/experiments/local-index.js +477 -458
  84. package/router/dist/local/local-traversal.d.ts +18 -0
  85. package/router/dist/local/local-traversal.js +334 -0
  86. package/router/dist/processing/engine.d.ts +94 -70
  87. package/router/dist/processing/engine.js +462 -364
  88. package/router/dist/processing/reducers.d.ts +208 -194
  89. package/router/dist/processing/reducers.js +1434 -1256
  90. package/router/dist/processing/renderers.d.ts +24 -18
  91. package/router/dist/processing/renderers.js +161 -152
  92. package/router/dist/processing/scripts.d.ts +80 -67
  93. package/router/dist/processing/scripts.js +343 -290
  94. package/router/dist/repo/repo-traversal.d.ts +9 -9
  95. package/router/dist/repo/repo-traversal.js +205 -202
  96. package/router/dist/routing/observed-reducers.d.ts +25 -19
  97. package/router/dist/routing/observed-reducers.js +559 -545
  98. package/router/dist/routing/observed-routing.d.ts +23 -14
  99. package/router/dist/routing/observed-routing.js +319 -318
  100. package/router/dist/routing/parsers.d.ts +10 -10
  101. package/router/dist/routing/parsers.js +454 -406
  102. package/router/dist/routing/run-filters.d.ts +45 -41
  103. package/router/dist/routing/run-filters.js +215 -207
  104. package/router/dist/routing/run-reducers.d.ts +45 -26
  105. package/router/dist/routing/run-reducers.js +102 -90
  106. package/router/dist/sandbox/adapter-roots.d.ts +34 -26
  107. package/router/dist/sandbox/adapter-roots.js +43 -41
  108. package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -5
  109. package/router/dist/sandbox/eryx-python-adapter.js +659 -588
  110. package/router/dist/sandbox/jq-wasm-adapter.d.ts +3 -3
  111. package/router/dist/sandbox/jq-wasm-adapter.js +319 -311
  112. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -5
  113. package/router/dist/sandbox/quickjs-wasi-adapter.js +336 -333
  114. package/router/dist/sandbox/script-sandbox.d.ts +105 -84
  115. package/router/dist/sandbox/script-sandbox.js +294 -260
  116. package/router/dist/setup/script-transform-adapters.d.ts +23 -19
  117. package/router/dist/setup/script-transform-adapters.js +223 -204
  118. package/router/dist/tools/batch.d.ts +27 -16
  119. package/router/dist/tools/batch.js +493 -416
  120. package/router/dist/tools/run.d.ts +47 -35
  121. package/router/dist/tools/run.js +1171 -1086
  122. package/router/dist/tools/search.d.ts +53 -31
  123. package/router/dist/tools/search.js +1224 -1065
  124. package/router/dist/transform/engine.d.ts +121 -96
  125. package/router/dist/transform/engine.js +1853 -1736
  126. package/router/dist/vault/vault-index.d.ts +97 -78
  127. package/router/dist/vault/vault-index.js +347 -342
  128. package/router/dist/vault/vault.d.ts +109 -74
  129. package/router/dist/vault/vault.js +528 -533
  130. package/runtime/interaction-contract.md +16 -0
  131. package/skills/bypass/SKILL.md +52 -38
  132. package/skills/commit-work/SKILL.md +54 -46
  133. package/skills/commit-work/references/staging-decisions.md +46 -24
  134. package/skills/decision-gate/SKILL.md +48 -0
  135. package/skills/design-for-depth/SKILL.md +75 -59
  136. package/skills/design-for-depth/references/design-pressure-signals.md +56 -7
  137. package/skills/design-for-depth/references/interface-design-loop.md +156 -0
  138. package/skills/design-for-depth/references/software-design-philosophy.md +32 -3
  139. package/skills/diagnose-failure/SKILL.md +65 -60
  140. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
  141. package/skills/diagnose-failure/references/flaky-and-performance.md +30 -18
  142. package/skills/discuss/SKILL.md +121 -0
  143. package/skills/discuss/references/checkpoints.md +66 -0
  144. package/skills/evaluate-skill/SKILL.md +62 -53
  145. package/skills/evaluate-skill/references/definition-schema.md +345 -0
  146. package/skills/evaluate-skill/references/evaluation-design.md +86 -0
  147. package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
  148. package/skills/evaluate-skill/references/review-and-revision.md +51 -0
  149. package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
  150. package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
  151. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
  152. package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
  153. package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
  154. package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
  155. package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
  156. package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
  157. package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
  158. package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
  159. package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
  160. package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
  161. package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
  162. package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
  163. package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
  164. package/skills/execute-work/SKILL.md +99 -0
  165. package/skills/execute-work/references/code-practices.md +78 -0
  166. package/skills/execute-work/references/execution-loop.md +77 -0
  167. package/skills/finish-branch/SKILL.md +117 -0
  168. package/skills/finish-branch/references/integration-options.md +80 -0
  169. package/skills/handoff/SKILL.md +65 -39
  170. package/skills/handoff/references/templates.md +104 -27
  171. package/skills/launch-work/SKILL.md +116 -0
  172. package/skills/launch-work/references/launch-readiness.md +85 -0
  173. package/skills/migration-work/SKILL.md +115 -0
  174. package/skills/migration-work/references/migration-lifecycle.md +82 -0
  175. package/skills/mode-contract/SKILL.md +50 -52
  176. package/skills/output-router/SKILL.md +21 -17
  177. package/skills/output-router/references/safety-policy.md +1 -1
  178. package/skills/release-work/SKILL.md +118 -0
  179. package/skills/release-work/references/release-evidence.md +78 -0
  180. package/skills/review-artifact/SKILL.md +77 -69
  181. package/skills/review-artifact/references/reviewer-prompt.md +133 -42
  182. package/skills/review-work/SKILL.md +82 -57
  183. package/skills/review-work/references/reviewer-prompt.md +97 -60
  184. package/skills/review-work/references/security-risk-lens.md +67 -0
  185. package/skills/setup-freeflow/SKILL.md +58 -66
  186. package/skills/setup-freeflow/references/activation-contract.md +89 -69
  187. package/skills/setup-freeflow/references/host-setup.md +54 -17
  188. package/skills/setup-freeflow/references/output-router-setup.md +62 -54
  189. package/skills/simplify-code/SKILL.md +80 -0
  190. package/skills/simplify-code/references/simplification-patterns.md +70 -0
  191. package/skills/tdd/SKILL.md +96 -0
  192. package/skills/tdd/references/test-design.md +96 -0
  193. package/skills/track-work/SKILL.md +84 -0
  194. package/skills/track-work/references/working-record-schema.md +378 -0
  195. package/skills/verify-work/SKILL.md +59 -38
  196. package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
  197. package/skills/verify-work/references/integration-evidence.md +51 -0
  198. package/skills/verify-work/references/performance-evidence.md +57 -0
  199. package/skills/workflow/SKILL.md +53 -59
  200. package/skills/workflow/references/domain-skill-composition.md +57 -0
  201. package/skills/workflow/references/workflow-loop.md +92 -0
  202. package/skills/write-plan/SKILL.md +85 -58
  203. package/skills/write-plan/references/plan-shapes.md +132 -46
  204. package/skills/write-skill/SKILL.md +82 -51
  205. package/skills/write-skill/references/activation-boundaries.md +62 -0
  206. package/skills/write-skill/references/agent-first-instructions.md +87 -0
  207. package/skills/write-skill/references/progressive-disclosure.md +63 -0
  208. package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
  209. package/skills/write-skill/scripts/skill-author.mjs +104 -0
  210. package/skills/write-spec/SKILL.md +65 -54
  211. package/skills/write-spec/references/artifact-standards.md +60 -41
  212. package/skills/write-spec/references/decision-records.md +77 -0
  213. package/skills/write-spec/references/spec-shapes.md +119 -60
  214. package/evals/README.md +0 -32
  215. package/evals/fixtures/copy-conventions.md +0 -31
  216. package/evals/fixtures/output-router/README.md +0 -12
  217. package/evals/fixtures/output-router/failed-command-output.txt +0 -9
  218. package/evals/fixtures/output-router/large-router-manual.md +0 -63
  219. package/evals/fixtures/output-router/native-large-output.txt +0 -40
  220. package/evals/fixtures/output-router/noisy-test-output.txt +0 -30
  221. package/evals/fixtures/output-router/verification-output.txt +0 -8
  222. package/evals/fixtures/tiny-artifact-review-app/README.md +0 -5
  223. package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +0 -10
  224. package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +0 -21
  225. package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +0 -24
  226. package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +0 -17
  227. package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +0 -8
  228. package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +0 -15
  229. package/evals/fixtures/tiny-commit-ambiguous-app/README.md +0 -3
  230. package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +0 -5
  231. package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +0 -1
  232. package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +0 -5
  233. package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +0 -14
  234. package/evals/fixtures/tiny-commit-app/README.md +0 -3
  235. package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +0 -5
  236. package/evals/fixtures/tiny-commit-app/src/billing.ts +0 -5
  237. package/evals/fixtures/tiny-commit-app/src/settings-page.ts +0 -1
  238. package/evals/fixtures/tiny-commit-app/tests/settings.test.md +0 -5
  239. package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +0 -15
  240. package/evals/fixtures/tiny-commit-everything-app/README.md +0 -3
  241. package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +0 -5
  242. package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +0 -5
  243. package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +0 -1
  244. package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +0 -5
  245. package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +0 -15
  246. package/evals/fixtures/tiny-commit-staged-app/README.md +0 -3
  247. package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +0 -5
  248. package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +0 -5
  249. package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +0 -1
  250. package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +0 -5
  251. package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +0 -15
  252. package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +0 -3
  253. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +0 -3
  254. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +0 -3
  255. package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +0 -5
  256. package/evals/fixtures/tiny-dashboard-stale-app/README.md +0 -11
  257. package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +0 -13
  258. package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +0 -19
  259. package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +0 -9
  260. package/evals/fixtures/tiny-decision-destination-app/README.md +0 -6
  261. package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +0 -8
  262. package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +0 -4
  263. package/evals/fixtures/tiny-design-depth-app/README.md +0 -15
  264. package/evals/fixtures/tiny-design-depth-app/src/routes.ts +0 -25
  265. package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +0 -3
  266. package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +0 -3
  267. package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +0 -3
  268. package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +0 -12
  269. package/evals/fixtures/tiny-eval-method-app/README.md +0 -8
  270. package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +0 -5
  271. package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +0 -17
  272. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +0 -11
  273. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +0 -3
  274. package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +0 -10
  275. package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +0 -10
  276. package/evals/fixtures/tiny-execute-plan-app/README.md +0 -5
  277. package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +0 -5
  278. package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +0 -10
  279. package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +0 -11
  280. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +0 -12
  281. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +0 -15
  282. package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +0 -9
  283. package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +0 -9
  284. package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +0 -9
  285. package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +0 -7
  286. package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +0 -1
  287. package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +0 -7
  288. package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +0 -5
  289. package/evals/fixtures/tiny-execute-review-loop-app/README.md +0 -5
  290. package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +0 -9
  291. package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +0 -12
  292. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +0 -15
  293. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +0 -11
  294. package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +0 -9
  295. package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +0 -7
  296. package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +0 -1
  297. package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +0 -7
  298. package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +0 -5
  299. package/evals/fixtures/tiny-flaky-session-app/README.md +0 -10
  300. package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +0 -13
  301. package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +0 -8
  302. package/evals/fixtures/tiny-handoff-app/README.md +0 -5
  303. package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +0 -10
  304. package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +0 -8
  305. package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +0 -11
  306. package/evals/fixtures/tiny-handoff-app/src/billing.ts +0 -7
  307. package/evals/fixtures/tiny-handoff-report-app/README.md +0 -3
  308. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +0 -1
  309. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +0 -1
  310. package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +0 -4
  311. package/evals/fixtures/tiny-plan-app/README.md +0 -5
  312. package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +0 -10
  313. package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +0 -25
  314. package/evals/fixtures/tiny-plan-app/src/billing.ts +0 -17
  315. package/evals/fixtures/tiny-plan-app/src/settings-page.ts +0 -1
  316. package/evals/fixtures/tiny-plan-app/tests/billing.test.md +0 -8
  317. package/evals/fixtures/tiny-plan-app/tests/settings.test.md +0 -5
  318. package/evals/fixtures/tiny-plan-strict-api-app/README.md +0 -3
  319. package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +0 -5
  320. package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +0 -25
  321. package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +0 -5
  322. package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +0 -3
  323. package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +0 -8
  324. package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +0 -3
  325. package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +0 -15
  326. package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +0 -16
  327. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +0 -15
  328. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +0 -10
  329. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +0 -15
  330. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +0 -12
  331. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +0 -20
  332. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +0 -1
  333. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +0 -1
  334. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +0 -8
  335. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +0 -8
  336. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +0 -7
  337. package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +0 -15
  338. package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +0 -16
  339. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +0 -15
  340. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +0 -10
  341. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +0 -15
  342. package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +0 -12
  343. package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +0 -20
  344. package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +0 -1
  345. package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +0 -1
  346. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +0 -8
  347. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +0 -8
  348. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +0 -7
  349. package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +0 -3
  350. package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +0 -15
  351. package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +0 -16
  352. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +0 -15
  353. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +0 -10
  354. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +0 -15
  355. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +0 -12
  356. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +0 -20
  357. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +0 -1
  358. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +0 -1
  359. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +0 -8
  360. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +0 -8
  361. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +0 -7
  362. package/evals/fixtures/tiny-report-performance-app/README.md +0 -11
  363. package/evals/fixtures/tiny-report-performance-app/docs/performance.md +0 -10
  364. package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +0 -29
  365. package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +0 -8
  366. package/evals/fixtures/tiny-review-request-app/README.md +0 -3
  367. package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +0 -5
  368. package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +0 -19
  369. package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +0 -20
  370. package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +0 -25
  371. package/evals/fixtures/tiny-review-request-app/src/billing.ts +0 -11
  372. package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +0 -19
  373. package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +0 -8
  374. package/evals/fixtures/tiny-review-work-app/README.md +0 -5
  375. package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +0 -9
  376. package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +0 -12
  377. package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +0 -15
  378. package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +0 -9
  379. package/evals/fixtures/tiny-review-work-app/src/billing.ts +0 -7
  380. package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +0 -1
  381. package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +0 -7
  382. package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +0 -5
  383. package/evals/fixtures/tiny-saas-app/README.md +0 -16
  384. package/evals/fixtures/tiny-saas-app/docs/auth-review.md +0 -15
  385. package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +0 -10
  386. package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +0 -15
  387. package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +0 -13
  388. package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +0 -12
  389. package/evals/fixtures/tiny-saas-app/src/billing.ts +0 -20
  390. package/evals/fixtures/tiny-saas-app/src/login-copy.ts +0 -1
  391. package/evals/fixtures/tiny-saas-app/src/settings-page.ts +0 -1
  392. package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +0 -8
  393. package/evals/fixtures/tiny-saas-app/tests/billing.test.md +0 -8
  394. package/evals/fixtures/tiny-saas-app/tests/copy.test.md +0 -7
  395. package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +0 -6
  396. package/evals/fixtures/tiny-setup-both-app/AGENTS.md +0 -5
  397. package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +0 -5
  398. package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +0 -6
  399. package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +0 -5
  400. package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +0 -6
  401. package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +0 -6
  402. package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +0 -14
  403. package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +0 -6
  404. package/evals/fixtures/tiny-skill-dev-app/README.md +0 -10
  405. package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +0 -8
  406. package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +0 -17
  407. package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +0 -13
  408. package/evals/fixtures/tiny-team-app/README.md +0 -5
  409. package/evals/fixtures/tiny-team-app/docs/product.md +0 -6
  410. package/evals/fixtures/tiny-team-app/src/teams.ts +0 -9
  411. package/evals/fixtures/tiny-team-app/src/users.ts +0 -5
  412. package/evals/fixtures/tiny-team-app/tests/teams.test.md +0 -7
  413. package/evals/fixtures/tiny-verify-app/README.md +0 -5
  414. package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +0 -1
  415. package/evals/fixtures/tiny-verify-app/src/settings-page.ts +0 -1
  416. package/evals/fixtures/tiny-verify-app/tests/settings.test.md +0 -7
  417. package/evals/prompts/aon-001.txt +0 -2
  418. package/evals/prompts/byp-001.txt +0 -2
  419. package/evals/prompts/byp-002.txt +0 -2
  420. package/evals/prompts/cap-001.txt +0 -3
  421. package/evals/prompts/cap-002.txt +0 -3
  422. package/evals/prompts/cmd-001.txt +0 -3
  423. package/evals/prompts/cmd-002.txt +0 -3
  424. package/evals/prompts/cmd-003.txt +0 -6
  425. package/evals/prompts/cmd-004.txt +0 -5
  426. package/evals/prompts/cmd-005.txt +0 -5
  427. package/evals/prompts/cmd-006.txt +0 -5
  428. package/evals/prompts/cmd-007.txt +0 -5
  429. package/evals/prompts/cmd-008.txt +0 -5
  430. package/evals/prompts/cmd-009.txt +0 -8
  431. package/evals/prompts/cmd-010.txt +0 -5
  432. package/evals/prompts/cmd-011.txt +0 -5
  433. package/evals/prompts/cmd-012.txt +0 -5
  434. package/evals/prompts/cmd-013.txt +0 -5
  435. package/evals/prompts/cmd-014.txt +0 -7
  436. package/evals/prompts/cmd-015.txt +0 -7
  437. package/evals/prompts/cmd-016.txt +0 -5
  438. package/evals/prompts/cmt-001.txt +0 -1
  439. package/evals/prompts/cmt-002.txt +0 -1
  440. package/evals/prompts/cmt-003.txt +0 -1
  441. package/evals/prompts/cmt-004.txt +0 -1
  442. package/evals/prompts/cmt-005.txt +0 -1
  443. package/evals/prompts/dfd-001.txt +0 -3
  444. package/evals/prompts/dia-001.txt +0 -3
  445. package/evals/prompts/dia-002.txt +0 -3
  446. package/evals/prompts/dia-003.txt +0 -3
  447. package/evals/prompts/dis-001.txt +0 -5
  448. package/evals/prompts/dis-002.txt +0 -5
  449. package/evals/prompts/esk-001.txt +0 -5
  450. package/evals/prompts/esk-002.txt +0 -5
  451. package/evals/prompts/esk-003.txt +0 -5
  452. package/evals/prompts/grc-001.txt +0 -3
  453. package/evals/prompts/hof-001.txt +0 -3
  454. package/evals/prompts/hof-002.txt +0 -1
  455. package/evals/prompts/hof-003.txt +0 -1
  456. package/evals/prompts/hof-004.txt +0 -1
  457. package/evals/prompts/hof-005.txt +0 -1
  458. package/evals/prompts/ivg-001.txt +0 -1
  459. package/evals/prompts/ivg-002.txt +0 -11
  460. package/evals/prompts/ivg-003.txt +0 -1
  461. package/evals/prompts/ivg-004.txt +0 -1
  462. package/evals/prompts/mode-001.txt +0 -3
  463. package/evals/prompts/mode-002.txt +0 -1
  464. package/evals/prompts/mode-003.txt +0 -3
  465. package/evals/prompts/mode-004.txt +0 -3
  466. package/evals/prompts/mode-005.txt +0 -3
  467. package/evals/prompts/mode-006.txt +0 -3
  468. package/evals/prompts/mode-007.txt +0 -3
  469. package/evals/prompts/otr-001.txt +0 -3
  470. package/evals/prompts/otr-002.txt +0 -3
  471. package/evals/prompts/rar-001.txt +0 -5
  472. package/evals/prompts/rar-002.txt +0 -3
  473. package/evals/prompts/rar-003.txt +0 -6
  474. package/evals/prompts/rar-004.txt +0 -15
  475. package/evals/prompts/rar-005.txt +0 -10
  476. package/evals/prompts/rbr-001.txt +0 -3
  477. package/evals/prompts/rbr-002.txt +0 -3
  478. package/evals/prompts/rbr-003.txt +0 -7
  479. package/evals/prompts/rev-001.txt +0 -3
  480. package/evals/prompts/rev-002.txt +0 -5
  481. package/evals/prompts/rev-003.txt +0 -6
  482. package/evals/prompts/rev-004.txt +0 -1
  483. package/evals/prompts/rev-005.txt +0 -15
  484. package/evals/prompts/rev-006.txt +0 -5
  485. package/evals/prompts/stp-001.txt +0 -1
  486. package/evals/prompts/stp-002.txt +0 -1
  487. package/evals/prompts/stp-003.txt +0 -1
  488. package/evals/prompts/stp-004.txt +0 -1
  489. package/evals/prompts/stp-005.txt +0 -1
  490. package/evals/prompts/stp-006.txt +0 -1
  491. package/evals/prompts/stp-007.txt +0 -1
  492. package/evals/prompts/stp-008.txt +0 -1
  493. package/evals/prompts/stp-009.txt +0 -1
  494. package/evals/prompts/stp-010.txt +0 -1
  495. package/evals/prompts/stp-011.txt +0 -1
  496. package/evals/prompts/vfy-003.txt +0 -1
  497. package/evals/prompts/wpl-001.txt +0 -3
  498. package/evals/prompts/wpl-002.txt +0 -5
  499. package/evals/prompts/wpl-003.txt +0 -3
  500. package/evals/prompts/wpl-004.txt +0 -5
  501. package/evals/prompts/wpl-005.txt +0 -1
  502. package/evals/prompts/wrc-001.txt +0 -10
  503. package/evals/prompts/wrc-002.txt +0 -3
  504. package/evals/prompts/wsk-001.txt +0 -6
  505. package/evals/prompts/wsp-001.txt +0 -5
  506. package/evals/prompts/wsp-002.txt +0 -15
  507. package/evals/prompts/wsp-003.txt +0 -3
  508. package/evals/prompts/wsp-004.txt +0 -15
  509. package/evals/prompts/wsp-005.txt +0 -5
  510. package/evals/prompts/wsp-006.txt +0 -12
  511. package/evals/prompts/wsp-007.txt +0 -9
  512. package/evals/prompts/wsp-008.txt +0 -13
  513. package/evals/prompts/xpl-001.txt +0 -1
  514. package/evals/prompts/xpl-002.txt +0 -3
  515. package/evals/prompts/xpl-003.txt +0 -3
  516. package/evals/prompts/xpl-004.txt +0 -3
  517. package/evals/prompts/xpl-005.txt +0 -5
  518. package/evals/prompts/xpl-006.txt +0 -3
  519. package/evals/registries/adversarial-evals.json +0 -39
  520. package/evals/registries/fixture-evals.json +0 -2513
  521. package/evals/registries/handoff-evals.json +0 -74
  522. package/evals/registries/legacy-evals.json +0 -147
  523. package/evals/registries/skill-evidence.json +0 -193
  524. package/evals/registries/verify-work-evals.json +0 -46
  525. package/evals/reports/acceptance/v0.1-acceptance-report.md +0 -130
  526. package/evals/reports/by-command-surface/command-surface-1-report.md +0 -45
  527. package/evals/reports/by-command-surface/command-surface-10-report.md +0 -76
  528. package/evals/reports/by-command-surface/command-surface-11-report.md +0 -77
  529. package/evals/reports/by-command-surface/command-surface-12-report.md +0 -91
  530. package/evals/reports/by-command-surface/command-surface-13-report.md +0 -64
  531. package/evals/reports/by-command-surface/command-surface-14-report.md +0 -66
  532. package/evals/reports/by-command-surface/command-surface-15-report.md +0 -124
  533. package/evals/reports/by-command-surface/command-surface-16-report.md +0 -39
  534. package/evals/reports/by-command-surface/command-surface-2-report.md +0 -80
  535. package/evals/reports/by-command-surface/command-surface-3-report.md +0 -86
  536. package/evals/reports/by-command-surface/command-surface-4-report.md +0 -76
  537. package/evals/reports/by-command-surface/command-surface-5-report.md +0 -80
  538. package/evals/reports/by-command-surface/command-surface-6-report.md +0 -74
  539. package/evals/reports/by-command-surface/command-surface-7-report.md +0 -84
  540. package/evals/reports/by-command-surface/command-surface-8-report.md +0 -79
  541. package/evals/reports/by-command-surface/command-surface-9-report.md +0 -79
  542. package/evals/reports/by-command-surface/command-surface-matrix.md +0 -91
  543. package/evals/reports/by-skill/bypass-1-report.md +0 -124
  544. package/evals/reports/by-skill/capture-decisions-1-report.md +0 -99
  545. package/evals/reports/by-skill/capture-decisions-2-report.md +0 -102
  546. package/evals/reports/by-skill/commit-work-1-report.md +0 -165
  547. package/evals/reports/by-skill/commit-work-2-report.md +0 -109
  548. package/evals/reports/by-skill/design-for-depth-1-report.md +0 -95
  549. package/evals/reports/by-skill/diagnose-failure-1-report.md +0 -91
  550. package/evals/reports/by-skill/diagnose-failure-2-report.md +0 -94
  551. package/evals/reports/by-skill/discover-1-report.md +0 -118
  552. package/evals/reports/by-skill/evaluate-skill-2-report.md +0 -71
  553. package/evals/reports/by-skill/execute-plan-1-report.md +0 -103
  554. package/evals/reports/by-skill/execute-plan-2-report.md +0 -112
  555. package/evals/reports/by-skill/execute-plan-3-report.md +0 -87
  556. package/evals/reports/by-skill/grill-context-1-report.md +0 -103
  557. package/evals/reports/by-skill/handoff-1-report.md +0 -123
  558. package/evals/reports/by-skill/handoff-2-report.md +0 -105
  559. package/evals/reports/by-skill/handoff-3-report.md +0 -100
  560. package/evals/reports/by-skill/handoff-7-report.md +0 -77
  561. package/evals/reports/by-skill/interview-gate-1-report.md +0 -63
  562. package/evals/reports/by-skill/interview-gate-2-report.md +0 -105
  563. package/evals/reports/by-skill/mode-contract-1-report.md +0 -74
  564. package/evals/reports/by-skill/mode-contract-2-report.md +0 -87
  565. package/evals/reports/by-skill/mode-contract-3-report.md +0 -65
  566. package/evals/reports/by-skill/mode-contract-4-report.md +0 -71
  567. package/evals/reports/by-skill/mode-contract-5-report.md +0 -70
  568. package/evals/reports/by-skill/output-router-1-report.md +0 -76
  569. package/evals/reports/by-skill/output-router-2-report.md +0 -65
  570. package/evals/reports/by-skill/research-1-report.md +0 -144
  571. package/evals/reports/by-skill/research-brief-1-report.md +0 -94
  572. package/evals/reports/by-skill/research-brief-2-report.md +0 -75
  573. package/evals/reports/by-skill/review-artifact-1-report.md +0 -91
  574. package/evals/reports/by-skill/review-artifact-2-report.md +0 -79
  575. package/evals/reports/by-skill/review-artifact-3-report.md +0 -120
  576. package/evals/reports/by-skill/review-artifact-4-report.md +0 -89
  577. package/evals/reports/by-skill/review-artifact-5-report.md +0 -66
  578. package/evals/reports/by-skill/review-work-1-report.md +0 -85
  579. package/evals/reports/by-skill/review-work-2-report.md +0 -87
  580. package/evals/reports/by-skill/review-work-3-report.md +0 -104
  581. package/evals/reports/by-skill/review-work-4-report.md +0 -108
  582. package/evals/reports/by-skill/review-work-5-report.md +0 -73
  583. package/evals/reports/by-skill/review-work-6-report.md +0 -66
  584. package/evals/reports/by-skill/setup-freeflow-1-report.md +0 -199
  585. package/evals/reports/by-skill/setup-freeflow-2-report.md +0 -105
  586. package/evals/reports/by-skill/setup-freeflow-3-report.md +0 -105
  587. package/evals/reports/by-skill/setup-freeflow-4-report.md +0 -88
  588. package/evals/reports/by-skill/setup-freeflow-5-report.md +0 -115
  589. package/evals/reports/by-skill/skill-authoring-1-report.md +0 -81
  590. package/evals/reports/by-skill/verify-work-1-report.md +0 -111
  591. package/evals/reports/by-skill/verify-work-2-report.md +0 -120
  592. package/evals/reports/by-skill/workflow-1-report.md +0 -65
  593. package/evals/reports/by-skill/write-plan-1-report.md +0 -123
  594. package/evals/reports/by-skill/write-plan-2-report.md +0 -98
  595. package/evals/reports/by-skill/write-plan-3-report.md +0 -110
  596. package/evals/reports/by-skill/write-spec-1-report.md +0 -88
  597. package/evals/reports/by-skill/write-spec-2-report.md +0 -89
  598. package/evals/reports/by-skill/write-spec-3-report.md +0 -90
  599. package/evals/reports/by-skill/write-spec-4-report.md +0 -167
  600. package/evals/reports/harness/claude-harness-1-report.md +0 -103
  601. package/evals/reports/harness/eval-harness-1-report.md +0 -91
  602. package/evals/reports/iterations/iteration-1-report.md +0 -71
  603. package/evals/reports/iterations/iteration-2-report.md +0 -78
  604. package/evals/reports/iterations/iteration-3-report.md +0 -118
  605. package/evals/reports/iterations/iteration-4-report.md +0 -131
  606. package/evals/reports/iterations/iteration-5-report.md +0 -149
  607. package/evals/reports/iterations/iteration-6-report.md +0 -136
  608. package/evals/reports/runtime/always-on-runtime-1-report.md +0 -107
  609. package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +0 -52
  610. package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +0 -410
  611. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +0 -203
  612. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +0 -51
  613. package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +0 -99
  614. package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +0 -166
  615. package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +0 -96
  616. package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +0 -151
  617. package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +0 -233
  618. package/evals/reports/runtime/jq-script-derive-execution-1-report.md +0 -215
  619. package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +0 -67
  620. package/evals/reports/runtime/output-router-benchmark-1-report.md +0 -81
  621. package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +0 -35
  622. package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +0 -150
  623. package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +0 -46
  624. package/evals/reports/runtime/output-router-command-benchmark-1-report.md +0 -62
  625. package/evals/reports/runtime/output-router-index-benchmark-1-report.md +0 -64
  626. package/evals/reports/runtime/output-router-regression-1-report.md +0 -81
  627. package/evals/reports/runtime/output-router-transform-eval-1-report.md +0 -28
  628. package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +0 -44
  629. package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +0 -159
  630. package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +0 -55
  631. package/evals/reports/runtime/render-format-row-protocol-1-report.md +0 -58
  632. package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +0 -84
  633. package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +0 -51
  634. package/evals/reports/runtime/storage-policy-benchmark-1-report.md +0 -176
  635. package/evals/reports/runtime/vault-index-storage-spike-1-report.md +0 -39
  636. package/evals/reports/runtime/workflow-context-hook-1-report.md +0 -82
  637. package/evals/runbooks/adversarial-eval-runbook.md +0 -28
  638. package/evals/runbooks/fixture-eval-runbook.md +0 -137
  639. package/evals/runbooks/handoff-eval-runbook.md +0 -22
  640. package/evals/runbooks/verify-work-eval-runbook.md +0 -27
  641. package/evals/scripts/audit-command-surface.sh +0 -160
  642. package/evals/scripts/check-activation-contract.sh +0 -121
  643. package/evals/scripts/check-runtime-context-hook.sh +0 -183
  644. package/evals/scripts/grade-fixture-eval.sh +0 -446
  645. package/evals/scripts/run-claude-fixture-eval.sh +0 -26
  646. package/evals/scripts/run-codex-fixture-eval.sh +0 -26
  647. package/evals/scripts/run-eryx-python-proof-spike.js +0 -559
  648. package/evals/scripts/run-fixture-eval-by-id.sh +0 -23
  649. package/evals/scripts/run-fixture-eval.sh +0 -464
  650. package/evals/scripts/run-jq-wasm-proof-spike.js +0 -299
  651. package/evals/scripts/run-output-router-transform-eval.js +0 -115
  652. package/evals/scripts/run-pi-observed-routing-eval.js +0 -478
  653. package/evals/scripts/run-quickjs-wasi-proof-spike.js +0 -339
  654. package/evals/scripts/skill-evidence.sh +0 -316
  655. package/evals/scripts/validate-release-metadata.sh +0 -486
  656. package/evals/suites/v0.1-acceptance-suite.md +0 -131
  657. package/pi-extension/dist/host-producer-identification.js +0 -186
  658. package/pi-extension/dist/mcp-config.js +0 -30
  659. package/pi-extension/dist/native-safety-net.js +0 -209
  660. package/pi-extension/dist/observed-tool-routing.js +0 -114
  661. package/pi-extension/dist/renderers.js +0 -835
  662. package/pi-extension/dist/router-tools.js +0 -438
  663. package/pi-extension/dist/runtime-context.js +0 -288
  664. package/pi-extension/dist/schemas.js +0 -254
  665. package/pi-extension/dist/status.js +0 -449
  666. package/pi-extension/dist/utils.js +0 -467
  667. package/pi-extension/src/runtime-context.ts +0 -347
  668. package/pi-extension/src/status.ts +0 -505
  669. package/plugin-docs/README.md +0 -40
  670. package/plugin-docs/adr/0001-three-modes.md +0 -27
  671. package/plugin-docs/adr/0002-evals-before-hooks.md +0 -17
  672. package/plugin-docs/adr/0003-release-boundary.md +0 -21
  673. package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +0 -26
  674. package/plugin-docs/adr/README.md +0 -10
  675. package/plugin-docs/architecture.md +0 -89
  676. package/plugin-docs/output-router.md +0 -396
  677. package/plugin-docs/release-evidence.md +0 -77
  678. package/plugin-docs/skills.md +0 -44
  679. package/plugin-docs/workflow.md +0 -57
  680. package/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
  681. package/skills/discover/ARTIFACT-DESTINATIONS.md +0 -58
  682. package/skills/discover/CHECKPOINTS.md +0 -74
  683. package/skills/discover/SKILL.md +0 -173
  684. package/skills/evaluate-skill/references/eval-patterns.md +0 -41
  685. package/skills/evaluate-skill/references/grading-priority.md +0 -33
  686. package/skills/execute-plan/SKILL.md +0 -133
  687. package/skills/execute-plan/references/execution-map.md +0 -122
  688. package/skills/interview-gate/SKILL.md +0 -90
  689. package/skills/workflow/references/workflow-map.md +0 -104
  690. /package/pi-extension/src/{mcp-config.ts → integrations/mcp-config.ts} +0 -0
@@ -10,500 +10,577 @@ const MAX_BATCH_QUERY_LENGTH = 500;
10
10
  const MAX_QUERY_MATCHES = 3;
11
11
  const QUERY_MATCH_EXCERPT_MAX_BYTES = 1_500;
12
12
  export async function freeflowBatch(options, runner) {
13
- const validation = validateBatchInput(options);
14
- if (!validation.ok) {
15
- return batchValidationFailure(options.preserve ?? "important", validation.issues);
16
- }
17
- const startedAt = Date.now();
18
- const steps = await mapWithConcurrency(validation.value.steps, validation.value.concurrency, (step, index) => executeBatchStep({
19
- step,
20
- index,
21
- options: validation.value,
22
- runner,
23
- }));
24
- const failedCount = steps.filter((step) => step.status === "failed").length;
25
- const okCount = steps.length - failedCount;
26
- const queryAnswers = await answerBatchQueries(validation.value, steps);
27
- const routingStatus = failedCount === 0 ? "routed" : okCount === 0 ? "failed" : "partial";
28
- const durationMs = Date.now() - startedAt;
29
- const queryReason = queryAnswers.length > 0 ? ` Aggregated ${queryAnswers.filter((answer) => answer.status === "answered").length}/${queryAnswers.length} query answer(s) from child evidence handles.` : "";
30
- return {
31
- toolStatus: failedCount === 0 ? "ok" : "error",
32
- decisionId: decisionId("batch", validation.value.sessionId, String(steps.length), String(failedCount), stepDecisionSeed(steps), queryDecisionSeed(queryAnswers)),
33
- preserve: validation.value.preserve,
34
- producer: { kind: "other", name: "batch" },
35
- persistence: { status: "not_persisted", recoverability: "none" },
36
- routing: {
37
- status: routingStatus,
38
- route: "batch",
39
- reason: failedCount === 0
40
- ? `Ran ${steps.length} independent Freeflow-owned step(s) with concurrency=${validation.value.concurrency}; child results are available in details.result.steps.${queryReason}`
41
- : `Ran ${steps.length} independent Freeflow-owned step(s) with concurrency=${validation.value.concurrency}; ${failedCount} step(s) failed and ${okCount} step(s) completed. Child results are available in details.result.steps.${queryReason}`,
42
- },
43
- summary: renderBatchSummary({ okCount, stepCount: steps.length, durationMs, concurrency: validation.value.concurrency, queryAnswers }),
44
- concurrency: validation.value.concurrency,
45
- stepCount: steps.length,
46
- okCount,
47
- failedCount,
48
- steps,
49
- ...(queryAnswers.length > 0 ? { queries: queryAnswers } : {}),
50
- recovery: {
51
- how: "Inspect details.result.steps for each child result. Child run outputs remain recoverable by their own outputId; child search results keep exact path/outputId and line-range recovery hints. Query answers cite matching child evidence handles when present.",
52
- },
53
- };
13
+ const validation = validateBatchInput(options);
14
+ if (!validation.ok) {
15
+ return batchValidationFailure(options.preserve ?? "important", validation.issues);
16
+ }
17
+ const startedAt = Date.now();
18
+ const steps = await mapWithConcurrency(validation.value.steps, validation.value.concurrency, (step, index) =>
19
+ executeBatchStep({
20
+ step,
21
+ index,
22
+ options: validation.value,
23
+ runner,
24
+ }),
25
+ );
26
+ const failedCount = steps.filter((step) => step.status === "failed").length;
27
+ const okCount = steps.length - failedCount;
28
+ const queryAnswers = await answerBatchQueries(validation.value, steps);
29
+ const routingStatus = failedCount === 0 ? "routed" : okCount === 0 ? "failed" : "partial";
30
+ const durationMs = Date.now() - startedAt;
31
+ const queryReason =
32
+ queryAnswers.length > 0
33
+ ? ` Aggregated ${queryAnswers.filter((answer) => answer.status === "answered").length}/${queryAnswers.length} query answer(s) from child evidence handles.`
34
+ : "";
35
+ return {
36
+ toolStatus: failedCount === 0 ? "ok" : "error",
37
+ decisionId: decisionId(
38
+ "batch",
39
+ validation.value.sessionId,
40
+ String(steps.length),
41
+ String(failedCount),
42
+ stepDecisionSeed(steps),
43
+ queryDecisionSeed(queryAnswers),
44
+ ),
45
+ preserve: validation.value.preserve,
46
+ producer: { kind: "other", name: "batch" },
47
+ persistence: { status: "not_persisted", recoverability: "none" },
48
+ routing: {
49
+ status: routingStatus,
50
+ route: "batch",
51
+ reason:
52
+ failedCount === 0
53
+ ? `Ran ${steps.length} independent Freeflow-owned step(s) with concurrency=${validation.value.concurrency}; child results are available in details.result.steps.${queryReason}`
54
+ : `Ran ${steps.length} independent Freeflow-owned step(s) with concurrency=${validation.value.concurrency}; ${failedCount} step(s) failed and ${okCount} step(s) completed. Child results are available in details.result.steps.${queryReason}`,
55
+ },
56
+ summary: renderBatchSummary({
57
+ okCount,
58
+ stepCount: steps.length,
59
+ durationMs,
60
+ concurrency: validation.value.concurrency,
61
+ queryAnswers,
62
+ }),
63
+ concurrency: validation.value.concurrency,
64
+ stepCount: steps.length,
65
+ okCount,
66
+ failedCount,
67
+ steps,
68
+ ...(queryAnswers.length > 0 ? { queries: queryAnswers } : {}),
69
+ recovery: {
70
+ how: "Inspect details.result.steps for each child result. Child run outputs remain recoverable by their own outputId; child search results keep exact path/outputId and line-range recovery hints. Query answers cite matching child evidence handles when present.",
71
+ },
72
+ };
54
73
  }
55
74
  function validateBatchInput(value) {
56
- const issues = [];
57
- if (!isRecord(value)) {
58
- return { ok: false, issues: [{ path: "$", message: "Expected batch input object." }] };
59
- }
60
- if (typeof value.sessionId !== "string" || value.sessionId.length === 0) {
61
- issues.push({ path: "$.sessionId", message: "Expected non-empty sessionId." });
62
- }
63
- if (!Array.isArray(value.steps) || value.steps.length === 0) {
64
- issues.push({ path: "$.steps", message: "Expected at least one batch step." });
65
- }
66
- else if (value.steps.length > MAX_BATCH_STEPS) {
67
- issues.push({ path: "$.steps", message: `Expected at most ${MAX_BATCH_STEPS} batch steps.` });
68
- }
69
- const concurrency = normalizeConcurrency(value.concurrency);
70
- if (!concurrency.ok) {
71
- issues.push({ path: "$.concurrency", message: concurrency.message });
72
- }
73
- if (value.preserve !== undefined && value.preserve !== "summary" && value.preserve !== "important" && value.preserve !== "full") {
74
- issues.push({ path: "$.preserve", message: "Expected preserve mode summary, important, or full." });
75
- }
76
- const normalizedQueries = normalizeBatchQueries(value.queries, issues);
77
- const normalizedSteps = [];
78
- if (Array.isArray(value.steps)) {
79
- value.steps.forEach((step, index) => {
80
- if (!isRecord(step)) {
81
- issues.push({ path: `$.steps[${index}]`, message: "Expected batch step object." });
82
- return;
83
- }
84
- if (typeof step.kind !== "string" || !BATCH_STEP_KINDS.has(step.kind)) {
85
- issues.push({ path: `$.steps[${index}].kind`, message: "Expected step kind run or search." });
86
- }
87
- if (step.id !== undefined && (typeof step.id !== "string" || step.id.length === 0)) {
88
- issues.push({ path: `$.steps[${index}].id`, message: "Expected non-empty string id when present." });
89
- }
90
- if (!isRecord(step.input)) {
91
- issues.push({ path: `$.steps[${index}].input`, message: "Expected step input object." });
92
- }
93
- if (typeof step.kind === "string" && BATCH_STEP_KINDS.has(step.kind) && isRecord(step.input)) {
94
- normalizedSteps.push({
95
- id: typeof step.id === "string" && step.id.length > 0 ? step.id : `${step.kind}-${index + 1}`,
96
- kind: step.kind,
97
- input: step.input,
98
- });
99
- }
75
+ const issues = [];
76
+ if (!isRecord(value)) {
77
+ return { ok: false, issues: [{ path: "$", message: "Expected batch input object." }] };
78
+ }
79
+ if (typeof value.sessionId !== "string" || value.sessionId.length === 0) {
80
+ issues.push({ path: "$.sessionId", message: "Expected non-empty sessionId." });
81
+ }
82
+ if (!Array.isArray(value.steps) || value.steps.length === 0) {
83
+ issues.push({ path: "$.steps", message: "Expected at least one batch step." });
84
+ } else if (value.steps.length > MAX_BATCH_STEPS) {
85
+ issues.push({ path: "$.steps", message: `Expected at most ${MAX_BATCH_STEPS} batch steps.` });
86
+ }
87
+ const concurrency = normalizeConcurrency(value.concurrency);
88
+ if (!concurrency.ok) {
89
+ issues.push({ path: "$.concurrency", message: concurrency.message });
90
+ }
91
+ if (
92
+ value.preserve !== undefined &&
93
+ value.preserve !== "summary" &&
94
+ value.preserve !== "important" &&
95
+ value.preserve !== "full"
96
+ ) {
97
+ issues.push({ path: "$.preserve", message: "Expected preserve mode summary, important, or full." });
98
+ }
99
+ const normalizedQueries = normalizeBatchQueries(value.queries, issues);
100
+ const normalizedSteps = [];
101
+ if (Array.isArray(value.steps)) {
102
+ value.steps.forEach((step, index) => {
103
+ if (!isRecord(step)) {
104
+ issues.push({ path: `$.steps[${index}]`, message: "Expected batch step object." });
105
+ return;
106
+ }
107
+ if (typeof step.kind !== "string" || !BATCH_STEP_KINDS.has(step.kind)) {
108
+ issues.push({ path: `$.steps[${index}].kind`, message: "Expected step kind run or search." });
109
+ }
110
+ if (step.id !== undefined && (typeof step.id !== "string" || step.id.length === 0)) {
111
+ issues.push({ path: `$.steps[${index}].id`, message: "Expected non-empty string id when present." });
112
+ }
113
+ if (!isRecord(step.input)) {
114
+ issues.push({ path: `$.steps[${index}].input`, message: "Expected step input object." });
115
+ }
116
+ if (typeof step.kind === "string" && BATCH_STEP_KINDS.has(step.kind) && isRecord(step.input)) {
117
+ normalizedSteps.push({
118
+ id: typeof step.id === "string" && step.id.length > 0 ? step.id : `${step.kind}-${index + 1}`,
119
+ kind: step.kind,
120
+ input: step.input,
100
121
  });
101
- }
102
- if (issues.length > 0 || !concurrency.ok) {
103
- return { ok: false, issues };
104
- }
105
- const normalized = {
106
- ...value,
107
- steps: normalizedSteps,
108
- concurrency: concurrency.value,
109
- preserve: value.preserve ?? "important",
110
- queries: normalizedQueries,
111
- };
112
- return { ok: true, value: normalized };
122
+ }
123
+ });
124
+ }
125
+ if (issues.length > 0 || !concurrency.ok) {
126
+ return { ok: false, issues };
127
+ }
128
+ const normalized = {
129
+ ...value,
130
+ steps: normalizedSteps,
131
+ concurrency: concurrency.value,
132
+ preserve: value.preserve ?? "important",
133
+ queries: normalizedQueries,
134
+ };
135
+ return { ok: true, value: normalized };
113
136
  }
114
137
  function normalizeConcurrency(value) {
115
- if (value === undefined) {
116
- return { ok: true, value: DEFAULT_BATCH_CONCURRENCY };
117
- }
118
- if (!Number.isInteger(value) || value < 1 || value > MAX_BATCH_CONCURRENCY) {
119
- return { ok: false, message: `Expected integer concurrency from 1 to ${MAX_BATCH_CONCURRENCY}.` };
120
- }
121
- return { ok: true, value };
138
+ if (value === undefined) {
139
+ return { ok: true, value: DEFAULT_BATCH_CONCURRENCY };
140
+ }
141
+ if (!Number.isInteger(value) || value < 1 || value > MAX_BATCH_CONCURRENCY) {
142
+ return { ok: false, message: `Expected integer concurrency from 1 to ${MAX_BATCH_CONCURRENCY}.` };
143
+ }
144
+ return { ok: true, value };
122
145
  }
123
146
  function normalizeBatchQueries(value, issues) {
124
- if (value === undefined) {
125
- return [];
126
- }
127
- if (!Array.isArray(value)) {
128
- issues.push({ path: "$.queries", message: "Expected queries to be an array of strings when present." });
129
- return [];
130
- }
131
- if (value.length > MAX_BATCH_QUERIES) {
132
- issues.push({ path: "$.queries", message: `Expected at most ${MAX_BATCH_QUERIES} queries.` });
133
- }
134
- const normalized = [];
135
- value.forEach((query, index) => {
136
- if (typeof query !== "string" || query.trim().length === 0) {
137
- issues.push({ path: `$.queries[${index}]`, message: "Expected non-empty query string." });
138
- return;
139
- }
140
- if (query.length > MAX_BATCH_QUERY_LENGTH) {
141
- issues.push({ path: `$.queries[${index}]`, message: `Expected query length at most ${MAX_BATCH_QUERY_LENGTH} characters.` });
142
- return;
143
- }
144
- normalized.push(query.trim());
145
- });
146
- return normalized;
147
+ if (value === undefined) {
148
+ return [];
149
+ }
150
+ if (!Array.isArray(value)) {
151
+ issues.push({ path: "$.queries", message: "Expected queries to be an array of strings when present." });
152
+ return [];
153
+ }
154
+ if (value.length > MAX_BATCH_QUERIES) {
155
+ issues.push({ path: "$.queries", message: `Expected at most ${MAX_BATCH_QUERIES} queries.` });
156
+ }
157
+ const normalized = [];
158
+ value.forEach((query, index) => {
159
+ if (typeof query !== "string" || query.trim().length === 0) {
160
+ issues.push({ path: `$.queries[${index}]`, message: "Expected non-empty query string." });
161
+ return;
162
+ }
163
+ if (query.length > MAX_BATCH_QUERY_LENGTH) {
164
+ issues.push({
165
+ path: `$.queries[${index}]`,
166
+ message: `Expected query length at most ${MAX_BATCH_QUERY_LENGTH} characters.`,
167
+ });
168
+ return;
169
+ }
170
+ normalized.push(query.trim());
171
+ });
172
+ return normalized;
147
173
  }
148
174
  async function executeBatchStep(options) {
149
- const startedAt = Date.now();
150
- try {
151
- const result = await executeStepResult(options.step, options.options, options.runner);
152
- return {
153
- id: options.step.id,
154
- index: options.index,
155
- kind: options.step.kind,
156
- status: isFailedChildResult(result, options.step.kind) ? "failed" : "ok",
157
- toolStatus: result.toolStatus,
158
- durationMs: Date.now() - startedAt,
159
- result,
160
- };
161
- }
162
- catch (error) {
163
- return {
164
- id: options.step.id,
165
- index: options.index,
166
- kind: options.step.kind,
167
- status: "failed",
168
- durationMs: Date.now() - startedAt,
169
- error: errorMessage(error),
170
- };
171
- }
175
+ const startedAt = Date.now();
176
+ try {
177
+ const result = await executeStepResult(options.step, options.index, options.options, options.runner);
178
+ return {
179
+ id: options.step.id,
180
+ index: options.index,
181
+ kind: options.step.kind,
182
+ status: isFailedChildResult(result, options.step.kind) ? "failed" : "ok",
183
+ toolStatus: result.toolStatus,
184
+ durationMs: Date.now() - startedAt,
185
+ result,
186
+ };
187
+ } catch (error) {
188
+ return {
189
+ id: options.step.id,
190
+ index: options.index,
191
+ kind: options.step.kind,
192
+ status: "failed",
193
+ durationMs: Date.now() - startedAt,
194
+ error: errorMessage(error),
195
+ };
196
+ }
172
197
  }
173
- async function executeStepResult(step, options, runner) {
174
- if (step.kind === "run") {
175
- return freeflowRun({
176
- ...step.input,
177
- preserve: step.input.preserve ?? options.preserve,
178
- sessionId: options.sessionId,
179
- ...(options.vaultRoot !== undefined ? { vaultRoot: options.vaultRoot } : {}),
180
- ...(options.vaultRetention !== undefined ? { vaultRetention: options.vaultRetention } : {}),
181
- ...(options.thresholds !== undefined ? { thresholds: options.thresholds } : {}),
182
- ...(options.scriptTransform !== undefined ? { scriptTransform: options.scriptTransform } : {}),
183
- ...(options.scriptSandboxAdapters !== undefined ? { scriptSandboxAdapters: options.scriptSandboxAdapters } : {}),
184
- ...(options.storagePolicy !== undefined ? { storagePolicy: options.storagePolicy } : {}),
185
- }, runner);
186
- }
187
- return freeflowSearch({
198
+ async function executeStepResult(step, index, options, runner) {
199
+ if (step.kind === "run") {
200
+ return freeflowRun(
201
+ {
188
202
  ...step.input,
189
203
  preserve: step.input.preserve ?? options.preserve,
190
- });
204
+ sessionId: options.sessionId,
205
+ ...(options.vaultRoot !== undefined ? { vaultRoot: options.vaultRoot } : {}),
206
+ ...(options.vaultRetention !== undefined ? { vaultRetention: options.vaultRetention } : {}),
207
+ ...(options.thresholds !== undefined ? { thresholds: options.thresholds } : {}),
208
+ ...(options.scriptTransform !== undefined ? { scriptTransform: options.scriptTransform } : {}),
209
+ ...(options.scriptSandboxAdapters !== undefined
210
+ ? { scriptSandboxAdapters: options.scriptSandboxAdapters }
211
+ : {}),
212
+ ...(options.storagePolicy !== undefined ? { storagePolicy: options.storagePolicy } : {}),
213
+ },
214
+ runner,
215
+ );
216
+ }
217
+ return freeflowSearch({
218
+ ...step.input,
219
+ preserve: step.input.preserve ?? options.preserve,
220
+ });
191
221
  }
192
222
  function isFailedChildResult(result, kind) {
193
- if (result.toolStatus === "error" || result.routing?.status === "failed") {
194
- return true;
195
- }
196
- if (kind === "run" && "execution" in result && result.execution?.status !== "success") {
197
- return true;
198
- }
199
- return false;
223
+ if (result.toolStatus === "error" || result.routing?.status === "failed") {
224
+ return true;
225
+ }
226
+ if (kind === "run" && "execution" in result && result.execution?.status !== "success") {
227
+ return true;
228
+ }
229
+ return false;
200
230
  }
201
231
  async function answerBatchQueries(options, steps) {
202
- if (options.queries.length === 0) {
203
- return [];
204
- }
205
- const answers = [];
206
- for (const query of options.queries) {
207
- const matches = await collectBatchQueryMatches(options, steps, query);
208
- const selected = matches.sort((a, b) => b.score - a.score).slice(0, MAX_QUERY_MATCHES);
209
- answers.push({
210
- query,
211
- status: selected.length > 0 ? "answered" : "no_match",
212
- summary: renderBatchQueryAnswer(query, selected),
213
- matches: selected,
214
- });
215
- }
216
- return answers;
232
+ if (options.queries.length === 0) {
233
+ return [];
234
+ }
235
+ const answers = [];
236
+ for (const query of options.queries) {
237
+ const matches = await collectBatchQueryMatches(options, steps, query);
238
+ const selected = matches.sort((a, b) => b.score - a.score).slice(0, MAX_QUERY_MATCHES);
239
+ answers.push({
240
+ query,
241
+ status: selected.length > 0 ? "answered" : "no_match",
242
+ summary: renderBatchQueryAnswer(query, selected),
243
+ matches: selected,
244
+ });
245
+ }
246
+ return answers;
217
247
  }
218
248
  async function collectBatchQueryMatches(options, steps, query) {
219
- const matches = [];
220
- const seenVaultQueries = new Set();
221
- const tokens = tokenizeQuery(query);
222
- for (const step of steps) {
223
- const result = step.result;
224
- if (!result) {
225
- continue;
226
- }
227
- collectStructuredQueryMatches(matches, step, result, query, tokens);
228
- const refs = vaultQueryRefsForResult(result);
229
- if (!options.vaultRoot) {
230
- continue;
231
- }
232
- for (const ref of refs) {
233
- const key = `${ref.outputId}:${ref.stream}`;
234
- if (seenVaultQueries.has(`${query}:${key}`)) {
235
- continue;
236
- }
237
- seenVaultQueries.add(`${query}:${key}`);
238
- const routed = await freeflowSearch({
239
- action: "query",
240
- source: { kind: "vault", root: options.vaultRoot, sessionId: options.sessionId, outputId: ref.outputId, stream: ref.stream },
241
- query,
242
- topK: 1,
243
- preserve: "summary",
244
- });
245
- for (const packet of routed.evidence ?? []) {
246
- addEvidenceQueryMatch(matches, step, packet, query, tokens, `vault ${ref.outputId}:${ref.stream}`);
247
- }
248
- }
249
+ const matches = [];
250
+ const seenVaultQueries = new Set();
251
+ const tokens = tokenizeQuery(query);
252
+ for (const step of steps) {
253
+ const result = step.result;
254
+ if (!result) {
255
+ continue;
256
+ }
257
+ collectStructuredQueryMatches(matches, step, result, query, tokens);
258
+ const refs = vaultQueryRefsForResult(result);
259
+ if (!options.vaultRoot) {
260
+ continue;
261
+ }
262
+ for (const ref of refs) {
263
+ const key = `${ref.outputId}:${ref.stream}`;
264
+ if (seenVaultQueries.has(`${query}:${key}`)) {
265
+ continue;
266
+ }
267
+ seenVaultQueries.add(`${query}:${key}`);
268
+ const routed = await freeflowSearch({
269
+ action: "query",
270
+ source: {
271
+ kind: "vault",
272
+ root: options.vaultRoot,
273
+ sessionId: options.sessionId,
274
+ outputId: ref.outputId,
275
+ stream: ref.stream,
276
+ },
277
+ query,
278
+ topK: 1,
279
+ preserve: "summary",
280
+ });
281
+ for (const packet of routed.evidence ?? []) {
282
+ addEvidenceQueryMatch(matches, step, packet, query, tokens, `vault ${ref.outputId}:${ref.stream}`);
283
+ }
249
284
  }
250
- return dedupeQueryMatches(matches);
285
+ }
286
+ return dedupeQueryMatches(matches);
251
287
  }
252
288
  function collectStructuredQueryMatches(matches, step, result, query, tokens) {
253
- for (const packet of result.evidence ?? []) {
254
- addEvidenceQueryMatch(matches, step, packet, query, tokens, "child evidence");
255
- }
256
- if (isCommandLikeResult(result) && Array.isArray(result.importantLines)) {
257
- for (const line of result.importantLines) {
258
- addImportantLineQueryMatch(matches, step, result.outputId, line, query, tokens);
259
- }
289
+ for (const packet of result.evidence ?? []) {
290
+ addEvidenceQueryMatch(matches, step, packet, query, tokens, "child evidence");
291
+ }
292
+ if (isCommandLikeResult(result) && Array.isArray(result.importantLines)) {
293
+ for (const line of result.importantLines) {
294
+ addImportantLineQueryMatch(matches, step, result.outputId, line, query, tokens);
260
295
  }
296
+ }
261
297
  }
262
298
  function addEvidenceQueryMatch(matches, step, packet, query, tokens, sourceLabel) {
263
- const score = scoreQueryText(packet.excerpt, query, tokens);
264
- if (score <= 0) {
265
- return;
266
- }
267
- matches.push({
268
- stepId: step.id,
269
- stepIndex: step.index,
270
- stepKind: step.kind,
271
- source: packet.source,
272
- excerpt: selectQueryExcerpt(packet.excerpt, tokens),
273
- why: `Matched ${sourceLabel}${packet.lines ? ` lines ${packet.lines}` : ""}.`,
274
- score,
275
- ...(packet.source.kind === "vault" ? { outputId: packet.source.outputId } : {}),
276
- ...(packet.id ? { evidenceId: packet.id } : {}),
277
- ...(packet.lines ? { lines: packet.lines } : {}),
278
- });
299
+ const score = scoreQueryText(packet.excerpt, query, tokens);
300
+ if (score <= 0) {
301
+ return;
302
+ }
303
+ matches.push({
304
+ stepId: step.id,
305
+ stepIndex: step.index,
306
+ stepKind: step.kind,
307
+ source: packet.source,
308
+ excerpt: selectQueryExcerpt(packet.excerpt, tokens),
309
+ why: `Matched ${sourceLabel}${packet.lines ? ` lines ${packet.lines}` : ""}.`,
310
+ score,
311
+ ...(packet.source.kind === "vault" ? { outputId: packet.source.outputId } : {}),
312
+ ...(packet.id ? { evidenceId: packet.id } : {}),
313
+ ...(packet.lines ? { lines: packet.lines } : {}),
314
+ });
279
315
  }
280
316
  function addImportantLineQueryMatch(matches, step, outputId, line, query, tokens) {
281
- const score = scoreQueryText(line.excerpt, query, tokens);
282
- if (score <= 0) {
283
- return;
284
- }
285
- matches.push({
286
- stepId: step.id,
287
- stepIndex: step.index,
288
- stepKind: step.kind,
289
- source: { kind: "vault", outputId, stream: line.stream },
290
- excerpt: selectQueryExcerpt(line.excerpt, tokens),
291
- why: `Matched selected child command evidence lines ${line.lines}.`,
292
- score,
293
- outputId,
294
- lines: line.lines,
295
- });
317
+ const score = scoreQueryText(line.excerpt, query, tokens);
318
+ if (score <= 0) {
319
+ return;
320
+ }
321
+ matches.push({
322
+ stepId: step.id,
323
+ stepIndex: step.index,
324
+ stepKind: step.kind,
325
+ source: { kind: "vault", outputId, stream: line.stream },
326
+ excerpt: selectQueryExcerpt(line.excerpt, tokens),
327
+ why: `Matched selected child command evidence lines ${line.lines}.`,
328
+ score,
329
+ outputId,
330
+ lines: line.lines,
331
+ });
296
332
  }
297
333
  function vaultQueryRefsForResult(result) {
298
- const refs = [];
299
- if (isCommandLikeResult(result)) {
300
- if (result.persistence?.recoverability === "exact") {
301
- refs.push({ outputId: result.outputId, stream: "combined" });
302
- }
303
- if (result.recovery?.outputId && result.recovery.outputId !== result.outputId) {
304
- refs.push({ outputId: result.recovery.outputId, stream: "combined" });
305
- }
306
- if (result.reducer?.outputId) {
307
- refs.push({ outputId: result.reducer.outputId, stream: "raw" });
308
- }
309
- if (result.scriptFilter?.outputId) {
310
- refs.push({ outputId: result.scriptFilter.outputId, stream: "raw" });
311
- }
312
- return refs;
334
+ const refs = [];
335
+ if (isCommandLikeResult(result)) {
336
+ if (result.persistence?.recoverability === "exact") {
337
+ refs.push({ outputId: result.outputId, stream: "combined" });
313
338
  }
314
- if (hasOutputId(result)) {
315
- refs.push({ outputId: result.outputId, stream: "raw" });
339
+ if (result.recovery?.outputId && result.recovery.outputId !== result.outputId) {
340
+ refs.push({ outputId: result.recovery.outputId, stream: "combined" });
316
341
  }
317
- const recoveryOutputId = recoveryOutputIdFor(result.recovery);
318
- if (recoveryOutputId && !refs.some((ref) => ref.outputId === recoveryOutputId)) {
319
- refs.push({ outputId: recoveryOutputId, stream: "raw" });
342
+ if (result.reducer?.outputId) {
343
+ refs.push({ outputId: result.reducer.outputId, stream: "raw" });
344
+ }
345
+ if (result.scriptFilter?.outputId) {
346
+ refs.push({ outputId: result.scriptFilter.outputId, stream: "raw" });
320
347
  }
321
348
  return refs;
349
+ }
350
+ if (hasOutputId(result)) {
351
+ refs.push({ outputId: result.outputId, stream: "raw" });
352
+ }
353
+ const recoveryOutputId = recoveryOutputIdFor(result.recovery);
354
+ if (recoveryOutputId && !refs.some((ref) => ref.outputId === recoveryOutputId)) {
355
+ refs.push({ outputId: recoveryOutputId, stream: "raw" });
356
+ }
357
+ return refs;
322
358
  }
323
359
  function renderBatchSummary(options) {
324
- const lines = [`Batch completed ${options.okCount}/${options.stepCount} step(s) successfully in ${options.durationMs}ms with concurrency=${options.concurrency}.`];
325
- if (options.queryAnswers.length > 0) {
326
- lines.push(renderBatchQueryAnswers(options.queryAnswers));
327
- }
328
- return lines.join("\n");
360
+ const lines = [
361
+ `Batch completed ${options.okCount}/${options.stepCount} step(s) successfully in ${options.durationMs}ms with concurrency=${options.concurrency}.`,
362
+ ];
363
+ if (options.queryAnswers.length > 0) {
364
+ lines.push(renderBatchQueryAnswers(options.queryAnswers));
365
+ }
366
+ return lines.join("\n");
329
367
  }
330
368
  function renderBatchQueryAnswers(answers) {
331
- const lines = ["query answers:"];
332
- for (const answer of answers) {
333
- lines.push(answer.summary);
334
- }
335
- return lines.join("\n");
369
+ const lines = ["query answers:"];
370
+ for (const answer of answers) {
371
+ lines.push(answer.summary);
372
+ }
373
+ return lines.join("\n");
336
374
  }
337
375
  function renderBatchQueryAnswer(query, matches) {
338
- if (matches.length === 0) {
339
- return `- ${query}: no deterministic match in child evidence handles`;
340
- }
341
- const renderedMatches = matches.map((match) => `${match.stepId}: ${oneLine(match.excerpt, 500)}`);
342
- return `- ${query}: ${renderedMatches.join(" | ")}`;
376
+ if (matches.length === 0) {
377
+ return `- ${query}: no deterministic match in child evidence handles`;
378
+ }
379
+ const renderedMatches = matches.map((match) => `${match.stepId}: ${oneLine(match.excerpt, 500)}`);
380
+ return `- ${query}: ${renderedMatches.join(" | ")}`;
343
381
  }
344
382
  function dedupeQueryMatches(matches) {
345
- const deduped = [];
346
- const seen = new Set();
347
- for (const match of matches) {
348
- const key = `${match.stepId}:${sourceKey(match.source)}:${match.lines ?? ""}:${match.excerpt}`;
349
- if (seen.has(key)) {
350
- continue;
351
- }
352
- seen.add(key);
353
- deduped.push(match);
354
- }
355
- return deduped;
383
+ const deduped = [];
384
+ const seen = new Set();
385
+ for (const match of matches) {
386
+ const key = `${match.stepId}:${sourceKey(match.source)}:${match.lines ?? ""}:${match.excerpt}`;
387
+ if (seen.has(key)) {
388
+ continue;
389
+ }
390
+ seen.add(key);
391
+ deduped.push(match);
392
+ }
393
+ return deduped;
356
394
  }
357
395
  function sourceKey(source) {
358
- if (source.kind === "repo") {
359
- return `repo:${source.path}`;
360
- }
361
- if (source.kind === "vault") {
362
- return `vault:${source.outputId}:${source.stream ?? ""}`;
363
- }
364
- return `native:${source.tool}:${source.outputId}`;
396
+ if (source.kind === "repo") {
397
+ return `repo:${source.path}`;
398
+ }
399
+ if (source.kind === "vault") {
400
+ return `vault:${source.outputId}:${source.stream ?? ""}`;
401
+ }
402
+ if (source.kind === "local") {
403
+ return `local:${source.root}:${source.path}`;
404
+ }
405
+ return `native:${source.tool}:${source.outputId}`;
365
406
  }
366
407
  function tokenizeQuery(query) {
367
- return Array.from(new Set(query.toLowerCase().split(/[^a-z0-9_./:-]+/).filter((token) => token.length >= 2 && !BATCH_QUERY_STOPWORDS.has(token))));
368
- }
369
- const BATCH_QUERY_STOPWORDS = new Set(["a", "an", "and", "are", "as", "at", "be", "by", "for", "from", "in", "is", "it", "of", "on", "or", "that", "the", "this", "to", "with"]);
408
+ return Array.from(
409
+ new Set(
410
+ query
411
+ .toLowerCase()
412
+ .split(/[^a-z0-9_./:-]+/)
413
+ .filter((token) => token.length >= 2 && !BATCH_QUERY_STOPWORDS.has(token)),
414
+ ),
415
+ );
416
+ }
417
+ const BATCH_QUERY_STOPWORDS = new Set([
418
+ "a",
419
+ "an",
420
+ "and",
421
+ "are",
422
+ "as",
423
+ "at",
424
+ "be",
425
+ "by",
426
+ "for",
427
+ "from",
428
+ "in",
429
+ "is",
430
+ "it",
431
+ "of",
432
+ "on",
433
+ "or",
434
+ "that",
435
+ "the",
436
+ "this",
437
+ "to",
438
+ "with",
439
+ ]);
370
440
  function scoreQueryText(text, query, tokens) {
371
- const lowerText = text.toLowerCase();
372
- const normalizedQuery = query.toLowerCase();
373
- let score = lowerText.includes(normalizedQuery) ? 1_000 : 0;
374
- for (const token of tokens) {
375
- if (lowerText.includes(token)) {
376
- score += 100 + countOccurrences(lowerText, token);
377
- }
441
+ const lowerText = text.toLowerCase();
442
+ const normalizedQuery = query.toLowerCase();
443
+ let score = lowerText.includes(normalizedQuery) ? 1_000 : 0;
444
+ for (const token of tokens) {
445
+ if (lowerText.includes(token)) {
446
+ score += 100 + countOccurrences(lowerText, token);
378
447
  }
379
- return score;
448
+ }
449
+ return score;
380
450
  }
381
451
  function selectQueryExcerpt(text, tokens) {
382
- const lines = splitLines(text);
383
- if (lines.length <= 8) {
384
- return truncateBytes(text, QUERY_MATCH_EXCERPT_MAX_BYTES);
385
- }
386
- const matchingIndexes = lines
387
- .map((line, index) => ({ line: line.toLowerCase(), index }))
388
- .filter(({ line }) => tokens.some((token) => line.includes(token)))
389
- .map(({ index }) => index);
390
- if (matchingIndexes.length === 0) {
391
- return truncateBytes(lines.slice(0, 8).join("\n"), QUERY_MATCH_EXCERPT_MAX_BYTES);
392
- }
393
- const selected = new Set();
394
- for (const index of matchingIndexes) {
395
- selected.add(Math.max(0, index - 1));
396
- selected.add(index);
397
- selected.add(Math.min(lines.length - 1, index + 1));
398
- }
399
- const sorted = Array.from(selected).sort((a, b) => a - b);
400
- const capped = sorted.length > 24 ? [...sorted.slice(0, 12), ...sorted.slice(-12)] : sorted;
401
- const excerptLines = [];
402
- let previous = -1;
403
- for (const index of capped) {
404
- if (previous >= 0 && index > previous + 1) {
405
- excerptLines.push("…");
406
- }
407
- excerptLines.push(lines[index] ?? "");
408
- previous = index;
409
- }
410
- return truncateBytes(excerptLines.join("\n"), QUERY_MATCH_EXCERPT_MAX_BYTES);
452
+ const lines = splitLines(text);
453
+ if (lines.length <= 8) {
454
+ return truncateBytes(text, QUERY_MATCH_EXCERPT_MAX_BYTES);
455
+ }
456
+ const matchingIndexes = lines
457
+ .map((line, index) => ({ line: line.toLowerCase(), index }))
458
+ .filter(({ line }) => tokens.some((token) => line.includes(token)))
459
+ .map(({ index }) => index);
460
+ if (matchingIndexes.length === 0) {
461
+ return truncateBytes(lines.slice(0, 8).join("\n"), QUERY_MATCH_EXCERPT_MAX_BYTES);
462
+ }
463
+ const selected = new Set();
464
+ for (const index of matchingIndexes) {
465
+ selected.add(Math.max(0, index - 1));
466
+ selected.add(index);
467
+ selected.add(Math.min(lines.length - 1, index + 1));
468
+ }
469
+ const sorted = Array.from(selected).sort((a, b) => a - b);
470
+ const capped = sorted.length > 24 ? [...sorted.slice(0, 12), ...sorted.slice(-12)] : sorted;
471
+ const excerptLines = [];
472
+ let previous = -1;
473
+ for (const index of capped) {
474
+ if (previous >= 0 && index > previous + 1) {
475
+ excerptLines.push("…");
476
+ }
477
+ excerptLines.push(lines[index] ?? "");
478
+ previous = index;
479
+ }
480
+ return truncateBytes(excerptLines.join("\n"), QUERY_MATCH_EXCERPT_MAX_BYTES);
411
481
  }
412
482
  function isCommandLikeResult(result) {
413
- return typeof result.outputId === "string" && "execution" in result;
483
+ return typeof result.outputId === "string" && "execution" in result;
414
484
  }
415
485
  function hasOutputId(result) {
416
- return typeof result.outputId === "string";
486
+ return typeof result.outputId === "string";
417
487
  }
418
488
  function recoveryOutputIdFor(recovery) {
419
- return typeof recovery?.outputId === "string" && recovery.outputId.length > 0 ? recovery.outputId : undefined;
489
+ return typeof recovery?.outputId === "string" && recovery.outputId.length > 0 ? recovery.outputId : undefined;
420
490
  }
421
491
  function splitLines(text) {
422
- return text.split(/\r?\n/);
492
+ return text.split(/\r?\n/);
423
493
  }
424
494
  function countOccurrences(text, token) {
425
- let count = 0;
426
- let index = text.indexOf(token);
427
- while (index !== -1) {
428
- count += 1;
429
- index = text.indexOf(token, index + token.length);
430
- }
431
- return count;
495
+ let count = 0;
496
+ let index = text.indexOf(token);
497
+ while (index !== -1) {
498
+ count += 1;
499
+ index = text.indexOf(token, index + token.length);
500
+ }
501
+ return count;
432
502
  }
433
503
  function oneLine(text, maxBytes) {
434
- return truncateBytes(text.replace(/\s+/g, " ").trim(), maxBytes);
504
+ return truncateBytes(text.replace(/\s+/g, " ").trim(), maxBytes);
435
505
  }
436
506
  function truncateBytes(text, maxBytes) {
437
- if (Buffer.byteLength(text, "utf8") <= maxBytes) {
438
- return text;
439
- }
440
- let result = "";
441
- for (const char of text) {
442
- const candidate = `${result}${char}`;
443
- if (Buffer.byteLength(`${candidate}…`, "utf8") > maxBytes) {
444
- return `${result}…`;
445
- }
446
- result = candidate;
447
- }
448
- return result;
507
+ if (Buffer.byteLength(text, "utf8") <= maxBytes) {
508
+ return text;
509
+ }
510
+ let result = "";
511
+ for (const char of text) {
512
+ const candidate = `${result}${char}`;
513
+ if (Buffer.byteLength(`${candidate}…`, "utf8") > maxBytes) {
514
+ return `${result}…`;
515
+ }
516
+ result = candidate;
517
+ }
518
+ return result;
449
519
  }
450
520
  function queryDecisionSeed(answers) {
451
- return answers.map((answer) => `${answer.query}:${answer.status}:${answer.matches.map((match) => `${match.stepId}:${match.score}:${match.lines ?? ""}`).join(",")}`).join("|");
521
+ return answers
522
+ .map(
523
+ (answer) =>
524
+ `${answer.query}:${answer.status}:${answer.matches.map((match) => `${match.stepId}:${match.score}:${match.lines ?? ""}`).join(",")}`,
525
+ )
526
+ .join("|");
452
527
  }
453
528
  async function mapWithConcurrency(items, concurrency, worker) {
454
- const results = new Array(items.length);
455
- let nextIndex = 0;
456
- const workers = Array.from({ length: Math.min(concurrency, items.length) }, async () => {
457
- while (nextIndex < items.length) {
458
- const index = nextIndex;
459
- nextIndex += 1;
460
- const item = items[index];
461
- if (item !== undefined) {
462
- results[index] = await worker(item, index);
463
- }
464
- }
465
- });
466
- await Promise.all(workers);
467
- return results;
529
+ const results = new Array(items.length);
530
+ let nextIndex = 0;
531
+ const workers = Array.from({ length: Math.min(concurrency, items.length) }, async () => {
532
+ while (nextIndex < items.length) {
533
+ const index = nextIndex;
534
+ nextIndex += 1;
535
+ const item = items[index];
536
+ if (item !== undefined) {
537
+ results[index] = await worker(item, index);
538
+ }
539
+ }
540
+ });
541
+ await Promise.all(workers);
542
+ return results;
468
543
  }
469
544
  function batchValidationFailure(preserve, issues) {
470
- return {
471
- toolStatus: "error",
472
- decisionId: decisionId("batch-validation", validationMessage(issues)),
473
- preserve,
474
- producer: { kind: "other", name: "batch" },
475
- persistence: { status: "not_persisted", recoverability: "none" },
476
- routing: {
477
- status: "failed",
478
- route: "batch",
479
- reason: `Invalid freeflow_batch input: ${validationMessage(issues)}`,
480
- },
481
- summary: "Batch was not executed because the input was invalid.",
482
- concurrency: 0,
483
- stepCount: 0,
484
- okCount: 0,
485
- failedCount: 0,
486
- steps: [],
487
- recovery: {
488
- how: "No batch steps were executed. Fix the batch schema and rerun.",
489
- },
490
- };
545
+ return {
546
+ toolStatus: "error",
547
+ decisionId: decisionId("batch-validation", validationMessage(issues)),
548
+ preserve,
549
+ producer: { kind: "other", name: "batch" },
550
+ persistence: { status: "not_persisted", recoverability: "none" },
551
+ routing: {
552
+ status: "failed",
553
+ route: "batch",
554
+ reason: `Invalid freeflow_batch input: ${validationMessage(issues)}`,
555
+ },
556
+ summary: "Batch was not executed because the input was invalid.",
557
+ concurrency: 0,
558
+ stepCount: 0,
559
+ okCount: 0,
560
+ failedCount: 0,
561
+ steps: [],
562
+ recovery: {
563
+ how: "No batch steps were executed. Fix the batch schema and rerun.",
564
+ },
565
+ };
491
566
  }
492
567
  function stepDecisionSeed(steps) {
493
- return steps.map((step) => `${step.index}:${step.kind}:${step.status}:${step.result?.decisionId ?? step.error ?? "none"}`).join("|");
568
+ return steps
569
+ .map((step) => `${step.index}:${step.kind}:${step.status}:${step.result?.decisionId ?? step.error ?? "none"}`)
570
+ .join("|");
494
571
  }
495
572
  function validationMessage(issues) {
496
- return issues.map((issue) => `${issue.path}: ${issue.message}`).join("; ");
573
+ return issues.map((issue) => `${issue.path}: ${issue.message}`).join("; ");
497
574
  }
498
575
  function isRecord(value) {
499
- return typeof value === "object" && value !== null && !Array.isArray(value);
576
+ return typeof value === "object" && value !== null && !Array.isArray(value);
500
577
  }
501
578
  function decisionId(...parts) {
502
- return `ffdec_${hash(parts.join("\0")).slice(0, 16)}`;
579
+ return `ffdec_${hash(parts.join("\0")).slice(0, 16)}`;
503
580
  }
504
581
  function hash(value) {
505
- return createHash("sha256").update(value).digest("hex");
582
+ return createHash("sha256").update(value).digest("hex");
506
583
  }
507
584
  function errorMessage(error) {
508
- return error instanceof Error ? error.message : String(error);
585
+ return error instanceof Error ? error.message : String(error);
509
586
  }