12 KiB
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 parPubCheck -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 statusdes 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/REPOpour le jeu,Docs/etatetTools/claude/skills/lp-repopour 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 -Filepasse 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_stringde l'outil Edit convertit\uXXXX; les séquences que j'avais écrites en\u00e9dans le script ont été remplacées par le caractère viaSaved\VAG1\deshabiller.py(16 remplacements, script ponctuel,python -I). Contrôle :grep -c '\\u00' Tools/Vague.ps1= 0 ; syntaxe vérifiée parParser.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ôlepre-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).