@hassangameryt/freeflow 0.2.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (312) hide show
  1. package/.agents/plugins/marketplace.json +1 -1
  2. package/.claude-plugin/marketplace.json +4 -4
  3. package/{plugins/freeflow/.claude-plugin → .claude-plugin}/plugin.json +5 -2
  4. package/{plugins/freeflow/.codex-plugin → .codex-plugin}/plugin.json +8 -9
  5. package/README.md +194 -127
  6. package/assets/feedback-loop.png +0 -0
  7. package/assets/freeflow-plugin-icon.png +0 -0
  8. package/assets/freeflow_workflow_map.png +0 -0
  9. package/assets/workflow.png +0 -0
  10. package/command-surface.json +129 -0
  11. package/hooks/freeflow-runtime-context.mjs +419 -0
  12. package/hooks/tests/check-runtime-context-hook.sh +223 -0
  13. package/package.json +41 -22
  14. package/pi-extension/dist/index.js +269 -0
  15. package/pi-extension/dist/integrations/mcp-config.js +29 -0
  16. package/pi-extension/dist/output-router/host-producer-identification.js +232 -0
  17. package/pi-extension/dist/output-router/native-safety-net.js +216 -0
  18. package/pi-extension/dist/output-router/observed-tool-routing.js +122 -0
  19. package/pi-extension/dist/output-router/renderers.js +1023 -0
  20. package/pi-extension/dist/output-router/router-tools.js +554 -0
  21. package/pi-extension/dist/output-router/schemas.js +383 -0
  22. package/pi-extension/dist/output-router/status.js +744 -0
  23. package/pi-extension/dist/output-router/utils.js +502 -0
  24. package/pi-extension/dist/runtime/runtime-context.js +798 -0
  25. package/pi-extension/dist/settings/settings-tui.js +314 -0
  26. package/pi-extension/dist/settings/settings-ui.js +1487 -0
  27. package/pi-extension/freeflow/index.js +1 -0
  28. package/pi-extension/src/index.ts +295 -0
  29. package/pi-extension/src/integrations/mcp-config.ts +32 -0
  30. package/pi-extension/src/output-router/host-producer-identification.ts +256 -0
  31. package/pi-extension/src/output-router/native-safety-net.ts +248 -0
  32. package/pi-extension/src/output-router/observed-tool-routing.ts +134 -0
  33. package/pi-extension/src/output-router/renderers.ts +1108 -0
  34. package/pi-extension/src/output-router/router-tools.ts +579 -0
  35. package/pi-extension/src/output-router/schemas.ts +387 -0
  36. package/pi-extension/src/output-router/status.ts +791 -0
  37. package/pi-extension/src/output-router/utils.ts +554 -0
  38. package/pi-extension/src/runtime/runtime-context.ts +895 -0
  39. package/pi-extension/src/settings/settings-tui.ts +408 -0
  40. package/pi-extension/src/settings/settings-ui.ts +1730 -0
  41. package/pi-extension/tests/integration/pi-extension.test.js +4018 -0
  42. package/pi-extension/tests/output-router/observed-producers.test.js +132 -0
  43. package/pi-extension/tests/output-router/search.test.js +722 -0
  44. package/pi-extension/tests/settings/settings-tui.test.js +243 -0
  45. package/pi-extension/tsconfig.json +16 -0
  46. package/{plugins/freeflow/router/dist → router/dist/benchmarks}/benchmark-harness.d.ts +16 -13
  47. package/router/dist/benchmarks/benchmark-harness.js +92 -0
  48. package/router/dist/benchmarks/benchmarks.d.ts +109 -0
  49. package/router/dist/benchmarks/benchmarks.js +979 -0
  50. package/router/dist/benchmarks/codex-qa-benchmarks.d.ts +95 -0
  51. package/router/dist/benchmarks/codex-qa-benchmarks.js +500 -0
  52. package/router/dist/benchmarks/command-benchmarks.d.ts +143 -0
  53. package/router/dist/benchmarks/command-benchmarks.js +698 -0
  54. package/router/dist/benchmarks/context-mode-normalized-benchmarks.d.ts +82 -0
  55. package/router/dist/benchmarks/context-mode-normalized-benchmarks.js +773 -0
  56. package/router/dist/benchmarks/context-mode-real-deep-benchmark.d.ts +132 -0
  57. package/router/dist/benchmarks/context-mode-real-deep-benchmark.js +1380 -0
  58. package/router/dist/benchmarks/context-saving-baseline.d.ts +60 -0
  59. package/router/dist/benchmarks/context-saving-baseline.js +470 -0
  60. package/router/dist/benchmarks/index-benchmarks.d.ts +103 -0
  61. package/router/dist/benchmarks/index-benchmarks.js +862 -0
  62. package/router/dist/benchmarks/storage-policy-benchmarks.d.ts +101 -0
  63. package/router/dist/benchmarks/storage-policy-benchmarks.js +618 -0
  64. package/router/dist/benchmarks/vault-index-benchmarks.d.ts +56 -0
  65. package/router/dist/benchmarks/vault-index-benchmarks.js +322 -0
  66. package/router/dist/config/config.d.ts +103 -0
  67. package/router/dist/config/config.js +632 -0
  68. package/{plugins/freeflow/router/dist → router/dist/config}/router-contract.d.ts +2 -2
  69. package/router/dist/config/router-contract.js +54 -0
  70. package/{plugins/freeflow/router/dist → router/dist/config}/schema.d.ts +19 -10
  71. package/router/dist/config/schema.js +648 -0
  72. package/router/dist/config/types.d.ts +573 -0
  73. package/router/dist/config/types.js +41 -0
  74. package/router/dist/evidence/bounded-evidence.d.ts +40 -0
  75. package/router/dist/evidence/bounded-evidence.js +323 -0
  76. package/router/dist/evidence/evidence-range-selector.d.ts +24 -0
  77. package/router/dist/evidence/evidence-range-selector.js +232 -0
  78. package/router/dist/evidence/evidence-search.d.ts +27 -0
  79. package/router/dist/evidence/evidence-search.js +490 -0
  80. package/{plugins/freeflow/router/dist → router/dist/evidence}/evidence.d.ts +18 -18
  81. package/router/dist/evidence/evidence.js +200 -0
  82. package/router/dist/evidence/failure-contracts.d.ts +37 -0
  83. package/router/dist/evidence/failure-contracts.js +166 -0
  84. package/router/dist/evidence/line-ranges.d.ts +24 -0
  85. package/router/dist/evidence/line-ranges.js +22 -0
  86. package/router/dist/experiments/local-index.d.ts +64 -0
  87. package/router/dist/experiments/local-index.js +581 -0
  88. package/router/dist/index.d.ts +30 -0
  89. package/router/dist/index.js +32 -0
  90. package/router/dist/local/local-traversal.d.ts +18 -0
  91. package/router/dist/local/local-traversal.js +334 -0
  92. package/router/dist/processing/engine.d.ts +132 -0
  93. package/router/dist/processing/engine.js +533 -0
  94. package/router/dist/processing/reducers.d.ts +280 -0
  95. package/router/dist/processing/reducers.js +1673 -0
  96. package/router/dist/processing/renderers.d.ts +31 -0
  97. package/router/dist/processing/renderers.js +195 -0
  98. package/router/dist/processing/scripts.d.ts +91 -0
  99. package/router/dist/processing/scripts.js +386 -0
  100. package/{plugins/freeflow/router/dist → router/dist/repo}/repo-traversal.d.ts +9 -9
  101. package/router/dist/repo/repo-traversal.js +245 -0
  102. package/router/dist/routing/observed-reducers.d.ts +41 -0
  103. package/router/dist/routing/observed-reducers.js +661 -0
  104. package/router/dist/routing/observed-routing.d.ts +26 -0
  105. package/router/dist/routing/observed-routing.js +378 -0
  106. package/router/dist/routing/parsers.d.ts +16 -0
  107. package/router/dist/routing/parsers.js +521 -0
  108. package/router/dist/routing/run-filters.d.ts +60 -0
  109. package/router/dist/routing/run-filters.js +238 -0
  110. package/router/dist/routing/run-reducers.d.ts +49 -0
  111. package/router/dist/routing/run-reducers.js +122 -0
  112. package/router/dist/sandbox/adapter-roots.d.ts +46 -0
  113. package/router/dist/sandbox/adapter-roots.js +66 -0
  114. package/router/dist/sandbox/eryx-python-adapter.d.ts +13 -0
  115. package/router/dist/sandbox/eryx-python-adapter.js +868 -0
  116. package/router/dist/sandbox/jq-wasm-adapter.d.ts +9 -0
  117. package/router/dist/sandbox/jq-wasm-adapter.js +429 -0
  118. package/router/dist/sandbox/quickjs-wasi-adapter.d.ts +13 -0
  119. package/router/dist/sandbox/quickjs-wasi-adapter.js +384 -0
  120. package/router/dist/sandbox/script-sandbox.d.ts +134 -0
  121. package/router/dist/sandbox/script-sandbox.js +337 -0
  122. package/router/dist/setup/script-transform-adapters.d.ts +32 -0
  123. package/router/dist/setup/script-transform-adapters.js +278 -0
  124. package/router/dist/tools/batch.d.ts +33 -0
  125. package/router/dist/tools/batch.js +586 -0
  126. package/router/dist/tools/run.d.ts +62 -0
  127. package/router/dist/tools/run.js +1304 -0
  128. package/router/dist/tools/search.d.ts +66 -0
  129. package/router/dist/tools/search.js +1364 -0
  130. package/router/dist/transform/engine.d.ts +168 -0
  131. package/router/dist/transform/engine.js +2072 -0
  132. package/router/dist/vault/vault-index.d.ts +125 -0
  133. package/router/dist/vault/vault-index.js +416 -0
  134. package/router/dist/vault/vault.d.ts +138 -0
  135. package/router/dist/vault/vault.js +630 -0
  136. package/runtime/interaction-contract.md +16 -0
  137. package/skills/bypass/SKILL.md +82 -0
  138. package/skills/commit-work/SKILL.md +106 -0
  139. package/skills/commit-work/references/staging-decisions.md +73 -0
  140. package/skills/decision-gate/SKILL.md +48 -0
  141. package/skills/design-for-depth/SKILL.md +106 -0
  142. package/skills/design-for-depth/references/design-pressure-signals.md +314 -0
  143. package/skills/design-for-depth/references/interface-design-loop.md +156 -0
  144. package/skills/design-for-depth/references/software-design-philosophy.md +248 -0
  145. package/skills/diagnose-failure/SKILL.md +105 -0
  146. package/skills/diagnose-failure/references/diagnostic-loop-catalog.md +36 -0
  147. package/skills/diagnose-failure/references/flaky-and-performance.md +43 -0
  148. package/skills/discuss/SKILL.md +121 -0
  149. package/skills/discuss/references/checkpoints.md +66 -0
  150. package/skills/evaluate-skill/SKILL.md +105 -0
  151. package/skills/evaluate-skill/references/definition-schema.md +345 -0
  152. package/skills/evaluate-skill/references/evaluation-design.md +86 -0
  153. package/skills/evaluate-skill/references/execution-and-evidence.md +85 -0
  154. package/skills/evaluate-skill/references/review-and-revision.md +51 -0
  155. package/skills/evaluate-skill/scripts/lib/definitions.mjs +296 -0
  156. package/skills/evaluate-skill/scripts/lib/evidence.mjs +46 -0
  157. package/skills/evaluate-skill/scripts/lib/grade-comparison.mjs +60 -0
  158. package/skills/evaluate-skill/scripts/lib/grade-interaction.mjs +148 -0
  159. package/skills/evaluate-skill/scripts/lib/grade-support.mjs +126 -0
  160. package/skills/evaluate-skill/scripts/lib/grade-workspace.mjs +192 -0
  161. package/skills/evaluate-skill/scripts/lib/grade.mjs +56 -0
  162. package/skills/evaluate-skill/scripts/lib/pi.mjs +489 -0
  163. package/skills/evaluate-skill/scripts/lib/process.mjs +79 -0
  164. package/skills/evaluate-skill/scripts/lib/rpc.mjs +444 -0
  165. package/skills/evaluate-skill/scripts/lib/runner.mjs +346 -0
  166. package/skills/evaluate-skill/scripts/lib/sandbox.mjs +409 -0
  167. package/skills/evaluate-skill/scripts/lib/view.mjs +337 -0
  168. package/skills/evaluate-skill/scripts/pi-guard.mjs +164 -0
  169. package/skills/evaluate-skill/scripts/skill-eval.mjs +101 -0
  170. package/skills/execute-work/SKILL.md +99 -0
  171. package/skills/execute-work/references/code-practices.md +78 -0
  172. package/skills/execute-work/references/execution-loop.md +77 -0
  173. package/skills/finish-branch/SKILL.md +117 -0
  174. package/skills/finish-branch/references/integration-options.md +80 -0
  175. package/skills/handoff/SKILL.md +92 -0
  176. package/skills/handoff/references/templates.md +141 -0
  177. package/skills/launch-work/SKILL.md +116 -0
  178. package/skills/launch-work/references/launch-readiness.md +85 -0
  179. package/skills/migration-work/SKILL.md +115 -0
  180. package/skills/migration-work/references/migration-lifecycle.md +82 -0
  181. package/skills/mode-contract/SKILL.md +82 -0
  182. package/skills/output-router/SKILL.md +206 -0
  183. package/skills/output-router/references/safety-policy.md +40 -0
  184. package/skills/release-work/SKILL.md +118 -0
  185. package/skills/release-work/references/release-evidence.md +78 -0
  186. package/skills/review-artifact/SKILL.md +126 -0
  187. package/skills/review-artifact/references/reviewer-prompt.md +148 -0
  188. package/skills/review-work/SKILL.md +126 -0
  189. package/skills/review-work/references/reviewer-prompt.md +134 -0
  190. package/skills/review-work/references/security-risk-lens.md +67 -0
  191. package/skills/setup-freeflow/SKILL.md +98 -0
  192. package/skills/setup-freeflow/references/activation-contract.md +120 -0
  193. package/skills/setup-freeflow/references/host-setup.md +72 -0
  194. package/skills/setup-freeflow/references/output-router-setup.md +110 -0
  195. package/skills/simplify-code/SKILL.md +80 -0
  196. package/skills/simplify-code/references/simplification-patterns.md +70 -0
  197. package/skills/tdd/SKILL.md +96 -0
  198. package/skills/tdd/references/test-design.md +96 -0
  199. package/skills/track-work/SKILL.md +84 -0
  200. package/skills/track-work/references/working-record-schema.md +378 -0
  201. package/skills/verify-work/SKILL.md +85 -0
  202. package/skills/verify-work/references/browser-runtime-evidence.md +55 -0
  203. package/skills/verify-work/references/integration-evidence.md +51 -0
  204. package/skills/verify-work/references/performance-evidence.md +57 -0
  205. package/skills/workflow/SKILL.md +91 -0
  206. package/skills/workflow/references/domain-skill-composition.md +57 -0
  207. package/skills/workflow/references/workflow-loop.md +92 -0
  208. package/skills/write-plan/SKILL.md +123 -0
  209. package/skills/write-plan/references/plan-shapes.md +156 -0
  210. package/skills/write-skill/SKILL.md +119 -0
  211. package/skills/write-skill/references/activation-boundaries.md +62 -0
  212. package/skills/write-skill/references/agent-first-instructions.md +87 -0
  213. package/skills/write-skill/references/progressive-disclosure.md +63 -0
  214. package/skills/write-skill/scripts/lib/skill-author.mjs +653 -0
  215. package/skills/write-skill/scripts/skill-author.mjs +104 -0
  216. package/skills/write-spec/SKILL.md +104 -0
  217. package/skills/write-spec/references/artifact-standards.md +86 -0
  218. package/skills/write-spec/references/decision-records.md +77 -0
  219. package/skills/write-spec/references/spec-shapes.md +128 -0
  220. package/plugins/freeflow/command-surface.json +0 -77
  221. package/plugins/freeflow/docs/README.md +0 -40
  222. package/plugins/freeflow/docs/adr/0001-three-modes.md +0 -27
  223. package/plugins/freeflow/docs/adr/0002-evals-before-hooks.md +0 -17
  224. package/plugins/freeflow/docs/adr/0003-release-boundary.md +0 -21
  225. package/plugins/freeflow/docs/adr/0004-research-replaces-shallow-discovery-skills.md +0 -26
  226. package/plugins/freeflow/docs/adr/README.md +0 -8
  227. package/plugins/freeflow/docs/architecture.md +0 -86
  228. package/plugins/freeflow/docs/output-router.md +0 -212
  229. package/plugins/freeflow/docs/release-evidence.md +0 -69
  230. package/plugins/freeflow/docs/skills.md +0 -43
  231. package/plugins/freeflow/docs/workflow.md +0 -57
  232. package/plugins/freeflow/hooks/freeflow-runtime-context.mjs +0 -257
  233. package/plugins/freeflow/pi-extension/index.js +0 -1176
  234. package/plugins/freeflow/router/dist/benchmark-harness.js +0 -92
  235. package/plugins/freeflow/router/dist/benchmarks.d.ts +0 -102
  236. package/plugins/freeflow/router/dist/benchmarks.js +0 -880
  237. package/plugins/freeflow/router/dist/bounded-evidence.d.ts +0 -40
  238. package/plugins/freeflow/router/dist/bounded-evidence.js +0 -310
  239. package/plugins/freeflow/router/dist/codex-qa-benchmarks.d.ts +0 -91
  240. package/plugins/freeflow/router/dist/codex-qa-benchmarks.js +0 -461
  241. package/plugins/freeflow/router/dist/command-benchmarks.d.ts +0 -128
  242. package/plugins/freeflow/router/dist/command-benchmarks.js +0 -652
  243. package/plugins/freeflow/router/dist/config.d.ts +0 -22
  244. package/plugins/freeflow/router/dist/config.js +0 -114
  245. package/plugins/freeflow/router/dist/evidence-range-selector.d.ts +0 -22
  246. package/plugins/freeflow/router/dist/evidence-range-selector.js +0 -180
  247. package/plugins/freeflow/router/dist/evidence-search.d.ts +0 -25
  248. package/plugins/freeflow/router/dist/evidence-search.js +0 -450
  249. package/plugins/freeflow/router/dist/evidence.js +0 -196
  250. package/plugins/freeflow/router/dist/experimental-local-index.d.ts +0 -1
  251. package/plugins/freeflow/router/dist/experimental-local-index.js +0 -1
  252. package/plugins/freeflow/router/dist/experiments/local-index.d.ts +0 -58
  253. package/plugins/freeflow/router/dist/experiments/local-index.js +0 -562
  254. package/plugins/freeflow/router/dist/index-benchmarks.d.ts +0 -84
  255. package/plugins/freeflow/router/dist/index-benchmarks.js +0 -458
  256. package/plugins/freeflow/router/dist/index.d.ts +0 -12
  257. package/plugins/freeflow/router/dist/index.js +0 -12
  258. package/plugins/freeflow/router/dist/line-ranges.d.ts +0 -22
  259. package/plugins/freeflow/router/dist/line-ranges.js +0 -22
  260. package/plugins/freeflow/router/dist/parsers.d.ts +0 -16
  261. package/plugins/freeflow/router/dist/parsers.js +0 -473
  262. package/plugins/freeflow/router/dist/repo-traversal.js +0 -242
  263. package/plugins/freeflow/router/dist/retrieve.d.ts +0 -33
  264. package/plugins/freeflow/router/dist/retrieve.js +0 -855
  265. package/plugins/freeflow/router/dist/router-contract.js +0 -54
  266. package/plugins/freeflow/router/dist/run.d.ts +0 -26
  267. package/plugins/freeflow/router/dist/run.js +0 -356
  268. package/plugins/freeflow/router/dist/schema.js +0 -354
  269. package/plugins/freeflow/router/dist/types.d.ts +0 -234
  270. package/plugins/freeflow/router/dist/types.js +0 -9
  271. package/plugins/freeflow/router/dist/vault.d.ts +0 -80
  272. package/plugins/freeflow/router/dist/vault.js +0 -484
  273. package/plugins/freeflow/skills/bypass/SKILL.md +0 -68
  274. package/plugins/freeflow/skills/commit-work/SKILL.md +0 -98
  275. package/plugins/freeflow/skills/commit-work/references/staging-decisions.md +0 -51
  276. package/plugins/freeflow/skills/diagnose-failure/SKILL.md +0 -95
  277. package/plugins/freeflow/skills/diagnose-failure/references/feedback-loop-catalog.md +0 -25
  278. package/plugins/freeflow/skills/diagnose-failure/references/flaky-and-performance.md +0 -31
  279. package/plugins/freeflow/skills/evaluate-skill/SKILL.md +0 -96
  280. package/plugins/freeflow/skills/evaluate-skill/references/eval-patterns.md +0 -41
  281. package/plugins/freeflow/skills/evaluate-skill/references/grading-priority.md +0 -33
  282. package/plugins/freeflow/skills/execute-plan/SKILL.md +0 -132
  283. package/plugins/freeflow/skills/execute-plan/references/execution-map.md +0 -122
  284. package/plugins/freeflow/skills/handoff/SKILL.md +0 -66
  285. package/plugins/freeflow/skills/handoff/references/templates.md +0 -64
  286. package/plugins/freeflow/skills/interview-gate/SKILL.md +0 -90
  287. package/plugins/freeflow/skills/mode-contract/SKILL.md +0 -79
  288. package/plugins/freeflow/skills/output-router/SKILL.md +0 -69
  289. package/plugins/freeflow/skills/output-router/references/safety-policy.md +0 -33
  290. package/plugins/freeflow/skills/research/ARTIFACT-DESTINATIONS.md +0 -58
  291. package/plugins/freeflow/skills/research/CHECKPOINTS.md +0 -74
  292. package/plugins/freeflow/skills/research/LANGUAGE.md +0 -61
  293. package/plugins/freeflow/skills/research/SKILL.md +0 -128
  294. package/plugins/freeflow/skills/review-artifact/SKILL.md +0 -115
  295. package/plugins/freeflow/skills/review-artifact/references/reviewer-prompt.md +0 -56
  296. package/plugins/freeflow/skills/review-work/SKILL.md +0 -96
  297. package/plugins/freeflow/skills/review-work/references/reviewer-prompt.md +0 -97
  298. package/plugins/freeflow/skills/setup-freeflow/SKILL.md +0 -94
  299. package/plugins/freeflow/skills/setup-freeflow/references/activation-contract.md +0 -99
  300. package/plugins/freeflow/skills/setup-freeflow/references/host-setup.md +0 -35
  301. package/plugins/freeflow/skills/setup-freeflow/references/output-router-setup.md +0 -52
  302. package/plugins/freeflow/skills/verify-work/SKILL.md +0 -62
  303. package/plugins/freeflow/skills/workflow/SKILL.md +0 -95
  304. package/plugins/freeflow/skills/workflow/references/workflow-map.md +0 -102
  305. package/plugins/freeflow/skills/write-plan/SKILL.md +0 -88
  306. package/plugins/freeflow/skills/write-plan/references/plan-shapes.md +0 -70
  307. package/plugins/freeflow/skills/write-skill/SKILL.md +0 -88
  308. package/plugins/freeflow/skills/write-spec/SKILL.md +0 -90
  309. package/plugins/freeflow/skills/write-spec/references/artifact-standards.md +0 -67
  310. package/plugins/freeflow/skills/write-spec/references/spec-shapes.md +0 -69
  311. /package/{plugins/freeflow/assets → assets}/freeflow-plugin-icon-transparent.png +0 -0
  312. /package/{plugins/freeflow/hooks → hooks}/hooks.json +0 -0
@@ -0,0 +1,120 @@
1
+ # Activation Contract
2
+
3
+ Freeflow uses layered checkout configuration. Shared repository activation, personal overrides, and runtime delivery are separate facts.
4
+
5
+ ## Repository Activation
6
+
7
+ `.freeflow/config.json` is the required shared activation boundary. Minimal setup is:
8
+
9
+ ```json
10
+ {
11
+ "defaultMode": "workflow"
12
+ }
13
+ ```
14
+
15
+ Supported defaults are `conversation`, `workflow`, and `strict-workflow`. Missing core keys use built-in defaults:
16
+
17
+ - `enabled: true`
18
+ - `interactionContract: true`
19
+ - `skills.enabled: true`
20
+ - `defaultMode: workflow`
21
+
22
+ Repository config may also contain documented Output Router settings. Add optional settings only after an explicit request and preserve valid existing settings during idempotent setup.
23
+
24
+ Do not add current mode, task state, phase, file inventories, plans, version metadata, activation paths, empty optional sections, host instruction copies, or generated workflow text.
25
+
26
+ Missing or invalid repository config means repository activation is absent. A valid config with effective `enabled: false` remains configured but inactive.
27
+
28
+ ## Personal Overrides
29
+
30
+ `.freeflow/local.json` is optional per-checkout state. It cannot activate Freeflow without a valid repository config.
31
+
32
+ It may override these core values:
33
+
34
+ ```json
35
+ {
36
+ "enabled": true,
37
+ "interactionContract": true,
38
+ "skills": {
39
+ "enabled": true
40
+ },
41
+ "defaultMode": "strict-workflow"
42
+ }
43
+ ```
44
+
45
+ Every field is optional. Omission inherits the repository value, then the built-in default. Local core precedence is property-level, not whole-file replacement.
46
+
47
+ The local file may also contain documented local-only `processing` config. It must not contain repository-owned Output Router config.
48
+
49
+ Keep local config untracked and ignored. In a Git checkout, prefer `.git/info/exclude` or an existing ignore rule over an unsolicited shared `.gitignore` edit. Refuse to write personal overrides to a tracked local file.
50
+
51
+ A missing local file means full inheritance. An invalid existing local file blocks effective Freeflow and must not silently fall back to repository settings. Repair or removal requires authorization.
52
+
53
+ ## Effective Core State
54
+
55
+ Resolve core values in this order:
56
+
57
+ ```text
58
+ host session override -> personal override -> repository value -> built-in default
59
+ ```
60
+
61
+ Host session overrides, where supported, may temporarily change Freeflow master enablement, Interaction Contract, Skills, and mode. They are host session state, not config, and cannot bypass missing or invalid repository activation.
62
+
63
+ Effective Freeflow requires:
64
+
65
+ 1. valid repository config;
66
+ 2. missing or valid local config;
67
+ 3. session-resolved `enabled: true`.
68
+
69
+ The Interaction Contract and Skills are independent resolved switches. When Skills are disabled, the configured mode remains visible as resolved state but no Freeflow mode is effective.
70
+
71
+ Repository-owned Output Router settings remain independent capability config and take effect only while top-level Freeflow is enabled.
72
+
73
+ ## Mutation Authority By State
74
+
75
+ Mode constrains agent-performed setup only when a mode is effective:
76
+
77
+ - **Unconfigured:** missing or invalid repository config means no effective mode. An explicit setup request may create missing minimal activation; replacing invalid config requires specific authorization and source-conflict resolution.
78
+ - **Configured but ineffective:** top-level disablement, dormant Skills, or invalid local config leaves no effective mode. An explicit request governs the selected enablement, configuration, or repair; any reported resolved mode remains dormant state only.
79
+ - **Effective:** obey the reported mode. Conversation is read-only. Workflow and Strict Workflow allow only separately authorized setup or repair.
80
+
81
+ A user operating native host settings changes host-managed state directly. That action is distinct from an agent editing `.freeflow/config.json` or `.freeflow/local.json`; verify the resulting source and effective state afterward.
82
+
83
+ ## Runtime Delivery
84
+
85
+ Configuration does not prove runtime delivery.
86
+
87
+ When effective, host adapters may deliver:
88
+
89
+ - `runtime/interaction-contract.md` when the Interaction Contract switch is enabled;
90
+ - one full `skills/workflow/SKILL.md` bootstrap when Skills are enabled;
91
+ - compact active or dormant mode and capability state;
92
+ - explicitly enabled capability context owned by that capability.
93
+
94
+ The full Mode Contract and other workflow skills remain on demand. Adapters load context only; they do not enforce policy, block tools, grant permissions, or replace repo instructions.
95
+
96
+ A setup report classifies automatic delivery as:
97
+
98
+ - **confirmed:** trustworthy evidence shows the current host adapter ran;
99
+ - **unavailable:** the adapter is absent, disabled, denied, untrusted, or unsupported;
100
+ - **unconfirmed:** the host exposes no trustworthy execution evidence.
101
+
102
+ For the setup turn itself, direct reads of newly effective context establish guidance only for that turn. Report those reads separately from lifecycle delivery.
103
+
104
+ ## Repo-Owned Instructions
105
+
106
+ Do not create replacement Freeflow text in `AGENTS.md`, `CLAUDE.md`, `.claude/rules/`, or another repository instruction surface.
107
+
108
+ Existing repo instructions remain live source truth within host precedence. Inspect conflicts and use Decision Gate rather than overwriting them to make Freeflow appear active.
109
+
110
+ ## Setup Invariants
111
+
112
+ Setup is:
113
+
114
+ - idempotent;
115
+ - minimal by default;
116
+ - explicit about shared versus personal state;
117
+ - fail-closed for an invalid personal layer;
118
+ - non-mutating toward repo-owned host instructions;
119
+ - explicit about same-turn reads versus automatic runtime delivery;
120
+ - free of generated replacement instructions and unrequested capability config.
@@ -0,0 +1,72 @@
1
+ # Host Setup
2
+
3
+ Host choice affects runtime delivery and settings controls, not the required repository activation shape.
4
+
5
+ ## Shared Checkout Shape
6
+
7
+ Every host requires:
8
+
9
+ ```text
10
+ .freeflow/config.json
11
+ ```
12
+
13
+ Each checkout may also use:
14
+
15
+ ```text
16
+ .freeflow/local.json
17
+ ```
18
+
19
+ The repository file establishes shared activation. The local file supplies optional personal overrides and cannot activate Freeflow alone. Keep it untracked and ignored.
20
+
21
+ Do not generate host-specific Freeflow instructions in `AGENTS.md`, `CLAUDE.md`, `.claude/rules/`, or another repo-owned instruction surface.
22
+
23
+ ## Pi
24
+
25
+ The Pi extension reads both config layers before each agent turn. A valid repository config plus a missing or valid local layer is required before Freeflow can become effective.
26
+
27
+ Pi provides these settings scopes:
28
+
29
+ ```text
30
+ /freeflow settings personal overrides
31
+ /freeflow settings session temporary session overrides
32
+ /freeflow settings repo shared repository settings
33
+ /freeflow mode direct temporary session mode
34
+ ```
35
+
36
+ Session settings can temporarily inherit, enable, or disable Freeflow, Interaction Contract, and Skills, and can override mode. One reset action clears all four overrides. They persist in the active Pi session branch JSONL, never write `.freeflow/config.json` or `.freeflow/local.json`, and cannot bypass missing or invalid repository activation. Master or Skills changes reload Pi resources when supported.
37
+
38
+ Personal settings use omission to inherit. The settings path refuses to overwrite invalid or tracked local config and establishes local Git exclusion when needed. These are user-operated host controls; they update state before the next model turn. Agent-performed file edits still follow Setup Freeflow's mutation-authority rules.
39
+
40
+ When effective, Pi's `before_agent_start` path preserves the existing system prompt, adds current layered status and enabled model-facing context, and loads Workflow as one hidden persistent message while Skills are enabled. Interaction Contract delivery is independent from Skills. Mode Contract remains on demand.
41
+
42
+ A config written during setup is visible to the available Pi adapter on the next agent turn. After first activation, tell the user to run `/reload` so Pi refreshes skills and resources fully. Without reload, the adapter can load core runtime context on the next agent turn, but resource discovery waits for reload. A session-mode command applies before the next model turn and does not require reload. For the remainder of the setup turn, read newly effective context directly after verification instead of claiming that another `before_agent_start` invocation already occurred.
43
+
44
+ Confirm automatic delivery through current extension status or runtime evidence when available.
45
+
46
+ ## Codex And Claude
47
+
48
+ The packaged lifecycle hook reads the same repository and local layers at supported session start, resume, clear, and compact boundaries.
49
+
50
+ When top-level Freeflow is effective, the hook loads the Interaction Contract if enabled and the full Workflow bootstrap if Skills are enabled. It reports layered value sources and active or dormant mode state. Optional capabilities remain independently gated by valid repository config and top-level Freeflow.
51
+
52
+ After first-time setup, tell the user to trigger the least disruptive supported host-native lifecycle boundary: resume, clear, compact, or a new session/startup as available. Name the exact control supported by the current host; do not prescribe Pi's `/reload`. Until that boundary runs, use same-turn direct reads without claiming automatic delivery.
53
+
54
+ Classify delivery as:
55
+
56
+ - **confirmed** when the current adapter invocation is evidenced;
57
+ - **unavailable** when the plugin or hook is absent, disabled, denied, untrusted, or unsupported;
58
+ - **unconfirmed** when the adapter may be installed and trusted but the host exposes no trustworthy evidence that it ran for the current lifecycle.
59
+
60
+ Installed and trusted registration can establish availability for the next lifecycle action; it does not prove delivery already occurred.
61
+
62
+ Do not compensate for unavailable or unconfirmed delivery by copying Freeflow text into repository instructions.
63
+
64
+ ## Optional Capabilities
65
+
66
+ Do not ask a generic capability question during normal setup. If Output Router is explicitly requested, use `output-router-setup.md` and keep its config in the shared repository layer unless the documented setting is specifically local-only.
67
+
68
+ Do not install repo-local hooks, CLI commands, lint rules, global standards, documentation inventories, or state files during setup.
69
+
70
+ ## Conflicts
71
+
72
+ Repository instructions can conflict with Freeflow behavior even though they are not activation markers. Name the conflict and ask before changing setup or behavior when it would alter the next action.
@@ -0,0 +1,110 @@
1
+ # Output Router Setup
2
+
3
+ Use this only when repository setup or repair explicitly includes Output Router, observed routing, generated-path hints, native safety-net routing, vault, thresholds, script-transform adapters, or script-transform repository config.
4
+
5
+ ## Defaults
6
+
7
+ - Minimal `/setup-freeflow` writes only repository `defaultMode`. `.freeflow/config.json` remains required for activation; a local override cannot activate Freeflow.
8
+ - Output Router is repository-owned and disabled by default.
9
+ - Missing optional sections mean built-in defaults, not setup failure.
10
+ - Normal setup does not ask a generic capability question. If Output Router was not explicitly requested, do not write `outputRouter` config or install script adapters.
11
+ - If the user explicitly opts into Output Router during setup, write `outputRouter.enabled: true` directly. Do not make them run another command afterward.
12
+ - Observed routing is opt-in per producer/server. The user must choose persistence for each enabled entry before setup writes config.
13
+ - Preserve unrelated valid repository and personal settings. Do not copy Output Router config into `.freeflow/local.json`; only documented local-only processing settings belong there.
14
+ - Do not create a separate `setup-output-router` skill.
15
+
16
+ If the user says only “set up the output router” with no requested knobs, explain that enabling Output Router is enough for the router tools/guidance, then ask which optional subfeatures, if any, they want persisted. Recommend no subfeature config unless they need observed routing, repo-specific hints, script transform setup, or native safety-net behavior.
17
+
18
+ ## Config Shape
19
+
20
+ Write only keys the user explicitly requests. Do not dump defaults and do not create empty optional objects. Output-router-related config lives under `outputRouter`. Do not write removed `capture` or `providers` config.
21
+
22
+ Supported shape:
23
+
24
+ ```json
25
+ {
26
+ "defaultMode": "workflow",
27
+ "outputRouter": {
28
+ "enabled": true,
29
+ "postToolRouting": "safety-net",
30
+ "thresholds": {
31
+ "largeOutputBytes": 64000,
32
+ "largeOutputLines": 2000
33
+ },
34
+ "vault": {
35
+ "root": "~/.cache/freeflow-router/vault",
36
+ "retention": { "strategy": "ttl", "ttlDays": 7 }
37
+ },
38
+ "hints": {
39
+ "generatedPathGlobs": ["graphify-out/**"],
40
+ "noisyCommandPatterns": ["npm test"]
41
+ },
42
+ "observedRouting": {
43
+ "enabled": true,
44
+ "onRoutingFailure": "fail-open",
45
+ "mcp": {
46
+ "servers": {
47
+ "github": { "enabled": true, "persistence": "exact" },
48
+ "gmail": { "enabled": true, "persistence": "metadata-only" }
49
+ }
50
+ },
51
+ "web": { "enabled": true, "persistence": "exact" },
52
+ "fetch": { "enabled": true, "persistence": "exact" },
53
+ "codeSearch": { "enabled": true, "persistence": "exact" }
54
+ },
55
+ "scriptTransform": {
56
+ "enabled": true,
57
+ "sandbox": "auto",
58
+ "languages": ["javascript", "python", "jq"],
59
+ "network": "off",
60
+ "limits": {
61
+ "timeoutMs": 5000,
62
+ "maxInputBytes": 1048576,
63
+ "maxOutputBytes": 65536
64
+ },
65
+ "rawScriptPersistence": "disabled"
66
+ }
67
+ }
68
+ }
69
+ ```
70
+
71
+ Rules:
72
+
73
+ - Top-level `enabled` and `skills.enabled` default to true after setup; write them only when the user explicitly wants to disable Freeflow or the skills layer.
74
+ - `outputRouter.enabled` defaults to `false`; write `true` only when the user chooses Output Router.
75
+ - `postToolRouting` defaults to `off`. Do not write `off`; use `safety-net` only when explicitly requested. Treat `strict` as reserved; ask before writing it.
76
+ - `thresholds.largeOutputBytes`, `thresholds.largeOutputLines`, and `vault.retention.ttlDays` must be positive integers.
77
+ - `vault.root` must be a non-empty string. Repo-local storage requires explicit user choice.
78
+ - `hints.generatedPathGlobs` are broad-scan generated-path hints. Explicit file or directory retrieval must remain available.
79
+ - `hints.noisyCommandPatterns` is parsed as hint config. Do not add it unless the user explicitly asks for command-pattern hints.
80
+ - `observedRouting.enabled` defaults to `false`; write it only when the user chooses observed routing.
81
+ - `observedRouting.onRoutingFailure` currently supports `fail-open`; omit it unless a caller needs an explicit non-default once supported.
82
+ - `observedRouting.mcp.servers` must contain explicit server entries only. Setup may discover configured servers for selection, but must not persist a volatile inventory of every installed tool.
83
+ - `observedRouting.web`, `observedRouting.fetch`, and `observedRouting.codeSearch` are Pi observed-routing producers. Enable only the producers the user chose.
84
+ - Every enabled observed-routing entry needs a user-chosen persistence mode: `exact`, `metadata-only`, or `none`.
85
+ - Recommend `exact` for public-ish evidence producers such as GitHub, web, fetch, and code search. Recommend `metadata-only` for sensitive or unknown producers such as Gmail, Slack, private customer systems, or likely-secret outputs.
86
+ - Do not offer or write `redacted`; it is reserved for future work and currently falls back to `metadata-only` with a warning if hand-edited.
87
+ - Pi public `freeflow_capture` and the separate `providers` setup surface have been removed. Do not write removed `capture` or `providers` config.
88
+ - `scriptTransform.enabled` defaults to `false`; write `true` only after an explicit script-execution opt-in.
89
+ - If the user opts into script transform setup and adapters are missing or unavailable, recommend installing global adapters. On consent, resolve `../../router/dist/setup/script-transform-adapters.js` relative to `skills/setup-freeflow/SKILL.md` and run `node <plugin-root>/router/dist/setup/script-transform-adapters.js install --config .freeflow/config.json`.
90
+ - The installer uses `~/.cache/freeflow-script-adapters` by default, or `FREEFLOW_SCRIPT_TRANSFORM_ADAPTERS_HOME` when set. It installs `quickjs-wasi@3.0.1`, `jq-wasm@1.2.0-jq-1.8.2`, `@bsull/eryx@0.5.0`, and `node@24` for the Python JSPI child runner, writes `freeflow-adapter-env.sh`, probes sandbox proofs, and updates `outputRouter.scriptTransform.languages` with only proof-passing languages.
91
+ - Freeflow auto-discovers adapters from that global cache. The explicit roots `FREEFLOW_QUICKJS_WASI_ROOT`, `FREEFLOW_JQ_WASM_ROOT`, and `FREEFLOW_ERYX_ROOT` remain overrides for custom installs.
92
+ - Python/Eryx is installed by setup and uses the setup-installed child Node process launched with `--experimental-wasm-jspi` when the host process lacks JSPI. It must not be marked available unless that child runner passes the required sandbox probes.
93
+ - `scriptTransform.languages` supports `javascript`, `python`, and `jq`; enable only languages whose adapters passed sandbox proofs.
94
+ - `scriptTransform.sandbox` currently supports `auto`, `network` supports only `off`, and `rawScriptPersistence` supports only `disabled`.
95
+ - `scriptTransform.limits.timeoutMs`, `maxInputBytes`, and `maxOutputBytes` must be positive integers within product caps. Per-call script limits may only tighten configured values.
96
+
97
+ ## Verify
98
+
99
+ After writing optional capability config, use `freeflow_status` or equivalent direct inspection to verify:
100
+
101
+ - JSON parses.
102
+ - `defaultMode` is valid.
103
+ - A minimal shared setup with no optional settings contains only `defaultMode`.
104
+ - Newly added `enabled`, `interactionContract`, `skills.enabled`, `outputRouter`, `outputRouter.observedRouting`, and `outputRouter.scriptTransform` keys were requested; preserved valid settings remain unchanged.
105
+ - Invalid router, observed-routing, or script-transform values are not written.
106
+ - Output Router, observed routing, native safety-net routing, and script transform are not enabled unless explicitly requested.
107
+ - If script transform setup was accepted, global adapter install completed or a clear install/probe failure was reported, and enabled languages match proof-passing adapters.
108
+ - No observed-routing entry uses `redacted`, and every enabled entry has explicit persistence.
109
+ - `freeflow_status` shows effective defaults and migration recommendations without rewriting config.
110
+ - No repo-local hooks, skill files, setup-output-router skill, docs inventories, or repo-local storage directories were created.
@@ -0,0 +1,80 @@
1
+ ---
2
+ name: simplify-code
3
+ description: Use when simplifying working code without changing behavior, including removing duplication, indirection, dead abstractions, or confusing control flow.
4
+ ---
5
+
6
+ # Simplify Code
7
+
8
+ Reduce the concepts a reader must hold while preserving accepted behavior.
9
+
10
+ Fewer lines, files, functions, or abstractions are not automatically simpler. Prefer the shape that makes behavior, ownership, and failure paths easier to understand and change.
11
+
12
+ ## Establish The Boundary
13
+
14
+ Before editing:
15
+
16
+ - understand the affected code, callers, tests, comments, and repository conventions;
17
+ - establish the smallest verification baseline that protects observable behavior and error semantics;
18
+ - understand why the current structure exists, including compatibility, performance, platform, history, and failure constraints;
19
+ - define one narrow simplification outcome.
20
+
21
+ Use this skill only when behavior should remain unchanged. If expected behavior is unclear or needs to change, return that evidence to [Workflow](../workflow/SKILL.md). If the interface or ownership is structurally wrong, use [Design for Depth](../design-for-depth/SKILL.md). If no reliable behavior loop exists, use [TDD](../tdd/SKILL.md) or [Diagnose Failure](../diagnose-failure/SKILL.md) first.
22
+
23
+ Read [Code Practices](../execute-work/references/code-practices.md) while changing code. Read [Simplification Patterns](references/simplification-patterns.md) when choosing a transformation or deciding whether deletion really reduces complexity.
24
+
25
+ ## Classify The Opportunity
26
+
27
+ - **Local expression:** names, guards, control flow, duplication, or unnecessary temporary state.
28
+ - **Pass-through indirection:** wrapper, adapter, helper, or layer hides no useful decision.
29
+ - **Accidental abstraction:** generalized machinery has no accepted variation or decision-hiding value.
30
+ - **Scattered concept:** one behavior or policy can move toward one owner without changing its contract.
31
+ - **Dead path:** evidence shows code is unused, unreachable, superseded, or impossible under current invariants.
32
+ - **Structural pressure:** simplification requires changing interfaces, ownership, state, or architecture; return it to Workflow rather than presenting it as cleanup.
33
+
34
+ ## Simplify In Bounded Steps
35
+
36
+ For each step:
37
+
38
+ 1. name the complexity being removed;
39
+ 2. make one behavior-preserving change;
40
+ 3. run the focused behavior and failure checks;
41
+ 4. inspect whether concepts, coordination, and change surface decreased;
42
+ 5. keep or revert the step from evidence.
43
+
44
+ Keep feature work, bug fixes, edge-case handling, public behavior changes, and broad modernization outside the simplification slice. Report adjacent opportunities rather than absorbing them.
45
+
46
+ Follow project conventions rather than personal style. Preserve relevant inputs, outputs, side effects, ordering, errors, timing, permissions, compatibility, and resource behavior.
47
+
48
+ Preserve comments that explain non-obvious rationale, constraints, invariants, or workarounds. Update or remove comments that became stale. Do not add comments that merely narrate the simplified code.
49
+
50
+ ## Treat Tests As Evidence
51
+
52
+ Do not rewrite valid behavior tests merely to make simplification pass.
53
+
54
+ If an implementation-detail test fails while observable behavior appears unchanged, classify the conflict before editing it. Add characterization coverage when important accepted behavior lacks protection. Use expected values independent from the implementation.
55
+
56
+ A green suite is necessary but not sufficient. Inspect the resulting code and real caller path.
57
+
58
+ ## Delete Deliberately
59
+
60
+ Understand the purpose and current consumers before deleting code.
61
+
62
+ Removing a useful module should concentrate complexity behind a better interface, not scatter it into callers. Do not delete compatibility, fallback, platform, migration, audit, or recovery behavior because it appears redundant. Use [Migration Work](../migration-work/SKILL.md) when removal has consumer or compatibility obligations.
63
+
64
+ ## Stop
65
+
66
+ Stop when:
67
+
68
+ - preserving behavior cannot be demonstrated;
69
+ - the simpler version changes public or failure semantics;
70
+ - performance or resource tradeoffs are material and unmeasured;
71
+ - each step exposes another interface, ownership, or edge-case problem;
72
+ - the diff broadens beyond the accepted boundary;
73
+ - source truth or user decisions conflict with deletion;
74
+ - the result is shorter but harder to explain or test.
75
+
76
+ Once evidence supports unchanged behavior and the accepted complexity has been removed, freeze the slice. Further cleanup, modernization, and possible improvements require another selected slice. Do not continue to satisfy a line-count target or reviewer taste.
77
+
78
+ ## Report
79
+
80
+ Report the boundary simplified, concepts or coordination removed, behavior evidence run before and after, relevant comments preserved or changed, intentionally retained complexity, and remaining unverified behavior. A successful simplification reduces reader and change coordination, not merely diff size.
@@ -0,0 +1,70 @@
1
+ # Simplification Patterns
2
+
3
+ Use these as candidate transformations, not automatic rules. Preserve behavior and project conventions.
4
+
5
+ ## Control Flow
6
+
7
+ - Replace deep nesting with guard clauses when exits are truly equivalent.
8
+ - Collapse duplicate branches into one named path.
9
+ - Replace repeated conditionals on one shape with an explicit model or dispatcher when that removes branching across callers.
10
+ - Name intermediate concepts when a dense expression hides intent.
11
+ - Keep straightforward branching when a lookup, callback table, or polymorphic hierarchy would add more concepts.
12
+
13
+ ## Locality
14
+
15
+ - Move behavior toward the state or policy it owns.
16
+ - Gather scattered validation, normalization, or failure handling behind one stable seam.
17
+ - Separate orchestration from business rules when each can then be read and tested independently.
18
+ - Reuse a canonical helper instead of maintaining a near-duplicate.
19
+ - Do not centralize unrelated behavior merely because its syntax looks similar.
20
+
21
+ ## Indirection
22
+
23
+ Question:
24
+
25
+ - pass-through wrappers;
26
+ - one-use factories and strategy layers;
27
+ - aliases that no longer protect compatibility;
28
+ - helpers whose interface is as complex as their implementation;
29
+ - extension points with no accepted variation;
30
+ - adapters that outlived a migration.
31
+
32
+ Keep indirection when it hides volatile dependencies, enforces policy, preserves a real compatibility contract, or creates meaningful test and change locality.
33
+
34
+ ## Names And Types
35
+
36
+ - Rename generic or misleading terms to match domain language.
37
+ - Make invariants explicit at a type or interface boundary when doing so removes downstream checks.
38
+ - Remove casts, optionality, and silent fallbacks only after proving the stronger invariant.
39
+ - Keep comments that explain why, constraints, or non-obvious tradeoffs; remove comments that merely narrate clear code.
40
+
41
+ ## Duplication
42
+
43
+ Duplication is harmful when one behavior must change in several places and can drift.
44
+
45
+ Do not extract merely because two snippets look alike. First confirm they represent the same concept and should evolve together.
46
+
47
+ A small amount of explicit repetition can be simpler than a generalized abstraction with configuration, callbacks, flags, or hidden coupling.
48
+
49
+ ## Dead And Legacy Paths
50
+
51
+ Before removal, inspect static references, runtime use, generated callers, config, tests, history, and compatibility obligations.
52
+
53
+ - Truly dead local code may be removed within the agreed simplification boundary.
54
+ - Supported legacy behavior requires deprecation/migration evidence.
55
+ - Historical docs and audit evidence are not dead code.
56
+ - Commented-out code normally belongs in version history, but confirm it is not an intentional operational instruction.
57
+
58
+ ## Before And After Test
59
+
60
+ Ask:
61
+
62
+ - Are there fewer concepts and branches?
63
+ - Is ownership clearer?
64
+ - Can behavior be understood through fewer files or transitions?
65
+ - Did error and failure semantics remain visible?
66
+ - Is the public interface smaller or unchanged?
67
+ - Did tests become more behavior-focused rather than more coupled?
68
+ - Would the next likely change touch fewer coordinated locations?
69
+
70
+ If the answer is mostly no, complexity was relocated rather than reduced.
@@ -0,0 +1,96 @@
1
+ ---
2
+ name: tdd
3
+ description: Use when implementing or changing behavior test-first, fixing a bug with regression evidence, protecting behavior during refactoring, or when a test is difficult to write or starts shaping production design.
4
+ ---
5
+
6
+ # Test-Driven Development
7
+
8
+ Use one observed failing behavior check to guide the smallest complete implementation for one accepted behavior.
9
+
10
+ TDD is an execution method inside [Execute Work](../execute-work/SKILL.md). One vertical RED/GREEN/REFACTOR loop is a bounded action, not automatically a Track Work slice. Several accepted behavior loops may remain inside one coherent current slice.
11
+
12
+ TDD does not define intended behavior. The accepted request, source truth, and user decisions establish what should happen.
13
+
14
+ ## Follow The Behavior Loop
15
+
16
+ ```text
17
+ [Accepted behavior with settled expectation]
18
+ -> [Choose stable seam and independent oracle]
19
+ -> [RED: write and run the smallest behavior check]
20
+ -> fails for expected missing behavior -> GREEN
21
+ -> passes immediately -> inspect test, boundary, or existing behavior
22
+ -> errors for unrelated reason -> correct harness or diagnose
23
+ -> [GREEN: smallest complete implementation]
24
+ -> [Verify focused behavior]
25
+ -> [REFACTOR when useful, without behavior change]
26
+ -> [Verify original path and affected boundary]
27
+ -> [Route]
28
+ -> another accepted behavior in this slice -> next TDD loop
29
+ -> coherent extension -> approve and record when needed
30
+ -> unclear cause or structural pressure -> Workflow
31
+ -> supported bounded action -> return to Execute Work
32
+ ```
33
+
34
+ Do not write all tests first and all implementation later. Finish, verify, and route one accepted behavior before starting another.
35
+
36
+ ## Use Or Exit Deliberately
37
+
38
+ Use TDD for accepted behavior changes, bug fixes with a supported cause, consequential logic, and refactors whose behavior needs protection.
39
+
40
+ Do not force test-first work onto documentation, static content, mechanical formatting, generated output, or a disposable learning prototype whose result is not selected production behavior.
41
+
42
+ Stop before RED when expected behavior, failure semantics, or a public contract is unsettled. Return the missing direction to [Workflow](../workflow/SKILL.md) rather than encoding a guess as a test.
43
+
44
+ ## Choose The Seam And Oracle
45
+
46
+ Test observable behavior through the highest stable interface that exercises the real requirement.
47
+
48
+ A useful seam:
49
+
50
+ - is used by callers rather than created only for tests;
51
+ - survives internal refactoring;
52
+ - reaches the real behavior or failure path;
53
+ - keeps setup proportionate;
54
+ - can disagree with the implementation.
55
+
56
+ Derive expected results from source truth, a worked example, protocol contract, or independent calculation—not the implementation algorithm.
57
+
58
+ Read [Test Design](references/test-design.md) when the test level, oracle, double, rejected state, composed failure, time or concurrency boundary, or legacy seam is unclear.
59
+
60
+ If testing requires owned internals, duplicated caller choreography, or production hooks used only by tests, return the evidence to Workflow. Use [Design for Depth](../design-for-depth/SKILL.md) only when it establishes design-bearing interface or ownership pressure; do not redesign merely because one test is inconvenient.
61
+
62
+ ## Enforce The Test-First Evidence
63
+
64
+ - Observe RED failing for the intended missing behavior before changing production code.
65
+ - If RED passes immediately, inspect the test, observing boundary, and existing behavior; do not proceed to GREEN automatically.
66
+ - If RED fails because of syntax, setup, environment, or unrelated behavior, correct the harness or diagnose before implementation.
67
+ - Implement the smallest complete GREEN behavior. Read [Code Practices](../execute-work/references/code-practices.md) while changing code.
68
+ - Refactor only when it improves the result while the focused behavior check remains green.
69
+ - Re-run the original path and smallest affected boundary before returning the supported action and evidence to Execute Work.
70
+ - Do not claim TDD when the check was written after implementation or RED was never observed for the intended reason.
71
+
72
+ ## Keep Tests About Accepted Behavior
73
+
74
+ Prefer observable outcomes over internal call sequences, real implementations before doubles, independent expected values, descriptive domain names, and one behavior concept per test.
75
+
76
+ Use fakes, stubs, mocks, or spies only at a boundary where replacement is necessary and the double preserves the fields, effects, invariants, and failure behavior the test needs.
77
+
78
+ Do not copy the implementation into the expected value, add production methods used only by tests, change a valid test merely to make implementation pass, or treat coverage and test count as proof.
79
+
80
+ Add an edge-case check only when accepted behavior, observed failure, material safety, or a settled failure contract requires it. If behavior is undefined, return it to Workflow. When related cases keep adding states, flags, setup, or patches, stop the behavior-loop stream and diagnose the shared contract, cause, ownership, or interface.
81
+
82
+ ## Fix Bugs Through The Reported Boundary
83
+
84
+ First reproduce the reported symptom through the correct seam. A nearby failing path is not the bug.
85
+
86
+ If no reliable diagnostic loop or supported cause exists, use [Diagnose Failure](../diagnose-failure/SKILL.md) before selecting a production correction. After RED and GREEN, rerun both the minimized regression check and the original unminimized symptom or strongest available observer.
87
+
88
+ ## Stop When Tests Start Designing The System
89
+
90
+ Return evidence to Workflow when test setup grows faster than behavior coverage, each case requires another public state or fallback, tests protect machinery introduced by earlier patches, the next check requires an unplanned subsystem, or making it pass expands accepted scope.
91
+
92
+ A green local loop does not prove the global design is right. Diagnose repeated or unexplained failure before redesigning.
93
+
94
+ ## Report
95
+
96
+ Report the accepted behavior and seam, observed RED result, GREEN implementation, refactor if any, original-path and broader verification, current slice effect, and remaining unverified behavior. Return route-changing evidence rather than silently beginning another behavior or slice.
@@ -0,0 +1,96 @@
1
+ # Test Design
2
+
3
+ Read this when the right test level is unclear, a dependency needs a double, legacy behavior lacks a seam, or test setup starts driving production design.
4
+
5
+ The goal is confidence in accepted behavior, not maximal isolation or a fixed unit/integration/end-to-end ratio. One TDD behavior loop is a bounded action and may remain inside a larger coherent Track Work slice.
6
+
7
+ ## Choose The Confidence Boundary
8
+
9
+ Start from the highest stable interface used by callers, then choose the smallest test environment that still exercises its real behavior and failure path:
10
+
11
+ - **Focused behavior test:** deterministic logic or one stable public operation can prove the requirement.
12
+ - **Integration test:** correctness depends on collaborating components, persistence, serialization, process boundaries, or a real adapter contract.
13
+ - **End-to-end or user-path check:** the requirement is a critical flow whose value depends on the assembled system.
14
+ - **Characterization test:** existing behavior must be observed and protected before a behavior-preserving refactor.
15
+
16
+ A characterization test records current behavior; it does not make that behavior desired or authoritative. Stop when intended behavior conflicts with source truth or remains user-owned.
17
+
18
+ A smaller environment is not better when it mocks away the behavior being claimed. A larger environment is not better when its extra machinery adds noise without proving more.
19
+
20
+ ## Build An Independent Oracle
21
+
22
+ Expected results should come from source truth, a worked example, a protocol contract, or an independently calculated value.
23
+
24
+ Do not compute the expected value with the same algorithm as the implementation. That produces agreement by construction.
25
+
26
+ Prefer observable state, outputs, errors, persisted effects, and caller-visible behavior. Assert an interaction only when that interaction is itself part of the accepted contract or the real effect cannot be observed safely at this test boundary.
27
+
28
+ Keep one behavior concept per test. Multiple assertions are fine when they jointly describe one outcome.
29
+
30
+ ## Rejection And Composed Failures
31
+
32
+ For authority, persistence, canonical evidence, retry, cancellation, or recovery behavior, identify the dimensions that materially change the outcome:
33
+
34
+ ```text
35
+ entry point
36
+ × valid or invalid input
37
+ × empty or existing accepted state
38
+ × pre-commit or post-commit failure
39
+ × first call or retry/replay
40
+ ```
41
+
42
+ Do not expand this into an exhaustive matrix by habit. Select the smallest rows that can disprove the accepted failure contract. For each selected row, assert:
43
+
44
+ - returned result;
45
+ - allowed writes or effects;
46
+ - forbidden writes or effects;
47
+ - preservation of prior accepted state;
48
+ - required diagnostic or recovery evidence.
49
+
50
+ When two accepted conditions can coincide, test the composition rather than assuming isolated cases commute. Examples include cancellation plus integrity failure, successful commit plus failed reconciliation, invalid replacement plus existing valid state, or bounded recovery plus continuation redemption.
51
+
52
+ ## Choose A Test Double
53
+
54
+ Preference order:
55
+
56
+ 1. **Real implementation:** use when deterministic, fast enough, safe, and controllable.
57
+ 2. **Fake:** a lightweight working implementation that preserves the relevant contract.
58
+ 3. **Stub:** returns fixed data needed to reach the behavior under test.
59
+ 4. **Mock or spy:** records interactions; use sparingly when the interaction itself matters.
60
+
61
+ Before replacing a dependency, identify:
62
+
63
+ - the behavior and side effects it owns;
64
+ - which of those effects the test depends on;
65
+ - the boundary being isolated;
66
+ - how the double stays faithful to the real contract and failure modes.
67
+
68
+ Mock the slow, external, destructive, privileged, or nondeterministic boundary—not a higher-level operation whose behavior the test needs.
69
+
70
+ Useful double boundaries often include external APIs, email or payment delivery, uncontrollable clocks or randomness, destructive infrastructure, and unavailable remote services. Databases and filesystems may be cheaper and more trustworthy to use for real than to imitate.
71
+
72
+ A fake or stub must preserve the fields, invariants, errors, and side effects relevant downstream. Validate it against a schema, recorded contract, or shared contract tests when drift would create false confidence.
73
+
74
+ Do not add public production methods, flags, branches, or lifecycle operations used only by tests. Keep cleanup and fixture construction in test utilities unless production genuinely owns that behavior.
75
+
76
+ ## Time, Randomness, And Concurrency
77
+
78
+ Prefer an existing controllable boundary for clocks, randomness, scheduling, and external events. Do not expose new public test hooks merely to make assertions convenient.
79
+
80
+ Avoid arbitrary sleeps as proof. Use observable synchronization, deterministic inputs, bounded eventual assertions, or the real diagnostic loop.
81
+
82
+ When a race or flaky path cannot be made deterministic, use [Diagnose Failure](../../diagnose-failure/SKILL.md) to raise the reproduction rate and gather evidence before changing production behavior.
83
+
84
+ ## Pressure Signals
85
+
86
+ Question the seam before adding more test machinery when:
87
+
88
+ - mock setup is longer or more conditional than the behavior;
89
+ - removing a mock changes what the test is actually proving;
90
+ - many owned internals must be exposed or replaced;
91
+ - doubles duplicate production orchestration;
92
+ - test-only production APIs appear;
93
+ - integration repeatedly fails despite isolated tests passing;
94
+ - fixtures must know internal states, ordering, or cleanup protocols callers should not coordinate.
95
+
96
+ A real integration test may be simpler than a network of mocks. If the difficulty reflects caller choreography or a shallow interface, use [Design for Depth](../../design-for-depth/SKILL.md) rather than designing production around the test framework.