ProjetProject

Un essai bref qui s’arrête à la porteHermesA short trial that stops at the doorHermes

On a mis un commis à l’essai un soir, sur un seul plat et un seul fourneau. Le plat est bien sorti. Mais trois constats de cette soirée ne se règlent pas par une nouvelle consigne : il n’entre donc pas dans la brigade.Hermes Agent est un agent CLI à outils — mémoire persistante, sous-agents, tâches programmées, skills auto-créés — dont la seule surface sans terminal interactif est le mode oneshot. Une sonde bornée l’a qualifié : une tâche, un modèle, une passerelle locale compatible OpenAI. Trois constats mesurés ne relèvent pas de la configuration, et la liaison comme worker est refusée en code, pas en prose.A cook was given a trial shift: one dish, one stove, one evening. The dish came out well. But three findings from that night cannot be settled with a new instruction, so he does not join the brigade.Hermes Agent is a tool-using CLI agent — persistent memory, subagents, scheduled tasks, self-authored skills — whose only non-interactive surface is oneshot mode. A bounded probe qualified it: one task, one model, one local OpenAI-compatible gateway. Three measured findings are not configuration problems, and the worker binding is refused in code rather than in prose.

Le service bat son pleinActifService is in full swingActive

Le plat sort, puis trois choses clochentChronologieThe dish comes out, then three things slipTimeline

Rien que le faire entrer a demandé du soin. Il refuse d’arriver en caisse fermée, alors on l’a préparé à part, dans une arrière-cuisine qui ne touche à rien d’autre.Le paquet refuse d’être construit en wheel. L’installation s’est donc faite en mode éditable, dans un environnement isolé hors du dépôt.Getting him through the door took care in itself. He refuses to arrive in a sealed crate, so he was prepared apart, in a back kitchen that touches nothing else.The package refuses to build as a wheel. Installation was therefore done editable, inside an isolated environment outside the repository.

Ensuite, il travaille. Sans qu’on lui tienne la main, il rend le plat demandé. Tout ce qu’il garde reste dans son propre cellier ; quand on le reprend, il continue à la même table sans en ouvrir une seconde.Contre une passerelle locale compatible OpenAI, Hermes répond correctement sans terminal interactif. Tout son état tient sous HERMES_HOME, et l’installation personnelle du propriétaire de la machine est restée identique. La reprise rouvre exactement la même ligne de session, sans créer un second enfant.Then he works. Nobody holds his hand and the dish comes back. Everything he keeps stays in his own pantry; when picked up again, he continues at the same table instead of opening a second one.Against a local OpenAI-compatible gateway, Hermes answers correctly with no interactive terminal. All of its state stays under HERMES_HOME, and the machine owner’s personal installation was left untouched. Resume reopens exactly the same session line without spawning a second child.

Premier accroc : quand le fournisseur ne répond pas, il envoie quand même une assiette. Elle est vide et porte l’erreur, mais le service est annoncé normal.Premier constat mesuré : un échec fournisseur — 400, 401, connexion refusée — sort en code 0, l’erreur étant écrite sur la sortie standard. Le statut de sortie ne distingue donc pas un appel abouti d’un appel refusé.First snag: when the supplier does not answer, he still sends out a plate. It is empty and carries the error, yet the service is announced as normal.First measured finding: a provider failure — 400, 401, connection refused — exits with code 0 and writes the error to standard output. Exit status therefore cannot separate a completed call from a refused one.

Deuxième accroc : quand on le renvoie, une partie de lui reste. Le feu qu’il a allumé continue de brûler, rattaché à la maison et hors de ce que l’on sait éteindre.Deuxième constat : après un SIGTERM, le shell de l’outil terminal survit, rattaché à PPID 1, hors du groupe de processus tué par l’appelant. L’arrêt du parent ne garantit pas l’arrêt de ce qu’il a lancé.Second snag: when he is sent home, part of him stays. A fire he lit keeps burning, attached to the house and beyond what we know how to put out.Second finding: after SIGTERM the tool’s terminal shell survives, reparented to PPID 1 and outside the process group the caller kills. Stopping the parent does not guarantee stopping what it started.

Troisième accroc : une commande part vers un fourneau que personne n’a autorisé. Elle ne figure nulle part sur la note de fin de service.Troisième constat : un appel auxiliaire tourne sur un modèle que personne n’a autorisé et n’apparaît pas dans le rapport d’usage du moteur. Le rapport n’est donc pas exhaustif sur la consommation réelle.Third snag: an order goes to a stove nobody authorised. It appears nowhere on the end-of-service bill.Third finding: an auxiliary call runs on a model nobody authorised and does not appear in the engine’s usage report. The report is therefore not exhaustive about real consumption.

Trois leçons seulement ont été gardées de la soirée. La note de fin de service est la seule preuve que le travail a eu lieu. La liste des ustensiles permis est la seule barrière quand les approbations tombent. Enfin, il faut lui donner son propre cellier et le plan de travail qui lui est assigné.Trois motifs ont été repris et rien d’autre : le rapport d’usage comme seul signal de succès, l’allowlist de jeux d’outils comme unique surface de droits une fois les approbations tombées, et le couple HERMES_HOME plus TERMINAL_CWD comme obligation. Le premier cloisonne l’état ; le second est le seul levier qui place l’enfant dans l’arbre candidat.Only three lessons were kept from that evening. The end-of-service bill is the only proof that work happened. The list of permitted utensils is the only barrier once approvals fall away. Finally, he must be given his own pantry and the bench assigned to him.Three patterns were taken and nothing else: the usage report as the only success signal, the toolset allowlist as the sole rights surface once approvals fall away, and the HERMES_HOME plus TERMINAL_CWD pair as an obligation. The first confines state; the second is the only lever that places the child in the candidate tree.

Au bout du compte, il n’entre pas dans la brigade, et ce refus est inscrit dans le registre, pas seulement énoncé. Les ustensiles qui lui laisseraient choisir seul du travail sont nommés et écartés. On ne prend pas non plus le commis trouvé sous la main : ce serait celui du patron, avec ses clés, ses carnets et ses habitudes. Seule une adresse précise vers l’arrière-cuisine séparée est acceptée ; sans elle, la porte reste fermée.Le refus de lier Hermes comme worker est écrit en code, pas en prose. La fonction qui autoriserait la liaison refuse toujours en nommant les constats ; les jeux d’outils qui laisseraient le moteur créer du travail non autorisé sont refusés par leur nom ; la sonde de qualification est absente de la configuration par défaut. Hermes est également tenu hors de la détection par PATH : un binaire trouvé là serait l’installation personnelle du propriétaire de la machine, avec ses identifiants, ses sessions et sa mémoire. Le lanceur doit donc être un chemin absolu vers une installation isolée, refusé sinon dès la lecture de la configuration.In the end he does not join the brigade, and that refusal is entered in the ledger, not merely spoken. The utensils that would let him choose work for himself are named and set aside. Nor do we take the cook lying to hand: that one belongs to the owner, with keys, notebooks, and habits of his own. Only a precise address to the separate back kitchen is accepted; without it, the door stays shut.The refusal to wire Hermes as a worker is written in code, not prose. The function that would authorise the binding always refuses while naming the findings; the toolsets that would let the engine create unauthorised work are refused by name; the qualification probe is absent from the default configuration. Hermes is also kept out of PATH detection: a binary found there would be the machine owner’s personal installation, with its credentials, sessions and memory. The launcher must therefore be an absolute path to an isolated installation, refused at config read otherwise.

Trois accrocs, aucune alarmeMécanismeThree snags, no alarmMechanism

Les trois accrocs se ressemblent : ce qui devrait porter la mauvaise nouvelle ne la porte pas. L’assiette revient comme d’habitude, le renvoi ne renvoie pas tout, la note ne compte pas tout. Chaque fois, le silence passe pour un service normal.Les trois constats partagent une frontière manquante. Le code de sortie ne porte pas l’échec fournisseur, le groupe de processus ne couvre pas le shell réparenté, et le rapport d’usage ne couvre pas l’appel auxiliaire. Un contrôle n’est une frontière que si son domaine d’interception et ses chemins de contournement sont explicites ; un domaine omis reste un chemin de contournement.The three snags rhyme: whatever should carry the bad news does not carry it. The plate comes back as usual, sending him home sends only part of him away, and the bill counts only part. Each time, silence passes for normal service.The three findings share a missing boundary. Exit status does not carry provider failure, the process group does not cover the reparented shell, and the usage report does not cover the auxiliary call. A control is a boundary only once its intercepted domain and its bypass paths are explicit; an omitted domain stays a bypass path.

Les bonnes méthodes restent, le commis reste dehorsRéponseGood methods stay; the cook stays outsideResponse

On a gardé de bonnes habitudes sans garder le commis. La note de fin de service dit seule si le travail a eu lieu. La liste des ustensiles permis tient lieu de barrière quand plus personne ne surveille. Et la porte est fermée dans le registre, pas par principe : la raison y est écrite.La réponse est une frontière, pas un correctif : trois motifs d’Hermes sont consommés, la liaison comme worker est refusée, et ce refus est porté par le code et non par un paragraphe. Le rapport d’usage sert de seul signal de succès précisément parce que le code de sortie a été mesuré non fiable. L’allowlist de jeux d’outils devient l’unique surface de droits une fois les approbations tombées, et le cloisonnement d’état est une obligation, pas une option.Good habits were kept; the cook was not. The end-of-service bill alone says whether the work happened. The list of permitted utensils stands as the barrier once nobody is watching. And the door is shut in the ledger, not on principle: the reason is written there.The response is a boundary, not a fix: three patterns from Hermes are consumed, the worker binding is refused, and that refusal is carried by code rather than a paragraph. The usage report serves as the only success signal precisely because exit status was measured unreliable. The toolset allowlist becomes the sole rights surface once approvals fall away, and state confinement is an obligation rather than an option.

Un seul plat essayé, rien de plusÉtat actuelOne dish tried, nothing moreCurrent state

Ce qui a été éprouvé tient en peu de choses : un plat, un fourneau, une soirée. Le reste de ce que ce commis sait faire n’a pas été essayé, et on n’en dira rien. Ce qu’une maison annonce sur sa carte n’est pas ce qui a été vu ici.Ce qui est qualifié est une sonde bornée : une tâche, un modèle, une passerelle locale. Les backends SSH et conteneur, le mode plein écran, la passerelle de messagerie, les tâches programmées, les sous-agents, le MCP et tout autre modèle ne sont pas qualifiés. Une capacité annoncée par l’amont n’est pas une capacité vérifiée ici. L’observation de la surface skills — configuration, catalogues, index, audit — n’est rattachée à aucune référence connue.What was tried comes to very little: one dish, one stove, one evening. The rest of what this cook can do was never tried, and nothing will be claimed about it. What a house announces on its menu is not what was seen here.What is qualified is a bounded probe: one task, one model, one local gateway. SSH and container backends, full-screen mode, the messaging gateway, scheduled tasks, subagents, MCP and every other model are not qualified. A capability advertised upstream is not a capability verified here. The observation of the skills surface — configuration, catalogues, index, audit — is not pinned to any known reference.

Une assiette identique ne prouve pas toutLeçonAn identical plate proves nothing elseLesson

Un bon essai prouve qu’un commis sait faire ce plat-là, ce soir-là. Il ne dit rien du reste de la carte, ni de ce qui reste allumé après son départ.Un signal de succès ne vaut que s’il porte l’échec : code de sortie, arrêt de processus et rapport d’usage doivent chacun couvrir leur domaine, sinon ils fabriquent du vert. Et une preuve bornée reste bornée — elle ne s’étend ni aux modèles, ni aux backends, ni aux surfaces qu’elle n’a pas touchés.A good trial proves a cook can make that dish on that night. It says nothing about the rest of the menu, nor about what stays lit after he leaves.A success signal is only worth what its failure path carries: exit status, process termination and usage reporting must each cover their domain or they manufacture green. And bounded evidence stays bounded — it does not extend to models, backends or surfaces the probe never touched.