# Mistral Vibe sans amarrage : pourquoi j&#39;ai vibe-codé un pager hardware

> Le vrai coût d&#39;un coding agent comme Mistral Vibe, ce n&#39;est pas valider mille fois — c&#39;est devoir rester scotché à son écran. Claude et Codex ont l&#39;écosystème de boutons physiques qui résout ça ; Mistral Vibe pas encore. J&#39;ai bricolé le mien sur M5Stack Fire qui trainait dans un tirori — wrapper Python qui hook l&#39;approval callback de Vibe, ESP32, cat qui danse.

- **Date** : 2026-05-27
- **Catégorie** : IA
- **Auteur** : Romain Delfosse
- **URL** : https://www.romaindelfosse.fr/blog/m5stack-vibe-bouton-physique-agents-ia/

---

*Récit de ce que j'ai construit le week-end du 24 mai 2026. Mi-build log technique, mi-prise de position éditoriale.*

---

## À retenir

- Le vrai coût d'un coding agent comme **Mistral Vibe**, Claude Code ou Codex CLI n'est pas l'« approval fatigue » de cliquer cent fois « oui ». C'est **l'amarrage** : tu dois rester devant ton écran parce que l'agent va te redemander quelque chose à n'importe quel moment.
- Côté **Claude** et **Codex**, un écosystème de boutons physiques se met en place : prototype officiel Anthropic (Claude Desktop Buddy, M5StickC Plus, avril 2026), The Cook Board, claude-deck, agentsd, AgentDeck. Côté **Mistral Vibe** : rien. La stack souveraine française a livré l'agent — l'écosystème périphérique n'a pas encore suivi.
- Ma réponse ce week-end : [appro-vibe](https://github.com/rdelfosse/appro-vibe), un alerter physique sur **M5Stack Fire (ESP32)** branché à Mistral Vibe via un **wrapper Python qui monkey-patch l'approval callback** de Vibe — couverture 100 % des prompts de permission, multi-session, modal Textual native et M5Stack en parallèle (premier qui répond gagne). MIT.
- Trajectoire honnête : j'ai d'abord essayé **MCP** (l'agent oublie d'appeler l'outil), puis regardé **ACP** (mais je voulais garder la TUI de Vibe), pour finir sur un **wrapper monkey-patch** plus pragmatique.
- Pendant le build : un endpoint manquant dans l'API publique Mistral — pas de `/v1/usage` officiel. J'ai testé de reverser le compteur du dashboard web mais il faut mettre les cookies de session web en variables d'environnement (fragile, écarté). Du coup, j'affiche plutôt sur le M5Stack la **saturation du contexte** de la session courante (`agent_loop.stats.context_tokens`) — info différente mais utile pour prévenir le `/compact`. Mistral pourrait exposer un endpoint usage propre.

---

## 1. Le déclic — une session Vibe un samedi matin

Je suis un samedi matin devant Vibe. Je lui ai demandé de refactorer un module Python, le genre de tâche qui prend une bonne demi-heure si je la fais à la main et dix minutes si je laisse l'agent piloter pendant que je relis. Il commence. Il me demande la permission pour la première écriture de fichier. J'approuve. Il propose un commit intermédiaire. J'approuve. Il propose une commande shell. J'approuve.

Puis il code six minutes en silence. Je regarde la fenêtre de la TUI tourner. Six minutes pendant lesquelles je ne sais pas ce qu'il va me redemander — peut-être dans dix secondes, peut-être jamais avant la fin de la session. Je n'ose pas partir faire un café parce que je sais qu'au moment exact où je quitterai le bureau, l'agent va se bloquer sur une question critique et m'attendre. Quand je reviens dix minutes plus tard, la session a tourné dans le vide pendant huit minutes.

J'ai posé l'ordinateur cinq minutes et j'ai été chercher dans Google si quelqu'un avait déjà résolu ça. Pour Claude et Codex, j'avais déjà vu le M5Stack AtomC. Pour Mistral Vibe, rien. C'est devenu le projet du week-end.

---

## 2. La vraie question : pourquoi je n'ai pas trouvé l'outil que je cherchais

Je veux poser une distinction simple avant de parler du build.

D'un côté, un **agent conversationnel** — Le Chat, ChatGPT en mode normal, Gemini. Tu lui demandes de résumer un rapport, de te traduire un mail, de t'aider à structurer une note. Il répond. Il ne prend pas d'action dans ton SI, il n'écrit pas dans une base, il ne pousse pas un commit. La question de la validation à distance ne se pose pas — tu lis sa réponse quand tu veux, dans la fenêtre que tu veux.

De l'autre côté, un **agent codeur ou agentique** — [Mistral Vibe](https://docs.mistral.ai/mistral-vibe/terminal), Claude Code, Codex CLI. Il ne se contente pas de répondre, il **fait**. Il te propose d'écrire un fichier, de lancer une commande shell, de pousser un commit. À chaque étape, il te demande la permission. Et c'est là que tout change.

### Ce n'est pas l'« approval fatigue ». C'est l'amarrage.

Le vrai coût d'un agent codeur, ce n'est pas de cliquer cent fois « oui ». C'est de **devoir rester là pour le faire**. L'agent te propose une action, tu valides, il code dix minutes, il revient avec la prochaine question. Tu ne sais pas quand. Tu ne peux pas partir en réunion, t'occuper d'un autre dossier, sortir du bureau. Tu es **scotché à l'écran** par crainte de bloquer la session pour rien.

C'est le contre-modèle exact du gain de productivité que ces outils sont censés délivrer. L'agent libère ton clavier ; il enchaîne ton attention.

Mistral l'a partiellement vu : Vibe envoie une **notification système OS** quand il a besoin de toi, et la doc officielle parle explicitement de « basculer sur une autre fenêtre pendant que l'agent travaille ». Le problème, c'est qu'une notification système te ramène à l'**écran**. Elle ne te ramène pas dans la **pièce** si tu en es sorti.

### Côté Claude / Codex, le pattern est déjà pris en main par la communauté

Quand j'ai voulu commencer, mon premier réflexe a été de chercher l'outil. Quelques minutes plus tard, je trouve un écosystème complet — mais côté Claude et Codex, pas côté Mistral Vibe :

- **[Claude Desktop Buddy](https://www.yankodesign.com/2026/05/20/this-30-gadget-gives-claude-a-face-that-reacts-to-what-its-doing/)** — prototype officiel **Anthropic**, publié en avril 2026, basé sur **M5StickC Plus** (~30 $), connecté en BLE au Claude desktop, bouton A approuve / B refuse
- **[The Cook Board](https://thecookboard.xyz/)** — macropad dédié Claude Code, 8 touches Cherry MX, pre-order 49 $
- **[claude-deck](https://github.com/carlpayne/claude-deck)** — controller hardware via macropad AJAZZ AKP05E / Mirabox N4 avec écrans LCD
- **[agentsd](https://github.com/paultyng/agentsd)** — plugin Stream Deck pour Claude Code (approve/deny via boutons hardware)
- **[AgentDeck](https://github.com/puritysb/AgentDeck)** — multi-surface (Stream Deck+, Android, iOS/macOS, ESP32 displays) supportant Claude Code **et Codex CLI**
- Le DIY [zero-kb02 + TinyGo + RP2040](https://zenn.dev/senoue/articles/e62fdd2e54ab6b?locale=en) pour Claude Code

Pour **Mistral Vibe** : rien. Pas de Stream Deck plugin, pas de macropad dédié, pas de prototype officiel Mistral, pas même un projet communautaire identifié à ce jour. La stack souveraine française a livré l'agent codeur ; l'**écosystème périphérique qui le rend utilisable au quotidien** n'a pas encore suivi.

C'est ce gap qui m'a fait passer un week-end sur un vieux M5Stack Fire utilisé pour les bornes de comptage de personnes PROTECPéO pendant le COVID. Pas une fierté technique — juste l'absence d'option off-the-shelf.

---

## 3. Le build — wrapper Python, monkey-patch, et un M5Stack qui clignote

Le projet s'appelle [**appro-vibe**](https://github.com/rdelfosse/appro-vibe). Repo MIT, code complet, à forker si vous le souhaitez.

### Architecture en une ligne

```
PC : commande `vibe-m5stack` (wrapper Python)
   │  1. charge le hook → monkey-patch AgentLoop.set_approval_callback
   │  2. lance vibe CLI normalement
   ▼
Vibe runtime
   │  chaque RequiredPermission déclenche le callback patché
   │  → race entre la modal Textual native + bridge M5Stack
   ▼
plugin/vibe_m5stack_hook.py (asyncio)
   │  USB Serial 115200 bauds, mode éphémère + lock file ~/.vibe/m5stack.lock
   ▼
M5Stack Fire (ESP32, firmware Arduino)
   → écran 240×240, boutons A / B / C
   → ring NeoPixel 10 LEDs + matrices NeoMatrix 5×10 (ports B et C)
```

Le pattern d'usage tient en deux étapes : tu installes le wrapper globalement (`pip install -e .` à la racine du repo, ce qui crée la commande `vibe-m5stack`). Depuis n'importe quel projet, tu tapes `vibe-m5stack` au lieu de `vibe`. Le wrapper charge un hook Python AVANT le démarrage de Vibe. Le hook monkey-patche `AgentLoop.set_approval_callback`. À partir de cet instant, **chaque demande de permission** (`write_file`, bash mutant, `search_replace`, commit, push) déclenche une **course en parallèle** :

1. La modal Textual native de Vibe apparaît dans le terminal
2. Le M5Stack s'allume, le ring LED commence un *chase* burgundy/rouge, les matrices flashent visibles à 5 mètres dans la pièce

**Premier qui répond gagne.** Un appui sur A depuis la cuisine ou une touche dans le terminal aboutissent au même `Future` que le runtime Vibe attend. Si le M5Stack n'est pas branché ou pas joignable, le hook *short-circuite* en moins de 100 ms (retourne NO côté M5Stack) et la modal Textual gère seule. **Pas de blocage 30 s, fallback transparent.**

Tout passe par du matériel grand public — un M5Stack Fire coûte environ 50 € chez les revendeurs européens. Le firmware fait moins de 1 000 lignes. Le wrapper + hook Python en font moins de 500.

### Multi-session — plusieurs Vibe en parallèle sur le même M5Stack

Tu peux lancer `vibe-m5stack` dans plusieurs terminaux sur des projets différents. Le bridge ouvre/ferme le port serial à chaque approval (mode éphémère + lock file global), ce qui sérialise les demandes en FIFO.

```powershell
# Terminal 1
cd C:\projets\alpha
$env:VIBE_SESSION_NAME = "alpha"
vibe-m5stack

# Terminal 2 (en parallèle)
cd C:\projets\beta
$env:VIBE_SESSION_NAME = "beta"
vibe-m5stack
```

L'écran M5Stack affiche `[alpha] write foo.py` ou `[beta] git commit` selon qui demande. Si deux sessions demandent en même temps, la deuxième attend que la première relâche le M5Stack (timeout 60 s, lock file `~/.vibe/m5stack.lock`).

C'est cette feature qui fait passer le projet du bricolage personnel à l'outil utilisable au quotidien : un dev qui gère trois projets en parallèle a un seul périphérique, trois préfixes de session, toujours le même bouton.

### Pourquoi un wrapper monkey-patch (et pas MCP)

L'histoire honnête mérite d'être racontée — parce qu'elle illustre ce qui manque vraiment à l'écosystème Vibe.

**Première version : un serveur MCP.** Le [Model Context Protocol](/glossary/mcp/) d'Anthropic est devenu en six mois le standard de fait pour brancher des outils tiers sur les agents IA, et Vibe l'a adopté nativement. J'ai écrit un serveur `mcp_server.py` qui expose un outil `m5stack_request_human_approval(title, body)`. L'agent l'appelle, le serveur pousse au M5Stack, le M5Stack répond, l'agent reçoit le résultat.

Ça marchait. Avec un défaut majeur : **MCP livre un outil que l'agent décide d'appeler ou pas**. Si je donne à Vibe l'instruction *« avant tout commit, appelle l'outil m5stack_request_human_approval »*, le LLM le fait — la plupart du temps. Pas toujours. Au quinzième tour de boucle, surtout si le contexte est saturé, il peut « oublier ». Couverture observée : ~80 %.

**Deuxième tentative : ACP.** J'ai regardé du côté de [l'Agent Client Protocol](/glossary/acp/), le standard Zed publié en août 2025 qui ferait précisément ça côté Claude Code : intercepter tous les `RequestPermissionRequest` JSON-RPC qui transitent entre le runtime et la TUI. Couverture théorique : 100 %. Sauf qu'à l'usage, je tombais sur un compromis structurel : ACP semble **forcer l'abandon de la TUI Textual de Vibe** au profit d'un client externe minimaliste — terminal moche, plus de panneaux, plus de syntax highlight, plus de formatage des diffs. J'aurais gagné la couverture mais perdu l'expérience produit. **À moins que je n'aie tout simplement pas réussi à brancher ACP correctement** pendant la session — possibilité honnête que je laisse sur la table. Quoi qu'il en soit, après quelques heures dessus, j'ai préféré la voie du wrapper. Si quelqu'un sait combiner ACP et la TUI native Vibe, j'écoute.

**Troisième tentative, gardée : un wrapper Python qui monkey-patch `AgentLoop.set_approval_callback`** directement dans Vibe. Le hook se branche avant que Vibe ne charge son agent. À partir de là, chaque demande de permission passe par lui — qu'elle vienne d'un tool natif (write_file), d'une commande bash, ou d'un futur outil. **Couverture : 100 %.**

Trade-off accepté : la robustesse du wrapper dépend de l'API interne Vibe. Si Mistral refactor `AgentLoop` ou change la signature de `set_approval_callback` dans une release future, le wrapper casse. Mais en attendant qu'un ACP-équivalent Mistral existe — et idéalement, qu'il soit officiellement supporté — c'est le meilleur compromis. Le `mcp_server.py` reste dans le repo, désactivé par défaut, pour qui voudrait une approche moins intrusive (et accepterait les ~20 % d'oubli LLM).

### Pourquoi un M5Stack Fire

Quatre raisons concrètes :

0. **Il trainait dans le tiroir** depuis 2022 et pour un projet au pied levé c'est la meilleure raison
1. **Écran intégré** (320×240 ILI9342 IPS) avec une lib graphique propre. Un cat Mistral peut effectivement danser dessus.
2. **Trois boutons physiques A/B/C** déjà câblés, déjà debouncés par la lib M5Stack.
3. **ESP32** : assez puissant pour gérer une animation 30 fps + un cycle série en parallèle, suffisamment documenté pour qu'un build du week-end soit possible.
4. **Disponible chez Mouser, Conrad, Reichelt et les boutiques maker EU** sans dépendance d'un fournisseur unique. Anthropic a fait le même choix de famille pour Claude Desktop Buddy en partant d'un M5StickC Plus — c'est devenu un standard de fait pour ce genre de proto.

J'ai branché en option deux matrices NeoPixel hexagonale sur les ports B et C **précisément pour le scénario amarrage**. Quand l'agent attend une réponse, ces matrices passent en boucle de couleurs rainbow visibles à 5 mètres dans la pièce. Tu peux quitter ton bureau, faire un café, prendre un appel — tu vois revenir l'alerte du coin de l'œil et tu reviens valider. **C'est le pattern de la sonnette sans fil, transposé à un agent codeur.**

### Le protocole série

J'envoie une ligne JSON terminée par `\n`. Le firmware parse via ArduinoJson :

```json
{"type":"approval","id":12345,"title":"[alpha] write hello.txt","body":"..."}
{"type":"credit_info","percent":45}
```

Le M5Stack répond avec :

```json
{"type":"response","id":12345,"approved":true}
{"type":"ping"}    // toutes les 5 s en IDLE
```

Le bridge Python **filtre les pings** et **matche par `id`** la réponse de la demande en cours. Détail qui paraît trivial mais qui m'a fait perdre une heure : la première version prenait un ping pour une approbation, l'agent recevait `approved: true` sans que je touche au bouton.

Le mode éphémère (ouvrir/fermer le port à chaque requête) + le lock file permettent la sérialisation propre entre plusieurs `vibe-m5stack` lancés en parallèle.

### Le rendu — un cat qui danse, et un easter egg shake

Le firmware tourne deux états :

- **`IDLE`** : le cat Mistral danse (animation 27 frames 240×240 RGB565 ≈ 3 Mo en flash) sur fond rainbow recomposé bande par bande.
- **`SHOWING_REQUEST`** : un `ApprovalScreen` plein écran avec le préfixe de session, le titre, le corps de la requête, et trois zones boutons (A = OUI, B = NON, C = annuler).

Sur le ring LED, j'anime un *chase* burgundy/rouge à 180 ms entre steps quand une demande est en attente. Sur les matrices NeoMatrix, je cycle des couleurs Mistral toutes les 400 ms. Le cap courant FastLED est configuré à 400 mA pour éviter les brown-out reset sur un port USB faiblard.

Le cat qui danse a deux fonctions :

- **Diagnostic visuel** : si le cat danse, le firmware tourne. Si l'écran est figé, j'ai un bug avant même de lancer Vibe.
- **Affordance d'amarrage** : la majorité du temps, le M5Stack est en idle. Avoir un écran qui vit en périphérie de ton champ de vision te confirme passivement « OK, l'agent n'a rien à me demander, je peux continuer ce que je fais ». C'est la même fonction qu'un thermostat ou un voyant de four allumé — on regarde pour savoir si on doit agir.

C'est un week-end de build, donc le code n'est pas une œuvre d'art. Mais il marche, et il est suffisamment court pour qu'un dev avec un samedi devant lui puisse le forker et l'adapter.

---

## 4. Ce que ça dit sur la « vraie » gouvernance agentique

Reprenons de plus haut.

### Le bon problème : décorréler la présence du développeur de l'exécution de l'agent

Le pattern qui se diffuse vite côté Claude et Codex — Stream Deck plugins, macropads dédiés, écrans companion sur ESP32, multi-surface mobile/desktop — n'est pas un gadget. C'est la reconnaissance d'un fait simple : **un coding agent productif est un coding agent qu'on n'a pas besoin de surveiller en continu**.

Tant que le développeur doit rester à un mètre de son écran pour valider la prochaine demande, le gain de productivité reste théorique. L'agent fait peut-être le travail de deux développeurs juniors, mais il consomme l'attention complète d'un développeur senior. Net comptable : zéro.

Le geste qui change l'équation est d'ailleurs très ancien dans d'autres métiers. Un radiologue ne reste pas assis devant la machine pendant tout l'examen ; il vient lire quand un bip ou un voyant l'appelle. Un sysadmin de garde ne fixe pas une console 8 h d'affilée ; il a un pager qui le réveille. Un parent qui cuisine ne tient pas un thermomètre contre le four ; il pose un minuteur qui sonne. **Le bouton hardware d'amarrage, c'est juste ce pattern appliqué aux agents codeurs.**

### Pourquoi MCP ne suffit pas — et ce que ça dit du standard

Le détour MCP → ACP raté → wrapper monkey-patch n'est pas qu'une anecdote technique. C'est le diagnostic d'un manque dans l'écosystème actuel.

**MCP est un standard de découverte d'outils, pas un standard d'orchestration.** L'agent voit la liste d'outils MCP, en choisit, en ignore d'autres. Pour un usage où on veut intercepter **tout** ce qui passe — typiquement les demandes de permission — MCP est structurellement insuffisant. C'est exactement le mode de défaillance qu'on retrouve dans le retour d'expérience de [Maddyness sur les agents IA orchestrant le SI](https://www.maddyness.com/2026/05/12/les-agents-ia-vont-orchestrer-le-si-sans-friction/) : la promesse « *sans friction* » se heurte aux frictions réelles d'orchestration. Un agent qui valide tout seul ses commits parce qu'il a « oublié » d'appeler l'outil d'approbation, c'est la même catégorie de problème.

**ACP serait la bonne couche, dans un monde où on accepterait de remplacer la TUI native par un client externe.** Le protocole de Zed intercepte tous les `RequestPermissionRequest` JSON-RPC à la source — l'agent ne peut pas oublier. Côté Claude Code, ça marche via le bridge officiel. Côté Vibe : ni implémentation, ni motivation à perdre le rendu Textual.

**En attendant : le monkey-patch.** Le wrapper Python que j'ai écrit fait le même travail qu'ACP — intercepter 100 % des prompts — au prix d'un couplage à l'API interne Vibe. Si je trouve la méthode ACP-compatible qui permet de garder la TUI, j'enlève une couche. La leçon générale : **un agent codeur a besoin d'un point d'extension stable pour la couche permission**.

### Libérer le développeur ≠ ralentir l'agent

Une objection prévisible : « *Si chaque action passe par un bouton physique, tu vas ralentir l'agent et casser le gain de productivité* ».

Réponse en deux temps.

D'abord, le bouton ne s'active pas sur **toute** action. Il s'active sur les actions que la politique interne de Vibe classe comme sensibles : commit, push, écriture de fichier, suppression de données, commande bash mutante, envoi d'un courriel sortant. Pour les opérations purement internes — éditer un brouillon, lire des logs, fouiller la base — l'agent garde l'autonomie. Le ratio « actions sensibles / actions totales » dans une session d'agent typique est en dessous de 5 %.

Ensuite, le ralentissement supposé n'est pas plus important avec le bouton physique qu'avec la TUI : le développeur est déjà obligé de valider. Ce qui change, c'est **où** il valide. Devant son écran (TUI) ou depuis n'importe où dans la pièce (bouton + alerter). Le délai d'aller-retour n'est pas plus grand. Et entre deux demandes, le développeur peut **vraiment faire autre chose** — alors qu'avec la TUI, il reste à son poste « au cas où ».

Net sur la productivité du développeur : positif. Net sur le débit de l'agent : neutre. C'est exactement le pattern à diffuser.

### Et pour le déploiement large ?

L'objet `appro-vibe` n'est évidemment pas distribuable tel quel à grande échelle. Mais le **pattern** l'est. Trois affirmations qui devraient se retrouver dans tout déploiement opérationnel d'agents codeurs :

1. **Le canal d'alerte de l'agent doit être hors de l'écran** : LED visible dans la pièce, son ambiant, vibration smartphone, écran companion. Quel que soit le canal, il ne doit pas exiger que le développeur soit devant son moniteur.
2. **La validation doit pouvoir se faire à distance du poste**. Bouton physique, raccourci mobile, contrôleur Bluetooth, Stream Deck — peu importe le hardware, le geste doit être faisable d'ailleurs.
3. **Le runtime de l'agent doit exposer un point d'extension stable pour la couche permission**. Sinon l'écosystème va monkey-patcher (mon cas), ou — pire — passer par MCP et accepter 20 % de prompts manqués.

Si ces trois affirmations passent dans les blueprints opérationnels des agents codeurs déployés dans les organisations, on n'aura pas inventé l'eau chaude — on aura juste rattrapé un retard de 30 ans sur l'industrialisation des autres métiers à supervision asynchrone.

---

## 5. Une brique manquante : l'endpoint d'usage Mistral

Je ne peux pas conclure sans parler d'un point de friction concret qui mérite une oreille chez Mistral.

Pendant le build, j'ai voulu afficher une jauge de crédit Vibe sur l'écran idle du M5Stack. Idée simple : récupérer le pourcentage d'usage mensuel, l'afficher en barre horizontale en bas de l'écran, basculer en jaune au-dessus de 80 %, en rouge au-dessus de 95 %. Trois lignes de code en théorie.

Sauf que **l'API publique `api.mistral.ai` n'expose aucun endpoint d'usage ou de quota Vibe**. Tous les chemins évidents répondent 404 : `/v1/usage`, `/v1/credits`, `/v1/billing`, `/v1/account`, `/v1/organizations`. La documentation OpenAPI publique ne mentionne pas cette catégorie d'endpoint. Ce n'est pas un bug — c'est juste une brique non livrée.

L'information existe pourtant : la console web Mistral l'utilise en interne via `https://console.mistral.ai/api/billing/v2/vibe-usage` (réponse JSON propre avec champ `usage_percentage`). Mais cet endpoint :

- N'est **pas documenté** dans l'OpenAPI public,
- **Refuse** l'API key Bearer standard,
- **Exige** une session cookie Ory + un header CSRF token (auth web frontend).

**Chemin scraping testé, mais imparfait** : extraire manuellement le cookie de session depuis les DevTools une fois, le coller en variables d'environnement (`MISTRAL_SESSION_COOKIE` + `MISTRAL_CSRF_TOKEN`), faire scraper mon propre dashboard par le serveur Python. Ça marche. Mais c'est moche, fragile, à renouveler chaque mois (TTL Ory ~30 jours). Écarté.

**Substitut affiché finalement sur le M5Stack — utile, mais pas ce que je cherchais initialement** : puisque j'avais déjà un hook attaché au runtime Vibe, je lis `agent_loop.stats.context_tokens` (data interne Vibe). **Important** : ce chiffre n'est **pas** la consommation du crédit Vibe mensuel. C'est le nombre de tokens disponibles dans le **contexte de la session courante** — donc une jauge de **saturation contexte**, pas de quota mensuel. Le M5Stack l'affiche via le protocole `credit_info` (nom historique discutable maintenant qu'il sert au contexte de session, pas au crédit). Signal différent, mais utile : il prévient quand la session sature et qu'il faudrait `/compact` avant que l'agent perde de la mémoire. Le vrai gauge de crédit Vibe mensuel, lui, reste impossible à brancher sans bricolage.

**Demande publique à Mistral** : exposer `usage_percentage` (et idéalement les détails par modèle) sur l'API publique authentifiée avec une API key standard. C'est une feature triviale côté serveur. Elle éviterait à tout consommateur de Vibe — du développeur indépendant au déploiement entreprise — de monkey-patcher le runtime ou de scraper son propre tableau de bord.

C'est la deuxième chose qu'il manque à l'écosystème Vibe, après les boutons hardware. Et c'est dans la même catégorie : un point d'extension officiel qui éviterait à l'écosystème de bricoler.

C'est constructif. C'est faisable. Ce serait dans la même catégorie de chantier que le Claude Desktop Buddy d'Anthropic — une équipe, un proto, quelques semaines.

---

## 6. Et après

Le repo [`appro-vibe`](https://github.com/rdelfosse/appro-vibe) est en MIT. Tout y est : le firmware PlatformIO, le wrapper Python, le hook approval, le bridge serial avec multi-session et lock file, la spécification de la dictée vocale, les pièges connus. Fork, adapte, casse, raconte ce que tu trouves.

Ce que je vais ajouter de mon côté :
1. **Un encoder rotatif pour défiler le contenu de la demande d'approbation** - la taille de l'écran du M5 ne permet pas de lire en totalité ce que demande l'agent
2. **Ajouter une couleur en plus du nom de l'agent** pour indiquer directement quelle session a besoin de mon attention - le rouge qui clignote c'est Robert sur le front, le vert c'est Daniel sur l'API, le orange c'est François sur les tests, le bleu c'est Nicolas sur la sécurité, etc.
3. **Le sans-fil** en reprenant la communication sans fil développée avec PROTECPéO pour se déplacer avec le M5stack qui a quelques heures de batterie (interne + extension stacked)
4. **Easter egg** quand je secoue La Chat...
5. **Bouton vocal pour donner des instructions complémentaires** sans avoir à revenir au PC

Ce que j'aimerais voir dans les prochains mois :
1. **Un point d'extension officiel Mistral pour la couche permission** — un crochet stable (callback, événement, ou support natif ACP) qui permettrait de retirer le monkey-patch.
2. **Un endpoint public d'usage Vibe** sur `api.mistral.ai` — la fin du scraping.
3. **Un kit officiel ou communautaire packagé**, sur le modèle de **Claude Desktop Buddy** côté Anthropic ou d'**AgentDeck** côté Codex : alerter visuel + bouton de validation à distance, fonctionnant en BLE ou Bluetooth, multi-surface (M5Stack, Stream Deck, smartphone), intégré au SDK Vibe.

Ça demande quelques jours d'ingénierie par une équipe française. Si la lecture de cet article suscite ce genre de conversation, j'aurai gagné mon week-end.

D'ici là, je reste à mon bureau — ou plus exactement, je peux enfin **partir de mon bureau**. Le cat Mistral danse à droite de mon écran, le ring LED dort, et quand l'agent a besoin de moi, je le vois clignoter du couloir. C'est moins glamour qu'un communiqué de presse. C'est exactement le travail qui manque entre l'annonce de la stack et l'usage réel au quotidien.

---

*Toutes les sources citées sont vérifiées au 26 mai 2026. Si tu repères une erreur factuelle, écris-moi via [bonjour@romaindelfosse.fr](mailto:bonjour@romaindelfosse.fr) — correction sous 72h, tracée en commit Git.*
