@hassangameryt/freeflow 0.3.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (692) hide show
  1. package/.claude-plugin/marketplace.json +4 -4
  2. package/.claude-plugin/plugin.json +6 -2
  3. package/.codex-plugin/plugin.json +9 -9
  4. package/README.md +190 -127
  5. package/assets/feedback-loop.png +0 -0
  6. package/assets/freeflow_workflow_map.png +0 -0
  7. package/assets/workflow.png +0 -0
  8. package/{skills → capabilities}/output-router/SKILL.md +21 -17
  9. package/{skills → capabilities}/output-router/references/safety-policy.md +1 -1
  10. package/capabilities/output-router/references/setup.md +110 -0
  11. package/command-surface.json +62 -7
  12. package/hooks/freeflow-runtime-context.mjs +572 -154
  13. package/hooks/hooks.json +26 -1
  14. package/hooks/tests/check-runtime-context-hook.sh +375 -0
  15. package/package.json +24 -24
  16. package/pi-extension/dist/index.js +264 -80
  17. package/pi-extension/dist/integrations/mcp-config.js +29 -0
  18. package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
  19. package/pi-extension/dist/output-router/native-safety-net.js +216 -0
  20. package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
  21. package/pi-extension/dist/output-router/renderers.js +1023 -0
  22. package/pi-extension/dist/output-router/router-tools.js +554 -0
  23. package/pi-extension/dist/output-router/schemas.js +383 -0
  24. package/pi-extension/dist/output-router/status.js +744 -0
  25. package/pi-extension/dist/output-router/utils.js +502 -0
  26. package/pi-extension/dist/runtime/runtime-context.js +798 -0
  27. package/pi-extension/dist/settings/settings-tui.js +314 -0
  28. package/pi-extension/dist/settings/settings-ui.js +1487 -0
  29. package/pi-extension/freeflow/index.js +1 -0
  30. package/pi-extension/src/index.ts +230 -56
  31. package/pi-extension/src/{host-producer-identification.ts → output-router/host-producer-identification.ts} +37 -7
  32. package/pi-extension/src/{native-safety-net.ts → output-router/native-safety-net.ts} +8 -12
  33. package/pi-extension/src/{observed-tool-routing.ts → output-router/observed-tool-routing.ts} +19 -11
  34. package/pi-extension/src/{renderers.ts → output-router/renderers.ts} +246 -55
  35. package/pi-extension/src/{router-tools.ts → output-router/router-tools.ts} +130 -29
  36. package/pi-extension/src/{schemas.ts → output-router/schemas.ts} +171 -43
  37. package/pi-extension/src/output-router/status.ts +791 -0
  38. package/pi-extension/src/{utils.ts → output-router/utils.ts} +80 -18
  39. package/pi-extension/src/runtime/runtime-context.ts +895 -0
  40. package/pi-extension/src/settings/settings-tui.ts +408 -0
  41. package/pi-extension/src/settings/settings-ui.ts +1730 -0
  42. package/pi-extension/tests/integration/pi-extension.test.js +4020 -0
  43. package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
  44. package/pi-extension/tests/output-router/search.test.js +722 -0
  45. package/pi-extension/tests/settings/settings-tui.test.js +243 -0
  46. package/router/dist/benchmarks/benchmark-harness.d.ts +16 -13
  47. package/router/dist/benchmarks/benchmark-harness.js +62 -62
  48. package/router/dist/benchmarks/benchmarks.d.ts +80 -73
  49. package/router/dist/benchmarks/benchmarks.js +860 -761
  50. package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +71 -67
  51. package/router/dist/benchmarks/codex-qa-benchmarks.js +429 -390
  52. package/router/dist/benchmarks/command-benchmarks.d.ts +107 -92
  53. package/router/dist/benchmarks/command-benchmarks.js +616 -571
  54. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +64 -56
  55. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +679 -613
  56. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +103 -95
  57. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1188 -1103
  58. package/router/dist/benchmarks/context-saving-baseline.d.ts +47 -41
  59. package/router/dist/benchmarks/context-saving-baseline.js +405 -374
  60. package/router/dist/benchmarks/index-benchmarks.d.ts +74 -69
  61. package/router/dist/benchmarks/index-benchmarks.js +761 -661
  62. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +80 -69
  63. package/router/dist/benchmarks/storage-policy-benchmarks.js +549 -469
  64. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +43 -34
  65. package/router/dist/benchmarks/vault-index-benchmarks.js +294 -229
  66. package/router/dist/config/config.d.ts +62 -55
  67. package/router/dist/config/config.js +552 -373
  68. package/router/dist/config/router-contract.d.ts +2 -2
  69. package/router/dist/config/router-contract.js +38 -38
  70. package/router/dist/config/schema.d.ts +19 -10
  71. package/router/dist/config/schema.js +586 -538
  72. package/router/dist/config/types.d.ts +413 -361
  73. package/router/dist/config/types.js +19 -8
  74. package/router/dist/evidence/bounded-evidence.d.ts +26 -26
  75. package/router/dist/evidence/bounded-evidence.js +265 -252
  76. package/router/dist/evidence/evidence-range-selector.d.ts +16 -14
  77. package/router/dist/evidence/evidence-range-selector.js +192 -191
  78. package/router/dist/evidence/evidence-search.d.ts +18 -16
  79. package/router/dist/evidence/evidence-search.js +401 -377
  80. package/router/dist/evidence/evidence.d.ts +17 -17
  81. package/router/dist/evidence/evidence.js +163 -159
  82. package/router/dist/evidence/failure-contracts.d.ts +25 -15
  83. package/router/dist/evidence/failure-contracts.js +132 -126
  84. package/router/dist/evidence/line-ranges.d.ts +17 -15
  85. package/router/dist/evidence/line-ranges.js +18 -18
  86. package/router/dist/experiments/local-index.d.ts +47 -41
  87. package/router/dist/experiments/local-index.js +477 -458
  88. package/router/dist/local/local-traversal.d.ts +18 -0
  89. package/router/dist/local/local-traversal.js +334 -0
  90. package/router/dist/processing/engine.d.ts +94 -70
  91. package/router/dist/processing/engine.js +462 -364
  92. package/router/dist/processing/reducers.d.ts +208 -194
  93. package/router/dist/processing/reducers.js +1434 -1256
  94. package/router/dist/processing/renderers.d.ts +24 -18
  95. package/router/dist/processing/renderers.js +161 -152
  96. package/router/dist/processing/scripts.d.ts +80 -67
  97. package/router/dist/processing/scripts.js +343 -290
  98. package/router/dist/repo/repo-traversal.d.ts +9 -9
  99. package/router/dist/repo/repo-traversal.js +205 -202
  100. package/router/dist/routing/observed-reducers.d.ts +25 -19
  101. package/router/dist/routing/observed-reducers.js +559 -545
  102. package/router/dist/routing/observed-routing.d.ts +23 -14
  103. package/router/dist/routing/observed-routing.js +319 -318
  104. package/router/dist/routing/parsers.d.ts +10 -10
  105. package/router/dist/routing/parsers.js +454 -406
  106. package/router/dist/routing/run-filters.d.ts +45 -41
  107. package/router/dist/routing/run-filters.js +215 -207
  108. package/router/dist/routing/run-reducers.d.ts +45 -26
  109. package/router/dist/routing/run-reducers.js +102 -90
  110. package/router/dist/sandbox/adapter-roots.d.ts +34 -26
  111. package/router/dist/sandbox/adapter-roots.js +43 -41
  112. package/router/dist/sandbox/eryx-python-adapter.d.ts +9 -5
  113. package/router/dist/sandbox/eryx-python-adapter.js +659 -588
  114. package/router/dist/sandbox/jq-wasm-adapter.d.ts +3 -3
  115. package/router/dist/sandbox/jq-wasm-adapter.js +319 -311
  116. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +9 -5
  117. package/router/dist/sandbox/quickjs-wasi-adapter.js +336 -333
  118. package/router/dist/sandbox/script-sandbox.d.ts +105 -84
  119. package/router/dist/sandbox/script-sandbox.js +294 -260
  120. package/router/dist/setup/script-transform-adapters.d.ts +23 -19
  121. package/router/dist/setup/script-transform-adapters.js +223 -204
  122. package/router/dist/tools/batch.d.ts +27 -16
  123. package/router/dist/tools/batch.js +493 -416
  124. package/router/dist/tools/run.d.ts +47 -35
  125. package/router/dist/tools/run.js +1172 -1087
  126. package/router/dist/tools/search.d.ts +53 -31
  127. package/router/dist/tools/search.js +1224 -1065
  128. package/router/dist/transform/engine.d.ts +121 -96
  129. package/router/dist/transform/engine.js +1853 -1736
  130. package/router/dist/vault/vault-index.d.ts +97 -78
  131. package/router/dist/vault/vault-index.js +347 -342
  132. package/router/dist/vault/vault.d.ts +109 -74
  133. package/router/dist/vault/vault.js +528 -533
  134. package/runtime/interaction-contract.md +16 -0
  135. package/skills/bypass/SKILL.md +52 -38
  136. package/skills/commit-work/SKILL.md +54 -46
  137. package/skills/commit-work/references/staging-decisions.md +46 -24
  138. package/skills/decision-gate/SKILL.md +48 -0
  139. package/skills/design-for-depth/SKILL.md +75 -59
  140. package/skills/design-for-depth/references/design-pressure-signals.md +56 -7
  141. package/skills/design-for-depth/references/interface-design-loop.md +156 -0
  142. package/skills/design-for-depth/references/software-design-philosophy.md +32 -3
  143. package/skills/diagnose-failure/SKILL.md +65 -60
  144. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
  145. package/skills/diagnose-failure/references/flaky-and-performance.md +30 -18
  146. package/skills/discuss/SKILL.md +121 -0
  147. package/skills/discuss/references/checkpoints.md +66 -0
  148. package/skills/evaluate-skill/SKILL.md +62 -53
  149. package/skills/evaluate-skill/references/definition-schema.md +345 -0
  150. package/skills/evaluate-skill/references/evaluation-design.md +86 -0
  151. package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
  152. package/skills/evaluate-skill/references/review-and-revision.md +51 -0
  153. package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
  154. package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
  155. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
  156. package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
  157. package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
  158. package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
  159. package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
  160. package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
  161. package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
  162. package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
  163. package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
  164. package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
  165. package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
  166. package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
  167. package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
  168. package/skills/execute-work/SKILL.md +99 -0
  169. package/skills/execute-work/references/code-practices.md +78 -0
  170. package/skills/execute-work/references/execution-loop.md +77 -0
  171. package/skills/finish-branch/SKILL.md +117 -0
  172. package/skills/finish-branch/references/integration-options.md +80 -0
  173. package/skills/handoff/SKILL.md +65 -39
  174. package/skills/handoff/references/templates.md +104 -27
  175. package/skills/launch-work/SKILL.md +116 -0
  176. package/skills/launch-work/references/launch-readiness.md +85 -0
  177. package/skills/migration-work/SKILL.md +115 -0
  178. package/skills/migration-work/references/migration-lifecycle.md +82 -0
  179. package/skills/mode-contract/SKILL.md +72 -52
  180. package/skills/release-work/SKILL.md +118 -0
  181. package/skills/release-work/references/release-evidence.md +78 -0
  182. package/skills/review-artifact/SKILL.md +77 -69
  183. package/skills/review-artifact/references/reviewer-prompt.md +133 -42
  184. package/skills/review-work/SKILL.md +82 -57
  185. package/skills/review-work/references/reviewer-prompt.md +97 -60
  186. package/skills/review-work/references/security-risk-lens.md +67 -0
  187. package/skills/setup-freeflow/SKILL.md +54 -68
  188. package/skills/setup-freeflow/references/activation-contract.md +84 -69
  189. package/skills/setup-freeflow/references/host-setup.md +50 -17
  190. package/skills/simplify-code/SKILL.md +80 -0
  191. package/skills/simplify-code/references/simplification-patterns.md +70 -0
  192. package/skills/tdd/SKILL.md +96 -0
  193. package/skills/tdd/references/test-design.md +96 -0
  194. package/skills/track-work/SKILL.md +84 -0
  195. package/skills/track-work/references/working-record-schema.md +378 -0
  196. package/skills/verify-work/SKILL.md +59 -38
  197. package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
  198. package/skills/verify-work/references/integration-evidence.md +51 -0
  199. package/skills/verify-work/references/performance-evidence.md +57 -0
  200. package/skills/workflow/SKILL.md +53 -59
  201. package/skills/workflow/references/domain-skill-composition.md +57 -0
  202. package/skills/workflow/references/workflow-loop.md +92 -0
  203. package/skills/write-plan/SKILL.md +85 -58
  204. package/skills/write-plan/references/plan-shapes.md +132 -46
  205. package/skills/write-skill/SKILL.md +82 -51
  206. package/skills/write-skill/references/activation-boundaries.md +62 -0
  207. package/skills/write-skill/references/agent-first-instructions.md +87 -0
  208. package/skills/write-skill/references/progressive-disclosure.md +63 -0
  209. package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
  210. package/skills/write-skill/scripts/skill-author.mjs +104 -0
  211. package/skills/write-spec/SKILL.md +65 -54
  212. package/skills/write-spec/references/artifact-standards.md +60 -41
  213. package/skills/write-spec/references/decision-records.md +77 -0
  214. package/skills/write-spec/references/spec-shapes.md +119 -60
  215. package/evals/README.md +0 -32
  216. package/evals/fixtures/copy-conventions.md +0 -31
  217. package/evals/fixtures/output-router/README.md +0 -12
  218. package/evals/fixtures/output-router/failed-command-output.txt +0 -9
  219. package/evals/fixtures/output-router/large-router-manual.md +0 -63
  220. package/evals/fixtures/output-router/native-large-output.txt +0 -40
  221. package/evals/fixtures/output-router/noisy-test-output.txt +0 -30
  222. package/evals/fixtures/output-router/verification-output.txt +0 -8
  223. package/evals/fixtures/tiny-artifact-review-app/README.md +0 -5
  224. package/evals/fixtures/tiny-artifact-review-app/docs/billing-policy.md +0 -10
  225. package/evals/fixtures/tiny-artifact-review-app/docs/specs/billing-webhook-api-draft.md +0 -21
  226. package/evals/fixtures/tiny-artifact-review-app/docs/specs/failed-payment-grace-period.md +0 -24
  227. package/evals/fixtures/tiny-artifact-review-app/docs/specs/immediate-downgrade.md +0 -17
  228. package/evals/fixtures/tiny-artifact-review-app/tests/billing.test.md +0 -8
  229. package/evals/fixtures/tiny-commit-ambiguous-app/.freeflow-eval-setup.sh +0 -15
  230. package/evals/fixtures/tiny-commit-ambiguous-app/README.md +0 -3
  231. package/evals/fixtures/tiny-commit-ambiguous-app/src/billing.ts +0 -5
  232. package/evals/fixtures/tiny-commit-ambiguous-app/src/settings-page.ts +0 -1
  233. package/evals/fixtures/tiny-commit-ambiguous-app/tests/settings.test.md +0 -5
  234. package/evals/fixtures/tiny-commit-app/.freeflow-eval-setup.sh +0 -14
  235. package/evals/fixtures/tiny-commit-app/README.md +0 -3
  236. package/evals/fixtures/tiny-commit-app/docs/specs/settings-title.md +0 -5
  237. package/evals/fixtures/tiny-commit-app/src/billing.ts +0 -5
  238. package/evals/fixtures/tiny-commit-app/src/settings-page.ts +0 -1
  239. package/evals/fixtures/tiny-commit-app/tests/settings.test.md +0 -5
  240. package/evals/fixtures/tiny-commit-everything-app/.freeflow-eval-setup.sh +0 -15
  241. package/evals/fixtures/tiny-commit-everything-app/README.md +0 -3
  242. package/evals/fixtures/tiny-commit-everything-app/docs/specs/settings-title.md +0 -5
  243. package/evals/fixtures/tiny-commit-everything-app/src/billing.ts +0 -5
  244. package/evals/fixtures/tiny-commit-everything-app/src/settings-page.ts +0 -1
  245. package/evals/fixtures/tiny-commit-everything-app/tests/settings.test.md +0 -5
  246. package/evals/fixtures/tiny-commit-staged-app/.freeflow-eval-setup.sh +0 -15
  247. package/evals/fixtures/tiny-commit-staged-app/README.md +0 -3
  248. package/evals/fixtures/tiny-commit-staged-app/docs/specs/settings-title.md +0 -5
  249. package/evals/fixtures/tiny-commit-staged-app/src/billing.ts +0 -5
  250. package/evals/fixtures/tiny-commit-staged-app/src/settings-page.ts +0 -1
  251. package/evals/fixtures/tiny-commit-staged-app/tests/settings.test.md +0 -5
  252. package/evals/fixtures/tiny-commit-staged-mixed-app/.freeflow-eval-setup.sh +0 -15
  253. package/evals/fixtures/tiny-commit-staged-mixed-app/README.md +0 -3
  254. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/billing-policy.md +0 -3
  255. package/evals/fixtures/tiny-commit-staged-mixed-app/docs/release-notes.md +0 -3
  256. package/evals/fixtures/tiny-commit-staged-mixed-app/src/billing.ts +0 -5
  257. package/evals/fixtures/tiny-dashboard-stale-app/README.md +0 -11
  258. package/evals/fixtures/tiny-dashboard-stale-app/src/api-client.ts +0 -13
  259. package/evals/fixtures/tiny-dashboard-stale-app/src/dashboard-data.ts +0 -19
  260. package/evals/fixtures/tiny-dashboard-stale-app/tests/dashboard-data.test.md +0 -9
  261. package/evals/fixtures/tiny-decision-destination-app/README.md +0 -6
  262. package/evals/fixtures/tiny-decision-destination-app/src/risk.ts +0 -8
  263. package/evals/fixtures/tiny-decision-destination-app/tests/risk.test.md +0 -4
  264. package/evals/fixtures/tiny-design-depth-app/README.md +0 -15
  265. package/evals/fixtures/tiny-design-depth-app/src/routes.ts +0 -25
  266. package/evals/fixtures/tiny-design-depth-app/src/sendEmail.ts +0 -3
  267. package/evals/fixtures/tiny-design-depth-app/src/sendSms.ts +0 -3
  268. package/evals/fixtures/tiny-design-depth-app/src/telemetry.ts +0 -3
  269. package/evals/fixtures/tiny-design-depth-app/tests/routes.test.md +0 -12
  270. package/evals/fixtures/tiny-eval-method-app/README.md +0 -8
  271. package/evals/fixtures/tiny-eval-method-app/evals/reports/review-pr-eval-result.md +0 -5
  272. package/evals/fixtures/tiny-eval-method-app/evals/reports/triage-question-failure.md +0 -17
  273. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.diff +0 -11
  274. package/evals/fixtures/tiny-eval-method-app/evals/runs/review-pr-with-skill-output.md +0 -3
  275. package/evals/fixtures/tiny-eval-method-app/skills/review-pr/SKILL.md +0 -10
  276. package/evals/fixtures/tiny-eval-method-app/skills/triage-question/SKILL.md +0 -10
  277. package/evals/fixtures/tiny-execute-plan-app/README.md +0 -5
  278. package/evals/fixtures/tiny-execute-plan-app/checks/settings-and-billing-check.sh +0 -5
  279. package/evals/fixtures/tiny-execute-plan-app/docs/billing-policy.md +0 -10
  280. package/evals/fixtures/tiny-execute-plan-app/docs/plans/immediate-downgrade-plan.md +0 -11
  281. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-plan.md +0 -12
  282. package/evals/fixtures/tiny-execute-plan-app/docs/plans/settings-title-with-bad-check.md +0 -15
  283. package/evals/fixtures/tiny-execute-plan-app/docs/plans/unverified-billing-plan.md +0 -9
  284. package/evals/fixtures/tiny-execute-plan-app/docs/specs/failed-payment-grace-period.md +0 -9
  285. package/evals/fixtures/tiny-execute-plan-app/docs/specs/settings-title.md +0 -9
  286. package/evals/fixtures/tiny-execute-plan-app/src/billing.ts +0 -7
  287. package/evals/fixtures/tiny-execute-plan-app/src/settings-page.ts +0 -1
  288. package/evals/fixtures/tiny-execute-plan-app/tests/billing.test.md +0 -7
  289. package/evals/fixtures/tiny-execute-plan-app/tests/settings.test.md +0 -5
  290. package/evals/fixtures/tiny-execute-review-loop-app/README.md +0 -5
  291. package/evals/fixtures/tiny-execute-review-loop-app/docs/billing-policy.md +0 -9
  292. package/evals/fixtures/tiny-execute-review-loop-app/docs/plans/settings-title-plan.md +0 -12
  293. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/previous-agent-summary.md +0 -15
  294. package/evals/fixtures/tiny-execute-review-loop-app/docs/review/review-pass-1-non-pass.md +0 -11
  295. package/evals/fixtures/tiny-execute-review-loop-app/docs/specs/settings-title.md +0 -9
  296. package/evals/fixtures/tiny-execute-review-loop-app/src/billing.ts +0 -7
  297. package/evals/fixtures/tiny-execute-review-loop-app/src/settings-page.ts +0 -1
  298. package/evals/fixtures/tiny-execute-review-loop-app/tests/billing.test.md +0 -7
  299. package/evals/fixtures/tiny-execute-review-loop-app/tests/settings.test.md +0 -5
  300. package/evals/fixtures/tiny-flaky-session-app/README.md +0 -10
  301. package/evals/fixtures/tiny-flaky-session-app/src/session-timeout.ts +0 -13
  302. package/evals/fixtures/tiny-flaky-session-app/tests/session-timeout.test.md +0 -8
  303. package/evals/fixtures/tiny-handoff-app/README.md +0 -5
  304. package/evals/fixtures/tiny-handoff-app/docs/billing-policy.md +0 -10
  305. package/evals/fixtures/tiny-handoff-app/docs/handoffs/old-agent-handoff.md +0 -8
  306. package/evals/fixtures/tiny-handoff-app/docs/plans/billing-retry-plan.md +0 -11
  307. package/evals/fixtures/tiny-handoff-app/src/billing.ts +0 -7
  308. package/evals/fixtures/tiny-handoff-report-app/README.md +0 -3
  309. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.diff +0 -1
  310. package/evals/fixtures/tiny-handoff-report-app/evals/runs/handoff-3/hof-003/with-skill-output.md +0 -1
  311. package/evals/fixtures/tiny-handoff-report-app/evals/scores/hof-003-score.txt +0 -4
  312. package/evals/fixtures/tiny-plan-app/README.md +0 -5
  313. package/evals/fixtures/tiny-plan-app/docs/billing-policy.md +0 -10
  314. package/evals/fixtures/tiny-plan-app/docs/specs/failed-payment-grace-period.md +0 -25
  315. package/evals/fixtures/tiny-plan-app/src/billing.ts +0 -17
  316. package/evals/fixtures/tiny-plan-app/src/settings-page.ts +0 -1
  317. package/evals/fixtures/tiny-plan-app/tests/billing.test.md +0 -8
  318. package/evals/fixtures/tiny-plan-app/tests/settings.test.md +0 -5
  319. package/evals/fixtures/tiny-plan-strict-api-app/README.md +0 -3
  320. package/evals/fixtures/tiny-plan-strict-api-app/docs/billing-policy.md +0 -5
  321. package/evals/fixtures/tiny-plan-strict-api-app/docs/specs/billing-webhook-api.md +0 -25
  322. package/evals/fixtures/tiny-plan-strict-api-app/src/billing.ts +0 -5
  323. package/evals/fixtures/tiny-plan-strict-api-app/src/webhooks.ts +0 -3
  324. package/evals/fixtures/tiny-plan-strict-api-app/tests/billing-webhook.test.md +0 -8
  325. package/evals/fixtures/tiny-post-setup-invalid-config-app/.freeflow/config.json +0 -3
  326. package/evals/fixtures/tiny-post-setup-invalid-config-app/AGENTS.md +0 -15
  327. package/evals/fixtures/tiny-post-setup-invalid-config-app/README.md +0 -16
  328. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/auth-review.md +0 -15
  329. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/billing-policy.md +0 -10
  330. package/evals/fixtures/tiny-post-setup-invalid-config-app/docs/copy-conventions.md +0 -15
  331. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/auth-middleware.ts +0 -12
  332. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/billing.ts +0 -20
  333. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/login-copy.ts +0 -1
  334. package/evals/fixtures/tiny-post-setup-invalid-config-app/src/settings-page.ts +0 -1
  335. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/auth-middleware.test.md +0 -8
  336. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/billing.test.md +0 -8
  337. package/evals/fixtures/tiny-post-setup-invalid-config-app/tests/copy.test.md +0 -7
  338. package/evals/fixtures/tiny-post-setup-missing-config-app/AGENTS.md +0 -15
  339. package/evals/fixtures/tiny-post-setup-missing-config-app/README.md +0 -16
  340. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/auth-review.md +0 -15
  341. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/billing-policy.md +0 -10
  342. package/evals/fixtures/tiny-post-setup-missing-config-app/docs/copy-conventions.md +0 -15
  343. package/evals/fixtures/tiny-post-setup-missing-config-app/src/auth-middleware.ts +0 -12
  344. package/evals/fixtures/tiny-post-setup-missing-config-app/src/billing.ts +0 -20
  345. package/evals/fixtures/tiny-post-setup-missing-config-app/src/login-copy.ts +0 -1
  346. package/evals/fixtures/tiny-post-setup-missing-config-app/src/settings-page.ts +0 -1
  347. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/auth-middleware.test.md +0 -8
  348. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/billing.test.md +0 -8
  349. package/evals/fixtures/tiny-post-setup-missing-config-app/tests/copy.test.md +0 -7
  350. package/evals/fixtures/tiny-post-setup-source-conflict-app/.freeflow/config.json +0 -3
  351. package/evals/fixtures/tiny-post-setup-source-conflict-app/AGENTS.md +0 -15
  352. package/evals/fixtures/tiny-post-setup-source-conflict-app/README.md +0 -16
  353. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/auth-review.md +0 -15
  354. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/billing-policy.md +0 -10
  355. package/evals/fixtures/tiny-post-setup-source-conflict-app/docs/copy-conventions.md +0 -15
  356. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/auth-middleware.ts +0 -12
  357. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/billing.ts +0 -20
  358. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/login-copy.ts +0 -1
  359. package/evals/fixtures/tiny-post-setup-source-conflict-app/src/settings-page.ts +0 -1
  360. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/auth-middleware.test.md +0 -8
  361. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/billing.test.md +0 -8
  362. package/evals/fixtures/tiny-post-setup-source-conflict-app/tests/copy.test.md +0 -7
  363. package/evals/fixtures/tiny-report-performance-app/README.md +0 -11
  364. package/evals/fixtures/tiny-report-performance-app/docs/performance.md +0 -10
  365. package/evals/fixtures/tiny-report-performance-app/src/report-summary.ts +0 -29
  366. package/evals/fixtures/tiny-report-performance-app/tests/report-performance.test.md +0 -8
  367. package/evals/fixtures/tiny-review-request-app/README.md +0 -3
  368. package/evals/fixtures/tiny-review-request-app/docs/billing-policy.md +0 -5
  369. package/evals/fixtures/tiny-review-request-app/docs/plans/billing-webhook-api.md +0 -19
  370. package/evals/fixtures/tiny-review-request-app/docs/review/previous-agent-summary.md +0 -20
  371. package/evals/fixtures/tiny-review-request-app/docs/specs/billing-webhook-api.md +0 -25
  372. package/evals/fixtures/tiny-review-request-app/src/billing.ts +0 -11
  373. package/evals/fixtures/tiny-review-request-app/src/webhooks.ts +0 -19
  374. package/evals/fixtures/tiny-review-request-app/tests/billing-webhook.test.md +0 -8
  375. package/evals/fixtures/tiny-review-work-app/README.md +0 -5
  376. package/evals/fixtures/tiny-review-work-app/docs/billing-policy.md +0 -9
  377. package/evals/fixtures/tiny-review-work-app/docs/plans/settings-title-plan.md +0 -12
  378. package/evals/fixtures/tiny-review-work-app/docs/review/previous-agent-summary.md +0 -15
  379. package/evals/fixtures/tiny-review-work-app/docs/specs/settings-title.md +0 -9
  380. package/evals/fixtures/tiny-review-work-app/src/billing.ts +0 -7
  381. package/evals/fixtures/tiny-review-work-app/src/settings-page.ts +0 -1
  382. package/evals/fixtures/tiny-review-work-app/tests/billing.test.md +0 -7
  383. package/evals/fixtures/tiny-review-work-app/tests/settings.test.md +0 -5
  384. package/evals/fixtures/tiny-saas-app/README.md +0 -16
  385. package/evals/fixtures/tiny-saas-app/docs/auth-review.md +0 -15
  386. package/evals/fixtures/tiny-saas-app/docs/billing-policy.md +0 -10
  387. package/evals/fixtures/tiny-saas-app/docs/copy-conventions.md +0 -15
  388. package/evals/fixtures/tiny-saas-app/docs/specs/settings-title.md +0 -13
  389. package/evals/fixtures/tiny-saas-app/src/auth-middleware.ts +0 -12
  390. package/evals/fixtures/tiny-saas-app/src/billing.ts +0 -20
  391. package/evals/fixtures/tiny-saas-app/src/login-copy.ts +0 -1
  392. package/evals/fixtures/tiny-saas-app/src/settings-page.ts +0 -1
  393. package/evals/fixtures/tiny-saas-app/tests/auth-middleware.test.md +0 -8
  394. package/evals/fixtures/tiny-saas-app/tests/billing.test.md +0 -8
  395. package/evals/fixtures/tiny-saas-app/tests/copy.test.md +0 -7
  396. package/evals/fixtures/tiny-setup-agents-app/AGENTS.md +0 -6
  397. package/evals/fixtures/tiny-setup-both-app/AGENTS.md +0 -5
  398. package/evals/fixtures/tiny-setup-both-app/CLAUDE.md +0 -5
  399. package/evals/fixtures/tiny-setup-claude-app/CLAUDE.md +0 -6
  400. package/evals/fixtures/tiny-setup-codex-rules-app/.codex/rules/shell.rules +0 -5
  401. package/evals/fixtures/tiny-setup-codex-rules-app/AGENTS.md +0 -6
  402. package/evals/fixtures/tiny-setup-conflict-app/AGENTS.md +0 -6
  403. package/evals/fixtures/tiny-setup-existing-block-app/AGENTS.md +0 -14
  404. package/evals/fixtures/tiny-setup-four-rules-app/CLAUDE.md +0 -6
  405. package/evals/fixtures/tiny-skill-dev-app/README.md +0 -10
  406. package/evals/fixtures/tiny-skill-dev-app/evals/prompts/review-pr-001.txt +0 -8
  407. package/evals/fixtures/tiny-skill-dev-app/evals/reports/review-pr-failure.md +0 -17
  408. package/evals/fixtures/tiny-skill-dev-app/skills/review-pr/SKILL.md +0 -13
  409. package/evals/fixtures/tiny-team-app/README.md +0 -5
  410. package/evals/fixtures/tiny-team-app/docs/product.md +0 -6
  411. package/evals/fixtures/tiny-team-app/src/teams.ts +0 -9
  412. package/evals/fixtures/tiny-team-app/src/users.ts +0 -5
  413. package/evals/fixtures/tiny-team-app/tests/teams.test.md +0 -7
  414. package/evals/fixtures/tiny-verify-app/README.md +0 -5
  415. package/evals/fixtures/tiny-verify-app/src/settings-nav.ts +0 -1
  416. package/evals/fixtures/tiny-verify-app/src/settings-page.ts +0 -1
  417. package/evals/fixtures/tiny-verify-app/tests/settings.test.md +0 -7
  418. package/evals/prompts/aon-001.txt +0 -2
  419. package/evals/prompts/byp-001.txt +0 -2
  420. package/evals/prompts/byp-002.txt +0 -2
  421. package/evals/prompts/cap-001.txt +0 -3
  422. package/evals/prompts/cap-002.txt +0 -3
  423. package/evals/prompts/cmd-001.txt +0 -3
  424. package/evals/prompts/cmd-002.txt +0 -3
  425. package/evals/prompts/cmd-003.txt +0 -6
  426. package/evals/prompts/cmd-004.txt +0 -5
  427. package/evals/prompts/cmd-005.txt +0 -5
  428. package/evals/prompts/cmd-006.txt +0 -5
  429. package/evals/prompts/cmd-007.txt +0 -5
  430. package/evals/prompts/cmd-008.txt +0 -5
  431. package/evals/prompts/cmd-009.txt +0 -8
  432. package/evals/prompts/cmd-010.txt +0 -5
  433. package/evals/prompts/cmd-011.txt +0 -5
  434. package/evals/prompts/cmd-012.txt +0 -5
  435. package/evals/prompts/cmd-013.txt +0 -5
  436. package/evals/prompts/cmd-014.txt +0 -7
  437. package/evals/prompts/cmd-015.txt +0 -7
  438. package/evals/prompts/cmd-016.txt +0 -5
  439. package/evals/prompts/cmt-001.txt +0 -1
  440. package/evals/prompts/cmt-002.txt +0 -1
  441. package/evals/prompts/cmt-003.txt +0 -1
  442. package/evals/prompts/cmt-004.txt +0 -1
  443. package/evals/prompts/cmt-005.txt +0 -1
  444. package/evals/prompts/dfd-001.txt +0 -3
  445. package/evals/prompts/dia-001.txt +0 -3
  446. package/evals/prompts/dia-002.txt +0 -3
  447. package/evals/prompts/dia-003.txt +0 -3
  448. package/evals/prompts/dis-001.txt +0 -5
  449. package/evals/prompts/dis-002.txt +0 -5
  450. package/evals/prompts/esk-001.txt +0 -5
  451. package/evals/prompts/esk-002.txt +0 -5
  452. package/evals/prompts/esk-003.txt +0 -5
  453. package/evals/prompts/grc-001.txt +0 -3
  454. package/evals/prompts/hof-001.txt +0 -3
  455. package/evals/prompts/hof-002.txt +0 -1
  456. package/evals/prompts/hof-003.txt +0 -1
  457. package/evals/prompts/hof-004.txt +0 -1
  458. package/evals/prompts/hof-005.txt +0 -1
  459. package/evals/prompts/ivg-001.txt +0 -1
  460. package/evals/prompts/ivg-002.txt +0 -11
  461. package/evals/prompts/ivg-003.txt +0 -1
  462. package/evals/prompts/ivg-004.txt +0 -1
  463. package/evals/prompts/mode-001.txt +0 -3
  464. package/evals/prompts/mode-002.txt +0 -1
  465. package/evals/prompts/mode-003.txt +0 -3
  466. package/evals/prompts/mode-004.txt +0 -3
  467. package/evals/prompts/mode-005.txt +0 -3
  468. package/evals/prompts/mode-006.txt +0 -3
  469. package/evals/prompts/mode-007.txt +0 -3
  470. package/evals/prompts/otr-001.txt +0 -3
  471. package/evals/prompts/otr-002.txt +0 -3
  472. package/evals/prompts/rar-001.txt +0 -5
  473. package/evals/prompts/rar-002.txt +0 -3
  474. package/evals/prompts/rar-003.txt +0 -6
  475. package/evals/prompts/rar-004.txt +0 -15
  476. package/evals/prompts/rar-005.txt +0 -10
  477. package/evals/prompts/rbr-001.txt +0 -3
  478. package/evals/prompts/rbr-002.txt +0 -3
  479. package/evals/prompts/rbr-003.txt +0 -7
  480. package/evals/prompts/rev-001.txt +0 -3
  481. package/evals/prompts/rev-002.txt +0 -5
  482. package/evals/prompts/rev-003.txt +0 -6
  483. package/evals/prompts/rev-004.txt +0 -1
  484. package/evals/prompts/rev-005.txt +0 -15
  485. package/evals/prompts/rev-006.txt +0 -5
  486. package/evals/prompts/stp-001.txt +0 -1
  487. package/evals/prompts/stp-002.txt +0 -1
  488. package/evals/prompts/stp-003.txt +0 -1
  489. package/evals/prompts/stp-004.txt +0 -1
  490. package/evals/prompts/stp-005.txt +0 -1
  491. package/evals/prompts/stp-006.txt +0 -1
  492. package/evals/prompts/stp-007.txt +0 -1
  493. package/evals/prompts/stp-008.txt +0 -1
  494. package/evals/prompts/stp-009.txt +0 -1
  495. package/evals/prompts/stp-010.txt +0 -1
  496. package/evals/prompts/stp-011.txt +0 -1
  497. package/evals/prompts/vfy-003.txt +0 -1
  498. package/evals/prompts/wpl-001.txt +0 -3
  499. package/evals/prompts/wpl-002.txt +0 -5
  500. package/evals/prompts/wpl-003.txt +0 -3
  501. package/evals/prompts/wpl-004.txt +0 -5
  502. package/evals/prompts/wpl-005.txt +0 -1
  503. package/evals/prompts/wrc-001.txt +0 -10
  504. package/evals/prompts/wrc-002.txt +0 -3
  505. package/evals/prompts/wsk-001.txt +0 -6
  506. package/evals/prompts/wsp-001.txt +0 -5
  507. package/evals/prompts/wsp-002.txt +0 -15
  508. package/evals/prompts/wsp-003.txt +0 -3
  509. package/evals/prompts/wsp-004.txt +0 -15
  510. package/evals/prompts/wsp-005.txt +0 -5
  511. package/evals/prompts/wsp-006.txt +0 -12
  512. package/evals/prompts/wsp-007.txt +0 -9
  513. package/evals/prompts/wsp-008.txt +0 -13
  514. package/evals/prompts/xpl-001.txt +0 -1
  515. package/evals/prompts/xpl-002.txt +0 -3
  516. package/evals/prompts/xpl-003.txt +0 -3
  517. package/evals/prompts/xpl-004.txt +0 -3
  518. package/evals/prompts/xpl-005.txt +0 -5
  519. package/evals/prompts/xpl-006.txt +0 -3
  520. package/evals/registries/adversarial-evals.json +0 -39
  521. package/evals/registries/fixture-evals.json +0 -2513
  522. package/evals/registries/handoff-evals.json +0 -74
  523. package/evals/registries/legacy-evals.json +0 -147
  524. package/evals/registries/skill-evidence.json +0 -193
  525. package/evals/registries/verify-work-evals.json +0 -46
  526. package/evals/reports/acceptance/v0.1-acceptance-report.md +0 -130
  527. package/evals/reports/by-command-surface/command-surface-1-report.md +0 -45
  528. package/evals/reports/by-command-surface/command-surface-10-report.md +0 -76
  529. package/evals/reports/by-command-surface/command-surface-11-report.md +0 -77
  530. package/evals/reports/by-command-surface/command-surface-12-report.md +0 -91
  531. package/evals/reports/by-command-surface/command-surface-13-report.md +0 -64
  532. package/evals/reports/by-command-surface/command-surface-14-report.md +0 -66
  533. package/evals/reports/by-command-surface/command-surface-15-report.md +0 -124
  534. package/evals/reports/by-command-surface/command-surface-16-report.md +0 -39
  535. package/evals/reports/by-command-surface/command-surface-2-report.md +0 -80
  536. package/evals/reports/by-command-surface/command-surface-3-report.md +0 -86
  537. package/evals/reports/by-command-surface/command-surface-4-report.md +0 -76
  538. package/evals/reports/by-command-surface/command-surface-5-report.md +0 -80
  539. package/evals/reports/by-command-surface/command-surface-6-report.md +0 -74
  540. package/evals/reports/by-command-surface/command-surface-7-report.md +0 -84
  541. package/evals/reports/by-command-surface/command-surface-8-report.md +0 -79
  542. package/evals/reports/by-command-surface/command-surface-9-report.md +0 -79
  543. package/evals/reports/by-command-surface/command-surface-matrix.md +0 -91
  544. package/evals/reports/by-skill/bypass-1-report.md +0 -124
  545. package/evals/reports/by-skill/capture-decisions-1-report.md +0 -99
  546. package/evals/reports/by-skill/capture-decisions-2-report.md +0 -102
  547. package/evals/reports/by-skill/commit-work-1-report.md +0 -165
  548. package/evals/reports/by-skill/commit-work-2-report.md +0 -109
  549. package/evals/reports/by-skill/design-for-depth-1-report.md +0 -95
  550. package/evals/reports/by-skill/diagnose-failure-1-report.md +0 -91
  551. package/evals/reports/by-skill/diagnose-failure-2-report.md +0 -94
  552. package/evals/reports/by-skill/discover-1-report.md +0 -118
  553. package/evals/reports/by-skill/evaluate-skill-2-report.md +0 -71
  554. package/evals/reports/by-skill/execute-plan-1-report.md +0 -103
  555. package/evals/reports/by-skill/execute-plan-2-report.md +0 -112
  556. package/evals/reports/by-skill/execute-plan-3-report.md +0 -87
  557. package/evals/reports/by-skill/grill-context-1-report.md +0 -103
  558. package/evals/reports/by-skill/handoff-1-report.md +0 -123
  559. package/evals/reports/by-skill/handoff-2-report.md +0 -105
  560. package/evals/reports/by-skill/handoff-3-report.md +0 -100
  561. package/evals/reports/by-skill/handoff-7-report.md +0 -77
  562. package/evals/reports/by-skill/interview-gate-1-report.md +0 -63
  563. package/evals/reports/by-skill/interview-gate-2-report.md +0 -105
  564. package/evals/reports/by-skill/mode-contract-1-report.md +0 -74
  565. package/evals/reports/by-skill/mode-contract-2-report.md +0 -87
  566. package/evals/reports/by-skill/mode-contract-3-report.md +0 -65
  567. package/evals/reports/by-skill/mode-contract-4-report.md +0 -71
  568. package/evals/reports/by-skill/mode-contract-5-report.md +0 -70
  569. package/evals/reports/by-skill/output-router-1-report.md +0 -76
  570. package/evals/reports/by-skill/output-router-2-report.md +0 -65
  571. package/evals/reports/by-skill/research-1-report.md +0 -144
  572. package/evals/reports/by-skill/research-brief-1-report.md +0 -94
  573. package/evals/reports/by-skill/research-brief-2-report.md +0 -75
  574. package/evals/reports/by-skill/review-artifact-1-report.md +0 -91
  575. package/evals/reports/by-skill/review-artifact-2-report.md +0 -79
  576. package/evals/reports/by-skill/review-artifact-3-report.md +0 -120
  577. package/evals/reports/by-skill/review-artifact-4-report.md +0 -89
  578. package/evals/reports/by-skill/review-artifact-5-report.md +0 -66
  579. package/evals/reports/by-skill/review-work-1-report.md +0 -85
  580. package/evals/reports/by-skill/review-work-2-report.md +0 -87
  581. package/evals/reports/by-skill/review-work-3-report.md +0 -104
  582. package/evals/reports/by-skill/review-work-4-report.md +0 -108
  583. package/evals/reports/by-skill/review-work-5-report.md +0 -73
  584. package/evals/reports/by-skill/review-work-6-report.md +0 -66
  585. package/evals/reports/by-skill/setup-freeflow-1-report.md +0 -199
  586. package/evals/reports/by-skill/setup-freeflow-2-report.md +0 -105
  587. package/evals/reports/by-skill/setup-freeflow-3-report.md +0 -105
  588. package/evals/reports/by-skill/setup-freeflow-4-report.md +0 -88
  589. package/evals/reports/by-skill/setup-freeflow-5-report.md +0 -115
  590. package/evals/reports/by-skill/skill-authoring-1-report.md +0 -81
  591. package/evals/reports/by-skill/verify-work-1-report.md +0 -111
  592. package/evals/reports/by-skill/verify-work-2-report.md +0 -120
  593. package/evals/reports/by-skill/workflow-1-report.md +0 -65
  594. package/evals/reports/by-skill/write-plan-1-report.md +0 -123
  595. package/evals/reports/by-skill/write-plan-2-report.md +0 -98
  596. package/evals/reports/by-skill/write-plan-3-report.md +0 -110
  597. package/evals/reports/by-skill/write-spec-1-report.md +0 -88
  598. package/evals/reports/by-skill/write-spec-2-report.md +0 -89
  599. package/evals/reports/by-skill/write-spec-3-report.md +0 -90
  600. package/evals/reports/by-skill/write-spec-4-report.md +0 -167
  601. package/evals/reports/harness/claude-harness-1-report.md +0 -103
  602. package/evals/reports/harness/eval-harness-1-report.md +0 -91
  603. package/evals/reports/iterations/iteration-1-report.md +0 -71
  604. package/evals/reports/iterations/iteration-2-report.md +0 -78
  605. package/evals/reports/iterations/iteration-3-report.md +0 -118
  606. package/evals/reports/iterations/iteration-4-report.md +0 -131
  607. package/evals/reports/iterations/iteration-5-report.md +0 -149
  608. package/evals/reports/iterations/iteration-6-report.md +0 -136
  609. package/evals/reports/runtime/always-on-runtime-1-report.md +0 -107
  610. package/evals/reports/runtime/context-mode-normalized-benchmark-1-report.md +0 -52
  611. package/evals/reports/runtime/context-mode-real-deep-baseline-1-report.md +0 -410
  612. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-report.md +0 -203
  613. package/evals/reports/runtime/context-mode-real-deep-final-slice-11-review.md +0 -51
  614. package/evals/reports/runtime/context-saving-native-tools-baseline-1-report.md +0 -99
  615. package/evals/reports/runtime/eryx-python-compatibility-reprobe-1-report.md +0 -166
  616. package/evals/reports/runtime/eryx-python-proof-spike-1-report.md +0 -96
  617. package/evals/reports/runtime/eryx-python-proof-spike-2-report.md +0 -151
  618. package/evals/reports/runtime/eryx-python-script-derive-execution-1-report.md +0 -233
  619. package/evals/reports/runtime/jq-script-derive-execution-1-report.md +0 -215
  620. package/evals/reports/runtime/jq-wasm-proof-spike-1-report.md +0 -67
  621. package/evals/reports/runtime/output-router-benchmark-1-report.md +0 -81
  622. package/evals/reports/runtime/output-router-capture-derive-provider-eval-1-report.md +0 -35
  623. package/evals/reports/runtime/output-router-codex-large-index-sqlite-adhoc-report.md +0 -150
  624. package/evals/reports/runtime/output-router-codex-qa-benchmark-1-report.md +0 -46
  625. package/evals/reports/runtime/output-router-command-benchmark-1-report.md +0 -62
  626. package/evals/reports/runtime/output-router-index-benchmark-1-report.md +0 -64
  627. package/evals/reports/runtime/output-router-regression-1-report.md +0 -81
  628. package/evals/reports/runtime/output-router-transform-eval-1-report.md +0 -28
  629. package/evals/reports/runtime/pi-observed-routing-eval-1-report.md +0 -44
  630. package/evals/reports/runtime/quickjs-script-derive-execution-1-report.md +0 -159
  631. package/evals/reports/runtime/quickjs-wasi-proof-spike-1-report.md +0 -55
  632. package/evals/reports/runtime/render-format-row-protocol-1-report.md +0 -58
  633. package/evals/reports/runtime/script-sandbox-adapter-selection-review-1-report.md +0 -84
  634. package/evals/reports/runtime/script-sandbox-probe-resource-hardening-1-report.md +0 -51
  635. package/evals/reports/runtime/storage-policy-benchmark-1-report.md +0 -176
  636. package/evals/reports/runtime/vault-index-storage-spike-1-report.md +0 -39
  637. package/evals/reports/runtime/workflow-context-hook-1-report.md +0 -82
  638. package/evals/runbooks/adversarial-eval-runbook.md +0 -28
  639. package/evals/runbooks/fixture-eval-runbook.md +0 -137
  640. package/evals/runbooks/handoff-eval-runbook.md +0 -22
  641. package/evals/runbooks/verify-work-eval-runbook.md +0 -27
  642. package/evals/scripts/audit-command-surface.sh +0 -160
  643. package/evals/scripts/check-activation-contract.sh +0 -121
  644. package/evals/scripts/check-runtime-context-hook.sh +0 -183
  645. package/evals/scripts/grade-fixture-eval.sh +0 -446
  646. package/evals/scripts/run-claude-fixture-eval.sh +0 -26
  647. package/evals/scripts/run-codex-fixture-eval.sh +0 -26
  648. package/evals/scripts/run-eryx-python-proof-spike.js +0 -559
  649. package/evals/scripts/run-fixture-eval-by-id.sh +0 -23
  650. package/evals/scripts/run-fixture-eval.sh +0 -464
  651. package/evals/scripts/run-jq-wasm-proof-spike.js +0 -299
  652. package/evals/scripts/run-output-router-transform-eval.js +0 -115
  653. package/evals/scripts/run-pi-observed-routing-eval.js +0 -478
  654. package/evals/scripts/run-quickjs-wasi-proof-spike.js +0 -339
  655. package/evals/scripts/skill-evidence.sh +0 -316
  656. package/evals/scripts/validate-release-metadata.sh +0 -486
  657. package/evals/suites/v0.1-acceptance-suite.md +0 -131
  658. package/pi-extension/dist/host-producer-identification.js +0 -186
  659. package/pi-extension/dist/mcp-config.js +0 -30
  660. package/pi-extension/dist/native-safety-net.js +0 -209
  661. package/pi-extension/dist/observed-tool-routing.js +0 -114
  662. package/pi-extension/dist/renderers.js +0 -835
  663. package/pi-extension/dist/router-tools.js +0 -438
  664. package/pi-extension/dist/runtime-context.js +0 -288
  665. package/pi-extension/dist/schemas.js +0 -254
  666. package/pi-extension/dist/status.js +0 -449
  667. package/pi-extension/dist/utils.js +0 -467
  668. package/pi-extension/src/runtime-context.ts +0 -347
  669. package/pi-extension/src/status.ts +0 -505
  670. package/plugin-docs/README.md +0 -40
  671. package/plugin-docs/adr/0001-three-modes.md +0 -27
  672. package/plugin-docs/adr/0002-evals-before-hooks.md +0 -17
  673. package/plugin-docs/adr/0003-release-boundary.md +0 -21
  674. package/plugin-docs/adr/0004-discover-replaces-shallow-discovery-skills.md +0 -26
  675. package/plugin-docs/adr/README.md +0 -10
  676. package/plugin-docs/architecture.md +0 -89
  677. package/plugin-docs/output-router.md +0 -396
  678. package/plugin-docs/release-evidence.md +0 -77
  679. package/plugin-docs/skills.md +0 -44
  680. package/plugin-docs/workflow.md +0 -57
  681. package/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
  682. package/skills/discover/ARTIFACT-DESTINATIONS.md +0 -58
  683. package/skills/discover/CHECKPOINTS.md +0 -74
  684. package/skills/discover/SKILL.md +0 -173
  685. package/skills/evaluate-skill/references/eval-patterns.md +0 -41
  686. package/skills/evaluate-skill/references/grading-priority.md +0 -33
  687. package/skills/execute-plan/SKILL.md +0 -133
  688. package/skills/execute-plan/references/execution-map.md +0 -122
  689. package/skills/interview-gate/SKILL.md +0 -90
  690. package/skills/setup-freeflow/references/output-router-setup.md +0 -102
  691. package/skills/workflow/references/workflow-map.md +0 -104
  692. /package/pi-extension/src/{mcp-config.ts → integrations/mcp-config.ts} +0 -0
@@ -1,5 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
+ import crypto from "node:crypto";
3
4
  import fs from "node:fs";
4
5
  import path from "node:path";
5
6
  import process from "node:process";
@@ -8,6 +9,9 @@ import { fileURLToPath } from "node:url";
8
9
  const SCRIPT_DIR = path.dirname(fileURLToPath(import.meta.url));
9
10
  const PLUGIN_ROOT = path.resolve(SCRIPT_DIR, "..");
10
11
  const VALID_MODES = new Set(["conversation", "workflow", "strict-workflow"]);
12
+ const SESSION_STATE_VERSION = 1;
13
+ const SESSION_STATE_MAX_AGE_MS = 90 * 24 * 60 * 60 * 1000;
14
+ const CLEAR_TRANSFER_MAX_AGE_MS = 60 * 1000;
11
15
 
12
16
  function readStdinJson() {
13
17
  const raw = fs.readFileSync(0, "utf8").trim();
@@ -46,226 +50,634 @@ function findWorkspaceRoot(cwd) {
46
50
  }
47
51
  }
48
52
 
49
- function loadRuntimeContext() {
50
- const modeContractSkill = readText(path.join(PLUGIN_ROOT, "skills", "mode-contract", "SKILL.md"));
51
- const workflowSkill = readText(path.join(PLUGIN_ROOT, "skills", "workflow", "SKILL.md"));
52
- const interviewGateSkill = readText(
53
- path.join(PLUGIN_ROOT, "skills", "interview-gate", "SKILL.md")
54
- );
55
- const discoverSkill = readText(path.join(PLUGIN_ROOT, "skills", "discover", "SKILL.md"));
56
- const outputRouterSkill = readText(path.join(PLUGIN_ROOT, "skills", "output-router", "SKILL.md"));
53
+ function loadRuntimeContext(options = {}) {
54
+ const includeInteractionContract = options.interactionContract === true;
55
+ const includeSkills = options.skills === true;
56
+ const interactionContract = includeInteractionContract
57
+ ? readText(path.join(PLUGIN_ROOT, "runtime", "interaction-contract.md"))
58
+ : null;
59
+ const workflowSkill = includeSkills ? readText(path.join(PLUGIN_ROOT, "skills", "workflow", "SKILL.md")) : null;
57
60
 
58
- if (!modeContractSkill || !workflowSkill || !interviewGateSkill || !discoverSkill || !outputRouterSkill) {
61
+ if ((includeInteractionContract && !interactionContract) || (includeSkills && !workflowSkill)) {
59
62
  throw new Error("Freeflow runtime context files are missing.");
60
63
  }
61
64
 
62
- return { modeContractSkill, workflowSkill, interviewGateSkill, discoverSkill, outputRouterSkill };
65
+ return { interactionContract, workflowSkill };
63
66
  }
64
67
 
65
68
  function readConfig(root) {
66
- const configPath = path.join(root, ".freeflow", "config.json");
67
- const body = readText(configPath);
68
- if (!body) {
69
- return { exists: false, valid: false, defaultMode: null };
69
+ const repository = readConfigLayer(path.join(root, ".freeflow", "config.json"), isValidSetupConfig);
70
+ const local = readConfigLayer(path.join(root, ".freeflow", "local.json"), isValidLocalConfig);
71
+ const localValid = !local.exists || local.valid;
72
+ const configured = repository.valid && localValid;
73
+ const core = resolveCoreConfig(repository.valid ? repository.parsed : {}, local.valid ? local.parsed : {});
74
+ const enabled = configured && core.config.enabled;
75
+
76
+ return {
77
+ exists: repository.exists,
78
+ valid: configured,
79
+ configured,
80
+ repositoryValid: repository.valid,
81
+ localExists: local.exists,
82
+ localValid,
83
+ error: !repository.valid ? repository.error : local.error,
84
+ enabled,
85
+ interactionContractEnabled: enabled && core.config.interactionContract,
86
+ skillsEnabled: enabled && core.config.skills.enabled,
87
+ defaultMode: core.config.defaultMode,
88
+ sources: core.sources,
89
+ };
90
+ }
91
+
92
+ function readConfigLayer(filePath, validate) {
93
+ if (!fs.existsSync(filePath)) {
94
+ return { path: filePath, exists: false, valid: false, parsed: {}, error: null };
70
95
  }
71
96
 
72
97
  try {
73
- const parsed = JSON.parse(body);
74
- const valid = isValidSetupConfig(parsed);
75
- return { exists: true, valid, defaultMode: parsed?.defaultMode ?? null };
76
- } catch {
77
- return { exists: true, valid: false, defaultMode: null };
98
+ const parsed = JSON.parse(fs.readFileSync(filePath, "utf8"));
99
+ const error = validate(parsed);
100
+ return {
101
+ path: filePath,
102
+ exists: true,
103
+ valid: error === null,
104
+ parsed: error === null ? parsed : {},
105
+ error,
106
+ };
107
+ } catch (error) {
108
+ return {
109
+ path: filePath,
110
+ exists: true,
111
+ valid: false,
112
+ parsed: {},
113
+ error: error instanceof Error ? error.message : String(error),
114
+ };
115
+ }
116
+ }
117
+
118
+ function isRecord(value) {
119
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
120
+ }
121
+
122
+ function validateCoreConfigFields(value) {
123
+ if (Object.hasOwn(value, "defaultMode") && !VALID_MODES.has(value.defaultMode)) {
124
+ return "defaultMode must be conversation, workflow, or strict-workflow";
125
+ }
126
+ if (Object.hasOwn(value, "enabled") && typeof value.enabled !== "boolean") {
127
+ return "enabled must be a boolean";
128
+ }
129
+ if (Object.hasOwn(value, "interactionContract") && typeof value.interactionContract !== "boolean") {
130
+ return "interactionContract must be a boolean";
131
+ }
132
+ if (Object.hasOwn(value, "skills")) {
133
+ if (!isRecord(value.skills)) {
134
+ return "skills must be an object";
135
+ }
136
+ if (Object.hasOwn(value.skills, "enabled") && typeof value.skills.enabled !== "boolean") {
137
+ return "skills.enabled must be a boolean";
138
+ }
78
139
  }
140
+ return null;
79
141
  }
80
142
 
81
143
  function isValidSetupConfig(value) {
82
- if (!value || typeof value !== "object" || Array.isArray(value)) {
83
- return false;
144
+ if (!isRecord(value)) {
145
+ return "repository config must be a JSON object";
84
146
  }
85
147
 
86
- const allowedKeys = new Set(["defaultMode", "outputRouter", "observedRouting", "scriptTransform"]);
148
+ const allowedKeys = new Set([
149
+ "enabled",
150
+ "defaultMode",
151
+ "interactionContract",
152
+ "skills",
153
+ "outputRouter",
154
+ "observedRouting",
155
+ "scriptTransform",
156
+ ]);
87
157
  if (!Object.keys(value).every((key) => allowedKeys.has(key))) {
88
- return false;
158
+ return "repository config contains unsupported top-level keys";
89
159
  }
90
160
 
91
- if (!Object.prototype.hasOwnProperty.call(value, "defaultMode") || !VALID_MODES.has(value.defaultMode)) {
92
- return false;
161
+ const coreError = validateCoreConfigFields(value);
162
+ if (coreError) {
163
+ return coreError;
93
164
  }
94
165
 
95
- if (Object.prototype.hasOwnProperty.call(value, "outputRouter")) {
96
- if (!Boolean(value.outputRouter) || typeof value.outputRouter !== "object" || Array.isArray(value.outputRouter)) {
97
- return false;
166
+ for (const key of ["outputRouter", "observedRouting", "scriptTransform"]) {
167
+ if (Object.hasOwn(value, key) && !isRecord(value[key])) {
168
+ return `${key} must be an object`;
98
169
  }
99
170
  }
171
+ return null;
172
+ }
100
173
 
101
- if (Object.prototype.hasOwnProperty.call(value, "observedRouting")) {
102
- if (!Boolean(value.observedRouting) || typeof value.observedRouting !== "object" || Array.isArray(value.observedRouting)) {
103
- return false;
104
- }
174
+ function isValidLocalConfig(value) {
175
+ if (!isRecord(value)) {
176
+ return "local config must be a JSON object";
105
177
  }
106
178
 
107
- if (Object.prototype.hasOwnProperty.call(value, "scriptTransform")) {
108
- if (!Boolean(value.scriptTransform) || typeof value.scriptTransform !== "object" || Array.isArray(value.scriptTransform)) {
109
- return false;
110
- }
179
+ const allowedKeys = new Set(["enabled", "defaultMode", "interactionContract", "skills", "processing"]);
180
+ if (!Object.keys(value).every((key) => allowedKeys.has(key))) {
181
+ return "local config contains unsupported top-level keys";
111
182
  }
183
+ return validateCoreConfigFields(value);
184
+ }
112
185
 
113
- return true;
186
+ function hasOwn(value, key) {
187
+ return Object.hasOwn(value, key);
114
188
  }
115
189
 
116
- function inspectSetup(root) {
117
- const config = readConfig(root);
118
- const agents = readText(path.join(root, "AGENTS.md")) || "";
119
- const claude = readText(path.join(root, "CLAUDE.md")) || "";
120
- const claudeRule = readText(path.join(root, ".claude", "rules", "freeflow-core.md")) || "";
190
+ function resolveLayeredValue(repository, local, key, fallback) {
191
+ if (hasOwn(local, key)) {
192
+ return { value: local[key], source: "local" };
193
+ }
194
+ if (hasOwn(repository, key)) {
195
+ return { value: repository[key], source: "repository" };
196
+ }
197
+ return { value: fallback, source: "builtin" };
198
+ }
121
199
 
122
- const codexActive =
123
- agents.includes("## Freeflow") && agents.includes("Use Freeflow for consequential work");
124
- const claudeActive =
125
- claude.includes("@.claude/rules/freeflow-core.md") &&
126
- claudeRule.includes("Use Freeflow for consequential work");
127
- const activeHosts = [
128
- codexActive ? "Codex AGENTS.md" : null,
129
- claudeActive ? "Claude CLAUDE.md import" : null
130
- ].filter(Boolean);
200
+ function resolveCoreConfig(repository, local) {
201
+ const enabled = resolveLayeredValue(repository, local, "enabled", true);
202
+ const interactionContract = resolveLayeredValue(repository, local, "interactionContract", true);
203
+ const defaultMode = resolveLayeredValue(repository, local, "defaultMode", "workflow");
204
+ const repositorySkills = isRecord(repository.skills) ? repository.skills : {};
205
+ const localSkills = isRecord(local.skills) ? local.skills : {};
206
+ const skillsEnabled = resolveLayeredValue(repositorySkills, localSkills, "enabled", true);
207
+
208
+ return {
209
+ config: {
210
+ enabled: enabled.value,
211
+ interactionContract: interactionContract.value,
212
+ skills: { enabled: skillsEnabled.value },
213
+ defaultMode: defaultMode.value,
214
+ },
215
+ sources: {
216
+ enabled: enabled.source,
217
+ interactionContract: interactionContract.source,
218
+ skillsEnabled: skillsEnabled.source,
219
+ defaultMode: defaultMode.source,
220
+ },
221
+ };
222
+ }
223
+
224
+ function hostName() {
225
+ return process.env.PLUGIN_DATA ? "codex" : "claude";
226
+ }
131
227
 
132
- return { config, activeHosts };
228
+ function pluginDataRoot() {
229
+ const configured = process.env.PLUGIN_DATA || process.env.CLAUDE_PLUGIN_DATA;
230
+ return configured ? path.resolve(configured) : null;
133
231
  }
134
232
 
135
- function configStatus(config) {
136
- if (config.valid) {
137
- return `defaultMode \`${config.defaultMode}\``;
233
+ function sessionStatePath(sessionId) {
234
+ const dataRoot = pluginDataRoot();
235
+ if (!dataRoot || typeof sessionId !== "string" || sessionId.length === 0) {
236
+ return null;
138
237
  }
139
- if (config.exists) {
140
- return "invalid `.freeflow/config.json`; effective default mode falls back to `workflow`";
238
+
239
+ const key = crypto.createHash("sha256").update(`${hostName()}\0${sessionId}`).digest("hex");
240
+ return path.join(dataRoot, "session-modes", hostName(), `${key}.json`);
241
+ }
242
+
243
+ function workspaceKey(root) {
244
+ return crypto.createHash("sha256").update(path.resolve(root)).digest("hex");
245
+ }
246
+
247
+ function claudeProcessKey() {
248
+ const processId = process.env.CLAUDE_PID;
249
+ if (typeof processId !== "string" || processId.length === 0) {
250
+ return null;
141
251
  }
142
- return "missing `.freeflow/config.json`; effective default mode falls back to `workflow`";
252
+ return crypto.createHash("sha256").update(processId).digest("hex");
143
253
  }
144
254
 
145
- function modeGuidance(mode) {
146
- return [
147
- `Current Freeflow default mode: \`${mode}\`.`,
148
- "Treat this as the repo default at session start, resume, clear, and compact.",
149
- "For mode changes or mode interpretation, use `mode-contract`.",
150
- "Do not announce the current mode on every reply. Mention it when the user asks, setup/config is discussed, or the mode changes the next action."
151
- ];
255
+ function clearTransferPath(root) {
256
+ const dataRoot = pluginDataRoot();
257
+ const processKey = claudeProcessKey();
258
+ if (!dataRoot || hostName() !== "claude" || !processKey) {
259
+ return null;
260
+ }
261
+ return path.join(dataRoot, "session-modes", "claude-clear", `${workspaceKey(root)}-${processKey}.json`);
152
262
  }
153
263
 
154
- function buildSetupStatus(root) {
155
- const setup = inspectSetup(root);
156
- const parts = [];
157
- const modeStatus = configStatus(setup.config);
158
-
159
- if (setup.config.valid && setup.activeHosts.length > 0) {
160
- parts.push(
161
- `Setup status: configured for ${setup.activeHosts.join(" and ")} with ${modeStatus}.`
162
- );
163
- parts.push(...modeGuidance(setup.config.defaultMode));
164
- } else if (setup.config.exists || setup.activeHosts.length > 0) {
165
- const issues = [];
166
- if (!setup.config.valid) {
167
- issues.push("valid `.freeflow/config.json` is missing");
264
+ function writeJsonAtomic(filePath, value) {
265
+ const directory = path.dirname(filePath);
266
+ fs.mkdirSync(directory, { recursive: true, mode: 0o700 });
267
+ const temporaryPath = `${filePath}.${process.pid}.${crypto.randomUUID()}.tmp`;
268
+ try {
269
+ fs.writeFileSync(temporaryPath, `${JSON.stringify(value)}\n`, { encoding: "utf8", mode: 0o600 });
270
+ fs.renameSync(temporaryPath, filePath);
271
+ } catch (error) {
272
+ try {
273
+ fs.unlinkSync(temporaryPath);
274
+ } catch {
275
+ // Best-effort cleanup of a failed atomic write.
168
276
  }
169
- if (setup.activeHosts.length === 0) {
170
- issues.push("no Freeflow activation block/import was found");
277
+ throw error;
278
+ }
279
+ }
280
+
281
+ function readSessionMode(sessionId) {
282
+ const filePath = sessionStatePath(sessionId);
283
+ if (!filePath) {
284
+ return null;
285
+ }
286
+
287
+ try {
288
+ const state = JSON.parse(fs.readFileSync(filePath, "utf8"));
289
+ if (state.version !== SESSION_STATE_VERSION || !VALID_MODES.has(state.mode)) {
290
+ return null;
171
291
  }
172
- parts.push(`Setup status: partial setup; ${issues.join(" and ")}.`);
173
- parts.push(`Repo default mode: ${modeStatus}.`);
174
- parts.push(
175
- "Required user-facing notice: in the next assistant reply, tell the user Freeflow setup is incomplete and recommend `/setup-freeflow` or completing the missing host/config setup. Do this even if the user's prompt is casual, such as a greeting."
176
- );
177
- parts.push(
178
- "Before consequential work in this repo, complete setup or ask which host setup to complete unless the user explicitly bypasses setup."
179
- );
180
- } else {
181
- parts.push("Setup status: this repo does not appear to be set up for Freeflow yet.");
182
- parts.push(`Repo default mode: ${modeStatus}.`);
183
- parts.push(
184
- "Required user-facing notice: in the next assistant reply, tell the user Freeflow is installed but this repo is not set up yet, and recommend `/setup-freeflow`. Do this even if the user's prompt is casual, such as a greeting."
185
- );
186
- parts.push(
187
- "Before consequential work in this repo, use `/setup-freeflow` or ask whether to set up Freeflow for Codex, Claude, or both. Do not start implementation solely because the plugin is installed."
188
- );
292
+ return state.mode;
293
+ } catch {
294
+ return null;
295
+ }
296
+ }
297
+
298
+ function writeSessionMode(sessionId, mode) {
299
+ const filePath = sessionStatePath(sessionId);
300
+ if (!filePath) {
301
+ return false;
189
302
  }
190
303
 
191
- return parts.join("\n");
304
+ writeJsonAtomic(filePath, {
305
+ version: SESSION_STATE_VERSION,
306
+ mode,
307
+ updatedAt: new Date().toISOString(),
308
+ });
309
+ return true;
192
310
  }
193
311
 
194
- function shouldInject(eventName) {
195
- if (process.env.FREEFLOW_DISABLE_RUNTIME_CONTEXT === "1") {
312
+ function clearSessionMode(sessionId) {
313
+ const filePath = sessionStatePath(sessionId);
314
+ if (!filePath) {
196
315
  return false;
197
316
  }
198
317
 
199
- return eventName === "SessionStart";
318
+ try {
319
+ fs.unlinkSync(filePath);
320
+ } catch (error) {
321
+ if (error?.code !== "ENOENT") {
322
+ throw error;
323
+ }
324
+ }
325
+ return true;
200
326
  }
201
327
 
202
- function buildContext(input) {
328
+ function stageClearTransfer(input) {
329
+ if (hostName() !== "claude" || input.reason !== "clear") {
330
+ return;
331
+ }
332
+
203
333
  const root = findWorkspaceRoot(input.cwd || process.cwd());
204
- const { modeContractSkill, workflowSkill, interviewGateSkill, discoverSkill, outputRouterSkill } = loadRuntimeContext();
334
+ const mode = readSessionMode(input.session_id);
335
+ const filePath = clearTransferPath(root);
336
+ if (!filePath) {
337
+ return;
338
+ }
205
339
 
340
+ if (!mode) {
341
+ try {
342
+ fs.unlinkSync(filePath);
343
+ } catch (error) {
344
+ if (error?.code !== "ENOENT") {
345
+ throw error;
346
+ }
347
+ }
348
+ return;
349
+ }
350
+
351
+ writeJsonAtomic(filePath, {
352
+ version: SESSION_STATE_VERSION,
353
+ mode,
354
+ sourceSessionKey: crypto.createHash("sha256").update(String(input.session_id)).digest("hex"),
355
+ createdAt: new Date().toISOString(),
356
+ });
357
+ }
358
+
359
+ function consumeClearTransfer(input, root) {
360
+ if (hostName() !== "claude" || input.source !== "clear") {
361
+ return null;
362
+ }
363
+
364
+ const filePath = clearTransferPath(root);
365
+ if (!filePath) {
366
+ return null;
367
+ }
368
+
369
+ const claimedPath = `${filePath}.${process.pid}.${crypto.randomUUID()}.claimed`;
370
+ try {
371
+ fs.renameSync(filePath, claimedPath);
372
+ } catch (error) {
373
+ if (error?.code === "ENOENT") {
374
+ return null;
375
+ }
376
+ return null;
377
+ }
378
+
379
+ let state;
380
+ try {
381
+ state = JSON.parse(fs.readFileSync(claimedPath, "utf8"));
382
+ } catch {
383
+ return null;
384
+ } finally {
385
+ try {
386
+ fs.unlinkSync(claimedPath);
387
+ } catch {
388
+ // The atomic claim already prevents reuse; cleanup is best-effort.
389
+ }
390
+ }
391
+
392
+ if (!isRecord(state)) {
393
+ return null;
394
+ }
395
+ const createdAt = Date.parse(state.createdAt);
396
+ if (
397
+ state.version !== SESSION_STATE_VERSION ||
398
+ !VALID_MODES.has(state.mode) ||
399
+ !Number.isFinite(createdAt) ||
400
+ Date.now() - createdAt > CLEAR_TRANSFER_MAX_AGE_MS ||
401
+ Date.now() < createdAt
402
+ ) {
403
+ return null;
404
+ }
405
+
406
+ return writeSessionMode(input.session_id, state.mode) ? state.mode : null;
407
+ }
408
+
409
+ function cleanupExpiredSessionModes() {
410
+ const root = pluginDataRoot();
411
+ if (!root) {
412
+ return;
413
+ }
414
+
415
+ const stateRoot = path.join(root, "session-modes");
416
+ const cutoff = Date.now() - SESSION_STATE_MAX_AGE_MS;
417
+ for (const host of ["claude", "codex", "claude-clear"]) {
418
+ const directory = path.join(stateRoot, host);
419
+ let entries = [];
420
+ try {
421
+ entries = fs.readdirSync(directory, { withFileTypes: true });
422
+ } catch {
423
+ continue;
424
+ }
425
+
426
+ for (const entry of entries) {
427
+ if (!entry.isFile() || !entry.name.endsWith(".json")) {
428
+ continue;
429
+ }
430
+ const filePath = path.join(directory, entry.name);
431
+ try {
432
+ if (fs.statSync(filePath).mtimeMs < cutoff) {
433
+ fs.unlinkSync(filePath);
434
+ }
435
+ } catch {
436
+ // Cleanup is best-effort and must not prevent runtime delivery.
437
+ }
438
+ }
439
+ }
440
+ }
441
+
442
+ function sourceLabel(source) {
443
+ if (source === "local") {
444
+ return "personal";
445
+ }
446
+ return source;
447
+ }
448
+
449
+ function resolveRuntimeState(input) {
450
+ const root = findWorkspaceRoot(input.cwd || process.cwd());
451
+ const config = readConfig(root);
452
+ const restoredMode = config.valid && config.enabled ? consumeClearTransfer(input, root) : null;
453
+ const sessionMode = config.valid && config.enabled ? restoredMode || readSessionMode(input.session_id) : null;
454
+ const resolvedMode = sessionMode || config.defaultMode;
455
+
456
+ return {
457
+ root,
458
+ config,
459
+ sessionMode,
460
+ resolvedMode,
461
+ effectiveMode: config.enabled && config.skillsEnabled ? resolvedMode : null,
462
+ modeSource: sessionMode ? "session override" : "configured default",
463
+ };
464
+ }
465
+
466
+ function modeOverlayGuidance(mode) {
467
+ if (mode === "conversation") {
468
+ return [
469
+ "",
470
+ "## Conversation Mode Boundary",
471
+ "",
472
+ "Conversation mode is active and read-only.",
473
+ "",
474
+ "Do not call write, edit, or mutating tools. Do not create, delete, commit, push, or change repository, system, external, or durable state.",
475
+ "",
476
+ "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.",
477
+ ];
478
+ }
479
+
480
+ if (mode === "strict-workflow") {
481
+ return [
482
+ "",
483
+ "## Strict Workflow Overlay",
484
+ "",
485
+ "Strict Workflow is active. Use the adaptive Workflow, but increase decision, evidence, verification, and checkpoint pressure at high-risk or hard-to-reverse boundaries.",
486
+ "",
487
+ "For work affecting security, privacy, billing, data loss, migrations, public interfaces, compatibility, deployment, or architecture:",
488
+ "",
489
+ "- stop for any user-owned choice or source conflict;",
490
+ "- inspect the relevant risk surface before crossing the boundary;",
491
+ "- select only artifacts, checkpoints, and independent review that materially reduce risk;",
492
+ "- verify at the affected boundary before claiming success.",
493
+ "",
494
+ "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.",
495
+ ];
496
+ }
497
+
498
+ return [];
499
+ }
500
+
501
+ function stateLines(state, sessionChange = null) {
502
+ const { config } = state;
503
+ const lines = [`Configured default: \`${config.defaultMode}\` (${sourceLabel(config.sources.defaultMode)})`];
504
+
505
+ if (sessionChange === "cleared") {
506
+ lines.push("Session override: cleared");
507
+ } else if (state.sessionMode) {
508
+ lines.push(`Session override: \`${state.sessionMode}\``);
509
+ } else {
510
+ lines.push("Session override: none");
511
+ }
512
+
513
+ if (state.effectiveMode) {
514
+ lines.push(`Effective mode: \`${state.effectiveMode}\` (${state.modeSource}, active)`);
515
+ } else {
516
+ lines.push(`Resolved mode: \`${state.resolvedMode}\` (dormant because Skills are disabled)`);
517
+ }
518
+
519
+ return lines;
520
+ }
521
+
522
+ function capabilityLines(config) {
206
523
  return [
524
+ `Interaction Contract: ${config.interactionContractEnabled ? "enabled" : "disabled"}`,
525
+ `Skills: ${config.skillsEnabled ? "enabled" : "disabled"}`,
526
+ ];
527
+ }
528
+
529
+ function renderSessionStart(state) {
530
+ const { config } = state;
531
+ if (!config.valid) {
532
+ return "";
533
+ }
534
+
535
+ if (!config.enabled) {
536
+ return [
537
+ "# Freeflow Disabled",
538
+ "",
539
+ `Configured but inactive: \`enabled\` is false (${sourceLabel(config.sources.enabled)}).`,
540
+ "No Freeflow interaction, skill, or mode guidance is effective.",
541
+ ].join("\n");
542
+ }
543
+
544
+ const { interactionContract, workflowSkill } = loadRuntimeContext({
545
+ interactionContract: config.interactionContractEnabled,
546
+ skills: config.skillsEnabled,
547
+ });
548
+ const context = [
207
549
  "# Freeflow Runtime Context",
208
550
  "",
209
- "Freeflow plugin lifecycle hook loaded this at session start.",
210
- "These instructions are context-loading only. They do not override user instructions, repo instructions, or host safety and approval policy.",
211
- "",
212
- "## Repo Setup",
213
- buildSetupStatus(root),
214
- "",
215
- "## Freeflow Runtime Priority",
216
- "Mode Contract handles mode setting, mode interpretation, and mode mismatch before task routing when mode is at issue.",
217
- "",
218
- "Priority order for matched non-mode workflow skills:",
551
+ "Runtime delivery: confirmed for this lifecycle-hook invocation.",
552
+ "This context guides behavior only; user instructions, repository instructions, and host safety or approval policy retain precedence.",
219
553
  "",
220
- "1. Workflow classifies conversation versus consequential work.",
221
- "2. Interview Gate stops silent decisions, user-owned decisions, source-truth conflicts, and question-to-action mistakes.",
222
- "3. Discover handles context-building after no immediate stop condition remains. Use it before first repo/code exploration or design answers for consequential product/API/tool/runtime hypotheses.",
223
- "4. Output Router chooses evidence transport after the workflow/interview/discover route is clear.",
554
+ "## Effective State",
224
555
  "",
225
- "## Loaded Mode Contract Skill",
226
- "```md",
227
- modeContractSkill.trim(),
228
- "```",
229
- "",
230
- "## Loaded Workflow Skill",
231
- "```md",
232
- workflowSkill.trim(),
233
- "```",
234
- "",
235
- "## Loaded Interview Gate Skill",
236
- "```md",
237
- interviewGateSkill.trim(),
238
- "```",
556
+ ...stateLines(state),
557
+ ...capabilityLines(config),
558
+ ];
559
+
560
+ if (config.interactionContractEnabled) {
561
+ context.push("", interactionContract.trim());
562
+ }
563
+ if (config.skillsEnabled) {
564
+ context.push("", "# Freeflow Workflow Bootstrap", "", workflowSkill.trim());
565
+ }
566
+ if (state.effectiveMode) {
567
+ context.push(...modeOverlayGuidance(state.effectiveMode));
568
+ }
569
+
570
+ return context.join("\n");
571
+ }
572
+
573
+ function normalizePrompt(prompt) {
574
+ return prompt
575
+ .trim()
576
+ .replace(/[.!]+$/u, "")
577
+ .replace(/\s+/gu, " ");
578
+ }
579
+
580
+ function parseModeControl(prompt) {
581
+ if (typeof prompt !== "string" || prompt.length > 300 || /\?\s*$/u.test(prompt.trim())) {
582
+ return null;
583
+ }
584
+
585
+ const normalized = normalizePrompt(prompt);
586
+ const nativeSet = normalized.match(
587
+ /^(?:\/freeflow mode|\$mode-contract|\/(?:freeflow:)?mode-contract) (conversation|workflow|strict-workflow)$/iu,
588
+ );
589
+ if (nativeSet) {
590
+ return { action: "set", mode: nativeSet[1].toLowerCase() };
591
+ }
592
+ if (/^(?:\/freeflow mode|\$mode-contract|\/(?:freeflow:)?mode-contract) reset$/iu.test(normalized)) {
593
+ return { action: "reset" };
594
+ }
595
+
596
+ const setPatterns = [
597
+ /^switch to (conversation|workflow|strict-workflow)(?: mode)?$/iu,
598
+ /^switch (?:this|the) session to (conversation|workflow|strict-workflow)(?: mode)?$/iu,
599
+ /^use (conversation|workflow|strict-workflow)(?: mode)? for (?:this|the) session$/iu,
600
+ /^(?:change|set) (?:the )?(?:current|active|session) mode to (conversation|workflow|strict-workflow)$/iu,
601
+ /^switch (?:the )?(?:current|active|session) mode to (conversation|workflow|strict-workflow)$/iu,
602
+ ];
603
+ for (const pattern of setPatterns) {
604
+ const match = normalized.match(pattern);
605
+ if (match) {
606
+ return { action: "set", mode: match[1].toLowerCase() };
607
+ }
608
+ }
609
+
610
+ if (/^(?:reset|clear|remove) (?:the )?(?:current |active )?session mode(?: override)?$/iu.test(normalized)) {
611
+ return { action: "reset" };
612
+ }
613
+
614
+ return null;
615
+ }
616
+
617
+ function renderPromptModeChange(state, sessionChange) {
618
+ const lines = [
619
+ "# Freeflow Mode Update",
239
620
  "",
240
- "## Loaded Discover Skill",
241
- "```md",
242
- discoverSkill.trim(),
243
- "```",
621
+ ...stateLines(state, sessionChange),
244
622
  "",
245
- "## Loaded Output Router Skill",
246
- "```md",
247
- outputRouterSkill.trim(),
248
- "```"
249
- ].join("\n");
623
+ "This user-operated session control changed host-managed state before this model request. It changes workflow behavior, not mutation authority, host permissions, or accepted scope.",
624
+ "Acknowledge the effective mode briefly. Do not claim that configured defaults changed.",
625
+ ];
626
+ if (state.effectiveMode) {
627
+ lines.push(...modeOverlayGuidance(state.effectiveMode));
628
+ }
629
+ return lines.join("\n");
250
630
  }
251
631
 
252
- function isCodexHookInput(input) {
253
- return typeof input.model === "string" && input.model.length > 0;
632
+ function handleUserPromptSubmit(input) {
633
+ const control = parseModeControl(input.prompt);
634
+ if (!control) {
635
+ return "";
636
+ }
637
+
638
+ const before = resolveRuntimeState(input);
639
+ if (!before.config.valid || !before.config.enabled) {
640
+ return "";
641
+ }
642
+ if (!before.config.skillsEnabled) {
643
+ return [
644
+ "# Freeflow Mode Update Unavailable",
645
+ "",
646
+ `Resolved mode remains \`${before.resolvedMode}\`, but no Freeflow mode is effective because Skills are disabled.`,
647
+ "Do not claim that the session mode changed.",
648
+ ].join("\n");
649
+ }
650
+
651
+ if (control.action === "set") {
652
+ if (!writeSessionMode(input.session_id, control.mode)) {
653
+ return "Freeflow could not establish a session mode override because this host invocation supplied no writable plugin data or session identifier. Do not claim that the mode changed.";
654
+ }
655
+ const state = resolveRuntimeState(input);
656
+ return renderPromptModeChange(state, "set");
657
+ }
658
+
659
+ if (!clearSessionMode(input.session_id)) {
660
+ return "Freeflow could not clear the session mode override because this host invocation supplied no writable plugin data or session identifier. Do not claim that the mode changed.";
661
+ }
662
+ const state = resolveRuntimeState(input);
663
+ return renderPromptModeChange(state, "cleared");
254
664
  }
255
665
 
256
- function emitAdditionalContext(eventName, input, additionalContext) {
257
- if (isCodexHookInput(input)) {
258
- process.stdout.write(`${additionalContext}\n`);
259
- return;
666
+ function shouldHandle(eventName) {
667
+ if (process.env.FREEFLOW_DISABLE_RUNTIME_CONTEXT === "1") {
668
+ return false;
260
669
  }
670
+ return eventName === "SessionStart" || eventName === "UserPromptSubmit" || eventName === "SessionEnd";
671
+ }
261
672
 
673
+ function emitAdditionalContext(eventName, additionalContext) {
262
674
  process.stdout.write(
263
675
  `${JSON.stringify({
264
676
  hookSpecificOutput: {
265
677
  hookEventName: eventName,
266
- additionalContext
267
- }
268
- })}\n`
678
+ additionalContext,
679
+ },
680
+ })}\n`,
269
681
  );
270
682
  }
271
683
 
@@ -273,15 +685,21 @@ function main() {
273
685
  const { input, raw } = readStdinJson();
274
686
  const eventName = process.argv[2] || input.hook_event_name || "";
275
687
 
276
- if (!raw && !eventName) {
688
+ if ((!raw && !eventName) || !shouldHandle(eventName)) {
277
689
  return;
278
690
  }
279
691
 
280
- if (!shouldInject(eventName)) {
692
+ cleanupExpiredSessionModes();
693
+ if (eventName === "SessionEnd") {
694
+ stageClearTransfer(input);
281
695
  return;
282
696
  }
283
-
284
- emitAdditionalContext(eventName, input, buildContext(input));
697
+ const additionalContext =
698
+ eventName === "SessionStart" ? renderSessionStart(resolveRuntimeState(input)) : handleUserPromptSubmit(input);
699
+ if (!additionalContext.trim()) {
700
+ return;
701
+ }
702
+ emitAdditionalContext(eventName, additionalContext);
285
703
  }
286
704
 
287
705
  try {