@hassangameryt/freeflow 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (690) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +5 -2
  3. package/.codex-plugin/plugin.json +8 -9
  4. package/README.md +190 -128
  5. package/assets/feedback-loop.png +0 -0
  6. package/assets/freeflow_workflow_map.png +0 -0
  7. package/assets/workflow.png +0 -0
  8. package/command-surface.json +51 -7
  9. package/hooks/freeflow-runtime-context.mjs +264 -136
  10. package/hooks/tests/check-runtime-context-hook.sh +223 -0
  11. package/package.json +23 -24
  12. package/pi-extension/dist/index.js +264 -80
  13. package/pi-extension/dist/integrations/mcp-config.js +29 -0
  14. package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
  15. package/pi-extension/dist/output-router/native-safety-net.js +216 -0
  16. package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
  17. package/pi-extension/dist/output-router/renderers.js +1023 -0
  18. package/pi-extension/dist/output-router/router-tools.js +554 -0
  19. package/pi-extension/dist/output-router/schemas.js +383 -0
  20. package/pi-extension/dist/output-router/status.js +744 -0
  21. package/pi-extension/dist/output-router/utils.js +502 -0
  22. package/pi-extension/dist/runtime/runtime-context.js +798 -0
  23. package/pi-extension/dist/settings/settings-tui.js +314 -0
  24. package/pi-extension/dist/settings/settings-ui.js +1487 -0
  25. package/pi-extension/freeflow/index.js +1 -0
  26. package/pi-extension/src/index.ts +230 -56
  27. package/pi-extension/src/{host-producer-identification.ts → output-router/host-producer-identification.ts} +37 -7
  28. package/pi-extension/src/{native-safety-net.ts → output-router/native-safety-net.ts} +7 -11
  29. package/pi-extension/src/{observed-tool-routing.ts → output-router/observed-tool-routing.ts} +19 -11
  30. package/pi-extension/src/{renderers.ts → output-router/renderers.ts} +246 -55
  31. package/pi-extension/src/{router-tools.ts → output-router/router-tools.ts} +130 -29
  32. package/pi-extension/src/{schemas.ts → output-router/schemas.ts} +171 -43
  33. package/pi-extension/src/output-router/status.ts +791 -0
  34. package/pi-extension/src/{utils.ts → output-router/utils.ts} +80 -18
  35. package/pi-extension/src/runtime/runtime-context.ts +895 -0
  36. package/pi-extension/src/settings/settings-tui.ts +408 -0
  37. package/pi-extension/src/settings/settings-ui.ts +1730 -0
  38. package/pi-extension/tests/integration/pi-extension.test.js +4018 -0
  39. package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
  40. package/pi-extension/tests/output-router/search.test.js +722 -0
  41. package/pi-extension/tests/settings/settings-tui.test.js +243 -0
  42. package/router/dist/benchmarks/benchmark-harness.d.ts +16 -13
  43. package/router/dist/benchmarks/benchmark-harness.js +62 -62
  44. package/router/dist/benchmarks/benchmarks.d.ts +80 -73
  45. package/router/dist/benchmarks/benchmarks.js +860 -761
  46. package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +71 -67
  47. package/router/dist/benchmarks/codex-qa-benchmarks.js +429 -390
  48. package/router/dist/benchmarks/command-benchmarks.d.ts +107 -92
  49. package/router/dist/benchmarks/command-benchmarks.js +616 -571
  50. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +64 -56
  51. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +679 -613
  52. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +103 -95
  53. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1188 -1103
  54. package/router/dist/benchmarks/context-saving-baseline.d.ts +47 -41
  55. package/router/dist/benchmarks/context-saving-baseline.js +405 -374
  56. package/router/dist/benchmarks/index-benchmarks.d.ts +74 -69
  57. package/router/dist/benchmarks/index-benchmarks.js +761 -661
  58. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +80 -69
  59. package/router/dist/benchmarks/storage-policy-benchmarks.js +549 -469
  60. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +43 -34
  61. package/router/dist/benchmarks/vault-index-benchmarks.js +294 -229
  62. package/router/dist/config/config.d.ts +61 -54
  63. package/router/dist/config/config.js +551 -372
  64. package/router/dist/config/router-contract.d.ts +2 -2
  65. package/router/dist/config/router-contract.js +38 -38
  66. package/router/dist/config/schema.d.ts +19 -10
  67. package/router/dist/config/schema.js +586 -538
  68. package/router/dist/config/types.d.ts +413 -361
  69. package/router/dist/config/types.js +19 -8
  70. package/router/dist/evidence/bounded-evidence.d.ts +26 -26
  71. package/router/dist/evidence/bounded-evidence.js +265 -252
  72. package/router/dist/evidence/evidence-range-selector.d.ts +16 -14
  73. package/router/dist/evidence/evidence-range-selector.js +192 -191
  74. package/router/dist/evidence/evidence-search.d.ts +18 -16
  75. package/router/dist/evidence/evidence-search.js +401 -377
  76. package/router/dist/evidence/evidence.d.ts +17 -17
  77. package/router/dist/evidence/evidence.js +163 -159
  78. package/router/dist/evidence/failure-contracts.d.ts +25 -15
  79. package/router/dist/evidence/failure-contracts.js +132 -126
  80. package/router/dist/evidence/line-ranges.d.ts +17 -15
  81. package/router/dist/evidence/line-ranges.js +18 -18
  82. package/router/dist/experiments/local-index.d.ts +47 -41
  83. package/router/dist/experiments/local-index.js +477 -458
  84. package/router/dist/local/local-traversal.d.ts +18 -0
  85. package/router/dist/local/local-traversal.js +334 -0
  86. package/router/dist/processing/engine.d.ts +94 -70
  87. package/router/dist/processing/engine.js +462 -364
  88. package/router/dist/processing/reducers.d.ts +208 -194
  89. package/router/dist/processing/reducers.js +1434 -1256
  90. package/router/dist/processing/renderers.d.ts +24 -18
  91. package/router/dist/processing/renderers.js +161 -152
  92. package/router/dist/processing/scripts.d.ts +80 -67
  93. package/router/dist/processing/scripts.js +343 -290
  94. package/router/dist/repo/repo-traversal.d.ts +9 -9
  95. package/router/dist/repo/repo-traversal.js +205 -202
  96. package/router/dist/routing/observed-reducers.d.ts +25 -19
  97. package/router/dist/routing/observed-reducers.js +559 -545
  98. package/router/dist/routing/observed-routing.d.ts +23 -14
  99. package/router/dist/routing/observed-routing.js +319 -318
  100. package/router/dist/routing/parsers.d.ts +10 -10
  101. package/router/dist/routing/parsers.js +454 -406
  102. package/router/dist/routing/run-filters.d.ts +45 -41
  103. package/router/dist/routing/run-filters.js +215 -207
  104. package/router/dist/routing/run-reducers.d.ts +45 -26
  105. package/router/dist/routing/run-reducers.js +102 -90
  106. package/router/dist/sandbox/adapter-roots.d.ts +34 -26
  107. package/router/dist/sandbox/adapter-roots.js +43 -41
  108. package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -5
  109. package/router/dist/sandbox/eryx-python-adapter.js +659 -588
  110. package/router/dist/sandbox/jq-wasm-adapter.d.ts +3 -3
  111. package/router/dist/sandbox/jq-wasm-adapter.js +319 -311
  112. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -5
  113. package/router/dist/sandbox/quickjs-wasi-adapter.js +336 -333
  114. package/router/dist/sandbox/script-sandbox.d.ts +105 -84
  115. package/router/dist/sandbox/script-sandbox.js +294 -260
  116. package/router/dist/setup/script-transform-adapters.d.ts +23 -19
  117. package/router/dist/setup/script-transform-adapters.js +223 -204
  118. package/router/dist/tools/batch.d.ts +27 -16
  119. package/router/dist/tools/batch.js +493 -416
  120. package/router/dist/tools/run.d.ts +47 -35
  121. package/router/dist/tools/run.js +1171 -1086
  122. package/router/dist/tools/search.d.ts +53 -31
  123. package/router/dist/tools/search.js +1224 -1065
  124. package/router/dist/transform/engine.d.ts +121 -96
  125. package/router/dist/transform/engine.js +1853 -1736
  126. package/router/dist/vault/vault-index.d.ts +97 -78
  127. package/router/dist/vault/vault-index.js +347 -342
  128. package/router/dist/vault/vault.d.ts +109 -74
  129. package/router/dist/vault/vault.js +528 -533
  130. package/runtime/interaction-contract.md +16 -0
  131. package/skills/bypass/SKILL.md +52 -38
  132. package/skills/commit-work/SKILL.md +54 -46
  133. package/skills/commit-work/references/staging-decisions.md +46 -24
  134. package/skills/decision-gate/SKILL.md +48 -0
  135. package/skills/design-for-depth/SKILL.md +75 -59
  136. package/skills/design-for-depth/references/design-pressure-signals.md +56 -7
  137. package/skills/design-for-depth/references/interface-design-loop.md +156 -0
  138. package/skills/design-for-depth/references/software-design-philosophy.md +32 -3
  139. package/skills/diagnose-failure/SKILL.md +65 -60
  140. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
  141. package/skills/diagnose-failure/references/flaky-and-performance.md +30 -18
  142. package/skills/discuss/SKILL.md +121 -0
  143. package/skills/discuss/references/checkpoints.md +66 -0
  144. package/skills/evaluate-skill/SKILL.md +62 -53
  145. package/skills/evaluate-skill/references/definition-schema.md +345 -0
  146. package/skills/evaluate-skill/references/evaluation-design.md +86 -0
  147. package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
  148. package/skills/evaluate-skill/references/review-and-revision.md +51 -0
  149. package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
  150. package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
  151. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
  152. package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
  153. package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
  154. package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
  155. package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
  156. package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
  157. package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
  158. package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
  159. package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
  160. package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
  161. package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
  162. package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
  163. package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
  164. package/skills/execute-work/SKILL.md +99 -0
  165. package/skills/execute-work/references/code-practices.md +78 -0
  166. package/skills/execute-work/references/execution-loop.md +77 -0
  167. package/skills/finish-branch/SKILL.md +117 -0
  168. package/skills/finish-branch/references/integration-options.md +80 -0
  169. package/skills/handoff/SKILL.md +65 -39
  170. package/skills/handoff/references/templates.md +104 -27
  171. package/skills/launch-work/SKILL.md +116 -0
  172. package/skills/launch-work/references/launch-readiness.md +85 -0
  173. package/skills/migration-work/SKILL.md +115 -0
  174. package/skills/migration-work/references/migration-lifecycle.md +82 -0
  175. package/skills/mode-contract/SKILL.md +50 -52
  176. package/skills/output-router/SKILL.md +21 -17
  177. package/skills/output-router/references/safety-policy.md +1 -1
  178. package/skills/release-work/SKILL.md +118 -0
  179. package/skills/release-work/references/release-evidence.md +78 -0
  180. package/skills/review-artifact/SKILL.md +77 -69
  181. package/skills/review-artifact/references/reviewer-prompt.md +133 -42
  182. package/skills/review-work/SKILL.md +82 -57
  183. package/skills/review-work/references/reviewer-prompt.md +97 -60
  184. package/skills/review-work/references/security-risk-lens.md +67 -0
  185. package/skills/setup-freeflow/SKILL.md +58 -66
  186. package/skills/setup-freeflow/references/activation-contract.md +89 -69
  187. package/skills/setup-freeflow/references/host-setup.md +54 -17
  188. package/skills/setup-freeflow/references/output-router-setup.md +62 -54
  189. package/skills/simplify-code/SKILL.md +80 -0
  190. package/skills/simplify-code/references/simplification-patterns.md +70 -0
  191. package/skills/tdd/SKILL.md +96 -0
  192. package/skills/tdd/references/test-design.md +96 -0
  193. package/skills/track-work/SKILL.md +84 -0
  194. package/skills/track-work/references/working-record-schema.md +378 -0
  195. package/skills/verify-work/SKILL.md +59 -38
  196. package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
  197. package/skills/verify-work/references/integration-evidence.md +51 -0
  198. package/skills/verify-work/references/performance-evidence.md +57 -0
  199. package/skills/workflow/SKILL.md +53 -59
  200. package/skills/workflow/references/domain-skill-composition.md +57 -0
  201. package/skills/workflow/references/workflow-loop.md +92 -0
  202. package/skills/write-plan/SKILL.md +85 -58
  203. package/skills/write-plan/references/plan-shapes.md +132 -46
  204. package/skills/write-skill/SKILL.md +82 -51
  205. package/skills/write-skill/references/activation-boundaries.md +62 -0
  206. package/skills/write-skill/references/agent-first-instructions.md +87 -0
  207. package/skills/write-skill/references/progressive-disclosure.md +63 -0
  208. package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
  209. package/skills/write-skill/scripts/skill-author.mjs +104 -0
  210. package/skills/write-spec/SKILL.md +65 -54
  211. package/skills/write-spec/references/artifact-standards.md +60 -41
  212. package/skills/write-spec/references/decision-records.md +77 -0
  213. package/skills/write-spec/references/spec-shapes.md +119 -60
  214. package/evals/README.md +0 -32
  215. package/evals/fixtures/copy-conventions.md +0 -31
  216. package/evals/fixtures/output-router/README.md +0 -12
  217. package/evals/fixtures/output-router/failed-command-output.txt +0 -9
  218. package/evals/fixtures/output-router/large-router-manual.md +0 -63
  219. package/evals/fixtures/output-router/native-large-output.txt +0 -40
  220. package/evals/fixtures/output-router/noisy-test-output.txt +0 -30
  221. package/evals/fixtures/output-router/verification-output.txt +0 -8
  222. package/evals/fixtures/tiny-artifact-review-app/README.md +0 -5
  223. package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +0 -10
  224. package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +0 -21
  225. package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +0 -24
  226. package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +0 -17
  227. package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +0 -8
  228. package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +0 -15
  229. package/evals/fixtures/tiny-commit-ambiguous-app/README.md +0 -3
  230. package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +0 -5
  231. package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +0 -1
  232. package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +0 -5
  233. package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +0 -14
  234. package/evals/fixtures/tiny-commit-app/README.md +0 -3
  235. package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +0 -5
  236. package/evals/fixtures/tiny-commit-app/src/billing.ts +0 -5
  237. package/evals/fixtures/tiny-commit-app/src/settings-page.ts +0 -1
  238. package/evals/fixtures/tiny-commit-app/tests/settings.test.md +0 -5
  239. package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +0 -15
  240. package/evals/fixtures/tiny-commit-everything-app/README.md +0 -3
  241. package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +0 -5
  242. package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +0 -5
  243. package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +0 -1
  244. package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +0 -5
  245. package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +0 -15
  246. package/evals/fixtures/tiny-commit-staged-app/README.md +0 -3
  247. package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +0 -5
  248. package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +0 -5
  249. package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +0 -1
  250. package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +0 -5
  251. package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +0 -15
  252. package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +0 -3
  253. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +0 -3
  254. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +0 -3
  255. package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +0 -5
  256. package/evals/fixtures/tiny-dashboard-stale-app/README.md +0 -11
  257. package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +0 -13
  258. package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +0 -19
  259. package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +0 -9
  260. package/evals/fixtures/tiny-decision-destination-app/README.md +0 -6
  261. package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +0 -8
  262. package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +0 -4
  263. package/evals/fixtures/tiny-design-depth-app/README.md +0 -15
  264. package/evals/fixtures/tiny-design-depth-app/src/routes.ts +0 -25
  265. package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +0 -3
  266. package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +0 -3
  267. package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +0 -3
  268. package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +0 -12
  269. package/evals/fixtures/tiny-eval-method-app/README.md +0 -8
  270. package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +0 -5
  271. package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +0 -17
  272. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +0 -11
  273. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +0 -3
  274. package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +0 -10
  275. package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +0 -10
  276. package/evals/fixtures/tiny-execute-plan-app/README.md +0 -5
  277. package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +0 -5
  278. package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +0 -10
  279. package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +0 -11
  280. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +0 -12
  281. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +0 -15
  282. package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +0 -9
  283. package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +0 -9
  284. package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +0 -9
  285. package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +0 -7
  286. package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +0 -1
  287. package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +0 -7
  288. package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +0 -5
  289. package/evals/fixtures/tiny-execute-review-loop-app/README.md +0 -5
  290. package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +0 -9
  291. package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +0 -12
  292. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +0 -15
  293. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +0 -11
  294. package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +0 -9
  295. package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +0 -7
  296. package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +0 -1
  297. package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +0 -7
  298. package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +0 -5
  299. package/evals/fixtures/tiny-flaky-session-app/README.md +0 -10
  300. package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +0 -13
  301. package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +0 -8
  302. package/evals/fixtures/tiny-handoff-app/README.md +0 -5
  303. package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +0 -10
  304. package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +0 -8
  305. package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +0 -11
  306. package/evals/fixtures/tiny-handoff-app/src/billing.ts +0 -7
  307. package/evals/fixtures/tiny-handoff-report-app/README.md +0 -3
  308. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +0 -1
  309. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +0 -1
  310. package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +0 -4
  311. package/evals/fixtures/tiny-plan-app/README.md +0 -5
  312. package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +0 -10
  313. package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +0 -25
  314. package/evals/fixtures/tiny-plan-app/src/billing.ts +0 -17
  315. package/evals/fixtures/tiny-plan-app/src/settings-page.ts +0 -1
  316. package/evals/fixtures/tiny-plan-app/tests/billing.test.md +0 -8
  317. package/evals/fixtures/tiny-plan-app/tests/settings.test.md +0 -5
  318. package/evals/fixtures/tiny-plan-strict-api-app/README.md +0 -3
  319. package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +0 -5
  320. package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +0 -25
  321. package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +0 -5
  322. package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +0 -3
  323. package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +0 -8
  324. package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +0 -3
  325. package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +0 -15
  326. package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +0 -16
  327. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +0 -15
  328. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +0 -10
  329. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +0 -15
  330. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +0 -12
  331. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +0 -20
  332. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +0 -1
  333. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +0 -1
  334. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +0 -8
  335. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +0 -8
  336. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +0 -7
  337. package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +0 -15
  338. package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +0 -16
  339. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +0 -15
  340. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +0 -10
  341. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +0 -15
  342. package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +0 -12
  343. package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +0 -20
  344. package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +0 -1
  345. package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +0 -1
  346. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +0 -8
  347. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +0 -8
  348. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +0 -7
  349. package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +0 -3
  350. package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +0 -15
  351. package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +0 -16
  352. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +0 -15
  353. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +0 -10
  354. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +0 -15
  355. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +0 -12
  356. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +0 -20
  357. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +0 -1
  358. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +0 -1
  359. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +0 -8
  360. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +0 -8
  361. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +0 -7
  362. package/evals/fixtures/tiny-report-performance-app/README.md +0 -11
  363. package/evals/fixtures/tiny-report-performance-app/docs/performance.md +0 -10
  364. package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +0 -29
  365. package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +0 -8
  366. package/evals/fixtures/tiny-review-request-app/README.md +0 -3
  367. package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +0 -5
  368. package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +0 -19
  369. package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +0 -20
  370. package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +0 -25
  371. package/evals/fixtures/tiny-review-request-app/src/billing.ts +0 -11
  372. package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +0 -19
  373. package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +0 -8
  374. package/evals/fixtures/tiny-review-work-app/README.md +0 -5
  375. package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +0 -9
  376. package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +0 -12
  377. package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +0 -15
  378. package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +0 -9
  379. package/evals/fixtures/tiny-review-work-app/src/billing.ts +0 -7
  380. package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +0 -1
  381. package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +0 -7
  382. package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +0 -5
  383. package/evals/fixtures/tiny-saas-app/README.md +0 -16
  384. package/evals/fixtures/tiny-saas-app/docs/auth-review.md +0 -15
  385. package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +0 -10
  386. package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +0 -15
  387. package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +0 -13
  388. package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +0 -12
  389. package/evals/fixtures/tiny-saas-app/src/billing.ts +0 -20
  390. package/evals/fixtures/tiny-saas-app/src/login-copy.ts +0 -1
  391. package/evals/fixtures/tiny-saas-app/src/settings-page.ts +0 -1
  392. package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +0 -8
  393. package/evals/fixtures/tiny-saas-app/tests/billing.test.md +0 -8
  394. package/evals/fixtures/tiny-saas-app/tests/copy.test.md +0 -7
  395. package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +0 -6
  396. package/evals/fixtures/tiny-setup-both-app/AGENTS.md +0 -5
  397. package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +0 -5
  398. package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +0 -6
  399. package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +0 -5
  400. package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +0 -6
  401. package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +0 -6
  402. package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +0 -14
  403. package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +0 -6
  404. package/evals/fixtures/tiny-skill-dev-app/README.md +0 -10
  405. package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +0 -8
  406. package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +0 -17
  407. package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +0 -13
  408. package/evals/fixtures/tiny-team-app/README.md +0 -5
  409. package/evals/fixtures/tiny-team-app/docs/product.md +0 -6
  410. package/evals/fixtures/tiny-team-app/src/teams.ts +0 -9
  411. package/evals/fixtures/tiny-team-app/src/users.ts +0 -5
  412. package/evals/fixtures/tiny-team-app/tests/teams.test.md +0 -7
  413. package/evals/fixtures/tiny-verify-app/README.md +0 -5
  414. package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +0 -1
  415. package/evals/fixtures/tiny-verify-app/src/settings-page.ts +0 -1
  416. package/evals/fixtures/tiny-verify-app/tests/settings.test.md +0 -7
  417. package/evals/prompts/aon-001.txt +0 -2
  418. package/evals/prompts/byp-001.txt +0 -2
  419. package/evals/prompts/byp-002.txt +0 -2
  420. package/evals/prompts/cap-001.txt +0 -3
  421. package/evals/prompts/cap-002.txt +0 -3
  422. package/evals/prompts/cmd-001.txt +0 -3
  423. package/evals/prompts/cmd-002.txt +0 -3
  424. package/evals/prompts/cmd-003.txt +0 -6
  425. package/evals/prompts/cmd-004.txt +0 -5
  426. package/evals/prompts/cmd-005.txt +0 -5
  427. package/evals/prompts/cmd-006.txt +0 -5
  428. package/evals/prompts/cmd-007.txt +0 -5
  429. package/evals/prompts/cmd-008.txt +0 -5
  430. package/evals/prompts/cmd-009.txt +0 -8
  431. package/evals/prompts/cmd-010.txt +0 -5
  432. package/evals/prompts/cmd-011.txt +0 -5
  433. package/evals/prompts/cmd-012.txt +0 -5
  434. package/evals/prompts/cmd-013.txt +0 -5
  435. package/evals/prompts/cmd-014.txt +0 -7
  436. package/evals/prompts/cmd-015.txt +0 -7
  437. package/evals/prompts/cmd-016.txt +0 -5
  438. package/evals/prompts/cmt-001.txt +0 -1
  439. package/evals/prompts/cmt-002.txt +0 -1
  440. package/evals/prompts/cmt-003.txt +0 -1
  441. package/evals/prompts/cmt-004.txt +0 -1
  442. package/evals/prompts/cmt-005.txt +0 -1
  443. package/evals/prompts/dfd-001.txt +0 -3
  444. package/evals/prompts/dia-001.txt +0 -3
  445. package/evals/prompts/dia-002.txt +0 -3
  446. package/evals/prompts/dia-003.txt +0 -3
  447. package/evals/prompts/dis-001.txt +0 -5
  448. package/evals/prompts/dis-002.txt +0 -5
  449. package/evals/prompts/esk-001.txt +0 -5
  450. package/evals/prompts/esk-002.txt +0 -5
  451. package/evals/prompts/esk-003.txt +0 -5
  452. package/evals/prompts/grc-001.txt +0 -3
  453. package/evals/prompts/hof-001.txt +0 -3
  454. package/evals/prompts/hof-002.txt +0 -1
  455. package/evals/prompts/hof-003.txt +0 -1
  456. package/evals/prompts/hof-004.txt +0 -1
  457. package/evals/prompts/hof-005.txt +0 -1
  458. package/evals/prompts/ivg-001.txt +0 -1
  459. package/evals/prompts/ivg-002.txt +0 -11
  460. package/evals/prompts/ivg-003.txt +0 -1
  461. package/evals/prompts/ivg-004.txt +0 -1
  462. package/evals/prompts/mode-001.txt +0 -3
  463. package/evals/prompts/mode-002.txt +0 -1
  464. package/evals/prompts/mode-003.txt +0 -3
  465. package/evals/prompts/mode-004.txt +0 -3
  466. package/evals/prompts/mode-005.txt +0 -3
  467. package/evals/prompts/mode-006.txt +0 -3
  468. package/evals/prompts/mode-007.txt +0 -3
  469. package/evals/prompts/otr-001.txt +0 -3
  470. package/evals/prompts/otr-002.txt +0 -3
  471. package/evals/prompts/rar-001.txt +0 -5
  472. package/evals/prompts/rar-002.txt +0 -3
  473. package/evals/prompts/rar-003.txt +0 -6
  474. package/evals/prompts/rar-004.txt +0 -15
  475. package/evals/prompts/rar-005.txt +0 -10
  476. package/evals/prompts/rbr-001.txt +0 -3
  477. package/evals/prompts/rbr-002.txt +0 -3
  478. package/evals/prompts/rbr-003.txt +0 -7
  479. package/evals/prompts/rev-001.txt +0 -3
  480. package/evals/prompts/rev-002.txt +0 -5
  481. package/evals/prompts/rev-003.txt +0 -6
  482. package/evals/prompts/rev-004.txt +0 -1
  483. package/evals/prompts/rev-005.txt +0 -15
  484. package/evals/prompts/rev-006.txt +0 -5
  485. package/evals/prompts/stp-001.txt +0 -1
  486. package/evals/prompts/stp-002.txt +0 -1
  487. package/evals/prompts/stp-003.txt +0 -1
  488. package/evals/prompts/stp-004.txt +0 -1
  489. package/evals/prompts/stp-005.txt +0 -1
  490. package/evals/prompts/stp-006.txt +0 -1
  491. package/evals/prompts/stp-007.txt +0 -1
  492. package/evals/prompts/stp-008.txt +0 -1
  493. package/evals/prompts/stp-009.txt +0 -1
  494. package/evals/prompts/stp-010.txt +0 -1
  495. package/evals/prompts/stp-011.txt +0 -1
  496. package/evals/prompts/vfy-003.txt +0 -1
  497. package/evals/prompts/wpl-001.txt +0 -3
  498. package/evals/prompts/wpl-002.txt +0 -5
  499. package/evals/prompts/wpl-003.txt +0 -3
  500. package/evals/prompts/wpl-004.txt +0 -5
  501. package/evals/prompts/wpl-005.txt +0 -1
  502. package/evals/prompts/wrc-001.txt +0 -10
  503. package/evals/prompts/wrc-002.txt +0 -3
  504. package/evals/prompts/wsk-001.txt +0 -6
  505. package/evals/prompts/wsp-001.txt +0 -5
  506. package/evals/prompts/wsp-002.txt +0 -15
  507. package/evals/prompts/wsp-003.txt +0 -3
  508. package/evals/prompts/wsp-004.txt +0 -15
  509. package/evals/prompts/wsp-005.txt +0 -5
  510. package/evals/prompts/wsp-006.txt +0 -12
  511. package/evals/prompts/wsp-007.txt +0 -9
  512. package/evals/prompts/wsp-008.txt +0 -13
  513. package/evals/prompts/xpl-001.txt +0 -1
  514. package/evals/prompts/xpl-002.txt +0 -3
  515. package/evals/prompts/xpl-003.txt +0 -3
  516. package/evals/prompts/xpl-004.txt +0 -3
  517. package/evals/prompts/xpl-005.txt +0 -5
  518. package/evals/prompts/xpl-006.txt +0 -3
  519. package/evals/registries/adversarial-evals.json +0 -39
  520. package/evals/registries/fixture-evals.json +0 -2513
  521. package/evals/registries/handoff-evals.json +0 -74
  522. package/evals/registries/legacy-evals.json +0 -147
  523. package/evals/registries/skill-evidence.json +0 -193
  524. package/evals/registries/verify-work-evals.json +0 -46
  525. package/evals/reports/acceptance/v0.1-acceptance-report.md +0 -130
  526. package/evals/reports/by-command-surface/command-surface-1-report.md +0 -45
  527. package/evals/reports/by-command-surface/command-surface-10-report.md +0 -76
  528. package/evals/reports/by-command-surface/command-surface-11-report.md +0 -77
  529. package/evals/reports/by-command-surface/command-surface-12-report.md +0 -91
  530. package/evals/reports/by-command-surface/command-surface-13-report.md +0 -64
  531. package/evals/reports/by-command-surface/command-surface-14-report.md +0 -66
  532. package/evals/reports/by-command-surface/command-surface-15-report.md +0 -124
  533. package/evals/reports/by-command-surface/command-surface-16-report.md +0 -39
  534. package/evals/reports/by-command-surface/command-surface-2-report.md +0 -80
  535. package/evals/reports/by-command-surface/command-surface-3-report.md +0 -86
  536. package/evals/reports/by-command-surface/command-surface-4-report.md +0 -76
  537. package/evals/reports/by-command-surface/command-surface-5-report.md +0 -80
  538. package/evals/reports/by-command-surface/command-surface-6-report.md +0 -74
  539. package/evals/reports/by-command-surface/command-surface-7-report.md +0 -84
  540. package/evals/reports/by-command-surface/command-surface-8-report.md +0 -79
  541. package/evals/reports/by-command-surface/command-surface-9-report.md +0 -79
  542. package/evals/reports/by-command-surface/command-surface-matrix.md +0 -91
  543. package/evals/reports/by-skill/bypass-1-report.md +0 -124
  544. package/evals/reports/by-skill/capture-decisions-1-report.md +0 -99
  545. package/evals/reports/by-skill/capture-decisions-2-report.md +0 -102
  546. package/evals/reports/by-skill/commit-work-1-report.md +0 -165
  547. package/evals/reports/by-skill/commit-work-2-report.md +0 -109
  548. package/evals/reports/by-skill/design-for-depth-1-report.md +0 -95
  549. package/evals/reports/by-skill/diagnose-failure-1-report.md +0 -91
  550. package/evals/reports/by-skill/diagnose-failure-2-report.md +0 -94
  551. package/evals/reports/by-skill/discover-1-report.md +0 -118
  552. package/evals/reports/by-skill/evaluate-skill-2-report.md +0 -71
  553. package/evals/reports/by-skill/execute-plan-1-report.md +0 -103
  554. package/evals/reports/by-skill/execute-plan-2-report.md +0 -112
  555. package/evals/reports/by-skill/execute-plan-3-report.md +0 -87
  556. package/evals/reports/by-skill/grill-context-1-report.md +0 -103
  557. package/evals/reports/by-skill/handoff-1-report.md +0 -123
  558. package/evals/reports/by-skill/handoff-2-report.md +0 -105
  559. package/evals/reports/by-skill/handoff-3-report.md +0 -100
  560. package/evals/reports/by-skill/handoff-7-report.md +0 -77
  561. package/evals/reports/by-skill/interview-gate-1-report.md +0 -63
  562. package/evals/reports/by-skill/interview-gate-2-report.md +0 -105
  563. package/evals/reports/by-skill/mode-contract-1-report.md +0 -74
  564. package/evals/reports/by-skill/mode-contract-2-report.md +0 -87
  565. package/evals/reports/by-skill/mode-contract-3-report.md +0 -65
  566. package/evals/reports/by-skill/mode-contract-4-report.md +0 -71
  567. package/evals/reports/by-skill/mode-contract-5-report.md +0 -70
  568. package/evals/reports/by-skill/output-router-1-report.md +0 -76
  569. package/evals/reports/by-skill/output-router-2-report.md +0 -65
  570. package/evals/reports/by-skill/research-1-report.md +0 -144
  571. package/evals/reports/by-skill/research-brief-1-report.md +0 -94
  572. package/evals/reports/by-skill/research-brief-2-report.md +0 -75
  573. package/evals/reports/by-skill/review-artifact-1-report.md +0 -91
  574. package/evals/reports/by-skill/review-artifact-2-report.md +0 -79
  575. package/evals/reports/by-skill/review-artifact-3-report.md +0 -120
  576. package/evals/reports/by-skill/review-artifact-4-report.md +0 -89
  577. package/evals/reports/by-skill/review-artifact-5-report.md +0 -66
  578. package/evals/reports/by-skill/review-work-1-report.md +0 -85
  579. package/evals/reports/by-skill/review-work-2-report.md +0 -87
  580. package/evals/reports/by-skill/review-work-3-report.md +0 -104
  581. package/evals/reports/by-skill/review-work-4-report.md +0 -108
  582. package/evals/reports/by-skill/review-work-5-report.md +0 -73
  583. package/evals/reports/by-skill/review-work-6-report.md +0 -66
  584. package/evals/reports/by-skill/setup-freeflow-1-report.md +0 -199
  585. package/evals/reports/by-skill/setup-freeflow-2-report.md +0 -105
  586. package/evals/reports/by-skill/setup-freeflow-3-report.md +0 -105
  587. package/evals/reports/by-skill/setup-freeflow-4-report.md +0 -88
  588. package/evals/reports/by-skill/setup-freeflow-5-report.md +0 -115
  589. package/evals/reports/by-skill/skill-authoring-1-report.md +0 -81
  590. package/evals/reports/by-skill/verify-work-1-report.md +0 -111
  591. package/evals/reports/by-skill/verify-work-2-report.md +0 -120
  592. package/evals/reports/by-skill/workflow-1-report.md +0 -65
  593. package/evals/reports/by-skill/write-plan-1-report.md +0 -123
  594. package/evals/reports/by-skill/write-plan-2-report.md +0 -98
  595. package/evals/reports/by-skill/write-plan-3-report.md +0 -110
  596. package/evals/reports/by-skill/write-spec-1-report.md +0 -88
  597. package/evals/reports/by-skill/write-spec-2-report.md +0 -89
  598. package/evals/reports/by-skill/write-spec-3-report.md +0 -90
  599. package/evals/reports/by-skill/write-spec-4-report.md +0 -167
  600. package/evals/reports/harness/claude-harness-1-report.md +0 -103
  601. package/evals/reports/harness/eval-harness-1-report.md +0 -91
  602. package/evals/reports/iterations/iteration-1-report.md +0 -71
  603. package/evals/reports/iterations/iteration-2-report.md +0 -78
  604. package/evals/reports/iterations/iteration-3-report.md +0 -118
  605. package/evals/reports/iterations/iteration-4-report.md +0 -131
  606. package/evals/reports/iterations/iteration-5-report.md +0 -149
  607. package/evals/reports/iterations/iteration-6-report.md +0 -136
  608. package/evals/reports/runtime/always-on-runtime-1-report.md +0 -107
  609. package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +0 -52
  610. package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +0 -410
  611. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +0 -203
  612. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +0 -51
  613. package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +0 -99
  614. package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +0 -166
  615. package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +0 -96
  616. package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +0 -151
  617. package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +0 -233
  618. package/evals/reports/runtime/jq-script-derive-execution-1-report.md +0 -215
  619. package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +0 -67
  620. package/evals/reports/runtime/output-router-benchmark-1-report.md +0 -81
  621. package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +0 -35
  622. package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +0 -150
  623. package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +0 -46
  624. package/evals/reports/runtime/output-router-command-benchmark-1-report.md +0 -62
  625. package/evals/reports/runtime/output-router-index-benchmark-1-report.md +0 -64
  626. package/evals/reports/runtime/output-router-regression-1-report.md +0 -81
  627. package/evals/reports/runtime/output-router-transform-eval-1-report.md +0 -28
  628. package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +0 -44
  629. package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +0 -159
  630. package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +0 -55
  631. package/evals/reports/runtime/render-format-row-protocol-1-report.md +0 -58
  632. package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +0 -84
  633. package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +0 -51
  634. package/evals/reports/runtime/storage-policy-benchmark-1-report.md +0 -176
  635. package/evals/reports/runtime/vault-index-storage-spike-1-report.md +0 -39
  636. package/evals/reports/runtime/workflow-context-hook-1-report.md +0 -82
  637. package/evals/runbooks/adversarial-eval-runbook.md +0 -28
  638. package/evals/runbooks/fixture-eval-runbook.md +0 -137
  639. package/evals/runbooks/handoff-eval-runbook.md +0 -22
  640. package/evals/runbooks/verify-work-eval-runbook.md +0 -27
  641. package/evals/scripts/audit-command-surface.sh +0 -160
  642. package/evals/scripts/check-activation-contract.sh +0 -121
  643. package/evals/scripts/check-runtime-context-hook.sh +0 -183
  644. package/evals/scripts/grade-fixture-eval.sh +0 -446
  645. package/evals/scripts/run-claude-fixture-eval.sh +0 -26
  646. package/evals/scripts/run-codex-fixture-eval.sh +0 -26
  647. package/evals/scripts/run-eryx-python-proof-spike.js +0 -559
  648. package/evals/scripts/run-fixture-eval-by-id.sh +0 -23
  649. package/evals/scripts/run-fixture-eval.sh +0 -464
  650. package/evals/scripts/run-jq-wasm-proof-spike.js +0 -299
  651. package/evals/scripts/run-output-router-transform-eval.js +0 -115
  652. package/evals/scripts/run-pi-observed-routing-eval.js +0 -478
  653. package/evals/scripts/run-quickjs-wasi-proof-spike.js +0 -339
  654. package/evals/scripts/skill-evidence.sh +0 -316
  655. package/evals/scripts/validate-release-metadata.sh +0 -486
  656. package/evals/suites/v0.1-acceptance-suite.md +0 -131
  657. package/pi-extension/dist/host-producer-identification.js +0 -186
  658. package/pi-extension/dist/mcp-config.js +0 -30
  659. package/pi-extension/dist/native-safety-net.js +0 -209
  660. package/pi-extension/dist/observed-tool-routing.js +0 -114
  661. package/pi-extension/dist/renderers.js +0 -835
  662. package/pi-extension/dist/router-tools.js +0 -438
  663. package/pi-extension/dist/runtime-context.js +0 -288
  664. package/pi-extension/dist/schemas.js +0 -254
  665. package/pi-extension/dist/status.js +0 -449
  666. package/pi-extension/dist/utils.js +0 -467
  667. package/pi-extension/src/runtime-context.ts +0 -347
  668. package/pi-extension/src/status.ts +0 -505
  669. package/plugin-docs/README.md +0 -40
  670. package/plugin-docs/adr/0001-three-modes.md +0 -27
  671. package/plugin-docs/adr/0002-evals-before-hooks.md +0 -17
  672. package/plugin-docs/adr/0003-release-boundary.md +0 -21
  673. package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +0 -26
  674. package/plugin-docs/adr/README.md +0 -10
  675. package/plugin-docs/architecture.md +0 -89
  676. package/plugin-docs/output-router.md +0 -396
  677. package/plugin-docs/release-evidence.md +0 -77
  678. package/plugin-docs/skills.md +0 -44
  679. package/plugin-docs/workflow.md +0 -57
  680. package/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
  681. package/skills/discover/ARTIFACT-DESTINATIONS.md +0 -58
  682. package/skills/discover/CHECKPOINTS.md +0 -74
  683. package/skills/discover/SKILL.md +0 -173
  684. package/skills/evaluate-skill/references/eval-patterns.md +0 -41
  685. package/skills/evaluate-skill/references/grading-priority.md +0 -33
  686. package/skills/execute-plan/SKILL.md +0 -133
  687. package/skills/execute-plan/references/execution-map.md +0 -122
  688. package/skills/interview-gate/SKILL.md +0 -90
  689. package/skills/workflow/references/workflow-map.md +0 -104
  690. /package/pi-extension/src/{mcp-config.ts → integrations/mcp-config.ts} +0 -0
@@ -0,0 +1,895 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+
5
+ import { normalizeFreeflowConfig, normalizeLocalFreeflowConfig } from "../../../router/dist/index.js";
6
+
7
+ export const VALID_MODES = new Set(["conversation", "workflow", "strict-workflow"]);
8
+
9
+ export const WORKFLOW_COMMANDS = [
10
+ { command: "discuss", skill: "discuss" },
11
+ { command: "discover", skill: "discuss" },
12
+ { command: "track-work", skill: "track-work" },
13
+ { command: "write-spec", skill: "write-spec" },
14
+ { command: "review-artifact", skill: "review-artifact" },
15
+ { command: "write-plan", skill: "write-plan" },
16
+ { command: "execute-work", skill: "execute-work" },
17
+ { command: "execute-plan", skill: "execute-work" },
18
+ { command: "simplify-code", skill: "simplify-code" },
19
+ { command: "migration-work", skill: "migration-work" },
20
+ { command: "diagnose-failure", skill: "diagnose-failure" },
21
+ { command: "verify-work", skill: "verify-work" },
22
+ { command: "review-work", skill: "review-work" },
23
+ { command: "commit-work", skill: "commit-work" },
24
+ { command: "handoff", skill: "handoff" },
25
+ { command: "finish-branch", skill: "finish-branch" },
26
+ { command: "release-work", skill: "release-work" },
27
+ { command: "launch-work", skill: "launch-work" },
28
+ { command: "bypass", skill: "bypass" },
29
+ ];
30
+
31
+ export const CONTRIBUTOR_COMMANDS = ["setup-freeflow", "write-skill", "evaluate-skill"];
32
+
33
+ export const FREEFLOW_MODEL_SKILL_NAMES = [
34
+ "bypass",
35
+ "commit-work",
36
+ "decision-gate",
37
+ "migration-work",
38
+ "design-for-depth",
39
+ "diagnose-failure",
40
+ "discuss",
41
+ "evaluate-skill",
42
+ "execute-work",
43
+ "finish-branch",
44
+ "handoff",
45
+ "mode-contract",
46
+ "release-work",
47
+ "review-artifact",
48
+ "review-work",
49
+ "setup-freeflow",
50
+ "launch-work",
51
+ "simplify-code",
52
+ "tdd",
53
+ "track-work",
54
+ "verify-work",
55
+ "workflow",
56
+ "write-plan",
57
+ "write-skill",
58
+ "write-spec",
59
+ ];
60
+
61
+ export function freeflowSkillPath(skillName) {
62
+ return fileURLToPath(new URL(`../../../skills/${skillName}/SKILL.md`, import.meta.url));
63
+ }
64
+
65
+ export function freeflowModelSkillPaths() {
66
+ return FREEFLOW_MODEL_SKILL_NAMES.map((skillName) => freeflowSkillPath(skillName));
67
+ }
68
+
69
+ type SessionCoreKey = "enabled" | "interactionContract" | "skillsEnabled";
70
+ type SessionCoreOverrides = Partial<Record<SessionCoreKey, boolean>>;
71
+
72
+ const MODE_STATE_ENTRY = "freeflow-mode";
73
+ const SESSION_OVERRIDES_ENTRY = "freeflow-session-overrides";
74
+ const SESSION_CORE_KEYS = new Set<SessionCoreKey>(["enabled", "interactionContract", "skillsEnabled"]);
75
+ const RESET_MODE_ARGS = new Set(["reset"]);
76
+
77
+ export const FREEFLOW_STATUS_TOOL_NAME = "freeflow_status";
78
+ export const OUTPUT_ROUTER_TOOL_NAMES = ["freeflow_search", "freeflow_run", "freeflow_batch"];
79
+ export const WORKFLOW_BOOTSTRAP_MESSAGE_TYPE = "freeflow-workflow-bootstrap";
80
+
81
+ let runtimeContextCache = null;
82
+ let currentModeOverride = null;
83
+ let currentSessionOverrides: SessionCoreOverrides = {};
84
+ let lastRouterConfigWarningKey = null;
85
+ async function loadRuntimeContext(capabilityState = undefined) {
86
+ const interactionContractEnabled = capabilityState?.interactionContract?.effective === true;
87
+ const skillsEnabled = capabilityState?.skills?.effective === true;
88
+ const outputRouterEnabled = capabilityState?.outputRouter?.enabled === true;
89
+ const [interactionContract, workflowSkill, outputRouterSkill] = await Promise.all([
90
+ interactionContractEnabled
91
+ ? readFile(new URL("../../../runtime/interaction-contract.md", import.meta.url), "utf8")
92
+ : Promise.resolve(null),
93
+ skillsEnabled
94
+ ? readFile(new URL("../../../skills/workflow/SKILL.md", import.meta.url), "utf8")
95
+ : Promise.resolve(null),
96
+ outputRouterEnabled
97
+ ? readFile(new URL("../../../skills/output-router/SKILL.md", import.meta.url), "utf8")
98
+ : Promise.resolve(null),
99
+ ]);
100
+
101
+ return { interactionContract, workflowSkill, outputRouterSkill };
102
+ }
103
+
104
+ function runtimeContextCacheSatisfies(capabilityState) {
105
+ if (!runtimeContextCache) {
106
+ return false;
107
+ }
108
+ if (capabilityState?.interactionContract?.effective === true && !runtimeContextCache.interactionContract) {
109
+ return false;
110
+ }
111
+ if (capabilityState?.skills?.effective === true && !runtimeContextCache.workflowSkill) {
112
+ return false;
113
+ }
114
+ if (capabilityState?.outputRouter?.enabled === true && !runtimeContextCache.outputRouterSkill) {
115
+ return false;
116
+ }
117
+ return true;
118
+ }
119
+
120
+ export async function refreshRuntimeContext(capabilityState = undefined) {
121
+ runtimeContextCache = await loadRuntimeContext(capabilityState);
122
+ return runtimeContextCache;
123
+ }
124
+
125
+ export async function getRuntimeContext(capabilityState = undefined) {
126
+ if (runtimeContextCacheSatisfies(capabilityState)) {
127
+ return runtimeContextCache;
128
+ }
129
+ return refreshRuntimeContext(capabilityState);
130
+ }
131
+
132
+ function activeSessionEntries(sessionManager) {
133
+ try {
134
+ if (typeof sessionManager?.buildContextEntries === "function") {
135
+ const entries = sessionManager.buildContextEntries();
136
+ if (Array.isArray(entries)) {
137
+ return entries;
138
+ }
139
+ }
140
+ if (typeof sessionManager?.getEntries === "function") {
141
+ const entries = sessionManager.getEntries();
142
+ if (Array.isArray(entries)) {
143
+ return entries;
144
+ }
145
+ }
146
+ } catch {
147
+ // A missing session snapshot should reload useful context rather than suppress it.
148
+ }
149
+ return [];
150
+ }
151
+
152
+ export function workflowBootstrapMessage(freeflowContext, capabilityState, sessionManager) {
153
+ if (capabilityState?.skills?.effective !== true || !freeflowContext?.workflowSkill) {
154
+ return undefined;
155
+ }
156
+
157
+ const alreadyLoaded = activeSessionEntries(sessionManager).some(
158
+ (entry) => entry?.type === "custom_message" && entry?.customType === WORKFLOW_BOOTSTRAP_MESSAGE_TYPE,
159
+ );
160
+ if (alreadyLoaded) {
161
+ return undefined;
162
+ }
163
+
164
+ return {
165
+ customType: WORKFLOW_BOOTSTRAP_MESSAGE_TYPE,
166
+ content: `# Freeflow Workflow Bootstrap\n\n${freeflowContext.workflowSkill.trim()}`,
167
+ display: false,
168
+ details: { skill: "workflow", source: "first-turn-bootstrap" },
169
+ };
170
+ }
171
+
172
+ function isRecord(value) {
173
+ return typeof value === "object" && value !== null && !Array.isArray(value);
174
+ }
175
+
176
+ function validateCoreConfigFields(value) {
177
+ if (value.defaultMode !== undefined && !VALID_MODES.has(value.defaultMode)) {
178
+ return `invalid defaultMode: ${JSON.stringify(value.defaultMode)}`;
179
+ }
180
+
181
+ if (value.enabled !== undefined && typeof value.enabled !== "boolean") {
182
+ return "enabled must be a boolean";
183
+ }
184
+
185
+ if (value.interactionContract !== undefined && typeof value.interactionContract !== "boolean") {
186
+ return "interactionContract must be a boolean";
187
+ }
188
+
189
+ if (value.skills !== undefined) {
190
+ if (!isRecord(value.skills)) {
191
+ return "skills must be an object";
192
+ }
193
+ for (const key of Object.keys(value.skills)) {
194
+ if (key !== "enabled") {
195
+ return `unsupported skills config key: ${key}`;
196
+ }
197
+ }
198
+ if (value.skills.enabled !== undefined && typeof value.skills.enabled !== "boolean") {
199
+ return "skills.enabled must be a boolean";
200
+ }
201
+ }
202
+
203
+ return null;
204
+ }
205
+
206
+ function validateFreeflowConfigShape(value) {
207
+ if (!isRecord(value)) {
208
+ return "config must be a JSON object";
209
+ }
210
+
211
+ const allowedKeys = new Set([
212
+ "enabled",
213
+ "defaultMode",
214
+ "interactionContract",
215
+ "skills",
216
+ "outputRouter",
217
+ "observedRouting",
218
+ "scriptTransform",
219
+ ]);
220
+ for (const key of Object.keys(value)) {
221
+ if (!allowedKeys.has(key)) {
222
+ return `unsupported top-level config key: ${key}`;
223
+ }
224
+ }
225
+
226
+ const coreError = validateCoreConfigFields(value);
227
+ if (coreError) return coreError;
228
+
229
+ for (const key of ["outputRouter", "observedRouting", "scriptTransform"]) {
230
+ if (value[key] !== undefined && !isRecord(value[key])) {
231
+ return `${key} must be an object`;
232
+ }
233
+ }
234
+
235
+ return null;
236
+ }
237
+
238
+ function validateFreeflowLocalConfigShape(value) {
239
+ if (!isRecord(value)) {
240
+ return "local config must be a JSON object";
241
+ }
242
+
243
+ const allowedKeys = new Set(["enabled", "defaultMode", "interactionContract", "skills", "processing"]);
244
+ for (const key of Object.keys(value)) {
245
+ if (!allowedKeys.has(key)) {
246
+ return `unsupported top-level local config key: ${key}`;
247
+ }
248
+ }
249
+
250
+ return validateCoreConfigFields(value);
251
+ }
252
+
253
+ async function readConfigFileState(path, validate) {
254
+ try {
255
+ const raw = await readFile(path, "utf8");
256
+ const parsed = JSON.parse(raw);
257
+ const validationError = validate(parsed);
258
+ if (validationError) {
259
+ return {
260
+ path,
261
+ exists: true,
262
+ valid: false,
263
+ parsed: {},
264
+ parseError: validationError,
265
+ };
266
+ }
267
+ return { path, exists: true, valid: true, parsed, parseError: null };
268
+ } catch (error) {
269
+ const code = error && typeof error === "object" ? error.code : undefined;
270
+ if (code === "ENOENT") {
271
+ return {
272
+ path,
273
+ exists: false,
274
+ valid: false,
275
+ parsed: {},
276
+ parseError: null,
277
+ };
278
+ }
279
+ const message = error instanceof Error ? error.message : String(error);
280
+ return {
281
+ path,
282
+ exists: true,
283
+ valid: false,
284
+ parsed: {},
285
+ parseError: message,
286
+ };
287
+ }
288
+ }
289
+
290
+ export function readFreeflowConfigState(cwd) {
291
+ return readConfigFileState(join(cwd, ".freeflow/config.json"), validateFreeflowConfigShape);
292
+ }
293
+
294
+ export function readFreeflowLocalConfigState(cwd) {
295
+ return readConfigFileState(join(cwd, ".freeflow/local.json"), validateFreeflowLocalConfigShape);
296
+ }
297
+
298
+ export async function readFreeflowConfig(cwd) {
299
+ const state = await readFreeflowConfigState(cwd);
300
+ return state.valid ? state.parsed : {};
301
+ }
302
+
303
+ export async function readFreeflowLocalConfig(cwd) {
304
+ const state = await readFreeflowLocalConfigState(cwd);
305
+ return state.valid ? state.parsed : {};
306
+ }
307
+
308
+ function resolveLayeredValue(repository, local, key, fallback) {
309
+ if (Object.hasOwn(local, key)) {
310
+ return { value: local[key], source: "local" };
311
+ }
312
+ if (Object.hasOwn(repository, key)) {
313
+ return { value: repository[key], source: "repository" };
314
+ }
315
+ return { value: fallback, source: "builtin" };
316
+ }
317
+
318
+ function resolveCoreConfig(repository, local) {
319
+ const enabled = resolveLayeredValue(repository, local, "enabled", true);
320
+ const interactionContract = resolveLayeredValue(repository, local, "interactionContract", true);
321
+ const defaultMode = resolveLayeredValue(repository, local, "defaultMode", "workflow");
322
+ const repositorySkills = isRecord(repository.skills) ? repository.skills : {};
323
+ const localSkills = isRecord(local.skills) ? local.skills : {};
324
+ const skillsEnabled = resolveLayeredValue(repositorySkills, localSkills, "enabled", true);
325
+
326
+ return {
327
+ config: {
328
+ enabled: enabled.value,
329
+ interactionContract: interactionContract.value,
330
+ skills: { enabled: skillsEnabled.value },
331
+ defaultMode: defaultMode.value,
332
+ },
333
+ sources: {
334
+ enabled: enabled.source,
335
+ interactionContract: interactionContract.source,
336
+ skillsEnabled: skillsEnabled.source,
337
+ defaultMode: defaultMode.source,
338
+ },
339
+ };
340
+ }
341
+
342
+ function normalizeSessionOverrides(value): SessionCoreOverrides {
343
+ if (!isRecord(value)) return {};
344
+ const overrides: SessionCoreOverrides = {};
345
+ for (const key of SESSION_CORE_KEYS) {
346
+ if (typeof value[key] === "boolean") {
347
+ overrides[key] = value[key];
348
+ }
349
+ }
350
+ return overrides;
351
+ }
352
+
353
+ function resolveSessionCoreConfig(layers) {
354
+ const configured = layers.coreConfig;
355
+ const sources = layers.sources;
356
+ const enabled = currentSessionOverrides.enabled;
357
+ const interactionContract = currentSessionOverrides.interactionContract;
358
+ const skillsEnabled = currentSessionOverrides.skillsEnabled;
359
+
360
+ return {
361
+ config: {
362
+ enabled: typeof enabled === "boolean" ? enabled : configured.enabled,
363
+ interactionContract:
364
+ typeof interactionContract === "boolean" ? interactionContract : configured.interactionContract,
365
+ skills: { enabled: typeof skillsEnabled === "boolean" ? skillsEnabled : configured.skills.enabled },
366
+ defaultMode: configured.defaultMode,
367
+ },
368
+ sources: {
369
+ enabled: typeof enabled === "boolean" ? "session" : sources.enabled,
370
+ interactionContract: typeof interactionContract === "boolean" ? "session" : sources.interactionContract,
371
+ skillsEnabled: typeof skillsEnabled === "boolean" ? "session" : sources.skillsEnabled,
372
+ defaultMode: sources.defaultMode,
373
+ },
374
+ };
375
+ }
376
+
377
+ export async function readFreeflowConfigLayers(cwd) {
378
+ const [repository, local] = await Promise.all([readFreeflowConfigState(cwd), readFreeflowLocalConfigState(cwd)]);
379
+ const repositoryConfig = repository.valid ? repository.parsed : {};
380
+ const localConfig = local.valid ? local.parsed : {};
381
+ const core = resolveCoreConfig(repositoryConfig, localConfig);
382
+ const localValid = !local.exists || local.valid;
383
+ const configured = repository.valid && localValid;
384
+ let blockingState = null;
385
+ if (!repository.valid) {
386
+ blockingState = repository;
387
+ } else if (local.exists && !local.valid) {
388
+ blockingState = local;
389
+ }
390
+
391
+ return {
392
+ configured,
393
+ repositoryConfigured: repository.valid,
394
+ repository,
395
+ local,
396
+ coreConfig: core.config,
397
+ sources: core.sources,
398
+ blockingConfigPath: blockingState?.path ?? null,
399
+ parseError: blockingState?.parseError ?? null,
400
+ };
401
+ }
402
+
403
+ export async function readCapabilityState(cwd) {
404
+ const layers = await readFreeflowConfigLayers(cwd);
405
+ const parsed = layers.repository.valid ? layers.repository.parsed : {};
406
+ const normalized = normalizeFreeflowConfig(parsed);
407
+ const effectiveCore = resolveSessionCoreConfig(layers);
408
+ const enabled = layers.configured && effectiveCore.config.enabled;
409
+ const interactionContractConfigEnabled = effectiveCore.config.interactionContract;
410
+ const skillsConfigEnabled = effectiveCore.config.skills.enabled;
411
+ const outputRouterConfigEnabled = normalized.config.outputRouter.enabled;
412
+ return {
413
+ configured: layers.configured,
414
+ repositoryConfigured: layers.repositoryConfigured,
415
+ configExists: layers.repository.exists,
416
+ configValid: layers.configured,
417
+ configPath: layers.blockingConfigPath ?? layers.repository.path,
418
+ parseError: layers.parseError,
419
+ localConfigExists: layers.local.exists,
420
+ localConfigValid: !layers.local.exists || layers.local.valid,
421
+ localConfigPath: layers.local.path,
422
+ localConfigParseError: layers.local.parseError,
423
+ configuredCoreConfig: layers.coreConfig,
424
+ configuredSources: layers.sources,
425
+ sessionOverrides: { ...currentSessionOverrides },
426
+ configSources: effectiveCore.sources,
427
+ defaultMode: effectiveCore.config.defaultMode,
428
+ enabled,
429
+ interactionContract: {
430
+ enabled: interactionContractConfigEnabled,
431
+ effective: enabled && interactionContractConfigEnabled,
432
+ },
433
+ skills: {
434
+ enabled: skillsConfigEnabled,
435
+ effective: enabled && skillsConfigEnabled,
436
+ },
437
+ outputRouter: {
438
+ enabled: enabled && outputRouterConfigEnabled,
439
+ configEnabled: outputRouterConfigEnabled,
440
+ },
441
+ };
442
+ }
443
+
444
+ export const readRuntimeState = readCapabilityState;
445
+
446
+ export async function readOutputRouterConfig(cwd) {
447
+ const layers = await readFreeflowConfigLayers(cwd);
448
+ const parsed = layers.repository.valid ? layers.repository.parsed : {};
449
+ const localParsed = layers.local.valid ? layers.local.parsed : {};
450
+ const normalized = normalizeFreeflowConfig(parsed);
451
+ const local = normalizeLocalFreeflowConfig(localParsed);
452
+ const freeflowEnabled = layers.configured && layers.coreConfig.enabled;
453
+ const effectiveConfig = freeflowEnabled
454
+ ? normalized.config
455
+ : {
456
+ ...normalized.config,
457
+ outputRouter: { ...normalized.config.outputRouter, enabled: false },
458
+ observedRouting: {
459
+ ...normalized.config.observedRouting,
460
+ enabled: false,
461
+ },
462
+ scriptTransform: {
463
+ ...normalized.config.scriptTransform,
464
+ enabled: false,
465
+ },
466
+ };
467
+ const configWarnings = [...normalized.warnings];
468
+ if (layers.repository.exists && !layers.repository.valid) {
469
+ configWarnings.unshift(
470
+ `.freeflow/config.json could not be parsed; Freeflow runtime is inactive. ${layers.repository.parseError ?? ""}`.trim(),
471
+ );
472
+ }
473
+ if (layers.local.exists && !layers.local.valid) {
474
+ configWarnings.unshift(
475
+ `.freeflow/local.json could not be parsed; Freeflow runtime is inactive. ${layers.local.parseError ?? ""}`.trim(),
476
+ );
477
+ }
478
+ return {
479
+ config: effectiveConfig.outputRouter,
480
+ freeflowConfig: effectiveConfig,
481
+ localConfig: local.config,
482
+ warnings: [...configWarnings, ...local.warnings],
483
+ };
484
+ }
485
+
486
+ export function notifyRouterConfigWarnings(ctx, routerConfigResult) {
487
+ if (!routerConfigResult.warnings.length) {
488
+ return;
489
+ }
490
+
491
+ const key = routerConfigResult.warnings.join("\n");
492
+ if (key === lastRouterConfigWarningKey) {
493
+ return;
494
+ }
495
+
496
+ lastRouterConfigWarningKey = key;
497
+ ctx.ui.notify(`Freeflow config warning: ${routerConfigResult.warnings.join(" ")}`, "warning");
498
+ }
499
+
500
+ export function restoreModeOverride(ctx) {
501
+ currentModeOverride = null;
502
+ currentSessionOverrides = {};
503
+ const entries = ctx.sessionManager?.getBranch?.() ?? ctx.sessionManager?.getEntries?.() ?? [];
504
+
505
+ for (const entry of entries) {
506
+ if (entry.type !== "custom") continue;
507
+ if (entry.customType === MODE_STATE_ENTRY) {
508
+ const mode = entry.data?.currentMode;
509
+ currentModeOverride = VALID_MODES.has(mode) ? mode : null;
510
+ } else if (entry.customType === SESSION_OVERRIDES_ENTRY) {
511
+ currentSessionOverrides = normalizeSessionOverrides(entry.data?.overrides);
512
+ }
513
+ }
514
+ }
515
+
516
+ export async function readModeState(cwd) {
517
+ const layers = await readFreeflowConfigLayers(cwd);
518
+ const effectiveCore = resolveSessionCoreConfig(layers);
519
+ const repositoryDefaultMode = VALID_MODES.has(layers.repository.parsed.defaultMode)
520
+ ? layers.repository.parsed.defaultMode
521
+ : "workflow";
522
+ const personalDefaultMode = VALID_MODES.has(layers.local.parsed.defaultMode) ? layers.local.parsed.defaultMode : null;
523
+ const sessionMode = VALID_MODES.has(currentModeOverride) ? currentModeOverride : null;
524
+ const resolvedMode = sessionMode ?? effectiveCore.config.defaultMode;
525
+ const active = layers.configured && effectiveCore.config.enabled && effectiveCore.config.skills.enabled;
526
+
527
+ return {
528
+ repositoryDefaultMode,
529
+ repositoryDefaultModeSource: VALID_MODES.has(layers.repository.parsed.defaultMode) ? "repository" : "builtin",
530
+ personalDefaultMode,
531
+ defaultMode: effectiveCore.config.defaultMode,
532
+ defaultModeSource: effectiveCore.sources.defaultMode,
533
+ currentMode: sessionMode,
534
+ sessionMode,
535
+ resolvedMode,
536
+ active,
537
+ effectiveMode: active ? resolvedMode : null,
538
+ };
539
+ }
540
+
541
+ export function setModeStatus(ctx, modeState, capabilityState = undefined) {
542
+ if (capabilityState && !capabilityState.configured) {
543
+ ctx.ui.setStatus("freeflow", capabilityState.configExists ? "freeflow: config error" : "freeflow: setup needed");
544
+ return;
545
+ }
546
+ if (capabilityState && !capabilityState.enabled) {
547
+ const source = capabilityState.configSources?.enabled === "session" ? " (session)" : "";
548
+ ctx.ui.setStatus("freeflow", `freeflow: off${source}`);
549
+ return;
550
+ }
551
+
552
+ const active: string[] = [];
553
+ if (capabilityState?.interactionContract.effective) {
554
+ active.push("interaction");
555
+ } else if (capabilityState?.configSources?.interactionContract === "session") {
556
+ active.push("interaction off (session)");
557
+ }
558
+ if (capabilityState?.skills.effective) {
559
+ active.push(`${modeState.effectiveMode}${modeState.currentMode ? " (session)" : ""}`);
560
+ } else if (capabilityState?.configSources?.skillsEnabled === "session") {
561
+ active.push("skills off (session)");
562
+ }
563
+ if (capabilityState?.outputRouter.enabled) {
564
+ active.push("router");
565
+ }
566
+ ctx.ui.setStatus("freeflow", `freeflow: ${active.length > 0 ? active.join(" · ") : "idle"}`);
567
+ }
568
+
569
+ function modeSourceLabel(source) {
570
+ if (source === "local") return "personal override";
571
+ if (source === "repository") return "repository default";
572
+ return "built-in default";
573
+ }
574
+
575
+ function describeModeState(modeState) {
576
+ const configuredDefault = `configured default ${modeState.defaultMode} (${modeSourceLabel(modeState.defaultModeSource)})`;
577
+ if (modeState.sessionMode) {
578
+ return `session ${modeState.sessionMode}; ${configuredDefault}`;
579
+ }
580
+ return configuredDefault;
581
+ }
582
+
583
+ export function skillPrompt(skill, args) {
584
+ const trimmed = args?.trim();
585
+ return trimmed ? `/skill:${skill}\n\n${trimmed}` : `/skill:${skill}`;
586
+ }
587
+
588
+ function outputRouterModeGuidance(mode, skillsEnabled = true) {
589
+ if (!skillsEnabled) {
590
+ return "Freeflow Skills are disabled: no Freeflow workflow mode is active; apply only output-router evidence guidance.";
591
+ }
592
+ if (mode === "conversation") {
593
+ return "conversation mode: keep routed-tool guidance soft; answer questions directly.";
594
+ }
595
+ if (mode === "strict-workflow") {
596
+ return "strict-workflow mode: strongest guidance; prefer exact, recoverable routed evidence for risky work.";
597
+ }
598
+ return "workflow mode: prefer routed tools for exploration and likely-large command output.";
599
+ }
600
+
601
+ function outputRouterContext(modeState, freeflowContext, routerConfigResult, capabilityState) {
602
+ const safetyNetText =
603
+ routerConfigResult.config.postToolRouting === "off"
604
+ ? ""
605
+ : "\n\nOutput-router config note: large native read/bash outputs may be vaulted and replaced with labeled routed output. Use freeflow_search with the output id to recover exact content.";
606
+
607
+ return `## Loaded Output Router Skill
608
+
609
+ Mode guidance: ${outputRouterModeGuidance(modeState.effectiveMode, capabilityState.skills.effective)}${safetyNetText}
610
+
611
+ \`\`\`md
612
+ ${freeflowContext.outputRouterSkill.trim()}
613
+ \`\`\``;
614
+ }
615
+
616
+ function capabilityContext(capabilityState) {
617
+ const sessionSuffix = (source) => (source === "session" ? " (session override)" : "");
618
+ const interactionContract = `${capabilityState.interactionContract.effective ? "enabled" : "disabled"}${sessionSuffix(
619
+ capabilityState.configSources.interactionContract,
620
+ )}`;
621
+ const skills = `${capabilityState.skills.effective ? "enabled" : "disabled"}${sessionSuffix(
622
+ capabilityState.configSources.skillsEnabled,
623
+ )}`;
624
+ const outputRouter = capabilityState.outputRouter.enabled ? "enabled" : "disabled";
625
+ return `## Freeflow Capabilities
626
+
627
+ - Interaction contract: ${interactionContract}. Configure with \`/freeflow settings\` or temporarily with \`/freeflow settings session\`; inspect with \`/freeflow status\`.
628
+ - Skills: ${skills}. Configure with \`/freeflow settings\` or temporarily with \`/freeflow settings session\`; inspect with \`/freeflow status\`.
629
+ - Output router: ${outputRouter}. Configure with \`/freeflow settings\` or \`/output-router\`; inspect with \`/output-router status\`.
630
+
631
+ Disabled capabilities are named only for status/config awareness. Capability-specific instructions and tools are active only while that capability is enabled.`;
632
+ }
633
+
634
+ function hasModelFacingCapability(capabilityState) {
635
+ return (
636
+ capabilityState.interactionContract.effective ||
637
+ capabilityState.skills.effective ||
638
+ capabilityState.outputRouter.enabled
639
+ );
640
+ }
641
+
642
+ function modeOverlayContext(mode) {
643
+ if (mode === "conversation") {
644
+ return `
645
+
646
+ ## Conversation Mode Boundary
647
+
648
+ Conversation mode is active and read-only.
649
+
650
+ Do not call write, edit, or mutating tools. Do not create, delete, commit, push, or change repository, system, external, or durable state.
651
+
652
+ A mutation request does not switch mode, and an execution skill does not override this boundary. Explain that conversation mode is read-only and ask the user to switch to workflow or strict-workflow.`;
653
+ }
654
+
655
+ if (mode === "strict-workflow") {
656
+ return `
657
+
658
+ ## Strict Workflow Overlay
659
+
660
+ Strict Workflow is active. Use the adaptive Workflow, but increase decision, evidence, verification, and checkpoint pressure at high-risk or hard-to-reverse boundaries.
661
+
662
+ For work affecting security, privacy, billing, data loss, migrations, public interfaces, compatibility, deployment, or architecture:
663
+
664
+ - stop for any user-owned choice or source conflict;
665
+ - inspect the relevant risk surface before crossing the boundary;
666
+ - select only artifacts, checkpoints, and independent review that materially reduce risk;
667
+ - verify at the affected boundary before claiming success.
668
+
669
+ Do not manufacture ceremony for low-risk, reversible work. Strict Workflow does not authorize mutation, bypass safety, or make every implementation detail a user decision.`;
670
+ }
671
+
672
+ return "";
673
+ }
674
+
675
+ function activeModeContext(modeState) {
676
+ return `## Freeflow Mode State
677
+
678
+ Repository default mode: \`${modeState.repositoryDefaultMode}\` (${modeState.repositoryDefaultModeSource}).
679
+ Personal default override: \`${modeState.personalDefaultMode ?? "none"}\`.
680
+ Configured default mode: \`${modeState.defaultMode}\` (${modeSourceLabel(modeState.defaultModeSource)}).
681
+ Session mode override: \`${modeState.sessionMode ?? "none"}\`.
682
+ Resolved mode: \`${modeState.resolvedMode}\`.
683
+ Effective Freeflow mode: \`${modeState.effectiveMode}\`.
684
+
685
+ Mode behavior:
686
+ - \`conversation\`: answer, discuss, critique, and inspect read-only; require a mode change before mutating state.
687
+ - \`workflow\`: use the adaptive workflow for consequential or mutating work.
688
+ - \`strict-workflow\`: use the same workflow with stronger decision, evidence, and checkpoint pressure at high-risk or hard-to-reverse boundaries.
689
+
690
+ Task type, risk classification, and direct skill calls do not change mode. Recommend another mode when useful; the user decides.
691
+ Do not announce mode on every reply. Mention it when the user asks, configuration is discussed, or it changes the next action.${modeOverlayContext(modeState.effectiveMode)}`;
692
+ }
693
+
694
+ function inactiveModeContext(modeState) {
695
+ return `## Freeflow Mode State
696
+
697
+ Repository default mode: \`${modeState.repositoryDefaultMode}\` (${modeState.repositoryDefaultModeSource}).
698
+ Personal default override: \`${modeState.personalDefaultMode ?? "none"}\`.
699
+ Configured default mode: \`${modeState.defaultMode}\` (${modeSourceLabel(modeState.defaultModeSource)}).
700
+ Session mode override: \`${modeState.sessionMode ?? "none"}\`.
701
+ Resolved mode: \`${modeState.resolvedMode}\` (inactive because Skills are disabled).
702
+ Effective Freeflow mode: \`none\`.
703
+
704
+ Freeflow workflow modes are dormant until Skills are enabled with \`/freeflow settings\`.`;
705
+ }
706
+
707
+ function controlPlaneContext(modeState, capabilityState) {
708
+ return `# Freeflow Control Plane
709
+
710
+ Freeflow is enabled for this repo, but no model-facing capabilities are enabled.
711
+ These lines are status/config awareness only; do not apply Freeflow workflow or output-router behavior.
712
+
713
+ ${inactiveModeContext(modeState)}
714
+
715
+ ${capabilityContext(capabilityState)}
716
+
717
+ Use \`/freeflow settings\` to enable the Interaction Contract, Skills, or Output Router. The read-only \`freeflow_status\` diagnostic may be available so the model can answer setup/status questions.`;
718
+ }
719
+
720
+ export function runtimeContext(modeState, freeflowContext, routerConfigResult, capabilityState) {
721
+ if (!capabilityState.configured) {
722
+ return "";
723
+ }
724
+
725
+ if (!capabilityState.enabled) {
726
+ return `# Freeflow Disabled
727
+
728
+ Freeflow is disabled by \`.freeflow/config.json\` for this repo. Do not apply the Freeflow Interaction Contract, workflow, or output-router behavior unless the user re-enables Freeflow with \`/freeflow enable\` or \`/freeflow settings\`.
729
+
730
+ These instructions are context-loading only. They do not override user instructions, repo instructions, or host safety and approval policy.`;
731
+ }
732
+
733
+ if (!hasModelFacingCapability(capabilityState)) {
734
+ return controlPlaneContext(modeState, capabilityState);
735
+ }
736
+
737
+ const modeText = capabilityState.skills.effective ? activeModeContext(modeState) : inactiveModeContext(modeState);
738
+ const interactionContractText = capabilityState.interactionContract.effective
739
+ ? `\n\n${freeflowContext.interactionContract.trim()}`
740
+ : "";
741
+ const routerText =
742
+ capabilityState.outputRouter.enabled && routerConfigResult.config.enabled
743
+ ? `\n\n${outputRouterContext(modeState, freeflowContext, routerConfigResult, capabilityState)}`
744
+ : "";
745
+
746
+ return `# Freeflow Runtime Context
747
+
748
+ Freeflow Pi extension loaded this before the agent turn.
749
+ Runtime delivery: confirmed for this Pi \`before_agent_start\` invocation.
750
+ These instructions are context-loading only. They do not override user instructions, repo instructions, or host safety and approval policy.
751
+
752
+ ${modeText}
753
+
754
+ ${capabilityContext(capabilityState)}${interactionContractText}${routerText}
755
+
756
+ This Pi extension loads enabled runtime context before every agent turn and routes commands only; it does not enforce policy, block tools, grant permissions, or create repo-local hooks.`;
757
+ }
758
+
759
+ export async function setSessionCoreOverride(key: SessionCoreKey, value: boolean | null, ctx, pi) {
760
+ if (!SESSION_CORE_KEYS.has(key)) {
761
+ throw new Error(`Invalid Freeflow session override: ${String(key)}`);
762
+ }
763
+ if (value !== null && typeof value !== "boolean") {
764
+ throw new Error(`Invalid Freeflow session override value for ${key}: ${String(value)}`);
765
+ }
766
+
767
+ const hasOverride = Object.hasOwn(currentSessionOverrides, key);
768
+ if ((value === null && !hasOverride) || (value !== null && hasOverride && currentSessionOverrides[key] === value)) {
769
+ return { changed: false, sessionOverrides: { ...currentSessionOverrides } };
770
+ }
771
+
772
+ const next = { ...currentSessionOverrides };
773
+ if (value === null) {
774
+ delete next[key];
775
+ } else {
776
+ next[key] = value;
777
+ }
778
+ currentSessionOverrides = next;
779
+ pi?.appendEntry?.(SESSION_OVERRIDES_ENTRY, { overrides: { ...currentSessionOverrides } });
780
+ return {
781
+ changed: true,
782
+ reloadRequired: key === "enabled" || key === "skillsEnabled",
783
+ sessionOverrides: { ...currentSessionOverrides },
784
+ capabilityState: await readCapabilityState(ctx.cwd),
785
+ };
786
+ }
787
+
788
+ export async function resetSessionOverrides(ctx, pi) {
789
+ const hadCoreOverrides = Object.keys(currentSessionOverrides).length > 0;
790
+ const reloadRequired =
791
+ Object.hasOwn(currentSessionOverrides, "enabled") || Object.hasOwn(currentSessionOverrides, "skillsEnabled");
792
+ const hadModeOverride = VALID_MODES.has(currentModeOverride);
793
+
794
+ if (hadCoreOverrides) {
795
+ currentSessionOverrides = {};
796
+ pi?.appendEntry?.(SESSION_OVERRIDES_ENTRY, { overrides: {} });
797
+ }
798
+ if (hadModeOverride) {
799
+ await setSessionMode(null, ctx, pi);
800
+ }
801
+
802
+ return {
803
+ changed: hadCoreOverrides || hadModeOverride,
804
+ reloadRequired,
805
+ sessionOverrides: { ...currentSessionOverrides },
806
+ modeState: await readModeState(ctx.cwd),
807
+ };
808
+ }
809
+
810
+ export async function setSessionMode(mode, ctx, pi) {
811
+ const nextMode = mode === "default" || mode === "reset" || mode === null ? null : mode;
812
+ if (nextMode !== null && !VALID_MODES.has(nextMode)) {
813
+ throw new Error(`Invalid Freeflow mode: ${String(mode)}`);
814
+ }
815
+ currentModeOverride = nextMode;
816
+ pi?.appendEntry?.(MODE_STATE_ENTRY, { currentMode: nextMode });
817
+ return readModeState(ctx.cwd);
818
+ }
819
+
820
+ export async function handleModeCommand(args, ctx, pi) {
821
+ const arg = args?.trim();
822
+ const capabilityState = await readCapabilityState(ctx.cwd);
823
+ const inactiveModeState = await readModeState(ctx.cwd);
824
+
825
+ if (!capabilityState.configured) {
826
+ setModeStatus(ctx, inactiveModeState, capabilityState);
827
+ ctx.ui.notify(
828
+ "Freeflow is installed but this repo is not set up. Run /setup-freeflow before changing mode.",
829
+ "warning",
830
+ );
831
+ return { changed: false, error: "not_configured" };
832
+ }
833
+ if (!capabilityState.enabled) {
834
+ setModeStatus(ctx, inactiveModeState, capabilityState);
835
+ ctx.ui.notify(
836
+ "Freeflow is disabled for this repo. Use /freeflow enable or /freeflow settings to re-enable it.",
837
+ "warning",
838
+ );
839
+ return { changed: false, error: "freeflow_disabled" };
840
+ }
841
+ if (!capabilityState.skills.effective) {
842
+ setModeStatus(ctx, inactiveModeState, capabilityState);
843
+ ctx.ui.notify(
844
+ `Freeflow modes are inactive because Skills are disabled. Configured default mode: ${inactiveModeState.defaultMode} (${modeSourceLabel(inactiveModeState.defaultModeSource)}). Enable Skills in /freeflow settings before changing mode.`,
845
+ "warning",
846
+ );
847
+ return { changed: false, error: "skills_disabled" };
848
+ }
849
+
850
+ if (VALID_MODES.has(arg)) {
851
+ if (inactiveModeState.effectiveMode === arg) {
852
+ setModeStatus(ctx, inactiveModeState, capabilityState);
853
+ const message = inactiveModeState.sessionMode
854
+ ? `Freeflow is already in ${arg} mode for this Pi session. No session entry was added. Configured default remains ${inactiveModeState.defaultMode} (${modeSourceLabel(inactiveModeState.defaultModeSource)}).`
855
+ : `Freeflow is already in ${arg} mode from the configured default (${modeSourceLabel(inactiveModeState.defaultModeSource)}). No session override was created.`;
856
+ ctx.ui.notify(message, "info");
857
+ return { changed: false, modeState: inactiveModeState };
858
+ }
859
+
860
+ const modeState = await setSessionMode(arg, ctx, pi);
861
+ setModeStatus(ctx, modeState, capabilityState);
862
+ ctx.ui.notify(
863
+ `Freeflow mode is now ${modeState.effectiveMode} for this Pi session. Stored in Pi session history; .freeflow/local.json and .freeflow/config.json were not changed. Configured default remains ${modeState.defaultMode} (${modeSourceLabel(modeState.defaultModeSource)}).`,
864
+ "info",
865
+ );
866
+ return { changed: true, modeState };
867
+ }
868
+
869
+ if (RESET_MODE_ARGS.has(arg) || arg === "default") {
870
+ if (!inactiveModeState.sessionMode) {
871
+ setModeStatus(ctx, inactiveModeState, capabilityState);
872
+ ctx.ui.notify(
873
+ `Freeflow is already using the configured default: ${inactiveModeState.defaultMode} (${modeSourceLabel(inactiveModeState.defaultModeSource)}). No session override is active.`,
874
+ "info",
875
+ );
876
+ return { changed: false, modeState: inactiveModeState };
877
+ }
878
+
879
+ const modeState = await setSessionMode(null, ctx, pi);
880
+ setModeStatus(ctx, modeState, capabilityState);
881
+ ctx.ui.notify(
882
+ `Freeflow mode reset to configured default: ${modeState.defaultMode} (${modeSourceLabel(modeState.defaultModeSource)}). Session override cleared; .freeflow/local.json and .freeflow/config.json were not changed.`,
883
+ "info",
884
+ );
885
+ return { changed: true, modeState };
886
+ }
887
+
888
+ const modeState = await readModeState(ctx.cwd);
889
+ setModeStatus(ctx, modeState, capabilityState);
890
+ ctx.ui.notify(
891
+ `Freeflow mode is ${modeState.effectiveMode} (${describeModeState(modeState)}). Use /freeflow mode conversation, /freeflow mode workflow, /freeflow mode strict-workflow, or /freeflow mode reset.`,
892
+ "info",
893
+ );
894
+ return { changed: false, modeState, error: arg ? "invalid_mode" : undefined };
895
+ }