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
-Indexou accepter (lepre-pushcouvre 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:40avant 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.mdne 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.