@cohortapp/agent-sdk 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (731) hide show
  1. package/.claude/commands/init-agent.md +104 -0
  2. package/.claude/commands/init-maestro.md +1187 -0
  3. package/.claude/settings.json +161 -0
  4. package/.env.example +216 -0
  5. package/README.md +632 -0
  6. package/agents/browser-operator/agent.md +52 -0
  7. package/agents/calendar-ops/agent.md +50 -0
  8. package/agents/communications/agent.md +96 -0
  9. package/agents/decision-log/agent.md +65 -0
  10. package/agents/desktop-operator/agent.md +59 -0
  11. package/agents/gmail-operator/agent.md +62 -0
  12. package/agents/inbound-dispatcher/agent.md +66 -0
  13. package/agents/inbox-processor/agent.md +39 -0
  14. package/agents/pmo-execution/agent.md +60 -0
  15. package/agents/session-spawner/agent.md +64 -0
  16. package/agents/slack-operator/agent.md +60 -0
  17. package/agents/whatsapp-operator/agent.md +60 -0
  18. package/agents/workflow-automation/agent.md +61 -0
  19. package/archetypes/altitudes/c-suite.yaml +58 -0
  20. package/archetypes/altitudes/founder.yaml +68 -0
  21. package/archetypes/altitudes/senior-manager.yaml +63 -0
  22. package/archetypes/altitudes/svp.yaml +60 -0
  23. package/archetypes/altitudes/vp.yaml +50 -0
  24. package/archetypes/archetype.schema.json +77 -0
  25. package/archetypes/base.yaml +47 -0
  26. package/archetypes/capabilities/commercial-leader.yaml +159 -0
  27. package/archetypes/capabilities/compliance-officer.yaml +159 -0
  28. package/archetypes/capabilities/executive-operator.yaml +169 -0
  29. package/archetypes/capabilities/finance-leader.yaml +162 -0
  30. package/archetypes/capabilities/operations-leader.yaml +154 -0
  31. package/archetypes/capabilities/product-leader.yaml +148 -0
  32. package/archetypes/capabilities/technical-leader.yaml +146 -0
  33. package/archetypes/functions/commercial-leader.yaml +62 -0
  34. package/archetypes/functions/compliance-officer.yaml +64 -0
  35. package/archetypes/functions/executive-operator.yaml +70 -0
  36. package/archetypes/functions/finance-leader.yaml +70 -0
  37. package/archetypes/functions/operations-leader.yaml +62 -0
  38. package/archetypes/functions/product-leader.yaml +61 -0
  39. package/archetypes/functions/technical-leader.yaml +57 -0
  40. package/bin/cohort-mcp.mjs +81 -0
  41. package/bin/maestro.mjs +3516 -0
  42. package/bin/maestro.test.mjs +1015 -0
  43. package/desktop-control/README.md +56 -0
  44. package/desktop-control/app-profiles/gmail.yaml +120 -0
  45. package/desktop-control/app-profiles/slack.yaml +315 -0
  46. package/desktop-control/app-profiles/whatsapp.yaml +107 -0
  47. package/docs/architecture/agent-topology.md +2239 -0
  48. package/docs/architecture/archetype-agent-factory.md +110 -0
  49. package/docs/architecture/collective-memory-and-org-mesh.md +115 -0
  50. package/docs/architecture/continuous-monitoring.md +221 -0
  51. package/docs/architecture/mcp-capability-map.md +585 -0
  52. package/docs/architecture/system-architecture.md +1272 -0
  53. package/docs/company-context/README.md +40 -0
  54. package/docs/guides/agent-persona-setup.md +600 -0
  55. package/docs/guides/agents-observe-setup.md +64 -0
  56. package/docs/guides/billing-console-keys.md +88 -0
  57. package/docs/guides/ccxray-diagnostics.md +65 -0
  58. package/docs/guides/channel-bus.md +127 -0
  59. package/docs/guides/claude-mem-setup.md +79 -0
  60. package/docs/guides/claude-pace-setup.md +56 -0
  61. package/docs/guides/claudraband-sessions.md +98 -0
  62. package/docs/guides/clawteam-swarm.md +116 -0
  63. package/docs/guides/code-review-graph-setup.md +86 -0
  64. package/docs/guides/email-setup.md +431 -0
  65. package/docs/guides/mac-mini.md +119 -0
  66. package/docs/guides/media-generation-setup.md +349 -0
  67. package/docs/guides/model-routing.md +162 -0
  68. package/docs/guides/observability-otel.md +265 -0
  69. package/docs/guides/org-onboarding.md +132 -0
  70. package/docs/guides/outbound-governance-setup.md +437 -0
  71. package/docs/guides/pdf-generation-setup.md +315 -0
  72. package/docs/guides/poller-daemon-setup.md +563 -0
  73. package/docs/guides/rag-context-setup.md +459 -0
  74. package/docs/guides/self-optimization-pattern.md +82 -0
  75. package/docs/guides/setup-wizard.md +178 -0
  76. package/docs/guides/slack-setup.md +350 -0
  77. package/docs/guides/telegram-setup.md +227 -0
  78. package/docs/guides/twilio-subaccounts-setup.md +223 -0
  79. package/docs/guides/verification.md +128 -0
  80. package/docs/guides/voice-mode.md +188 -0
  81. package/docs/guides/voice-sms-setup.md +698 -0
  82. package/docs/guides/webhook-relay-setup.md +349 -0
  83. package/docs/guides/whatsapp-setup.md +288 -0
  84. package/docs/prompts/board-pack-cover-template.md +36 -0
  85. package/docs/prompts/decision-recommendation-template.md +88 -0
  86. package/docs/prompts/followup-message-template.md +141 -0
  87. package/docs/prompts/investor-letter-template.md +52 -0
  88. package/docs/prompts/morning-brief-template.md +82 -0
  89. package/docs/prompts/presentation-template.md +58 -0
  90. package/docs/prompts/weekly-strategic-memo-template.md +104 -0
  91. package/docs/research/hallucinated-tool-output-investigation.md +151 -0
  92. package/docs/runbooks/backup-restore.md +205 -0
  93. package/docs/runbooks/cohort-cutover.md +129 -0
  94. package/docs/runbooks/fleet-operations.md +200 -0
  95. package/docs/runbooks/incident-response.md +226 -0
  96. package/docs/runbooks/mac-mini-bootstrap.md +431 -0
  97. package/docs/runbooks/perpetual-operations.md +509 -0
  98. package/docs/runbooks/recovery-and-failover.md +260 -0
  99. package/framework-features.json +267 -0
  100. package/ingest/README.md +87 -0
  101. package/lib/action-executor.js +689 -0
  102. package/lib/action-executor.test.mjs +871 -0
  103. package/lib/agent-root.mjs +37 -0
  104. package/lib/archetype.mjs +236 -0
  105. package/lib/archetype.test.mjs +132 -0
  106. package/lib/autonomy.mjs +114 -0
  107. package/lib/autonomy.test.mjs +66 -0
  108. package/lib/backlog.mjs +358 -0
  109. package/lib/backlog.test.mjs +266 -0
  110. package/lib/budget-guard.mjs +279 -0
  111. package/lib/budget-guard.test.mjs +291 -0
  112. package/lib/cadence-bus-schedule.test.mjs +194 -0
  113. package/lib/cadence-bus.mjs +1120 -0
  114. package/lib/cadence-bus.test.mjs +720 -0
  115. package/lib/cadences.mjs +205 -0
  116. package/lib/cadences.test.mjs +125 -0
  117. package/lib/capability.mjs +154 -0
  118. package/lib/capability.test.mjs +78 -0
  119. package/lib/channels/base-adapter.mjs +719 -0
  120. package/lib/channels/base-adapter.test.mjs +590 -0
  121. package/lib/channels/channel.mjs +128 -0
  122. package/lib/channels/channels.test.mjs +371 -0
  123. package/lib/channels/contract.mjs +215 -0
  124. package/lib/channels/contract.test.mjs +137 -0
  125. package/lib/channels/conversation-resolver.mjs +95 -0
  126. package/lib/channels/gmail/adapter.mjs +87 -0
  127. package/lib/channels/inbox-item.mjs +255 -0
  128. package/lib/channels/inbox-item.test.mjs +335 -0
  129. package/lib/channels/index.mjs +94 -0
  130. package/lib/channels/orgmail/adapter.mjs +353 -0
  131. package/lib/channels/orgmail/adapter.test.mjs +311 -0
  132. package/lib/channels/pairing.mjs +363 -0
  133. package/lib/channels/pairing.test.mjs +270 -0
  134. package/lib/channels/registry.mjs +164 -0
  135. package/lib/channels/slack/adapter.mjs +317 -0
  136. package/lib/channels/slack-adapter.test.mjs +212 -0
  137. package/lib/channels/sms/adapter.mjs +43 -0
  138. package/lib/channels/telegram/adapter.mjs +432 -0
  139. package/lib/channels/telegram-adapter.test.mjs +306 -0
  140. package/lib/channels/voice/adapter.mjs +301 -0
  141. package/lib/channels/voice/adapter.test.mjs +278 -0
  142. package/lib/channels/whatsapp/adapter-baileys.mjs +587 -0
  143. package/lib/channels/whatsapp/adapter-baileys.test.mjs +359 -0
  144. package/lib/channels/whatsapp/adapter-twilio.mjs +65 -0
  145. package/lib/channels/whatsapp/baileys-typing.test.mjs +154 -0
  146. package/lib/charter.mjs +256 -0
  147. package/lib/charter.test.mjs +89 -0
  148. package/lib/claude-bin.mjs +134 -0
  149. package/lib/claude-bin.test.mjs +75 -0
  150. package/lib/collective/capture.mjs +185 -0
  151. package/lib/collective/capture.test.mjs +121 -0
  152. package/lib/collective/cards.mjs +201 -0
  153. package/lib/collective/cards.test.mjs +114 -0
  154. package/lib/collective/config.mjs +186 -0
  155. package/lib/collective/config.test.mjs +123 -0
  156. package/lib/collective/global-config.mjs +113 -0
  157. package/lib/collective/global-config.test.mjs +75 -0
  158. package/lib/collective/presence.mjs +201 -0
  159. package/lib/collective/presence.test.mjs +95 -0
  160. package/lib/collective/recall.mjs +215 -0
  161. package/lib/collective/recall.test.mjs +116 -0
  162. package/lib/comms/send-gate.mjs +554 -0
  163. package/lib/comms/send-gate.test.mjs +577 -0
  164. package/lib/comms.mjs +67 -0
  165. package/lib/comms.test.mjs +41 -0
  166. package/lib/diagnostics/alerts.mjs +424 -0
  167. package/lib/diagnostics/alerts.test.mjs +318 -0
  168. package/lib/diagnostics/backup-freshness.mjs +188 -0
  169. package/lib/diagnostics/backup-freshness.test.mjs +185 -0
  170. package/lib/diagnostics/counters.mjs +269 -0
  171. package/lib/diagnostics/counters.test.mjs +206 -0
  172. package/lib/diagnostics/events.mjs +188 -0
  173. package/lib/diagnostics/events.test.mjs +290 -0
  174. package/lib/diagnostics/otel.mjs +237 -0
  175. package/lib/diagnostics/otel.test.mjs +196 -0
  176. package/lib/diagnostics/trace.mjs +216 -0
  177. package/lib/diagnostics/trace.test.mjs +251 -0
  178. package/lib/env-compat.mjs +74 -0
  179. package/lib/env-compat.test.mjs +104 -0
  180. package/lib/feature-init.mjs +331 -0
  181. package/lib/fs-atomic.mjs +112 -0
  182. package/lib/fs-atomic.test.mjs +72 -0
  183. package/lib/fs-ownership.mjs +111 -0
  184. package/lib/fs-ownership.test.mjs +158 -0
  185. package/lib/hooks/bus.mjs +347 -0
  186. package/lib/hooks/bus.test.mjs +387 -0
  187. package/lib/index.js +16 -0
  188. package/lib/learning/config.mjs +106 -0
  189. package/lib/learning/config.test.mjs +75 -0
  190. package/lib/learning/counters.mjs +156 -0
  191. package/lib/learning/counters.test.mjs +69 -0
  192. package/lib/learning/curator-consolidate.test.mjs +238 -0
  193. package/lib/learning/curator.mjs +453 -0
  194. package/lib/learning/curator.test.mjs +106 -0
  195. package/lib/learning/log.mjs +40 -0
  196. package/lib/learning/reflect.mjs +534 -0
  197. package/lib/learning/reflect.test.mjs +0 -0
  198. package/lib/learning/session-index.mjs +352 -0
  199. package/lib/learning/session-index.test.mjs +125 -0
  200. package/lib/learning/skill-writer.mjs +474 -0
  201. package/lib/learning/skill-writer.test.mjs +210 -0
  202. package/lib/mcp/server.mjs +328 -0
  203. package/lib/mcp/server.test.mjs +400 -0
  204. package/lib/model-router/auth-profiles.mjs +758 -0
  205. package/lib/model-router/auth-profiles.test.mjs +580 -0
  206. package/lib/model-router/catalog/anthropic.yaml +153 -0
  207. package/lib/model-router/catalog/deepseek.yaml +86 -0
  208. package/lib/model-router/catalog/moonshot.yaml +81 -0
  209. package/lib/model-router/catalog/qwen.yaml +114 -0
  210. package/lib/model-router/catalog.mjs +925 -0
  211. package/lib/model-router/catalog.test.mjs +385 -0
  212. package/lib/model-router/economics.mjs +564 -0
  213. package/lib/model-router/economics.test.mjs +344 -0
  214. package/lib/model-router/failover.mjs +298 -0
  215. package/lib/model-router/failover.test.mjs +439 -0
  216. package/lib/model-router/health.mjs +453 -0
  217. package/lib/model-router/health.test.mjs +338 -0
  218. package/lib/model-router/integration-coverage.test.mjs +829 -0
  219. package/lib/model-router/integration.test.mjs +564 -0
  220. package/lib/model-router/ledger.mjs +402 -0
  221. package/lib/model-router/ledger.test.mjs +382 -0
  222. package/lib/model-router/llm-task.mjs +515 -0
  223. package/lib/model-router/llm-task.test.mjs +392 -0
  224. package/lib/model-router/org-credentials.mjs +260 -0
  225. package/lib/model-router/org-credentials.test.mjs +265 -0
  226. package/lib/model-router/pricing-refresh.mjs +463 -0
  227. package/lib/model-router/pricing-refresh.test.mjs +286 -0
  228. package/lib/model-router/reconcile.mjs +429 -0
  229. package/lib/model-router/reconcile.test.mjs +316 -0
  230. package/lib/model-router/repair.mjs +471 -0
  231. package/lib/model-router/repair.test.mjs +180 -0
  232. package/lib/model-router/resolve.mjs +1206 -0
  233. package/lib/model-router/spawn.mjs +497 -0
  234. package/lib/model-router/spawn.test.mjs +425 -0
  235. package/lib/model-router/taxonomy.mjs +893 -0
  236. package/lib/model-router/taxonomy.test.mjs +410 -0
  237. package/lib/model-router.mjs +677 -0
  238. package/lib/model-router.test.mjs +907 -0
  239. package/lib/org/activity.mjs +211 -0
  240. package/lib/org/activity.test.mjs +134 -0
  241. package/lib/org/approvals.mjs +448 -0
  242. package/lib/org/approvals.test.mjs +216 -0
  243. package/lib/org/awareness.mjs +222 -0
  244. package/lib/org/awareness.test.mjs +159 -0
  245. package/lib/org/board.mjs +229 -0
  246. package/lib/org/board.test.mjs +177 -0
  247. package/lib/org/bootstrap-context.mjs +169 -0
  248. package/lib/org/bootstrap-context.test.mjs +153 -0
  249. package/lib/org/client.mjs +1628 -0
  250. package/lib/org/client.test.mjs +1107 -0
  251. package/lib/org/cohort-client.mjs +67 -0
  252. package/lib/org/cohort-client.test.mjs +126 -0
  253. package/lib/org/cost-sync.mjs +227 -0
  254. package/lib/org/cost-sync.test.mjs +153 -0
  255. package/lib/org/doctor.mjs +212 -0
  256. package/lib/org/doctor.test.mjs +212 -0
  257. package/lib/org/handoff.mjs +293 -0
  258. package/lib/org/handoff.test.mjs +269 -0
  259. package/lib/org/integration-tools.mjs +182 -0
  260. package/lib/org/integration-tools.test.mjs +160 -0
  261. package/lib/org/keys.mjs +131 -0
  262. package/lib/org/keys.test.mjs +92 -0
  263. package/lib/org/knowledge.mjs +463 -0
  264. package/lib/org/knowledge.test.mjs +319 -0
  265. package/lib/org/leases.mjs +335 -0
  266. package/lib/org/leases.test.mjs +235 -0
  267. package/lib/org/mesh-integration.test.mjs +127 -0
  268. package/lib/org/mesh.mjs +459 -0
  269. package/lib/org/mesh.test.mjs +345 -0
  270. package/lib/org/messaging.mjs +503 -0
  271. package/lib/org/messaging.test.mjs +238 -0
  272. package/lib/org/policy.mjs +345 -0
  273. package/lib/org/policy.test.mjs +237 -0
  274. package/lib/org/protocol.checksum +1 -0
  275. package/lib/org/protocol.checksum.test.mjs +90 -0
  276. package/lib/org/protocol.mjs +967 -0
  277. package/lib/org/protocol.test.mjs +264 -0
  278. package/lib/org/registry.mjs +194 -0
  279. package/lib/org/registry.test.mjs +100 -0
  280. package/lib/org/tool-surface-integration.test.mjs +120 -0
  281. package/lib/org/tool-surface.mjs +2535 -0
  282. package/lib/org/tool-surface.test.mjs +589 -0
  283. package/lib/org/ui-parity.mjs +3236 -0
  284. package/lib/org/ui-parity.test.mjs +348 -0
  285. package/lib/org/verify.mjs +176 -0
  286. package/lib/org/verify.test.mjs +194 -0
  287. package/lib/rag/embed.mjs +188 -0
  288. package/lib/rag/indexer.mjs +425 -0
  289. package/lib/rag/rag.test.mjs +505 -0
  290. package/lib/rag/search.mjs +475 -0
  291. package/lib/rate-guard.mjs +246 -0
  292. package/lib/rate-guard.test.mjs +201 -0
  293. package/lib/render.mjs +112 -0
  294. package/lib/render.test.mjs +68 -0
  295. package/lib/resource-governor.mjs +297 -0
  296. package/lib/resource-governor.test.mjs +262 -0
  297. package/lib/scheduling/dynamic-jobs.mjs +675 -0
  298. package/lib/scheduling/dynamic-jobs.test.mjs +344 -0
  299. package/lib/scheduling/jitter.mjs +0 -0
  300. package/lib/scheduling/jitter.test.mjs +140 -0
  301. package/lib/secrets/broker.mjs +315 -0
  302. package/lib/secrets/broker.test.mjs +280 -0
  303. package/lib/secrets/providers.mjs +461 -0
  304. package/lib/secrets/providers.test.mjs +274 -0
  305. package/lib/security/audit-engine.mjs +684 -0
  306. package/lib/security/audit-engine.test.mjs +389 -0
  307. package/lib/security/coerce-args.mjs +552 -0
  308. package/lib/security/coerce-args.test.mjs +281 -0
  309. package/lib/security/dangerous-tools.mjs +97 -0
  310. package/lib/security/dangerous-tools.test.mjs +68 -0
  311. package/lib/security/external-content.mjs +145 -0
  312. package/lib/security/external-content.test.mjs +67 -0
  313. package/lib/security/redact.mjs +592 -0
  314. package/lib/security/redact.test.mjs +441 -0
  315. package/lib/security/secret-equal.mjs +73 -0
  316. package/lib/security/secret-equal.test.mjs +55 -0
  317. package/lib/session-permissions.mjs +101 -0
  318. package/lib/session-permissions.test.mjs +100 -0
  319. package/lib/setup/claude-probe.mjs +74 -0
  320. package/lib/setup/completeness.mjs +175 -0
  321. package/lib/setup/completeness.test.mjs +110 -0
  322. package/lib/setup/context-pack.mjs +173 -0
  323. package/lib/setup/context-pack.test.mjs +89 -0
  324. package/lib/setup/enrich.mjs +277 -0
  325. package/lib/setup/enrich.test.mjs +115 -0
  326. package/lib/setup/enroll-from-cohort.mjs +441 -0
  327. package/lib/setup/enroll-from-cohort.test.mjs +233 -0
  328. package/lib/setup/integration.test.mjs +162 -0
  329. package/lib/setup/io.mjs +360 -0
  330. package/lib/setup/io.test.mjs +77 -0
  331. package/lib/setup/run-generator.mjs +81 -0
  332. package/lib/setup/runner.mjs +244 -0
  333. package/lib/setup/runner.test.mjs +132 -0
  334. package/lib/setup/sections/comms.mjs +173 -0
  335. package/lib/setup/sections/company.mjs +120 -0
  336. package/lib/setup/sections/enrich.mjs +138 -0
  337. package/lib/setup/sections/identity.mjs +182 -0
  338. package/lib/setup/sections/identity.test.mjs +140 -0
  339. package/lib/setup/sections/learning.mjs +153 -0
  340. package/lib/setup/sections/learning.test.mjs +81 -0
  341. package/lib/setup/sections/messaging.mjs +219 -0
  342. package/lib/setup/sections/messaging.test.mjs +127 -0
  343. package/lib/setup/sections/model.mjs +102 -0
  344. package/lib/setup/sections/operating-model.mjs +78 -0
  345. package/lib/setup/sections/org.mjs +475 -0
  346. package/lib/setup/sections/org.test.mjs +313 -0
  347. package/lib/setup/sections/orgmail.mjs +173 -0
  348. package/lib/setup/sections/orgmail.test.mjs +118 -0
  349. package/lib/setup/sections/recovery.mjs +159 -0
  350. package/lib/setup/sections/recovery.test.mjs +98 -0
  351. package/lib/setup/sections/tools.mjs +132 -0
  352. package/lib/setup/sections/verify.mjs +97 -0
  353. package/lib/setup/sot.mjs +205 -0
  354. package/lib/setup/sot.test.mjs +81 -0
  355. package/lib/setup/state.mjs +151 -0
  356. package/lib/setup/state.test.mjs +92 -0
  357. package/lib/singleton.js +229 -0
  358. package/lib/singleton.test.mjs +135 -0
  359. package/lib/telemetry/alerts.mjs +216 -0
  360. package/lib/telemetry/alerts.test.mjs +109 -0
  361. package/lib/telemetry/collect.mjs +512 -0
  362. package/lib/telemetry/collect.test.mjs +202 -0
  363. package/lib/tool-definitions-integration.test.mjs +83 -0
  364. package/lib/tool-definitions.js +738 -0
  365. package/lib/tool-definitions.test.mjs +437 -0
  366. package/lib/util/fetch-timeout.mjs +136 -0
  367. package/lib/util/fetch-timeout.test.mjs +202 -0
  368. package/lib/util/reconnect.mjs +343 -0
  369. package/lib/util/reconnect.test.mjs +369 -0
  370. package/lib/util/unhandled.mjs +205 -0
  371. package/lib/util/unhandled.test.mjs +216 -0
  372. package/lib/voice/context-loader.mjs +466 -0
  373. package/lib/voice/index.mjs +100 -0
  374. package/lib/voice/openai-realtime.mjs +510 -0
  375. package/lib/voice/outbound.mjs +542 -0
  376. package/lib/voice/outbound.test.mjs +69 -0
  377. package/lib/voice/post-call-brief.mjs +428 -0
  378. package/lib/voice/provider.mjs +52 -0
  379. package/lib/voice/session-rotation.mjs +257 -0
  380. package/lib/voice/stt.mjs +161 -0
  381. package/lib/voice/stt.test.mjs +226 -0
  382. package/lib/voice/tool-bridge.mjs +370 -0
  383. package/lib/voice/tts.mjs +104 -0
  384. package/lib/voice/twilio-sip-bridge.mjs +288 -0
  385. package/lib/voice/voice.test.mjs +990 -0
  386. package/mcp/README.md +80 -0
  387. package/package.json +151 -0
  388. package/plugins/maestro-skills/plugin.json +139 -0
  389. package/plugins/maestro-skills/skills/agents-observe.md +110 -0
  390. package/plugins/maestro-skills/skills/board-deck.md +68 -0
  391. package/plugins/maestro-skills/skills/books-close.md +77 -0
  392. package/plugins/maestro-skills/skills/brand-steward.md +121 -0
  393. package/plugins/maestro-skills/skills/calendar-plan.md +57 -0
  394. package/plugins/maestro-skills/skills/call-working-sessions.md +124 -0
  395. package/plugins/maestro-skills/skills/ccxray-diagnostics.md +91 -0
  396. package/plugins/maestro-skills/skills/claude-pace.md +61 -0
  397. package/plugins/maestro-skills/skills/code-review-graph.md +99 -0
  398. package/plugins/maestro-skills/skills/crm-pipeline.md +65 -0
  399. package/plugins/maestro-skills/skills/decision-brief.md +89 -0
  400. package/plugins/maestro-skills/skills/directory-hygiene.md +125 -0
  401. package/plugins/maestro-skills/skills/draft-comms.md +84 -0
  402. package/plugins/maestro-skills/skills/evening-wrap.md +53 -0
  403. package/plugins/maestro-skills/skills/files-find.md +65 -0
  404. package/plugins/maestro-skills/skills/generative-ui.md +228 -0
  405. package/plugins/maestro-skills/skills/hiring-triage.md +74 -0
  406. package/plugins/maestro-skills/skills/inbox-triage.md +61 -0
  407. package/plugins/maestro-skills/skills/mail-triage.md +86 -0
  408. package/plugins/maestro-skills/skills/morning-brief.md +54 -0
  409. package/plugins/maestro-skills/skills/native-artifacts.md +157 -0
  410. package/plugins/maestro-skills/skills/org-board.md +133 -0
  411. package/plugins/maestro-skills/skills/org-credential.md +68 -0
  412. package/plugins/maestro-skills/skills/org-recall.md +81 -0
  413. package/plugins/maestro-skills/skills/pipeline-review.md +76 -0
  414. package/plugins/maestro-skills/skills/regulatory-status.md +81 -0
  415. package/plugins/maestro-skills/skills/router-why.md +78 -0
  416. package/plugins/maestro-skills/skills/schedule-meeting.md +91 -0
  417. package/plugins/maestro-skills/skills/session-search.md +71 -0
  418. package/plugins/maestro-skills/skills/set-reminder.md +93 -0
  419. package/plugins/maestro-skills/skills/slack-followup.md +64 -0
  420. package/plugins/maestro-skills/skills/team-activity.md +86 -0
  421. package/plugins/maestro-skills/skills/weekly-memo.md +70 -0
  422. package/policies/action-classification.yaml +114 -0
  423. package/policies/ai-disclosure.yaml +294 -0
  424. package/policies/communication-style.md +139 -0
  425. package/policies/information-barriers.yaml +118 -0
  426. package/policies/prompt-injection-defence.yaml +138 -0
  427. package/public/assets/icon-dark.png +0 -0
  428. package/public/assets/icon-dark.svg +9 -0
  429. package/public/assets/icon-light.svg +9 -0
  430. package/public/assets/logo-dark.svg +15 -0
  431. package/public/assets/logo-light.svg +15 -0
  432. package/scaffold/.mcp.json +7 -0
  433. package/scaffold/CLAUDE.md +368 -0
  434. package/scaffold/config/agent.json +55 -0
  435. package/scaffold/config/agent.ts +76 -0
  436. package/scaffold/config/agent.ts.example +89 -0
  437. package/scaffold/config/alerts.yaml +23 -0
  438. package/scaffold/config/allowlist.yaml.example +25 -0
  439. package/scaffold/config/caller-id-map.yaml +46 -0
  440. package/scaffold/config/collective.yaml +49 -0
  441. package/scaffold/config/company.json +20 -0
  442. package/scaffold/config/known-agents.json +6 -0
  443. package/scaffold/config/learning.yaml +55 -0
  444. package/scaffold/config/model-routing.yaml.example +104 -0
  445. package/scaffold/config/org.yaml +25 -0
  446. package/scaffold/config/orgmail.yaml.example +19 -0
  447. package/scaffold/config/recovery.yaml +72 -0
  448. package/scaffold/config/secrets.yaml +27 -0
  449. package/scaffold/config/slack.yaml.example +35 -0
  450. package/scaffold/config/telegram.yaml.example +38 -0
  451. package/scaffold/config/voice.yaml.example +89 -0
  452. package/scaffold/config/whatsapp.yaml.example +39 -0
  453. package/schedules/README.md +49 -0
  454. package/schedules/triggers/backlog-executor.md +102 -0
  455. package/schedules/triggers/brand-steward.md +72 -0
  456. package/schedules/triggers/daily-evening-wrap.md +159 -0
  457. package/schedules/triggers/daily-midday-sweep.md +58 -0
  458. package/schedules/triggers/daily-morning-brief.md +55 -0
  459. package/schedules/triggers/directory-hygiene.md +81 -0
  460. package/schedules/triggers/dynamic-jobs.md +40 -0
  461. package/schedules/triggers/inbox-processor.md +115 -0
  462. package/schedules/triggers/meeting-action-capture.md +60 -0
  463. package/schedules/triggers/meeting-prep.md +69 -0
  464. package/schedules/triggers/messaging-inbound.md +50 -0
  465. package/schedules/triggers/org-pulse.md +24 -0
  466. package/schedules/triggers/quarterly-self-assessment.md +54 -0
  467. package/schedules/triggers/weekly-engineering-health.md +37 -0
  468. package/schedules/triggers/weekly-execution.md +65 -0
  469. package/schedules/triggers/weekly-hiring.md +53 -0
  470. package/schedules/triggers/weekly-priorities.md +38 -0
  471. package/schedules/triggers/weekly-strategic-memo.md +124 -0
  472. package/scripts/archive-email.sh +55 -0
  473. package/scripts/cadence/cadence-status.mjs +36 -0
  474. package/scripts/cadence/enqueue-cadence-tick.mjs +174 -0
  475. package/scripts/cadence/enqueue-cadence-tick.test.mjs +187 -0
  476. package/scripts/cadence/launchd-cadence-wrapper.sh +85 -0
  477. package/scripts/cadence/launchd-cloud-relay-wrapper.sh +95 -0
  478. package/scripts/cadence/launchd-socket-mode-wrapper.sh +95 -0
  479. package/scripts/ci/check-docs-accuracy.mjs +493 -0
  480. package/scripts/ci/check-docs-accuracy.test.mjs +409 -0
  481. package/scripts/ci/check-exports-exist.mjs +140 -0
  482. package/scripts/ci/check-files-exist.mjs +107 -0
  483. package/scripts/ci/check-no-build-artifacts.mjs +111 -0
  484. package/scripts/ci/check-no-build-artifacts.test.mjs +71 -0
  485. package/scripts/ci/check-no-confidential.mjs +198 -0
  486. package/scripts/ci/check-no-conflict-markers.mjs +169 -0
  487. package/scripts/ci/check-no-residual-identity.mjs +163 -0
  488. package/scripts/ci/check-no-residual-identity.test.mjs +89 -0
  489. package/scripts/ci/check-tarball-fidelity.mjs +205 -0
  490. package/scripts/ci/check-unresolved-tokens.mjs +83 -0
  491. package/scripts/ci/check.mjs +109 -0
  492. package/scripts/ci/check.test.mjs +194 -0
  493. package/scripts/ci/run-coverage.mjs +82 -0
  494. package/scripts/ci/run-tests.mjs +71 -0
  495. package/scripts/cloud-relay/README.md +59 -0
  496. package/scripts/cloud-relay/index.mjs +233 -0
  497. package/scripts/cloud-relay/package.json +15 -0
  498. package/scripts/cloud-relay/railway.json +13 -0
  499. package/scripts/cloud-relay/voice/README.md +94 -0
  500. package/scripts/cloud-relay/voice/package-lock.json +39 -0
  501. package/scripts/cloud-relay/voice/package.json +16 -0
  502. package/scripts/cloud-relay/voice/railway.json +13 -0
  503. package/scripts/cloud-relay/voice/server.mjs +532 -0
  504. package/scripts/collective/hook-runner.mjs +211 -0
  505. package/scripts/collective/hook-runner.test.mjs +90 -0
  506. package/scripts/collective/org-pulse.mjs +72 -0
  507. package/scripts/collective/org-sync.mjs +61 -0
  508. package/scripts/collective/recall.mjs +45 -0
  509. package/scripts/collective/who.mjs +30 -0
  510. package/scripts/comms-monitor.sh +288 -0
  511. package/scripts/configure-whatsapp-sandbox.sh +201 -0
  512. package/scripts/continuous-monitor.sh +91 -0
  513. package/scripts/cost/fleet-digest.mjs +407 -0
  514. package/scripts/cost/fleet-digest.test.mjs +207 -0
  515. package/scripts/cost/track-claude-usage.mjs +169 -0
  516. package/scripts/daemon/agent-daemon.mjs +989 -0
  517. package/scripts/daemon/agent-daemon.test.mjs +525 -0
  518. package/scripts/daemon/cadence-consumer-governance.test.mjs +220 -0
  519. package/scripts/daemon/cadence-consumer.mjs +1080 -0
  520. package/scripts/daemon/cadence-consumer.test.mjs +770 -0
  521. package/scripts/daemon/cadence-handlers.mjs +1121 -0
  522. package/scripts/daemon/cadence-handlers.test.mjs +617 -0
  523. package/scripts/daemon/classifier.mjs +704 -0
  524. package/scripts/daemon/classifier.test.mjs +238 -0
  525. package/scripts/daemon/classify-kind.mjs +54 -0
  526. package/scripts/daemon/classify-kind.test.mjs +40 -0
  527. package/scripts/daemon/context-compiler.mjs +605 -0
  528. package/scripts/daemon/context-compiler.test.mjs +300 -0
  529. package/scripts/daemon/dispatcher-cooldown.test.mjs +122 -0
  530. package/scripts/daemon/dispatcher-governance.test.mjs +886 -0
  531. package/scripts/daemon/dispatcher.mjs +1516 -0
  532. package/scripts/daemon/health.mjs +72 -0
  533. package/scripts/daemon/inbox-deferral.mjs +210 -0
  534. package/scripts/daemon/inbox-deferral.test.mjs +242 -0
  535. package/scripts/daemon/integration.test.mjs +149 -0
  536. package/scripts/daemon/launchd-wrapper-generic.sh +96 -0
  537. package/scripts/daemon/launchd-wrapper-slack-events.sh +37 -0
  538. package/scripts/daemon/launchd-wrapper.sh +91 -0
  539. package/scripts/daemon/lib/session-router.mjs +274 -0
  540. package/scripts/daemon/lib/session-router.test.mjs +295 -0
  541. package/scripts/daemon/maestro-daemon.mjs +275 -0
  542. package/scripts/daemon/prompt-builder.mjs +685 -0
  543. package/scripts/daemon/prompt-builder.test.mjs +213 -0
  544. package/scripts/daemon/responder.mjs +854 -0
  545. package/scripts/daemon/session-lock.mjs +721 -0
  546. package/scripts/daemon/session-lock.test.mjs +252 -0
  547. package/scripts/daemon/session-outcomes.mjs +640 -0
  548. package/scripts/daemon/session-outcomes.test.mjs +533 -0
  549. package/scripts/daemon/typing-registry.mjs +90 -0
  550. package/scripts/daemon/typing-registry.test.mjs +77 -0
  551. package/scripts/daemon/voice-webhook-server.mjs +804 -0
  552. package/scripts/decisions/capture-decision.mjs +116 -0
  553. package/scripts/disclosure_assessment.py +873 -0
  554. package/scripts/disclosure_boundaries.py +562 -0
  555. package/scripts/email-signature-principal.html +52 -0
  556. package/scripts/email-signature.html +60 -0
  557. package/scripts/email_quote_thread.py +167 -0
  558. package/scripts/email_thread_dedup.py +362 -0
  559. package/scripts/emergency-stop.sh +81 -0
  560. package/scripts/healthcheck.sh +116 -0
  561. package/scripts/hooks/block-mcp-cohort-send.sh +15 -0
  562. package/scripts/hooks/block-mcp-slack-send.sh +7 -0
  563. package/scripts/hooks/post-action-log.sh +126 -0
  564. package/scripts/hooks/pre-send-audit.sh +174 -0
  565. package/scripts/hooks/pre-send-audit.test.mjs +215 -0
  566. package/scripts/hooks/session-end-log.sh +27 -0
  567. package/scripts/hooks/session-start-banner.sh +115 -0
  568. package/scripts/huddle/audio-bridge.mjs +664 -0
  569. package/scripts/huddle/boot-slack-cdp.sh +102 -0
  570. package/scripts/huddle/huddle-controller.mjs +942 -0
  571. package/scripts/huddle/huddle-server.mjs +1229 -0
  572. package/scripts/huddle/launch-slack.sh +232 -0
  573. package/scripts/huddle/openai-realtime-bridge.mjs +462 -0
  574. package/scripts/huddle/package-lock.json +62 -0
  575. package/scripts/huddle/package.json +22 -0
  576. package/scripts/huddle/setup-audio.sh +239 -0
  577. package/scripts/huddle/start-call.mjs +318 -0
  578. package/scripts/huddle/test-pipeline.mjs +263 -0
  579. package/scripts/learning/consolidate-skills.mjs +72 -0
  580. package/scripts/learning/session-search.mjs +125 -0
  581. package/scripts/llm_email_dedup.py +442 -0
  582. package/scripts/local-triggers/generate-plists.sh +432 -0
  583. package/scripts/local-triggers/generate-plists.test.mjs +413 -0
  584. package/scripts/local-triggers/install-all.sh +49 -0
  585. package/scripts/local-triggers/plists/.gitkeep +0 -0
  586. package/scripts/local-triggers/run-trigger.sh +63 -0
  587. package/scripts/local-triggers/templates/rag-reindex.plist.template +47 -0
  588. package/scripts/local-triggers/templates/voice-relay-poller.plist.template +54 -0
  589. package/scripts/local-triggers/templates/voice-tunnel.plist.template +55 -0
  590. package/scripts/local-triggers/templates/voice-webhook.plist.template +51 -0
  591. package/scripts/maintenance/backup-to-cloud.sh +124 -0
  592. package/scripts/maintenance/health-check.sh +377 -0
  593. package/scripts/media-generation/README.md +105 -0
  594. package/scripts/media-generation/gemini-image-client.mjs +173 -0
  595. package/scripts/media-generation/generate-assets.mjs +289 -0
  596. package/scripts/media-generation/veo-video-client.mjs +219 -0
  597. package/scripts/org/send-orgmail.mjs +227 -0
  598. package/scripts/outbound-dedup-cleanup.sh +43 -0
  599. package/scripts/outbound-dedup.sh +477 -0
  600. package/scripts/outbound_dedup.py +115 -0
  601. package/scripts/parse-voice-transcript.mjs +481 -0
  602. package/scripts/pdf-generation/README.md +63 -0
  603. package/scripts/pdf-generation/build-document.mjs +247 -0
  604. package/scripts/pdf-generation/templates/board-pack.latex +136 -0
  605. package/scripts/pdf-generation/templates/corporate-letter.latex +126 -0
  606. package/scripts/pdf-generation/templates/memo.latex +114 -0
  607. package/scripts/poll-slack-events.sh +35 -0
  608. package/scripts/poller/calendar-poller.mjs +12 -0
  609. package/scripts/poller/gmail-poller.mjs +192 -0
  610. package/scripts/poller/imap-client.mjs +289 -0
  611. package/scripts/poller/inbox-scan-poller.mjs +156 -0
  612. package/scripts/poller/inbox-scan-poller.test.mjs +231 -0
  613. package/scripts/poller/index.mjs +73 -0
  614. package/scripts/poller/intra-session-check.mjs +285 -0
  615. package/scripts/poller/lib/cloud-relay-dedup.mjs +88 -0
  616. package/scripts/poller/lib/cloud-relay-dedup.test.mjs +133 -0
  617. package/scripts/poller/lib/slash-command-handlers.mjs +177 -0
  618. package/scripts/poller/secondary-gmail-poller.mjs +132 -0
  619. package/scripts/poller/slack-cloud-relay-client.mjs +368 -0
  620. package/scripts/poller/slack-poller.mjs +854 -0
  621. package/scripts/poller/slack-socket-mode.mjs +917 -0
  622. package/scripts/poller/slack-socket-mode.test.mjs +753 -0
  623. package/scripts/poller/trigger.mjs +75 -0
  624. package/scripts/poller/utils.mjs +371 -0
  625. package/scripts/poller/voice-cloud-relay-client.mjs +179 -0
  626. package/scripts/poller/voice-poller.mjs +236 -0
  627. package/scripts/poller-launchd/install.sh +66 -0
  628. package/scripts/poller-launchd/poller.plist.template +40 -0
  629. package/scripts/poller-launchd/whatsapp-handler.plist.template +39 -0
  630. package/scripts/post-interaction-indexer.py +1598 -0
  631. package/scripts/pre-draft-context.py +994 -0
  632. package/scripts/pre_draft_lookup.py +258 -0
  633. package/scripts/rag/build-index.mjs +47 -0
  634. package/scripts/rag/ingest.mjs +111 -0
  635. package/scripts/rag/search.mjs +119 -0
  636. package/scripts/rag-indexer.py +629 -0
  637. package/scripts/restore-from-backup.sh +248 -0
  638. package/scripts/restore-from-backup.test.mjs +178 -0
  639. package/scripts/resume-operations.sh +80 -0
  640. package/scripts/search-secondary-inbox.py +181 -0
  641. package/scripts/secondary-inbox-poller.py +437 -0
  642. package/scripts/self-optimization/compute-metrics.py +398 -0
  643. package/scripts/send-email-as-principal.py +369 -0
  644. package/scripts/send-email-threaded.py +392 -0
  645. package/scripts/send-email-with-attachment.py +377 -0
  646. package/scripts/send-email.sh +131 -0
  647. package/scripts/send-sms.sh +175 -0
  648. package/scripts/send-whatsapp.sh +292 -0
  649. package/scripts/session-start.sh +106 -0
  650. package/scripts/setup/boot-claude-session.sh +94 -0
  651. package/scripts/setup/configure-macos.sh +674 -0
  652. package/scripts/setup/configure-twilio-sip-trunk.mjs +207 -0
  653. package/scripts/setup/configure-voice-tunnel.mjs +182 -0
  654. package/scripts/setup/generate-agent-env.mjs +92 -0
  655. package/scripts/setup/generate-agent-package-json.mjs +222 -0
  656. package/scripts/setup/generate-agent-package-json.test.mjs +143 -0
  657. package/scripts/setup/generate-autonomy.mjs +60 -0
  658. package/scripts/setup/generate-backlog.mjs +101 -0
  659. package/scripts/setup/generate-cadences.mjs +92 -0
  660. package/scripts/setup/generate-capability.mjs +162 -0
  661. package/scripts/setup/generate-charter.mjs +76 -0
  662. package/scripts/setup/generate-comms.mjs +59 -0
  663. package/scripts/setup/generate-company.mjs +92 -0
  664. package/scripts/setup/init-agent.sh +547 -0
  665. package/scripts/setup/init-agent.test.mjs +151 -0
  666. package/scripts/setup/init-archetype.mjs +74 -0
  667. package/scripts/setup/init-backup.mjs +54 -0
  668. package/scripts/setup/init-cadence-bus.mjs +60 -0
  669. package/scripts/setup/init-channel-bus.mjs +46 -0
  670. package/scripts/setup/init-cost-tracking.mjs +45 -0
  671. package/scripts/setup/init-decision-capture.mjs +66 -0
  672. package/scripts/setup/init-known-agents.mjs +57 -0
  673. package/scripts/setup/init-learning.mjs +70 -0
  674. package/scripts/setup/init-memory-executive.mjs +45 -0
  675. package/scripts/setup/init-model-router.mjs +124 -0
  676. package/scripts/setup/init-rag.mjs +174 -0
  677. package/scripts/setup/init-session-router.mjs +38 -0
  678. package/scripts/setup/init-slack-socket-mode.mjs +260 -0
  679. package/scripts/setup/init-telegram.mjs +165 -0
  680. package/scripts/setup/init-voice-realtime.mjs +204 -0
  681. package/scripts/setup/init-whatsapp-baileys.mjs +77 -0
  682. package/scripts/setup/install-dev-tools.sh +150 -0
  683. package/scripts/setup/lib/install-plist.mjs +95 -0
  684. package/scripts/setup/migrate-agent-to-sot.mjs +192 -0
  685. package/scripts/setup/render-environment-yaml.mjs +133 -0
  686. package/scripts/slack-events-ctl.sh +177 -0
  687. package/scripts/slack-events-server.mjs +1045 -0
  688. package/scripts/slack-react.mjs +89 -0
  689. package/scripts/slack-responded.sh +232 -0
  690. package/scripts/slack-send.sh +287 -0
  691. package/scripts/slack-typing.mjs +196 -0
  692. package/scripts/slack-upload-v2.py +95 -0
  693. package/scripts/sms-handler.mjs +450 -0
  694. package/scripts/spawn-session.sh +120 -0
  695. package/scripts/sync-protocol.mjs +217 -0
  696. package/scripts/system-verify.sh +184 -0
  697. package/scripts/test-email-thread-dedup.py +239 -0
  698. package/scripts/test-information-barriers.py +484 -0
  699. package/scripts/test-llm-email-dedup.py +251 -0
  700. package/scripts/test-pre-draft-integration.py +203 -0
  701. package/scripts/test-rag-phase2.sh +442 -0
  702. package/scripts/test-rag-search.sh +251 -0
  703. package/scripts/test-voice-parser.mjs +316 -0
  704. package/scripts/user-context-search.py +659 -0
  705. package/scripts/validate_outbound.py +1504 -0
  706. package/scripts/watchdog/ai.maestro.memory-watchdog.plist +41 -0
  707. package/scripts/watchdog/force-reboot.sh +157 -0
  708. package/scripts/watchdog/memory-watchdog.sh +473 -0
  709. package/scripts/whatsapp-handler.mjs +538 -0
  710. package/teams/desktop-operations.yaml +34 -0
  711. package/teams/executive-office.yaml +27 -0
  712. package/teams/legal-and-regulatory.yaml +24 -0
  713. package/teams/platform-and-engineering.yaml +23 -0
  714. package/teams/strategy-and-growth.yaml +29 -0
  715. package/workflows/continuous/backlog-executor.yaml +141 -0
  716. package/workflows/continuous/inbound-monitor.yaml +168 -0
  717. package/workflows/daily/applicant-triage.yaml +197 -0
  718. package/workflows/daily/comms-triage.yaml +80 -0
  719. package/workflows/daily/evening-wrap.yaml +105 -0
  720. package/workflows/daily/morning-brief.yaml +164 -0
  721. package/workflows/daily/slack-followup-sweep.yaml +87 -0
  722. package/workflows/event-driven/README.md +50 -0
  723. package/workflows/event-driven/agent-failure-investigation.yaml +137 -0
  724. package/workflows/event-driven/pr-review.yaml +107 -0
  725. package/workflows/monthly/board-readiness.yaml +76 -0
  726. package/workflows/quarterly/strategic-scenario-analysis.yaml +85 -0
  727. package/workflows/session-protocol.md +171 -0
  728. package/workflows/weekly/engineering-health.yaml +154 -0
  729. package/workflows/weekly/hiring-review.yaml +169 -0
  730. package/workflows/weekly/rollup-pipeline-review.yaml +76 -0
  731. package/workflows/weekly/strategic-memo.yaml +79 -0
@@ -0,0 +1,119 @@
1
+ # Mac mini bring-up — an always-on Cohort agent, end to end
2
+
3
+ The one-page operator runbook: from a boxed Apple-silicon Mac mini to a fully
4
+ enrolled AI colleague on `os.cohortapp.com` — messaging, board work, and a real
5
+ workspace email address — verified by `cohort doctor`. OS-level hardening and
6
+ fleet mechanics live in the deeper runbook: [Mac Mini Bootstrap](../runbooks/mac-mini-bootstrap.md)
7
+ (this page links it rather than duplicating it).
8
+
9
+ ## 1. Hardware / prereqs
10
+
11
+ - Apple-silicon Mac mini (M-series), macOS 15+.
12
+ - A dedicated admin macOS account for the agent (keep your own account separate).
13
+ - Always-on power settings:
14
+
15
+ ```bash
16
+ sudo pmset -a sleep 0 displaysleep 0 autorestart 1
17
+ ```
18
+
19
+ ## 2. Bootstrap
20
+
21
+ ```bash
22
+ xcode-select --install
23
+ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
24
+ brew install node@20 git python@3.12
25
+ npm i -g @anthropic-ai/claude-code && claude login # Max subscription — the daemon
26
+ # strips API keys so sub-sessions
27
+ # ride keychain OAuth
28
+ npm i -g @cohortapp/agent-sdk
29
+ ```
30
+
31
+ ## 3. Create the agent repo
32
+
33
+ ```bash
34
+ cohort create <agent-name>
35
+ cd <agent-name>
36
+ ```
37
+
38
+ `create` copies the framework (`lib/`, `scripts/`, `.claude/`, `scaffold` configs —
39
+ including `.mcp.json`, which exposes the `cohort-mcp` org tool surface to
40
+ interactive Claude sessions, and the PreToolUse hooks that keep its outbound
41
+ writes on the CLI lane).
42
+
43
+ ## 4. Enroll against `https://os.cohortapp.com`
44
+
45
+ Two lanes — pick one:
46
+
47
+ - **Admin-minted key**: in Cohort → Settings → API keys mint an agent key and
48
+ pair it to the member, then:
49
+
50
+ ```bash
51
+ export COHORT_API_KEY=nlk_… COHORT_ORG_ID=<org-slug> COHORT_AGENT_ID=<member-slug>
52
+ cohort setup
53
+ ```
54
+
55
+ Pull-enrollment populates `config/agent.json` from the member profile and
56
+ writes `config/org.yaml` (`org.cohort.{enabled,base,orgId,token}`).
57
+
58
+ - **Pre-auth pairing**: `cohort pair <code>` → an org admin approves the
59
+ handshake in Cohort (`pairing.request`/`pairing.approve`).
60
+
61
+ ## 5. Wizard
62
+
63
+ `cohort setup` walks the sections in order — the org trio is:
64
+
65
+ | Order | Section | What it does |
66
+ | --- | --- | --- |
67
+ | 75 | `org` | endpoint + token (the enrollment SoT) |
68
+ | 76 | `messaging` | messaging.read/write + calling.write scopes, home channels |
69
+ | 77 | `orgmail` | **workspace mailbox** — writes `config/orgmail.yaml` |
70
+
71
+ For 77 to go live, an admin must have verified a domain and assigned this
72
+ agent a mailbox in Cohort → Settings → Email first (the wizard's verify step
73
+ probes `email.inbox` and WARNS until then — it never blocks setup).
74
+
75
+ ## 6. Always-on (launchd)
76
+
77
+ ```bash
78
+ scripts/setup/init-agent.sh # deps → state dirs → generate-plists.sh → launchctl load
79
+ launchctl list | grep ai.maestro
80
+ ```
81
+
82
+ Expect the daemon plus the cadence triggers; the daemon plist is KeepAlive
83
+ `{SuccessfulExit:false, Crashed:true}` so it restarts on crash but respects a
84
+ clean stop.
85
+
86
+ ## 7. Verify — `cohort doctor` is the gate
87
+
88
+ ```bash
89
+ cohort doctor
90
+ ```
91
+
92
+ All green includes the **Cohort connectivity** block: enrollment resolved →
93
+ directory reachable (latency) → protocol version aligned (the server's
94
+ `x-org-protocol` header; a drift warning means run `cohort upgrade`) → **key
95
+ paired to a workforce member** (the `messaging.channels` gate) → **workspace
96
+ mailbox reachable** (when `config/orgmail.yaml` exists).
97
+
98
+ Then two live probes:
99
+
100
+ 1. **DM the agent in Cohort** — expect a reply (inbound rides the messaging
101
+ plane; watch `state/inbox/` fill and `logs/` narrate).
102
+ 2. **Email the agent's workspace address** — watch `state/inbox/orgmail/`
103
+ populate within ≤45s (the poll tick), and expect a correctly-threaded reply
104
+ dispatched by the hq outbox within ≤2 min (post-commit kick ≈1.5s, loop
105
+ tick ≤60s). First-contact recipients park as approvals in /decisions — by
106
+ design.
107
+
108
+ ## 8. Operations
109
+
110
+ - **Kill switch**: touch `.emergency-stop` in the repo root (human-only). The
111
+ daemon exits clean, so launchd stops the restart treadmill. Resume with
112
+ `scripts/resume-operations.sh`.
113
+ - **Email-only kill switch**: delete/rename `config/orgmail.yaml` and restart —
114
+ the gate-file loop skips the platform; server-side an admin can flip the
115
+ mailbox to Disabled in Settings → Email.
116
+ - **Upgrade**: `cohort upgrade` (framework files), `npm i -g @cohortapp/agent-sdk@latest`
117
+ (the SDK itself). A doctor "protocol drift" warning is the upgrade cue.
118
+ - **Health**: `scripts/healthcheck.sh`; logs under `logs/` (`logs/audit/` carries
119
+ the per-action JSONL rows from BOTH the native executor and the MCP plane).
@@ -0,0 +1,349 @@
1
+ # Media Generation Setup Guide
2
+
3
+ How to generate branded illustrations, diagrams, and video assets using Google Gemini and Veo APIs. Covers API setup, prompt specification authoring, image generation, video generation, brand alignment, and troubleshooting.
4
+
5
+ **Prerequisites**: Complete the [Mac Mini Bootstrap](../runbooks/mac-mini-bootstrap.md). Node.js 20+ must be installed.
6
+
7
+ ---
8
+
9
+ ## Architecture Overview
10
+
11
+ ```
12
+ ┌─────────────────────────────────────────────────────────────────┐
13
+ │ PROMPT SPECS (TypeScript/ESM files) │
14
+ │ │
15
+ │ scripts/media-generation/prompts/ │
16
+ │ ├── illustrations/ *.ts / *.mjs │
17
+ │ ├── diagrams/ *.ts / *.mjs │
18
+ │ └── videos/ *.ts / *.mjs │
19
+ │ │
20
+ │ Each spec exports: { id, slug, title, purpose, style, │
21
+ │ colorPalette, mood, elements, aspectRatio, ... } │
22
+ ├─────────────────────────────────────────────────────────────────┤
23
+ │ GENERATION │
24
+ │ │
25
+ │ generate-assets.mjs │
26
+ │ ├── --illustration <slug> → gemini-image-client.mjs │
27
+ │ │ └── @google/genai SDK → Gemini 3 Pro / Imagen │
28
+ │ │ └── public/generated/illustrations/<slug>.png │
29
+ │ │ │
30
+ │ ├── --video <slug> → veo-video-client.mjs │
31
+ │ │ └── @google/genai SDK → Veo 3.1 │
32
+ │ │ └── public/generated/videos/<slug>.mp4 │
33
+ │ │ │
34
+ │ ├── --all-missing → batch generate all missing illustrations │
35
+ │ └── --all-missing-videos → batch generate all missing videos │
36
+ │ │
37
+ │ Rate limit: 15s between requests │
38
+ │ Generation log: scripts/media-generation/generation-log.json │
39
+ ├─────────────────────────────────────────────────────────────────┤
40
+ │ OUTPUT │
41
+ │ │
42
+ │ public/generated/ │
43
+ │ ├── illustrations/ *.png │
44
+ │ ├── diagrams/ *.png │
45
+ │ └── videos/ *.mp4 │
46
+ └─────────────────────────────────────────────────────────────────┘
47
+ ```
48
+
49
+ ---
50
+
51
+ ## 1. API Setup
52
+
53
+ ### 1.1 Get a Gemini API Key
54
+
55
+ 1. Go to https://aistudio.google.com/apikey
56
+ 2. Create a new API key (or use an existing one)
57
+ 3. The same key works for both image (Gemini/Imagen) and video (Veo) generation
58
+
59
+ ### 1.2 Configure Environment
60
+
61
+ Add to `.env`:
62
+
63
+ ```bash
64
+ GEMINI_API_KEY=your-api-key-here
65
+ ```
66
+
67
+ ### 1.3 Install Dependencies
68
+
69
+ ```bash
70
+ cd ~/agent-repo && npm install
71
+ ```
72
+
73
+ Required packages (in `package.json`):
74
+ - `@google/genai` — Google AI SDK for Gemini and Veo
75
+ - `dotenv` — Environment variable loading
76
+
77
+ ### 1.4 Verify Setup
78
+
79
+ ```bash
80
+ # Quick test — list available prompt specs
81
+ node scripts/media-generation/generate-assets.mjs --list
82
+ ```
83
+
84
+ ---
85
+
86
+ ## 2. Image Generation (Gemini / Imagen)
87
+
88
+ ### 2.1 Generate a Single Illustration
89
+
90
+ ```bash
91
+ node scripts/media-generation/generate-assets.mjs --illustration <slug>
92
+ ```
93
+
94
+ The `<slug>` must match a prompt spec file in `scripts/media-generation/prompts/illustrations/`.
95
+
96
+ ### 2.2 Generate All Missing
97
+
98
+ ```bash
99
+ # Generate illustrations for all specs that don't have output files yet
100
+ node scripts/media-generation/generate-assets.mjs --all-missing
101
+ ```
102
+
103
+ ### 2.3 Models
104
+
105
+ | Model | Quality | Speed | Use Case |
106
+ |---|---|---|---|
107
+ | `gemini-3-pro-image-preview` | Best | Slower | Default — board packs, investor materials |
108
+ | `imagen-*` variants | Good | Fast | High-volume generation, social media |
109
+
110
+ Override via prompt spec or environment:
111
+
112
+ ```bash
113
+ GEMINI_MODEL=imagen-3.0-generate-002 node scripts/media-generation/generate-assets.mjs --illustration <slug>
114
+ ```
115
+
116
+ ### 2.4 Aspect Ratios
117
+
118
+ Supported: `1:1`, `3:4`, `4:3`, `9:16`, `16:9`
119
+
120
+ Set per prompt spec in the `aspectRatio` field.
121
+
122
+ ---
123
+
124
+ ## 3. Video Generation (Veo 3.1)
125
+
126
+ ### 3.1 Generate a Video
127
+
128
+ ```bash
129
+ node scripts/media-generation/generate-assets.mjs --video <slug>
130
+ ```
131
+
132
+ ### 3.2 Generate All Missing Videos
133
+
134
+ ```bash
135
+ node scripts/media-generation/generate-assets.mjs --all-missing-videos
136
+ ```
137
+
138
+ ### 3.3 Configuration
139
+
140
+ | Setting | Default | Options |
141
+ |---|---|---|
142
+ | Model | `veo-3.1-generate-preview` | — |
143
+ | Duration | 8 seconds | 4, 6, 8 |
144
+ | Resolution | 720p | 720p, 1080p, 4k |
145
+ | Modes | text-to-video | text-to-video, image-to-video |
146
+
147
+ ### 3.4 Polling
148
+
149
+ Video generation is asynchronous. The client:
150
+ 1. Submits the generation request
151
+ 2. Polls every 10 seconds for completion
152
+ 3. Times out after 10 minutes
153
+ 4. Downloads the video file on completion
154
+
155
+ ---
156
+
157
+ ## 4. Prompt Specifications
158
+
159
+ ### 4.1 Structure
160
+
161
+ Prompts are TypeScript (`.ts`) or ESM (`.mjs`) files in `scripts/media-generation/prompts/`:
162
+
163
+ ```
164
+ prompts/
165
+ illustrations/ # Board pack covers, section illustrations
166
+ diagrams/ # Architecture diagrams, flow charts
167
+ videos/ # Animated intros, presentation backgrounds
168
+ ```
169
+
170
+ ### 4.2 Writing a Prompt Spec
171
+
172
+ ```typescript
173
+ // scripts/media-generation/prompts/illustrations/board-pack-cover-q2.ts
174
+ export default {
175
+ id: "board-pack-cover-q2-2026",
176
+ slug: "board-pack-cover-q2-2026",
177
+ title: "Q2 2026 Board Pack Cover Illustration",
178
+ purpose: "Cover page visual for quarterly board materials",
179
+ imageCategory: "editorial-hand-drawn",
180
+ colorPalette: ["#1C1917", "#FAFAF9", "#78716C", "#D6D3D1"],
181
+ mood: ["institutional", "sophisticated", "premium"],
182
+ elements: [
183
+ "abstract representation of global financial network",
184
+ "interconnected nodes suggesting multi-jurisdiction structure",
185
+ "subtle reference to algorithmic trading"
186
+ ],
187
+ style: "Monochromatic NYT-style hand-drawn editorial illustration. " +
188
+ "Pen-and-ink technique with cross-hatching and stippling. " +
189
+ "No color, no gradients, no digital effects.",
190
+ aspectRatio: "3:4",
191
+ };
192
+ ```
193
+
194
+ ### 4.3 Key Fields
195
+
196
+ | Field | Required | Description |
197
+ |---|---|---|
198
+ | `id` | Yes | Unique identifier |
199
+ | `slug` | Yes | Filename-safe identifier (used for output filename) |
200
+ | `title` | Yes | Human-readable title |
201
+ | `purpose` | Yes | What this asset is used for |
202
+ | `style` | Yes | Detailed style description for the AI model |
203
+ | `colorPalette` | No | Hex colour values (brand-aligned) |
204
+ | `mood` | No | Tone descriptors |
205
+ | `elements` | No | Visual elements to include |
206
+ | `aspectRatio` | No | Output aspect ratio (default: `16:9`) |
207
+ | `imageCategory` | No | Category tag for organisation |
208
+
209
+ ### 4.4 TypeScript vs ESM
210
+
211
+ - `.ts` files require `tsx` (installed via devDependencies) — the generator shells out to `npx tsx` to evaluate them
212
+ - `.mjs` files are imported directly — slightly faster, no build step
213
+ - Both work identically; use `.ts` for consistency with the rest of the project
214
+
215
+ ---
216
+
217
+ ## 5. Brand Alignment
218
+
219
+ All generated assets must follow `config/brand-assets.yaml`:
220
+
221
+ ### 5.1 Illustration Style
222
+
223
+ - **Monochromatic editorial hand-drawn** (NYT-style)
224
+ - Pen-and-ink technique: cross-hatching, stippling
225
+ - No colour, no gradients, no digital effects
226
+ - Restrained and institutional mood
227
+
228
+ ### 5.2 Colour Palette
229
+
230
+ | Colour | Hex | Usage |
231
+ |---|---|---|
232
+ | Near-black | `#1C1917` | Primary line work |
233
+ | Off-white | `#FAFAF9` | Background/negative space |
234
+ | Warm gray | `#78716C` | Secondary elements |
235
+ | Light gray | `#D6D3D1` | Tertiary/halftone areas |
236
+ | Medium gray | `#A8A29E` | Mid-tones |
237
+
238
+ ### 5.3 What to Avoid
239
+
240
+ - Cartoon or comic styles
241
+ - Isometric SaaS/tech aesthetics
242
+ - Stock photography look
243
+ - Bright colours or saturated palettes
244
+ - Clip art or flat design icons
245
+
246
+ ---
247
+
248
+ ## 6. Output & Logging
249
+
250
+ ### 6.1 Output Directories
251
+
252
+ | Type | Path |
253
+ |---|---|
254
+ | Illustrations | `public/generated/illustrations/<slug>.png` |
255
+ | Diagrams | `public/generated/diagrams/<slug>.png` |
256
+ | Videos | `public/generated/videos/<slug>.mp4` |
257
+
258
+ ### 6.2 Generation Log
259
+
260
+ Every generation is recorded in `scripts/media-generation/generation-log.json`:
261
+
262
+ ```json
263
+ [
264
+ {
265
+ "slug": "board-pack-cover-q2-2026",
266
+ "type": "illustration",
267
+ "model": "gemini-3-pro-image-preview",
268
+ "generatedAt": "2026-04-09T14:30:00.000Z",
269
+ "outputPath": "public/generated/illustrations/board-pack-cover-q2-2026.png"
270
+ }
271
+ ]
272
+ ```
273
+
274
+ ### 6.3 Rate Limiting
275
+
276
+ A 15-second delay is enforced between consecutive API requests to avoid rate limits. For batch generation (`--all-missing`), this means ~4 images per minute.
277
+
278
+ ---
279
+
280
+ ## 7. Testing
281
+
282
+ | # | Test | How to Verify |
283
+ |---|---|---|
284
+ | 1 | API key valid | `node -e "require('dotenv').config(); console.log(process.env.GEMINI_API_KEY?.slice(0,8))"` |
285
+ | 2 | List specs | `node scripts/media-generation/generate-assets.mjs --list` |
286
+ | 3 | Generate image | Generate one illustration and verify output in `public/generated/` |
287
+ | 4 | Generate video | Generate one video (takes several minutes) |
288
+ | 5 | Brand alignment | Verify output matches monochromatic editorial style |
289
+ | 6 | Batch generation | `--all-missing` — should skip already-generated assets |
290
+ | 7 | Generation log | Check `generation-log.json` for entries |
291
+
292
+ ---
293
+
294
+ ## 8. Troubleshooting
295
+
296
+ ### "GEMINI_API_KEY not set"
297
+
298
+ 1. Check `.env` file exists and contains the key
299
+ 2. Verify key format (should be a long alphanumeric string)
300
+ 3. Get a key from https://aistudio.google.com/apikey
301
+
302
+ ### Rate limit errors
303
+
304
+ 1. The 15-second delay should prevent most rate limits
305
+ 2. If hit, wait 60 seconds and retry
306
+ 3. For heavy batch generation, consider running overnight
307
+ 4. Check your API quota at https://aistudio.google.com/
308
+
309
+ ### "Prompt spec not found"
310
+
311
+ 1. Check the slug matches a file in `scripts/media-generation/prompts/illustrations/` (or `diagrams/`, `videos/`)
312
+ 2. File must end in `.ts` or `.mjs`
313
+ 3. List available specs: `node scripts/media-generation/generate-assets.mjs --list`
314
+
315
+ ### Image quality issues
316
+
317
+ 1. Review the `style` field in the prompt spec — be more specific about the desired aesthetic
318
+ 2. Add negative prompts ("no cartoon", "no digital effects")
319
+ 3. Try a different model (Imagen may produce different results than Gemini)
320
+ 4. Adjust aspect ratio to match the intended use
321
+
322
+ ### Video generation timeout
323
+
324
+ 1. Default timeout is 10 minutes — video generation can be slow
325
+ 2. Check the Veo API status if consistently timing out
326
+ 3. Try shorter duration (4s instead of 8s) for faster generation
327
+ 4. Lower resolution (720p) generates faster than 1080p/4k
328
+
329
+ ---
330
+
331
+ ## Key Files
332
+
333
+ | File | Purpose |
334
+ |---|---|
335
+ | `scripts/media-generation/generate-assets.mjs` | Main generation orchestrator |
336
+ | `scripts/media-generation/gemini-image-client.mjs` | Google Gemini/Imagen image API client |
337
+ | `scripts/media-generation/veo-video-client.mjs` | Veo 3.1 video API client |
338
+ | `scripts/media-generation/prompts/` | Prompt spec directory (illustrations, diagrams, videos) |
339
+ | `scripts/media-generation/generation-log.json` | Generation history log |
340
+ | `public/generated/` | Output directory for all generated assets |
341
+ | `config/brand-assets.yaml` | Brand style guide (colours, typography, illustration style) |
342
+
343
+ ---
344
+
345
+ ## Related Documents
346
+
347
+ - [PDF Generation Setup](pdf-generation-setup.md) — Using generated assets in branded PDFs
348
+ - [Agent Persona Setup](agent-persona-setup.md) — Brand configuration
349
+ - [Mac Mini Bootstrap](../runbooks/mac-mini-bootstrap.md) — Node.js and dependency installation
@@ -0,0 +1,162 @@
1
+ # Model routing — Anthropic / Moonshot / Qwen via one config
2
+
3
+ Maestro's daemon historically routed every spawned `claude --print`
4
+ through the Claude CLI's keychain-resident OAuth token (Max
5
+ subscription). That's still the default. **The model router is
6
+ opt-in** — drop a `config/model-routing.yaml` into an agent and the
7
+ daemon will start routing each session to the cheapest backend that
8
+ satisfies the request's declared capability needs.
9
+
10
+ ## Why
11
+
12
+ Two big shifts in 2026:
13
+
14
+ 1. **Moonshot AI** ships a native `/anthropic` Messages endpoint, so
15
+ Kimi K2.6 is a literal drop-in for Claude Code — no router, no
16
+ wire-format translation, no tool-use degradation. K2.6 lands on
17
+ 80.2% SWE-bench Verified (within ~12 points of Sonnet 5) at
18
+ roughly 30% of Sonnet's per-token cost. The Anthropic endpoint
19
+ also supports cache-hit pricing (~$0.16/M cache reads).
20
+ 2. **Qwen3-Coder-Next** (80B / 3B-active MoE) hits ~70% SWE-bench
21
+ Verified and is available everywhere — DashScope direct, OpenRouter,
22
+ DeepInfra, local vLLM/Ollama. At $0.22/M input via OpenRouter it's
23
+ the cheapest credible coding model.
24
+
25
+ For a daemon that runs 100+ sessions/day across inbox, backlog, and
26
+ cadence ticks, routing routine work to Moonshot/Qwen and only escalating
27
+ to Anthropic when an agent actually needs `extended-thinking` or
28
+ `prompt-cache-1h` cuts spend by ~70% with no loss on the work that
29
+ matters.
30
+
31
+ ## Quick start
32
+
33
+ ```bash
34
+ # In the agent repo:
35
+ npx @cohortapp/agent-sdk init # idempotent — places model-routing.yaml.disabled
36
+
37
+ # Add credentials to .env:
38
+ echo "MOONSHOT_API_KEY=msk-..." >> .env
39
+ echo "OPENROUTER_API_KEY=sk-or-..." >> .env
40
+
41
+ # Activate by renaming:
42
+ mv config/model-routing.yaml.disabled config/model-routing.yaml
43
+
44
+ # Restart the daemon — every new spawn now respects the routing policy.
45
+ launchctl unload ~/Library/LaunchAgents/ai.maestro.<agent>-daemon.plist
46
+ launchctl load ~/Library/LaunchAgents/ai.maestro.<agent>-daemon.plist
47
+ ```
48
+
49
+ ## Config reference
50
+
51
+ `config/model-routing.yaml` has three sections:
52
+
53
+ ### `backends:`
54
+ Each backend declares the wire format, base URL, auth env var,
55
+ capabilities, pricing, and concrete model names per tier.
56
+
57
+ | Field | Meaning |
58
+ |-------|---------|
59
+ | `transport` | `anthropic-cli` (no env injection — current default) \| `anthropic-native` (point at any Messages endpoint) \| `openai-compat` (OpenAI-compatible like OpenRouter, DashScope) |
60
+ | `base_url` | HTTPS endpoint base |
61
+ | `auth_env` | Env var holding the auth token (omit for keychain OAuth) |
62
+ | `capabilities` | Tagged-set: `thinking`, `vision`, `tool_use`, `parallel_tools`, `long_context_262k`/`_1m`, `prompt_cache_1h`/`_hit`, `degraded_tool_use` |
63
+ | `pricing` | `input_per_m`, `output_per_m`, optional `cache_hit_per_m` |
64
+ | `models` | `classifier` / `fast` / `default` / `premium` slots |
65
+
66
+ ### `routing_policy:`
67
+ List of rules, top-down. First match wins. A `default: true` rule is
68
+ the terminal fallback.
69
+
70
+ Supported match keys:
71
+ - `agent_role`, `agent_role_in: [...]`
72
+ - `needs_thinking`, `needs_vision`, `needs_tool_use`,
73
+ `needs_parallel_tools`, `needs_long_context`
74
+ - `tier: classifier | fast | default | premium`
75
+ - `model_hint: haiku | sonnet | opus`
76
+ - `token_estimate_gte: 60000` / `token_estimate_lt: …`
77
+ - `source: inbox | backlog | cadence | voice`
78
+ - `priority: critical | high | normal`
79
+
80
+ Each rule can also declare a `fallback: [backend_name, …]` list: if
81
+ the primary backend doesn't satisfy the request's capability needs,
82
+ the resolver tries each fallback in order before failing through to
83
+ the global Anthropic safety net.
84
+
85
+ ### Global flags
86
+ - `fallback_to_anthropic` (default `true`) — final safety net when no
87
+ backend satisfies a request. Set `false` to make the router strict.
88
+ - `strip_attribution_header` (default `true`) — sets
89
+ `CLAUDE_CODE_ATTRIBUTION_HEADER=0` for non-Anthropic backends so a
90
+ third-party gateway's prompt-cache key isn't poisoned.
91
+ - `disable_experimental_betas` (default `true`) — sets
92
+ `CLAUDE_CODE_DISABLE_EXPERIMENTAL_BETAS=1` for non-Anthropic backends
93
+ so `/advisor`, etc. don't silently degrade.
94
+
95
+ ## Recommended policy template
96
+
97
+ ```yaml
98
+ routing_policy:
99
+ # Safety — never cheap-route security-critical work.
100
+ - match: { agent_role_in: [ceo_pre_pass, audit, decision_writer, regulatory] }
101
+ backend: anthropic
102
+ # Extended-thinking → Anthropic.
103
+ - match: { needs_thinking: true }
104
+ backend: anthropic
105
+ fallback: [moonshot]
106
+ # Reliable tool use → Moonshot first (native Anthropic shape).
107
+ - match: { needs_tool_use: true }
108
+ backend: moonshot
109
+ fallback: [anthropic]
110
+ # Long-context (>60k) → Moonshot 262k window.
111
+ - match: { token_estimate_gte: 60000 }
112
+ backend: moonshot
113
+ fallback: [anthropic]
114
+ # Classifier / background → cheapest.
115
+ - match: { tier: classifier }
116
+ backend: openrouter_qwen
117
+ fallback: [moonshot, anthropic]
118
+ - match: { source: backlog }
119
+ backend: openrouter_qwen
120
+ fallback: [moonshot, anthropic]
121
+ - default: true
122
+ backend: moonshot
123
+ fallback: [anthropic]
124
+ ```
125
+
126
+ ## Observability
127
+
128
+ Every spawn that picks a non-`anthropic-cli` backend writes a
129
+ `routed` event to `logs/daemon/<date>-sessions.jsonl`:
130
+
131
+ ```json
132
+ {
133
+ "event": "routed",
134
+ "sessionId": "s-...",
135
+ "backend": "moonshot",
136
+ "transport": "anthropic-native",
137
+ "model": "kimi-k2.6",
138
+ "tried": [...],
139
+ "fallback_reason": null
140
+ }
141
+ ```
142
+
143
+ Use these to compute cost-per-agent, success-rate-per-model, and
144
+ failover counters. A future `scripts/cost/track-claude-usage.mjs`
145
+ patch will surface backend breakdowns in the daily
146
+ `state/dashboards/cost-summary.yaml`.
147
+
148
+ ## Risks + guardrails
149
+
150
+ | Risk | Symptom | Mitigation |
151
+ |------|---------|------------|
152
+ | Empty `tool_use.input` from OpenRouter+Qwen | Agent loops do nothing, claude logs "no input" | Tag backend with `degraded_tool_use`; router routes `needs_tool_use: true` away. |
153
+ | Lost prompt caching | Cost regression after switching | Only Moonshot supports cache-hit pricing on non-Anthropic backends. Watch `state/cost-tracking/` for >2× spend on previously-cached prompts. |
154
+ | Hallucinated tool names | Agent calls non-existent tools | maestro's existing `tool_not_found` counter catches this; auto-escalate after N consecutive misses by piping the agent through a fallback Anthropic rule. |
155
+ | `/advisor` (Anthropic-only) silently degrading | Subtle quality drop | `disable_experimental_betas: true` is the default; leave it on. |
156
+ | LiteLLM compromised versions | Credential theft (1.82.7/1.82.8) | Pin router/proxy versions in `package.json`; never auto-upgrade router binaries. |
157
+
158
+ ## See also
159
+ - `lib/model-router.mjs` — source
160
+ - `lib/model-router.test.mjs` — behaviour reference
161
+ - `scripts/setup/init-model-router.mjs` — wizard
162
+ - `scaffold/config/model-routing.yaml.example` — template