@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,74 @@
1
+ ---
2
+ name: hiring-triage
3
+ description: Review new job applications, AI screen candidates, draft advancement/rejection messages, and produce hiring pipeline status. Use when processing new applicants or reviewing hiring pipeline.
4
+ ---
5
+
6
+ # Hiring Triage
7
+
8
+ You are {{agent.fullName}}, {{agent.title}}. Process job applications and manage the hiring pipeline.
9
+
10
+ ## Data Sources
11
+
12
+ 1. **New applications** — Check `inputs/hiring/new-applications/` for recently received resumes and cover letters.
13
+ 2. **Open roles** — Read `config/hiring/open-roles.md` for current positions, requirements, and screening criteria.
14
+ 3. **Pipeline state** — Read `memory/workstreams/hiring.md` for current pipeline status and candidate tracking.
15
+ 4. **Screening rubrics** — Read `config/hiring/screening-rubrics.md` for role-specific evaluation criteria.
16
+ 5. **Templates** — Use templates from `templates/hiring/` for advancement and rejection messages.
17
+
18
+ ## Screening Process
19
+
20
+ For each new application:
21
+
22
+ 1. **Parse resume** — Extract key data: name, current role, experience years, relevant skills, education, location.
23
+ 2. **Score against rubric** — Evaluate on the role-specific criteria (technical skills, domain experience, culture signals, location/timezone fit).
24
+ 3. **Classify** into one of:
25
+ - **Advance** — Meets or exceeds criteria, schedule next step
26
+ - **Maybe** — Partially meets criteria, flag for CEO review
27
+ - **Reject** — Does not meet minimum criteria
28
+
29
+ 4. **Draft communications**:
30
+ - Advance: Draft scheduling email for next interview round
31
+ - Maybe: Draft summary memo for {{agent.principal.firstName}} with pros/cons
32
+ - Reject: Draft polite, personalized rejection email
33
+
34
+ ## Output Format
35
+
36
+ ```
37
+ # Hiring Triage — [DATE]
38
+
39
+ ## New Applications Processed: [count]
40
+
41
+ ### Advance ([count])
42
+ | Candidate | Role | Score | Key Strengths | Next Step |
43
+ |---|---|---|---|---|
44
+ | [Name] | [Role] | [X/10] | [brief] | [action] |
45
+
46
+ ### CEO Review ([count])
47
+ | Candidate | Role | Score | Question for {{agent.principal.firstName}} |
48
+ |---|---|---|---|
49
+ | [Name] | [Role] | [X/10] | [what needs deciding] |
50
+
51
+ ### Rejected ([count])
52
+ - [Name] — [Role] — [one-line reason]
53
+
54
+ ## Pipeline Summary
55
+ | Role | Applied | Screening | Interview | Offer | Filled |
56
+ |---|---|---|---|---|---|
57
+ | [Role] | [n] | [n] | [n] | [n] | [n] |
58
+
59
+ ## Draft Messages Ready
60
+ [Include all draft emails below, labeled by candidate]
61
+ ```
62
+
63
+ ## Output
64
+
65
+ 1. Write report to `outputs/hiring/triage-YYYY-MM-DD.md`.
66
+ 2. Update `memory/workstreams/hiring.md` with new pipeline numbers.
67
+ 3. Save draft messages to `outputs/hiring/drafts/`.
68
+ 4. Present summary in conversation.
69
+
70
+ ## Rules
71
+
72
+ - Never auto-send rejection emails without {{agent.principal.firstName}}'s batch approval.
73
+ - Flag any candidate referred by a known contact as P1 regardless of score.
74
+ - Preserve all original application materials — never delete inputs.
@@ -0,0 +1,61 @@
1
+ ---
2
+ name: inbox-triage
3
+ description: Triage all inbound communications across Slack, Gmail, and WhatsApp. Classify by urgency, draft responses, flag items for CEO attention. Use Gmail MCP and Slack MCP when available.
4
+ ---
5
+
6
+ # Inbox Triage
7
+
8
+ You are {{agent.fullName}}, {{agent.title}}. Triage all inbound communications and surface what matters.
9
+
10
+ ## Data Sources
11
+
12
+ 1. **Gmail** — Use Gmail MCP (`mcp__gmail`) to fetch unread emails. If MCP is unavailable, check `inputs/email/` for any manually forwarded items.
13
+ 2. **Slack** — Use Slack MCP (`mcp__slack`) to check unread messages and mentions. If unavailable, check `inputs/slack/` for exports.
14
+ 3. **WhatsApp / Other** — Check `inputs/whatsapp/` and `inputs/misc/` for any forwarded messages.
15
+ 4. **Read priority contacts** from `config/contacts.md` to understand VIP senders and relationship context.
16
+
17
+ ## Triage Classification
18
+
19
+ Classify every inbound item into one of four categories:
20
+
21
+ | Category | Criteria | Action |
22
+ | ----------------------- | ------------------------------------------------------- | ---------------------------------------------------------- |
23
+ | **P0 — CEO Now** | Time-sensitive, high-stakes, requires {{agent.principal.firstName}} personally | Flag immediately, draft context summary |
24
+ | **P1 — CEO Today** | Important but not urgent, needs CEO input within 24h | Queue with draft response for review |
25
+ | **P2 — Agent Handles** | Routine coordination, scheduling, follow-ups | Draft and send (internal) or draft for approval (external) |
26
+ | **P3 — Archive** | FYI, newsletters, low-priority notifications | Log and archive, no action needed |
27
+
28
+ ## Processing Rules
29
+
30
+ - **Never send external communications** without {{agent.principal.firstName}}'s explicit approval.
31
+ - **Internal routine** (scheduling, coordination with known team) can be handled directly.
32
+ - **Unknown senders** — research context before classifying. Check LinkedIn, company records, prior correspondence.
33
+ - **Investor communications** are always P0 or P1.
34
+ - **Legal/regulatory** items are always P1 or higher.
35
+
36
+ ## Output Format
37
+
38
+ ```
39
+ # Inbox Triage — [DATE] [TIME]
40
+
41
+ ## P0 — Needs You Now ([count])
42
+ - **[Sender]** via [channel]: [subject/summary] — [recommended action]
43
+
44
+ ## P1 — Needs You Today ([count])
45
+ - **[Sender]** via [channel]: [subject/summary] — [draft response attached]
46
+
47
+ ## P2 — Agent Handling ([count])
48
+ - **[Sender]** via [channel]: [action taken or planned]
49
+
50
+ ## P3 — Archived ([count])
51
+ - [summary line]
52
+
53
+ ## Draft Responses Ready for Review
54
+ [For each P1 item, include the draft response below]
55
+ ```
56
+
57
+ ## Output
58
+
59
+ 1. Write triage report to `outputs/triage/inbox-triage-YYYY-MM-DD-HHMM.md`.
60
+ 2. Update `memory/executive/open-loops.md` with any new items requiring follow-up.
61
+ 3. Present the triage summary in conversation.
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: mail-triage
3
+ description: Work an org mailbox like the human Inbox app — list entitled mailboxes, triage threads (priority, category, assignment, read state), file and move, save drafts, and send through the governed path where holds land in a guardian's approvals queue. Use when asked to clear an inbox, chase a thread, or reply from a workspace mailbox.
4
+ ---
5
+
6
+ # Mail Triage
7
+
8
+ The org's workspace mail is a governed surface, not raw SMTP. Every agent seat sees
9
+ exactly the mailboxes it is *entitled* to — its own, shared mailboxes, and agent
10
+ mailboxes it guards — and every outbound ride goes through the same domain layer the
11
+ human Inbox app uses: mailbox rules compile to typed policy, guarded mailboxes HOLD
12
+ agent sends for a human signature, and every consequential verb lands on the ledger.
13
+
14
+ Everything below is `executeOrgTool` over the curated mail-desk tools
15
+ (`lib/org/tool-surface.mjs`). All calls are fail-open: a disabled org or missing
16
+ credential returns an `{ok:false, error}` frame, never a throw.
17
+
18
+ ## The triage loop
19
+
20
+ 1. **Which mailboxes am I working?**
21
+
22
+ ```bash
23
+ node --input-type=module -e '
24
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
25
+ const res = await executeOrgTool("email_mailboxes", {});
26
+ console.log(JSON.stringify(res, null, 2));
27
+ '
28
+ ```
29
+
30
+ 2. **Thread rows for one mailbox** — `email_threads` `{mailboxId, folder?, unreadOnly?, q?, cursor?}`
31
+ gives the triage-level rows (from, subject, snippet, priority, tags, held state).
32
+
33
+ 3. **Read a thread** — `email_thread_messages` `{mailboxId, threadId}` returns every
34
+ message with bodies. (Own-mailbox quick reads: `email_inbox` / `email_message` /
35
+ `email_thread`.)
36
+
37
+ 4. **Triage verbs** — one write, `email_triage`: assignment, priority, category,
38
+ tags, star, read state. Placement is `email_move`: custom folder, back to inbox,
39
+ archive, snooze, soft-delete/restore.
40
+
41
+ ```bash
42
+ node --input-type=module -e '
43
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
44
+ console.log(JSON.stringify(await executeOrgTool("email_triage", { mailboxId: "MB", threadId: "T", priority: "P1", read: true })));
45
+ '
46
+ ```
47
+
48
+ ## Replying — the governed send
49
+
50
+ `email_draft_save` creates/updates a COMPOSING draft (idempotent by `draftId`);
51
+ `email_draft_send` sends from ANY entitled mailbox through the governance path.
52
+ **A hold is a normal result, not an error**: on a guarded mailbox or a tripped rule
53
+ you get `{status:"held", draftId, policyCite}` and the draft lands in the guardian's
54
+ approvals queue — never a silent send, never a bypass. Report the hold honestly and
55
+ stop; the guardian signs or returns it.
56
+
57
+ In interactive agent-repo sessions the MCP-plane send tools are hook-blocked
58
+ (`.claude/settings.json`); your own-mailbox CLI lane is
59
+ `node scripts/org/send-orgmail.mjs --thread "<thread_id>" --body-file <path>`.
60
+
61
+ ## The guardian lane (agent mailboxes you guard)
62
+
63
+ The long tail rides `org_rpc` (validated against the protocol table before any
64
+ network): `email.approvals` (the held queue with tripping rule + policy cite +
65
+ grounding + cost), `email.approve`, `email.approveAll` (charter-§ items refuse and
66
+ say why), `email.return` (send back with a note), `email.amend` (edit + send),
67
+ `email.redirect`, `email.delegate`, `email.holdReplies` (per-thread signature
68
+ switch).
69
+
70
+ Rules and hygiene live there too: `email.rules` / `email.ruleSave` /
71
+ `email.ruleSetEnabled` / `email.triageNow` (deterministic re-run, no model),
72
+ `email.markAllRead`, `email.folderRename` / `email.folderDelete`,
73
+ `email.signatures` / `email.signatureSave` / `email.signatureDelete`,
74
+ `email.undoSend` (honest: only while QUEUED), `email.draftDiscard`, `email.drafts`.
75
+
76
+ Cross-surface verbs: `email.fileAttachment` files an attachment into the workspace
77
+ drive as a REAL WorkspaceFile with provenance; `email.extractAction` runs the
78
+ triage extractor (SANDBOX-labelled, can create real board tasks);
79
+ `email.logDecision` signs a thread into the decision registry.
80
+
81
+ ## Rules of the desk
82
+
83
+ - Never claim a held message was sent. `held` means held.
84
+ - Triage freely; sends deserve a second look at recipient + tone
85
+ (`policies/communication-style.md` applies to mail like everything else).
86
+ - Every send/approve/return is ledgered server-side — cite the thread, not memory.
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: morning-brief
3
+ description: Produce the CEO Morning Brief — priorities, overnight developments, open loops, workstream pulse. Use when the principal asks for his brief or at scheduled time.
4
+ ---
5
+
6
+ # CEO Morning Brief
7
+
8
+ You are {{agent.fullName}}, {{agent.title}}. Produce the daily CEO Morning Brief for {{agent.principal.firstName}}.
9
+
10
+ ## Data Gathering
11
+
12
+ 1. **Read executive memory** from `memory/executive/priorities.md` and `memory/executive/open-loops.md` to understand current priorities and outstanding items.
13
+ 2. **Check workstream status** by reading the latest files in `memory/workstreams/` for each active domain (acquisitions, regulatory, hiring, product, finance).
14
+ 3. **Scan overnight developments** — review `inputs/overnight/` for any flagged items, emails, Slack messages, or alerts that arrived since the last brief.
15
+ 4. **Check calendar** using Google Calendar MCP (when available) to pull today's meetings and commitments.
16
+ 5. **Read prior brief** from `outputs/briefs/daily/` to ensure continuity and follow-up on yesterday's items.
17
+
18
+ ## Brief Structure
19
+
20
+ Produce the brief in this exact format:
21
+
22
+ ```
23
+ # Morning Brief — [DATE]
24
+
25
+ ## Top 3 Priorities Today
26
+ - [Priority with context and why it matters today]
27
+
28
+ ## Overnight Developments
29
+ - [Anything that happened since yesterday's wrap that needs attention]
30
+
31
+ ## Open Loops Requiring Attention
32
+ - [Items awaiting CEO decision or action, with days open]
33
+
34
+ ## Workstream Pulse
35
+ | Workstream | Status | Key Item |
36
+ |---|---|---|
37
+ | [domain] | [green/yellow/red] | [one-liner] |
38
+
39
+ ## Today's Calendar
40
+ - [Time] — [Meeting/commitment]
41
+
42
+ ## {{agent.firstName}}'s Recommendation
43
+ [One paragraph: what to focus on, what to delegate, what to defer]
44
+ ```
45
+
46
+ ## Output
47
+
48
+ 1. Write the completed brief to `outputs/briefs/daily/morning-brief-YYYY-MM-DD.md`.
49
+ 2. Also overwrite `outputs/briefs/daily/morning-brief-latest.md` with the same content for quick access.
50
+ 3. Present the brief directly in the conversation.
51
+
52
+ ## Tone
53
+
54
+ Crisp, direct, no filler. Lead with what matters. Flag risks early. {{agent.principal.firstName}} reads this in 2 minutes — make every line count.
@@ -0,0 +1,157 @@
1
+ ---
2
+ name: native-artifacts
3
+ description: The org's native artifact classes — mail draft review, governance approvals and decisions, books (bills, payment runs, pay runs, invoices, bank matching), file access lists, CRM held terms, board task grids, calendar RSVPs. Use when a conversation should surface one of these domain cards, or when you need to read or act on one programmatically.
4
+ ---
5
+
6
+ # Native Artifacts
7
+
8
+ Native artifacts are the org-shipped generative-UI classes: domain cards (an
9
+ approval, a payment run, an RSVP) rendered in channel feeds with real buttons. They
10
+ obey the **two-sided law**: every button a human sees is equally invocable by an
11
+ agent through `artifact_act`, with the **same params schema** the human click sends
12
+ — there is no human-only action. The `generative-ui` skill covers the envelope and
13
+ block vocabulary; this one covers the native catalog and how to act on it.
14
+
15
+ ## Fetch the catalog — it is the source of truth
16
+
17
+ Class names, envelope versions, action names, params schemas, confirmation and gate
18
+ requirements all come from `artifact_catalog` at runtime. **Never hardcode an action
19
+ name from memory** — read the descriptor, then act.
20
+
21
+ ```bash
22
+ node --input-type=module -e '
23
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
24
+ const res = await executeOrgTool("artifact_catalog", {});
25
+ if (!res.ok) { console.log(JSON.stringify(res)); process.exit(0); }
26
+ for (const c of res.result.classes) {
27
+ console.log(`${c.class}@${c.version} — ${c.title}`);
28
+ for (const a of c.actions) console.log(` ${a.name} [${a.kind}] audience=${a.audience}${a.gate ? " GATED" : ""}`);
29
+ }
30
+ '
31
+ ```
32
+
33
+ Each action descriptor: `{name, label, kind (primary|secondary|ghost|destructive),
34
+ description?, params? (JSON Schema for the act params), confirm?, gate?, audience
35
+ (both|human|agent), roles?}`.
36
+
37
+ ## Wave-1 classes
38
+
39
+ What ships in the native catalog today, and when each card appears:
40
+
41
+ | Class | The card |
42
+ | --- | --- |
43
+ | `mail.draft_review` | an agent-drafted email held for review before send |
44
+ | `governance.approval` | a held approval request awaiting approve/deny |
45
+ | `governance.decision_review` | a proposed decision to sign or comment |
46
+ | `books.bill_approval` | a payable bill awaiting approval |
47
+ | `books.payment_run` | a batched payment run with its line items |
48
+ | `books.pay_run` | a payroll run awaiting sign-off |
49
+ | `books.invoice_review` | an outbound invoice to review before it goes out |
50
+ | `books.bank_match` | bank-transaction match suggestions to confirm |
51
+ | `files.access_list` | a file/folder access list with grant/revoke |
52
+ | `crm.held_terms` | deal terms held for review before commitment |
53
+ | `board.task_grid` | a grid of board tasks with claim/update actions |
54
+ | `calendar.event_rsvp` | an event invitation with RSVP choices |
55
+
56
+ Typical actions per class (approve/deny, send/edit/discard, confirm/reject,
57
+ accept/decline/tentative, claim/update) are whatever the catalog lists — the exact
58
+ `name` strings and params live in the descriptors, and classes are versioned, so a
59
+ catalog read before acting is never wasted.
60
+
61
+ ## Finding and reading a card
62
+
63
+ ```bash
64
+ node --input-type=module -e '
65
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
66
+ const list = await executeOrgTool("artifact_list", { channelId: "CHANNEL_ID", class: "governance.approval", state: "complete" });
67
+ console.log(JSON.stringify(list, null, 2)); // {items:[…]} newest first
68
+ const one = await executeOrgTool("artifact_get", { artifactId: "ART_ID" });
69
+ console.log(JSON.stringify(one, null, 2)); // row incl. envelope/state/class/messageId/channelId
70
+ '
71
+ ```
72
+
73
+ The row's `envelope.actions` are the live descriptors for THAT card (the catalog is
74
+ the class-level template) — prefer them when both exist, since a card can disable or
75
+ narrow actions.
76
+
77
+ ## Worked example: approve a held approval
78
+
79
+ ```bash
80
+ node --input-type=module -e '
81
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
82
+ const key = "approve-ART_ID"; // stable: retries + approval re-invoke reuse it
83
+ const res = await executeOrgTool("artifact_act", {
84
+ artifactId: "ART_ID",
85
+ action: "approve", // exact name from the descriptor
86
+ params: { note: "Within budget; matches the signed SOW." },
87
+ idempotencyKey: key,
88
+ });
89
+ console.log(JSON.stringify(res, null, 2));
90
+ '
91
+ ```
92
+
93
+ Outcomes to handle:
94
+
95
+ - `{ok:true, result:{…}}` — the action ran; the card patches itself to
96
+ `state:"acted"` with a `confirmationRow`/receipt.
97
+ - `{ok:true, result:{replay:true, …}}` — you (or a retry) already ran this key;
98
+ the original outcome is echoed. Do not run again.
99
+ - `{ok:true, result:{held:true, approvalId}}` — the action is **gated** (see below).
100
+ - `{ok:false, error:{code:"FORBIDDEN_SCOPE"|…}}` — audience/role/scope enforcement;
101
+ the server is authoritative, do not retry around it.
102
+
103
+ ## Worked example: RSVP to an event
104
+
105
+ ```bash
106
+ node --input-type=module -e '
107
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
108
+ const res = await executeOrgTool("artifact_act", {
109
+ messageId: "MSG_ID", // addressing by the message works too
110
+ action: "accept",
111
+ idempotencyKey: "rsvp-MSG_ID-{{agent.repoSlug}}",
112
+ });
113
+ console.log(JSON.stringify(res));
114
+ '
115
+ ```
116
+
117
+ ## Gates and receipts
118
+
119
+ Some actions carry a `gate` in their descriptor (`{actionClass, floorCents?,
120
+ roles?}`) — financially or externally consequential moves (a payment run, a
121
+ first-contact send). Acting on one does not fail; it **holds**:
122
+
123
+ 1. `artifact_act` returns `{held:true, approvalId}` and the card shows an amber
124
+ held state.
125
+ 2. `approval_wait` the id (bounded ≤55s long-poll; loop while pending).
126
+ 3. On approval, re-invoke `artifact_act` with the **same** `idempotencyKey` — that
127
+ consumes the grant and executes exactly once. On denial, stop; a new key is not
128
+ a second chance.
129
+
130
+ ```bash
131
+ node --input-type=module -e '
132
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
133
+ const w = await executeOrgTool("approval_wait", { approvalId: "APPROVAL_ID" });
134
+ console.log(JSON.stringify(w)); // poll again while status is pending
135
+ '
136
+ ```
137
+
138
+ After any consequential action executes, the artifact's envelope gains a
139
+ **receipt** (who acted, when, the outcome — citing ledger ids) and transitions to
140
+ `state:"acted"` — `artifact_get` the row when you need to confirm or report what
141
+ happened. Receipts and the chain events behind them are the audit trail; never
142
+ claim an action happened without one. State transitions are registry-governed:
143
+ where a class allows it, an acted card exposes undo (`acted → complete`) and an
144
+ expired one a refresh — those too are just catalog actions.
145
+
146
+ ## Notes
147
+
148
+ - Agents can POST native-class cards too, not just act on them: compose the
149
+ envelope with `class`/`version` from the catalog and `artifact_create` it (see
150
+ the `generative-ui` skill for envelope composition).
151
+ - `audience:"agent"` actions exist — machinery humans never see. They show up in
152
+ the catalog and are invoked the same way.
153
+ - If every artifact tool returns `NOT_FOUND` mentioning the protocol family,
154
+ this install's vendored protocol predates artifacts — upgrade
155
+ `@cohortapp/agent-sdk`.
156
+ - When you report an action to a person, house voice
157
+ (`policies/communication-style.md`): plain prose, no filler, no emoji.
@@ -0,0 +1,133 @@
1
+ ---
2
+ name: org-board
3
+ description: Claim, complete, and hand off work on the shared org board — the cross-agent backlog the whole fleet pulls from. Use when you want work assigned by the org rather than your local queue, when you finish a claimed item, or when a task belongs to a different agent.
4
+ ---
5
+
6
+ # Org Board
7
+
8
+ The shared work board lives on the org's Cohort server, not on your machine. It is
9
+ the cross-agent backlog: any agent can publish work, the *ready frontier* shows what
10
+ is unblocked and unclaimed right now, and the server resolves claims atomically so two
11
+ agents never run the same item. Use it when work should be coordinated across the
12
+ fleet — your own private queue is still `state/` and unaffected by this.
13
+
14
+ Everything here is the agent-side client in `lib/org/board.mjs`. It is **fail-open**:
15
+ if the org is not configured (`org.cohort.enabled` in `config/collective.yaml`) or
16
+ Cohort is unreachable, every call returns an empty/error frame and you fall back to
17
+ local work — it never throws and never blocks you.
18
+
19
+ The board helpers take the connection explicitly as `{ base, token }` (unlike the
20
+ knowledge plane, which takes `{ cfg }`). Derive both from your config once with
21
+ `configFromAgent` and reuse them across calls:
22
+
23
+ ```bash
24
+ node --input-type=module -e '
25
+ import { configFromAgent } from "./lib/org/client.mjs";
26
+ import { loadConfig } from "./lib/collective/config.mjs";
27
+ const { enabled, base, token } = configFromAgent(await loadConfig(process.cwd()));
28
+ console.log(JSON.stringify({ enabled, base })); // enabled:false ⇒ org is off; work locally
29
+ '
30
+ ```
31
+
32
+ ## When to use
33
+
34
+ - You have free capacity and want the next org-prioritised item, not just your local queue.
35
+ - You just finished an item you claimed — mark it complete so the frontier advances.
36
+ - A task in front of you clearly belongs to another role — hand it off rather than do it yourself.
37
+ - A big item needs breaking down or assigning (you hold the decision right for it).
38
+
39
+ ## Reading the ready frontier
40
+
41
+ The frontier is the set of unblocked, unclaimed items. Read it, pick one, claim it.
42
+
43
+ ```bash
44
+ node --input-type=module -e '
45
+ import { ready } from "./lib/org/board.mjs";
46
+ import { configFromAgent } from "./lib/org/client.mjs";
47
+ import { loadConfig } from "./lib/collective/config.mjs";
48
+ const { base, token } = configFromAgent(await loadConfig(process.cwd()));
49
+ const items = await ready({ base, token });
50
+ console.log(JSON.stringify(items, null, 2));
51
+ '
52
+ ```
53
+
54
+ Run from your agent repo root so `config/collective.yaml` resolves. `ready()` returns
55
+ `[]` (never an error) when the org is off or unreachable.
56
+
57
+ ## Claiming an item
58
+
59
+ The server resolves the race **atomically** and hands you a lease. The loser of a race
60
+ gets a `CONFLICT` / `LEASE_HELD` error frame — that is normal; pick the next item.
61
+
62
+ ```bash
63
+ node --input-type=module -e '
64
+ import { claimItem } from "./lib/org/board.mjs";
65
+ import { configFromAgent } from "./lib/org/client.mjs";
66
+ import { loadConfig } from "./lib/collective/config.mjs";
67
+ const { base, token } = configFromAgent(await loadConfig(process.cwd()));
68
+ const res = await claimItem({ itemId: "ITEM_ID" }, { base, token });
69
+ console.log(JSON.stringify(res)); // {ok:true, result:{lease...}} | {ok:false, error:{code:"CONFLICT"}}
70
+ '
71
+ ```
72
+
73
+ If `res.ok` is false with `CONFLICT`/`LEASE_HELD`, someone beat you to it — do not
74
+ retry the same item; re-read the frontier and take a different one.
75
+
76
+ ## Completing an item
77
+
78
+ Completion is gated server-side (your lease token + a run-id CAS), so only the agent
79
+ that holds the live claim can close it. Attach a short `proof` (a link, a summary, an
80
+ artifact path) so the audit trail is meaningful.
81
+
82
+ ```bash
83
+ node --input-type=module -e '
84
+ import { completeItem } from "./lib/org/board.mjs";
85
+ import { configFromAgent } from "./lib/org/client.mjs";
86
+ import { loadConfig } from "./lib/collective/config.mjs";
87
+ const { base, token } = configFromAgent(await loadConfig(process.cwd()));
88
+ const res = await completeItem({ itemId: "ITEM_ID", proof: "PR #123 merged" }, { base, token });
89
+ console.log(JSON.stringify(res));
90
+ '
91
+ ```
92
+
93
+ ## Handing work off
94
+
95
+ When an item belongs to a different agent, do not silently drop it — send a structured
96
+ handoff. The envelope goes over the existing comms channels (Slack/email), so the
97
+ human chain sees every transfer; the receiving agent's daemon ingests it as a
98
+ provenance-tagged task. Use `lib/org/handoff.mjs#sendHandoff` with
99
+ `{ cfg, agentRoot, directory, to, itemId, intent, payload? }`:
100
+
101
+ ```bash
102
+ node --input-type=module -e '
103
+ import { sendHandoff } from "./lib/org/handoff.mjs";
104
+ import { readDirectory } from "./lib/org/registry.mjs";
105
+ import { loadConfig } from "./lib/collective/config.mjs";
106
+ const root = process.cwd();
107
+ const res = await sendHandoff({
108
+ cfg: await loadConfig(root),
109
+ agentRoot: root,
110
+ directory: readDirectory(root), // resolves "to" to an exact agent id
111
+ to: "mia-ai", // role/name/id — server resolves to agent_id
112
+ itemId: "ITEM_ID", // MANDATORY — a handoff attaches to a board item
113
+ intent: "needs engineering review",
114
+ });
115
+ console.log(JSON.stringify(res)); // { sent, target, runId, transport, via }
116
+ '
117
+ ```
118
+
119
+ A Cohort handoff attaches to a board work item, so `itemId` is required — without one
120
+ the call reports `cohort-handoff-requires-itemId` rather than sending a malformed
121
+ request. `res.runId` is the canonical key for any later accept/decline/cancel. For
122
+ sub-tasking or assigning an item you own, `decompose` / `assign` in `lib/org/board.mjs`
123
+ exist but are **governance-gated** — they only succeed if you hold the decision right,
124
+ and fail closed otherwise.
125
+
126
+ ## Notes
127
+
128
+ - `--input-type=module` lets you run inline ESM; or write a tiny `.mjs` and `node` it.
129
+ - The board is the *org* backlog. Your local queues, briefs, and reminders are
130
+ separate and unchanged.
131
+ - Never paper over a `CONFLICT` — it means the system worked. Move to the next item.
132
+ - When you report progress to a person, write in the house voice
133
+ (`policies/communication-style.md`): plain prose, no filler openers, no emoji.
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: org-credential
3
+ description: Understand how you get third-party provider keys (DeepSeek, Moonshot, OpenAI, …) from the org — they are leased automatically at spawn, never stored on your machine. Use when a provider key looks missing, a model fails with a credential error, or you need to explain where a key came from.
4
+ ---
5
+
6
+ # Org Credential Lease
7
+
8
+ You almost never call this yourself. The org keeps each third-party provider key
9
+ (DeepSeek, Moonshot, OpenAI, …) in **one** place — the Cohort credential vault — and
10
+ the LLM router **leases** the key it needs at spawn time, role-scoped and short-lived,
11
+ maps it into the child process env, and forgets it. The org key never lands on your
12
+ disk. This skill is mostly for understanding and diagnosing that flow.
13
+
14
+ ## The pattern (single source of truth)
15
+
16
+ - An admin sets each provider key **once** on Cohort (`cohort credential put
17
+ --provider <p>`), sealed at rest with AES-256-GCM, never logged.
18
+ - At spawn, `lib/model-router/org-credentials.mjs#resolveOrgCredentialEnv` walks the
19
+ router catalog. For every provider whose `auth_env` is **not already set locally**
20
+ and which the org has configured, it leases the plaintext (`credential.lease`),
21
+ caches it in-memory for its TTL, and returns an `envOverlay` the daemon merges into
22
+ the child env **before** routing.
23
+ - **Local always wins.** If you already have that key in your own env, the org is
24
+ never asked — your key is used.
25
+ - **Fail-open.** If Cohort is unreachable or disabled, you fall back to whatever
26
+ local env has. A genuinely missing key surfaces as the router's normal
27
+ `missing_credential`, not a crash.
28
+ - **Never persisted, never logged.** The leased value lives only in this process's
29
+ memory and the child env; it is never written to disk.
30
+
31
+ ## When to use
32
+
33
+ - A spawn failed with `missing_credential` for a provider you expected to be available.
34
+ - You want to confirm whether a provider key comes from your machine or the org.
35
+ - Someone asks where a model's API key lives (answer: in the org vault, leased per-spawn).
36
+
37
+ ## Diagnosing a missing key
38
+
39
+ 1. **Is the org enabled?** Check `org.cohort.enabled` in `config/collective.yaml` and
40
+ that `base`/token resolve. If the org is off, only locally-provisioned keys exist.
41
+
42
+ 2. **Are you paired?** Leasing needs your agent token (carrying the `credential.use`
43
+ scope). `maestro doctor` confirms the org binding; if pairing was revoked, an admin
44
+ re-pairs you (`cohort pair approve <agentId>`).
45
+
46
+ 3. **Has the admin set that provider?** Only an admin can `credential put` / `list`.
47
+ If the provider was never set (or was revoked), no agent can lease it — surface this
48
+ to the admin rather than trying to put it yourself (you are scope-rejected with
49
+ `FORBIDDEN_SCOPE`, by design).
50
+
51
+ 4. **Local override.** If you need to run before the org has the key, setting the
52
+ provider's `auth_env` in your own env makes local win and bypasses the lease.
53
+
54
+ ## What you cannot do
55
+
56
+ `credential put` / `list` / `revoke` are **admin-only** — an ordinary agent token is
57
+ rejected with `FORBIDDEN_SCOPE`. You can only `credential.lease`, and only for
58
+ providers the org has scoped to your role/agent. This is the security boundary, not a
59
+ bug: it is what keeps provider keys off every mini.
60
+
61
+ ## Notes
62
+
63
+ - Rotating a key is an admin action (`cohort credential put` again); you pick up the
64
+ new value automatically on your next lease — there is nothing to refresh by hand.
65
+ - Every put / lease / revoke is audited org-side (provider + agent + time, never the
66
+ value).
67
+ - This is the *org* credential broker (third-party provider keys). Your own secrets
68
+ use the local broker — see `maestro secrets …`.