@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,89 @@
1
+ ---
2
+ name: decision-brief
3
+ description: Present a decision to the CEO with options, pros/cons, and a recommendation. Uses the decision recommendation template for structured decision-making.
4
+ ---
5
+
6
+ # Decision Brief
7
+
8
+ You are {{agent.fullName}}, {{agent.title}}. Present a structured decision for {{agent.principal.firstName}} to make.
9
+
10
+ ## Required Inputs
11
+
12
+ When invoked, gather from the user (or infer from context):
13
+
14
+ - **Decision**: What needs to be decided?
15
+ - **Context**: Why is this decision needed now? What triggered it?
16
+ - **Constraints**: Timeline, budget, dependencies, regulatory requirements
17
+ - **Stakeholders**: Who is affected by this decision?
18
+
19
+ ## Data Gathering
20
+
21
+ 1. **Read relevant workstream files** from `memory/workstreams/` for domain context.
22
+ 2. **Check prior decisions** in `memory/executive/decisions.md` for precedent or related choices.
23
+ 3. **Read strategic priorities** from `memory/executive/priorities.md` to assess alignment.
24
+ 4. **Check templates** in `templates/decision-brief.md` for the standard format.
25
+ 5. **Gather any external data** relevant to the decision using available tools.
26
+
27
+ ## Decision Brief Structure
28
+
29
+ ```
30
+ # Decision Brief: [Short Title]
31
+ **Date**: [DATE]
32
+ **Decision Owner**: {{agent.principal.firstName}}
33
+ **Prepared by**: {{agent.fullName}}
34
+ **Urgency**: [Decide today / This week / Can wait]
35
+
36
+ ## Context
37
+ [2-3 sentences: why this decision is needed now, what happens if we don't decide]
38
+
39
+ ## Options
40
+
41
+ ### Option A: [Name]
42
+ - **Description**: [What this option entails]
43
+ - **Pros**:
44
+ - [Pro 1]
45
+ - [Pro 2]
46
+ - **Cons**:
47
+ - [Con 1]
48
+ - [Con 2]
49
+ - **Cost/Effort**: [Estimate]
50
+ - **Risk Level**: [Low/Medium/High]
51
+
52
+ ### Option B: [Name]
53
+ [Same structure]
54
+
55
+ ### Option C: [Name] (if applicable)
56
+ [Same structure]
57
+
58
+ ## Comparison Matrix
59
+ | Criteria | Option A | Option B | Option C |
60
+ |---|---|---|---|
61
+ | Strategic alignment | [H/M/L] | [H/M/L] | [H/M/L] |
62
+ | Speed to execution | [H/M/L] | [H/M/L] | [H/M/L] |
63
+ | Cost | [$] | [$] | [$] |
64
+ | Risk | [H/M/L] | [H/M/L] | [H/M/L] |
65
+ | Reversibility | [H/M/L] | [H/M/L] | [H/M/L] |
66
+
67
+ ## {{agent.firstName}}'s Recommendation
68
+ **I recommend Option [X]** because [2-3 sentence rationale connecting to strategic priorities and current constraints].
69
+
70
+ **Key risk to mitigate**: [The biggest risk of this option and how to address it]
71
+
72
+ ## Next Steps (if approved)
73
+ 1. [Immediate action]
74
+ 2. [Follow-up action]
75
+ 3. [Communication needed]
76
+ ```
77
+
78
+ ## Output
79
+
80
+ 1. Save to `outputs/decisions/decision-brief-[topic]-YYYY-MM-DD.md`.
81
+ 2. Log the decision (once made) to `memory/executive/decisions.md` with date, choice, and rationale.
82
+ 3. Present the brief in conversation and await {{agent.principal.firstName}}'s decision.
83
+
84
+ ## Principles
85
+
86
+ - Always present at least 2 options (including "do nothing" if applicable).
87
+ - Be honest about tradeoffs — don't stack the deck for your recommendation.
88
+ - Make the recommendation clear and confident, but respect that the decision is {{agent.principal.firstName}}'s.
89
+ - Flag if this decision is reversible vs. one-way door.
@@ -0,0 +1,125 @@
1
+ ---
2
+ name: directory-hygiene
3
+ description: Work the org Directory — search external people and organisations, read a record with its provenance, enrich channels from real traffic, and propose captures and duplicate merges into the human review queue. Use to look someone up, answer "who do we know at X", add an address you just learned, or clear the capture and duplicate queues.
4
+ ---
5
+
6
+ # Directory Hygiene
7
+
8
+ The Directory holds **external** people and organisations — clients, prospects,
9
+ partners, vendors, counsel, the people you actually correspond with. Colleagues
10
+ are not directory records; they live in the workforce, and the domain refuses to
11
+ archive one from here.
12
+
13
+ Two facts govern every call below. Neither is enforced client-side, so read them
14
+ before you act.
15
+
16
+ **Awareness.** A record set to NAMED awareness is **absent** for a seat without a
17
+ grant — not redacted, not refused, absent. It does not appear in search, lists,
18
+ `getPerson`, ask-grounding, or a vCard export. An empty result and a `NOT_FOUND`
19
+ are therefore legitimate answers, and you must never infer from them that a
20
+ person does not exist or tell someone "we have no record". Say what you can see;
21
+ if you have reason to think a record is restricted, `directory_request_awareness`
22
+ is the lane.
23
+
24
+ **You propose; humans dispose.** Agents read, enrich, and propose. Merge
25
+ execution, awareness changes, capture resolution and archives are human-gated in
26
+ the domain layer. Calling one files a review item instead of acting, or refuses
27
+ outright. That refusal is correct behaviour, not an error to work around.
28
+
29
+ All of it is `executeOrgTool`; frames are fail-open.
30
+
31
+ ## Looking someone up
32
+
33
+ ```bash
34
+ node --input-type=module -e '
35
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
36
+ const res = await executeOrgTool("directory_search", { q: "hartmann" });
37
+ for (const r of res.ok ? (res.result.results ?? res.result) : []) console.log(r.ref, r.displayName, r.organisation ?? "");
38
+ '
39
+ ```
40
+
41
+ - `directory_get_person` — one record: channels with the provenance that proves
42
+ each one, when it was last verified, links across mail/calendar/books/CRM, the
43
+ steward, and the awareness state.
44
+ - `directory_get_org` — the organisation, its relationships, and its people.
45
+ - `directory_list_people` / `directory_list_orgs` — the People and Organisations
46
+ views: filter by relationship, organisation, awareness, list membership or free
47
+ text; `sort: "touch"` puts the recently-active first. Cursor-paginated.
48
+ - `directory_ask` — grounded Q&A. Returns `{content, grounding[], costCents,
49
+ auditId}`. **Always show the grounding rows and the cost.** Grounding is
50
+ awareness-scoped, so restricted records never reach the model.
51
+
52
+ ## Enriching from real traffic
53
+
54
+ The Directory gets better by absorbing what already flowed past you — a signature
55
+ block, a meeting roster, a call transcript, a bank-feed counterparty.
56
+
57
+ - `directory_add_channel` — attach an email/phone/handle/URL **with its
58
+ provenance**. `verifiedFrom` (`SIGNATURE` | `CALL` | `MANUAL` | `IMPORT` |
59
+ `BANK_FEED`) is how the record knows the address is real. Re-adding a channel
60
+ that is already on the record with a fresh `verifiedFrom` is exactly how a
61
+ stale channel gets re-verified — that is the intended idiom, not a duplicate.
62
+ - `directory_update_person` — field edits. Send only what changed.
63
+ - `directory_create_person` — a record you know first-hand. If it came from
64
+ parsed traffic, propose a capture instead; the provenance is worth more than
65
+ the speed.
66
+
67
+ ## The review queue — propose, never resolve
68
+
69
+ ```bash
70
+ node --input-type=module -e '
71
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
72
+ const res = await executeOrgTool("directory_propose_capture", {
73
+ kind: "PERSON",
74
+ payload: { person: { displayName: "Dr. Lena Hartmann", email: "l.hartmann@example.de", title: "Head of Research" } },
75
+ source: "MAIL",
76
+ sourceRef: "msg_01H…",
77
+ sourceFingerprint: "sig:sha256:…",
78
+ confidence: 0.82,
79
+ });
80
+ console.log(res.ok ? res.result.captureId : res.error);
81
+ '
82
+ ```
83
+
84
+ - `directory_propose_capture` — writes **no record**. It files a candidate with
85
+ its provenance line for a human to approve, edit-then-approve, or dismiss.
86
+ `sourceFingerprint` is the dedup key: a stable hash of the observation. Pass
87
+ one and re-proposing the same signature block every time you see it is free
88
+ and safe; omit one and you spam the queue.
89
+ - `directory_propose_merge` — flag two records as the same party. Put the reason
90
+ in `evidence` ( `{reason: "Same signature block, two addresses"}` ); the queue
91
+ prints it verbatim to whoever decides. Refs are `contact:<id>` /
92
+ `account:<id>`. This files a candidate; it does **not** merge.
93
+ - `directory_list_captures` / `directory_list_merges` — read the queues. Surface
94
+ what is waiting; report the counts and the evidence.
95
+ - `directory_request_awareness` — ask for a restricted record. The `reason` is
96
+ shown verbatim to the person deciding, so write it for them: what you are
97
+ working on and why the record is needed. Say what you need it for, not that
98
+ you need it.
99
+
100
+ ## Human-only, by design
101
+
102
+ `directory.resolveCapture`, `directory.executeMerge`, `directory.revertMerge`,
103
+ `directory.setAwareness`, `directory.resolveAwarenessRequest`,
104
+ `directory.archivePerson` and `directory.archiveOrg` are human-gated. Do not
105
+ attempt them as an act of helpfulness — put the queue in front of the human
106
+ instead (counts, evidence, and what you would recommend).
107
+
108
+ ## The long tail via `org_rpc`
109
+
110
+ `directory.listAwarenessRequests`, `directory.listLists`, `directory.createList`,
111
+ `directory.addToList`, `directory.removeFromList`, `directory.shareList`,
112
+ `directory.exportVcard`, `directory.linkParty` / `directory.unlinkParty`
113
+ (attach a party to a mail thread, meeting attendee, file share or bank-feed
114
+ line), `directory.createOrg` / `directory.updateOrg`,
115
+ `directory.removeChannel`, `directory.setPrimaryChannel`.
116
+
117
+ ## Rules of the desk
118
+
119
+ - Provenance or it did not happen. Every channel you add carries where it came
120
+ from; an unsourced address is a guess wearing a record's clothes.
121
+ - Absence is not proof. Awareness-restricted records are invisible to you by
122
+ design — never report "we have no record of them" from an empty result.
123
+ - Propose in bulk, decide never. A clean queue is a human's work; a well-evidenced
124
+ queue is yours.
125
+ - Show the cost and the grounding on every `directory_ask`.
@@ -0,0 +1,84 @@
1
+ ---
2
+ name: draft-comms
3
+ description: "Draft a communication in the appropriate voice (agent, principal draft, or institutional). Takes: recipient, channel, purpose, key points. Applies communication governance rules. Never sends without approval for external recipients."
4
+ ---
5
+
6
+ # Draft Communications
7
+
8
+ You are {{agent.fullName}}, {{agent.title}}. Draft communications in the correct voice for the given context.
9
+
10
+ ## Required Inputs
11
+
12
+ When invoked, gather from the user (or infer from context):
13
+
14
+ - **Recipient**: Who is this going to?
15
+ - **Channel**: Email, Slack, WhatsApp, formal letter, etc.
16
+ - **Purpose**: What is this communication trying to achieve?
17
+ - **Key points**: What must be included?
18
+ - **Voice**: Agent voice (default for internal ops), Principal draft (for principal-signed comms), or Institutional (for company-level comms)
19
+
20
+ ## Voice Guidelines
21
+
22
+ Read `config/communication-governance.md` for full rules. Summary:
23
+
24
+ ### Agent Voice (Internal Operations)
25
+
26
+ - Professional, warm, efficient
27
+ - "Hi [Name], following up on..." / "Quick update on..."
28
+ - Used for: scheduling, internal coordination, vendor management, routine follow-ups
29
+
30
+ ### Principal Draft (CEO Communications)
31
+
32
+ - Authoritative but approachable
33
+ - Strategic framing, concise
34
+ - Used for: investor updates, partner outreach, board communications, key hire outreach
35
+ - **Always marked as DRAFT — requires {{agent.principal.firstName}}'s review and explicit send approval**
36
+
37
+ ### Institutional Voice (Company Communications)
38
+
39
+ - Formal, precise, brand-aligned
40
+ - Used for: press, regulatory filings, official announcements
41
+ - **Always requires legal/compliance review flag**
42
+
43
+ ## Communication Governance Rules
44
+
45
+ 1. **External communications** — NEVER send without explicit CEO approval. Present draft and wait.
46
+ 2. **Internal routine** — May send directly for scheduling, coordination, and acknowledged follow-ups.
47
+ 3. **Investor/Board** — Always principal voice, always draft-only, always flag for review.
48
+ 4. **Legal/Regulatory** — Flag for legal review before sending. Note any compliance implications.
49
+ 5. **Sensitive topics** (compensation, termination, disputes) — Draft only, CEO + legal review.
50
+
51
+ ## Process
52
+
53
+ 1. Determine the correct voice based on recipient and purpose.
54
+ 2. Check `config/contacts.md` for relationship context and any communication preferences.
55
+ 3. Reference prior correspondence in `outputs/comms/` if this is a reply or follow-up.
56
+ 4. Draft the communication with clear subject line (if email) and body.
57
+ 5. Add governance flags as needed.
58
+
59
+ ## Output Format
60
+
61
+ ```
62
+ # Draft Communication
63
+
64
+ **To**: [Recipient]
65
+ **Channel**: [Email/Slack/etc.]
66
+ **Voice**: [Agent/Principal Draft/Institutional]
67
+ **Governance**: [Can send / Needs CEO approval / Needs legal review]
68
+
69
+ ---
70
+
71
+ [Subject line if applicable]
72
+
73
+ [Body of communication]
74
+
75
+ ---
76
+
77
+ **{{agent.firstName}}'s Notes**: [Any context, suggested timing, or caveats]
78
+ ```
79
+
80
+ ## Output
81
+
82
+ 1. Save draft to `outputs/comms/drafts/[recipient]-[date]-[topic].md`.
83
+ 2. Present draft in conversation for review.
84
+ 3. If approved for send and MCP tools available, use appropriate MCP to send.
@@ -0,0 +1,53 @@
1
+ ---
2
+ name: evening-wrap
3
+ description: Produce the Evening Wrap — what closed today, what didn't, open items carried forward, tomorrow's priorities. Use at end of day or when the principal asks for the wrap.
4
+ ---
5
+
6
+ # Evening Wrap
7
+
8
+ You are {{agent.fullName}}, {{agent.title}}. Produce the end-of-day Evening Wrap for {{agent.principal.firstName}}.
9
+
10
+ ## Data Gathering
11
+
12
+ 1. **Read today's morning brief** from `outputs/briefs/daily/morning-brief-latest.md` to compare planned vs actual.
13
+ 2. **Check workstream updates** across `memory/workstreams/` for any status changes logged during the day.
14
+ 3. **Review completed items** — scan `memory/executive/open-loops.md` for anything that was resolved today.
15
+ 4. **Check communications log** — review any decisions made, emails sent, meetings held via `outputs/comms/` and calendar.
16
+ 5. **Identify carried items** — anything from this morning's priorities that did not get addressed.
17
+
18
+ ## Wrap Structure
19
+
20
+ ```
21
+ # Evening Wrap — [DATE]
22
+
23
+ ## Closed Today
24
+ - [Item completed, with outcome or result]
25
+
26
+ ## Did Not Close (Carried Forward)
27
+ - [Item that was planned but not completed, with reason if known]
28
+
29
+ ## Decisions Made
30
+ - [Any decisions logged today with brief context]
31
+
32
+ ## Tomorrow's Top 3
33
+ - [Priority for tomorrow, seeded from today's carry-forwards and upcoming deadlines]
34
+
35
+ ## Alerts / Emerging Issues
36
+ - [Anything new that surfaced today requiring attention tomorrow or this week]
37
+
38
+ ## End-of-Day Status
39
+ | Workstream | Movement | Note |
40
+ |---|---|---|
41
+ | [domain] | [progressed/stalled/blocked] | [one-liner] |
42
+ ```
43
+
44
+ ## Output
45
+
46
+ 1. Write the completed wrap to `outputs/briefs/daily/evening-wrap-YYYY-MM-DD.md`.
47
+ 2. Also overwrite `outputs/briefs/daily/evening-wrap-latest.md` for quick access.
48
+ 3. Update `memory/executive/open-loops.md` — remove closed items, add new carry-forwards.
49
+ 4. Present the wrap directly in the conversation.
50
+
51
+ ## Tone
52
+
53
+ Honest accounting. Don't sugarcoat what didn't happen. Tomorrow's priorities should feel actionable, not aspirational.
@@ -0,0 +1,65 @@
1
+ ---
2
+ name: files-find
3
+ description: Find, read, and write documents in the org's workspace drive — Docs, Sheets, Decks, folders, uploads — under the same VIEW/COMMENT/EDIT shares that govern humans. Use when asked to locate a file, pull a doc's content into context, draft or revise a workspace document, or share one with a person or channel.
4
+ ---
5
+
6
+ # Files — the Workspace Drive
7
+
8
+ The org drive is the shared filing plane: Docs (HTML), Sheets (cells + a shared
9
+ compute engine), Decks (ordered slides), folders, and registered binary uploads.
10
+ Agents obey exactly what they are granted — shares and ACLs (VIEW / COMMENT / EDIT)
11
+ gate agent calls the same way they gate the human UI, and every write appends a
12
+ chain event.
13
+
14
+ All of it is `executeOrgTool` over the files-desk tools; fail-open frames, never a
15
+ throw.
16
+
17
+ ## Finding things
18
+
19
+ `files_list` is the drive listing with the human surface's filters:
20
+
21
+ ```bash
22
+ node --input-type=module -e '
23
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
24
+ const res = await executeOrgTool("files_list", { q: "Q3 plan", kind: "DOC", limit: 20 });
25
+ for (const f of res.ok ? res.result.files ?? res.result : []) console.log(f.id, f.kind, f.name);
26
+ '
27
+ ```
28
+
29
+ Filters: `parentId` (folder scope), `kind` (`FOLDER|DOC|SHEET|DECK|PDF|IMAGE|FILE`),
30
+ `starred`, `byAgents`, free-text `q`, `deleted:true` (the 30-day recovery bin).
31
+
32
+ `files_get` returns one file with its shares and YOUR effective permission — check
33
+ it before promising an edit.
34
+
35
+ ## Reading content
36
+
37
+ - `files_doc_read` — the doc's HEAD html + version.
38
+ - Sheets/decks ride the escape hatch: `org_rpc` `files.sheetRead` (raw cells +
39
+ computed values) / `files.deckRead` (ordered slides).
40
+
41
+ ## Writing
42
+
43
+ - `files_create` — new Doc/Sheet/Deck/Folder owned by your seat.
44
+ - `files_doc_write` — write a doc revision (HEAD + a DocRevision row; requires
45
+ EDIT). Read-modify-write: fetch HEAD first, edit the html, write back.
46
+ - Long tail via `org_rpc`: `files.sheetWriteCells` (server recompute),
47
+ `files.deckWriteSlides` (replace the strip, or `append:true`), `files.rename`,
48
+ `files.move`, `files.duplicate`, `files.star`, `files.pin`, `files.delete` /
49
+ `files.recover` (soft delete, 30-day window), `files.uploadRegister`,
50
+ `files.exportRequest` (an AUDITED export intent — reads that land on the chain).
51
+
52
+ ## Sharing
53
+
54
+ `files_share_grant` grants person / channel / email-invite access; folder grants
55
+ inherit to contents (INHERITED · REVOCABLE rows). Revoke via `org_rpc`
56
+ `files.shareRevoke`. Never widen access beyond what the task needs, and say who you
57
+ granted what.
58
+
59
+ ## Rules of the desk
60
+
61
+ - Respect the ACL answer: a `FORBIDDEN` frame means the grant does not exist —
62
+ ask for the share, do not route around it.
63
+ - Cite files by id + name when you hand results to a human.
64
+ - Deletions are soft for 30 days; say so when you delete, and use `files.recover`
65
+ when someone deleted in error.
@@ -0,0 +1,228 @@
1
+ ---
2
+ name: generative-ui
3
+ description: Return interactive artifact cards in org conversations instead of plain text — catalog discovery, composing genui/v2 envelopes from the block vocabulary, streaming hydration, and acting on cards. Use when a reply benefits from structured, actionable UI (approvals, review grids, comparisons, forms), or when you need to invoke an action on a card someone posted.
4
+ ---
5
+
6
+ # Generative UI (artifact cards)
7
+
8
+ An **artifact** is an interactive card posted as a message into an org channel: a
9
+ `genui` envelope the Cohort app renders with real buttons, forms, and charts. It
10
+ obeys the **two-sided law** — every rendered button is equally invocable by an agent
11
+ via `artifact_act`, with the same params schema a human click sends. The org tools
12
+ for this are `artifact_create`, `artifact_act`, `artifact_get`, `artifact_list`, and
13
+ `artifact_catalog` — available in-session via the `cohort` MCP server, or from a
14
+ shell through `executeOrgTool` as below. Everything is **fail-open**: an unreachable
15
+ org or a pre-artifact SDK returns an error frame, never a throw.
16
+
17
+ ## Text first — when NOT to send an artifact
18
+
19
+ Artifacts are for structure and action, not decoration. Answer in plain
20
+ `messaging_send` text when a sentence does the job:
21
+
22
+ - A yes/no answer, a single fact, a short status line → **text**.
23
+ - An artifact earns its place when the reply is (a) multi-field structured data,
24
+ (b) an action the reader should take (approve, pay, RSVP, claim), (c) a review of
25
+ several similar items, (d) a comparison between options, or (e) a form to fill.
26
+ - Never pad a card with filler stats to make it look substantial. If you only have
27
+ one number, say it in text.
28
+
29
+ ## Discover the catalog first
30
+
31
+ `artifact_catalog` is where you discover the org's **native artifact classes** and
32
+ their action descriptors — class names, envelope versions, action names, and each
33
+ action's JSON-Schema params. Call it before composing a native-class card or acting
34
+ on one; compose a custom ad-hoc card only when no native class fits (see the
35
+ `native-artifacts` skill for the class-by-class guide).
36
+
37
+ ```bash
38
+ node --input-type=module -e '
39
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
40
+ const res = await executeOrgTool("artifact_catalog", {});
41
+ console.log(JSON.stringify(res, null, 2));
42
+ '
43
+ ```
44
+
45
+ Result shape: `{version, classes:[{class, version, title, describe, actions:[{name,
46
+ label, kind, description?, params? (JSON Schema), confirm?, gate?, audience,
47
+ roles?}]}]}` — `describe` tells you when to use each class.
48
+
49
+ ## The envelope (genui/v2)
50
+
51
+ `artifact_create` posts `{channelId, envelope, threadRootId?}` and returns
52
+ `{artifactId, messageId}`. The envelope:
53
+
54
+ ```json
55
+ {
56
+ "genui": "v2",
57
+ "artifact": {
58
+ "class": "ops.status",
59
+ "version": 1,
60
+ "state": "complete",
61
+ "source": { "kind": "native" },
62
+ "provenance": { "sources": [{ "label": "BOARD" }], "counts": { "tasks": 12 }, "generatedAt": "2026-07-24T09:00:00Z" },
63
+ "deepLink": "/board"
64
+ },
65
+ "actions": [
66
+ { "name": "refresh", "label": "Refresh", "kind": "secondary", "audience": "both" }
67
+ ],
68
+ "root": { "type": "card", "tone": "neutral", "title": "Board pulse", "blocks": [] }
69
+ }
70
+ ```
71
+
72
+ - `artifact.state`: `draft | streaming | complete | acted | expired | error`.
73
+ - `artifact.source`: `{kind:"native", surface?}` or `{kind:"plugin", plugin:{slug, domain}}`.
74
+ - `artifact.ttlAt` is for holds and quotes only — things that genuinely expire.
75
+ - `actions`: at most **12** descriptors; `kind` is `primary | secondary | ghost |
76
+ destructive`; `audience` is `both | human | agent` (an `agent`-audience action is
77
+ invocable by you even though humans never see the button).
78
+ - `root` is a v1-style card: `{type:"card", tone, title?, blocks:[…]}`.
79
+ - `genui/v1` (`{"genui":"v1", "root": card}`) remains valid for simple static cards —
80
+ reach for v2 whenever you need lifecycle, provenance, or envelope-level actions.
81
+
82
+ ## Block vocabulary
83
+
84
+ `root.blocks` composes from this vocabulary (unknown block types degrade to a safe
85
+ fallback, so newer blocks never break older renderers):
86
+
87
+ | Block | Use for |
88
+ | --- | --- |
89
+ | `text` | prose paragraph |
90
+ | `badge` | small status/label pill |
91
+ | `divider` | section separation |
92
+ | `entityHeader` | who/what the card is about — title, subtitle, avatar |
93
+ | `factRow` | one label: value line |
94
+ | `factGrid` | a grid of label: value pairs |
95
+ | `gallery` | a set of images |
96
+ | `table` | columnar data |
97
+ | `citations` | source links |
98
+ | `actions` | inline button row (references envelope action names) |
99
+ | `form` | input fields for a reply |
100
+ | `optionGroup` | radio/select choice set |
101
+ | `mediaTile` | one media preview tile |
102
+ | `metricTiles` | KPI tile row |
103
+ | `statusChip` | lifecycle/status chip |
104
+ | `confirmationRow` | post-action confirmation — who acted, when, outcome |
105
+ | `skeletonBlocks` | placeholders while streaming |
106
+ | `itemizedList` | line items (invoice rows, run items) |
107
+ | `comparisonList` | side-by-side option comparison |
108
+ | `personRow` | one person with avatar and role |
109
+ | `avatarStack` | compact overlapping avatars |
110
+ | `timelineSteps` | ordered progress steps |
111
+ | `recommendChip` | marks the AI-recommended option |
112
+ | `note` | callout/aside |
113
+ | `sparkline` | inline trend line |
114
+ | `miniBarChart` | small categorical bars |
115
+ | `diffBlock` | before/after diff |
116
+
117
+ ## Visual laws
118
+
119
+ The renderer owns colour and type; your job is semantic discipline:
120
+
121
+ - **Moss green means running** — nothing else. Never use it as a success accent.
122
+ - **Amber is the AI accent** — AI-generated recommendations and held-for-approval
123
+ states. Do not scatter it.
124
+ - **At most one `recommendChip`** per artifact. A recommendation you cannot commit
125
+ to singular is not a recommendation.
126
+ - **Machine values render mono** — ids, hashes, amounts, timestamps. Put them in the
127
+ value slots (`factRow`, `metricTiles`), not in prose.
128
+ - **Provenance footer** on every artifact: fill `artifact.provenance`
129
+ (`sources:[{label}]`, `counts`, `costCents`, `generatedAt`) — the renderer shows a
130
+ `SOURCES · COUNTS · PROVIDER · $COST` footer from it.
131
+ - **No filler stats** — every number on the card must inform the decision at hand.
132
+
133
+ ## Posting a card
134
+
135
+ ```bash
136
+ node --input-type=module -e '
137
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
138
+ const envelope = {
139
+ genui: "v2",
140
+ artifact: {
141
+ class: "ops.status", version: 1, state: "complete",
142
+ source: { kind: "native" },
143
+ provenance: { sources: [{ label: "BOARD" }], generatedAt: new Date().toISOString() },
144
+ },
145
+ actions: [{ name: "refresh", label: "Refresh", kind: "secondary", audience: "both" }],
146
+ root: {
147
+ type: "card", tone: "neutral", title: "Board pulse",
148
+ blocks: [
149
+ { type: "metricTiles", tiles: [{ label: "Ready", value: "4" }, { label: "Claimed", value: "2" }] },
150
+ { type: "factRow", label: "Prepared by", value: "{{agent.fullName}}" },
151
+ { type: "actions", refs: ["refresh"] },
152
+ ],
153
+ },
154
+ };
155
+ const res = await executeOrgTool("artifact_create", { channelId: "CHANNEL_ID", envelope });
156
+ console.log(JSON.stringify(res)); // {ok:true, result:{artifactId, messageId}}
157
+ '
158
+ ```
159
+
160
+ A `clientMsgId` is auto-minted for dedup; pass your own stable one if you might
161
+ retry the create.
162
+
163
+ ## Streaming: skeleton → hydrate → complete
164
+
165
+ When the data behind a card is slow (a long retrieval, a batched computation), do
166
+ not block the conversation. Post the frame immediately, then hydrate:
167
+
168
+ 1. `artifact_create` with `artifact.state: "streaming"` and `skeletonBlocks`
169
+ placeholders in `root.blocks`.
170
+ 2. When results land, patch the full envelope in and transition the state
171
+ (`artifact.patch` — the authoring-side verb; use the `artifactPatch` ui-parity
172
+ wrapper, there is deliberately no curated patch tool):
173
+
174
+ ```bash
175
+ node --input-type=module -e '
176
+ import { artifactPatch } from "./lib/org/ui-parity.mjs";
177
+ import { resolveOrgToolConfig } from "./lib/org/tool-surface.mjs";
178
+ const { base, token, orgId } = resolveOrgToolConfig({});
179
+ const res = await artifactPatch(
180
+ { artifactId: "ART_ID", toState: "complete", envelope: { /* full hydrated envelope */ } },
181
+ { base, token, orgId },
182
+ );
183
+ console.log(JSON.stringify(res)); // {ok:true}
184
+ '
185
+ ```
186
+
187
+ Never leave a card in `streaming` — if the retrieval fails, patch `toState:
188
+ "error"` so the reader is not staring at a permanent skeleton.
189
+
190
+ ## Acting on artifacts
191
+
192
+ Invoke any action from a card's descriptors (or the catalog) with `artifact_act`,
193
+ addressing by `artifactId` or `messageId`:
194
+
195
+ ```bash
196
+ node --input-type=module -e '
197
+ import { executeOrgTool } from "./lib/org/tool-surface.mjs";
198
+ const res = await executeOrgTool("artifact_act", {
199
+ artifactId: "ART_ID",
200
+ action: "refresh",
201
+ params: {},
202
+ idempotencyKey: "refresh-ART_ID-2026-07-24",
203
+ });
204
+ console.log(JSON.stringify(res, null, 2));
205
+ '
206
+ ```
207
+
208
+ - **Idempotency**: an `idempotencyKey` is auto-minted when absent, but pass a stable
209
+ key whenever you may retry — a repeated act with the same key returns
210
+ `{replay:true}` and the original outcome instead of running twice.
211
+ - **Approval-held**: a gated action returns a NORMAL result `{held:true,
212
+ approvalId}` (the card shows an amber held chip). Long-poll it with
213
+ `approval_wait`, and once approved re-invoke `artifact_act` with the **same**
214
+ `idempotencyKey` to consume the grant. A denial stays denied — do not shop for a
215
+ new key.
216
+ - Server-side enforcement is authoritative: `audience`/`roles` on the descriptor and
217
+ the org scope gate apply no matter which plane invoked the action.
218
+
219
+ ## Notes
220
+
221
+ - Keep envelopes lean (48KB validation cap) — link out via `deepLink` instead of
222
+ inlining bulk.
223
+ - `artifact_get` re-reads one artifact (envelope, state, receipt); `artifact_list`
224
+ filters by `channelId` / `class` / `state`.
225
+ - Native domain cards (mail review, approvals, books runs, RSVPs …) are covered in
226
+ the `native-artifacts` skill.
227
+ - Prose inside cards follows the house voice (`policies/communication-style.md`):
228
+ plain, no filler openers, no emoji.