guard-destructive.sh : faux positif « clé privée age » sur un grep -nE anodin #24

Closed
opened 2026-10-11 10:06:45 +02:00 by mathieu · 3 comments
Owner

Constaté le 2026-10-07 dans une session kb-mathieu (plugin atelier 0.6.0, hooks/guard-destructive.sh). Deux commandes de lecture ont été refusées avec le motif « clé privée age copiée, déplacée ou affichée » :

  1. grep -nE "^#|sensitivity|frontmatter|front matter|wikilink|\[\[" CONVENTIONS.md | head -50; find . -name '*.md' -not -path './genealogie/*' -not -path './inbox/*' | wc -l; ls .claude/hooks
    — le hook a d'abord affiché une erreur awk : nonterminated character class ^[[$ (source line 8), puis a bloqué.
  2. La même sans \[\[ ni ls .claude/hooks : bloquée aussi, sans erreur awk.

Aucune ne touche à une clé age. Deux défauts probables, à confirmer en lisant le hook :

  • un motif awk construit à partir de la commande sans échapper [ ;
  • le motif « clé age » trop large (déclenché par -nE, ^#, | head ou find … -not -path ?). Le message dit « ne pas relancer ni contourner » : un faux positif fréquent pousse donc à renoncer à des lectures légitimes.

Critères d'acceptation

  • Le motif responsable des deux refus est identifié
  • Les deux commandes ci-dessus passent ; ajoutées comme cas négatifs au harnais de tests du hook
  • Un vrai affichage ou une copie de clé age reste refusé (cas positifs existants verts)
  • Plus aucune erreur awk sur une commande contenant [

Migré de Kaneo le 2026-10-11 : ATE-21 du projet « Atelier », créée le 2026-10-07.

Constaté le 2026-10-07 dans une session `kb-mathieu` (plugin atelier 0.6.0, `hooks/guard-destructive.sh`). Deux commandes de lecture ont été refusées avec le motif « clé privée age copiée, déplacée ou affichée » : 1. `grep -nE "^#|sensitivity|frontmatter|front matter|wikilink|\[\[" CONVENTIONS.md | head -50; find . -name '*.md' -not -path './genealogie/*' -not -path './inbox/*' | wc -l; ls .claude/hooks` — le hook a d'abord affiché une erreur awk : `nonterminated character class ^[[$` (source line 8), puis a bloqué. 2. La même sans `\[\[` ni `ls .claude/hooks` : bloquée aussi, sans erreur awk. Aucune ne touche à une clé age. Deux défauts probables, à confirmer en lisant le hook : - un motif awk construit à partir de la commande sans échapper `[` ; - le motif « clé age » trop large (déclenché par `-nE`, `^#`, `| head` ou `find … -not -path` ?). Le message dit « ne pas relancer ni contourner » : un faux positif fréquent pousse donc à renoncer à des lectures légitimes. ## Critères d'acceptation - [ ] Le motif responsable des deux refus est identifié - [ ] Les deux commandes ci-dessus passent ; ajoutées comme cas négatifs au harnais de tests du hook - [ ] Un vrai affichage ou une copie de clé age reste refusé (cas positifs existants verts) - [ ] Plus aucune erreur awk sur une commande contenant `[` --- *Migré de Kaneo le 2026-10-11 : ATE-21 du projet « Atelier », créée le 2026-10-07.* <!-- kaneo-id: ykxojl5ddovofogk4x8l5nhi -->
Author
Owner

Commentaire Kaneo du 2026-10-07 06:54 UTC

Nouveau cas le 2026-10-07, dans une session infrastructure (même plugin atelier 0.6.0). Deux lectures en SSH sur pve ont été refusées avec le même motif, « clé privée age copiée, déplacée ou affichée » :

  1. ssh -o ConnectTimeout=10 pve 'df -h /mnt/pve/backup-ssd; echo ---; cat /etc/pve/jobs.cfg; echo ---; grep -A8 "backup-ssd" /etc/pve/storage.cfg; echo ---; ls -la --time-style=long-iso /mnt/pve/backup-ssd/dump/ | grep -v "\.log$"; echo ---; du -sh /mnt/pve/backup-ssd/* 2>/dev/null'
  2. La même sans grep … storage.cfg : bloquée aussi.

Ce cas écarte une hypothèse : la sous-chaîne « age » de storage.cfg n'est pas en cause, puisque la commande 2 ne la contient pas. Éléments communs avec les cas de kb-mathieu : un cat ou un ls suivi d'un | grep/| head, et 2>/dev/null. Le handoff précédent signalait aussi des faux positifs sur | head et git branch -d.

Effet concret : la vérification de la rétention de backup-ssd (pve à 84,9 %) a dû être renvoyée à Mathieu.

Critère d'acceptation à ajouter : les deux commandes ci-dessus passent et rejoignent les cas négatifs.

*Commentaire Kaneo du 2026-10-07 06:54 UTC* Nouveau cas le 2026-10-07, dans une session `infrastructure` (même plugin atelier 0.6.0). Deux lectures en SSH sur `pve` ont été refusées avec le même motif, « clé privée age copiée, déplacée ou affichée » : 1. `ssh -o ConnectTimeout=10 pve 'df -h /mnt/pve/backup-ssd; echo ---; cat /etc/pve/jobs.cfg; echo ---; grep -A8 "backup-ssd" /etc/pve/storage.cfg; echo ---; ls -la --time-style=long-iso /mnt/pve/backup-ssd/dump/ | grep -v "\.log$"; echo ---; du -sh /mnt/pve/backup-ssd/* 2>/dev/null'` 2. La même sans `grep … storage.cfg` : bloquée aussi. Ce cas écarte une hypothèse : la sous-chaîne « age » de `storage.cfg` n'est pas en cause, puisque la commande 2 ne la contient pas. Éléments communs avec les cas de `kb-mathieu` : un `cat` ou un `ls` suivi d'un `| grep`/`| head`, et `2>/dev/null`. Le handoff précédent signalait aussi des faux positifs sur `| head` et `git branch -d`. Effet concret : la vérification de la rétention de `backup-ssd` (pve à 84,9 %) a dû être renvoyée à Mathieu. Critère d'acceptation à ajouter : les deux commandes ci-dessus passent et rejoignent les cas négatifs.
Author
Owner

Commentaire Kaneo du 2026-10-08 22:41 UTC

2026-10-09, veille ADR-0014 de kb-mathieu : le faux positif est plus large que le grep -nE. Bloqués aussi : cat package.json, des ls/cat sur un chemin contenant A-agents, et un cp avec glob (cp $S/rapports/*.md …). Piste relevée par un agent : vers les lignes 474-490 de guard-destructive.sh, toute regex ou tout glob étoilé est pris pour une désignation possible d'une clé age. Une session dédiée dans atelier a été lancée le même jour pour corriger, avec tests de non-régression.

*Commentaire Kaneo du 2026-10-08 22:41 UTC* 2026-10-09, veille ADR-0014 de `kb-mathieu` : le faux positif est plus large que le `grep -nE`. Bloqués aussi : `cat package.json`, des `ls`/`cat` sur un chemin contenant `A-agents`, et un `cp` avec glob (`cp $S/rapports/*.md …`). Piste relevée par un agent : vers les lignes 474-490 de `guard-destructive.sh`, toute regex ou tout glob étoilé est pris pour une désignation possible d'une clé age. Une session dédiée dans atelier a été lancée le même jour pour corriger, avec tests de non-régression.
Author
Owner

Copie de l'essai de migration Kaneo → Forgejo du 2026-10-11 (rendu validé avant la vraie migration). Le ticket réel est mathieu/atelier#18. Fermé comme doublon.

Copie de l'essai de migration Kaneo → Forgejo du 2026-10-11 (rendu validé avant la vraie migration). Le ticket réel est mathieu/atelier#18. Fermé comme doublon.
mathieu 2026-10-11 13:24:19 +02:00
Sign in to join this conversation.
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
mathieu/essai-actions#24
No description provided.