@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
@@ -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
  }