# DC2-VAL — Validation automatique du lot DC2 (DC2-T3) **Fiche DC2-T3 — Modèle prévu sonnet | utilisé sonnet** - Date : 2026-10-07. Build testé : celui de `DC2-BUILD.md` (code 0, non recompilé). Lot DC2 : commandlets de mods (LPAnimEval, LPAnimTwist, LPAnimCatalog, LPAnimIdentify, LPHairFromStaticMesh) déplacés dans le module éditeur `LPModTools` de l'addon. - Journaux copiés dans `D:\Game\LifePlay_Backup_5.5\DC2-VAL\` : `E1_*_console.txt`, `E2_*_console.txt`, `E2_*_result.txt`, `E2_*_sandbox.log`, `E3_console.txt` + `E3_out\`, `DC2_LPAnimTwist_*.log/.txt`, `E4_*_console.txt`, `DC2_LPAnimCatalog_*.log`, `DC2_LPHairFromStaticMesh_*.log`, `E5a_console.txt`, `DC2_LPAnimEval_20261007-190750.log`, `E5b_game_noaddon.log`, `AP7_LPAnim*.log` (le dossier contient aussi d'anciens `AP7_*` copiés par un joker trop large ; seuls les `AP7_LPAnimIdentify_20261007-183742/183801` et `AP7_LPAnimEval_20261007-183828/185814` sont de cette validation). - Méthode : celle de `DC1-VAL.md` / `SB4-VAL.md`, tournées par `AnimPipeline.ps1` (pwsh 7), aucun éditeur avant chaque lancement. Aucune commande git hors `status`, aucun source/script/ini modifié, aucune recompilation. ## Tableau des essais | Essai | Attendu | Constaté (lignes recopiées) | Verdict | |---|---|---|---| | E1 quaternius `-From 2 -To 2` | code 0, verdict ok, fichiers = réf | code 0, 14 s. `[ok] identification.json valide : profil ue4_mannequin, methode ue4`, `verdict : ok (14 s)`. Journal : `LogLPAnimMeasure: PATHS racine addon D:/Game/LifePlay-Sandbox`. `identification.json` SHA-256 identique à SB2-REF (310CCE61A3B7). `etapes\2_identification.json` : SHA différent (0AF3F335AAB3 réf / BF81B7520808 nouveau), JSON égal une fois `debut`/`fin`/`duree_s` ignorés. | PASS | | E1 freeanims | idem | code 0, 13 s. `profil ue5_mannequin, methode ue5`, `verdict : ok`. `identification.json` identique à la réf (557013ADCB21). `etapes\2_identification.json` : SHA différent (E282521BBA35 / 345D5EBB5A56), JSON égal hors dates. | PASS | | E2 quaternius `-From 5 -To 5` | code 0, `avertissement`, 8 avertissements, 44 fichiers | code 0, 1136 s, `verdict : avertissement (1136 s)`. Journal éditeur : `LogLPAnimMeasure: PATHS racine addon D:/Game/LifePlay-Sandbox` ; `TOURNEE debut 43 clips, 129 etapes` ; `Ouvert : lps_asset_integration (declencheur, non memorise)` ; `TOURNEE debut 43 clips, 2080 etapes` ; `TOURNEE fermeture demandee`. `Open=lps_couple` avant et après. Comparaison : voir ci-dessous. | PASS | | E2 freeanims | code 0, `ok`, 0 avertissement, 73 fichiers | code 0, 435 s, `verdict : ok (435 s)`. Journal : `PATHS racine addon D:/Game/LifePlay-Sandbox` ; `TOURNEE debut 10 clips, 30 etapes` ; `Ouvert : lps_asset_integration (declencheur, non memorise)` ; `TOURNEE debut 10 clips, 697 etapes` ; `TOURNEE fermeture demandee`. `Open=lps_couple` après. | PASS | | E3 LPAnimTwist à blanc | code 0, rapport valide | Arguments reconstitués avec certitude depuis les commandes journalisées par le pilote (`etapes\5_evaluation.json`, ligne LPAnimTwist) : `-Methode=ue4 -ClipDir=/Game/Quaternius/UAL -RefClip=A_TPose -BodyClipDir=/Game/Quaternius/UAL -Templates=Bridget:/Game/Heavy/Daz/Anims/Idle_F_Daz,Michael:/Game/Heavy/Daz/Anims/idle_Daz -Bodies=Bridget:B_,Michael:M_ -Out=...` + `-DryRun`. **Écart volontaire** : `-Out` pointé vers `D:/Game/LifePlay_Backup_5.5/DC2-VAL/E3_out` (le commandlet écrit `rapport_torsion.json` même à blanc ; cela aurait écrasé un fichier de résultat comparé à la réf). Code 0, 23 s. `LogLPAnimTwist: Display: TORSION Bridget profil genesis8 : 6 paires Bend / Twist` ; lignes `TORSION B_Walk_Loop 41 cles, torsion deplacee 0.0 deg, conservation 0.00000 deg 0.00000 cm (essai)` ; `TORSION resultat VALIDE : 0 echec(s)` ; `rapport_torsion.json` : `essai_a_blanc=true`, `valide=true`. Journal : `PATHS racine addon D:/Game/LifePlay-Sandbox`. `Saved\AnimPipeline\quaternius\rapport_torsion.json` inchangé (SHA D7A3BF92E174 = réf). | PASS | | E4 LPAnimCatalog (`-DryRun` seul) | trouvé (pas « introuvable ») | `LogInit: Executing Class /Script/LPModTools.LPAnimCatalogCommandlet`. Code 0 : **pas d'erreur d'argument** — le commandlet a des valeurs par défaut (pack quaternius) et a écrit `LogLPAnimCatalog: Warning: CATALOGUE fiches 42 echecs 0 -> .../Saved/AnimPipeline/quaternius/fiches_calculees.json` (voir anomalie 1). Aucun asset UE écrit. | PASS (trouvé) — écriture signalée | | E4 LPHairFromStaticMesh (`-DryRun` seul) | trouvé, erreur d'argument | `LogInit: Executing Class /Script/LPModTools.LPHairFromStaticMeshCommandlet` puis `LogLPHairFromStatic: Error: Usage : -Static= -FitHead= -Out= [-Body=] [-RefHair=] [-Bone=head] [-Scale=] [-OffsetZ=] [-OffsetY=] [-DryRun]`, `result 1`. Aucune écriture. | PASS | | E5a jeu sans addon, `LPAnimEval` | commandlet introuvable | Code 1 : `LogInit: Error: LPAnimEvalCommandlet looked like a commandlet, but we could not find the class.` | PASS | | E5b jeu `-game` sans addon (120 s) | LPAnimCore monté, LPSandbox absent, carte chargée | `LogPluginManager: Mounting Project plugin McpAutomationBridge` / `LPAnimCore` / `ModdingExtra` / `StreetMap` (aucune ligne LPSandbox ; aucune ligne `AdditionalPluginDirectory` ni refus d'aucune sorte dans ce journal ; le projet reste lancé sans message d'erreur, `LifePlay.uproject` référence toujours le plugin LPSandbox et le répertoire `../LifePlay-Sandbox/Plugins`). `LogLoad: LoadMap: /Game/Scenes/CentralLondon?Name=Player` puis `Took 0.790986 seconds to LoadMap(/Game/Scenes/CentralLondon)`. Seul `Error` : `LogPlayerController: Error: InputMode:UIOnly - Attempting to focus Non-Focusable widget SObjectWidget [Widget.cpp(968)]!` (UI du menu, voir anomalie 3). Aucun Fatal/Ensure. Pas de ligne `Coiffures : ... introuvable` (l'Error Coiffures connu est propre à la sandbox ; ici : `Coiffures : base 126 entree(s) ... table de 126 entree(s), 89 morph(s)`). Processus arrêté (`Stop-Process`). | PASS | | E6 état final | ini standard, 0 éditeur, addon en place | `Saved\sandbox_mods.ini` : `Open=lps_couple` (3 modules activés, ordre standard) ; 0 `UnrealEditor` ; `Test-Path D:\Game\LifePlay-Sandbox\Plugins\LPSandbox\LPSandbox.uplugin` = True ; `LifePlay-Sandbox.__DC2_absent` n'existe plus. | PASS | ## Détail E2 : comparaison complète contre `SB2-REF\\` Règle DC1-VAL/SB4-VAL : SHA-256 de chaque fichier commun ; exclus : `etapes\5_evaluation.json` (JSON sur verdict + avertissements), `etat.json`, ligne « Généré le » de `rapport.html`, images freeanims (les 20 connues). Le dossier `precedent_*` est inclus dans le décompte (comme aux lots précédents). ### quaternius : 44 fichiers comparés (liste 44 / 44 identique) - 40 fichiers au SHA-256 identique. Seuls différents : `etat.json` (`fin`/`maj` uniquement), `rapport.html` (seule ligne : « Généré le » 07/10/2026 12:10:18 → 18:38:49), `etapes\5_evaluation.json` (verdict `avertissement` des deux côtés ; 8 avertissements, listes égales en JSON ; durée 1136 s = 1136 s) et `etapes\2_identification.json` (réécrit par E1, dates seules). - Tous les `.json`/`.csv`/`.txt` de données (`rapport.json`, `eval_*.csv`, `controles_*.csv`, `retarget_pose_*.txt`, `rapport_torsion.json`, `fiches_calculees.json`...) identiques. ### freeanims : 73 fichiers comparés (liste 73 / 73 identique) - 49 fichiers identiques. 24 différents : les 4 fichiers exclus ci-dessus (`etat.json`, `rapport.html` « Généré le » 12:31:18 → 18:58:36, `etapes\5_evaluation.json` : verdict `ok`, 0 avertissement des deux côtés, durée 435 s = 435 s, `etapes\2_identification.json` dates) et **20 images**, exactement les 20 connues (10 planches `.jpg` + 10 vignettes `.png` : AirKiss, AttackInLevitation2, ChillDriving, ComboHands, EatingOnParty, FlyingUp, GoForward, Rest, RightLegKick2, Talk), écarts de taille inférieurs à 0,3 % (ex. AS_AirKiss.png 261470 → 261276 ; AS_Talk.png 260083 → 259267). - 73 − 4 − 20 = 49 fichiers de données identiques. ## Anomalies 1. **E4 LPAnimCatalog sans argument n'échoue pas** : le commandlet a des valeurs par défaut (pack quaternius) et, même avec `-DryRun` (qui ne concerne pas ce commandlet), il a réécrit `Saved\AnimPipeline\quaternius\fiches_calculees.json` (fichier de résultat, pas un asset UE). Seule différence avec la réf : chemin `livraison` en absolu au lieu de relatif (`D:/Game/...` vs `../../../../../../LifePlay-master 5.5/...`). J'ai restauré le fichier par copie depuis `SB2-REF\quaternius\fiches_calculees.json` (il était identique à la réf juste avant E4, cf. E2) ; SHA vérifié après copie (5DBBA632FAF3). Comportement hérité du commandlet d'origine, non lié au déplacement (le code est identique octet pour octet). 2. E3 : `-Out` redirigé hors de `Saved\AnimPipeline` (voir tableau) ; les 204 avertissements du résumé RunCommandlet sont les lignes `TORSION` journalisées en Warning/Display, pas des erreurs. 3. E5b : `LogPlayerController: Error: InputMode:UIOnly...` : non rencontré dans les journaux de la sandbox (autre scène), vraisemblablement propre au menu du jeu ; non analysé plus avant (hors périmètre DC2). Pas de ligne `AdditionalPluginDirectory ... not found` dans le journal `-game` (contrairement au journal de build DC2-BUILD) : l'absence de l'addon est silencieuse au runtime. 4. E5a et E5b ont été lancés dans deux séquences de renommage distinctes (l'addon avait été remis en place entre les deux par le `finally`, puis renommé de nouveau pour E5b) ; vérification `Test-Path ...LPSandbox.uplugin` = True après chacune. 5. Les chemins `Tools/anim` : l'addon n'a pas de `Tools\anim` (Test-Path = False) ; les commandlets (Identify lit `profiles`, Eval/Twist lisent `methodes`) ont fonctionné en repli sur le jeu. Le journal ne trace que `PATHS racine addon D:/Game/LifePlay-Sandbox`, pas le dossier `Tools/anim` retenu ; le repli est prouvé indirectement par le succès de E1/E2/E3 et l'identité des résultats. 6. Éditeur plantant à la fermeture : non observé. ## État final (E6) - `Saved\sandbox_mods.ini` : `[Mods] Order=lps_couple,lps_interaction,lps_asset_integration`, `Open=lps_couple`, `[Enabled]` les trois à `true`. - `UnrealEditor` : 0 processus. - `git -C D:\Game\LifePlay-Sandbox status --short` (changements DC2 non commités, attendu) : ``` M Plugins/LPSandbox/LPSandbox.uplugin M Plugins/LPSandbox/Source/LPAnimMeasure/LPAnimMeasure.Build.cs M Plugins/LPSandbox/Source/LPAnimMeasure/LPPoseMeasure.cpp M Plugins/LPSandbox/Source/LPAnimMeasure/LPSkeletonProfile.cpp M Plugins/LPSandbox/Source/LPSandbox/LPSandboxConfig.cpp ?? Plugins/LPSandbox/Source/LPAnimMeasure/LPAnimMeasurePaths.cpp ?? Plugins/LPSandbox/Source/LPAnimMeasure/LPAnimMeasurePaths.h ?? Plugins/LPSandbox/Source/LPModTools/ ``` - Addon en place : `LifePlay-Sandbox.__DC2_absent` absent, `LPSandbox.uplugin` présent. ## Verdict **PASS** (partie automatique) : E1 (identification identique à la réf), E2 (quaternius `avertissement` 8 avertissements, 44 fichiers ; freeanims `ok`, 73 fichiers ; données identiques, seules différences dates, « Généré le » et les 20 images non déterministes ; `Open=lps_couple` préservé), E3 (LPAnimTwist valide à blanc), E4 (les deux commandlets sont trouvés dans `/Script/LPModTools`), E5 ((a) introuvable sans addon ; (b) LPAnimCore monté, LPSandbox absent, carte CentralLondon chargée), E6 (addon en place). Le nouveau code tourne (`PATHS racine addon` dans tous les journaux d'éditeur testés). Point à noter pour l'utilisateur : anomalie 1 (LPAnimCatalog écrit `fiches_calculees.json` sans argument, fichier restauré). ## Modèles par fiche | Fiche | Modèle prévu | Modèle utilisé | |---|---|---| | DC2-T1 | opus | opus | | DC2-T2 | haiku | haiku | | DC2-T3 | sonnet | sonnet |