@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
@@ -1,600 +1,648 @@
1
- import { BATCH_STEP_KINDS, EXECUTION_STATUSES, EVIDENCE_WINDOWS, FAILURE_EXECUTION_STATUSES, OUTPUT_STREAMS, PERSISTENCE_STATUSES, PRESERVE_MODES, PRODUCER_KINDS, RECOVERABILITY_MODES, RETRIEVAL_ACTIONS, ROUTE_KINDS, ROUTER_FAILURE_KINDS, ROUTING_STATUSES, STORAGE_POLICY_MODES, TOOL_STATUSES, } from "./types.js";
2
- import { isValidPostToolRoutingMode, validateNormalizedRouterHints, validatePositiveIntegerThreshold, validateVaultRetentionPolicy, } from "./router-contract.js";
1
+ import {
2
+ BATCH_STEP_KINDS,
3
+ EXECUTION_STATUSES,
4
+ EVIDENCE_WINDOWS,
5
+ FAILURE_EXECUTION_STATUSES,
6
+ OUTPUT_STREAMS,
7
+ PERSISTENCE_STATUSES,
8
+ PRESERVE_MODES,
9
+ PRODUCER_KINDS,
10
+ RECOVERABILITY_MODES,
11
+ RETRIEVAL_ACTIONS,
12
+ ROUTE_KINDS,
13
+ ROUTER_FAILURE_KINDS,
14
+ ROUTING_STATUSES,
15
+ STORAGE_POLICY_MODES,
16
+ TOOL_STATUSES,
17
+ } from "./types.js";
18
+ import {
19
+ isValidPostToolRoutingMode,
20
+ validateNormalizedRouterHints,
21
+ validatePositiveIntegerThreshold,
22
+ validateVaultRetentionPolicy,
23
+ } from "./router-contract.js";
3
24
  function isRecord(value) {
4
- return typeof value === "object" && value !== null && !Array.isArray(value);
25
+ return typeof value === "object" && value !== null && !Array.isArray(value);
5
26
  }
6
27
  function success(value) {
7
- return { ok: true, value };
28
+ return { ok: true, value };
8
29
  }
9
30
  function failure(issues) {
10
- return { ok: false, issues };
31
+ return { ok: false, issues };
11
32
  }
12
33
  function isOneOf(value, allowed) {
13
- return typeof value === "string" && allowed.includes(value);
34
+ return typeof value === "string" && allowed.includes(value);
14
35
  }
15
36
  function requireString(record, key, path, issues) {
16
- if (typeof record[key] !== "string" || record[key] === "") {
17
- issues.push({ path: `${path}.${key}`, message: "Expected a non-empty string." });
18
- }
37
+ if (typeof record[key] !== "string" || record[key] === "") {
38
+ issues.push({ path: `${path}.${key}`, message: "Expected a non-empty string." });
39
+ }
19
40
  }
20
41
  function requireBoolean(record, key, path, issues) {
21
- if (typeof record[key] !== "boolean") {
22
- issues.push({ path: `${path}.${key}`, message: "Expected a boolean." });
23
- }
42
+ if (typeof record[key] !== "boolean") {
43
+ issues.push({ path: `${path}.${key}`, message: "Expected a boolean." });
44
+ }
24
45
  }
25
46
  function requireNonNegativeNumber(record, key, path, issues) {
26
- if (typeof record[key] !== "number" || !Number.isFinite(record[key]) || record[key] < 0) {
27
- issues.push({ path: `${path}.${key}`, message: "Expected a non-negative finite number." });
28
- }
47
+ if (typeof record[key] !== "number" || !Number.isFinite(record[key]) || record[key] < 0) {
48
+ issues.push({ path: `${path}.${key}`, message: "Expected a non-negative finite number." });
49
+ }
29
50
  }
30
51
  function requireInteger(record, key, path, issues) {
31
- if (!Number.isInteger(record[key])) {
32
- issues.push({ path: `${path}.${key}`, message: "Expected an integer." });
33
- }
52
+ if (!Number.isInteger(record[key])) {
53
+ issues.push({ path: `${path}.${key}`, message: "Expected an integer." });
54
+ }
34
55
  }
35
56
  function requireNullableInteger(record, key, path, issues) {
36
- if (record[key] !== null && !Number.isInteger(record[key])) {
37
- issues.push({ path: `${path}.${key}`, message: "Expected an integer or null." });
38
- }
57
+ if (record[key] !== null && !Number.isInteger(record[key])) {
58
+ issues.push({ path: `${path}.${key}`, message: "Expected an integer or null." });
59
+ }
39
60
  }
40
61
  function validateSourceRef(value, path, issues) {
41
- if (!isRecord(value)) {
42
- issues.push({ path, message: "Expected a source object." });
43
- return;
44
- }
45
- if (value.kind === "repo") {
46
- requireString(value, "path", path, issues);
47
- return;
48
- }
49
- if (value.kind === "vault") {
50
- requireString(value, "outputId", path, issues);
51
- if (value.stream !== undefined && !isOneOf(value.stream, OUTPUT_STREAMS)) {
52
- issues.push({ path: `${path}.stream`, message: "Expected a known output stream." });
53
- }
54
- return;
55
- }
56
- if (value.kind === "native") {
57
- requireString(value, "tool", path, issues);
58
- requireString(value, "outputId", path, issues);
59
- return;
60
- }
61
- issues.push({ path: `${path}.kind`, message: "Expected source kind repo, vault, or native." });
62
+ if (!isRecord(value)) {
63
+ issues.push({ path, message: "Expected a source object." });
64
+ return;
65
+ }
66
+ if (value.kind === "repo") {
67
+ requireString(value, "path", path, issues);
68
+ return;
69
+ }
70
+ if (value.kind === "vault") {
71
+ requireString(value, "outputId", path, issues);
72
+ if (value.stream !== undefined && !isOneOf(value.stream, OUTPUT_STREAMS)) {
73
+ issues.push({ path: `${path}.stream`, message: "Expected a known output stream." });
74
+ }
75
+ return;
76
+ }
77
+ if (value.kind === "local") {
78
+ requireString(value, "root", path, issues);
79
+ requireString(value, "path", path, issues);
80
+ return;
81
+ }
82
+ if (value.kind === "native") {
83
+ requireString(value, "tool", path, issues);
84
+ requireString(value, "outputId", path, issues);
85
+ return;
86
+ }
87
+ issues.push({ path: `${path}.kind`, message: "Expected source kind repo, vault, local, or native." });
62
88
  }
63
89
  function validateProducerDescriptor(value, path, issues, required = false) {
64
- if (value === undefined) {
65
- if (required) {
66
- issues.push({ path, message: "Expected producer descriptor object." });
67
- }
68
- return;
69
- }
70
- if (!isRecord(value)) {
71
- issues.push({ path, message: "Expected producer descriptor object." });
72
- return;
73
- }
74
- if (!isOneOf(value.kind, PRODUCER_KINDS)) {
75
- issues.push({ path: `${path}.kind`, message: "Expected a known producer kind." });
76
- }
77
- for (const key of ["adapter", "name", "server", "tool"]) {
78
- if (value[key] !== undefined && typeof value[key] !== "string") {
79
- issues.push({ path: `${path}.${key}`, message: "Expected a string when present." });
80
- }
81
- }
90
+ if (value === undefined) {
91
+ if (required) {
92
+ issues.push({ path, message: "Expected producer descriptor object." });
93
+ }
94
+ return;
95
+ }
96
+ if (!isRecord(value)) {
97
+ issues.push({ path, message: "Expected producer descriptor object." });
98
+ return;
99
+ }
100
+ if (!isOneOf(value.kind, PRODUCER_KINDS)) {
101
+ issues.push({ path: `${path}.kind`, message: "Expected a known producer kind." });
102
+ }
103
+ for (const key of ["adapter", "name", "server", "tool"]) {
104
+ if (value[key] !== undefined && typeof value[key] !== "string") {
105
+ issues.push({ path: `${path}.${key}`, message: "Expected a string when present." });
106
+ }
107
+ }
82
108
  }
83
109
  function validateEvidencePersistence(value, path, issues, required = false) {
84
- if (value === undefined) {
85
- if (required) {
86
- issues.push({ path, message: "Expected persistence object." });
87
- }
88
- return;
89
- }
90
- if (!isRecord(value)) {
91
- issues.push({ path, message: "Expected persistence object." });
92
- return;
93
- }
94
- if (!isOneOf(value.status, PERSISTENCE_STATUSES)) {
95
- issues.push({ path: `${path}.status`, message: "Expected a known persistence status." });
96
- }
97
- if (!isOneOf(value.recoverability, RECOVERABILITY_MODES)) {
98
- issues.push({ path: `${path}.recoverability`, message: "Expected a known recoverability mode." });
99
- }
100
- if (value.recoveryOutputId !== undefined && typeof value.recoveryOutputId !== "string") {
101
- issues.push({ path: `${path}.recoveryOutputId`, message: "Expected recovery output id string when present." });
102
- }
103
- if (value.outputId !== undefined && typeof value.outputId !== "string") {
104
- issues.push({ path: `${path}.outputId`, message: "Expected output id string when present." });
105
- }
106
- if (value.recoverability === "exact" && typeof value.recoveryOutputId !== "string") {
107
- issues.push({ path: `${path}.recoveryOutputId`, message: "Expected recoveryOutputId for exact recoverability." });
108
- }
110
+ if (value === undefined) {
111
+ if (required) {
112
+ issues.push({ path, message: "Expected persistence object." });
113
+ }
114
+ return;
115
+ }
116
+ if (!isRecord(value)) {
117
+ issues.push({ path, message: "Expected persistence object." });
118
+ return;
119
+ }
120
+ if (!isOneOf(value.status, PERSISTENCE_STATUSES)) {
121
+ issues.push({ path: `${path}.status`, message: "Expected a known persistence status." });
122
+ }
123
+ if (!isOneOf(value.recoverability, RECOVERABILITY_MODES)) {
124
+ issues.push({ path: `${path}.recoverability`, message: "Expected a known recoverability mode." });
125
+ }
126
+ if (value.recoveryOutputId !== undefined && typeof value.recoveryOutputId !== "string") {
127
+ issues.push({ path: `${path}.recoveryOutputId`, message: "Expected recovery output id string when present." });
128
+ }
129
+ if (value.outputId !== undefined && typeof value.outputId !== "string") {
130
+ issues.push({ path: `${path}.outputId`, message: "Expected output id string when present." });
131
+ }
132
+ if (value.recoverability === "exact" && typeof value.recoveryOutputId !== "string") {
133
+ issues.push({ path: `${path}.recoveryOutputId`, message: "Expected recoveryOutputId for exact recoverability." });
134
+ }
109
135
  }
110
136
  function validateEvidenceLineage(value, path, issues) {
111
- if (value === undefined) {
112
- return;
113
- }
114
- if (!isRecord(value)) {
115
- issues.push({ path, message: "Expected lineage object." });
116
- return;
117
- }
118
- for (const key of ["sourceRecordIds", "sourceOutputIds"]) {
119
- if (value[key] !== undefined) {
120
- if (!Array.isArray(value[key]) || !value[key].every((item) => typeof item === "string")) {
121
- issues.push({ path: `${path}.${key}`, message: "Expected a string array when present." });
122
- }
123
- }
124
- }
125
- for (const key of ["operation", "operationHash"]) {
126
- if (value[key] !== undefined && typeof value[key] !== "string") {
127
- issues.push({ path: `${path}.${key}`, message: "Expected a string when present." });
128
- }
129
- }
137
+ if (value === undefined) {
138
+ return;
139
+ }
140
+ if (!isRecord(value)) {
141
+ issues.push({ path, message: "Expected lineage object." });
142
+ return;
143
+ }
144
+ for (const key of ["sourceRecordIds", "sourceOutputIds"]) {
145
+ if (value[key] !== undefined) {
146
+ if (!Array.isArray(value[key]) || !value[key].every((item) => typeof item === "string")) {
147
+ issues.push({ path: `${path}.${key}`, message: "Expected a string array when present." });
148
+ }
149
+ }
150
+ }
151
+ for (const key of ["operation", "operationHash"]) {
152
+ if (value[key] !== undefined && typeof value[key] !== "string") {
153
+ issues.push({ path: `${path}.${key}`, message: "Expected a string when present." });
154
+ }
155
+ }
130
156
  }
131
157
  function validateFailure(value, path, issues) {
132
- if (value === undefined) {
133
- return;
134
- }
135
- if (!isRecord(value)) {
136
- issues.push({ path, message: "Expected failure object." });
137
- return;
138
- }
139
- if (!isOneOf(value.kind, ROUTER_FAILURE_KINDS)) {
140
- issues.push({ path: `${path}.kind`, message: "Expected a known router failure kind." });
141
- }
142
- requireString(value, "message", path, issues);
158
+ if (value === undefined) {
159
+ return;
160
+ }
161
+ if (!isRecord(value)) {
162
+ issues.push({ path, message: "Expected failure object." });
163
+ return;
164
+ }
165
+ if (!isOneOf(value.kind, ROUTER_FAILURE_KINDS)) {
166
+ issues.push({ path: `${path}.kind`, message: "Expected a known router failure kind." });
167
+ }
168
+ requireString(value, "message", path, issues);
143
169
  }
144
170
  function validateFailureExecution(value, path, issues) {
145
- if (value === undefined) {
146
- return;
147
- }
148
- if (!isRecord(value)) {
149
- issues.push({ path, message: "Expected failure execution object." });
150
- return;
151
- }
152
- if (!isOneOf(value.status, FAILURE_EXECUTION_STATUSES)) {
153
- issues.push({ path: `${path}.status`, message: "Expected a known failure execution status." });
154
- }
155
- if (!isOneOf(value.failureKind, ROUTER_FAILURE_KINDS)) {
156
- issues.push({ path: `${path}.failureKind`, message: "Expected a known router failure kind." });
157
- }
158
- requireString(value, "message", path, issues);
171
+ if (value === undefined) {
172
+ return;
173
+ }
174
+ if (!isRecord(value)) {
175
+ issues.push({ path, message: "Expected failure execution object." });
176
+ return;
177
+ }
178
+ if (!isOneOf(value.status, FAILURE_EXECUTION_STATUSES)) {
179
+ issues.push({ path: `${path}.status`, message: "Expected a known failure execution status." });
180
+ }
181
+ if (!isOneOf(value.failureKind, ROUTER_FAILURE_KINDS)) {
182
+ issues.push({ path: `${path}.failureKind`, message: "Expected a known router failure kind." });
183
+ }
184
+ requireString(value, "message", path, issues);
159
185
  }
160
186
  function validateParserMetadata(value, path, issues) {
161
- if (value === undefined) {
162
- return;
163
- }
164
- if (!isRecord(value)) {
165
- issues.push({ path, message: "Expected parser metadata object." });
166
- return;
167
- }
168
- requireString(value, "name", path, issues);
169
- if (typeof value.confidence !== "number" || !Number.isFinite(value.confidence) || value.confidence < 0 || value.confidence > 1) {
170
- issues.push({ path: `${path}.confidence`, message: "Expected confidence between 0 and 1." });
171
- }
172
- if (value.fidelity !== "exact" && value.fidelity !== "lossy") {
173
- issues.push({ path: `${path}.fidelity`, message: "Expected parser fidelity exact or lossy." });
174
- }
175
- requireBoolean(value, "compressed", path, issues);
176
- if (value.counts !== undefined) {
177
- if (!isRecord(value.counts)) {
178
- issues.push({ path: `${path}.counts`, message: "Expected parser counts object." });
179
- }
180
- else {
181
- for (const [key, count] of Object.entries(value.counts)) {
182
- if (typeof count !== "number" || !Number.isFinite(count)) {
183
- issues.push({ path: `${path}.counts.${key}`, message: "Expected finite numeric parser count." });
184
- }
185
- }
186
- }
187
- }
188
- if (value.references !== undefined) {
189
- if (!Array.isArray(value.references)) {
190
- issues.push({ path: `${path}.references`, message: "Expected parser references array." });
191
- }
192
- else {
193
- value.references.forEach((reference, index) => validateParserReference(reference, `${path}.references[${index}]`, issues));
187
+ if (value === undefined) {
188
+ return;
189
+ }
190
+ if (!isRecord(value)) {
191
+ issues.push({ path, message: "Expected parser metadata object." });
192
+ return;
193
+ }
194
+ requireString(value, "name", path, issues);
195
+ if (
196
+ typeof value.confidence !== "number" ||
197
+ !Number.isFinite(value.confidence) ||
198
+ value.confidence < 0 ||
199
+ value.confidence > 1
200
+ ) {
201
+ issues.push({ path: `${path}.confidence`, message: "Expected confidence between 0 and 1." });
202
+ }
203
+ if (value.fidelity !== "exact" && value.fidelity !== "lossy") {
204
+ issues.push({ path: `${path}.fidelity`, message: "Expected parser fidelity exact or lossy." });
205
+ }
206
+ requireBoolean(value, "compressed", path, issues);
207
+ if (value.counts !== undefined) {
208
+ if (!isRecord(value.counts)) {
209
+ issues.push({ path: `${path}.counts`, message: "Expected parser counts object." });
210
+ } else {
211
+ for (const [key, count] of Object.entries(value.counts)) {
212
+ if (typeof count !== "number" || !Number.isFinite(count)) {
213
+ issues.push({ path: `${path}.counts.${key}`, message: "Expected finite numeric parser count." });
194
214
  }
195
- }
215
+ }
216
+ }
217
+ }
218
+ if (value.references !== undefined) {
219
+ if (!Array.isArray(value.references)) {
220
+ issues.push({ path: `${path}.references`, message: "Expected parser references array." });
221
+ } else {
222
+ value.references.forEach((reference, index) =>
223
+ validateParserReference(reference, `${path}.references[${index}]`, issues),
224
+ );
225
+ }
226
+ }
196
227
  }
197
228
  function validateRunOutputFilterMetadata(value, path, issues) {
198
- if (value === undefined) {
199
- return;
200
- }
201
- if (!isRecord(value)) {
202
- issues.push({ path, message: "Expected run filter metadata object." });
203
- return;
204
- }
205
- if (value.stream !== "stdout" && value.stream !== "stderr" && value.stream !== "combined") {
206
- issues.push({ path: `${path}.stream`, message: "Expected stdout, stderr, or combined stream." });
207
- }
208
- for (const key of ["include", "exclude"]) {
209
- if (value[key] !== undefined && (!Array.isArray(value[key]) || !value[key].every((item) => typeof item === "string"))) {
210
- issues.push({ path: `${path}.${key}`, message: "Expected string array when present." });
211
- }
212
- }
213
- if (value.flags !== undefined && typeof value.flags !== "string") {
214
- issues.push({ path: `${path}.flags`, message: "Expected string flags when present." });
215
- }
216
- for (const key of ["head", "tail", "maxLines", "maxBytes", "sourceLines", "selectedLines"]) {
217
- const numericValue = value[key];
218
- if (numericValue !== undefined && (typeof numericValue !== "number" || !Number.isInteger(numericValue) || numericValue < 0)) {
219
- issues.push({ path: `${path}.${key}`, message: "Expected non-negative integer when present." });
220
- }
221
- }
222
- if (value.fallbackPreservedFailureEvidence !== undefined && typeof value.fallbackPreservedFailureEvidence !== "boolean") {
223
- issues.push({ path: `${path}.fallbackPreservedFailureEvidence`, message: "Expected boolean when present." });
224
- }
229
+ if (value === undefined) {
230
+ return;
231
+ }
232
+ if (!isRecord(value)) {
233
+ issues.push({ path, message: "Expected run filter metadata object." });
234
+ return;
235
+ }
236
+ if (value.stream !== "stdout" && value.stream !== "stderr" && value.stream !== "combined") {
237
+ issues.push({ path: `${path}.stream`, message: "Expected stdout, stderr, or combined stream." });
238
+ }
239
+ for (const key of ["include", "exclude"]) {
240
+ if (
241
+ value[key] !== undefined &&
242
+ (!Array.isArray(value[key]) || !value[key].every((item) => typeof item === "string"))
243
+ ) {
244
+ issues.push({ path: `${path}.${key}`, message: "Expected string array when present." });
245
+ }
246
+ }
247
+ if (value.flags !== undefined && typeof value.flags !== "string") {
248
+ issues.push({ path: `${path}.flags`, message: "Expected string flags when present." });
249
+ }
250
+ for (const key of ["head", "tail", "maxLines", "maxBytes", "sourceLines", "selectedLines"]) {
251
+ const numericValue = value[key];
252
+ if (
253
+ numericValue !== undefined &&
254
+ (typeof numericValue !== "number" || !Number.isInteger(numericValue) || numericValue < 0)
255
+ ) {
256
+ issues.push({ path: `${path}.${key}`, message: "Expected non-negative integer when present." });
257
+ }
258
+ }
259
+ if (
260
+ value.fallbackPreservedFailureEvidence !== undefined &&
261
+ typeof value.fallbackPreservedFailureEvidence !== "boolean"
262
+ ) {
263
+ issues.push({ path: `${path}.fallbackPreservedFailureEvidence`, message: "Expected boolean when present." });
264
+ }
225
265
  }
226
266
  function validateRunScriptFilterMetadata(value, path, issues) {
227
- if (value === undefined) {
228
- return;
229
- }
230
- if (!isRecord(value)) {
231
- issues.push({ path, message: "Expected run script filter metadata object." });
232
- return;
233
- }
234
- if (typeof value.status !== "string" || value.status.length === 0) {
235
- issues.push({ path: `${path}.status`, message: "Expected script filter status string." });
236
- }
237
- if (typeof value.language !== "string" || value.language.length === 0) {
238
- issues.push({ path: `${path}.language`, message: "Expected script filter language string." });
239
- }
240
- requireString(value, "rawOutputId", path, issues);
241
- if (!Array.isArray(value.sourceAliases) || !value.sourceAliases.every((item) => typeof item === "string")) {
242
- issues.push({ path: `${path}.sourceAliases`, message: "Expected script source alias string array." });
243
- }
244
- if (value.label !== undefined && typeof value.label !== "string") {
245
- issues.push({ path: `${path}.label`, message: "Expected label string when present." });
246
- }
247
- if (value.operation !== undefined && !isRecord(value.operation)) {
248
- issues.push({ path: `${path}.operation`, message: "Expected operation object when present." });
249
- }
250
- if (value.outputId !== undefined && typeof value.outputId !== "string") {
251
- issues.push({ path: `${path}.outputId`, message: "Expected output id string when present." });
252
- }
253
- if (value.recordId !== undefined && typeof value.recordId !== "string") {
254
- issues.push({ path: `${path}.recordId`, message: "Expected record id string when present." });
255
- }
256
- validateEvidencePersistence(value.persistence, `${path}.persistence`, issues);
257
- validateEvidenceLineage(value.lineage, `${path}.lineage`, issues);
258
- validateFailure(value.failure, `${path}.failure`, issues);
259
- validateFailureExecution(value.transformExecution, `${path}.transformExecution`, issues);
260
- if (value.summary !== undefined && typeof value.summary !== "string") {
261
- issues.push({ path: `${path}.summary`, message: "Expected summary string when present." });
262
- }
267
+ if (value === undefined) {
268
+ return;
269
+ }
270
+ if (!isRecord(value)) {
271
+ issues.push({ path, message: "Expected run script filter metadata object." });
272
+ return;
273
+ }
274
+ if (typeof value.status !== "string" || value.status.length === 0) {
275
+ issues.push({ path: `${path}.status`, message: "Expected script filter status string." });
276
+ }
277
+ if (typeof value.language !== "string" || value.language.length === 0) {
278
+ issues.push({ path: `${path}.language`, message: "Expected script filter language string." });
279
+ }
280
+ requireString(value, "rawOutputId", path, issues);
281
+ if (!Array.isArray(value.sourceAliases) || !value.sourceAliases.every((item) => typeof item === "string")) {
282
+ issues.push({ path: `${path}.sourceAliases`, message: "Expected script source alias string array." });
283
+ }
284
+ if (value.label !== undefined && typeof value.label !== "string") {
285
+ issues.push({ path: `${path}.label`, message: "Expected label string when present." });
286
+ }
287
+ if (value.operation !== undefined && !isRecord(value.operation)) {
288
+ issues.push({ path: `${path}.operation`, message: "Expected operation object when present." });
289
+ }
290
+ if (value.outputId !== undefined && typeof value.outputId !== "string") {
291
+ issues.push({ path: `${path}.outputId`, message: "Expected output id string when present." });
292
+ }
293
+ if (value.recordId !== undefined && typeof value.recordId !== "string") {
294
+ issues.push({ path: `${path}.recordId`, message: "Expected record id string when present." });
295
+ }
296
+ validateEvidencePersistence(value.persistence, `${path}.persistence`, issues);
297
+ validateEvidenceLineage(value.lineage, `${path}.lineage`, issues);
298
+ validateFailure(value.failure, `${path}.failure`, issues);
299
+ validateFailureExecution(value.transformExecution, `${path}.transformExecution`, issues);
300
+ if (value.summary !== undefined && typeof value.summary !== "string") {
301
+ issues.push({ path: `${path}.summary`, message: "Expected summary string when present." });
302
+ }
263
303
  }
264
304
  function validateParserReference(value, path, issues) {
265
- if (!isRecord(value)) {
266
- issues.push({ path, message: "Expected parser reference object." });
267
- return;
268
- }
269
- requireString(value, "path", path, issues);
270
- requireString(value, "message", path, issues);
271
- if (value.line !== undefined) {
272
- if (typeof value.line !== "number" || !Number.isInteger(value.line) || value.line <= 0) {
273
- issues.push({ path: `${path}.line`, message: "Expected a positive integer line." });
274
- }
275
- }
276
- if (value.column !== undefined) {
277
- if (typeof value.column !== "number" || !Number.isInteger(value.column) || value.column <= 0) {
278
- issues.push({ path: `${path}.column`, message: "Expected a positive integer column." });
279
- }
280
- }
281
- if (value.code !== undefined && typeof value.code !== "string") {
282
- issues.push({ path: `${path}.code`, message: "Expected parser reference code string." });
283
- }
284
- if (value.severity !== undefined && value.severity !== "error" && value.severity !== "warning" && value.severity !== "info") {
285
- issues.push({ path: `${path}.severity`, message: "Expected parser reference severity error, warning, or info." });
286
- }
305
+ if (!isRecord(value)) {
306
+ issues.push({ path, message: "Expected parser reference object." });
307
+ return;
308
+ }
309
+ requireString(value, "path", path, issues);
310
+ requireString(value, "message", path, issues);
311
+ if (value.line !== undefined) {
312
+ if (typeof value.line !== "number" || !Number.isInteger(value.line) || value.line <= 0) {
313
+ issues.push({ path: `${path}.line`, message: "Expected a positive integer line." });
314
+ }
315
+ }
316
+ if (value.column !== undefined) {
317
+ if (typeof value.column !== "number" || !Number.isInteger(value.column) || value.column <= 0) {
318
+ issues.push({ path: `${path}.column`, message: "Expected a positive integer column." });
319
+ }
320
+ }
321
+ if (value.code !== undefined && typeof value.code !== "string") {
322
+ issues.push({ path: `${path}.code`, message: "Expected parser reference code string." });
323
+ }
324
+ if (
325
+ value.severity !== undefined &&
326
+ value.severity !== "error" &&
327
+ value.severity !== "warning" &&
328
+ value.severity !== "info"
329
+ ) {
330
+ issues.push({ path: `${path}.severity`, message: "Expected parser reference severity error, warning, or info." });
331
+ }
287
332
  }
288
333
  function validateImportantLines(value, path, issues) {
289
- if (value === undefined) {
290
- return;
291
- }
292
- if (!Array.isArray(value)) {
293
- issues.push({ path, message: "Expected importantLines array." });
294
- return;
295
- }
296
- value.forEach((line, index) => validateImportantLine(line, `${path}[${index}]`, issues));
334
+ if (value === undefined) {
335
+ return;
336
+ }
337
+ if (!Array.isArray(value)) {
338
+ issues.push({ path, message: "Expected importantLines array." });
339
+ return;
340
+ }
341
+ value.forEach((line, index) => validateImportantLine(line, `${path}[${index}]`, issues));
297
342
  }
298
343
  function validateImportantLine(value, path, issues) {
299
- if (!isRecord(value)) {
300
- issues.push({ path, message: "Expected important line object." });
301
- return;
302
- }
303
- if (!isOneOf(value.stream, OUTPUT_STREAMS) || value.stream === "raw") {
304
- issues.push({ path: `${path}.stream`, message: "Expected stdout, stderr, or combined stream." });
305
- }
306
- if (typeof value.lines !== "string" || !validLineRange(value.lines)) {
307
- issues.push({ path: `${path}.lines`, message: "Expected line range in start-end form." });
308
- }
309
- if (typeof value.excerpt !== "string") {
310
- issues.push({ path: `${path}.excerpt`, message: "Expected excerpt string." });
311
- }
344
+ if (!isRecord(value)) {
345
+ issues.push({ path, message: "Expected important line object." });
346
+ return;
347
+ }
348
+ if (!isOneOf(value.stream, OUTPUT_STREAMS) || value.stream === "raw") {
349
+ issues.push({ path: `${path}.stream`, message: "Expected stdout, stderr, or combined stream." });
350
+ }
351
+ if (typeof value.lines !== "string" || !validLineRange(value.lines)) {
352
+ issues.push({ path: `${path}.lines`, message: "Expected line range in start-end form." });
353
+ }
354
+ if (typeof value.excerpt !== "string") {
355
+ issues.push({ path: `${path}.excerpt`, message: "Expected excerpt string." });
356
+ }
312
357
  }
313
358
  function validLineRange(value) {
314
- const match = /^(\d+)-(\d+)$/.exec(value);
315
- if (!match?.[1] || !match[2]) {
316
- return false;
317
- }
318
- const start = Number(match[1]);
319
- const end = Number(match[2]);
320
- return Number.isInteger(start) && Number.isInteger(end) && start > 0 && end >= start;
359
+ const match = /^(\d+)-(\d+)$/.exec(value);
360
+ if (!match?.[1] || !match[2]) {
361
+ return false;
362
+ }
363
+ const start = Number(match[1]);
364
+ const end = Number(match[2]);
365
+ return Number.isInteger(start) && Number.isInteger(end) && start > 0 && end >= start;
321
366
  }
322
367
  function validateEvidenceArray(value, path, issues) {
323
- if (value === undefined) {
324
- return;
325
- }
326
- if (!Array.isArray(value)) {
327
- issues.push({ path, message: "Expected an evidence array." });
328
- return;
329
- }
330
- value.forEach((packet, index) => {
331
- const result = validateEvidencePacket(packet);
332
- if (!result.ok) {
333
- for (const issue of result.issues) {
334
- issues.push({ path: `${path}[${index}]${issue.path.slice(1)}`, message: issue.message });
335
- }
336
- }
337
- });
368
+ if (value === undefined) {
369
+ return;
370
+ }
371
+ if (!Array.isArray(value)) {
372
+ issues.push({ path, message: "Expected an evidence array." });
373
+ return;
374
+ }
375
+ value.forEach((packet, index) => {
376
+ const result = validateEvidencePacket(packet);
377
+ if (!result.ok) {
378
+ for (const issue of result.issues) {
379
+ issues.push({ path: `${path}[${index}]${issue.path.slice(1)}`, message: issue.message });
380
+ }
381
+ }
382
+ });
338
383
  }
339
384
  function validateBatchSteps(value, path, issues) {
340
- if (value === undefined) {
341
- return;
342
- }
343
- if (!Array.isArray(value)) {
344
- issues.push({ path, message: "Expected batch steps array." });
345
- return;
346
- }
347
- value.forEach((step, index) => {
348
- const stepPath = `${path}[${index}]`;
349
- if (!isRecord(step)) {
350
- issues.push({ path: stepPath, message: "Expected batch step result object." });
351
- return;
352
- }
353
- requireString(step, "id", stepPath, issues);
354
- requireInteger(step, "index", stepPath, issues);
355
- if (!isOneOf(step.kind, BATCH_STEP_KINDS)) {
356
- issues.push({ path: `${stepPath}.kind`, message: "Expected batch step kind run or search." });
357
- }
358
- if (step.status !== "ok" && step.status !== "failed") {
359
- issues.push({ path: `${stepPath}.status`, message: "Expected batch step status ok or failed." });
360
- }
361
- if (step.toolStatus !== undefined && !isOneOf(step.toolStatus, TOOL_STATUSES)) {
362
- issues.push({ path: `${stepPath}.toolStatus`, message: "Expected toolStatus ok or error when present." });
363
- }
364
- requireNonNegativeNumber(step, "durationMs", stepPath, issues);
365
- if (step.error !== undefined && typeof step.error !== "string") {
366
- issues.push({ path: `${stepPath}.error`, message: "Expected error string when present." });
367
- }
368
- if (step.result !== undefined) {
369
- const nested = validateRoutedResult(step.result);
370
- if (!nested.ok) {
371
- for (const issue of nested.issues) {
372
- issues.push({ path: `${stepPath}.result${issue.path.slice(1)}`, message: issue.message });
373
- }
374
- }
385
+ if (value === undefined) {
386
+ return;
387
+ }
388
+ if (!Array.isArray(value)) {
389
+ issues.push({ path, message: "Expected batch steps array." });
390
+ return;
391
+ }
392
+ value.forEach((step, index) => {
393
+ const stepPath = `${path}[${index}]`;
394
+ if (!isRecord(step)) {
395
+ issues.push({ path: stepPath, message: "Expected batch step result object." });
396
+ return;
397
+ }
398
+ requireString(step, "id", stepPath, issues);
399
+ requireInteger(step, "index", stepPath, issues);
400
+ if (!isOneOf(step.kind, BATCH_STEP_KINDS)) {
401
+ issues.push({ path: `${stepPath}.kind`, message: "Expected batch step kind run or search." });
402
+ }
403
+ if (step.status !== "ok" && step.status !== "failed") {
404
+ issues.push({ path: `${stepPath}.status`, message: "Expected batch step status ok or failed." });
405
+ }
406
+ if (step.toolStatus !== undefined && !isOneOf(step.toolStatus, TOOL_STATUSES)) {
407
+ issues.push({ path: `${stepPath}.toolStatus`, message: "Expected toolStatus ok or error when present." });
408
+ }
409
+ requireNonNegativeNumber(step, "durationMs", stepPath, issues);
410
+ if (step.error !== undefined && typeof step.error !== "string") {
411
+ issues.push({ path: `${stepPath}.error`, message: "Expected error string when present." });
412
+ }
413
+ if (step.result !== undefined) {
414
+ const nested = validateRoutedResult(step.result);
415
+ if (!nested.ok) {
416
+ for (const issue of nested.issues) {
417
+ issues.push({ path: `${stepPath}.result${issue.path.slice(1)}`, message: issue.message });
375
418
  }
376
- });
419
+ }
420
+ }
421
+ });
377
422
  }
378
423
  export function validatePreserveMode(value) {
379
- if (!isOneOf(value, PRESERVE_MODES)) {
380
- return failure([{ path: "$", message: "Expected preserve mode summary, important, or full." }]);
381
- }
382
- return success(value);
424
+ if (!isOneOf(value, PRESERVE_MODES)) {
425
+ return failure([{ path: "$", message: "Expected preserve mode summary, important, or full." }]);
426
+ }
427
+ return success(value);
383
428
  }
384
429
  export function validateRetrievalAction(value) {
385
- if (!isOneOf(value, RETRIEVAL_ACTIONS)) {
386
- return failure([{ path: "$", message: "Expected retrieval action query, locate, get, retrieve, expand, or explain." }]);
387
- }
388
- return success(value);
430
+ if (!isOneOf(value, RETRIEVAL_ACTIONS)) {
431
+ return failure([
432
+ { path: "$", message: "Expected retrieval action query, locate, get, retrieve, expand, or explain." },
433
+ ]);
434
+ }
435
+ return success(value);
389
436
  }
390
437
  export function validateEvidencePacket(value) {
391
- const issues = [];
392
- if (!isRecord(value)) {
393
- return failure([{ path: "$", message: "Expected an evidence packet object." }]);
394
- }
395
- requireString(value, "id", "$", issues);
396
- validateSourceRef(value.source, "$.source", issues);
397
- requireString(value, "excerpt", "$", issues);
398
- requireString(value, "why", "$", issues);
399
- requireBoolean(value, "expandable", "$", issues);
400
- if (!isOneOf(value.window, EVIDENCE_WINDOWS)) {
401
- issues.push({ path: "$.window", message: "Expected a known evidence window." });
402
- }
403
- if (value.path !== undefined && typeof value.path !== "string") {
404
- issues.push({ path: "$.path", message: "Expected a string when present." });
405
- }
406
- if (value.lines !== undefined && typeof value.lines !== "string") {
407
- issues.push({ path: "$.lines", message: "Expected a string when present." });
408
- }
409
- if (value.match !== undefined) {
410
- if (!isRecord(value.match)) {
411
- issues.push({ path: "$.match", message: "Expected match metadata object when present." });
412
- }
413
- else {
414
- if (!["exact_phrase", "lexical", "metadata"].includes(String(value.match.type))) {
415
- issues.push({ path: "$.match.type", message: "Expected known match type." });
416
- }
417
- if (typeof value.match.confidence !== "number" || !Number.isFinite(value.match.confidence) || value.match.confidence < 0 || value.match.confidence > 1) {
418
- issues.push({ path: "$.match.confidence", message: "Expected match confidence between 0 and 1." });
419
- }
420
- }
421
- }
422
- return issues.length === 0 ? success(value) : failure(issues);
438
+ const issues = [];
439
+ if (!isRecord(value)) {
440
+ return failure([{ path: "$", message: "Expected an evidence packet object." }]);
441
+ }
442
+ requireString(value, "id", "$", issues);
443
+ validateSourceRef(value.source, "$.source", issues);
444
+ requireString(value, "excerpt", "$", issues);
445
+ requireString(value, "why", "$", issues);
446
+ requireBoolean(value, "expandable", "$", issues);
447
+ if (!isOneOf(value.window, EVIDENCE_WINDOWS)) {
448
+ issues.push({ path: "$.window", message: "Expected a known evidence window." });
449
+ }
450
+ if (value.path !== undefined && typeof value.path !== "string") {
451
+ issues.push({ path: "$.path", message: "Expected a string when present." });
452
+ }
453
+ if (value.lines !== undefined && typeof value.lines !== "string") {
454
+ issues.push({ path: "$.lines", message: "Expected a string when present." });
455
+ }
456
+ if (value.match !== undefined) {
457
+ if (!isRecord(value.match)) {
458
+ issues.push({ path: "$.match", message: "Expected match metadata object when present." });
459
+ } else {
460
+ if (!["exact_phrase", "lexical", "metadata"].includes(String(value.match.type))) {
461
+ issues.push({ path: "$.match.type", message: "Expected known match type." });
462
+ }
463
+ if (
464
+ typeof value.match.confidence !== "number" ||
465
+ !Number.isFinite(value.match.confidence) ||
466
+ value.match.confidence < 0 ||
467
+ value.match.confidence > 1
468
+ ) {
469
+ issues.push({ path: "$.match.confidence", message: "Expected match confidence between 0 and 1." });
470
+ }
471
+ }
472
+ }
473
+ return issues.length === 0 ? success(value) : failure(issues);
423
474
  }
424
475
  export function validateRoutedResult(value) {
425
- const issues = [];
426
- if (!isRecord(value)) {
427
- return failure([{ path: "$", message: "Expected a routed result object." }]);
428
- }
429
- if ("status" in value) {
430
- issues.push({
431
- path: "$.status",
432
- message: "Do not use ambiguous top-level status; use toolStatus, execution.status, and routing.status.",
433
- });
434
- }
435
- if (!isOneOf(value.toolStatus, TOOL_STATUSES)) {
436
- issues.push({ path: "$.toolStatus", message: "Expected toolStatus ok or error." });
437
- }
438
- requireString(value, "decisionId", "$", issues);
439
- if (!isOneOf(value.preserve, PRESERVE_MODES)) {
440
- issues.push({ path: "$.preserve", message: "Expected preserve mode summary, important, or full." });
441
- }
442
- if (!isRecord(value.routing)) {
443
- issues.push({ path: "$.routing", message: "Expected routing object." });
444
- }
445
- else {
446
- if (!isOneOf(value.routing.status, ROUTING_STATUSES)) {
447
- issues.push({ path: "$.routing.status", message: "Expected a known routing status." });
448
- }
449
- if (!isOneOf(value.routing.route, ROUTE_KINDS)) {
450
- issues.push({ path: "$.routing.route", message: "Expected a known route kind." });
451
- }
452
- requireString(value.routing, "reason", "$.routing", issues);
453
- }
454
- if (value.recovery !== undefined) {
455
- if (!isRecord(value.recovery)) {
456
- issues.push({ path: "$.recovery", message: "Expected recovery object." });
457
- }
458
- else {
459
- requireString(value.recovery, "how", "$.recovery", issues);
460
- }
461
- }
462
- validateEvidenceArray(value.evidence, "$.evidence", issues);
463
- if (value.execution !== undefined) {
464
- if (!isRecord(value.execution)) {
465
- issues.push({ path: "$.execution", message: "Expected execution object." });
466
- }
467
- else {
468
- if (!isOneOf(value.execution.status, EXECUTION_STATUSES)) {
469
- issues.push({ path: "$.execution.status", message: "Expected a known execution status." });
470
- }
471
- requireNullableInteger(value.execution, "exitCode", "$.execution", issues);
472
- if (value.execution.durationMs !== undefined) {
473
- requireNonNegativeNumber(value.execution, "durationMs", "$.execution", issues);
474
- }
475
- }
476
- }
477
- if (value.outputId !== undefined && typeof value.outputId !== "string") {
478
- issues.push({ path: "$.outputId", message: "Expected output id string when present." });
479
- }
480
- if (value.recordId !== undefined && typeof value.recordId !== "string") {
481
- issues.push({ path: "$.recordId", message: "Expected record id string when present." });
482
- }
483
- validateProducerDescriptor(value.producer, "$.producer", issues);
484
- validateEvidencePersistence(value.persistence, "$.persistence", issues);
485
- validateEvidenceLineage(value.lineage, "$.lineage", issues);
486
- validateFailure(value.failure, "$.failure", issues);
487
- validateFailureExecution(value.transformExecution, "$.transformExecution", issues);
488
- validateImportantLines(value.importantLines, "$.importantLines", issues);
489
- validateParserMetadata(value.parser, "$.parser", issues);
490
- validateRunOutputFilterMetadata(value.filters, "$.filters", issues);
491
- validateRunScriptFilterMetadata(value.scriptFilter, "$.scriptFilter", issues);
492
- validateBatchSteps(value.steps, "$.steps", issues);
493
- if (value.stepCount !== undefined) {
494
- requireNonNegativeNumber(value, "stepCount", "$", issues);
495
- }
496
- if (value.okCount !== undefined) {
497
- requireNonNegativeNumber(value, "okCount", "$", issues);
498
- }
499
- if (value.failedCount !== undefined) {
500
- requireNonNegativeNumber(value, "failedCount", "$", issues);
501
- }
502
- if (value.concurrency !== undefined) {
503
- requireNonNegativeNumber(value, "concurrency", "$", issues);
504
- }
505
- return issues.length === 0 ? success(value) : failure(issues);
476
+ const issues = [];
477
+ if (!isRecord(value)) {
478
+ return failure([{ path: "$", message: "Expected a routed result object." }]);
479
+ }
480
+ if ("status" in value) {
481
+ issues.push({
482
+ path: "$.status",
483
+ message: "Do not use ambiguous top-level status; use toolStatus, execution.status, and routing.status.",
484
+ });
485
+ }
486
+ if (!isOneOf(value.toolStatus, TOOL_STATUSES)) {
487
+ issues.push({ path: "$.toolStatus", message: "Expected toolStatus ok or error." });
488
+ }
489
+ requireString(value, "decisionId", "$", issues);
490
+ if (!isOneOf(value.preserve, PRESERVE_MODES)) {
491
+ issues.push({ path: "$.preserve", message: "Expected preserve mode summary, important, or full." });
492
+ }
493
+ if (!isRecord(value.routing)) {
494
+ issues.push({ path: "$.routing", message: "Expected routing object." });
495
+ } else {
496
+ if (!isOneOf(value.routing.status, ROUTING_STATUSES)) {
497
+ issues.push({ path: "$.routing.status", message: "Expected a known routing status." });
498
+ }
499
+ if (!isOneOf(value.routing.route, ROUTE_KINDS)) {
500
+ issues.push({ path: "$.routing.route", message: "Expected a known route kind." });
501
+ }
502
+ requireString(value.routing, "reason", "$.routing", issues);
503
+ }
504
+ if (value.recovery !== undefined) {
505
+ if (!isRecord(value.recovery)) {
506
+ issues.push({ path: "$.recovery", message: "Expected recovery object." });
507
+ } else {
508
+ requireString(value.recovery, "how", "$.recovery", issues);
509
+ }
510
+ }
511
+ validateEvidenceArray(value.evidence, "$.evidence", issues);
512
+ if (value.execution !== undefined) {
513
+ if (!isRecord(value.execution)) {
514
+ issues.push({ path: "$.execution", message: "Expected execution object." });
515
+ } else {
516
+ if (!isOneOf(value.execution.status, EXECUTION_STATUSES)) {
517
+ issues.push({ path: "$.execution.status", message: "Expected a known execution status." });
518
+ }
519
+ requireNullableInteger(value.execution, "exitCode", "$.execution", issues);
520
+ if (value.execution.durationMs !== undefined) {
521
+ requireNonNegativeNumber(value.execution, "durationMs", "$.execution", issues);
522
+ }
523
+ }
524
+ }
525
+ if (value.outputId !== undefined && typeof value.outputId !== "string") {
526
+ issues.push({ path: "$.outputId", message: "Expected output id string when present." });
527
+ }
528
+ if (value.recordId !== undefined && typeof value.recordId !== "string") {
529
+ issues.push({ path: "$.recordId", message: "Expected record id string when present." });
530
+ }
531
+ validateProducerDescriptor(value.producer, "$.producer", issues);
532
+ validateEvidencePersistence(value.persistence, "$.persistence", issues);
533
+ validateEvidenceLineage(value.lineage, "$.lineage", issues);
534
+ validateFailure(value.failure, "$.failure", issues);
535
+ validateFailureExecution(value.transformExecution, "$.transformExecution", issues);
536
+ validateImportantLines(value.importantLines, "$.importantLines", issues);
537
+ validateParserMetadata(value.parser, "$.parser", issues);
538
+ validateRunOutputFilterMetadata(value.filters, "$.filters", issues);
539
+ validateRunScriptFilterMetadata(value.scriptFilter, "$.scriptFilter", issues);
540
+ validateBatchSteps(value.steps, "$.steps", issues);
541
+ if (value.stepCount !== undefined) {
542
+ requireNonNegativeNumber(value, "stepCount", "$", issues);
543
+ }
544
+ if (value.okCount !== undefined) {
545
+ requireNonNegativeNumber(value, "okCount", "$", issues);
546
+ }
547
+ if (value.failedCount !== undefined) {
548
+ requireNonNegativeNumber(value, "failedCount", "$", issues);
549
+ }
550
+ if (value.concurrency !== undefined) {
551
+ requireNonNegativeNumber(value, "concurrency", "$", issues);
552
+ }
553
+ return issues.length === 0 ? success(value) : failure(issues);
506
554
  }
507
555
  export function validateRouterConfig(value) {
508
- const issues = [];
509
- if (!isRecord(value)) {
510
- return failure([{ path: "$", message: "Expected a router config object." }]);
511
- }
512
- if (!isValidPostToolRoutingMode(value.postToolRouting)) {
513
- issues.push({ path: "$.postToolRouting", message: "Expected postToolRouting off, safety-net, or strict." });
514
- }
515
- if (!isOneOf(value.storagePolicy, STORAGE_POLICY_MODES)) {
516
- issues.push({ path: "$.storagePolicy", message: "Expected storagePolicy store-everything or hybrid-dedupe." });
517
- }
518
- if (!isRecord(value.thresholds)) {
519
- issues.push({ path: "$.thresholds", message: "Expected thresholds object." });
520
- }
521
- else {
522
- issues.push(...validatePositiveIntegerThreshold(value.thresholds.largeOutputBytes, "$.thresholds.largeOutputBytes"));
523
- issues.push(...validatePositiveIntegerThreshold(value.thresholds.largeOutputLines, "$.thresholds.largeOutputLines"));
524
- }
525
- if (!isRecord(value.vault)) {
526
- issues.push({ path: "$.vault", message: "Expected vault config object." });
527
- }
528
- else {
529
- requireString(value.vault, "root", "$.vault", issues);
530
- if (value.vault.retention !== undefined) {
531
- issues.push(...validateVaultRetentionPolicy(value.vault.retention, "$.vault.retention"));
532
- }
533
- }
534
- issues.push(...validateNormalizedRouterHints(value.hints, "$.hints"));
535
- return issues.length === 0 ? success(value) : failure(issues);
556
+ const issues = [];
557
+ if (!isRecord(value)) {
558
+ return failure([{ path: "$", message: "Expected a router config object." }]);
559
+ }
560
+ if (!isValidPostToolRoutingMode(value.postToolRouting)) {
561
+ issues.push({ path: "$.postToolRouting", message: "Expected postToolRouting off, safety-net, or strict." });
562
+ }
563
+ if (!isOneOf(value.storagePolicy, STORAGE_POLICY_MODES)) {
564
+ issues.push({ path: "$.storagePolicy", message: "Expected storagePolicy store-everything or hybrid-dedupe." });
565
+ }
566
+ if (!isRecord(value.thresholds)) {
567
+ issues.push({ path: "$.thresholds", message: "Expected thresholds object." });
568
+ } else {
569
+ issues.push(
570
+ ...validatePositiveIntegerThreshold(value.thresholds.largeOutputBytes, "$.thresholds.largeOutputBytes"),
571
+ );
572
+ issues.push(
573
+ ...validatePositiveIntegerThreshold(value.thresholds.largeOutputLines, "$.thresholds.largeOutputLines"),
574
+ );
575
+ }
576
+ if (!isRecord(value.vault)) {
577
+ issues.push({ path: "$.vault", message: "Expected vault config object." });
578
+ } else {
579
+ requireString(value.vault, "root", "$.vault", issues);
580
+ if (value.vault.retention !== undefined) {
581
+ issues.push(...validateVaultRetentionPolicy(value.vault.retention, "$.vault.retention"));
582
+ }
583
+ }
584
+ issues.push(...validateNormalizedRouterHints(value.hints, "$.hints"));
585
+ return issues.length === 0 ? success(value) : failure(issues);
536
586
  }
537
587
  export function validateCommandOutputRecord(value) {
538
- const issues = [];
539
- if (!isRecord(value)) {
540
- return failure([{ path: "$", message: "Expected a command output record object." }]);
541
- }
542
- if ("status" in value) {
543
- issues.push({
544
- path: "$.status",
545
- message: "Do not use ambiguous command record status; use executionStatus.",
546
- });
547
- }
548
- if (value.kind !== "command") {
549
- issues.push({ path: "$.kind", message: "Expected kind command." });
550
- }
551
- requireString(value, "outputId", "$", issues);
552
- requireString(value, "recordId", "$", issues);
553
- requireString(value, "objectId", "$", issues);
554
- requireString(value, "createdAt", "$", issues);
555
- requireString(value, "contentHashSha256", "$", issues);
556
- const commandIsValid = typeof value.command === "string" ||
557
- (Array.isArray(value.command) && value.command.every((part) => typeof part === "string"));
558
- if (!commandIsValid) {
559
- issues.push({ path: "$.command", message: "Expected command string or string array." });
560
- }
561
- if (!isOneOf(value.executionStatus, EXECUTION_STATUSES)) {
562
- issues.push({ path: "$.executionStatus", message: "Expected a known execution status." });
563
- }
564
- requireNullableInteger(value, "exitCode", "$", issues);
565
- if (!isRecord(value.paths)) {
566
- issues.push({ path: "$.paths", message: "Expected command output paths object." });
567
- }
568
- else {
569
- requireString(value.paths, "meta", "$.paths", issues);
570
- requireString(value.paths, "stdout", "$.paths", issues);
571
- requireString(value.paths, "stderr", "$.paths", issues);
572
- requireString(value.paths, "combined", "$.paths", issues);
573
- }
574
- if (!isRecord(value.lineCounts)) {
575
- issues.push({ path: "$.lineCounts", message: "Expected lineCounts object." });
576
- }
577
- else {
578
- requireInteger(value.lineCounts, "stdout", "$.lineCounts", issues);
579
- requireInteger(value.lineCounts, "stderr", "$.lineCounts", issues);
580
- requireInteger(value.lineCounts, "combined", "$.lineCounts", issues);
581
- }
582
- if (!isRecord(value.byteCounts)) {
583
- issues.push({ path: "$.byteCounts", message: "Expected byteCounts object." });
584
- }
585
- else {
586
- requireInteger(value.byteCounts, "stdout", "$.byteCounts", issues);
587
- requireInteger(value.byteCounts, "stderr", "$.byteCounts", issues);
588
- requireInteger(value.byteCounts, "combined", "$.byteCounts", issues);
589
- }
590
- if (!isRecord(value.hashes)) {
591
- issues.push({ path: "$.hashes", message: "Expected hashes object." });
592
- }
593
- if (!Array.isArray(value.decisionIds) || !value.decisionIds.every((item) => typeof item === "string")) {
594
- issues.push({ path: "$.decisionIds", message: "Expected decision id string array." });
595
- }
596
- validateProducerDescriptor(value.producer, "$.producer", issues, true);
597
- validateEvidencePersistence(value.persistence, "$.persistence", issues, true);
598
- validateEvidenceLineage(value.lineage, "$.lineage", issues);
599
- return issues.length === 0 ? success(value) : failure(issues);
588
+ const issues = [];
589
+ if (!isRecord(value)) {
590
+ return failure([{ path: "$", message: "Expected a command output record object." }]);
591
+ }
592
+ if ("status" in value) {
593
+ issues.push({
594
+ path: "$.status",
595
+ message: "Do not use ambiguous command record status; use executionStatus.",
596
+ });
597
+ }
598
+ if (value.kind !== "command") {
599
+ issues.push({ path: "$.kind", message: "Expected kind command." });
600
+ }
601
+ requireString(value, "outputId", "$", issues);
602
+ requireString(value, "recordId", "$", issues);
603
+ requireString(value, "objectId", "$", issues);
604
+ requireString(value, "createdAt", "$", issues);
605
+ requireString(value, "contentHashSha256", "$", issues);
606
+ const commandIsValid =
607
+ typeof value.command === "string" ||
608
+ (Array.isArray(value.command) && value.command.every((part) => typeof part === "string"));
609
+ if (!commandIsValid) {
610
+ issues.push({ path: "$.command", message: "Expected command string or string array." });
611
+ }
612
+ if (!isOneOf(value.executionStatus, EXECUTION_STATUSES)) {
613
+ issues.push({ path: "$.executionStatus", message: "Expected a known execution status." });
614
+ }
615
+ requireNullableInteger(value, "exitCode", "$", issues);
616
+ if (!isRecord(value.paths)) {
617
+ issues.push({ path: "$.paths", message: "Expected command output paths object." });
618
+ } else {
619
+ requireString(value.paths, "meta", "$.paths", issues);
620
+ requireString(value.paths, "stdout", "$.paths", issues);
621
+ requireString(value.paths, "stderr", "$.paths", issues);
622
+ requireString(value.paths, "combined", "$.paths", issues);
623
+ }
624
+ if (!isRecord(value.lineCounts)) {
625
+ issues.push({ path: "$.lineCounts", message: "Expected lineCounts object." });
626
+ } else {
627
+ requireInteger(value.lineCounts, "stdout", "$.lineCounts", issues);
628
+ requireInteger(value.lineCounts, "stderr", "$.lineCounts", issues);
629
+ requireInteger(value.lineCounts, "combined", "$.lineCounts", issues);
630
+ }
631
+ if (!isRecord(value.byteCounts)) {
632
+ issues.push({ path: "$.byteCounts", message: "Expected byteCounts object." });
633
+ } else {
634
+ requireInteger(value.byteCounts, "stdout", "$.byteCounts", issues);
635
+ requireInteger(value.byteCounts, "stderr", "$.byteCounts", issues);
636
+ requireInteger(value.byteCounts, "combined", "$.byteCounts", issues);
637
+ }
638
+ if (!isRecord(value.hashes)) {
639
+ issues.push({ path: "$.hashes", message: "Expected hashes object." });
640
+ }
641
+ if (!Array.isArray(value.decisionIds) || !value.decisionIds.every((item) => typeof item === "string")) {
642
+ issues.push({ path: "$.decisionIds", message: "Expected decision id string array." });
643
+ }
644
+ validateProducerDescriptor(value.producer, "$.producer", issues, true);
645
+ validateEvidencePersistence(value.persistence, "$.persistence", issues, true);
646
+ validateEvidenceLineage(value.lineage, "$.lineage", issues);
647
+ return issues.length === 0 ? success(value) : failure(issues);
600
648
  }