LifePlay-Revival/Docs/Migration/etat/AG/PUB3/PUB3-T6a-VAL.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

12 KiB

Fiche PUB3-T6a — 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, sk-windows-shell, debug-verification

PUB3-T6a-VAL : validation de Tools\PubCheck.ps1 et Tools\hooks\pre-push (2026-10-13)

Verdict historique FAIL (version du script avant corrections). Suite : PUB3-T6a-bis-VAL.md (rejeu après corrections D1 à D7).

Copie D:\Game\LifePlay-master 5.8, branche ue5.8, HEAD f32df0d. Les valeurs personnelles (compte, machine, adresse) ne sont écrites nulle part : <compte>, <machine>, <adresse>. Chemin du scratchpad noté <scratchpad> (sous le dossier temporaire de la session). Aucune écriture git dans le projet (les git init, add, commit ci-dessous visent uniquement des dépôts témoins jetables du scratchpad). Aucun hook installé.

1. Fiches amont relues

Fiche Relue Remarque
PUB3-T3-SPEC.md § 4, § 5.1, § 9 oui, en entier pour ces sections critères 1, 4-8 rejoués ; 2 et 3 non applicables avant remplacement
PUB3-T5-IMPL.md (E1-E7, § 3, § 5) oui voir § 2 et écart G1 (gabarit IMPL)
Tools\PubCheck.ps1 (266 l.) lu en entier, ligne par ligne § 4
Tools\hooks\pre-push (17 l.) lu en entier § 4

2. Points à confirmer des IMPL

PUB3-T5-IMPL.md n'a pas de section « Points à confirmer » (le gabarit IMPL en exige une, § 5 ; voir G1). Le seul point ouvert de l'IMPL est son § 5 « Incertain » ; les essais du § 3 sont rejoués au § 3 ci-dessous.

Point Verdict
Hook lancé par un client graphique dont le PATH n'a pas pwsh : refus attendu reporté (client graphique non disponible) ; le cas PATH sans pwsh en shell donne bien code 1 (critère 7)
Essais § 3 de l'IMPL (734 constats, 218 constats, USERNAME vide, hook x4) PASS, tous rejoués (critères 1, 5, 6, 7)
-Arbre origin/main = 1 constat ADRESSE, -Arbre v1.0..v1.5 = 0 reporté (hors liste de la fiche T6a, non rejoué)

3. Critères rejoués

# Critère Commande (valeurs masquées) Compte brut Verdict
1 -Arbre ue5.8 : 69 f. / 109 l. / 218 constats / code 1 pwsh -NoProfile -File Tools\PubCheck.ps1 -Arbre ue5.8 (sortie dans le scratchpad, recomptée par pwsh) PubCheck : 218 constat(s), code 1, 3,6 s ; fichiers distincts 69 ; couples fichier:ligne distincts 109 ; NOM=109, PROFIL=109 PASS
1b Recoupe git grep git grep -c -i -F -e <compte> ue5.8 -- ; git grep -o -i -F -e <compte> ue5.8 -- -c : 69 fichiers, somme 109 lignes ; -o : 116 ; git grep -i -F (lignes) : 109 PASS (116 occurrences, 109 lignes)
4a Témoin, 1 ligne par catégorie, -Fichiers PubCheck.ps1 -Depot <témoin> -Fichiers cat.txt bin.dat code 1 ; cat.txt:1:NOM ; :2:NOM :2:PROFIL ; :3:NOM :3:PROFIL (forme POSIX du profil) ; :4:PROFIL (autre nom) ; :5:MACHINE ; :6:ADRESSE ; bin.dat:0:BINAIRE-NOM ; 9 constats, aucune valeur PASS
4b idem -Index (après git add dans le témoin) -Index mêmes 9 constats, code 1 PASS
4c idem -Arbre HEAD -Binaires, -Arbre HEAD (sans binaire : 8 constats, bin.dat non lu comme prévu), -Pointe HEAD -Distant origin (remote absent) 9 / 8 / 9 constats, code 1, mêmes catégories ; -Pointe ajoute (blob … introduit par <commit>) PASS
4d Cas admis → 0 : profil <compte> entre chevrons, %USERPROFILE%, dossiers Public, Default, All Users, x@users.noreply.github.com, noreply@anthropic.com, a@example.com, icone@2x.png, git@github.com:a/b.git, mot googlemail sans @, x<machine>y et pre<machine> -Fichiers, -Index, -Arbre -Binaires, -Pointe sur le témoin « ok » PubCheck : 0 constat(s), code 0, dans les 4 modes PASS
4e Identité de commit non noreply commit du témoin avec user.email=<adresse>@exemple-perso.fr, -Pointe HEAD -Distant origin 87f9ab3:IDENTITE:0:IDENTITE, code 1 PASS
5 USERNAME vide (processus de l'essai) USERNAME='' puis PubCheck.ps1 -Arbre HEAD PubCheck : erreur : variable USERNAME vide, code 2 (idem COMPUTERNAME vide : code 2 ; dépôt introuvable : code 2 ; ref inconnue : code 2) PASS
6 -Pointe ue5.8 -Distant origin : 734 (368 + 366), < 60 s time pwsh -NoProfile -File Tools/PubCheck.ps1 -Pointe ue5.8 -Distant origin PubCheck : 734 constat(s), NOM=368, PROFIL=366, code 1, real 0m30.027s PASS
7 Hook simulé printf 'refs/heads/… <sha> refs/heads/… <zéros>\n' | sh Tools/hooks/pre-push origin https://x (script <scratchpad>\hook-test.sh) ue5.8 : code 1 (29 s), « push refusé : refs/heads/ue5.8 -> refs/heads/ue5.8 » ; pointe origin/main : code 0 (0 constat(s)) ; sha local zéros : code 0, rien lancé ; PATH=/usr/bin:/bin (pwsh invisible, vérifié) : code 1 « pwsh introuvable » ; LP_PUBCHECK absent : code 1 « … introuvable » PASS (réserve R1)
8 Select-String -SimpleMatch compte et machine sur Docs\Migration\etat\AG\PUB3\ (hors ce livrable, écrit après), Tools\PubCheck.ps1, Tools\hooks\pre-push (10 fichiers) compte : 0 ; machine : 0 PASS

Réserve R1 (critère 7) : la pointe d'origin/main donne 0 parce que la plage --not --remotes=origin est vide ; ce cas ne prouve pas que main public est net (voir -Arbre origin/main, IMPL § 4, non rejoué).

Relecture « en plus » : faux négatifs et faux positifs observés (témoins jetables)

# Constat Preuve Gravité
D1 Messages de commit jamais contrôlés (SPEC § 4.1 : « messages »). $bloc.IndexOf("0")(l. 206) est sensible à la culture en .NET (ICU) et rend 0 :$hvide, le texte transmis àTest-Contenugarde le NUL,Test-Binairele prend pour un binaire et,binaireAussi=$false, return` sans rien dire. Témoin B2 : commit dont le message contient le compte, -Pointe HEAD -Distant origin → PubCheck : 0 constat(s), code 0. Diagnostic : git log --format='%x02%h%x00%B' relu, h=[], NUL à l'octet 6 de la charge. Contrôle : la regex NOM sur ce même texte renvoie True. majeure : donnée personnelle dans un message poussée sans refus
D2 -Index : une ligne ajoutée commençant par ++ apparaît +++ … dans le diff et est prise pour un en-tête de fichier (l. 182), donc ignorée et le chemin courant est perdu. Témoin B : plus.txt (++ <compte>) absent de la sortie -Index, présent en -Fichiers, -Arbre, -Pointe. moyenne (le -Pointe du pre-push la rattrape)
D3 Temps quadratique sur un blob texte à constat : le calcul des débuts de ligne (l. 122-125) devient lent quand le blob contient un constat. Fichier de lignes courtes avec le compte à la fin : 1,9 Mo 13 s ; 4,7 Mo 78 s ; 9,4 Mo 330 s ; 18,8 Mo > 80 s (coupé) ; 109 Mo > 1 180 s (processus tué). Sans constat, 400 000 car. sur une ligne : 0,7 s. moyenne : le hook se bloque au lieu de refuser sur un gros fichier texte fautif (> 60 s de la SPEC § 4.3, > 100 Mo non tenu)
D4 Non couverts (conforme à la SPEC, mais faux négatifs plausibles) : le compte dans un nom de fichier, ou comme nom git d'auteur/committer (user.name). Témoin : <compte>-fichier.txt absent de toutes les sorties ; commit avec user.name=<compte> et email noreply → code 0 (le message de ce commit contenait aussi le compte : voir D1). à décider (SPEC)
D5 Le message d'erreur « dépôt introuvable : » recopie le chemin reçu : s'il contient le compte (dossier de profil) la valeur sort sur stderr. Observé (masqué) avec -Depot = scratchpad. mineure (PUB3 « jamais la valeur »)
D6 Cosmétiques : -Index ajoute une tabulation finale au chemin quand il contient une espace (f e.txt<TAB>:1:NOM) ; « introduit par » imprime 40 caractères. sorties B2, B5 mineure
D7 PUB3-T5-IMPL.md:40 contient en exemple un chemin de profil d'une seule lettre : -Fichiers sur ce livrable donne :40:PROFIL, code 1, contrairement à « livrables PUB3 : 0 » (IMPL § 3). Le futur -Index refuserait ce document. PubCheck.ps1 -Fichiers sur les 9 fichiers PUB3 + 2 outils : seul PUB3-T5-IMPL.md:40:PROFIL mineure (pas de valeur réelle)

Tenus : chemins avec espaces, nom de fichier non ASCII (café 中.txt), CRLF (crlf.txt:2:NOM), majuscules, x_<compte>_y (souligné = bord, constat), fichier vide (pas d'erreur), texte UTF-16 avec BOM (BINAIRE-NOM), blob identique sous deux chemins (un seul constat, le premier chemin) : tous conformes ou prudents.

4. Diff lu en entier

Fichiers neufs non suivis (pas de diff à comparer) : Tools/PubCheck.ps1 (266 l.), Tools/hooks/pre-push (17 l.), lus en entier. git ls-files --eol -o --exclude-standard : w/lf pour les deux (0 CR, conforme à IMPL § 1). git status --short Tools : seuls ?? attendus (PubCheck.ps1, hooks/, plus Corbeille.ps1, Traces.ps1, TracesRacines.ps1 d'autres lots, non examinés). Lecture seule : aucune écriture dans le dépôt ni dans le fichier réel (Out-File/Set-Content absents ; seul git cat-file --batch et lectures git) ; aucune valeur littérale dans les deux fichiers (critère 8 : 0). Fail closed : $ErrorActionPreference='Stop', try/catch → code 2, git en échec → code 2 (vérifié : ref inconnue → 2) ; hook : refus sur pwsh, script ou dépôt absents. Le hook refuse aussi sur le code 2 de PubCheck (|| refus). Estimé : un blob > 2 Go ferait lever une exception → code 2 (non essayé). Le hook ne traite pas $rsha (inutilisé) ; l'URL passée à $2 n'est pas utilisée (--remotes=<nom> seulement, SPEC § 5.1).

5. Verdict

FAIL (global, version d'origine). Critères 1, 4, 5, 6, 7, 8 : PASS ; critères 2 et 3 : sans objet avant le remplacement. Motif du FAIL : D1, le contrôle des messages promis par la SPEC § 4.1 et par l'en-tête de PubCheck.ps1 (l. 15-16) ne détecte rien, et le hook ne protège donc pas les messages de commit ; D2 et D3 s'y ajoutent (à corriger ou à accepter explicitement). Aucune correction faite ici (sk-protocol § 2). Après correction : rejouer le témoin B2 (message avec le compte → code 1, catégorie MESSAGE), plus.txt en -Index, et la mesure de durée du § 3 (D3). Fait dans PUB3-T6a-bis-VAL.md.

6. Points à confirmer par l'utilisateur

  • D1 : corriger avant l'installation du hook (recommandé ; ordinal IndexOf([char]0) ou séparateur sans NUL).
  • D2 : corriger l'analyse du diff de -Index ou accepter (le pre-push couvre le cas).
  • D3 : accepter la lenteur sur gros fichier texte fautif, ou corriger le calcul des lignes.
  • D4 : décider si noms de fichiers et noms git d'auteur entrent dans le périmètre.
  • D7 : réécrire l'exemple de chemin de profil de PUB3-T5-IMPL.md:40 avant son commit.

Établi : tous les comptes et codes du § 3 (commandes rejouées aujourd'hui) ; D1 (diagnostic et essai), D2, D3 (essais) ; fins de ligne. Estimé : D4 (portée), blob > 2 Go, équivalence « mêmes lignes » du critère 1 (comptes égaux, listes non diffées une à une). Incertain : client graphique sans pwsh ; push vers URL (non essayé) ; -Arbre origin/main (non rejoué).

Écarts

  • G1 : PUB3-T5-IMPL.md ne suit pas le gabarit IMPL (sections 3 « Instantané », 4 « Ce qui n'a pas été fait », 5 « Points à confirmer », 6 « Fichiers à commiter » absentes ; numérotation différente). Durée de -Pointe : 43 s dans l'IMPL contre 30,0 s mesurées ici (cache disque, estimé).
  • Fichiers que je laisse : témoins et scripts d'essai dans <scratchpad> (temoin*, *.ps1, hook-test.sh), hors projet.

Fichiers à commiter

A Docs/Migration/etat/AG/PUB3/PUB3-T6a-VAL.md (jeu 5.8). Aucun autre fichier du projet touché.

Tours : 33 / 40

Constats

Mesure de durée D3 : <scratchpad>\dbg3.ps1 ; hook : <scratchpad>\hook-test.sh ; témoins : <scratchpad>\temoin.ps1 -Part A|B|C|D. À verser : lp-validate — IndexOf("0")sur unstring.NET est culturel et rend 0 ; utiliser[char]0` ; tester chaque catégorie annoncée par la SPEC (messages compris) sur un témoin, pas seulement celles du tableau de la fiche.