@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
@@ -0,0 +1,798 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { normalizeFreeflowConfig, normalizeLocalFreeflowConfig } from "../../../router/dist/index.js";
5
+ export const VALID_MODES = new Set(["conversation", "workflow", "strict-workflow"]);
6
+ export const WORKFLOW_COMMANDS = [
7
+ { command: "discuss", skill: "discuss" },
8
+ { command: "discover", skill: "discuss" },
9
+ { command: "track-work", skill: "track-work" },
10
+ { command: "write-spec", skill: "write-spec" },
11
+ { command: "review-artifact", skill: "review-artifact" },
12
+ { command: "write-plan", skill: "write-plan" },
13
+ { command: "execute-work", skill: "execute-work" },
14
+ { command: "execute-plan", skill: "execute-work" },
15
+ { command: "simplify-code", skill: "simplify-code" },
16
+ { command: "migration-work", skill: "migration-work" },
17
+ { command: "diagnose-failure", skill: "diagnose-failure" },
18
+ { command: "verify-work", skill: "verify-work" },
19
+ { command: "review-work", skill: "review-work" },
20
+ { command: "commit-work", skill: "commit-work" },
21
+ { command: "handoff", skill: "handoff" },
22
+ { command: "finish-branch", skill: "finish-branch" },
23
+ { command: "release-work", skill: "release-work" },
24
+ { command: "launch-work", skill: "launch-work" },
25
+ { command: "bypass", skill: "bypass" },
26
+ ];
27
+ export const CONTRIBUTOR_COMMANDS = ["setup-freeflow", "write-skill", "evaluate-skill"];
28
+ export const FREEFLOW_MODEL_SKILL_NAMES = [
29
+ "bypass",
30
+ "commit-work",
31
+ "decision-gate",
32
+ "migration-work",
33
+ "design-for-depth",
34
+ "diagnose-failure",
35
+ "discuss",
36
+ "evaluate-skill",
37
+ "execute-work",
38
+ "finish-branch",
39
+ "handoff",
40
+ "mode-contract",
41
+ "release-work",
42
+ "review-artifact",
43
+ "review-work",
44
+ "setup-freeflow",
45
+ "launch-work",
46
+ "simplify-code",
47
+ "tdd",
48
+ "track-work",
49
+ "verify-work",
50
+ "workflow",
51
+ "write-plan",
52
+ "write-skill",
53
+ "write-spec",
54
+ ];
55
+ export function freeflowSkillPath(skillName) {
56
+ return fileURLToPath(new URL(`../../../skills/${skillName}/SKILL.md`, import.meta.url));
57
+ }
58
+ export function freeflowModelSkillPaths() {
59
+ return FREEFLOW_MODEL_SKILL_NAMES.map((skillName) => freeflowSkillPath(skillName));
60
+ }
61
+ const MODE_STATE_ENTRY = "freeflow-mode";
62
+ const SESSION_OVERRIDES_ENTRY = "freeflow-session-overrides";
63
+ const SESSION_CORE_KEYS = new Set(["enabled", "interactionContract", "skillsEnabled"]);
64
+ const RESET_MODE_ARGS = new Set(["reset"]);
65
+ export const FREEFLOW_STATUS_TOOL_NAME = "freeflow_status";
66
+ export const OUTPUT_ROUTER_TOOL_NAMES = ["freeflow_search", "freeflow_run", "freeflow_batch"];
67
+ export const WORKFLOW_BOOTSTRAP_MESSAGE_TYPE = "freeflow-workflow-bootstrap";
68
+ let runtimeContextCache = null;
69
+ let currentModeOverride = null;
70
+ let currentSessionOverrides = {};
71
+ let lastRouterConfigWarningKey = null;
72
+ async function loadRuntimeContext(capabilityState = undefined) {
73
+ const interactionContractEnabled = capabilityState?.interactionContract?.effective === true;
74
+ const skillsEnabled = capabilityState?.skills?.effective === true;
75
+ const outputRouterEnabled = capabilityState?.outputRouter?.enabled === true;
76
+ const [interactionContract, workflowSkill, outputRouterSkill] = await Promise.all([
77
+ interactionContractEnabled
78
+ ? readFile(new URL("../../../runtime/interaction-contract.md", import.meta.url), "utf8")
79
+ : Promise.resolve(null),
80
+ skillsEnabled
81
+ ? readFile(new URL("../../../skills/workflow/SKILL.md", import.meta.url), "utf8")
82
+ : Promise.resolve(null),
83
+ outputRouterEnabled
84
+ ? readFile(new URL("../../../capabilities/output-router/SKILL.md", import.meta.url), "utf8")
85
+ : Promise.resolve(null),
86
+ ]);
87
+ return { interactionContract, workflowSkill, outputRouterSkill };
88
+ }
89
+ function runtimeContextCacheSatisfies(capabilityState) {
90
+ if (!runtimeContextCache) {
91
+ return false;
92
+ }
93
+ if (capabilityState?.interactionContract?.effective === true && !runtimeContextCache.interactionContract) {
94
+ return false;
95
+ }
96
+ if (capabilityState?.skills?.effective === true && !runtimeContextCache.workflowSkill) {
97
+ return false;
98
+ }
99
+ if (capabilityState?.outputRouter?.enabled === true && !runtimeContextCache.outputRouterSkill) {
100
+ return false;
101
+ }
102
+ return true;
103
+ }
104
+ export async function refreshRuntimeContext(capabilityState = undefined) {
105
+ runtimeContextCache = await loadRuntimeContext(capabilityState);
106
+ return runtimeContextCache;
107
+ }
108
+ export async function getRuntimeContext(capabilityState = undefined) {
109
+ if (runtimeContextCacheSatisfies(capabilityState)) {
110
+ return runtimeContextCache;
111
+ }
112
+ return refreshRuntimeContext(capabilityState);
113
+ }
114
+ function activeSessionEntries(sessionManager) {
115
+ try {
116
+ if (typeof sessionManager?.buildContextEntries === "function") {
117
+ const entries = sessionManager.buildContextEntries();
118
+ if (Array.isArray(entries)) {
119
+ return entries;
120
+ }
121
+ }
122
+ if (typeof sessionManager?.getEntries === "function") {
123
+ const entries = sessionManager.getEntries();
124
+ if (Array.isArray(entries)) {
125
+ return entries;
126
+ }
127
+ }
128
+ } catch {
129
+ // A missing session snapshot should reload useful context rather than suppress it.
130
+ }
131
+ return [];
132
+ }
133
+ export function workflowBootstrapMessage(freeflowContext, capabilityState, sessionManager) {
134
+ if (capabilityState?.skills?.effective !== true || !freeflowContext?.workflowSkill) {
135
+ return undefined;
136
+ }
137
+ const alreadyLoaded = activeSessionEntries(sessionManager).some(
138
+ (entry) => entry?.type === "custom_message" && entry?.customType === WORKFLOW_BOOTSTRAP_MESSAGE_TYPE,
139
+ );
140
+ if (alreadyLoaded) {
141
+ return undefined;
142
+ }
143
+ return {
144
+ customType: WORKFLOW_BOOTSTRAP_MESSAGE_TYPE,
145
+ content: `# Freeflow Workflow Bootstrap\n\n${freeflowContext.workflowSkill.trim()}`,
146
+ display: false,
147
+ details: { skill: "workflow", source: "first-turn-bootstrap" },
148
+ };
149
+ }
150
+ function isRecord(value) {
151
+ return typeof value === "object" && value !== null && !Array.isArray(value);
152
+ }
153
+ function validateCoreConfigFields(value) {
154
+ if (value.defaultMode !== undefined && !VALID_MODES.has(value.defaultMode)) {
155
+ return `invalid defaultMode: ${JSON.stringify(value.defaultMode)}`;
156
+ }
157
+ if (value.enabled !== undefined && typeof value.enabled !== "boolean") {
158
+ return "enabled must be a boolean";
159
+ }
160
+ if (value.interactionContract !== undefined && typeof value.interactionContract !== "boolean") {
161
+ return "interactionContract must be a boolean";
162
+ }
163
+ if (value.skills !== undefined) {
164
+ if (!isRecord(value.skills)) {
165
+ return "skills must be an object";
166
+ }
167
+ for (const key of Object.keys(value.skills)) {
168
+ if (key !== "enabled") {
169
+ return `unsupported skills config key: ${key}`;
170
+ }
171
+ }
172
+ if (value.skills.enabled !== undefined && typeof value.skills.enabled !== "boolean") {
173
+ return "skills.enabled must be a boolean";
174
+ }
175
+ }
176
+ return null;
177
+ }
178
+ function validateFreeflowConfigShape(value) {
179
+ if (!isRecord(value)) {
180
+ return "config must be a JSON object";
181
+ }
182
+ const allowedKeys = new Set([
183
+ "enabled",
184
+ "defaultMode",
185
+ "interactionContract",
186
+ "skills",
187
+ "outputRouter",
188
+ "observedRouting",
189
+ "scriptTransform",
190
+ ]);
191
+ for (const key of Object.keys(value)) {
192
+ if (!allowedKeys.has(key)) {
193
+ return `unsupported top-level config key: ${key}`;
194
+ }
195
+ }
196
+ const coreError = validateCoreConfigFields(value);
197
+ if (coreError) return coreError;
198
+ for (const key of ["outputRouter", "observedRouting", "scriptTransform"]) {
199
+ if (value[key] !== undefined && !isRecord(value[key])) {
200
+ return `${key} must be an object`;
201
+ }
202
+ }
203
+ return null;
204
+ }
205
+ function validateFreeflowLocalConfigShape(value) {
206
+ if (!isRecord(value)) {
207
+ return "local config must be a JSON object";
208
+ }
209
+ const allowedKeys = new Set(["enabled", "defaultMode", "interactionContract", "skills", "processing"]);
210
+ for (const key of Object.keys(value)) {
211
+ if (!allowedKeys.has(key)) {
212
+ return `unsupported top-level local config key: ${key}`;
213
+ }
214
+ }
215
+ return validateCoreConfigFields(value);
216
+ }
217
+ async function readConfigFileState(path, validate) {
218
+ try {
219
+ const raw = await readFile(path, "utf8");
220
+ const parsed = JSON.parse(raw);
221
+ const validationError = validate(parsed);
222
+ if (validationError) {
223
+ return {
224
+ path,
225
+ exists: true,
226
+ valid: false,
227
+ parsed: {},
228
+ parseError: validationError,
229
+ };
230
+ }
231
+ return { path, exists: true, valid: true, parsed, parseError: null };
232
+ } catch (error) {
233
+ const code = error && typeof error === "object" ? error.code : undefined;
234
+ if (code === "ENOENT") {
235
+ return {
236
+ path,
237
+ exists: false,
238
+ valid: false,
239
+ parsed: {},
240
+ parseError: null,
241
+ };
242
+ }
243
+ const message = error instanceof Error ? error.message : String(error);
244
+ return {
245
+ path,
246
+ exists: true,
247
+ valid: false,
248
+ parsed: {},
249
+ parseError: message,
250
+ };
251
+ }
252
+ }
253
+ export function readFreeflowConfigState(cwd) {
254
+ return readConfigFileState(join(cwd, ".freeflow/config.json"), validateFreeflowConfigShape);
255
+ }
256
+ export function readFreeflowLocalConfigState(cwd) {
257
+ return readConfigFileState(join(cwd, ".freeflow/local.json"), validateFreeflowLocalConfigShape);
258
+ }
259
+ export async function readFreeflowConfig(cwd) {
260
+ const state = await readFreeflowConfigState(cwd);
261
+ return state.valid ? state.parsed : {};
262
+ }
263
+ export async function readFreeflowLocalConfig(cwd) {
264
+ const state = await readFreeflowLocalConfigState(cwd);
265
+ return state.valid ? state.parsed : {};
266
+ }
267
+ function resolveLayeredValue(repository, local, key, fallback) {
268
+ if (Object.hasOwn(local, key)) {
269
+ return { value: local[key], source: "local" };
270
+ }
271
+ if (Object.hasOwn(repository, key)) {
272
+ return { value: repository[key], source: "repository" };
273
+ }
274
+ return { value: fallback, source: "builtin" };
275
+ }
276
+ function resolveCoreConfig(repository, local) {
277
+ const enabled = resolveLayeredValue(repository, local, "enabled", true);
278
+ const interactionContract = resolveLayeredValue(repository, local, "interactionContract", true);
279
+ const defaultMode = resolveLayeredValue(repository, local, "defaultMode", "workflow");
280
+ const repositorySkills = isRecord(repository.skills) ? repository.skills : {};
281
+ const localSkills = isRecord(local.skills) ? local.skills : {};
282
+ const skillsEnabled = resolveLayeredValue(repositorySkills, localSkills, "enabled", true);
283
+ return {
284
+ config: {
285
+ enabled: enabled.value,
286
+ interactionContract: interactionContract.value,
287
+ skills: { enabled: skillsEnabled.value },
288
+ defaultMode: defaultMode.value,
289
+ },
290
+ sources: {
291
+ enabled: enabled.source,
292
+ interactionContract: interactionContract.source,
293
+ skillsEnabled: skillsEnabled.source,
294
+ defaultMode: defaultMode.source,
295
+ },
296
+ };
297
+ }
298
+ function normalizeSessionOverrides(value) {
299
+ if (!isRecord(value)) return {};
300
+ const overrides = {};
301
+ for (const key of SESSION_CORE_KEYS) {
302
+ if (typeof value[key] === "boolean") {
303
+ overrides[key] = value[key];
304
+ }
305
+ }
306
+ return overrides;
307
+ }
308
+ function resolveSessionCoreConfig(layers) {
309
+ const configured = layers.coreConfig;
310
+ const sources = layers.sources;
311
+ const enabled = currentSessionOverrides.enabled;
312
+ const interactionContract = currentSessionOverrides.interactionContract;
313
+ const skillsEnabled = currentSessionOverrides.skillsEnabled;
314
+ return {
315
+ config: {
316
+ enabled: typeof enabled === "boolean" ? enabled : configured.enabled,
317
+ interactionContract:
318
+ typeof interactionContract === "boolean" ? interactionContract : configured.interactionContract,
319
+ skills: { enabled: typeof skillsEnabled === "boolean" ? skillsEnabled : configured.skills.enabled },
320
+ defaultMode: configured.defaultMode,
321
+ },
322
+ sources: {
323
+ enabled: typeof enabled === "boolean" ? "session" : sources.enabled,
324
+ interactionContract: typeof interactionContract === "boolean" ? "session" : sources.interactionContract,
325
+ skillsEnabled: typeof skillsEnabled === "boolean" ? "session" : sources.skillsEnabled,
326
+ defaultMode: sources.defaultMode,
327
+ },
328
+ };
329
+ }
330
+ export async function readFreeflowConfigLayers(cwd) {
331
+ const [repository, local] = await Promise.all([readFreeflowConfigState(cwd), readFreeflowLocalConfigState(cwd)]);
332
+ const repositoryConfig = repository.valid ? repository.parsed : {};
333
+ const localConfig = local.valid ? local.parsed : {};
334
+ const core = resolveCoreConfig(repositoryConfig, localConfig);
335
+ const localValid = !local.exists || local.valid;
336
+ const configured = repository.valid && localValid;
337
+ let blockingState = null;
338
+ if (!repository.valid) {
339
+ blockingState = repository;
340
+ } else if (local.exists && !local.valid) {
341
+ blockingState = local;
342
+ }
343
+ return {
344
+ configured,
345
+ repositoryConfigured: repository.valid,
346
+ repository,
347
+ local,
348
+ coreConfig: core.config,
349
+ sources: core.sources,
350
+ blockingConfigPath: blockingState?.path ?? null,
351
+ parseError: blockingState?.parseError ?? null,
352
+ };
353
+ }
354
+ export async function readCapabilityState(cwd) {
355
+ const layers = await readFreeflowConfigLayers(cwd);
356
+ const parsed = layers.repository.valid ? layers.repository.parsed : {};
357
+ const normalized = normalizeFreeflowConfig(parsed);
358
+ const effectiveCore = resolveSessionCoreConfig(layers);
359
+ const enabled = layers.configured && effectiveCore.config.enabled;
360
+ const interactionContractConfigEnabled = effectiveCore.config.interactionContract;
361
+ const skillsConfigEnabled = effectiveCore.config.skills.enabled;
362
+ const outputRouterConfigEnabled = normalized.config.outputRouter.enabled;
363
+ return {
364
+ configured: layers.configured,
365
+ repositoryConfigured: layers.repositoryConfigured,
366
+ configExists: layers.repository.exists,
367
+ configValid: layers.configured,
368
+ configPath: layers.blockingConfigPath ?? layers.repository.path,
369
+ parseError: layers.parseError,
370
+ localConfigExists: layers.local.exists,
371
+ localConfigValid: !layers.local.exists || layers.local.valid,
372
+ localConfigPath: layers.local.path,
373
+ localConfigParseError: layers.local.parseError,
374
+ configuredCoreConfig: layers.coreConfig,
375
+ configuredSources: layers.sources,
376
+ sessionOverrides: { ...currentSessionOverrides },
377
+ configSources: effectiveCore.sources,
378
+ defaultMode: effectiveCore.config.defaultMode,
379
+ enabled,
380
+ interactionContract: {
381
+ enabled: interactionContractConfigEnabled,
382
+ effective: enabled && interactionContractConfigEnabled,
383
+ },
384
+ skills: {
385
+ enabled: skillsConfigEnabled,
386
+ effective: enabled && skillsConfigEnabled,
387
+ },
388
+ outputRouter: {
389
+ enabled: enabled && outputRouterConfigEnabled,
390
+ configEnabled: outputRouterConfigEnabled,
391
+ },
392
+ };
393
+ }
394
+ export const readRuntimeState = readCapabilityState;
395
+ export async function readOutputRouterConfig(cwd) {
396
+ const layers = await readFreeflowConfigLayers(cwd);
397
+ const parsed = layers.repository.valid ? layers.repository.parsed : {};
398
+ const localParsed = layers.local.valid ? layers.local.parsed : {};
399
+ const normalized = normalizeFreeflowConfig(parsed);
400
+ const local = normalizeLocalFreeflowConfig(localParsed);
401
+ const freeflowEnabled = layers.configured && layers.coreConfig.enabled;
402
+ const effectiveConfig = freeflowEnabled
403
+ ? normalized.config
404
+ : {
405
+ ...normalized.config,
406
+ outputRouter: { ...normalized.config.outputRouter, enabled: false },
407
+ observedRouting: {
408
+ ...normalized.config.observedRouting,
409
+ enabled: false,
410
+ },
411
+ scriptTransform: {
412
+ ...normalized.config.scriptTransform,
413
+ enabled: false,
414
+ },
415
+ };
416
+ const configWarnings = [...normalized.warnings];
417
+ if (layers.repository.exists && !layers.repository.valid) {
418
+ configWarnings.unshift(
419
+ `.freeflow/config.json could not be parsed; Freeflow runtime is inactive. ${layers.repository.parseError ?? ""}`.trim(),
420
+ );
421
+ }
422
+ if (layers.local.exists && !layers.local.valid) {
423
+ configWarnings.unshift(
424
+ `.freeflow/local.json could not be parsed; Freeflow runtime is inactive. ${layers.local.parseError ?? ""}`.trim(),
425
+ );
426
+ }
427
+ return {
428
+ config: effectiveConfig.outputRouter,
429
+ freeflowConfig: effectiveConfig,
430
+ localConfig: local.config,
431
+ warnings: [...configWarnings, ...local.warnings],
432
+ };
433
+ }
434
+ export function notifyRouterConfigWarnings(ctx, routerConfigResult) {
435
+ if (!routerConfigResult.warnings.length) {
436
+ return;
437
+ }
438
+ const key = routerConfigResult.warnings.join("\n");
439
+ if (key === lastRouterConfigWarningKey) {
440
+ return;
441
+ }
442
+ lastRouterConfigWarningKey = key;
443
+ ctx.ui.notify(`Freeflow config warning: ${routerConfigResult.warnings.join(" ")}`, "warning");
444
+ }
445
+ export function restoreModeOverride(ctx) {
446
+ currentModeOverride = null;
447
+ currentSessionOverrides = {};
448
+ const entries = ctx.sessionManager?.getBranch?.() ?? ctx.sessionManager?.getEntries?.() ?? [];
449
+ for (const entry of entries) {
450
+ if (entry.type !== "custom") continue;
451
+ if (entry.customType === MODE_STATE_ENTRY) {
452
+ const mode = entry.data?.currentMode;
453
+ currentModeOverride = VALID_MODES.has(mode) ? mode : null;
454
+ } else if (entry.customType === SESSION_OVERRIDES_ENTRY) {
455
+ currentSessionOverrides = normalizeSessionOverrides(entry.data?.overrides);
456
+ }
457
+ }
458
+ }
459
+ export async function readModeState(cwd) {
460
+ const layers = await readFreeflowConfigLayers(cwd);
461
+ const effectiveCore = resolveSessionCoreConfig(layers);
462
+ const repositoryDefaultMode = VALID_MODES.has(layers.repository.parsed.defaultMode)
463
+ ? layers.repository.parsed.defaultMode
464
+ : "workflow";
465
+ const personalDefaultMode = VALID_MODES.has(layers.local.parsed.defaultMode) ? layers.local.parsed.defaultMode : null;
466
+ const sessionMode = VALID_MODES.has(currentModeOverride) ? currentModeOverride : null;
467
+ const resolvedMode = sessionMode ?? effectiveCore.config.defaultMode;
468
+ const active = layers.configured && effectiveCore.config.enabled && effectiveCore.config.skills.enabled;
469
+ return {
470
+ repositoryDefaultMode,
471
+ repositoryDefaultModeSource: VALID_MODES.has(layers.repository.parsed.defaultMode) ? "repository" : "builtin",
472
+ personalDefaultMode,
473
+ defaultMode: effectiveCore.config.defaultMode,
474
+ defaultModeSource: effectiveCore.sources.defaultMode,
475
+ currentMode: sessionMode,
476
+ sessionMode,
477
+ resolvedMode,
478
+ active,
479
+ effectiveMode: active ? resolvedMode : null,
480
+ };
481
+ }
482
+ export function setModeStatus(ctx, modeState, capabilityState = undefined) {
483
+ if (capabilityState && !capabilityState.configured) {
484
+ ctx.ui.setStatus("freeflow", capabilityState.configExists ? "freeflow: config error" : "freeflow: setup needed");
485
+ return;
486
+ }
487
+ if (capabilityState && !capabilityState.enabled) {
488
+ const source = capabilityState.configSources?.enabled === "session" ? " (session)" : "";
489
+ ctx.ui.setStatus("freeflow", `freeflow: off${source}`);
490
+ return;
491
+ }
492
+ const active = [];
493
+ if (capabilityState?.interactionContract.effective) {
494
+ active.push("interaction");
495
+ } else if (capabilityState?.configSources?.interactionContract === "session") {
496
+ active.push("interaction off (session)");
497
+ }
498
+ if (capabilityState?.skills.effective) {
499
+ active.push(`${modeState.effectiveMode}${modeState.currentMode ? " (session)" : ""}`);
500
+ } else if (capabilityState?.configSources?.skillsEnabled === "session") {
501
+ active.push("skills off (session)");
502
+ }
503
+ if (capabilityState?.outputRouter.enabled) {
504
+ active.push("router");
505
+ }
506
+ ctx.ui.setStatus("freeflow", `freeflow: ${active.length > 0 ? active.join(" · ") : "idle"}`);
507
+ }
508
+ function modeSourceLabel(source) {
509
+ if (source === "local") return "personal override";
510
+ if (source === "repository") return "repository default";
511
+ return "built-in default";
512
+ }
513
+ function describeModeState(modeState) {
514
+ const configuredDefault = `configured default ${modeState.defaultMode} (${modeSourceLabel(modeState.defaultModeSource)})`;
515
+ if (modeState.sessionMode) {
516
+ return `session ${modeState.sessionMode}; ${configuredDefault}`;
517
+ }
518
+ return configuredDefault;
519
+ }
520
+ export function skillPrompt(skill, args) {
521
+ const trimmed = args?.trim();
522
+ return trimmed ? `/skill:${skill}\n\n${trimmed}` : `/skill:${skill}`;
523
+ }
524
+ function outputRouterModeGuidance(mode, skillsEnabled = true) {
525
+ if (!skillsEnabled) {
526
+ return "Freeflow Skills are disabled: no Freeflow workflow mode is active; apply only output-router evidence guidance.";
527
+ }
528
+ if (mode === "conversation") {
529
+ return "conversation mode: keep routed-tool guidance soft; answer questions directly.";
530
+ }
531
+ if (mode === "strict-workflow") {
532
+ return "strict-workflow mode: strongest guidance; prefer exact, recoverable routed evidence for risky work.";
533
+ }
534
+ return "workflow mode: prefer routed tools for exploration and likely-large command output.";
535
+ }
536
+ function outputRouterContext(modeState, freeflowContext, routerConfigResult, capabilityState) {
537
+ const safetyNetText =
538
+ routerConfigResult.config.postToolRouting === "off"
539
+ ? ""
540
+ : "\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.";
541
+ return `## Loaded Output Router Skill
542
+
543
+ Mode guidance: ${outputRouterModeGuidance(modeState.effectiveMode, capabilityState.skills.effective)}${safetyNetText}
544
+
545
+ \`\`\`md
546
+ ${freeflowContext.outputRouterSkill.trim()}
547
+ \`\`\``;
548
+ }
549
+ function capabilityContext(capabilityState) {
550
+ const sessionSuffix = (source) => (source === "session" ? " (session override)" : "");
551
+ const interactionContract = `${capabilityState.interactionContract.effective ? "enabled" : "disabled"}${sessionSuffix(capabilityState.configSources.interactionContract)}`;
552
+ const skills = `${capabilityState.skills.effective ? "enabled" : "disabled"}${sessionSuffix(capabilityState.configSources.skillsEnabled)}`;
553
+ const outputRouter = capabilityState.outputRouter.enabled ? "enabled" : "disabled";
554
+ return `## Freeflow Capabilities
555
+
556
+ - Interaction contract: ${interactionContract}. Configure with \`/freeflow settings\` or temporarily with \`/freeflow settings session\`; inspect with \`/freeflow status\`.
557
+ - Skills: ${skills}. Configure with \`/freeflow settings\` or temporarily with \`/freeflow settings session\`; inspect with \`/freeflow status\`.
558
+ - Output router: ${outputRouter}. Configure with \`/freeflow settings\` or \`/output-router\`; inspect with \`/output-router status\`.
559
+
560
+ Disabled capabilities are named only for status/config awareness. Capability-specific instructions and tools are active only while that capability is enabled.`;
561
+ }
562
+ function hasModelFacingCapability(capabilityState) {
563
+ return (
564
+ capabilityState.interactionContract.effective ||
565
+ capabilityState.skills.effective ||
566
+ capabilityState.outputRouter.enabled
567
+ );
568
+ }
569
+ function modeOverlayContext(mode) {
570
+ if (mode === "conversation") {
571
+ return `
572
+
573
+ ## Conversation Mode Boundary
574
+
575
+ Conversation mode is active and read-only.
576
+
577
+ Do not call write, edit, or mutating tools. Do not create, delete, commit, push, or change repository, system, external, or durable state.
578
+
579
+ 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.`;
580
+ }
581
+ if (mode === "strict-workflow") {
582
+ return `
583
+
584
+ ## Strict Workflow Overlay
585
+
586
+ Strict Workflow is active. Use the adaptive Workflow, but increase decision, evidence, verification, and checkpoint pressure at high-risk or hard-to-reverse boundaries.
587
+
588
+ For work affecting security, privacy, billing, data loss, migrations, public interfaces, compatibility, deployment, or architecture:
589
+
590
+ - stop for any user-owned choice or source conflict;
591
+ - inspect the relevant risk surface before crossing the boundary;
592
+ - select only artifacts, checkpoints, and independent review that materially reduce risk;
593
+ - verify at the affected boundary before claiming success.
594
+
595
+ 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.`;
596
+ }
597
+ return "";
598
+ }
599
+ function activeModeContext(modeState) {
600
+ return `## Freeflow Mode State
601
+
602
+ Repository default mode: \`${modeState.repositoryDefaultMode}\` (${modeState.repositoryDefaultModeSource}).
603
+ Personal default override: \`${modeState.personalDefaultMode ?? "none"}\`.
604
+ Configured default mode: \`${modeState.defaultMode}\` (${modeSourceLabel(modeState.defaultModeSource)}).
605
+ Session mode override: \`${modeState.sessionMode ?? "none"}\`.
606
+ Resolved mode: \`${modeState.resolvedMode}\`.
607
+ Effective Freeflow mode: \`${modeState.effectiveMode}\`.
608
+
609
+ Mode behavior:
610
+ - \`conversation\`: answer, discuss, critique, and inspect read-only; require a mode change before mutating state.
611
+ - \`workflow\`: use the adaptive workflow for consequential or mutating work.
612
+ - \`strict-workflow\`: use the same workflow with stronger decision, evidence, and checkpoint pressure at high-risk or hard-to-reverse boundaries.
613
+
614
+ Task type, risk classification, and direct skill calls do not change mode. Recommend another mode when useful; the user decides.
615
+ 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)}`;
616
+ }
617
+ function inactiveModeContext(modeState) {
618
+ return `## Freeflow Mode State
619
+
620
+ Repository default mode: \`${modeState.repositoryDefaultMode}\` (${modeState.repositoryDefaultModeSource}).
621
+ Personal default override: \`${modeState.personalDefaultMode ?? "none"}\`.
622
+ Configured default mode: \`${modeState.defaultMode}\` (${modeSourceLabel(modeState.defaultModeSource)}).
623
+ Session mode override: \`${modeState.sessionMode ?? "none"}\`.
624
+ Resolved mode: \`${modeState.resolvedMode}\` (inactive because Skills are disabled).
625
+ Effective Freeflow mode: \`none\`.
626
+
627
+ Freeflow workflow modes are dormant until Skills are enabled with \`/freeflow settings\`.`;
628
+ }
629
+ function controlPlaneContext(modeState, capabilityState) {
630
+ return `# Freeflow Control Plane
631
+
632
+ Freeflow is enabled for this repo, but no model-facing capabilities are enabled.
633
+ These lines are status/config awareness only; do not apply Freeflow workflow or output-router behavior.
634
+
635
+ ${inactiveModeContext(modeState)}
636
+
637
+ ${capabilityContext(capabilityState)}
638
+
639
+ 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.`;
640
+ }
641
+ export function runtimeContext(modeState, freeflowContext, routerConfigResult, capabilityState) {
642
+ if (!capabilityState.configured) {
643
+ return "";
644
+ }
645
+ if (!capabilityState.enabled) {
646
+ return `# Freeflow Disabled
647
+
648
+ 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\`.
649
+
650
+ These instructions are context-loading only. They do not override user instructions, repo instructions, or host safety and approval policy.`;
651
+ }
652
+ if (!hasModelFacingCapability(capabilityState)) {
653
+ return controlPlaneContext(modeState, capabilityState);
654
+ }
655
+ const modeText = capabilityState.skills.effective ? activeModeContext(modeState) : inactiveModeContext(modeState);
656
+ const interactionContractText = capabilityState.interactionContract.effective
657
+ ? `\n\n${freeflowContext.interactionContract.trim()}`
658
+ : "";
659
+ const routerText =
660
+ capabilityState.outputRouter.enabled && routerConfigResult.config.enabled
661
+ ? `\n\n${outputRouterContext(modeState, freeflowContext, routerConfigResult, capabilityState)}`
662
+ : "";
663
+ return `# Freeflow Runtime Context
664
+
665
+ Freeflow Pi extension loaded this before the agent turn.
666
+ Runtime delivery: confirmed for this Pi \`before_agent_start\` invocation.
667
+ These instructions are context-loading only. They do not override user instructions, repo instructions, or host safety and approval policy.
668
+
669
+ ${modeText}
670
+
671
+ ${capabilityContext(capabilityState)}${interactionContractText}${routerText}
672
+
673
+ 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.`;
674
+ }
675
+ export async function setSessionCoreOverride(key, value, ctx, pi) {
676
+ if (!SESSION_CORE_KEYS.has(key)) {
677
+ throw new Error(`Invalid Freeflow session override: ${String(key)}`);
678
+ }
679
+ if (value !== null && typeof value !== "boolean") {
680
+ throw new Error(`Invalid Freeflow session override value for ${key}: ${String(value)}`);
681
+ }
682
+ const hasOverride = Object.hasOwn(currentSessionOverrides, key);
683
+ if ((value === null && !hasOverride) || (value !== null && hasOverride && currentSessionOverrides[key] === value)) {
684
+ return { changed: false, sessionOverrides: { ...currentSessionOverrides } };
685
+ }
686
+ const next = { ...currentSessionOverrides };
687
+ if (value === null) {
688
+ delete next[key];
689
+ } else {
690
+ next[key] = value;
691
+ }
692
+ currentSessionOverrides = next;
693
+ pi?.appendEntry?.(SESSION_OVERRIDES_ENTRY, { overrides: { ...currentSessionOverrides } });
694
+ return {
695
+ changed: true,
696
+ reloadRequired: key === "enabled" || key === "skillsEnabled",
697
+ sessionOverrides: { ...currentSessionOverrides },
698
+ capabilityState: await readCapabilityState(ctx.cwd),
699
+ };
700
+ }
701
+ export async function resetSessionOverrides(ctx, pi) {
702
+ const hadCoreOverrides = Object.keys(currentSessionOverrides).length > 0;
703
+ const reloadRequired =
704
+ Object.hasOwn(currentSessionOverrides, "enabled") || Object.hasOwn(currentSessionOverrides, "skillsEnabled");
705
+ const hadModeOverride = VALID_MODES.has(currentModeOverride);
706
+ if (hadCoreOverrides) {
707
+ currentSessionOverrides = {};
708
+ pi?.appendEntry?.(SESSION_OVERRIDES_ENTRY, { overrides: {} });
709
+ }
710
+ if (hadModeOverride) {
711
+ await setSessionMode(null, ctx, pi);
712
+ }
713
+ return {
714
+ changed: hadCoreOverrides || hadModeOverride,
715
+ reloadRequired,
716
+ sessionOverrides: { ...currentSessionOverrides },
717
+ modeState: await readModeState(ctx.cwd),
718
+ };
719
+ }
720
+ export async function setSessionMode(mode, ctx, pi) {
721
+ const nextMode = mode === "default" || mode === "reset" || mode === null ? null : mode;
722
+ if (nextMode !== null && !VALID_MODES.has(nextMode)) {
723
+ throw new Error(`Invalid Freeflow mode: ${String(mode)}`);
724
+ }
725
+ currentModeOverride = nextMode;
726
+ pi?.appendEntry?.(MODE_STATE_ENTRY, { currentMode: nextMode });
727
+ return readModeState(ctx.cwd);
728
+ }
729
+ export async function handleModeCommand(args, ctx, pi) {
730
+ const arg = args?.trim();
731
+ const capabilityState = await readCapabilityState(ctx.cwd);
732
+ const inactiveModeState = await readModeState(ctx.cwd);
733
+ if (!capabilityState.configured) {
734
+ setModeStatus(ctx, inactiveModeState, capabilityState);
735
+ ctx.ui.notify(
736
+ "Freeflow is installed but this repo is not set up. Run /setup-freeflow before changing mode.",
737
+ "warning",
738
+ );
739
+ return { changed: false, error: "not_configured" };
740
+ }
741
+ if (!capabilityState.enabled) {
742
+ setModeStatus(ctx, inactiveModeState, capabilityState);
743
+ ctx.ui.notify(
744
+ "Freeflow is disabled for this repo. Use /freeflow enable or /freeflow settings to re-enable it.",
745
+ "warning",
746
+ );
747
+ return { changed: false, error: "freeflow_disabled" };
748
+ }
749
+ if (!capabilityState.skills.effective) {
750
+ setModeStatus(ctx, inactiveModeState, capabilityState);
751
+ ctx.ui.notify(
752
+ `Freeflow modes are inactive because Skills are disabled. Configured default mode: ${inactiveModeState.defaultMode} (${modeSourceLabel(inactiveModeState.defaultModeSource)}). Enable Skills in /freeflow settings before changing mode.`,
753
+ "warning",
754
+ );
755
+ return { changed: false, error: "skills_disabled" };
756
+ }
757
+ if (VALID_MODES.has(arg)) {
758
+ if (inactiveModeState.effectiveMode === arg) {
759
+ setModeStatus(ctx, inactiveModeState, capabilityState);
760
+ const message = inactiveModeState.sessionMode
761
+ ? `Freeflow is already in ${arg} mode for this Pi session. No session entry was added. Configured default remains ${inactiveModeState.defaultMode} (${modeSourceLabel(inactiveModeState.defaultModeSource)}).`
762
+ : `Freeflow is already in ${arg} mode from the configured default (${modeSourceLabel(inactiveModeState.defaultModeSource)}). No session override was created.`;
763
+ ctx.ui.notify(message, "info");
764
+ return { changed: false, modeState: inactiveModeState };
765
+ }
766
+ const modeState = await setSessionMode(arg, ctx, pi);
767
+ setModeStatus(ctx, modeState, capabilityState);
768
+ ctx.ui.notify(
769
+ `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)}).`,
770
+ "info",
771
+ );
772
+ return { changed: true, modeState };
773
+ }
774
+ if (RESET_MODE_ARGS.has(arg) || arg === "default") {
775
+ if (!inactiveModeState.sessionMode) {
776
+ setModeStatus(ctx, inactiveModeState, capabilityState);
777
+ ctx.ui.notify(
778
+ `Freeflow is already using the configured default: ${inactiveModeState.defaultMode} (${modeSourceLabel(inactiveModeState.defaultModeSource)}). No session override is active.`,
779
+ "info",
780
+ );
781
+ return { changed: false, modeState: inactiveModeState };
782
+ }
783
+ const modeState = await setSessionMode(null, ctx, pi);
784
+ setModeStatus(ctx, modeState, capabilityState);
785
+ ctx.ui.notify(
786
+ `Freeflow mode reset to configured default: ${modeState.defaultMode} (${modeSourceLabel(modeState.defaultModeSource)}). Session override cleared; .freeflow/local.json and .freeflow/config.json were not changed.`,
787
+ "info",
788
+ );
789
+ return { changed: true, modeState };
790
+ }
791
+ const modeState = await readModeState(ctx.cwd);
792
+ setModeStatus(ctx, modeState, capabilityState);
793
+ ctx.ui.notify(
794
+ `Freeflow mode is ${modeState.effectiveMode} (${describeModeState(modeState)}). Use /freeflow mode conversation, /freeflow mode workflow, /freeflow mode strict-workflow, or /freeflow mode reset.`,
795
+ "info",
796
+ );
797
+ return { changed: false, modeState, error: arg ? "invalid_mode" : undefined };
798
+ }