@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,226 @@
1
+ # Runbook — Incident Response
2
+
3
+ For an operator responding to a security incident on a Maestro fleet. Three
4
+ scenarios are covered in full: a prompt-injection success, a credential
5
+ exposure/rotation, and a compromised agent that must be isolated. Each is an
6
+ executable checklist against the real scripts. The governing rule: contain
7
+ first, investigate second, and never destroy evidence — the audit chain is the
8
+ record of what happened.
9
+
10
+ This complements `docs/runbooks/recovery-and-failover.md` (operational recovery)
11
+ and `SECURITY.md` (the trust model). For a dead machine rather than a compromised
12
+ one, see `docs/runbooks/backup-restore.md`.
13
+
14
+ ## Severity and first move
15
+
16
+ If you are not sure whether something is an incident, treat it as one and pull
17
+ the break-glass. The kill switch is reversible; an exfiltrated secret or a sent
18
+ message is not.
19
+
20
+ - **One agent misbehaving on one machine** → isolate that agent (Scenario C).
21
+ - **A secret may be exposed** → rotate it (Scenario B), then assess blast radius.
22
+ - **You cannot tell how far it has spread** → fleet-wide pause first
23
+ (`docs/runbooks/fleet-operations.md` → "Fleet-wide pause"), then triage.
24
+
25
+ ## The two kill switches
26
+
27
+ Know which one you need before the incident.
28
+
29
+ - **Local break-glass** (`scripts/emergency-stop.sh`) — run on the affected Mac
30
+ mini. Drops the `.emergency-stop` flag (every cadence/enqueue honors it on the
31
+ next tick), unloads the agent's launchd jobs, and kills running Claude Code
32
+ subagent processes. Use when you have shell on the box.
33
+ - **Org-server deactivate** (`admin.deactivate`) — run from the operator station
34
+ against Cohort. Suspends the agent, revokes ALL its device tokens, and queues
35
+ a `halt` directive. The token revocation is the load-bearing part: the agent's
36
+ very next authed call to the server fails `UNAUTHORIZED`, so it cannot
37
+ coordinate, escalate, or be impersonated even if the local process is still
38
+ alive. Use when you cannot trust the local machine or cannot reach it.
39
+
40
+ Use both for a confirmed compromise: deactivate at the server to cut
41
+ coordination and impersonation, then emergency-stop locally to halt execution.
42
+
43
+ ---
44
+
45
+ ## Scenario A — Prompt-injection success
46
+
47
+ You have evidence an agent acted on injected instructions (sent something it
48
+ should not have, accessed data out of policy, attempted to disable logging, or
49
+ the injection-defence layer fired and the agent proceeded anyway).
50
+
51
+ 1. **Contain the local agent.**
52
+ ```bash
53
+ cd ~/<agent>-ai && ./scripts/emergency-stop.sh
54
+ ```
55
+ This halts cadence work and kills in-flight sessions on this machine.
56
+
57
+ 2. **Cut coordination and impersonation at the server.** From the operator
58
+ station, deactivate the agent so its tokens are revoked fleet-wide:
59
+ ```bash
60
+ cohort --db "$COHORT_DB" admin deactivate <agentId> \
61
+ --reason "prompt-injection incident <ticket>"
62
+ ```
63
+ (If your build exposes deactivate only over RPC, call `admin.deactivate`
64
+ with the admin token.) Confirm `status: suspended` and `tokensRevoked > 0`.
65
+
66
+ 3. **Capture the injection vector before it ages out.** The triggering message
67
+ and the detection record are evidence.
68
+ ```bash
69
+ ls -t ~/<agent>-ai/logs/security/*-incidents.jsonl | head -1
70
+ ```
71
+ The incident log holds `full_message`, `sender`, `channel`,
72
+ `detection_reason`, `confidence`. Copy the file off the machine now — do not
73
+ wait. If the injection arrived but detection did NOT fire, find the inbound
74
+ item in the poller inbox / processed records and copy it too.
75
+
76
+ 4. **Export the authoritative timeline from the audit chain.** The org server's
77
+ hash-chained `org_events` is the non-repudiable record of what the agent
78
+ actually did:
79
+ ```bash
80
+ cohort --db "$COHORT_DB" export-audit --format ocsf \
81
+ --families approval,decision,cost,handoff > incident-<ticket>-ocsf.json
82
+ ```
83
+ Verify the chain is intact (tamper check): `cohort doctor` reports chain
84
+ integrity; a broken chain is itself a finding.
85
+
86
+ 5. **Determine blast radius.** Did the agent send anything? Check the unified
87
+ sends log and the pre-send gate's records. Did it hand off to another agent?
88
+ The `handoff` family in the export shows it; if so, isolate that agent too.
89
+ Did it touch information-barrier-protected domains
90
+ (`policies/information-barriers.yaml`)? If a strategic-initiative or financial
91
+ domain was crossed, escalate to the data owner.
92
+
93
+ 6. **Rotate anything the agent could read.** A successful injection in an
94
+ unscoped session can reach the plaintext `.env`. Assume the local secrets are
95
+ exposed and run Scenario B for that agent's credentials.
96
+
97
+ 7. **Patch the vector.** If a known injection pattern was missed, add it to
98
+ `policies/prompt-injection-defence.yaml` (`detection_patterns`) and, if the
99
+ path that processed it was unscoped, confirm scoped permissions are wired on
100
+ that spawn site (see `SECURITY.md` → Known limitations). Detection patterns
101
+ are heuristics; the fix is the scoped-permission boundary, not just the
102
+ pattern.
103
+
104
+ 8. **Restore only after the vector is closed.**
105
+ ```bash
106
+ cohort --db "$COHORT_DB" admin reactivate <agentId> # if you deactivated
107
+ cd ~/<agent>-ai && ./scripts/resume-operations.sh # clears .emergency-stop
108
+ ```
109
+ `resume-operations.sh` runs a health check, removes the stop flag, and
110
+ reloads launchd jobs. If it refuses, the health check is failing — fix that
111
+ first; do not hand-delete `.emergency-stop` to force a resume.
112
+
113
+ 9. **Record it.** File the serious-incident entry per
114
+ `docs/compliance/evidence-map.md` (EU AI Act Art. 26 deployer duty). Keep the
115
+ incident log, the OCSF export, and the patch in the ticket.
116
+
117
+ ---
118
+
119
+ ## Scenario B — Credential exposure and rotation
120
+
121
+ A secret leaked (committed by mistake, present on a stolen/compromised machine,
122
+ or read via an injection). Treat every secret on an affected machine as exposed —
123
+ the per-agent `.env` is plaintext and currently has no broker (`SECURITY.md` →
124
+ Known limitations).
125
+
126
+ 1. **Stop the bleeding.** If the leak is on a live machine, isolate the agent
127
+ first (Scenario C) so it cannot use or re-leak the credential.
128
+
129
+ 2. **Inventory what is exposed.** The agent's secrets live in `~/<agent>-ai/.env`
130
+ (~17 keys). If a single credential leaked, rotate that one; if the machine
131
+ or the file leaked, rotate all of them.
132
+ ```bash
133
+ stat -f '%Sp' ~/<agent>-ai/.env # should be -rw------- (0600); if not, fix:
134
+ chmod 600 ~/<agent>-ai/.env
135
+ ```
136
+
137
+ 3. **Rotate at the source of truth for each credential**, in priority order:
138
+ - **`COHORT_ADMIN_TOKEN`** — the most sensitive. If this leaked, rotate it
139
+ immediately and assume fleet-wide exposure; every operator action is at
140
+ risk. Reissue and redistribute to operators only.
141
+ - **Agent device token** — revoke and re-pair: `admin.deactivate` revokes the
142
+ agent's tokens; re-pair via `cohort pair approve <agentId>` to mint a new
143
+ one, then write it to the agent's `.env`.
144
+ - **Channel tokens** (`SLACK_USER_TOKEN`, WhatsApp/Baileys creds, Telegram bot
145
+ token, Gmail OAuth) — rotate in the provider console, then update `.env`.
146
+ - **Relay secrets** (`POLL_AUTH_TOKEN`, webhook HMAC secrets) — rotate in the
147
+ relay (e.g. Railway) and in `.env` together; a relay whose secret is unset
148
+ fails open, so never leave one blank during rotation.
149
+ - **`COHORT_SIGNING_SECRET`** — if this leaked, policy-bundle signatures are
150
+ forgeable; rotate and re-publish policy (`policy.publish`) so agents fetch
151
+ freshly signed bundles on the next `policy_stale` nudge.
152
+
153
+ 4. **Restart the agent to pick up new secrets.**
154
+ ```bash
155
+ cd ~/<agent>-ai && ./scripts/resume-operations.sh
156
+ ```
157
+
158
+ 5. **Verify and record.** Confirm the old credential is dead (an authed call
159
+ with the old agent token must fail `UNAUTHORIZED`). Log the rotation with
160
+ timestamps in the incident ticket; rotation events belong in the compliance
161
+ record (`docs/compliance/evidence-map.md`).
162
+
163
+ ---
164
+
165
+ ## Scenario C — Compromised-agent isolation
166
+
167
+ An agent is compromised, runaway, or behaving in a way you cannot explain, and
168
+ you need it off the fleet now. This is the EU AI Act Art. 14 stop-button in
169
+ practice.
170
+
171
+ 1. **Deactivate at the server first** (cuts coordination and impersonation even
172
+ if the local box is hostile):
173
+ ```bash
174
+ cohort --db "$COHORT_DB" admin deactivate <agentId> \
175
+ --reason "compromise — <ticket>"
176
+ ```
177
+ Token revocation takes effect on the agent's next call. Other agents can no
178
+ longer accept handoffs from it (those flow through the governance-gated
179
+ handoff methods at the server).
180
+
181
+ 2. **Halt execution locally** if you can reach the machine:
182
+ ```bash
183
+ cd ~/<agent>-ai && ./scripts/emergency-stop.sh
184
+ ```
185
+ If you cannot reach it (or do not trust it), the server-side deactivation has
186
+ already cut its ability to coordinate or be impersonated; physically isolate
187
+ the machine (network off) and treat it as evidence.
188
+
189
+ 3. **Preserve the machine as evidence.** Do not wipe, do not reinstall, do not
190
+ clear logs. Copy `logs/`, `state/`, and the local incident records off to a
191
+ clean host. If you are replacing the machine, follow
192
+ `docs/runbooks/backup-restore.md` on a NEW box — do not reuse the compromised
193
+ one until forensics is done.
194
+
195
+ 4. **Scope the blast radius across the fleet.** Pull the org-server audit export
196
+ (`cohort export-audit`) filtered to the agent's recent activity and check the
197
+ `handoff` and `approval` families: anything it handed to or approved for
198
+ another agent extends the incident. Isolate downstream agents as needed.
199
+
200
+ 5. **Rotate its credentials** (Scenario B) before the agent or its identity is
201
+ ever brought back.
202
+
203
+ 6. **Decommission or rebuild.** If the agent is being retired, follow the
204
+ decommissioning checklist in `docs/runbooks/fleet-operations.md`. If it is
205
+ being rebuilt on clean hardware, follow `docs/runbooks/backup-restore.md` and
206
+ re-pair for a fresh identity token; do not restore the old device token.
207
+
208
+ 7. **Reactivate only after rebuild + rotation + vector closure.**
209
+ ```bash
210
+ cohort --db "$COHORT_DB" admin reactivate <agentId>
211
+ ```
212
+
213
+ ---
214
+
215
+ ## After any incident
216
+
217
+ - Confirm the audit chain still verifies end-to-end (`cohort doctor`); a chain
218
+ break is a separate, higher-severity finding.
219
+ - File the serious-incident record and, where an HR-adjacent agent or a person's
220
+ data was involved, trigger worker-notification per
221
+ `docs/compliance/evidence-map.md` (Art. 26 deployer duties).
222
+ - Add any new injection pattern to `policies/prompt-injection-defence.yaml` and
223
+ any newly-discovered fail-open seam to the `SECURITY.md` Known-limitations list
224
+ with a tracking reference.
225
+ - Write the timeline into the ticket from the OCSF export, not from memory — the
226
+ hash-chained log is the authoritative account.
@@ -0,0 +1,431 @@
1
+ # Mac Mini Bootstrap Runbook
2
+
3
+ This runbook covers the complete setup of a Mac mini as the perpetual operations node for the the agent operating system system. Follow each section in order. Do not skip steps.
4
+
5
+ ---
6
+
7
+ ## Prerequisites
8
+
9
+ ### Hardware
10
+
11
+ - Apple Mac mini (M-series, minimum M2 with 16GB RAM recommended)
12
+ - Stable power connection (UPS recommended)
13
+ - Wired Ethernet connection (Wi-Fi as fallback only)
14
+ - External storage for backups (optional but recommended)
15
+
16
+ ### Software Prerequisites
17
+
18
+ - macOS 14.0 (Sonoma) or later
19
+ - Apple ID signed in (required for some system permissions)
20
+
21
+ ### Accounts Ready
22
+
23
+ Before starting, ensure you have credentials for:
24
+
25
+ - Anthropic (Claude API key)
26
+ - GitHub (access to maestro repo)
27
+ - Google Workspace (the-agent@the-company)
28
+ - Slack (the company workspace)
29
+ - WhatsApp Business (linked to the agent's number)
30
+
31
+ ---
32
+
33
+ ## Step 1: Install Xcode Command Line Tools
34
+
35
+ > If you provision this machine with `wundr computer-setup`, the Command Line
36
+ > Tools are installed **non-interactively** for you (via `softwareupdate`) — skip
37
+ > this step. The bare `xcode-select --install` below opens a GUI dialog that
38
+ > cannot complete on a headless mini, so only run it when setting up by hand.
39
+
40
+ ```bash
41
+ # No-op if already installed; otherwise trigger the installer.
42
+ xcode-select -p >/dev/null 2>&1 || xcode-select --install
43
+ ```
44
+
45
+ Verify installation:
46
+
47
+ ```bash
48
+ xcode-select -p
49
+ # Expected: /Library/Developer/CommandLineTools
50
+ ```
51
+
52
+ ## Step 2: Install Homebrew
53
+
54
+ ```bash
55
+ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
56
+ ```
57
+
58
+ Add Homebrew to PATH (Apple Silicon):
59
+
60
+ ```bash
61
+ echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
62
+ eval "$(/opt/homebrew/bin/brew shellenv)"
63
+ ```
64
+
65
+ Verify:
66
+
67
+ ```bash
68
+ brew --version
69
+ ```
70
+
71
+ ## Step 3: Install System Dependencies
72
+
73
+ ```bash
74
+ brew install git node python@3.12 jq yq
75
+ ```
76
+
77
+ ## Step 4: Install Claude Code CLI
78
+
79
+ ```bash
80
+ npm install -g @anthropic-ai/claude-code
81
+ ```
82
+
83
+ Verify:
84
+
85
+ ```bash
86
+ claude --version
87
+ ```
88
+
89
+ ## Step 5: Clone the maestro Repository
90
+
91
+ ```bash
92
+ cd ~
93
+ git clone git@github.com:the-platform-repo/maestro.git
94
+ cd maestro
95
+ ```
96
+
97
+ Verify the directory structure:
98
+
99
+ ```bash
100
+ ls -la
101
+ # Should see: agents/ config/ dashboards/ desktop-control/ docs/ ingest/ knowledge/
102
+ # logs/ mcp/ outputs/ plugins/ policies/ remote-bridge/ schedules/
103
+ # scripts/ teams/ tests/ workflows/
104
+ ```
105
+
106
+ ## Step 6: Configure Environment Variables
107
+
108
+ Create the environment file (secrets are never stored in the repo):
109
+
110
+ ```bash
111
+ cat > ~/.maestro-env << 'EOF'
112
+ # the agent operating system Environment Variables
113
+ # Source this file in your shell profile
114
+
115
+ # Required
116
+ export ANTHROPIC_API_KEY="your-api-key-here"
117
+
118
+ # Optional but recommended
119
+ export SLACK_TOKEN="your-slack-token-here"
120
+ export GITHUB_TOKEN="your-github-token-here"
121
+ export GOOGLE_CREDENTIALS="path-to-credentials-json"
122
+
123
+ # System
124
+ export MAESTRO_HOME="$HOME/maestro"
125
+ export CEO_EMAIL="principal@example.com"
126
+ export HOSTNAME="$(hostname)"
127
+ EOF
128
+ ```
129
+
130
+ Add to shell profile:
131
+
132
+ ```bash
133
+ echo 'source ~/.maestro-env' >> ~/.zprofile
134
+ source ~/.maestro-env
135
+ ```
136
+
137
+ Verify:
138
+
139
+ ```bash
140
+ echo $ANTHROPIC_API_KEY | head -c 10
141
+ # Should print first 10 characters of your key
142
+ ```
143
+
144
+ **Security note**: Set file permissions to owner-only:
145
+
146
+ ```bash
147
+ chmod 600 ~/.maestro-env
148
+ ```
149
+
150
+ ## Step 7: Install MCP Servers
151
+
152
+ Install the MCP servers defined in the `mcp/` directory:
153
+
154
+ ```bash
155
+ cd ~/maestro
156
+
157
+ # Install MCP server dependencies
158
+ # (Adjust based on the specific MCP servers configured in mcp/)
159
+ npm install
160
+
161
+ # Verify MCP configuration
162
+ ls mcp/
163
+ ```
164
+
165
+ Configure Claude Code to use the MCP servers:
166
+
167
+ ```bash
168
+ # The .mcp.json in the repo root should already reference the servers.
169
+ # Verify it exists and is valid:
170
+ cat .mcp.json 2>/dev/null || echo "MCP config not found -- create .mcp.json"
171
+ ```
172
+
173
+ ## Step 8: Configure launchd for Perpetual Operation
174
+
175
+ Create the launchd plist for the main orchestrator:
176
+
177
+ ```bash
178
+ cat > ~/Library/LaunchAgents/ai.maestro.maestro.plist << 'EOF'
179
+ <?xml version="1.0" encoding="UTF-8"?>
180
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
181
+ "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
182
+ <plist version="1.0">
183
+ <dict>
184
+ <key>Label</key>
185
+ <string>ai.maestro.maestro</string>
186
+
187
+ <key>ProgramArguments</key>
188
+ <array>
189
+ <string>/bin/bash</string>
190
+ <string>-c</string>
191
+ <string>source ~/.maestro-env && cd ~/maestro && ./scripts/orchestrator.sh</string>
192
+ </array>
193
+
194
+ <key>RunAtLoad</key>
195
+ <true/>
196
+
197
+ <key>KeepAlive</key>
198
+ <dict>
199
+ <key>SuccessfulExit</key>
200
+ <false/>
201
+ </dict>
202
+
203
+ <key>StandardOutPath</key>
204
+ <string>~/the-agent-repo/maestro/logs/orchestrator-stdout.log</string>
205
+
206
+ <key>StandardErrorPath</key>
207
+ <string>~/the-agent-repo/maestro/logs/orchestrator-stderr.log</string>
208
+
209
+ <key>EnvironmentVariables</key>
210
+ <dict>
211
+ <key>PATH</key>
212
+ <string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
213
+ </dict>
214
+
215
+ <key>ThrottleInterval</key>
216
+ <integer>30</integer>
217
+
218
+ <key>ProcessType</key>
219
+ <string>Background</string>
220
+ </dict>
221
+ </plist>
222
+ EOF
223
+ ```
224
+
225
+ Load the agent:
226
+
227
+ ```bash
228
+ launchctl load ~/Library/LaunchAgents/ai.maestro.maestro.plist
229
+ ```
230
+
231
+ Verify it is running:
232
+
233
+ ```bash
234
+ launchctl list | grep maestro
235
+ # Should show the process with a PID and exit status 0
236
+ ```
237
+
238
+ ## Step 9: Set Up Application Accounts
239
+
240
+ ### Slack
241
+
242
+ 1. Open Slack from Applications or install via `brew install --cask slack`.
243
+ 2. Sign in to the the company workspace.
244
+ 3. Ensure the agent's account is active and has access to all required channels (listed in `config/slack-channels.yaml` if present).
245
+ 4. Keep Slack running in the background. Configure it to launch at login: System Settings > General > Login Items > add Slack.
246
+
247
+ ### Gmail
248
+
249
+ 1. Open Safari and navigate to https://mail.google.com.
250
+ 2. Sign in as the-agent@the-company.
251
+ 3. Grant any necessary permissions for Google Calendar access.
252
+ 4. Keep the Gmail tab pinned in Safari.
253
+
254
+ ### WhatsApp
255
+
256
+ 1. Install WhatsApp: `brew install --cask whatsapp` or download from App Store.
257
+ 2. Link the device to the agent's WhatsApp account via QR code.
258
+ 3. Keep WhatsApp running in the background. Add to Login Items.
259
+
260
+ ## Step 10: Configure Desktop Control Permissions
261
+
262
+ The the agent operating system uses desktop control (via macOS Accessibility and Screen Recording APIs) to interact with applications. These permissions must be granted manually.
263
+
264
+ ### Accessibility Permission
265
+
266
+ 1. Open System Settings > Privacy & Security > Accessibility.
267
+ 2. Click the lock icon and authenticate.
268
+ 3. Add the following applications:
269
+ - Terminal (or your preferred terminal emulator)
270
+ - Claude Code (if it appears as a separate application)
271
+ - Any automation scripts that need UI control
272
+
273
+ ### Screen Recording Permission
274
+
275
+ 1. Open System Settings > Privacy & Security > Screen Recording.
276
+ 2. Add the same applications as above.
277
+ 3. Restart the applications after granting permissions.
278
+
279
+ ### Automation Permission
280
+
281
+ 1. Open System Settings > Privacy & Security > Automation.
282
+ 2. Ensure Terminal has permission to control:
283
+ - Slack
284
+ - Safari
285
+ - WhatsApp
286
+ - System Events
287
+
288
+ ### Verify Permissions
289
+
290
+ Run the desktop control verification script:
291
+
292
+ ```bash
293
+ cd ~/maestro
294
+ ./scripts/verify-permissions.sh 2>/dev/null || echo "Verification script not yet created -- verify manually"
295
+ ```
296
+
297
+ Manual verification:
298
+
299
+ ```bash
300
+ # Test AppleScript accessibility
301
+ osascript -e 'tell application "System Events" to get name of first process'
302
+ ```
303
+
304
+ ## Step 11: Verify All Workflows
305
+
306
+ Run the workflow verification suite:
307
+
308
+ ```bash
309
+ cd ~/maestro
310
+
311
+ # Verify workflow YAML files are valid
312
+ for f in workflows/daily/*.yaml workflows/weekly/*.yaml workflows/monthly/*.yaml workflows/quarterly/*.yaml; do
313
+ echo "Checking $f..."
314
+ yq eval '.' "$f" > /dev/null 2>&1 && echo " OK" || echo " INVALID"
315
+ done
316
+
317
+ # Verify output directories exist
318
+ mkdir -p outputs/briefs/daily outputs/briefs/weekly outputs/memos/weekly outputs/memos/quarterly outputs/board/monthly outputs/followups/daily
319
+ mkdir -p logs/daily
320
+
321
+ # Verify config files are readable
322
+ for f in config/*.yaml; do
323
+ echo "Checking $f..."
324
+ yq eval '.' "$f" > /dev/null 2>&1 && echo " OK" || echo " INVALID"
325
+ done
326
+
327
+ echo "Workflow verification complete."
328
+ ```
329
+
330
+ ## Step 12: Enable Monitoring
331
+
332
+ ### Log Monitoring
333
+
334
+ Set up log rotation (see `docs/runbooks/perpetual-operations.md` for details):
335
+
336
+ ```bash
337
+ cat > ~/Library/LaunchAgents/ai.maestro.maestro-logrotate.plist << 'EOF'
338
+ <?xml version="1.0" encoding="UTF-8"?>
339
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
340
+ "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
341
+ <plist version="1.0">
342
+ <dict>
343
+ <key>Label</key>
344
+ <string>ai.maestro.maestro-logrotate</string>
345
+ <key>ProgramArguments</key>
346
+ <array>
347
+ <string>/bin/bash</string>
348
+ <string>-c</string>
349
+ <string>cd ~/maestro && ./scripts/log-rotate.sh</string>
350
+ </array>
351
+ <key>StartCalendarInterval</key>
352
+ <dict>
353
+ <key>Hour</key>
354
+ <integer>0</integer>
355
+ <key>Minute</key>
356
+ <integer>0</integer>
357
+ </dict>
358
+ </dict>
359
+ </plist>
360
+ EOF
361
+
362
+ launchctl load ~/Library/LaunchAgents/ai.maestro.maestro-logrotate.plist
363
+ ```
364
+
365
+ ### Health Check
366
+
367
+ ```bash
368
+ # Quick system health check
369
+ echo "=== the agent operating system Health Check ==="
370
+ echo "launchd agent: $(launchctl list | grep maestro | awk '{print $1}')"
371
+ echo "Disk space: $(df -h ~ | tail -1 | awk '{print $4}') free"
372
+ echo "Memory: $(vm_stat | head -5)"
373
+ echo "Log size: $(du -sh ~/maestro/logs/ 2>/dev/null | cut -f1)"
374
+ echo "Last morning brief: $(ls -t ~/maestro/outputs/briefs/daily/*/ceo-morning-brief.md 2>/dev/null | head -1 || echo 'None yet')"
375
+ echo "=============================="
376
+ ```
377
+
378
+ ---
379
+
380
+ ## Post-Bootstrap Checklist
381
+
382
+ - [ ] Xcode command line tools installed
383
+ - [ ] Homebrew installed and on PATH
384
+ - [ ] Git, Node.js, Python, jq, yq installed
385
+ - [ ] Claude Code CLI installed and verified
386
+ - [ ] maestro repo cloned to ~/maestro
387
+ - [ ] Environment variables configured in ~/.maestro-env
388
+ - [ ] File permissions set (chmod 600 on secrets)
389
+ - [ ] MCP servers installed and configured
390
+ - [ ] launchd agent created and loaded
391
+ - [ ] Slack signed in and added to Login Items
392
+ - [ ] Gmail signed in via Safari
393
+ - [ ] WhatsApp linked and added to Login Items
394
+ - [ ] Accessibility permission granted
395
+ - [ ] Screen Recording permission granted
396
+ - [ ] Automation permission granted
397
+ - [ ] All workflow YAML files validated
398
+ - [ ] Output directories created
399
+ - [ ] Log rotation configured
400
+ - [ ] Health check runs cleanly
401
+ - [ ] First morning brief generated successfully
402
+ - [ ] (Optional) Voice/SMS configured -- see `docs/guides/voice-sms-setup.md`
403
+
404
+ ---
405
+
406
+ ## Optional: Voice & SMS Setup
407
+
408
+ If this agent needs phone call or SMS capabilities (Slack huddle voice participation, inbound/outbound SMS via Twilio), follow the dedicated guide:
409
+
410
+ **[Voice & SMS Setup Guide](../guides/voice-sms-setup.md)**
411
+
412
+ This covers Twilio phone number purchase, inbound SMS webhook, outbound SMS, Slack huddle voice (Deepgram STT + ElevenLabs TTS), Cloudflare tunnel exposure, caller ID mapping, and launchd process management for the voice/SMS services.
413
+
414
+ ---
415
+
416
+ Related documents:
417
+
418
+ - `docs/runbooks/perpetual-operations.md` -- How the system runs continuously
419
+ - `docs/runbooks/recovery-and-failover.md` -- Recovery procedures
420
+ - `docs/guides/agent-persona-setup.md` -- Agent identity and configuration
421
+ - `docs/guides/email-setup.md` -- Gmail IMAP and SMTP setup
422
+ - `docs/guides/slack-setup.md` -- Slack app, tokens, and events
423
+ - `docs/guides/whatsapp-setup.md` -- WhatsApp Business integration
424
+ - `docs/guides/voice-sms-setup.md` -- Voice calls and SMS setup
425
+ - `docs/guides/poller-daemon-setup.md` -- Event loop, daemon, triggers, watchdog
426
+ - `docs/guides/outbound-governance-setup.md` -- Hooks, dedup, information barriers
427
+ - `docs/guides/rag-context-setup.md` -- Search index and context retrieval
428
+ - `docs/guides/pdf-generation-setup.md` -- Branded PDF documents
429
+ - `docs/guides/media-generation-setup.md` -- AI-generated visual assets
430
+ - `docs/workflows/executive-cadence.md` -- Full operating rhythm
431
+ - `config/environment.yaml` -- Environment configuration reference