21 KiB
Fiche OUTIL1-W — Niveau N1 — Modèle prévu sonnet | utilisé sonnet — Agent lp-writer — Skills sk-protocol, lp-doc, lp-lot
OUTIL1-TEXTES : textes proposés pour les skills et le doc 32 (2026-10-14)
Hors gabarit : texte de proposition (avant / après exacts), soumis à l'utilisateur ; aucun skill n'est modifié par cette fiche.
Décision validée : « Skills + indicateur I15 ». Source des outils : Tools\LISEZMOI.md (relu en entier le 2026-10-14) ;
OUTIL1-PROPOSITION.md § 6. Skills lus dans D:\Game\LifePlay-Sandbox-5.8\Tools\claude\skills\<nom>\SKILL.md
(chemins relatifs ci-dessous : skills\<nom>\SKILL.md). Numéros de ligne = ceux des fichiers à la lecture du jour.
Indicateur I15 (déjà codé : Tools\Indicateurs.py l. 2183 et 2295) : appels shell qui écrivent ou lancent un script hors
Tools\, pour 100 appels shell ; valeur avant = P3, après = P4.
1. Fichiers écrits
D:\Game\LifePlay-master 5.8\Docs\Migration\etat\EVAL2\AMEL1\OUTIL1\OUTIL1-TEXTES.md(neuf).- Aucun skill, aucun outil, aucun doc modifié.
2. Numéros utilisés (CHG, ERR, doc)
sans objet : ni CHG, ni ERR, ni doc numéroté pour ce livrable ; les CHG des modifications de skills seront réservés par
l'orchestrateur à l'application (les skills sont hors git du jeu : geste de l'utilisateur, lp-lot « Écrire des skills »).
3. Index, plages et registre des reports
sans objet : aucun index ni registre touché.
4. Écarts à la fiche
- Les skills de l'addon (
D:\Game\LifePlay-Sandbox-5.8) et ceux du profil (%USERPROFILE%\.claude\skills, vus dans le contexte de cette session) sont deux exemplaires : les textes ci-dessous visent l'exemplaire de l'addon (ancres lues là). Le contexte chargé desk-protocol§ 7 diffère de l'addon sur la phrase « Script à usage répété » (le profil dit « le ranger dansSaved/<lot>/ou le proposer pourTools/» ; l'addon ajoute « du jeu (local, non suivi depuis CHG-357…) ») : à tenir identiques (D-REPO2) ; l'AVANT du texte S2 est celui de l'addon. - Doc 32 : la fiche demandait « si une règle des sessions y vit ». Aucune règle de suppression de session n'existe
(Grep
supprimdansDocs\32_Organisation_Agents.md,lp-lot,sk-orchestrate: rien) ; la seule règle voisine est § 15.12 l. 534 (« Hors règle : transcriptions des sessions Claude »), d'où le texte D1. - Date de la décision « Copier avant suppression » : 2026-10-14 (session EVAL ; complétée par l'orchestrateur, textes L3, D1).
5. Fichiers à commiter
sans objet : aucun fichier suivi par git écrit (Docs\Migration\etat\ : le .md est suivi en texte, mais le livrable
d'un sous-lot OUTIL1 part avec le ticket de clôture de l'orchestrateur ; à lister par lui). Livrable à inclure :
Docs/Migration/etat/EVAL2/AMEL1/OUTIL1/OUTIL1-TEXTES.md (A).
6. Lignes « À verser »
sans objet : la fiche rédige les textes à verser ; elle n'en verse aucun.
Constats
C1. Phrases existantes qui recommandent d'improviser un script pour une tâche couverte par un outil
| # | Fichier : ligne | Phrase | Tâche couverte par | Traitement |
|---|---|---|---|---|
| a | skills\lp-validate\SKILL.md : 92 |
« comparer à 5.5 avec etat/U58/U3/cmp_pie.py » |
Tools\CmpPie.py |
texte V3 |
| b | skills\lp-validate\SKILL.md : 87 |
Select-String … LifePlay.log … | Group-Object Line (one-liner de comptage d'erreurs) |
Tools\LogStats.ps1 -Stats / -Pattern |
texte V3 |
| c | skills\lp-lot\SKILL.md : 100-101 |
« ou script écrit quand son outillage le permet » (après un refus à tort) | tout outil de l'index | texte L2 |
| d | skills\sk-protocol\SKILL.md : 86-87 |
« Script à usage répété : … le ranger dans Saved/<lot>/ ou le proposer pour Tools/ » (n'impose pas de chercher d'abord ; Saved/<lot>/ loge des scripts hors index) |
Tools\LISEZMOI.md |
texte S2 |
| e | skills\lp-commandlets\SKILL.md : 60 |
python Tools\DiffRemplacementNoeuds.py … (sans -I) |
l'outil existe ; seul l'appel diffère de l'index | texte C2 |
| f | skills\lp-validate\SKILL.md : 45-49 |
lecture d'une roue Python « par un script fourni par la fiche (… Saved/<lot>/ ou Tools/) » |
aucun outil de l'index | signalé seulement : pas d'outil Tools\ pour les roues ; si le besoin revient, créer l'outil (règle L1) |
Aucune phrase ne recommande un heredoc ou python -c : les skills les interdisent (lp-paths l. 77, lp-validate l. 50-52). |
C2. Textes en dehors de la liste de la fiche
Aucun ajout hors cibles. Le texte V1 précise que le validateur ne lance NormaliserLF qu'à blanc (lp-validate l. 9-10 :
« Le validateur ne modifie ni code, ni config, ni doc validée »).
Textes proposés
Récapitulatif : 15 textes. sk-protocol 2 (S1, S2) ; lp-lot 3 (L1, L2, L3) ; lp-validate 3 (V1, V2, V3) ; lp-paths 1 (P1) ;
lp-build 1 (B1) ; lp-commandlets 2 (C1, C2) ; lp-doc 1 (D2) ; sk-orchestrate 1 (O1) ; doc 32 1 (D1).
Indicateurs visés : I15 (S1, S2, L1, L2, B1, C1, C2, V2, V3, D2), I7a (L2, V2 : refus causés par des commandes improvisées),
I10a (V1, D2 : contrôles faits par les outils), I15 + mesure (O1), sans indicateur (P1, L3, D1 : repères, traçabilité des sessions).
S1. skills\sk-protocol\SKILL.md § 7, bullet « Chercher et lire » (l. 81-82)
Indicateur : I15. AVANT :
- Chercher et lire : **Grep**, **Glob**, **Read**, pas `grep`, `find`, `head`, `sed -n` ni `cat` en Bash. Le shell
sert à git, aux builds et aux scripts du projet.
APRÈS :
- Chercher et lire : **Grep**, **Glob**, **Read**, pas `grep`, `find`, `head`, `sed -n` ni `cat` en Bash. Le shell
sert à git, aux builds et aux scripts du projet (liste, rôle, appel et codes : `Tools\LISEZMOI.md`). Avant d'écrire
un script, un heredoc ou un `python -c`, chercher l'outil dans cet index.
S2. skills\sk-protocol\SKILL.md § 7, bullet « Script à usage répété » (l. 86-87)
Indicateur : I15. AVANT :
- Script à usage répété : pas dans le scratchpad ; le ranger dans `Saved/<lot>/` ou le proposer pour `Tools/` du jeu (local, non suivi
depuis CHG-357 : instantané, CHG et livrable remplacent le commit).
APRÈS :
- Script : d'abord chercher l'outil dans `Tools\LISEZMOI.md` ; l'appeler tel que l'index le donne au lieu d'en réécrire
un. Script à usage répété : il va dans `Tools\` du jeu (local, non suivi depuis CHG-357 : instantané `Snapshot.ps1`,
CHG et ligne d'index dans `Tools\LISEZMOI.md` remplacent le commit ; jamais dans le scratchpad). Script ponctuel : il
reste dans le lot (`Saved/<lot>/`) et son livrable le cite. Jamais de heredoc ni de `python -c` pour l'un ni l'autre.
L1. skills\lp-lot\SKILL.md, nouvelle section avant « ## Avant toute modification (session principale seulement) » (l. 19)
Indicateur : I15. AVANT (ancre, ligne 19 ; rien n'est retiré) :
## Avant toute modification (session principale seulement)
APRÈS :
## Outils avant script (AMEL1, OUTIL1)
Avant d'écrire un script, chercher l'outil dans `Tools\LISEZMOI.md` (nom, rôle, appel type, codes de sortie) : mesure
(`LogStats.ps1`, `CmpPie.py`, `Indicateurs.py`), build, état de la copie (`UeState.ps1`, `CopieEtat.ps1`, `FileCheck.ps1`,
`NormaliserLF.py`, `Manifeste.py`, `GitEtat.ps1`), traces, crochets (`hooks\`), essais (`Tests\`). Un script à usage
répété va dans `Tools\` (instantané `Snapshot.ps1` avant d'écrire, CHG, ligne d'index dans `Tools\LISEZMOI.md`, en-tête
`.SYNOPSIS` ou docstring, codes 0 / 1 / 2, fins de ligne LF) ; un script ponctuel reste dans le lot (`Saved/<lot>/`,
cité par le livrable). Jamais de heredoc ni de `python -c` (`sk-windows-shell`). Repère de l'évaluation : indicateur I15
(appels shell qui écrivent ou lancent un script hors `Tools\`, pour 100 appels shell).
## Avant toute modification (session principale seulement)
L2. skills\lp-lot\SKILL.md, bullet « Refus du crochet ecriture-gardien », refus à tort (l. 99-101)
Indicateurs : I15, I7a. AVANT :
l'agent reformule sa commande sans l'écriture visée (outil Grep, Read, ou script écrit quand son outillage
le permet, `sk-windows-shell`) ; s'il ne peut pas, il s'arrête et rend compte, comme pour un refus utile.
APRÈS :
l'agent reformule sa commande sans l'écriture visée (outil Grep, Read, ou l'outil de `Tools\LISEZMOI.md` qui
couvre la tâche ; sinon un script ponctuel du lot, jamais un heredoc ni un `python -c`, `sk-windows-shell`) ; s'il ne
peut pas, il s'arrête et rend compte, comme pour un refus utile.
L3. skills\lp-lot\SKILL.md, bullet « Session réutilisée (R12) » (l. 91-93), suppression d'une session
Indicateur : sans objet (traçabilité des transcriptions, règle de l'utilisateur « Copier avant suppression »). AVANT :
`PASSATION` cite le titre. Une session saturée (≥ 250 k) ne se réutilise pas : elle passe la main (bullet précédent).
APRÈS :
`PASSATION` cite le titre. Une session saturée (≥ 250 k) ne se réutilise pas : elle passe la main (bullet précédent).
- Suppression d'une session (décision de l'utilisateur « Copier avant suppression », 2026-10-14) : avant de la
supprimer dans l'application, copier ses transcriptions :
`pwsh -NoProfile -File Tools\SauverTranscriptions.ps1 -Session <cliId ou local_…>` (`-Essai` à blanc d'abord ; code 0 fait,
1 session inconnue, 2 erreur). La copie va dans `TRANSCRIPTIONS\sessions\<cliId>\` avec `manifest.csv` (Rel, Octets,
MD5, Date) et suit `priorCliSessionIds` ; rien n'est supprimé côté sauvegarde. Sans code 0 relu, la session ne se
supprime pas. La suppression elle-même reste le geste de l'utilisateur.
V1. skills\lp-validate\SKILL.md § 1, après le bullet « Fins de ligne » (fin de l. 39-40)
Indicateurs : I10a, I15. AVANT :
Fichier CRLF : `LF seul` doit valoir 0. Fichier LF : `CRLF` doit valoir 0. Fichier mixte (copie 5.8 : `.gitignore`,
`Docs/Modding/ShortGuides/explanation.lpmod`) : l'outil Edit le normalise, l'écart doit être annoncé par le livrable.
APRÈS :
Fichier CRLF : `LF seul` doit valoir 0. Fichier LF : `CRLF` doit valoir 0. Fichier mixte (copie 5.8 : `.gitignore`,
`Docs/Modding/ShortGuides/explanation.lpmod`) : l'outil Edit le normalise, l'écart doit être annoncé par le livrable.
Compter les CR d'un fichier ou d'un dossier de textes (`etat\`) : `python -I -X utf8 Tools/NormaliserLF.py [--ext .csv,.md]
[--recursif] <fichier ou dossier>` ; à blanc par défaut, il n'écrit rien (code 0 conforme, 1 fichiers à corriger, 2
erreur). Le validateur ne le lance jamais avec `--appliquer` (il ne modifie rien) : la correction est une fiche IMPL
(instantané, puis `--appliquer`).
V2. skills\lp-validate\SKILL.md § 1, après le bullet « Fuite de donnée personnelle (R6) » (l. 58-61)
Indicateurs : I15, I7a. AVANT (fin du bullet, l. 60-61) :
absolus). Attendu : `PubCheck : 0 constat(s)`, code 0. Code 1 : écart numéroté (catégorie et `fichier:ligne`, jamais la
valeur) ; code 2 : `BLOCKED-pubcheck`. Citer la commande et la sortie dans la VAL.
APRÈS :
absolus). Attendu : `PubCheck : 0 constat(s)`, code 0. Code 1 : écart numéroté (catégorie et `fichier:ligne`, jamais la
valeur) ; code 2 : `BLOCKED-pubcheck`. Citer la commande et la sortie dans la VAL.
- **Crochet `ecriture-gardien` modifié** (lot qui touche `Tools\hooks\ecriture-gardien.py` ou `cas-v2.jsonl`) : rejouer la
batterie après toute modification, sans exécuter les commandes des cas :
`python -I -X utf8 Tools/hooks/TestCrochet.py` (crochet par défaut : celui du profil ; un fichier en argument pour le
tester avant installation). Attendu : `conformes : 417 / 417` (code 0 ; 1 un écart ; 2 usage). Comparer aussi le MD5
de la copie du profil à celui de la référence : `(Get-FileHash -Algorithm MD5 Tools\hooks\ecriture-gardien.py).Hash`.
Un autre nombre de cas = batterie modifiée sans mise à jour de `Tools\LISEZMOI.md` : écart.
V3. skills\lp-validate\SKILL.md § 4 (l. 84-92), journal de l'éditeur et comparaison PIE
Indicateurs : I15 (le one-liner Select-String et cmp_pie.py hors Tools\).
AVANT :
```powershell
Select-String -Path '<copie>\Saved\Logs\LifePlay.log' -Pattern 'Error:|Fatal|Assertion failed|Ensure condition failed' | Group-Object Line | Sort Count -Desc
(AVANT ci-dessus : le bloc PowerShell, l. 86-88.) Puis, l. 89-92 :
a changé en 5.8 ; comparer à 5.5 avec etat/U58/U3/cmp_pie.py (clé Blueprint / fonction / nœud / propriété), jamais en
texte brut. Référence U3 : 47 signatures en 5.8, 3 propres à 5.8.
APRÈS (bloc l. 86-88 remplacé, puis l. 91-92) :
pwsh -NoProfile -Command "& 'D:\Game\LifePlay-master 5.8\Tools\LogStats.ps1' '<copie>\Saved\Logs\LifePlay.log' -Stats"
pwsh -NoProfile -Command "& 'D:\Game\LifePlay-master 5.8\Tools\LogStats.ps1' -Latest LifePlay -Pattern 'Error:','Fatal','Assertion failed','Ensure condition failed' -Max 10"
et
a changé en 5.8 ; comparer à 5.5 avec python -I -X utf8 Tools/CmpPie.py --cible <j58> --ref <j55> [<j55> ...] (signature
Blueprint / fonction / nœud / propriété ; code 0 aucune signature nouvelle, 1 au moins une, 2 usage), jamais en texte
brut. Référence U3 : 47 signatures en 5.8, 3 propres à 5.8.
Réserve (incertain) : `-Latest LifePlay` suppose que le motif de nom désigne `LifePlay.log` ; l'appel exact du `-Latest` est à
rejouer par l'orchestrateur avant application (essai : lancer la commande, attendre un compte non nul).
---
### P1. `skills\lp-paths\SKILL.md`, tableau « Dossiers clés », avant la ligne « Livrables de lot » (l. 32)
Indicateur : sans objet (repère de chemins ; soutient I15).
AVANT (ancre, ligne 32 ; rien n'est retiré) :
| Livrables de lot | Docs\Migration\etat\<projet>\<lot>\ (lp-lot) |
APRÈS :
| Outils du jeu (local, non suivi, CHG-357) | Tools\ ; index Tools\LISEZMOI.md (nom, rôle, appel type, codes de sortie) ; Tools\hooks\ : copies de référence des crochets du profil (ecriture-gardien.py, lp-mcp-garde-lecture.py, pre-push), batterie TestCrochet.py + cas-v2.jsonl ; Tools\Tests\ : suites d'essais à blanc (Corbeille.essais.ps1, TracesCorbeille.essais.ps1) ; sauvegarde : D:\Game\LifePlay_Backup_5.5\TOOLS-REF\ |
| Livrables de lot | Docs\Migration\etat\<projet>\<lot>\ (lp-lot) |
---
### B1. `skills\lp-build\SKILL.md` § 4, après le bullet « Le Shipping n'écrit aucun journal… » (l. 70-71)
Indicateur : I15.
AVANT :
- Le Shipping n'écrit aucun journal (
bUseLoggingInShippingabsent deSource/LifePlay.Target.cs) : une mesureLogStatsse fait sur un Development empaqueté-skipcookavec la même cuisson (U8-T5b).
APRÈS :
- Le Shipping n'écrit aucun journal (
bUseLoggingInShippingabsent deSource/LifePlay.Target.cs) : une mesureLogStatsse fait sur un Development empaqueté-skipcookavec la même cuisson (U8-T5b). - Mesurer un journal :
pwsh -NoProfile -File Tools\LogStats.ps1 <journal> -Stats(trame, F5 par socket et par groupes de 5, DESTROY par trame, hitchLPDebug) ; comparer deux journaux :pwsh -NoProfile -Command "& '<copie>\Tools\LogStats.ps1' -Compare a,b". Comparer les erreurs PIE Blueprint de deux jeux de journaux (5.8 contre 5.5) :python -I -X utf8 Tools/CmpPie.py --cible <j58> --ref <j55> [<j55> ...](code 0 aucune signature nouvelle, 1 au moins une, 2 usage). Pas de script de comptage écrit pour l'occasion : liste complète dansTools\LISEZMOI.md.
---
### C1. `skills\lp-commandlets\SKILL.md` § « Lancer », bullet « Relire un journal » (l. 25-27)
Indicateur : I15.
AVANT :
- Relire un journal :
.\Tools\LogStats.ps1 -Latest <Lot>_<Commandlet> -Pattern ': Error: ', 'LogLP' -Max 10(dernier journal, nombre de lignes par motif, extraits avec contexte ;-Tail Npour la fin,-Statspour les compteurs normalisés). Exemple :-Latest OUT1_LPTestStringCompat -Pattern ': Warning: '→ la ligne3120 cas.
APRÈS :
- Relire un journal :
.\Tools\LogStats.ps1 -Latest <Lot>_<Commandlet> -Pattern ': Error: ', 'LogLP' -Max 10(dernier journal, nombre de lignes par motif, extraits avec contexte ;-Tail Npour la fin,-Statspour les compteurs normalisés et les familles trame / F5 / DESTROY / hitch). Exemple :-Latest OUT1_LPTestStringCompat -Pattern ': Warning: '→ la ligne3120 cas. Comparer les erreurs PIE Blueprint de deux jeux de journaux :python -I -X utf8 Tools/CmpPie.py --cible <j58> --ref <j55> [<j55> ...](signature Blueprint / fonction / nœud / propriété ; code 0 aucune signature nouvelle, 1 au moins une). Liste complète des outils :Tools\LISEZMOI.md.
Note : le « → » de l'exemple existe déjà dans le skill (ancre inchangée) ; il est cité tel quel.
### C2. `skills\lp-commandlets\SKILL.md` § « Python éditeur », dernière ligne (l. 60)
Indicateur : I15.
AVANT :
Diff indépendant d'un rebranchement : python Tools\DiffRemplacementNoeuds.py <avant.txt> <apres.txt> <profil>.
APRÈS :
Diff indépendant d'un rebranchement : python -I Tools/DiffRemplacementNoeuds.py <avant.txt> <apres.txt> [L7a] (appel de
l'index Tools\LISEZMOI.md, rubrique Fichiers et paquets ; profils L7a, L7b, CX-B12). Avant d'écrire un script d'audit
éditeur, regarder AuditAssets.py, AuditScriptDeps.py, BuildCollections.py, FixTextureMips.py (même index).
---
### D2. `skills\lp-doc\SKILL.md`, « Contrôles avant de rendre » (l. 69-74), manifeste d'un dossier
Indicateurs : I10a, I15.
AVANT (fin du premier paragraphe) :
motif) ; liens relatifs valides ; index à jour ; rien de la « liste interdite » de publication (lp-repo § 3) ;
fichiers écrits listés dans la section « Fichiers à commiter » du livrable DOC (le gardien les commite aussitôt).
APRÈS :
motif) ; liens relatifs valides ; index à jour ; rien de la « liste interdite » de publication (lp-repo § 3) ;
fichiers écrits listés dans la section « Fichiers à commiter » du livrable DOC (le gardien les commite aussitôt).
Un dossier entier déplacé, renuméroté ou rangé (ex. etat\) : python -I -X utf8 Tools/Manifeste.py scan <racine> <avant.txt> avant, ... scan <racine> <apres.txt> après, puis ... compare <avant.txt> <apres.txt> (chemin, taille, mtime,
sha256 ; code 0 identiques, 1 différences, 2 erreur) ; les différences citées au livrable DOC. Pas de script de comptage
improvisé : Tools\LISEZMOI.md.
---
### O1. `skills\sk-orchestrate\SKILL.md` § 5 « Indicateurs » (l. 113-114), mesure d'organisation
Indicateurs : I15 (et mesure des autres I.. de l'évaluation).
AVANT :
5. Indicateurs (relevés à l'évaluation du lot)
Taux de reprises (-fix) / fiches lancées · prolongations, relais et escalades, avec leur cause (budget, capacité, connaissance, consigne) · lignes À verser produites et versées · fiches coupées par maxTurns sans compte rendu (doit valoir 0) · échecs fabriqués détectés (succès inventé, compte faux, critère ignoré) · fiches avec en-tête complet · durée et coût vs estimation · tours, pic de contexte et jetons par fiche (fiches hors budget de taille). Chaque échec produit une ligne dans le skill concerné.
APRÈS :
5. Indicateurs (relevés à l'évaluation du lot)
Taux de reprises (-fix) / fiches lancées · prolongations, relais et escalades, avec leur cause (budget, capacité, connaissance, consigne) · lignes À verser produites et versées · fiches coupées par maxTurns sans compte rendu (doit valoir 0) · échecs fabriqués détectés (succès inventé, compte faux, critère ignoré) · fiches avec en-tête complet · durée et coût vs estimation · tours, pic de contexte et jetons par fiche (fiches hors budget de taille) · scripts improvisés (indicateur I15 : appels shell qui écrivent ou lancent un script hors Tools\, pour 100 appels shell). Chaque échec produit une ligne dans le skill concerné.
Toute mesure d'organisation (indicateurs AMEL1 I1a à I15 et G-a à G-d, sur une fenêtre de temps) se fait par
python -I -X utf8 Tools\Indicateurs.py --debut "AAAA-MM-JJ HH:MM:SS" --fin "AAAA-MM-JJ HH:MM:SS" [--coupure "…"] --sortie <fichier.md> --detail <dossier>
(code 0 tous calculés, 1 au moins un non mesurable, 2 argument invalide) : --detail écrit les CSV de détail ; une
mesure sans --detail ne se recoupe pas. Pas de script de relevé écrit pour la circonstance : Tools\LISEZMOI.md
(FicheStats.py pour les tours et jetons par fiche d'un lot).
---
### D1. `Docs\32_Organisation_Agents.md` § 15.12, phrase « Hors règle » (l. 534)
Indicateur : sans objet (traçabilité des sessions).
AVANT :
arrête le passage sans contournement (§ 15.7). Hors règle : transcriptions des sessions Claude, livrables .md /
APRÈS :
arrête le passage sans contournement (§ 15.7). Hors règle : transcriptions des sessions Claude (copiées avant la
suppression d'une session par Tools\SauverTranscriptions.ps1 -Session <id>, décision de l'utilisateur « Copier avant
suppression », 2026-10-14 ; lp-lot), livrables .md /
Le doc 32 est un doc numéroté suivi par git : sa modification demande une entrée CHG (numéro réservé dans `NUMEROS.md`),
puis un ticket au gardien ; retour arrière : `git revert` du commit du ticket.
---
Retour arrière commun des textes S1 à O1 (skills hors git du jeu) : `Snapshot.ps1 -Lot OUTIL1-SKILLS` avant d'écrire
(`-ProjectRoot D:\Game\LifePlay-Sandbox-5.8`), puis `Restore.ps1 -Lot OUTIL1-SKILLS` ; les skills de l'addon sont suivis dans
l'addon (`git revert` par le gardien). Écrire des skills : le mode auto le refuse souvent, geste de l'utilisateur avec
`Get-FileHash` avant / après (`lp-lot`).
Tours : 11 / 30