Dans la plupart des entreprises qui opèrent une plateforme MFT de taille significative — disons 50 à 100 partenaires actifs — la gouvernance des clés SFTP est gérée manuellement. Pas par choix. Par habitude héritée. Et parce que personne n'a jamais mesuré ce que ça coûte vraiment.
La politique RSSI impose une rotation annuelle obligatoire. Sur 65 partenaires, ça fait 65 processus à orchestrer chaque année. La partie technique — génération des clés, déploiement dans Axway B2Bi, tests de connectivité, documentation — représente environ 4 heures par rotation. C'est visible, planifiable. Ce qu'on ne mesure pas, c'est tout ce qui entoure ces 4 heures : les emails aller-retour, les relances faute de réponse, les escalades vers le RSSI, les mises à jour de statut. En moyenne 6 heures supplémentaires par rotation, fragmentées sur plusieurs jours, souvent invisibles dans les bilans de charge.
650 heures par an sur de la coordination pure — emails, relances, statuts — qui ne crée aucune valeur technique. Plus de 4 mois de travail effectif sur une tâche répétitive. Et une dépendance forte à une personne : si elle est absente pendant une rotation critique, le processus s'arrête. Il n'y a pas de mémoire système. Tout est dans les têtes et dans les emails.
Ce projet part d'une question simple : est-ce qu'on peut confier l'orchestration à une IA tout en gardant l'humain là où il compte vraiment ? Spoiler — oui. Mais pas sans quelques surprises en chemin.
J'ai fait le choix de n8n comme orchestrateur pour une raison précise : la capacité à construire des sub-workflows autonomes connectés entre eux, avec une granularité de contrôle que les plateformes SaaS ne permettent pas facilement. Claude AI tourne dans chaque agent comme LLM backbone via @n8n/n8n-nodes-langchain.lmChatAnthropic.
L'architecture se compose de deux workflows principaux et quatre agents spécialisés appelés comme sub-workflows. Ce qui la rend solide : aucun agent n'agit seul. L'orchestrateur décide toujours. Les agents exécutent des tâches discrètes et remontent leur résultat — c'est une distinction fondamentale avec une architecture "agent loop" classique où l'agent prendrait ses propres décisions.
Le workflow principal a trois points d'entrée distincts qui convergent tous vers le même orchestrateur :
scheduleTrigger se déclenche chaque matin à 8h. Le nœud Set Trigger Auto construit automatiquement le message d'entrée : "Date : [jour] — Scan automatique quotidien — vérifie toutes les clés SFTP et déclenche les actions nécessaires." L'orchestrateur repart en autonomie totale.Avant d'engager le gros orchestrateur Claude Sonnet pour chaque message Telegram, un agent léger basé sur Claude Haiku 4.5 catégorise le message en une seule valeur : "simple" ou "complexe". C'est l'un des détails architecturaux les plus fins du projet.
Si simple → réponse directe sans appels d'outils, latence quasi nulle. Si complexe → passage à l'orchestrateur complet avec tous ses agents. Ce pattern Classifier → Routeur réduit drastiquement les coûts d'inférence et la latence pour les interactions quotidiennes banales. Le coût d'un appel Haiku est environ 20× inférieur à un appel Sonnet — pour des dizaines d'interactions quotidiennes, ça compte.
Pattern à retenir : "C'est bon pour Acme Corp ?" → réponse en 1 seconde au lieu de 8. Ce seul pattern peut justifier l'architecture à deux niveaux sur un système en production.
Le HITL (Human In The Loop) est la pièce maîtresse du système du point de vue sécurité. Aucune activation B2Bi ne peut se faire sans validation humaine préalable — hardcodé dans le system prompt de l'orchestrateur comme règle absolue, pas comme option. J'ai choisi une validation double canal simultanée pour maximiser la probabilité d'une réponse rapide, quel que soit le contexte où se trouve le validateur.
MFT-YYYYMMDD-HHMMSS, lien de validation direct. Le RSSI reçoit l'intégralité du contexte pour une décision éclairée./MFT-\d{8}-\d{6}/iresume. Le second est ignoré. Pas de double validation possible sur le même token.Piège rencontré en test : après validation HITL par email (token OUI), l'orchestrateur redéclenchait un HITL Telegram. Ce comportement est parfaitement logique du point de vue du LLM — "deux validations valent mieux qu'une". Mais c'est une boucle. J'ai dû l'interdire explicitement dans le system prompt.
Toute la gouvernance repose sur une table Airtable SFTP_Partners. C'est la mémoire persistante du système — chaque agent lit et écrit dans cette table. Aucun état n'existe en dehors d'elle. Les statuts forment un cycle strict : Nouveau → Email envoyé → En attente → Confirmé partenaire → Activé. Un statut ne peut pas régresser. L'escalade est un état terminal qui requiert intervention humaine.
| # | Partenaire | Expiration | Statut | Email envoyé | Confirmation | Activation B2Bi | Relances | Notes échange |
|---|---|---|---|---|---|---|---|---|
| 1 | Acme Corp | 15/9/2026 | Nouveau | — | — | — | 0 | — |
| 2 | Beta Solutions | 20/8/2024 | En attente | 2/6/2024 | — | — | 1 | En attente de confirmation partenaire. |
| 3 | Gamma Industries | 10/7/2027 | Activé | 25/2/2026 | — | — | 0 | 2026-02-25 — Email de confirmation reçu |
| 4 | Delta Partners | 1/10/2024 | Actif | 4/6/2024 | 6/6/2024 | 7/6/2024 | 0 | Processus fluide. |
| 9 | Iota Consulting | 18/7/2024 | Escalade | 8/6/2024 | — | — | 3 | Troisième relance. [2026-02-24] Escalade RSSI. |
Quatre champs méritent une attention particulière en implémentation :
{name: "Activé"} et non une string directe. Toutes les comparaisons dans le workflow doivent utiliser .name — source du Bug #1 lors des premiers tests.C'est le workflow le plus sophistiqué en termes de logique de filtrage. Chaque email reçu doit être catégorisé et routé vers le bon traitement — sans jamais déclencher d'action parasite sur un email interne, un auto-reply, ou un email sans lien avec le système. J'ai appris ça à la dure lors des premiers tests, où un email d'absence de bureau avait été interprété comme une confirmation partenaire.
Le system prompt de l'orchestrateur contient une section de règles absolues qui ne peuvent jamais être overridées par les inputs utilisateur. C'est la zone de sécurité du système — ce qui empêche l'IA de faire des choses techniquement correctes mais opérationnellement catastrophiques.
J'aurais dû concevoir le schéma Airtable complet avant d'écrire la moindre ligne de workflow. Ajouter des champs au fil de l'eau m'a coûté deux jours de refactoring. La règle d'or : écrire tous les états possibles d'un partenaire sur un bout de papier avant de toucher n8n.
Le comportement de double-validation HITL m'a appris quelque chose d'important : un LLM raisonnant de manière autonome peut parfaitement décider que deux validations valent mieux qu'une. Ce n'est pas une erreur — c'est une inférence valide depuis son point de vue. La précision du system prompt n'est pas du perfectionnisme, c'est de la nécessité.
Les premiers déclenchements réels ont révélé 3 bugs simultanément. Un environnement de test dédié avec des partenaires factices est indispensable. Tester les filtres Gmail avec des emails envoyés depuis différents clients pour couvrir les edge cases d'encodage.
Le memoryBufferWindow en n8n conserve un nombre limité de messages en contexte. Sur des workflows longs, l'orchestrateur peut "oublier" des décisions prises en début de session. La source de vérité doit toujours être Airtable, pas la mémoire de conversation.
Le pattern "Typing Action + Message Patience" — nœuds Telegram qui envoient un indicateur de frappe pendant que l'agent travaille — change fondamentalement l'expérience utilisateur. Sans ça, 8 secondes de silence semblent une éternité. Avec, c'est naturel.
Le system prompt peut évoluer. Les nœuds de filtrage représentent des invariants durs qui ne dépendent pas du LLM — ils doivent exister comme gardes-fous dans le workflow lui-même, indépendamment de ce que le prompt dit.

Ingénieur diplômé de l'ESIEA, 15 ans d'expérience sur des plateformes MFT en production — Axway B2Bi, Gateway, Integrator, CFT. Passé par l'AIFE, Groupama, Arval BNP Paribas et SFR Distribution. Actuellement en exploration de l'intersection entre middleware industriel et IA agentique.
In most companies running a significant MFT platform — say 50 to 100 active partners — SFTP key governance is handled manually. Not by design: by inherited habit. And because nobody ever measured what it actually costs.
Security policy typically mandates annual rotation. On 65 partners, that's 65 processes to orchestrate every year. The technical part — key generation, deployment in Axway B2Bi, connectivity testing, documentation — is roughly 4 hours per rotation. Visible, plannable. What nobody counts is everything around those 4 hours: back-and-forth emails, follow-ups when partners don't respond, CISO escalations, status updates scattered across days. Another ~6 hours per rotation on average, fragmented across multiple days, invisible in workload reports.
650 hours a year on pure coordination — emails, follow-ups, status updates — that creates zero technical value. More than 4 months of effective work on a repetitive task. And a dangerous single-person dependency: if that person is absent during a critical rotation, the process stops. There's no system memory. Everything lives in people's heads and inboxes.
This project starts from a simple question: can we hand orchestration to an AI while keeping humans where they actually matter? Spoiler — yes. But not without a few surprises along the way.
I chose n8n as the low-level orchestrator for a specific reason: the ability to build autonomous sub-workflows connected to each other, with a level of control that SaaS platforms don't easily allow. Claude AI runs in each agent as the LLM backbone via @n8n/n8n-nodes-langchain.lmChatAnthropic.
The architecture consists of two main workflows and four specialized agents called as sub-workflows. What makes it robust: no agent acts alone. The orchestrator always decides. Agents execute discrete tasks and return their result — a fundamental distinction from a classic "agent loop" architecture where the agent would make its own decisions.
The main workflow has three distinct entry points that all converge toward the same orchestrator:
scheduleTrigger node fires every morning at 8AM. The Set Trigger Auto node automatically builds the input message: "Date: [day] — Daily automatic scan — check all SFTP keys and trigger necessary actions." The orchestrator runs fully autonomously.Before engaging the full Claude Sonnet orchestrator for every Telegram message, a lightweight agent based on Claude Haiku 4.5 categorizes the message as "simple" or "complex". It's one of the finest architectural details of the project.
If simple → direct reply with no tool calls, near-zero latency. If complex → routed to the full orchestrator with all its agents. This Classifier → Router pattern drastically reduces inference costs and latency for routine daily interactions. A Haiku call costs ~20× less than a Sonnet call — over dozens of daily interactions, it adds up.
Key pattern: "Is Acme Corp good to go?" → answer in 1 second instead of 8. This single pattern can justify the two-level architecture on a production system.
The HITL (Human In The Loop) is the system's cornerstone from a security standpoint. No B2Bi activation can happen without prior human validation — hardcoded in the orchestrator's system prompt as an absolute rule, not an option. I chose simultaneous dual-channel validation to maximize the probability of a fast response regardless of where the validator is.
MFT-YYYYMMDD-HHMMSS, direct validation link. The CISO receives full context for an informed decision./MFT-\d{8}-\d{6}/iresume. The second is ignored. No double-validation possible on the same token.Trap encountered in testing: after email HITL validation (token YES), the orchestrator would re-trigger a Telegram HITL. Perfectly logical from the LLM's perspective — "two validations are better than one." But it's a loop. I had to explicitly forbid it in the system prompt.
The entire governance rests on a single Airtable table SFTP_Partners. It's the system's persistent memory — every agent reads from and writes to this table. No state exists outside it. Statuses follow a strict cycle: New → Email sent → Pending → Partner confirmed → Activated. A status can't regress. Escalation is a terminal state requiring human intervention.
| # | Partner | Expiry | Status | Email sent | Confirmation | B2Bi activation | Follow-ups | Exchange notes |
|---|---|---|---|---|---|---|---|---|
| 1 | Acme Corp | 15/9/2026 | New | — | — | — | 0 | — |
| 2 | Beta Solutions | 20/8/2024 | Pending | 2/6/2024 | — | — | 1 | Awaiting partner confirmation. |
| 3 | Gamma Industries | 10/7/2027 | Activated | 25/2/2026 | — | — | 0 | 2026-02-25 — Confirmation email received |
| 4 | Delta Partners | 1/10/2024 | Active | 4/6/2024 | 6/6/2024 | 7/6/2024 | 0 | Smooth process. |
| 9 | Iota Consulting | 18/7/2024 | Escalated | 8/6/2024 | — | — | 3 | Third follow-up. [2026-02-24] CISO escalation. |
Four fields deserve special attention in implementation:
{name: "Activated"}, not a direct string. All comparisons in the workflow must use .name — source of Bug #1 in early testing.This is the most sophisticated workflow in terms of filtering logic. Every incoming email must be categorized and routed to the right handler — without ever triggering a parasitic action on an internal email, an auto-reply, or an email unrelated to the system. I learned this the hard way during the first real test, where an out-of-office reply was interpreted as a partner confirmation.
The orchestrator's system prompt contains a section of absolute rules that can never be overridden by user inputs. This is the system's safety zone — what prevents the AI from doing things that are technically correct but operationally catastrophic.
I should have designed the complete Airtable schema before writing a single workflow node. Adding fields incrementally cost me two days of refactoring. The golden rule: write all possible partner states on paper before touching n8n.
The double-validation behavior taught me something important: an LLM reasoning autonomously can perfectly decide that two validations are better than one. That's not an error — it's a valid inference from its perspective. System prompt precision isn't perfectionism, it's necessity.
The first real triggers revealed 3 bugs simultaneously. A dedicated test environment with fake partners is essential. Test Gmail filters with emails sent from different clients to cover encoding edge cases.
The memoryBufferWindow in n8n keeps a limited number of messages in context. On long workflows, the orchestrator can "forget" decisions made at the start of a session. The source of truth must always be Airtable, not conversation memory.
The "Typing Action + Patience Message" pattern — Telegram nodes sending a typing indicator while the agent works — fundamentally changes the user experience. Without it, 8 seconds of silence feels like an eternity. With it, it feels natural.
The system prompt can evolve. Filter nodes represent hard invariants that don't depend on the LLM — they should exist as guardrails in the workflow itself, independent of what the prompt says.

15 years of experience on production MFT platforms — Axway B2Bi, Gateway, Integrator, CFT. Previously at AIFE, Groupama, Arval BNP Paribas and SFR Distribution. Currently exploring the intersection between industrial middleware and agentic AI.