Недавно вышла статья Cloud Mac vs локальный Mac: всё больше команд переносят Claude Code, индекс CodeGraph и при необходимости Ollama на постоянный macOS-узел. Отсюда иллюзия: «раз уж в облаке — каждый git push станет зелёным». На практике агент радуется в SSH, а GitHub Actions крутится на ubuntu-latest без xcodebuild, либо macOS-джобы полчаса стоят в очереди.
Это не справочник «что такое GitHub Runner» и не регистрация actions/runner (это L1-Q02). Текст закладывает методологию Cloud Mac AI Stack: слой L1 объясняет, зачем нужен отдельный движок исполнения — и почему аренда Cloud Mac без runner остаётся просто удалённым рабочим столом.
Cloud Mac AI Stack · слоган
Claude Code производит Diff, GitHub Runner производит Fact.
Вместо общих слов «агент / CI» мы связываем Context → Diff → Fact → Workflow как типы результатов. Diff — предлагаемые правки; Fact — проверяемые сборки и checks. Inference (L2, опционально) — приватные токены модели на узле.
L1 в Stack
Claude Code (L3) отвечает «как менять код?» GitHub Runner (L1) — «можно ли организации смержить, подписать и выкатить?» Без L1 любой Diff — мнение в терминале, а не Fact на кнопке merge.
Язык Stack: Context → Diff → Fact → Workflow
Везде пишут про Claude Code, Cursor, MCP, OpenHands — редко про то, кто создаёт организационную правду после правок. В Cloud Mac AI Stack четыре результата (L2 Inference отдельно):
Цепочка (≠ runtime · см. #stack-map)
Context → Diff → Fact → Workflow
(MCP) (Claude Code) (Runner) (OpenHands)
| Уровень | Роль | Компонент | Результат |
|---|---|---|---|
| L0 | Инфраструктура | Cloud Mac | среда macOS |
| L1 | Исполнение | GitHub Runner | Fact |
| L2 | Инференс | Ollama | Inference (опц.) |
| L3 | Кодирование | Claude Code | Diff |
| L4 | Связь инструментов | MCP | Context |
| L5 | Автономное исполнение | OpenHands | Workflow |
Вопрос не «достаточно ли умён LLM», а: существует ли L1 как слой? Без Fact PR не станет зелёным, как ни хороши Context и Diff.
Кодирование и исполнение: почему «Cloud Mac» не закрывает CI
В Cloud Mac vs локальный Mac мы разделили Inference модели (API) и выполнение агента (shell на macOS). Часто забывают второй разрез: CI после push — воспроизводимый, аудируемый, независимый от SSH.
| Слой | Типично | Триггер | Вопрос |
|---|---|---|---|
| Кодирование / агент | Claude Code, Cursor | терминал, IDE | «Допиши PR» |
| Исполнение / CI | GitHub Actions + self-hosted runner | push, PR, cron | «Собирается и тестируется ли коммит в заданной среде?» |
Разрыв: тесты зелёные в SSH на Cloud Mac, workflow всё ещё ubuntu-latest. Официальная правда репозитория — красная. Для iOS TestFlight на Linux не стартует. L1 часто требует тот же класс macOS Apple Silicon, что и у разработчиков.
У аутсорс-команд и распределённых iOS-групп (СНГ, удалёнка из разных часовых поясов) compliance всё чаще требует воспроизводимых сборок, а не скриншотов из SSH. Runner переводит «агент сказал OK» в Fact — логи, артефакты, checks.
Типичная ошибка: «все тесты прошли» — PR красный
Повторяющийся сценарий в репозиториях клиентов:
- Claude Code по SSH на Cloud Mac: «все тесты прошли».
git push, спокойная встреча.- Actions с
runs-on: ubuntu-latest. - Checks красные; в логе часто:
xcodebuild: command not found— или зелёный только Node, без iOS job.
Claude Code не виноват — среда сессии ≠ среда CI. Runner воспроизводит утверждение как Fact на той же линии GitHub Actions self-hosted runner macOS, при желании на том же узле, что и агент.
Runner — не «ещё один Mac в аренду»
- Не карточка продукта Cloud Mac — аренда это L0; runner — процесс + labels + политика workspace на L0.
- Не инструкция к
macos-latest— другие очереди и тарифы hosted vs self-hosted. - Не замена OpenClaw — там оркестрация Workflow; runner выполняет
xcodebuildиfastlane.
Cloud Mac даёт macOS и сеть; runner встраивает мощность в модель событий GitHub. Без runner Cloud Mac — удалённый стол; с runner — инфраструктура.
Пять уровней · Stack ≠ порядок вызовов (#stack-map)
Статьи L2–L5 будут ссылаться сюда. Схема — уровни ответственности, не «кто кого вызывает в runtime».
Важно
- Claude Code не обязан использовать Ollama — L3 часто через API; L2 Inference опционален.
- MCP выше L3 на схеме = слой Context, не «MCP стартует раньше CLI».
- Внедрение: #stack-order — иное, чем несущая нагрузка снизу вверх.
Cloud Mac AI Stack (ответственность · снизу вверх)
┌──────────────┐
│ OpenHands │ L5 · Workflow
└──────┬───────┘
│
┌──────▼───────┐
│ MCP │ L4 · Context
└──────┬───────┘
│
┌──────▼───────┐
│ Claude Code │ L3 · Diff
└──────┬───────┘
│
┌──────▼───────┐
│ Ollama │ L2 · Inference (опц.)
└──────┬───────┘
│
┌──────▼───────┐
│ GitHub Runner│ L1 · Fact ← эта статья
└──────┬───────┘
│
┌──────▼───────┐
│ Cloud Mac │ L0
└──────────────┘
L0 держит вычисления; L1 — доверие организации (Fact); выше Diff, Context, Workflow.
Зачем execution engine: роль и цепочка iOS
Как execution engine (движок исполнения) L1 делает три повторяемые задачи:
- События репозитория —
push,pull_request,workflow_dispatch→ jobs с labels runner. - macOS toolchain —
xcodebuild,swift test,notarytool, подпись — на Linux не заменить. - Развязка с AI — правка агента ≠ зелёная CI; runner даёт артефакты и отчёты.
Цепочка L1 (концептуально)
Claude Code (L3, SSH)
│ git push
▼
GitHub Actions
▼
Runner (L1 · self-hosted · macOS · ARM64)
├── xcodebuild
├── тесты
├── archive → .ipa
└── fastlane → TestFlight
Кодирование в L3; бинарная доставка в L1. Без L1 — «агент готов», а в App Store Connect пусто.
# .github/workflows/ios-ci.yml (фрагмент) jobs: build-ios: runs-on: [self-hosted, macOS, ARM64, cloud-mac] steps: - uses: actions/checkout@v4 - run: xcodebuild -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16' test
Поисковый интент: редко «GitHub Runner», чаще iOS CI
Реальные запросы:
- GitHub Actions self-hosted runner macOS / Apple Silicon runner
- GitHub Runner Mac mini / iOS CI/CD self-hosted
- GitHub Actions iOS build / автоматизация TestFlight
Один архитектурный вопрос: диспетчеризация на свой узел M-series вместо Linux-пула или очереди macos-latest. Cloud Mac или офисный Mac mini — железо; регистрация runner + labels — L1. Сравнение: Mac mini vs Cloud Mac для iOS-команд. Стоимость — L1-Q05 позже.
Когда Linux достаточен — и когда нет
| Измерение | ubuntu-latest | Cloud Mac self-hosted |
|---|---|---|
| Xcode / iOS | ❌ | ✅ нативно |
| ARM64-согласованность | иная | как у dev-машины |
| Claude Code на том же узле | ❌ | ✅ опция |
| ежедневная CI | минуты + очередь | фиксированный узел |
Linux часто хватает: статический Next.js, API Node/Python/Go в Docker, редкий CI в личном репо. Сигнал macOS runner: Xcode, подпись, симулятор, TestFlight в workflow — или вы уже сравниваете Mac mini vs Cloud Mac.
Hosted macos-latest vs self-hosted на Cloud Mac
| Hosted | Self-hosted Cloud Mac |
|---|---|
| редкий archive, <5 macOS jobs/мес | ежедневная CI, стабильные сертификаты |
| очередь и поминутная оплата OK | AI + CI один стек, одна машина под мониторингом |
| нет фиксированного egress IP | статический IP, intranet-артефакты, CodeGraph в смену |
Эмпирическое правило (не SLA): >10 macOS jobs/неделю, много sign/archive → L1 на фиксированном узле. Ниже — сначала hosted macOS для проверки pipeline.
Внедрение: сначала Fact, потом Diff
Структурная схема — ответственность; развёртывание часто противоположно хайпу:
- L0 — Cloud Mac (SSH, egress).
- L1 — runner, воспроизводимый
push → зелёный/красный(этот текст). - L2–L3 — Ollama Inference, Claude Code Diff на стабильной CI.
- L4–L5 — MCP Context, OpenHands Workflow.
CodeGraph + агент может тронуть 18 файлов — без macOS CI неизвестно, взорвётся ли archive. Также Mac mini + Claude Code 2026 (L3); здесь L1 — ночью runner, днём агент, роли раздельны.
Решение: L1 как execution engine
| L1 в приоритете (self-hosted Cloud Mac) | не обязательно |
|---|---|
| нативные iOS/macOS приложения | чистые статические сайты |
| Flutter с iOS/Xcode | только Android/Web |
| Claude Code на Cloud Mac, CI ещё Linux | Node/Python только Docker/Linux |
| TestFlight / notarize автоматически | редкие hobby-релизы |
| фикс IP, CodeGraph на том же хосте | редкого macos-latest хватает |
Два пункта слева? Следующий шаг — L1 в эксплуатации, не ещё один MCP. Серия: L1.
Серия L1: от execution engine к рабочей macOS CI
Фундамент L1-Q01 (эта статья). Далее:
| Часть | qid | Статус |
|---|---|---|
| L1-Q01 · зачем runner = execution engine | Diff → Fact | ✅ |
| L1-Q02 · регистрация на Cloud Mac | пошагово | следующая |
| L1-Q03 · Claude Code + CI на одном хосте | окна | план |
| L1-Q04 · изоляция workspace | безопасность | план |
| L1-Q05 · Mac mini vs Cloud Mac стоимость | очереди | план |
Google группирует кластеры; L2+ опирается на существующий Fact — обратная ссылка #stack-map.
FAQ
Cloud Mac vs runner?
L0 vs L1. Аренда ≠ runner автоматически.
Только MacBook как runner?
Можно; крышка, RAM с агентом, смена IP. Ежедневная macOS CI → Cloud Mac 24/7.
Runner и Claude Code на одной машине?
Не обязательно; один узел снижает SSH-зелёный / Actions-красный.
OpenClaw?
Runner = steps; OpenClaw = Workflow. См. OpenClaw cloud automation.
Diff vs Fact?
Diff = правки агента; Fact = checks, логи, артефакты. Merge опирается на Fact. MCP = Context; OpenHands = Workflow.
Ollama под Claude Code на схеме — обязателен?
Нет. L2 Inference опционален; L3 часто API. #stack-map.
L1 · Далее L1-Q02
Self-hosted GitHub Actions runner на Cloud Mac (macOS)
Здесь — зачем L1. Потом: labels, actions/runner, launchd, ротация токенов — Diff и Fact на одном Apple Silicon.
