Correctif vim, audit qualité, tests d'intégration, et durcissement de l'agent #2

Merged
dxsk merged 6 commits from fix/onglet-edition-vim into main 2026-09-10 22:06:59 +02:00
Owner

Six commits : le correctif du retour d'usage sur vim, puis une passe de fond sur
la qualité et la robustesse. Chaque défaut listé ici a été trouvé en écrivant
son test, et chaque test anti-régression a été vérifié en retirant le
correctif
— sinon il ne prouve rien.

1. Édition vim : ne plus ouvrir un shell nu à côté de l'onglet demandé

onMount de l'onglet Shell créait systématiquement un shell de connexion, en
plus de l'onglet vim ouvert par la demande. Selon l'ordre des effets, l'onglet
actif pouvait être le shell nu. Symptôme confirmé disparu côté utilisateur.

L'agent journalise désormais ce qu'il lance : un program vide qui retombe sur
le shell est sinon indiscernable d'un shell demandé exprès (ps montre
/bin/bash dans les deux cas), ce qui avait rendu ce diagnostic inutilement
long.

2. Audit et qualité du code, dans la CI

Cible make audit et job de CI dédié : cargo audit --deny warnings sur les
deux Cargo.lock, un jeu de lints clippy au-delà de -D warnings, et les liens
intra-doc.

Zéro vulnérabilité. Huit alertes « non maintenu / non sûr » subsistent, toutes
transitives (portable-pty, arbre GTK de Tauri) : listées et justifiées avec
leur chemin de dépendance dans .cargo/audit.toml, pour qu'une nouvelle
alerte arrête le build.

clippy::pedantic en entier a été écarté après mesure (228 avertissements,
31 lints, l'essentiel du style) ; le raisonnement est dans le README.

Cinq défauts trouvés : la géométrie de terminal reçue du fil était tronquée
en silence (proto3 n'a pas d'entier 16 bits — la conséquence même que j'avais
signalée en recommandant gRPC) ; le code de sortie d'un shell pouvait se replier
en négatif ; la taille d'une clé RSA tronquait une valeur non contrôlée ; le
préfixe de longueur du dialecte de compatibilité annonçait une longueur fausse
au lieu d'échouer ; trois compteurs de conversion tronquaient au lieu de saturer.

3. Tests d'intégration gRPC, et deux annulations qui ne coupaient rien

18 tests montent le service sur un port éphémère et le pilotent avec le client
généré : ni mesh, ni hôte, mais le vrai transport. C'était le trou le plus large
— seul agent probe exerçait ces chemins, et il ne tourne pas en CI.

Trois régressions de la migration, trouvées là :

défaut conséquence
FilePut n'avait plus aucune borne de taille un client du mesh pouvait remplir le disque de l'hôte
abandonner un Exec ne tuait pas la commande une commande sans fin tournait pour personne
idem pour le suivi de journal le journalctl/tail survivait au client

Les deux annulations réagissent maintenant à tx.closed(). J'avais écrit
« lâcher un flux suffit » : c'était vrai des producteurs qui envoient à chaque
tour, faux de ceux qui attendent autre chose entre deux envois.

4. Plafond de sessions

Aucune limite n'existait : autant de PTY, de suivis et d'exécutions que voulu,
chacun avec son processus et son thread. Compteur plafonné à 64, avec un jeton
qui libère la place en tombant — la comptabilité suit alors la vie réelle de
la session, sans décrément à ne pas oublier sur chaque sortie.

Le second test a été écrit après avoir constaté que le jeton du shell était
libéré dès le retour de la méthode : les sessions les plus lourdes ne comptaient
pas du tout.

5. Harnais de test de composants, et binaires plus légers

vitest tournait sans DOM : seul util.js était testable, et c'est ce trou qui
a laissé passer le bug de l'onglet vim. jsdom + @testing-library/svelte
ouvrent cette classe de tests ; quatre premiers cas exercent le tri d'un tableau
du clic à l'ordre des lignes, donc les tables de clés écrites à la main.

lto = "fat" + codegen-units = 1, mesuré : agent 5,78 → 3,88 Mo (−33 %),
console Windows 24,2 → 13,0 Mo (−46 %). Rien ne change au comportement, et
ça compte pour un agent poussé sur le mesh à chaque mise à jour.

spike/ compile désormais en CI (il aurait pourri en silence), et le critère de
suppression du dialecte de compatibilité est écrit dans identity.rs.

6. Jeton partagé optionnel

L'agent acceptait tout ce qui vient du mesh. Assumé pour un banc d'essai, mais
le rayon d'action a grandi : binaire remplaçable à distance, écriture de
fichiers, PTY, lancement d'un programme. Un hôte compromis donnait la main sur
tous les autres.

--token-file ferme cette porte sans rien casser : sans l'option, le
comportement est inchangé, donc l'activation se fait hôte par hôte. Refus dans
un intercepteur, donc avant le service et sur toutes les méthodes — vérifié sur
un appel unaire, un flux sortant et un flux entrant. Comparaison en temps
constant, message qui ne distingue pas « absent » de « faux ».

Ce que ça protège : un autre hôte du mesh. Ce que ça ne protège pas : qui sait
lire le fichier. C'est un secret partagé, pas une identité par hôte ; le mTLS
reste un autre chantier.

Vérifications

133 tests Rust (84 protocol+agent, 49 console) et 31 frontend.
make ci passe en entier : fmt, clippy strict, tests, audit, liens de doc,
frontend, cohérence du dist, compilation du banc d'essai.

Jeton vérifié de bout en bout contre un agent local ; le reste l'a été contre
ep1 et vps.kxh-studio.fr.

Reste à faire, hors de cette PR

Cinq agents à redéployer par SSH (ep2, forge, monitor, pbs1, pve1 —
mtmg injoignable), et le rendu visuel du tri, que je n'ai pas pu contrôler
à l'écran.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GzHyvUbKutGrRcWjyfwDkT

Six commits : le correctif du retour d'usage sur vim, puis une passe de fond sur la qualité et la robustesse. **Chaque défaut listé ici a été trouvé en écrivant son test, et chaque test anti-régression a été vérifié en retirant le correctif** — sinon il ne prouve rien. ## 1. Édition vim : ne plus ouvrir un shell nu à côté de l'onglet demandé `onMount` de l'onglet Shell créait systématiquement un shell de connexion, en plus de l'onglet vim ouvert par la demande. Selon l'ordre des effets, l'onglet actif pouvait être le shell nu. Symptôme confirmé disparu côté utilisateur. L'agent journalise désormais ce qu'il lance : un `program` vide qui retombe sur le shell est sinon **indiscernable** d'un shell demandé exprès (`ps` montre `/bin/bash` dans les deux cas), ce qui avait rendu ce diagnostic inutilement long. ## 2. Audit et qualité du code, dans la CI Cible `make audit` et job de CI dédié : `cargo audit --deny warnings` sur les deux `Cargo.lock`, un jeu de lints clippy au-delà de `-D warnings`, et les liens intra-doc. Zéro vulnérabilité. Huit alertes « non maintenu / non sûr » subsistent, toutes transitives (`portable-pty`, arbre GTK de Tauri) : listées **et justifiées** avec leur chemin de dépendance dans `.cargo/audit.toml`, pour qu'une *nouvelle* alerte arrête le build. `clippy::pedantic` en entier a été écarté **après mesure** (228 avertissements, 31 lints, l'essentiel du style) ; le raisonnement est dans le README. **Cinq défauts trouvés :** la géométrie de terminal reçue du fil était tronquée en silence (proto3 n'a pas d'entier 16 bits — la conséquence même que j'avais signalée en recommandant gRPC) ; le code de sortie d'un shell pouvait se replier en négatif ; la taille d'une clé RSA tronquait une valeur non contrôlée ; le préfixe de longueur du dialecte de compatibilité annonçait une longueur fausse au lieu d'échouer ; trois compteurs de conversion tronquaient au lieu de saturer. ## 3. Tests d'intégration gRPC, et deux annulations qui ne coupaient rien 18 tests montent le service sur un port éphémère et le pilotent avec le client généré : ni mesh, ni hôte, mais le vrai transport. C'était le trou le plus large — seul `agent probe` exerçait ces chemins, et il ne tourne pas en CI. **Trois régressions de la migration, trouvées là :** | défaut | conséquence | |---|---| | `FilePut` n'avait plus **aucune** borne de taille | un client du mesh pouvait remplir le disque de l'hôte | | abandonner un `Exec` ne tuait pas la commande | une commande sans fin tournait pour personne | | idem pour le suivi de journal | le `journalctl`/`tail` survivait au client | Les deux annulations réagissent maintenant à `tx.closed()`. J'avais écrit « lâcher un flux suffit » : c'était vrai des producteurs qui envoient à chaque tour, faux de ceux qui attendent autre chose entre deux envois. ## 4. Plafond de sessions Aucune limite n'existait : autant de PTY, de suivis et d'exécutions que voulu, chacun avec son processus et son thread. Compteur plafonné à 64, avec un jeton qui libère la place **en tombant** — la comptabilité suit alors la vie réelle de la session, sans décrément à ne pas oublier sur chaque sortie. Le second test a été écrit après avoir constaté que le jeton du shell était libéré dès le retour de la méthode : les sessions les plus lourdes ne comptaient pas du tout. ## 5. Harnais de test de composants, et binaires plus légers `vitest` tournait sans DOM : seul `util.js` était testable, et c'est ce trou qui a laissé passer le bug de l'onglet vim. jsdom + `@testing-library/svelte` ouvrent cette classe de tests ; quatre premiers cas exercent le tri d'un tableau du clic à l'ordre des lignes, donc les tables de clés écrites à la main. `lto = "fat"` + `codegen-units = 1`, mesuré : **agent 5,78 → 3,88 Mo (−33 %)**, **console Windows 24,2 → 13,0 Mo (−46 %)**. Rien ne change au comportement, et ça compte pour un agent poussé sur le mesh à chaque mise à jour. `spike/` compile désormais en CI (il aurait pourri en silence), et le critère de suppression du dialecte de compatibilité est écrit dans `identity.rs`. ## 6. Jeton partagé optionnel L'agent acceptait tout ce qui vient du mesh. Assumé pour un banc d'essai, mais le rayon d'action a grandi : binaire remplaçable à distance, écriture de fichiers, PTY, lancement d'un programme. Un hôte compromis donnait la main sur tous les autres. `--token-file` ferme cette porte **sans rien casser** : sans l'option, le comportement est inchangé, donc l'activation se fait hôte par hôte. Refus dans un intercepteur, donc avant le service et sur toutes les méthodes — vérifié sur un appel unaire, un flux sortant et un flux entrant. Comparaison en temps constant, message qui ne distingue pas « absent » de « faux ». Ce que ça protège : un autre hôte du mesh. Ce que ça ne protège pas : qui sait lire le fichier. C'est un secret partagé, pas une identité par hôte ; le mTLS reste un autre chantier. ## Vérifications **133 tests Rust** (84 protocol+agent, 49 console) et **31 frontend**. `make ci` passe en entier : fmt, clippy strict, tests, audit, liens de doc, frontend, cohérence du `dist`, compilation du banc d'essai. Jeton vérifié de bout en bout contre un agent local ; le reste l'a été contre `ep1` et `vps.kxh-studio.fr`. ## Reste à faire, hors de cette PR Cinq agents à redéployer par SSH (`ep2`, `forge`, `monitor`, `pbs1`, `pve1` — `mtmg` injoignable), et le rendu visuel du tri, que je n'ai pas pu contrôler à l'écran. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01GzHyvUbKutGrRcWjyfwDkT
édition vim : ne plus ouvrir un shell nu à côté de l'onglet demandé
All checks were successful
CI / Rust (format, lint, tests) (pull_request) Successful in 1m56s
CI / Agent Linux (pull_request) Successful in 1m36s
CI / Frontend (tests, build, cohérence de dist) (pull_request) Successful in 16s
CI / Console Linux (pull_request) Successful in 9m44s
CI / Console Windows (cross-compilation) (pull_request) Successful in 9m7s
CI / Publication sur la forge (pull_request) Successful in 3s
7adc80d41a
Cliquer un fichier dans le gestionnaire monte l'onglet Shell, dont le
`onMount` créait systématiquement un shell de connexion — en plus de l'onglet
vim ouvert par la demande. Deux onglets apparaissaient donc, et selon l'ordre
d'exécution des effets l'onglet actif pouvait être le shell nu, l'onglet voulu
passant inaperçu à côté. Vu de l'utilisateur : « ça ouvre juste un PTY sans le
bon fichier ».

Une demande présente au montage EST désormais le premier onglet, et aucun
shell nu n'est créé à côté. Les demandes sont repérées par identité d'objet
pour qu'`onMount` et l'effet qui le suit ne l'ouvrent pas deux fois.

Ajoute une trace côté agent de ce qu'il lance réellement (`shell : vim
(1 argument(s)) : [...]`). Sans elle, un `program` vide qui retombe sur le
shell de connexion est indiscernable d'un shell demandé exprès : un `ps` sur
l'hôte montre `/bin/bash` dans les deux cas, ce qui a rendu ce diagnostic plus
long qu'il n'aurait dû.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzHyvUbKutGrRcWjyfwDkT
audit et qualité : analyses statiques, dans la CI comme en local
All checks were successful
CI / Audit et qualité du code (pull_request) Successful in 10m36s
CI / Frontend (tests, build, cohérence de dist) (pull_request) Successful in 17s
CI / Rust (format, lint, tests) (pull_request) Successful in 14m26s
CI / Console Linux (pull_request) Successful in 3m47s
CI / Agent Linux (pull_request) Successful in 2m4s
CI / Console Windows (cross-compilation) (pull_request) Successful in 3m31s
CI / Publication sur la forge (pull_request) Successful in 4s
b28d7d0505
Ajoute une cible `make audit`, chaînée dans `make ci` et jouée par un nouveau
job de CI « Audit et qualité du code ». Trois contrôles :

* `cargo audit --deny warnings` sur les DEUX Cargo.lock. Zéro vulnérabilité
  aujourd'hui ; huit alertes « non maintenu » ou « non sûr » restent, toutes
  transitives (`serial` via portable-pty, les `unic-*` et `glib` via l'arbre
  GTK de Tauri). Elles sont listées ET justifiées dans `.cargo/audit.toml`,
  chacune avec son chemin de dépendance — c'est ce qui garantit qu'une
  NOUVELLE alerte arrête le build au lieu de se fondre dans le bruit.
* Un jeu de lints clippy au-delà de `-D warnings`, choisi pour attraper des
  défauts et non du style.
* Les liens intra-doc, qui cassent en silence quand un type est renommé.

`clippy::pedantic` en entier a été écarté après mesure : 228 avertissements sur
31 lints, dont l'essentiel est de la préférence de style — des backticks autour
de « systemd » dans de la prose française. Adopter le tout aurait noyé le
signal ; le rapport est dans le README.

Cinq défauts réels trouvés et corrigés au passage :

* **la géométrie de terminal reçue du fil était tronquée en silence.** proto3
  n'a pas d'entier 16 bits, donc `cols`/`rows` voyagent en `uint32` : un
  `as u16` nu transformait 70 000 colonnes en 4 464, et le PTY était dimensionné
  sur une valeur que personne n'avait demandée. Sature explicitement désormais ;
* le code de sortie d'un shell (`u32` chez portable-pty, `int32` au contrat)
  pouvait se replier en négatif, donc en un code plausible et faux. `-1`, qui
  est déjà la valeur « inconnu » ici, remplace la troncature ;
* la taille d'une clé RSA se déduit d'une entrée non contrôlée : `None`
  (« taille inconnue ») vaut mieux qu'un `as u32` qui tronque ;
* le préfixe de longueur du dialecte de compatibilité annonçait une longueur
  fausse au-delà de 4 Gio au lieu d'échouer franchement, ce qui désynchronise
  le flux ;
* trois compteurs de conversion (`cpu_count`, `rule_count`, `index`) tronquaient
  au lieu de saturer.

Un seul `#[allow]` ajouté, sur le calcul de débit réseau, avec sa
justification : un `as` de flottant vers entier sature depuis Rust 1.45 et la
division y est toujours positive. Le déclarer garde les lints actifs partout
ailleurs plutôt que de contourner le code.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzHyvUbKutGrRcWjyfwDkT
dxsk changed title from Édition vim : ne plus ouvrir un shell nu à côté de l'onglet demandé to Correctif de l'édition vim, et passe d'audit / qualité du code 2026-09-10 16:34:38 +02:00
Ajoute une suite de 18 tests d'intégration en processus : le service gRPC est
monté sur un port éphémère dans le test et piloté par le client généré. Ni
mesh, ni hôte distant, ni déploiement — mais le vrai transport, le vrai code
généré et le vrai service. C'était le trou de couverture le plus large :
jusqu'ici seul `agent probe` exerçait ces chemins, et il demande un agent
vivant, donc il ne tourne pas en CI.

Trois défauts trouvés en écrivant ces tests, tous introduits par la migration :

* **`FilePut` n'avait plus aucune borne de taille.** Le cadrage d'avant gRPC le
  plafonnait à MAX_FRAME ; j'ai présenté la levée de ce plafond comme une
  correction sans voir qu'il servait aussi de garde-fou. Un client du mesh
  pouvait remplir le disque de l'hôte. `MAX_FILE_PUT` (1 Gio) rétablit la
  borne, s'aligne sur celle de la lecture, et un dépassement efface le partiel
  au lieu de laisser un fichier tronqué en place.
* **Abandonner un `Exec` ne tuait pas la commande.** Le producteur attendait
  `child.wait()` : une commande sans fin ne remarquait jamais le départ du
  client et continuait de tourner sur l'hôte, pour personne. L'ancien protocole
  s'en sortait par un registre d'`AbortHandle` que `Cancel` révoquait ; en
  passant au transport, ce garde-fou avait disparu sans remplaçant.
* **Même chose pour le suivi de journal** : `next_line()` reste en attente sur
  un journal silencieux, donc le `journalctl` ou le `tail` survivait au client.

Les deux annulations réagissent maintenant à la fermeture du récepteur
(`tx.closed()`), et leurs tests ont été **vérifiés en retirant le correctif** :
ils échouent alors avec le bon message, ce qui est la seule façon de savoir
qu'un test anti-régression en est un.

La borne d'envoi est portée par `AgentSvc` plutôt que lue en constante : c'est
ce qui permet de vérifier le refus sans streamer un gigaoctet dans un test, et
ce qui laissera la porte ouverte à un réglage par hôte.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzHyvUbKutGrRcWjyfwDkT
Il n'y avait aucune limite : un client du mesh pouvait ouvrir autant de PTY, de
suivis de journaux, d'exécutions et d'abonnements métriques qu'il voulait,
chacun avec son processus et son thread de lecture. C'était déjà vrai avant
gRPC, mais le transport rend l'ouverture bien moins coûteuse — et il n'y a plus
de table d'annulation où l'on voyait le compte grimper.

Un compteur porté par le service, plafonné à 64 par défaut, avec un jeton qui
libère la place **en tombant**. Le déplacer dans la tâche productrice suffit :
la comptabilité suit alors la vie réelle de la session, sans avoir à penser à
décrémenter sur chaque chemin de sortie — c'est précisément ce genre d'oubli
qui faisait fuir l'ancienne table indexée par `id`.

Deux tests, tous deux vérifiés en retirant le correctif :

* au-delà du plafond, une session est refusée en RESOURCE_EXHAUSTED avec le
  chiffre dans le message, et libérer une place rouvre le droit d'entrer — sans
  quoi le compteur fuirait et l'hôte se fermerait définitivement ;
* les sessions PTY comptent. Ce test a été écrit après avoir constaté que le
  jeton du shell était libéré dès le retour de la méthode au lieu de vivre le
  temps de la session : les plus lourdes ne comptaient donc pas du tout.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzHyvUbKutGrRcWjyfwDkT
**Tests de composants Svelte.** `vitest` tournait sans DOM : seule la logique
extraite dans `util.js` était testable. C'est ce trou qui a laissé passer le
bug de l'onglet vim — personne ne pouvait monter un composant pour le
constater. jsdom + `@testing-library/svelte` ouvrent cette classe de tests, et
quatre premiers cas exercent le tri d'un tableau du clic à l'ordre des lignes :
le câblage entre l'en-tête, l'état de tri et la table de clés du composant.
Ces clés sont écrites à la main, tableau par tableau — une faute de frappe y
passait inaperçue avec les seuls tests de `util.js`.

La condition de résolution `browser` est posée **uniquement sous vitest** :
sans elle Vite sert la variante serveur de Svelte et le montage retombe sur
l'API « legacy » que Svelte 5 refuse. La conditionner évite de toucher à la
résolution du build de production, qui est ce que la WebView charge.

**Taille des binaires.** `lto = "fat"` + `codegen-units = 1` sur les deux
workspaces, mesuré : agent 5,78 → 3,88 Mo (−33 %), console Windows 24,2 →
13,0 Mo (−46 %). Rien ne change au comportement, et ça compte pour un agent
poussé sur le mesh à chaque mise à jour. Le prix est un build release plus lent
(agent 36 s, console 1 min 39), indolore ici puisque les itérations se font en
debug.

`panic = "abort"` écarté exprès : il gagnerait encore quelques centaines de
kilooctets, mais une panique dans une tâche tuerait tout l'agent au lieu de
n'emporter que la session concernée.

**Le banc d'essai compile en CI.** `spike/` vit dans un workspace à part, donc
rien ne le construisait : il aurait pourri en silence. `make spike` vérifie
qu'il suit les évolutions du crate `protocol`, sans lancer ses mesures (qui
demandent un hôte).

**Critère de suppression du dialecte de compatibilité**, écrit dans
`identity.rs` : il part le jour où `agent probe` rend « contrat 4 » sur tous
les hôtes du parc. Sans ce critère, ce module resterait dix ans « au cas où ».

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzHyvUbKutGrRcWjyfwDkT
jeton partagé optionnel : fermer la porte du mesh sans casser le parc
All checks were successful
CI / Rust (format, lint, tests) (pull_request) Successful in 2m16s
CI / Frontend (tests, build, cohérence de dist) (pull_request) Successful in 21s
CI / Agent Linux (pull_request) Successful in 2m29s
CI / Audit et qualité du code (pull_request) Successful in 10m12s
CI / Console Linux (pull_request) Successful in 9m48s
CI / Console Windows (cross-compilation) (pull_request) Successful in 7m21s
CI / Publication sur la forge (pull_request) Successful in 4s
df575f3dba
Par défaut l'agent acceptait **tout ce qui vient du mesh**. C'était assumé pour
un banc d'essai, mais le rayon d'action a grandi depuis cette décision :
remplacement du binaire à distance, écriture de fichiers arbitraires, PTY
interactif, lancement d'un programme avec ses arguments. Un seul hôte compromis
donnait la main sur tous les autres.

`agent serve --token-file <fichier>` exige désormais un jeton partagé. **Sans
l'option, le comportement est inchangé** : c'est ce qui permet de l'ajouter
sans casser un parc déjà déployé, et de l'activer hôte par hôte.

Le refus se fait dans un intercepteur, donc **avant** d'atteindre le service et
sur toutes les méthodes. Un test le vérifie sur un appel unaire, sur
l'ouverture d'un flux sortant et sur un flux entrant — un intercepteur mal
branché ne couvrirait qu'une partie du service, et seul le cas testé le
révélerait.

La comparaison passe par `protocol::secret_egal`, en temps constant : un `==`
s'arrête au premier octet différent, et son temps de réponse laisse
reconstituer un secret octet par octet. Le message d'erreur ne distingue pas
« absent » de « faux » et ne révèle pas la longueur attendue.

Côté poste, `NBOPS_TOKEN` ou un fichier `token` à côté de la configuration de
forge. L'intercepteur est toujours branché même sans jeton, pour éviter deux
types de client selon la configuration. Les trois endroits qui ouvrent une
connexion le portent : la console, la sonde d'identité — sinon un hôte protégé
passerait pour « injoignable » — et `agent probe`.

Vérifié de bout en bout : sonde sans jeton refusée, avec le bon acceptée, avec
un mauvais refusée.

Ce que ça protège : un autre hôte du mesh. Ce que ça ne protège pas : qui sait
lire le fichier de jeton, ni la console elle-même. C'est un secret partagé, pas
une identité par hôte ; le mTLS reste un autre chantier, et le README le dit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GzHyvUbKutGrRcWjyfwDkT
dxsk changed title from Correctif de l'édition vim, et passe d'audit / qualité du code to Correctif vim, audit qualité, tests d'intégration, et durcissement de l'agent 2026-09-10 17:41:31 +02:00
dxsk self-assigned this 2026-09-10 22:05:55 +02:00
dxsk merged commit c92aaa4a37 into main 2026-09-10 22:06:59 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
dxsk/netops!2
No description provided.