Les équipes iOS qui exécutent déjà GitHub Actions ou xcodebuild sur un Mac mini M4 cloud KVMNODE et veulent un Gateway OpenClaw permanent sur le même hôte n’achètent plus la question « est-ce possible » en 2026, maisqui perd en premier sous pression mémoire, IOPS DerivedData, port 18789 et environnement launchd. Cet article fournit un tableau d’échec « same-pool » en quatre lignes, une matrice de contention pour builds parallèles, simulateur, Gateway et sondes channels, un kit labels plus cron collable, un arbre court pour six régions (Singapour, Tokyo, Séoul, Hong Kong, US Est, US Ouest) et la fourche M4 24 Go/512 → M4 Pro ou second nœud. À lire avec le guide runner Actions self-hosted, la ligne de base persistance OpenClaw, la sonde channels, l’échelle de diagnostic et la gouvernance nœud partagé.
01

Quatre modes d’échec « same-pool » et limites de responsabilité sur un M4 dédié

Un Mac mini M4 loué est dédié, pas magiquement compartimenté : CI iOS, Gateway OpenClaw, SSH humain et sondes cron nocturnes partagentmémoire unifiée, un SSD, un espace launchd et souvent un trousseau login. Les incidents 2026 les plus fréquents ne sont pas « GitHub en panne », mais des propriétaires qui se chevauchent sans champs de ticket. Premièrementpression mémoire : xcodebuild parallèle, simulateur et pics Gateway compriment le cache ; l’agent semble lent pendant que la CI signale des flakes. DeuxièmementI/O disque et DerivedData : les jobs CI effacent ou remplissent des chemins que l’agent touche via skills/ volumineux. Troisièmementport 18789 et vérité du listener : double gateway start, tunnel SSH oublié ou healthcheck runner sur le mauvais socket. Quatrièmementdérive launchd : WorkingDirectory, OPENCLAW_* et RUNNER_TOOL_CACHE divergent après demi-mise à niveau.

La responsabilité doit figurer dans chaque fiche de changement : la plateforme possède labels runner et concurrence ; le propriétaire agent possède version Gateway et chemin workspace ; la sécurité possède rotation keychain et secrets. Alignez d’abord la baseline sur persistance et install-daemon officiel avant d’ajouter des labels CI sur le même hôte.

01

Mémoire : matrix nocturne + agent 24/7 sur 16 Go sans fenêtre → swap ; consigner memory pressure.

02

SSD : DerivedData et skills/ sans quota → build cassé, écritures MEMORY ralenties.

03

Port 18789 : double daemon ou tunnel → statut « vert » faux.

04

launchd : job runner et plist Gateway avec PATH différent → OK en SSH, KO la nuit.

Étendez la gouvernance SSH aux tags runner si des prestataires partagent l’hôte. Après migration mémoire agent, voir migration workspace avant de remettre la CI sur les mêmes chemins.

02

Matrice de contention : xcodebuild, simulateur, Gateway et channels sur un pool Silicon

Le tableau ci-dessous fixe desseuils pour semaines d’acceptation sur SKU KVMNODE : M4 16 Go/256, 24 Go/512 et M4 Pro. Ce ne sont pas des benchmarks absolus ; la taille de votre app décale les lignes. Objectif : savoir avant achat si le « same pool » est un problème de labels ou de matériel.

ChargeM4 16 Go24 Go/512M4 ProSignal same-pool
1× archive xcodebuildOK isoléOK agent idleConfortableTimeouts outils agent si RAM > 70 % au link
2× jobs iOS parallèlesRisqueMoyenPréféréIOPS DerivedData > 80 % SSD busy
Simulateur + GatewayDéconseilléFenêtre requiseOK avec tagsProbe channels P95 > 5 s
Gateway 24/7 + CI nocturneSplit conseilléTags + cronSame pool possibleConflit port/launchd répété

Télémétrie utile en acceptation : df -h horaire sur DerivedData et workspace, latence probes Gateway en JSON, champ « qui a déverrouillé le keychain » dans le modèle d’incident. Si la matrice passe au rouge : séparer letemps, puis leschemins, puis l’hôte. Voir stockage et CI Xcode et échelle diagnostic L1/L2 avant d’ajouter des runners.

Same pool = un Silicon, deux propriétaires — la matrice dit si les labels suffisent.

03

Isolation minimale : tags runner, fenêtres de build, sondes cron et noms de keychain

CI et OpenClaw peuvent cohabiter si lesnamespaces ne deviennent pas synonymes. Ancrez region-sg, workload-ios-archive, workload-openclaw-probe, pool-shared-m4 — pas de macos-ci générique. Les groupes de concurrence par type de branche évitent que files d’attente merge et hooks agent explosent la même queue. Les fenêtres de build sont le levier d’isolation le moins cher sur 24 Go quand l’agent reste 24/7.

YAML
concurrency:
  group: ios-${{ github.ref }}
  cancel-in-progress: true

jobs:
  archive:
    runs-on: [self-hosted, macOS, region-sg, workload-ios-archive, pool-shared-m4]

Les sondes cron (santé Gateway, channels, espace libre) suivent les familles launchd de la sonde channels, avec logs séparés des _diag runner. Règle keychain : login.keychain humain, ci-signing.keychain CI, credentials webhooks agent — trois noms, trois tickets de rotation. Complétez le guide runner d’un champ « listener OpenClaw ».

Conseil : un job probe workload-openclaw-probe toutes les 15 minutes n’exécute pas xcodebuild et évite que la CI nocturne masque le port Gateway comme « runner offline ».

04

Six régions : Git/artefacts, egress API modèle et placement same-pool

La région lieDerivedData, registre conteneurs et sortie API modèle. KVMNODE couvre Singapour, Tokyo, Séoul, Hong Kong, US Est et US Ouest — voir le guide multi-régions, puis cet arbre :

A

Git + LFS APAC principal : label SG ou HK ; builds US uniquement pour release.

B

API modèle US seulement : Gateway US-Ouest, CI APAC → split pool ou politique proxy au ticket.

C

Semaine spike : aligner sur spike vs baseline — same pool seulement si slots baseline réservés.

Documentez région, SKU, jeu de labels et politique egress dans chaque changement. « Tarball rapide » n’est pas colocation si npm, SPM et appels modèle traversent trois continents.

05

Arbre split-pool : M4 24 Go/512 → M4 Pro ou second nœud dédié

Restez en same pool si : un agent, channels légers, CI ≤ 1 archive parallèle, pression mémoire < 1×/semaine, port 18789 stable. Passez auM4 Pro même région si : 2+ jobs iOS, simulateur régulier, gros memory/, ou IOPS répétées avec Gateway actif. Ajoutez unsecond M4 dédié si : identités Apple Developer distinctes, séparation blast-radius stricte, ou seconde famille d’exécuteurs après GitLab/Jenkins.

ProfilSame pool M4 24 GoM4 ProSecond nœud
Agent 24/7 + archive iOS hebdoOK avec fenêtreConfortSurdimensionné
Matrix nocturne + agent + dev SSHRisquePréféréSi conformité
Deux orchestrateurs + GatewayNonMoyenPréféré

Note : un second nœud sans discipline de labels ne fait que dupliquer le chaos — tags et keychains d’abord, matériel ensuite.

Déploiement en six étapes grises : Gateway seul jusqu’aux probes vertes ; un job CI fumée ; concurrence stricte ; matrix nocturne après une semaine verte ; channels sous charge ; décision same pool vs split archivée. Pour une location Mac mini KVMNODE auditables en six régions : commande via page de commande, runbooks au centre d'aide, tarifs sur tarifs location.