@midhunxavier/code-flow 0.0.0-stage → 0.1.0-preview.1

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 (284) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +122 -2
  3. package/bin/codeflow.mjs +8 -0
  4. package/bin/launcher.mjs +127 -0
  5. package/dist/remote-host.json +1 -0
  6. package/licenses/inter.txt +92 -0
  7. package/licenses/preact.txt +21 -0
  8. package/licenses/signals-core.txt +21 -0
  9. package/licenses/signals.txt +21 -0
  10. package/licenses/typescript-notices.txt +193 -0
  11. package/licenses/typescript.txt +55 -0
  12. package/licenses/uqr.txt +22 -0
  13. package/licenses/xterm-fit.txt +19 -0
  14. package/licenses/xterm.txt +21 -0
  15. package/package.json +34 -4
  16. package/public/assets/browser-7XI52A6V.js +8 -0
  17. package/public/assets/changes-EYFPASEI.js +1 -0
  18. package/public/assets/chunk-7H3ZLTKA.js +2 -0
  19. package/public/assets/chunk-L7TUCIYF.js +1 -0
  20. package/public/assets/chunk-LLMQG23J.js +163 -0
  21. package/public/assets/main-KIRM2OEK.js +1 -0
  22. package/public/assets/settings-QJZVW22Y.js +9 -0
  23. package/public/assets/styles-615EBB20.css +32 -0
  24. package/public/assets/terminal-A2FI2NAX.js +62 -0
  25. package/public/assets.json +1 -0
  26. package/public/bundle-meta.json +1 -0
  27. package/public/docs/.nojekyll +0 -0
  28. package/public/docs/accessibility.html +19 -0
  29. package/public/docs/acp-agents.html +117 -0
  30. package/public/docs/agent-containers.html +79 -0
  31. package/public/docs/api.html +1130 -0
  32. package/public/docs/app.js +342 -0
  33. package/public/docs/application-improvements.html +275 -0
  34. package/public/docs/architecture-explorer.html +19 -0
  35. package/public/docs/architecture.html +149 -0
  36. package/public/docs/auto-team.html +142 -0
  37. package/public/docs/automations.html +109 -0
  38. package/public/docs/checkpoint-review.html +37 -0
  39. package/public/docs/code-hosts.html +35 -0
  40. package/public/docs/code-intelligence.html +35 -0
  41. package/public/docs/configuration.html +346 -0
  42. package/public/docs/context-inspection.html +23 -0
  43. package/public/docs/coordinated-changes.html +28 -0
  44. package/public/docs/deferred-runs.html +25 -0
  45. package/public/docs/dependency-discovery.html +19 -0
  46. package/public/docs/documentation.html +84 -0
  47. package/public/docs/dynamic-teams-evaluation.html +174 -0
  48. package/public/docs/dynamic-teams-implementation-plan.html +882 -0
  49. package/public/docs/dynamic-teams-implementation-review-1.html +141 -0
  50. package/public/docs/dynamic-teams-plan-review-0.html +204 -0
  51. package/public/docs/extensions.html +42 -0
  52. package/public/docs/external-sources.html +96 -0
  53. package/public/docs/filesystem-policy.html +26 -0
  54. package/public/docs/filtered-tasks.html +44 -0
  55. package/public/docs/font-license.txt +92 -0
  56. package/public/docs/getting-started.html +118 -0
  57. package/public/docs/github-review-threads.html +26 -0
  58. package/public/docs/github.html +157 -0
  59. package/public/docs/help.html +69 -0
  60. package/public/docs/index.html +77 -0
  61. package/public/docs/installation.html +74 -0
  62. package/public/docs/launch-profiles.html +48 -0
  63. package/public/docs/maintenance.html +60 -0
  64. package/public/docs/memory-claims.html +31 -0
  65. package/public/docs/memory-storage.html +58 -0
  66. package/public/docs/notifications.html +39 -0
  67. package/public/docs/patterns.html +195 -0
  68. package/public/docs/performance-results.html +210 -0
  69. package/public/docs/performance.html +166 -0
  70. package/public/docs/project-conventions.html +22 -0
  71. package/public/docs/project-first-navigation-plan.html +587 -0
  72. package/public/docs/project-teams-implementation-plan.html +772 -0
  73. package/public/docs/project-teams.html +99 -0
  74. package/public/docs/provider-compatibility.html +20 -0
  75. package/public/docs/releasing.html +61 -0
  76. package/public/docs/remote-workers.html +64 -0
  77. package/public/docs/review-inbox.html +26 -0
  78. package/public/docs/run-storage.html +23 -0
  79. package/public/docs/runs.html +141 -0
  80. package/public/docs/search.json +1 -0
  81. package/public/docs/security.html +133 -0
  82. package/public/docs/shared-projects.html +31 -0
  83. package/public/docs/ssh-projects.html +60 -0
  84. package/public/docs/style.css +768 -0
  85. package/public/docs/task-reruns.html +30 -0
  86. package/public/docs/team-collaboration.html +379 -0
  87. package/public/docs/verification.html +22 -0
  88. package/public/docs/vscode.html +53 -0
  89. package/public/docs/worker-permission-verification.html +122 -0
  90. package/public/index.html +17 -0
  91. package/scripts/check-node.mjs +7 -0
  92. package/scripts/codeflow.mjs +55 -0
  93. package/scripts/pty.py +273 -0
  94. package/src/acp-connections.js +110 -0
  95. package/src/adapters/acp-presets.js +37 -0
  96. package/src/adapters/acp-types.js +0 -0
  97. package/src/adapters/acp.js +328 -0
  98. package/src/adapters/agy-auth.js +67 -0
  99. package/src/adapters/agy-isolation.js +223 -0
  100. package/src/adapters/agy.js +297 -0
  101. package/src/adapters/claude.js +220 -0
  102. package/src/adapters/codex-app-server.js +518 -0
  103. package/src/adapters/codex.js +299 -0
  104. package/src/adapters/errors.js +57 -0
  105. package/src/adapters/index.js +91 -0
  106. package/src/adapters/managed-permissions.js +37 -0
  107. package/src/adapters/model-discovery.js +100 -0
  108. package/src/adapters/process.js +418 -0
  109. package/src/adapters/team-tools.js +102 -0
  110. package/src/adapters/types.js +0 -0
  111. package/src/agent-container.js +155 -0
  112. package/src/approvals.js +121 -0
  113. package/src/architecture.js +456 -0
  114. package/src/assets.js +44 -0
  115. package/src/automation.js +901 -0
  116. package/src/certificate-renewal.js +75 -0
  117. package/src/chat-handoff.js +55 -0
  118. package/src/checkpoint-review.js +72 -0
  119. package/src/checks.js +303 -0
  120. package/src/code-host-git.js +102 -0
  121. package/src/code-hosts-api.js +99 -0
  122. package/src/code-hosts.js +482 -0
  123. package/src/code-intelligence-worker.mjs +452 -0
  124. package/src/code-intelligence.js +141 -0
  125. package/src/collab/api.js +365 -0
  126. package/src/collab/checkpoints.js +198 -0
  127. package/src/collab/connections.js +139 -0
  128. package/src/collab/host-execution.js +347 -0
  129. package/src/collab/hub-client.js +210 -0
  130. package/src/collab/link-api.js +229 -0
  131. package/src/collab/link.js +595 -0
  132. package/src/collab/model.js +496 -0
  133. package/src/collab/runner.js +1014 -0
  134. package/src/collab/store.js +1452 -0
  135. package/src/collab/terminals.js +361 -0
  136. package/src/collaboration-reviews.js +116 -0
  137. package/src/config.js +48 -0
  138. package/src/context-budget.js +14 -0
  139. package/src/context-inspection.js +204 -0
  140. package/src/context.js +154 -0
  141. package/src/conventions.js +283 -0
  142. package/src/coordinated-api.js +247 -0
  143. package/src/deferred-launch.js +82 -0
  144. package/src/deferred-runs.js +515 -0
  145. package/src/dependency-health.js +35 -0
  146. package/src/diff.js +43 -0
  147. package/src/docs-help.js +316 -0
  148. package/src/doctor.js +232 -0
  149. package/src/engine.js +4366 -0
  150. package/src/env.js +44 -0
  151. package/src/experience.js +50 -0
  152. package/src/extensions.js +144 -0
  153. package/src/filesystem-access.js +107 -0
  154. package/src/filesystem-policy.js +238 -0
  155. package/src/filtered-task-limits.js +93 -0
  156. package/src/filtered-tasks-api.js +53 -0
  157. package/src/filtered-tasks.js +576 -0
  158. package/src/fs.js +57 -0
  159. package/src/git.js +626 -0
  160. package/src/github-review-threads.js +181 -0
  161. package/src/github.js +538 -0
  162. package/src/http.js +69 -0
  163. package/src/improve-settings.js +38 -0
  164. package/src/improve.js +187 -0
  165. package/src/integrations.js +373 -0
  166. package/src/integrity.js +259 -0
  167. package/src/journey-api.js +77 -0
  168. package/src/journey-replay.js +65 -0
  169. package/src/journey-store.js +97 -0
  170. package/src/journeys.js +60 -0
  171. package/src/json.js +81 -0
  172. package/src/launch-profiles.js +292 -0
  173. package/src/learnings.js +80 -0
  174. package/src/log.js +39 -0
  175. package/src/maintenance.js +335 -0
  176. package/src/memory-analysis.js +182 -0
  177. package/src/memory-claims.js +153 -0
  178. package/src/memory-sqlite.js +236 -0
  179. package/src/memory.js +552 -0
  180. package/src/merge-validation.js +58 -0
  181. package/src/model-catalog.js +238 -0
  182. package/src/model-research.js +91 -0
  183. package/src/notes.js +176 -0
  184. package/src/notifications.js +413 -0
  185. package/src/patterns/auto-team-model.js +212 -0
  186. package/src/patterns/auto-team.js +659 -0
  187. package/src/patterns/council.js +199 -0
  188. package/src/patterns/debate.js +188 -0
  189. package/src/patterns/findings.js +141 -0
  190. package/src/patterns/index.js +19 -0
  191. package/src/patterns/loop.js +158 -0
  192. package/src/patterns/pipeline.js +125 -0
  193. package/src/patterns/prompts.js +181 -0
  194. package/src/patterns/race.js +147 -0
  195. package/src/patterns/schemas.js +40 -0
  196. package/src/patterns/solo.js +49 -0
  197. package/src/patterns/supervisor.js +235 -0
  198. package/src/patterns/task-draft.js +29 -0
  199. package/src/patterns/tdd.js +231 -0
  200. package/src/patterns/team-strategies.js +67 -0
  201. package/src/performance.js +43 -0
  202. package/src/persistence-status.js +35 -0
  203. package/src/phone-sessions.js +96 -0
  204. package/src/preview-overlay.js +383 -0
  205. package/src/preview.js +219 -0
  206. package/src/privacy.js +23 -0
  207. package/src/project-report.js +22 -0
  208. package/src/project-team-model.js +178 -0
  209. package/src/project-team-policy.js +42 -0
  210. package/src/project-team-store.js +213 -0
  211. package/src/project-teams-api.js +36 -0
  212. package/src/project-teams.js +551 -0
  213. package/src/projects.js +286 -0
  214. package/src/provider-eligibility.js +9 -0
  215. package/src/readiness.js +98 -0
  216. package/src/remote-tls.js +66 -0
  217. package/src/remote-workers/bundles.js +198 -0
  218. package/src/remote-workers/client.js +332 -0
  219. package/src/remote-workers/durability.js +37 -0
  220. package/src/remote-workers/protocol.js +68 -0
  221. package/src/remote-workers/stdio.js +138 -0
  222. package/src/remote-workers/worker.js +304 -0
  223. package/src/remote.js +204 -0
  224. package/src/repo-config.js +201 -0
  225. package/src/repo-coordination.js +732 -0
  226. package/src/repo-tree.js +106 -0
  227. package/src/retention-policy.js +466 -0
  228. package/src/review-inbox.js +38 -0
  229. package/src/routing.js +49 -0
  230. package/src/run-analysis.js +111 -0
  231. package/src/run-cold-store.js +231 -0
  232. package/src/run-environment.js +15 -0
  233. package/src/run-history.js +91 -0
  234. package/src/run-log.js +160 -0
  235. package/src/run-permissions.js +110 -0
  236. package/src/run-projection.js +75 -0
  237. package/src/run-recovery.js +53 -0
  238. package/src/run-status.js +54 -0
  239. package/src/serve.js +138 -0
  240. package/src/server.js +2738 -0
  241. package/src/shared-access.js +103 -0
  242. package/src/shared-accounts.js +301 -0
  243. package/src/shared-api.js +239 -0
  244. package/src/shell.js +346 -0
  245. package/src/ship.js +344 -0
  246. package/src/slots.js +74 -0
  247. package/src/snapshot.js +388 -0
  248. package/src/source-context.js +17 -0
  249. package/src/sse-writer.js +70 -0
  250. package/src/ssh-projects/bootstrap.mjs +95 -0
  251. package/src/ssh-projects/config.js +45 -0
  252. package/src/ssh-projects/gateway.js +143 -0
  253. package/src/ssh-projects/manager.js +320 -0
  254. package/src/ssh-projects/team-autostart.mjs +93 -0
  255. package/src/ssh-projects/team-remove.mjs +69 -0
  256. package/src/ssh-projects/team-status.mjs +39 -0
  257. package/src/ssh-projects/transport.js +116 -0
  258. package/src/stats.js +139 -0
  259. package/src/store.js +544 -0
  260. package/src/stream.js +91 -0
  261. package/src/sweeps.js +241 -0
  262. package/src/tailscale.js +101 -0
  263. package/src/task-draft.js +23 -0
  264. package/src/team-evaluation.js +242 -0
  265. package/src/team-mailbox.js +160 -0
  266. package/src/team-memory.js +84 -0
  267. package/src/team-rerun-graph.js +15 -0
  268. package/src/team-reruns.js +130 -0
  269. package/src/team-scheduler.js +121 -0
  270. package/src/team-template-store.js +98 -0
  271. package/src/team-templates.js +117 -0
  272. package/src/team-tool-client.mjs +79 -0
  273. package/src/team-tools.js +176 -0
  274. package/src/teams.js +0 -0
  275. package/src/templates.js +62 -0
  276. package/src/transcript.js +134 -0
  277. package/src/verification-integrity.js +27 -0
  278. package/src/verification.js +183 -0
  279. package/src/watch.js +195 -0
  280. package/src/work-queue.js +47 -0
  281. package/src/workflow-control.js +83 -0
  282. package/src/workspace-api.js +207 -0
  283. package/src/workspace-changes.js +61 -0
  284. package/src/workspace.js +146 -0
@@ -0,0 +1,58 @@
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description" content="Project memory — code-flow guides and reference"><title>Project memory · code-flow</title><link rel="icon" href="data:image/png;base64,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"><link rel="stylesheet" href="style.css"><script src="app.js" defer></script></head>
3
+ <body data-page="memory-storage"><a class="skip-link" href="#content">Skip to content</a>
4
+ <header class="topbar"><a class="brand" href="index.html"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAbSElEQVR42u19a7Ak53nW87xfz5zbrtYSNnbwRU4UGywZE2E5GKfCerETxUlRIVRWVUBcXBJLOKU4wchA7IKzBxzsXCCxQ1JEIT9SCUXYjQMEKiQorpWILSmJpJjgtZEdZGQby7Zuez17zkx/78OP7+ue7p6eOXPO7kryiedU15mZ7pnufi/Pe/8G+OrjWX3wyp9ChBrnOvFMnPMyPo5COAbgGARSXxkXvS6DFHBcYV+J67oMJ1VAsuemBhxXwFEIpE8UQLZ27/nn0w78iTLieTAMxxHEGIk5gqKgEDAlXbEEiur9EsBSel4Q3AJQlJdBPyOIAoDDMAALh5UOg0phqRhH4NzSeOuJ7atPP45v+JoLjfsiTsBwC+Ozz4AkEbWKLn9081rZ8IgUDrv7jXR7MYRDCBi4Ae7pzE2Fri5E1XMB6hwDAMwHOtI+dT4L5c9OXWN+j5OTsPO9ZPt4AFAJUH6BtC+BeLhk/Ag8/Bb+Mh9sQCxbQveMMUAiAAOTFKw+oJu9xNtY4s1cxSEYoHGSXs/S6oI8E4kdojZvnNX7mRHW4E5FaFfnY5nIUoMZuyACK6YQotLpSZAGIAAYAG6AX4A84B4P5c/gmwa/Wmv/HrSBl4SHG4nry/fqm8ywEQLexAESPkTETBBGRzpQ6X9U58bVf2Hsea0usWtZmM0YNr5Dc26+eVzFDAIyAEaIgCBIROGrQDRgXOIuL/GPcZgPQTIQ6r+j/oftGes36Dj+8eHaffFfDMzvGS7jTYMRFDYRrYQoBDmCHAaBcFAC5GlD878mGxr73CfHe+e1Kur79MaKBAKs85pqv0bj/ebrxnVSDirCFBEgFOZQcR5xeBa+EvAtheEjuLt8B0jH+jFmZLhCGpBVbfmjunZQ4JeKFXwzz0MQHECQJwn0TNAKGD1LabWP3QuYoQVNqOpKdA356nneOJCYhripHT3XxGyD2JDWpBlqfJRRBcL4ADA6X/6s3jS4Heviom5rsRfir35E31AU/mvFkn0tz6EEENwRmoQX2nhcS7imbGM/A9TznG0D2/zfhKXuZ2dSoYe5Td6o88EK2ibwJJghcEwNTyPi6uL7R781Nt3Mt+MGBQDx8mmAZCB97V792WC4qwh4IbZRCigqqZ8ifPM9z1pQSfEiBMfOaNq0AXOUaUdta7pS7LFD3efpv8Mm3pRAi6OrUIzOxTvwbcW/XMQwczcGd+X+Cy8ZaPV/FAW+FluIAoLHTPzkkNX4LPVrQFNaey9A85lQMa+JstqJ8nv0TDiDIZPXmmwECAqF+fYQPo7jw/iW4X2V4O6dAVXA8XUP2sGLN941PGiH/RxKCEWM/VLvHY+kBUH5rOqqvxr+f4foTX9fPd6M5km1dkd1qvO8wYguEyo3mUieBgwwMPoBC9tb/nvxnH0zTqHExmzPaGcvKEd7axdufE9x0A77WZRyFJXku9pwU7+uvBa1PZfqdY+30fu8hreGF9TyhmK/JwTPCOwLbjFt8unr9Yb9anpkHvN7YrIPSSCDnUMslu0bsRa/O3mLs+nMRXB/cK/+/LJwfwGYxjA5GDXtj3vjgtEDQ7NwftqaLmCY5xmEKxCSTqQdtTEzNiLoyt8mYYboK2bbI3zUfx+H53lEi3hBDKP4vnAgDHQeUQ62JGIO/PR6P5qD99ph/yyi8wozgW0jzwa8Wp3CMDgcJkCScROwAn/RXzd6Dbj0sVm2oJjrcpIx3D8+Urh9q87B4QjuE99eHenv84TQ3bAAM9QD9pqD65rDlN3YgO55Oc0YNY5jvm9axRSmUJkk5WVYs8Ivhu9w4GO4G4YJ6RZgwNF06Uvj4h1hCdBFuBzmmiZ+RWz3jlvYJbx38wk7aIFmEHcRKNoLA2ZpHvuPk0+YkNxRQlJKIlLkGIDCGwAAb+yPCYp52D+8b+sVNsbNuADIETRDcis/v4aePmlGMyRekPiLYLwukz3QDprRhCM0UheVsFmj/iSHCGIbgPsrcVLLILf68rv9DMjqYuPiu2wZKzqDKE0Y0Ap6vA03wgzY8TlE340hxoJ24VJsQJ8GdfflPJR6YpG0W8QYgPR8nME1AL4wZa9mMiCriyHczHFKH6sj2U2vp2V8+xigGYRdlAm7lf7dHscd0h+zckhdLWBDYQRw7CB0EBolBhybtmDWG/WSWrtPL7QSN2oblMP6DGori9nNTs5jQt8x3vk/61if8/lZW995Fv1s33d5Oy6A1MjOEnJCLio6IARsXlwBABxbxAbckPlblq9hUVytzRyketu4TuXiZ0m4z7AH8yBnlpfU9Yq4g2ZwQc3hgm5tJxSfBJScLmAIyRyX7rCwvTgDXpC/RsWrGQAXooCiie+t4ke2AwsRdRHY0RzXchE3doEE35S/Pw/uOFsI2HU4GlUjSTArAOk8lg88vXhB5vFM2zGua6rZVEKtMjZxjoovoMozYaEPghaFIy0AQ4vA1axzzrNrE61IySHyKbwCT2YN0M4acCof5HixUr6HLePrO/jlmiH1e/GCFomKL8U4L5q84wxY6yniKEODSdIQYAyfxk3cxPp6byQ8rQGZS2XEquJ0bh+NoMt9B0ldRAK1gHbMO35R4z7rc/M0bIfvaJZFJwm8uhSYWxbsdzJhbXe5IM9MrTKUnGBeyyX1BTBdl2iEL1X6fQFJ36laP2O/OtLPLLJyBt+K0a4K/3XGVcxngNgRCO+JCAU4Z3gos3BykRTDohB0qdHyIvFAH/x0EnN1iZIJo+lyLA1N7veOvxsfw/p63UGycD0gYoaf39dFsBuiawG/HAscs+jmC3hl2sFbm4pVBEQHPbV6mHLBXlULRWrO4MD+FUjhhmPcfVFeAD1vnYtqlhU5L/2gXULRbiBokYwodgEz6km6qaeA3yhs1K4/J1Jq0aMvLweN44f9/4Zfx7rmti/O1ACLM1BLC0rUosS/HJtfhu/AbEehEsSqNMdMOKuYkMt85u6wgjH6uWIt3I4NOj5xgntqS2HV+pI1oS5KqMftmuVmLnqzi6ajF3l+OQv0nWp/XXxvWd7EfcpFQeVKESB8/+hv8n9j/WSBjSPlnhiQawvtbOY8yccupHtRo6tLNMCa4c1wjqGdQqlJIMQpp98TU9ydIssDw+Cj8bv9tuEvY10FNnbuFZ1rAxbKaPoOzNiNG7oTg7CHegF2WeJstaCki2ibhsroOSiXCRHFUlEGuBz/wG8b/mSSfMZFzjQvDmhlPedh/5QA7RZzF80JLZqm7jOq2EVdue9C2MzByOkuYxF8tSjKEp9WwO34Xv53HD5ZYONIXBQEd2YA5msAewik3Ro+7BGisIsE3E7FdzUkPG+CqwqsCAmkKAQOlkzLQFn62SjciRW8H3+LT2bMj7uxQDsyoNmcKk33U7aHKpTqpJrU7rST97SbbOnlMrharCZMGgkDA9MUDdPARiT+yIEPYcV+AX+Xn051lJ0N7iU353JGKp6uhJTG9I25SQllFFyCMyW1xUYue5bEZ51Sp9151jGLULfqyanaxmtjasp+PatCr7LYEIg0boHlpjw8Brc/EvGHHOJ+x9MP4bZrztSEx92eJR+XjwHuRJ5Fq+IMdtMNMbUDaJjyFrqwNdLZ7W1cGG9ja1xirIgylSbgIpjmBPKXctLnUROHk+c9rdDUpPdePZ1TUn83VX2SVgduOgfJ1n5WKTVuO/UUiM/K8RDK8Hs4vfkAfuVVX6i//9afG+ATjztObOxpPKkfDSWCFI/rrqUVvBkXU0G+RYicoItDQOPS9dSF8/rSxfM4W47gdAiGpLuA3NLNVhBbjTVlAlSEF6uBlDxzpcSsuuFG7d7YWppZzWhVhGYjWdVmNlralM7V0olmlxPSYBQNCEUKu3y0TbNPgvwvivgP+NlrTwEAjirgxN6G9WYywI7rrqVlvFmbqQu6PjAKMiIS8C+fOavPX3gKm4gKAyLAkr1CKo56Nc7JiQYo/0+tZEwSWM88TAitNBGUPlOXuyfSKmai11NEzaaRDtx0NKD67hZz0NAWqYqECAqWrRoZEJbAMIS2L2yT4Vdj0PvxwZd9HACxvk5s7E4bZjKgOK67BkttBtAhL8A4Go/1f558XE+U5zFcNgUExDQ+BY+s52g9d07WIztkQyMsE3ZC/JrYlcSrTfy03zLcVARuawXFqdvS9Bv1JyftcOz3BtjqhibgJB1QoeFB+Hhz02g/Wn7xpT+CE4zN2TlcyoxYNqmNxJygIRjPb23xf335c3zKz3FlEIBIlKVD0eFeGUdNZkJbI3Z1cJn2G9rEl0FuSaJlEA0kE5wx4UGaWUwQl5iYta6Cn8m4RL21b4z5Oxu9hta4RutkeqbcNJO8gCRsn4mUr2qwtmF/6rHfWL3jMy/CBh1Hj4dLH9Jr5H4oQAPCz2xt8dTjn8M4jDgMQOkRcoekXAkivOoEpiZhY2tOqCKUZU2ZSLpqzcjgSwMZIAQgb1ImegU9DduQhwHhFYOnhbjhSWF6ULZvLrPd/eG54O5yAgiUi1tPl7TBt26NBh9e+qEvfh1O3JI04ZIYUN2EHAiAXxyN9ckn/p80GCNQ8iz1Qkzg1AjBXEpNkg44JxxwVM307JmkridCAQaIAVCAK0DKhK8I7m2mzZL0JtH7G84rI94dvZjSiMlpGkkC5UYgouD26ZI2uH4cR7+Jd37+pdigL8KE2RBEz6JlkFz61JOPacwtBgc9xjwV6YR7Ijg8e0DKQeSMgd7qPpq5DiQjnQx41oBM8InRZgvTNYuwE3Sf2+2vJhR23drpabA2nyenT4of0woK22dLFiuvsFF5HH//syto+dm7ZIA8k7hA0GPnT+v0+LQNTYwoXXA4HEq8gWJzHqZp0NXo2mWjpVpwqNVOPZWLbRnZJrPYGzGz8bfXUYzezmvO3Gr+ZVgCUXDrTInhVa8P0d+b7MEJ2xsDBEcAMIojfuHs4zYIQowl5FGKLkUXFCV3CUkLIE82ofpr9jGmMDMXTlMVg83As6cXvEX8jsROChesI9mpGipmrAah+TmN2hvt519TEyYedL5lKtjW6QiEH1y5/bPfiBO3xHlGua8thTm9cBEDAGe2zmjLz9MQIURIDleqEbkmxE6vK8LXVwOn6inturmoM67TSk+of9JcPZLLvp7AKUjpEH43s+nEDKNde8+trXJEEAEbhLGP/gkA4PqjWpwBVW+o8TEB4FNbZwFFyBPeyzWZnGMiNl3teSXvwIMmJaWa+KxshVpGMwmqWqPvMzOf1A5TG5yZIu3N0HKBrg22oL0dytR6EDg6J7fiLYN3PPraeQbZejrjUngS7BGNAF0oL5ICPEqClKFeSVItq2p2/SrvJlTC1gANqoYHZnjSItUgTOP+FIm5QFFJszs2WtMmfYExO7xki3x18F4H89nnG6yFUnorAOAT/RfZpwHJrhj+p58XMN5OJqYymmAywWpMhGnOXdV+W6xI6e2kmfWv/KAFRt2ZDXv/wdx9fnpubbIHhiamRWzX0CSQcRsQ3nLt+meWc66Ii2iAACCu4iHfGn0RcoO8BDzDUO4VkDITKs3zbAsEyDOh6+vxLPXKYyUNHMgdSE3DrQ4VOGuFiJ1aNhbtVSEWGz6b5xmhETdk/z1ui+R1j54bvCrPXizAgCqU/nY+LsdJBAxMvk15MsL1mDQqrZjcNXM8ML3ATLYVmdA1M/J7VQuwqq7TJsPqKpCmZ0VnMYScX+HfiVFzpJ/tjEeTiSI7CCbXYDWAeA0A4O67bTE39PoXEADiKPyiI6QuReXJWEmpjCFP3o6ake9EUr3nRps9LMwpiyqCVk4iAIlxyi0H7WHYOS3X6lnniXvrT+kKdnfdm6bdYZMpbHhIVdBpYIyvyqNfC8YBG0cisG54oviwynCvg2tGjQA4PApwpyAyU7mCn0q6cyw7qRAzE5fNpEHaZ3SQuacPk83yQgPkpDXB2HC/1Uw2tBNsO1vb+YTvwstU2qgakbf2MWiMzlfXKAcirk2G+HEtGogJR28gNlgq6qcdwSFGg8fU415HpQKzXVBMBI0xLXeoGlIElMkI06vqmFI5zYW06ERiosfMzGpluawJFYRNWtay8e1I/BQ0a7ZRncq7cVrauwzp5uxaxO7RiMrzBg7Migdmh8k5ghv/9Ev+wGP4ZRefR2AMVjkFdxBOwKmYcb1aVqPWFOUReqUALqZFKl2NLccVysZbMR0rJaaqVO1x1Wal8r6aK3zM8MY4a9EhThFrStrnaYD1MZLTjJndmb7AaiknbhGOHg/lky+7s9TwpDw8z+TbIKIBkYjJDjCnKJmTczUTqtREJcFMGSZW6YpshJurTwjKy45UTZE+sTdopLgbjKiZ0e3lQXtlQM6JG9iFF7aPZ2drQRSnl70hEkSZgcHOJgg6wd0uV+M4cUo4wRiXX7oxjoPfkRdXmTQCVCZyuaA8nCl3gE7PUTMqTFesit21oaVXRjfnl6vXqtZXbDj5uS/HpBasEOydne3WIGpp7KyJ2YIPdt7fxYbJd1XmCLRU2DaDrHik6dzsctXEDQfWDT/Ji/Hpl707+tKveAzLFEJaFVQRiA5FT6LrEVRafYfukGLtmiqlNJJmVHZAnss5XjdbqjIwakRnNeE129j2LH9YE9zQXF+s9T5z/a96vqsNve+lp0xyE/ipFOS+UXvsC9rwPOUxKoGfwt959OMhlN8nlF+flmTVGAbQSxMtlRDFQMlUiYPDkldAA2LICWkDFMhUQkuVL+WlUqvYodlbopBdD0AK2UNiu18mm73uarDsSdqRHReTnSB61hK7ndRFdRnd3WRAuT0Oawcf8uYA5N6XrawamCjcqlWUn38LNLqZ8D8NxgOpouWeWE+DVMhgFCw5xCQEY1VeJAKFANJAN4gmYACiKkMaCBNTQ0JVpZwEruOU4xAIqxeNaaeLmaPT7trEVU2afQzoGuvOc/Y3zFpuG8wpMGexau7jU/GVX3MjbuP40petrKYGUuV/E8CHAH5Ib/3cKxHGr0YcvxLGF4FaBTQAUMgZQJkkg1laTyr58AGSiakMqchcTgmsK2FQgESJhBnBGCAvRFsheDVZvAhLBwI1AsoLqYuI1o5Ru66jdROknE4d9TKjsZAc2VMNUi5hq+KRMFgBXL+J2zie1Tu0SwY00hUQcfhYwD0bEb/0kk8B+BQWnKXYy+xE6zNHFfQirGnzSy+30fiIyL9uw2v+ArUJ+MjFYFKjMYNsDxVNEdX6M6tEDwQ1l0Rhw6azpUykmcetaBz++wgA18/Nl+PSVnk8etzw5VPEn7xBOHFKwMaV/qEDdbF88EMXvge68BNm/kKNz7vTMhNSd8uk+c469ZnqPcywBz3EbywUUdvxjIs5ERA1PBTi+MJv+I+98Dvm9QpdyV+z4JWl/zHi6A3EI08bHrwtAvClH7h4nYqL/4mhfLVGF9xJS9a7yo1YFlrrOIJsB1GzavN1o2x22DiR/hr75SLMow1JhDeU7z/0uzh6PODELfFZ+gkTPDM/xXLrAwXuvGmMd229YqDN+4K2roleSoBVcgnm3mA2OxmnffnZFKoDwLpol6AnSb9BYIylrzy/iFtnf0Y/9vzb5xF/76unP/cewp03jXHrAwP8+PKnSfxzLF1FMgVCoKH+X4ttjguqZQ+tJwawTkSco2laOp5WfW+10LdHLR8q4njzY5J+GOsyXH9Kz/KP+DyTbEgAc/B9uGZ0+olPAniB+yiPtli7v4dsQ1DT2LK/yFM7udlGkA2n12NEsRoiwpcd5V/Cew89vJP07ycNQD2IcewYz72bTzr5gIarAOkwa8QQWbLNJlJvjUjYplLK9RgBjbXU01IAliRfpYYHQrThUxbK78R7Dz2MwyeLnYi//xgAIC0LIJbCownrTcrEaxK6CtBbhLdu3kiZPzkMqWGpYTLcSyxfXbgNP2PBvq3cOHQ/1k8WuGexiZn9x4ATyVUx+hptOnfDOt/TJH73V3wqrEcK0muNybBjhMHdHNLaC4pI/vYwDA6X68Pf3+2gHvcdAyBiHRyUT99vYel1vn3eZWZgmKB47mJQN6HfaAe3yr3s/NgNIZirRFguYigAC++Lb7B/iiMscfhkgXt2N6hn++6H1gAcGG7/mTAYvoa+DQRjLb3513jaBZP2EjAphc/s3TQgxwSTPAiOtauLOBg8guXBt8f3hHfjCFP74T27n5LcXwy4IU3ZjcG/YUtrS5CizDiBH06XKzmBm0T4pr2YGGFzjyxWzFcOmZv/QjxQvD6+i/8tTUmucxGDexmScc9xF5SM+FEdxPbW9yBuw3OhnmxMu0iN1TZSYm1Sk2EjEFYVXLlFwNeuDq74GQXeEd9lv9aYDY64hKVBin1kfA1AXPb4nWFp+Vq/cCYqWKhSBXXTNCdrr9U5uEZRXZz0twVXZLEa4tIAMvz8yjXhPee/l483ZoMv+ccU9w8DTh0TJPJHtm8FCVljSJKsG8iBRo2n2VpSpxYESm4CtHooROERLOOd8Qf5n89fJqnff15QzrWvfECvt63yo9reYpSq2dIaUTyvNz9p47JGBJw9HKFksVqoCHDi30bih3EHn8DhkwXeeLdjY0OXi/j7RwOOZv9/q7wNRWEasRRV1AVyAQ7PDYvsNF/ldT7hbm7UgQOFwx+2If5h/AH+egvr78FlT7MX+8L1vIVx5QN6CS6Wf03bI4gI9bQSmz+fyqnlHQmJLufwYHBzl+GnDrzc/tmZ7+LpidQfKa/U5Rf7w/UENIpvteXiKp2/EEVm42uNlv7cOKtGbcwRiRB0YDU48AdYCe+Mb+fdZ66w1O8jG5Brgj+HleXT5R8Gs+vieMuFVH1GvfZsnpJKU4WgSxSdyweCM25pwJ+Iy198H2578ebEw9n7Ahx/fDTgePqNs8Gm/ootFdfp4kUHc1U+B19pgrDh10dF2jD46lIQcfdwNdyx+bb848yX2cPZ/wyo+mzG8VYNg0TWrr7YmWqS3KKg1YPBDU9hiI3y7fjXJemJ8FcW6/cfBGXXc/BB/TmO4wMhenA52zORuSU1ekRYDj4IiIb/ODiIfzRKK10ZDq8b7tl4RqV+f2jA9chDJPGvDpZCga2yBFnUk+Ak4O6MpK+uheh4NCzjPXo7/90IAG59YIA7X1viHpbP5m0UX8HeT+ptK8uXcynEarY8R7yOUtJwNfhAUMC/8VUc87fxS/XQ9J03jZ8Lt1F8BeM/AaAYLv22Av62Us+pSyCKVfNlIDp+15b4nvj3+OFny8jubzdUIu5GCA/6B0D7PghDwOEFHtaSfRCve/DncdNN44ZrqecS8fdXRezHdT0cL0fAabwWD+EIt9IyYifDc03q99+jbxmA9ZPFTkvFfPVxuZlwXAFHFb5K+K8+Fn78f4eywyDh1HjXAAAAAElFTkSuQmCC" width="30" height="30" alt=""><strong>Code Flow</strong><span>Docs</span></a><button class="search-trigger" id="open-search">Search documentation <kbd>⌘ K</kbd></button><div class="top-actions"><a href="https://github.com/midhunxavier/code-flow">GitHub ↗</a><button id="theme" aria-label="Change color theme">Theme</button><button id="open-help" class="primary" hidden aria-expanded="false" aria-controls="help-panel">Ask code-flow</button><button id="menu" aria-label="Toggle documentation navigation" aria-expanded="false" aria-controls="sidebar">☰</button></div></header>
5
+ <div class="layout"><nav class="sidebar" id="sidebar" aria-label="Documentation"><section><h2>Get started</h2><a href="index.html" >Overview</a><a href="installation.html" >Install Code Flow preview</a><a href="getting-started.html" >Getting started</a><a href="patterns.html" >Team patterns</a><a href="acp-agents.html" >ACP coding agents</a><a href="help.html" >Ask code-flow</a></section><section><h2>Work with agents</h2><a href="runs.html" >Runs and workspace</a><a href="auto-team.html" >Auto team</a><a href="project-teams.html" >Project missions (preview)</a><a href="review-inbox.html" >Review inbox</a><a href="verification.html" >Verification and review</a><a href="github.html" >GitHub, review and shipping</a><a href="github-review-threads.html" >GitHub review threads</a><a href="task-reruns.html" >Selective task reruns</a><a href="deferred-runs.html" >Deferred runs</a></section><section><h2>Your workspace</h2><a href="configuration.html" >Configuration</a><a href="context-inspection.html" >Context and budgets</a><a href="project-conventions.html" >Versioned project conventions</a><a href="checkpoint-review.html" >Checkpoints and reversions</a><a href="launch-profiles.html" >Service launch profiles</a><a href="code-intelligence.html" >Code intelligence</a><a href="architecture-explorer.html" >Architecture explorer</a><a href="memory-storage.html" aria-current="page">Project memory</a><a href="memory-claims.html" >Semantic claim review</a><a href="coordinated-changes.html" >Coordinated changes</a></section><section><h2>Connect and collaborate</h2><a href="team-collaboration.html" >Team collaboration</a><a href="shared-projects.html" >Shared project accounts</a><a href="ssh-projects.html" >SSH projects</a><a href="remote-workers.html" >Remote agent workers</a><a href="code-hosts.html" >GitLab and Bitbucket code workflows</a><a href="external-sources.html" >Read-only external sources</a><a href="automations.html" >Automations and away mode</a><a href="notifications.html" >Outbound notifications</a></section><section><h2>Operate safely</h2><a href="security.html" >Security, subscriptions and caveats</a><a href="filesystem-policy.html" >Project filesystem policy</a><a href="agent-containers.html" >Agent containers</a><a href="filtered-tasks.html" >Filtered Docker tasks</a><a href="dependency-discovery.html" >Dependency discovery</a><a href="maintenance.html" >Backup and maintenance</a></section><section><h2>Build and extend</h2><a href="architecture.html" >Architecture and development</a><a href="api.html" >Local API and command-line client</a><a href="extensions.html" >Provider and workflow extensions</a><a href="provider-compatibility.html" >Provider compatibility</a><a href="accessibility.html" >Accessibility acceptance</a><a href="performance.html" >Performance</a><a href="run-storage.html" >Run storage</a><a href="documentation.html" >Documentation and GitHub Pages</a><a href="releasing.html" >Preparing a preview release</a><a href="vscode.html" >Code Flow for VS Code</a></section><section><h2>Engineering records</h2><a href="application-improvements.html" >Application improvement program</a><a href="project-first-navigation-plan.html" >Project navigation review and implementation plan</a><a href="dynamic-teams-evaluation.html" >Dynamic teams: implementation evidence and rollout decision</a><a href="dynamic-teams-implementation-plan.html" >Dynamic teams, workflows, messaging, and memory</a><a href="dynamic-teams-implementation-review-1.html" >Review 1: the dynamic teams implementation</a><a href="worker-permission-verification.html" >Live worker permission verification</a><a href="dynamic-teams-plan-review-0.html" >Review 0: Dynamic teams implementation plan</a><a href="project-teams-implementation-plan.html" >Standing project teams implementation plan</a><a href="performance-results.html" >Measured performance: 19 October 2026</a></section><a class="app-link" id="back-app" hidden href="/">← Back to app</a></nav>
6
+ <main id="content" tabindex="-1"><div class="breadcrumb">Documentation <span>/</span> Your workspace</div><article><h1 id="project-memory">Project memory</h1>
7
+ <p>Open Project memory to search saved guidance, then use Knowledge graph to follow links to files, runs, commits and source memories. Review provenance before applying an entry to new work.</p>
8
+ <h2 id="explore-project-knowledge">Explore project knowledge</h2>
9
+ <p>Code Flow stores private, team and project memory in <code>CODEFLOW_HOME/memory.sqlite</code> (normally <code>~/.codeflow/memory.sqlite</code>). Node <strong>22.13 or newer</strong> is required for the built-in <code>node:sqlite</code> driver. No database server, native npm addon, downloaded extension or extra SSH deployment asset is needed. This replaces the earlier Node 20 memory-storage baseline. SQLite is experimental in Node 22 and may print a startup warning.</p>
10
+ <h2 id="storage-and-migration">Storage and migration</h2>
11
+ <p>The first memory access imports an existing <code>memory.json</code>. Import validates the complete legacy document, creates the schema, records every entry including tombstones and provenance, and compares the imported records with the originals before committing. Unsupported/corrupt JSON or database schemas fail closed. IDs, revisions, approvals, operation receipts and feedback are preserved. Passing the old JSON filename to <code>MemoryStore</code> resolves to the corresponding SQLite file.</p>
12
+ <p>After verified import, the original becomes <code>memory.json.pre-sqlite</code> with private permissions. It is a temporary rollback copy, retained until the <strong>first mutation that changes a record</strong>. Before writing changed records, Code Flow removes that copy and old JSON temporary snapshots so edits and deletions do not leave previous bodies in application-owned migration files. A failed database transaction can therefore leave the rollback copy removed, while the original database records remain intact. Import finalization can resume after a crash without importing duplicate records. If JSON conflicts with the import or reappears after a mutation, Code Flow reports the conflict rather than choosing a version.</p>
13
+ <p>To roll back before any mutation, stop Code Flow, move <code>memory.sqlite</code> aside, and rename <code>memory.json.pre-sqlite</code> to <code>memory.json</code> before using the older release. After mutations, use an explicit backup/restore workflow; the temporary import copy is no longer a current rollback source. External backups and run transcripts have their own retention.</p>
14
+ <p>Each mutation uses <code>BEGIN IMMEDIATE</code> and updates changed memory rows, their keyword index and graph relationships in one transaction. Existing permission, exact-revision conflict, approval, provenance and publication checks still run inside that transaction. Connections close after each operation. The database uses full synchronization, DELETE rollback journaling, private file permissions and SQLite secure deletion. Successful deletion removes the entry&#39;s text, indexed terms and owned graph edges; descendants keep their own text and provenance references. This is logical/application-file redaction, not a guarantee of erasure from filesystem snapshots or storage hardware.</p>
15
+ <p>The existing 32 MiB logical-document limit, 5,000 live project entries and 512 private/team entries per run remain. Mutations still inspect the bounded collection to enforce provenance and collection-wide rules, but only changed rows are written. Scoped reads use a repository/project index. This change does not claim unbounded scale or measured throughput improvements.</p>
16
+ <p>Offline encrypted backup recovers any interrupted SQLite transaction before copying the closed database. Restore retains its memories, indexes and graph. Retention uses database fingerprints and existing revision/provenance checks. A preview of an unmigrated JSON store does not itself migrate it.</p>
17
+ <h2 id="search-and-graph">Search and graph</h2>
18
+ <p>The <code>memories</code> table holds current versioned entries. <code>memory_terms</code> is an indexed Unicode keyword table; title and tag matches carry more weight than body matches. It works on Node builds without FTS5. Search is literal token matching, with at most 32 query terms and 512 matching seeds; it does not use embeddings or an external model.</p>
19
+ <p>The graph uses <code>entities</code> and <code>relationships</code> tables. Every relationship identifies its supplying memory and exact revision. Entities are keyed by repository and project, so identical file names in different projects do not join their graphs.</p>
20
+ <div class="table-scroll" tabindex="0"><table>
21
+ <thead>
22
+ <tr>
23
+ <th>Entity or relationship</th>
24
+ <th>Source</th>
25
+ </tr>
26
+ </thead>
27
+ <tbody><tr>
28
+ <td>Memory → applies to → file/path</td>
29
+ <td>The entry&#39;s explicit <code>paths</code></td>
30
+ </tr>
31
+ <tr>
32
+ <td>Memory → learned from → run</td>
33
+ <td>Its run ID and <code>run:</code> source references</td>
34
+ </tr>
35
+ <tr>
36
+ <td>Memory → learned from/applies to → commit</td>
37
+ <td><code>commit:</code> evidence and branch applicability</td>
38
+ </tr>
39
+ <tr>
40
+ <td>Memory → verified at → commit</td>
41
+ <td>Runtime verification metadata</td>
42
+ </tr>
43
+ <tr>
44
+ <td>Memory → derived from → memory</td>
45
+ <td>Exact <code>derivedFrom</code> references</td>
46
+ </tr>
47
+ </tbody></table>
48
+ </div><p>“Derived from” means the source was in context; it does not assert that its text was copied or its claims are logically proven. The graph does not infer imports, function calls, test coverage or arbitrary relationships from prose. Agent-supplied evidence retains the memory&#39;s existing proposal/trust status. Outdated, deleted or inaccessible source-memory revisions are not resolved to current labels.</p>
49
+ <p>For retrieval, Code Flow first filters to accepted, visible, current, branch-applicable and path-applicable memories. Text matches seed a traversal of at most two hops through the recorded relationships (at most 1,000 edges). Connected memories receive a small ranking boost, and the selection manifest explains it. This never broadens access or path scope and cannot use a private or stale memory as a hidden bridge. Existing character and entry budgets still apply; replay resolves the exact recorded revisions rather than running search again.</p>
50
+ <p>Expand <strong>Project memory → Knowledge graph</strong> to filter connections and inspect their source revisions. The inspector includes proposals for review; it does not approve them. <code>GET /api/projects/:id/memory/graph?repo=&lt;absolute-path&gt;</code> exposes the same bounded, authenticated project view and reports truncation.</p>
51
+ <p>Run journals, settings and the older recurring-review lessons under <code>learnings/</code> retain their existing formats. SQLite is used for the structured agent-memory system; this is not a migration of all application state.</p>
52
+ <hr>
53
+ <p><a href="index.html">Documentation library</a> · <a href="getting-started.html">Getting started</a> · <a href="help.html">Ask code-flow</a></p>
54
+ </article><footer><a href="https://github.com/midhunxavier/code-flow/blob/main/docs/memory-storage.md">Edit this page on GitHub ↗</a><span>code-flow · 0.1.0-preview.1 · <a href="font-license.txt">Font license</a></span></footer><nav class="pagination" aria-label="Adjacent guides"><a href="architecture-explorer.html"><small>← Previous</small>Architecture explorer</a><a href="memory-claims.html"><small>Next →</small>Semantic claim review</a></nav></main>
55
+ <aside class="on-page" aria-label="On this page"><strong>On this page</strong><a class="depth-2" href="#explore-project-knowledge">Explore project knowledge</a><a class="depth-2" href="#storage-and-migration">Storage and migration</a><a class="depth-2" href="#search-and-graph">Search and graph</a></aside>
56
+ <aside id="help-panel" hidden aria-labelledby="help-title"><div class="chat-heading"><div><span class="eyebrow">Your AI companion</span><h2 id="help-title">Ask code-flow</h2></div><button id="close-help" aria-label="Close AI companion">✕</button></div><div class="chat-toolbar"><span>Grounded in your docs</span><button id="new-chat">New chat</button></div><div id="help-messages" role="log" aria-label="Help conversation" aria-live="polite"><div id="chat-welcome"><span class="chat-mark" aria-hidden="true">✦</span><h3>What would you like to do?</h3><p>Let’s find your next step. Ask about setup, workflows or something that’s unclear.</p><div class="suggestions"><button type="button" data-question="How do I start my first run?">Start my first run ↗</button><button type="button" data-question="What should I do when a check fails?">Understand a failed check ↗</button></div></div></div><p id="help-status" role="status">Checking your installed CLIs…</p><button id="retry-help" hidden>Retry connection</button><form id="help-form" hidden><label class="sr-only" for="question">Your question</label><textarea id="question" rows="3" maxlength="4000" placeholder="Ask a question…" required></textarea><div class="composer-controls"><label class="sr-only" for="help-agent">Use your CLI</label><select id="help-agent"></select><button type="button" id="stop-help" hidden>Stop</button><button class="primary" id="send-help" aria-label="Send message">Send ↗</button></div><small>Uses your CLI login and quota. Shift + Enter for a new line.</small></form><a id="help-guide" href="help.html">About your local companion →</a></aside></div>
57
+ <dialog id="search-dialog" aria-labelledby="search-title"><div class="dialog-title"><h2 id="search-title">Search documentation</h2><button data-close="search-dialog" aria-label="Close search">✕</button></div><label class="sr-only" for="search">Search all guides</label><input id="search" type="search" placeholder="Search workflows, settings, troubleshooting…" autocomplete="off"><div id="search-results" aria-live="polite"></div></dialog>
58
+ </body></html>
@@ -0,0 +1,39 @@
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description" content="Outbound notifications — code-flow guides and reference"><title>Outbound notifications · code-flow</title><link rel="icon" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAbSElEQVR42u19a7Ak53nW87xfz5zbrtYSNnbwRU4UGywZE2E5GKfCerETxUlRIVRWVUBcXBJLOKU4wchA7IKzBxzsXCCxQ1JEIT9SCUXYjQMEKiQorpWILSmJpJjgtZEdZGQby7Zuez17zkx/78OP7+ue7p6eOXPO7kryiedU15mZ7pnufi/Pe/8G+OrjWX3wyp9ChBrnOvFMnPMyPo5COAbgGARSXxkXvS6DFHBcYV+J67oMJ1VAsuemBhxXwFEIpE8UQLZ27/nn0w78iTLieTAMxxHEGIk5gqKgEDAlXbEEiur9EsBSel4Q3AJQlJdBPyOIAoDDMAALh5UOg0phqRhH4NzSeOuJ7atPP45v+JoLjfsiTsBwC+Ozz4AkEbWKLn9081rZ8IgUDrv7jXR7MYRDCBi4Ae7pzE2Fri5E1XMB6hwDAMwHOtI+dT4L5c9OXWN+j5OTsPO9ZPt4AFAJUH6BtC+BeLhk/Ag8/Bb+Mh9sQCxbQveMMUAiAAOTFKw+oJu9xNtY4s1cxSEYoHGSXs/S6oI8E4kdojZvnNX7mRHW4E5FaFfnY5nIUoMZuyACK6YQotLpSZAGIAAYAG6AX4A84B4P5c/gmwa/Wmv/HrSBl4SHG4nry/fqm8ywEQLexAESPkTETBBGRzpQ6X9U58bVf2Hsea0usWtZmM0YNr5Dc26+eVzFDAIyAEaIgCBIROGrQDRgXOIuL/GPcZgPQTIQ6r+j/oftGes36Dj+8eHaffFfDMzvGS7jTYMRFDYRrYQoBDmCHAaBcFAC5GlD878mGxr73CfHe+e1Kur79MaKBAKs85pqv0bj/ebrxnVSDirCFBEgFOZQcR5xeBa+EvAtheEjuLt8B0jH+jFmZLhCGpBVbfmjunZQ4JeKFXwzz0MQHECQJwn0TNAKGD1LabWP3QuYoQVNqOpKdA356nneOJCYhripHT3XxGyD2JDWpBlqfJRRBcL4ADA6X/6s3jS4Heviom5rsRfir35E31AU/mvFkn0tz6EEENwRmoQX2nhcS7imbGM/A9TznG0D2/zfhKXuZ2dSoYe5Td6o88EK2ibwJJghcEwNTyPi6uL7R781Nt3Mt+MGBQDx8mmAZCB97V792WC4qwh4IbZRCigqqZ8ifPM9z1pQSfEiBMfOaNq0AXOUaUdta7pS7LFD3efpv8Mm3pRAi6OrUIzOxTvwbcW/XMQwczcGd+X+Cy8ZaPV/FAW+FluIAoLHTPzkkNX4LPVrQFNaey9A85lQMa+JstqJ8nv0TDiDIZPXmmwECAqF+fYQPo7jw/iW4X2V4O6dAVXA8XUP2sGLN941PGiH/RxKCEWM/VLvHY+kBUH5rOqqvxr+f4foTX9fPd6M5km1dkd1qvO8wYguEyo3mUieBgwwMPoBC9tb/nvxnH0zTqHExmzPaGcvKEd7axdufE9x0A77WZRyFJXku9pwU7+uvBa1PZfqdY+30fu8hreGF9TyhmK/JwTPCOwLbjFt8unr9Yb9anpkHvN7YrIPSSCDnUMslu0bsRa/O3mLs+nMRXB/cK/+/LJwfwGYxjA5GDXtj3vjgtEDQ7NwftqaLmCY5xmEKxCSTqQdtTEzNiLoyt8mYYboK2bbI3zUfx+H53lEi3hBDKP4vnAgDHQeUQ62JGIO/PR6P5qD99ph/yyi8wozgW0jzwa8Wp3CMDgcJkCScROwAn/RXzd6Dbj0sVm2oJjrcpIx3D8+Urh9q87B4QjuE99eHenv84TQ3bAAM9QD9pqD65rDlN3YgO55Oc0YNY5jvm9axRSmUJkk5WVYs8Ivhu9w4GO4G4YJ6RZgwNF06Uvj4h1hCdBFuBzmmiZ+RWz3jlvYJbx38wk7aIFmEHcRKNoLA2ZpHvuPk0+YkNxRQlJKIlLkGIDCGwAAb+yPCYp52D+8b+sVNsbNuADIETRDcis/v4aePmlGMyRekPiLYLwukz3QDprRhCM0UheVsFmj/iSHCGIbgPsrcVLLILf68rv9DMjqYuPiu2wZKzqDKE0Y0Ap6vA03wgzY8TlE340hxoJ24VJsQJ8GdfflPJR6YpG0W8QYgPR8nME1AL4wZa9mMiCriyHczHFKH6sj2U2vp2V8+xigGYRdlAm7lf7dHscd0h+zckhdLWBDYQRw7CB0EBolBhybtmDWG/WSWrtPL7QSN2oblMP6DGori9nNTs5jQt8x3vk/61if8/lZW995Fv1s33d5Oy6A1MjOEnJCLio6IARsXlwBABxbxAbckPlblq9hUVytzRyketu4TuXiZ0m4z7AH8yBnlpfU9Yq4g2ZwQc3hgm5tJxSfBJScLmAIyRyX7rCwvTgDXpC/RsWrGQAXooCiie+t4ke2AwsRdRHY0RzXchE3doEE35S/Pw/uOFsI2HU4GlUjSTArAOk8lg88vXhB5vFM2zGua6rZVEKtMjZxjoovoMozYaEPghaFIy0AQ4vA1axzzrNrE61IySHyKbwCT2YN0M4acCof5HixUr6HLePrO/jlmiH1e/GCFomKL8U4L5q84wxY6yniKEODSdIQYAyfxk3cxPp6byQ8rQGZS2XEquJ0bh+NoMt9B0ldRAK1gHbMO35R4z7rc/M0bIfvaJZFJwm8uhSYWxbsdzJhbXe5IM9MrTKUnGBeyyX1BTBdl2iEL1X6fQFJ36laP2O/OtLPLLJyBt+K0a4K/3XGVcxngNgRCO+JCAU4Z3gos3BykRTDohB0qdHyIvFAH/x0EnN1iZIJo+lyLA1N7veOvxsfw/p63UGycD0gYoaf39dFsBuiawG/HAscs+jmC3hl2sFbm4pVBEQHPbV6mHLBXlULRWrO4MD+FUjhhmPcfVFeAD1vnYtqlhU5L/2gXULRbiBokYwodgEz6km6qaeA3yhs1K4/J1Jq0aMvLweN44f9/4Zfx7rmti/O1ACLM1BLC0rUosS/HJtfhu/AbEehEsSqNMdMOKuYkMt85u6wgjH6uWIt3I4NOj5xgntqS2HV+pI1oS5KqMftmuVmLnqzi6ajF3l+OQv0nWp/XXxvWd7EfcpFQeVKESB8/+hv8n9j/WSBjSPlnhiQawvtbOY8yccupHtRo6tLNMCa4c1wjqGdQqlJIMQpp98TU9ydIssDw+Cj8bv9tuEvY10FNnbuFZ1rAxbKaPoOzNiNG7oTg7CHegF2WeJstaCki2ibhsroOSiXCRHFUlEGuBz/wG8b/mSSfMZFzjQvDmhlPedh/5QA7RZzF80JLZqm7jOq2EVdue9C2MzByOkuYxF8tSjKEp9WwO34Xv53HD5ZYONIXBQEd2YA5msAewik3Ro+7BGisIsE3E7FdzUkPG+CqwqsCAmkKAQOlkzLQFn62SjciRW8H3+LT2bMj7uxQDsyoNmcKk33U7aHKpTqpJrU7rST97SbbOnlMrharCZMGgkDA9MUDdPARiT+yIEPYcV+AX+Xn051lJ0N7iU353JGKp6uhJTG9I25SQllFFyCMyW1xUYue5bEZ51Sp9151jGLULfqyanaxmtjasp+PatCr7LYEIg0boHlpjw8Brc/EvGHHOJ+x9MP4bZrztSEx92eJR+XjwHuRJ5Fq+IMdtMNMbUDaJjyFrqwNdLZ7W1cGG9ja1xirIgylSbgIpjmBPKXctLnUROHk+c9rdDUpPdePZ1TUn83VX2SVgduOgfJ1n5WKTVuO/UUiM/K8RDK8Hs4vfkAfuVVX6i//9afG+ATjztObOxpPKkfDSWCFI/rrqUVvBkXU0G+RYicoItDQOPS9dSF8/rSxfM4W47gdAiGpLuA3NLNVhBbjTVlAlSEF6uBlDxzpcSsuuFG7d7YWppZzWhVhGYjWdVmNlralM7V0olmlxPSYBQNCEUKu3y0TbNPgvwvivgP+NlrTwEAjirgxN6G9WYywI7rrqVlvFmbqQu6PjAKMiIS8C+fOavPX3gKm4gKAyLAkr1CKo56Nc7JiQYo/0+tZEwSWM88TAitNBGUPlOXuyfSKmai11NEzaaRDtx0NKD67hZz0NAWqYqECAqWrRoZEJbAMIS2L2yT4Vdj0PvxwZd9HACxvk5s7E4bZjKgOK67BkttBtAhL8A4Go/1f558XE+U5zFcNgUExDQ+BY+s52g9d07WIztkQyMsE3ZC/JrYlcSrTfy03zLcVARuawXFqdvS9Bv1JyftcOz3BtjqhibgJB1QoeFB+Hhz02g/Wn7xpT+CE4zN2TlcyoxYNqmNxJygIRjPb23xf335c3zKz3FlEIBIlKVD0eFeGUdNZkJbI3Z1cJn2G9rEl0FuSaJlEA0kE5wx4UGaWUwQl5iYta6Cn8m4RL21b4z5Oxu9hta4RutkeqbcNJO8gCRsn4mUr2qwtmF/6rHfWL3jMy/CBh1Hj4dLH9Jr5H4oQAPCz2xt8dTjn8M4jDgMQOkRcoekXAkivOoEpiZhY2tOqCKUZU2ZSLpqzcjgSwMZIAQgb1ImegU9DduQhwHhFYOnhbjhSWF6ULZvLrPd/eG54O5yAgiUi1tPl7TBt26NBh9e+qEvfh1O3JI04ZIYUN2EHAiAXxyN9ckn/p80GCNQ8iz1Qkzg1AjBXEpNkg44JxxwVM307JmkridCAQaIAVCAK0DKhK8I7m2mzZL0JtH7G84rI94dvZjSiMlpGkkC5UYgouD26ZI2uH4cR7+Jd37+pdigL8KE2RBEz6JlkFz61JOPacwtBgc9xjwV6YR7Ijg8e0DKQeSMgd7qPpq5DiQjnQx41oBM8InRZgvTNYuwE3Sf2+2vJhR23drpabA2nyenT4of0woK22dLFiuvsFF5HH//syto+dm7ZIA8k7hA0GPnT+v0+LQNTYwoXXA4HEq8gWJzHqZp0NXo2mWjpVpwqNVOPZWLbRnZJrPYGzGz8bfXUYzezmvO3Gr+ZVgCUXDrTInhVa8P0d+b7MEJ2xsDBEcAMIojfuHs4zYIQowl5FGKLkUXFCV3CUkLIE82ofpr9jGmMDMXTlMVg83As6cXvEX8jsROChesI9mpGipmrAah+TmN2hvt519TEyYedL5lKtjW6QiEH1y5/bPfiBO3xHlGua8thTm9cBEDAGe2zmjLz9MQIURIDleqEbkmxE6vK8LXVwOn6inturmoM67TSk+of9JcPZLLvp7AKUjpEH43s+nEDKNde8+trXJEEAEbhLGP/gkA4PqjWpwBVW+o8TEB4FNbZwFFyBPeyzWZnGMiNl3teSXvwIMmJaWa+KxshVpGMwmqWqPvMzOf1A5TG5yZIu3N0HKBrg22oL0dytR6EDg6J7fiLYN3PPraeQbZejrjUngS7BGNAF0oL5ICPEqClKFeSVItq2p2/SrvJlTC1gANqoYHZnjSItUgTOP+FIm5QFFJszs2WtMmfYExO7xki3x18F4H89nnG6yFUnorAOAT/RfZpwHJrhj+p58XMN5OJqYymmAywWpMhGnOXdV+W6xI6e2kmfWv/KAFRt2ZDXv/wdx9fnpubbIHhiamRWzX0CSQcRsQ3nLt+meWc66Ii2iAACCu4iHfGn0RcoO8BDzDUO4VkDITKs3zbAsEyDOh6+vxLPXKYyUNHMgdSE3DrQ4VOGuFiJ1aNhbtVSEWGz6b5xmhETdk/z1ui+R1j54bvCrPXizAgCqU/nY+LsdJBAxMvk15MsL1mDQqrZjcNXM8ML3ATLYVmdA1M/J7VQuwqq7TJsPqKpCmZ0VnMYScX+HfiVFzpJ/tjEeTiSI7CCbXYDWAeA0A4O67bTE39PoXEADiKPyiI6QuReXJWEmpjCFP3o6ake9EUr3nRps9LMwpiyqCVk4iAIlxyi0H7WHYOS3X6lnniXvrT+kKdnfdm6bdYZMpbHhIVdBpYIyvyqNfC8YBG0cisG54oviwynCvg2tGjQA4PApwpyAyU7mCn0q6cyw7qRAzE5fNpEHaZ3SQuacPk83yQgPkpDXB2HC/1Uw2tBNsO1vb+YTvwstU2qgakbf2MWiMzlfXKAcirk2G+HEtGogJR28gNlgq6qcdwSFGg8fU415HpQKzXVBMBI0xLXeoGlIElMkI06vqmFI5zYW06ERiosfMzGpluawJFYRNWtay8e1I/BQ0a7ZRncq7cVrauwzp5uxaxO7RiMrzBg7Migdmh8k5ghv/9Ev+wGP4ZRefR2AMVjkFdxBOwKmYcb1aVqPWFOUReqUALqZFKl2NLccVysZbMR0rJaaqVO1x1Wal8r6aK3zM8MY4a9EhThFrStrnaYD1MZLTjJndmb7AaiknbhGOHg/lky+7s9TwpDw8z+TbIKIBkYjJDjCnKJmTczUTqtREJcFMGSZW6YpshJurTwjKy45UTZE+sTdopLgbjKiZ0e3lQXtlQM6JG9iFF7aPZ2drQRSnl70hEkSZgcHOJgg6wd0uV+M4cUo4wRiXX7oxjoPfkRdXmTQCVCZyuaA8nCl3gE7PUTMqTFesit21oaVXRjfnl6vXqtZXbDj5uS/HpBasEOydne3WIGpp7KyJ2YIPdt7fxYbJd1XmCLRU2DaDrHik6dzsctXEDQfWDT/Ji/Hpl707+tKveAzLFEJaFVQRiA5FT6LrEVRafYfukGLtmiqlNJJmVHZAnss5XjdbqjIwakRnNeE129j2LH9YE9zQXF+s9T5z/a96vqsNve+lp0xyE/ipFOS+UXvsC9rwPOUxKoGfwt959OMhlN8nlF+flmTVGAbQSxMtlRDFQMlUiYPDkldAA2LICWkDFMhUQkuVL+WlUqvYodlbopBdD0AK2UNiu18mm73uarDsSdqRHReTnSB61hK7ndRFdRnd3WRAuT0Oawcf8uYA5N6XrawamCjcqlWUn38LNLqZ8D8NxgOpouWeWE+DVMhgFCw5xCQEY1VeJAKFANJAN4gmYACiKkMaCBNTQ0JVpZwEruOU4xAIqxeNaaeLmaPT7trEVU2afQzoGuvOc/Y3zFpuG8wpMGexau7jU/GVX3MjbuP40petrKYGUuV/E8CHAH5Ib/3cKxHGr0YcvxLGF4FaBTQAUMgZQJkkg1laTyr58AGSiakMqchcTgmsK2FQgESJhBnBGCAvRFsheDVZvAhLBwI1AsoLqYuI1o5Ru66jdROknE4d9TKjsZAc2VMNUi5hq+KRMFgBXL+J2zie1Tu0SwY00hUQcfhYwD0bEb/0kk8B+BQWnKXYy+xE6zNHFfQirGnzSy+30fiIyL9uw2v+ArUJ+MjFYFKjMYNsDxVNEdX6M6tEDwQ1l0Rhw6azpUykmcetaBz++wgA18/Nl+PSVnk8etzw5VPEn7xBOHFKwMaV/qEDdbF88EMXvge68BNm/kKNz7vTMhNSd8uk+c469ZnqPcywBz3EbywUUdvxjIs5ERA1PBTi+MJv+I+98Dvm9QpdyV+z4JWl/zHi6A3EI08bHrwtAvClH7h4nYqL/4mhfLVGF9xJS9a7yo1YFlrrOIJsB1GzavN1o2x22DiR/hr75SLMow1JhDeU7z/0uzh6PODELfFZ+gkTPDM/xXLrAwXuvGmMd229YqDN+4K2roleSoBVcgnm3mA2OxmnffnZFKoDwLpol6AnSb9BYIylrzy/iFtnf0Y/9vzb5xF/76unP/cewp03jXHrAwP8+PKnSfxzLF1FMgVCoKH+X4ttjguqZQ+tJwawTkSco2laOp5WfW+10LdHLR8q4njzY5J+GOsyXH9Kz/KP+DyTbEgAc/B9uGZ0+olPAniB+yiPtli7v4dsQ1DT2LK/yFM7udlGkA2n12NEsRoiwpcd5V/Cew89vJP07ycNQD2IcewYz72bTzr5gIarAOkwa8QQWbLNJlJvjUjYplLK9RgBjbXU01IAliRfpYYHQrThUxbK78R7Dz2MwyeLnYi//xgAIC0LIJbCownrTcrEaxK6CtBbhLdu3kiZPzkMqWGpYTLcSyxfXbgNP2PBvq3cOHQ/1k8WuGexiZn9x4ATyVUx+hptOnfDOt/TJH73V3wqrEcK0muNybBjhMHdHNLaC4pI/vYwDA6X68Pf3+2gHvcdAyBiHRyUT99vYel1vn3eZWZgmKB47mJQN6HfaAe3yr3s/NgNIZirRFguYigAC++Lb7B/iiMscfhkgXt2N6hn++6H1gAcGG7/mTAYvoa+DQRjLb3513jaBZP2EjAphc/s3TQgxwSTPAiOtauLOBg8guXBt8f3hHfjCFP74T27n5LcXwy4IU3ZjcG/YUtrS5CizDiBH06XKzmBm0T4pr2YGGFzjyxWzFcOmZv/QjxQvD6+i/8tTUmucxGDexmScc9xF5SM+FEdxPbW9yBuw3OhnmxMu0iN1TZSYm1Sk2EjEFYVXLlFwNeuDq74GQXeEd9lv9aYDY64hKVBin1kfA1AXPb4nWFp+Vq/cCYqWKhSBXXTNCdrr9U5uEZRXZz0twVXZLEa4tIAMvz8yjXhPee/l483ZoMv+ccU9w8DTh0TJPJHtm8FCVljSJKsG8iBRo2n2VpSpxYESm4CtHooROERLOOd8Qf5n89fJqnff15QzrWvfECvt63yo9reYpSq2dIaUTyvNz9p47JGBJw9HKFksVqoCHDi30bih3EHn8DhkwXeeLdjY0OXi/j7RwOOZv9/q7wNRWEasRRV1AVyAQ7PDYvsNF/ldT7hbm7UgQOFwx+2If5h/AH+egvr78FlT7MX+8L1vIVx5QN6CS6Wf03bI4gI9bQSmz+fyqnlHQmJLufwYHBzl+GnDrzc/tmZ7+LpidQfKa/U5Rf7w/UENIpvteXiKp2/EEVm42uNlv7cOKtGbcwRiRB0YDU48AdYCe+Mb+fdZ66w1O8jG5Brgj+HleXT5R8Gs+vieMuFVH1GvfZsnpJKU4WgSxSdyweCM25pwJ+Iy198H2578ebEw9n7Ahx/fDTgePqNs8Gm/ootFdfp4kUHc1U+B19pgrDh10dF2jD46lIQcfdwNdyx+bb848yX2cPZ/wyo+mzG8VYNg0TWrr7YmWqS3KKg1YPBDU9hiI3y7fjXJemJ8FcW6/cfBGXXc/BB/TmO4wMhenA52zORuSU1ekRYDj4IiIb/ODiIfzRKK10ZDq8b7tl4RqV+f2jA9chDJPGvDpZCga2yBFnUk+Ak4O6MpK+uheh4NCzjPXo7/90IAG59YIA7X1viHpbP5m0UX8HeT+ptK8uXcynEarY8R7yOUtJwNfhAUMC/8VUc87fxS/XQ9J03jZ8Lt1F8BeM/AaAYLv22Av62Us+pSyCKVfNlIDp+15b4nvj3+OFny8jubzdUIu5GCA/6B0D7PghDwOEFHtaSfRCve/DncdNN44ZrqecS8fdXRezHdT0cL0fAabwWD+EIt9IyYifDc03q99+jbxmA9ZPFTkvFfPVxuZlwXAFHFb5K+K8+Fn78f4eywyDh1HjXAAAAAElFTkSuQmCC"><link rel="stylesheet" href="style.css"><script src="app.js" defer></script></head>
3
+ <body data-page="notifications"><a class="skip-link" href="#content">Skip to content</a>
4
+ <header class="topbar"><a class="brand" href="index.html"><img src="data:image/png;base64,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" width="30" height="30" alt=""><strong>Code Flow</strong><span>Docs</span></a><button class="search-trigger" id="open-search">Search documentation <kbd>⌘ K</kbd></button><div class="top-actions"><a href="https://github.com/midhunxavier/code-flow">GitHub ↗</a><button id="theme" aria-label="Change color theme">Theme</button><button id="open-help" class="primary" hidden aria-expanded="false" aria-controls="help-panel">Ask code-flow</button><button id="menu" aria-label="Toggle documentation navigation" aria-expanded="false" aria-controls="sidebar">☰</button></div></header>
5
+ <div class="layout"><nav class="sidebar" id="sidebar" aria-label="Documentation"><section><h2>Get started</h2><a href="index.html" >Overview</a><a href="installation.html" >Install Code Flow preview</a><a href="getting-started.html" >Getting started</a><a href="patterns.html" >Team patterns</a><a href="acp-agents.html" >ACP coding agents</a><a href="help.html" >Ask code-flow</a></section><section><h2>Work with agents</h2><a href="runs.html" >Runs and workspace</a><a href="auto-team.html" >Auto team</a><a href="project-teams.html" >Project missions (preview)</a><a href="review-inbox.html" >Review inbox</a><a href="verification.html" >Verification and review</a><a href="github.html" >GitHub, review and shipping</a><a href="github-review-threads.html" >GitHub review threads</a><a href="task-reruns.html" >Selective task reruns</a><a href="deferred-runs.html" >Deferred runs</a></section><section><h2>Your workspace</h2><a href="configuration.html" >Configuration</a><a href="context-inspection.html" >Context and budgets</a><a href="project-conventions.html" >Versioned project conventions</a><a href="checkpoint-review.html" >Checkpoints and reversions</a><a href="launch-profiles.html" >Service launch profiles</a><a href="code-intelligence.html" >Code intelligence</a><a href="architecture-explorer.html" >Architecture explorer</a><a href="memory-storage.html" >Project memory</a><a href="memory-claims.html" >Semantic claim review</a><a href="coordinated-changes.html" >Coordinated changes</a></section><section><h2>Connect and collaborate</h2><a href="team-collaboration.html" >Team collaboration</a><a href="shared-projects.html" >Shared project accounts</a><a href="ssh-projects.html" >SSH projects</a><a href="remote-workers.html" >Remote agent workers</a><a href="code-hosts.html" >GitLab and Bitbucket code workflows</a><a href="external-sources.html" >Read-only external sources</a><a href="automations.html" >Automations and away mode</a><a href="notifications.html" aria-current="page">Outbound notifications</a></section><section><h2>Operate safely</h2><a href="security.html" >Security, subscriptions and caveats</a><a href="filesystem-policy.html" >Project filesystem policy</a><a href="agent-containers.html" >Agent containers</a><a href="filtered-tasks.html" >Filtered Docker tasks</a><a href="dependency-discovery.html" >Dependency discovery</a><a href="maintenance.html" >Backup and maintenance</a></section><section><h2>Build and extend</h2><a href="architecture.html" >Architecture and development</a><a href="api.html" >Local API and command-line client</a><a href="extensions.html" >Provider and workflow extensions</a><a href="provider-compatibility.html" >Provider compatibility</a><a href="accessibility.html" >Accessibility acceptance</a><a href="performance.html" >Performance</a><a href="run-storage.html" >Run storage</a><a href="documentation.html" >Documentation and GitHub Pages</a><a href="releasing.html" >Preparing a preview release</a><a href="vscode.html" >Code Flow for VS Code</a></section><section><h2>Engineering records</h2><a href="application-improvements.html" >Application improvement program</a><a href="project-first-navigation-plan.html" >Project navigation review and implementation plan</a><a href="dynamic-teams-evaluation.html" >Dynamic teams: implementation evidence and rollout decision</a><a href="dynamic-teams-implementation-plan.html" >Dynamic teams, workflows, messaging, and memory</a><a href="dynamic-teams-implementation-review-1.html" >Review 1: the dynamic teams implementation</a><a href="worker-permission-verification.html" >Live worker permission verification</a><a href="dynamic-teams-plan-review-0.html" >Review 0: Dynamic teams implementation plan</a><a href="project-teams-implementation-plan.html" >Standing project teams implementation plan</a><a href="performance-results.html" >Measured performance: 19 October 2026</a></section><a class="app-link" id="back-app" hidden href="/">← Back to app</a></nav>
6
+ <main id="content" tabindex="-1"><div class="breadcrumb">Documentation <span>/</span> Connect and collaborate</div><article><h1 id="outbound-notifications">Outbound notifications</h1>
7
+ <p>Open Settings → Notifications, configure a destination and its scope, then inspect delivery history. Outbound destinations are opt-in and can disclose the event details selected for delivery.</p>
8
+ <h2 id="choose-where-alerts-go">Choose where alerts go</h2>
9
+ <p>Notifications require an explicitly configured destination and a saved opt-in for its events and project scope. New destinations start disabled. No account is connected and no destination can be created from the browser.</p>
10
+ <p>Set <code>CODEFLOW_NOTIFICATIONS_FILE</code> to a server-side JSON file, or set <code>CODEFLOW_NOTIFICATIONS_JSON</code> to its contents:</p>
11
+ <pre><code class="language-json">[
12
+ {
13
+ &quot;id&quot;: &quot;team-status&quot;,
14
+ &quot;name&quot;: &quot;Team status&quot;,
15
+ &quot;protocol&quot;: &quot;webhook&quot;,
16
+ &quot;urlEnv&quot;: &quot;TEAM_STATUS_WEBHOOK_URL&quot;,
17
+ &quot;secretEnv&quot;: &quot;TEAM_STATUS_WEBHOOK_TOKEN&quot;
18
+ },
19
+ {
20
+ &quot;id&quot;: &quot;slack-status&quot;,
21
+ &quot;name&quot;: &quot;Slack status&quot;,
22
+ &quot;protocol&quot;: &quot;slack&quot;,
23
+ &quot;urlEnv&quot;: &quot;SLACK_STATUS_WEBHOOK_URL&quot;
24
+ }
25
+ ]
26
+ </code></pre>
27
+ <p>Supply those referenced environment variables to the server. URLs must use HTTPS and cannot contain user credentials or a fragment. <code>secretEnv</code> is optional and sends its value as a Bearer authorization header. The Slack protocol uses an existing <a href="https://docs.slack.dev/messaging/sending-messages-using-incoming-webhooks/">Slack incoming webhook</a>, with a literal text block and link previews disabled. There are no email, Teams account, or channel-management adapters; a separately configured HTTPS relay can consume the generic webhook protocol.</p>
28
+ <p>In Settings → Notifications, select the destination, its events, and its projects, then save. Available events are run completion, run or verification failure, and requests for attention. “Without a project” covers runs with no project; “All projects” includes future projects. A run that finishes with failed or blocked verification produces a failure event. Sending a test is a separate, explicit action and works before enabling automatic notifications.</p>
29
+ <p>Generic webhook requests contain JSON with <code>version</code>, <code>id</code>, <code>event</code>, <code>runId</code>, optional <code>project</code>, <code>pattern</code>, <code>status</code>, <code>result</code>, and a task <code>title</code> limited to 200 characters. A manual test additionally has <code>test: true</code>. They exclude repository paths, transcripts, command output, and imported source content. Task titles can contain sensitive business information: opt in only for an appropriate destination. Recognizable secrets and configured credential values are redacted. The browser API exposes destination hostname, scope settings, and delivery metadata; it never exposes the webhook URL, credential names, tokens, or saved payloads.</p>
30
+ <p>The local outbox persists an event before sending, keeps at most 200 deliveries and 2,000 recent event identities, and sends at most 20 requests per worker pass. The worker checks every ten seconds, uses a ten-second request timeout, and refuses redirects. HTTP 429, server errors, and connection failures retry up to three total attempts with bounded exponential backoff. <code>Retry-After</code> seconds can extend the delay to at most five minutes. Other HTTP errors fail once. Pending deliveries expire after 24 hours without an attempt. When the queue is full, the newest event is dropped and its count and reason appear in the UI. Delivery history exposes failures, attempt counts, and an explicit retry action.</p>
31
+ <p>The <code>Idempotency-Key</code> request header is the persistent delivery ID. Recipients should deduplicate it. Exactly-once delivery is not guaranteed: a timeout or crash can happen after a recipient accepts a message. A delivery interrupted while sending becomes an unknown-outcome failure on restart and requires an explicit retry. Slack incoming webhooks do not provide an application-level deduplication guarantee. After 2,000 newer event identities have displaced an old identity, replaying that old event may deliver it again.</p>
32
+ <p>Changing the configured URL or protocol requires renewed opt-in. Disabling a destination or narrowing its scope cancels pending automatic deliveries, but cannot retract a request already in flight. Restoring an encrypted backup disables saved notification opt-ins and cancels pending or sending deliveries. Corrupt saved state leaves notifications unavailable and preserves the file for repair. Delivery state belongs to one server process; do not share its storage across multiple running servers.</p>
33
+ <hr>
34
+ <p><a href="index.html">Documentation library</a> · <a href="getting-started.html">Getting started</a> · <a href="help.html">Ask code-flow</a></p>
35
+ </article><footer><a href="https://github.com/midhunxavier/code-flow/blob/main/docs/notifications.md">Edit this page on GitHub ↗</a><span>code-flow · 0.1.0-preview.1 · <a href="font-license.txt">Font license</a></span></footer><nav class="pagination" aria-label="Adjacent guides"><a href="automations.html"><small>← Previous</small>Automations and away mode</a><a href="security.html"><small>Next →</small>Security, subscriptions and caveats</a></nav></main>
36
+ <aside class="on-page" aria-label="On this page"><strong>On this page</strong><a class="depth-2" href="#choose-where-alerts-go">Choose where alerts go</a></aside>
37
+ <aside id="help-panel" hidden aria-labelledby="help-title"><div class="chat-heading"><div><span class="eyebrow">Your AI companion</span><h2 id="help-title">Ask code-flow</h2></div><button id="close-help" aria-label="Close AI companion">✕</button></div><div class="chat-toolbar"><span>Grounded in your docs</span><button id="new-chat">New chat</button></div><div id="help-messages" role="log" aria-label="Help conversation" aria-live="polite"><div id="chat-welcome"><span class="chat-mark" aria-hidden="true">✦</span><h3>What would you like to do?</h3><p>Let’s find your next step. Ask about setup, workflows or something that’s unclear.</p><div class="suggestions"><button type="button" data-question="How do I start my first run?">Start my first run ↗</button><button type="button" data-question="What should I do when a check fails?">Understand a failed check ↗</button></div></div></div><p id="help-status" role="status">Checking your installed CLIs…</p><button id="retry-help" hidden>Retry connection</button><form id="help-form" hidden><label class="sr-only" for="question">Your question</label><textarea id="question" rows="3" maxlength="4000" placeholder="Ask a question…" required></textarea><div class="composer-controls"><label class="sr-only" for="help-agent">Use your CLI</label><select id="help-agent"></select><button type="button" id="stop-help" hidden>Stop</button><button class="primary" id="send-help" aria-label="Send message">Send ↗</button></div><small>Uses your CLI login and quota. Shift + Enter for a new line.</small></form><a id="help-guide" href="help.html">About your local companion →</a></aside></div>
38
+ <dialog id="search-dialog" aria-labelledby="search-title"><div class="dialog-title"><h2 id="search-title">Search documentation</h2><button data-close="search-dialog" aria-label="Close search">✕</button></div><label class="sr-only" for="search">Search all guides</label><input id="search" type="search" placeholder="Search workflows, settings, troubleshooting…" autocomplete="off"><div id="search-results" aria-live="polite"></div></dialog>
39
+ </body></html>
@@ -0,0 +1,195 @@
1
+ <!doctype html>
2
+ <html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><meta name="description" content="Team patterns — code-flow guides and reference"><title>Team patterns · code-flow</title><link rel="icon" href="data:image/png;base64,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"><link rel="stylesheet" href="style.css"><script src="app.js" defer></script></head>
3
+ <body data-page="patterns"><a class="skip-link" href="#content">Skip to content</a>
4
+ <header class="topbar"><a class="brand" href="index.html"><img src="data:image/png;base64,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" width="30" height="30" alt=""><strong>Code Flow</strong><span>Docs</span></a><button class="search-trigger" id="open-search">Search documentation <kbd>⌘ K</kbd></button><div class="top-actions"><a href="https://github.com/midhunxavier/code-flow">GitHub ↗</a><button id="theme" aria-label="Change color theme">Theme</button><button id="open-help" class="primary" hidden aria-expanded="false" aria-controls="help-panel">Ask code-flow</button><button id="menu" aria-label="Toggle documentation navigation" aria-expanded="false" aria-controls="sidebar">☰</button></div></header>
5
+ <div class="layout"><nav class="sidebar" id="sidebar" aria-label="Documentation"><section><h2>Get started</h2><a href="index.html" >Overview</a><a href="installation.html" >Install Code Flow preview</a><a href="getting-started.html" >Getting started</a><a href="patterns.html" aria-current="page">Team patterns</a><a href="acp-agents.html" >ACP coding agents</a><a href="help.html" >Ask code-flow</a></section><section><h2>Work with agents</h2><a href="runs.html" >Runs and workspace</a><a href="auto-team.html" >Auto team</a><a href="project-teams.html" >Project missions (preview)</a><a href="review-inbox.html" >Review inbox</a><a href="verification.html" >Verification and review</a><a href="github.html" >GitHub, review and shipping</a><a href="github-review-threads.html" >GitHub review threads</a><a href="task-reruns.html" >Selective task reruns</a><a href="deferred-runs.html" >Deferred runs</a></section><section><h2>Your workspace</h2><a href="configuration.html" >Configuration</a><a href="context-inspection.html" >Context and budgets</a><a href="project-conventions.html" >Versioned project conventions</a><a href="checkpoint-review.html" >Checkpoints and reversions</a><a href="launch-profiles.html" >Service launch profiles</a><a href="code-intelligence.html" >Code intelligence</a><a href="architecture-explorer.html" >Architecture explorer</a><a href="memory-storage.html" >Project memory</a><a href="memory-claims.html" >Semantic claim review</a><a href="coordinated-changes.html" >Coordinated changes</a></section><section><h2>Connect and collaborate</h2><a href="team-collaboration.html" >Team collaboration</a><a href="shared-projects.html" >Shared project accounts</a><a href="ssh-projects.html" >SSH projects</a><a href="remote-workers.html" >Remote agent workers</a><a href="code-hosts.html" >GitLab and Bitbucket code workflows</a><a href="external-sources.html" >Read-only external sources</a><a href="automations.html" >Automations and away mode</a><a href="notifications.html" >Outbound notifications</a></section><section><h2>Operate safely</h2><a href="security.html" >Security, subscriptions and caveats</a><a href="filesystem-policy.html" >Project filesystem policy</a><a href="agent-containers.html" >Agent containers</a><a href="filtered-tasks.html" >Filtered Docker tasks</a><a href="dependency-discovery.html" >Dependency discovery</a><a href="maintenance.html" >Backup and maintenance</a></section><section><h2>Build and extend</h2><a href="architecture.html" >Architecture and development</a><a href="api.html" >Local API and command-line client</a><a href="extensions.html" >Provider and workflow extensions</a><a href="provider-compatibility.html" >Provider compatibility</a><a href="accessibility.html" >Accessibility acceptance</a><a href="performance.html" >Performance</a><a href="run-storage.html" >Run storage</a><a href="documentation.html" >Documentation and GitHub Pages</a><a href="releasing.html" >Preparing a preview release</a><a href="vscode.html" >Code Flow for VS Code</a></section><section><h2>Engineering records</h2><a href="application-improvements.html" >Application improvement program</a><a href="project-first-navigation-plan.html" >Project navigation review and implementation plan</a><a href="dynamic-teams-evaluation.html" >Dynamic teams: implementation evidence and rollout decision</a><a href="dynamic-teams-implementation-plan.html" >Dynamic teams, workflows, messaging, and memory</a><a href="dynamic-teams-implementation-review-1.html" >Review 1: the dynamic teams implementation</a><a href="worker-permission-verification.html" >Live worker permission verification</a><a href="dynamic-teams-plan-review-0.html" >Review 0: Dynamic teams implementation plan</a><a href="project-teams-implementation-plan.html" >Standing project teams implementation plan</a><a href="performance-results.html" >Measured performance: 19 October 2026</a></section><a class="app-link" id="back-app" hidden href="/">← Back to app</a></nav>
6
+ <main id="content" tabindex="-1"><div class="breadcrumb">Documentation <span>/</span> Get started</div><article><h1 id="team-patterns">Team patterns</h1>
7
+ <p>Start in Auto to let the coordinator build and adapt a plan. Solo is directly accessible for one agent. Open Advanced to choose reusable built-in workflows such as Plan → Build → Review, a loop, council, or debate, or to design and save a versioned template. Fixed workflows retain the execution and verification behavior described below.</p>
8
+ <h2 id="team-patterns-1">Team patterns</h2>
9
+ <div class="table-scroll" tabindex="0"><table>
10
+ <thead>
11
+ <tr>
12
+ <th>Pattern</th>
13
+ <th>Roles</th>
14
+ <th>Flow</th>
15
+ <th>Reach for it when</th>
16
+ </tr>
17
+ </thead>
18
+ <tbody><tr>
19
+ <td><strong>Auto team</strong></td>
20
+ <td>coordinator, generated workers, independent reviewer</td>
21
+ <td>Propose and approve a team → ready-task scheduling → addressed questions and bounded revisions → integrate, check, review and repair</td>
22
+ <td>You want code-flow to choose the team and workflow; see <a href="auto-team.html">Auto team</a> for communication, memories, budgets and recovery</td>
23
+ </tr>
24
+ <tr>
25
+ <td><strong>Plan → Build → Review</strong></td>
26
+ <td>planner, builder, reviewer</td>
27
+ <td>Plan (read-only) → implement → <strong>check</strong> (the builder fixes it first if it fails) → independent review against the task, with the plan as context → code-flow runs the reviewer&#39;s tests → the builder fixes what blocks → re-check and re-review, up to <em>N</em> rounds</td>
28
+ <td>Most features and bug fixes. Cross-vendor review catches what a model misses in its own work</td>
29
+ </tr>
30
+ <tr>
31
+ <td><strong>Loop until green</strong></td>
32
+ <td>workers (1+, in hand-off order)</td>
33
+ <td>Baseline check → the agent works → code-flow runs the check → the failure goes back to the agent → repeat until it passes. A round that makes more tests fail is undone. After <em>K</em> rounds without progress, the next vendor takes over with a handover note</td>
34
+ <td>&quot;Done&quot; is a command: failing tests, type errors, a broken build. Needs a check</td>
35
+ </tr>
36
+ <tr>
37
+ <td><strong>Best-of-N race</strong></td>
38
+ <td>contestants (2+), judge</td>
39
+ <td>All contestants solve the task in parallel, each in its own worktree → judge compares <strong>anonymized</strong> diffs (Candidate A/B…) and picks one</td>
40
+ <td>The solution space is wide, or the task is risky enough to want several independent attempts</td>
41
+ </tr>
42
+ <tr>
43
+ <td><strong>Debate → Synthesize → Build</strong></td>
44
+ <td>debaters (2+), synthesizer, builder and reviewer (optional)</td>
45
+ <td>Independent proposals → critique rounds where each debater sees the others&#39; proposals (<strong>anonymized</strong>: Proposal A/B…) and revises → synthesizer merges and records each decision → builder implements → reviewer checks it against the plan → code-flow runs the reviewer&#39;s tests → builder fixes what blocks → re-check and re-review, up to <em>N</em> rounds</td>
46
+ <td>Architecture, API design, big refactors. Leave the builder empty for design only</td>
47
+ </tr>
48
+ <tr>
49
+ <td><strong>Supervisor → Workers</strong></td>
50
+ <td>supervisor, workers (1+)</td>
51
+ <td>Supervisor splits the task into parallel subtasks and assigns workers → workers build on separate branches → branches merge into an integration branch; the supervisor resolves conflicts, a reviewer reviews, and the supervisor fixes what blocks</td>
52
+ <td>Larger tasks that split cleanly (backend / frontend / tests)</td>
53
+ </tr>
54
+ <tr>
55
+ <td><strong>Test-first (adversarial tester)</strong></td>
56
+ <td>tester, builder</td>
57
+ <td>Tester writes failing tests → builder makes them pass without editing them or how they run (code-flow undoes it if it does) → tester runs them, adds edge-case tests, and sends failures back</td>
58
+ <td>Behavior you can specify with tests. Stops an agent from grading its own homework</td>
59
+ </tr>
60
+ <tr>
61
+ <td><strong>Review council</strong></td>
62
+ <td>reviewers (1+), chair</td>
63
+ <td>Reviewers review the PR&#39;s or branch&#39;s changes independently, read-only → code-flow runs the tests they show bugs with → the chair merges the findings without knowing who wrote what. Findings rank by severity, then confirmed before the rest, then by how many reviewers raised them</td>
64
+ <td>Reviewing a PR before merging. Nothing is changed or posted without you</td>
65
+ </tr>
66
+ <tr>
67
+ <td><strong>Single agent</strong></td>
68
+ <td>agent</td>
69
+ <td>One agent works on the task in its own worktree → code-flow commits and runs the check if you set one → you reply, and each reply continues the same session on the same branch</td>
70
+ <td>Quick changes, questions and exploring, where a team is more than the task needs. Start a team from its result when you want a second opinion</td>
71
+ </tr>
72
+ </tbody></table>
73
+ </div><p>Every pattern works with any mix of agents. A good default is to have a <strong>different vendor review or judge</strong> than the one that wrote the code.</p>
74
+ <p><strong>Auto</strong> in a role picks an installed agent when the run starts. It skips plans that are at 90% or more of a usage window or recently hit a limit, until the limit resets (Claude reports its windows; the others report only when they&#39;re limited), and for 15 minutes a CLI that turned out not to be signed in. Once agents have a few finished runs in a repo, it prefers the one whose code passed the check most often there. The pick and the reason are written to the run&#39;s activity log. Quota is saved, so a restart remembers which plans are out.</p>
75
+ <p>Verdicts, judge picks, subtask lists and test specs are <strong>schema-constrained</strong>: <code>claude --json-schema</code>, <code>codex --output-schema</code> and <code>agy --json-schema</code>. An answer that still doesn&#39;t fit gets one retry in the same session, and then the run <strong>fails</strong>: an unreadable review is never treated as approval.</p>
76
+ <p>Judging in a race is blind: no author summaries, a shuffled order (seeded per run, so a resumed run replays identically), and an optional <strong>panel</strong> of judges that vote. Pick vendors that aren&#39;t competing; the UI suggests one, and the log warns when a judge also competes.</p>
77
+ <p>The same goes for the other roles that weigh someone else&#39;s work. Unless you pick one yourself, the composer fills each with a vendor that didn&#39;t do that work, and the log warns when a run has one agent doing both:</p>
78
+ <ul>
79
+ <li>Plan → Build → Review: the reviewer is a vendor other than the planner&#39;s (and the builder&#39;s, when a third is installed). A reviewer that shares the planner&#39;s view lets a wrong plan through, so it&#39;s told to judge the change against the task, with the plan only as context.</li>
80
+ <li>Debate: the synthesizer is a vendor that isn&#39;t debating. Debaters and the synthesizer see the proposals as <em>Proposal A/B…</em>, never by vendor, so nobody sides with its own by name.</li>
81
+ <li>Supervisor: the reviewer is a vendor other than the supervisor&#39;s (see <em>Independent review</em> below).</li>
82
+ </ul>
83
+ <p>For the same reason, reviewers are anonymous to a review council&#39;s chair (<em>Reviewer A/B…</em>).</p>
84
+ <h2 id="checks-loops-and-limits">Checks, loops and limits</h2>
85
+ <p>code-flow treats each pattern as a loop, and what it engineers is the loop around the agents:</p>
86
+ <ul>
87
+ <li><p><strong>Done when:</strong> a check command such as <code>npm test</code>, <code>pytest</code> or <code>cargo test</code>. It&#39;s auto-detected from the repo and editable per repo.</p>
88
+ <ul>
89
+ <li>Python projects locked with uv or Poetry get their own environment, since system Python doesn&#39;t have their packages: with <code>uv.lock</code>, setup <code>uv sync</code> (<code>uv sync --all-packages</code> in a uv workspace) and check <code>uv run --no-sync pytest -q</code>; with <code>poetry.lock</code>, setup <code>poetry install</code> and check <code>poetry run pytest -q</code>. When the pytest config lives only in <code>tests/</code> (a workspace member of its own), the check runs from there. The composer says what it detected from.</li>
90
+ <li><strong>code-flow runs it itself</strong> after each change, in that worktree, and feeds the failing output back to the agent.</li>
91
+ <li>Loops end on that evidence, not on an agent saying it&#39;s done. Every check shows in the run&#39;s steps with its output.</li>
92
+ <li>Pipeline: reviewers only see code that passes.</li>
93
+ <li>Race: a candidate that fails can&#39;t win if another one passes.</li>
94
+ <li>Supervisor and Debate: the integrated or built result is checked, and the agent fixes failures.</li>
95
+ <li>Test-first: the new tests must fail first, then pass.</li>
96
+ <li>Every pattern: a passing result is proven fail-to-pass (see below).</li>
97
+ <li>When a run finishes but the check still fails, the run is shown as a warning, not a success.</li>
98
+ </ul>
99
+ </li>
100
+ <li><p><strong>A check that can&#39;t run isn&#39;t a failing check.</strong> Some failures say the environment is wrong, not the code: the command isn&#39;t installed (exit 127), Python has neither pytest nor the project&#39;s package, pytest can&#39;t load <code>conftest.py</code> or collects nothing (exit 4 or 5).</p>
101
+ <ul>
102
+ <li>When the run&#39;s first check fails like that, code-flow runs it once more on the base commit, in a throwaway checkout (with your setup). If it fails the same way there, the change isn&#39;t to blame.</li>
103
+ <li>The check is then set aside for the rest of the run: no &quot;Fix failing check&quot; rounds (agents would only rewrite the test setup to get around it), and later checks are skipped.</li>
104
+ <li>The review still runs, and the reviewer is told nothing was tested. The verdict stays unknown instead of failing.</li>
105
+ <li>The log, the result card, the inbox and the phone view say <em>The check can&#39;t run here: &lt;first error line&gt;. Set <code>setup</code> and <code>check</code> in .codeflow/config.json</em>. <em>Loop until green</em> stops before its first round, since no round could pass.</li>
106
+ <li>If the check runs on the base commit, the change broke it, and it&#39;s a failing check like any other.</li>
107
+ </ul>
108
+ </li>
109
+ <li><p><strong>A pass only counts if the tests are still the tests.</strong> After every change, code-flow looks for edits that make a check pass without fixing anything:</p>
110
+ <ul>
111
+ <li>deleted test files, and test files renamed to a name the runner doesn&#39;t pick up (<code>parse.test.ts</code> → <code>parse.ts</code>);</li>
112
+ <li>added <code>.skip</code>, <code>.only</code>, <code>xit</code>, <code>it.skipIf(…)</code>, <code>test.runIf(…)</code>, <code>test.skip.each(…)</code>, <code>test.fails</code>, <code>this.skip()</code>, <code>{ skip: true }</code>, <code>@pytest.mark.skip</code>, <code>pytest.importorskip</code>, <code>t.Skip()</code>…; in Python and JS/TS, not inside a string or comment (a test of a guard against skips may write one into a fixture);</li>
113
+ <li>test files that lost assertions;</li>
114
+ <li>a changed test config or CI workflow, including the runner&#39;s settings in a file shared with the rest of the project: pytest&#39;s <code>[tool.pytest…]</code> tables in <code>pyproject.toml</code>, and the <code>jest</code>, <code>vitest</code>, <code>mocha</code> or <code>ava</code> settings in any <code>package.json</code> (<code>addopts = &quot;--deselect …&quot;</code>, <code>testPathIgnorePatterns</code>…). The rest of those files (dependencies, other tools&#39; settings) isn&#39;t flagged;</li>
115
+ <li>a changed <code>scripts.test</code> (or whichever script the check runs);</li>
116
+ <li>fewer tests running than before, read from the runner&#39;s summary. Each result branch keeps the counts of its check (the first and the latest, and at which commit), so a follow-up after the run compares with how many ran before its change.</li>
117
+ </ul>
118
+ <p>If git can&#39;t show the change, that is reported too (<em>couldn&#39;t verify test integrity</em>), as a serious issue: not being able to look isn&#39;t the same as finding nothing.</p>
119
+ <p>What happens next depends on the pattern:</p>
120
+ <ul>
121
+ <li>Loop until green: a pass that relies on such changes doesn&#39;t end the loop. The agent is told to undo them and fix the code. If it keeps them (the task may need it), or the rounds run out before it can answer, the result stays but is flagged, and the pass doesn&#39;t count: the run gets no verdict (as when the check can&#39;t run), its summary says <em>The check passes only with changes to the tests</em> and lists them, and no worker is credited with getting it green, so it doesn&#39;t feed Auto&#39;s picks. When the runner&#39;s summary doesn&#39;t say how many tests ran, removed assertions count as such a change too, since a drop in tests can&#39;t be seen.</li>
122
+ <li>Pipeline, Supervisor and Debate: the changes go to the reviewer, who raises each as an issue (so it blocks approval) unless the task needs them.</li>
123
+ <li>Race: a candidate that passes only that way can&#39;t beat one that passes honestly.</li>
124
+ <li>Test-first: the builder&#39;s edits to the tests are undone, and so are the tester&#39;s edits outside them. Only test files count as the tests (plus any the tester names): a stub module the tester adds for its tests to import is the builder&#39;s to fill in. The builder&#39;s changes to the test runner&#39;s own config are undone too, a new <code>conftest.py</code> or <code>vitest.config.*</code> included. What can&#39;t be put back file by file (the runner&#39;s settings in <code>package.json</code> or <code>pyproject.toml</code>, the check&#39;s script, a skip in an existing test, fewer tests running) goes back to the builder to undo, and the tests aren&#39;t probed or counted as passing until it has; if it never does, the run gets no verdict. Other changes the tests read (<code>vite.config.*</code>, a CI workflow) are passed on to the tester to look at.</li>
125
+ <li>PR follow-through: nobody reviews these fixes before they&#39;re pushed, so one that touches the tests at all isn&#39;t pushed: any of the changes above, not only the serious ones (a changed CI workflow or test config, a skip or an assertion fewer). The watch hands it to you instead.</li>
126
+ </ul>
127
+ <p>Every flagged result shows <strong>⚠ Changes to tests to check before merging</strong>.</p>
128
+ </li>
129
+ <li><p><strong>A pass should prove the change (fail-to-pass).</strong> A check that passes with the change might pass without it too, and then it shows nothing about the change. So once a result&#39;s check passes, code-flow proves it:</p>
130
+ <ul>
131
+ <li>it puts the change&#39;s tests onto the base code, in a checkout of its own (set up once per run): the test files, their fixtures and snapshots, and the runner&#39;s settings (<code>jest.config.*</code>, <code>conftest.py</code>, <code>pytest.ini</code>…). A test file the change deleted is deleted there too. When the change also adds or updates dependencies (<code>package.json</code>, <code>uv.lock</code>, <code>go.mod</code>…), those files come along and setup runs again, so a package only the change adds can&#39;t make the tests fail there as if they needed the change&#39;s code;</li>
132
+ <li>it runs the check there. <strong>It should fail</strong>: then at least one test needs the change, and the step reads <em>Fails without the change, as it should</em>. A test that imports code only the change adds fails there too, but only because it can&#39;t load (an import, collection or build error), which shows the code is there, not that it works: when that is the only way it fails, the result is a <strong>weak proof</strong>. A test that fails on what it checks (an assertion, an expected value) is full proof, also when another can&#39;t load;</li>
133
+ <li>if it passes there as well, the result is <strong>not proven</strong>: no test fails without the change. A run that never reached the tests (no test runner, nothing collected, setup failed, a timeout) proves nothing either way and says so.</li>
134
+ </ul>
135
+ <p>When a fix makes a failing check pass, the tests that failed before are the proof, and no new test is needed. When the check already passed before any change (a new feature, say), only a new test can prove it. What happens next depends on the pattern:</p>
136
+ <ul>
137
+ <li>Builders are told up front that their tests will run on the original code (Pipeline, Race, Debate, Supervisor&#39;s workers, Loop until green).</li>
138
+ <li>Loop until green: an unproven pass doesn&#39;t end the loop the first time. The agent is asked for a test that fails without its change, or to say why the task can&#39;t be tested that way (docs, a pure refactor). If it adds none, the pass stands and the result is flagged. When the change touches no tests, the baseline check is the run on the base code, so the proof needs no extra run.</li>
139
+ <li>Pipeline, Debate and Supervisor: before review, the builder (the supervisor, in Supervisor) is asked once for such a test. If the check then fails and the fix attempts don&#39;t help, code-flow undoes the new test, so asking for a proof never costs a green result. The reviewer sees the proof either way, and is told to ask for a test when it&#39;s missing.</li>
140
+ <li>Race: each passing candidate is proven, and the judge sees which ones are, still blind. It&#39;s evidence for the judge, not a rule: an unproven candidate can win.</li>
141
+ <li>Test-first: the tester&#39;s tests must fail before anything is implemented. If they pass, the tester is asked once to make them fail for the missing behaviour.</li>
142
+ <li>Review council: with a check, code-flow runs it on the PR&#39;s changes and proves them against the code the PR started from, and every reviewer sees both. The proof goes into the review you can post.</li>
143
+ <li>Single agent: the result is proven and the proof reported; nobody is asked for a test.</li>
144
+ </ul>
145
+ <p>Each result shows <strong>✓ Proven: a test fails without this change</strong> (with how it fails), <strong>⚠ Weak proof</strong> (the tests fail without it only because they can&#39;t load), or <strong>⚠ Not proven</strong>. Reviewers and judges are told which. Insights counts proven results per pattern, out of all the proven, weak and unproven ones. A proof costs one more run of the check (plus setup once per run). Turn it off for a repo with <code>&quot;prove&quot;: false</code> in <code>.codeflow/config.json</code>.</p>
146
+ </li>
147
+ <li><p><strong>Review findings are checked, and only what blocks holds approval back.</strong> A reviewer&#39;s word is an opinion: a false positive costs a fix round, and the builder can&#39;t answer it. So in Pipeline, Debate, Supervisor and the Review council, a reviewer rates each issue high, medium or low, and shows a bug with a <em>repro</em>: a test file (its path and whole contents) that fails on the result because of the bug, a plain test-runner command that runs it, or both. A command alone can run tests that are already there.</p>
148
+ <ul>
149
+ <li>code-flow writes the test into a checkout of the result&#39;s current commit, apart from the builder&#39;s worktree, and runs it with the reviewer&#39;s command, or else the run&#39;s check. That checkout is set up once per run, and again only when a file that says which dependencies to install changes (<code>package.json</code>, <code>uv.lock</code>, <code>go.mod</code>…). It&#39;s the reverse of a fail-to-pass proof: there the tests should fail without the change; here the reviewer&#39;s test should fail with it.</li>
150
+ <li>The step reads <em>Fails: the problem is there</em> or <em>Passes: a false alarm</em>. A finding is <strong>confirmed</strong> (its test fails), <strong>not confirmed</strong> (it passes: a false alarm), or <strong>unconfirmed</strong> (no test came with it). Sometimes code-flow can&#39;t tell: the test runner didn&#39;t start, it timed out, the check already fails on that code without the test, or the test never ran: as many tests ran with it as without (with the reviewer&#39;s own command, code-flow counts once more without the test, unless the command names it), no test ran at all, or the runner doesn&#39;t say how many ran and nothing in its output mentions the test.</li>
151
+ <li>Only a plain invocation of a known test runner runs, and only a file named like a test goes in, so a repro can&#39;t replace the code it&#39;s about. The test is never written through a symbolic link in the code under review, so a PR&#39;s tracked link can&#39;t send it outside the checkout. At most 6 run per review; low issues aren&#39;t run.</li>
152
+ <li><strong>Approval goes by the findings, not the verdict word.</strong> High and medium issues block; low ones are suggestions. A false alarm never blocks. A high-severity issue claims a bug, so it blocks only when its test fails, or when code-flow couldn&#39;t run the test it came with. Without a test it&#39;s marked unconfirmed and doesn&#39;t block; reviewers are told to rate a problem no test can show medium. So a reviewer that approves with a confirmed bug doesn&#39;t approve, and one that requests changes over false alarms and suggestions does.</li>
153
+ <li>Findings that block go back to the builder (the supervisor, in Supervisor). Confirmed ones come with the reviewer&#39;s test and how it fails: the builder makes it pass and adds it (or one like it) to the change. The ones no test shows it fixes, or disputes with evidence (a test it ran, the code that handles it) instead of changing code. False alarms and suggestions are listed as needing no change. In the next review the reviewer sees the builder&#39;s answer, and keeps a disputed bug only with a repro that fails.</li>
154
+ <li>Each run of a reviewer&#39;s test is journaled, so a resumed run replays it instead of running it again, and the same test on the same commit runs once.</li>
155
+ <li>Review council: each reviewer&#39;s tests run before the chair merges the reviews, and the chair sees what each one showed and keeps a finding&#39;s repro. Findings rank by severity, then confirmed before the rest (false alarms last), then by how many reviewers raised them. The council&#39;s verdict goes by the findings too: it requests changes when a finding blocks, and approves when none does, whatever the chair said. Nor can the chair drop a finding a test confirms, or rate it lower: code-flow puts it back as its reviewer raised it, marked <em>Restored by code-flow</em> in the review, and the log says so. The review you can post says how each finding was checked.</li>
156
+ </ul>
157
+ <p>The result shows the latest review&#39;s findings, each marked <strong>✓ Confirmed</strong> (with how it fails, and the test), <strong>✗ Not confirmed</strong> (a false alarm), <strong>⚠ Unconfirmed</strong> or <em>couldn&#39;t run</em>, and which block. The summary counts unconfirmed high-severity claims and false alarms.</p>
158
+ </li>
159
+ <li><p><strong>Independent review:</strong> Supervisor has a <em>Reviewer</em> role (the composer picks a different vendor than the supervisor) that checks the integrated result instead of the supervisor checking its own work. The supervisor also writes the <em>contracts</em> (interfaces, names, data shapes) that every worker gets. If you skip the reviewer, the supervisor reviews its own integration and fixes what it finds, but nobody reviews those fixes; the result says &quot;fixed by the supervisor, not re-reviewed&quot;. Debate can have a reviewer check the build against the agreed plan; after the builder addresses its review, the check runs and the reviewer looks again, up to <em>Max review rounds</em>.</p>
160
+ </li>
161
+ <li><p><strong>Missing parts are reported:</strong> in Supervisor, a worker that finishes without changing anything is listed as <em>no changes</em> with the first line of its answer, not as done. Its branch isn&#39;t merged, the supervisor and reviewer are told which parts are missing, and Insights counts it as a failed step. If the supervisor splits the task into more subtasks than <em>Max subtasks</em>, the extra ones are added to the last subtask (the log says so) rather than dropped.</p>
162
+ </li>
163
+ <li><p><strong>Parallel work stops together:</strong> in Race, Supervisor and Debate, an agent&#39;s failed turn is part of the result (a failed candidate, a missing part), but when anything else fails in one branch (its worktree, setup, a commit or a check), the other branches are stopped too. The run ends once every branch has, so no agent keeps running after it, and Stop and the slots stay accurate.</p>
164
+ </li>
165
+ <li><p><strong>What agents see:</strong> long diffs keep whole source files first, put lockfiles and generated files last, and list any file that didn&#39;t fit with the command to read it. A long check log keeps the lines around each failure plus the runner&#39;s summary, not just the tail. Agents also get the repo&#39;s own conventions files (<code>AGENTS.md</code>, <code>CLAUDE.md</code>, <code>GEMINI.md</code>, …), since each CLI otherwise reads only its own. They&#39;re also told about problems reviewers raised in more than one earlier run in that repo (turn this off with <code>&quot;learn&quot;: false</code>).</p>
166
+ </li>
167
+ <li><p><strong>No progress means hand off:</strong> in <em>Loop until green</em>, a round counts as progress when it commits a change that leaves fewer tests failing, read from the runner&#39;s summary. A different failure with as many failing tests, or more, isn&#39;t progress. When the runner doesn&#39;t say how many fail, or no test fails and the check still does (a lint step after the tests, say), any different failure counts as progress. A round with no new commit, or the same failure as before, is stuck. After <em>K</em> stuck rounds, the next vendor takes over.</p>
168
+ </li>
169
+ <li><p><strong>A round that makes it worse is undone:</strong> <em>Loop until green</em> keeps the state closest to passing so far, by the runner&#39;s count: the fewest failing tests, and a pass before a failing check with none failing (at first, the code before any change). A round that ends further from passing is undone: more tests failing, a check that fails where it passed, or no test results where there were some. code-flow puts the files back to that state in a commit of its own, runs the check again, and tells the agent why. So the branch never ends worse than the best state the loop reached, and a run that ends failing says how many tests still fail. The rounds stay in the branch&#39;s history. Without a count from the runner, nothing is undone.</p>
170
+ </li>
171
+ <li><p><strong>Limits:</strong> every run stops at a maximum number of minutes or agent steps (60 and 40 by default). The clock doesn&#39;t run while the run waits for you (a checkpoint), or only waits for a free slot (see <em>One machine, many runs</em>). A limit that isn&#39;t a positive number is ignored (the default applies). A stopped run keeps its work: each worktree with changes is listed as &quot;Work so far&quot;.</p>
172
+ </li>
173
+ <li><p><strong>Plan usage:</strong> if a CLI says its plan is out of usage, the run stops instead of failing, so you can resume it once the plan resets. That goes for a race contestant or a Supervisor worker too: nothing is judged or merged without it. Auto skips that plan until the reset time the CLI gave (or the reset times it reported before). A CLI that isn&#39;t signed in fails the step with a message saying so, and Auto skips it for a while. A contestant or worker whose CLI isn&#39;t signed in, or stalled, fails its step without that failure being recorded as its result: a resume gives it its turn again.</p>
174
+ </li>
175
+ <li><p><strong>Retries:</strong> a turn that fails for a passing reason (overloaded, rate-limited, a network error, a CLI that stalled) is retried after 20 s, then 60 s, with its agent slot free meanwhile. A write turn picks up where it stopped: it continues its own session, or, without one, starts over from the worktree as the step found it, so a retry never redoes the work on top of half of it. Whether a failure is passing comes from the CLI&#39;s own error type; for a CLI that gives none, from its message (an HTTP status counts only with words around it, such as &quot;status 503&quot;, not a bare 500 in a test log).</p>
176
+ </li>
177
+ <li><p><strong>One machine, many runs:</strong> at most 6 agent CLIs and 3 checks run at once across all runs (<code>CODEFLOW_MAX_AGENTS</code>, <code>CODEFLOW_MAX_CHECKS</code>). Others wait their turn, and the step says so. The wait doesn&#39;t count against the run&#39;s time limit (a sweep&#39;s runs queued behind each other don&#39;t run out of time before they start), unless another of its steps runs meanwhile.</p>
178
+ </li>
179
+ <li><p><strong>Stopping really stops:</strong> each agent CLI and each check runs in its own process group. Cancelling, a time limit or the CLI exiting stops everything it started, such as a dev server it left in the background, and escalates to SIGKILL if needed.</p>
180
+ </li>
181
+ <li><p><strong>Setup:</strong> an optional command, such as <code>npm ci</code> or <code>uv sync</code>, that runs once in every new worktree before the agents start. code-flow runs it itself, outside the agents&#39; sandboxes, so dependencies are installed even though Codex has no network in Standard mode. A worktree is marked as set up (in its own git folder, not in its files) once setup finishes; one whose setup never finished, because code-flow stopped during <code>npm ci</code> say, is set up again when a resumed run reuses it.</p>
182
+ </li>
183
+ </ul>
184
+ <p>Agents may suggest their own test command (the tester in Test-first does). code-flow only runs it if it&#39;s a plain invocation of a known test runner, with no shell operators. Otherwise it falls back to your check.</p>
185
+ <blockquote>
186
+ <p><strong>Security:</strong> a check runs the agents&#39; code (tests, scripts) on your machine, outside Codex&#39;s and agy&#39;s sandboxes, as your CI would. Use code-flow on repos and tasks you trust, or run checks in Docker (see <a href="automations.html#isolation">Automations</a>) or code-flow itself inside a container or VM. More in <a href="security.html">Security</a>.</p>
187
+ </blockquote>
188
+ <p>Adding your own pattern: see <a href="architecture.html#adding-a-pattern">Architecture</a>.</p>
189
+ <hr>
190
+ <p><a href="index.html">Documentation library</a> · <a href="getting-started.html">Getting started</a> · <a href="help.html">Ask code-flow</a></p>
191
+ </article><footer><a href="https://github.com/midhunxavier/code-flow/blob/main/docs/patterns.md">Edit this page on GitHub ↗</a><span>code-flow · 0.1.0-preview.1 · <a href="font-license.txt">Font license</a></span></footer><nav class="pagination" aria-label="Adjacent guides"><a href="getting-started.html"><small>← Previous</small>Getting started</a><a href="acp-agents.html"><small>Next →</small>ACP coding agents</a></nav></main>
192
+ <aside class="on-page" aria-label="On this page"><strong>On this page</strong><a class="depth-2" href="#team-patterns-1">Team patterns</a><a class="depth-2" href="#checks-loops-and-limits">Checks, loops and limits</a></aside>
193
+ <aside id="help-panel" hidden aria-labelledby="help-title"><div class="chat-heading"><div><span class="eyebrow">Your AI companion</span><h2 id="help-title">Ask code-flow</h2></div><button id="close-help" aria-label="Close AI companion">✕</button></div><div class="chat-toolbar"><span>Grounded in your docs</span><button id="new-chat">New chat</button></div><div id="help-messages" role="log" aria-label="Help conversation" aria-live="polite"><div id="chat-welcome"><span class="chat-mark" aria-hidden="true">✦</span><h3>What would you like to do?</h3><p>Let’s find your next step. Ask about setup, workflows or something that’s unclear.</p><div class="suggestions"><button type="button" data-question="How do I start my first run?">Start my first run ↗</button><button type="button" data-question="What should I do when a check fails?">Understand a failed check ↗</button></div></div></div><p id="help-status" role="status">Checking your installed CLIs…</p><button id="retry-help" hidden>Retry connection</button><form id="help-form" hidden><label class="sr-only" for="question">Your question</label><textarea id="question" rows="3" maxlength="4000" placeholder="Ask a question…" required></textarea><div class="composer-controls"><label class="sr-only" for="help-agent">Use your CLI</label><select id="help-agent"></select><button type="button" id="stop-help" hidden>Stop</button><button class="primary" id="send-help" aria-label="Send message">Send ↗</button></div><small>Uses your CLI login and quota. Shift + Enter for a new line.</small></form><a id="help-guide" href="help.html">About your local companion →</a></aside></div>
194
+ <dialog id="search-dialog" aria-labelledby="search-title"><div class="dialog-title"><h2 id="search-title">Search documentation</h2><button data-close="search-dialog" aria-label="Close search">✕</button></div><label class="sr-only" for="search">Search all guides</label><input id="search" type="search" placeholder="Search workflows, settings, troubleshooting…" autocomplete="off"><div id="search-results" aria-live="polite"></div></dialog>
195
+ </body></html>