Pourquoi c'est important maintenant
Shopify a fait un pari en 2024 qui semblait absurde à l'époque : migrer toute l'entreprise vers un monorepo unique (« World ») et imposer Nix partout pour la reproductibilité. La raison ? « Le code sera de plus en plus écrit avec l'IA, et notre infrastructure doit être le substrate pour cela. »
Deux ans plus tard, ce pari a porté ses fruits. L'article « Under the River », publié le 28 mai 2026 sur le blog d'ingénierie de Shopify — et co-rédigé par l'agent lui-même — détaille l'infrastructure qui a rendu ce déploiement possible.
Les chiffres : 59 918 sessions en 30 jours, 5 170 canaux Slack, plus de 7 000 personnes atteintes, 3 536 PR co-rédigées par l'agent fusionnées. Mais voici ce qui importe pour l'architecte de processus IA : pas les chiffres. L'architecture sous-jacente.
L'architecture à 4 couches
Voici le flux complet, d'une question posée à @River dans Slack jusqu'à un commit co-rédigé :
slack { # Slack - Interface
n1: circle label:"@River in Slack"
n2: rectangle label:"Public channel question"
n11: rectangle label:"Response received"
n1.handle(right) -> n2.handle(left)
n2.handle(bottom) -> river.n3.handle(top) [label="1. Request"]
}
river { # River - Agent Surface
n3: rectangle label:"Analyzes request"
n4: rectangle label:"Delegates to Aquifer"
n10: rectangle label:"Formats response"
n3.handle(right) -> n4.handle(left)
n4.handle(bottom) -> aquifer.n5.handle(top) [label="2. Session"]
aquifer.n9.handle(top) -> n10.handle(bottom) [label="5. Result"]
n10.handle(top) -> slack.n11.handle(bottom) [label="6. Response"]
}
aquifer { # Aquifer - Foundation
n5: rectangle label:"Harness plans"
n6: rectangle label:"Sandbox executes"
n7: diamond label:"Done?"
n8: rectangle label:"Consolidates"
n9: rectangle label:"Returns result"
n5.handle(right) -> n6.handle(left)
n6.handle(bottom) -> world.n12.handle(top) [label="3. Read/write"]
n6.handle(right) -> n7.handle(left)
n7.handle(top) -> n5.handle(bottom) [label="No"]
n7.handle(bottom) -> n8.handle(top) [label="Yes"]
n8.handle(right) -> n9.handle(left)
}
world { # World - Monorepo
n12: rectangle label:"Executes on repo"
n13: rectangle label:"Runs tests - opens PR"
n12.handle(right) -> n13.handle(left)
n13.handle(top) -> aquifer.n7.handle(bottom) [label="4. Output"]
}
Quatre couches, six messages inter-couches. Aucune de ces couches n'est le modèle. Le modèle est un détail d'implémentation à l'intérieur du Harness. L'architecture est la décision qui compte.
Décision 1 : « Agent-Friendly » = « Human-Friendly » (le pattern contre-intuitif)
Shopify a découvert que chaque changement fait pour les agents était aussi le bon changement pour les humains :
| Problème humain | Problème agent | Solution partagée |
|---|---|---|
| Environnement de dev non reproductible | L'agent ne peut rien reproduire non plus | Nix partout |
| Repo fragmenté | L'agent ne peut pas voir à travers les silos | Monorepo « World » |
| Connaissances non documentées | L'agent ne peut pas apprendre ces choses | Fichiers de compétences écrits |
« Le travail pour rendre une codebase lisible par un agent est simplement la dette que vous devez à vos ingénieurs humains. Les agents rendent cette dette visible. » — Shopify Engineering
Ce que ça change pour l'architecte de processus IA : Arrêtez de construire des agents qui compensent la dette technique. Construisez une infrastructure qui rend la codebase lisible — pour les humains ET les agents. Le ROI est à double usage.
Transposition assurance : Une compagnie d'assurance qui documente ses règles de souscription pour un agent les documente aussi pour ses souscripteurs humains. Le référentiel de règles devient l'actif partagé.
Décision 2 : Un agent privé a un plafond
River a une contrainte radicale : il ne fonctionne que dans les canaux publics. Pas de messages directs. Chaque conversation devient une transcription Slack indexée, consultable par tous les employés de Shopify.
Pourquoi ? Parce qu'un agent privé a un plafond : la personne au clavier.
« Si chaque interaction avec un agent se déroule dans une fenêtre privée, la seule personne qui apprend quoi que ce soit est la personne au clavier. » — Tobi Lütke
Shopify exploite ce corpus de conversations publiques. La solution durement acquise par un développeur devient le point de départ du développeur suivant. L'agent s'améliore sans fine-tuning du modèle, simplement en absorbant les patterns du corpus. La codebase enseigne à l'agent. L'agent enseigne à la codebase.
Ce que ça change pour l'architecte de processus IA : Votre prochain agent interne devrait être public par défaut. La « confidentialité » d'une session d'agent est un désavantage — elle empêche l'apprentissage collectif. Le corpus de conversations est un actif à rendement composé.
Transposition bancaire : Dans une banque, les agents de conformité et les développeurs utilisent des canaux séparés. Un agent interne public force la transversalité — la question réglementaire posée par un développeur devient visible pour toute l'équipe de conformité. Le corpus devient la mémoire institutionnelle.
Décision 3 : Découpler le cerveau des mains
C'est la décision architecturale centrale d'Aquifer. Shopify décompose l'infrastructure en trois entités :
Session → Durable. Journal d'événements en appendice seule. Postgres. Vérité canonique. Harness → Boucle d'agent. Lit l'historique, appelle le LLM, émet des intentions d'outils. Jetable. Sandbox → Là où le code s'exécute. Système de fichiers, shell, le repo. Jetable.
dev { # Dev - Slack
n1: circle label:"@River mention"
n2: rectangle label:"Agent request"
n12: rectangle label:"Receives response"
n1.handle(right) -> n2.handle(left)
n2.handle(bottom) -> harness.n3.handle(top) [label:"Prompt"]
}
harness { # Harness - Brain
n3: rectangle label:"Loads history"
n4: rectangle label:"Calls LLM"
n5: rectangle label:"Emits tool intents"
n11: rectangle label:"Responds to dev"
n3.handle(right) -> n4.handle(left)
n4.handle(right) -> n5.handle(left)
n5.handle(bottom) -> sandbox.n6.handle(top) [label:"bash, edit"]
sandbox.n10.handle(top) -> n11.handle(bottom) [label:"Result"]
n11.handle(top) -> dev.n12.handle(bottom) [label:"Response"]
}
sandbox { # Sandbox - Hands
n6: rectangle label:"Sets up environment"
n7: rectangle label:"Runs commands"
n8: diamond label:"OK?"
n9: rectangle label:"Raw output"
n10: rectangle label:"Returns output"
n6.handle(right) -> n7.handle(left)
n7.handle(right) -> n8.handle(left)
n8.handle(right) -> n9.handle(left) [label:"Yes"]
n8.handle(bottom) -> n6.handle(top) [label:"No - retry"]
n9.handle(right) -> n10.handle(left)
}
Le Harness vit en dehors du Sandbox. L'agent ne vit pas là où le code vit.
Ce pattern n'est pas unique à Shopify. Anthropic le formalise différemment avec son tool use et computer use — où l'agent émet des intentions d'outils depuis un contexte sécurisé vers un environnement d'exécution isolé. OpenAI le fait avec Operator, où le « cerveau » (le GPT qui raisonne sur la tâche) est découplé du « navigateur » qui exécute les actions. Hermes Agent (Nous Research) applique le même principe avec ses profils — le SOUL.md (cerveau) est distinct des compétences et du sandbox d'exécution.
La différence clé : Shopify pousse le découplage jusqu'à la session. Chez Anthropic, la session est liée au processus. Chez Shopify, la session survit au processus.
Trois propriétés qui découlent de cela, et vous ne pouvez en rétrofiter aucune :
- Sécurité : La boucle d'agent n'est pas dans le même rayon d'explosion que
rm -rf - Remplaçabilité : Changez de modèles, de runtimes, voire de langages côté
Harnesssans toucher auSandbox - Observabilité : Tout le flux de décision vit côté
Harness, visible en un seul endroit
Ce que ça change pour l'architecte de processus IA : Si votre agent vit dans le même processus que l'exécution de code, vous ne pourrez pas rétrofiter la sécurité et l'observabilité plus tard. Commencez par cette frontière.
Transposition télécoms : Un agent de diagnostic réseau chez un opérateur télécom ne doit JAMAIS avoir d'accès direct aux équipements. Le Harness analyse les logs et émet des intentions (« vérifier l'interface X »), le Sandbox exécute dans un environnement isolé avec des permissions précises. La piste d'audit est dans le Harness, pas dans le Sandbox.
Décision 4 : Du bétail, pas des animaux de compagnie — au niveau de la session
La phrase clé de l'article : « Les cellules meurent, les sandboxes meurent, les machines meurent. La conversation, elle, ne meurt pas. »
Le modèle de session d'Aquifer est radicalement simple :
- Une Cellule de Session = un processus éphémère sur un hôte, exécutant le runtime Go et le
Harness - Inactive → elle s'arrête. Interaction suivante → nouvelle Cellule, possiblement sur un hôte différent
- L'identité de session est inchangée. La conversation est entièrement préservée dans Postgres, pas en mémoire.
« Nous ne soignons pas les processus individuels. Nous les provisionnons, les exécutons, les suspendons, les détruisons et les re-provisionnons, et nous le faisons sur une fondation qui rend cela peu coûteux. »
Ce que ça change pour l'architecte de processus IA : Ne construisez pas un agent monolithique qui garde tout en mémoire. Construisez une fondation qui traite la session comme l'entité durable, et tout le reste comme jetable.
Le pont sémantique avec Hermes : Le profil Hermes Agent fonctionne sur le même principe — le SOUL.md, les compétences et la mémoire persistante survivent aux sessions. Le processus Hermes est jetable. La conversation et la configuration sont durables. Shopify et Hermes convergent vers le même pattern sans coordination — signe qu'il s'agit d'une loi architecturale, pas d'une préférence d'implémentation.
Décision 5 : Le prochain agent est un profil, pas une plateforme
Une fois River livré, d'autres équipes Shopify ont voulu le leur :
- Agents de revue de PR
- Agents de recherche
- Agents de migration
- Scans de conformité
- Investigations de performance
Toutes des variantes de la même idée : des workflows agentiques sur le monorepo, dans Slack, durables, multijoueurs.
La réponse de Shopify : Aquifer, la plateforme. River est un profil par-dessus. La revue de PR est un autre profil. L'agent headless « pi » est un troisième.
river { # Interactive Mode
n1: circle label:"@River Slack"
n2: rectangle label:"Public session"
n1.handle(right) -> n2.handle(left)
n2.handle(bottom) -> aquifer.n7.handle(top) [label:"via Aquifer"]
}
review { # Automation Mode
n3: circle label:"PR Webhook"
n4: rectangle label:"Automated review"
n3.handle(right) -> n4.handle(left)
n4.handle(bottom) -> aquifer.n8.handle(top) [label:"via Aquifer"]
}
ci { # Batch Mode
n5: circle label:"CI Trigger"
n6: rectangle label:"Ephemeral batch"
n5.handle(right) -> n6.handle(left)
n6.handle(bottom) -> aquifer.n9.handle(top) [label:"via Aquifer"]
}
aquifer { # Aquifer - Shared Foundation
n7: rectangle label:"Session model"
n8: rectangle label:"Sandbox plane"
n9: rectangle label:"Gateway"
n7.handle(right) -> n8.handle(left)
n8.handle(right) -> n9.handle(left)
}
Un profil = prompt système + compétences + extensions + politique de sandbox + valeurs par défaut du modèle. Ajouter un nouvel agent = ajouter un bundle, pas construire une nouvelle plateforme.
Ce que ça change pour l'architecte de processus IA : Si votre deuxième agent force une deuxième plateforme, vous n'avez pas encore construit la fondation.
Le pont sémantique à travers les écosystèmes :
- Shopify appelle ça un « profil » (bundle Nix avec prompt + compétences + politique de sandbox)
- Hermes Agent appelle aussi ça un « profil » — SOUL.md + compétences + plugins + cron + mémoires
- OpenAI appelle ça un « GPT personnalisé » — instructions + fichiers de connaissance + actions
- Anthropic n'a pas d'équivalent direct — Claude Code et l'API Claude sont des produits distincts, pas des profils sur une fondation unifiée
La convergence Shopify/Hermes sur le concept de « profil » est frappante — deux écosystèmes indépendants arrivant au même pattern architectural. La divergence avec Anthropic est tout aussi instructive : sans couche « profil », chaque nouvel agent force une nouvelle intégration.
La feuille de route de l'architecte de processus IA
Shopify a prouvé qu'un déploiement d'agent interne à grande échelle n'est pas un problème de modèle — c'est un problème d'architecture. Trois priorités, extraites directement de l'article et transposées aux secteurs réglementés :
| Priorité | Ce que ça signifie en pratique | Secteur critique |
|---|---|---|
| 1. Découpler le cerveau des mains | Le Harness ne vit PAS dans le Sandbox. La sécurité, la remplaçabilité et l'observabilité ne sont pas optionnelles — vous ne pouvez pas les rétrofiter. | Banque : la piste d'audit réglementaire vit dans le Harness. Assurance : le souscripteur humain valide les décisions du Harness avant l'exécution dans le Sandbox. |
| 2. Rendre l'agent multijoueur par construction | Un agent privé a un plafond : la personne au clavier. Un agent public enseigne à chaque session qui suit. Le corpus est l'actif à rendement composé. | Télécoms : le corpus de diagnostic réseau s'enrichit à chaque incident. Retail : les questions sur le catalogue marchand deviennent la base de connaissances collective. |
| 3. Traiter le prochain agent comme un profil | Le coût d'un nouvel agent devrait être un nouveau bundle sur la même fondation. Pas une nouvelle plateforme. | Tous les secteurs : si votre agent de conformité et votre agent développeur ne partagent pas la même fondation, vous construisez l'infrastructure deux fois — et vous créez deux surfaces d'attaque. |
Et la méta-leçon, celle qui traverse tout l'article : la session est ce qui doit survivre. Pas le processus, pas le sandbox, pas le modèle. La conversation. Si vous ne construisez pas autour de cette idée, vous reconstruirez tout plus tard.
Pourquoi cette architecture importe aux secteurs réglementés
Le cas d'étude Shopify n'est pas qu'une leçon d'e-commerce. Les 5 décisions architecturales documentées par River sont directement transposables à trois secteurs prioritaires FlowZap :
Assurance
Une compagnie d'assurance qui déploie un agent interne pour la souscription ou le traitement des sinistres fait face au même problème que Shopify : comment auditer de façon immuable les actions d'un agent ? La réponse est dans la Décision 3 — le Harness (qui contient le flux de décision) est séparé du Sandbox (qui exécute). La piste d'audit est dans le Harness. L'auditeur ne regarde pas ce que le Sandbox a fait — il regarde ce que le Harness a décidé.
Banque
Une banque qui déploie un agent pour la conformité réglementaire ou l'analyse de crédit a besoin de la Décision 2 : l'agent doit être public par défaut. La question réglementaire posée par un développeur devient visible pour toute l'équipe de conformité. Le corpus de conversations de l'agent devient la mémoire institutionnelle de la banque — consultable, auditable, présentable au régulateur.
Télécoms
Un opérateur télécom qui déploie un agent de diagnostic réseau a besoin de la Décision 5 : le prochain agent est un profil, pas une plateforme. L'agent de diagnostic N1 (premier niveau) et l'agent d'escalade N2 (deuxième niveau) partagent la même fondation de type Aquifer. Le profil N1 a des permissions restreintes (lecture seule des logs). Le profil N2 a des permissions étendues (redémarrage d'interface). Même fondation, politiques de sandbox différentes.
