@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,162 @@
1
+ # CAPABILITY PACK — finance-leader
2
+ #
3
+ # The role's capability CATALOGUE: the MCP servers/plugins it needs, its sub-agent
4
+ # org (teams of role specs), its Claude Code skills, and its workflows. Resolved by
5
+ # lib/capability.mjs into a concrete capability surface, with breadth scaled by the
6
+ # altitude's delegationBreadth (broad → all teams+roles; moderate → drop support
7
+ # tiers; narrow → core teams only; none → standard defaults only). The init wizard
8
+ # (Phase 2.5) renders sub-agent definitions / skills / workflows from this and
9
+ # LLM-tailors each to the company context.
10
+ #
11
+ # FUNCTION overlay: archetypes/functions/finance-leader.yaml (CFO / VP-Finance /
12
+ # Controller / Head of FP&A — the Odette-class Books-desk seat). Teams align to its
13
+ # towers: ledger-close, receivables, payables, cash-treasury, payroll-people-cost,
14
+ # tax-compliance, fpa-planning. Tiers: lead | core | support. Models: opus |
15
+ # sonnet | haiku.
16
+ #
17
+ # The PRIMARY tool surface is the org's Books desk over the Cohort protocol
18
+ # (books.* — ledger-grounded reads, AR/AP/payroll/tax verbs under the SIGNATURE
19
+ # LAW: pay runs, payment runs, and lodgement never execute without a verified
20
+ # human signature) via the curated org tools / cohort-mcp; the servers below are
21
+ # the aux corpus around it.
22
+
23
+ mcpServers:
24
+ - { id: google-sheets, purpose: "Forecast models, budget workbooks, close checklists, cash models — the analysis layer AROUND the ledger (figures still cite the Books desk)", env: [GOOGLE_SHEETS_CREDENTIALS], optional: false }
25
+ - { id: google-drive, purpose: "Close evidence, signed approvals, auditor PBC lists, policy documents, board finance packs", env: [GOOGLE_DRIVE_CREDENTIALS], optional: false }
26
+ - { id: google-calendar, purpose: "The statutory lodgement calendar, close cadence, payment-run cutoffs, auditor sessions", env: [GOOGLE_CALENDAR_CREDENTIALS], optional: false }
27
+ - { id: banking-portal, purpose: "Bank-portal reads where a feed is not wired: statements, balances, payment confirmations", env: [BANKING_PORTAL_URL], optional: true }
28
+ - { id: playwright, purpose: "Browser automation for tax-authority portals, bank consoles, and supplier portals that lack an API", optional: true }
29
+
30
+ skills:
31
+ - { id: books-close, name: "Period close on the Books desk", trigger: "the close window opens or a close task is assigned", purpose: "Run the close loop — match the bank feed, clear holds, post accruals/depreciation, assemble the close pack with journal-line grounding" }
32
+ - { id: cash-brief, name: "Daily cash brief", trigger: "daily cadence or a cash question", purpose: "Read cash position, runway, and working-capital movement from ledger-current reports and flag threshold breaches" }
33
+ - { id: ar-chase, name: "Receivables chase review", trigger: "weekly cadence or aged AR crosses policy", purpose: "Work the chase ladder — release held steps, record promises-to-pay, recommend credit notes or escalation" }
34
+ - { id: payment-run-prep, name: "Payment-run preparation", trigger: "a run cutoff approaches", purpose: "Stage a clean AP run: capture stragglers, resolve holds/disputes, and hand the signature item to the human with exceptions annotated" }
35
+ - { id: payroll-prep, name: "Pay-run preparation", trigger: "the payroll cutoff approaches", purpose: "Draft the period's pay run early, reconcile against prior periods and leave/expense inputs, and surface anomalies before signature" }
36
+ - { id: obligation-workings, name: "Lodgement workings assembly", trigger: "an obligation nears its due date", purpose: "Assemble tax workings from the ledger, hold for signature, and route re-work returns with what changed" }
37
+ - { id: variance-review, name: "Forecast variance review", trigger: "monthly cadence or a variance question", purpose: "Compare actuals to plan with journal-line grounding and write the variance narrative with corrective options" }
38
+ - { id: audit-evidence, name: "Audit evidence pack", trigger: "an auditor request or PBC cycle", purpose: "Pull the evidence trail for a figure or control — journals, approvals, signatures, chain events — into an auditor-ready pack" }
39
+ - { id: asset-register, name: "Fixed-asset register review", trigger: "a capex event or the depreciation run", purpose: "Keep the asset register current — register additions, run period depreciation, process disposals with derecognition" }
40
+
41
+ workflows:
42
+ - { id: daily-cash-position, name: "Daily cash position", cadence: daily, purpose: "Publish the grounded cash/runway read; alert on threshold breaches and unexpected movements" }
43
+ - { id: weekly-ar-ap-review, name: "Weekly AR/AP review", cadence: weekly, purpose: "Age receivables and payables, run the chase ladder, stage the payment run, and list every item awaiting a human signature" }
44
+ - { id: payroll-cycle, name: "Payroll cycle", cadence: per-period, purpose: "Draft → reconcile → hand to signature → verify STP outcome; recall before cutoff when an anomaly surfaces" }
45
+ - { id: obligation-watch, name: "Statutory obligation watch", cadence: continuous, purpose: "Track the lodgement calendar, start workings ahead of due dates, and keep held items in front of the signer" }
46
+ - { id: month-end-close, name: "Month-end close", cadence: monthly, purpose: "Run the close checklist to a signed close pack — reconciliations, accruals, depreciation, and the reporting set" }
47
+ - { id: board-finance-pack, name: "Board finance pack", cadence: monthly, purpose: "Produce the finance section of the board pack — P&L, cash, variance, obligations — every figure grounded" }
48
+ - { id: audit-readiness, name: "Audit readiness cycle", cadence: quarterly, purpose: "Refresh the PBC list, test the evidence trail on sampled figures, and close control gaps before the auditors ask" }
49
+
50
+ agentTeams:
51
+ - id: ledger-close
52
+ name: "Ledger & Close"
53
+ tower: ledger-close
54
+ core: true
55
+ agents:
56
+ - { id: financial-controller, role: "Financial Controller", mandate: "Own ledger integrity and the close calendar; every period closes on time with reconciliations clean and figures grounded to journal lines.", model: opus, tier: lead, towers: [ledger-close] }
57
+ - { id: reconciliation-manager, role: "Reconciliation Manager", mandate: "Match bank-feed lines, resolve HELD matches, and drive unreconciled items to zero before cutoff.", model: sonnet, tier: core, towers: [ledger-close, cash-treasury] }
58
+ - { id: journal-steward, role: "Journal & Accruals Steward", mandate: "Post manual journals, accruals, and depreciation entries with clean narratives and idempotent period discipline.", model: sonnet, tier: core, towers: [ledger-close] }
59
+ - { id: intercompany-accountant, role: "Intercompany Accountant", mandate: "Keep intercompany balances eliminated and reconciled so consolidation never blocks the close.", model: sonnet, tier: core, towers: [ledger-close] }
60
+ - { id: close-checklist-runner, role: "Close Checklist Runner", mandate: "Track every close task to done, chase blockers, and keep the close calendar honest.", model: haiku, tier: support, towers: [ledger-close] }
61
+ - { id: evidence-librarian, role: "Close Evidence Librarian", mandate: "File every close artefact — reconciliations, approvals, workings — where the auditors will look for it.", model: haiku, tier: support, towers: [ledger-close] }
62
+
63
+ - id: revenue-cycle
64
+ name: "Receivables & Revenue Cycle"
65
+ tower: receivables
66
+ core: true
67
+ agents:
68
+ - { id: ar-lead, role: "Receivables Lead", mandate: "Own invoice-to-cash: invoices out on trigger, the chase ladder current, DSO trending down without burning relationships.", model: opus, tier: lead, towers: [receivables] }
69
+ - { id: collections-manager, role: "Collections Manager", mandate: "Work the chase ladder daily — release held steps, log promises-to-pay, and escalate only what policy requires.", model: sonnet, tier: core, towers: [receivables] }
70
+ - { id: billing-analyst, role: "Billing Analyst", mandate: "Draft accurate invoices from closed-won handoffs and usage triggers; keep credit notes rare and explained.", model: sonnet, tier: core, towers: [receivables] }
71
+ - { id: credit-controller, role: "Credit Controller", mandate: "Set and police credit terms and exposure limits so bad debt stays an exception, not a trend.", model: sonnet, tier: core, towers: [receivables] }
72
+ - { id: promise-tracker, role: "Promise-to-Pay Tracker", mandate: "Track every recorded promise to its due date and re-arm the ladder the moment one is broken.", model: haiku, tier: support, towers: [receivables] }
73
+ - { id: dso-analyst, role: "DSO & Aging Analyst", mandate: "Instrument DSO, aging buckets, and chase-conversion so collections effort goes where the cash is.", model: haiku, tier: support, towers: [receivables] }
74
+
75
+ - id: payables-runs
76
+ name: "Payables & Payment Runs"
77
+ tower: payables
78
+ core: true
79
+ agents:
80
+ - { id: ap-lead, role: "Payables Lead", mandate: "Own bill-to-pay: clean runs staged for signature on time, holds resolved with reasons, no surprise payments.", model: opus, tier: lead, towers: [payables] }
81
+ - { id: ap-specialist, role: "AP Capture Specialist", mandate: "Capture bills accurately on arrival, code them right first time, and keep the AP ledger current.", model: sonnet, tier: core, towers: [payables] }
82
+ - { id: dispute-resolver, role: "Dispute & Hold Resolver", mandate: "Work held and disputed bills to resolution — return, re-code, or release — before the run cutoff.", model: sonnet, tier: core, towers: [payables] }
83
+ - { id: payment-run-coordinator, role: "Payment-Run Coordinator", mandate: "Stage each scheduled run exception-free and put the signature item in front of the human with time to spare.", model: sonnet, tier: core, towers: [payables] }
84
+ - { id: vendor-master-steward, role: "Vendor Master Steward", mandate: "Keep vendor master data clean and verified — new-payee changes are fraud surface, treat them that way.", model: haiku, tier: support, towers: [payables] }
85
+ - { id: dpo-analyst, role: "DPO & Terms Analyst", mandate: "Track DPO and payment terms against policy so working capital is managed, not accidental.", model: haiku, tier: support, towers: [payables] }
86
+
87
+ - id: cash-treasury
88
+ name: "Cash & Treasury"
89
+ tower: cash-treasury
90
+ core: true
91
+ agents:
92
+ - { id: treasury-lead, role: "Treasury Lead", mandate: "Own the cash position, runway, and liquidity posture; no cash surprise ever reaches the principal first.", model: opus, tier: lead, towers: [cash-treasury] }
93
+ - { id: cash-analyst, role: "Cash Analyst", mandate: "Keep the daily cash read current and reconciled to the bank feed, with movements explained.", model: sonnet, tier: core, towers: [cash-treasury] }
94
+ - { id: liquidity-planner, role: "Liquidity Planner", mandate: "Model runway and working-capital cycles under scenario stress; flag the crunch quarters early.", model: sonnet, tier: core, towers: [cash-treasury, fpa-planning] }
95
+ - { id: bank-line-coder, role: "Bank-Line Coder", mandate: "Code and recode bank lines to the right accounts so the feed stays clean and the P&L truthful.", model: haiku, tier: support, towers: [cash-treasury, ledger-close] }
96
+ - { id: fx-watcher, role: "FX & Rates Watcher", mandate: "Track currency and rate exposure on balances and upcoming obligations; recommend hedges, never place them.", model: haiku, tier: support, towers: [cash-treasury] }
97
+
98
+ - id: payroll-people-cost
99
+ name: "Payroll & People Cost"
100
+ tower: payroll-people-cost
101
+ core: true
102
+ agents:
103
+ - { id: payroll-lead, role: "Payroll Lead", mandate: "Own the pay-run cycle end to end: drafted early, reconciled, signed by a human on time, STP verified after.", model: opus, tier: lead, towers: [payroll-people-cost] }
104
+ - { id: payroll-specialist, role: "Payroll Specialist", mandate: "Draft pay runs against leave/expense inputs, reconcile period-over-period, and flag anomalies before signature.", model: sonnet, tier: core, towers: [payroll-people-cost] }
105
+ - { id: stp-monitor, role: "STP Event Monitor", mandate: "Verify every pay event's submission outcome and drive errored events to resubmission with the cause fixed.", model: sonnet, tier: core, towers: [payroll-people-cost, tax-compliance] }
106
+ - { id: leave-expense-auditor, role: "Leave & Expense Auditor", mandate: "Check leave balances and expense claims against policy before they hit a run.", model: haiku, tier: support, towers: [payroll-people-cost] }
107
+ - { id: comp-cost-analyst, role: "Compensation Cost Analyst", mandate: "Track people cost against plan by team and role; feed headcount decisions with grounded numbers.", model: haiku, tier: support, towers: [payroll-people-cost, fpa-planning] }
108
+
109
+ - id: tax-obligations
110
+ name: "Tax & Statutory Obligations"
111
+ tower: tax-compliance
112
+ core: true
113
+ agents:
114
+ - { id: tax-lead, role: "Tax & Obligations Lead", mandate: "Own the lodgement calendar: workings assembled from the ledger ahead of due dates, held for signature, lodged on time — never without a human signature.", model: opus, tier: lead, towers: [tax-compliance] }
115
+ - { id: workings-assembler, role: "Workings Assembler", mandate: "Assemble each obligation's workings from ledger lines with every figure traceable; route re-work returns with what changed.", model: sonnet, tier: core, towers: [tax-compliance] }
116
+ - { id: lodgement-coordinator, role: "Lodgement Coordinator", mandate: "Shepherd held obligations to signature and verify the lodgement outcome on the sandbox/real rail honestly.", model: sonnet, tier: core, towers: [tax-compliance] }
117
+ - { id: indirect-tax-analyst, role: "Indirect Tax Analyst", mandate: "Keep GST/VAT treatment right at the line level so the return assembles itself from a clean ledger.", model: sonnet, tier: core, towers: [tax-compliance, ledger-close] }
118
+ - { id: obligations-clerk, role: "Obligations Clerk", mandate: "Keep the statutory calendar current — due dates, thresholds, authority correspondence — and start clocks early.", model: haiku, tier: support, towers: [tax-compliance] }
119
+ - { id: authority-correspondent, role: "Authority Correspondent", mandate: "Draft responses to tax-authority queries in formal register for human review; nothing goes out unsigned.", model: haiku, tier: support, towers: [tax-compliance] }
120
+
121
+ - id: fpa-planning
122
+ name: "FP&A & Planning"
123
+ tower: fpa-planning
124
+ core: false
125
+ agents:
126
+ - { id: fpa-lead, role: "FP&A Lead", mandate: "Own the plan, forecast, and variance narrative — grounded in ledger-current reports, honest about misses, early on runway risk.", model: opus, tier: lead, towers: [fpa-planning, cash-treasury] }
127
+ - { id: forecast-modeler, role: "Forecast Modeler", mandate: "Maintain the driver-based forecast and reforecast cadence; every assumption named and testable.", model: sonnet, tier: core, towers: [fpa-planning] }
128
+ - { id: variance-analyst, role: "Variance Analyst", mandate: "Explain actual-vs-plan at the journal-line level; a variance without a cause is unfinished work.", model: sonnet, tier: core, towers: [fpa-planning] }
129
+ - { id: scenario-planner, role: "Scenario Planner", mandate: "Stress the plan — downside, base, upside — and keep the trigger points for each pre-agreed action visible.", model: sonnet, tier: core, towers: [fpa-planning] }
130
+ - { id: budget-partner, role: "Budget Business Partner", mandate: "Partner each team on its budget: spend visibility, reallocation cases, no year-end surprises.", model: haiku, tier: support, towers: [fpa-planning] }
131
+ - { id: kpi-librarian, role: "Finance KPI Librarian", mandate: "Keep metric definitions, sources, and grounding consistent so every surface quotes the same number.", model: haiku, tier: support, towers: [fpa-planning] }
132
+
133
+ - id: asset-capital
134
+ name: "Fixed Assets & Capital"
135
+ tower: fpa-planning
136
+ core: false
137
+ agents:
138
+ - { id: capital-assets-lead, role: "Capital & Assets Lead", mandate: "Own the fixed-asset register and capex discipline: additions registered, depreciation run per period, disposals derecognised cleanly.", model: opus, tier: lead, towers: [fpa-planning, ledger-close] }
139
+ - { id: fixed-asset-registrar, role: "Fixed-Asset Registrar", mandate: "Register every addition with the right class, life, and cost base the day it lands.", model: sonnet, tier: core, towers: [ledger-close] }
140
+ - { id: depreciation-runner, role: "Depreciation Runner", mandate: "Post the period's depreciation idempotently and reconcile the register to the ledger.", model: haiku, tier: support, towers: [ledger-close] }
141
+ - { id: capex-analyst, role: "Capex Analyst", mandate: "Track capex against plan and payback; flag the assets that never earned their case.", model: haiku, tier: support, towers: [fpa-planning] }
142
+
143
+ - id: audit-controls
144
+ name: "Audit & Controls"
145
+ tower: ledger-close
146
+ core: false
147
+ agents:
148
+ - { id: controls-lead, role: "Controls Lead", mandate: "Own the control environment: signature law observed, approval floors respected, every exception explained.", model: opus, tier: lead, towers: [ledger-close, tax-compliance] }
149
+ - { id: evidence-pack-builder, role: "Evidence Pack Builder", mandate: "Turn auditor requests into complete evidence packs — journals, approvals, chain events — first ask, first time.", model: sonnet, tier: core, towers: [ledger-close] }
150
+ - { id: controls-tester, role: "Controls Tester", mandate: "Sample and test key controls each quarter; a control that isn't tested is a hope, not a control.", model: sonnet, tier: core, towers: [ledger-close] }
151
+ - { id: pbc-coordinator, role: "PBC Coordinator", mandate: "Run the prepared-by-client list to done ahead of fieldwork; no auditor waits on finance.", model: haiku, tier: support, towers: [ledger-close] }
152
+ - { id: policy-steward, role: "Finance Policy Steward", mandate: "Keep expense, delegation, and approval policies current, published, and reflected in the desk's rules.", model: haiku, tier: support, towers: [ledger-close] }
153
+
154
+ - id: board-investor-finance
155
+ name: "Board & Investor Finance"
156
+ tower: fpa-planning
157
+ core: false
158
+ agents:
159
+ - { id: finance-comms-lead, role: "Finance Communications Lead", mandate: "Own the finance narrative to board and investors: precise, grounded, and consistent across every pack.", model: opus, tier: lead, towers: [fpa-planning] }
160
+ - { id: board-pack-builder, role: "Board Pack Builder", mandate: "Assemble the monthly finance section — P&L, cash, variance, obligations — with every figure citing its ledger source.", model: sonnet, tier: core, towers: [fpa-planning] }
161
+ - { id: investor-metrics-analyst, role: "Investor Metrics Analyst", mandate: "Keep ARR, burn, runway, and unit-economics metrics reconciled to the ledger and consistent quarter to quarter.", model: haiku, tier: support, towers: [fpa-planning] }
162
+ - { id: data-room-steward, role: "Data-Room Steward", mandate: "Keep the diligence data room current and access-controlled; stale numbers in a data room are a credibility debt.", model: haiku, tier: support, towers: [fpa-planning] }
@@ -0,0 +1,154 @@
1
+ # CAPABILITY PACK — operations-leader
2
+ #
3
+ # The role's capability CATALOGUE: the MCP servers/plugins it needs, its sub-agent
4
+ # org (teams of role specs), its Claude Code skills, and its workflows. Resolved by
5
+ # lib/capability.mjs into a concrete capability surface, with breadth scaled by the
6
+ # altitude's delegationBreadth (broad → all teams+roles; moderate → drop support
7
+ # tiers; narrow → core teams only; none → standard defaults only). The init wizard
8
+ # (Phase 2.5) renders sub-agent definitions / skills / workflows from this and
9
+ # LLM-tailors each to the company context.
10
+ #
11
+ # FUNCTION overlay: archetypes/functions/operations-leader.yaml (COO / Head of Ops /
12
+ # Fund Ops / HR-Ops). Teams align to its towers: process-excellence, core-operations,
13
+ # service-quality, vendor-supplier, capacity-resourcing, people-ops, cost-management,
14
+ # resilience-bcp. Tiers: lead | core | support. Models: opus | sonnet | haiku.
15
+
16
+ mcpServers:
17
+ - { id: google-drive, purpose: "SOP library, runbooks, process maps, vendor contracts, BCP plans — read/write of operational document corpus", env: [GOOGLE_DRIVE_CREDENTIALS], optional: false }
18
+ - { id: google-sheets, purpose: "Capacity models, SLA trackers, cost-to-serve workbooks, volume/forecast sheets — structured operational data", env: [GOOGLE_SHEETS_CREDENTIALS], optional: false }
19
+ - { id: google-calendar, purpose: "Shift plans, ops reviews, vendor governance forums, incident bridges, BCP test scheduling", env: [GOOGLE_CALENDAR_CREDENTIALS], optional: false }
20
+ - { id: erp-ops, purpose: "ERP / fund-accounting / back-office platform reads: orders, transactions, ledgers, work orders, master data", env: [ERP_BASE_URL, ERP_API_KEY], optional: true }
21
+ - { id: ticketing, purpose: "Service-desk / ITSM / case queues: tickets, SLAs, backlog age, exception logs, incident records", env: [TICKETING_BASE_URL, TICKETING_API_TOKEN], optional: true }
22
+ - { id: playwright, purpose: "Browser automation for vendor portals, ops consoles, and dashboards that lack an API", optional: true }
23
+
24
+ skills:
25
+ - { id: process-mapping, name: "Process mapping & SOP authoring", trigger: "a process is new, broken, or being standardised", purpose: "Map a process end-to-end, identify waste and hand-offs, and write the SOP/runbook" }
26
+ - { id: sla-review, name: "SLA / service-quality review", trigger: "weekly cadence or an SLA breach is detected", purpose: "Read SLA/OLA attainment, age the backlog, and drive breaches to a remediation owner" }
27
+ - { id: capacity-model, name: "Capacity & demand modelling", trigger: "a forecast, peak, or staffing decision is pending", purpose: "Model demand against capacity and produce a staffing/shift recommendation with utilisation guardrails" }
28
+ - { id: vendor-review, name: "Vendor performance review", trigger: "a vendor governance cycle or SLA exception", purpose: "Score outsourcer/supplier performance against the SLA scorecard and prep the governance pack" }
29
+ - { id: incident-response, name: "Operational incident response", trigger: "a service outage, control breach, or major exception", purpose: "Coordinate triage, containment, stakeholder comms, recovery, and post-incident review" }
30
+ - { id: rca, name: "Root-cause analysis", trigger: "a recurring error, exception, or rework pattern", purpose: "Run a structured 5-whys / fishbone RCA to a permanent corrective action, not a symptom fix" }
31
+ - { id: cost-to-serve, name: "Cost-to-serve analysis", trigger: "a cost programme, budget cycle, or unit-economics question", purpose: "Decompose operating cost by process/unit and surface productivity and efficiency levers" }
32
+ - { id: bcp-test, name: "BCP / continuity test", trigger: "a continuity test window or post-incident hardening", purpose: "Run a continuity/DR rehearsal against RTO/RPO targets and log gaps to the resilience backlog" }
33
+ - { id: ops-review, name: "Operations review pack", trigger: "weekly/monthly ops review cadence", purpose: "Synthesise service, quality, cost, capacity, and resilience signals into a single operational health read" }
34
+
35
+ workflows:
36
+ - { id: ops-health-review, name: "Weekly operations health review", cadence: weekly, purpose: "Roll up the operational KPI tree (service, quality, efficiency, cost, capacity, resilience) and flag risks for the principal" }
37
+ - { id: sla-breach-watch, name: "SLA / backlog breach watch", cadence: continuous, purpose: "Monitor SLA/OLA attainment and queue age; raise and route breaches the moment a threshold trips" }
38
+ - { id: vendor-governance, name: "Vendor governance cycle", cadence: monthly, purpose: "Run the monthly outsourcer/supplier scorecard, contract/SLA review, and concentration-risk check" }
39
+ - { id: capacity-plan-refresh, name: "Capacity plan refresh", cadence: weekly, purpose: "Refresh demand-vs-capacity, rebalance shifts/staffing, and surface peak-load exposure" }
40
+ - { id: incident-postmortem, name: "Operational post-incident review", cadence: event-driven, purpose: "Drive blameless post-incident reviews to corrective actions in the resilience backlog" }
41
+ - { id: cost-productivity-review, name: "Monthly cost & productivity review", cadence: monthly, purpose: "Track cost-to-serve, output-per-FTE, and the efficiency programme against plan with finance" }
42
+ - { id: bcp-test-cycle, name: "Continuity & DR test cycle", cadence: quarterly, purpose: "Schedule and run continuity/DR rehearsals, validate RTO/RPO, and close resilience gaps" }
43
+
44
+ agentTeams:
45
+ - id: process-excellence
46
+ name: "Process Excellence & Standardisation"
47
+ tower: process-excellence
48
+ core: true
49
+ agents:
50
+ - { id: process-excellence-lead, role: "Process Excellence Lead", mandate: "Own end-to-end process design, the SOP estate, and the standardise-then-automate agenda across operations.", model: opus, tier: lead, towers: [process-excellence] }
51
+ - { id: continuous-improvement-manager, role: "Continuous Improvement Manager", mandate: "Run the Lean/Six-Sigma improvement portfolio and convert waste and cycle-time findings into shipped changes.", model: sonnet, tier: core, towers: [process-excellence] }
52
+ - { id: automation-architect, role: "Process Automation Architect", mandate: "Identify and design automation/RPA opportunities to raise straight-through-processing and cut manual touch.", model: sonnet, tier: core, towers: [process-excellence, core-operations] }
53
+ - { id: sop-steward, role: "SOP & Documentation Steward", mandate: "Author, version, and keep current the SOP/runbook library so every process has a single source of truth.", model: haiku, tier: support, towers: [process-excellence] }
54
+ - { id: process-analyst, role: "Process Mining Analyst", mandate: "Mine event logs and process maps to expose bottlenecks, rework loops, and variance for prioritisation.", model: haiku, tier: support, towers: [process-excellence] }
55
+
56
+ - id: core-operations
57
+ name: "Core Operations Engine"
58
+ tower: core-operations
59
+ core: true
60
+ agents:
61
+ - { id: core-ops-lead, role: "Head of Core Operations", mandate: "Own day-to-day throughput and accuracy of the operational engine across all processing lines.", model: opus, tier: lead, towers: [core-operations] }
62
+ - { id: ops-shift-manager, role: "Operations Shift Manager", mandate: "Run the live processing floor, balance workload across queues, and hold the daily throughput plan.", model: sonnet, tier: core, towers: [core-operations] }
63
+ - { id: exception-handler, role: "Exception & Break Manager", mandate: "Triage and clear operational exceptions and breaks before they age into SLA or financial impact.", model: sonnet, tier: core, towers: [core-operations, service-quality] }
64
+ - { id: master-data-steward, role: "Master Data Steward", mandate: "Keep operational master/reference data clean and governed so processing runs without data-driven breaks.", model: haiku, tier: support, towers: [core-operations] }
65
+ - { id: ops-throughput-analyst, role: "Throughput Analyst", mandate: "Instrument volumes, cycle time, and STP rate to surface where the operational engine is choking.", model: haiku, tier: support, towers: [core-operations] }
66
+
67
+ - id: fund-back-office
68
+ name: "Fund & Back-Office Operations"
69
+ tower: core-operations
70
+ core: true
71
+ agents:
72
+ - { id: fund-ops-lead, role: "Head of Fund & Back-Office Ops", mandate: "Own NAV production, settlement, and reconciliation integrity across the fund/back-office lifecycle.", model: opus, tier: lead, towers: [core-operations] }
73
+ - { id: nav-oversight-manager, role: "NAV Oversight Manager", mandate: "Govern daily NAV production and the fund-accounting oversight controls to a clean, on-time strike.", model: sonnet, tier: core, towers: [core-operations, service-quality] }
74
+ - { id: reconciliation-manager, role: "Reconciliation Manager", mandate: "Run cash and position reconciliations and drive ageing breaks to zero against the daily cut-off.", model: sonnet, tier: core, towers: [core-operations] }
75
+ - { id: trade-settlement-officer, role: "Trade & Settlement Officer", mandate: "Shepherd trade capture, confirmation, and settlement to reduce fails and settlement-risk exposure.", model: sonnet, tier: core, towers: [core-operations] }
76
+ - { id: corporate-actions-analyst, role: "Corporate Actions Analyst", mandate: "Process corporate actions and income events accurately and on time across the book.", model: haiku, tier: support, towers: [core-operations] }
77
+ - { id: transfer-agency-analyst, role: "Transfer Agency Analyst", mandate: "Handle subscriptions, redemptions, and investor registers with clean, audited recordkeeping.", model: haiku, tier: support, towers: [core-operations] }
78
+
79
+ - id: service-quality
80
+ name: "Service Quality & SLAs"
81
+ tower: service-quality
82
+ core: true
83
+ agents:
84
+ - { id: service-quality-lead, role: "Service Quality Lead", mandate: "Own SLA/OLA attainment, error/rework rate, and the exception-management discipline end to end.", model: opus, tier: lead, towers: [service-quality] }
85
+ - { id: sla-manager, role: "SLA & Service-Level Manager", mandate: "Define service levels, track attainment against thresholds, and own breach remediation to closure.", model: sonnet, tier: core, towers: [service-quality] }
86
+ - { id: quality-assurance-manager, role: "Quality Assurance Manager", mandate: "Run QA sampling and first-pass-yield controls to drive down error and escaped-defect rates.", model: sonnet, tier: core, towers: [service-quality] }
87
+ - { id: rca-lead, role: "Root-Cause & CAPA Lead", mandate: "Lead root-cause analysis on recurring failures and own corrective/preventive actions to permanent fix.", model: sonnet, tier: core, towers: [service-quality, process-excellence] }
88
+ - { id: voc-analyst, role: "Voice-of-Customer Analyst", mandate: "Track internal/customer satisfaction and complaint signals to flag service-quality erosion early.", model: haiku, tier: support, towers: [service-quality] }
89
+
90
+ - id: vendor-supplier
91
+ name: "Vendor & Supplier Management"
92
+ tower: vendor-supplier
93
+ core: false
94
+ agents:
95
+ - { id: vendor-management-lead, role: "Vendor Management Lead", mandate: "Own outsourcer/BPO and supplier performance, the contract estate, and concentration/exit risk.", model: opus, tier: lead, towers: [vendor-supplier] }
96
+ - { id: outsourcer-relationship-manager, role: "Outsourcer Relationship Manager", mandate: "Run the day-to-day BPO/outsourcer relationship and governance forums against the SLA scorecard.", model: sonnet, tier: core, towers: [vendor-supplier] }
97
+ - { id: contract-sla-manager, role: "Contract & SLA Manager", mandate: "Negotiate and steward vendor contracts, SLAs, and service credits to enforceable, current terms.", model: sonnet, tier: core, towers: [vendor-supplier] }
98
+ - { id: third-party-risk-analyst, role: "Third-Party Risk Analyst", mandate: "Assess and monitor vendor operational, financial, and concentration risk and maintain exit plans.", model: sonnet, tier: support, towers: [vendor-supplier, resilience-bcp] }
99
+ - { id: vendor-performance-analyst, role: "Vendor Performance Analyst", mandate: "Compile the vendor scorecard and surface SLA, cost, and quality variance across the supplier base.", model: haiku, tier: support, towers: [vendor-supplier] }
100
+
101
+ - id: capacity-resourcing
102
+ name: "Capacity & Resource Planning"
103
+ tower: capacity-resourcing
104
+ core: false
105
+ agents:
106
+ - { id: capacity-planning-lead, role: "Capacity Planning Lead", mandate: "Own demand-vs-capacity modelling, utilisation, and peak/seasonal load across the operation.", model: opus, tier: lead, towers: [capacity-resourcing] }
107
+ - { id: workforce-planner, role: "Workforce & Shift Planner", mandate: "Build staffing and shift plans that match capacity to forecast demand and protect schedule adherence.", model: sonnet, tier: core, towers: [capacity-resourcing] }
108
+ - { id: demand-forecaster, role: "Demand Forecaster", mandate: "Forecast operational volumes and arrival patterns to drive resourcing and peak-load readiness.", model: sonnet, tier: core, towers: [capacity-resourcing] }
109
+ - { id: utilisation-analyst, role: "Utilisation Analyst", mandate: "Track utilisation and demand-vs-capacity variance and flag over/under-resourced queues.", model: haiku, tier: support, towers: [capacity-resourcing] }
110
+ - { id: scheduling-coordinator, role: "Scheduling Coordinator", mandate: "Maintain rosters, leave, and coverage so the live floor is never short against the plan.", model: haiku, tier: support, towers: [capacity-resourcing] }
111
+
112
+ - id: people-ops
113
+ name: "Organisational Design & People-Ops"
114
+ tower: people-ops
115
+ core: false
116
+ agents:
117
+ - { id: people-ops-lead, role: "People-Ops & Org Design Lead", mandate: "Own operating-model design, spans and layers, RACI, and operational competency across teams.", model: opus, tier: lead, towers: [people-ops] }
118
+ - { id: org-design-manager, role: "Organisational Design Manager", mandate: "Design roles, spans, and reporting structures that fit the operating model and remove ambiguity.", model: sonnet, tier: core, towers: [people-ops] }
119
+ - { id: onboarding-enablement-manager, role: "Onboarding & Enablement Manager", mandate: "Run operational onboarding and ramp so new joiners reach competency on the SOP estate fast.", model: sonnet, tier: core, towers: [people-ops, process-excellence] }
120
+ - { id: competency-training-lead, role: "Competency & Training Lead", mandate: "Maintain the skills matrix and cross-training plan to remove single-person key dependencies.", model: haiku, tier: support, towers: [people-ops] }
121
+ - { id: hr-ops-coordinator, role: "HR-Ops Coordinator", mandate: "Run people-ops transactions — headcount records, RACI upkeep, and role changes — cleanly and on time.", model: haiku, tier: support, towers: [people-ops] }
122
+
123
+ - id: cost-management
124
+ name: "Cost & Unit Economics"
125
+ tower: cost-management
126
+ core: false
127
+ agents:
128
+ - { id: cost-management-lead, role: "Operations Cost Lead", mandate: "Own the operating cost base, cost-to-serve, and the productivity/efficiency programme with finance.", model: opus, tier: lead, towers: [cost-management] }
129
+ - { id: cost-to-serve-analyst, role: "Cost-to-Serve Analyst", mandate: "Decompose cost per unit and per process to expose the highest-leverage efficiency opportunities.", model: sonnet, tier: core, towers: [cost-management] }
130
+ - { id: productivity-programme-manager, role: "Productivity Programme Manager", mandate: "Run the efficiency-savings portfolio and track realised productivity gains against plan.", model: sonnet, tier: core, towers: [cost-management, process-excellence] }
131
+ - { id: ops-finance-partner, role: "Operations Finance Partner", mandate: "Co-own the ops budget and headcount lines with FP&A and reconcile spend to forecast.", model: sonnet, tier: support, towers: [cost-management] }
132
+ - { id: spend-analyst, role: "Operational Spend Analyst", mandate: "Track operating spend and unit-cost trends and surface variance against the cost plan.", model: haiku, tier: support, towers: [cost-management] }
133
+
134
+ - id: resilience-bcp
135
+ name: "Operational Resilience & BCP"
136
+ tower: resilience-bcp
137
+ core: true
138
+ agents:
139
+ - { id: resilience-lead, role: "Operational Resilience Lead", mandate: "Own continuity, disaster recovery, the control environment, and removal of single points of failure.", model: opus, tier: lead, towers: [resilience-bcp] }
140
+ - { id: bcp-manager, role: "Business Continuity Manager", mandate: "Maintain BCP plans and run continuity rehearsals against RTO/RPO targets to proven recovery.", model: sonnet, tier: core, towers: [resilience-bcp] }
141
+ - { id: incident-commander, role: "Operational Incident Commander", mandate: "Run major operational incidents end to end — triage, containment, comms, and recovery.", model: sonnet, tier: core, towers: [resilience-bcp, service-quality] }
142
+ - { id: controls-assurance-manager, role: "Controls Assurance Manager", mandate: "Test and evidence the operational control environment and shepherd control exceptions to closure.", model: sonnet, tier: support, towers: [resilience-bcp] }
143
+ - { id: dr-test-analyst, role: "DR & Continuity Test Analyst", mandate: "Plan and run DR/continuity tests and log RTO/RPO gaps to the resilience backlog.", model: haiku, tier: support, towers: [resilience-bcp] }
144
+
145
+ - id: ops-data-reporting
146
+ name: "Operations Data & Reporting"
147
+ tower: service-quality
148
+ core: false
149
+ agents:
150
+ - { id: ops-mi-lead, role: "Operations MI & Reporting Lead", mandate: "Own the operational data model and the KPI tree feeding service, quality, cost, and capacity reporting.", model: opus, tier: lead, towers: [service-quality] }
151
+ - { id: ops-dashboard-engineer, role: "Operations Dashboard Engineer", mandate: "Build and maintain the operational dashboards and the weekly ops-review data pack.", model: sonnet, tier: core, towers: [service-quality, process-excellence] }
152
+ - { id: kpi-analyst, role: "Operational KPI Analyst", mandate: "Curate KPI definitions and trend analysis so every metric has one agreed meaning and owner.", model: sonnet, tier: core, towers: [service-quality] }
153
+ - { id: data-quality-steward, role: "Reporting Data Quality Steward", mandate: "Validate reporting inputs and reconcile source data so operational MI is trusted and audit-ready.", model: haiku, tier: support, towers: [service-quality, core-operations] }
154
+ - { id: ops-reporting-analyst, role: "Operations Reporting Analyst", mandate: "Produce the recurring operational reports and breach/exception logs on schedule.", model: haiku, tier: support, towers: [service-quality] }
@@ -0,0 +1,148 @@
1
+ # CAPABILITY PACK — product-leader
2
+ #
3
+ # The role's capability CATALOGUE: the MCP servers/plugins it needs, its sub-agent
4
+ # org (teams of role specs), its Claude Code skills, and its workflows. Resolved by
5
+ # lib/capability.mjs into a concrete capability surface, with breadth scaled by the
6
+ # altitude's delegationBreadth (broad → all teams+roles; moderate → drop support
7
+ # tiers; narrow → core teams only; none → standard defaults only). The init wizard
8
+ # (Phase 2.5) renders sub-agent definitions / skills / workflows from this and
9
+ # LLM-tailors each to the company context.
10
+ #
11
+ # Function overlay: archetypes/functions/product-leader.yaml. Every team's tower
12
+ # must reference a real tower id from that overlay: roadmap-prioritisation,
13
+ # discovery-research, feature-delivery, design-ux-quality, pmf-metrics,
14
+ # experimentation, cross-functional, gtm-comms. Tiers: lead | core | support.
15
+ # Models: opus | sonnet | haiku.
16
+
17
+ mcpServers:
18
+ - { id: linear, purpose: "Roadmap, epics, issues, cycles, and delivery status across product squads", env: [LINEAR_API_KEY], optional: true }
19
+ - { id: product-analytics, purpose: "Activation/retention/funnel/cohort analytics and experiment readouts (Amplitude/Mixpanel)", env: [PRODUCT_ANALYTICS_API_KEY, PRODUCT_ANALYTICS_PROJECT_ID], optional: true }
20
+ - { id: figma, purpose: "Design files, prototypes, design-system components, and review threads", env: [FIGMA_ACCESS_TOKEN], optional: true }
21
+ - { id: user-feedback, purpose: "Aggregated support tickets, NPS/CSAT verbatims, and customer feedback themes", env: [FEEDBACK_API_KEY], optional: true }
22
+ - { id: context7, purpose: "Up-to-date library/framework/API documentation for spec and feasibility checks", optional: true }
23
+ - { id: playwright, purpose: "Browser automation for journey walkthroughs, dashboard scrapes, and pre-launch UX checks", optional: true }
24
+
25
+ skills:
26
+ - { id: prd-authoring, name: "PRD authoring", trigger: "a feature moves from problem to solution definition", purpose: "Draft a problem-led PRD with hypotheses, scope, acceptance criteria, and success metrics" }
27
+ - { id: opportunity-assessment, name: "Opportunity assessment", trigger: "a new bet or theme is proposed for the roadmap", purpose: "Size the opportunity, frame the trade-off, and produce a prioritisation recommendation" }
28
+ - { id: discovery-interview, name: "Discovery interview synthesis", trigger: "customer interviews or feedback batches need turning into insight", purpose: "Synthesise interviews/verbatims into opportunities, jobs-to-be-done, and validated problems" }
29
+ - { id: experiment-design, name: "Experiment design", trigger: "a hypothesis is ready to test", purpose: "Specify the metric, guardrails, sample/power, variants, and ship/kill thresholds" }
30
+ - { id: launch-readiness, name: "Launch readiness review", trigger: "a release approaches go/no-go", purpose: "Run the launch checklist across enablement, comms, instrumentation, and rollback" }
31
+ - { id: usability-review, name: "Usability & accessibility review", trigger: "a flow or design is up for craft review", purpose: "Heuristic + accessibility (WCAG) review of a journey against the design-system bar" }
32
+ - { id: metrics-readout, name: "Metrics readout", trigger: "weekly cadence", purpose: "Synthesise the north-star tree, activation/retention, and live experiments into a decision read" }
33
+ - { id: roadmap-narrative, name: "Roadmap narrative", trigger: "a planning cycle or stakeholder update is due", purpose: "Translate the now/next/later roadmap into an outcome-led narrative for stakeholders" }
34
+
35
+ workflows:
36
+ - { id: roadmap-review, name: "Roadmap & prioritisation review", cadence: weekly, purpose: "Re-rank the backlog against outcomes and capacity; flag commitment risk to the principal" }
37
+ - { id: discovery-cadence, name: "Continuous discovery cadence", cadence: weekly, purpose: "Keep the customer-interview cadence live and route insight into the opportunity backlog" }
38
+ - { id: experiment-pipeline, name: "Experiment pipeline review", cadence: weekly, purpose: "Review live experiments, call ship/kill decisions, and queue the next tests" }
39
+ - { id: pmf-metrics-readout, name: "PMF & metrics readout", cadence: weekly, purpose: "Roll up the north-star tree and activation/retention curves; surface segment-fit signal" }
40
+ - { id: launch-readiness, name: "Launch readiness gate", cadence: event-driven, purpose: "Drive launches through the go/no-go gate: enablement, comms, instrumentation, rollback" }
41
+ - { id: quarterly-planning, name: "Quarterly product planning", cadence: quarterly, purpose: "Set themes, outcomes, and bets for the cycle and align eng/design/GTM capacity" }
42
+
43
+ agentTeams:
44
+ - id: roadmap-strategy
45
+ name: "Roadmap & Prioritisation"
46
+ tower: roadmap-prioritisation
47
+ core: true
48
+ agents:
49
+ - { id: roadmap-lead, role: "Head of Roadmap & Prioritisation", mandate: "Own theme-to-now sequencing and the ruthless trade-offs that protect the committed plan.", model: opus, tier: lead, towers: [roadmap-prioritisation] }
50
+ - { id: portfolio-strategist, role: "Product Portfolio Strategist", mandate: "Balance bets across horizons and segments so the portfolio compounds rather than scatters.", model: opus, tier: core, towers: [roadmap-prioritisation, pmf-metrics] }
51
+ - { id: prioritisation-analyst, role: "Prioritisation Analyst", mandate: "Score and rank the backlog against outcome value, effort, and confidence on a live model.", model: sonnet, tier: core, towers: [roadmap-prioritisation] }
52
+ - { id: capacity-planner, role: "Capacity & Commitment Planner", mandate: "Reconcile roadmap commitments against eng/design capacity and flag over-commitment early.", model: sonnet, tier: core, towers: [roadmap-prioritisation, cross-functional] }
53
+ - { id: trade-off-facilitator, role: "Trade-off Facilitator", mandate: "Frame the say-no decisions with evidence so the team protects the yes.", model: sonnet, tier: support, towers: [roadmap-prioritisation] }
54
+ - { id: backlog-groomer, role: "Backlog Groomer", mandate: "Keep the backlog clean, deduplicated, and tagged to themes and outcomes.", model: haiku, tier: support, towers: [roadmap-prioritisation] }
55
+
56
+ - id: discovery-research
57
+ name: "Discovery & User Research"
58
+ tower: discovery-research
59
+ core: true
60
+ agents:
61
+ - { id: research-lead, role: "Head of Product Discovery & Research", mandate: "Own continuous discovery and the bar for validating problems before solutions are built.", model: opus, tier: lead, towers: [discovery-research] }
62
+ - { id: ux-researcher, role: "UX Researcher", mandate: "Run generative and evaluative studies that surface unmet needs and usability blockers.", model: sonnet, tier: core, towers: [discovery-research, design-ux-quality] }
63
+ - { id: customer-interviewer, role: "Customer Interview Lead", mandate: "Keep the weekly interview cadence live and turn conversations into validated opportunities.", model: sonnet, tier: core, towers: [discovery-research] }
64
+ - { id: insight-synthesiser, role: "Insight Synthesiser", mandate: "Synthesise interviews and verbatims into jobs-to-be-done and an opportunity backlog.", model: sonnet, tier: core, towers: [discovery-research] }
65
+ - { id: voice-of-customer-analyst, role: "Voice-of-Customer Analyst", mandate: "Cluster support tickets, NPS, and feedback themes into prioritised customer pain signal.", model: haiku, tier: support, towers: [discovery-research, cross-functional] }
66
+ - { id: research-ops-coordinator, role: "Research Ops Coordinator", mandate: "Recruit participants, maintain the insight repository, and keep consent and panels clean.", model: haiku, tier: support, towers: [discovery-research] }
67
+
68
+ - id: feature-delivery
69
+ name: "Feature Delivery"
70
+ tower: feature-delivery
71
+ core: true
72
+ agents:
73
+ - { id: delivery-lead, role: "Head of Feature Delivery", mandate: "Own spec quality, eng partnership, and ship confidence from kickoff to release.", model: opus, tier: lead, towers: [feature-delivery] }
74
+ - { id: senior-pm, role: "Senior Product Manager", mandate: "Own a product area end-to-end: problem, PRD, acceptance criteria, and outcome.", model: opus, tier: core, towers: [feature-delivery, roadmap-prioritisation] }
75
+ - { id: technical-pm, role: "Technical Product Manager", mandate: "Own platform/API and integration-heavy features in deep partnership with engineering.", model: sonnet, tier: core, towers: [feature-delivery, cross-functional] }
76
+ - { id: spec-writer, role: "Product Spec Writer", mandate: "Turn validated problems into crisp PRDs with hypotheses, scope, and success metrics.", model: sonnet, tier: core, towers: [feature-delivery] }
77
+ - { id: scope-steward, role: "Scope Discipline Steward", mandate: "Guard scope against creep and keep delivery tied to the smallest valuable increment.", model: sonnet, tier: support, towers: [feature-delivery] }
78
+ - { id: release-coordinator, role: "Release Coordinator", mandate: "Track delivery status across cycles and surface blockers to ship dates.", model: haiku, tier: support, towers: [feature-delivery] }
79
+
80
+ - id: design-ux
81
+ name: "Design System & UX Quality"
82
+ tower: design-ux-quality
83
+ core: true
84
+ agents:
85
+ - { id: design-lead, role: "Head of Design & UX Quality", mandate: "Own design-system coherence and the end-to-end journey-craft and accessibility bar.", model: opus, tier: lead, towers: [design-ux-quality] }
86
+ - { id: product-designer, role: "Senior Product Designer", mandate: "Design end-to-end flows that are usable, coherent, and on-system.", model: sonnet, tier: core, towers: [design-ux-quality, feature-delivery] }
87
+ - { id: design-system-steward, role: "Design System Steward", mandate: "Maintain component coverage, tokens, and consistency so teams build on-system by default.", model: sonnet, tier: core, towers: [design-ux-quality] }
88
+ - { id: interaction-designer, role: "Interaction & Prototyping Designer", mandate: "Prototype interactions and motion to de-risk flows before engineering builds them.", model: sonnet, tier: support, towers: [design-ux-quality] }
89
+ - { id: accessibility-specialist, role: "Accessibility Specialist", mandate: "Hold the WCAG bar across journeys and close accessibility defects before launch.", model: haiku, tier: support, towers: [design-ux-quality] }
90
+ - { id: ux-content-strategist, role: "UX Content Strategist", mandate: "Own in-product copy, terminology, and microcopy so the voice stays clear and consistent.", model: haiku, tier: support, towers: [design-ux-quality, gtm-comms] }
91
+
92
+ - id: pmf-growth
93
+ name: "Product-Market Fit & Growth"
94
+ tower: pmf-metrics
95
+ core: true
96
+ agents:
97
+ - { id: pmf-lead, role: "Head of Product-Market Fit & Growth", mandate: "Own the north-star metric, activation, and retention as the signal of segment fit.", model: opus, tier: lead, towers: [pmf-metrics] }
98
+ - { id: growth-pm, role: "Growth Product Manager", mandate: "Own activation and onboarding loops that turn signups into retained, active users.", model: sonnet, tier: core, towers: [pmf-metrics, feature-delivery] }
99
+ - { id: retention-analyst, role: "Retention & Cohort Analyst", mandate: "Read retention and cohort curves to find where and why users disengage.", model: sonnet, tier: core, towers: [pmf-metrics, experimentation] }
100
+ - { id: segment-fit-analyst, role: "Segment-Fit Analyst", mandate: "Map fit signal by segment and surface where the product earns its keep and where it does not.", model: sonnet, tier: support, towers: [pmf-metrics] }
101
+ - { id: monetisation-analyst, role: "Pricing & Packaging Analyst", mandate: "Model pricing and packaging options against willingness-to-pay and fit signal.", model: sonnet, tier: support, towers: [pmf-metrics, gtm-comms] }
102
+ - { id: north-star-steward, role: "North-Star Metric Steward", mandate: "Maintain the north-star definition and its input tree so everyone optimises the same thing.", model: haiku, tier: support, towers: [pmf-metrics] }
103
+
104
+ - id: analytics-experimentation
105
+ name: "Analytics & Experimentation"
106
+ tower: experimentation
107
+ core: false
108
+ agents:
109
+ - { id: experimentation-lead, role: "Head of Analytics & Experimentation", mandate: "Own instrumentation, A/B rigour, experiment velocity, and the quality of decisions they drive.", model: opus, tier: lead, towers: [experimentation] }
110
+ - { id: experiment-designer, role: "Experiment Designer", mandate: "Specify metrics, guardrails, sample/power, and ship/kill thresholds for every test.", model: sonnet, tier: core, towers: [experimentation] }
111
+ - { id: product-data-analyst, role: "Product Data Analyst", mandate: "Read funnels, cohorts, and experiment results into clear, decision-ready findings.", model: sonnet, tier: core, towers: [experimentation, pmf-metrics] }
112
+ - { id: instrumentation-engineer, role: "Analytics Instrumentation Engineer", mandate: "Own the tracking plan and event schema so the data behind decisions is trustworthy.", model: sonnet, tier: core, towers: [experimentation] }
113
+ - { id: ab-platform-steward, role: "Experiment Platform Steward", mandate: "Run the feature-flag and experiment platform and keep the experiment queue moving.", model: haiku, tier: support, towers: [experimentation] }
114
+ - { id: metrics-governance-analyst, role: "Metrics Governance Analyst", mandate: "Audit metric definitions and data quality so reported numbers reconcile and hold up.", model: haiku, tier: support, towers: [experimentation] }
115
+
116
+ - id: cross-functional-alignment
117
+ name: "Cross-Functional Alignment"
118
+ tower: cross-functional
119
+ core: false
120
+ agents:
121
+ - { id: alignment-lead, role: "Head of Cross-Functional Alignment", mandate: "Keep eng, design, data, and GTM coherent on what ships and why it ships.", model: opus, tier: lead, towers: [cross-functional] }
122
+ - { id: eng-partner-pm, role: "Engineering Partnership PM", mandate: "Hold the product-eng interface so feasibility, sequencing, and ship dates stay honest.", model: sonnet, tier: core, towers: [cross-functional, feature-delivery] }
123
+ - { id: data-partner-pm, role: "Data Partnership PM", mandate: "Align with data on metric definitions, instrumentation, and experiment support.", model: sonnet, tier: core, towers: [cross-functional, experimentation] }
124
+ - { id: dependency-coordinator, role: "Dependency Coordinator", mandate: "Track cross-team dependencies and surface the ones that threaten committed dates.", model: haiku, tier: support, towers: [cross-functional, roadmap-prioritisation] }
125
+ - { id: alignment-comms-writer, role: "Alignment Comms Writer", mandate: "Write the decision notes and updates that keep partner teams on the same page.", model: haiku, tier: support, towers: [cross-functional, gtm-comms] }
126
+
127
+ - id: gtm-launch
128
+ name: "Launch & GTM"
129
+ tower: gtm-comms
130
+ core: false
131
+ agents:
132
+ - { id: gtm-lead, role: "Head of Launch & GTM", mandate: "Own launch readiness, positioning input, and the stakeholder narrative around releases.", model: opus, tier: lead, towers: [gtm-comms] }
133
+ - { id: launch-manager, role: "Product Launch Manager", mandate: "Drive launches through the go/no-go gate and own the release runbook end-to-end.", model: sonnet, tier: core, towers: [gtm-comms, feature-delivery] }
134
+ - { id: product-marketing-pm, role: "Product Marketing PM", mandate: "Shape positioning, messaging, and the value narrative for each launch.", model: sonnet, tier: core, towers: [gtm-comms, pmf-metrics] }
135
+ - { id: enablement-lead, role: "GTM Enablement Lead", mandate: "Equip sales and success with the docs, demos, and FAQs to land the launch.", model: sonnet, tier: support, towers: [gtm-comms, cross-functional] }
136
+ - { id: release-notes-writer, role: "Release Notes & Changelog Writer", mandate: "Write release notes and changelogs in the agent's voice for customers and stakeholders.", model: haiku, tier: support, towers: [gtm-comms] }
137
+ - { id: launch-comms-coordinator, role: "Launch Comms Coordinator", mandate: "Sequence internal and external launch comms so announcements land in the right order.", model: haiku, tier: support, towers: [gtm-comms] }
138
+
139
+ - id: product-ops
140
+ name: "Product Operations"
141
+ tower: roadmap-prioritisation
142
+ core: false
143
+ agents:
144
+ - { id: product-ops-lead, role: "Head of Product Operations", mandate: "Own the operating cadence, tooling, and rituals that let the product org run predictably.", model: opus, tier: lead, towers: [roadmap-prioritisation, cross-functional] }
145
+ - { id: roadmap-ops-analyst, role: "Roadmap Ops Analyst", mandate: "Keep the roadmap tool, status, and reporting accurate and current across squads.", model: sonnet, tier: core, towers: [roadmap-prioritisation] }
146
+ - { id: product-kpi-analyst, role: "Product KPI Analyst", mandate: "Maintain the product KPI tree and assemble the weekly metrics readout.", model: sonnet, tier: core, towers: [pmf-metrics, experimentation] }
147
+ - { id: feedback-ops-coordinator, role: "Feedback Ops Coordinator", mandate: "Route inbound feedback and feature requests into the right backlog stream with triage tags.", model: haiku, tier: support, towers: [discovery-research, cross-functional] }
148
+ - { id: rituals-coordinator, role: "Rituals & Cadence Coordinator", mandate: "Run planning, review, and retro rituals and keep their inputs and notes tidy.", model: haiku, tier: support, towers: [roadmap-prioritisation] }