From c0b24925bffe005e6239d98c4f1f391b464dd713 Mon Sep 17 00:00:00 2001 From: Mathieu Benoit Date: Wed, 9 Sep 2026 05:39:59 -0400 Subject: [PATCH] =?UTF-8?q?[ADD]=20hygi=C3=A8ne=20:=20signaler=20un=20nom?= =?UTF-8?q?=20de=20machine=20pleinement=20qualifi=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit L'outil voyait les adresses, les courriels et les chemins de compte, mais pas les NOMS — la classe que la règle interdit au même titre, et celle qu'un assistant qui parcourt le réseau multiplie. Le rapport annonçait « 0 identifiant » sur un fichier qui en portait un. Un signal à relire, jamais une trouvaille : un nom d'hôte NU ne se distingue mécaniquement ni d'un mot ordinaire ni du nom d'un logiciel, donc seule la forme qualifiée se reconnaît, contre une liste FERMÉE de suffixes. En sortent l'en-tête de copyright, les domaines de la RFC 2606, et toute adresse portée par une URL. Vérifié : 54 tests, et 21 signaux sur le dépôt, tous des miroirs. --- EN --- The tool saw addresses, e-mails and account paths, but not NAMES — the class the rule forbids just as much, and the one an assistant sweeping the network multiplies. The report announced "0 identifying" on a file that carried one. A signal to re-read, never a finding: a BARE host name is mechanically indistinguishable from an ordinary word or a piece of software, so only the qualified form is recognised, against a CLOSED list of suffixes. Out of it go the copyright header, the RFC 2606 domains, and any address carried by a URL. Checked: 54 tests, and 21 signals across the repository, all mirrors. Assisted-by: Claude Opus 5 --- .claude/rules/04-code-conventions.md | 7 +- script/analyse/check_comment_hygiene.py | 89 +++++++++++++++++++++- test/test_check_comment_hygiene.py | 98 +++++++++++++++++++++++++ 3 files changed, 192 insertions(+), 2 deletions(-) diff --git a/.claude/rules/04-code-conventions.md b/.claude/rules/04-code-conventions.md index a5943ba..071cc63 100644 --- a/.claude/rules/04-code-conventions.md +++ b/.claude/rules/04-code-conventions.md @@ -60,7 +60,12 @@ python3 script/analyse/check_comment_hygiene.py --staged 🔴 `identifiant` est une trouvaille, à retirer. 🟡 `récit` est un signal à relire : l'outil ne sait pas si la phrase énonce un fait durable ou raconte -une journée, et ne tranche pas à votre place. +une journée, et ne tranche pas à votre place. 🟡 `nom` en est un autre, et sa +limite est plus dure : un nom d'hôte NU ne se distingue mécaniquement ni d'un +mot ordinaire ni du nom d'un logiciel, donc l'outil ne voit que la forme +pleinement qualifiée. Un miroir de paquets nommé dans un commentaire y +répond, et se confirme d'un coup d'œil ; l'absence de signal ne prouve rien +sur les noms. Trois exemples pris dans ce dépôt, leurs noms propres masqués — une règle qui interdit de nommer ne se cite pas elle-même en clair. diff --git a/script/analyse/check_comment_hygiene.py b/script/analyse/check_comment_hygiene.py index 65b449a..a2e8f8d 100755 --- a/script/analyse/check_comment_hygiene.py +++ b/script/analyse/check_comment_hygiene.py @@ -8,7 +8,7 @@ La convention est dans `.claude/rules/04-code-conventions.md` : un commentaire dit COMMENT le code marche, il ne porte aucune donnée identifiante et il ne raconte pas l'enquête. Cet outil en vérifie la part mécanique. -Deux familles, de sûreté très différente : +Trois familles, de sûreté très différente : - `identifiant` — adresse IP, courriel, chemin de compte. Une correspondance est une trouvaille : ces formes n'ont aucune raison d'être @@ -17,6 +17,12 @@ Deux familles, de sûreté très différente : absolue, première personne. Une correspondance est un SIGNAL À RELIRE : la même phrase peut énoncer un fait durable. L'outil ne trie pas à la place du lecteur. +- `nom` — un nom de machine pleinement qualifié. Aussi un signal à relire, + et pour une raison plus dure : un nom d'hôte NU ne se distingue + mécaniquement ni d'un mot ordinaire ni du nom d'un logiciel, donc cette + famille ne voit que la forme qualifiée. Les miroirs de paquets nommés dans + un commentaire y répondent, et c'est le prix d'un signal mécanique — le + lecteur confirme en deux secondes, là où la classe entière était invisible. Il lit les commentaires `#` et, en Python, les docstrings de module, de classe et de fonction. Le reste du code ne l'intéresse pas. @@ -116,6 +122,64 @@ MOTIFS_RECIT = ( ("personne", PERSONNE), ) +# Le nom de machine est la SEULE classe interdite qu'aucun motif ne tranche : +# un nom d'hôte ne se distingue mécaniquement ni d'un mot pointé ordinaire, ni +# du nom d'un logiciel. Seule sa forme pleinement qualifiée se reconnaît, et +# encore : « chemin.home » et « logging.info » ont la même forme. D'où un +# signal à relire et non une trouvaille. +# +# Le suffixe est comparé à une liste FERMÉE. Sans elle, tout attribut pointé +# du code correspondrait. Les suffixes de service — local, lan, internal — +# y sont exprès : c'est sous eux qu'une machine du parc se nomme. +SUFFIXES_DHOTE = ( + "com", + "ca", + "net", + "org", + "io", + "dev", + "fr", + "be", + "ch", + "eu", + "us", + "uk", + "biz", + "cloud", + "app", + "tech", + "quebec", + "local", + "lan", + "internal", + "intra", + "corp", +) + +# Le point qui SUIT décide de deux choses opposées : suivi d'un caractère de +# nom, il prolonge l'adresse et la correspondance n'est qu'un préfixe ; seul, +# c'est le point d'une phrase, et l'adresse s'arrête là. Les confondre rendait +# invisible toute adresse en fin de phrase. +NOM_DHOTE = re.compile( + r"(?