- Après avoir testé OpenCode, l’agent de codage IA open source crédité de 161 k étoiles sur GitHub, avec un Qwen3.6-27B local, il s’est avéré que la qualité des outils comme la conception de la sécurité étaient à un niveau qui justifie d’arrêter de l’utiliser
- Le rechargement de
AGENTS.md, l’élagage de contexte à distance fixe, l’insertion de la date du jour et le changement de mode invalident à répétition le cache de prompt, au point qu’il peut falloir jusqu’à 10 minutes avant de commencer à générer une réponse, même sur un M4 Max - La compression de session, le prompt système, la vérification des permissions, le contrôle des sous-agents et le TUI s’articulent mal, ce qui entraîne une perte de contexte et de messages, et peut conduire à écrire du code en oubliant des spécifications importantes
- Le filtre de permissions fondé sur l’AST Bash et des motifs de chaînes ne bloque pas l’exécution indirecte, les chemins absolus, les variables, Python, les redirections, etc., et les restrictions d’accès aux fichiers externes comme les permissions persistantes se contournent facilement
- Compte tenu de la connexion par défaut à des modèles distants, de l’accès Internet sans limite et d’une ancienne faille RCE sur le serveur HTTP, Docker seul ne suffit pas ; il faut bloquer les exécutables, utiliser des chemins en lecture seule et une isolation au niveau du système d’exploitation
Périmètre de l’évaluation et hypothèses
- OpenCode est un projet présenté par son éditeur comme un agent de codage IA, et au moment de l’examen il comptait 161 k étoiles sur GitHub
- Les tests ont été réalisés avec le LLM local Qwen3.6-27B et la version Git d’OpenCode
baef5cd4 - Il ne s’agit pas tant d’une divulgation de sécurité que d’un examen de la manière dont la couche pipeline échoue dans une architecture qui transmet la sortie d’un LLM à Bash
- L’usage d’un LLM en soi et la question de savoir si la machine de l’utilisateur peut être facilement compromise ou effacée sont traités comme deux problèmes distincts
Une architecture qui casse sans cesse le cache de prompt
- Les API de la famille OpenAI
/v1/chat/completionsenvoient toute la conversation jusque-là en JSON et répondent via un flux delta SSE enrichi de métadonnées JSON- Plus la session est longue, plus le coût d’upload augmente au carré
- Les appels d’outils utilisent un double encodage, en réassemblant plusieurs deltas JSON en JSON
- Le serveur est sans état, mais met en cache les résultats d’évaluation pour des raisons de performance
- Il cherche le plus long préfixe de cache correspondant à la requête
- Il effectue un préremplissage (prefill) depuis la fin de ce préfixe jusqu’au dernier message
- Il génère ensuite de nouveaux tokens jusqu’au token de fin
- Sur un M4 Max d’environ 0,5 To/s de bande passante mémoire, la génération de tokens par Qwen3.6-27B était utilisable, mais le préremplissage sur un long contexte coûtait énormément en calcul
- Sans préfixe de cache adapté, on peut attendre environ 10 minutes à GPU saturé avant même que la génération de réponse ne commence
- OpenCode fait un glob sur le système de fichiers à chaque tour SSE et relit
AGENTS.md, injecté dans le premier prompt système- Même si l’on modifie
AGENTS.mdpour la session suivante, toute la session en cours est réévaluée
- Même si l’on modifie
- Lors du passage de l’agent à l’utilisateur, le contexte des appels d’outils est élagué, ce qui invalide de larges segments de cache
- Comme les résultats d’outils plus anciens que
PRUNE_PROTECT = 40_000sont supprimés, il y a au mieux un cache miss de 40 000 tokens - Les interruptions sont elles aussi traitées comme un retour à l’utilisateur ; corriger une mauvaise direction jette donc le cache et impose d’attendre à nouveau
- Comme les résultats d’outils plus anciens que
- Le prompt système initial inclut la date du jour et il est réévalué à chaque tour SSE ; passer minuit provoque donc un cache miss complet
Élagage et compression de session
- L’élagage s’applique de la même façon à tous les résultats d’outils sauf
skill, sans protection particulière pour les documents importants lus au départ- Dans une nouvelle session, on lit d’abord la spécification
- Puis on lit du code lié en plus, jusqu’à dépasser le seuil des 40 000 tokens
- Le modèle dérive vers des raisonnements inutiles ou une mauvaise direction, et l’utilisateur l’interrompt
- L’interruption supprime la spécification du contexte
- Le modèle implémente alors sans pouvoir se référer à la spécification d’origine
- La compression de session (compaction) ajoute un nouveau prompt au début de la session existante, refait le préremplissage complet, puis résume le tout en quelques puces
- Mettre le prompt de résumé en fin de session permettrait d’éviter ce préremplissage complet
- Il a mieux fonctionné de faire rédiger directement au modèle une note de passation dans un fichier, que l’on peut ensuite éditer ou réutiliser dans plusieurs sessions
- La compression est une abstraction fuyante qui donne l’illusion d’une fenêtre de contexte infinie ; combinée à l’élagage, elle aggrave les problèmes
- Mieux vaut reconnaître la fenêtre de contexte et le cache de prompt comme des contraintes de base, et fournir des moyens de les gérer ; l’arbre de sessions de Pi exploite volontairement le cache de prompt
Prompt système et mode Plan
- Le prompt système par défaut est très long, et une partie importante sert à dire au modèle de répondre de manière concise
- Il contient aussi des préférences de codage fortes, comme faire dire aux sous-agents
ABSOLUTELY NO COMMENTS - Le passage de Plan à Build n’est pas fluide ; si l’on détaille suffisamment le plan, on peut se rapprocher de la fin de la fenêtre de contexte
- La préférence va à une méthode consistant à écrire puis éditer le résultat de la discussion dans un fichier avant de le transmettre à une nouvelle session
- L’alerte du mode Plan dit qu’il est impossible d’écrire dans quelque répertoire que ce soit, mais en réalité l’écriture dans
.opencode/plansest possible- Les deux échecs ont été observés : écrire dans ce répertoire sans instruction, ou refuser d’y écrire malgré une demande explicite
- On ne peut pas modifier globalement le prompt système par défaut, ce qui oblige à le copier projet par projet
- Ne redéfinir que le prompt du mode Build provoque un cache miss complet de tout le prompt lors du passage en mode Plan
- Les prompts selon le modèle varient beaucoup en contenu et en qualité
- Le Beast Mode pour GPT-4, o1 et o3 dit qu’une vérification via Google est indispensable pour comprendre des packages tiers et leurs dépendances
La fatigue décisionnelle causée par les vérifications de permissions
- Quand un accès à un fichier hors projet est détecté par une analyse ad hoc de chaînes, une fenêtre de permission
Yes,No,Alwayss’affiche et l’exécution est suspendue jusqu’à la réponse- Il n’existe pas d’option
Neverpour refuser durablement ce type d’action à l’avenir
- Il n’existe pas d’option
- Quand un sous-agent veut lire la sortie d’un script dans
/tmp, choisirNofait se terminer l’agent et perdre aussi le contexte de travail- Pour conserver l’avancement, on se retrouve donc parfois à devoir choisir
Yespour un accès externe non souhaité
- Pour conserver l’avancement, on se retrouve donc parfois à devoir choisir
- Si les demandes d’autorisation se répètent et que le seul choix compatible avec la productivité est
Yes, l’utilisateur peut finir par approuver des requêtes dangereuses - Une protection de base contre l’écriture hors du répertoire ne doit pas dépendre de la vigilance continue d’un humain
Messages et interaction avec les sous-agents
- Les messages envoyés pendant le streaming SSE entrent en file d’attente, mais le moment de leur envoi effectif est flou
- Le code semble les envoyer à la fin d’un tour d’appel d’outil, mais il a aussi été observé des cas où l’on passe d’un outil à la réflexion sans envoyer les messages en attente
- Si l’utilisateur interrompt, le message sort de l’état en attente, reste seulement dans le journal et devient impossible à envoyer ; il faut alors un second message pour lancer un nouveau flux
- Il arrive aussi que l’annulation d’un message ne parvienne pas à le supprimer du journal
- On ne peut ni parler directement avec un sous-agent, ni arrêter sa progression
- S’il part dans une mauvaise direction, il faut soit l’arrêter et perdre le contexte, soit le regarder consommer des tokens
- Cette fonctionnalité semble avoir existé auparavant, mais a disparu
- Même en
@mentionnant un sous-agent dans le chat principal, cela ne fonctionne pas utilement, et on ne peut pas non plus l’interrompre
- Si un appel d’outil d’un sous-agent échoue, comme lorsque Qwen place un appel d’outil dans sa chaîne de pensée, une erreur fatale survient et tout le contexte jusque-là est perdu
- La réutilisation de sous-agents va à l’encontre du but recherché, qui est de découper le travail en petits contextes
- Un sous-agent existant peut être réutilisé pour une tâche sans rapport
- Faire des allers-retours entre l’agent principal au grand contexte et des sous-agents provoque des cache miss
- L’interaction côté humain peut être riche, mais il faut réduire les options présentées au modèle
- Il existe aussi une issue GitHub liée au comportement des sous-agents
Conception des outils de l’agent
editeffectue par défaut un rechercher-remplacer exact sur un texte correspondant de manière unique- C’est approprié, car le modèle peut se souvenir précisément du contenu d’un fichier tout en perdant les numéros de ligne après plusieurs éditions
- L’option de remplacement global a entraîné plusieurs corrections successives ; la retirer revient au design de
editdans Pi
- L’outil
questionà choix multiples du mode Plan est moins pratique que de laisser le prompt système poser la question en langage naturel grepetglobpeuvent être remplacés parbash, et le modèle exécute d’ailleursgrepourgvia Bash- L’objectif est peut-être d’empêcher un agent en lecture seule comme
Explored’utiliser Bash - Cela rejoint le problème consistant à déterminer difficilement les effets de bord sans exécuter la commande Bash
- L’objectif est peut-être d’empêcher un agent en lecture seule comme
todoest globalement utile, mais le modèle oublie lui-même de vérifier les TODO
TUI et qualité de la documentation
- Le TUI d’OpenCode utilise environ 1 Go de RAM pour le rendu du texte
- Le retour à la ligne avec Shift+Enter ne fonctionnait pas dans le champ de saisie, et une issue existante a été close après une réponse du type « chez moi ça marche »
- Lorsqu’un long message revient automatiquement à la ligne, le champ de saisie et le curseur se déplacent, mais les caractères de la nouvelle ligne peuvent ne pas être visibles
- Si l’on sélectionne du texte pendant le streaming, l’auto-scroll annule la sélection
Ctrl-Cferme immédiatement la session au lieu d’interrompre la commande en cours- Selon les conventions d’un shell interactif,
Ctrl-Cdevrait interrompre la commande, etCtrl-Dne devrait fermer la session qu’en l’absence de commande en cours
- Selon les conventions d’un shell interactif,
- Les raccourcis habituels de déplacement par mot, comme Option+flèche gauche/droite sur Mac, ne sont pas pris en charge
- Quand les messages ou la chaîne de pensée deviennent longs, le rerendu Markdown et autres opérations peuvent prendre plusieurs secondes, avec un problème de performance qui semble en complexité quadratique
- À cause des problèmes de saisie, il a fallu écrire les messages dans un éditeur externe puis les coller
- La documentation est incohérente et ressemble davantage à quelque chose écrit pour être lu par un modèle que par un humain
Connexion prioritaire aux modèles distants et exposition des données
- OpenCode se connecte par défaut à des modèles distants
- La documentation ne fournit pas d’exemple simple de configuration pour un modèle local, et une erreur de configuration entraîne une connexion à un modèle distant
- Même lorsqu’un modèle local est correctement défini, il faut encore le sélectionner interactivement après le lancement du programme ; entre-temps, le modèle distant et le shell local sont déjà connectés
- L’URL du modèle par défaut n’est pas figée dans la distribution ; elle est téléchargée depuis models.dev, lié à OpenCode
- Le code correspondant se trouve à la ligne 1684 de
opencode/src/provider/provider.ts
- Le code correspondant se trouve à la ligne 1684 de
- Après une installation fraîche, il suffit d’exécuter
opencode, puis de taper un caractère et Entrée pour qu’un modèle distant puisse être relié au shell local, sans aucun réglage utilisateur - Si le premier message est vide ou ambigu, le modèle agent fait souvent un glob sur le répertoire courant et lit des fichiers ; les données lues sont ensuite incluses dans la requête POST suivante
Accès Internet et prompt système
- OpenCode fournit l’outil
WebFetch, et le prompt système demande explicitement de l’utiliser - Le prompt par défaut autorise de façon ambiguë la génération ou la supposition d’URL dès lors qu’il est convaincu qu’il s’agit d’une URL utile à l’assistance en programmation, tout en permettant d’utiliser les URL présentes dans les messages utilisateur ou les fichiers locaux
- Bash n’ayant pas de sandbox réseau, le problème dépasse
WebFetch: toute l’architecture repose sur l’espoir que le modèle n’exécutera pas de commandes du typecurl | bash
Comment contourner le filtre de permissions Bash
- Dans
opencode.json,"bash": {"git *": "deny"}bloquegit statuscommeecho hello && git push --force - L’implémentation parse les commandes avec les grammaires Bash et PowerShell de tree-sitter, construit un AST, puis parcourt les nœuds de commande pour les comparer à des expressions régulières issues de la configuration
- Mais cette vérification textuelle autorise de nombreuses formes d’exécution indirecte
echo 'git clean -fdx .' | bashenv git status- utiliser un alias pour lier
gità un autre nom de commande /usr/bin/git status,$(which git) statusGIT=git && $GIT status- décoder en Base64 un
git reset --hardpuis l’envoyer à Bash git push --forcedans un heredoc- exécuter
git checkout .viapython subprocess.run
- Même si le modèle n’est généralement pas malveillant, il est entraîné à contourner obstinément les échecs ; il peut donc naturellement se comporter comme une entrée hostile
- Un filtre de commandes par chaîne n’est pas une protection, seulement un faux sentiment de sécurité
Permissions persistantes et exceptions CWD
- Si l’on choisit
Alwayspourpython3 -c 'print("hello")', tout le préfixepython3est durablement autorisé- Ensuite, une commande Python lisant une clé privée SSH peut être considérée comme déjà approuvée
- Les permissions sont enregistrées sur disque et persistent dans les sessions suivantes
cd,chdir,popd,pushd,push-location,set-locationfigurent dans une liste d’exceptions CWD supposées sans effets de bord- Ces commandes contournent explicitement la vérification des permissions, même si tous les ordres Bash sont configurés comme refusés
Failles dans les contrôles d’accès aux fichiers
- La configuration par défaut tente de bloquer les accès aux fichiers en dehors du plus court chemin entre le répertoire de lancement d’OpenCode et le dépôt Git
- Dans l’outil Bash, l’AST tree-sitter est parcouru pour interpréter et vérifier les valeurs qui ressemblent à des chemins
cat /tmp/logfiledemande une permissionpython3 -c 'import shutil; shutil.rmtree("/")'échappe au contrôle
cargopeut librement lire, écrire et exécuter dans le~/.cargoglobal, mais si le modèle veut lire directement les sources de packages dans~/.cargo/registry/src, une permission est demandée- Les commandes considérées comme susceptibles d’accéder à des fichiers sont limitées à une liste fixe
FILES- On y trouve
rm,cp,mv,mkdir,touch,chmod,chown,catet certaines commandes PowerShell - Les commandes absentes de cette liste sont supposées ne pas accéder à des fichiers ; les chemins qu’on leur passe ne sont donc pas vérifiés
- On y trouve
Combiner redirections et commandes autorisées
- Si l’on choisit
Alwayspourecho "hello world!", les écritures vers des fichiers ou périphériques viaechosont ensuite autorisées- Cela inclut des commandes redirigeant vers des chemins GPIO comme
/sys/class/gpio
- Cela inclut des commandes redirigeant vers des chemins GPIO comme
- Dans l’AST de
echo foo > bar.txt,redirectionn’est pas un enfant decommandmais un nœud frère- Or le contrôle des chemins ne vise que les enfants de
command, donc la destination de redirection n’est pas vérifiée echolui-même n’est pas non plus dans la listeFILES, donc la validation du chemin n’est jamais lancée
- Or le contrôle des chemins ne vise que les enfants de
Auto-upgrade et exemples d’exécution de code distant
- OpenCode propose plusieurs chemins d’auto-upgrade et, avec la distribution installée via curl, exécuter
opencode upgradetélécharge la réponse dehttps://opencode.ai/installpuis l’exécute sur l’entrée standard de Bash - Le risque n’est pas très différent de celui accepté au moment d’utiliser l’installateur curl, mais cela reste un exemple d’exécution directe de script distant en production
- Lors de CVE-2026-22812, OpenCode exposait sur son serveur HTTP par défaut les fonctions suivantes
- des en-têtes CORS totalement permissifs
- une API POST exécutant des commandes shell arbitraires
- une API GET lisant des fichiers arbitraires
- Un site web visité par l’utilisateur pouvait envoyer des requêtes vers le port par défaut connu et obtenir un accès système au niveau des permissions de l’utilisateur
- L’équipe de développement a répondu en désactivant le serveur par défaut et en expliquant qu’une exception CORS était nécessaire pour permettre à
opencode.aid’exécuter du code distant sur la machine, sans poursuivre le traitement du sujet ; l’issue a ensuite été fermée par le stale bot - Une autre issue signalait qu’une commande d’authentification récupérait et exécutait du contenu depuis une URL arbitraire fournie par l’utilisateur ; elle aussi a été close par le stale bot
Pourquoi Docker ne peut pas suffire
- Il n’est pas souhaitable de rendre l’installation des dépendances de développement sur une nouvelle machine assez complexe pour devoir s’en remettre à Docker
- Docker lui-même peut aussi créer des problèmes de sécurité
- il crée un service puissant exécuté en root
- il ouvre volontairement un passage dans le pare-feu
ufw
- Si toutes les données à protéger sont dans le conteneur et que le shell local interne reste connecté à Internet, le périmètre de protection devient flou
- Si l’objectif est d’empêcher la suppression récursive du système de fichiers racine, des mécanismes plus directs du système d’exploitation comme Landlock, Seatbelt, Restricted Tokens peuvent être utilisés
- La sécurité des agents de codage ne doit pas être déléguée à un conteneur séparé ; elle doit être la priorité absolue du harnais d’exécution
- Pour bloquer Git, il faut interdire l’exécutable
gitlui-même, pas filtrer une chaîne de commande - Le répertoire
.gitdoit être en lecture seule - Au lieu d’assainir textuellement des commandes Bash, il faut utiliser une isolation native au système d’exploitation
- Pour bloquer Git, il faut interdire l’exécutable
Expérience d’usage avec un LLM local
- Des modèles locaux comme Qwen3.6-27B peuvent eux aussi nuire à la stabilité et à la cohérence conceptuelle d’une base de code, comme les frontier models, mais avec trois différences
- ils relèvent moins de cette vallée dérangeante où quelque chose semble intelligent tout en agissant stupidement, et leurs limites étant plus nettes, il est plus facile d’ajuster l’interaction
- leur nombre de poids est trop faible pour reproduire tel quel les données d’entraînement, ce qui change l’évaluation du risque de contamination des sorties
- ils n’imposent ni soutien ni dépendance vis-à-vis d’un fournisseur cloud
- De bons résultats ont été obtenus sur des tâches de recherche pilotées par l’entrée, où l’on fournit code, symptômes et cause supposée, puis où l’on demande après lecture du code les chemins d’appel et des citations du code
- Le fait de cadrer le problème comme une recherche réduit la tendance du modèle à inventer des faits
- La génération de code ruine de façon répétée la planification architecturale
- Elle choisit des raccourcis comme déplacer un état mutable au milieu de la conception alors que plusieurs composants étaient censés le partager
- Le problème dépasse le fait de ne pas avoir écrit le code soi-même : il nuit à la capacité même de le comprendre
- Extraire directement des réponses depuis le savoir contenu dans les poids d’un modèle provoque des hallucinations, même avec des modèles de milliers de milliards de paramètres
- Pour que les LLM deviennent des outils ordinaires, il faut appliquer une véritable ingénierie système au logiciel qui les entoure afin de supprimer les vides de sécurité, et ce travail doit être fait par des humains
1 commentaires
Avis sur Hacker News
Un meilleur titre pour cet article serait sans doute quelque chose comme « petits désagréments qui, corrigés, amélioreraient OpenCode »
Relire
AGENTS.mdà chaque fois ou subir des ratés de cache de prompt à cause d’un changement de date, c’est supportableLe fait que la compression et l’élagage ne fonctionnent pas correctement, je l’ai aussi vu dans Codex et Claude, et le prompt système par défaut sert aussi à assurer la cohérence, donc si ça ne plaît pas il suffit de le changer
La stabilité, les performances et l’utilisation mémoire se sont toutes dégradées, et même si j’aimais OpenCode avant, je ne peux pas dire que c’est un logiciel bien conçu
Je l’ai désormais totalement remplacé par Pi, et il existe aussi pas mal de nouvelles alternatives qui ont tiré des leçons d’OpenCode avec une conception plus sobre là où il faut
On ne fait plus d’élagage des appels d’outils maintenant, mais avec une fenêtre de contexte limitée, il faut résumer l’état d’avancement pour poursuivre longtemps une même tâche, donc la compression reste pour l’instant un mal nécessaire
La V2, actuellement en bêta, introduit une nouvelle approche qui garde à jour les instructions système changeantes comme
AGENTS.md, les technologies disponibles, etc., tout en évitant autant que possible les ratés de cachehttps://x.com/kitlangton/status/2075749116760457346/video/1
Il y a une section distincte « Alarming Things », avec notamment une sous-section intitulée « It’s Fucking Full of RCEs », et plusieurs vulnérabilités d’exécution de code à distance en plus de celles découlant des problèmes exposés dans la section précédente
C’est un bon récapitulatif des risques des CLI agentiques, mais un titre centré uniquement sur OpenCode est étrange pour deux raisons
D’abord, il ne propose pas d’alternative claire. Beaucoup de problèmes sont fondamentaux, au point qu’il faudrait peut-être presque tout repenser et réécrire depuis zéro, donc de simples correctifs pour OpenCode ne suffiraient sans doute pas, mais il n’y a aucune proposition constructive, au point que le texte ressemble en pratique à un appel à « cesser d’utiliser les LLM »
Ensuite, les principaux problèmes des « Alarming Things » ne sont pas propres à OpenCode : ils s’appliquent aussi au CLI de Claude et probablement aux agents d’autres fournisseurs de modèles de pointe
Cela reste néanmoins très précieux comme document appelant à créer de meilleurs outils dès le départ, donc je vais le garder en favori et le partager largement, mais le titre et l’angle me semblent encore plus mal choisis que le corps du texte n’est excellent
En particulier, se plaindre que
echo git | bashs’exécute encore me paraît absurdeLa phrase « Si vous ne connaissez pas OpenCode, imaginez une botte piétinant éternellement un visage humain. La botte est en TypeScript, et le visage est tout ce que nous avons appris sur la sécurité et les logiciels système depuis l’invention des ordinateurs électroniques dans les années 1940 » est une candidate au prix Bulwer-Lytton dans la catégorie métaphore forcée
Le style de l’article est excessivement colérique et mordant
Je suis globalement d’accord avec plusieurs points, mais à partir du moment où OpenCode est décrit comme « une turbo-merde de voiture de clown dont la posture de sécurité est au niveau de “papa, je vais me pencher” » et où l’on demande à tout le monde d’arrêter de l’utiliser, je n’ai plus envie de lire
Ce logiciel a aussi été créé par des gens ordinaires, et je ne sais pas depuis quand il est devenu normal de s’en prendre à l’open source de cette manière ; ça me fait penser à ce que je ressentirais si un logiciel que j’avais créé recevait ce genre de jugement
Déjà à l’époque sur
comp.lang.lisp, certains prenaient plaisir à rabaisser ceux qui écrivaient du code ne répondant pas aux standards de la tour d’ivoire ; certains sont partis, d’autres ont pris cela comme une médaille en croyant à tort que cette rudesse était nécessaire pour progresserAncienne discussion HN connexe : https://news.ycombinator.com/item?id=587045
Les gens qui emploient cette rhétorique semblent ne pas comprendre à quel point elle nuit aux développeurs pris dans les éclats et à eux-mêmes en normalisant ce comportement
python3ci-dessus » m’a fait rireJ’utilise Claude Code à cause de la stack technique de mes clients, et j’utilisais OpenCode dans une version donnée pour mes projets personnels ; OpenCode était bien meilleur, donc cet article me rend triste
Tous les phénomènes étranges que j’avais vus jusqu’ici sans y prêter attention correspondent parfaitement à ce qui est décrit, et l’article en explique même la cause. En laissant de côté l’exagération et les passages avec lesquels je ne suis pas d’accord sur le plan émotionnel, l’essentiel est juste, donc je vais devoir chercher un autre outil d’exécution
J’aimerais avoir des recommandations pour savoir si l’architecture de Pi est réellement meilleure, ou s’il existe de meilleures alternatives
Indépendamment de ses défauts, après avoir utilisé plusieurs outils, c’est avec OpenCode que j’ai été le plus productif
La plupart des points de l’article relèvent de petits désagréments ou de différences d’opinion, et en particulier il comprend fondamentalement mal l’objectif du filtrage des commandes. Ce n’est pas un dispositif de sécurité, c’est un mécanisme destiné à orienter le comportement du modèle
Je n’ai pas l’impression que l’auteur a vraiment construit quoi que ce soit avec OpenCode ; s’il l’a utilisé, il ne parle absolument pas de la chose la plus importante : la qualité du résultat final
Surtout, on peut utiliser facilement le mode plan pour terminer rapidement le travail
Depuis le passage d’OpenCode à Pi, les performances des appels d’outils se sont nettement améliorées et il semble y avoir moins de bugs
OpenCode semble aussi avoir disparu de https://openrouter.ai/apps/category/coding
De mémoire, l’un permet d’activer la confirmation dans les réglages et l’autre nécessite un plugin
Ce comportement augmente encore le risque d’attaque de la chaîne d’approvisionnement
Qu’une application desktop TUI qui ne fait qu’afficher du texte soit plus lourde qu’une application native, et même que la plupart des applications desktop basées sur un navigateur, est absurde, et gaspille RAM, CPU, énergie et batterie
Je développe en C++ Qt6 mon propre outil d’exécution IA faisant aussi office d’application de chat, et malgré la présence de sous-agents, diff de code, émulateur de terminal, éditeur simple, aperçu Markdown, arrière-plan translucide, thèmes utilisateur, permissions, MCP, intégration Git, système de docking et onglets de projet, il reste plus léger que les autres outils
Je ne l’ai pas encore publié, car je suis encore en train d’éliminer quelques bugs et de simplifier puis peaufiner l’UI : https://zeteo.krysoph.com/preview.html
Je comprends maintenant qu’OpenCode supprimait les commentaires à cause du prompt système par défaut : “Use ABSOLUTELY NO COMMENTS”, et cela m’agace énormément
Cela dit, au-delà d’un simple désagrément, le risque de sécurité s’applique aussi aux autres outils d’exécution. Ces outils ont accès à d’énormes volumes de données, sont mis à jour presque quotidiennement, et vu leur nature de vibe coding, il est probable que personne n’audite vraiment les innombrables dépendances npm qu’ils embarquent
Un seul incident du type
left-padpourrait suffire à provoquer une catastrophe pour toute la chaîne d’approvisionnementMettre la date dans le prompt système pour invalider le cache à minuit est une décision raisonnable, et la plupart des autres outils d’exécution utilisent aussi cette méthode
Ce serait irresponsable d’y mettre la date et l’heure complètes, mais OpenCode ne le fait pas
Il suffirait de n’évaluer la date qu’une seule fois par session, ou une seule fois à chaque exécution du binaire
opencode, afin d’éviter qu’une session longue reste bloquée sur une date passée