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.
Mémoire : matrix nocturne + agent 24/7 sur 16 Go sans fenêtre → swap ; consigner memory pressure.
SSD : DerivedData et skills/ sans quota → build cassé, écritures MEMORY ralenties.
Port 18789 : double daemon ou tunnel → statut « vert » faux.
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.
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.
| Charge | M4 16 Go | 24 Go/512 | M4 Pro | Signal same-pool |
|---|---|---|---|---|
| 1× archive xcodebuild | OK isolé | OK agent idle | Confortable | Timeouts outils agent si RAM > 70 % au link |
| 2× jobs iOS parallèles | Risque | Moyen | Préféré | IOPS DerivedData > 80 % SSD busy |
| Simulateur + Gateway | Déconseillé | Fenêtre requise | OK avec tags | Probe channels P95 > 5 s |
| Gateway 24/7 + CI nocturne | Split conseillé | Tags + cron | Same pool possible | Conflit 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.
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.
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 ».
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 :
Git + LFS APAC principal : label SG ou HK ; builds US uniquement pour release.
API modèle US seulement : Gateway US-Ouest, CI APAC → split pool ou politique proxy au ticket.
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.
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.
| Profil | Same pool M4 24 Go | M4 Pro | Second nœud |
|---|---|---|---|
| Agent 24/7 + archive iOS hebdo | OK avec fenêtre | Confort | Surdimensionné |
| Matrix nocturne + agent + dev SSH | Risque | Préféré | Si conformité |
| Deux orchestrateurs + Gateway | Non | Moyen | Pré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.