Nous venons de publier Cloud Mac vs Mac local : de plus en plus d’équipes déplacent Claude Code, l’index CodeGraph et parfois Ollama vers un nœud macOS toujours allumé. L’illusion qui suit : « une fois dans le cloud, chaque git push devient vert ». En réalité, l’agent célèbre la victoire en SSH pendant que GitHub Actions tourne encore sur ubuntu-latest, sans xcodebuild, ou avec des jobs macOS qui attendent trente minutes.
Ce texte n’est ni une fiche Wikipédia sur le « GitHub Runner », ni un tutoriel d’enregistrement actions/runner (réservé à L1-Q02). Il pose une méthode extensible : le Cloud Mac AI Stack, où L1 explique pourquoi une couche d’exécution doit exister seule — et pourquoi louer un Cloud Mac sans runner ne fait qu’une belle session distante.
Cloud Mac AI Stack · Slogan
Claude Code produit le Diff, GitHub Runner produit le Fact.
Au lieu de parler seulement « agent / outil / CI », nous enchaînons Context → Diff → Fact → Workflow comme types de livrables. Diff = changements proposés ; Fact = builds et checks vérifiables. Inference (L2, optionnel) = inférence locale privée sur le nœud.
L1 dans le Stack
Claude Code (L3) répond « comment modifier le code ? » GitHub Runner (L1) répond « l’organisation peut-elle merger, signer et livrer ? » Sans L1, chaque Diff reste une opinion dans un terminal — pas de Fact sur le bouton merge.
Langage Stack : Context → Diff → Fact → Workflow
On lit partout Claude Code, Cursor, MCP, OpenHands — rarement qui produit la vérité organisationnelle après l’edit. Dans le Cloud Mac AI Stack, quatre livrables (L2 Inference à part) :
Chaîne (≠ ordre runtime · voir #stack-map)
Context → Diff → Fact → Workflow
(MCP) (Claude Code) (Runner) (OpenHands)
| Niveau | Rôle | Composant | Livrable |
|---|---|---|---|
| L0 | Infrastructure | Cloud Mac | Surface macOS |
| L1 | Exécution | GitHub Runner | Fact |
| L2 | Inférence | Ollama | Inference (optionnel) |
| L3 | Codage | Claude Code | Diff |
| L4 | Connexion outils | MCP | Context |
| L5 | Exécution autonome | OpenHands | Workflow |
La question n’est pas « le LLM est-il assez malin ? » mais : L1 existe-t-il comme couche ? Sans Fact, aucun PR ne devient vert, quel que soit le Context ou le Diff.
Codage vs exécution : pourquoi « Cloud Mac » ne ferme pas la CI
Dans Cloud Mac vs Mac local, nous séparons l’Inference modèle (API) de l’exécution agent (shell sur macOS). Une deuxième coupure manque souvent : la CI après le push — reproductible, auditable, indépendante de la session SSH.
| Couche | Typique | Déclencheur | Question |
|---|---|---|---|
| Codage / agent | Claude Code, Cursor | Terminal, IDE | « Aide-moi à finir cette PR » |
| Exécution / CI | GitHub Actions + runner self-hosted | push, PR, cron | « Ce commit build-t-il et teste-t-il dans l’environnement défini ? » |
La fracture : tests verts en SSH sur Cloud Mac, workflow ciblant ubuntu-latest. La vérité officielle du dépôt reste rouge. Pour l’iOS, pas de TestFlight sur Linux. L1 exige souvent la même classe macOS Apple Silicon que les postes dev.
Chez les équipes produit francophones (mobile B2B, SaaS avec app native), la conformité demande des builds reproductibles, pas des captures d’écran SSH. Le runner transforme « l’agent dit OK » en Fact — logs, artefacts, checks.
Erreur classique : « tous les tests passent » — PR rouge
Schéma récurrent dans les dépôts clients :
- Claude Code en SSH sur Cloud Mac : « tous les tests passent ».
git push, réunion sereine.- Actions avec
runs-on: ubuntu-latest. - Checks rouges ; log fréquent :
xcodebuild: command not found— ou seuls des tests Node verts, pas de job iOS.
Claude Code n’est pas en cause — environnement session ≠ environnement CI. Le runner reproduit l’affirmation en Fact sur la même ligne GitHub Actions self-hosted runner macOS, éventuellement le même nœud que l’agent.
Le runner n’est pas « encore un Mac en location »
- Pas une fiche produit Cloud Mac — la location est L0 ; le runner est processus + labels + politique workspace sur L0.
- Pas le manuel
macos-latest— modèles de file et de coût différents pour hébergé vs self-hosted. - Pas un substitut à OpenClaw — là c’est l’orchestration Workflow ; le runner exécute
xcodebuildetfastlane.
Cloud Mac fournit macOS et réseau ; runner branche cette capacité au modèle d’événements GitHub. Sans runner, Cloud Mac = bureau distant ; avec runner, infrastructure.
Cinq niveaux · Stack ≠ ordre d’appel (#stack-map)
Les articles L2–L5 pointeront ici. Le schéma montre des niveaux de responsabilité, pas « qui appelle qui au runtime ».
Important
- Claude Code n’a pas besoin d’Ollama — L3 souvent via API ; L2 Inference optionnel.
- MCP au-dessus de L3 sur le schéma = couche Context, pas « MCP démarre avant le CLI ».
- Déploiement : #stack-order — distinct du portage bottom-up.
Cloud Mac AI Stack (responsabilité · bas → haut)
┌──────────────┐
│ OpenHands │ L5 · Workflow
└──────┬───────┘
│
┌──────▼───────┐
│ MCP │ L4 · Context
└──────┬───────┘
│
┌──────▼───────┐
│ Claude Code │ L3 · Diff
└──────┬───────┘
│
┌──────▼───────┐
│ Ollama │ L2 · Inference (optionnel)
└──────┬───────┘
│
┌──────▼───────┐
│ GitHub Runner│ L1 · Fact ← cet article
└──────┬───────┘
│
┌──────▼───────┐
│ Cloud Mac │ L0
└──────────────┘
L0 porte la puissance ; L1 porte la confiance org (Fact) ; au-dessus Diff, Context, Workflow.
Pourquoi « execution engine » : rôle et chaîne iOS
En execution engine (moteur d’exécution), L1 assure trois tâches répétables :
- Événements dépôt —
push,pull_request,workflow_dispatch→ jobs avec labels runner. - Chaîne macOS —
xcodebuild,swift test,notarytool, signature — irremplaçable sur Linux. - Découplage IA — edit agent ≠ CI verte ; le runner livre artefacts et rapports.
Chaîne L1 (conceptuelle)
Claude Code (L3, SSH)
│ git push
▼
GitHub Actions
▼
Runner (L1 · self-hosted · macOS · ARM64)
├── xcodebuild
├── tests
├── archive → .ipa
└── fastlane → TestFlight
Le codage est en L3 ; la livraison binaire en L1. Sans L1 : « agent terminé » sans build dans App Store Connect.
# .github/workflows/ios-ci.yml (extrait) 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
Intention de recherche : rarement « GitHub Runner », souvent CI iOS
Les requêtes réelles :
- GitHub Actions self-hosted runner macOS / Apple Silicon runner
- GitHub Runner Mac mini / iOS CI/CD self-hosted
- GitHub Actions iOS build / automatisation TestFlight
Même question d’architecture : dispatcher sur votre nœud M-series plutôt que pool Linux ou macos-latest en file. Cloud Mac ou Mac mini au bureau = matériel ; enregistrement runner + labels = L1. Comparaison matérielle : Mac mini vs Cloud Mac pour équipes iOS. Coûts : L1-Q05 à venir.
Quand Linux suffit — et quand non
| Dimension | ubuntu-latest | Cloud Mac self-hosted |
|---|---|---|
| Xcode / iOS | ❌ | ✅ natif |
| Cohérence ARM64 | différente | comme poste dev |
| Claude Code même nœud | ❌ | ✅ option |
| CI quotidienne | minutes + file | nœud fixe |
Linux suffit souvent : site Next.js statique, API Node/Python/Go en Docker, petit dépôt perso. Signal runner macOS : Xcode, signature, simulateur, TestFlight dans les workflows — ou vous comparez déjà Mac mini vs Cloud Mac.
macos-latest hébergé vs self-hosted Cloud Mac
| Hébergé | Self-hosted Cloud Mac |
|---|---|
| archive rare, <5 jobs macOS/mois | CI quotidienne, certificats stables |
| file et tarif minute OK | IA + CI même stack, une machine observable |
| pas d’IP egress fixe | IP statique, artefacts intranet, CodeGraph en décalé |
Règle empirique (non contractuelle) : >10 jobs macOS/semaine, beaucoup sign/archive → L1 sur nœud fixe. En dessous : valider d’abord avec macOS hébergé.
Déploiement : Fact avant Diff
Schéma structurel = responsabilité ; le déploiement inverse souvent l’ordre hype :
- L0 — Cloud Mac (SSH, egress).
- L1 — runner,
push → vert/rougereproductible (ce texte). - L2–L3 — Ollama Inference, Claude Code Diff sur CI stable.
- L4–L5 — MCP Context, OpenHands Workflow.
CodeGraph + agent peut toucher 18 fichiers — sans CI macOS, l’archive peut exploser plus tard. Voir aussi Mac mini + Claude Code 2026 (L3) ; ici L1 — runner la nuit, agent le jour, responsabilités séparées.
Décision : L1 comme execution engine
| L1 en priorité (self-hosted Cloud Mac) | optionnel |
|---|---|
| Apps iOS/macOS natives | sites statiques purs |
| Flutter avec chemin iOS/Xcode | Flutter Android/Web seul |
| Claude Code sur Cloud Mac, CI encore Linux | Node/Python uniquement Docker/Linux |
| TestFlight / notarize automatisés | releases hobby rares |
| IP fixe, CodeGraph sur même hôte | macos-latest occasionnel suffit |
Deux cases à gauche ? Exploitez L1 avant d’empiler MCP. Suite : série L1.
Série L1 : de l’execution engine à une CI macOS opérationnelle
Pierre L1-Q01 (cet article). À suivre :
| Volet | qid | Statut |
|---|---|---|
| L1-Q01 · Pourquoi runner = execution engine | Diff → Fact | ✅ |
| L1-Q02 · Enregistrement sur Cloud Mac | pas à pas | suivant |
| L1-Q03 · Claude Code + CI sur un hôte | créneaux | prévu |
| L1-Q04 · Isolation workspace | sécurité | prévu |
| L1-Q05 · Coûts Mac mini vs Cloud Mac | files | prévu |
Google regroupe les clusters ; L2+ suppose un Fact existant — lien retour #stack-map.
FAQ
Cloud Mac vs runner ?
L0 vs L1. Louer ≠ runner automatique.
Runner uniquement sur MacBook ?
Possible ; capot fermé, RAM partagée avec l’agent, IP mobile. CI macOS quotidienne → Cloud Mac 24/7.
Même machine pour runner et Claude Code ?
Pas obligatoire ; même nœud réduit SSH vert / Actions rouge.
OpenClaw ?
Runner = steps ; OpenClaw = déclenchement Workflow. Voir OpenClaw cloud automation.
Diff vs Fact ?
Diff = changement agent ; Fact = checks, logs, artefacts. Le merge s’appuie sur Fact. MCP = Context ; OpenHands = Workflow.
Ollama sous Claude Code sur le schéma — obligatoire ?
Non. L2 Inference optionnel ; L3 souvent API. #stack-map.
L1 · Prochain : L1-Q02
Runner GitHub Actions self-hosted sur Cloud Mac (macOS)
Ici : pourquoi L1. Ensuite : labels, actions/runner, launchd, rotation de tokens — Diff et Fact sur un nœud Apple Silicon.
