2026-03-12 02:50:18 -04:00
|
|
|
|
# Conventions de code
|
|
|
|
|
|
|
[REF] claude: trim the always-loaded guidance, and fix what it got wrong
Every session paid ~4 000 tokens for CLAUDE.md and .claude/rules/, and part of
that content no longer described this repository:
CLAUDE.md and 05-environments.md gave .venv.odoo18/bin/python — a path that
does not exist. The real one carries BOTH versions,
.venv.odoo18.0_python3.12.10. 02-project-structure.md announced addons/ and
odoo12.0/, absent from the checkout.
That is the reason for the cuts, more than the token count: the files drifted
from the repository, while « ls » cannot. What a session can rebuild by
reading the code is now left to the code.
02-project-structure.md deleted — a tree that ls gives, and gives right
05-environments.md deleted — a venv list that was simply false
04-code-conventions.md reduced to a pointer at .flake8, .editorconfig and
pyproject.toml, which already hold every value it
repeated, plus the Git conventions, which they
do not
01-versions.md table dropped for the pointer at
conf/supported_version_erplibre.json, whose keys
already pair Odoo with Python
Two blocks move to lazy loading — their body costs nothing until invoked:
03-commands.md -> skill erplibre-commands (kept whole: there is no
« make help » target, and the per-module test recipes
carry flags nobody would guess)
07-documentation.md -> skill erplibre-doc-i18n for the how-to, while the
prohibition « never edit a generated .md » STAYS in
the rules: a rule that must hold at all times cannot
live in a file loaded on demand
Resident guidance: ~3 997 -> ~1 939 est. tokens per session.
--- FR ---
Chaque session payait environ 4 000 jetons pour CLAUDE.md et .claude/rules/, et
une partie de ce contenu ne décrivait plus ce dépôt :
CLAUDE.md et 05-environments.md donnaient .venv.odoo18/bin/python — un chemin
qui n'existe pas. Le vrai porte les DEUX versions,
.venv.odoo18.0_python3.12.10. 02-project-structure.md annonçait addons/ et
odoo12.0/, absents du checkout.
C'est la raison des coupes, plus encore que le nombre de jetons : les fichiers
avaient dérivé par rapport au dépôt, ce que « ls » ne peut pas faire. Ce qu'une
session peut reconstruire en lisant le code est désormais laissé au code.
02-project-structure.md supprimé — une arborescence que ls donne, et donne
juste
05-environments.md supprimé — une liste de venvs simplement fausse
04-code-conventions.md réduit à un renvoi vers .flake8, .editorconfig et
pyproject.toml, qui portent déjà toutes les valeurs
qu'il répétait, plus les conventions Git, qu'ils ne
portent pas
01-versions.md tableau abandonné au profit du renvoi vers
conf/supported_version_erplibre.json, dont les clés
apparient déjà Odoo et Python
Deux blocs passent en chargement paresseux — leur corps ne coûte rien tant
qu'il n'est pas invoqué :
03-commands.md -> skill erplibre-commands, conservée entière : il
n'existe pas de cible « make help », et les recettes
de test par module portent des drapeaux que personne
ne devinerait
07-documentation.md -> skill erplibre-doc-i18n pour le mode d'emploi, tandis
que l'interdiction « ne jamais éditer un .md généré »
RESTE dans les règles : une règle qui doit tenir en
permanence ne peut pas vivre dans un fichier chargé à
la demande
Consignes résidentes : environ 3 997 -> 1 939 jetons estimés par session.
Assisted-by: Claude Opus 4.8
2026-08-02 03:16:36 -04:00
|
|
|
|
Le formatage et le lint sont entièrement décrits par les fichiers de
|
|
|
|
|
|
configuration du dépôt — les lire plutôt que de supposer : `.flake8`,
|
|
|
|
|
|
`.editorconfig`, et les sections `[tool.black]` / `[tool.isort]` de
|
|
|
|
|
|
`pyproject.toml`. `make format` applique l'ensemble.
|
2026-03-12 02:50:18 -04:00
|
|
|
|
|
[REF] claude: trim the always-loaded guidance, and fix what it got wrong
Every session paid ~4 000 tokens for CLAUDE.md and .claude/rules/, and part of
that content no longer described this repository:
CLAUDE.md and 05-environments.md gave .venv.odoo18/bin/python — a path that
does not exist. The real one carries BOTH versions,
.venv.odoo18.0_python3.12.10. 02-project-structure.md announced addons/ and
odoo12.0/, absent from the checkout.
That is the reason for the cuts, more than the token count: the files drifted
from the repository, while « ls » cannot. What a session can rebuild by
reading the code is now left to the code.
02-project-structure.md deleted — a tree that ls gives, and gives right
05-environments.md deleted — a venv list that was simply false
04-code-conventions.md reduced to a pointer at .flake8, .editorconfig and
pyproject.toml, which already hold every value it
repeated, plus the Git conventions, which they
do not
01-versions.md table dropped for the pointer at
conf/supported_version_erplibre.json, whose keys
already pair Odoo with Python
Two blocks move to lazy loading — their body costs nothing until invoked:
03-commands.md -> skill erplibre-commands (kept whole: there is no
« make help » target, and the per-module test recipes
carry flags nobody would guess)
07-documentation.md -> skill erplibre-doc-i18n for the how-to, while the
prohibition « never edit a generated .md » STAYS in
the rules: a rule that must hold at all times cannot
live in a file loaded on demand
Resident guidance: ~3 997 -> ~1 939 est. tokens per session.
--- FR ---
Chaque session payait environ 4 000 jetons pour CLAUDE.md et .claude/rules/, et
une partie de ce contenu ne décrivait plus ce dépôt :
CLAUDE.md et 05-environments.md donnaient .venv.odoo18/bin/python — un chemin
qui n'existe pas. Le vrai porte les DEUX versions,
.venv.odoo18.0_python3.12.10. 02-project-structure.md annonçait addons/ et
odoo12.0/, absents du checkout.
C'est la raison des coupes, plus encore que le nombre de jetons : les fichiers
avaient dérivé par rapport au dépôt, ce que « ls » ne peut pas faire. Ce qu'une
session peut reconstruire en lisant le code est désormais laissé au code.
02-project-structure.md supprimé — une arborescence que ls donne, et donne
juste
05-environments.md supprimé — une liste de venvs simplement fausse
04-code-conventions.md réduit à un renvoi vers .flake8, .editorconfig et
pyproject.toml, qui portent déjà toutes les valeurs
qu'il répétait, plus les conventions Git, qu'ils ne
portent pas
01-versions.md tableau abandonné au profit du renvoi vers
conf/supported_version_erplibre.json, dont les clés
apparient déjà Odoo et Python
Deux blocs passent en chargement paresseux — leur corps ne coûte rien tant
qu'il n'est pas invoqué :
03-commands.md -> skill erplibre-commands, conservée entière : il
n'existe pas de cible « make help », et les recettes
de test par module portent des drapeaux que personne
ne devinerait
07-documentation.md -> skill erplibre-doc-i18n pour le mode d'emploi, tandis
que l'interdiction « ne jamais éditer un .md généré »
RESTE dans les règles : une règle qui doit tenir en
permanence ne peut pas vivre dans un fichier chargé à
la demande
Consignes résidentes : environ 3 997 -> 1 939 jetons estimés par session.
Assisted-by: Claude Opus 4.8
2026-08-02 03:16:36 -04:00
|
|
|
|
Prettier (via npm) formate XML/JSON/YAML ; `.editorconfig` donne les
|
|
|
|
|
|
indentations par type de fichier.
|
2026-03-12 02:50:18 -04:00
|
|
|
|
|
[ADD] convention : dire le fonctionnement, pas le contexte ni les noms
Le dépôt n'avait aucune règle sur le commentaire de code : le seul modèle
d'écriture était le corps de commit, et le gabarit y renvoyait le
raisonnement qui n'y tenait pas. Le récit s'écoulait dans les sources,
avec les noms qu'il portait.
L'épreuve tient en une phrase : le code est le sujet, au présent de ce
qu'il fait. Une phrase dont le sujet est un incident, une machine, une date
ou une personne part vers tasks/, non versionné ; le mode de défaillance
que le code empêche reste. Rien d'identifiant hors de private/, et
seulement sur un dépôt privé.
--- EN ---
The repository had no rule at all about code comments: the only writing
model available was the commit body, and the template sent the reasoning
that did not fit there into a comment. The story flowed into the sources,
carrying the names it named.
The test fits in one sentence: the code is the subject, in the present of
what it does. A sentence whose subject is an incident, a machine, a date or
a person goes to tasks/, unversioned; the failure mode the code prevents
stays. Nothing identifying outside private/, and only on a private
repository.
Assisted-by: Claude Opus 5
2026-08-30 02:02:15 -04:00
|
|
|
|
## Commentaires
|
|
|
|
|
|
|
|
|
|
|
|
Un commentaire dit COMMENT le code fonctionne : ce que la fonction prend, ce
|
|
|
|
|
|
qu'elle rend, l'invariant qu'elle tient, ses effets de bord, la contrainte
|
|
|
|
|
|
technique qu'on ne devine pas en lisant la ligne d'à côté. Il doit se lire
|
|
|
|
|
|
dans dix ans sans rien savoir de la semaine où il a été écrit. La règle vaut
|
|
|
|
|
|
pour les docstrings autant que pour les lignes `#`.
|
|
|
|
|
|
|
|
|
|
|
|
**L'épreuve : le sujet et le temps.** Chaque phrase a le CODE pour sujet, au
|
|
|
|
|
|
présent de ce qu'il fait. Une phrase dont le sujet est un incident, une
|
|
|
|
|
|
machine, une date ou une personne est à couper, où qu'elle se trouve dans le
|
|
|
|
|
|
paragraphe. Le MODE DE DÉFAILLANCE que le code empêche est du fonctionnement
|
|
|
|
|
|
et reste — « une VM renommée se voit attribuer la passerelle ». L'INCIDENT où
|
|
|
|
|
|
on l'a observé est du récit et part — « vécu sur telle VM, annoncée à telle
|
|
|
|
|
|
adresse ».
|
|
|
|
|
|
|
|
|
|
|
|
**Les chiffres.** Une mesure qui établit un fait durable reste, dépouillée de
|
|
|
|
|
|
sa date, de son lieu et de son opérateur : une limite, un seuil, une valeur
|
|
|
|
|
|
que documente l'éditeur. Un relevé de ce qui répondait ce jour-là part.
|
|
|
|
|
|
|
|
|
|
|
|
**Rien d'identifiant, jamais** : nom d'un client ou d'une organisation tierce,
|
|
|
|
|
|
nom de base de données réelle, nom de VM ou d'hôte, adresse IP, courriel,
|
|
|
|
|
|
chemin portant un nom d'utilisateur, libellé ou chiffre tiré des données d'un
|
|
|
|
|
|
client. La seule exception est l'en-tête de copyright : le dépôt nomme son
|
|
|
|
|
|
propriétaire, pas ses clients. Généraliser plutôt que censurer — « sur une
|
|
|
|
|
|
base de production », « sur un hôte qui exige une authentification sudo
|
|
|
|
|
|
interactive » — dit la CLASSE de situation, qui est ce qui sert au lecteur.
|
|
|
|
|
|
|
[ADD] commentaires : un relevé non bloquant, sa règle, le code nettoyé
Rien ne relevait les commentaires hors convention. L'outil lit commentaires et
docstrings, jamais le code autour, et rend deux familles inégales :
l'identifiant — adresse, courriel, chemin de compte, nom de la liste privée —
est une trouvaille ; le récit — témoignage, date, personne — un signal à relire.
Le hook pre-commit le lance sur l'index, sort toujours en 0 — un contrôle
bloquant à cette échelle se fait désinstaller — et parle quand l'outil échoue.
La règle du générateur et sa doc portent le nettoyage au fur et à mesure, et
l'exemple d'un interdit s'invente : base, adresse, compte et hôte en prennent un.
L'écran du contexte est posé, sans entrée de menu. Vérifié : 252 tests des six
fichiers d'essai touchés passent.
--- EN ---
Nothing reported the comments that break the convention. The tool reads
comments and docstrings, never the code around them, and returns two unequal
families: identifying data — address, e-mail, account path, private-list name
— is a finding; narrative — witness marker, date, person — a signal to re-read.
The pre-commit hook runs it on the index, always exits 0 — a blocking check at
that scale gets uninstalled — and speaks when the tool fails. The generator
rule and its doc carry the clean-up as you go, and a forbidden thing's example
is invented: a real database, address, account and host each take one.
The context screen is in place, with no menu entry. Checked: 252 tests of the
six touched fixture files pass.
Assisted-by: Claude Opus 5
2026-08-30 02:02:51 -04:00
|
|
|
|
**L'exemple qui illustre un interdit s'invente.** La règle a d'abord été
|
|
|
|
|
|
violée par ses propres tests : pour démontrer qu'une adresse et un chemin de
|
|
|
|
|
|
compte sont refusés, ils en portaient de vrais, pris dans le parc. Choisir un
|
|
|
|
|
|
cas réel « parce qu'il est parlant » est exactement le réflexe que la règle
|
|
|
|
|
|
combat, et un test le fige pour toujours. Une valeur inventée démontre aussi
|
|
|
|
|
|
bien ; vérifier qu'elle n'existe nulle part ailleurs dans le dépôt.
|
|
|
|
|
|
|
[ADD] convention : dire le fonctionnement, pas le contexte ni les noms
Le dépôt n'avait aucune règle sur le commentaire de code : le seul modèle
d'écriture était le corps de commit, et le gabarit y renvoyait le
raisonnement qui n'y tenait pas. Le récit s'écoulait dans les sources,
avec les noms qu'il portait.
L'épreuve tient en une phrase : le code est le sujet, au présent de ce
qu'il fait. Une phrase dont le sujet est un incident, une machine, une date
ou une personne part vers tasks/, non versionné ; le mode de défaillance
que le code empêche reste. Rien d'identifiant hors de private/, et
seulement sur un dépôt privé.
--- EN ---
The repository had no rule at all about code comments: the only writing
model available was the commit body, and the template sent the reasoning
that did not fit there into a comment. The story flowed into the sources,
carrying the names it named.
The test fits in one sentence: the code is the subject, in the present of
what it does. A sentence whose subject is an incident, a machine, a date or
a person goes to tasks/, unversioned; the failure mode the code prevents
stays. Nothing identifying outside private/, and only on a private
repository.
Assisted-by: Claude Opus 5
2026-08-30 02:02:15 -04:00
|
|
|
|
Le récit n'est pas perdu, il change de place : l'enquête, les mesures datées
|
|
|
|
|
|
et les impasses vivent dans `tasks/`, qui n'est pas versionné. Ni le fichier
|
|
|
|
|
|
ni le corps du commit ne les portent.
|
|
|
|
|
|
|
|
|
|
|
|
Cela vaut aussi pour l'existant, mais **au fur et à mesure** : on corrige les
|
|
|
|
|
|
commentaires du fichier qu'on touche, au moment où on le touche, et non en une
|
|
|
|
|
|
passe qui réécrirait le dépôt. Le hook `pre-commit` liste ce qui est à relire
|
|
|
|
|
|
dans les fichiers indexés, sans jamais bloquer le commit ; le même outil se
|
|
|
|
|
|
lance à la main :
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
python3 script/analyse/check_comment_hygiene.py script/todo/todo.py
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
|
|
|
|
`qemu_manage.py` — la dernière phrase, « Vécu sur « <VM> », annoncée en
|
|
|
|
|
|
<adresse> au lieu de <adresse> », part en entier. Les deux qui la précèdent
|
|
|
|
|
|
disent déjà tout, une fois l'imparfait du récit passé au présent : « une VM
|
|
|
|
|
|
renommée, dont le bail porte encore l'ancien nom d'hôte, SE VOIT attribuer la
|
|
|
|
|
|
passerelle ».
|
|
|
|
|
|
|
|
|
|
|
|
`todo.py` — « recopier « <base_client>_neutralize_upgrade_18 » oblige à
|
|
|
|
|
|
regarder ce qu'on détruit » devient « recopier un nom long oblige à regarder
|
|
|
|
|
|
ce qu'on détruit, là où « o » se tape par réflexe ». L'exemple ne servait qu'à
|
|
|
|
|
|
illustrer « long ».
|
|
|
|
|
|
|
|
|
|
|
|
`qemu_install.py` — le relevé daté des miroirs, qui répondait et qui non tel
|
|
|
|
|
|
jour, part : c'est l'état d'une journée. « Aucun miroir ne réplique tout,
|
|
|
|
|
|
d'où plusieurs entrées plutôt qu'une » reste : c'est la raison d'être de la
|
|
|
|
|
|
liste, et elle est vraie demain.
|
|
|
|
|
|
|
2026-03-12 02:50:18 -04:00
|
|
|
|
## Git
|
|
|
|
|
|
- Branches : `develop` (développement), `master` (production)
|
|
|
|
|
|
- Pas de submodules Git — utilise **Google Repo** pour les addons
|
|
|
|
|
|
- Manifests XML dans `manifest/` pour chaque version Odoo
|
[UPD] claude: align the commit command with the AI policy
The template wrote « Generated by Claude Code », the form AI_POLICY.md
replaces with the Assisted-by trailer. Three defects rode along: the model
came from ~/.claude/settings.json, which has no model key here, so it
declared the sonnet default rather than the truth; --author alone failed on
the committer, this checkout having no git identity; and [UPD] was missing
from the tag table while being the most used tag, 134 of the last 400.
The model now comes from the session transcript, the only source that
follows a /model switch — checked, it prints Claude Opus 5. The timezone is
left to the system so contributors keep their own, and the menu substitutes
name and email separately, the placeholders no longer being adjacent.
--- FR ---
Le gabarit écrivait « Generated by Claude Code », la forme que AI_POLICY.md
remplace par le trailer Assisted-by. Trois défauts l'accompagnaient : le
modèle venait de ~/.claude/settings.json, sans clé model ici, si bien qu'il
déclarait le défaut sonnet plutôt que la vérité ; --author seul échouait sur
le committer, ce checkout n'ayant aucune identité git ; et [UPD] manquait au
tableau des tags alors qu'il est le plus utilisé, 134 des 400 derniers.
Le modèle vient désormais de la transcription de session, seule source qui
suive un changement par /model — vérifié, elle rend Claude Opus 5. Le fuseau
est laissé au système, pour que chaque contributeur garde le sien, et le
menu substitue nom et courriel séparément, les jetons n'étant plus accolés.
Assisted-by: Claude Opus 5
2026-08-07 01:56:11 -04:00
|
|
|
|
- Format de commit : `[TYPE] portée : sujet`, sujet à l'impératif, 72
|
|
|
|
|
|
caractères au plus. Tags réellement utilisés : `[UPD]`, `[FIX]`, `[ADD]`,
|
|
|
|
|
|
`[IMP]`, `[REF]`.
|
2026-08-30 04:43:26 -04:00
|
|
|
|
- **Nommer les fichiers à l'indexation, jamais `git add -A`** : `private/` et
|
|
|
|
|
|
`tasks/` ne sont pas suivis EXPRÈS, et un ratissage les commit. Il emporte
|
|
|
|
|
|
aussi ce qui est en cours ailleurs dans le checkout, sous un sujet qui ne le
|
|
|
|
|
|
couvre pas. `git add -p` quand un fichier porte deux sujets.
|
[UPD] claude: align the commit command with the AI policy
The template wrote « Generated by Claude Code », the form AI_POLICY.md
replaces with the Assisted-by trailer. Three defects rode along: the model
came from ~/.claude/settings.json, which has no model key here, so it
declared the sonnet default rather than the truth; --author alone failed on
the committer, this checkout having no git identity; and [UPD] was missing
from the tag table while being the most used tag, 134 of the last 400.
The model now comes from the session transcript, the only source that
follows a /model switch — checked, it prints Claude Opus 5. The timezone is
left to the system so contributors keep their own, and the menu substitutes
name and email separately, the placeholders no longer being adjacent.
--- FR ---
Le gabarit écrivait « Generated by Claude Code », la forme que AI_POLICY.md
remplace par le trailer Assisted-by. Trois défauts l'accompagnaient : le
modèle venait de ~/.claude/settings.json, sans clé model ici, si bien qu'il
déclarait le défaut sonnet plutôt que la vérité ; --author seul échouait sur
le committer, ce checkout n'ayant aucune identité git ; et [UPD] manquait au
tableau des tags alors qu'il est le plus utilisé, 134 des 400 derniers.
Le modèle vient désormais de la transcription de session, seule source qui
suive un changement par /model — vérifié, elle rend Claude Opus 5. Le fuseau
est laissé au système, pour que chaque contributeur garde le sien, et le
menu substitue nom et courriel séparément, les jetons n'étant plus accolés.
Assisted-by: Claude Opus 5
2026-08-07 01:56:11 -04:00
|
|
|
|
|
[ADD] convention : ce qu'un sujet de commit doit dire
Le manuel encadrait le corps en détail — pourquoi, dix lignes par langue, ce
qu'on ne répète pas du diff — et ne disait du sujet que « courte, à
l'impératif ». Le sujet est pourtant lu cent fois pour une fois que le corps
l'est : git log --oneline, un blame, un bisect, une note de version.
Faute de règle, les sujets dérivent vers le symptôme et la métaphore, qui se
lisent bien sans nommer la partie du système en jeu. La règle ajoute une
épreuve, pas un gabarit : lire le sujet seul, sans diff ni corps, et savoir
ce qui change et où. Les trois exemples avant/après viennent de l'historique
du dépôt, un exemple inventé ne convainquant personne.
--- EN ---
The manual framed the body in detail — why, ten lines per language, what not
to repeat from the diff — and said of the subject only that it be short and
imperative. Yet the subject is read a hundred times for every reading of the
body: git log --oneline, a blame, a bisect, a release note.
With no rule, subjects drift towards the symptom and the metaphor, which read
well without naming the part of the system at stake. The rule adds a test,
not a template: read the subject alone, with no diff and no body, and be able
to say what changes and where. The three before/after pairs come from the
repository's own history, an invented example convincing nobody.
Assisted-by: Claude Opus 5
(cherry picked from commit c86357eab899c65f41287d4f19e88d0da98285c4)
2026-08-25 05:40:44 -04:00
|
|
|
|
### Le sujet
|
|
|
|
|
|
|
|
|
|
|
|
Le sujet est lu cent fois pour une fois que le corps l'est — `git log
|
|
|
|
|
|
--oneline`, un blame, une note de version, un bisect. Il a une seule tâche :
|
|
|
|
|
|
dire **sur quoi porte le code**.
|
|
|
|
|
|
|
|
|
|
|
|
L'épreuve : le lire seul, sans diff ni corps. Sait-on quelle partie du système
|
|
|
|
|
|
est en jeu, et ce qui y est désormais différent ? Sinon il n'est pas fini.
|
|
|
|
|
|
|
|
|
|
|
|
Nommer la chose, puis ce qui change pour elle. Le symptôme, le message d'erreur
|
|
|
|
|
|
cité et la métaphore sont des PREUVES, et une preuve va dans le corps — un
|
|
|
|
|
|
sujet bâti sur elles se lit bien et n'apprend rien. La portée dit OÙ, les mots
|
|
|
|
|
|
après le deux-points doivent dire QUOI.
|
|
|
|
|
|
|
|
|
|
|
|
Le sujet résume le commit ENTIER, pas sa plus grosse pièce. S'il lui faut un
|
|
|
|
|
|
« et » entre deux choses sans rapport, c'étaient deux commits.
|
|
|
|
|
|
|
[ADD] git : un garde-fou commit-msg pour le sujet
Rien ne tenait la convention sur le sujet : le tag est respecté partout,
c'est la longueur qui glisse. Le hook refuse le mécanique et rien de plus
— tag absent, plus de 72 caractères, sujet ouvrant sur une citation ; dire
sur quoi porte le code reste un jugement qu'aucun hook ne rendra. Il compte
des caractères et non des octets, sans quoi un sujet français de 72
caractères tomberait sur ses accents. Le refus enseigne le repli vers des
mots-clés plutôt que la troncature, et nomme `--no-verify` : un garde-fou
qui refuse trop est désinstallé. Les tests pèsent donc autant les
acceptations, « Merge branch » ou fixup de rebase. Le lanceur balaie le
préfixe test_git_ : 32 tests jamais exécutés, le total va de 1021 à 1071.
--- EN ---
Nothing held the subject convention: the tag is respected everywhere, it
is the length that slips. The hook refuses the mechanical and nothing more
— no tag, over 72 characters, a subject opening on a quotation; whether it
says what the code is about stays a judgement no hook will make. It counts
characters, not bytes, or a 72-character French subject would fall on its
accents. The refusal teaches the fallback to keywords rather than
truncation, and names `--no-verify`: a guard rail that refuses too much
gets uninstalled. So the tests weigh the acceptances as much, a "Merge
branch" or a rebase fixup. The runner sweeps the test_git_ prefix: 32
tests never ran, and the total goes from 1021 to 1071.
Assisted-by: Claude Opus 5
(cherry picked from commit c9abf4d1b723ae8ff3762d39bfe1d6982400d12d)
2026-08-25 05:48:54 -04:00
|
|
|
|
Si le travail n'entre décidément pas dans une phrase de 72 caractères, ne pas
|
|
|
|
|
|
en écrire une amputée : des **mots-clés qui résument**, séparés par des
|
|
|
|
|
|
virgules, en disent plus dans la même place — `[FIX] proxmox : pmxcfs à terre,
|
|
|
|
|
|
pvesm muet, diagnostic à la source`. C'est un repli, pas un défaut : la phrase
|
|
|
|
|
|
reste préférable quand elle tient.
|
|
|
|
|
|
|
[ADD] convention : dire le fonctionnement, pas le contexte ni les noms
Le dépôt n'avait aucune règle sur le commentaire de code : le seul modèle
d'écriture était le corps de commit, et le gabarit y renvoyait le
raisonnement qui n'y tenait pas. Le récit s'écoulait dans les sources,
avec les noms qu'il portait.
L'épreuve tient en une phrase : le code est le sujet, au présent de ce
qu'il fait. Une phrase dont le sujet est un incident, une machine, une date
ou une personne part vers tasks/, non versionné ; le mode de défaillance
que le code empêche reste. Rien d'identifiant hors de private/, et
seulement sur un dépôt privé.
--- EN ---
The repository had no rule at all about code comments: the only writing
model available was the commit body, and the template sent the reasoning
that did not fit there into a comment. The story flowed into the sources,
carrying the names it named.
The test fits in one sentence: the code is the subject, in the present of
what it does. A sentence whose subject is an incident, a machine, a date or
a person goes to tasks/, unversioned; the failure mode the code prevents
stays. Nothing identifying outside private/, and only on a private
repository.
Assisted-by: Claude Opus 5
2026-08-30 02:02:15 -04:00
|
|
|
|
Un garde-fou refuse le mécanique. Sur le sujet : tag absent, plus de 72
|
|
|
|
|
|
caractères, ouverture sur une citation. Sur le corps : plus de 10 lignes pour
|
[ADD] commentaires : un relevé non bloquant, sa règle, le code nettoyé
Rien ne relevait les commentaires hors convention. L'outil lit commentaires et
docstrings, jamais le code autour, et rend deux familles inégales :
l'identifiant — adresse, courriel, chemin de compte, nom de la liste privée —
est une trouvaille ; le récit — témoignage, date, personne — un signal à relire.
Le hook pre-commit le lance sur l'index, sort toujours en 0 — un contrôle
bloquant à cette échelle se fait désinstaller — et parle quand l'outil échoue.
La règle du générateur et sa doc portent le nettoyage au fur et à mesure, et
l'exemple d'un interdit s'invente : base, adresse, compte et hôte en prennent un.
L'écran du contexte est posé, sans entrée de menu. Vérifié : 252 tests des six
fichiers d'essai touchés passent.
--- EN ---
Nothing reported the comments that break the convention. The tool reads
comments and docstrings, never the code around them, and returns two unequal
families: identifying data — address, e-mail, account path, private-list name
— is a finding; narrative — witness marker, date, person — a signal to re-read.
The pre-commit hook runs it on the index, always exits 0 — a blocking check at
that scale gets uninstalled — and speaks when the tool fails. The generator
rule and its doc carry the clean-up as you go, and a forbidden thing's example
is invented: a real database, address, account and host each take one.
The context screen is in place, with no menu entry. Checked: 252 tests of the
six touched fixture files pass.
Assisted-by: Claude Opus 5
2026-08-30 02:02:51 -04:00
|
|
|
|
une langue, une adresse IP, un courriel, un chemin de compte. Ce qui reste un
|
|
|
|
|
|
jugement — « ce corps raconte-t-il l'enquête » — n'est vérifié par personne.
|
[ADD] git : un garde-fou commit-msg pour le sujet
Rien ne tenait la convention sur le sujet : le tag est respecté partout,
c'est la longueur qui glisse. Le hook refuse le mécanique et rien de plus
— tag absent, plus de 72 caractères, sujet ouvrant sur une citation ; dire
sur quoi porte le code reste un jugement qu'aucun hook ne rendra. Il compte
des caractères et non des octets, sans quoi un sujet français de 72
caractères tomberait sur ses accents. Le refus enseigne le repli vers des
mots-clés plutôt que la troncature, et nomme `--no-verify` : un garde-fou
qui refuse trop est désinstallé. Les tests pèsent donc autant les
acceptations, « Merge branch » ou fixup de rebase. Le lanceur balaie le
préfixe test_git_ : 32 tests jamais exécutés, le total va de 1021 à 1071.
--- EN ---
Nothing held the subject convention: the tag is respected everywhere, it
is the length that slips. The hook refuses the mechanical and nothing more
— no tag, over 72 characters, a subject opening on a quotation; whether it
says what the code is about stays a judgement no hook will make. It counts
characters, not bytes, or a 72-character French subject would fall on its
accents. The refusal teaches the fallback to keywords rather than
truncation, and names `--no-verify`: a guard rail that refuses too much
gets uninstalled. So the tests weigh the acceptances as much, a "Merge
branch" or a rebase fixup. The runner sweeps the test_git_ prefix: 32
tests never ran, and the total goes from 1021 to 1071.
Assisted-by: Claude Opus 5
(cherry picked from commit c9abf4d1b723ae8ff3762d39bfe1d6982400d12d)
2026-08-25 05:48:54 -04:00
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
git config core.hooksPath script/git/hooks # une fois par clone
|
|
|
|
|
|
git commit --no-verify # exception légitime
|
|
|
|
|
|
```
|
|
|
|
|
|
|
[ADD] convention : ce qu'un sujet de commit doit dire
Le manuel encadrait le corps en détail — pourquoi, dix lignes par langue, ce
qu'on ne répète pas du diff — et ne disait du sujet que « courte, à
l'impératif ». Le sujet est pourtant lu cent fois pour une fois que le corps
l'est : git log --oneline, un blame, un bisect, une note de version.
Faute de règle, les sujets dérivent vers le symptôme et la métaphore, qui se
lisent bien sans nommer la partie du système en jeu. La règle ajoute une
épreuve, pas un gabarit : lire le sujet seul, sans diff ni corps, et savoir
ce qui change et où. Les trois exemples avant/après viennent de l'historique
du dépôt, un exemple inventé ne convainquant personne.
--- EN ---
The manual framed the body in detail — why, ten lines per language, what not
to repeat from the diff — and said of the subject only that it be short and
imperative. Yet the subject is read a hundred times for every reading of the
body: git log --oneline, a blame, a bisect, a release note.
With no rule, subjects drift towards the symptom and the metaphor, which read
well without naming the part of the system at stake. The rule adds a test,
not a template: read the subject alone, with no diff and no body, and be able
to say what changes and where. The three before/after pairs come from the
repository's own history, an invented example convincing nobody.
Assisted-by: Claude Opus 5
(cherry picked from commit c86357eab899c65f41287d4f19e88d0da98285c4)
2026-08-25 05:40:44 -04:00
|
|
|
|
Le mode d'emploi complet, avec des exemples avant/après pris dans l'historique
|
|
|
|
|
|
de ce dépôt, est dans `conf/template_claude_commands_commit.md`.
|
|
|
|
|
|
|
[UPD] claude: align the commit command with the AI policy
The template wrote « Generated by Claude Code », the form AI_POLICY.md
replaces with the Assisted-by trailer. Three defects rode along: the model
came from ~/.claude/settings.json, which has no model key here, so it
declared the sonnet default rather than the truth; --author alone failed on
the committer, this checkout having no git identity; and [UPD] was missing
from the tag table while being the most used tag, 134 of the last 400.
The model now comes from the session transcript, the only source that
follows a /model switch — checked, it prints Claude Opus 5. The timezone is
left to the system so contributors keep their own, and the menu substitutes
name and email separately, the placeholders no longer being adjacent.
--- FR ---
Le gabarit écrivait « Generated by Claude Code », la forme que AI_POLICY.md
remplace par le trailer Assisted-by. Trois défauts l'accompagnaient : le
modèle venait de ~/.claude/settings.json, sans clé model ici, si bien qu'il
déclarait le défaut sonnet plutôt que la vérité ; --author seul échouait sur
le committer, ce checkout n'ayant aucune identité git ; et [UPD] manquait au
tableau des tags alors qu'il est le plus utilisé, 134 des 400 derniers.
Le modèle vient désormais de la transcription de session, seule source qui
suive un changement par /model — vérifié, elle rend Claude Opus 5. Le fuseau
est laissé au système, pour que chaque contributeur garde le sien, et le
menu substitue nom et courriel séparément, les jetons n'étant plus accolés.
Assisted-by: Claude Opus 5
2026-08-07 01:56:11 -04:00
|
|
|
|
### Tout commit assisté par IA
|
|
|
|
|
|
|
|
|
|
|
|
Trois exigences, sans exception — `AI_POLICY.md` en donne la raison :
|
|
|
|
|
|
|
|
|
|
|
|
- Trailer `Assisted-by: <modèle>`, une ligne par modèle. C'est **binaire** :
|
|
|
|
|
|
il y a eu IA ou non, aucun seuil à apprécier.
|
|
|
|
|
|
- **Jamais** d'IA dans `Co-authored-by:` — ce champ est réservé aux humains.
|
|
|
|
|
|
- Corps **bilingue** : le corps, puis `--- FR ---` (ou `--- EN ---`, le
|
|
|
|
|
|
marqueur nomme la langue de ce qui SUIT), puis la traduction.
|
|
|
|
|
|
|
[ADD] convention : dire le fonctionnement, pas le contexte ni les noms
Le dépôt n'avait aucune règle sur le commentaire de code : le seul modèle
d'écriture était le corps de commit, et le gabarit y renvoyait le
raisonnement qui n'y tenait pas. Le récit s'écoulait dans les sources,
avec les noms qu'il portait.
L'épreuve tient en une phrase : le code est le sujet, au présent de ce
qu'il fait. Une phrase dont le sujet est un incident, une machine, une date
ou une personne part vers tasks/, non versionné ; le mode de défaillance
que le code empêche reste. Rien d'identifiant hors de private/, et
seulement sur un dépôt privé.
--- EN ---
The repository had no rule at all about code comments: the only writing
model available was the commit body, and the template sent the reasoning
that did not fit there into a comment. The story flowed into the sources,
carrying the names it named.
The test fits in one sentence: the code is the subject, in the present of
what it does. A sentence whose subject is an incident, a machine, a date or
a person goes to tasks/, unversioned; the failure mode the code prevents
stays. Nothing identifying outside private/, and only on a private
repository.
Assisted-by: Claude Opus 5
2026-08-30 02:02:15 -04:00
|
|
|
|
Court et direct : **8 lignes par langue**, 10 est un plafond. Le corps dit
|
[UPD] claude: align the commit command with the AI policy
The template wrote « Generated by Claude Code », the form AI_POLICY.md
replaces with the Assisted-by trailer. Three defects rode along: the model
came from ~/.claude/settings.json, which has no model key here, so it
declared the sonnet default rather than the truth; --author alone failed on
the committer, this checkout having no git identity; and [UPD] was missing
from the tag table while being the most used tag, 134 of the last 400.
The model now comes from the session transcript, the only source that
follows a /model switch — checked, it prints Claude Opus 5. The timezone is
left to the system so contributors keep their own, and the menu substitutes
name and email separately, the placeholders no longer being adjacent.
--- FR ---
Le gabarit écrivait « Generated by Claude Code », la forme que AI_POLICY.md
remplace par le trailer Assisted-by. Trois défauts l'accompagnaient : le
modèle venait de ~/.claude/settings.json, sans clé model ici, si bien qu'il
déclarait le défaut sonnet plutôt que la vérité ; --author seul échouait sur
le committer, ce checkout n'ayant aucune identité git ; et [UPD] manquait au
tableau des tags alors qu'il est le plus utilisé, 134 des 400 derniers.
Le modèle vient désormais de la transcription de session, seule source qui
suive un changement par /model — vérifié, elle rend Claude Opus 5. Le fuseau
est laissé au système, pour que chaque contributeur garde le sien, et le
menu substitue nom et courriel séparément, les jetons n'étant plus accolés.
Assisted-by: Claude Opus 5
2026-08-07 01:56:11 -04:00
|
|
|
|
pourquoi c'était nécessaire, puis s'arrête. Rien de ce que le diff montre
|
[ADD] convention : dire le fonctionnement, pas le contexte ni les noms
Le dépôt n'avait aucune règle sur le commentaire de code : le seul modèle
d'écriture était le corps de commit, et le gabarit y renvoyait le
raisonnement qui n'y tenait pas. Le récit s'écoulait dans les sources,
avec les noms qu'il portait.
L'épreuve tient en une phrase : le code est le sujet, au présent de ce
qu'il fait. Une phrase dont le sujet est un incident, une machine, une date
ou une personne part vers tasks/, non versionné ; le mode de défaillance
que le code empêche reste. Rien d'identifiant hors de private/, et
seulement sur un dépôt privé.
--- EN ---
The repository had no rule at all about code comments: the only writing
model available was the commit body, and the template sent the reasoning
that did not fit there into a comment. The story flowed into the sources,
carrying the names it named.
The test fits in one sentence: the code is the subject, in the present of
what it does. A sentence whose subject is an incident, a machine, a date or
a person goes to tasks/, unversioned; the failure mode the code prevents
stays. Nothing identifying outside private/, and only on a private
repository.
Assisted-by: Claude Opus 5
2026-08-30 02:02:15 -04:00
|
|
|
|
déjà ; on garde le mode de défaillance, le chiffre qui borne et la
|
|
|
|
|
|
vérification. Le bilinguisme achète la concision, il ne l'excuse pas.
|
|
|
|
|
|
|
|
|
|
|
|
Le corps obéit aux mêmes deux règles que les commentaires : **rien
|
|
|
|
|
|
d'identifiant**, et **le fonctionnement plutôt que l'enquête**. Le corps dit
|
|
|
|
|
|
ce que le code fait ou refuse DÉSORMAIS ; il ne raconte ni la séance, ni les
|
|
|
|
|
|
hypothèses écartées, ni qui s'est trompé. Une mesure se généralise à sa classe
|
|
|
|
|
|
de situation — « sur une base de production », jamais son nom.
|
[UPD] claude: align the commit command with the AI policy
The template wrote « Generated by Claude Code », the form AI_POLICY.md
replaces with the Assisted-by trailer. Three defects rode along: the model
came from ~/.claude/settings.json, which has no model key here, so it
declared the sonnet default rather than the truth; --author alone failed on
the committer, this checkout having no git identity; and [UPD] was missing
from the tag table while being the most used tag, 134 of the last 400.
The model now comes from the session transcript, the only source that
follows a /model switch — checked, it prints Claude Opus 5. The timezone is
left to the system so contributors keep their own, and the menu substitutes
name and email separately, the placeholders no longer being adjacent.
--- FR ---
Le gabarit écrivait « Generated by Claude Code », la forme que AI_POLICY.md
remplace par le trailer Assisted-by. Trois défauts l'accompagnaient : le
modèle venait de ~/.claude/settings.json, sans clé model ici, si bien qu'il
déclarait le défaut sonnet plutôt que la vérité ; --author seul échouait sur
le committer, ce checkout n'ayant aucune identité git ; et [UPD] manquait au
tableau des tags alors qu'il est le plus utilisé, 134 des 400 derniers.
Le modèle vient désormais de la transcription de session, seule source qui
suive un changement par /model — vérifié, elle rend Claude Opus 5. Le fuseau
est laissé au système, pour que chaque contributeur garde le sien, et le
menu substitue nom et courriel séparément, les jetons n'étant plus accolés.
Assisted-by: Claude Opus 5
2026-08-07 01:56:11 -04:00
|
|
|
|
|
|
|
|
|
|
Le mode d'emploi complet — résolution dynamique du modèle, gabarit, identité
|
|
|
|
|
|
git, taille des correctifs — est dans
|
|
|
|
|
|
`conf/template_claude_commands_commit.md`, déployable en `/commit` par
|
|
|
|
|
|
`TODO › Execute › GPT code › Claude configs`.
|