Fiche U7-VAL — Niveau N1 — Modèle prévu lp-validator | utilisé Sonnet 5.5 (lp-validator) — Agent lp-validator — Skills lp-validate, sk-recount, sk-protocol, debug-verification # U7-VAL — validation du lot U7 (mods sous UE 5.8), 2026-10-09 Copie 5.8 `D:\Game\LifePlay-master 5.8` (branche `ue5.8`, tag `U7-avant` = `cb79c24`), addon `D:\Game\LifePlay-Sandbox-5.8` (branche `ue5.8`). Aucun fichier de code, de config ni de doc validée modifié ; pas de commit ; jeu non lancé ; éditeur fermé (tasklist vide) avant V3/V4. ## Verdict global : PASS, avec 1 écart à trancher (E1) et 3 réserves de preuve (R1 à R3) | Contrôle | Verdict | Preuve principale | |---|---|---| | V1 diff code | PASS (écart E1 à décider) | 9 fichiers modifiés + `LPModGuard.{h,cpp}`, lus en entier | | V2 fins de ligne / BOM | PASS | 9 modifiés identiques à `U7-avant`, aucun BOM | | V3 recompte des builds | PASS | 3 journaux rejoués par `-FromLog` : 0 / 0 | | V4 `LPTestStringCompat` | PASS | `=== 3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60 ===`, code 0 | | V5 preuves des essais | PASS-STATIC pour T9/P10 visuels et T6 (R1 à R3) ; PASS pour le reste | greps ci-dessous | | V6 addon + archives + Releases | PASS | zips, `.utoc` SHA-256 identiques | | V7 `Mods\` vide, pas de parasite | PASS | `ls -A Mods` vide ; `git status` des deux dépôts | ## V1 — diff code (`git -C "D:/Game/LifePlay-master 5.8" diff U7-avant -- Source Config` + fichiers non suivis) `--stat` : 9 fichiers, 441 insertions, 64 suppressions (recompté : `git diff U7-avant --stat | tail -1`). Non suivis : `LPModGuard.h` (79 lignes), `LPModGuard.cpp` (525), docs `29_*`, `30_*` (docs de projet, hors code). Conformité aux décisions du SUIVI (établi, par lecture) : - Garde à 3 contrôles : `ELPModCheck {Engine, MinVersion, MaxVersion}` (`LPModGuard.h:31`) ; moteur = version d'en-tête de conteneur (`LPModGuard.cpp:128-154`) + `AssetRegistry.bin` (`:158-171`) + `EngineVersion` du `.uplugin` (`:339-357`) ; min `2026.10.2.0` (`:31`, `:375`) ; max = `ProjectVersion` (`:240`, `:381`). - Démontage au `StartupModule` : `LifePlay.cpp` (`FLifePlayGameModule::StartupModule` → `FLPModGuard::Run()`), démontage `UnloadPlugin` (`LPModGuard.cpp:174-218`, appelé `:458`), seulement jeu cuit (`:437`). - 3 cases Misc : `LPModInfoSubsystem.cpp` (`EnsureSettingsRows`, noms `LPModCheck*`) + classement Misc `LPSettingsSubsystem.cpp:176-180`. - Motif moteur seul affiché : `LPModGuard.cpp:392-406` (min/max suffixés « (secondaire) » au journal seulement). - Mod sans `MODULE_GAME_VERSION` : chargé + Warning (`:360-362`). - Marquage gestionnaire : `MarkRefusedRow` (suffixe « (not loaded) », teinte, infobulle, `ModEnabledBox` désactivée) ; seule la case est désactivée, pas le bouton du nom (conforme : pas de « bouton du nom bloqué »). - C1 + C2 coiffures : `LPHairstyleSubsystem.cpp` (étapes 0 et 3 de `Sync`, `HairModules` + `EnabledSignature`). Pas de C3 (aucun changement d'ordre d'affichage) : conforme. - `DefaultGame.ini` : seule ligne `ProjectVersion=2026.10.2.0` (version de référence décidée). - Hors périmètre : rien trouvé. Code de débogage / TODO / `LogTemp` / `AddOnScreenDebugMessage` : grep sur le diff et sur `LPModGuard.*` = 0. Suppression de `FieldText`/`IsModuleEnabled` de `LPModInfoSubsystem` : remplacés par `FLPModGuard`, aucun appel restant (compilation 0 erreur). **E1 (à décider par l'orchestrateur/utilisateur, non bloquant)** : la décision « PAS de libellé Unreal 5.5/5.8 » est respectée pour le motif de refus (« format 4, game 5 » conservé), mais deux textes affichent encore une version d'Unreal : le corps de la fenêtre, `LPModInfoSubsystem.cpp` (« This game is LifePlay %s (Unreal Engine %d.%d) », décrit aussi dans `U7-T7-IMPL.md:225`), et le motif construit à partir de `EngineVersion` du `.uplugin` (`LPModGuard.cpp:353`, « Unreal Engine %s, game %d.%d »). Si la décision visait tout affichage de version d'Unreal, ces deux chaînes y contreviennent ; si elle visait seulement la traduction conteneur→version, elles sont conformes. ## V2 — fins de ligne et encodage Commande : script Python comparant `git show U7-avant:` et le fichier de travail (CRLF, LF seul, BOM). - `DefaultGame.ini` LF 81/81 ; `LPHairstyleSubsystem.cpp/.h`, `LPModDailies.cpp/.h`, `LPModInfoSubsystem.cpp/.h`, `LifePlay.cpp` : LF avant et après (CRLF = 0) ; `LPSettingsSubsystem.cpp` : CRLF avant (830) et après (835), LF seul = 0. Aucun BOM nulle part. Nouveaux fichiers `LPModGuard.*` : LF, CRLF = 0, sans BOM (cohérent avec la majorité LF du dossier). - Addon : `BuildMod.ps1` LF 326 → 338, CRLF 0 des deux côtés. ## V3 — recompte des builds (`Tools\Build.ps1 -Lot U7-VAL -FromLog `) | Journal | Livrable | Recompté | Unités | MSVC | |---|---|---|---|---| | `U7_Build_20261009-101701.log` (éditeur, T13a) | 0/0 | erreurs 0, avertissements 0, autres 0 ; `Result: Succeeded` | 2 (`LPHairstyleSubsystem.cpp`, `Module.LifePlay.cpp`), DLL `UnrealEditor-LifePlay.dll` | `14.50.35717` | | `U7_Build_20261009-101759.log` (jeu, T13b) | 0/0 | 0/0/0 ; `Result: Succeeded` | 2 | `14.50.35717` | | `U7_Build_20261009-103224.log` (Shipping, T14) | 0/0, 12 unités | 0/0/0 ; 12 unités (compile `LPModGuard`, `LPModInfoSubsystem`, `LPSettingsSubsystem`, `LPModDailies`, `LifePlay`, `LPHairstyleSubsystem`) | 12 | `14.50.35717` | Contrôle croisé : `grep -ciE "warning C|error C|error LNK"` = 0 sur les trois. Les sources modifiées (dernière : `LPHairstyleSubsystem.h`, 10:13) précèdent les builds (10:17 et 10:32). Cuisson Development (`BuildDebug_Development_20261009-101900.log`) et Shipping (`U7-T14_UAT_20261009-103453.log`) : `Success - 0 error(s), 1 warning(s)`, `BUILD SUCCESSFUL`, `ExitCode=0` ; l'unique avertissement est `LogCook: Warning: ... LegacyIterative is required ...` (ligne 189 des deux). Le « code=-1 » du résumé `-FromLog` est le comportement normal de rejeu (journal existant). ## V4 — `LPTestStringCompat` `.\Tools\RunCommandlet.ps1 -Lot U7-VAL -Commandlet LPTestStringCompat` : code 0, 16 s. Journal `Saved\Logs\portage\U7-VAL_LPTestStringCompat_20261009-123419.log:1774` : `=== 3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60 ===` (référence 3120 / 0 / 60 : identique). Les « 2 avertissements » du résumé sont cette ligne elle-même (émise en niveau Warning, deux fois). Résumé : `Docs\Migration\etat\U7-VAL_LPTestStringCompat_20261009-123419.txt` (dossier `etat\` de la copie 5.8, non suivi par git). ## V5 — preuves des essais (`etat\U58\U7\`) | Essai | Dossier / ligne retrouvée | Verdict | |---|---|---| | T4 (quaternius 5.5 dans jeu 5.8, plantage) | `T4\T4_LifePlay.log:6248,6278` `Fatal error ... ContainerHelpers.cpp`, `FZenPackageHeader::MakeView` ; `T4_LifePlay_run1.log` idem ; 2 dossiers `Crashes` | établi | | T4 rejoué (refus moteur, pas de plantage) | `T7\LifePlay-backup-2026.10.09-06.17.59.log:811,815` « refuse : moteur : conteneur 4 (jeu 5), registre 17 (jeu 24) » + « non charge : 1 pak(s) demonte(s) sur 1 ... » ; log poursuivi jusqu'à `:6203` | établi | | Cases moteur levé → refus par min | `T7\...06.22.03.log:811-816` | établi | | Moteur + min levés → chargé → plantage | `T7\LifePlay.log:813` « charge malgre » ; `T7\Crashes` (1 dossier) | établi | | P10 (Pocolov refusé, Continuer) | `P10\5.8\LifePlay.log:827,831,885,888` (refus, mod ignoré par `ScanFiles`, table 126, 0 ajoutée) ; 0 `Fatal`/`appError` ; sauvegarde `P10\5.5\Player.lpcharacter:17` porte `Pocolov17` ; log 5.5 charge Pocolov | établi pour le refus et l'absence de plantage ; « coiffure absente » et « absente de l'éditeur » : visuel (R1) | | T9 (gestionnaire « (not loaded) ») | `T9\LifePlay.log:6248` et `T11\LifePlay_U7c_GM.log:6248` « gestionnaire, 1 mod(s) refuse(s) marque(s) » | établi pour le marquage ; teinte, case grisée, marquage conservé après ▲/▼ : visuel (R1) | | T11/T12 (C2) | `T11\LifePlay_U7d_T12_C2_ok.log` : 0 « reconstruction », 0 occurrence de `UpdateDefaultHair` ; (78 « Accessed None » au total sont d'autres Blueprints, p. ex. `MainMenu_C`, ils ne concernent pas `UpdateDefaultHair`) ; avant : `LifePlay_U7c_T11_sans_mod.log:6218` « reconstruction » | établi | | T1/T2 (3 mods acceptés, 104 clips, 138 coiffures) | `T2-T6\LifePlay.log:839-841` accepte ×3 (conteneur 5, registre 24, 5.8.3) ; `:916-917,6231` 20 + 84 clips, « 104 clip(s) ajoute(s) ... (138 au total) » ; `:910` table de 138 ; aucun Warning `Modules :` | établi | | C1 | `T2-T6\LifePlay.log:7611` « 88 maillage(s) conserve(s) a la reconstruction (100 chemin(s) charge(s) avant, 12 sans entree) » (et `...backup-09.06.20.log:9726`) | établi | | T3 (12 coiffures retirées) | `T2-T6\LifePlay.log:7612` « 0 ajoutee(s), 12 ignoree(s), table de 126 » | établi | | T6 (Continuer + rechargement) | `T2-T6\LifePlay.log:951-953` Browse `CentralLondon?Name=Player` (Continuer) dans les deux journaux ; aucune ligne ne prouve un rechargement après sauvegarde | Continuer établi ; « sauvegarde puis rechargement » incertain (R2) | | T5 (quaternius V2.0 dans jeu 5.5) | `T5\LifePlay.log:191` « Invalid pak file version (12) in '.../lpr_anim_quaternius/Content/Paks/Windows/... .pak'. Verify your installation. » ; 1 dossier `Crashes` | établi | | T7 (mod de test, UI chaîne complète) | `T7\LifePlay_U7d_T7.log:827` « lpr_test_u7t7 accepte (conteneur 5, registre 24, EngineVersion 5.8.3, construit pour LifePlay 2026.10.2.0) » ; `T7\Editeur_EditMod.log:1341-1343` (éditeur non cuit, mod sans `MODULE_GAME_VERSION` accepté) ; « Pocolov15 ajoutée et rendue » : visuel (R1) | établi (garde) / visuel (rendu) | Lacune d'archivage : aucune pour les journaux cités ; aucun écart entre une ligne citée par le SUIVI et son journal. Réserves : R1 les constats purement visuels (teinte, case grisée, marquage après ▲/▼, coiffure absente à l'écran, rendu de Pocolov15, cases Misc entières) reposent sur l'essai de l'utilisateur, pas sur un journal ; R2 T6 « sauvegarde puis rechargement » n'a pas de preuve dans le journal archivé (le second journal montre une table à 138, soit Pocolov réactivé au redémarrage) ; R3 le SUIVI annonce (T9) « en cours » dans le tableau des fiches alors que le texte plus bas le donne « fait » : incohérence de forme. ## V6 — addon - `git diff Tools/BuildMod.ps1` lu : écriture de `EngineVersion` (lecture de `\Build\Build.version`, `X.Y.Z` validé, `Add-Member EngineVersion` dans le `.uplugin` livré). Ajouts accessoires : 3 lignes de commentaire d'aide (`.DESCRIPTION`) et une ligne `Write-Host "moteur de la cuisson : ..."` ; rien d'autre (pas de changement de logique hors `EngineVersion`). - 3 `.lpmod` : `git diff` = une seule ligne `-/+` par fichier, `MODULE_AUTHOR: LifePlay Revival (animations by SoerGame|Quaternius|hairstyles by Pocolov)` → `MODULE_AUTHOR: LifePlay Revival`. - 3 archives `D:\Game\LifePlay_Publication\Mods\*-1.0-for-LifePlay-2026.10.2.0.zip` (python `zipfile`, `testzip` = None) : `MODULE_GAME_VERSION: 2026.10.2.0`, `MODULE_AUTHOR: LifePlay Revival`, `.uplugin` `EngineVersion 5.8.3`, un pak chacune (freeanims 41 entrées, quaternius 105, pocolov 29). - `Releases\2026.10.2.0\Windows` présent dans la copie 5.8 (ignoré par git : `.gitignore:46 /Releases/`) ; SHA-256 de `LifePlay-Windows.utoc` identique à `D:\Game\LifePlay_Build_5.8_Shipping_V2.0\...\Paks\LifePlay-Windows.utoc` : `9d4bf712aae693fccf5612176fe12fc8008453ff0e1b4625bdd680f851bcfc24` ; `.pak` 20 216 202 o et `.ucas` 1 259 275 600 o de même taille des deux côtés. ## V7 — état des dépôts - `D:\Game\LifePlay-master 5.8\Mods` : existe, `ls -A` vide. - `git status` copie 5.8 : 9 `M` attendus + 4 `??` attendus (`LPModGuard.h/.cpp`, `29_*.md`, `30_*.md`) ; aucun fichier parasite. Aucune entrée indexée (`diff --cached` vide). - `git status` addon : 3 `.lpmod` + `Tools/BuildMod.ps1` attendus, plus `Docs/Modding/Creating_Asset_Mods.md` (agent DOC parallèle : non validé ici, comme demandé). Aucun parasite. - Fichiers que cette validation a produits (hors dépôts git, dossier `etat\` non suivi) : `U7-VAL_BuildLog_*.txt` ×3 et `U7-VAL_LPTestStringCompat_*.txt` dans `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\`, journal `U7-VAL_LPTestStringCompat_20261009-123419.log` dans `Saved\Logs\portage` ; scripts jetables dans le scratchpad. ## Écarts et ce qui n'a pas été rejoué - E1 (ci-dessus) : chaînes « Unreal Engine x.y » dans la fenêtre et le motif `EngineVersion` — décision d'interprétation. - Non rejoué : aucun essai en jeu (interdit) ; les builds n'ont pas été recompilés (recomptés par journal) ; R1 à R3 de V5 ; contenu des docs `29_*`, `30_*` et du guide moddeurs (hors fiche). - Le résumé `Build.ps1` ne rapporte « DLL liées » que pour l'éditeur (connu, SUIVI). Suite : orchestrateur doit trancher E1 (garder ou retirer les « Unreal Engine x.y » de la fenêtre et du motif `EngineVersion`) puis lancer INT (commits addon, pin, jeu) ; état : U7-VAL terminé, aucun FAIL.