LifePlay-Revival/Docs/Migration/etat/AG/VAG1/VAG1-IMPL.md

96 lines
12 KiB
Markdown
Raw Normal View History

# VAG1-IMPL : `Tools\Vague.ps1` écrit et essayé sur clones jetables
Fiche VAG1-IMPL — Niveau N1 — Modèle prévu sonnet | utilisé sonnet (claude-sonnet-5-5) — Agent session « Sonnet · VAG1 » — Skills lp-lot, lp-repo, sk-repo, sk-protocol, sk-windows-shell, sk-change-safety. Date : 2026-10-20. Pas de copie UE. Aucune écriture git sur les dépôts réels, aucun verrou réel pris.
Accord de Big Boss (session `local_104ff22d`, 2026-10-20) sur `VAG1-SPEC-01.md` (MD5 `5068a86b…`) et ses 4 points : 1) clones sparse jetables ; 2) statut et ligne `REPO-JOURNAL` d'un ticket addon écrits dans le jeu et emportés par le PARTAGES suivant ; 3) trailer `Co-Authored-By` gardé (`-Trailer`) ; 4) admission par le hook `ecriture-gardien` vérifiée à l'IMPL.
## 1. Résultat : réussi (27 essais sur 27), VAL distincte à faire
## 2. Fichiers écrits
| Fichier | Nature | MD5 |
|---|---|---|
| `Tools\Vague.ps1` | 469 lignes, UTF-8 sans BOM, LF, `#Requires -Version 7`, bloc `.SYNOPSIS` ; outil local non suivi | `4e4ebaf236d7e48cd7ec353a20c789f3` |
| `Tools\LISEZMOI.md` | une ligne d'index ajoutée (avant `PubCheck.ps1`) | avant `F13238CDB8DF3B75FF5E94136C00C686` → après `2985f18c5889cd646ba999e320c83e7b` |
| `Saved\VAG1\essais.ps1` | pilote des essais (hors git) | `10b323f5de36035903571f9e50be4ed3` |
| `Saved\VAG1\essais-sortie.txt`, `deshabiller.py` | sortie brute des essais ; correctif ponctuel des séquences `\uXXXX` (voir § 6) | — |
Instantané : `Snapshot.ps1 -Lot VAG1 -Path Tools\Vague.ps1, Tools\LISEZMOI.md` (Vague.ps1 « absent, sera retiré à la restauration ») → `D:\Game\LifePlay_Backup_5.5\VAG1\manifest.csv`. Retour arrière : `.\Tools\Restore.ps1 -Lot VAG1`.
## 3. Écarts à la SPEC (assumés)
- **Essai à blanc sans index** : le contrôle C6 (diff indexé = liste du ticket) n'est fait qu'en `-Executer` ; en `-Essai`, C5 vérifie fichier par fichier (existence, différence avec HEAD) et C7 passe par `PubCheck -Fichiers` (l'index privé aurait écrit des objets dans `.git`). Le contenu de l'essai à blanc reste donc : aucun fichier, index ni commit écrit (prouvé : `git status` des deux clones identique avant / après, § 4 S1, S2a, S3a).
- **Journal d'un ticket qui liste `REPO-JOURNAL.md`** : le blob indexé est HEAD + la seule ligne de ce ticket ; le PARTAGES prend le fichier de travail entier (toutes les lignes de la vague, contrôlées par P6).
- **Clones** : `git clone --local --no-hardlinks --no-checkout` (les liens physiques échouent entre disques : « Improper link »), puis sparse-checkout (`Docs/Migration/etat/REPO` pour le jeu, `Docs/etat` et `Tools/claude/skills/lp-repo` pour l'addon). Copie ≈ 650 Mo + 25 Mo sous `%TEMP%\claude\VAG1\`.
- **Chemin de profil dans la ligne de journal** : si l'arbre est sous `%USERPROFILE%` (clones d'essai), la ligne porte le nom du dossier seul. PubCheck l'avait refusée une première fois (essai F20 / S2b / S3), cause corrigée dans le script.
- `-Tickets a,b` : `pwsh -File` passe la liste en une chaîne ; le script la découpe sur la virgule.
## 4. Mesuré : sortie du pilote (`Saved\VAG1\essais-sortie.txt`, lignes PASS / FAIL, collées, tronquées à 210 caractères)
```
PASS S1 essai a blanc, 1 ticket jeu : code 0 (attendu 0) VERDICT VT-S1 — essai-OK — fichiers 1
PASS F4 P2 statut deja fait : code 1 (attendu 1) VERDICT VT-F4 — refusé P2-STATUT : Statut : fait
PASS F5 C2 branche : code 1 (attendu 1) VERDICT VT-F5 — refusé C2-BRANCHE : Branche attendue : autre ; courante : ue5.8
PASS F6 C2 HEAD : code 1 (attendu 1) VERDICT VT-F6 — refusé C2-HEAD : HEAD attendu : 1234567 ; courant : 8ff3457
PASS F7 C3 identite : code 1 (attendu 1) VERDICT VT-F7 — refusé C3-IDENTITE : user.name / user.email (valeurs masquees) hors noreply ou differents de HEAD
PASS F8 C4 chemin interdit : code 1 (attendu 1) VERDICT VT-F8 — refusé C4-CHEMIN-INTERDIT : A Tools/essai.ps1
PASS F9 C4 fichier partage hors PARTAGES : code 1 (attendu 1) VERDICT VT-F9 — refusé C4-CHEMIN-INTERDIT : M Docs/Journal_Modifications.md (fichier partage hors ticket PARTAGES, V5)
PASS F10 C5 M sans diff : code 1 (attendu 1) VERDICT VT-F10 — refusé C5-PERIMETRE : M Docs/21_Sandbox_Addon.md (identique a HEAD)
PASS F11 C5 A absent : code 1 (attendu 1) VERDICT VT-F11 — refusé C5-PERIMETRE : A Docs/Migration/etat/REPO/VAGTEST/a2.md (absent de l'arbre)
PASS F12 C7 PubCheck non nul : code 1 (attendu 1) VERDICT VT-F12 — refusé C7-PUBCHECK : …\VAGTEST\a1.md:1:PROFIL / …:1:NOM / PubCheck : 2 constat(s)
PASS F13 C8 fins de ligne : code 1 (attendu 1) VERDICT VT-F13 — refusé C8-FINS-DE-LIGNE : Docs/21_Sandbox_Addon.md : fins de ligne i/lf -> w/crlf
PASS F14 C9 message sans Tickets : code 1 (attendu 1) VERDICT VT-F14 — refusé C9-MESSAGE : Message : VAGTEST : sans corps
PASS F15 P5 PARTAGES avec fichier non partage : code 1 (attendu 1) VERDICT VAGUE-20261020-9-PARTAGES — refusé P5-PARTAGES : A Docs/Migration/etat/REPO/VAGTEST/a1.md n'est pas un fichier partage
PASS F16 P6 ligne CHG non listee : code 1 (attendu 1) VERDICT VAGUE-20261020-8-PARTAGES — refusé P6-V5-LIGNE-INCONNUE : Docs/Journal_Modifications.md:1348 : | CHG-999 | 2026-10-20 | VAGTEST | x | x | x | x |
PASS F17 PIN : arret propre : code 1 (attendu 1) VERDICT VT-F17 — ARRET-PIN : le pin du doc 21 est un geste du gardien
PASS F18 C1 type non gere : code 1 (attendu 1) VERDICT VT-F18 — refusé C1-TYPE-NON-GERE : # Ticket VT-F18 — TAG
PASS F19 C5 meme fichier dans 2 tickets : code 1 (attendu 1) VERDICT VT-F19a — essai-OK — fichiers 1 // VERDICT VT-F19b — refusé C5-DOUBLON : Docs/Migration/etat/REPO/VAGTEST/a1.md (deja dans VT-F19a)
PASS F1 P4 verrou occupe : code 1 (attendu 1) VERDICT VT-F1 — BLOCKED-VERROU : VERROU OCCUPE k=1 par (qui.txt absent ou vide) depuis 0 min // EN-FILE VT-F1
PASS F2 P1 plafond 9 tickets : code 2 (attendu 2) Vague.ps1 : P1 plafond V3 depasse (9 tickets, 8 au plus) : deux vagues de suite
PASS F3 P3 ordre jeu avant addon : code 2 (attendu 2) Vague.ps1 : P3 ordre V4 non respecte au ticket VT-F3b (addon, pin, jeu, PARTAGES en dernier)
PASS F23 usage -Essai et -Executer : code 2 (attendu 2) Vague.ps1 : -Essai et -Executer sont exclusifs
PASS F20 exec C7 -Index : refus, rien commite, suivant en file : code 1 (attendu 1) VERDICT VT-E1 — refusé C7-PUBCHECK : …\VAGTEST\a1.md:1:NOM / …:1:PROFIL / PubCheck : 2 constat(s) // EN-FILE VT-E2
PASS F21 exec C6 fichier ignore : code 1 (attendu 1) VERDICT VT-E3 — refusé C6 add : The following paths are ignored by one of your .gitignore files: / Docs/x.vagignore / hint: …
PASS S2a essai a blanc : prevoit le refus P6 (ligne etrangere) sans rien ecrire : code 1 (attendu 1) VERDICT VT-W1 — essai-OK // VT-W2 — essai-OK // VAGUE-20261020-7-PARTAGES — refusé P6-V5-LIGNE-INCONNUE : …REPO-JOURNAL.md:193 : | 2026-10-19 | AUTRE-PASSAGE | …
PASS S2b EXECUTION avec une ligne etrangere dans REPO-JOURNAL : W1 et W2 faits, PARTAGES refuse (P6) : code 1 (attendu 1) VERDICT VT-W1 — fait 1c62c03 // VT-W2 — fait 7674c7c // PARTAGES — refusé P6-V5-LIGNE-INCONNUE
PASS S3a essai a blanc de la vague complete : code 0 (attendu 0) VERDICT VT-X1 — essai-OK // VT-X2 — essai-OK // VAGUE-20261020-6-PARTAGES — essai-OK — fichiers 4
PASS S3 EXECUTION vague complete (addon, jeu, PARTAGES) : code 0 (attendu 0) VERDICT VT-X1 — fait a925abd // VT-X2 — fait 4c09b7d // VAGUE-20261020-6-PARTAGES — fait cb3680b
TOTAL 27 sur 27
```
Compléments mesurés de l'exécution S3 (clones) : `git log --oneline` addon `a925abd`, jeu `cb3680b` (PARTAGES), `4c09b7d` (VT-X2), `8ff3457` (HEAD d'avant) ; `show --name-status` PARTAGES = `M Journal_Modifications.md`, `M REPO-JOURNAL.md`, `A tickets/VT-X1.md`, `A tickets/VT-X2.md` (= liste du ticket) ; VT-X2 = `M REPO-JOURNAL.md` + `A …/VAGTEST/a1.md` ; statuts des trois tickets `fait` ; le seul reste de `git status` du clone du jeu est le fichier de ticket PARTAGES non suivi ; verrou `LIBRE`, dossiers `1`, `1-libre`. Après F20 : `HEAD inchangé : True`, statut de VT-E1 `refusé (C7-PUBCHECK)`, verrou libre (`k=1`). Après S2b : statut W1 / W2 `fait`, PARTAGES `demandé`, verrou libre.
## 5. Point 4 : hook `ecriture-gardien`
Le script est lancé par la session principale (pas de champ `agent_type`) : le hook (en-tête de `%USERPROFILE%\.claude\hooks\ecriture-gardien.py`, ligne 5 : « session principale … on laisse passer ») laisse passer les écritures de `Vague.ps1` dans `Tools\`, les clones sous `%TEMP%\claude\` et les `git` d'essai : aucun refus constaté. **Non mesuré** : une exécution sur les dépôts réels par un agent `lp-*` ou par Big Boss (le hook y réagirait selon l'`agent_type` de l'appelant) ; le garde-fou `pre-commit` du jeu (`LP_REPO_TICKET`) n'est pas installé dans les clones, donc non exercé.
## 6. Pièges et incertitudes
- Le champ `new_string` de l'outil Edit convertit `\uXXXX` ; les séquences que j'avais écrites en `\u00e9` dans le script ont été remplacées par le caractère via `Saved\VAG1\deshabiller.py` (16 remplacements, script ponctuel, `python -I`). Contrôle : `grep -c '\\u00' Tools/Vague.ps1` = 0 ; syntaxe vérifiée par `Parser.ParseFile` (« syntaxe OK »).
- Non essayés : C12 (`ECART-POST`), `-File FILE.md`, `-Json`, journal en CRLF, ticket addon dont le HEAD attendu est un hash antérieur, contrôle `pre-commit`. À sonder par la VAL.
- La règle C8 « réécriture complète » (somme ajouts + suppressions ≥ 2 × lignes, fichier > 20 lignes) n'a pas été éprouvée seule (F13 déclenche sur la classe d'EOL).
- Clones laissés sous `%TEMP%\claude\VAG1\` (jeu, LifePlay-Sandbox, VERROU, `reste-jeu-1` : reliquat d'un essai raté, déplacé et non supprimé), non ouverts en écriture.
## 6 bis. Fix après `VAG1-VAL.md` (verdict FAIL, 2026-10-20) : E1 à E6 corrigés, 36 essais sur 36
Copie du script avant correction : `D:\Game\LifePlay_Backup_5.5\VAG1\Vague.ps1.v1-avant-fix` (MD5 `4e4ebaf236d7e48cd7ec353a20c789f3`).
| VAL | Correction | Essai ajouté (pilote) |
|---|---|---|
| E1 C8 « réécriture complète » jamais atteinte (`Get-Content -ReadCount 0` compte 1) | `[IO.File]::ReadAllLines(...).Length` ; seuil ramené de 2 × lignes à **1,6 × lignes** (un fichier dont les lignes non vides sont toutes changées contient des lignes vides) | N1 : refus `C8-FINS-DE-LIGNE … reecriture complete (249 249 …)` |
| E2 `-File` ne lit que les identifiants nus | premier mot de la cellule Ticket (`QG1-T2 (vague 4)`) ; si une ligne de table n'est pas lisible : code 2 « N lignes de table, M tickets lisibles » | N2a (cellule annotée lue), N2b (ligne illisible = code 2) |
| E3 C12 : `git status` jamais relu | `git status --porcelain -uall` avant et après ; toute ligne nouvelle hors fichiers du ticket, `REPO-JOURNAL.md` et tickets de la vague = `C12-ECART-POST` (commit conservé, code 1) | N3 : un hook `post-commit` du clone crée un fichier hors liste → refus |
| E4 P2 vérifié dans la boucle | P2 (format + statut `demandé`) vérifié pour **tous** les tickets avant la vague : rien d'écrit ni de commité, les autres en `EN-FILE`. Aucun statut n'est réécrit pour un refus avant démarrage (le ticket n'est pas « demandé » : on ne touche pas à son fichier) | N4 : 2e ticket « en cours » → `HEAD inchangé : True`, verrou libre |
| E5 `HEAD attendu` : `quelconque` admis partout, préfixe d'un caractère | `quelconque` seulement pour un ticket PARTAGES ; sinon hash d'au moins 7 caractères hexadécimaux | N5a (quelconque refusé), N5b (`a` refusé) |
| E6 C4 ne regarde que `/` | chemins avec `\`, absolus, `C:`, `.` ou `..` refusés (`chemin non normalisé`) avant tout autre test | N6a (`Tools\x.ps1`), N6b (`Docs/../Tools/x.ps1`) |
Le pilote donne `TOTAL 36 sur 36` (`Saved\VAG1\essais-sortie2.txt`) ; Vague.ps1 : 494 lignes, MD5 `24b2ef4f6a6729c98b6958c7e8d09619` ; PubCheck 0 ; `grep -c '\\u00'` = 0. Pilote : MD5 `056e378967d1936e56a71a869a596ab3`. Les tickets de test du pilote portent maintenant un HEAD réel (le défaut `quelconque` est refusé, E5).
**Écart SPEC assumé** : seuil C8 à 1,6 × lignes (SPEC § 4 : 2 ×) ; P2 avant la vague sans réécriture de statut. À faire valider : VAL de reprise.
## 7. Fichiers à commiter
Jeu : `Docs/Migration/etat/AG/VAG1/VAG1-SPEC-01.md`, `VAG1-TACHES.md`, `VAG1-IMPL.md` (A). `Tools\Vague.ps1` et `Tools\LISEZMOI.md` : outils locaux non suivis (CHG et instantané remplacent le commit, `lp-doc`) : **CHG à verser par la DOC de clôture**, non écrit ici.
Tours : environ 50 sur la reprise. À verser : lp-repo / lp-lot — `Vague.ps1` exécute la vague ; sk-windows-shell — `pwsh -File` passe `-Tickets a,b` en une chaîne ; sk-repo — `git clone --local` échoue en lien physique entre deux disques (`--no-hardlinks`).
Suite : lancer la VAL par un `lp-validator` distinct (classe O).