@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.
- package/.claude/commands/init-agent.md +104 -0
- package/.claude/commands/init-maestro.md +1187 -0
- package/.claude/settings.json +161 -0
- package/.env.example +216 -0
- package/README.md +632 -0
- package/agents/browser-operator/agent.md +52 -0
- package/agents/calendar-ops/agent.md +50 -0
- package/agents/communications/agent.md +96 -0
- package/agents/decision-log/agent.md +65 -0
- package/agents/desktop-operator/agent.md +59 -0
- package/agents/gmail-operator/agent.md +62 -0
- package/agents/inbound-dispatcher/agent.md +66 -0
- package/agents/inbox-processor/agent.md +39 -0
- package/agents/pmo-execution/agent.md +60 -0
- package/agents/session-spawner/agent.md +64 -0
- package/agents/slack-operator/agent.md +60 -0
- package/agents/whatsapp-operator/agent.md +60 -0
- package/agents/workflow-automation/agent.md +61 -0
- package/archetypes/altitudes/c-suite.yaml +58 -0
- package/archetypes/altitudes/founder.yaml +68 -0
- package/archetypes/altitudes/senior-manager.yaml +63 -0
- package/archetypes/altitudes/svp.yaml +60 -0
- package/archetypes/altitudes/vp.yaml +50 -0
- package/archetypes/archetype.schema.json +77 -0
- package/archetypes/base.yaml +47 -0
- package/archetypes/capabilities/commercial-leader.yaml +159 -0
- package/archetypes/capabilities/compliance-officer.yaml +159 -0
- package/archetypes/capabilities/executive-operator.yaml +169 -0
- package/archetypes/capabilities/finance-leader.yaml +162 -0
- package/archetypes/capabilities/operations-leader.yaml +154 -0
- package/archetypes/capabilities/product-leader.yaml +148 -0
- package/archetypes/capabilities/technical-leader.yaml +146 -0
- package/archetypes/functions/commercial-leader.yaml +62 -0
- package/archetypes/functions/compliance-officer.yaml +64 -0
- package/archetypes/functions/executive-operator.yaml +70 -0
- package/archetypes/functions/finance-leader.yaml +70 -0
- package/archetypes/functions/operations-leader.yaml +62 -0
- package/archetypes/functions/product-leader.yaml +61 -0
- package/archetypes/functions/technical-leader.yaml +57 -0
- package/bin/cohort-mcp.mjs +81 -0
- package/bin/maestro.mjs +3516 -0
- package/bin/maestro.test.mjs +1015 -0
- package/desktop-control/README.md +56 -0
- package/desktop-control/app-profiles/gmail.yaml +120 -0
- package/desktop-control/app-profiles/slack.yaml +315 -0
- package/desktop-control/app-profiles/whatsapp.yaml +107 -0
- package/docs/architecture/agent-topology.md +2239 -0
- package/docs/architecture/archetype-agent-factory.md +110 -0
- package/docs/architecture/collective-memory-and-org-mesh.md +115 -0
- package/docs/architecture/continuous-monitoring.md +221 -0
- package/docs/architecture/mcp-capability-map.md +585 -0
- package/docs/architecture/system-architecture.md +1272 -0
- package/docs/company-context/README.md +40 -0
- package/docs/guides/agent-persona-setup.md +600 -0
- package/docs/guides/agents-observe-setup.md +64 -0
- package/docs/guides/billing-console-keys.md +88 -0
- package/docs/guides/ccxray-diagnostics.md +65 -0
- package/docs/guides/channel-bus.md +127 -0
- package/docs/guides/claude-mem-setup.md +79 -0
- package/docs/guides/claude-pace-setup.md +56 -0
- package/docs/guides/claudraband-sessions.md +98 -0
- package/docs/guides/clawteam-swarm.md +116 -0
- package/docs/guides/code-review-graph-setup.md +86 -0
- package/docs/guides/email-setup.md +431 -0
- package/docs/guides/mac-mini.md +119 -0
- package/docs/guides/media-generation-setup.md +349 -0
- package/docs/guides/model-routing.md +162 -0
- package/docs/guides/observability-otel.md +265 -0
- package/docs/guides/org-onboarding.md +132 -0
- package/docs/guides/outbound-governance-setup.md +437 -0
- package/docs/guides/pdf-generation-setup.md +315 -0
- package/docs/guides/poller-daemon-setup.md +563 -0
- package/docs/guides/rag-context-setup.md +459 -0
- package/docs/guides/self-optimization-pattern.md +82 -0
- package/docs/guides/setup-wizard.md +178 -0
- package/docs/guides/slack-setup.md +350 -0
- package/docs/guides/telegram-setup.md +227 -0
- package/docs/guides/twilio-subaccounts-setup.md +223 -0
- package/docs/guides/verification.md +128 -0
- package/docs/guides/voice-mode.md +188 -0
- package/docs/guides/voice-sms-setup.md +698 -0
- package/docs/guides/webhook-relay-setup.md +349 -0
- package/docs/guides/whatsapp-setup.md +288 -0
- package/docs/prompts/board-pack-cover-template.md +36 -0
- package/docs/prompts/decision-recommendation-template.md +88 -0
- package/docs/prompts/followup-message-template.md +141 -0
- package/docs/prompts/investor-letter-template.md +52 -0
- package/docs/prompts/morning-brief-template.md +82 -0
- package/docs/prompts/presentation-template.md +58 -0
- package/docs/prompts/weekly-strategic-memo-template.md +104 -0
- package/docs/research/hallucinated-tool-output-investigation.md +151 -0
- package/docs/runbooks/backup-restore.md +205 -0
- package/docs/runbooks/cohort-cutover.md +129 -0
- package/docs/runbooks/fleet-operations.md +200 -0
- package/docs/runbooks/incident-response.md +226 -0
- package/docs/runbooks/mac-mini-bootstrap.md +431 -0
- package/docs/runbooks/perpetual-operations.md +509 -0
- package/docs/runbooks/recovery-and-failover.md +260 -0
- package/framework-features.json +267 -0
- package/ingest/README.md +87 -0
- package/lib/action-executor.js +689 -0
- package/lib/action-executor.test.mjs +871 -0
- package/lib/agent-root.mjs +37 -0
- package/lib/archetype.mjs +236 -0
- package/lib/archetype.test.mjs +132 -0
- package/lib/autonomy.mjs +114 -0
- package/lib/autonomy.test.mjs +66 -0
- package/lib/backlog.mjs +358 -0
- package/lib/backlog.test.mjs +266 -0
- package/lib/budget-guard.mjs +279 -0
- package/lib/budget-guard.test.mjs +291 -0
- package/lib/cadence-bus-schedule.test.mjs +194 -0
- package/lib/cadence-bus.mjs +1120 -0
- package/lib/cadence-bus.test.mjs +720 -0
- package/lib/cadences.mjs +205 -0
- package/lib/cadences.test.mjs +125 -0
- package/lib/capability.mjs +154 -0
- package/lib/capability.test.mjs +78 -0
- package/lib/channels/base-adapter.mjs +719 -0
- package/lib/channels/base-adapter.test.mjs +590 -0
- package/lib/channels/channel.mjs +128 -0
- package/lib/channels/channels.test.mjs +371 -0
- package/lib/channels/contract.mjs +215 -0
- package/lib/channels/contract.test.mjs +137 -0
- package/lib/channels/conversation-resolver.mjs +95 -0
- package/lib/channels/gmail/adapter.mjs +87 -0
- package/lib/channels/inbox-item.mjs +255 -0
- package/lib/channels/inbox-item.test.mjs +335 -0
- package/lib/channels/index.mjs +94 -0
- package/lib/channels/orgmail/adapter.mjs +353 -0
- package/lib/channels/orgmail/adapter.test.mjs +311 -0
- package/lib/channels/pairing.mjs +363 -0
- package/lib/channels/pairing.test.mjs +270 -0
- package/lib/channels/registry.mjs +164 -0
- package/lib/channels/slack/adapter.mjs +317 -0
- package/lib/channels/slack-adapter.test.mjs +212 -0
- package/lib/channels/sms/adapter.mjs +43 -0
- package/lib/channels/telegram/adapter.mjs +432 -0
- package/lib/channels/telegram-adapter.test.mjs +306 -0
- package/lib/channels/voice/adapter.mjs +301 -0
- package/lib/channels/voice/adapter.test.mjs +278 -0
- package/lib/channels/whatsapp/adapter-baileys.mjs +587 -0
- package/lib/channels/whatsapp/adapter-baileys.test.mjs +359 -0
- package/lib/channels/whatsapp/adapter-twilio.mjs +65 -0
- package/lib/channels/whatsapp/baileys-typing.test.mjs +154 -0
- package/lib/charter.mjs +256 -0
- package/lib/charter.test.mjs +89 -0
- package/lib/claude-bin.mjs +134 -0
- package/lib/claude-bin.test.mjs +75 -0
- package/lib/collective/capture.mjs +185 -0
- package/lib/collective/capture.test.mjs +121 -0
- package/lib/collective/cards.mjs +201 -0
- package/lib/collective/cards.test.mjs +114 -0
- package/lib/collective/config.mjs +186 -0
- package/lib/collective/config.test.mjs +123 -0
- package/lib/collective/global-config.mjs +113 -0
- package/lib/collective/global-config.test.mjs +75 -0
- package/lib/collective/presence.mjs +201 -0
- package/lib/collective/presence.test.mjs +95 -0
- package/lib/collective/recall.mjs +215 -0
- package/lib/collective/recall.test.mjs +116 -0
- package/lib/comms/send-gate.mjs +554 -0
- package/lib/comms/send-gate.test.mjs +577 -0
- package/lib/comms.mjs +67 -0
- package/lib/comms.test.mjs +41 -0
- package/lib/diagnostics/alerts.mjs +424 -0
- package/lib/diagnostics/alerts.test.mjs +318 -0
- package/lib/diagnostics/backup-freshness.mjs +188 -0
- package/lib/diagnostics/backup-freshness.test.mjs +185 -0
- package/lib/diagnostics/counters.mjs +269 -0
- package/lib/diagnostics/counters.test.mjs +206 -0
- package/lib/diagnostics/events.mjs +188 -0
- package/lib/diagnostics/events.test.mjs +290 -0
- package/lib/diagnostics/otel.mjs +237 -0
- package/lib/diagnostics/otel.test.mjs +196 -0
- package/lib/diagnostics/trace.mjs +216 -0
- package/lib/diagnostics/trace.test.mjs +251 -0
- package/lib/env-compat.mjs +74 -0
- package/lib/env-compat.test.mjs +104 -0
- package/lib/feature-init.mjs +331 -0
- package/lib/fs-atomic.mjs +112 -0
- package/lib/fs-atomic.test.mjs +72 -0
- package/lib/fs-ownership.mjs +111 -0
- package/lib/fs-ownership.test.mjs +158 -0
- package/lib/hooks/bus.mjs +347 -0
- package/lib/hooks/bus.test.mjs +387 -0
- package/lib/index.js +16 -0
- package/lib/learning/config.mjs +106 -0
- package/lib/learning/config.test.mjs +75 -0
- package/lib/learning/counters.mjs +156 -0
- package/lib/learning/counters.test.mjs +69 -0
- package/lib/learning/curator-consolidate.test.mjs +238 -0
- package/lib/learning/curator.mjs +453 -0
- package/lib/learning/curator.test.mjs +106 -0
- package/lib/learning/log.mjs +40 -0
- package/lib/learning/reflect.mjs +534 -0
- package/lib/learning/reflect.test.mjs +0 -0
- package/lib/learning/session-index.mjs +352 -0
- package/lib/learning/session-index.test.mjs +125 -0
- package/lib/learning/skill-writer.mjs +474 -0
- package/lib/learning/skill-writer.test.mjs +210 -0
- package/lib/mcp/server.mjs +328 -0
- package/lib/mcp/server.test.mjs +400 -0
- package/lib/model-router/auth-profiles.mjs +758 -0
- package/lib/model-router/auth-profiles.test.mjs +580 -0
- package/lib/model-router/catalog/anthropic.yaml +153 -0
- package/lib/model-router/catalog/deepseek.yaml +86 -0
- package/lib/model-router/catalog/moonshot.yaml +81 -0
- package/lib/model-router/catalog/qwen.yaml +114 -0
- package/lib/model-router/catalog.mjs +925 -0
- package/lib/model-router/catalog.test.mjs +385 -0
- package/lib/model-router/economics.mjs +564 -0
- package/lib/model-router/economics.test.mjs +344 -0
- package/lib/model-router/failover.mjs +298 -0
- package/lib/model-router/failover.test.mjs +439 -0
- package/lib/model-router/health.mjs +453 -0
- package/lib/model-router/health.test.mjs +338 -0
- package/lib/model-router/integration-coverage.test.mjs +829 -0
- package/lib/model-router/integration.test.mjs +564 -0
- package/lib/model-router/ledger.mjs +402 -0
- package/lib/model-router/ledger.test.mjs +382 -0
- package/lib/model-router/llm-task.mjs +515 -0
- package/lib/model-router/llm-task.test.mjs +392 -0
- package/lib/model-router/org-credentials.mjs +260 -0
- package/lib/model-router/org-credentials.test.mjs +265 -0
- package/lib/model-router/pricing-refresh.mjs +463 -0
- package/lib/model-router/pricing-refresh.test.mjs +286 -0
- package/lib/model-router/reconcile.mjs +429 -0
- package/lib/model-router/reconcile.test.mjs +316 -0
- package/lib/model-router/repair.mjs +471 -0
- package/lib/model-router/repair.test.mjs +180 -0
- package/lib/model-router/resolve.mjs +1206 -0
- package/lib/model-router/spawn.mjs +497 -0
- package/lib/model-router/spawn.test.mjs +425 -0
- package/lib/model-router/taxonomy.mjs +893 -0
- package/lib/model-router/taxonomy.test.mjs +410 -0
- package/lib/model-router.mjs +677 -0
- package/lib/model-router.test.mjs +907 -0
- package/lib/org/activity.mjs +211 -0
- package/lib/org/activity.test.mjs +134 -0
- package/lib/org/approvals.mjs +448 -0
- package/lib/org/approvals.test.mjs +216 -0
- package/lib/org/awareness.mjs +222 -0
- package/lib/org/awareness.test.mjs +159 -0
- package/lib/org/board.mjs +229 -0
- package/lib/org/board.test.mjs +177 -0
- package/lib/org/bootstrap-context.mjs +169 -0
- package/lib/org/bootstrap-context.test.mjs +153 -0
- package/lib/org/client.mjs +1628 -0
- package/lib/org/client.test.mjs +1107 -0
- package/lib/org/cohort-client.mjs +67 -0
- package/lib/org/cohort-client.test.mjs +126 -0
- package/lib/org/cost-sync.mjs +227 -0
- package/lib/org/cost-sync.test.mjs +153 -0
- package/lib/org/doctor.mjs +212 -0
- package/lib/org/doctor.test.mjs +212 -0
- package/lib/org/handoff.mjs +293 -0
- package/lib/org/handoff.test.mjs +269 -0
- package/lib/org/integration-tools.mjs +182 -0
- package/lib/org/integration-tools.test.mjs +160 -0
- package/lib/org/keys.mjs +131 -0
- package/lib/org/keys.test.mjs +92 -0
- package/lib/org/knowledge.mjs +463 -0
- package/lib/org/knowledge.test.mjs +319 -0
- package/lib/org/leases.mjs +335 -0
- package/lib/org/leases.test.mjs +235 -0
- package/lib/org/mesh-integration.test.mjs +127 -0
- package/lib/org/mesh.mjs +459 -0
- package/lib/org/mesh.test.mjs +345 -0
- package/lib/org/messaging.mjs +503 -0
- package/lib/org/messaging.test.mjs +238 -0
- package/lib/org/policy.mjs +345 -0
- package/lib/org/policy.test.mjs +237 -0
- package/lib/org/protocol.checksum +1 -0
- package/lib/org/protocol.checksum.test.mjs +90 -0
- package/lib/org/protocol.mjs +967 -0
- package/lib/org/protocol.test.mjs +264 -0
- package/lib/org/registry.mjs +194 -0
- package/lib/org/registry.test.mjs +100 -0
- package/lib/org/tool-surface-integration.test.mjs +120 -0
- package/lib/org/tool-surface.mjs +2535 -0
- package/lib/org/tool-surface.test.mjs +589 -0
- package/lib/org/ui-parity.mjs +3236 -0
- package/lib/org/ui-parity.test.mjs +348 -0
- package/lib/org/verify.mjs +176 -0
- package/lib/org/verify.test.mjs +194 -0
- package/lib/rag/embed.mjs +188 -0
- package/lib/rag/indexer.mjs +425 -0
- package/lib/rag/rag.test.mjs +505 -0
- package/lib/rag/search.mjs +475 -0
- package/lib/rate-guard.mjs +246 -0
- package/lib/rate-guard.test.mjs +201 -0
- package/lib/render.mjs +112 -0
- package/lib/render.test.mjs +68 -0
- package/lib/resource-governor.mjs +297 -0
- package/lib/resource-governor.test.mjs +262 -0
- package/lib/scheduling/dynamic-jobs.mjs +675 -0
- package/lib/scheduling/dynamic-jobs.test.mjs +344 -0
- package/lib/scheduling/jitter.mjs +0 -0
- package/lib/scheduling/jitter.test.mjs +140 -0
- package/lib/secrets/broker.mjs +315 -0
- package/lib/secrets/broker.test.mjs +280 -0
- package/lib/secrets/providers.mjs +461 -0
- package/lib/secrets/providers.test.mjs +274 -0
- package/lib/security/audit-engine.mjs +684 -0
- package/lib/security/audit-engine.test.mjs +389 -0
- package/lib/security/coerce-args.mjs +552 -0
- package/lib/security/coerce-args.test.mjs +281 -0
- package/lib/security/dangerous-tools.mjs +97 -0
- package/lib/security/dangerous-tools.test.mjs +68 -0
- package/lib/security/external-content.mjs +145 -0
- package/lib/security/external-content.test.mjs +67 -0
- package/lib/security/redact.mjs +592 -0
- package/lib/security/redact.test.mjs +441 -0
- package/lib/security/secret-equal.mjs +73 -0
- package/lib/security/secret-equal.test.mjs +55 -0
- package/lib/session-permissions.mjs +101 -0
- package/lib/session-permissions.test.mjs +100 -0
- package/lib/setup/claude-probe.mjs +74 -0
- package/lib/setup/completeness.mjs +175 -0
- package/lib/setup/completeness.test.mjs +110 -0
- package/lib/setup/context-pack.mjs +173 -0
- package/lib/setup/context-pack.test.mjs +89 -0
- package/lib/setup/enrich.mjs +277 -0
- package/lib/setup/enrich.test.mjs +115 -0
- package/lib/setup/enroll-from-cohort.mjs +441 -0
- package/lib/setup/enroll-from-cohort.test.mjs +233 -0
- package/lib/setup/integration.test.mjs +162 -0
- package/lib/setup/io.mjs +360 -0
- package/lib/setup/io.test.mjs +77 -0
- package/lib/setup/run-generator.mjs +81 -0
- package/lib/setup/runner.mjs +244 -0
- package/lib/setup/runner.test.mjs +132 -0
- package/lib/setup/sections/comms.mjs +173 -0
- package/lib/setup/sections/company.mjs +120 -0
- package/lib/setup/sections/enrich.mjs +138 -0
- package/lib/setup/sections/identity.mjs +182 -0
- package/lib/setup/sections/identity.test.mjs +140 -0
- package/lib/setup/sections/learning.mjs +153 -0
- package/lib/setup/sections/learning.test.mjs +81 -0
- package/lib/setup/sections/messaging.mjs +219 -0
- package/lib/setup/sections/messaging.test.mjs +127 -0
- package/lib/setup/sections/model.mjs +102 -0
- package/lib/setup/sections/operating-model.mjs +78 -0
- package/lib/setup/sections/org.mjs +475 -0
- package/lib/setup/sections/org.test.mjs +313 -0
- package/lib/setup/sections/orgmail.mjs +173 -0
- package/lib/setup/sections/orgmail.test.mjs +118 -0
- package/lib/setup/sections/recovery.mjs +159 -0
- package/lib/setup/sections/recovery.test.mjs +98 -0
- package/lib/setup/sections/tools.mjs +132 -0
- package/lib/setup/sections/verify.mjs +97 -0
- package/lib/setup/sot.mjs +205 -0
- package/lib/setup/sot.test.mjs +81 -0
- package/lib/setup/state.mjs +151 -0
- package/lib/setup/state.test.mjs +92 -0
- package/lib/singleton.js +229 -0
- package/lib/singleton.test.mjs +135 -0
- package/lib/telemetry/alerts.mjs +216 -0
- package/lib/telemetry/alerts.test.mjs +109 -0
- package/lib/telemetry/collect.mjs +512 -0
- package/lib/telemetry/collect.test.mjs +202 -0
- package/lib/tool-definitions-integration.test.mjs +83 -0
- package/lib/tool-definitions.js +738 -0
- package/lib/tool-definitions.test.mjs +437 -0
- package/lib/util/fetch-timeout.mjs +136 -0
- package/lib/util/fetch-timeout.test.mjs +202 -0
- package/lib/util/reconnect.mjs +343 -0
- package/lib/util/reconnect.test.mjs +369 -0
- package/lib/util/unhandled.mjs +205 -0
- package/lib/util/unhandled.test.mjs +216 -0
- package/lib/voice/context-loader.mjs +466 -0
- package/lib/voice/index.mjs +100 -0
- package/lib/voice/openai-realtime.mjs +510 -0
- package/lib/voice/outbound.mjs +542 -0
- package/lib/voice/outbound.test.mjs +69 -0
- package/lib/voice/post-call-brief.mjs +428 -0
- package/lib/voice/provider.mjs +52 -0
- package/lib/voice/session-rotation.mjs +257 -0
- package/lib/voice/stt.mjs +161 -0
- package/lib/voice/stt.test.mjs +226 -0
- package/lib/voice/tool-bridge.mjs +370 -0
- package/lib/voice/tts.mjs +104 -0
- package/lib/voice/twilio-sip-bridge.mjs +288 -0
- package/lib/voice/voice.test.mjs +990 -0
- package/mcp/README.md +80 -0
- package/package.json +151 -0
- package/plugins/maestro-skills/plugin.json +139 -0
- package/plugins/maestro-skills/skills/agents-observe.md +110 -0
- package/plugins/maestro-skills/skills/board-deck.md +68 -0
- package/plugins/maestro-skills/skills/books-close.md +77 -0
- package/plugins/maestro-skills/skills/brand-steward.md +121 -0
- package/plugins/maestro-skills/skills/calendar-plan.md +57 -0
- package/plugins/maestro-skills/skills/call-working-sessions.md +124 -0
- package/plugins/maestro-skills/skills/ccxray-diagnostics.md +91 -0
- package/plugins/maestro-skills/skills/claude-pace.md +61 -0
- package/plugins/maestro-skills/skills/code-review-graph.md +99 -0
- package/plugins/maestro-skills/skills/crm-pipeline.md +65 -0
- package/plugins/maestro-skills/skills/decision-brief.md +89 -0
- package/plugins/maestro-skills/skills/directory-hygiene.md +125 -0
- package/plugins/maestro-skills/skills/draft-comms.md +84 -0
- package/plugins/maestro-skills/skills/evening-wrap.md +53 -0
- package/plugins/maestro-skills/skills/files-find.md +65 -0
- package/plugins/maestro-skills/skills/generative-ui.md +228 -0
- package/plugins/maestro-skills/skills/hiring-triage.md +74 -0
- package/plugins/maestro-skills/skills/inbox-triage.md +61 -0
- package/plugins/maestro-skills/skills/mail-triage.md +86 -0
- package/plugins/maestro-skills/skills/morning-brief.md +54 -0
- package/plugins/maestro-skills/skills/native-artifacts.md +157 -0
- package/plugins/maestro-skills/skills/org-board.md +133 -0
- package/plugins/maestro-skills/skills/org-credential.md +68 -0
- package/plugins/maestro-skills/skills/org-recall.md +81 -0
- package/plugins/maestro-skills/skills/pipeline-review.md +76 -0
- package/plugins/maestro-skills/skills/regulatory-status.md +81 -0
- package/plugins/maestro-skills/skills/router-why.md +78 -0
- package/plugins/maestro-skills/skills/schedule-meeting.md +91 -0
- package/plugins/maestro-skills/skills/session-search.md +71 -0
- package/plugins/maestro-skills/skills/set-reminder.md +93 -0
- package/plugins/maestro-skills/skills/slack-followup.md +64 -0
- package/plugins/maestro-skills/skills/team-activity.md +86 -0
- package/plugins/maestro-skills/skills/weekly-memo.md +70 -0
- package/policies/action-classification.yaml +114 -0
- package/policies/ai-disclosure.yaml +294 -0
- package/policies/communication-style.md +139 -0
- package/policies/information-barriers.yaml +118 -0
- package/policies/prompt-injection-defence.yaml +138 -0
- package/public/assets/icon-dark.png +0 -0
- package/public/assets/icon-dark.svg +9 -0
- package/public/assets/icon-light.svg +9 -0
- package/public/assets/logo-dark.svg +15 -0
- package/public/assets/logo-light.svg +15 -0
- package/scaffold/.mcp.json +7 -0
- package/scaffold/CLAUDE.md +368 -0
- package/scaffold/config/agent.json +55 -0
- package/scaffold/config/agent.ts +76 -0
- package/scaffold/config/agent.ts.example +89 -0
- package/scaffold/config/alerts.yaml +23 -0
- package/scaffold/config/allowlist.yaml.example +25 -0
- package/scaffold/config/caller-id-map.yaml +46 -0
- package/scaffold/config/collective.yaml +49 -0
- package/scaffold/config/company.json +20 -0
- package/scaffold/config/known-agents.json +6 -0
- package/scaffold/config/learning.yaml +55 -0
- package/scaffold/config/model-routing.yaml.example +104 -0
- package/scaffold/config/org.yaml +25 -0
- package/scaffold/config/orgmail.yaml.example +19 -0
- package/scaffold/config/recovery.yaml +72 -0
- package/scaffold/config/secrets.yaml +27 -0
- package/scaffold/config/slack.yaml.example +35 -0
- package/scaffold/config/telegram.yaml.example +38 -0
- package/scaffold/config/voice.yaml.example +89 -0
- package/scaffold/config/whatsapp.yaml.example +39 -0
- package/schedules/README.md +49 -0
- package/schedules/triggers/backlog-executor.md +102 -0
- package/schedules/triggers/brand-steward.md +72 -0
- package/schedules/triggers/daily-evening-wrap.md +159 -0
- package/schedules/triggers/daily-midday-sweep.md +58 -0
- package/schedules/triggers/daily-morning-brief.md +55 -0
- package/schedules/triggers/directory-hygiene.md +81 -0
- package/schedules/triggers/dynamic-jobs.md +40 -0
- package/schedules/triggers/inbox-processor.md +115 -0
- package/schedules/triggers/meeting-action-capture.md +60 -0
- package/schedules/triggers/meeting-prep.md +69 -0
- package/schedules/triggers/messaging-inbound.md +50 -0
- package/schedules/triggers/org-pulse.md +24 -0
- package/schedules/triggers/quarterly-self-assessment.md +54 -0
- package/schedules/triggers/weekly-engineering-health.md +37 -0
- package/schedules/triggers/weekly-execution.md +65 -0
- package/schedules/triggers/weekly-hiring.md +53 -0
- package/schedules/triggers/weekly-priorities.md +38 -0
- package/schedules/triggers/weekly-strategic-memo.md +124 -0
- package/scripts/archive-email.sh +55 -0
- package/scripts/cadence/cadence-status.mjs +36 -0
- package/scripts/cadence/enqueue-cadence-tick.mjs +174 -0
- package/scripts/cadence/enqueue-cadence-tick.test.mjs +187 -0
- package/scripts/cadence/launchd-cadence-wrapper.sh +85 -0
- package/scripts/cadence/launchd-cloud-relay-wrapper.sh +95 -0
- package/scripts/cadence/launchd-socket-mode-wrapper.sh +95 -0
- package/scripts/ci/check-docs-accuracy.mjs +493 -0
- package/scripts/ci/check-docs-accuracy.test.mjs +409 -0
- package/scripts/ci/check-exports-exist.mjs +140 -0
- package/scripts/ci/check-files-exist.mjs +107 -0
- package/scripts/ci/check-no-build-artifacts.mjs +111 -0
- package/scripts/ci/check-no-build-artifacts.test.mjs +71 -0
- package/scripts/ci/check-no-confidential.mjs +198 -0
- package/scripts/ci/check-no-conflict-markers.mjs +169 -0
- package/scripts/ci/check-no-residual-identity.mjs +163 -0
- package/scripts/ci/check-no-residual-identity.test.mjs +89 -0
- package/scripts/ci/check-tarball-fidelity.mjs +205 -0
- package/scripts/ci/check-unresolved-tokens.mjs +83 -0
- package/scripts/ci/check.mjs +109 -0
- package/scripts/ci/check.test.mjs +194 -0
- package/scripts/ci/run-coverage.mjs +82 -0
- package/scripts/ci/run-tests.mjs +71 -0
- package/scripts/cloud-relay/README.md +59 -0
- package/scripts/cloud-relay/index.mjs +233 -0
- package/scripts/cloud-relay/package.json +15 -0
- package/scripts/cloud-relay/railway.json +13 -0
- package/scripts/cloud-relay/voice/README.md +94 -0
- package/scripts/cloud-relay/voice/package-lock.json +39 -0
- package/scripts/cloud-relay/voice/package.json +16 -0
- package/scripts/cloud-relay/voice/railway.json +13 -0
- package/scripts/cloud-relay/voice/server.mjs +532 -0
- package/scripts/collective/hook-runner.mjs +211 -0
- package/scripts/collective/hook-runner.test.mjs +90 -0
- package/scripts/collective/org-pulse.mjs +72 -0
- package/scripts/collective/org-sync.mjs +61 -0
- package/scripts/collective/recall.mjs +45 -0
- package/scripts/collective/who.mjs +30 -0
- package/scripts/comms-monitor.sh +288 -0
- package/scripts/configure-whatsapp-sandbox.sh +201 -0
- package/scripts/continuous-monitor.sh +91 -0
- package/scripts/cost/fleet-digest.mjs +407 -0
- package/scripts/cost/fleet-digest.test.mjs +207 -0
- package/scripts/cost/track-claude-usage.mjs +169 -0
- package/scripts/daemon/agent-daemon.mjs +989 -0
- package/scripts/daemon/agent-daemon.test.mjs +525 -0
- package/scripts/daemon/cadence-consumer-governance.test.mjs +220 -0
- package/scripts/daemon/cadence-consumer.mjs +1080 -0
- package/scripts/daemon/cadence-consumer.test.mjs +770 -0
- package/scripts/daemon/cadence-handlers.mjs +1121 -0
- package/scripts/daemon/cadence-handlers.test.mjs +617 -0
- package/scripts/daemon/classifier.mjs +704 -0
- package/scripts/daemon/classifier.test.mjs +238 -0
- package/scripts/daemon/classify-kind.mjs +54 -0
- package/scripts/daemon/classify-kind.test.mjs +40 -0
- package/scripts/daemon/context-compiler.mjs +605 -0
- package/scripts/daemon/context-compiler.test.mjs +300 -0
- package/scripts/daemon/dispatcher-cooldown.test.mjs +122 -0
- package/scripts/daemon/dispatcher-governance.test.mjs +886 -0
- package/scripts/daemon/dispatcher.mjs +1516 -0
- package/scripts/daemon/health.mjs +72 -0
- package/scripts/daemon/inbox-deferral.mjs +210 -0
- package/scripts/daemon/inbox-deferral.test.mjs +242 -0
- package/scripts/daemon/integration.test.mjs +149 -0
- package/scripts/daemon/launchd-wrapper-generic.sh +96 -0
- package/scripts/daemon/launchd-wrapper-slack-events.sh +37 -0
- package/scripts/daemon/launchd-wrapper.sh +91 -0
- package/scripts/daemon/lib/session-router.mjs +274 -0
- package/scripts/daemon/lib/session-router.test.mjs +295 -0
- package/scripts/daemon/maestro-daemon.mjs +275 -0
- package/scripts/daemon/prompt-builder.mjs +685 -0
- package/scripts/daemon/prompt-builder.test.mjs +213 -0
- package/scripts/daemon/responder.mjs +854 -0
- package/scripts/daemon/session-lock.mjs +721 -0
- package/scripts/daemon/session-lock.test.mjs +252 -0
- package/scripts/daemon/session-outcomes.mjs +640 -0
- package/scripts/daemon/session-outcomes.test.mjs +533 -0
- package/scripts/daemon/typing-registry.mjs +90 -0
- package/scripts/daemon/typing-registry.test.mjs +77 -0
- package/scripts/daemon/voice-webhook-server.mjs +804 -0
- package/scripts/decisions/capture-decision.mjs +116 -0
- package/scripts/disclosure_assessment.py +873 -0
- package/scripts/disclosure_boundaries.py +562 -0
- package/scripts/email-signature-principal.html +52 -0
- package/scripts/email-signature.html +60 -0
- package/scripts/email_quote_thread.py +167 -0
- package/scripts/email_thread_dedup.py +362 -0
- package/scripts/emergency-stop.sh +81 -0
- package/scripts/healthcheck.sh +116 -0
- package/scripts/hooks/block-mcp-cohort-send.sh +15 -0
- package/scripts/hooks/block-mcp-slack-send.sh +7 -0
- package/scripts/hooks/post-action-log.sh +126 -0
- package/scripts/hooks/pre-send-audit.sh +174 -0
- package/scripts/hooks/pre-send-audit.test.mjs +215 -0
- package/scripts/hooks/session-end-log.sh +27 -0
- package/scripts/hooks/session-start-banner.sh +115 -0
- package/scripts/huddle/audio-bridge.mjs +664 -0
- package/scripts/huddle/boot-slack-cdp.sh +102 -0
- package/scripts/huddle/huddle-controller.mjs +942 -0
- package/scripts/huddle/huddle-server.mjs +1229 -0
- package/scripts/huddle/launch-slack.sh +232 -0
- package/scripts/huddle/openai-realtime-bridge.mjs +462 -0
- package/scripts/huddle/package-lock.json +62 -0
- package/scripts/huddle/package.json +22 -0
- package/scripts/huddle/setup-audio.sh +239 -0
- package/scripts/huddle/start-call.mjs +318 -0
- package/scripts/huddle/test-pipeline.mjs +263 -0
- package/scripts/learning/consolidate-skills.mjs +72 -0
- package/scripts/learning/session-search.mjs +125 -0
- package/scripts/llm_email_dedup.py +442 -0
- package/scripts/local-triggers/generate-plists.sh +432 -0
- package/scripts/local-triggers/generate-plists.test.mjs +413 -0
- package/scripts/local-triggers/install-all.sh +49 -0
- package/scripts/local-triggers/plists/.gitkeep +0 -0
- package/scripts/local-triggers/run-trigger.sh +63 -0
- package/scripts/local-triggers/templates/rag-reindex.plist.template +47 -0
- package/scripts/local-triggers/templates/voice-relay-poller.plist.template +54 -0
- package/scripts/local-triggers/templates/voice-tunnel.plist.template +55 -0
- package/scripts/local-triggers/templates/voice-webhook.plist.template +51 -0
- package/scripts/maintenance/backup-to-cloud.sh +124 -0
- package/scripts/maintenance/health-check.sh +377 -0
- package/scripts/media-generation/README.md +105 -0
- package/scripts/media-generation/gemini-image-client.mjs +173 -0
- package/scripts/media-generation/generate-assets.mjs +289 -0
- package/scripts/media-generation/veo-video-client.mjs +219 -0
- package/scripts/org/send-orgmail.mjs +227 -0
- package/scripts/outbound-dedup-cleanup.sh +43 -0
- package/scripts/outbound-dedup.sh +477 -0
- package/scripts/outbound_dedup.py +115 -0
- package/scripts/parse-voice-transcript.mjs +481 -0
- package/scripts/pdf-generation/README.md +63 -0
- package/scripts/pdf-generation/build-document.mjs +247 -0
- package/scripts/pdf-generation/templates/board-pack.latex +136 -0
- package/scripts/pdf-generation/templates/corporate-letter.latex +126 -0
- package/scripts/pdf-generation/templates/memo.latex +114 -0
- package/scripts/poll-slack-events.sh +35 -0
- package/scripts/poller/calendar-poller.mjs +12 -0
- package/scripts/poller/gmail-poller.mjs +192 -0
- package/scripts/poller/imap-client.mjs +289 -0
- package/scripts/poller/inbox-scan-poller.mjs +156 -0
- package/scripts/poller/inbox-scan-poller.test.mjs +231 -0
- package/scripts/poller/index.mjs +73 -0
- package/scripts/poller/intra-session-check.mjs +285 -0
- package/scripts/poller/lib/cloud-relay-dedup.mjs +88 -0
- package/scripts/poller/lib/cloud-relay-dedup.test.mjs +133 -0
- package/scripts/poller/lib/slash-command-handlers.mjs +177 -0
- package/scripts/poller/secondary-gmail-poller.mjs +132 -0
- package/scripts/poller/slack-cloud-relay-client.mjs +368 -0
- package/scripts/poller/slack-poller.mjs +854 -0
- package/scripts/poller/slack-socket-mode.mjs +917 -0
- package/scripts/poller/slack-socket-mode.test.mjs +753 -0
- package/scripts/poller/trigger.mjs +75 -0
- package/scripts/poller/utils.mjs +371 -0
- package/scripts/poller/voice-cloud-relay-client.mjs +179 -0
- package/scripts/poller/voice-poller.mjs +236 -0
- package/scripts/poller-launchd/install.sh +66 -0
- package/scripts/poller-launchd/poller.plist.template +40 -0
- package/scripts/poller-launchd/whatsapp-handler.plist.template +39 -0
- package/scripts/post-interaction-indexer.py +1598 -0
- package/scripts/pre-draft-context.py +994 -0
- package/scripts/pre_draft_lookup.py +258 -0
- package/scripts/rag/build-index.mjs +47 -0
- package/scripts/rag/ingest.mjs +111 -0
- package/scripts/rag/search.mjs +119 -0
- package/scripts/rag-indexer.py +629 -0
- package/scripts/restore-from-backup.sh +248 -0
- package/scripts/restore-from-backup.test.mjs +178 -0
- package/scripts/resume-operations.sh +80 -0
- package/scripts/search-secondary-inbox.py +181 -0
- package/scripts/secondary-inbox-poller.py +437 -0
- package/scripts/self-optimization/compute-metrics.py +398 -0
- package/scripts/send-email-as-principal.py +369 -0
- package/scripts/send-email-threaded.py +392 -0
- package/scripts/send-email-with-attachment.py +377 -0
- package/scripts/send-email.sh +131 -0
- package/scripts/send-sms.sh +175 -0
- package/scripts/send-whatsapp.sh +292 -0
- package/scripts/session-start.sh +106 -0
- package/scripts/setup/boot-claude-session.sh +94 -0
- package/scripts/setup/configure-macos.sh +674 -0
- package/scripts/setup/configure-twilio-sip-trunk.mjs +207 -0
- package/scripts/setup/configure-voice-tunnel.mjs +182 -0
- package/scripts/setup/generate-agent-env.mjs +92 -0
- package/scripts/setup/generate-agent-package-json.mjs +222 -0
- package/scripts/setup/generate-agent-package-json.test.mjs +143 -0
- package/scripts/setup/generate-autonomy.mjs +60 -0
- package/scripts/setup/generate-backlog.mjs +101 -0
- package/scripts/setup/generate-cadences.mjs +92 -0
- package/scripts/setup/generate-capability.mjs +162 -0
- package/scripts/setup/generate-charter.mjs +76 -0
- package/scripts/setup/generate-comms.mjs +59 -0
- package/scripts/setup/generate-company.mjs +92 -0
- package/scripts/setup/init-agent.sh +547 -0
- package/scripts/setup/init-agent.test.mjs +151 -0
- package/scripts/setup/init-archetype.mjs +74 -0
- package/scripts/setup/init-backup.mjs +54 -0
- package/scripts/setup/init-cadence-bus.mjs +60 -0
- package/scripts/setup/init-channel-bus.mjs +46 -0
- package/scripts/setup/init-cost-tracking.mjs +45 -0
- package/scripts/setup/init-decision-capture.mjs +66 -0
- package/scripts/setup/init-known-agents.mjs +57 -0
- package/scripts/setup/init-learning.mjs +70 -0
- package/scripts/setup/init-memory-executive.mjs +45 -0
- package/scripts/setup/init-model-router.mjs +124 -0
- package/scripts/setup/init-rag.mjs +174 -0
- package/scripts/setup/init-session-router.mjs +38 -0
- package/scripts/setup/init-slack-socket-mode.mjs +260 -0
- package/scripts/setup/init-telegram.mjs +165 -0
- package/scripts/setup/init-voice-realtime.mjs +204 -0
- package/scripts/setup/init-whatsapp-baileys.mjs +77 -0
- package/scripts/setup/install-dev-tools.sh +150 -0
- package/scripts/setup/lib/install-plist.mjs +95 -0
- package/scripts/setup/migrate-agent-to-sot.mjs +192 -0
- package/scripts/setup/render-environment-yaml.mjs +133 -0
- package/scripts/slack-events-ctl.sh +177 -0
- package/scripts/slack-events-server.mjs +1045 -0
- package/scripts/slack-react.mjs +89 -0
- package/scripts/slack-responded.sh +232 -0
- package/scripts/slack-send.sh +287 -0
- package/scripts/slack-typing.mjs +196 -0
- package/scripts/slack-upload-v2.py +95 -0
- package/scripts/sms-handler.mjs +450 -0
- package/scripts/spawn-session.sh +120 -0
- package/scripts/sync-protocol.mjs +217 -0
- package/scripts/system-verify.sh +184 -0
- package/scripts/test-email-thread-dedup.py +239 -0
- package/scripts/test-information-barriers.py +484 -0
- package/scripts/test-llm-email-dedup.py +251 -0
- package/scripts/test-pre-draft-integration.py +203 -0
- package/scripts/test-rag-phase2.sh +442 -0
- package/scripts/test-rag-search.sh +251 -0
- package/scripts/test-voice-parser.mjs +316 -0
- package/scripts/user-context-search.py +659 -0
- package/scripts/validate_outbound.py +1504 -0
- package/scripts/watchdog/ai.maestro.memory-watchdog.plist +41 -0
- package/scripts/watchdog/force-reboot.sh +157 -0
- package/scripts/watchdog/memory-watchdog.sh +473 -0
- package/scripts/whatsapp-handler.mjs +538 -0
- package/teams/desktop-operations.yaml +34 -0
- package/teams/executive-office.yaml +27 -0
- package/teams/legal-and-regulatory.yaml +24 -0
- package/teams/platform-and-engineering.yaml +23 -0
- package/teams/strategy-and-growth.yaml +29 -0
- package/workflows/continuous/backlog-executor.yaml +141 -0
- package/workflows/continuous/inbound-monitor.yaml +168 -0
- package/workflows/daily/applicant-triage.yaml +197 -0
- package/workflows/daily/comms-triage.yaml +80 -0
- package/workflows/daily/evening-wrap.yaml +105 -0
- package/workflows/daily/morning-brief.yaml +164 -0
- package/workflows/daily/slack-followup-sweep.yaml +87 -0
- package/workflows/event-driven/README.md +50 -0
- package/workflows/event-driven/agent-failure-investigation.yaml +137 -0
- package/workflows/event-driven/pr-review.yaml +107 -0
- package/workflows/monthly/board-readiness.yaml +76 -0
- package/workflows/quarterly/strategic-scenario-analysis.yaml +85 -0
- package/workflows/session-protocol.md +171 -0
- package/workflows/weekly/engineering-health.yaml +154 -0
- package/workflows/weekly/hiring-review.yaml +169 -0
- package/workflows/weekly/rollup-pipeline-review.yaml +76 -0
- package/workflows/weekly/strategic-memo.yaml +79 -0
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# Runbook — Incident Response
|
|
2
|
+
|
|
3
|
+
For an operator responding to a security incident on a Maestro fleet. Three
|
|
4
|
+
scenarios are covered in full: a prompt-injection success, a credential
|
|
5
|
+
exposure/rotation, and a compromised agent that must be isolated. Each is an
|
|
6
|
+
executable checklist against the real scripts. The governing rule: contain
|
|
7
|
+
first, investigate second, and never destroy evidence — the audit chain is the
|
|
8
|
+
record of what happened.
|
|
9
|
+
|
|
10
|
+
This complements `docs/runbooks/recovery-and-failover.md` (operational recovery)
|
|
11
|
+
and `SECURITY.md` (the trust model). For a dead machine rather than a compromised
|
|
12
|
+
one, see `docs/runbooks/backup-restore.md`.
|
|
13
|
+
|
|
14
|
+
## Severity and first move
|
|
15
|
+
|
|
16
|
+
If you are not sure whether something is an incident, treat it as one and pull
|
|
17
|
+
the break-glass. The kill switch is reversible; an exfiltrated secret or a sent
|
|
18
|
+
message is not.
|
|
19
|
+
|
|
20
|
+
- **One agent misbehaving on one machine** → isolate that agent (Scenario C).
|
|
21
|
+
- **A secret may be exposed** → rotate it (Scenario B), then assess blast radius.
|
|
22
|
+
- **You cannot tell how far it has spread** → fleet-wide pause first
|
|
23
|
+
(`docs/runbooks/fleet-operations.md` → "Fleet-wide pause"), then triage.
|
|
24
|
+
|
|
25
|
+
## The two kill switches
|
|
26
|
+
|
|
27
|
+
Know which one you need before the incident.
|
|
28
|
+
|
|
29
|
+
- **Local break-glass** (`scripts/emergency-stop.sh`) — run on the affected Mac
|
|
30
|
+
mini. Drops the `.emergency-stop` flag (every cadence/enqueue honors it on the
|
|
31
|
+
next tick), unloads the agent's launchd jobs, and kills running Claude Code
|
|
32
|
+
subagent processes. Use when you have shell on the box.
|
|
33
|
+
- **Org-server deactivate** (`admin.deactivate`) — run from the operator station
|
|
34
|
+
against Cohort. Suspends the agent, revokes ALL its device tokens, and queues
|
|
35
|
+
a `halt` directive. The token revocation is the load-bearing part: the agent's
|
|
36
|
+
very next authed call to the server fails `UNAUTHORIZED`, so it cannot
|
|
37
|
+
coordinate, escalate, or be impersonated even if the local process is still
|
|
38
|
+
alive. Use when you cannot trust the local machine or cannot reach it.
|
|
39
|
+
|
|
40
|
+
Use both for a confirmed compromise: deactivate at the server to cut
|
|
41
|
+
coordination and impersonation, then emergency-stop locally to halt execution.
|
|
42
|
+
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Scenario A — Prompt-injection success
|
|
46
|
+
|
|
47
|
+
You have evidence an agent acted on injected instructions (sent something it
|
|
48
|
+
should not have, accessed data out of policy, attempted to disable logging, or
|
|
49
|
+
the injection-defence layer fired and the agent proceeded anyway).
|
|
50
|
+
|
|
51
|
+
1. **Contain the local agent.**
|
|
52
|
+
```bash
|
|
53
|
+
cd ~/<agent>-ai && ./scripts/emergency-stop.sh
|
|
54
|
+
```
|
|
55
|
+
This halts cadence work and kills in-flight sessions on this machine.
|
|
56
|
+
|
|
57
|
+
2. **Cut coordination and impersonation at the server.** From the operator
|
|
58
|
+
station, deactivate the agent so its tokens are revoked fleet-wide:
|
|
59
|
+
```bash
|
|
60
|
+
cohort --db "$COHORT_DB" admin deactivate <agentId> \
|
|
61
|
+
--reason "prompt-injection incident <ticket>"
|
|
62
|
+
```
|
|
63
|
+
(If your build exposes deactivate only over RPC, call `admin.deactivate`
|
|
64
|
+
with the admin token.) Confirm `status: suspended` and `tokensRevoked > 0`.
|
|
65
|
+
|
|
66
|
+
3. **Capture the injection vector before it ages out.** The triggering message
|
|
67
|
+
and the detection record are evidence.
|
|
68
|
+
```bash
|
|
69
|
+
ls -t ~/<agent>-ai/logs/security/*-incidents.jsonl | head -1
|
|
70
|
+
```
|
|
71
|
+
The incident log holds `full_message`, `sender`, `channel`,
|
|
72
|
+
`detection_reason`, `confidence`. Copy the file off the machine now — do not
|
|
73
|
+
wait. If the injection arrived but detection did NOT fire, find the inbound
|
|
74
|
+
item in the poller inbox / processed records and copy it too.
|
|
75
|
+
|
|
76
|
+
4. **Export the authoritative timeline from the audit chain.** The org server's
|
|
77
|
+
hash-chained `org_events` is the non-repudiable record of what the agent
|
|
78
|
+
actually did:
|
|
79
|
+
```bash
|
|
80
|
+
cohort --db "$COHORT_DB" export-audit --format ocsf \
|
|
81
|
+
--families approval,decision,cost,handoff > incident-<ticket>-ocsf.json
|
|
82
|
+
```
|
|
83
|
+
Verify the chain is intact (tamper check): `cohort doctor` reports chain
|
|
84
|
+
integrity; a broken chain is itself a finding.
|
|
85
|
+
|
|
86
|
+
5. **Determine blast radius.** Did the agent send anything? Check the unified
|
|
87
|
+
sends log and the pre-send gate's records. Did it hand off to another agent?
|
|
88
|
+
The `handoff` family in the export shows it; if so, isolate that agent too.
|
|
89
|
+
Did it touch information-barrier-protected domains
|
|
90
|
+
(`policies/information-barriers.yaml`)? If a strategic-initiative or financial
|
|
91
|
+
domain was crossed, escalate to the data owner.
|
|
92
|
+
|
|
93
|
+
6. **Rotate anything the agent could read.** A successful injection in an
|
|
94
|
+
unscoped session can reach the plaintext `.env`. Assume the local secrets are
|
|
95
|
+
exposed and run Scenario B for that agent's credentials.
|
|
96
|
+
|
|
97
|
+
7. **Patch the vector.** If a known injection pattern was missed, add it to
|
|
98
|
+
`policies/prompt-injection-defence.yaml` (`detection_patterns`) and, if the
|
|
99
|
+
path that processed it was unscoped, confirm scoped permissions are wired on
|
|
100
|
+
that spawn site (see `SECURITY.md` → Known limitations). Detection patterns
|
|
101
|
+
are heuristics; the fix is the scoped-permission boundary, not just the
|
|
102
|
+
pattern.
|
|
103
|
+
|
|
104
|
+
8. **Restore only after the vector is closed.**
|
|
105
|
+
```bash
|
|
106
|
+
cohort --db "$COHORT_DB" admin reactivate <agentId> # if you deactivated
|
|
107
|
+
cd ~/<agent>-ai && ./scripts/resume-operations.sh # clears .emergency-stop
|
|
108
|
+
```
|
|
109
|
+
`resume-operations.sh` runs a health check, removes the stop flag, and
|
|
110
|
+
reloads launchd jobs. If it refuses, the health check is failing — fix that
|
|
111
|
+
first; do not hand-delete `.emergency-stop` to force a resume.
|
|
112
|
+
|
|
113
|
+
9. **Record it.** File the serious-incident entry per
|
|
114
|
+
`docs/compliance/evidence-map.md` (EU AI Act Art. 26 deployer duty). Keep the
|
|
115
|
+
incident log, the OCSF export, and the patch in the ticket.
|
|
116
|
+
|
|
117
|
+
---
|
|
118
|
+
|
|
119
|
+
## Scenario B — Credential exposure and rotation
|
|
120
|
+
|
|
121
|
+
A secret leaked (committed by mistake, present on a stolen/compromised machine,
|
|
122
|
+
or read via an injection). Treat every secret on an affected machine as exposed —
|
|
123
|
+
the per-agent `.env` is plaintext and currently has no broker (`SECURITY.md` →
|
|
124
|
+
Known limitations).
|
|
125
|
+
|
|
126
|
+
1. **Stop the bleeding.** If the leak is on a live machine, isolate the agent
|
|
127
|
+
first (Scenario C) so it cannot use or re-leak the credential.
|
|
128
|
+
|
|
129
|
+
2. **Inventory what is exposed.** The agent's secrets live in `~/<agent>-ai/.env`
|
|
130
|
+
(~17 keys). If a single credential leaked, rotate that one; if the machine
|
|
131
|
+
or the file leaked, rotate all of them.
|
|
132
|
+
```bash
|
|
133
|
+
stat -f '%Sp' ~/<agent>-ai/.env # should be -rw------- (0600); if not, fix:
|
|
134
|
+
chmod 600 ~/<agent>-ai/.env
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
3. **Rotate at the source of truth for each credential**, in priority order:
|
|
138
|
+
- **`COHORT_ADMIN_TOKEN`** — the most sensitive. If this leaked, rotate it
|
|
139
|
+
immediately and assume fleet-wide exposure; every operator action is at
|
|
140
|
+
risk. Reissue and redistribute to operators only.
|
|
141
|
+
- **Agent device token** — revoke and re-pair: `admin.deactivate` revokes the
|
|
142
|
+
agent's tokens; re-pair via `cohort pair approve <agentId>` to mint a new
|
|
143
|
+
one, then write it to the agent's `.env`.
|
|
144
|
+
- **Channel tokens** (`SLACK_USER_TOKEN`, WhatsApp/Baileys creds, Telegram bot
|
|
145
|
+
token, Gmail OAuth) — rotate in the provider console, then update `.env`.
|
|
146
|
+
- **Relay secrets** (`POLL_AUTH_TOKEN`, webhook HMAC secrets) — rotate in the
|
|
147
|
+
relay (e.g. Railway) and in `.env` together; a relay whose secret is unset
|
|
148
|
+
fails open, so never leave one blank during rotation.
|
|
149
|
+
- **`COHORT_SIGNING_SECRET`** — if this leaked, policy-bundle signatures are
|
|
150
|
+
forgeable; rotate and re-publish policy (`policy.publish`) so agents fetch
|
|
151
|
+
freshly signed bundles on the next `policy_stale` nudge.
|
|
152
|
+
|
|
153
|
+
4. **Restart the agent to pick up new secrets.**
|
|
154
|
+
```bash
|
|
155
|
+
cd ~/<agent>-ai && ./scripts/resume-operations.sh
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
5. **Verify and record.** Confirm the old credential is dead (an authed call
|
|
159
|
+
with the old agent token must fail `UNAUTHORIZED`). Log the rotation with
|
|
160
|
+
timestamps in the incident ticket; rotation events belong in the compliance
|
|
161
|
+
record (`docs/compliance/evidence-map.md`).
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## Scenario C — Compromised-agent isolation
|
|
166
|
+
|
|
167
|
+
An agent is compromised, runaway, or behaving in a way you cannot explain, and
|
|
168
|
+
you need it off the fleet now. This is the EU AI Act Art. 14 stop-button in
|
|
169
|
+
practice.
|
|
170
|
+
|
|
171
|
+
1. **Deactivate at the server first** (cuts coordination and impersonation even
|
|
172
|
+
if the local box is hostile):
|
|
173
|
+
```bash
|
|
174
|
+
cohort --db "$COHORT_DB" admin deactivate <agentId> \
|
|
175
|
+
--reason "compromise — <ticket>"
|
|
176
|
+
```
|
|
177
|
+
Token revocation takes effect on the agent's next call. Other agents can no
|
|
178
|
+
longer accept handoffs from it (those flow through the governance-gated
|
|
179
|
+
handoff methods at the server).
|
|
180
|
+
|
|
181
|
+
2. **Halt execution locally** if you can reach the machine:
|
|
182
|
+
```bash
|
|
183
|
+
cd ~/<agent>-ai && ./scripts/emergency-stop.sh
|
|
184
|
+
```
|
|
185
|
+
If you cannot reach it (or do not trust it), the server-side deactivation has
|
|
186
|
+
already cut its ability to coordinate or be impersonated; physically isolate
|
|
187
|
+
the machine (network off) and treat it as evidence.
|
|
188
|
+
|
|
189
|
+
3. **Preserve the machine as evidence.** Do not wipe, do not reinstall, do not
|
|
190
|
+
clear logs. Copy `logs/`, `state/`, and the local incident records off to a
|
|
191
|
+
clean host. If you are replacing the machine, follow
|
|
192
|
+
`docs/runbooks/backup-restore.md` on a NEW box — do not reuse the compromised
|
|
193
|
+
one until forensics is done.
|
|
194
|
+
|
|
195
|
+
4. **Scope the blast radius across the fleet.** Pull the org-server audit export
|
|
196
|
+
(`cohort export-audit`) filtered to the agent's recent activity and check the
|
|
197
|
+
`handoff` and `approval` families: anything it handed to or approved for
|
|
198
|
+
another agent extends the incident. Isolate downstream agents as needed.
|
|
199
|
+
|
|
200
|
+
5. **Rotate its credentials** (Scenario B) before the agent or its identity is
|
|
201
|
+
ever brought back.
|
|
202
|
+
|
|
203
|
+
6. **Decommission or rebuild.** If the agent is being retired, follow the
|
|
204
|
+
decommissioning checklist in `docs/runbooks/fleet-operations.md`. If it is
|
|
205
|
+
being rebuilt on clean hardware, follow `docs/runbooks/backup-restore.md` and
|
|
206
|
+
re-pair for a fresh identity token; do not restore the old device token.
|
|
207
|
+
|
|
208
|
+
7. **Reactivate only after rebuild + rotation + vector closure.**
|
|
209
|
+
```bash
|
|
210
|
+
cohort --db "$COHORT_DB" admin reactivate <agentId>
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## After any incident
|
|
216
|
+
|
|
217
|
+
- Confirm the audit chain still verifies end-to-end (`cohort doctor`); a chain
|
|
218
|
+
break is a separate, higher-severity finding.
|
|
219
|
+
- File the serious-incident record and, where an HR-adjacent agent or a person's
|
|
220
|
+
data was involved, trigger worker-notification per
|
|
221
|
+
`docs/compliance/evidence-map.md` (Art. 26 deployer duties).
|
|
222
|
+
- Add any new injection pattern to `policies/prompt-injection-defence.yaml` and
|
|
223
|
+
any newly-discovered fail-open seam to the `SECURITY.md` Known-limitations list
|
|
224
|
+
with a tracking reference.
|
|
225
|
+
- Write the timeline into the ticket from the OCSF export, not from memory — the
|
|
226
|
+
hash-chained log is the authoritative account.
|
|
@@ -0,0 +1,431 @@
|
|
|
1
|
+
# Mac Mini Bootstrap Runbook
|
|
2
|
+
|
|
3
|
+
This runbook covers the complete setup of a Mac mini as the perpetual operations node for the the agent operating system system. Follow each section in order. Do not skip steps.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Prerequisites
|
|
8
|
+
|
|
9
|
+
### Hardware
|
|
10
|
+
|
|
11
|
+
- Apple Mac mini (M-series, minimum M2 with 16GB RAM recommended)
|
|
12
|
+
- Stable power connection (UPS recommended)
|
|
13
|
+
- Wired Ethernet connection (Wi-Fi as fallback only)
|
|
14
|
+
- External storage for backups (optional but recommended)
|
|
15
|
+
|
|
16
|
+
### Software Prerequisites
|
|
17
|
+
|
|
18
|
+
- macOS 14.0 (Sonoma) or later
|
|
19
|
+
- Apple ID signed in (required for some system permissions)
|
|
20
|
+
|
|
21
|
+
### Accounts Ready
|
|
22
|
+
|
|
23
|
+
Before starting, ensure you have credentials for:
|
|
24
|
+
|
|
25
|
+
- Anthropic (Claude API key)
|
|
26
|
+
- GitHub (access to maestro repo)
|
|
27
|
+
- Google Workspace (the-agent@the-company)
|
|
28
|
+
- Slack (the company workspace)
|
|
29
|
+
- WhatsApp Business (linked to the agent's number)
|
|
30
|
+
|
|
31
|
+
---
|
|
32
|
+
|
|
33
|
+
## Step 1: Install Xcode Command Line Tools
|
|
34
|
+
|
|
35
|
+
> If you provision this machine with `wundr computer-setup`, the Command Line
|
|
36
|
+
> Tools are installed **non-interactively** for you (via `softwareupdate`) — skip
|
|
37
|
+
> this step. The bare `xcode-select --install` below opens a GUI dialog that
|
|
38
|
+
> cannot complete on a headless mini, so only run it when setting up by hand.
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
# No-op if already installed; otherwise trigger the installer.
|
|
42
|
+
xcode-select -p >/dev/null 2>&1 || xcode-select --install
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Verify installation:
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
xcode-select -p
|
|
49
|
+
# Expected: /Library/Developer/CommandLineTools
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Step 2: Install Homebrew
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Add Homebrew to PATH (Apple Silicon):
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
echo 'eval "$(/opt/homebrew/bin/brew shellenv)"' >> ~/.zprofile
|
|
62
|
+
eval "$(/opt/homebrew/bin/brew shellenv)"
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Verify:
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
brew --version
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Step 3: Install System Dependencies
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
brew install git node python@3.12 jq yq
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
## Step 4: Install Claude Code CLI
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
npm install -g @anthropic-ai/claude-code
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Verify:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
claude --version
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Step 5: Clone the maestro Repository
|
|
90
|
+
|
|
91
|
+
```bash
|
|
92
|
+
cd ~
|
|
93
|
+
git clone git@github.com:the-platform-repo/maestro.git
|
|
94
|
+
cd maestro
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
Verify the directory structure:
|
|
98
|
+
|
|
99
|
+
```bash
|
|
100
|
+
ls -la
|
|
101
|
+
# Should see: agents/ config/ dashboards/ desktop-control/ docs/ ingest/ knowledge/
|
|
102
|
+
# logs/ mcp/ outputs/ plugins/ policies/ remote-bridge/ schedules/
|
|
103
|
+
# scripts/ teams/ tests/ workflows/
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## Step 6: Configure Environment Variables
|
|
107
|
+
|
|
108
|
+
Create the environment file (secrets are never stored in the repo):
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
cat > ~/.maestro-env << 'EOF'
|
|
112
|
+
# the agent operating system Environment Variables
|
|
113
|
+
# Source this file in your shell profile
|
|
114
|
+
|
|
115
|
+
# Required
|
|
116
|
+
export ANTHROPIC_API_KEY="your-api-key-here"
|
|
117
|
+
|
|
118
|
+
# Optional but recommended
|
|
119
|
+
export SLACK_TOKEN="your-slack-token-here"
|
|
120
|
+
export GITHUB_TOKEN="your-github-token-here"
|
|
121
|
+
export GOOGLE_CREDENTIALS="path-to-credentials-json"
|
|
122
|
+
|
|
123
|
+
# System
|
|
124
|
+
export MAESTRO_HOME="$HOME/maestro"
|
|
125
|
+
export CEO_EMAIL="principal@example.com"
|
|
126
|
+
export HOSTNAME="$(hostname)"
|
|
127
|
+
EOF
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
Add to shell profile:
|
|
131
|
+
|
|
132
|
+
```bash
|
|
133
|
+
echo 'source ~/.maestro-env' >> ~/.zprofile
|
|
134
|
+
source ~/.maestro-env
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Verify:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
echo $ANTHROPIC_API_KEY | head -c 10
|
|
141
|
+
# Should print first 10 characters of your key
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Security note**: Set file permissions to owner-only:
|
|
145
|
+
|
|
146
|
+
```bash
|
|
147
|
+
chmod 600 ~/.maestro-env
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
## Step 7: Install MCP Servers
|
|
151
|
+
|
|
152
|
+
Install the MCP servers defined in the `mcp/` directory:
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
cd ~/maestro
|
|
156
|
+
|
|
157
|
+
# Install MCP server dependencies
|
|
158
|
+
# (Adjust based on the specific MCP servers configured in mcp/)
|
|
159
|
+
npm install
|
|
160
|
+
|
|
161
|
+
# Verify MCP configuration
|
|
162
|
+
ls mcp/
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Configure Claude Code to use the MCP servers:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
# The .mcp.json in the repo root should already reference the servers.
|
|
169
|
+
# Verify it exists and is valid:
|
|
170
|
+
cat .mcp.json 2>/dev/null || echo "MCP config not found -- create .mcp.json"
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
## Step 8: Configure launchd for Perpetual Operation
|
|
174
|
+
|
|
175
|
+
Create the launchd plist for the main orchestrator:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
cat > ~/Library/LaunchAgents/ai.maestro.maestro.plist << 'EOF'
|
|
179
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
180
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
|
181
|
+
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
182
|
+
<plist version="1.0">
|
|
183
|
+
<dict>
|
|
184
|
+
<key>Label</key>
|
|
185
|
+
<string>ai.maestro.maestro</string>
|
|
186
|
+
|
|
187
|
+
<key>ProgramArguments</key>
|
|
188
|
+
<array>
|
|
189
|
+
<string>/bin/bash</string>
|
|
190
|
+
<string>-c</string>
|
|
191
|
+
<string>source ~/.maestro-env && cd ~/maestro && ./scripts/orchestrator.sh</string>
|
|
192
|
+
</array>
|
|
193
|
+
|
|
194
|
+
<key>RunAtLoad</key>
|
|
195
|
+
<true/>
|
|
196
|
+
|
|
197
|
+
<key>KeepAlive</key>
|
|
198
|
+
<dict>
|
|
199
|
+
<key>SuccessfulExit</key>
|
|
200
|
+
<false/>
|
|
201
|
+
</dict>
|
|
202
|
+
|
|
203
|
+
<key>StandardOutPath</key>
|
|
204
|
+
<string>~/the-agent-repo/maestro/logs/orchestrator-stdout.log</string>
|
|
205
|
+
|
|
206
|
+
<key>StandardErrorPath</key>
|
|
207
|
+
<string>~/the-agent-repo/maestro/logs/orchestrator-stderr.log</string>
|
|
208
|
+
|
|
209
|
+
<key>EnvironmentVariables</key>
|
|
210
|
+
<dict>
|
|
211
|
+
<key>PATH</key>
|
|
212
|
+
<string>/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin</string>
|
|
213
|
+
</dict>
|
|
214
|
+
|
|
215
|
+
<key>ThrottleInterval</key>
|
|
216
|
+
<integer>30</integer>
|
|
217
|
+
|
|
218
|
+
<key>ProcessType</key>
|
|
219
|
+
<string>Background</string>
|
|
220
|
+
</dict>
|
|
221
|
+
</plist>
|
|
222
|
+
EOF
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
Load the agent:
|
|
226
|
+
|
|
227
|
+
```bash
|
|
228
|
+
launchctl load ~/Library/LaunchAgents/ai.maestro.maestro.plist
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
Verify it is running:
|
|
232
|
+
|
|
233
|
+
```bash
|
|
234
|
+
launchctl list | grep maestro
|
|
235
|
+
# Should show the process with a PID and exit status 0
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
## Step 9: Set Up Application Accounts
|
|
239
|
+
|
|
240
|
+
### Slack
|
|
241
|
+
|
|
242
|
+
1. Open Slack from Applications or install via `brew install --cask slack`.
|
|
243
|
+
2. Sign in to the the company workspace.
|
|
244
|
+
3. Ensure the agent's account is active and has access to all required channels (listed in `config/slack-channels.yaml` if present).
|
|
245
|
+
4. Keep Slack running in the background. Configure it to launch at login: System Settings > General > Login Items > add Slack.
|
|
246
|
+
|
|
247
|
+
### Gmail
|
|
248
|
+
|
|
249
|
+
1. Open Safari and navigate to https://mail.google.com.
|
|
250
|
+
2. Sign in as the-agent@the-company.
|
|
251
|
+
3. Grant any necessary permissions for Google Calendar access.
|
|
252
|
+
4. Keep the Gmail tab pinned in Safari.
|
|
253
|
+
|
|
254
|
+
### WhatsApp
|
|
255
|
+
|
|
256
|
+
1. Install WhatsApp: `brew install --cask whatsapp` or download from App Store.
|
|
257
|
+
2. Link the device to the agent's WhatsApp account via QR code.
|
|
258
|
+
3. Keep WhatsApp running in the background. Add to Login Items.
|
|
259
|
+
|
|
260
|
+
## Step 10: Configure Desktop Control Permissions
|
|
261
|
+
|
|
262
|
+
The the agent operating system uses desktop control (via macOS Accessibility and Screen Recording APIs) to interact with applications. These permissions must be granted manually.
|
|
263
|
+
|
|
264
|
+
### Accessibility Permission
|
|
265
|
+
|
|
266
|
+
1. Open System Settings > Privacy & Security > Accessibility.
|
|
267
|
+
2. Click the lock icon and authenticate.
|
|
268
|
+
3. Add the following applications:
|
|
269
|
+
- Terminal (or your preferred terminal emulator)
|
|
270
|
+
- Claude Code (if it appears as a separate application)
|
|
271
|
+
- Any automation scripts that need UI control
|
|
272
|
+
|
|
273
|
+
### Screen Recording Permission
|
|
274
|
+
|
|
275
|
+
1. Open System Settings > Privacy & Security > Screen Recording.
|
|
276
|
+
2. Add the same applications as above.
|
|
277
|
+
3. Restart the applications after granting permissions.
|
|
278
|
+
|
|
279
|
+
### Automation Permission
|
|
280
|
+
|
|
281
|
+
1. Open System Settings > Privacy & Security > Automation.
|
|
282
|
+
2. Ensure Terminal has permission to control:
|
|
283
|
+
- Slack
|
|
284
|
+
- Safari
|
|
285
|
+
- WhatsApp
|
|
286
|
+
- System Events
|
|
287
|
+
|
|
288
|
+
### Verify Permissions
|
|
289
|
+
|
|
290
|
+
Run the desktop control verification script:
|
|
291
|
+
|
|
292
|
+
```bash
|
|
293
|
+
cd ~/maestro
|
|
294
|
+
./scripts/verify-permissions.sh 2>/dev/null || echo "Verification script not yet created -- verify manually"
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
Manual verification:
|
|
298
|
+
|
|
299
|
+
```bash
|
|
300
|
+
# Test AppleScript accessibility
|
|
301
|
+
osascript -e 'tell application "System Events" to get name of first process'
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## Step 11: Verify All Workflows
|
|
305
|
+
|
|
306
|
+
Run the workflow verification suite:
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
cd ~/maestro
|
|
310
|
+
|
|
311
|
+
# Verify workflow YAML files are valid
|
|
312
|
+
for f in workflows/daily/*.yaml workflows/weekly/*.yaml workflows/monthly/*.yaml workflows/quarterly/*.yaml; do
|
|
313
|
+
echo "Checking $f..."
|
|
314
|
+
yq eval '.' "$f" > /dev/null 2>&1 && echo " OK" || echo " INVALID"
|
|
315
|
+
done
|
|
316
|
+
|
|
317
|
+
# Verify output directories exist
|
|
318
|
+
mkdir -p outputs/briefs/daily outputs/briefs/weekly outputs/memos/weekly outputs/memos/quarterly outputs/board/monthly outputs/followups/daily
|
|
319
|
+
mkdir -p logs/daily
|
|
320
|
+
|
|
321
|
+
# Verify config files are readable
|
|
322
|
+
for f in config/*.yaml; do
|
|
323
|
+
echo "Checking $f..."
|
|
324
|
+
yq eval '.' "$f" > /dev/null 2>&1 && echo " OK" || echo " INVALID"
|
|
325
|
+
done
|
|
326
|
+
|
|
327
|
+
echo "Workflow verification complete."
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
## Step 12: Enable Monitoring
|
|
331
|
+
|
|
332
|
+
### Log Monitoring
|
|
333
|
+
|
|
334
|
+
Set up log rotation (see `docs/runbooks/perpetual-operations.md` for details):
|
|
335
|
+
|
|
336
|
+
```bash
|
|
337
|
+
cat > ~/Library/LaunchAgents/ai.maestro.maestro-logrotate.plist << 'EOF'
|
|
338
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
339
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
|
340
|
+
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
341
|
+
<plist version="1.0">
|
|
342
|
+
<dict>
|
|
343
|
+
<key>Label</key>
|
|
344
|
+
<string>ai.maestro.maestro-logrotate</string>
|
|
345
|
+
<key>ProgramArguments</key>
|
|
346
|
+
<array>
|
|
347
|
+
<string>/bin/bash</string>
|
|
348
|
+
<string>-c</string>
|
|
349
|
+
<string>cd ~/maestro && ./scripts/log-rotate.sh</string>
|
|
350
|
+
</array>
|
|
351
|
+
<key>StartCalendarInterval</key>
|
|
352
|
+
<dict>
|
|
353
|
+
<key>Hour</key>
|
|
354
|
+
<integer>0</integer>
|
|
355
|
+
<key>Minute</key>
|
|
356
|
+
<integer>0</integer>
|
|
357
|
+
</dict>
|
|
358
|
+
</dict>
|
|
359
|
+
</plist>
|
|
360
|
+
EOF
|
|
361
|
+
|
|
362
|
+
launchctl load ~/Library/LaunchAgents/ai.maestro.maestro-logrotate.plist
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
### Health Check
|
|
366
|
+
|
|
367
|
+
```bash
|
|
368
|
+
# Quick system health check
|
|
369
|
+
echo "=== the agent operating system Health Check ==="
|
|
370
|
+
echo "launchd agent: $(launchctl list | grep maestro | awk '{print $1}')"
|
|
371
|
+
echo "Disk space: $(df -h ~ | tail -1 | awk '{print $4}') free"
|
|
372
|
+
echo "Memory: $(vm_stat | head -5)"
|
|
373
|
+
echo "Log size: $(du -sh ~/maestro/logs/ 2>/dev/null | cut -f1)"
|
|
374
|
+
echo "Last morning brief: $(ls -t ~/maestro/outputs/briefs/daily/*/ceo-morning-brief.md 2>/dev/null | head -1 || echo 'None yet')"
|
|
375
|
+
echo "=============================="
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
---
|
|
379
|
+
|
|
380
|
+
## Post-Bootstrap Checklist
|
|
381
|
+
|
|
382
|
+
- [ ] Xcode command line tools installed
|
|
383
|
+
- [ ] Homebrew installed and on PATH
|
|
384
|
+
- [ ] Git, Node.js, Python, jq, yq installed
|
|
385
|
+
- [ ] Claude Code CLI installed and verified
|
|
386
|
+
- [ ] maestro repo cloned to ~/maestro
|
|
387
|
+
- [ ] Environment variables configured in ~/.maestro-env
|
|
388
|
+
- [ ] File permissions set (chmod 600 on secrets)
|
|
389
|
+
- [ ] MCP servers installed and configured
|
|
390
|
+
- [ ] launchd agent created and loaded
|
|
391
|
+
- [ ] Slack signed in and added to Login Items
|
|
392
|
+
- [ ] Gmail signed in via Safari
|
|
393
|
+
- [ ] WhatsApp linked and added to Login Items
|
|
394
|
+
- [ ] Accessibility permission granted
|
|
395
|
+
- [ ] Screen Recording permission granted
|
|
396
|
+
- [ ] Automation permission granted
|
|
397
|
+
- [ ] All workflow YAML files validated
|
|
398
|
+
- [ ] Output directories created
|
|
399
|
+
- [ ] Log rotation configured
|
|
400
|
+
- [ ] Health check runs cleanly
|
|
401
|
+
- [ ] First morning brief generated successfully
|
|
402
|
+
- [ ] (Optional) Voice/SMS configured -- see `docs/guides/voice-sms-setup.md`
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## Optional: Voice & SMS Setup
|
|
407
|
+
|
|
408
|
+
If this agent needs phone call or SMS capabilities (Slack huddle voice participation, inbound/outbound SMS via Twilio), follow the dedicated guide:
|
|
409
|
+
|
|
410
|
+
**[Voice & SMS Setup Guide](../guides/voice-sms-setup.md)**
|
|
411
|
+
|
|
412
|
+
This covers Twilio phone number purchase, inbound SMS webhook, outbound SMS, Slack huddle voice (Deepgram STT + ElevenLabs TTS), Cloudflare tunnel exposure, caller ID mapping, and launchd process management for the voice/SMS services.
|
|
413
|
+
|
|
414
|
+
---
|
|
415
|
+
|
|
416
|
+
Related documents:
|
|
417
|
+
|
|
418
|
+
- `docs/runbooks/perpetual-operations.md` -- How the system runs continuously
|
|
419
|
+
- `docs/runbooks/recovery-and-failover.md` -- Recovery procedures
|
|
420
|
+
- `docs/guides/agent-persona-setup.md` -- Agent identity and configuration
|
|
421
|
+
- `docs/guides/email-setup.md` -- Gmail IMAP and SMTP setup
|
|
422
|
+
- `docs/guides/slack-setup.md` -- Slack app, tokens, and events
|
|
423
|
+
- `docs/guides/whatsapp-setup.md` -- WhatsApp Business integration
|
|
424
|
+
- `docs/guides/voice-sms-setup.md` -- Voice calls and SMS setup
|
|
425
|
+
- `docs/guides/poller-daemon-setup.md` -- Event loop, daemon, triggers, watchdog
|
|
426
|
+
- `docs/guides/outbound-governance-setup.md` -- Hooks, dedup, information barriers
|
|
427
|
+
- `docs/guides/rag-context-setup.md` -- Search index and context retrieval
|
|
428
|
+
- `docs/guides/pdf-generation-setup.md` -- Branded PDF documents
|
|
429
|
+
- `docs/guides/media-generation-setup.md` -- AI-generated visual assets
|
|
430
|
+
- `docs/workflows/executive-cadence.md` -- Full operating rhythm
|
|
431
|
+
- `config/environment.yaml` -- Environment configuration reference
|