@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,509 @@
|
|
|
1
|
+
# Perpetual Operations Runbook
|
|
2
|
+
|
|
3
|
+
This document describes how the the agent operating system system runs perpetually on the Mac mini. It covers process supervision, health monitoring, log management, memory management, state persistence, crash recovery, graceful shutdown, and upgrade procedures.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Architecture Overview
|
|
8
|
+
|
|
9
|
+
The the agent operating system runs as a set of launchd-managed processes on macOS. The primary orchestrator process coordinates all workflow execution according to the cadence defined in `docs/workflows/executive-cadence.md`. Supporting processes handle log rotation and health monitoring.
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
launchd
|
|
13
|
+
|
|
|
14
|
+
+-- ai.maestro.the-agent-repo (orchestrator)
|
|
15
|
+
| |
|
|
16
|
+
| +-- morning-brief (06:00 daily)
|
|
17
|
+
| +-- comms-triage (08:00, 12:00, 17:00 daily)
|
|
18
|
+
| +-- slack-followup-sweep (12:00, 17:00 daily)
|
|
19
|
+
| +-- evening-wrap (18:00 daily)
|
|
20
|
+
| +-- rollup-pipeline-review (Wed 10:00)
|
|
21
|
+
| +-- strategic-memo (Fri 14:00)
|
|
22
|
+
| +-- board-readiness (1st Mon monthly)
|
|
23
|
+
| +-- scenario-analysis (1st Mon quarterly)
|
|
24
|
+
|
|
|
25
|
+
+-- ai.maestro.the-agent-repo-logrotate (daily at midnight)
|
|
26
|
+
+-- ai.maestro.the-agent-repo-healthcheck (every 15 min)
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## Process Supervision (launchd)
|
|
32
|
+
|
|
33
|
+
The the agent operating system uses macOS `launchd` as its process supervisor. This ensures:
|
|
34
|
+
|
|
35
|
+
- Workflows restart automatically after crashes
|
|
36
|
+
- Scheduled jobs survive reboots (when auto-login is configured)
|
|
37
|
+
- Process health is monitored by the OS
|
|
38
|
+
- Restart throttling prevents crash loops
|
|
39
|
+
|
|
40
|
+
### Primary Orchestrator
|
|
41
|
+
|
|
42
|
+
The orchestrator is managed by launchd via `~/Library/LaunchAgents/ai.maestro.the-agent-repo.plist`.
|
|
43
|
+
|
|
44
|
+
Key configuration:
|
|
45
|
+
|
|
46
|
+
- **RunAtLoad**: true -- starts when the user logs in
|
|
47
|
+
- **KeepAlive.SuccessfulExit**: false -- restarts if the process exits with a non-zero code
|
|
48
|
+
- **ThrottleInterval**: 30 seconds -- prevents rapid restart loops
|
|
49
|
+
|
|
50
|
+
### Per-Workflow Scheduling (Cadence Bus, 1.8+)
|
|
51
|
+
|
|
52
|
+
As of maestro 1.8, scheduled cadence ticks no longer spawn `claude --print` per tick. Each scheduled workflow has a launchd `.plist` at `scripts/local-triggers/plists/` that calls the lightweight Node cadence enqueue script. That script drops a JSON event onto `state/cadence-bus/inbox/`. The persistent daemon (`scripts/daemon/maestro-daemon.mjs`) hosts the consumer that drains the bus and decides whether to handle each tick inline or escalate to a managed sub-session.
|
|
53
|
+
|
|
54
|
+
Example trigger plist (generated by `scripts/local-triggers/generate-plists.sh`):
|
|
55
|
+
|
|
56
|
+
```xml
|
|
57
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
58
|
+
<!-- maestro-plist-arch: cadence-bus v1 -->
|
|
59
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
|
|
60
|
+
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
61
|
+
<plist version="1.0">
|
|
62
|
+
<dict>
|
|
63
|
+
<key>Label</key>
|
|
64
|
+
<string>ai.adaptic.<agent>-inbox-processor</string>
|
|
65
|
+
<key>ProgramArguments</key>
|
|
66
|
+
<array>
|
|
67
|
+
<string>/Users/<agent>/<agent>-ai/scripts/cadence/launchd-cadence-wrapper.sh</string>
|
|
68
|
+
<string>/Users/<agent>/<agent>-ai/scripts/cadence/enqueue-cadence-tick.mjs</string>
|
|
69
|
+
<string>inbox-processor</string>
|
|
70
|
+
<string>--source=launchd</string>
|
|
71
|
+
<string>--quiet</string>
|
|
72
|
+
</array>
|
|
73
|
+
<key>StartInterval</key>
|
|
74
|
+
<integer>300</integer>
|
|
75
|
+
<key>StandardOutPath</key>
|
|
76
|
+
<string>/Users/<agent>/<agent>-ai/logs/daemon/launchd-stdout.log</string>
|
|
77
|
+
<key>StandardErrorPath</key>
|
|
78
|
+
<string>/Users/<agent>/<agent>-ai/logs/daemon/launchd-stderr.log</string>
|
|
79
|
+
</dict>
|
|
80
|
+
</plist>
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
The bus consumer's per-tick decisions are logged to `logs/cadence-bus/<date>.jsonl`. Bus depth and consumer heartbeat are available via `npm run cadence:status`. The consumer writes a heartbeat to `state/cadence-bus/health.json` every ~15 seconds; doctor flags it as stale if it's older than 5 minutes.
|
|
84
|
+
|
|
85
|
+
**Legacy plists (run-trigger.sh):** Plists that still call `scripts/local-triggers/run-trigger.sh` directly are detected by `maestro doctor` and auto-migrated by `maestro upgrade` (backed up under `.maestro/backup/plists/<utc-timestamp>/`). `run-trigger.sh` itself is preserved for manual one-shot operator use only.
|
|
86
|
+
|
|
87
|
+
### Managing Jobs
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Load a job
|
|
91
|
+
launchctl load ~/the-agent-repo/schedules/ai.maestro.morning-brief.plist
|
|
92
|
+
|
|
93
|
+
# Unload a job
|
|
94
|
+
launchctl unload ~/the-agent-repo/schedules/ai.maestro.morning-brief.plist
|
|
95
|
+
|
|
96
|
+
# List active jobs
|
|
97
|
+
launchctl list | grep ai.maestro
|
|
98
|
+
|
|
99
|
+
# Run a job immediately (for testing)
|
|
100
|
+
launchctl start ai.maestro.morning-brief
|
|
101
|
+
|
|
102
|
+
# Check status
|
|
103
|
+
launchctl list | grep the-agent-repo
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Auto-Login Configuration
|
|
107
|
+
|
|
108
|
+
To ensure the Mac mini resumes operations after a power cycle:
|
|
109
|
+
|
|
110
|
+
1. System Settings > Users & Groups > Automatic Login > select the operating user.
|
|
111
|
+
2. System Settings > Lock Screen > set "Require password" to a reasonable timeout.
|
|
112
|
+
3. System Settings > Energy Saver > prevent sleep when display is off.
|
|
113
|
+
4. System Settings > Energy Saver > start up automatically after a power failure.
|
|
114
|
+
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Health Check Intervals
|
|
118
|
+
|
|
119
|
+
### Scheduled Health Check (Every 15 Minutes)
|
|
120
|
+
|
|
121
|
+
The health check runs via launchd (`ai.maestro.the-agent-repo-healthcheck`) with a StartInterval of 900 seconds.
|
|
122
|
+
|
|
123
|
+
The check script (`scripts/healthcheck.sh`) monitors:
|
|
124
|
+
|
|
125
|
+
| Check | Method | Alert Threshold |
|
|
126
|
+
| -------------------------- | ------------------------------------------------ | ----------------------------------------------------------- |
|
|
127
|
+
| Orchestrator process alive | `launchctl list \| grep the-agent-repo` | Process not found |
|
|
128
|
+
| Emergency stop flag | Check for `logs/EMERGENCY_STOP` file | File exists |
|
|
129
|
+
| Environment variables set | Verify `$ANTHROPIC_API_KEY` is non-empty | Variable missing |
|
|
130
|
+
| Disk space | `df -h ~` | Less than 10GB free |
|
|
131
|
+
| Memory pressure | `memory_pressure` command | "WARN" or "CRITICAL" level |
|
|
132
|
+
| Log directory size | `du -s ~/the-agent-repo/logs/` | Greater than 1GB |
|
|
133
|
+
| Last successful workflow | Check latest output file timestamps | More than 2 hours stale during business hours (06:00-18:00) |
|
|
134
|
+
| Network connectivity | `curl -s --max-time 5 https://api.anthropic.com` | Connection failure |
|
|
135
|
+
| Slack app running | `pgrep -x Slack` | Not running during business hours |
|
|
136
|
+
| Safari running | `pgrep -x Safari` | Not running during business hours |
|
|
137
|
+
| WhatsApp running | `pgrep -x WhatsApp` | Not running during business hours |
|
|
138
|
+
| Directory writability | Touch test in `logs/`, `outputs/` | Write failure |
|
|
139
|
+
| Config file validity | `yq eval '.' config/*.yaml` | Parse failure |
|
|
140
|
+
|
|
141
|
+
### Alert Levels and Routing
|
|
142
|
+
|
|
143
|
+
- **CRITICAL** (orchestrator down, emergency stop, network failure): Log to `logs/alerts/critical.log`. Attempt Slack notification to #ceo-office if possible.
|
|
144
|
+
- **DEGRADED** (disk space low, memory pressure, app not running): Log to `logs/alerts/warning.log`. Include in next morning brief. Continue operating with limitations.
|
|
145
|
+
- **HEALTHY**: Log to `logs/healthcheck.log` only. No action needed.
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## Log Rotation
|
|
150
|
+
|
|
151
|
+
### Strategy
|
|
152
|
+
|
|
153
|
+
Logs are rotated daily at midnight via the `ai.maestro.the-agent-repo-logrotate` launchd agent. The rotation script compresses old logs and removes logs older than the retention period.
|
|
154
|
+
|
|
155
|
+
### Retention Periods
|
|
156
|
+
|
|
157
|
+
| Log Category | Location | Retention | Notes |
|
|
158
|
+
| -------------------------- | ------------------------- | --------------- | ------------------------------------------------ |
|
|
159
|
+
| Operations logs | `logs/daily/` | 30 days | Compressed after 1 day |
|
|
160
|
+
| Orchestrator stdout/stderr | `logs/orchestrator-*.log` | Rotated at 10MB | Archived copies kept 30 days |
|
|
161
|
+
| Health check logs | `logs/healthcheck.log` | 30 days | |
|
|
162
|
+
| Alert logs | `logs/alerts/` | 90 days | Longer retention for incident review |
|
|
163
|
+
| Communication audit logs | `logs/comms/` | 6 years | the regulator regulatory requirement -- never auto-delete |
|
|
164
|
+
| Action audit logs | `logs/actions/` | 6 years | the regulator regulatory requirement -- never auto-delete |
|
|
165
|
+
| Maintenance logs | `logs/maintenance.log` | 1 year | |
|
|
166
|
+
|
|
167
|
+
### Rotation Script
|
|
168
|
+
|
|
169
|
+
The log rotation script (`scripts/log-rotate.sh`) performs:
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
#!/bin/bash
|
|
173
|
+
# Log rotation for the agent operating system
|
|
174
|
+
LOG_DIR="$HOME/the-agent-repo/logs"
|
|
175
|
+
RETENTION_DAYS=30
|
|
176
|
+
ALERT_RETENTION_DAYS=90
|
|
177
|
+
|
|
178
|
+
# Compress operations logs older than 1 day (exclude comms/ and actions/)
|
|
179
|
+
find "$LOG_DIR" -path "$LOG_DIR/comms" -prune -o \
|
|
180
|
+
-path "$LOG_DIR/actions" -prune -o \
|
|
181
|
+
-name "*.log" -mtime +1 -not -name "*.gz" -exec gzip {} \;
|
|
182
|
+
|
|
183
|
+
# Remove compressed operations logs older than retention period
|
|
184
|
+
find "$LOG_DIR" -path "$LOG_DIR/comms" -prune -o \
|
|
185
|
+
-path "$LOG_DIR/actions" -prune -o \
|
|
186
|
+
-name "*.log.gz" -mtime +$RETENTION_DAYS -delete
|
|
187
|
+
|
|
188
|
+
# Remove compressed alert logs older than alert retention
|
|
189
|
+
find "$LOG_DIR/alerts" -name "*.log.gz" -mtime +$ALERT_RETENTION_DAYS -delete
|
|
190
|
+
|
|
191
|
+
# Rotate large orchestrator logs (truncate and archive)
|
|
192
|
+
for logfile in orchestrator-stdout.log orchestrator-stderr.log healthcheck.log; do
|
|
193
|
+
filepath="$LOG_DIR/$logfile"
|
|
194
|
+
if [ -f "$filepath" ] && [ "$(stat -f%z "$filepath" 2>/dev/null)" -gt 10485760 ]; then
|
|
195
|
+
cp "$filepath" "$LOG_DIR/${logfile%.log}-$(date +%Y%m%d).log"
|
|
196
|
+
: > "$filepath"
|
|
197
|
+
fi
|
|
198
|
+
done
|
|
199
|
+
|
|
200
|
+
echo "$(date): Log rotation complete" >> "$LOG_DIR/maintenance.log"
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
### Log Directory Structure
|
|
204
|
+
|
|
205
|
+
```
|
|
206
|
+
logs/
|
|
207
|
+
orchestrator-stdout.log # Current orchestrator stdout
|
|
208
|
+
orchestrator-stderr.log # Current orchestrator stderr
|
|
209
|
+
healthcheck.log # Health check results
|
|
210
|
+
maintenance.log # Rotation, upgrades, shutdowns
|
|
211
|
+
daily/
|
|
212
|
+
{date}/
|
|
213
|
+
slack-sends.log # Slack messages sent
|
|
214
|
+
workflow-execution.log # Workflow step timings and results
|
|
215
|
+
alerts/
|
|
216
|
+
critical.log # Critical alerts
|
|
217
|
+
warning.log # Warning-level alerts
|
|
218
|
+
comms/ # the regulator-regulated: 6 year retention
|
|
219
|
+
{date}/
|
|
220
|
+
email-log.yaml
|
|
221
|
+
slack-log.yaml
|
|
222
|
+
whatsapp-log.yaml
|
|
223
|
+
actions/ # the regulator-regulated: 6 year retention
|
|
224
|
+
{date}/
|
|
225
|
+
action-audit.yaml
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## Memory Management
|
|
231
|
+
|
|
232
|
+
### Claude Code Process Memory
|
|
233
|
+
|
|
234
|
+
Claude Code processes can accumulate memory over long sessions. Mitigation strategies:
|
|
235
|
+
|
|
236
|
+
1. **Per-workflow process isolation**: Each workflow invocation spawns a fresh Claude Code process. This prevents memory accumulation across workflows.
|
|
237
|
+
|
|
238
|
+
2. **Memory monitoring**: The health check monitors system memory pressure every 15 minutes:
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
memory_pressure | grep "System-wide memory free percentage"
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
3. **Thresholds and actions**:
|
|
245
|
+
| Free Memory | Status | Action |
|
|
246
|
+
|-------------|--------|--------|
|
|
247
|
+
| > 30% | Normal | Continue all operations |
|
|
248
|
+
| 15-30% | Warning | Log warning. Defer non-critical workflows if below 20%. |
|
|
249
|
+
| < 15% | Critical | Kill non-essential processes. Defer all non-critical workflows. Alert. |
|
|
250
|
+
|
|
251
|
+
4. **macOS memory management**: Swap compression is enabled by default on macOS. Do not disable it.
|
|
252
|
+
|
|
253
|
+
### Knowledge Base Growth
|
|
254
|
+
|
|
255
|
+
- `knowledge/memory/executive-memory.yaml` is the primary persistent state. Monitor its size.
|
|
256
|
+
- Archive completed decision records older than 1 year to `knowledge/archive/`.
|
|
257
|
+
- Compress synthesis documents older than 6 months.
|
|
258
|
+
- Keep entity map and source registry lean by removing stale entries quarterly.
|
|
259
|
+
|
|
260
|
+
### Application Memory
|
|
261
|
+
|
|
262
|
+
Slack, Safari, and WhatsApp accumulate memory over continuous operation. Schedule a weekly restart:
|
|
263
|
+
|
|
264
|
+
```bash
|
|
265
|
+
# Weekly app restart (Sunday 03:00 via launchd or cron)
|
|
266
|
+
osascript -e 'tell application "Slack" to quit'
|
|
267
|
+
sleep 10
|
|
268
|
+
open -a Slack
|
|
269
|
+
|
|
270
|
+
osascript -e 'tell application "Safari" to quit'
|
|
271
|
+
sleep 10
|
|
272
|
+
open -a Safari
|
|
273
|
+
|
|
274
|
+
osascript -e 'tell application "WhatsApp" to quit'
|
|
275
|
+
sleep 10
|
|
276
|
+
open -a WhatsApp
|
|
277
|
+
```
|
|
278
|
+
|
|
279
|
+
### Session State
|
|
280
|
+
|
|
281
|
+
- Desktop control state cached in `desktop-control/state/`.
|
|
282
|
+
- Cleared on system restart.
|
|
283
|
+
- Rebuilt from application observation on resume.
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
|
|
287
|
+
## State Persistence
|
|
288
|
+
|
|
289
|
+
### Critical State Files
|
|
290
|
+
|
|
291
|
+
| File | Purpose | Backup Strategy |
|
|
292
|
+
| ---------------------------------------- | ------------------------------------------ | ---------------------------------------------- |
|
|
293
|
+
| `knowledge/memory/executive-memory.yaml` | Open loops, action items, workstream state | Write-ahead log + git commit after every write |
|
|
294
|
+
| `config/priorities.yaml` | Active strategic priorities | Git commit after every update |
|
|
295
|
+
| `config/contacts.yaml` | Contact information | Weekly git commit |
|
|
296
|
+
| `knowledge/entities/entity-map.yaml` | Pipeline entity data | Git commit after every update |
|
|
297
|
+
| `knowledge/decisions/` | Decision log and history | Git commit after every decision recorded |
|
|
298
|
+
| `outputs/followups/` | Follow-up queue | Git commit with periodic snapshots |
|
|
299
|
+
|
|
300
|
+
### What Must Persist Across Restarts
|
|
301
|
+
|
|
302
|
+
1. Executive memory (`knowledge/memory/executive-memory.yaml`)
|
|
303
|
+
2. Decision log (`knowledge/decisions/`)
|
|
304
|
+
3. Follow-up queue (`outputs/followups/`)
|
|
305
|
+
4. Priority configuration (`config/priorities.yaml`)
|
|
306
|
+
5. Contact registry (`config/contacts.yaml`)
|
|
307
|
+
6. Audit logs (`logs/comms/`, `logs/actions/`)
|
|
308
|
+
|
|
309
|
+
### What Is Rebuilt on Restart
|
|
310
|
+
|
|
311
|
+
1. Desktop control state (fresh app observation)
|
|
312
|
+
2. Working context (knowledge base read)
|
|
313
|
+
3. Workflow scheduling (launchd reload)
|
|
314
|
+
|
|
315
|
+
### Persistence Mechanisms
|
|
316
|
+
|
|
317
|
+
1. **Git as primary persistence**: All state changes are committed to the repository. This provides version history, recovery points, and remote backup.
|
|
318
|
+
|
|
319
|
+
2. **Write-ahead logging**: Before modifying any state file, the intended change is written to `logs/state-changes.log` with a timestamp. If the write fails, the log enables recovery.
|
|
320
|
+
|
|
321
|
+
3. **Atomic writes**: Use write-to-temp-then-rename to prevent partial writes:
|
|
322
|
+
|
|
323
|
+
```bash
|
|
324
|
+
yq eval '.open_loops += [{"item": "new"}]' file.yaml > file.yaml.tmp
|
|
325
|
+
mv file.yaml.tmp file.yaml
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
4. **Periodic git commits**: Auto-commit state changes every 4 hours:
|
|
329
|
+
```bash
|
|
330
|
+
cd ~/the-agent-repo
|
|
331
|
+
git add knowledge/ config/ outputs/
|
|
332
|
+
git commit -m "auto: state snapshot $(date +%Y-%m-%dT%H:%M)"
|
|
333
|
+
git push origin main
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## Recovery from Crashes
|
|
339
|
+
|
|
340
|
+
### Automatic Recovery (launchd)
|
|
341
|
+
|
|
342
|
+
When the orchestrator process crashes:
|
|
343
|
+
|
|
344
|
+
1. launchd detects the non-zero exit code.
|
|
345
|
+
2. After ThrottleInterval (30 seconds), launchd restarts the process.
|
|
346
|
+
3. The orchestrator reads its schedule and determines the next workflow to run.
|
|
347
|
+
4. Missed workflows during downtime are logged but not retroactively executed (stale data risk).
|
|
348
|
+
|
|
349
|
+
### Manual Recovery
|
|
350
|
+
|
|
351
|
+
If auto-recovery fails (crash loop detected):
|
|
352
|
+
|
|
353
|
+
```bash
|
|
354
|
+
# 1. Stop the restart loop
|
|
355
|
+
launchctl unload ~/Library/LaunchAgents/ai.maestro.the-agent-repo.plist
|
|
356
|
+
|
|
357
|
+
# 2. Diagnose
|
|
358
|
+
tail -100 ~/the-agent-repo/logs/orchestrator-stderr.log
|
|
359
|
+
|
|
360
|
+
# 3. Fix the issue
|
|
361
|
+
|
|
362
|
+
# 4. Restart
|
|
363
|
+
launchctl load ~/Library/LaunchAgents/ai.maestro.the-agent-repo.plist
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
See `docs/runbooks/recovery-and-failover.md` for detailed recovery procedures covering system crashes, application crashes, network interruptions, and state reconstruction.
|
|
367
|
+
|
|
368
|
+
---
|
|
369
|
+
|
|
370
|
+
## Graceful Shutdown
|
|
371
|
+
|
|
372
|
+
### Standard Shutdown
|
|
373
|
+
|
|
374
|
+
```bash
|
|
375
|
+
# 1. Check for in-progress workflows
|
|
376
|
+
tail -1 ~/the-agent-repo/logs/daily/$(date +%Y-%m-%d)/workflow-execution.log
|
|
377
|
+
|
|
378
|
+
# 2. Wait for completion (or skip if no workflow is running)
|
|
379
|
+
|
|
380
|
+
# 3. Unload all launchd agents
|
|
381
|
+
launchctl unload ~/Library/LaunchAgents/ai.maestro.the-agent-repo.plist
|
|
382
|
+
launchctl unload ~/Library/LaunchAgents/ai.maestro.the-agent-repo-healthcheck.plist
|
|
383
|
+
launchctl unload ~/Library/LaunchAgents/ai.maestro.the-agent-repo-logrotate.plist
|
|
384
|
+
|
|
385
|
+
# 4. Commit state
|
|
386
|
+
cd ~/the-agent-repo
|
|
387
|
+
git add -A
|
|
388
|
+
git commit -m "manual: graceful shutdown $(date +%Y-%m-%dT%H:%M)"
|
|
389
|
+
git push origin main
|
|
390
|
+
|
|
391
|
+
# 5. Log the shutdown
|
|
392
|
+
echo "$(date): Graceful shutdown by operator" >> ~/the-agent-repo/logs/maintenance.log
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
### Emergency Shutdown
|
|
396
|
+
|
|
397
|
+
```bash
|
|
398
|
+
# Create emergency stop flag (health check will detect this)
|
|
399
|
+
touch ~/the-agent-repo/logs/EMERGENCY_STOP
|
|
400
|
+
|
|
401
|
+
# Kill all processes
|
|
402
|
+
launchctl unload ~/Library/LaunchAgents/ai.maestro.the-agent-repo.plist
|
|
403
|
+
pkill -f "the-agent-repo"
|
|
404
|
+
|
|
405
|
+
echo "$(date): EMERGENCY SHUTDOWN" >> ~/the-agent-repo/logs/maintenance.log
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Resuming After Shutdown
|
|
409
|
+
|
|
410
|
+
```bash
|
|
411
|
+
# 1. Remove emergency stop flag if present
|
|
412
|
+
rm -f ~/the-agent-repo/logs/EMERGENCY_STOP
|
|
413
|
+
|
|
414
|
+
# 2. Verify state integrity
|
|
415
|
+
cd ~/the-agent-repo
|
|
416
|
+
git status
|
|
417
|
+
yq eval '.' config/priorities.yaml > /dev/null && echo "priorities OK"
|
|
418
|
+
yq eval '.' knowledge/memory/executive-memory.yaml > /dev/null && echo "memory OK"
|
|
419
|
+
|
|
420
|
+
# 3. Reload all agents
|
|
421
|
+
launchctl load ~/Library/LaunchAgents/ai.maestro.the-agent-repo.plist
|
|
422
|
+
launchctl load ~/Library/LaunchAgents/ai.maestro.the-agent-repo-healthcheck.plist
|
|
423
|
+
launchctl load ~/Library/LaunchAgents/ai.maestro.the-agent-repo-logrotate.plist
|
|
424
|
+
|
|
425
|
+
# 4. Verify
|
|
426
|
+
launchctl list | grep the-agent-repo
|
|
427
|
+
|
|
428
|
+
# 5. Log the resume
|
|
429
|
+
echo "$(date): System resumed" >> ~/the-agent-repo/logs/maintenance.log
|
|
430
|
+
```
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## Upgrade Procedures
|
|
435
|
+
|
|
436
|
+
### Upgrading Claude Code CLI
|
|
437
|
+
|
|
438
|
+
```bash
|
|
439
|
+
# 1. Graceful shutdown
|
|
440
|
+
launchctl unload ~/Library/LaunchAgents/ai.maestro.the-agent-repo.plist
|
|
441
|
+
|
|
442
|
+
# 2. Upgrade
|
|
443
|
+
npm update -g @anthropic-ai/claude-code
|
|
444
|
+
|
|
445
|
+
# 3. Verify
|
|
446
|
+
claude --version
|
|
447
|
+
|
|
448
|
+
# 4. Resume
|
|
449
|
+
launchctl load ~/Library/LaunchAgents/ai.maestro.the-agent-repo.plist
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### Upgrading the-agent-repo Repository
|
|
453
|
+
|
|
454
|
+
```bash
|
|
455
|
+
# 1. Graceful shutdown
|
|
456
|
+
launchctl unload ~/Library/LaunchAgents/ai.maestro.the-agent-repo.plist
|
|
457
|
+
|
|
458
|
+
# 2. Commit local state
|
|
459
|
+
cd ~/the-agent-repo
|
|
460
|
+
git add -A
|
|
461
|
+
git commit -m "pre-upgrade: state snapshot $(date +%Y-%m-%dT%H:%M)"
|
|
462
|
+
|
|
463
|
+
# 3. Pull latest
|
|
464
|
+
git pull origin main
|
|
465
|
+
|
|
466
|
+
# 4. Install new dependencies if needed
|
|
467
|
+
npm install
|
|
468
|
+
|
|
469
|
+
# 5. Validate workflows
|
|
470
|
+
for f in workflows/**/*.yaml; do
|
|
471
|
+
yq eval '.' "$f" > /dev/null 2>&1 || echo "INVALID: $f"
|
|
472
|
+
done
|
|
473
|
+
|
|
474
|
+
# 6. Resume
|
|
475
|
+
launchctl load ~/Library/LaunchAgents/ai.maestro.the-agent-repo.plist
|
|
476
|
+
|
|
477
|
+
# 7. Monitor for 15 minutes
|
|
478
|
+
tail -f ~/the-agent-repo/logs/orchestrator-stdout.log
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### Major Upgrades
|
|
482
|
+
|
|
483
|
+
For major changes (new workflow structure, config format changes):
|
|
484
|
+
|
|
485
|
+
1. Create a full backup: `cp -r ~/the-agent-repo ~/the-agent-repo-backup-$(date +%Y%m%d)`
|
|
486
|
+
2. Graceful shutdown.
|
|
487
|
+
3. Apply changes.
|
|
488
|
+
4. Run health check: `./scripts/healthcheck.sh`
|
|
489
|
+
5. Test one workflow manually before resuming all.
|
|
490
|
+
6. Resume operations.
|
|
491
|
+
7. Monitor for one full cadence cycle (24 hours).
|
|
492
|
+
8. Remove backup after 7 days if stable.
|
|
493
|
+
|
|
494
|
+
### Upgrading macOS
|
|
495
|
+
|
|
496
|
+
1. Graceful shutdown and push all state to git.
|
|
497
|
+
2. Run the macOS upgrade.
|
|
498
|
+
3. After reboot: verify auto-login, launchd agents loaded, permissions intact.
|
|
499
|
+
4. Re-grant any permissions reset by the upgrade (Accessibility, Screen Recording, Automation).
|
|
500
|
+
5. Run health check.
|
|
501
|
+
6. Monitor for one full cadence cycle.
|
|
502
|
+
|
|
503
|
+
---
|
|
504
|
+
|
|
505
|
+
Related documents:
|
|
506
|
+
|
|
507
|
+
- `docs/runbooks/mac-mini-bootstrap.md` -- Initial setup
|
|
508
|
+
- `docs/runbooks/recovery-and-failover.md` -- Detailed recovery procedures
|
|
509
|
+
- `docs/workflows/executive-cadence.md` -- Full operating rhythm
|