LifePlay-Revival/Docs/Migration/etat/U58/U8P/U8P-T1-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

20 KiB
Raw Blame History

Fiche U8P-T1v — Niveau N1 — Modèle prévu sonnet | utilisé claude-sonnet-5-5 (Sonnet 5.5) — Agent lp-validator — Skills lp-validate, sk-recount, sk-protocol, debug-verification

U8P-T1-VAL : validation de l'IMPL U8P-T1, pièges de la reprise U8 dans lp-build, lp-validate et FicheStats.py (2026-10-11)

Verdict global : PASS, avec 1 réserve de formulation (E1, piège B2) et 3 écarts mineurs de forme (E2 à E4) à trancher par l'orchestrateur. Aucun fichier modifié par la validation hors ce livrable ; aucune commande git qui écrit. Seul fichier produit hors dépôt : FicheStats_old.py (copie de HEAD:Tools/FicheStats.py, scratchpad de session, pour comparer l'ancienne et la nouvelle expression).

1. Fiches amont relues

Tout lu en entier avant les contrôles :

  • Docs/Migration/etat/U58/U8P/U8P-TACHES.md (registre ; ligne U8P-T1 encore « à faire », voir E4).
  • Docs/Migration/etat/U58/U8P/U8P-T1-IMPL.md (seule IMPL du lot ; sa section 6 donne les 4 points à confirmer).
  • Source : Docs/Migration/etat/U58/U8/U8-EVAL.md § 3 à 5.
  • Sources des pièges : U8-T2r2-BUILD.md, U8-T3r2-BUILD.md, U8-T4r2-BUILD.md, U8-T5br2-BUILD.md (l. 17-18, forme de lancement), U8-T8c-BUILD.md, U8-T5ar2-VAL.md, U8-T6-VAL.md, U8-T5b-BUILD.md (l. 64), U8-T5cr-VAL.md (l. 14) ; Tools/UeState.ps1 ; RunUAT.bat du moteur 5.8 ; sk-windows-shell/SKILL.md l. 11.
  • Gabarit : D:\Game\LifePlay-Sandbox\Tools\claude\skills\lp-doc\gabarits.md (sections IMPL, VAL, TACHES).

2. Points à confirmer de l'IMPL (section 6) : verdict un par un

Id Point Verdict Preuve
IMPL-6.1 Diffs = ajouts seuls (plus la ligne de renvoi l. 73 de lp-build/SKILL.md), identiques dans les deux addons (cmp) PASS § 3 critères 1 et 2 ; § 4
IMPL-6.2 Chaque piège exact au regard de sa source ; B2 contre UeState.ps1:43 PASS avec réserve E1 (B1, B3, V1, V2 PASS ; B2 : fait central établi, formulation « cuisson » plus forte que la source) § 3 critère 3
IMPL-6.3 FicheStats.py : --lot U8 --since 2026-10-10T19:00 (16 fiches) et non-régression sur un autre lot PASS § 3 critères 4 et 5
IMPL-6.4 Fins de ligne LF, sans BOM, aucun autre fichier touché (fichiers CG de l'addon 5.8 hors périmètre) PASS § 3 critères 6 et 7

3. Critères rejoués (commande → résultat brut)

# Critère Valeur du livrable Recompté Commande Verdict
1 Diff addon 5.8 (ue5.8, HEAD 9227db8) SKILL.md lp-build 3+/1−, shipping.md 24+/0−, lp-validate 10+/0− idem : 3 1, 24 0, 10 0 (git diff --numstat) ; seule suppression : la ligne de renvoi « Pièges Shipping / UAT … : shipping.md » (l. 73, remplacée par 2 lignes) git -C "D:/Game/LifePlay-Sandbox-5.8" diff -- Tools/claude/skills/lp-build Tools/claude/skills/lp-validate (EXIT=0, lu en entier) PASS
1b Diff addon DC3 (lot/DC3-atelier, HEAD 1334ac1) idem 3 1, 24 0, 10 0 ; sortie du git diff identique à celle de l'addon 5.8 ligne à ligne (index 2b30942..f489baa, c83c521..8285418, bfefc85..c900333 des deux côtés) git -C "D:/Game/LifePlay-Sandbox" diff -- <mêmes chemins> PASS
2 cmp des 3 fichiers entre les deux addons identiques cmp lp-build/SKILL.md -> 0, cmp lp-build/shipping.md -> 0, cmp lp-validate/SKILL.md -> 0 cmp "LifePlay-Sandbox-5.8/Tools/claude/skills/<f>" "LifePlay-Sandbox/Tools/claude/skills/<f>" PASS
2b Aucun autre fichier de skill modifié 3 fichiers par addon 5.8 : git diff --name-only = 3 skills + LPSandboxModWrappers.cpp (CG, autre session, hors périmètre) ; DC3 : git status --short = 3 M seulement ; git diff --cached vide des deux côtés git -C <addon> status --short ; diff --name-only ; diff --cached --name-only PASS
2c Hachages avant : instantané R0 = HEAD D72868B7, 54472DE3, AB4A0437, FicheStats EDFE8D25 git show HEAD:<f> | md5sum = d72868b7, 54472de3, ab4a0437 ; FicheStats edfe8d25 ; lignes avant : 149, 29, 98 → après 151, 53, 108 (+2, +24, +10 = diff) git show HEAD:<f> | md5sum | cut -c1-8 ; wc -l PASS
3 Exactitude des pièges (B1, B2, B3, V1, V2) voir tableau § 3.1 lectures Read / Grep des sources PASS, réserve E1
4 FicheStats.py --lot U8 --since 2026-10-10T19:00 code 0, 16 fiches EXIT=0, Fiches : 16 ; hors budget : 2 ; jetons lus : 28.3 M ; lignes : U8-INT, U8-T0r, U8-T2r-T5br, U8-T5cr, U8-T7, U8-R3, U8-T2r2-T5br2, U8-T8a, U8-T7b, U8-T5cr2, U8-R4, U8-T8c, U8-T8b, U8-DOC, U8-R5, U8-R6 (16 comptées une à une) cd "D:/Game/LifePlay-master 5.8"; python -I Tools/FicheStats.py --lot U8 --since 2026-10-10T19:00 PASS
5 Non-régression OBP 10 fiches ; STE depuis le 2026-10-11 : 1 (STE-R6) OBP : Fiches : 10 ; hors budget : 0, EXIT_OBP=0 ; STE : Fiches : 1, STE-R6, EXIT_STE=0 python -I Tools/FicheStats.py --lot OBP ; --lot STE --since 2026-10-11 PASS
5b Faux positifs de l'expression U8P-T1 et U8-ADDON-T1 non pris voir § 3.2 : 30 cas, 0 faux positif sur les cas visés python -I -c (regex ancienne et nouvelle, cas en dur) PASS
5c Ancienne contre nouvelle sur toutes les données (sans --since) 10 → 16 avec --since U8 : ancien 17, nouveau 23 ; perdues : U8-T2r, U8-T5c, U8-T5c (mal attribuées, remplacées) ; gagnées : U8-DOC, U8-INT, U8-R3, U8-R4, U8-R5, U8-R6, U8-T2r2-T5br2, U8-T5cr, U8-T5cr2 (17 − 3 + 9 = 23 ✓). OBP : ancien 6, nouveau 10 (gagnées : OBP-R2, R5, R6, R8, sans perte) python -I FicheStats_old.py --lot U8 contre Tools/FicheStats.py, comm des colonnes Fiche PASS
6 Fins de ligne des 4 fichiers LF, CR = 0 git ls-files --eol : i/lf w/lf attr/-text pour les 3 skills (les deux addons) et Tools/FicheStats.py ; tr -cd '\r' | wc -c = 0 pour les 8 fichiers (LF : 151, 53, 108 ; FicheStats 162) git ls-files --eol -- <f> ; tr -cd '\r' < f | wc -c PASS
7 BOM aucun 3 premiers octets 2d2d2d (---), 23206c (# l), 2d2d2d, FicheStats 222222 (""") : aucun efbbbf head -c3 f | od -An -tx1 PASS
8 Syntaxe FicheStats.py — ast.parse : syntax ok ; le script s'exécute (critères 4 et 5) python -I -c "import ast; ast.parse(...)" PASS

3.1 Exactitude des pièges contre leurs sources (ligne par ligne)

Piège Affirmation du skill Source relue Verdict
B1 Target is up to date, 0 action, ni Creating makefile ni Using Visual Studio, exe et .pdb à la date du build précédent U8-T2r2-BUILD.md § 3 : l. 8 Target is up to date, l. 9 « run 0 action(s) », « Absents : Creating makefile, Using Visual Studio », exe et pdb du 10/10/2026 19:58:14 PASS
B1 Critère « code 0 et exe à jour selon UBT, cohérent avec git diff --name-only <commit précédent> HEAD -- Source Config Plugins LifePlay.uproject » ; sortie vide = « up to date » attendu U8-T2r2-BUILD.md § Écarts E1 : git diff --name-only 36d1fa4 4283c13 -- Source Config Plugins LifePlay.uproject = 0 ligne ; U8-EVAL.md § 3.1 (leçon) PASS (généralisation de la commande de E1, même chemins)
B1 « Jamais "exe daté de ce build" : ce critère a arrêté U8-T2r2 sur un succès » U8-T2r2-BUILD.md l. 4 et E1 (critère trop strict, accepté par l'orchestrateur) ; U8-EVAL.md § 3.1 PASS
B1 Ligne ajoutée à SKILL.md § 9 : « aucun code changé → Target is up to date attendu » ; renvoi « SKILL.md § 9 » ## 9. en l. 133 de lp-build/SKILL.md, ligne ajoutée l. 139, avant ## 10. PASS
B2 UeState.ps1 ne suit pas UAT (dotnet … AutomationTool, absent des motifs de UeState.ps1:43) Tools/UeState.ps1:43 : Compilation = "Name='UnrealBuildTool.exe' OR Name='cl.exe' OR (Name='dotnet.exe' AND CommandLine LIKE '%UnrealBuildTool%')" (numéro de ligne exact) ; moteur RunUAT.bat:85 : dotnet %UATExecutable% %* avec UATExecutable=AutomationTool.dll (l. 19) : la ligne de commande ne contient pas UnrealBuildTool ; aucune des 4 familles (l. 42-45) ne nomme AutomationTool PASS (établi par lecture du code)
B2 « -WaitExit peut rendre la main pendant qu'une cuisson, une mise en scène ou un archivage tourne encore » Aucun livrable U8 ne rapporte un retour prématuré observé de -WaitExit pendant un UAT ; seule source : U8-EVAL.md § 4 (« UeState -WaitExit ne voit pas UAT ») et § 5. Une cuisson lance UnrealEditor-Cmd.exe (U8-T3r2-BUILD.md § 2 : Took 149,69s to run UnrealEditor-Cmd.exe), famille Editeur (UeState.ps1:42) : avec -Kind incluant Editeur (défaut : toutes) la cuisson est vue ; restent invisibles la mise en scène, le pak et l'archivage (aucun processus des 4 familles) et les intervalles entre processus fils Réserve E1 : « cuisson » plus fort que la source ; « mise en scène / archivage » plausible mais non observé
B2 Lancer UAT en arrière-plan, attendre la notification de fin, puis lire AutomationTool exiting with ExitCode=<n> et BUILD SUCCESSFUL U8-T3r2-BUILD.md § 2 et U8-T4r2-BUILD.md § 2 : les deux lignes figurent dans les journaux. Mais T3r2 et T4r2 ont été lancés au premier plan (§ 1 des deux) et n'ont pas utilisé UeState ; la pratique « attente bornée puis notification » vient de U8-T5b-BUILD.md l. 64, non citée par le skill PASS pour les lignes de journal ; la recommandation « arrière-plan » est sourcée par T5b, pas par T3r2 / T4r2 (rattaché à E1)
B3 Depuis pwsh : cmd.exe /c "<fichier.cmd>" U8-T8c-BUILD.md § 1 : « Staging (depuis PowerShell 7) : cmd.exe /c "…make_game_v2_0.cmd" » et Écarts 1 (relancé par cmd.exe /c depuis PowerShell 7 : stage code=0) PASS
B3 Depuis un agent sous Git Bash : pwsh -NoProfile -Command "& cmd /c '<fichier.cmd>'" (forme des fiches U8-T3r2 à U8-T5br2) U8-T3r2-BUILD.md § 1, U8-T4r2-BUILD.md § 1, U8-T5br2-BUILD.md l. 17 : forme pwsh -NoProfile -Command "& cmd /c '…cmd'" identique PASS
B3 Depuis Git Bash, cmd /c "<fichier.cmd>" n'exécute rien : bannière, code 0 trompeur, aucun dossier de staging créé U8-T8c-BUILD.md Écarts 1 : « cmd a ouvert sa bannière sans exécuter le fichier (sortie code=0 trompeuse). Vérifié par Test-Path : aucun dossier de staging créé » PASS
B3 Cause « estimée : /c converti par MSYS » ; renvoi à sk-windows-shell (cmd //c) Cause absente des livrables U8 (T8c ne donne pas de cause) : marquée « estimée » dans le skill et dans l'IMPL § 2 écart 3, donc non présentée comme établie ; sk-windows-shell/SKILL.md l. 11 : « cmd //c depuis Git Bash » (cohérent) PASS (estimé, annoncé comme tel)
B3 « Toujours vérifier le produit attendu (Test-Path), pas seulement le code » U8-T8c-BUILD.md Écarts 1 (méthode employée) PASS
V1 Un Shipping sans -UserDir écrit dans %LOCALAPPDATA%\LifePlay\Saved (lp-build § 4) lp-build/SKILL.md l. 71-72 (« Saved va dans %LOCALAPPDATA%\LifePlay\Saved… -UserDir », source U8-T5a) PASS
V1 Un Development empaqueté écrit dans son propre Saved U8-T5cr-VAL.md l. 14 : journal à …\LifePlay_Build_5.8_Development_U8r_essai\Windows\LifePlay\Saved\Logs\LifePlay.log (source non citée par le skill, mais existante) PASS
V1 Empreinte avant ET après la fermeture du dernier jeu ; relevé « inchangé » pris après, jamais au lancement ; tout Shipping par son .bat (-UserDir) U8-EVAL.md § 3.4 (leçons : relever après chaque session, insister sur le .bat) ; U8-T5ar2-VAL.md l. 23 : « 73 → 74 fichiers, 22 006 958 → 22 009 399 o » (fichiers, octets, heures d'écriture : mêmes grandeurs que le skill) PASS
V1 Incident : caches, LPKeyboard.ini, GameUserSettings.ini réécrits pendant T6 (20:37-20:48), relevé « inchangé » pris à 20:33 U8-T5ar2-VAL.md l. 23-27 (20:37 caches + LPKeyboard.ini ; 20:48 GameUserSettings.ini) ; U8-T6-VAL.md l. 29 (« date de 20:33 ») ; U8-EVAL.md § 3.4. Le skill n'affirme pas la cause (celle-ci est « estimée » à la source) PASS
V2 Test A/B : vérifier que le réglage existe dans les deux builds avant de solliciter l'utilisateur U8-EVAL.md § 3.3 ; U8-T6-VAL.md l. 10-11 (« la V1.5 n'offre pas le réglage Effects en jeu ») PASS
V2 « U8-T6 annulée : la V1.5 n'a pas le réglage Effects, une session de jeu perdue » U8-T6-VAL.md l. 9 (ANNULÉE, décision utilisateur) et l. 10-11 ; « une session de jeu » : U8-EVAL.md § 3.3 (« a coûté une session de jeu ») ; le skill cite les deux PASS

3.2 Test de l'expression (python -I -c, 30 cas ; extrait établi)

Lot Chaîne Nouvelle Ancienne
U8 U8P-T1 aucune aucune
U8 Fiche U8P-T1v aucune aucune
U8 U8-ADDON-T1 aucune aucune
U8 XU8-T1 (lookbehind) aucune aucune
U8 U8-T5cr2 U8-T5cr2 U8-T5c
U8 U8-T2r2-T5br2 U8-T2r2-T5br2 U8-T2r
U8 U8-R6 / U8-R12 U8-R6 / U8-R12 aucune
U8 U8-R6x / U8-R12x aucune aucune
U8 U8-DOC / U8-DOCS U8-DOC / aucune aucune
U8 U8-INTRO / U8-VALUE aucune / aucune aucune
U8 U8-TACHES.md aucune aucune
U8 U8-EVAL.md U8-EVAL aucune (voir E3)
U8 U8-T0m, U8-T10, U8-T1-CART, U8-VAL inchangés inchangés
U8 u8-t1, U8-, U8-T aucune aucune
OBP OBP-T2v, OBP-T1d / OBP-R8 inchangés / OBP-R8 idem / aucune
STE STE-R6 / STE-H4 STE-R6 / aucune aucune / aucune

4. Diff lu en entier

  • Addon D:\Game\LifePlay-Sandbox-5.8 : 3 fichiers, 3+24+10 = 37 lignes ajoutées, 1 supprimée (le renvoi l. 73). Hunks lus : lp-build/SKILL.md (§ 4 renvoi allongé, § 9 +1 ligne), lp-build/shipping.md (+24 en fin : 3 sections B1, B2, B3), lp-validate/SKILL.md (§ 5, +10 : 2 puces V1 et V2).
  • Addon D:\Game\LifePlay-Sandbox : même diff (index blob identiques, cmp = 0).
  • Jeu D:\Game\LifePlay-master 5.8, Tools/FicheStats.py : 6+ / 2− ; 2 suppressions = la ligne de docstring complétée et l'ancienne FICHE_RE ; ajouts = 2 lignes de commentaire, nouvelle FICHE_RE, ligne de docstring (400 premiers caractères : décrit prompt[:400] de la l. 126, code non modifié). Aucun autre changement de logique.
  • Entrées du dépôt jeu non liées (BOSS-JOURNAL.md, STE-*, dossiers ARCH427, CAM, EVAL) : autres sessions, non comptées.

5. Verdict

PASS : diffs conformes (ajouts seuls hors la ligne de renvoi), addons identiques au cmp, FicheStats.py rejoué (16 / 10 / 1 fiches, code 0), fins de ligne LF sans BOM, aucun autre fichier de skill modifié. Réserve E1 (formulation B2) et écarts de forme E2 à E4 non bloquants.

6. Points à confirmer par l'utilisateur / l'orchestrateur (cases)

  • E1 : accepter la formulation B2 telle quelle, ou la resserrer (voir écart) avant le ticket U8P-R1 / R2.
  • E2 : accepter les écarts de gabarit de l'IMPL ou demander une reprise de forme (aucune incidence sur les fichiers de skill).
  • E3 : accepter que U8-EVAL (et U8-CART, U8-SPEC…) soit reconnu par la recherche de repli dans les 400 premiers caractères d'un prompt qui ne commence pas par « Fiche ».

Écarts numérotés

  1. E1 (réserve, piège B2, lp-build/shipping.md section « Fin d'UAT ») : « -WaitExit peut rendre la main pendant qu'une cuisson, une mise en scène ou un archivage tourne encore » est plus fort que la source. Établi : UAT (dotnet AutomationTool.dll) n'est dans aucune famille de UeState.ps1 l. 42-45. Non établi : retour prématuré observé (aucun livrable U8 ne l'a consigné ; seule U8-EVAL.md § 4-5 le dit en une phrase). La cuisson, elle, lance UnrealEditor-Cmd.exe (famille Editeur, UeState.ps1:42) et est donc vue si -Kind inclut Editeur. En outre les fiches citées (T3r2, T4r2) ont attendu UAT au premier plan ; la pratique « arrière-plan puis notification » est sourcée par U8-T5b-BUILD.md l. 64. Proposition (non appliquée, rôle validateur) : écrire « ne voit pas UAT : la mise en scène, le pak et l'archivage ne sont portés par aucun processus des familles de UeState » et citer T5b.
  2. E2 (forme de l'IMPL, gabarit lp-doc) : U8P-T1-IMPL.md ne suit pas l'ordre des sections IMPL : le gabarit prévoit 1 Fichiers, 2 Écarts à la SPEC, 3 Instantané, 4 Ce qui n'a pas été fait, 5 Points à confirmer, 6 Fichiers à commiter ; l'IMPL insère un § 4 « Preuves rejouées » (non prévu) qui décale « Ce qui n'a pas été fait » en § 5, « Points à confirmer » en § 6 et « Fichiers à commiter » en § 7 (aucune section absente). La tête n'a ni « Agent » ni « Skills » (gabarit : … — Agent <a> — Skills <liste>), le titre # U8P-T1-IMPL précède la ligne « Fiche » (gabarit : l'inverse) et n'a ni date ni sous-titre, et la dernière ligne Tours : … manque. Aucune annonce Hors gabarit.
  3. E3 (observation sur FicheStats.py, non bloquante) : la nouvelle alternance (?:VAL|DOC|INT|EVAL|CART|SPEC|IMPL|BUILD|STATS) fait reconnaître, en repli (prompt ne commençant pas par « Fiche »), un nom de fichier cité dans les 400 premiers caractères (cas établi : U8-EVAL.md donne U8-EVAL, ancienne expression : aucune). Aucun faux positif observé sur les données réelles (comparaison § 3 critère 5c : 0 fiche inattendue). Aussi : la docstring (ligne 5) dépasse la largeur des autres lignes (cosmétique) ; les identifiants STE-H4, STE-H7… (fiches non suivies présentes dans le dépôt) ne sont pas reconnus, hors périmètre de la fiche.
  4. E4 (registre) : U8P-TACHES.md indique U8P-T1 « à faire » alors que U8P-T1-IMPL.md existe (mise à jour de l'orchestrateur à venir).
  5. Remarque de cohérence (non écart) : lp-build/SKILL.md l. 66 dit encore « Cuisson DLC et version de référence : toujours via cmd /c ou un .cmd » ; le piège B3 de shipping.md précise que cmd /c depuis Git Bash n'exécute rien. Les deux textes ne se contredisent pas (le second restreint le premier à pwsh), mais aucun renvoi croisé n'existe en l. 66. Écart déjà annoncé par l'IMPL (§ 2 écart 2) : lp-build/SKILL.md passe de 149 à 151 lignes (cible OBP de 120 dépassée avant l'IMPL).
  6. Fichiers non commités présents dans l'addon 5.8 mais hors IMPL : Plugins/LPSandbox/Source/LPSandbox/LPSandboxModWrappers.cpp (M), Docs/CG/, Plugins/LPSandbox/Modules/Mods/lps_chargen/, LPSandboxCharGenMod.* (CG, autre session) et des dossiers de skills non suivis (sk-*, debug-verification, ue-cpp-build, synced, Tools/claude/agents/) : non comptés, non touchés. Le ticket addon doit lister les 3 chemins du lot, pas git add -A.

Ce qui n'a pas été rejoué

  • Aucune compilation, ni LPTestStringCompat, ni éditeur : sans objet (skills et script Python seulement).
  • Le comportement de UeState.ps1 -WaitExit pendant un UAT réel n'a pas été rejoué (aucun UAT disponible ; le contrôle B2 est statique : lecture de UeState.ps1 et de RunUAT.bat). PASS-STATIC pour ce point.
  • Les journaux de sous-agents bruts (~/.claude/projects/…/subagents/*.jsonl) n'ont pas été relus au-delà de ce que mesure FicheStats.py ; la détection de U8-T0m (introuvable, signalée par l'IMPL § 5) n'a pas été recherchée.
  • Les citations « lot U8P » des skills renvoient à ce lot : leur existence est vérifiée (U8P-TACHES.md), pas leur commit.

Commandes jouées (sortie brute résumée ci-dessus)

  • git -C "D:/Game/LifePlay-Sandbox-5.8" diff -- Tools/claude/skills/lp-build Tools/claude/skills/lp-validate → EXIT=0 ; idem D:/Game/LifePlay-Sandbox → EXIT=0.
  • git -C <addon> status --short / diff --numstat / diff --cached --name-only / branch --show-current / rev-parse --short HEAD (5.8 : ue5.8 9227db8 ; DC3 : lot/DC3-atelier 1334ac1).
  • git -C "D:/Game/LifePlay-master 5.8" diff -- Tools/FicheStats.py (lu en entier) ; python -I Tools/FicheStats.py --lot U8 --since 2026-10-10T19:00 (EXIT=0) ; --lot OBP (EXIT_OBP=0) ; --lot STE --since 2026-10-11 (EXIT_STE=0).
  • git ls-files --eol, tr -cd '\r' < f | wc -c, head -c3 f | od -An -tx1, md5sum, wc -l.

Fichiers à commiter

A Docs/Migration/etat/U58/U8P/U8P-T1-VAL.md

Tours : 17 / 40