Purpose

One source of truth for how SAIL's scheduled tasks and Claude routines run. Every SAIL task SKILL.md should link back here from its pinned start-here block. If the runbook and a SKILL.md disagree, the runbook wins and the SKILL.md gets updated.

Where things live

Two GitHub repos under samaguiar1982-cpu. Both private, both writable by the automation GitHub app.

  1. sail-scheduled-tasks: canonical SKILL.md for each individual task, plus _post-run-qa-reflection.md (the QA framework). One folder per task. This is where Sam and future agents read and edit task logic.
  2. sail-automation: the repo mounted by Anthropic Claude Code Routines at runtime. Contains CLAUDE.md (firm context auto-loaded on every routine), scripts/ (shared Python helpers), skills/ (shared skills like sail-gads-runner). Routines import from here rather than reimplementing per task.

Runner architecture

SAIL's scheduled tasks run on Anthropic Claude Code Routines, not on a self-hosted runner, not on GitHub Actions. At runtime the routine:

  1. Mounts samaguiar1982-cpu/sail-automation as its working repo.
  2. Auto-loads CLAUDE.md from that repo for firm context.
  3. Loads credentials from the cloud secret store via env vars (target state) or from vault.env on Sam's Mac (transitional, interactive-only).
  4. Executes the task SKILL.md referenced in the schedule by cloning or fetching from sail-scheduled-tasks.
  5. Writes artifacts to the routine's outputs folder and pushes a summary to this Notion workspace.

Implication: "migrate to cloud" for SAIL is not about provisioning a new cloud environment. Anthropic already runs the routines. The work is populating sail-automation with the shared skills and helpers so routines stop depending on Mac-host paths.

Google Ads task inventory

All Google Ads tasks are read-only. They pull via GAQL on Google Ads API v30. adspirer MCP is not used. MCC login_customer_id must be set to 8676599345 in code before the client loads, not trusted from google-ads.yaml.

Account scope