LifePlay-Revival/Docs/Migration/etat/EVAL2/AMEL1/OUTIL1/OUTIL1-TEXTES.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

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é de sk-protocol § 7 diffère de l'addon sur la phrase « Script à usage répété » (le profil dit « le ranger dans Saved/<lot>/ ou le proposer pour Tools/ » ; 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 supprim dans Docs\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 (bUseLoggingInShipping absent de Source/LifePlay.Target.cs) : une mesure LogStats se fait sur un Development empaqueté -skipcook avec la même cuisson (U8-T5b).
APRÈS :
  • Le Shipping n'écrit aucun journal (bUseLoggingInShipping absent de Source/LifePlay.Target.cs) : une mesure LogStats se fait sur un Development empaqueté -skipcook avec 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, hitch LPDebug) ; 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 dans Tools\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 N pour la fin, -Stats pour les compteurs normalisés). Exemple : -Latest OUT1_LPTestStringCompat -Pattern ': Warning: ' → la ligne 3120 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 N pour la fin, -Stats pour les compteurs normalisés et les familles trame / F5 / DESTROY / hitch). Exemple : -Latest OUT1_LPTestStringCompat -Pattern ': Warning: ' → la ligne 3120 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