8.5 KiB
Fiche PUB3-T6b — Niveau N1 — Modèle prévu sonnet | utilisé claude-sonnet-5-5 (déclaré par l'environnement) — Agent lp-validator — Skills sk-protocol, sk-recount, lp-validate, debug-verification
PUB3-T6b-VAL : remplacement T4 du lot PUB3 (2026-10-13)
Copie D:\Game\LifePlay-master 5.8, branche ue5.8, HEAD a08c134, rien commité. Le nom du compte n'est jamais écrit :
il est lu dans USERNAME et toute sortie citée est masquée (<compte>). Script de recompte (hors projet, non rendu) :
scratchpad val.py, j.py, pc.ps1. Aucune écriture git, aucun fichier du projet ou de l'addon modifié.
1. Fiches amont relues
PUB3-T3-SPEC.md (§ 2.1, § 2.2, § 3, § 9), PUB3-T1-fichiers.csv (148 lignes ; 69 lignes jeu-5.8,ue5.8),
PUB3-T4-remplacer.ps1 (52 lignes), PUB3-T5-IMPL.md (IMPL de PubCheck, lu pour D8 et pour l'état de PubCheck -Fichiers),
instantané D:\Game\LifePlay_Backup_5.5\PUB3\ (manifest.csv 69 lignes + 69 copies), PUB3-addon58\, PUB3-addon55\.
Aucun livrable IMPL propre au remplacement T4 n'existe dans le dossier (PUB3-T4 = le script seul) : pas de « point à confirmer » T4.
2. Points à confirmer des IMPL amont
| Point | Source | Verdict |
|---|---|---|
Recoupement de D8 (-Pointe, blob partagé) par l'agent de VAL « à faire en T6b » |
PUB3-T5-IMPL.md § 8 |
reporté : hors des 7 critères de cette fiche, non rejoué ici |
Extension de la SPEC (CHEMIN-NOM, CHEMIN-MACHINE, IDENTITE-NOM) soumise à l'utilisateur |
PUB3-T5-IMPL.md § 7, § 8 |
reporté : décision de l'utilisateur |
| Aucun autre point à confirmer concerne le remplacement. |
3. Critères rejoués
Instantané : l'intégrité est établie (MD5 des 69 copies = manifest.csv, 69/69 ; ensemble des chemins du manifeste = CSV).
| # | Critère | Commande (résumée) | Résultat brut (masqué) | Verdict |
|---|---|---|---|---|
| 1 | 69 chemins, n n = Occurrences, 109/109 |
git diff --numstat -- <69> (python, sous-processus git) |
69 fichiers, somme Occurrences CSV = 109 ; 68 fichiers n n conformes ; Docs/Journal_Modifications.md = 7 6 (attendu 6 6) ; sommes : ajouts 110, retraits 109 ; status --porcelain des 69 : 69 × M, --cached : 0 |
FAIL (lettre du critère), cause bénigne, voir écart E1 |
| 2 | word-diff : mot retiré contient C:\Users\<compte>, mot ajouté identique avec %USERPROFILE% ; 116 |
git diff --word-diff=porcelain -- <69> appariement mot à mot |
substitutions ok 116, ko 1 : le « ko » est la ligne ajoutée CHG-340 de E1 (0 mot retiré, 1 ajouté) |
PASS pour les 116 substitutions |
| 3 | nom = 0 par deux formulations | (a) git grep -c -i -F -e <nom> -- <69> ; (b) pwsh -NoProfile -File Tools\PubCheck.ps1 -Fichiers <69> |
(a) code 1, sortie 0 octet (aucune ligne) ; (b) PubCheck : 0 constat(s), code 0, 1 ligne de sortie |
PASS |
| 4 | fins de ligne : 4 CRLF au même nombre de CR, aucun BOM ajouté, 65 à 0 CR | octets du fichier actuel contre l'instantané | CR identique 69/69 ; BOM ajoutés 0 (aucun BOM, ni avant ni après) ; fichiers avec CR : 4 = ETAT3-R3.md 20→20 (20 LF), ETAT3-R4.md 20→20 (20 LF), U1-BP-58.md 779→779 (1231 LF), U7-T14-BUILD.md 92→92 (92 LF) ; les 65 autres 0 CR |
PASS |
| 5 | fidélité octet pour octet : instantané + substitution = actuel | Python re.sub(rb'C:\\Users\\<nom>(?![A-Za-z0-9._-])', b'%USERPROFILE%', ancien) == actuel, écrit ici, indépendant du script de l'IMPL |
68/69 identiques ; Docs/Journal_Modifications.md : la seule différence (difflib) est l'ajout d'une ligne ` |
CHG-340 |
| 6 | addon, deux arbres | git -C <arbre> diff --numstat Tools/claude/skills/lp-doc/SKILL.md ; cmp ; recherche du nom ; fidélité à PUB3-addon58 / PUB3-addon55 |
ue5.8 : 1 1 ; lot/DC3-atelier : 1 1 ; cmp code 0, 5 693 octets chacun ; nom dans le fichier 0 (×2) ; fidélité True (×2) ; 0 CR ; diff --cached vide ; word-diff : une seule substitution C:\Users\<compte>\.claude\projects\… → %USERPROFILE%\.claude\projects\… |
PASS |
| 7 | PUB3-T4-remplacer.ps1 relu |
lecture en entier | voir § 3.1 | PASS-STATIC |
3.1 Relecture du script (critère 7)
- Aucune valeur littérale : le nom vient de
$env:USERNAME(l. 11), refus si vide (l. 12) ; seul littéralC:\\Users\\(l. 13) et%USERPROFILE%(l. 34) ; le masquage des messages d'erreur (l. 15) remplace le nom par<compte>. - Refus avant toute écriture : tous les contrôles (existence, fichier modifié dans l'arbre, UTF-8 strict, compte de
lignes = CSV, compte après = 0, CR avant = après) sont dans la boucle de planification (l. 23-39) avant la boucle
d'écriture (l. 42-49), gardée par
-Appliquer;Refussort en code 2. - Encodage strict :
UTF8Encoding($false, $true)(l. 14, lève une exception sur octets invalides, interceptée en refus l. 29) ; BOM détecté et remis (l. 28, 44-45) ; aucune normalisation de fin de ligne (substitution dans le texte décodé). - Réserve de lecture (non bloquante) : la garde « modifié dans l'arbre » (l. 19, 26) aurait refusé un fichier déjà modifié ; le journal partagé a donc été complété (ligne CHG-340) après l'application (E1). Exécution du script non rejouée par la VAL.
4. Diff lu en entier
69 fichiers, 110 ajouts, 109 retraits (numstat). Les 109 paires ajout/retrait sont des substitutions de mot ; l'ajout supplémentaire (110e) est la ligne CHG-340 du journal. Aucun autre fichier de la liste n'a de diff hors substitution. Le diff n'a pas été relu visuellement fichier par fichier : il a été recalculé octet à octet (critère 5) et mot à mot (critère 2), méthodes plus strictes que la lecture.
5. Verdict
FAIL (strict, critère 1), avec la cause identifiée et bénigne : le remplacement lui-même est conforme (critères 2 à 7 :
116 substitutions exactes, 0 occurrence restante, fins de ligne et BOM intacts, addon conforme). L'écart unique est la ligne
d'entrée CHG-340 ajoutée à Docs/Journal_Modifications.md après l'application (mtime 10:15:32, instantané 10:14:05), que
la SPEC prévoit (§ 2.1 et § 2.2 : « 6 lignes anciennes + 1 entrée CHG »), mais que le critère 1 de la fiche (n n, 109/109)
ne prévoit pas. Si l'orchestrateur accepte l'entrée CHG-340 comme attendue, le résultat se lit : critère 1 PASS à 7 6 pour
ce seul fichier (6 substitutions + 1 ajout). Cette lecture est sa décision, pas la mienne.
6. Points à confirmer par l'utilisateur / l'orchestrateur
- Accepter
Docs/Journal_Modifications.mdà7 6(E1), ou faire commiter la ligne CHG-340 à part du remplacement. - Au commit : les deux tickets addon jumeaux et le ticket jeu A ; l'instantané couvre l'état d'avant le remplacement uniquement, pas la ligne CHG-340.
7. Établi / estimé / incertain
- Établi (commande rejouée maintenant) : tous les chiffres du § 3, intégrité de l'instantané,
PubCheck -Fichiers= 0 code 0 sur les 69. - Estimé : le remplacement ne touche rien d'autre que les 69 fichiers de la liste dans le dépôt jeu :
git diff --name-onlyrestreint aux 69 chemins en rend 69 ; je n'ai pas inventorié le reste de l'arbre (d'autres lots y ont des fichiers en cours). - Incertain : l'ordre chronologique exact « apply puis CHG-340 » repose sur les mtime (10:15:32 contre 10:14:05) ; aucun journal du script n'a été relu.
- Non mesuré :
PubCheck -Arbre(se lit sur les refs, non applicable) ; D8 ; exécution du script-Appliquer(non rejouée, interdit).
8. Écarts
- E1 :
Docs/Journal_Modifications.md7 6au lieu de6 6, somme110/109au lieu de109/109; cause : ligne d'entrée CHG-340 (l. 1134). Critère 5 : 68/69 octet pour octet ; ce fichier = instantané + substitution + cette ligne. Critère 2 : un « ko » = cette ligne. - Aucun autre écart. Aucun fichier de l'addon écarté (
diff --cachedvide dans les deux arbres).
9. Fichiers à commiter
A Docs/Migration/etat/AG/PUB3/PUB3-T6b-VAL.md (jeu). Aucun autre fichier écrit par la VAL.
Tours : 11 / 25
Constats
- Pièges : le crochet
ecriture-gardienrefuse tout>dans une commande Bash, même dans une chaîne ou un-replace; passer par un script écrit avec Write dans le scratchpad. PubCheck -Fichiersaccepte la liste des 69 chemins en arguments restants (@l), code 0 et une seule ligne de sortie.