# Journal des modifications — migration 5.5 > Une entrée par modification. Format : identifiant, date, lot, fichiers, raison, empreintes, > retour arrière. Les empreintes complètes sont dans `D:\Game\LifePlay_Backup_5.5\\manifest.csv` > et dans l'historique git. | ID | Date | Lot | Fichiers | Raison | Avant → après | Retour arrière | | ------- | ---------- | --- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | -------------- | --------------------------- | | CHG-001 | 2026-09-29 | L0 | `.gitignore` | ignorer les fichiers générés (`Build/*/FileOpenOrder`, `Content/Collections`, `Content/Developers`, `.claude/settings.local.json`) | 31 → 38 lignes | retirer le bloc « CHG-001 » | | CHG-002 | 2026-09-29 | L0 | `.gitattributes` (nouveau) | aucune conversion de fin de ligne : restauration git identique à l'octet | — → créé | supprimer le fichier | | CHG-003 | 2026-09-29 | L0 | `.git/` (nouveau) | dépôt local, identité locale, `core.autocrlf=false`, `core.longpaths=true` ; commit `de64933`, tag `lot-L0-base` | — → créé | supprimer `.git/` | | CHG-004 | 2026-09-29 | L0 | `Tools/Snapshot.ps1`, `Restore.ps1`, `AssetHeaders.ps1`, `CheckIntegrity.ps1`, `LogStats.ps1` (nouveaux) | outillage de traçabilité et de test | — → créés | `git rm` | | CHG-005 | 2026-09-29 | L0 | `Docs/Migration/**` (nouveau) | documentation 01 à 04, journal, registre, empreintes `etat/L0_*` | — → créés | `git rm` | | CHG-006 | 2026-09-29 | L0 | `D:\Game\LifePlay_Backup_5.5\L0\` (hors projet) | sauvegarde de `.claude`, `.mcp.json`, `LifePlay.uproject`, `Config`, `Saved/Backups`, `Saved/SaveGames`, `Content/BPs` (53 fichiers) | — → créé | sans objet | ## Vérifications du lot L0 | Test | Résultat | | ------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------- | | Aller-retour `Snapshot` → modification → `Restore` (`Config/DefaultEditorSettings.ini` + fichier créé) | ✅ MD5 `85D82E7F…` retrouvé ; fichier créé retiré vers `_retires/` | | T-STAT-01 | ⚠️ 1 package UE4 (`Content/BPs/GI.uasset`) : défaut connu, traité en L1 | | T-STAT-02 Modules = 4.27 | ✅ 2 051 fichiers | | T-STAT-03 environnement = L0 | ✅ 20 fichiers | | T-STAT-04 arbre 4.27 inchangé | ✅ 144 fichiers (empreinte créée : `etat/L0_ref427.csv`) | Aucun fichier du projet n'a été modifié en L0 en dehors de `.gitignore` et des ajouts ci-dessus. --- ## Lot L1 — Base saine (2026-09-29) Décisions utilisateur D-01 et D-02 : `04_Cahier_Des_Charges.md` §4. Tag d'entrée `lot-L1-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L1\` (387 fichiers). | ID | Date | Lot | Fichiers | Raison | Avant → après | Retour arrière | | ------- | ---------- | --- | -------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | | CHG-007 | 2026-09-29 | L1 | `Content/{BPs,UI,Structs,Scenes,Render,Characters}` (385 fichiers, 293 packages) | retour à la base 4.27 : retire tous les correctifs de contenu non suivis (dont R-03, R-04) | contenu 5.5 (empreintes `etat/L0_md5_*.csv`) → identique à 4.27 (MD5 vérifiés, 0 écart) | `Tools\Restore.ps1 -Lot L1` ou `git checkout lot-L1-avant -- Content` | | CHG-008 | 2026-09-29 | L1 | `Tools/RunCommandlet.ps1` (nouveau) | lancement de commandlet avec journal archivé et résumé dédoublonné | — → créé | `git rm` | | CHG-009 | 2026-09-29 | L1 | `Docs/Migration/05_Correctifs_Isoles.md`, `correctifs/P01…P06.patch` (nouveaux) | isolement des correctifs : catalogue, protocole de réimport, patchs de code 4.27 → 5.5 | — → créés | `git rm` | | CHG-010 | 2026-09-29 | L1 | `Config/DefaultEngine.ini` | essai de retrait des sections `AndroidFileServer`/`CookerSettings` **annulé** : l'éditeur recrée la section à chaque lancement (nouveau `SecurityToken`) | inchangé (restauré depuis `lot-L1-avant`) | sans objet ; traité en L2 | ### Relevé de base : moteur 5.5 sur le contenu 4.27, sans aucun correctif | Commandlet | Résultat | Résumé | | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | | `LPCheckMeshAssignment` | 5 nœuds à broches orphelines dans `GI` : 3 `GetAssetsByClass` (classe perdue : `SkeletalMesh`, `StaticMesh`, `StreetMap`), 2 `Break AssetData` (`ObjectPath`) ; 6 nœuds `EditableTextBoxStyle` (`StatMenu`, `CharGen`) | `etat/L1_LPCheckMeshAssignment_20260929-010821.txt` | | `CompileAllBlueprints` | **6 erreurs, 100 avertissements, 0 Blueprint en échec de chargement** ; échecs : `UI/StatMenu` (3), `UI/CharGen` (3) — broche `Font` d'`EditableTextBoxStyle` | `etat/L1_CompileAllBlueprints_20260929-010931.txt` | Les commandlets de contrôle n'ont rien écrit : contenu toujours identique à 4.27 après passage (385/385). ### Vérifications de sortie L1 | Test | Résultat | | -------------------------- | ------------------------------------------------------------------------- | | Contenu de gameplay = 4.27 | ✅ 385/385 MD5 | | T-STAT-01 | ⏳ 293 packages UE4 (attendu : base 4.27) — resave contrôlé en `L4-CX-B07` | | T-STAT-02, 03, 04 | ✅ | | T-LOAD-01 | ❌ attendu : 6 erreurs (`CX-B02`), à corriger en L4 | | T-LOAD-02 | ❌ attendu : 5 broches (`CX-B01`), à corriger en L4 | --- ## Lot L2 — Compilation propre (2026-09-29) Tag d'entrée `lot-L2-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L2\` (`.uproject`, `DefaultEngine.ini`) ; dossiers mis de côté dans `L2\_purge\` (manifeste `L2\purge_manifest.csv`). | ID | Date | Lot | Fichiers | Raison | Avant → après | Retour arrière | | ------- | ---------- | --- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------ | ------------------------------------------------------------------------------------------------- | | CHG-011 | 2026-09-29 | L2 | `LifePlay.uproject` | `TargetPlatforms` `WindowsNoEditor` → `Windows` ; section `Plugins` explicite : `ModdingExtra`, `StreetMap`, `EnhancedInput` activés ; `McpAutomationBridge` limité à la cible `Editor` (`TargetAllowList`) ; `AndroidFileServer` désactivé | MD5 `DA10325E…` → nouveau | `Tools\Restore.ps1 -Lot L2 -Only LifePlay.uproject` | | CHG-012 | 2026-09-29 | L2 | `Config/DefaultEngine.ini` | retrait de la section `AndroidFileServerRuntimeSettings` (et de son `SecurityToken`) ; le plugin étant désactivé, l'éditeur ne la recrée plus (vérifié après un lancement) | 14 lignes retirées | `Tools\Restore.ps1 -Lot L2 -Only Config\DefaultEngine.ini` | | CHG-013 | 2026-09-29 | L2 | `Binaries`, `Intermediate`, `Saved/Cooked`, `Saved/StagedBuilds`, `Plugins/*/Binaries`, `Plugins/*/Intermediate`, `Build/WindowsNoEditor`, `Build/LinuxNoEditor` (≈ 13,9 Go) | reconstruction à partir de zéro ; **déplacés**, pas supprimés | → `D:\Game\LifePlay_Backup_5.5\L2\_purge\` | `Move-Item` inverse (voir `purge_manifest.csv`) ; suppression définitive sur décision utilisateur | ### Vérifications de sortie L2 | Test | Résultat | | --------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | T-BUILD-01 `LifePlayEditor Win64 Development` | ✅ code 0, 233 s, **0 erreur, 0 avertissement** dans le code du projet et de ses plugins (2 messages de configuration UBT propres à `McpAutomationBridge`) — `Saved/Logs/portage/L2_Build_LifePlayEditor_20260929-011800.log` | | T-BUILD-02 `LifePlay Win64 Development` | ✅ code 0, 97 s, 0 erreur, 0 avertissement ; exécutable 300 Mo (328 Mo avant : `McpAutomationBridge` exclu du jeu) | | T-LOAD-04 démarrage éditeur | ✅ 0 `LogClass: Error`, 0 échec de chargement de package ou de plugin | | Non-régression `LPCheckMeshAssignment` | ✅ relevé identique à L1 (10 erreurs, 285 avertissements, mêmes signatures) | | ERR-023 (`AndroidFileServer`) | ✅ `DefaultEngine.ini` non réécrit après lancement | | T-STAT-02, 03, 04 | ✅ | --- ## Lot L3 — Journalisation efficace (2026-09-29) Tag d'entrée `lot-L3-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L3\` (6 entrées, dont 2 fichiers créés que `Restore.ps1` retirerait). | ID | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | --------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- | | CHG-014 | 2026-09-29 | L3 | `Source/LifePlay/LifePlay.h`, `LifePlay.cpp` | catégorie `LogLifePlay` | `Tools\Restore.ps1 -Lot L3` | | CHG-015 | 2026-09-29 | L3 | `Source/LifePlay/LPSessionLogSubsystem.h/.cpp` (nouveaux), `LifePlay.Build.cs` (+ `EngineSettings`) | sous-système de `GameInstance`, **sans modification de Blueprint** : résumé de démarrage (versions, modules, fichiers par type) ; bilan de session à la fermeture ou via la commande console `LifePlay.LogSummary` (messages par catégorie, 25 signatures d'avertissement/erreur les plus fréquentes, chiffres normalisés en `#`, pile d'appel Blueprint incluse, plafond de 4 000 signatures). Les messages du moteur ne sont **pas** modifiés (comparabilité A/B avec 4.27) | idem | | CHG-016 | 2026-09-29 | L3 | `Plugins/ModdingExtra/.../ModdingExtraBPLibrary.cpp` | instrumentation `LogLPModdingTrace` (Warning) → `LogModdingExtra` (Verbose, même format de ligne) ; échec de `LoadTxt` signalé une seule fois par fichier ; échec de `SaveTxt` désormais signalé (il était silencieux) | idem | | CHG-017 | 2026-09-29 | L3 | `Tools/LogStats.ps1`, `Docs/Migration/03_Plan_Migration_Tests.md` | prise en compte de `LogModdingExtra` ; procédure A/B (`-LogCmds="LogModdingExtra Verbose"`) | `git revert` | ### Vérifications de sortie L3 Sessions `UnrealEditor -game` (valables pour le journal, pas pour l'affichage des personnages — règle §2 du document 03) : `Saved/Logs/portage/L3_game_20260929-012748.log` (niveau par défaut) et `L3_game_verbose_20260929-013032.log` (trace détaillée). | Test | Résultat | | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | T-BUILD-01, T-BUILD-02 | ✅ 0 erreur, 0 avertissement | | T-LOG-01 résumé de démarrage | ✅ 20 lignes `LogLifePlay` ; 16 modules ; comptes par type identiques à l'inventaire 4.27 (`vin_Base` : 752 `.lpscene`, 286 `.lpaction`…) | | T-LOG-01 bilan de session | ✅ écrit à la fermeture ; signatures dédoublonnées avec leur pile d'appel | | Bruit d'instrumentation | ✅ `LogLPModdingTrace` : 0 ligne au niveau par défaut (1 300 à 5 400 avant) ; 58 lignes `LogLifePlay` pour toute la session | | Trace détaillée | ✅ 1 284 lignes `LogModdingExtra` avec `-LogCmds` ; `ModLauncher.config` absent signalé **une** fois | | A/B de format avec la build 4.27 | ✅ `LogStats -Compare` lit les deux journaux ; toutes les énumérations communes aux deux sessions sont identiques (écarts limités aux dossiers que seule l'une des sessions a atteints) | | T-STAT-02, 03, 04 | ✅ | Découverte au passage : les erreurs `ParseIntoArray` (ERR-004) viennent de `GI.populateClothes4`, appelée par `Person.ReceiveBeginPlay`. --- ## Lot L4 — Réimport contrôlé des correctifs (2026-09-29) ### Sous-lot L4-CX-B01 — broches AssetRegistry de `GI` (ERR-020) Tag d'entrée `L4-CX-B01-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L4-CX-B01\` (`GI.uasset`, MD5 `F4550DA5…`). | Étape du protocole | Résultat | Preuve (`Docs/Migration/etat/`) | | ---------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | | 2. Photographie avant | `GI::EventGraph` : 6 199 nœuds, 23 662 lignes | `L4-CX-B01_dump_avant.txt` | | 3. Simulation `-DryRun` | 3 `[enum]` (`StreetMap`, `StaticMesh`, `SkeletalMesh`), 2 `[path]` (1 consommateur chacun), 0 non traité — **conforme à l'attendu** | `L4-CX-B01_dryrun.txt` | | 4. Application | 3 énumérations, 2 chemins, 1 Blueprint enregistré, 0 cas non traité, 0 échec | `L4-CX-B01_application.txt` | | 5. Photographie après + diff | 6 201 nœuds ; **35 lignes différentes, toutes attendues** : 3 nœuds `AssetRegistry::GetAssetsByClass` → `LPAssetRegistryHelpers::GetAssetsByClassName` avec leur classe d'origine ; 2 nœuds `GetAssetObjectPath` insérés, reprenant les consommateurs des sorties `ObjectPath` orphelines. Aucune autre ligne du graphe ne change | `L4-CX-B01_dump_apres.txt`, `L4-CX-B01_diff.txt` | | 6. `LPCheckMeshAssignment` | 0 broche orpheline dans `GI` (restent les 6 nœuds de CX-B02) | `L4-CX-B01_LPCheckMeshAssignment_*.txt` | | 6. `CompileAllBlueprints` | identique au relevé de base : 6 erreurs (CX-B02), 100 avertissements, 0 échec de chargement ; **aucune erreur nouvelle** | `L4-CX-B01_CompileAllBlueprints_*.txt` | | 7. A/B d'exécution | **en attente** : la cuisson exige CX-B02 ; sera faite sur la build Development qui suit CX-B02 | — | | ID | Date | Lot | Fichiers | Raison | Avant → après | Retour arrière | | ------- | ---------- | --------- | ----------------------- | --------------------------------------------- | ------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | | CHG-018 | 2026-09-29 | L4-CX-B01 | `Content/BPs/GI.uasset` | réimport de CX-B01 (`LPFixAssetRegistryPins`) | MD5 `F4550DA5…` (UE4) → `0AA14EDB…` (UE5, réenregistré par la commandlet) | `Tools\Restore.ps1 -Lot L4-CX-B01` ou `git checkout L4-CX-B01-avant -- Content/BPs/GI.uasset` | ### Sous-lot L4-CX-B02 — `EditableTextBoxStyle` (ERR-021) : essai 1 **rejeté** Tag d'entrée `L4-CX-B02-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L4-CX-B02\`. Preuves : `Docs/Migration/etat/L4-CX-B02_essai1_rejete/`. | Étape | Résultat | | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Simulation | 6 nœuds sur 6 attendus | | Application | « 6 traités, 0 liaison non gérée, 0 échec » | | Compilation | 0 erreur (6 avant), 98 avertissements, 0 broche orpheline | | **Relecture du diff** | ❌ `CharGen::Make_64` a perdu sa liaison `Font` **sans** recevoir la liaison `TextStyle` : sa police retombe sur la valeur par défaut (aucune police, couleur magenta). Défaut **silencieux** : compilation et rapport de la commandlet au vert | Cause : `LPFixEditableTextBoxFont` coupait la broche `Font` de chaque nœud au fil du parcours. Dans `CharGen`, `Break_62` est parcouru avant `Make_64` : la coupure effaçait aussi la liaison vue depuis `Make_64`, qui n'était plus rebranché. Dépend de l'ordre des nœuds (sans effet dans `StatMenu`). La campagne du 2026-09-07 avait utilisé cette commandlet : le défaut y était très probablement présent. | ID | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --------- | ------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | -------------- | | CHG-019 | 2026-09-29 | L4-CX-B02 | `Content/UI/StatMenu.uasset`, `CharGen.uasset` | essai 1 appliqué puis **annulé** par `Tools\Restore.ps1 -Lot L4-CX-B02` (MD5 `34807BE0…`, `63CA2A78…` retrouvés) | sans objet | | CHG-020 | 2026-09-29 | L4-CX-B02 | `Source/LifePlayEditorTools/LPFixEditableTextBoxFontCommandlet.cpp` | les broches `Font` ne sont coupées qu'après le relevé complet de la topologie | `git revert` | | CHG-021 | 2026-09-29 | L4 | `Tools/ReimportCorrectif.ps1` (nouveau) | automatisation des étapes 1 à 6 du protocole | `git rm` | Enseignement pour le protocole : l'étape 5 (relecture du diff nœud par nœud) est indispensable ; ni la compilation ni le rapport de la commandlet n'ont détecté ce défaut. ### Sous-lot L4-CX-B02b — `EditableTextBoxStyle` (ERR-021) : essai 2 **validé** Tag d'entrée `L4-CX-B02b-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L4-CX-B02b\`. Exécuté avec `Tools\ReimportCorrectif.ps1` et la commandlet corrigée (CHG-020). | Étape | Résultat | Preuve (`etat/`) | | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------- | | 3. Simulation | 6 nœuds sur 6 attendus | `L4-CX-B02b_dryrun.txt` | | 4. Application | 6 traités, 2 Blueprints, 0 liaison non gérée, 0 échec ; **4 rebranchements** `TextStyle` (2 par Blueprint) | `L4-CX-B02b_application.txt` | | 5. Diff | `StatMenu` 425 → 422 lignes, `CharGen` 4 458 → 4 455 ; 9 lignes chacun, symétriques ; les 4 `Make` ont `TextStyle ← Break_62.TextStyle` ; plus aucune broche `Font` orpheline | `L4-CX-B02b_diff_*.txt`, `L4-CX-B02b_dump_*` | | 6. `LPCheckMeshAssignment` | **0 broche orpheline dans tout le projet** | `L4-CX-B02b_LPCheckMeshAssignment_*.txt` | | 6. `CompileAllBlueprints` | **0 erreur** (6 avant), 98 avertissements (100 avant : les 2 « Font obsolète » disparaissent), 0 échec de chargement | `L4-CX-B02b_CompileAllBlueprints_*.txt` | | ID | Date | Lot | Fichiers | Raison | Avant → après | Retour arrière | | ------- | ---------- | ---------- | --------------------------------------------------------- | ------------------ | ----------------------------------------------------- | ------------------------------------------------------------------------------------ | | CHG-022 | 2026-09-29 | L4-CX-B02b | `Content/UI/StatMenu.uasset`, `Content/UI/CharGen.uasset` | réimport de CX-B02 | `34807BE0…` → `131E4B96…` ; `63CA2A78…` → `8D4E4200…` | `Tools\Restore.ps1 -Lot L4-CX-B02b` ou `git checkout L4-CX-B02b-avant -- Content/UI` | **Effet sur les tests** : T-LOAD-01 (0 erreur de compilation) et T-LOAD-02 (0 broche orpheline) passent pour la première fois depuis le retour à la base saine. ### Sous-lot L4-CX-B03 — mur à échelle nulle dans `CentralLondon` (validé) Tag d'entrée `L4-CX-B03-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L4-CX-B03\` (`CentralLondon.umap` MD5 `C063EE72…` = 4.27, `CentralLondon_BuiltData.uasset`). Correctif sur une propriété d'acteur : le contrôle se fait par rapport de la commandlet avant/après (pas de graphe). | Étape | Résultat | Preuve (`etat/`) | | ----------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | | Rapport avant | 1 composant : `Wall.StaticMeshComponent0`, échelle X=0 Y=12,56 Z=5,75, cube moteur visible, `BlockAll` | `L4-CX-B03_rapport_avant.txt` | | Application `-Fix -Scale=0.1` | X 0 → 0,1 (panneau de 10 cm : corps physique valide, aspect de mur plat conservé) ; 1 carte enregistrée, 0 échec | `L4-CX-B03_application.txt` | | Rapport après | 0 composant à échelle nulle | `L4-CX-B03_rapport_apres.txt` | | Non-régression | `LPCheckMeshAssignment` 0 broche orpheline ; `CompileAllBlueprints` 0 erreur, 0 échec de chargement ; seule la carte a changé (`_BuiltData` inchangé) | résumés `L4-CX-B03_*` | | ID | Date | Lot | Fichiers | Avant → après | Retour arrière | | ------- | ---------- | --------- | ----------------------------------- | ------------------------- | -------------------------------------------------------------------------------------- | | CHG-023 | 2026-09-29 | L4-CX-B03 | `Content/Scenes/CentralLondon.umap` | `C063EE72…` → `21912547…` | `Tools\Restore.ps1 -Lot L4-CX-B03` ou `git checkout L4-CX-B03-avant -- Content/Scenes` | ### Sous-lot L4-CX-B04 — événements `On Clicked` orphelins (validé) Tag d'entrée `L4-CX-B04-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L4-CX-B04\`. `Tools\ReimportCorrectif.ps1`. | Étape | Résultat | Preuve (`etat/`) | | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------- | | Simulation | 3 sur 3 attendus | `L4-CX-B04_dryrun.txt` | | Application | `TopRight` : `StatButtonL` (1 nœud en aval) ; `CharGen` : `ButtonEyelashColor` (5), `ButtonPreviewErect` (1) ; 3 retirés, 0 échec | `L4-CX-B04_application.txt` | | Diff | `TopRight` 907 → 906 nœuds, `CharGen` 1 320 → 1 318 : **seuls les 3 événements disparaissent**. Les nœuds en aval sont conservés (déjà inatteignables ; la photographie n'inclut pas les broches d'exécution) | `L4-CX-B04_diff_*.txt` | | Contrôles | 0 broche orpheline ; `CompileAllBlueprints` 0 erreur, **95** avertissements (98 avant), 0 échec de chargement | résumés `L4-CX-B04_`* | | ID | Date | Lot | Fichiers | Avant → après | Retour arrière | | ------- | ---------- | --------- | --------------------------------------------------------- | ----------------------------------------------------- | ---------------------------------------------------------------------------------- | | CHG-024 | 2026-09-29 | L4-CX-B04 | `Content/UI/TopRight.uasset`, `Content/UI/CharGen.uasset` | `C34F7BB0…` → `B3B0ED10…` ; `8D4E4200…` → `A7C718C6…` | `Tools\Restore.ps1 -Lot L4-CX-B04` ou `git checkout L4-CX-B04-avant -- Content/UI` | ### Build Development empaquetée `D:\Game\LifePlay_Build_5.5_L4` (2026-09-29) État du code : `L4-CX-B04-apres`. Commande : `RunUAT BuildCookRun -platform=Win64 -clientconfig=Development -build -cook -stage -archive` (journal `Saved/Logs/portage/L4_BuildCookRun_20260929-030445.log`). | Test | Résultat | | -------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------- | | T-LOAD-05 cuisson | ✅ `Success - 0 error(s), 94 warning(s)` ; `BUILD SUCCESSFUL`, `ExitCode=0` | | Données livrées en fichiers nus | ✅ `Windows/LifePlay/Content/Modules` présent ; résumé de démarrage : 16 modules, comptes identiques à 4.27 | | Test de fumée (lancement automatisé) | ✅ 185 s sans plantage, fermeture propre, bilan de session écrit ; menu principal atteint (journal `Saved/Logs/portage/L4_build_smoke_20260929.log`) | | T-RUN-02 à T-RUN-05 (génération de personnages, scène, sauvegarde, 30 min) | ⏳ **nécessite une partie jouée** : scénario `03_Plan_Migration_Tests.md` §4, sur cette build **et** sur la référence 4.27 | Note : le `LifePlay.exe` à la racine de la build est un lanceur ; le processus du jeu est `Windows/LifePlay/Binaries/Win64/LifePlay.exe`. ### Correction de l'empaquetage — ERR-026 (2026-09-29) **Retour utilisateur sur** `LifePlay_Build_5.5_L4` : « le jeu ne fonctionne pas, la plupart des assets ne sont pas intégrés ». Confirmé : **3 257 packages cuits au lieu de 8 561**. LifePlay charge maillages, vêtements, coiffures et textures par chemin à l'exécution (`GetAssetsByClass`, `GetAssetByObjectPath`) ; le cuiseur, qui ne suit que les références statiques, ne les voit pas. Les builds du 28/09 utilisaient `-CookAll` ; ce paramètre n'avait pas été repris. **Erreur de ma part, non détectée faute de test du volume cuit** : le test T-PKG-01 est ajouté au plan de tests. | ID | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------- | | CHG-025 | 2026-09-29 | L4 | `Config/DefaultGame.ini` | `+DirectoriesToAlwaysCook=(Path="/Game")` (exclusion `fBlah` conservée) : tout le contenu est cuit quelle que soit la méthode d'empaquetage, y compris le bouton « Package » de l'éditeur | `Tools\Restore.ps1 -Lot L4-cook` | | CHG-026 | 2026-09-29 | L4 | `Docs/Migration/03_Plan_Migration_Tests.md`, `Registre_Erreurs.md` | test T-PKG-01 ; ERR-026 | `git revert` | Build `D:\Game\LifePlay_Build_5.5_L4b` (`BuildCookRun` Development, journal `L4b_BuildCookRun_20260929-081054.log`) : | Test | Résultat | | ----------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | T-LOAD-05 cuisson | ✅ `Success - 0 error(s), 95 warning(s)` | | T-PKG-01 contenu cuit | ✅ **8 561** `.uasset`, 2,6 Go (= référence 4.27) | | Test de fumée (150 s, sans intervention) | ✅ aucun plantage, fermeture propre ; une partie a démarré et 4 personnages ont été générés | | Premier A/B (`LogStats -Compare`, échantillon faible) | `Accessed None` maillage/perso **0,50** (4.27 : 0,27 ; 5.5 du 28/09 : 16,6) ; **4 acteurs distincts sur 4** (5.5 du 28/09 : tous `Person_C_0`) → CX-B01 corrige très probablement ERR-002 ; **à confirmer visuellement** (T-RUN-02 à 04) | `LifePlay_Build_5.5_L4` (incomplète) est conservée comme preuve et peut être supprimée. --- ## Lot L5 — Données et personnages (2026-09-29) ### Diagnostic d'ERR-027 (personnages de quête invisibles ou dévêtus) Partie jouée par l'utilisateur sur `LifePlay_Build_5.5_L4b` (journal archivé `Saved/Logs/portage/L4b_partie_utilisateur_20260929.log`) : PNJ aléatoires corrects ; personnages créés par preset invisibles en dialogue, dévêtus dans le mini-jeu. | Étape | Constat | Preuve | | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------- | | Indicateur | `Accessed None` maillage : 26,5 / personnage (1 219 / 46) contre 0,27 en 4.27 (4 / 15) | `Tools\LogStats.ps1` | | Pile d'appel | `GeneratePerson → LoadPreset → GenerateAndApplyStrings/Bools` lit `MeshSexRace.Mesh` et `SMBool.SkeletalMesh` vides ; 0 occurrence en 4.27 | journal utilisateur | | Pistes écartées (identiques en 4.27) | `clearVariable` (ERR-028, 211 contre ≈ même nombre en 4.27) ; `populateClothes4` / `ParseIntoArray` (631 contre 630) | `Grep` sur les deux journaux | | Structures | `Mesh_2…` ∈ `Structs/MeshSexRace` ; `SkeletalMesh_2…` ∈ `Structs/SMBool` | recherche binaire | | Diff de graphes 4.27 / 5.5 (`LPDumpFunction`) | `GenerateAndApplyStrings`, `GenerateAndApplyBools`, `LoadMeshIfNeeded`, `getSkeletalMeshFromPath`, `SMBoolToSkeletalMesh` : **logique identique** (seuls écarts : `SetSkeletalMesh` → `SetSkinnedAssetAndUpdate`, redirection moteur ; broche `Key` du `PrintString` UE5) | `etat/L5-diag_dump427_`*, `etat/L5-diag_dump55_*` | | Mécanisme | `MeshSexRace` est chargé à la demande : `LoadMeshIfNeeded(Index)` → `getSkeletalMeshFromPath(AssetPath)` → `LPAssetRegistryHelpers::GetAssetByObjectPath(…, OnlyOnDisk=true)` → `GetAsset` → `Cast` | dumps | | Réglages | `LegacyPercentage` absent des deux `GameSettings.sav` : valeur par défaut identique | lecture binaire | Conclusion provisoire : code et réglages identiques ; le seul maillon qui change de moteur est la résolution chemin → asset (`GetAssetByObjectPath`, porté de `FName` vers `FSoftObjectPath`). | ID | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------- | | CHG-027 | 2026-09-29 | L5 | `Source/LifePlay/LPAssetRegistryHelpers.cpp` | instrumentation permanente : tout chemin non résolu est signalé une fois (`LogLifePlay` Warning, chemin reçu et chemin interprété), réussites en `Verbose` | `Tools\Restore.ps1 -Lot L5-instr` | Build `D:\Game\LifePlay_Build_5.5_L5a` (instrumentée) : éditeur et jeu compilés sans erreur ; cuisson `0 error(s), 0 warning(s)` ; T-PKG-01 : 8 561 packages ; test de fumée 180 s sans plantage (aucune partie démarrée : pas de sauvegarde dans cette build). En attente d'une scène de quête jouée. ### Relevé `MeshSexRace` pendant une partie (build L5b, `-LPDumpVars`, 2026-09-29) | Constat | Preuve | | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- | | Fin de partie : `MeshSexRace[3]` = `bridget_gp`, `MeshSexRace[4]` = `michael` **chargés** ; les 22 autres corps vides (non utilisés ; 6 corps legacy jamais chargés car `LegacyPercentage = 0`) | `[dump fin]`, `Saved/Logs/portage/L5b_partie_utilisateur_20260929.log` | | 4 PNJ aléatoires : 0 erreur. Chaque personnage de quête : ≈ 38 lectures de `Mesh` vide | chronologie du journal | | Pile : `LoadPreset → GenerateAndApplyStrings → PlayerChangeRace → UpdatePlayerMeshWithMorphs → UpdatePlayerMesh` (boucle sur `MeshSexRace`, lecture de `Mesh.Materials`) | idem | | Hypothèse « résolution de chemin » : **écartée** (seuls `Pubes05/06`, faux en 4.27 aussi) | instrumentation CHG-027 | | **Base de comparaison invalide** : la session 4.27 de référence n'a chargé **aucun** preset de quête (`GenerateAndApplyStrings` ×2). Le « 0 occurrence en 4.27 » ne prouve rien (piège §5.3 du rapport du 28/09). Journal archivé : `Saved/Logs/portage/REF427_session_20260928_sans_quete.log` | `Grep` | Suite : session 4.27 jouant les mêmes scènes de quête, puis comparaison normalisée. Note de traçabilité : la sauvegarde `L5-instr` de `LPSessionLogSubsystem.*` a été prise après modification ; la version antérieure est dans git (`0baf4cf`). | CHG-028 | 2026-09-29 | L5 | `Source/LifePlay/LPSessionLogSubsystem.h/.cpp` | capteur d'exceptions de script (-LPTraceScriptEx, -LPTraceLocals, -LPTraceMax) : relève les variables locales du cadre Blueprint au moment de l'erreur ; actif seulement avec l'option (le moteur supprime sa pile d'appel quand un écouteur est branché : elle est réécrite). Validé en -game. | `Tools\Restore.ps1 -Lot L5-trace` | ### ERR-027 — cause racine identifiée (2026-09-29) Chaîne causale, établie par le capteur L5c et le code source des deux moteurs : 1. La scène `vin_Pregnancy/Scenes/pregnant_trap.lpscene` appelle `generatePersonTemporary()` **sans argument** (personnage aléatoire). 2. Les arguments `()` sont découpés par `ParseIntoArray` (non culling). Sur une **chaîne vide** : - UE 4.27 (`String.cpp:947`, garde `*Start != '\0'`) → **0 élément** ; - UE 5.5 (`String.cpp.inl:1306`, réécrit sur `UE::String::ParseTokens`, qui visite toujours le dernier jeton) → **1 élément vide** `[""]`. 3. `GeneratePerson` teste `Length(Presets) > 0` : en 5.5, il prend le chemin « presets » au lieu du chemin aléatoire. 4. Il charge chaque `.lpcharacter` dont le nom se termine par `"" + ".lpcharacter"` : **les 141 presets**, appliqués successivement (journal L5c : stéréotypes, fantasy, âges, silhouettes… puis `phenotypes/*`). 5. Un preset de phénotype impose `INFO Race: African/Asian/Caucasian` → `PlayerChangeRace` → corps legacy `MeshSexRace[0..2|5..7]`, jamais chargé (`LegacyPercentage = 0`) → **corps vide : invisible ; vêtements Daz sans support : dévêtu**. Le rapport du 2026-09-28 (§4) avait écarté `ParseIntoArray` (« implémentation identique ») : c'est exact pour une chaîne non vide, **faux pour la chaîne vide**. Toutes les fonctions Blueprint de la chaîne sont identiques entre 4.27 et 5.5 ; la divergence est dans le moteur. Preuves : `Saved/Logs/portage/L5c_partie_utilisateur2_20260929.log`, `etat/L5-diag_dump55exec_GI_GeneratePerson.txt`, `etat/L5-diag_dump55exec_GI_GenerateAndApplyStrings.txt`. ### Sous-lot L4-CX-B08 — `ParseIntoArray` au comportement UE 4.27 (ERR-027) — validé statiquement Tag d'entrée `L4-CX-B08-avant`. Sauvegarde : `D:\Game\LifePlay_Backup_5.5\L4-CX-B08\` (17 Blueprints ; 4 fichiers source créés, retirés par `Restore.ps1` en cas de retour). | Étape | Résultat | Preuve (`etat/`) | | ------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | | Fonction de remplacement | `ULPStringCompat::ParseIntoArray` : transcription de l'algorithme 4.27 (chaîne vide → `[]` ; séparateur sensible à la casse), même signature que `UKismetStringLibrary::ParseIntoArray` | `Source/LifePlay/LPStringCompat.*` | | Simulation | 114 nœuds, 17 Blueprints (GI 73, Person 10, Room 7, StreetMap_Static 4, 13 widgets) ; rien écrit | `L4-CX-B08_dryrun.txt` | | Application | 114 rebranchés, 0 écart de liaison (contrôle intégré : liaisons et valeurs par défaut de chaque broche identiques avant/après), 0 échec | `L4-CX-B08_application.txt` | | Contrôles | 0 broche orpheline ; `CompileAllBlueprints` 0 erreur, 95 avertissements (inchangé), 0 échec de chargement | résumés `L4-CX-B08_*` | | ID | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------- | | CHG-029 | 2026-09-29 | L4-CX-B08 | `Source/LifePlay/LPStringCompat.h/.cpp`, `Source/LifePlayEditorTools/LPFixParseIntoArrayCommandlet.h/.cpp` (nouveaux) ; 17 Blueprints | `ParseIntoArray` UE5 renvoie `[""]` pour une chaîne vide (UE4 : `[]`) : `generatePerson()` sans argument chargeait les 141 presets | `Tools\Restore.ps1 -Lot L4-CX-B08` ou `git checkout L4-CX-B08-avant -- Content Source` | | CHG-030 | 2026-09-29 | L5 | `Source/LifePlayEditorTools/LPDumpFunctionCommandlet.cpp` | option `-Exec` (broches d'exécution) | `Tools\Restore.ps1 -Lot L5-dumpexec` | ### Validation d'exécution de CX-B08 — build `LifePlay_Build_5.5_L5d` (2026-09-30) Partie jouée par l'utilisateur : **personnages de quête et personnages aléatoires visibles et habillés**. Journal : `Saved/Logs/portage/L5d_partie_utilisateur_20260930.log`. | Mesure | 5.5 avant (L5b/L5c) | 5.5 L5d | 4.27 (quête jouée) | | ---------------------------------------------- | ------------------- | -------- | ------------------ | | Personnages générés | 16 | 40 | 16 | | Presets de phénotype/stéréotype chargés à tort | tous | **0** | 0 | | Lectures `Mesh_2` / `SkeletalMesh_2` vides | 378+ | **0** | 0 | | `Accessed None` maillage / personnage | 43,7 | **0,38** | 0,06 | | Plantages | 0 | 0 | 0 | Résidu : 15 lectures `GetSkeletalMesh_DEPRECATED` vides (composants proxy ; dette R-03, lot L7a) ; `ModLauncher.config` (ERR-014) et `OldPlayer.lpcharacter` absents (build sans sauvegarde antérieure). Cuisson L5d : 0 erreur, 95 avertissements (à examiner : la cuisson L5c en comptait 0). --- ## Lot L6 — Validation V1 (2026-09-30) Partie utilisateur sur `LifePlay_Build_5.5_L5d` : **42 min, 271 personnages, aucun plantage ; sauvegarde (**`1.sav`**, le jeu numérote les emplacements) et rechargement fonctionnels**. Journaux : `Saved/Logs/portage/V1_partie_20260930*.log`. Anomalies signalées : ERR-030 à ERR-034 (registre). | ID | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | -------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | | CHG-031 | 2026-09-30 | L6a | `Config/DefaultEngine.ini` | `r.DefaultFeature.AntiAliasing=2` (clé UE4, ignorée par UE5 : « dummy variable ») → `r.AntiAliasingMethod=2` (TAA, comme en 4.27) ; le jeu tournait en TSR (défaut UE5). Autres réglages vérifiés identiques à 4.27 : GI dynamique 0, reflets SSR, ombres virtuelles 0 | `Tools\Restore.ps1 -Lot L6a` | Validation L6a (build `LifePlay_Build_5.5_L6a`, partie utilisateur 2026-09-30) : **scintillement disparu** (ERR-032 clos). Capteur « read property Person » : relevé dans `GI::ReturnStatIfNeeded` (variable de scène `Player`, classe `Person`, tableau `Person` vide). Comparaison par personnage : `Dress` 0 sur cette partie (situationnel) ; variables `Person` vides 3,3/perso en 4.27 contre 15 à 20 en 5.5 (ERR-003/ERR-030). Journal : `Saved/Logs/portage/L6a_LifePlay.log`. ### Lot L6e — ERR-034, marges des boutons (2026-09-30) Captures utilisateur 4.27 / 5.5 : la rangée `<< < ❚❚ > >>` de `UI/TopRight` est plus espacée en 5.5 et déborde à droite. Photographie de l'arbre (`LPDumpWidgetTree`) : chaque bouton est un `UButton` (style transparent) autour d'un cercle de 30 px ; aucune marge n'est stockée dans l'asset. Source moteur : défaut 4.27 `FCoreStyle "Button"` NormalPadding (2,2,2,2), PressedPadding (2,3,2,1) ; défaut 5.5 `FUMGCoreStyle "Button"` (12,1.5,12,1.5) pour les deux. `FMargin` est sérialisé champ par champ par rapport au défaut : les assets 4.27 prennent donc la marge UE5 au chargement (+20 px par bouton). | ID | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | ---------- | ---------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | | CHG-032 | 2026-09-30 | L6e | `Source/LifePlayEditorTools/LPDumpWidgetTreeCommandlet.h/.cpp`, `LPFixButtonPaddingCommandlet.h/.cpp` (nouveaux) | outils : photographie des arbres UMG (`-BP=` ou `*`), correctif des marges | `git checkout L6e-avant -- Source` | | CHG-033 | 2026-09-30 | L6e-CX-B09 | 46 Widget Blueprints de `Content/UI` (liste : `etat/L6e-CX-B09_assets.txt`) | 429 boutons (passe 1, marges égales au défaut UE5) + 1 bouton (passe 2, `TopRight::Button_8` Pressed (12,2,12,2) : marge 4.27 partielle, Left/Right hérités d'UE5) remis au défaut UE4 ; 3 boutons à marge 0 choisie par l'auteur conservés | `Tools\Restore.ps1 -Lot L6e-CX-B09` | | Contrôle | Résultat | Preuve | | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | | Simulation | 432 boutons vus, 429 à corriger, 46 paquets | `etat/L6e-CX-B09_dryrun.txt` | | Diff des 73 arbres UMG avant/après | hors lignes `WidgetStyle` : identiques ; dans `WidgetStyle`, seules `NormalPadding`/`PressedPadding` changent | `etat/L6e-CX-B09_widgets_{avant,apres,diff}.txt` | | Idempotence | 3e simulation après passe 2 : 432 boutons vus, 0 à corriger | `etat/L6e-CX-B09c_LPFixButtonPadding_*.txt` | | `CompileAllBlueprints` | 0 erreur, 190 avertissements (identique à L4-CX-B08) | `etat/L6e-CX-B09_CompileAllBlueprints_*.txt` | | Build empaquetée `LifePlay_Build_5.5_L6e` | cuisson 0 erreur, 95 avertissements (inchangé) ; T-PKG-01 : 8561 `.uasset` | `Saved/Logs/portage/L6e_BuildCookRun.log` | ### Lot L6f — ERR-031, portrait vide lors d'un appel (2026-09-30) : diagnostic, sans correctif Capture utilisateur 5.5 : l'encadré d'appel montre un dégradé de ciel. Chaîne établie : `GI::secondScreen` (contact lu dans la variable DSL, `Person.secondScreen = true`, `Scene.FaceRender` visible) → `Render/SecondScreenMat` ← `SceneCapture2D` `SecondScreen` de `CentralLondon` (rend seulement `Wall` et `PlayerCharacter`). La carte 4.27 d'origine (copie MD5 identique, chargée temporairement sous `/Game/_Diag`, déplacée ensuite dans `D:\Game\LifePlay_Backup_5.5\L6f\_diag`) contient les mêmes données : caméra sans racine, en position nulle. **L'utilisateur confirme le même défaut en 4.27** : ERR-031 est préexistant, hors périmètre de la migration ; aucun asset modifié. | ID | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------- | | CHG-034 | 2026-09-30 | L6f | `Source/LifePlayEditorTools/LPDumpComponentsCommandlet.h/.cpp` (nouveau) | outil de diagnostic : composants d'un Blueprint (`-BP=`) ou acteurs d'une carte (`-Map= -Filter=`), propriétés différentes du défaut | `git checkout L6f-avant -- Source` | Note d'outillage : `L6f_dump_GI.txt` a d'abord été écrasé par le vidage de `Person` (le script prenait le journal le plus récent) ; il a été régénéré depuis `Saved/Logs/portage/L6f_LPDumpFunction_20260930-102202.log` (378 graphes). Validation L6e (build `LifePlay_Build_5.5_L6e`, partie utilisateur 2026-09-30) : **barre de temps conforme à la 4.27** (ERR-034 clos, CX-B09 validé en jeu). ERR-033 (double clic) : **non reproduit** depuis le build L6e (constat utilisateur, 2026-09-30). Aucun correctif ciblé ; laissé sous surveillance. ### Lot L4-CX-B07 — réenregistrement UE5 des derniers paquets UE4 (2026-09-30) | ID | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------- | | CHG-035 | 2026-09-30 | L4-CX-B07 | `Source/LifePlayEditorTools/LPAssetListUtils`, `LPDumpAssetsCommandlet`, `LPResavePackagesCommandlet` (nouveaux) ; `LifePlayEditorTools.Build.cs` (`bUseUnity = false` : les fonctions utilitaires de chaque commandlet sont dans un espace de noms anonyme, la compilation unity les faisait entrer en collision) ; 239 paquets (liste : `etat/L4-CX-B07_assets.txt`) | EX-03 : derniers paquets au format UE4 (ERR-022) | `Tools\Restore.ps1 -Lot L4-CX-B07` ; `git checkout L4-CX-B07-avant -- Source` | | Contrôle | Résultat | Preuve | | -------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------- | | Photographie `LPDumpAssets` (292 paquets : les 239 + `BPs`, `UI`, `Structs`, `Render`, y compris GI et Person) | 1,28 million de lignes, 0 échec de chargement | `Saved/Logs/portage/L4-CX-B07_assets_{avant,avant2,apres}.txt` | | Déterminisme | 2 photographies sans modification : seuls `NodeGuid`/`GraphGuid` diffèrent (régénérés au chargement des nœuds UE4) ; exclus du diff → 0 écart | idem | | Simulation puis application | 239/239 sauvegardés, 0 échec | `etat/L4-CX-B07_dryrun.txt`, `etat/L4-CX-B07_application.txt` | | T-STAT-01 (en-têtes) | **8563/8563 paquets UE5** | `etat/L4-CX-B07_headers_apres.csv` | | Diff avant/après (409 lignes) | toutes neutres, voir ci-dessous | `etat/L4-CX-B07_diff_filtre.txt` | Familles d'écarts du diff : (1) textures : stockage de la source PNG → `UEDELTA` (mêmes dimensions, format et mips ; données éditeur, la cuisson en dérive) ; (2) 31 structures : `DefaultValue`/`CurrentDefaultValue` explicités avec les valeurs zéro du type (identiques au défaut implicite) ; (3) 5 matériaux : copie UE4 dépréciée d'`EmissiveColor`/`Opacity` retirée de `UMaterial`, les entrées restent identiques dans `MaterialEditorOnlyData` ; (4) 8 broches `Transform` : `-0` → `0` ; (5) 5 signatures de délégué héritées (`SignatureClass/Name`) effacées sur des nœuds d'entrée ; (6) 2 avertissements de dépréciation enregistrés sur des nœuds (`AI` R-04, `CharGenSlider` R-03, dette connue) ; (7) `PC` : broche `TransformScaleMethod` du `SpawnActor` de `TestBall` (acteur de test) `SelectDefaultAtRuntime` → `MultiplyWithRoot`, valeur déjà portée par les nœuds UE5 de `GI` ; (8) objets `PLACEHOLDER-CLASS` du chargeur (ordre de chargement). | `CompileAllBlueprints` | 0 erreur, 190 avertissements (identique à L6e) | `etat/L4-CX-B07_CompileAllBlueprints_*.txt` | | Build empaquetée `LifePlay_Build_5.5_V1rc` | cuisson 0 erreur, 95 avertissements (inchangé) ; T-PKG-01 : 8561 `.uasset` | `Saved/Logs/portage/L4-CX-B07_BuildCookRun.log` | --- ## V1 — validation finale (2026-09-30), étiquette `v1.0` Partie utilisateur sur `LifePlay_Build_5.5_V1rc` (contenu = `L4-CX-B07-apres`) : environ 2 h, 339 personnages, sauvegardes `1.sav` et `2.sav`, sortie normale, aucun dossier `Crashes` ; retour utilisateur : « pas de souci majeur constaté ». Journaux : `Saved/Logs/portage/V1rc_partie_20260930*.log`. | Exigence | Résultat | | -------------------- | ------------------------------------------------------------------------------------- | | EX-01 compilation | `LifePlayEditor` compile sans erreur (L2, recompilé à chaque lot) | | EX-02 Blueprints | `CompileAllBlueprints` 0 erreur (190 avertissements de dépréciation, dette R-03/R-04) | | EX-03 format UE5 | 8563/8563 paquets (CX-B07) | | EX-04 `Modules` | chargés comme en 4.27 (L3, T-STAT-02) | | EX-05 build jouée | personnages distincts, visibles et habillés, scènes, sauvegarde et rechargement | | EX-06 sans plantage | 42 min (L5d), environ 2 h (V1rc) : 0 plantage | | EX-07 journalisation | `LogLifePlay`, résumé de démarrage et de session, traces de portage en `Verbose` | | EX-08 traçabilité | CHG-001 à CHG-035, tags avant/après par lot, `Restore.ps1` testé (L0) | | EX-09 environnement | `.claude/`, `.mcp.json`, `Saved/Backups/`, arbre 4.27 non modifiés | Comparaison par personnage V1 (L5d) → V1rc des `Accessed None … Person` par fonction : `getActorVar` 4,6 → 4,0, `ReturnStatIfNeeded` 3,6 → 3,8, `setActorVar` 0,8 → 0,8 ; seul `GI::Dress` varie (74,5 → 283,6), par rafales liées aux lieux (ERR-030, lot L7i). Anomalies ouvertes après V1 : voir `Registre_Erreurs.md` et lots L7 de `04_Cahier_Des_Charges.md`. ## Publication GitHub (2026-09-30) Dépôt : [https://github.com/edujiro5972/LifePlay-Revival](https://github.com/edujiro5972/LifePlay-Revival) (fork de `vinfamy/LifePlay`, AGPL-3.0), compte `edujiro5972`. Préparation dans `D:\Game\LifePlay_Publication` (copies ; ni ce dépôt ni l'arbre 4.27 modifiés). | Branche | Commit | Contenu | | ---------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | `archive/original` | 42dc72b | `master` d'origine (V3.6) | | `archive/ue4.27` | 9e61ec5 | arbre 4.27 filtré selon le `.gitignore` d'origine (sans `Content/Heavy`, `Content/Saves`, binaires, `*.png`, `*.7z`, `*.mp4`), 2 773 fichiers | | `ue5.5-v1` = `main` (branche par défaut) | a55a43f | V1 ; 34 commits et 40 tags, dont `v1.0` | Historique V1 réécrit pour la publication (`git filter-branch`, script `D:\Game\LifePlay_Publication\scrub.sh`) : auteur, committer et signataire de `v1.0` = `edujiro5972 <336072401+edujiro5972@users.noreply.github.com>` ; valeurs `SecurityToken` remplacées par `` (`Config/DefaultEngine.ini`, `correctifs/P05_Config.patch`) ; `Plugins/McpAutomationBridge` retiré (outil de l'environnement de développement, MIT, hors jeu). Arbre final identique à ce dépôt, hors ces deux retraits. Les identifiants de commit publiés diffèrent donc de ceux de ce dépôt local. Rattachement du dépôt local à l'historique publié (2026-09-30) : `.git` sauvegardé dans `D:\Game\LifePlay_Backup_5.5\git_avant_rattachement` (HEAD 41d5e1e, 40 tags) ; `git reset --mixed origin/main` (ni fichier modifié ni fichier supprimé sur disque) ; tags remplacés par ceux publiés ; identité locale `edujiro5972` (adresse noreply). `Plugins/McpAutomationBridge/` ajouté au `.gitignore` (reste sur disque) ; `README.md` ajouté à la racine. Retour arrière : restaurer le `.git` sauvegardé. ## Archive « Full Source Code » V1 (2026-09-30) `LifePlay_Revival_V1_UE5.5_Full_Source_Code.7z` (4 851 560 856 octets, SHA-256 `38ee16640f960317348a044195a23b55ac8eda34aec085e661034dc9c26cc594`), déposée par l'utilisateur sur Mega : [https://mega.nz/file/zloFkL7T#3P5GDfcfF5U352T0s472vCtyNh131RLgNWn__PSNL2I](https://mega.nz/file/zloFkL7T#3P5GDfcfF5U352T0s472vCtyNh131RLgNWn__PSNL2I). Principe de l'archive de l'auteur (`LifePlay_5_9_UE4_Full_Source_Code.7z`) : dossier projet à la racine, 7z `LZMA2:24 BCJ` solide. Contenu : `Content` complet (24 912 fichiers, dont `Heavy` 8 350, au format UE5), `Binaries`, plugins `StreetMap` et `ModdingExtra`, `.git` d'un clone propre du dépôt publié. Exclus : `Saved` (comme l'auteur), `Intermediate`, `McpAutomationBridge`, `.mcp.json`, `.claude`, captures d'écran, `.git` local. Test d'intégrité 7-Zip réussi. Script : `D:\Game\LifePlay_Publication\make_archive.cmd`. `README.md` réécrit en anglais avec le lien de l'archive. --- ## Lot L7a — R-03 refait : nœuds `Get SkeletalMesh` dépréciés (2026-09-30) Analyse (source UE 5.5) : la lecture de `USkinnedMeshComponent::SkeletalMesh` passe par `GetSkeletalMesh_DEPRECATED()`, qui renvoie `Cast(GetSkinnedAsset())`. CX-B05 avait pris `USkeletalMeshComponent::GetSkeletalMeshAsset()`, qui n'existe pas sur les proxies (`USkinnedMeshComponent`) : d'où ERR-002 aggravé. Remplacement exact retenu : `ULPMeshCompat::GetSkeletalMesh(Component)`, même calcul, pour tout `USkinnedMeshComponent`. Inventaire structurel (instantané CX-B07) : 56 nœuds sources (les appels `GetSkeletalMesh_DEPRECATED` relevés ne sont que les copies compilées ; la variable `SkeletalMesh` de `GenitalSlider` est une variable Blueprint, non concernée). | ID | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | ----------------------------------------------------------------------- | | CHG-036 | 2026-09-30 | L7a (CX-B10) | `Source/LifePlay/LPMeshCompat.h/.cpp`, `Source/LifePlayEditorTools/LPFixSkeletalMeshGetCommandlet.h/.cpp` (nouveaux), `Tools/DiffRemplacementNoeuds.py` ; 8 Blueprints (`etat/L7a_assets.txt`) | ERR-012 / R-03 : 56 nœuds dépréciés | `Tools\Restore.ps1 -Lot L7a` ; `git checkout L7a-avant -- Source Tools` | | Contrôle | Résultat | Preuve | | ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------- | | Simulation | 56 nœuds, 0 cas non pris en charge (cible `self`, nœud impur) | `etat/L7a_dryrun.txt` | | Application (contrôle intégré des liaisons) | 56/56 remplacés, 8 Blueprints sauvegardés, 0 écart | `etat/L7a_application.txt` | | Diff indépendant `LPDumpAssets` avant/après (`Tools/DiffRemplacementNoeuds.py`) | 56 paires (même graphe, même position) ; liaisons `self`→`Component` et `SkeletalMesh`→`ReturnValue` identiques pour 56/56 ; **0 autre objet modifié** (hors copies compilées, graphes anonymes régénérés, GUID, positions des graphes-souches, messages de compilation) | `Saved/Logs/portage/L7a_assets_{avant,apres}.txt` | | Chargement des 8 Blueprints | avertissements 112 → 6 | journaux `L7a_LPDumpAssets_*` | Effet de mesure : le nœud d'origine émettait `Accessed None … SkeletalMesh` sur un composant None ; la nouvelle fonction renvoie None sans message (trace `LogLifePlay` en `Verbose`). Les compteurs `AccessedNoneMaillage` de `LogStats.ps1` baissent donc mécaniquement : comparer les sessions sur les autres signatures. | `CompileAllBlueprints` | 0 erreur, **6 avertissements** (190 avant) : restent seulement les 6 nœuds R-04 `GetRandomPointInNavigableRadius` (`AI`, `Person`, `Room`) | `etat/L7a_CompileAllBlueprints_*.txt` | | Build empaquetée `LifePlay_Build_5.5_L7a` | cuisson 0 erreur, **3 avertissements** (95 avant) ; T-PKG-01 : 8561 `.uasset` | `Saved/Logs/portage/L7a_BuildCookRun.log` | ### Nettoyage des builds UE5 obsolètes (2026-09-30, demande utilisateur) Supprimés (environ 37 Go, binaires régénérables depuis les tags git) : `LifePlay_Build_5.5`, `_5.5_Dev`, `_5.5_NoR03` (premier portage) et `_5.5_L4`, `L4b`, `L5a`, `L5b`, `L5c`, `L5d`, `L6a`, `L6e`. Au préalable, leurs `Saved/Logs`, `Saved/SaveGames`, `Saved/Crashes` et scripts `.bat` ont été copiés dans `D:\Game\LifePlay_Backup_5.5\builds_supprimees`. Conservés : `LifePlay_Build_5.5_V1rc` (build validée `v1.0`), `LifePlay_Build_5.5_L7a` (test en cours), `LifePlay_Build_427_Dev` et `LifePlay_Build_2026.9` (UE4). Validation L7a (build `LifePlay_Build_5.5_L7a`, partie utilisateur 2026-09-30, environ 1 h) : 294 personnages, 0 plantage, sortie normale, sauvegardes `1.sav`/`2.sav` ; tests utilisateur effectués sans anomalie signalée. Journal : `Saved/Logs/portage/L7a_partie_20260930.log`. `Accessed None` par personnage : 334 (V1rc) → 127, surtout `GI::Dress` (situationnel, ERR-030). Messages moteur `GetSocketInfoByName … No SkeletalMesh for Component(CharacterMesh0)` : même signature et mêmes 5 sockets qu'en V1rc, volume lié aux scènes jouées (ERR-011, existe en 4.27) : non imputable à L7a. Fonctions de variables DSL (`getActorVar`, `clearVariable`, `CallFunction`) non touchées par L7a, en hausse par personnage sur cette partie : famille ERR-003, à suivre en L7i. ### L7b — R-04 : derniers nœuds dépréciés (2026-09-30) | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------- | ----------------------------------------------------------------------- | | CHG-037 | 2026-09-30 | L7b (CX-B11) | `Source/LifePlayEditorTools/LPFixNavRandomPointCommandlet.h/.cpp` (nouveau) ; `Tools/DiffRemplacementNoeuds.py` (profils par lot : `L7a`, `L7b`) ; `Content/BPs/AI`, `Person`, `Room` (`etat/L7b_assets.txt`) | ERR-035 / R-04 : 6 nœuds `GetRandomPointInNavigableRadius` dépréciés | `Tools\Restore.ps1 -Lot L7b` ; `git checkout L7b-avant -- Source Tools` | Choix : le remplaçant proposé par le moteur (`K2_GetRandomLocationInNavigableRadius`) est `BlueprintCallable`, alors que l'ancien nœud est pur ; le brancher imposerait de recâbler le flux d'exécution. On réutilise `LPNavigationHelpers` (enrobage pur déjà présent, CX-C09) : mêmes broches, et même corps que la fonction dépréciée en 4.27 comme en 5.5 (simple appel de `K2_GetRandomLocationInNavigableRadius`). `LPFixDeprecatedNodes` (CX-B06) n'est pas réutilisée : elle ne contrôle rien et embarque aussi la variante R-03 rejetée. | Contrôle | Résultat | Preuve | | -------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------- | | Simulation | 6 nœuds (`Room::moveToBedIfPossible`, `Room::getStandSpots`, `Person::standIdle` ×2, `Person::jumpOffFnt`, `AI::EventGraph`), 0 cas non pris en charge | `etat/L7b_LPFixNavRandomPoint_20260930-183406.txt` | | Application (contrôle intégré : liaisons et valeurs par défaut de chaque broche) | 6/6 remplacés, 3 Blueprints sauvegardés, 0 écart | `etat/L7b_LPFixNavRandomPoint_20260930-183707.txt` | | Diff indépendant `LPDumpAssets` (`DiffRemplacementNoeuds.py … L7b`) | 6 paires ; 7 broches identiques (liaisons et défauts, ex. `Radius` 100 / 200 / 1000 / 2000 / 100000) ; **0 autre objet modifié** ; le profil `L7a` rejoué sur les données L7a donne toujours 56/56 et 0 écart | `Saved/Logs/portage/L7b_assets_{avant,apres}.txt` | | `CompileAllBlueprints` | 0 erreur, **0 avertissement** (6 avant) | `etat/L7b_CompileAllBlueprints_20260930-183909.txt` | | Build empaquetée `LifePlay_Build_5.5_L7b` | cuisson 0 erreur, **0 avertissement** (3 avant) ; T-PKG-01 : 8561 `.uasset` | `Saved/Logs/portage/L7b_BuildCookRun.log` | Validation en jeu en attente (déplacements des personnages : `standIdle`, `jumpOffFnt`, `moveToBedIfPossible`, IA). | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- | | CHG-038 | 2026-09-30 | L7b | `Content/BPs/AI`, `Person`, `Room` restaurés (`Tools\Restore.ps1 -Lot L7b`, MD5 = `L7b-avant`) ; versions L7b conservées dans `LifePlay_Backup_5.5\L7b\_avant-restauration‚60930-193820` | test en jeu du build L7b (utilisateur) : les personnages se téléportent dans la pièce au lieu de marcher, pieds parfois masqués par un objet ; « la build précédente était meilleure » | réappliquer : `Restore.ps1` depuis `_avant-restauration`, ou relancer `LPFixNavRandomPoint` | Analyse : aucune cause trouvée dans le code. Ancienne et nouvelle fonction exécutent le même appel moteur (`K2_GetRandomLocationInNavigableRadius`), mêmes broches et valeurs par défaut (diff 6/6), et le compilateur remplit la broche cachée `WorldContextObject` de la même façon pour les deux (`FKCHandler_CallFunction::RegisterNets`, métadonnée `WorldContext`). Le journal de la partie ne contient aucun message de navigation. Prochaine étape : A/B au même endroit avec le build L7a (identique au contenu actuel), et vérifier le comportement en 4.27, avant toute nouvelle tentative. | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------- | | CHG-039 | 2026-09-30 | L7b | `Content/BPs/AI`, `Person`, `Room` remis à `L7b-apres` (`git checkout L7b-apres`, MD5 identiques aux versions conservées dans `_avant-restauration‚60930-193820`) | retour utilisateur : la téléportation venait de l'accélération du temps (en vitesse normale les personnages marchent) ; les personnages enfoncés dans le sol en extérieur existent aussi en 4.27 et en L7a/V1 (ERR-036, hors périmètre). Le retrait CHG-038 n'était donc pas justifié | `Tools\Restore.ps1 -Lot L7b` | L7b validé en jeu : le build testé `LifePlay_Build_5.5_L7b` contient exactement ces 3 paquets. Leçon : avant de retirer un lot sur un symptôme visuel, vérifier la vitesse de jeu et demander si le défaut existe en 4.27 et dans le build précédent. ### L7i — variables DSL `Person` vides (ERR-003 / ERR-030), 2026-09-30 Mesure (journaux `L7a_partie`, `L7b_partie`, 4.27 `LifePlay_Build_427_Dev\...\LifePlay.log`, par minute) : | Signature | 4.27 (23 min) | L7a (62 min) | L7b (45 min) | | -------------------------------------------------- | ------------- | ------------ | ------------ | | `Accessed None … Person` dans `GI::Dress` | 376 | 326 | 641 | | `index 0 … array 'Person'` (variable DSL vide) | 9 | 179 | 56 | | `index … array 'Floats'` | 2,4 | 31 | 64 | | `Accessed None … Person` dans `getActorVar` | 0 | 45 | 7,6 | | `Accessed None … Person` dans `ReturnStatIfNeeded` | 0,35 | 33 | 5,6 | Conclusion : **ERR-030 (**`Dress`**) existe en 4.27** (même signature `Dress:0E35`, même ordre de grandeur) : préexistant, hors périmètre. L'écart propre à 5.5 porte sur les variables DSL vides (ERR-003). Lecture du graphe (`GI::GetVariable`) : la variable `Player` est construite avec `Person = [Special]`, `Special = GI.PlayerCharacter` (`SwitchString_55`, branche `Player`) ; le capteur L6a montre `Special = None`. Les erreurs surviennent tout au long de la partie, pas seulement au chargement. | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------- | ---------------------------------- | | CHG-040 | 2026-09-30 | L7i | `Source/LifePlay/LPSessionLogSubsystem.h/.cpp` : options `-LPTraceFunctions`, `-LPTraceDepth` (variables locales des cadres appelants), `-LPTraceGIVars` (variables de l'instance de jeu) ; inactives sans `-LPTraceScriptEx` | capteur ciblé ERR-003 : quelle scène et quelle variable restent vides | `git checkout L7i-avant -- Source` | Build de diagnostic `LifePlay_Build_5.5_L7i` (contenu identique à L7b, 8561 `.uasset`), lancement par `LifePlay_diagnostic_L7i.bat` (300 relevés, 4 cadres appelants, `-ScriptStackOnWarnings`). Session capteur n° 1 (`L7i_partie2_20261001.log`, 53 min, 300 relevés) : les variables vides viennent surtout des scripts d'IA des PNJ (`.lpai` : `meal`, `church`, `grocery`, `entertainment`…), via `UpdateAI → PlayScene → ReadSceneLine → CallFunction → getActorVar/setActorVar`. La variable vide est `AI`, alimentée par `GI.AIDummy` (personnage factice du pool `DummyPersons`, attribué par `SpawnDummy`). `GI.PlayerCharacter` n'est pas None. Dans `GetVariable`, toutes les variables spéciales (`Player`, `Ptr`, `Interacting`, `CurrentCompanion`, `A1`…`A5`) passent par le même `MakeStruct` dont le nom est figé à « Player » : l'étiquette relevée en L6a était trompeuse. Nouveau défaut signalé (utilisateur, 2026-10-01) : **Quick dress laisse souvent le personnage principal nu ; correct en 4.27** → ERR-037, régression UE5. Chemin : `Action` (bouton « Quick dress ») → `GI::Dress(PersonVariable="Player", ClothVariables=[], QuickDress=true)` → pour chaque emplacement obligatoire (`Top`, `Bottom`, `Foot`), filtre de l'inventaire du joueur (sexe, emplacement, `Overlaps`, `Daz == (Race == "Daz")`, exclusion `Wedding/Nurse/Doctor`). Inventaire de la sauvegarde `1.sav` cohérent (80 vêtements, `Daz=True`). | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------ | | CHG-041 | 2026-10-01 | L7i | `Source/LifePlayEditorTools/LPDumpSaveCommandlet.h/.cpp` (nouveau : contenu d'un `.sav` en texte, lecture seule) ; `Source/LifePlay/LPSessionLogSubsystem.h/.cpp` : relevé déclenché par un motif du journal (`-LPDumpOnLog`, `-LPDumpPaths`, `-LPDumpMax`), inactif sans l'option | ERR-037 : relever l'état du joueur au moment du Quick dress ; ERR-003 : état d'`AIDummy` | `git checkout L7i-capteur -- Source` | Build `LifePlay_Build_5.5_L7i` reconstruite (contenu identique), lancement `LifePlay_diagnostic_L7i_2.bat`. Session capteur n° 2 (`L7i_partie3_20261001.log`, 5 min, 8 relevés Quick dress, 60 relevés IA) : - **Quick dress (ERR-037)** : à la maison, 4 essais sur 4 corrects (haut, bas, chaussures, accessoires). Au travail, 3 essais sur 3 ne mettent que `Trench-Coat-Outfit-Top`. État relevé : `Race = "Daz"`, `IsMale = False`, inventaire de 80 vêtements. Au travail (`CurrentAmenity = work`), `GI::Dress` n'accepte que les vêtements `Bool3` (étiquette « Formal ») ; l'inventaire n'en contient que 2 (`HC-Business-Jacket` en `Outerwear`, `Trench-Coat-Outfit-Top` en `Top`), aucun bas ni chaussure formels. Quand aucun vêtement ne convient à un emplacement, la sortie `Completed` de la boucle n'est pas câblée : l'emplacement reste vide. Graphe identique à 4.27 → comportement d'origine, à confirmer par un essai 4.27 au travail. - **Variable** `AI` **vide** : `GI.AIDummy` est valide au moment de l'erreur ; les erreurs portent toujours sur les emplacements de PNJ `CheckingAiIndex` 5 et 8. `UpdateAI` charge le PNJ dans `AIDummy` (`LoadPreset`, `StatOnly`) puis `AddVariable("AI", [AIDummy])` ; à l'erreur, `GetVariable("AI")` renvoie une variable vide (non trouvée). Piste suivante : ce qui retire ou masque `AI` pour ces deux PNJ. Suite L7i (2026-10-01) : - ERR-037 (Quick dress) **préexistant** : même comportement en 4.27 au travail (essai utilisateur). Journal 4.27 de l'essai archivé : `Saved/Logs/portage/ref427_quickdress_20261001.log` ; la session 4.27 de référence (23 min) est archivée sous `ref427_partie_20260930.log` (le `LifePlay.log` 4.27 avait été remplacé par l'essai). - Variable `AI` introuvable : au moment de l'erreur, la boucle de vérification des scènes du joueur (`CHECKING:`) s'exécute entre les lignes du script d'IA ; les deux boucles avancent par `Delay(0)` (macro `GI:Async`) et partagent la table des variables DSL. Moteur : `FDelayAction`, `UKismetSystemLibrary::Delay` et `FLatentActionManager::ProcessLatentActions` équivalents 4.27/5.5 ; images par seconde équivalentes (≈ 55). Écart mesuré : par cycle de vérification, ≈ 140 scènes en 4.27 contre ≈ 430 en 5.5 dont 100 vérifiées 2 à 3 fois (redémarrages : `CheckingSceneIndex` remis à -1 et liste remélangée à chaque changement de `CurrentAmenity`). Les sessions comparées n'ont pas suivi le même parcours (déplacements, accélération du temps) : une comparaison A/B sur un parcours identique est nécessaire avant de conclure à une régression. A/B à parcours identique (2026-10-01, nouvelle partie, vitesse normale, maison puis travail ; 4.27 47 min, `AB427_20261001.log` ; 5.5 33 min, `AB55_20261001.log`) : | Par minute | 4.27 | 5.5 | | --------------------------------- | ---- | --- | | Vérifications de scènes | 626 | 614 | | `AI` introuvable (`getActorVar`…) | 0 | 0 | | Variables `Person` vides | 124 | 123 | | `getBeautyValue` (`Floats` vide) | 1,3 | 52 | Les erreurs `AI` dépendaient du rythme de jeu (accélération du temps) : absentes à parcours égal, classées comme préexistantes (même mécanisme en 4.27). Seul écart réel : `getBeautyValue`. Cause (ERR-005) : `BeautyStandards` est indexé par forme (`round`, `oval`…, fichier `Modules/beauty_standards_default.txt` identique dans les deux versions) ; la première recherche par nom de morph échoue normalement (62 avertissements en 4.27 aussi). L'écart vient du nombre d'appels : `filterMorphList` est appelé sans étiquette et teste `Contains(tags, "")`. Moteur : `FString::Find` 4.27 → `FCString::Stristr`, qui cherche le caractère nul et ne trouve rien ; 5.5 → `TCString::Strnistr`, qui renvoie le début de la chaîne. Les autres modes (sensible à la casse, depuis la fin) et `StartsWith`, `EndsWith`, `Replace` sont identiques. | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------- | ------------------------------------------------------------------------------------- | | CHG-042 | 2026-10-01 | L7i (CX-B12) | `Source/LifePlay/LPStringCompat.h/.cpp` (`FindUE4`, `Contains`, `FindSubstring`, `Split`) ; `Source/LifePlayEditorTools/LPFixStringSearchCommandlet`, `LPTestStringCompatCommandlet`, `LPDumpCDOCommandlet` (nouveaux) ; `Tools/DiffRemplacementNoeuds.py` (profil `CX-B12`, broches absentes des deux côtés) ; 28 Blueprints (`etat/L7i_CX-B12_assets.txt`) | ERR-005 : recherche de texte avec motif vide | `Tools\Restore.ps1 -Lot L7i-CX-B12` ; `git checkout L7i-CX-B12-avant -- Source Tools` | | Contrôle | Résultat | Preuve | | --------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------- | | Test `LPTestStringCompat` : transcription littérale de `FString::Find` 4.27 contre `LPStringCompat` et contre le moteur 5.5 | 3 120 cas : compat = 4.27 dans 100 % des cas ; moteur 5.5 ≠ 4.27 dans 60 cas, tous « sous-chaîne vide, insensible à la casse, depuis le début » | `Saved/Logs/portage/L7i_LPTestStringCompat_*.log` | | Simulation | 385 nœuds (`Contains` 160, `Split` 222, `FindSubstring` 3), 28 Blueprints, 0 cas non pris en charge | `etat/L7i_LPFixStringSearch_20261001-191027.txt` | | Application (contrôle intégré) | 385/385 remplacés, 28 Blueprints sauvegardés, 0 écart | `etat/L7i_LPFixStringSearch_20261001-191311.txt` | | Diff indépendant (`DiffRemplacementNoeuds.py … CX-B12`) | 385 paires, liaisons et valeurs par défaut identiques ; 0 autre objet modifié ; profils L7a (56/56) et L7b (6/6) inchangés | `Saved/Logs/portage/L7i_CX-B12_assets_{avant,apres}.txt` | | `CompileAllBlueprints` | 0 erreur, 0 avertissement | `etat/L7i_CompileAllBlueprints_20261001-191653.txt` | | Build empaquetée `LifePlay_Build_5.5_L7i_B12` | cuisson 0 erreur, 0 avertissement (164 paquets recuits) ; T-PKG-01 : 8561 `.uasset` | `Saved/Logs/portage/L7i_CX-B12_BuildCookRun.log` | | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | ------------ | -------------- | ----------------------------------------------------------------------------------------------------------------- | -------------- | | CHG-043 | 2026-10-01 | L7i (CX-B12) | — (validation) | partie utilisateur de 46 min sur `LifePlay_Build_5.5_L7i_B12`, même parcours que l'A/B : « pas de soucis en vue » | — | | Par personnage (`LogStats.ps1`) | 4.27 (`AB427`) | 5.5 avant (`AB55`) | 5.5 + CX-B12 (`B12_validation_20261001.log`) | | ------------------------------- | -------------- | ------------------ | -------------------------------------------- | | Personnages | 788 | 562 | 1 044 | | `Accessed None` | 16,5 | 17,8 | 18,3 | | Index hors bornes | 8,7 | 12,4 | 9,7 | | Erreurs (session) | 6 | 30 | 7 | | `getBeautyValue` (par minute) | 1,3 | 52 | 2,3 | | Plantage | 0 | 0 | 0 | **Lot L7i clos.** Leçon : comparer 4.27 et 5.5 sur un parcours identique (nouvelle partie, vitesse normale) ; les sessions libres (accélération du temps, lieux différents) faussent les taux et ont conduit à deux fausses pistes (variable `AI`, Quick dress). ### L7h — vérification StreetMap (ERR-018), 2026-10-01 | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------- | ---------------------------------- | | CHG-044 | 2026-10-01 | L7h | `Source/LifePlayEditorTools/LPCheckStreetMapCommandlet` (option `-Path`), `LPCheckMeshesCommandlet` (nouveau), `LifePlayEditorTools.Build.cs` (module `MeshDescription`) | ERR-018 : tailles de fichiers StreetMap divisées par 3 à 15 | `git checkout L7h-avant -- Source` | Méthode : copie temporaire de `Heavy/StreetMap` 4.27 (560 fichiers, 276 Mo, lecture seule de la source) sous `Content/_Temp427`, mesurée par l'éditeur 5.5 avec les mêmes commandlets que les assets 5.5, puis supprimée. | Contrôle | 4.27 | 5.5 | Preuve | | ------------------------------------------------------------------------------------------------------- | ---- | ---------------------------------------------------------------------------------------------- | --------------------------------- | | 280 villes `UStreetMap` : routes, nœuds, bâtiments, eaux, parcs, bâtiments nommés, aménités | — | **0 ligne différente** (ex. `CentralLondon` : 18 460 routes, 49 425 bâtiments, 5 191 aménités) | `etat/L7h_streetmap_{427,55}.csv` | | 280 maillages `Static` : LOD, sommets et triangles sources et de rendu, sections, matériaux, dimensions | — | **0 ligne différente** (ex. `CentralLondon` : 1 084 265 triangles) | `etat/L7h_meshes_{427,55}.csv` | Conclusion : aucune perte de données. La réduction de taille vient du format UE5, qui ne stocke plus les données de rendu construites dans le fichier de l'éditeur (reconstruites depuis les données sources et mises en cache). Le niveau `Scenes/CentralLondon.umap` (1,0 → 0,4 Mo) est joué dans toutes les sessions de validation sans défaut de carte signalé. ### L7k — erreurs d'exécution fréquentes, 2026-10-01 | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ---------------------------------------------------------- | ------------------------------------------ | -------------- | | CHG-045 | 2026-10-01 | L7k | — (analyse des journaux `AB427`, `AB55`, `B12_validation`) | ERR-006, ERR-007 et signatures résiduelles | — | | Par personnage | 4.27 | 5.5 avant CX-B12 | 5.5 + CX-B12 | | ------------------------------------------------------ | ----------- | ---------------- | ------------ | | `ContactMenu` dans `Person::UpdateDailyPose` (ERR-007) | 0,12 | 0,62 | 0,20 | | `Near` dans `Person::standIdle` (ERR-006) | 0,05 | 0,38 | 0,09 | | `currentMatchRace` dans `GI::determinePersonVars` | 0,04 | 0,33 | 0,09 | | `OccupyingFnt`, `HeadtrackStatic` (`Person`) | 0,03 ; 0,04 | 0,22 ; 0,21 | 0,07 ; 0,07 | | `clearVariable` (vérifications « qui » des scènes) | 7,2 | 6,7 | 15,3 | | … rapporté aux vérifications de scènes | 0,37 | 0,36 | 0,39 | ERR-006 et ERR-007 étaient des effets secondaires de la recherche de texte vide (ERR-005) : ils reviennent au niveau 4.27 sans autre correctif. `clearVariable` suit le volume de vérifications de scènes (même chaîne d'appel et mêmes proportions `GetSpecific` / `getRelative` / `getPerson` dans les trois sessions) : la session de validation a vérifié davantage de scènes par personnage (843/min contre 626). **Lot L7k clos sans modification.** ### L7g — build Shipping, 2026-10-01 | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ----------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------- | | CHG-046 | 2026-10-01 | L7g | `Source/LifePlay/LPSessionLogSubsystem.cpp` : comparaison au nom `LogLifePlay` (`FName`) au lieu de `LogLifePlay.GetCategoryName()` | la configuration Shipping ne compilait pas : `NO_LOGGING` y remplace les catégories de journal par des objets vides (`FNoLoggingCategory`, sans `GetCategoryName`) | `git checkout L7g-avant -- Source` | Choix de structure : la version publiée par l'auteur (`LifePlay_Build_2026.9`, UE4) est une build Shipping **en fichiers séparés** (pas de `.pak`), conforme à `UsePakFile=False` du projet : conservé tel quel (modding). Commande : `RunUAT BuildCookRun -platform=Win64 -clientconfig=Shipping -build -cook -iterate -stage -archive -archivedirectory=D:\Game\LifePlay_Build_5.5_Shipping`. `McpAutomationBridge` est déjà exclu des builds de jeu (`TargetAllowList: Editor` dans le `.uproject`). | Contrôle | Auteur (UE4) | 5.5 Shipping | Preuve | | --------------------------------------------------------------------------- | ------------ | --------------------------- | -------------------------------------------------- | | Compilation `LifePlay Win64 Shipping` et `LifePlayEditor Win64 Development` | — | 0 erreur | `Build.bat` | | Paquets `.uasset` | 8 561 | 8 561 | comptage | | Fichiers `Content/Modules` (hors paquets) | 2 051 | 2 051 | comptage | | Taille totale | 5,2 Go | 3,3 Go | format UE5 (voir L7h) | | Cuisson | — | réussie, sans avertissement | `Saved/Logs/portage/L7g_BuildCookRun_Shipping.log` | En Shipping, le jeu n'écrit pas de journal (comme la version de l'auteur) : la validation se fait par une partie. | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | -------------- | --------------------------------------------------------------------------------------------------------------------------------------- | -------------- | | CHG-047 | 2026-10-01 | L7g | — (validation) | partie utilisateur sur `LifePlay_Build_5.5_Shipping` (nouvelle partie, scènes, sauvegarde et rechargement) : « pas de soucis constaté » | — | **Lot L7g clos.** La build Shipping est la version distribuable de référence. ### Publication V1.1 (2026-10-01) Tag annoté `v1.1` (`0d6dc55`, signataire edujiro5972), branche `ue5.5-v1.1`, README anglais mis à jour. Archive `D:\Game\LifePlay_Publication\LifePlay_Revival_V1.1_UE5.5_Full_Source_Code.7z` (script `make_archive_v1_1.cmd`, mêmes exclusions que V1) : 4,94 Go, 25 644 fichiers, 8,74 Go décompressés, test 7-Zip OK, SHA-256 `6dbfb18e55e51558708239856b54f757b6044307d2d1cf261e88c94baaf617ae`. Les deux fichiers `Config` modifiés par L7c pendant l'archivage ont été vérifiés dans l'archive : identiques à `v1.1`. Lien Mega à ajouter au README après dépôt. ### L7c — configuration, 2026-10-01 | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | | CHG-049 | 2026-10-01 | L7c | `Config/DefaultEngine.ini` : `r.DynamicGlobalIlluminationMethod=0`, `r.ReflectionMethod=2`, `r.Shadow.Virtual.Enable=0`, `DefaultGraphicsRHI=DefaultGraphicsRHI_DX12` ; `Config/DefaultGame.ini` : 5 clés de nativisation retirées | rendre explicites les valeurs jouées et validées (valeurs par défaut du code moteur 5.5 : `IndirectLightRendering.cpp`, `VirtualShadowMapArray.cpp` ; RHI D3D12 relevé dans les journaux) ; nativisation supprimée depuis UE 5.0 (`UE_DEPRECATED(5.0)`) | `git checkout L7c-avant -- Config` | `PhysXTreeRebuildRate` est conservé : propriété toujours valide de `UPhysicsSettings` en 5.5. ### L7d — visuel, 2026-10-01 | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ | ---------------------------- | | CHG-050 | 2026-10-01 | L7d | `Source/LifePlayEditorTools/LPConvertAtmosphericFogCommandlet` (nouveau) ; `Content/Scenes/CentralLondon.umap` | `AAtmosphericFog` déprécié depuis 4.26 : remplacé par un `ASkyAtmosphere` équivalent | `Tools\Restore.ps1 -Lot L7d` | Constats : en 5.5, `UAtmosphericFogComponent` dérive de `USkyAtmosphereComponent` et se convertit au chargement (`SetPositionToMatchDeprecatedAtmosphericFog` : planète posée à Z = −100 000, mode `PlanetTopAtComponentTransform`) ; le rendu passait donc déjà par SkyAtmosphere. Éclairage précalculé : `CentralLondon_BuiltData` 40 Ko (4.27) / 43 Ko (5.5), aucun message de reconstruction : rien à reconstruire (la ville est éclairée dynamiquement). | Contrôle | Résultat | Preuve | | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------ | | Simulation | 1 acteur, 26 propriétés SkyAtmosphere relevées (valeurs effectives) | `etat/L7d_LPConvertAtmosphericFog_20261001-215150.txt` | | 1er essai | écart de transformation détecté (transformation monde non recalculée hors monde enregistré) : **carte non sauvegardée** ; corrigé (`UpdateComponentToWorld`) | `etat/L7d_LPConvertAtmosphericFog_20261001-215247.txt` | | Application | 26/26 propriétés et transformations relative et monde identiques ; carte sauvegardée | `etat/L7d_LPConvertAtmosphericFog_20261001-215445.txt` | | Diff `LPDumpAssets` de la carte | 387 objets avant et après ; seuls changements : `AtmosphericFog_1` (+3 composants) → `SkyAtmosphere_0` (+3 composants), même étiquette, `RelativeLocation` Z = −100 000 et `TransformMode` explicités (valeurs effectives de l'ancien composant) | `Saved/Logs/portage/L7d_map_{avant,apres}.txt` | ### L7e, L7f — évaluation, 2026-10-01 | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | -------- | -------- | ---------- | -------------- | | CHG-051 | 2026-10-01 | L7e, L7f | — | évaluation | — | - **L7e** : 4 systèmes Cascade (`Heavy/New3/Particles` : `ParticleBurst`, `ParticleGravity`, `ParticleLiquid`, `ParticleSquirt`), toujours pris en charge par UE 5.5 ; une conversion vers Niagara changerait l'aspect des effets par rapport à 4.27 : reportée au jour où le moteur retirera Cascade. Aucun actif ne contient de vêtement physique (`ClothingAssetCommon` absent en 4.27 comme en 5.5) : rien à migrer de NvCloth vers Chaos. - **L7f** : `DefaultPlayerInputClass=EnhancedPlayerInput` et `DefaultInputComponentClass=EnhancedInputComponent` sont déjà actifs ; ils exécutent les 34 actions et axes hérités de `DefaultInput.ini`. Une migration complète (Input Actions, Mapping Contexts, réécriture des événements d'entrée des Blueprints) n'apporterait rien au joueur et demanderait un test manuel des 34 commandes : reportée. ### L7j — image du contact pendant un appel (ERR-031, amélioration), 2026-10-01 | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | -------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------ | ---------------------------- | | CHG-052 | 2026-10-01 | L7j | `Source/LifePlayEditorTools/LPFixSceneCaptureCommandlet` (nouveau) ; `Content/Scenes/CentralLondon.umap` | ERR-031 (présent en 4.27) : la caméra `SecondScreen` filme le ciel | `Tools\Restore.ps1 -Lot L7j` | Chaîne (L6f et L7j) : `GI::secondScreen` marque le contact (`Person.secondScreen`) ; `GI::Show` le place sur la position de son emplacement de scène (`ActorTransforms[i]`) **décalée de −10 000 000 en Y**, sur la copie de studio `SecondScreenFloor` (−3 131 543 ; −24 967 212, soit le studio des scènes − 10 000 000 Y) ; l'encadré affiche `Render/SecondScreen`, rendu par la caméra `SecondScreen`. Aucun Blueprint ne déplace cette caméra ; dans la carte (4.27 comme 5.5) elle n'a pas de racine (`RootComponent = None`) et ses composants sont à l'origine. Correctif : racine = son `SceneComponent` existant, capture rattachée, position = `CameraScene` (cadrage des scènes du studio : −3 131 132 ; −14 967 241 ; 50, lacet 180°) − 10 000 000 Y. Contrôle intégré (racine, rattachement, position monde = cible) puis diff `LPDumpAssets` de la carte : **3 lignes modifiées**, toutes sur `SecondScreen` (`Saved/Logs/portage/L7d_map_apres.txt` → `L7j_map_apres.txt`). Le cadrage (scène entière plutôt que portrait) est à ajuster d'après le test en jeu si nécessaire (`-From=CameraPortrait`). ### L7l — personnages enfoncés dans le sol en extérieur (ERR-036, amélioration), 2026-10-01 : diagnostic | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ------------------------------------------------------------------------------ | ---------- | -------------- | | CHG-053 | 2026-10-01 | L7l | `Source/LifePlayEditorTools/LPCheckMeshesCommandlet` (colonnes `MinZ`, `MaxZ`) | diagnostic | — | Le lieu `Modules/vin_Base/World/forest___vin01.lpworld` (donnée de module, identique en 4.27) pose comme sol le meuble `fnt_new208` (dalle 230 × 99 × 0,6) en Z = −31,2 avec une échelle (0,713 ; 1,481 ; **100**) ; ailleurs (`bathroom`, `shower`, `sports_centre`) le même meuble est un petit objet (Z = 60, échelle 5). Les meubles sont rattachés à un point d'ancrage en Z = 60 (`Room::addObject`). La hauteur exacte de la surface de neige par rapport au sol de marche dépend de la chaîne de composants du meuble : une mesure en jeu est nécessaire avant de corriger le fichier (ou d'ajuster la dalle avec l'éditeur de lieu intégré au jeu, « Edit building »). Test utilisateur (build `LifePlay_Build_5.5_L7cdj`) : le contact apparaît désormais dans l'encadré d'appel (en pied, avec le sol de `SecondScreenFloor`) ; demande : cadrer le visage. | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | | CHG-054 | 2026-10-01 | L7j | `Source/LifePlay/LPSecondScreenSubsystem.h/.cpp` (nouveau sous-système d'instance de jeu) | cadrer le visage du contact quel que soit son emplacement de scène : à chaque image, la caméra `SecondScreen` est placée à 80 cm devant la tête de `GI.SecondScreenPerson` (os `head`, sinon haut de la capsule), dans l'axe du personnage, champ 30° ; composant rendu mobile au premier usage. Aucun asset ni Blueprint modifié | `git checkout L7j2-avant -- Source` | Compilation `LifePlayEditor` Development et `LifePlay` Shipping : 0 erreur. La position fixe posée par CHG-052 reste la position de repli (avant tout appel). Suite L7l (2026-10-01) : inspection en direct dans l'éditeur (serveur MCP, lecture seule) : la racine de l'acteur `Room` porte l'échelle de la première ligne du `.lpworld` (studio : 8 ; 8 ; 0,2 ; forêt : 6 ; 16 ; **0,01**) ; positions et échelles des meubles sont donc multipliées par 0,01 en hauteur : la dalle `fnt_new208` affleure le sol (≈ +0,3 cm contre ≈ +0,5 cm). **La dalle n'est pas surélevée** : l'écart vient de la hauteur à laquelle les personnages sont posés. Mesure en jeu préparée : | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ----------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------- | | CHG-055 | 2026-10-01 | L7l | `Source/LifePlay/LPSessionLogSubsystem.cpp` : option `-LPDumpDelay` (délai du relevé sur motif) | relever, 4 s après chaque changement de lieu (`test0706 amenity`), le sol du lieu (`Room`), la capsule du joueur et du personnage en interaction ; script `LifePlay_releve_L7l.bat` du build `LifePlay_Build_5.5_L7cdj` | `git checkout L7j2-apres -- Source` | Mesures L7l (2026-10-01, `L7l_releve2_20261001.log`) : **tous les lieux sont construits dans le studio** (acteur unique `Room_C_0` en −3 131 543 ; −14 967 213 ; −115), la ville étant masquée (`StreetMapStatic.bHidden`). Au centre sportif (échelle Z 0,2) : sol à −105, pieds du joueur à −100 (capsule −12, demi-hauteur 88) : correct. Échelles verticales déclarées : 81 lieux à 0,2, 5 à 0,3, 1 à 0,4 et les **7 lieux extérieurs à 0,01** (beach, forest, mountain, park, pool, river, street). Hypothèse : le plafond `WallT` (cube blanc, Z relatif 2 040, sans collision) suit l'échelle : 4,08 m en intérieur mais **20 cm au-dessus du sol en extérieur**, où il masque tout ce qui est plus bas (pieds, pieds des meubles) et apparaît comme le « sol » blanc ; les personnages marchent sur le vrai sol, dessous. | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | -------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------- | ----------------------------------- | | CHG-056 | 2026-10-01 | L7l | `Source/LifePlay/LPSessionLogSubsystem.h/.cpp` : option `-LPDumpEvery=N` (relevé périodique) | confirmer l'hypothèse du plafond par une mesure en extérieur (`LifePlay_releve_L7l.bat`) | `git checkout L7j2-apres -- Source` | Mesure L7l (2026-10-01, `L7l_releve3_20261001.log`, relevé toutes les 5 s) : lieu extérieur « rue » (échelle racine 3,5 ; 18 ; **0,01**) : sol à −114,5, pieds du joueur à −112 (capsule −24,2, demi-hauteur 88) : posés ; `WallT` visible, Z relatif 2 040 → **−94,6 en monde, 18 cm au-dessus des pieds** : hypothèse confirmée. En intérieur (café, police, échelle 0,2) : `WallT` à +293, pieds à −100 : correct (capture utilisateur sans défaut). | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | --- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------- | | CHG-057 | 2026-10-01 | L7l | `Source/LifePlay/LPOutdoorRoomSubsystem.h/.cpp` (nouveau sous-système) | masquer le plafond `WallT` de `GI.Room` tant que l'échelle Z de sa racine est < 0,05 (lieux extérieurs), le rendre visible quand la pièce redevient intérieure (seulement s'il l'a masqué) ; aucun Blueprint ni asset modifié ; build `LifePlay_Build_5.5_L7cdj` | supprimer les 2 fichiers (`git checkout fa3d98e -- Source`) | Validation en jeu (2026-10-01, build `LifePlay_Build_5.5_L7cdj`) : en forêt, pieds des personnages et sol texturé visibles (ERR-036 corrigé) ; pendant un appel, visage du contact cadré (ERR-031 corrigé) ; ciel de jour correct (L7c/L7d), nuit non vérifiée. Tags `L7j-valide`, `L7l-valide`. Validation L7c/L7d (2026-10-02, parc, même cadrage) : la nuit reste claire (soleil fixe) **en 4.27, en L7i_B12 et en L7cdj** : comportement d'origine. Le grand disque blanc à l'horizon est présent **en L7i_B12 comme en L7cdj** : il ne vient pas de L7d (déjà présent en V1, origine non étudiée). Un retour arrière de L7d, lancé à tort avant cette comparaison, a été annulé avant tout commit ou build (`Tools\Restore.ps1 -Lot L7d-retour`, empreinte de la carte revenue à `8BD9C4A9…`). Tags `L7c-valide`, `L7d-valide`. | CHG | Date | Lot | Fichiers | Raison | Retour arrière | | ------- | ---------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | CHG-058 | 2026-10-02 | Doc | nouveaux `07_Architecture_5.5.md`, `08_Guide_Developpeur.md`, `09_Commandes_Utiles.md`, `10_Protocole_Operations.md` ; mis à jour `README.md` (migration et racine), `01`, `03`, `04` (bilan §5), `05` (CX-C14 à C18, statuts), `06` (résultat V1), registre (ERR-020) | finalisation de la documentation de migration : architecture finale, guide développeur, commandes, protocole et leçons | `git revert` du commit | | CHG-059 | 2026-10-02 | O0 | nouveaux `Tools/AuditAssets.py`, `Docs/Migration/11_Audit_Optimisation.md` ; lanceur `LifePlay_profil_O0.bat` (build L7cdj, hors dépôt) | audit d'optimisation en lecture seule : inventaire des assets, build livré, leviers et lots proposés ; aucune modification du projet | `git revert` du commit | | CHG-060 | 2026-10-02 | O0 | `Docs/Migration/11_Audit_Optimisation.md` §9-10 ; lanceur `LifePlay_profil_O0.bat` corrigé (capture par `-ExecCmds`) | résultats de la mesure en jeu (60 images/s tenues, à-coups du thread de jeu dus aux minuteries Blueprint, 463 Mo de physique) ; produits utiles de la bibliothèque Fab ; lots révisés | `git revert` du commit | | CHG-061 | 2026-10-02 | O1 | `LifePlay.uproject` (20 plugins limités à l'éditeur), `Config/DefaultGame.ini` (16 `DirectoriesToNeverCook`), nouveau `Tools/AuditScriptDeps.py` ; `README.md` : lien Mega de la V1.1 | build Shipping allégé de 387 Mo sans changement de contenu ; build `LifePlay_Build_5.5_O1` | `Tools\Restore.ps1 -Lot O1` ou `git checkout O1-avant -- LifePlay.uproject Config` | | CHG-062 | 2026-10-02 | O9 | nouvelle commandlet `LPSetComponentCollision` ; `Content/BPs/MapMarkers.uasset` : composants `Tree` et `Car` en `NoCollision` (diff avant/après : 2 lignes) | chargement de partie de 71 s (identique en 4.27) dû aux ≈ 160 000 corps physiques des arbres et voitures décoratifs de la carte (décision utilisateur : option 1) ; build `LifePlay_Build_5.5_O9` | `Tools\Restore.ps1 -Lot O9` | | CHG-063 | 2026-10-02 | O9b | `LPSetComponentCollision` (modèles des nœuds « Add Component ») ; `Content/BPs/MapMarkers.uasset` : modèles `NODE_AddHISM-0` et `-1` (`HISM_C`, marqueurs de bâtiments) en `NoCollision` (diff : 2 lignes) | les clics se font sur les icônes, pas sur les bâtiments (utilisateur) ; ≈ 49 500 corps physiques restants au chargement ; build `LifePlay_Build_5.5_O9b` | `Tools\Restore.ps1 -Lot O9b` | | CHG-064 | 2026-10-02 | O2 | `Config/DefaultGame.ini` : `UsePakFile=True`, `bUseIoStore=True`, `bCompressed=True` (réglages par défaut du moteur : Oodle Kraken) ; `Modules` reste en fichiers nus | build Development 3 367 → 2 002 Mo (−40 %), 23 928 → 2 104 fichiers ; build `LifePlay_Build_5.5_O2` ; validé en jeu le 2026-10-02 (7 contrôles) | `Tools\Restore.ps1 -Lot O2` ou `git checkout O2-avant -- Config` | | CHG-065 | 2026-10-02 | O4 | nouveau `Tools/FixTextureMips.py` ; 29 textures (`Clothes4` 27, route, trottoir) : `MipGenSettings` = groupe de texture, `NeverStream` = faux (diff : ces 2 propriétés + `LightingGuid` régénéré) | textures de couleur 3D sans mipmaps : scintillement à distance, pleine résolution toujours en mémoire ; exclus : cheveux et masques de transparence (29), interface et textures sans matériau (44), dimensions non puissance de 2 (733) ; build `LifePlay_Build_5.5_O4` | `Tools\Restore.ps1 -Lot O4` | | CHG-066 | 2026-10-02 | O | build Shipping de distribution `LifePlay_Build_5.5_Shipping_V1.2` (O1, O2, O4, O9, O9b) | 3 246 → 1 494 Mo (−54 %), 24 249 → 2 084 fichiers ; premier essai sans ville (corrigé par CHG-067), reconstruit et validé en jeu le 2026-10-02 | — (build seulement) | | CHG-067 | 2026-10-02 | O2b | `Plugins/ModdingExtra` : `GetAllFilesFromFolder` reconstruit la liste des `.uasset`/`.umap` depuis le registre d'assets quand le disque n'en renvoie aucun (contenu compressé IoStore) ; dépendance `AssetRegistry` | régression d'O2 constatée sur le build Shipping : aucune ville proposée (`UI/CityMenu` liste les fichiers `Heavy/StreetMap/*.uasset` du disque, `UI/City` vérifie chaque ville par suffixe `/.uasset`) ; seul appel concerné, les autres lisent des fichiers texte de `Modules` ; build `LifePlay_Build_5.5_Shipping_V1.2` reconstruit | `git checkout O2b-avant -- Plugins/ModdingExtra` | | CHG-068 | 2026-10-02 | V1.2 | `README.md` (section V1.2, branche `ue5.5-v1.2`) ; tag annoté `v1.2` ; archive `D:\Game\LifePlay_Publication\LifePlay_Revival_V1.2_UE5.5_Full_Source_Code.7z` (4 937 914 101 octets, 25 681 fichiers, SHA-256 `fb298583743497799dd274cc62b8cf80fbef3445766be5898201924c64674f1a`, script `make_archive_v1_2.cmd`) | publication de la V1.2 (optimisation) ; contrôles : test 7-Zip, aucun `.mcp.json`/`.claude`/`McpAutomationBridge`/`Saved`/`Intermediate`, `Config`, `.uproject` et `ModdingExtra` identiques au tag | lien Mega à ajouter après envoi | | CHG-069 | 2026-10-02 | Réconciliation | fusion `-s ours` de `vinfamy/master` dans `main` (commit `82a64d9`, arbre inchangé) ; `Docs/Migration/12_Reconciliation_Vinfamy.md` | historique de l'auteur rattaché ; aucun fichier récupérable ; les 33 scènes `corruption` vides de `vin_Base` existent dans `vin_Corruption` (non restaurées : doublons) | `git reset --hard reconcil-avant` (avant toute autre publication) | | CHG-070 | 2026-10-02 | ERR-038 | nouveau `Source/LifePlay/LPRoomTransitionSubsystem.h/.cpp` | relevé (`ERR038_releve_20261002.log`) : la nouvelle pièce est construite ≈ 2 s avant que `destroyDummy` rende les personnages de l'ancienne à la réserve ; le sous-système cache aussitôt, au changement de pièce, les personnages actifs juste avant (hors compagnon et scène en cours), cesse de les suivre dès que le jeu les rend ou les réaffiche, et les réaffiche après 10 s par sécurité ; aucun Blueprint modifié ; build `LifePlay_Build_5.5_ERR038` ; test en jeu en attente | supprimer les 2 fichiers (`git checkout ERR038-avant -- Source`) | | CHG-071 | 2026-10-02 | Ménage | `README.md` : V1.2 en téléchargement principal (lien Mega), V1.1 et V1 en versions précédentes ; suppression de 13 builds 5.5 obsolètes (V1rc, L7a, L7b, L7i, L7i_B12, L7cdj, O1, O1_essai1, O2, O4, O9, O9b, Shipping_V1.2_essai1, ≈ 43 Go) après copie vérifiée de `Saved`, `Content\Saves` et des lanceurs dans `D:\Game\LifePlay_Backup_5.5\builds_supprimees\` ; `08_Guide_Developpeur.md` §4 | lien V1.2 reçu ; place disque | builds : reconstruction depuis les tags git | | CHG-072 | 2026-10-02 | ERR-038 | `LPRoomTransitionSubsystem` : détection par la seule échelle de la racine de `Room`, délai de réaffichage 10 s → 3 s | premier test en jeu concluant (anciens personnages cachés, compagnon présent, nouveaux personnages apparus), mais 2 faux positifs au relevé : nom de lieu vidé un instant sans changement de pièce ; arrivée au restaurant peuplée 3 s avant la construction de la pièce (personnages apparus 10 s en retard) ; build `LifePlay_Build_5.5_ERR038` reconstruit | `git checkout ERR038-apres -- Source/LifePlay/LPRoomTransitionSubsystem.*` | | CHG-073 | 2026-10-02 | ERR-038 | `Source/LifePlay/LPRoomTransitionSubsystem.h/.cpp` supprimés (copie dans `D:\Game\LifePlay_Backup_5.5\ERR038_retrait`) ; build `LifePlay_Build_5.5_ERR038` reconstruit sans le sous-système (vérifié dans l'exécutable) | second test « plus problématique » : relevé `ERR038_apres2_20261002` = 2 déclenchements, tous deux à tort (clients du lieu d'arrivée cachés 3 s) ; le critère temporel ne distingue pas les personnages créés pendant le trajet puis retirés de ceux qui sont conservés ; retrait proposé et accepté par l'utilisateur ; ERR-038 reste ouvert | `git checkout ERR038-apres -- Source/LifePlay` | | CHG-074 | 2026-10-02 | O7 | O7a : `Content/Saves` (14 125 fichiers, parties de test) → `D:\Game\LifePlay_Backup_5.5\O7\Content_Saves` (vérifié), `Content/Developers` et `Content/Collections` (dossiers vides) retirés, 3 captures de la racine rangées ; O7b : `08_Guide_Developpeur.md` §2.1 (carte de `Content/Heavy`, dossiers à ne pas déplacer) | ménage sans risque et documentation, à la place d'un renommage des dossiers jugé trop risqué (préfixes de chemins en dur, contrat de modding) | déplacer en retour le contenu de `O7\Content_Saves` | | CHG-075 | 2026-10-02 | DATA1 | `Plugins/ModdingExtra/.../ModdingExtraBPLibrary.cpp` : statistiques de `LoadTxt` par type de fichier (bilan à la fermeture, commande `ModdingExtra.LoadTxtStats`) ; `11_Audit_Optimisation.md` §17 (stratégie de couche de données) | étape 1 de la couche de données : mesurer avant de construire ; `PopulateRaws` = 12,6 s par chargement de partie (trace O2) ; build `LifePlay_Build_5.5_DATA1` | `git checkout DATA1-avant -- Plugins/ModdingExtra` | | CHG-076 | 2026-10-02 | DATA23 | nouveaux `Plugins/ModdingExtra/.../LPDataCache.h/.cpp` ; `ModdingExtra.cpp` (démarrage en arrière-plan), `ModdingExtraBPLibrary.cpp` (`LoadTxt` depuis la mémoire, `SaveTxt`, vérification, statistiques cache/disque), `ModdingExtra.Build.cs` (`Json`) | couche de données étapes 2 et 3 : `Modules` chargé une fois en arrière-plan, cache compilé JSON par type avec champs et calque ; 2 031 fichiers en 0,14 s depuis le cache ; build `LifePlay_Build_5.5_DATA23` ; validation en jeu en attente | `git checkout DATA23-avant -- Plugins/ModdingExtra` ; ou option `-LPNoDataCache` | | CHG-077 | 2026-10-02 | O1b / DATA23 | `Config/DefaultGame.ini` : `+DirectoriesToNeverCook=(Path="/HairStrands")` retiré ; validation de la couche de données (CHG-076) : 2 658 textes servis par le cache, 0 écart, lecture 0,074 s pour la session | ERR-039 : erreurs `GroomComponent` au démarrage depuis O1 (module conservé par dépendance, contenu non cuit) ; vérifié : 0 erreur après reconstruction | remettre la ligne dans `DefaultGame.ini` | | CHG-078 | 2026-10-02 | DATA4b | nouveaux `Source/LifePlay/LPDataCompat.h/.cpp` (`WhatWhereToArray` en C++, vérification `-LPVerifyWhatWhere` contre la fonction Blueprint d'origine) et `Source/LifePlayEditorTools/LPFixWhatWhereCommandlet.h/.cpp` ; `Content/BPs/GI.uasset` : 2 appels de l'EventGraph rebranchés (diff : 22 lignes, uniquement les 2 nœuds et les liaisons de leurs voisins) | `WhatWhereToArray` = 94 % de `PopulateScenes` (3,4 s par passage) ; premier essai refusé par le contrôle intégré (broche `Target` non exclue), rien sauvegardé, commandlet corrigée ; build `LifePlay_Build_5.5_DATA4b` ; validé en jeu le 2026-10-02 : plus de 3 000 appels vérifiés, 0 écart ; `PopulateRaws` 12,6 s → 1,26 s | `Tools\Restore.ps1 -Lot DATA4b` | | CHG-079 | 2026-10-02 | V1.3 | `README.md` (section V1.3, branche `ue5.5-v1.3`) ; tag annoté `v1.3` ; build `LifePlay_Build_5.5_Shipping_V1.3` validé en jeu ; archive `LifePlay_Revival_V1.3_UE5.5_Full_Source_Code.7z` (4 945 770 158 octets, 11 583 fichiers, SHA-256 `24e7d58f759ca8998fe0d7ddc8c6a4c30262978806903e6d3deb68b37c46512a`, contrôles : test 7-Zip, aucun secret ni outil local, 14 fichiers identiques au tag) | publication de la V1.3 (couche de données, `WhatWhereToArray` en C++, ERR-039) | — | | CHG-080 | 2026-10-02 | V1.3 | `README.md` : V1.3 en téléchargement principal (lien Mega), V1.2 et V1.1 en versions précédentes ; lien de la V1 retiré (archive supprimée de Mega faute d'espace, état git conservé par le tag `v1.0`) | lien V1.3 reçu | — | | CHG-081 | 2026-10-02 | O7d | nouveau `Tools/BuildCollections.py` ; 13 collections statiques `Content/Collections/LifePlay*.collection` (hors dépôt, régénérables) ; `11_Audit_Optimisation.md` §16.5, `08_Guide_Developpeur.md` §2.1, `09_Commandes_Utiles.md` §3 | suite d'O7 (choix utilisateur) : regrouper les 8 561 assets par thème dans l'éditeur sans renommer de dossier ; collection transversale `LifePlay_Chemins_Fixes` (4 984 assets à ne pas déplacer) ; 13 545 chemins, 0 inconnu, chargées par l'éditeur ; aucun asset modifié, pas de build | supprimer `Content/Collections/LifePlay*.collection` (`git checkout O7d-avant` pour le reste) | | CHG-082 | 2026-10-02 | O7d | `Tools/BuildCollections.py` : collections écrites dans `Saved/Collections` (locales) au lieu de `Content/Collections` (partagées) ; 13 fichiers déplacés vers `D:\Game\LifePlay_Backup_5.5\O7d\Content_Collections` puis régénérés (identiques) ; `11_Audit_Optimisation.md` §16.5, `08_Guide_Developpeur.md` §2.1 | avertissement à l'ouverture de l'éditeur (utilisateur) : une collection partagée exige un fournisseur de contrôle de révision, désactivé dans ce projet ; une collection locale n'en utilise pas ; validé par l'utilisateur le 2026-10-02 (plus d'avertissement) | `git checkout O7d-apres -- Tools/BuildCollections.py` et remettre les fichiers sauvegardés | | CHG-083 | 2026-10-02 | O7e | `11_Audit_Optimisation.md` §16.6 | étude en lecture seule de l'intégration d'une coiffure Fab (demande utilisateur) : liste des coiffures = valeur par défaut `GI.HairstyleTable` (126 entrées, 35 absentes déjà en 4.27), suivi par noms d'os Genesis 8, morphs de forme facultatifs, sauvegardes par nom ; 34 coiffures Fab, ≈ 12 maillages utilisables | — (documentation) | | CHG-084 | 2026-10-02 | H1 | nouveaux `Source/LifePlay/LPHairstyleSubsystem.h/.cpp`, module `Content/Modules/lp_Revival` (`lp_Revival.lpmod`, `Hairstyles/h1_testhair.lphair`) ; asset de test `Content/Heavy/New5/Hairs/H1_TestHair` (copie de `FloraHair_New`, hors dépôt) ; `11_Audit_Optimisation.md` §16.7 | liste des coiffures ouverte aux mods (demande utilisateur) : fichiers `.lphair` ajoutés en fin de `GI.HairstyleTable` sans modifier de Blueprint ; vérifié au journal : doublons refusés, 1 coiffure ajoutée (table 126 → 127) ; build `LifePlay_Build_5.5_H1` ; validé en jeu le 2026-10-02 (nouvelle partie et liste des villes, coiffure ajoutée en fin de liste, suivi des animations, module désactivé puis réactivé, Continue) | supprimer le module `lp_Revival` (ou le désactiver) ; `git checkout H1-avant -- Source` | | CHG-085 | 2026-10-02 | O7e | nouvelle commandlet `Source/LifePlayEditorTools/LPHairFromStaticMeshCommandlet.h/.cpp` (+ `SkeletalMeshUtilitiesCommon`, `StaticMeshDescription` dans `LifePlayEditorTools.Build.cs`) ; assets `Content/Heavy/New5/Hairs/Pocolov17*` (hors dépôt) ; `Content/Modules/lp_Revival/Hairstyles/pocolov17.lphair` (remplace `h1_testhair.lphair`, `H1_TestHair` retiré) ; `Licenses/Free_3D_Models_Credits.txt` ; `11_Audit_Optimisation.md` §16.8 | première coiffure Fab (Pocolov Hair 17, CC BY 4.0, téléchargée avec l'accord de l'utilisateur) : maillage statique rattaché au squelette Genesis 8, ajusté à la tête de Bridget, matériaux `DazHair` ; build `LifePlay_Build_5.5_O7e` : coiffure ajoutée (index 126) ; test en jeu en attente | retirer `pocolov17.lphair` ; sauvegardes dans `D:\Game\LifePlay_Backup_5.5\O7e` ; `git checkout O7e-avant -- Source Content/Modules Licenses` | | CHG-086 | 2026-10-02 | O7e | `LPHairFromStaticMeshCommandlet` : ajustement sur le haut du crâne (`-Cranium`, `-Margin`) ; `Pocolov17` et `_Skeleton` régénérés (premier essai dans `O7e\essai1`), `Pocolov17_Strands` : `Thicken` 10 → 1 ; `11_Audit_Optimisation.md` §16.8 | premier essai en jeu (capture utilisateur) : coiffure trop étroite enfoncée dans le crâne, mèches opaques ; échelle 0,74 → 1,19 en largeur ; build `LifePlay_Build_5.5_O7e` reconstruit ; test en jeu en attente | `Tools`/assets : remettre `O7e\essai1` ; `git checkout O7e-apres -- Source/LifePlayEditorTools` | | CHG-087 | 2026-10-02 | O7e | `Pocolov17_Cap` (hors dépôt) : `MapOpacity` = texture blanche du moteur ; `11_Audit_Optimisation.md` §16.8 | second essai en jeu correct (crâne couvert, couleur appliquée, profil bien placé) ; trous au-dessus de l'oreille dus à la lisière découpée de la calotte ; retouche choisie par l'utilisateur ; build `LifePlay_Build_5.5_O7e` reconstruit | remettre `Pocolov17_CapOpacity` dans `MapOpacity` | | CHG-088 | 2026-10-02 | O7e | — | O7e validé en jeu par l'utilisateur (profil sans trou, mouvement suivi) ; défaut mineur accepté : bas de la calotte visible sous le lobe de l'oreille | — | | CHG-089 | 2026-10-02 | H2 | `Source/LifePlay/LPHairstyleSubsystem.h/.cpp` (mode base, plusieurs coiffures par fichier, `NONE`, `MORPHABLE`, vérification `-LPVerifyHairstyles`) ; nouveau `Content/Modules/vin_Base/Hairstyles/vin_Base.lphair` (126 coiffures, 89 morphs) ; `11_Audit_Optimisation.md` §16.9 | liste de base des coiffures sortie du Blueprint (demande utilisateur) ; vérifié : table et morphs reconstruits identiques au Blueprint ; build `LifePlay_Build_5.5_H2` ; validé en jeu le 2026-10-02 (nouvelle partie, liste du menu inchangée avec Pocolov17 en dernier, personnages générés, Continue) | supprimer `vin_Base.lphair` (retour à la table du Blueprint) ; `git checkout H2-avant -- Source/LifePlay` | | CHG-090 | 2026-10-02 | H2b | `Source/LifePlay/LPHairstyleSubsystem.h/.cpp` (clés `FACIAL_HAIR`, `BODY_HAIR_M`, `BODY_HAIR_F`) ; `Content/Modules/vin_Base/Hairstyles/vin_Base.lphair` (+ 44 noms) ; `11_Audit_Optimisation.md` §16.10 | pilosité sortie du Blueprint (demande utilisateur) : listes `GI.FHairstyles`, `BHairstyles_M`, `BHairstyles` ; `GI.OtherTable` laissée (maillages absents depuis 4.27) ; vérifié : 3 listes identiques au Blueprint ; build `LifePlay_Build_5.5_H2` ; validé en jeu le 2026-10-02 (28 barbes + sans barbe dans le menu de création) | retirer les lignes `*_HAIR` de `vin_Base.lphair` ; `git checkout H2b-avant -- Source/LifePlay` | | CHG-091 | 2026-10-02 | Doc | nouveaux `Docs/Migration/13_Protocole_Coiffure.md`, `Tools/HairImportFbx.py`, `Tools/HairMaterials.py` ; `README.md` (migration), `08_Guide_Developpeur.md`, `09_Commandes_Utiles.md` | protocole de conversion d'une coiffure (demande utilisateur) ; scripts ponctuels d'O7e rendus paramétrables ; protocole rejoué de bout en bout sur Pocolov 17 sous le nom `Pocolov17P` : bornes identiques au millimètre, dépendances OK ; essai retiré du projet (`D:\Game\LifePlay_Backup_5.5\O7e\proto_essai`) | `git revert` du commit | | CHG-092 | 2026-10-02 | HAIRS1 | nouveaux `Tools/HairPipeline.ps1`, `Tools/FbxMaterialMap.py`, `Tools/hairs/HAIRS1.json` ; `Tools/HairImportFbx.py` (rapport JSON), `Tools/HairMaterials.py` (calotte seulement si utilisée, contrôle des dépendances) ; assets `Content/Heavy/New5/Hairs/Pocolov03/06/11/15/16*` (hors dépôt) ; `Content/Modules/lp_Revival/Hairstyles/pocolov03/06/11/15/16.lphair` ; `Licenses/Free_3D_Models_Credits.txt` ; `13_Protocole_Coiffure.md` §7 | industrialisation de la conversion (demande utilisateur) et test sur 5 coiffures Pocolov (CC BY 4.0, téléchargées avec l'accord de l'utilisateur) ; 5 cas d'archives différents intégrés aux règles ; build `LifePlay_Build_5.5_HAIRS1` : 6 coiffures ajoutées (index 126 à 131) ; contrôle visuel en jeu en attente | retirer les `.lphair` ; assets et sources dans `D:\Game\LifePlay_Backup_5.5\HAIRS1` ; `git checkout HAIRS1-avant -- Tools Licenses Content/Modules` | | CHG-093 | 2026-10-02 | SKIN | `LPHairFromStaticMeshCommandlet` : liaison par transfert de poids depuis le corps (`-Skin=transfer` par défaut, 6 voisins, bras et jambes exclus) et sortie de la peau (`-Gap` 0,3 cm) ; `LifePlayEditorTools.Build.cs` (`SkeletalMeshDescription`, `AnimationCore`) ; `HairPipeline.ps1` (`-Rebuild`, options `skin`, `gap`) ; 6 coiffures Pocolov reconstruites (versions précédentes dans `HAIRS1\\precedente_*`), Pocolov 17 ajoutée au lot ; `.lphair` et crédits : description des modifications corrigée ; `13_Protocole_Coiffure.md` | vidéo utilisateur : mèches longues liées à la seule tête, qui traversent épaules et poitrine quand la tête tourne ; poids obtenus : tête 47 à 62 %, cou, clavicules, poitrine ; 254 à 950 sommets sortis de la peau par coiffure ; build `LifePlay_Build_5.5_SKIN` ; validé en jeu le 2026-10-02 (les mèches ne traversent plus la peau quand la tête tourne) | `-Skin=rigid` ; `git checkout SKIN-avant -- Source Tools` et remettre les versions précédentes | | CHG-094 | 2026-10-02 | UI14 | nouveaux `Source/LifePlay/LPVersionSubsystem.h/.cpp`, `Source/LifePlayEditorTools/LPEditWidgetCommandlet.h/.cpp` (+ `Json` dans le `.Build.cs`), `Tools/ui/MainMenu_V1.4.json`, `Docs/Migration/14_Interface_V1.4.md` ; `Content/UI/MainMenu.uasset` (6 modifications, diff conforme) ; `Content/Modules/donors.txt` (→ `Vinfamy`) ; `Config/DefaultGame.ini` (`ProjectVersion=2026.10.4`) | demande utilisateur avant la V1.4 : version année.mois.publication, crédits vidés avec Vinfamy auteur original, Donate → Patreon edujiro5972, Discord → discord.gg/q4689pNSy, Commission masqué ; build `LifePlay_Build_5.5_UI14` : « LifePlay 2026.10.4 » ; validé en jeu le 2026-10-02 (version, crédits, bouton Commission masqué, liens Donate et Discord) | `Tools\Restore.ps1 -Lot UI14` ; `git checkout UI14-avant -- Config Source Content/Modules/donors.txt` | | CHG-095 | 2026-10-02 | MODS14 | nouveaux `Tools/SplitModules.ps1`, `Tools/modules/V1.4.json`, `Docs/Migration/15_Modules_Optionnels.md` ; build `LifePlay_Build_5.5_Shipping_V1.4` (dossier neuf, contrôlé : pas de fichier périmé) ; archive `D:\Game\LifePlay_Publication\LifePlay_Revival_V1.4_Optional_Modules.zip` (875 812 octets, 626 fichiers, SHA-256 `cd8b4ffa9f676d3703fce9d2b42a0f61682c6c04bda30d033630c8f1be8fd236`) | demande utilisateur : build Shipping réduite à l'essentiel (`vin_Base`, `lp_Revival`, `vin_VanillaRealistic`), 14 modules optionnels à part ; vérifié dans les Blueprints : aucun fichier de module optionnel lu en dur, `GI.removeDeletedMods` retire les modules absents ; build allégé démarré sans plantage ; validé en jeu le 2026-10-02 (build sans les modules optionnels, puis avec l'archive extraite) ; modules de test retirés du build vers `LifePlay_Build_5.5_Shipping_V1.4_test_extraction` | remettre les dossiers de `LifePlay_Build_5.5_Shipping_V1.4_modules_optionnels` dans le build | | CHG-096 | 2026-10-02 | V1.4 | `README.md` (section V1.4, branche `ue5.5-v1.4`) ; `Donate.url` (racine) → Patreon edujiro5972, comme le bouton Donate ; tag annoté `v1.4` | publication de la V1.4 (LifePlay 2026.10.4) : coiffures en fichiers `.lphair`, 6 coiffures Pocolov, chaîne d'import, menu principal, modules optionnels séparés | — | | CHG-097 | 2026-10-02 | V1.4 | archives de publication (`D:\Game\LifePlay_Publication`) : sources `LifePlay_Revival_V1.4_UE5.5_Full_Source_Code.7z` (4 942 392 569 octets, 12 766 entrées, SHA-256 `bda44e52e8f45775e09fdea51b613bb64fc5e0c7fd0ec76108804e0bb39b3426`, script `make_archive_v1_4.cmd`) ; jeu `LifePlay_Revival_V1.4_Windows_Game.7z` (1 301 813 923 octets, racine `LifePlay_Revival_V1.4`, SHA-256 `d4a36542550ae2bcc7f3f634255125fc6c7520f5cf29df4b74ae3bbc0ac55a9f`, script `make_game_v1_4.cmd`) ; modules optionnels `LifePlay_Revival_V1.4_Optional_Modules.zip` (875 812 octets, SHA-256 `cd8b4ffa9f676d3703fce9d2b42a0f61682c6c04bda30d033630c8f1be8fd236`) | contrôles : tests 7-Zip ; sources : aucun `.mcp.json`/`.claude`/`McpAutomationBridge`/`Saved`/`Intermediate`/jeton, 17 modules, 10 fichiers identiques au tag `v1.4`, `.git` = `a83ea56` ; jeu : 3 modules (`vin_Base`, `lp_Revival`, `vin_VanillaRealistic`), ni `Saved` ni `.pdb` | liens Mega à ajouter après envoi | | CHG-098 | 2026-10-02 | V1.4 | `README.md` : archive des sources V1.4 en téléchargement principal (lien Mega), V1.3 ajoutée aux versions précédentes | lien Mega de l'archive développeur reçu ; liens du jeu et des modules optionnels à venir | — | | CHG-099 | 2026-10-02 | V1.4 | `README.md` : section V1.4, point des modules optionnels reformulé (plus de nom d'archive ni de mode d'installation) | décision utilisateur : les archives du jeu et des modules optionnels ne sont pas annoncées sur GitHub (la documentation technique garde les détails de l'outil) | `git revert` du commit | | CHG-100 | 2026-10-03 | H3 | nouveau `Docs/Migration/16_H3_Mods_Paquets.md` | préparation de H3 (demande utilisateur) : étude en lecture seule du moteur 5.5 (dossier `Mods/` lu par le gestionnaire de plugins en jeu empaqueté, plugins Mod activés par défaut, paquets de plugins montés au démarrage, registre `AssetRegistry.bin` des plugins chargé) et de la configuration (paquets non signés, shaders intégrés aux matériaux, IoStore) ; architecture, risques, lots H3a à H3c | — (documentation) | | CHG-101 | 2026-10-03 | H3a | `Releases/2026.10.4` (non versionné, 1,3 Go) ; `ModSources/LPHairSample/` (`LPHairSample.uplugin`, `Module/LPHairSample.lpmod`, `Module/Hairstyles/pocolov05.lphair`, `Module/CREDITS.txt` ; assets `Content/Hairs/Pocolov05*` non versionnés) ; `Tools/mods/LPHairSample.json` ; `Tools/HairPipeline.ps1` (chemins de plugin, `credits`) ; `Tools/HairMaterials.py` (contrôle des dépendances par chemin de paquet) ; `.gitignore` (`/Releases/`, `/Mods/`, produits et assets de `ModSources`) ; builds `LifePlay_Build_5.5_Ref_2026.10.4`, `LifePlay_Build_5.5_H3a` | prototype H3a : version de référence (paquets identiques au V1.4 publié), mod d'essai Pocolov 05 (Fab, CC BY 4.0, téléchargement accordé) cuit en DLC contre 2026.10.4 (6 paquets, 0 erreur) et installé dans une copie du V1.4 ; version `2026` mal nommée (argument coupé par PowerShell) déplacée vers `LifePlay_Backup_5.5\H3a` ; **validé en jeu le 2026-10-03** (16_H3_Mods_Paquets.md §5) | supprimer `ModSources/LPHairSample`, `Tools/mods`, `Releases/2026.10.4` ; `git revert` du commit | | CHG-102 | 2026-10-03 | H3a | `Source/LifePlay/LPHairstyleSubsystem.h/.cpp` ; `Content/Modules/lp_Revival/lp_Revival.lpmod` (`MODULE_DEFAULT_ENABLED: true`) | retour utilisateur : coiffure du mod présente alors que le mod est décoché. Le sous-système (H1) tenait pour actif un module absent de `GI.ModEnableds`, alors que le jeu le tient pour inactif (défaut présent en V1.4 : `lp_Revival` affiché décoché mais actif). Même règle que le jeu ; un module à clé `MODULE_DEFAULT_ENABLED: true` absent de la liste y est ajouté coché (au démarrage et après `LoadSettings`). Validé en jeu le 2026-10-03 | `git revert` du commit, recompiler | | CHG-103 | 2026-10-03 | UI15 | `Content/UI/MainMenu.uasset`, `Content/UI/ModManager.uasset` (snapshot `LifePlay_Backup_5.5\UI15`) ; nouveaux `Source/LifePlayEditorTools/LPTitleModManagerCommandlet.h/.cpp`, `Source/LifePlay/LPModSettingsLibrary.h/.cpp`, `Docs/Migration/17_Mods_Ecran_Titre.md` ; build `LifePlay_Build_5.5_UI15b` | demande utilisateur : gestionnaire de mods dès l'écran titre, puis choix entre nouvelle partie et partie sauvegardée. Entrée dédiée sur l'écran titre (copie de « Load »), fermeture vers le menu titre avec relecture des données et enregistrement du choix (`SaveModSelection`, sans toucher à la dernière sauvegarde) ; entrée d'origine inchangée en partie. Première version (entrée d'origine rendue visible) remplacée après retour (alignement). **Validé en jeu le 2026-10-03** | `.\Tools\Restore.ps1 -Lot UI15` ; `git revert` du commit | | CHG-104 | 2026-10-03 | H3b | nouveaux `Tools/BuildMod.ps1`, `Tools/ModSource.ps1` ; `Tools/HairPipeline.ps1` (mode `mod` : montage temporaire, `.lphair` et crédits dans `ModSources//Module`, `-Rebuild` déplace aussi les textures) ; `Tools/HairMaterials.py` (analyse synchrone du dossier, réutilisation des textures) ; `Tools/mods/LPHairSample.json` (`mod`) ; `Source/LifePlay/LPHairstyleSubsystem.cpp` (repli `DoesPackageExist`) ; Pocolov 05 reconstruite (précédente dans `LifePlay_Backup_5.5\H3a\Pocolov05\precedente_*`) ; build `LifePlay_Build_5.5_H3b` ; archive `D:\Game\LifePlay_Publication\Mods\LPHairSample-for-LifePlay-2026.10.4.zip` (334 473 octets, SHA-256 `8F6A45ED…CBC8`) | lot H3b : un mod d'assets en une commande ; plantage de `HairMaterials.py` dans un plugin expliqué (registre de la commandlet sans les assets du plugin) et corrigé ; build de base sans rien du mod par construction. **Validé en jeu le 2026-10-03** (16_H3_Mods_Paquets.md §6) | `git revert` du commit, recompiler | | CHG-105 | 2026-10-03 | H3c | nouveaux `Docs/Modding/FullGuides/Creating_Asset_Mods.md`, `Docs/Modding/ShortGuides/explanation.lphair`, `Tools/NewMod.ps1`, `Tools/EditMod.ps1` ; `Docs/Modding/ShortGuides/explanation.lpmod` (`MODULE_DEFAULT_ENABLED`) ; `Docs/Migration/10_Protocole_Operations.md` §6, `09_Commandes_Utiles.md` §7 (liste de contrôle de publication), `16_H3_Mods_Paquets.md` §7 | lot H3c : guide des moddeurs en anglais, outils de création et d'édition d'un mod, version de référence intégrée à la procédure de publication (livrée dans l'archive des sources ; `Mods/` vide au build) | `git revert` du commit | | CHG-106 | 2026-10-03 | H3d | nouveaux `Source/LifePlay/LPModInfoSubsystem.h/.cpp` ; `Source/LifePlay/LifePlay.Build.cs` (`Slate`, `SlateCore`) ; `Tools/NewMod.ps1` (métadonnées), `Tools/BuildMod.ps1` (ordre des lignes 1 à 3, `MODULE_PACKAGED`, `MODULE_GAME_VERSION`, `.uplugin` livré, contrôle prix et licences, nom d'archive) ; `Docs/Modding/FullGuides/Creating_Asset_Mods.md` §4b, `explanation.lpmod` | demande utilisateur : métadonnées extensibles (dates, licence, lien de l'auteur, prix) et avertissement en jeu quand un mod a été construit pour une autre version. Le jeu ne lit que les 3 premières lignes d'un `.lpmod`, par position ; fenêtre Slate C++, sans Blueprint. **Validé en jeu le 2026-10-03** | `git revert` du commit, recompiler | | CHG-107 | 2026-10-03 | H3d | nouveau mod `ModSources/lpr_hair_pocolov` (`.uplugin`, `Module/` : `.lpmod`, 12 `.lphair`, `CREDITS.txt` ; assets non versionnés), `Tools/mods/lpr_hair_pocolov.json` ; retirés : `Content/Modules/lp_Revival` (6 `.lphair`, `.lpmod`), assets `Content/Heavy/New5/Hairs/Pocolov*` (non versionnés), `ModSources/LPHairSample`, `Tools/mods/LPHairSample.json` (tous vers `LifePlay_Backup_5.5\H3d\retires`) ; `Licenses/Free_3D_Models_Credits.txt` (lignes Pocolov remplacées par un renvoi ; snapshot `H3d`) ; nouveau `Tools/modules/next.json` ; builds `LifePlay_Build_5.5_H3d` ; archive `D:\Game\LifePlay_Publication\Mods\lpr_hair_pocolov-1.0-for-LifePlay-2026.10.4.zip` (3 807 460 octets, SHA-256 `4E9420E5…2B8F`) | demande utilisateur : module `lpr_hair_pocolov` regroupant les assets Pocolov ; choix utilisateur : les 12 coiffures CC BY, les 6 du jeu de base déplacées dans le paquet, mod d'essai retiré ; 5 archives téléchargées (accord). **Validé en jeu le 2026-10-03** | remettre les dossiers de `LifePlay_Backup_5.5\H3d\retires` ; `.\Tools\Restore.ps1 -Lot H3d` ; `git revert` du commit | | CHG-108 | 2026-10-03 | H3c | `Docs/Modding/FullGuides/Creating_Asset_Mods.md` §5 | essai utilisateur de `Tools/EditMod.ps1` : mod monté et chargé (« Mounting Mod plugin lpr_hair_pocolov »), 12 coiffures visibles une fois « Afficher le contenu des plugins » coché dans le navigateur de contenu (masqué par défaut ; la recherche porte sur les noms d'assets) : précision ajoutée au guide. **H3c validé le 2026-10-03** | `git revert` du commit | | CHG-109 | 2026-10-03 | PUB | `Tools/SplitModules.ps1` (mode `per_module` : une archive par module, notice tirée du `.lpmod`, `INDEX.txt` ; refus d'un build contenant un mod d'assets installé) ; `Tools/modules/next.json` ; `Docs/Migration/15_Modules_Optionnels.md` §5, `09_Commandes_Utiles.md` §7 | décision utilisateur pour la prochaine publication : chaque mod livré dans un zip indépendant, sauf les modules de base (texte) gardés dans le build Shipping ; diffusion des modules sur Discord dans un premier temps. Essai sur une copie (15 archives, 640 fichiers, garde-fou vérifié) | `git revert` du commit | | CHG-110 | 2026-10-03 | H3c | sources texte de `ModSources/lpr_hair_pocolov` (`.uplugin`, `.lpmod`, 12 `.lphair`, `CREDITS.txt`) | incident : le commit `54f6604` (tag `H3c-valide`) a été fait pendant que le mod était monté dans `Mods/` par `EditMod.ps1` (éditeur ouvert) ; `git add -A` a enregistré la suppression de ses sources. Aucune perte sur disque (mod remis dans `ModSources/` à la fermeture de l'éditeur, 70 assets présents) ; sources réenregistrées par `bf9bb58`. Règle ajoutée (10_Protocole_Operations.md §6) : ne jamais commiter ni lancer un build tant que `Mods/` n'est pas vide. Le tag `H3c-valide` reste sur `54f6604` (déplacement non fait sans accord) | — | | CHG-111 | 2026-10-03 | V1.5 | `Config/DefaultGame.ini` (`ProjectVersion=2026.10.1.5`), format de version (`14_Interface_V1.4.md`, `LPVersionSubsystem.h`), `README.md` (section V1.5, branche), `Tools/modules/next.json` (groupe `vin_*`), `Tools/SplitModules.ps1` (groupes), `Tools/BuildMod.ps1` (`INDEX.txt`), `15_Modules_Optionnels.md` ; build `LifePlay_Build_5.5_Shipping_V1.5` (version de référence `Releases/2026.10.1.5`, paquets identiques ; 2 modules de base) ; `Releases/2026.10.4` déplacé vers `LifePlay_Backup_5.5\Releases` ; modules `D:\Game\LifePlay_Publication\Modules_2026.10.1.5` (`vin_Modules`, `lpr_hair_pocolov-1.0`, `INDEX.txt`) | publication V1.5 (décisions utilisateur : version `année.mois.majeur.mineur` ; modules `vin_*` en un seul zip, autres mods chacun le leur ; diffusion des modules sur Discord, rien sur GitHub). Validé en jeu le 2026-10-03 ; les mods extraits dans le build pour le test et les fichiers de session ont été déplacés vers `LifePlay_Build_5.5_Shipping_V1.5_test_extraction` (build contrôlé contre le manifeste UAT : 0 fichier en trop, 1 459 fichiers) | `git revert` des commits V1.5 | | CHG-112 | 2026-10-03 | V1.5 | archives `D:\Game\LifePlay_Publication` : `LifePlay_Revival_V1.5_UE5.5_Full_Source_Code.7z` (6 195 829 571 octets, SHA-256 `a71e77ca98c9a86399e4e8685f2b7ea74d6e9358694094968648f98acf7bc9d3` ; avec `Releases/2026.10.1.5` et `ModSources/`, `.git` du clone propre sur `v1.5`) ; `LifePlay_Revival_V1.5_Windows_Game.7z` (1 300 541 638 octets, SHA-256 `f5e34ecaf8de90659853a9ae2393b2571ae45894808f4f2b59ba1b4e857a7fe1`, racine `LifePlay_Revival_V1.5`) ; scripts `make_archive_v1_5.cmd`, `make_game_v1_5.cmd` | archives de publication V1.5 : tests 7-Zip OK ; sources sans `.mcp.json`, `.claude`, `Saved`, `Mods`, `Intermediate`, McpAutomationBridge, produits de cuisson des mods, ni `SecurityToken` dans `Config` ; jeu sans aucun mod. Clone propre mis à jour depuis le dépôt local (récupération GitHub bloquée, arrêtée) | — | | CHG-113 | 2026-10-03 | V1.5 | `README.md` (téléchargement : archive des sources V1.5 en principal, lien Mega, SHA-256, raison de la taille ; V1.4 dans les versions précédentes) | lien Mega de l'archive des sources V1.5 fourni par l'utilisateur ; le jeu et les modules (Discord) ne sont pas mentionnés sur GitHub | `git revert` du commit | | CHG-114 | 2026-10-04 | Dbg | nouveaux `Tools/BuildDebug.ps1`, `Tools/CollectDebugArtifacts.ps1`, `Tools/SummarizeDebugCsv.ps1`, `Tools/debug/*.bat`, `Source/LifePlay/LPDebugSubsystem.h/.cpp`, `Docs/Migration/18_Build_Debug.md` ; événements nommés `LoadTxt` / `LPDataCache` ; `LPModInfoSubsystem` (`ModInfoCheckInterval`) et `LPModSettingsLibrary` (`SettingsModEnabledsName`) pour le build unifié ; `08`, `09`, README migration, skill `lifeplay-debug-build` | mesure reproductible (Insights, mémoire, CSV) sans coût Shipping : `#if !UE_BUILD_SHIPPING`, `IncludeDebugFiles` inchangé, pas de `-nodebuginfo` | `git revert` du commit | | CHG-115 | 2026-10-04 | G6a | `Source/LifePlay/LPDataCompat.h/.cpp` (`FindCenterOfPolygon`) ; nouveaux `Source/LifePlayEditorTools/LPFixFindCenterCommandlet.h/.cpp` ; `Content/BPs/GI.uasset` (4 appels rebranchés : 3 dans l'EventGraph, 1 dans `MoveTo` ; fonction Blueprint d'origine laissée en place) ; snapshot `LifePlay_Backup_5.5\G6a` | feuille CPU de l'image Continuer, trace Development `G6Dev.utrace` (464 Mo, canaux `cpu,frame,bookmark,loadtime`, sans `memory`) : `FindCenterOfPolygon` 0,350 s exclusif / 0,742 s inclus, 49 425 appels. Centre de boîte englobante, coordonnées ramenées en float, aire ` | dx | | CHG-116 | 2026-10-04 | G6b | `ULPDataCompat::PreloadCityPackages` ; appel dans `LPModInfoSubsystem::Initialize` | lot I/O séparé de CHG-115. Le canal `loadtime` de `G6Dev.utrace` nomme les paquets lus pendant l'image longue : `/Game/Heavy/StreetMap/Static/CentralLondon` (maillage, vrac cuit de l'ordre des 164 Mo du CSV I6) et `/Game/Heavy/StreetMap/CentralLondon` (données StreetMap). Lecture async prioritaire dès l'instance de jeu, pas dans l'image du clic Continuer. Disque chaud : l'attente synchrone de cette trace était 0,325 s (`GetAsset` × 2) ; l'image I6 à froid faisait 6,2 s. Partie du 2026-10-04 : `Preload ville : demande envoyee` à 14:31:06, image Continuer à 14:31:15 | retirer l'appel dans `LPModInfoSubsystem::Initialize` | | CHG-117 | 2026-10-04 | Dbg | `LPDebugSubsystem` (`-LPCollisionLog`) ; `LifePlay.Build.cs` (`Chaos`) ; lanceurs `LifePlay_debug_sessionB_mem.bat` et `LifePlay_debug_collision.bat` ; `09`, `18` §10, skill `lifeplay-debug-build` | le dump du `ExecCmds` de démarrage (I5, 23 primitives, 1 trimesh) ne nomme pas l'acteur des 93 Mo de trimesh. Le switch échantillonne toutes les 2 s et écrit le porteur des triangles. Rapport : les capsules PNJ sont les 0,11 Mo de convexes, pas le trimesh | `git revert` du commit | | CHG-118 | 2026-10-04 | Dbg | `Tools/debug/LifePlay_debug_ui.bat` et `.ps1` ; `BuildDebug.ps1` copie aussi le `.ps1` ; `18` §3 | choisir les options de mesure dans une fenêtre, au lieu de lancer `LifePlay.exe` sans switch. Le canal `memory` est décoché par défaut. `-csvCaptureFrames` n'est pas proposé. Copié dans l'archive Development déjà cuite | supprimer les deux fichiers | | CHG-119 | 2026-10-04 | PairCap | nouveaux `Source/LifePlay/LPPairCapsuleSubsystem.h/.cpp` (snapshot `LifePlay_Backup_5.5\PairCap` : sources absentes, journal sauvegardé) | essai demandé : après la coupure des capsules d'une scène à deux (`GI.SexPersons`, sinon `AP1` et `AP2`, les deux en `NoCollision` et à moins de 4 m), une capsule unique orientée de l'un vers l'autre, canal `Pawn`, rayon du corps, longueur qui les couvre. Les capsules d'origine restent coupées. Les meubles qui ignorent `Pawn` et le sol ne l'arrêtent pas. Si le balayage touche un mur, le couple est repoussé ensemble. Journal : `Capsule couple : posee` / `retiree` | `.\Tools\Restore.ps1 -Lot PairCap` | | CHG-120 | 2026-10-04 | PairCap2 | `LPPairCapsuleSubsystem.h/.cpp` (snapshot `LifePlay_Backup_5.5\PairCap2`) | retour de la partie 16:25 : capsule posée rayon 20, barrière sur le lit, murs toujours traversés, capsule du joueur absente à la fin. Inversion : la capsule du couple est posée après la coupure, droite, calée sur les deux maillages, canal `WorldDynamic` (les meubles ignorent seulement `Pawn`). Le lit et le sol ne repoussent pas. À la fin de la scène elle est détruite, les capsules du couple reviennent en `QueryAndPhysics`, gravité du joueur à 1 si `GI::Show` l'avait mise à 0 | `.\Tools\Restore.ps1 -Lot PairCap2` | | CHG-121 | 2026-10-04 | PairCap | retrait de `Source/LifePlay/LPPairCapsuleSubsystem.h/.cpp` (`Restore.ps1 -Lot PairCap -Only` ces deux fichiers ; copies dans `LifePlay_Backup_5.5\PairCap\_retires\20261004-170801`) | demande utilisateur : annuler toutes les modifications de capsules (CHG-119 et CHG-120). La scène à deux était devenue injouable. Aucun Blueprint touché. Cuisson Development ensuite pour retirer le sous-système de l'exécutable joué | remettre les deux fichiers de `_retires\20261004-170801` | | CHG-122 | 2026-10-04 | PairCol | nouvelle commandlet éditeur `Source/LifePlayEditorTools/LPPairCollisionTestCommandlet.h/.cpp` | essai hors partie (demande utilisateur) : `work___vin01` reconstruit dans une scène d'éditeur (54 meubles, échelle monde ~1, aucun Blueprint modifié, pas de cuisson). Capsules copiées du CDO `Person` (rayon 20, demi-hauteur 88, profil Custom : Pawn Ignore, WorldStatic Ignore, WorldDynamic Block). Le balayage est celui de la marche, l'animation n'est pas jouée. Résultat (`Saved/Logs/portage/LPPairCollisionTest.txt`, code 0) : meuble qui ignore Pawn traversé (371 cm) ; meuble qui bloque Pawn arrête une capsule active à 50 cm (`fnt_new183`) et laisse passer une capsule `NoCollision` ; deux capsules au profil Person se traversent déjà ; avec le profil Pawn du moteur, `IgnoreActorWhenMoving` les laisse se traverser (80 cm) pendant que le meuble les arrête encore | supprimer les deux fichiers de la commandlet | | CHG-123 | 2026-10-04 | PairCol | nouveaux `Source/LifePlay/LPPairSandbox.h/.cpp`, `Tools/debug/LifePlay_pair_sandbox.bat` | fenêtre jouable à part de la partie (demande utilisateur) pour voir les deux réglages. Chambre `work___vin01` (54 meubles), capsules du CDO `Person` dessinées (verte joueur, cyan autre, rouge si coupée). Touche 1 : meubles bloquent `Pawn`. Touche 2 : capsules `QueryAndPhysics` ou `NoCollision`. L'instance de jeu Blueprint n'est pas chargée. Ouverture vérifiée : mode `LPPairSandboxGameMode`, 54 meubles, 0 absent, capsule 20 / 88, départ (−700, −700, 108) | supprimer les trois fichiers | | CHG-124 | 2026-10-04 | PairCol | `LPPairSandbox` : soleil, contre-jour, ciel, lampe au-dessus du couple ; maillages `bridget_gp` (joueur) et `michael` (l'autre) sur les capsules | la fenêtre montrait les capsules sans corps et restait sombre. La collision reste celle de la capsule : le maillage ne bloque pas | retirer les lumières et les `SetSkinnedAssetAndUpdate` | | CHG-125 | 2026-10-04 | PairCol | `LPPairSandbox` : soleil, contre-jour, ciel et correction d'exposition retirés ; un spot au plafond (cône vers le bas, au-dessus du couple) et deux lampes latérales | la fenêtre aveuglait. L'éclairage de la pièce est celui d'un bureau : plafonnier et deux lampes sur les côtés | remettre le soleil | | CHG-126 | 2026-10-04 | PairCol | `LPPairSandbox` : plafonnier et lampes créés mobiles avant l'enregistrement ; exposition manuelle, `r.EyeAdaptationQuality` à 0 | la lumière brillait une seconde puis s'éteignait : lampes stationnaires sans précalcul, et l'œil automatique assombrissait la pièce | remettre les lumières stationnaires | | CHG-127 | 2026-10-04 | PairCol | `LPPairSandbox` : plafonnier 80 000, lampes latérales 25 000, cône plus large, chute non quadratique, exposition manuelle +6, ombres des lampes coupées | avec l'exposition du projet (calée sur un soleil), 5 000 candelas restaient noires. Les trois lampes éclairent le couple sans soleil | revenir aux intensités de CHG-126 | | CHG-128 | 2026-10-04 | PairCol | `LPPairSandbox` : plafonnier, lampes latérales et exposition forcée retirés. Éclairage copié de `CentralLondon` : `FullBodyLight` intensité 1,5 (canal 0), `Sun` intensité 5 température 10 000 K (canal 1 seulement), `SkyLight` cubemap `urban_street_03_1k` intensité 0,6, `SkyAtmosphere` à Z −100 000, `BP_Sky_Sphere` branché sur le soleil. Les trois lumières sont mobiles | la pièce restait noire. Le jeu n'éclaire pas le bureau avec un plafonnier : le relevé de la carte donne ces intensités, et `SkylightHours` va de 0,2 (nuit) à 0,7 (midi). 0,6 est l'heure 9 et l'heure 15. L'exposition redevient celle du projet | remettre le plafonnier de CHG-127 | | CHG-129 | 2026-10-04 | PairCol | `LPPairSandbox` : sol en `BlockAllDynamic` (la capsule Person ignore `WorldStatic`), départ cherché sur le canal `Pawn`, apparition au point libre, vitesse remise à zéro, physique du maillage Daz coupée. Si le corps passe sous le sol, retour au point de départ | Bridget traversait la pièce puis tombait sans fin : le cube `BlockAll` ne porte pas cette capsule, et un départ dans un meuble l'éjecte | remettre le sol `BlockAll` | | CHG-130 | 2026-10-04 | PairCol | `LPPairSandbox` : quatre murs, sol et plafond de `Room` (cubes `FntWall`, positions du Blueprint, enfants de la racine à l'échelle du `.lpworld`). Les murs bloquent en `WorldDynamic`. Plafond sans collision, comme `WallT` | la pièce n'avait pas d'enveloppe : Bridget sortait. Les meubles bloquent et les deux capsules se traversent, c'est le réglage déjà mesuré | retirer les six cubes | | CHG-131 | 2026-10-04 | PairCol | `LPPairSandbox` : touches 1 et 2 lues par front montant (`IsInputKeyDown`, aussi pavé numérique). Scène `AgMakeout` (`AgMakeout_F` sur Bridget, `AgMakeout_M` sur Michael), les deux au même point, en boucle | 1 et 2 ne changeaient rien : `WasInputKeyJustPressed` est déjà effacé quand le personnage est mis à jour. La scène est une paire Daz du show | retirer `PlayAnimation` | | CHG-132 | 2026-10-04 | PairCol | `LPPairSandbox` : menu déroulant des paires Daz (F sur Bridget, M sur Michael). Départ à 1 m des murs ouest et sud. Caméra à 2,5 m, bras sans collision, réinitialisée à chaque animation. Clic droit pour tourner | le couple était à ~60 cm du coin et la caméra à 3,8 m. Le menu liste les scènes du show | retirer le menu et remettre le bras à 380 | | CHG-133 | 2026-10-04 | PairCol | `LPPairSandbox` : départ décalé de 1 m vers le centre (`X=-508,7` `Y=-499,3`) pour sortir de la plante `fnt_new155` du coin sud-ouest | le couple était posé dans le pot | revenir à `+100` cm des murs | | CHG-134 | 2026-10-04 | PairCol | `LPPairSandbox` : le partenaire est soudé au joueur (même position, même rotation, marche coupée, capsule sans collision). Seule la capsule du joueur déplace le couple | en jeu les deux corps d'une scène partagent le point et se déplacent ensemble ; ici Michael restait sur place | retirer `Weld` | | CHG-135 | 2026-10-04 | PairCol | `LPPairSandbox` : la capsule du couple est recalculée sur les os des deux animations (6 instants), rayon et hauteur, bas maintenu au sol | la capsule Person (rayon 20, demi-hauteur 88) ne couvre pas les deux corps | retirer `FitCoupleCapsule` | | CHG-136 | 2026-10-04 | PairCol | `LPPairSandbox` : capsule recalculée à chaque animation, sur la pose des deux clips, et recentrée sur le couple. Les corps restent en place | la mesure précédente lisait la pose de repos et déplaçait la capsule | revenir à la capsule Person | | CHG-137 | 2026-10-04 | PairCol | `LPPairSandbox` : la capsule du couple est remplacée par une boîte recalculée sur les os à chaque animation. Le déplacement balaie cette boîte | essai demandé : une boîte épouse mieux une pose allongée qu'une capsule verticale | revenir à `FitCoupleCapsule` | | CHG-138 | 2026-10-04 | PairCol | `LPPairSandbox` : la boîte suit les os affichés de la pose en cours, marge 4 cm. Plus de boîte sur toute la durée du clip, plus de décalage pour garder le bas au-dessus du sol | la boîte était trop basse et trop grande par rapport aux corps | revenir à la mesure sur 8 instants | | CHG-139 | 2026-10-04 | PairCol | `LPPairSandbox` : retour à la boîte mesurée sur l'animation (8 instants). La mise à jour sur les os affichés est retirée | la boîte suivait la pose affichée en traversant le bureau, décalée des corps | — | | CHG-140 | 2026-10-04 | ShowCouple | nouveau `LPShowCoupleSubsystem` : pendant un show à deux (`SexPersons`, sinon `AP1` et `AP2`, capsules coupées, moins de 4 m), le partenaire suit le joueur, une boîte mesurée sur l'animation arrête le couple, les meubles de `Room` bloquent `Pawn` le temps de la scène. `lp.ShowCouple 0` rend la main au Blueprint. L'ancien chemin n'est pas modifié | essai du show réel à partir de la boîte de la sandbox, réversible | retirer les deux fichiers | | CHG-141 | 2026-10-04 | ShowCouple | `LPShowCoupleSubsystem` : après le tick des acteurs, le partenaire est soudé au joueur (même point, maillages yaw −90 et Z = −demi-hauteur, comme la sandbox). La boîte des clips `_F` et `_M` est recalculée à chaque changement d'animation, pas une seule fois à l'entrée | la boîte restait sur la première mesure et les deux corps ne partageaient pas le point | revenir au `FitBox` de CHG-140 | | CHG-142 | 2026-10-04 | ShowCouple | `LPShowCoupleSubsystem` : la boîte est mesurée sur les séquences de `GI.LastAnimation` et sur tous les maillages du couple, pas seulement un clip `_F`/`_M` du maillage principal. Même changement d'animation, même soudure | partie 21:16 : `branche` sans aucune ligne `boite`, la boîte verte absente | revenir au filtre `_F`/`_M` de CHG-141 | | CHG-143 | 2026-10-04 | ShowCouple | `LPShowCoupleSubsystem` : les primitifs de `Room`, de ses acteurs attachés et de ses références proches qui ignorent `Pawn` passent en `Block` tant que le show dure (pas seulement les composants directs). La boîte ignore les clips `idle` et prend la paire voisine (`_0`/`_1` ou `_F`/`_M`) dans le même dossier | partie 21:31 : boîte `idle_Daz+SF_ft07_1` (centre X=-54, étendue 99×46×93), seulement 12 composants. Le repos debout gonflait la boîte, et `SF_ft07_0` n'était pas chargé | retirer `BlockRoomPawn` et le filtre `idle` | | CHG-144 | 2026-10-04 | PawnGlobal | `Room::addObject` : `SetCollisionResponseToChannel(Pawn)` passe de `ECR_Ignore` à `ECR_Block`. Snapshot `LifePlay_Backup_5.5\PawnGlobal`. Commandlet `LPFixPawnResponse` | le canal Pawn est le même pour toutes les chambres ; essai demandé : `Block` dès la pose du meuble, plus seulement pendant le show | `.\Tools\Restore.ps1 -Lot PawnGlobal` | | CHG-145 | 2026-10-04 | PawnDyn | `Room::addObject` enchaîne `SetCollisionObjectType(WorldDynamic)` après le `Pawn Block`. Murs `Wall1`–`Wall4` en `WorldDynamic` et `Pawn Block`. `KeepTogether` balaie comme la sandbox : le sol ne masque plus le mur. Snapshot `LifePlay_Backup_5.5\PawnDyn` | options 1 et 2 de la sandbox sur Oui : la capsule Person ignore `WorldStatic`, donc `Pawn Block` seul la laisse traverser ; la boîte du show s'arrêtait au lit | `.\Tools\Restore.ps1 -Lot PawnDyn` | | CHG-146 | 2026-10-04 | ShowCouple | `LPShowCoupleSubsystem` : un meuble qui a une action `sit`, `lie`, `use` ou `work` dans `Heavy/New2/Daily` ne bloque plus `Pawn`. Pendant cette animation, la capsule ignore `WorldDynamic`, puis la réponse d'origine revient | les PNJ ne pouvaient plus s'asseoir ni se coucher : la capsule était repoussée hors de la chaise et du lit | retirer `OpenUseFurniture` et `LetSittersPass` | | CHG-147 | 2026-10-04 | ShowCouple | Pendant le show, les meubles utilisables rebloquent `Pawn` (restaurés à la sortie). La boîte a la collision de la sandbox et son balayage s'arrête sur un objet qui bloque, sans accepter le déplacement s'il est déjà dedans. Le sol ne compte pas | la boîte traversait le lit, les murs et les meubles : le lit était forcé en Ignore, et un contact déjà engagé laissait passer tout le mouvement | revenir au `KeepTogether` de CHG-145 | | CHG-148 | 2026-10-04 | ShowCouple | `KeepTogether` : un contact déjà engagé (la boîte repose dans le lit) ne fige plus le déplacement. Un obstacle rencontré devant arrête et laisse glisser, y compris en hauteur | les contrôles ne déplaçaient plus la boîte : chaque mouvement commençait dedans et était refusé | revenir au refus de CHG-147 | | CHG-149 | 2026-10-04 | ShowCouple | `KeepTogether` : le sol arrête la boîte comme un mur. Un volume déjà traversé (mur ou sol) repousse la boîte dehors au lieu d'accepter le déplacement | la boîte passait dans le mur et dans le sol : ces contacts étaient ignorés | revenir au filtre de CHG-148 | | CHG-150 | 2026-10-04 | ShowCouple | `KeepTogether` ignore toutes les capsules de personnages. Le balayage ne s'arrête plus que sur les murs, le sol et les meubles | des capsules vides, le corps étant posé à côté, bloquaient le déplacement de la boîte | retirer la boucle `AddIgnoredActor` | | CHG-151 | 2026-10-05 | ShowCouple | `FitToBodies` : la boîte suit les os affichés des deux corps, marge 4 cm. La mesure sur toute l'animation reste le repli si les os ne sont pas prêts | la boîte couvrait tout le clip plus 12 cm et entrait dans les objets autour du couple | retirer `FitToBodies` et rappeler `FitBox` à chaque clip | | CHG-152 | 2026-10-05 | ShowCouple | La boîte ignore mains, pieds et os annexes. Seul le contact latéral le plus profond annule la direction qui y entre ; le sol et le lit ne coupent plus le déplacement horizontal | la boîte faisait 2,18 m et un contact sur le côté bloquait la gauche | revenir au `FitToBodies` et au balayage de CHG-151 | | CHG-153 | 2026-10-05 | ShowCouple | Un contact de profondeur 0 ne bloque plus. Le flanc d'un lit ne repousse plus la boîte : elle peut y revenir, et un recouvrement la soulève vers le matelas | `Wall1`, `Wall4` et `Wall` coupaient la gauche sans pénétration, et quitter le lit empêchait d'y retourner | retirer `IsBedMesh` et le seuil de profondeur | | CHG-154 | 2026-10-05 | ShowCouple | La boîte ignore l'acteur `Wall` de CentralLondon. Le lit ne la pousse plus vers le plafond ; seul le dessus du matelas la porte | la coque `Wall` coupait la gauche dans le vide, et la poussée du lit collait le couple au plafond | retirer l'ignorance de `Wall` et la sortie du flanc de lit | | CHG-155 | 2026-10-05 | ShowCouple | Un lit est reconnu par son nom. Il ne bloque un déplacement que vers le bas, pour se poser ; le retour horizontal n'est plus arrêté et le contact ne renvoie plus la boîte | après avoir quitté le lit, la boîte ne pouvait plus y revenir | revenir au test `DoesPackageExist` et au filtre du flanc seul | | CHG-156 | 2026-10-05 | Clavier | `LPKeyboardSubsystem` : bouton « Clavier » ajouté à l'exécution dans `MainMenu.SettingsScrollBox` ; panneau pour changer, ajouter ou retirer une touche (actions et axes clavier). Écrit dans `Saved/Config/Windows`, pas dans `GameSettings.sav` | pouvoir réaffecter les touches, dont Q, sans modifier les Blueprints | retirer `LPKeyboardSubsystem.h/.cpp` et la dépendance `UMG` | | CHG-158 | 2026-10-05 | Réglages | `LPSettingsSubsystem` : onglets Audio, Video, Lewd, General, Keyboard, Misc au-dessus de `SettingsScrollBox`. Les lignes du Blueprint restent en place et sont montrées selon leur texte ; le reste va dans Misc. Keyboard affiche la liste des touches | la liste unique ne montrait pas le clavier | retirer `LPSettingsSubsystem.h/.cpp` | | CHG-369 | 2026-10-19 | REP1 | Jeu (`ue5.8`) : `Docs/Migration/etat/BOSS/BOSS-TRI-20261019.md` (tri), `Docs/Journal_Modifications.md`, `Docs/Registre_Erreurs.md`, `Docs/Migration/etat/REPO/NUMEROS.md` ; tickets sous `Docs/Migration/etat/REPO/tickets/` | Reprise après la pause du 15 au 19 octobre et le gel de Cursor : tri de ce que l'outil a laissé (`BOSS-TRI-20261019.md`, lecture seule, commandes git rejouées le 2026-10-19), constats consignés en ERR-139 et ERR-140. Décisions de l'utilisateur du 2026-10-19, transmises par Big Boss : (a) `LifePlay.uproject` reste local, non commité ; (b) tickets SBXTYP refaits contre le HEAD actuel de l'addon, R6 (outils `Tools\` de l'addon) rejeté, R7 fondu dans PIPE1-T1 sans `sk-probe` ni `ue-cpp-build` ; (c) ticket VAGUE-20261019-1-PARTAGES de l'addon rejeté : un seul journal, celui du jeu (DOCMV, CHG-300) ; (d) publication du jeu par `pub/ue5.8` (un commit, PUB3-T3 § 7), push par l'utilisateur ; vague du gardien REP1 (hashes : à venir, Big Boss les complète) | Journal, registre et `NUMEROS.md` : trois lignes REP1 (CHG-369, ERR-139, ERR-140) réservées puis utilisées ; aucun fichier de jeu, d'asset ni de code touché | Docs : `git revert` du commit du ticket du lot REP1, par ticket RESTORE au gardien avec l'accord de l'utilisateur ; sinon retirer les trois lignes REP1 | | CHG-368 | 2026-10-17 | CGREF1 | Addon `D:\Game\LifePlay-Sandbox-5.8` (`ue5.8`) : `Plugins/LPSandbox/Source/LPSandbox/LPSandboxCharGenMod.cpp`, `LPSandboxCharGenMod.h`, textes `.md` de `Docs/CG/` et `Docs/etat/CG/CGREF1/` ; jeu : `Docs/Migration/etat/CG/CGREF1/CGREF1-T75-BUILD.md`, `CGREF1-T76-BUILD.md` | Lot CGREF1 : référentiel du générateur et onglet Shape du panneau (régions, filtre par genre, infobulle). LifePlayEditor code 0, `UnrealEditor-LPSandbox.dll` liée. VAL `CGREF1-T77-VAL.md` PASS-STATIC. Images, pdf et csv hors commit. Écran non ouvert | — | `git revert` des commits des tickets CGREF1-R1 puis CGREF1-R2, sur accord | | CHG-367 | 2026-10-15 | OPT0-A2, OPT0-A2b | Jeu (`ue5.8`) : `Docs/Migration/etat/OPT/OPT0/` (`OPT0-A2-FICHE.md`, `OPT0-A2-INV.md`, `OPT0-A2b-FICHE.md`, `OPT0-A2b-INV.md`, `OPT0-TACHES.md`, `OPT0-JOURNAL-BROUILLON.md`, `OPT0-TRACES.csv`), `Docs/README.md` (plage du journal) ; hors git : garde `lp-mcp` (`Tools\hooks\lp-mcp-garde-lecture.py` et copie du profil `%USERPROFILE%\.claude\hooks`), v1 → v6 ; addon `D:\Game\LifePlay-Sandbox-5.8` : `Tools/claude/skills/lp-mcp/SKILL.md` § 2 (`e1c1177d`) et `lp-lot/boss.md` § 4 point 1 (`9e02f65e`), règle MCP-ORDRE, déjà versées par Big Boss ; traces dans `Saved\OPT0-A2\` et `Saved\OPT0-A2b\` (non suivies) | Clôture de OPT0-A2 (inventaire Blueprint par MCP, lecture seule, arrêté au budget de méthode : 3 Blueprints sur 110 lus) et de OPT0-A2b (reprise par lots de scripts `execute_tool_script`, lecture seule) : 110 Blueprints lus sur 110, recomptés (`lots.csv` 110 lignes, sans doublon, 0 manquant). Aucun verdict : la grille de décision est la fiche A3. Gardes `lp-mcp` v1 → v6, outil local hors git, MD5 sur 8 caractères avant → après : `f787d205` → `42470dd0` (v2) → `3ff67831` (v3) → `b61ca3c4` (v4) → `589dc1fa` (v5) → `ced2d9a5` (v6) ; essais : v2 50/50 (`Saved\OPT0-A2\test_garde_v2.py`), v3 26/26, v4 43/43, v5 45/45, v6 50/50 ; seul le MD5 de v6 a été relu à la source (`Tools\hooks` et copie du profil : `ced2d9a5` des deux côtés, 2026-10-15), les autres viennent des notes de l'orchestratrice. Règle MCP-ORDRE : (1) éditeur headless ; (2) test de connexion `list_toolsets` ; (3) opération ; (4) éditeur laissé ouvert si d'autres traitements MCP attendent, sinon fermé (`UeState` = 0) ; reconnexion `/mcp` une fois par session ; instantané `LifePlay_Backup_5.5\MCP-ORDRE`. Décisions de l'utilisateur, citées telles que transmises par Big Boss : « Lots d'appels MCP » ; « autorise la garde » ; « autorise la garde v6 » ; « utiliser toutes les fonctionnalités de cet outil, cela réduirait le trafic ; s'assurer que l'on soit capable de traiter le retour » ; « unreal-mcp est toujours disponible dans la session ; il faut reconnecter uniquement quand on ouvre une nouvelle session » ; « oui lance a2b ». Constats marquants, sans verdict : `UserRaisedError` non attrapable sur gros graphes (A2) ; `find_nodes` filtre sur le titre anglais ; suffixe « (UE4) » des appels U9 ; `time.perf_counter()` utilisable dans les scripts ; `while (` admis depuis la garde v5 ; chemins « Save » admis depuis la garde v6. Brouillon `OPT0-JOURNAL-BROUILLON.md` versé (6 lignes, colonne Versé = CHG-367) | Gardes : `.\Tools\Restore.ps1 -Lot OPT0-A2` puis recopie au profil, pour chaque version ; règle MCP-ORDRE : `.\Tools\Restore.ps1 -Lot MCP-ORDRE -ProjectRoot D:\Game\LifePlay-Sandbox-5.8` ; docs : `git revert` du commit du ticket du lot OPT0-A2, par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-366 | 2026-10-15 | UES1 | Addon `D:\Game\LifePlay-Sandbox-5.8` (`ue5.8`) : `Tools/claude/skills/lp-mcp/SKILL.md`, `lp-mcp/LICENSE` (neuf), `lp-mcp/references/toolset.md` (neuf), `lp-commandlets/SKILL.md`, `lp-doc/SKILL.md`, `lp-validate/SKILL.md`, `lp-build/SKILL.md`, `lp-repo/SKILL.md` ; jeu (`ue5.8`) : `Docs/Migration/etat/SK/SK-ARBRE.md` (R13), `etat/SK/SK-REVUE-unreal-engine-skills.md` (neuf), `etat/SK/UES1/` (registre, IMPL, BUILD, RECH, VAL-01, VAL-02, DOC, brouillon, gestes, `profil/`, traces) ; hors git : `Intermediate/PythonStub/unreal.py` (stub Python généré, non suivi) ; fichiers du profil et du projet (agents `lp-mcp`, `lp-mcp-bp`, hook `etat-session.py`, `.claude/settings.json`) seulement préparés dans `etat/SK/UES1/profil/` | Lot UES1 : recyclage des idées du plugin Epic « Unreal Engine Skills » 3.1.1 (MIT) dans nos skills, après la revue `SK-REVUE-unreal-engine-skills.md`. Décision de l'utilisateur : « approuve tout » (A1 à A5, B1 à B3, mode développeur Python). Contenu : `lp-mcp` reçoit un guide de panne du serveur (A2), la règle du succès explicite (A1) et un renvoi vers la nouvelle annexe `references/toolset.md` (B1 tests par MCP et en ligne de commande, B2 règles d'un jeu d'outils) ; clauses « Pas pour » et déclencheurs (A3) dans `lp-mcp`, `lp-commandlets`, `lp-build`, `lp-validate` ; renvoi au stub Python dans `lp-commandlets` (A5) ; section « Rédiger un skill » dans `lp-doc` (A4, aussi `SK-ARBRE.md` R13) ; `LICENSE` = avis MIT d'Epic, révision `a6aa73ada02a9fb1f5415bec491f9942c519b297`, textes repris reformulés (R4). A5 par `UES1-BUILD-01` : mode développeur Python le temps d'un lancement de l'éditeur, stub de 35 130 539 octets (MD5 `3A4D422C…`), réglage retiré ensuite, aucun asset touché. VAL : `UES1-VAL-01` FAIL sur C5 (chemin du profil hérité dans `profil\lp-mcp.md`), corrigé (`` à la place du nom, `LICENSE` étendu, `Triggers` de `lp-mcp` sans « toolset » nu, description de `lp-doc` étendue après `UES1-RECH-01`), puis `UES1-VAL-02` PASS (PubCheck 0 sur 21 fichiers). Après VAL-02, description de `lp-doc` complétée de « Pas pour : le déroulé d'un lot (lp-lot), un commit (lp-repo). » (non revalidé par un agent distinct). Écart de méthode : la première modification de `lp-mcp/SKILL.md` a été faite par un heredoc Python (interdit, indicateur I15) ; les suivantes par l'outil Edit, résultat contrôlé (CR = 0, hunks attendus). Reste ouvert : dépassement R9 (`lp-build` 161, `lp-validate` 145, `lp-repo` 133 lignes) et `RefreshTools` en éditeur headless non essayé. Copie du profil et du projet = geste de l'utilisateur (`UES1-GESTES.md`) | MD5 après : `lp-mcp/SKILL.md` `243CB0F9…` → `f552eae1…` ; `lp-mcp/LICENSE` — → `16794ad8…` ; `lp-mcp/references/toolset.md` — → `fb767135…` ; `lp-commandlets` `F7B48C57…` → `c81c0bbb…` ; `lp-doc` `7CB4CD4A…` → `832d56c4…` ; `lp-validate` `6898D24A…` → `a2b8b270…` ; `lp-build` `AE519721…` → `f13d456d…` ; `lp-repo` `22C25E13…` → `7f09619c…` ; `SK-ARBRE.md` `93F15087…` → `d2a01993…` ; LF | Addon : `.\Tools\Restore.ps1 -Lot UES1-addon58 -ProjectRoot D:\Game\LifePlay-Sandbox-5.8` ; jeu : `.\Tools\Restore.ps1 -Lot UES1` ; profil : `.\Tools\Restore.ps1 -Lot UES1-profil -ProjectRoot "$env:USERPROFILE\.claude"` et `-Lot UES1 -Only .claude\settings.json` ; stub : déplacer `Intermediate/PythonStub` vers `D:\Game\LifePlay_Backup_5.5\UES1` (instantané `Existed=False`) ; après commit : `git revert` des commits des tickets du lot UES1 (addon puis jeu), par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-365 | 2026-10-15 | REF1, OPT0 | Jeu (`ue5.8`) : `Docs/Migration/etat/REF/REF1/` (9 fichiers), `etat/BASES/REF/` (4 référentiels en projet), `etat/INDEX.md`, `etat/OPT/PERF/LISEZMOI.md`, `etat/OPT/OPT0/OPT0-TACHES.md` ; addon `D:\Game\LifePlay-Sandbox-5.8` (`ue5.8`) : `Tools/claude/skills/lp-doc/SKILL.md`, `lp-lot/SKILL.md` (paragraphe « Où écrire »), `lp-perf/recettes/presentmon.md` (banc préparé, pièges) ; hors git (`Tools/`) : `Perf-P1.ps1`, `PresentMonStats.py`, essais, `PresentMon-2.6.0-x64.exe` | REF1 (demande de l'utilisateur : référentiels, centralisation, homogénéité) : 253 règles extraites des 36 docs (OPE 98, PROD 74, ORG 52, DOC 29 ; 45 remplacées, 15 contradictoires), quatre référentiels en projet sous `etat\BASES\REF\`, rapport d'homogénéité, proposition de centralisation ; décision de l'utilisateur « approuve REF1 » : option A + D (règle unique pour les nouveaux lots, `etat\INDEX.md`, aucun déplacement), adoption des référentiels et étiquette « historique » au lot REF2. OPT0 B2 / B2-bis : banc P1 (`Perf-P1.ps1`, `PresentMonStats.py`, validés sur CSV synthétiques) ; 6 essais réels : PresentMon 2.6.0 ne capte aucune image sur ce poste (Windows 11 build 26300, AMD hybride), alors que `logman` sur DxgKrnl écrit 50 Mo en 10 s ; suite B2-ter au prochain cycle. PubCheck 0 | MD5 : `lp-doc/SKILL.md` 6ea37f74… → 7cb4cd4a… ; `lp-lot/SKILL.md` 065b22f7… → 3096e57b… ; `lp-perf/recettes/presentmon.md` 8d636592… → 7032dea3… ; LF | Skills : `.\Tools\Restore.ps1 -Lot REF1-IMPL-01` (lp-doc, lp-lot) et `-Lot B2bis` (presentmon.md) ; reste : `git revert` des commits des tickets REF1-T1 et REF1-T2, par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-364 | 2026-10-15 | NOM1 | Jeu (`ue5.8`) : `Docs/36_Charte_Nommage.md` (neuf), `Docs/README.md` (index du doc 36), `Docs/Migration/etat/NOM/NOM1/NOM1-TEXTES.md` ; addon `D:\Game\LifePlay-Sandbox-5.8` (`ue5.8`) : `Tools/claude/skills/lp-doc/SKILL.md`, `lp-lot/SKILL.md` | Lot NOM1 : charte de nommage (doc 36) demandée par l'utilisateur (« écrit la maintenant ») : constat (lettre R à plusieurs sens, ids de fiche improvisés, profondeur inégale d'`etat`, outils en deux langues) et cinq règles : type de fiche par suffixe en liste fermée (`CART`, `SPEC`, `IMPL`, `BUILD`, `VAL`, `DOC`, `RECH`, `PERF`, `INV`), tickets du gardien en `-T`, bases durables sous `etat\BASES\`, outils « Verbe-Objet » en français, aucune rétroactivité. Textes de skills « Approuvé tel quel » ; bases d'OPT « Laisser en place ». Titre du doc 36 corrigé par Big Boss sur ordre direct de l'utilisateur, après un refus du mode automatique à l'agent (« Instruction Poisoning »). PubCheck 0 | MD5 avant → après : `lp-doc/SKILL.md` e1077ecf… → 6ea37f74… ; `lp-lot/SKILL.md` a9eb85b4… → 065b22f7… ; LF | Skills : `.\Tools\Restore.ps1 -Lot NOM1-SKILLS2` (ignorer le lot `NOM1-SKILLS`, chemins faux) ; doc et index : `git revert` des commits des tickets NOM1-T1 et NOM1-T2, par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-363 | 2026-10-15 | OPT0 | Addon `D:\Game\LifePlay-Sandbox-5.8` (`ue5.8`) : `Tools/claude/skills/lp-perf/` (SKILL.md et recettes presentmon, csvprofile, gauntlet, tracy ; neuf) ; `Tools/claude/agents/lp-perf.md`, `lp-refac.md` (neufs) ; jeu (`ue5.8`) : `Docs/Migration/etat/OPT/` (BC : 12 fichiers ; DOC : 4 ; OPT0 : PLAN, TACHES, A1-INV, PIPELINE ; REFAC : 12), `etat/EVAL2/AMEL1/AMEL1-ETAT.md`, `AMEL1-TACHES.md` (passation R8) | Lot OPT0 (préparation du cycle d'optimisation, demandes de l'utilisateur du 2026-10-15) : plan en trois axes (héritage UE4 → 5.8, outils de test pilotant la build, base de connaissance) ; inventaire A1 (C++ de l'addon et de StreetMap sans motif UE4 ; entrée legacy : 55 `ActionMappings`, 15 `AxisMappings`) ; base de connaissance de 164 entrées (R1 à R11, dont notes de version 5.6 à 5.8 lues dans Claude in Chrome) ; axe B « Par paliers » (décision de l'utilisateur) : P1 PresentMon sur la build empaquetée, P2 CSV Profiler + PerfReportTool puis Gauntlet, P3 Tracy ; documentation à la version utilisée (`OPT/DOC`, code du moteur 5.8 local faisant foi : `WITH_AUTOMATION_TESTS` absent en Test et Shipping, `AutomationTest.h:63-65`) ; skill `lp-perf` (recettes « à éprouver ») et agents spécialisés `lp-perf` et `lp-refac` ; base de refactorisation C++ (1011 fonctions, 12 256 sites d'appel, 0 API moteur dépréciée appelée, 6 candidats T1 à T6, Blueprints non couverts). Recomptes et preuve du moteur rejoués par Big Boss ; PubCheck 0. Copie du skill et des agents dans le profil faite par l'utilisateur, MD5 conformes | MD5 : `lp-perf/SKILL.md` 24d49df2…, recettes csvprofile 9840731f…, gauntlet 26d4b8b8…, presentmon 3d8e5f17…, tracy 07b9ca2b… ; agents lp-perf 4f63596d…, lp-refac 1ec333a7… ; LF | `git revert` des commits des tickets OPT0-R1 (addon) et OPT0-R2 (jeu), par ticket RESTORE au gardien avec l'accord de l'utilisateur ; profil : retirer `~/.claude/skills/lp-perf` et les deux agents (mise à la corbeille) | | CHG-362 | 2026-10-15 | AMEL1 | Addon `D:\Game\LifePlay-Sandbox-5.8` (`ue5.8`) : `Tools/claude/skills/{sk-protocol, lp-lot, lp-validate, lp-paths, lp-build, lp-commandlets, lp-doc, sk-orchestrate}/SKILL.md` ; jeu (`ue5.8`) : `Docs/32_Organisation_Agents.md` (§ 15.12), `Docs/Migration/etat/EVAL2/AMEL1/` (`AMEL1-ETAT.md`, `AMEL1-INDICATEURS.md`, `AMEL1-TACHES.md`, dossier `OUTIL1/` : 14 fichiers .md et .csv) ; hors git (`Tools/` ignoré, CHG-357) : 13 outils neufs ou modifiés, 15 scripts à la corbeille | Lot AMEL1, groupe 7 (OUTIL1) : 68 scripts d'`etat/` triés (inventaires I1a et I1b). 9 intégrés à `Tools/` : `NormaliserLF.py` (à blanc par défaut, `--appliquer`), `hooks\` (crochet v2 et garde MCP en copies de référence, `TestCrochet.py` et `cas-v2.jsonl`), `Manifeste.py`, `CmpPie.py`, `Tests\` (`Corbeille`, `TracesCorbeille`). 11 fusionnés : `Indicateurs.py --detail` et indicateur I15 (avant : 10,9), `LogStats.ps1 -Stats` (F5, DESTROY, à-coups ; sortie sans `-Stats` inchangée). 15 à la corbeille. `SauverTranscriptions.ps1` créé (copie avant suppression d'une session). Index `Tools\LISEZMOI.md`. 8 skills et doc 32 § 15.12 nomment les outils et leur appel. Décisions de l'utilisateur (2026-10-14) : « (a) 9 intégrations », « (d) 11 fusions », « (c) 15 à la corbeille », « Skills + indicateur I15 », « Copier avant suppression », « 10,9 mesuré par l'outil », « Approuvé tel quel ». VAL `OUTIL1-V-VAL.md` PASS avec réserves (TestCrochet 417 / 417, LogStats identique sans `-Stats`), `OUTIL1-V2-VAL.md` PASS-STATIC (écart V3 déclaré : appel `-Latest` corrigé) ; PubCheck 0 | MD5 et instantanés : `OUTIL1-A-IMPL.md`, `OUTIL1-D1-IMPL.md`, `OUTIL1-D2-IMPL.md`, `OUTIL1-V2-VAL.md` ; LF | Skills : `.\Tools\Restore.ps1 -Lot OUTIL1-SKILLS -ProjectRoot D:\Game\LifePlay-Sandbox-5.8` ; doc 32 : `-Lot OUTIL1-SKILLS-jeu` ; outils : `-Lot OUTIL1-A`, `-D1`, `-D2` (ou `TOOLS-REF`) ; corbeille : instantané `OUTIL1-C` ; après commit : `git revert` des commits des tickets AMEL1-R11 et AMEL1-R12, par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-361 | 2026-10-14 | MEN1 | Lot MEN1 (ménage hérité ; fiches MEN1-A à MEN1-D). `README.md` (jeu, branche `ue5.8`, +44 −9) : l'annonce V2.0 devient l'alpha 2026.10.2.1a : introduction, bloc de téléchargement (archive `LifePlay_Revival_2026.10.2.1a_Windows_Game.7z`, 1 291 995 663 octets, SHA-256 `89ed211dfae2233000fbec236a0c10fb784e4b948705ddf10d91be1c4a0898c0`, lien Mega et fil Discord des mods recopiés à l'identique de `etat/REL/ALPHA/REL-ALPHA-ANNONCE-DISCORD.md` l. 3 et 7), nouvelle section d'état « alpha 2026.10.2.1a » placée avant celle de V2.0 (conservée en historique, une phrase « Superseded by the alpha 2026.10.2.1a » ajoutée), lignes « Branches and tags » et « Requirements » (`ue5.8` : V2.0 et alpha). Aucun nombre de coiffures, tag `v2026.10.2.1a` non cité (non posé). Journal : CHG-329 corrigé (écart E1 : mesure d'origine 12 tours sur 100 de `OUTC-T2-IMPL.md` § 2 et contre-preuve 10 tours sur 60 de `OUTC-VAL-B_essais.txt` l. 440, au lieu de la seule seconde sans source). Livrables `Docs/Migration/etat/MEN/MEN1/` (`MEN1-TACHES.md`, `MEN1-A-INV.md`, `MEN1-B-PROPOSITION.md`, `MEN1-C-ECART.md`, `MEN1-D-IMPL.md`, `MEN1-D-JOURNAL-BROUILLON.md`) ; instantané `D:\Game\LifePlay_Backup_5.5\MEN1-D` (`README.md`) | Décision de l'utilisateur relayée par Big Boss le 2026-10-14 vers 23:28 : appliquer `MEN1-B-PROPOSITION.md` avec le lien Mega de l'archive et le lien du fil Discord des mods ; CHG-329 en variante A de `MEN1-C-ECART.md`. Sources de chaque chiffre : `MEN1-B-PROPOSITION.md` (tableau) ; PubCheck 0 sur `README.md` et sur les livrables (`MEN1-D-IMPL.md`) | MD5 de `README.md` : `601549B4DADCF07BC24AD72883FB8FE1` → `688442228DE8D514DC27CD9118B4620C` (LF conservé, 44 insertions, 9 suppressions) ; journal : MD5 avant / après à relever à l'écriture | `.\Tools\Restore.ps1 -Lot MEN1-D` (rend `README.md` d'avant, proposé, jamais lancé sans accord) ou `git revert` du commit du ticket de MEN1 ; la ligne CHG-329 revient par le même `git revert` | | CHG-360 | 2026-10-14 | AMEL1 | Addon `D:\Game\LifePlay-Sandbox-5.8` (`ue5.8`) : `Tools/claude/skills/lp-build/SKILL.md`, `lp-doc/SKILL.md`, `lp-lot/SKILL.md`, `lp-mcp/SKILL.md`, `lp-paths/SKILL.md`, `lp-repo/SKILL.md`, `lp-validate/SKILL.md`, `sk-windows-shell/SKILL.md` (modifiés) ; `sk-protocol/SKILL.md` et `sk-repo/SKILL.md` (premier suivi, les deux `SKILL.md` seuls, décision de l'utilisateur « Oui, les 2 SKILL.md ») ; jeu (`ue5.8`) : livrables `Docs/Migration/etat/EVAL2/AMEL1/` (`AMEL1-TEXTES-W5.md`, `AMEL1-W6-DOC.md`, `AMEL1-V1g-VAL.md`, `AMEL1-ETAT.md`, `AMEL1-TACHES.md`) | Lot AMEL1, groupe 6 (W6, suite de la décision CHG-357) : skills alignés sur `Tools/` local et non suivi. `lp-paths` : `Tools/` parmi ce qui ne se commit jamais, sauvegarde `TOOLS-REF`, ne pas déplacer `Tools\PubCheck.ps1` (crochet pre-push) ; `lp-repo` et `sk-repo` : ticket sous `Tools/` refusé ; `lp-lot` : IMPL d'outil tracé par instantané, CHG et livrable, retour arrière par `Restore.ps1` ; `lp-validate` : comparer à l'instantané ; `sk-protocol` : script à usage répété dans `Tools\` ; `lp-build`, `lp-doc` : sans changement de fond ; « À verser » de LANC1 : `sk-windows-shell` (`-ArgumentList`) et `lp-mcp` § 2 (lanceur régénéré). Textes approuvés par l'utilisateur (« approuvé », relecture d'`AMEL1-TEXTES-W5.md`) ; copie dans le profil faite par l'utilisateur, 5 MD5 conformes (couvre aussi W2 et W4). VAL `AMEL1-V1g-VAL.md` PASS-STATIC (2 ajouts non déclarés retirés) ; PubCheck 0 | MD5 avant → après : `AMEL1-W6-DOC.md` § 1 ; après correction de la VAL : `lp-paths/SKILL.md` `0E93EA5D11BEE55133EE0CD6C02777F1`, `sk-windows-shell/SKILL.md` `CB92FB5D4365782904E4EBE56E86F724` ; LF | `.\Tools\Restore.ps1 -Lot AMEL1-W6 -ProjectRoot D:\Game\LifePlay-Sandbox-5.8` (sauvegarde `TOOLS-REF`), ou `git revert` des commits des tickets AMEL1-R9 (addon) et AMEL1-R10 (jeu), par ticket RESTORE au gardien avec l'accord de l'utilisateur ; profil : recopie depuis l'instantané | | CHG-359 | 2026-10-14 | LANC1 | Jeu (`ue5.8`) : `Docs/Migration/etat/AG/LANC1/LANC1-TACHES.md`, `LANC1-DOC.md`, `LANC1-CHG-brouillon.md` (livrables de clôture). Hors git, non commité : `.hyperai/scripts/Start-HyperAIStudioEditor.ps1` (exclu par `.git/info/exclude`) | Clôture du lot LANC1 (lanceur de l'éditeur HyperAIStudio) : le chemin du projet, passé sans guillemets à `Start-Process`, était coupé par l'espace de « LifePlay-master 5.8 » et l'éditeur s'ouvrait sur le navigateur de projets ; l. 13 du script corrigée (guillemets autour du chemin), essai du 2026-10-12/13 : ligne de commande du processus conforme et projet chargé (PASS), port 8000 tenu ; « MCP prêt » par ce lanceur non prouvé (boîte « Restaurer les paquets » d'origine STE, `Wait-HyperAIStudioMCP` code 1 après 401 s). Limite : le plugin régénère le script et efface la correction ; décision de l'utilisateur du 2026-10-13 : « garde la commande headless » (voie officielle, plugin non corrigé). PubCheck 0 | script : l. 13 sans guillemets (sha256 `b23625c9…`) → avec guillemets (sha256 `dbcf2b1e…`), hors dépôt ; registre : — → `LANC1-TACHES.md` suivi, plus `LANC1-DOC.md` et ce brouillon créés | `git revert` du commit du ticket `LANC1-R` (numéro du ticket à reporter par le gardien) pour les livrables ; script : recopier `D:\Game\LifePlay_Backup_5.5\LANC1\Start-HyperAIStudioEditor.ps1.avant` sur `.hyperai\scripts\Start-HyperAIStudioEditor.ps1`, sur accord, après `Snapshot.ps1 -Lot LANC1-retour` | | CHG-358 | 2026-10-14 | AMEL1 | Addon `D:\Game\LifePlay-Sandbox-5.8` (`ue5.8`) : `Tools/claude/skills/lp-build/SKILL.md`, `lp-doc/gabarits.md`, `lp-validate/SKILL.md`, `lp-lot/SKILL.md`, `lp-lot/boss.md`, `sk-windows-shell/SKILL.md` ; jeu (`ue5.8`) : livrables `Docs/Migration/etat/EVAL2/AMEL1/` (`AMEL1-TEXTES-W3.md`, `AMEL1-W4-DOC.md`, `AMEL1-V1f-VAL.md`, `AMEL1-I1-TRI.md`, `AMEL1-I2-GITIGNORE.md` marqué abandonné) | Lot AMEL1, groupe 5 (W3, décision D2 de l'utilisateur) : corrections de skills approuvées (« Approuvé tel quel ») : `sk-windows-shell` et `lp-build`, plus de redirection `>` ni de `Tee-Object` pour les agents (`Start-Process -RedirectStandardOutput` à la place) ; `gabarits.md`, registre tenu au fil du lot ; `lp-validate`, plus de Python en ligne, FileCheck et PubCheck en tableau de chemins absolus ; règle A5 dans `lp-lot` et `boss.md` : après un refus utile du crochet, arrêt et compte rendu, l'écriture refusée n'a lieu que sur décision explicite de l'utilisateur relayée par Big Boss, avec instantané et MD5 ; après un refus à tort, reformuler, sinon arrêt (choix de l'utilisateur : « L'utilisateur, relayé par Big Boss », « Reformuler, sinon arrêt »). Tri I1 validé par l'utilisateur (« Valider les 3 propositions », 11 témoins à la corbeille). VAL `AMEL1-V1f-VAL.md` PASS-STATIC ; PubCheck 0 | MD5 avant → après : `AMEL1-W4-DOC.md` | `.\Tools\Restore.ps1 -Lot AMEL1-W4 -ProjectRoot D:\Game\LifePlay-Sandbox-5.8`, ou `git revert`, sur accord | | CHG-357 | 2026-10-14 | AMEL1 | Jeu (`ue5.8`) : `.gitignore` (ligne `/Tools/`) ; les 50 fichiers suivis de `Tools/` retirés de l'index (`git rm --cached`, gardés sur le disque) | Décision de l'utilisateur du 2026-10-14 : « on gitignore Tools. c'est un dossier pour Agent IA » (option « Ignorer + retirer de l'index ») ; les scripts sous `Docs/Migration/etat/` restent ignorés, sans exception (option « Restent ignorés ») ; les 4 scripts du crochet v2 déjà suivis (`10f924d`) le restent. Le dépôt du jeu est public : les outils d'agents (Build, Snapshot, Restore, Numero, Verrou, PubCheck, UeState, Indicateurs, EssaiJournal, scripts de débogage, `Tools/hooks/pre-push`, `Tools/modules`) ne sont plus publiés ; ils restent dans l'historique et sur le disque, et les skills qui les citent sont inchangés. Un nouveau clone n'a plus `Tools/` | 50 fichiers suivis → 0 ; `.gitignore` +1 ligne | `git revert` du commit (les fichiers redeviennent suivis), sur accord | | CHG-356 | 2026-10-14 | P7-T8 | Jeu (`ue5.8`) : livrables `Docs/Migration/etat/AG/P7/P7-T8-BUILD-DEMANDE.md`, `P7-T8a-INV.md`, `P7-T8b-IMPL.md`, `P7-T8c-BUILD.md`, `P7-T8e-DOC.md`, fiches `P7-T8a.md`, `P7-T8b.md`, `P7-T8c.md`, `P7-T8e.md` | Livrables de l'essai Sentry de 14 jours (P7-T8 : plugin et toolset MCP sur un plantage de test, sans build distribuée), restés hors commit ; tri décidé par l'utilisateur le 2026-10-14 (« Trier les 42 fichiers »). Aucun DSN dans les livrables (recherche : 0) ; `Plugins/Sentry` absent de l'arbre ; copies de travail hors dépôt (`LifePlay_Backup_5.5\P7\sentry\`). PubCheck 0 | documents seuls, neufs | `git revert` du commit | | CHG-355 | 2026-10-14 | P7-H2 | Jeu (`ue5.8`) : suppression de `Tools/claude/hooks/ecriture-gardien.py` (ancien crochet, déjà absent de l'arbre) ; `Docs/Migration/etat/AG/P7/P7-TACHES.md`, `fiches/P7-H2.md` (clôture), livrables `P7-H2.md`, `P7-H2-VAL.md`, `P7-H2b.md`, `fiches/P7-H2b.md`, `fiches/P7-H2v.md` | Clôture du sous-lot P7-H2 (crochet plus fin, VAL en FAIL), remplacé par AMEL1-R2 (crochet v2 `e03d4332`, 417 cas sur 417, commit `10f924d`, CHG-353), installé par l'utilisateur dans son profil le 2026-10-14 ; décision de l'utilisateur du 2026-10-14 : « Clore P7-H2 + git rm ancien crochet ». Le crochet actif vit dans `%USERPROFILE%\.claude\hooks\` (hors dépôt) ; l'historique de l'ancien reste au commit `09e5143`. Registre P7 : renvoi de P7-T8 corrigé (`P7-T8a-INV.md`). PubCheck 0 | ancien crochet `f00d9739` → supprimé du dépôt ; registre et fiche : instantané `P7-H2-CLOS` | `git revert` du commit (rétablit le fichier) ; registre : `.\Tools\Restore.ps1 -Lot P7-H2-CLOS`, sur accord | | CHG-354 | 2026-10-14 | EVAL2 | `Docs/35_Eval_Operations_Alpha.md` (nouveau), `Docs/README.md` (ligne d'index et plage du journal) ; livrables `Docs/Migration/etat/EVAL2/` (rapport, statistiques, relevés T1a à T6, VAL T9, `data/`) | Lot EVAL2, évaluation des opérations après la première release 5.8 (période P3, 2026-10-11 05:30 → 2026-10-14 18:25:41, coupure 2026-10-13 12:07:16), suite des docs 31 et 33 ; demande de l'utilisateur (« faisons l'évaluation des opérations »), décisions F8 et F9 « oui fais en le doc 35 ». Le doc 35 donne les indicateurs P0 → P3 (tableau du doc 33 prolongé), les mesures propres à P3 (essais communs, VAL, crochet, git et gardien, journaux, coût, Big Boss), le suivi de E1 à E7 et des clauses du doc 33 (Big Boss et crochet : déclenchées), les recommandations R1 à R14 et les décisions F1 à F9 avec la décision prise (F1 à F6 en (a), F7 « on attends pour github », F8 et F9 « oui fais en le doc 35 ») et les décisions complémentaires D1 « Garder, juger en P4 » (clause du crochet, cibles du doc 33), D2 « Arrêt et compte rendu » (règle A5) et D3 (ménage : P7-H2, corrections W3, règle git des scripts d'`etat`, tri des 42 fichiers), les suites du lot AMEL1 (indicateurs, mode opératoire, mesure P4 à venir, CHG-350 à CHG-353) et ce qui est établi, estimé, incertain. VAL `EVAL2-T9-VAL.md` : PASS avec réserves (aucun FAIL), écarts corrigés dans STATS et le rapport ; relecture adverse V3 du crochet non faite, approuvée telle quelle par l'utilisateur ; PubCheck 0 | `35_Eval_Operations_Alpha.md` — → créé (fichier neuf, LF, MD5 à relever par Big Boss au moment de l'insertion) ; `README.md` : une ligne de plus dans le tableau des documents, plage `CHG-001` à `CHG-354` ; doc 35 MD5 `6c75827d` | Avant commit : déplacer `Docs/35_Eval_Operations_Alpha.md` vers `D:\Game\LifePlay_Backup_5.5\EVAL2\` et retirer la ligne du README (jamais supprimer) ; après commit : `git revert` du commit du ticket `EVAL2-R1 (ticket du gardien)` (`git log --grep EVAL2-R1 (ticket du gardien)`) | | CHG-353 | 2026-10-14 | AMEL1 | Jeu (`D:\Game\LifePlay-master 5.8`, branche `ue5.8`) : livrables `Docs/Migration/etat/EVAL2/AMEL1/R2/` (`AMEL1-R2-IMPL.md`, `ecriture-gardien-v2.py`, `cas-v2.jsonl`, `test_crochet.py`, `construire_cas.py`), `AMEL1-V1e-VAL.md` ; crochet du profil (`%USERPROFILE%\.claude\hooks\ecriture-gardien.py`) **non modifié** | Lot AMEL1, groupe 4 (R2, crochet `ecriture-gardien` v2, livré sans installation). Décisions de l'utilisateur (session EVAL, 2026-10-14) : « %TEMP%\claude\ seul libre », « Fin de l'exemption « script du projet » », « JSON illisible refusé ». Le v2 analyse les commandes Bash et PowerShell hors du texte cité ; écriture permise dans `%TEMP%\claude\` et dans une liste fermée de dossiers de travail de la copie 5.8 (reprise b : `Saved/` n'est plus accepté partout) ; exemption « script du projet » retirée ; charge illisible refusée. Batterie de 417 cas, 417 conformes : refus à tort 47,4 % → 4,5 % (I2a), cas adverses refusés 79,2 % → 100 % (I2b). VAL `AMEL1-V1e-VAL.md` : V1 et V2 PASS ; relecture adverse libre (V3) interrompue par le filtre de sécurité de la plateforme, non contournée, à mener par l'utilisateur ou une revue humaine ; PubCheck 0 | MD5 du v2 `e03d4332` ; crochet actif inchangé | Livrables seuls : `git revert` du commit ; installation (procédure C5 de l'IMPL, geste de l'utilisateur) réversible par la copie d'avant | | CHG-352 | 2026-10-14 | AMEL1 | Jeu (`D:\Game\LifePlay-master 5.8`, branche `ue5.8`) : `Tools/EssaiJournal.ps1`, `Tools/EssaiJournal.regles.json` (nouveaux) ; livrables `Docs/Migration/etat/EVAL2/AMEL1/R3/`, `AMEL1-V1d-VAL.md`, `V1d/` | Lot AMEL1, groupe 3 (R3, contrôle automatique des journaux d'essai). `EssaiJournal.ps1` relit le journal d'un essai commun : les contrôles bloquants (fatal, plantage, Error, Accessed None au-delà du seuil) rendent le code 1 ; les contrôles de position et de relevé sortent en ALERTE ; code 2 si le journal est non vérifiable. Outil d'alerte joint au bilan d'essai, pas un feu vert avant remise. Rejeu sur COMMUN-2 à 13 : 408 lignes (343 PASS, 45 ALERTE, 3 FAIL, 17 INFO), 1 FAIL sur 17 journaux (COMMUN-13, plantage GPU) ; 16 KO sur 48 signalés (33,3 %, borne haute calée sur l'échantillon ; sans les contrôles de position, 12,5 % ; mesure réelle en P4). VAL `AMEL1-V1d-VAL.md` PASS (F8 requalifié « non », P5 en réserve, contrôles classés bloquant / informatif) ; PubCheck 0 (une ligne de la VAL anonymisée par Big Boss) | MD5 après : `EssaiJournal.ps1` `39d511f2`, `EssaiJournal.regles.json` `a34e684b` (fichiers neufs) | `git rm Tools/EssaiJournal.ps1 Tools/EssaiJournal.regles.json` (instantané `AMEL1-R3`), sur accord | | CHG-351 | 2026-10-14 | AMEL1 | Jeu (`D:\Game\LifePlay-master 5.8`, branche `ue5.8`) : `Tools/Indicateurs.py` (nouveau), `Tools/CopieEtat.ps1`, `Tools/FicheStats.py` ; livrables `Docs/Migration/etat/EVAL2/AMEL1/` (M1-IMPL, MESURE-P3, R10-R13-IMPL, V1b-VAL, V1c-VAL, V1b/) | Lot AMEL1, groupe 2 (mesure, R10, R13), suite de l'ordre de l'utilisateur du 2026-10-14 (un indicateur mesurable par recommandation, avant et après). `Tools/Indicateurs.py` mesure les indicateurs I1a à I14 et G-a à G-d sur une fenêtre donnée ; il redonne P3 (50 lignes sur 53 dans la tolérance, les 3 autres expliquées ; référence « avant » = `AMEL1-MESURE-P3.md`). `CopieEtat.ps1` : alerte INSTANTANE si des fichiers suivis sont modifiés depuis `-Depuis` sans instantané du lot (R10). `FicheStats.py` : lp-mcp-bp, lp-diag et lp-cart-max en N3 ; identifiants `-` reconnus (21 fiches lp-mcp-bp sur 27 de P3 au lieu de 3) (R13). VAL `AMEL1-V1b-VAL.md` PASS (réserve sur I3 tranchée, rejeu code 0) et `AMEL1-V1c-VAL.md` PASS ; PubCheck 0 | MD5 après : `Indicateurs.py` `42feceb7`, `CopieEtat.ps1` `a5298113`, `FicheStats.py` `25938733` ; avant : voir les IMPL | `.\Tools\Restore.ps1 -Lot AMEL1-R10` pour les deux outils modifiés ; `git rm Tools/Indicateurs.py` (instantané `AMEL1-M1`), sur accord | | CHG-350 | 2026-10-14 | AMEL1 | Addon `D:\Game\LifePlay-Sandbox-5.8` (branche `ue5.8`) : `Tools/claude/skills/lp-lot/SKILL.md`, `lp-lot/boss.md`, `lp-doc/SKILL.md`, `lp-doc/gabarits.md`, `lp-validate/SKILL.md`, `lp-paths/SKILL.md`, `lp-build/SKILL.md` (suivis), `sk-windows-shell/SKILL.md`, `sk-orchestrate/SKILL.md`, `Tools/claude/agents/lp-inventory.md` (premier commit) ; jeu (`ue5.8`) : `Docs/32_Organisation_Agents.md` (§ 15.9 complété, § 15.13 nouveau), livrables `Docs/Migration/etat/EVAL2/AMEL1/` | Lot AMEL1, suite de l'évaluation EVAL2 (`etat/EVAL2/EVAL2-RAPPORT.md`, VAL T9 PASS avec réserves), ordre de l'utilisateur du 2026-10-14 (« implémentons les recommandations […] un indicateur mesurable […] ») ; recommandations R1, R5 à R9, R11 à R14 : textes approuvés par l'utilisateur (« Approuvé tel quel », avec R14 en option B, rotation à 250 k par session, citations caviardées), appliqués à 9 skills, à l'agent lp-inventory et au doc 32 : rôle de Big Boss recentré (file UE, arbitrages, GO ; 5 contrôles de sécurité gardés), gabarits de fiche de tests, de bilan et d'entrée de bilan, brouillon du journal au fil de l'eau, PubCheck en VAL, VAL témoin en jeu, consignes de shell, fiches lp-cart étroites, horodatage et colonnes de registre, sessions renommées, VAL de build séparée. Indicateurs I1 à I14 (`AMEL1-INDICATEURS.md`). VAL `AMEL1-V1a-VAL.md` PASS-STATIC (30 changements mot pour mot, aucun hunk étranger, LF, PubCheck 0) | MD5 avant → après : `AMEL1-W2-DOC.md` § 1 ; doc 32 après `0fc8439d` | `.\Tools\Restore.ps1 -Lot AMEL1-W2 -ProjectRoot D:\Game\LifePlay-Sandbox-5.8` et `-Lot AMEL1-W2-jeu` (éditeur fermé, sur accord), ou `git revert` des deux commits | | CHG-349 | 2026-10-14 | REL-ALPHA | `Source/LifePlay/LPModGuard.cpp`, `Config/DefaultGame.ini`, `Tools/modules/2026.10.2.1a.json` (nouveau) (jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8`) ; hors dépôt : `D:\Game\LifePlay_Build_5.8_ALPHA-2026.10.2.1a_Shipping` (+ PDB), `D:\Game\LifePlay_Publication\` (archive, 4 zips de mods, index, notes) ; livrables `Docs/Migration/etat/REL/ALPHA/` | Lot REL-ALPHA (demande de l'utilisateur : « bien je valide le comportement de l'alpha. Prépares la build de livraison », 2026-10-14 16:00). **Version** : `ProjectVersion=2026.10.2.0` → `2026.10.2.1a` (`REL-ALPHA-T1-IMPL.md`, VAL PASS `REL-ALPHA-T1v-VAL.md`, 1 ligne). **LPModGuard** : la lettre finale rendait la version illisible (contrôle de version des mods désactivé, mods construits pour l'alpha refusés) ; **décision de l'utilisateur « Lettre acceptée »** (option B, le contrat des mods change par décision dédiée) : `ParseVersion` retire les lettres ASCII de fin de la **dernière** composante avant la comparaison (`2026.10.2.1a` donne 2026, 10, 2, 1), reste de la fonction inchangé (19 lignes ajoutées, 1 retirée) ; VAL PASS-STATIC (`REL-ALPHA-V3-VAL.md`, 10 cas tracés). **Shipping** (`REL-ALPHA-T2-BUILD.md`) : compilation, cuisson à froid, paquet ; exe `4A9BBDB3`, CheckPackage PASS 4/4 ; contrôles `REL-ALPHA-T3-VAL.md` : version dans le pak, pas de `DrawDebugBox`, pas de Sentry, pas de `LPSaveLocation.ini`. **E9 PASS** (`REL-ALPHA-E9-RESULTAT.md`) : relance avec `-UserDir=…\LifePlay-Revival`, dossier créé, sauvegarde `1.sav` (220 584 o) puis « Continuer » OK, ancien `%LOCALAPPDATA%\LifePlay` identique (68 fichiers, 19 650 943 o). E5 non fait, facultatif. **Mods** (`REL-ALPHA-T6-MODS.md`, `T6a-VAL`, `T6b`, `T6c-BUILD`) : `Tools/modules/2026.10.2.1a.json` (découpage `vin_*`) ; 4 zips dans `Mods_2026.10.2.1a\` : `vin_Modules` (628 fichiers, 876 567 o, avec la licence de l'auteur), `lpr_hair_pocolov` (3 810 007 o, 19 fichiers), `lpr_anim_quaternius` (15 798 364 o, 93), `lpr_anim_freeanims` (4 417 184 o, 29), recuits contre la référence `2026.10.2.1a` (70 / 84 / 20 paquets cuits, code 0) ; essayés sur une copie jetable, « c'est bon » (utilisateur, 17:25-17:30). **Archive** (`REL-ALPHA-T5.md`) : `LifePlay_Revival_2026.10.2.1a_Windows_Game.7z`, 1 291 995 663 o, SHA-256 `89ed211dfae2233000fbec236a0c10fb784e4b948705ddf10d91be1c4a0898c0`, `7z t` OK, 1 452 fichiers, une racine, 0 `Saved` / `.pdb` / `LPSaveLocation.ini` / `Content\Saves` / `LifePlay\Mods` ; PubCheck 0 constat (le fichier de 1,26 Go lu en flux : 0 / 0 / 0 / 0). **Notes de version et annonces** : `LifePlay_Revival_2026.10.2.1a_Notes.txt` (EN et FR, posées dans `Publication` à 17:50), annonces Discord et Patreon, devlog n° 2 (brouillons de l'étape REL). **Réserve connue** : les personnages d'une partie restent dans `\LifePlay\Content\Saves`, hors du dossier choisi pour `Saved` (ERR-042, à dire dans les notes). Pas de tag : `v2026.10.2.1a` sera posé par le gardien après les commits | `LPModGuard.cpp` `239C49D0` (= HEAD, 525 l.) → `54AAC4D9` (543 l.) ; `LPModGuard.h` `C09543BE` inchangé ; `DefaultGame.ini` `C6B2E366` (= HEAD) → `4F89F2D1` (`4f89f2d1b63dd7d6bcae0fa1575f6727`) ; `Tools/modules/2026.10.2.1a.json` `FB644B9F` (— → créé) ; Shipping exe `4A9BBDB3` ; archive SHA-256 ci-contre ; instantané `D:\Game\LifePlay_Backup_5.5\REL-ALPHA\` | Avant commit : `.\Tools\Restore.ps1 -Lot REL-ALPHA` (`LPModGuard.cpp` et `DefaultGame.ini` d'avant ; le fichier `Tools/modules/…json` est retiré, jamais supprimé), d'abord `Snapshot.ps1 -Lot REL-ALPHA-retour`, sur accord. Après commit : `git revert` (`git log --grep REL-ALPHA`), par ticket RESTORE au gardien avec l'accord de l'utilisateur. Archives et zips : les déplacer vers `D:\Game\LifePlay_Backup_5.5\REL-ALPHA\`, jamais les supprimer | | CHG-348 | 2026-10-14 | CAM (B2 à B2s, B2p-C à J, T-occ) | `Content/BPs/Room.uasset`, `Content/BPs/PC.uasset`, `Source/LifePlay/LPCameraModeSubsystem.h`, `Source/LifePlay/LPCameraModeSubsystem.cpp` (nouveaux) (jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8`) ; livrables `Docs/Migration/etat/CAM/` | Lot CAM (`CAM-SPEC.md` amendée, `CAM-B2p-SPEC.md`, `CAM-B2p-G-SPEC.md`, `CAM-B2-DOC.md`). **C2** : caméra à la troisième personne de pièce (`CamRoom`, rotation de contrôle du PC, poursuite lissée, évitement d'obstacles, toujours dans la pièce, pilotage souris / flèches / molette). **B2c** : indicateur du mode de caméra (`ULPCameraModeSubsystem`). **Corrections** B2f à B2n (POV lu sur le PC, `GI.Wall` ignoré, garde `NOT SexOn`, recalage de C1 sur les yeux, lacet POV, orbite de scène, témoin d'occlusion T-occ), **B2r** (`SpaceOn` remis à la sortie de CharGen ; COMMUN-7 L1 / L2 OK), **B2s** (orientation de C1 recalée à chaque passage). **Pendant le sexe** (demandes de l'utilisateur : ZQSD pour la caméra, flèches pour le couple, deux modes puis C3 au cycle, glisser-déposer) : **B2p-R** (Room : vue Scene = `SceneCamera`, 2 nœuds, 13 liens, 1 279 nœuds), **B2p-C**, **B2p-D**, **B2p-E** (borne dure du couple), **B2p-F** (intérieur réel de la pièce par les murs `Wall*`, marge, pose libre de recouvrement ; ligne des bornes ; appel de G3), **B2p-G** (C3 dans le cycle C du sexe : Scene, C3, POV ; recadrage sur le couple ; la caméra de scène suit le couple ; PC `F45BE57A` → `B07F16A9`, V5 1 439 → 1 447 nœuds), **B2p-H** (pose sur le lit, seuls sol et lits admis, clic molette = panneau des positions), **B2p-I** (icône « i » à la place des 4 lignes d'aide), **B2p-J** (souris libre pendant le sexe : glisser et rotation de retour ; refus muets journalisés ; panneau sur **Alt** ; restauration des touches à la sortie avec ligne de témoin ; PC `B07F16A9` → `707220A6`, 1 447 → 1 445 nœuds). VAL : statique PASS pour chaque point (`CAM-B2p-F-VAL.md` à `CAM-B2p-J-PC-VAL.md`, PC V5 / V6 = référence). **En jeu** : COMMUN-8, M1 à M8 OK ; COMMUN-9, P4 KO (couple hors de la pièce) → B2p-E ; COMMUN-10, Q1 à Q3 KO → B2p-F et G3 ; COMMUN-11 (`COMMUN-11-BILAN.md`) : R1 à R3, R5 à R7 OK, R4 KO partiel (lit par le côté seulement, pose sur des meubles), vue du couple perdue → B2p-G et H ; COMMUN-12 (`COMMUN-12-BILAN.md`) : S1, S2, S6, S7, clic molette OK ; S3 (le lit) et S5 (glisser et rotation à la souris) KO, Espace déjà pris → B2p-J ; **COMMUN-13 : « bien je valide le comportement de l'alpha. Prépares la build de livraison » (utilisateur, 2026-10-14 16:00, `BOSS-JOURNAL.md` l. 501)** ; **`COMMUN-13-BILAN.md`** (section « Décision de l'utilisateur », essai de 15:54 à 16:21, exe `1A9A3B07`) : T1 à T8 OK, validés en bloc (glisser et rotation à la souris, pose sur le lit, refus du dessus des meubles, Alt et clic molette, Espace rendu, icône « i », restauration à la sortie, cycle C et cadrage). Incident : plantage GPU à 14:21:45 UTC (fin de session, jeu immobile depuis 12 min, hors scène de sexe, premier sur 13 essais), cause extérieure estimée, non bloquant, cité dans les défauts connus des notes de version (`STG-COMMUN13-GPU-DIAG.md`). Reste hors périmètre : B3 (vue plafonnier), POV de scène dans les têtes (ERR-110) | Room `50E736F8` (= HEAD) → … → `3A451FDD` (B2n) → `C5AB7241` (B2s) → `93138747` (B2p-R ; relue au disque) ; PC `A19510E6` (= HEAD) → `F45BE57A` (B2m) → `B07F16A9` (B2p-G) → `707220A6` (B2p-J ; relue au disque, 3 404 928 → 3 420 303 o) ; `LPCameraModeSubsystem.h` 206 l. `9AEE8D04`, `.cpp` 2 220 l. `1F10631F` (— → créés ; étapes `.cpp` `FE9236BD` T-occ, `124336D3` B2r, `8E35E07A` B2p-C, `D6063264` B2p-D, `FFF0FBB4` B2p-E, `8C6A3D71` puis `03D85D28` B2p-F, `A5F041FF` B2p-G, `210B665A` B2p-H, `0F383EF7` B2p-I, `1F10631F` B2p-J ; `.h` `9AEE8D04` final, précédents `61A3E062`, `9E20981F`, `6585D7F6`, `0EDC1F76`, `4AE65994`, `00D43993`, `239DA609`, `6EDBBCCF`) ; instantanés `D:\Game\LifePlay_Backup_5.5\CAM-B2\`, `CAM-B2b`, `CAM-B2d`, `CAM-B2f`, `CAM-B2g`, `CAM-B2i`, `CAM-B2j`, `CAM-B2kmn`, `CAM-Tocc`, `CAM-B2r`, `CAM-B2s`, `CAM-B2p-R`, `CAM-B2p-C` à `-F`, `CAM-B2p-F-G3`, `CAM-B2p-G`, `CAM-B2p-G-PC`, `CAM-B2p-H1` à `H5`, `CAM-B2p-I0` à `I4`, `CAM-B2p-J-PC` | Avant commit : `.\Tools\Restore.ps1 -Lot CAM-B2` (Room de B1) ou le lot du sous-lot voulu (`CAM-B2s`, `CAM-B2p-R` pour Room ; `CAM-B2p-J-PC`, `CAM-B2p-G-PC` pour PC ; `CAM-B2p-F` … `I4` pour le C++), éditeur fermé, d'abord `Snapshot.ps1 -Lot CAM-B2-retour`, sur accord ; les deux fichiers `LPCameraModeSubsystem.*` : les déplacer vers `D:\Game\LifePlay_Backup_5.5\CAM-B2\`. Après commit : `git revert` (`git log --grep CAM-B2`), par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-347 | 2026-10-14 | STE (H3g, GEL1, ORG4, ORG5, G3) + STG-B7a | `Content/BPs/GI.uasset`, `Content/UI/TopRight.uasset`, `Source/LifePlay/LPBonusRewardSubsystem.h`, `Source/LifePlay/LPBonusRewardSubsystem.cpp` (nouveaux), `Source/LifePlay/LPShowCoupleSubsystem.h`, `Source/LifePlay/LPShowCoupleSubsystem.cpp` (jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8`) ; livrables `Docs/Migration/etat/ST/STE/` et `ST/STG/` (STG-B7a) | **GI, G16** (STE-H3g, F3 de `STE-H3f-DIAG.md`, ERR-093) : `IsValid` + Branche avant chacune des deux boucles sur `Materials` ; 4 nœuds, 2 coupures, 10 liens, 6 249 → 6 253 nœuds ; VAL statique PASS, non démontré en jeu, accepté par l'utilisateur. **GI, B7-a** (`STG-B7a-IMPL.md`) : dans `Show`, si distance < 70 cm, `SexOn` faux et personne ≠ joueur, `moveToPersonStand(Player, 100)` ; 7 nœuds, 1 broche, 12 liens, `Show` 84 → 91 ; COMMUN-3, D4 OK (compagnon à ≈ 1 m). **GI, O4a** (`STE-ORG4a-IMPL.md`) : garde `PersonCumming`, 3 nœuds, 6 253 → 6 256, V5 PASS. **GI, O4c** (`STE-ORG4c-Ic1.md`, `STE-ORG4c-IMPL.md`) : bonus à la fin par `Endsex`, par participant, 17 nœuds puis 1 coupure, 26 liens, 7 valeurs, 6 256 → 6 273, V5 PASS-STATIC ; COMMUN-8, M8 OK (`COMMUN-8-BILAN.md` : « bien on valide la scene de sexe dans son ensemble pour l'alpha », 11:06). **TopRight, GEL1** (`STE-GEL1-IMPL.md`, ERR-098) : pas de tri `SortByDistance` au-delà de 2 000 résultats (gel de 34,2 s) ; 2 nœuds, 1 coupure, 5 liens, 907 → 909 ; COMMUN-6 J12 et COMMUN-7 « recherche rapide ». **ORG5** (bonus d'orgasme, C++ autonome) : `LPBonusRewardSubsystem` (165 + 1 028 lignes), 3 récompenses, réglage `bDisabled`, ligne « Bonus » sous la grille d'objets du menu d'actions, 20 s (décision de l'utilisateur : même emplacement que chez l'auteur) ; VAL PASS-STATIC (`STE-ORG5-V1-VAL.md`, `STE-ORG5-V2-VAL.md`) ; COMMUN-8, M7 OK. **G3** (`STE-G3-IMPL.md`, `STE-G3-VAL.md`, ERR-114) : `ULPShowCoupleSubsystem::NotifyCoupleTeleported()` (+19 lignes `.cpp`, +4 `.h` au `git diff`), appelée par CAM une fois par pose validée, reprend `LastSafe` à la place du meneur ; VAL PASS-STATIC ; compilée en COMMUN-11 ; **COMMUN-11** R5 OK (« impossible de coincé le couple »), aucune ligne `place reprise` dans le journal (appel sans effet ou absent, vérification demandée à CAM) ; **COMMUN-12** : 2 lignes `NotifyCoupleTeleported` au journal, aucun KO de coincement rapporté (`COMMUN-11-BILAN.md`, `COMMUN-12-BILAN.md`) ; alpha validée sur COMMUN-13 (`COMMUN-13-BILAN.md`). Livrables sans changement de fichier : DIAG H3e / H3f / H3h / H3i, audit `STE-ORG-AUDIT.md`. Défauts d'origine reconnus : ERR-089, 091, 094 à 097 | GI `C4817B84` (= HEAD) → `0E6AEDCC` (G16) → `E64B5B37` (B7-a) → `BD0A2256` (O4a) → `32FC0A97` (O4c ; `32fc0a97…` relue au disque) ; TopRight `1FCB94A6` (= HEAD) → `CB835360` (`cb8353603cf95849b4f778a33b4bfbd2`) ; `LPBonusRewardSubsystem.h` `87177C7A`, `.cpp` `16147626` (— → créés) ; `LPShowCoupleSubsystem.cpp` `35CF128C` (= HEAD) → `3CDD572D`, `.h` `57DC8CD4` (= HEAD) → `44C721EE` ; instantanés `D:\Game\LifePlay_Backup_5.5\STE-H3g\`, `STG-B7a\`, `STE-ORG4\`, `STE-ORG4c\`, `STE-GEL1\`, `STE-ORG5-I2a\`, `STE-G3\` | Avant commit : `.\Tools\Restore.ps1 -Lot STE-H3g -Only Content\BPs\GI.uasset` (GI à `C4817B84`, retire tout ; états intermédiaires : `-Lot STG-B7a`, `-Lot STE-ORG4`, `-Lot STE-ORG4c`) et `-Lot STE-GEL1 -Only Content\UI\TopRight.uasset`, éditeur fermé, d'abord `Snapshot.ps1 -Lot STE-retour`, sur accord ; `LPBonusRewardSubsystem.*` : les déplacer vers `D:\Game\LifePlay_Backup_5.5\STE\ORG5-I1\` (aucun instantané de la version I1 seule, écart STE) ; ShowCouple : `-Lot STE-G3`. Après commit : `git revert` du commit (`git log --grep STE`), par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-346 | 2026-10-14 | EVAL-FAB | Livrables seuls `Docs/Migration/etat/AG/EVAL-FAB/` : `EVAL-FAB-1.md`, `EVAL-FAB-2-INVENTAIRE.md`, `EVAL-FAB-2b-ORIGINE-UI.md`, `EVAL-FAB-3.md`, `EVAL-FAB-4.md` (jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8`) | Lot EVAL-FAB (demandes de l'utilisateur via Big Boss, 2026-10-13 et 14), lectures seules : rien téléchargé, acheté ni installé, aucune licence acceptée, aucun jeton UE. **EVAL-FAB-1** (outil de mesure de distances) : non ; 0 € mais l'EULA interdit de diffuser le contenu seul et de l'associer à une licence de type GPL alors que le dépôt est public sous AGPL-3.0. **EVAL-FAB-2** : inventaire : aucun contenu sous Standard License suivi par git ; origine inconnue de 1 fond et 121 icônes d'interface. **EVAL-FAB-2b** : un seul ajout au dépôt (état initial du projet 5.5), aucune licence lisible ; décision de l'utilisateur : garder les 122 fichiers, ne remplacer que sur licence incompatible prouvée, aucun crédit sans source exacte. **EVAL-FAB-3** (assistant IA pour l'éditeur) : non, avant comme après l'alpha — doublon de l'outillage actuel, modification du projet réservée à l'édition payante, 27 plugins du moteur imposés, second serveur MCP contraire à `lp-mcp` § 1 règles 8 et 9. **EVAL-FAB-4** (nouveau : « Scope Insight RT », vectorscope, forme d'onde et histogramme dans le viewport de l'éditeur) : **non avant l'alpha** ; plugin de l'éditeur seul (24 classes C++, aucun code dans le jeu empaqueté), Personnelle 0 €, Professionnelle 89,26 € TTC, publié le 2026-10-14, 0 avis ; exige DirectX 12 avec Shader Model 6 alors que le projet est en SM5 (commentaire du lot L7c) : question principale d'un éventuel lot dédié après l'alpha ; lecture seule. Aucun fichier du jeu modifié | — → 5 livrables créés (EVAL-FAB-4 : 6 366 o) ; aucun asset, source ni configuration modifiés | Avant commit : déplacer les cinq fichiers vers `D:\Game\LifePlay_Backup_5.5\EVAL-FAB\`. Après commit : `git revert` (`git log --grep EVAL-FAB`), par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-345 | 2026-10-14 | REL (SAV, MENAGE1) | `Source/LifePlay/LPSaveRelaunch.h`, `Source/LifePlay/LPSaveRelaunch.cpp` (nouveaux), `Source/LifePlay/LifePlay.cpp` (jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8`) ; hors dépôt : 32 dossiers `D:\Game\LifePlay_Build_5.8_*` envoyés à la corbeille de Windows, 33 journaux copiés dans `D:\Game\LifePlay_Backup_5.5\builds_corbeille\` ; livrables `Docs/Migration/etat/REL/SAV/` et `REL/MENAGE1/` | **SAV** (demande de l'utilisateur du 2026-10-13) : garde de relance B+ avant `WinMain` : `-UserDir="%LOCALAPPDATA%\LifePlay-Revival"` ou `SaveDir` de `LPSaveLocation.ini` ; Shipping toujours, Development seulement avec l'ini, `-LPNoSaveRelaunch` la coupe ; `LifePlay.cpp` +1 include +1 appel (+3 lignes) ; aucune reprise des anciennes sauvegardes (R0) ; `.h` 9 lignes, `.cpp` 396. VAL statique PASS (`REL-SAV-VAL.md`). **Essais sur COMMUN-8** (`REL-SAV-RESULTATS-COMMUN8.md`, Big Boss) : E1 PASS (sans ini : `relance=non`), E2 PASS (3 processus, enfant avec `-UserDir`, `Saved` créé dans le dossier d'essai, ancien `Saved` identique avant et après sur 19 fichiers, Continuer recharge la partie), E3 PASS (arguments dans l'ordre), E4 PASS (`-UserDir` explicite : une instance), E6 PASS (`-LPNoSaveRelaunch`), E7 et E8 PASS partiels (plus aucune instance ; code de sortie non lu) ; **E9 PASS** sur le Shipping `2026.10.2.1a` (exe `4a9bbdb3`, `REL-ALPHA-E9-RESULTAT.md`) : relance avec `-UserDir=…\LifePlay-Revival`, dossier créé, sauvegarde puis Continuer OK, ancien dossier identique (68 fichiers, 19 650 943 o). E5 (`LPSaveLocation.ini` relatif) non fait, facultatif. Réserve : les personnages d'une partie restent dans `Content\Saves` de l'installation (`REL-ALPHA-T6b.md` § 2). » | DOC de clôture (README, `TracesRacines.ps1`, skills, doc 29) préparée, non déposée (`REL-SAV-DOC.md`). **MENAGE1** (demande du 2026-10-14, jamais de suppression définitive) : 40 dossiers de builds (76,3 Go) examinés, 8 gardés (17,05 Go), 32 envoyés à la corbeille un à un (59,24 Go) ; 33 journaux (54 631 026 o) copiés au préalable, MD5 identiques ; corbeille de `D:` 87,05 → 146,30 Go ; 0 arrêt ; ligne `TRACES-INDEX.csv` à reporter par Big Boss | `LPSaveRelaunch.cpp` `A0CD6687` (— → créé), `.h` `F31173F6` (— → créé), `LifePlay.cpp` `FB62EEAC` (= HEAD) → `3F7FFA30` (relue au disque, inchangée depuis la 1re version) ; instantané `D:\Game\LifePlay_Backup_5.5\REL-SAV\` ; MENAGE1 : 40 → 8 dossiers de builds | SAV, avant commit : `.\Tools\Restore.ps1 -Lot REL-SAV` (`LifePlay.cpp` à `FB62EEAC`, deux fichiers neufs retirés, jamais supprimés), jeu fermé, d'abord `Snapshot.ps1 -Lot REL-SAV-retour`, sur accord. Après commit : `git revert` (`git log --grep REL`), par ticket RESTORE au gardien avec l'accord de l'utilisateur. MENAGE1 : restauration depuis la corbeille de Windows (chemin d'origine conservé) ; copies de journaux sous `builds_corbeille\` | | CHG-344 | 2026-10-14 | STG | `Source/LifePlay/LPDebugSubsystem.cpp`, `.h`, `Source/LifePlay/LPDirectControlSubsystem.cpp`, `.h`, `Source/LifePlay/LPOutdoorRoomSubsystem.cpp`, `.h`, `Content/BPs/Person.uasset` (suivis) ; hors git (`.gitignore`) : `Content/Heavy/New2/Furniture/fnt_ext001.uasset`, `Content/Heavy/Daz/Bridget/Anim/B_Walk_Loop.uasset`, `Content/Heavy/Daz/Michael/Anim/M_Walk_Loop.uasset` (jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8`) ; livrables `Docs/Migration/etat/ST/STG/` | Lot STG (défauts visuels prioritaires de l'alpha : enfoncement dans la rue, chevauchement, marche du joueur). **Mesure** (`LPDebugSubsystem`) : `LifePlay.PersonsDump` / `-LPPersonsLog` (M1), STATE / WALK (M1b), trace complexe (M1c), filtre `CLOSE`, ligne `COUPLE` (M1d : en COMMUN-6 le couple touche le lit, `lowestMinusUnder` ≈ 1 cm, cas J10 OK). **Enfoncement** (`LPOutdoorRoomSubsystem`) : boîte du sol épaissie en extérieur (S-F4), décors `fnt_ext*` en Pawn Ignore (S-F4b) puis solides quand l'asset est en collision complexe (variante façades), relevage des passants et du joueur (S-F5, S-F5j), écart de 50 cm (S-F5k), relevage écarté de la normale de dépénétration quand le point colle à un décor (S-F5m, S-F5n), relevage dès la pose et balayage de 3 s à l'entrée en extérieur (S-F5p). **Façades** : `fnt_ext001` en Use Complex As Simple (hors git) ; en jeu (COMMUN-6) murs de la rue solides (J1 OK), pieds sur le pavé (J2 OK) ; **décision de l'utilisateur** : variante façades faite avant l'alpha (GO rapporté par Big Boss, `STG-C5a`). **Marche et coincements** (`LPDirectControlSubsystem`) : témoin de scène (KO3a), libération du meuble au premier pas (KO3b), `OnSeat` (C1-Walk), marche animée par clip cuit (WALK ; VAL passe 1 FAIL, passe 2 PASS-STATIC), échappement des recouvrements de Room (KO3c), témoin des touches de marche M1e, `Scene_C` ne coupe la marche que s'il montre une boîte visible (C6-b, réponse de l'utilisateur : pas de boîte visible), joueur posé à 80 cm quand un Blueprint libère son siège sans marche (C7-a, défaut d'origine estimé), bornes de rendu des personnages assis : B2q-a (BoundsScale adaptatif S ∈ [1 ; 4]) + témoin T-cull, B2q-b1 (plancher 3, plafond 25, témoin de l'os racine ; COMMUN-9 : « plus de disparition au café »), M-Z (maillage remis à la hauteur du gabarit de sa classe après le lever : « Bridget flotte », COMMUN-9). **Person** : G-B1a (`IsValid` dans `moveToPersonStand`), contrôle des tiers (B1, 7 nœuds, RVO), K8-a (maximum aux 2 `Map_Add`) ; EventGraph 3 702 → 3 714 nœuds. **Hors git** : clips dupliqués sous `/Game/Heavy/Daz//Anim/` (COMMUN-4 : 75 et 105 lancements). **Preuves** : VAL PASS-STATIC de chaque sous-lot (`STG-*-VAL.md`) ; builds COMMUN-1 à COMMUN-10 avec CheckPackage PASS, 0 avertissement (`STG-COMMUN10-BUILD.md` : exe `61D0ABC7`, 48 chaînes). **Verdicts en jeu** : COMMUN-8, C7-a OK (cas N2 à N5, O1 à O4), B2q-a OK partiel (au café, disparitions selon l'angle → B2q-b1), rue OK mais deux personnages enfoncés contre une façade (→ S-F5m / n) ; COMMUN-9, P1 OK (B2q-b1 confirmé, aucun ralentissement), P3 KO (relevage 2 à 4 s après l'arrivée → S-F5p), P5 KO (« Bridget flotte » → M-Z) ; COMMUN-10, Q4 OK (M-Z confirmé), Q5 OK (S-F5p confirmé), Q6 OK (B2q-b1 reconfirmé) (`COMMUN-8-BILAN.md`, `COMMUN-9-BILAN.md`, `COMMUN-10-BILAN.md`). Après l'alpha : STG-POST1 (façades fines), STG-POST2 (points de `standIdle`), B2q-b2 à b4. Défauts : voir ERR-089 à ERR-132 **Suites** : builds COMMUN-11 à COMMUN-13 (`STG-COMMUN11-BUILD.md` à `STG-COMMUN13-BUILD.md`, CheckPackage PASS ; COMMUN-13 : exe `1A9A3B07`, 65 chaînes, un avertissement C4701 faux positif) ; aucune source STG modifiée depuis (MD5 finales inchangées au disque : `5f9d7e00`, `01d5ea3c`, `dc68ed8a`, `6a3edd73`, `f0081f9f`, `78d3a079`, `8668a47c`, `df2db514`) ; plantage GPU pendant l'essai COMMUN-13, cause extérieure estimée (`STG-COMMUN13-GPU-DIAG.md`). | `LPOutdoorRoomSubsystem.cpp` `1340EE4F` (= HEAD) → `DD8646F8` → `6F1212D6` → `5B65B064` → `E84D59D6` → `90F9324B` (S-F5k) → `9DCF0A35` (S-F5m / n) → `DC68ED8A` (S-F5p, disque) ; `.h` `66F21A87` (= HEAD) → `CA18AC44` → `DF2A04B3` → `54696352` → `DFC20AD4` → `F9ED4D2D` → `60FCE1DE` → `6A3EDD73` (disque) ; `LPDirectControlSubsystem.cpp` `CC5EB9BC` (= HEAD) → `64766F64` → `827F19C0` → `5323C2B2` → `8A680F80` → `BAAA3982` (KO3c) → `44ACE47D` (M1e, C6-b) → `1A74D6B7` (C7-a) → `7448C8FB` (B2q-a) → `4CF589B2` (B2q-b1) → `5F9D7E00` (M-Z, disque) ; `.h` `7B8FED0E` (= HEAD) → `3CDB4985` → `77AE7007` → `979AE0AD` → `ACFF924A` → `519E23DC` → `5F349291` → `A82ED5CF` → `01D5EA3C` (disque) ; `LPDebugSubsystem.cpp` `22912735` (= HEAD) → `A7D01CAC` → `57880954` → `FF69A2EE` → `E281ACE2` → `F0081F9F` (disque) ; `.h` `1DE29C12` (= HEAD) → `78D3A079` ; Person `D1B4C63D` (= HEAD) → `B239E103` → `8668A47C` ; `fnt_ext001` `B2C6696F` → `DF2DB514` (506 918 o) ; clips B `C10FB66E`, M `D41DB867` (créés) ; instantanés `D:\Game\LifePlay_Backup_5.5\STG\` (Person `D1B4C63D`, sources d'avant M1 et S-F4), `STG-B2P`, `STG-SF4b`, `STG-CLOSE`, `STG-KO3`, `STG-KO3b`, `STG-SF5`, `STG-C1W`, `STG-WALK2` (`STG-WALK` erroné), `STG-KO3c`, `STG-SF5j`, `STG-SF5k`, `STG-M1d`, `STG-M1e`, `STG-C6b`, `STG-C7a`, `STG-B2q`, `STG-B2qb`, `STG-SF5m`, `STG-MZ`, `STG-FACADE`, `STG-FACADE-copie`, `STG-WALKA-copies` | Avant commit : `.\Tools\Restore.ps1 -Lot STG` (Person à `D1B4C63D`, sources d'avant M1 et S-F4), `-Lot STG-B2P` (Person à `B239E103`) et, pour une source, le lot du sous-lot (`STG-MZ`, `STG-B2qb`, …), éditeur fermé, d'abord `Snapshot.ps1 -Lot STG-retour`, sur accord ; `fnt_ext001` : `-Lot STG-FACADE` (MD5 d'avant `B2C6696F`, à relire dans le manifeste : **à confirmer**) ; clips : déplacer les deux copies vers `D:\Game\LifePlay_Backup_5.5\STG-WALKA-copies\`. Après commit : `git revert` du commit (`git log --grep STG`), par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-343 | 2026-10-13 | STE-H3d | `Content/BPs/GI.uasset` (jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8` ; un commit par asset) | Lot STE-H3d (lectures `Person[0]` restantes dans le `CHECKING:` des scènes d'animal `pet/meet_new_person_*`, `STE-H3d-SPEC.md`), garde G13 variante b dans `CallFunctionReturnBool` : `IsValidIndex(Person, 0)` + Branche avant la lecture `Person[0]` de la commande `isCreatureType` ; sans personne, `BoolToReturn` = false, valeur que rendait déjà `isCreatureType` sur un acteur nul (dump P1). 3 nœuds, 1 coupure, 6 liens, 591 → 594 nœuds (`STE-H3d-IMPL.md`). Raison : avertissements « Attempted to access index 0 from array 'Person_24…' » et « Accessed None … property Actor » de ces scènes (J6 : 5 + 5 attribués). VAL statique `STE-H3d-VAL.md` PASS (critères de jeu reportés au build de STE-H3e). Décisions de l'utilisateur : Q-H3d-1 b, Q-H3d-2 DIAG (STE-H3e), Q-H3d-3 abstention G14. Aucune ERR | MD5 `6A957CB2` (= HEAD) → `C4817B84` ; instantané `D:\Game\LifePlay_Backup_5.5\STE-H3d\` | Avant commit : `.\Tools\Restore.ps1 -Lot STE-H3d` éditeur fermé (d'abord `Snapshot.ps1 -Lot STE-H3d-retour`), sur accord ; GI revient à `6A957CB2`. Après commit : `git revert` du commit de l'asset (`git log --grep STE-H3d`), par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-342 | 2026-10-13 | TRACE1 | Jeu (`D:\Game\LifePlay-master 5.8`, branche `ue5.8`) : nouveaux `Tools/Traces.ps1`, `Tools/Corbeille.ps1`, `Tools/TracesRacines.ps1`, `Docs/Migration/etat/TRACES/TRACES-INDEX.csv` (commits `3967e9d`, `6babe5d`) ; `Docs/32_Organisation_Agents.md` (§ 15.12), `Docs/21_Sandbox_Addon.md` (pin `5953696`) ; addon `Tools/claude/skills/lp-lot/SKILL.md`, `lp-paths/SKILL.md`, `lp-doc/gabarits.md` sur `ue5.8` (`D:\Game\LifePlay-Sandbox-5.8`, `5953696`) ; hors dépôt : 202 traces envoyées à la corbeille de Windows ; livrables `Docs/Migration/etat/AG/TRACE1/` | Lot TRACE1 (règle de l'utilisateur du 2026-10-13 : traces et journaux des sessions résumés et indexés, puis envoyés à la corbeille au-delà d'1 mois ; proposition `TRACE1-T2-PROPOSITION.md` révision 1 approuvée par l'utilisateur, SPEC `TRACE1-T3-SPEC.md`) : inventaire T1 (3 574 fichiers, 35,9 Go) ; scripts `Traces.ps1` (inventaire, liste `-Avant`, index, lecture seule) et `Corbeille.ps1` (envoi par `SendToRecycleBin`, à blanc par défaut, refus hors racines, fichiers suivis, profil Claude, manifestes), racines communes dans `TracesRacines.ps1`, VAL `TRACE1-T4v-VAL.md` puis `TRACE1-T4cv-VAL.md` PASS ; essai T5 (envoi et restauration d'un témoin par l'utilisateur) PASS ; index initial T6 (334 lignes, résumés Contexte / Résultat / Suite) ; premier passage T7 sur accord de l'utilisateur et GO de Big Boss (traces de plus d'1 mois et doublons de `Backup_5.5`) ; textes T8 (doc 32 § 15.12, `lp-lot`, `lp-paths`, gabarits) approuvés par l'utilisateur (« Approuvé tel quel ») | T7 : 202 éléments envoyés, 0 refus, 0 échec, 7 904 641 572 o (≈ 7 538 Mo), corbeille 2 521 → 2 723 ; index : 20 lignes au statut corbeille, MD5 `252a89ef…d6e0` ; scripts `Traces.ps1` `cdb3d82f…`, `Corbeille.ps1` `61ef5e9c…`, `TracesRacines.ps1` `191408d5…` ; `PubCheck` 0 constat ; instantanés `D:\Game\LifePlay_Backup_5.5\TRACE1\`, `TRACE1-T4c\`, `TRACE1-T7\`, `TRACE1-T8\` (doc 32, doc 21, journal, README), `TRACE1-T8-addon58\` | Fichiers : `git revert` des commits (`git log --grep TRACE1`) dans le jeu et l'addon, par ticket RESTORE au gardien, ou `.\Tools\Restore.ps1 -Lot TRACE1-T8` (et `-Lot TRACE1-T8-addon58` avec `-ProjectRoot` de l'addon), sur accord ; traces : restauration depuis la corbeille de Windows par l'utilisateur (colonne « Emplacement d'origine »), tant que l'assistant de stockage ne l'a pas vidée (30 jours) | | CHG-341 | 2026-10-13 | PUB3 | Addon : `Tools/claude/skills/lp-repo/SKILL.md`, `lp-lot/SKILL.md`, `lp-paths/SKILL.md` sur `ue5.8` (`D:\Game\LifePlay-Sandbox-5.8`, `d2a67bd`) et `lot/DC3-atelier` (`D:\Game\LifePlay-Sandbox`, `6c04b51`) ; `sk-repo/SKILL.md` préparé dans la copie de l'addon 5.8 (non suivi, déploiement dans le profil par l'utilisateur) ; jeu : `Docs/21_Sandbox_Addon.md` (pin `d2a67bd`) ; hooks `pre-push` installés hors arbre (`.git\hooks\` du jeu 5.8, du jeu 5.5 et de l'addon, tickets CONFIG PUB3-R4 à R6) ; livrables `Docs/Migration/etat/AG/PUB3/` | Lot PUB3, fiche T7 (textes `PUB3-T7-TEXTES.md` et extension D4 de `PubCheck` approuvés par l'utilisateur : « oui pour les 2 », 2026-10-13) : `lp-repo` § 1 (tag `ue5.5-final` local), § 8 (ligne `PubCheck` du ticket), § 9 (garde-fou `pre-push`, publication par `pub/ue5.8`), § 10 (4 pièges) ; `lp-lot` (`PubCheck -Fichiers` avant ticket) ; `lp-paths` (tag local, `pub/ue5.8`) ; `sk-repo` § 4 (`PubCheck -Index` à l'étape 4). Tickets R7 et R8 refusés par le gardien (2 fragments hors texte approuvé), retirés puis R10 et R11. SPEC § 7.2 : publication C2 étendue à l'addon | `pre-push` `1f30b64c…` identique dans les 3 dépôts, preuve à blanc (refus code 1 sur les pointes non publiques avec le nom, 0 sur `origin/main`) ; skills `lp-repo` `c66a9a3e…`, `lp-lot` `4083bf44…`, `lp-paths` `80be5d4e…`, `patch-id` identique dans les deux arbres ; instantanés `D:\Game\LifePlay_Backup_5.5\PUB3-T7-addon58\`, `PUB3-T7-addon55\` | Skills : `git revert` des commits addon (`git log --grep PUB3-R10` / `R11`) par ticket RESTORE, ou `.\Tools\Restore.ps1 -Lot PUB3-T7-addon58` (et `55`) ; hooks : déplacer chaque `.git\hooks\pre-push` vers `D:\Game\LifePlay_Backup_5.5\PUB3\hooks\\`, sur accord | | CHG-340 | 2026-10-13 | PUB3 | 69 fichiers suivis du jeu (`D:\Game\LifePlay-master 5.8`, branche `ue5.8`) : `Docs/Journal_Modifications.md` (6 lignes d'entrées anciennes), `Docs/28_Synthese_Migration_UE58.md`, 67 livrables sous `Docs/Migration/etat/` (liste fermée `etat/AG/PUB3/PUB3-T1-fichiers.csv`, dont 4 tickets anciens d'`etat/REPO/tickets/`) ; addon `Tools/claude/skills/lp-doc/SKILL.md` sur `ue5.8` (`D:\Game\LifePlay-Sandbox-5.8`) et `lot/DC3-atelier` (`D:\Game\LifePlay-Sandbox`) ; nouveaux : `Tools/PubCheck.ps1`, `Tools/hooks/pre-push` (non installé) ; livrables `Docs/Migration/etat/AG/PUB3/` | Lot PUB3 (retirer le nom du compte Windows avant tout push de `ue5.8`, décision de l'utilisateur du 2026-10-13 : voie A puis publication C2, `PUB3-T2-PROPOSITION.md`, SPEC `PUB3-T3-SPEC.md` approuvée) : chemin `C:\Users\` remplacé par `%USERPROFILE%` (116 occurrences, 109 lignes, aucun autre changement ; fins de ligne et absence de BOM conservées, 4 fichiers CRLF) par `PUB3-T4-remplacer.ps1` (UTF-8 strict, refus avant écriture) ; contrôle `Tools/PubCheck.ps1` (nom du compte, dossier personnel, machine, adresse, identité, binaires ; jamais la valeur en sortie ; codes 0/1/2) et hook `pre-push` (installation par tickets CONFIG du gardien) ; VAL `PUB3-T6a-VAL.md` FAIL puis `PUB3-T6a-bis-VAL.md` PASS avec réserve D8 (corrigée, `PUB3-T5-IMPL.md` § 8), `PUB3-T6b-VAL.md` (remplacement). L'historique local garde le nom (23 commits non publics) : publication future par un seul commit `pub/ue5.8` (C2), push par l'utilisateur. Constat hors lot : 1 adresse personnelle publique sur `origin/main` (`bd4ea43`), option c de l'utilisateur (attente de C2) | `PubCheck -Fichiers` des 69 fichiers : 0 (avant : 218 constats) ; `git diff --numstat` 109 / 109 ; instantanés `D:\Game\LifePlay_Backup_5.5\PUB3\` (69 fichiers, `manifest.csv`), `PUB3-addon58\`, `PUB3-addon55\` (`lp-doc/SKILL.md` `1793AAC6…`) | Avant commit : `.\Tools\Restore.ps1 -Lot PUB3` (et `-Lot PUB3-addon58` / `PUB3-addon55` avec `-ProjectRoot` de l'addon), sur accord. Après commit : `git revert` du commit (`git log --grep PUB3`), par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-339 | 2026-10-13 | CAM-B1 | `Content/BPs/Room.uasset`, `Content/BPs/PC.uasset`, `Content/BPs/GI.uasset` (jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8`) ; livrables `Docs/Migration/etat/CAM/` (lot CAM, phase 1 et sous-lots B0, B0a, B1 à B1d) | Lot CAM, sous-lot B1 (`CAM-SPEC.md` amendée B0a, B1b, B1c, B1d ; `CAM-B1-IMPL.md`) : vue 1re personne C1 hors sexe par la touche C, commutation C1 → C2 → C3 dans Room. Room : variables `CamC1On`, `CamC3On`, `C1Hidden`, `RoomCamTimer` ; événements `ApplyRoomCamera`, `CycleRoomCamera`, `RestoreC1`, `UpdateRoomCam` ; voie C1 = caméra `FirstPersonSM` attachée à `head` puis placée au milieu des yeux (`lEye`, `rEye`, lus avant masquage), cheveux, tête (`HideBoneByName('neckLower')`, comme PC), soleil et mur masqués, `DelayUntilNextFrame`, puis vue ; sortie : vue d'abord, puis `RestoreC1` (mur rétabli à `NON(Room.bHidden)`, règle de PC, décision de l'utilisateur) ; minuterie morte `CallFunction_329` réemployée (`UpdateRoomCam`, 0,016 s, handle `RoomCamTimer`, `ClearandInvalidateTimerbyHandle`) ; `LoadRoom` reclasse la vue après `MoveAllToCenterRoom` hors constructeur et hors sexe ; C2 et C3 provisoires = ancienne vue de pièce (B2, B3). PC : touche C hors sexe → `Room.CycleRoomCamera` si `SpaceOn` ; fin du cycle POV → `Room.ApplyRoomCamera`. GI : `ApplyRoomCamera` après `OpenSpace`, `CloseContacts` et la fin de sexe. Sonde B0 (BP jetables, déplacés vers `Backup_5.5\CAM\B0\`). VAL `CAM-B1-IMPL.md` § 4 : compilations strictes sans message, dumps conformes (Room +74 nœuds, PC +6, GI +6, seuls les nœuds existants prévus changés), CompileAllBlueprints = référence STE-H10V (écart externe E1 `CR_FaceExpRig`), build Development et CheckPackage PASS, V8 0 « Accessed None » CAM ; essais de l'utilisateur PASS (homme et femme) après corrections B1c et B1d | Room `E8F58B2A` → `50E736F8` (`50E736F8919D13C9F4BF5085BB1439D5`) ; PC `09F54974` → `A19510E6` (`A19510E613F31905437BAB48F38C6154`) ; GI `71034A04` → `6A957CB2` (`6A957CB2A654FD1A06FF25CEC9727955`) ; instantanés `D:\Game\LifePlay_Backup_5.5\CAM-B1\` (Room, PC, GI d'avant), `CAM-B1c\`, `CAM-B1d\` (Room intermédiaires) | Avant commit : `.\Tools\Restore.ps1 -Lot CAM-B1` éditeur fermé (d'abord `Snapshot.ps1 -Lot CAM-B1-retour`), sur accord. Après commit : `git revert` du commit (`git log --grep CAM-B1`), par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-338 | 2026-10-13 | STE-H10 | `Content/UI/TopRight.uasset` (jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8` ; un commit par asset, décision de l'utilisateur du 2026-10-13) | Lot STE-H10 (saccades de fin de scène et d'apparition, `STE-H10-SPEC.md`), option B4-a : dans `Current`, `DelayUntilNextFrame` inséré avant `SwitchString_1`, pour que le corps ne s'exécute qu'une fois par fin de scène. VAL statique `STE-H10-VAL.md` (EventGraph 907 nœuds, chaîne `CustomEvent_5` → `DelayUntilNextFrame` → `SwitchString_1` relue, compile sans diagnostic ; l'écart E1 `CC_Shaders` du moteur est requalifié par l'utilisateur : critère « BP `/Game/` du projet »). Mesure en jeu J6 contre H9 (`STE-J6-TRACE.md` § 3) : le corps n'est exécuté qu'une fois par fin de scène mais dans la trame suivante, sans baisse de coût (moyenne 72,5 → 77,2 ms) ; sans gain mesurable, gardé par décision de l'utilisateur. Aucune ERR | MD5 `3DF4DEC4` → `1FCB94A6` (`1FCB94A60061B418E9DEEB08BC1A990D`) ; EventGraph, un nœud `DelayUntilNextFrame` ajouté ; instantané `D:\Game\LifePlay_Backup_5.5\STE-H10\` | Avant commit : `.\Tools\Restore.ps1 -Lot STE-H10 -Only Content\UI\TopRight.uasset` éditeur fermé (d'abord `Snapshot.ps1 -Lot STE-H10-retour`), sur accord. Après commit : `git revert` du commit de l'asset (`git log --grep STE-H10`), par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-337 | 2026-10-13 | STE-H10 | `Content/BPs/Person.uasset` (jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8` ; un commit par asset) | Lot STE-H10 (saccades de fin de scène et d'apparition, `STE-H10-SPEC.md`), options A1 et B3-a : A1, cheveux de tête chargés une seule fois dans `RandomizeHairs` ; B3-a, `ClearProxies` calcule le suffixe une fois (variable `ProxySuffix`). VAL statique `STE-H10-VAL.md` (EventGraph 3 702 nœuds, liens c1-c34 relus, b1-b8 absents ; `ClearProxies` 39 nœuds ; E1 `CC_Shaders` du moteur requalifié par l'utilisateur). Mesure en jeu J6 contre H9 (`STE-J6-TRACE.md` § 3) : B3-a `ClearProxies` moyen 8,13 → 5,82 ms (seuil 6,1 atteint) ; A1 : un seul chargement de cheveux de tête par `RandomizeHairs` atteint, mais `RandomizeHairs` max 38,4 → 48,9 ms (cheveux de corps, hors périmètre) et trame de démarrage inchangée, donc sans gain mesurable, gardé par décision de l'utilisateur. Aucune ERR | MD5 `BE21838A` → `D1B4C63D` (`D1B4C63D47621B1191AD9352C80C99CD`) ; instantané `D:\Game\LifePlay_Backup_5.5\STE-H10\` | Avant commit : `.\Tools\Restore.ps1 -Lot STE-H10 -Only Content\BPs\Person.uasset` éditeur fermé (d'abord `Snapshot.ps1 -Lot STE-H10-retour`), sur accord. Après commit : `git revert` du commit de l'asset (`git log --grep STE-H10`), par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-336 | 2026-10-13 | STE-H10 | `Content/BPs/GI.uasset` (jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8` ; un commit par asset) | Lot STE-H10 (saccades de fin de scène et d'apparition, `STE-H10-SPEC.md`), options B1-a et B2-a : B1-a, variables `SaveBeforeDestroy` et `RevertSkipped`, EventGraph +9 nœuds, `SavePreset` +3 nœuds, plus de `RevertStripAll` quand `DestroyPerson` est suivi de `destroyDummy` (`STE-H10-GI1-IMPL.md`, `STE-H10-GI2-IMPL.md`) ; B2-a, `GetSMBoolForSMC_Cloth` avec variable locale `MeshSuffix`, suffixe calculé une fois. VAL statique `STE-H10-VAL.md` (EventGraph 6 243 = 6 234 + 9, `SavePreset` 506, `GetSMBoolForSMC_Cloth` 13 nœuds, compile sans diagnostic ; E1 `CC_Shaders` du moteur requalifié par l'utilisateur ; E2 défauts `false` des deux variables estimés, non lus). Mesure en jeu J6 contre H9 (`STE-J6-TRACE.md` § 3) : B1-a `SavePreset` moyen 53,3 → 31,2 ms, `RevertStripAll` sous ces `SavePreset` 10 / 10 → 0 / 4 ; B2-a `GetSMBoolForSMC_Cloth` 2,17 → 1,40 ms par appel ; aucun `Accessed None` nouveau. Aucune ERR | MD5 `FE4406A0` → `71034A04` (`71034A04C6D64E1A806CA0DADC934FB9`) ; instantané `D:\Game\LifePlay_Backup_5.5\STE-H10\` | Avant commit : `.\Tools\Restore.ps1 -Lot STE-H10 -Only Content\BPs\GI.uasset` éditeur fermé (d'abord `Snapshot.ps1 -Lot STE-H10-retour`), sur accord ; GI revient à `FE4406A0`. Après commit : `git revert` du commit de l'asset (`git log --grep STE-H10`), par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-335 | 2026-10-13 | REG1 | `Docs/Registre_Erreurs.md` (13 cellules Statut : ERR-007, 011, 030, 037, 040, 062, 063, 065, 068, 082, 083, 084, 085) ; livrables `Docs/Migration/etat/REG/REG1/` (TACHES, INV, VAL, fiches T1, T3, T4) | Lot REG1 (vérification du registre, demande de l'utilisateur « lance un lot de vérification », mandat Big Boss) : statuts changés sur preuve chiffrée recomptée dans les journaux de jeu archivés (STB-JEU2, J1, J3, J4, J5, U8r2) ou sur décision de l'utilisateur du 2026-10-13 (ERR-037 accepté, ERR-040 clos ; liste fermée REG1 : D1 « seulement les statuts prouvés », D2 ERR-007 corrigé (CHG-263), D3 ERR-011 mention CHG-326 preuve J6 attendue, D4 CHG-317 → ERR-068, pas d'ERR neuve). Contrôle global : 46 CHG cités au registre, tous présents au journal | corrigé : ERR-030 (CHG-321, `Dress` 32 716 → 0), ERR-068 (CHG-309 / 317, 240 → 0), ERR-082 (CHG-313 / 314, 270 → 0), ERR-084 (CHG-314, 167 → 0), ERR-062 / 063 / 065 (CHG-305, 30 / 5 / 8 → 0), ERR-085 (CHG-315, 96 → 0), ERR-007 (CHG-263) ; atténué : ERR-083 (CHG-322, 351 → 8, reste STE-H3d) ; registre 88 lignes, 13 changées, LF | Avant commit `git checkout -- Docs/Registre_Erreurs.md` (fichier propre dans git avant REG1) ; après commit `git revert` du commit du ticket REG1-R1 | | CHG-334 | 2026-10-13 | RECY1 | Lot RECY1 (fiches RECY1-T3a et précédentes ; décision de l'utilisateur du 2026-10-13 : « cette règle est coûteuse. Il faut recycler les agents en attente »), révision de D-P7.2 (a) « vider après succès ». Jeu (`D:\Game\LifePlay-master 5.8`, branche `ue5.8`, ticket RECY1-R1) : `Docs/Migration/etat/AG/P7/P7-DECISIONS.md` (l. 10, D-P7.2 révisée), livrables `Docs/Migration/etat/AG/RECY1/` (`RECY1-TACHES.md`, `RECY1-VAL.md`), `Docs/Journal_Modifications.md`, `Docs/README.md` (plage du journal), `Docs/Migration/etat/REPO/NUMEROS.md`. Hors git (précédents ORGA1 Q3 / VERR1 Q2, aucun commit d'addon ni pin du doc 21) : addon 5.8 `D:\Game\LifePlay-Sandbox-5.8\Tools\claude\skills\sk-orchestrate\SKILL.md` § 4, bloc « Contexte des sous-agents » (l. 82-86 → 82-97), à déployer par l'utilisateur dans `%USERPROFILE%\.claude\skills` après le commit (apporte aussi les versements P7 non encore déployés ; version actuelle du profil, MD5 5e930a7b) | Règle d'avant (D-P7.2 a) : vider le contexte d'un agent après chaque succès, jugé coûteux par l'utilisateur. Règle d'après : recycler un agent en attente (même agent, même lot ou domaine voisin, dernière activité < 50 min, contexte ≤ 60 % du pic : 90 k pour N0-N2, 150 k pour N3-N5) ; sinon agent neuf avec résumé de passation ; domaine sans lien : agent neuf. Preuves : RECY1-VAL PASS (lp-validator, critères C1-C6, recomptés par l'orchestrateur). Incident : premier appel de `Snapshot.ps1` en chemins absolus → manifeste `Existed=False`, déplacé en `RECY1\manifest.ERREUR-chemins-absolus.csv`, refait en chemins relatifs. Aucune ERR | `sk-orchestrate` 102 → 113 lignes (SKILL.md § 4, +11) ; `P7-DECISIONS.md` l. 10 modifiée ; fins de ligne LF ; instantanés `D:\Game\LifePlay_Backup_5.5\RECY1\` (P7-DECISIONS, MD5 6D7FB5FB) et `D:\Game\LifePlay_Backup_5.5\RECY1-addon58\` (sk-orchestrate, MD5 9E12C4AF) | Avant commit : recopier les fichiers des instantanés `RECY1` et `RECY1-addon58` (manifestes). Après commit : `git revert` du commit du ticket RECY1-R1 (`git log --grep RECY1-R1`), par ticket RESTORE au gardien avec l'accord de l'utilisateur ; addon 5.8 : recopier `RECY1-addon58` ; profil : rien si non encore déployé, sinon recopier la version addon d'avant (instantané `RECY1-addon58`) vers `%USERPROFILE%\.claude\skills` | | CHG-333 | 2026-10-13 | P7 | Lot P7 « apports du projet 7 » (fiches P7-T1, T2, T3a, T3a2, T4a, T4b, T5, T6a, T6, T7, T9, T9v, T10 ; T3b sans fiche ; T8 non ouverte ; décisions D-P7.1 à D-P7.17 de l'utilisateur, 2026-10-12, `etat/AG/P7/P7-DECISIONS.md`), clôture. Jeu (`D:\Game\LifePlay-master 5.8`, branche `ue5.8`, ticket P7-R3) : `Docs/34_Transposition_Projet7.md` (nouveau, DOC-34), `Docs/33_Eval_Organisation_72h.md` (§ 7 : clause d'arrêt par mécanisme D-P7.8, essai D-P7.16), `Docs/README.md` (ligne du doc 34, plage du journal), `Docs/21_Sandbox_Addon.md` (pin l. 136), `Tools/claude/hooks/ecriture-gardien.py` (nouveau : crochet PreToolUse, appelé par le bloc `hooks` de `.claude/settings.local.json` ajouté par l'utilisateur, non suivi), livrables `Docs/Migration/etat/AG/P7/` (TACHES, DECISIONS, DOC, T1-INV, T2-VAL, T3a-INV, T3a2-INV, T4a-INV, `data/bareme.csv`, T4b-EVAL, T5-DOC, T6a-DOC, T7-VAL, T9-DOC, T9-VAL, T10-DOC, fiches) et `etat/AG/P7-TRANSPOSITION.md`, `NUMEROS.md`. Addon 5.8 (`D:\Game\LifePlay-Sandbox-5.8`, branche `ue5.8`, ticket P7-R1) et addon 5.5 (`D:\Game\LifePlay-Sandbox`, branche `lot/DC3-atelier`, ticket P7-R2), identiques : `Tools/claude/skills/lp-validate/SKILL.md`, `lp-lot/SKILL.md`, `lp-ue-compat/SKILL.md`, `lp-doc/gabarits.md`. Hors git (gardés identiques par MD5, précédents ORGA1 Q3 / VERR1 Q2) : addon 5.8 `skills/sk-protocol`, `sk-orchestrate`, `sk-windows-shell`, `agents/lp-cart.md`, `lp-cart-max.md` (nouveau), `lp-diag.md` (nouveau), déployés par l'utilisateur dans `%USERPROFILE%\.claude` | Transposition à LifePlay du dispositif « Projet 7 » (AKS) : règles de compte rendu (`Mesuré` collé, `À verser`, `Options`, relais après étude), garde de budget avant une opération atomique, seuil 11-12 « scinder d'abord », demi-niveaux `N2+` / `N3−` (`lp-cart` sonnet xhigh, `lp-cart-max` opus xhigh, `lp-diag` opus medium) et escalade par barreau, crochet `ecriture-gardien` (refus des écritures shell des agents sans Edit), essai de S = C3 + f et C9a (D-P7.16) ; `unreal-api-mcp` 0.3.1 écarté. Preuves : P7-T1 (12 couples modèle × effort, modèle réel par `modelUsage`), P7-T3a2 PASS (refus réel du crochet en Bash et PowerShell, `agent_type` présent), P7-T4b (30 fiches : note a-f non discriminante, rho +0,14 ; C3 +0,61), P7-T7 NON ADOPTABLE (5 cas sur 5), P7-T9v PASS avec réserves, P7-T6a contre-vérifiée (`--word-diff`). Incident : bloc `hooks` posé avant le fichier du crochet → Python en code 2 → Bash et PowerShell refusés pour toutes les sessions de la copie 5.8 quelques minutes (fichier posé par la session P7, version essayée, MD5 F00D9739). Aucune ERR | Skills addon 5.8 : `sk-protocol` 110 → 120 lignes, `sk-orchestrate` 88 → 102, `sk-windows-shell` 49 → 52, `lp-validate` 108 → 112, `lp-lot` 81 → 87, `lp-ue-compat` 69 → 72, `gabarits.md` 109 → 112 ; doc 33 +8 lignes, README +1 (+ plage), doc 34 créé (242 lignes) ; fins de ligne LF ; instantanés `D:\Game\LifePlay_Backup_5.5\P7\{addon58,addon55,home,T5,T6a}` | Avant commit : recopier les fichiers des instantanés `P7\addon58`, `P7\addon55`, `P7\home`, `P7\T5`, `P7\T6a` (manifestes) ; crochet : retirer le bloc `hooks` de `.claude/settings.local.json` **avant** de déplacer `Tools/claude/hooks/ecriture-gardien.py` vers `D:\Game\LifePlay_Backup_5.5\P7\`. Après commit : `git revert` des commits des tickets P7-R1 (addon 5.8), P7-R2 (addon 5.5) et P7-R3 (jeu) (`git log --grep P7-R`), par ticket RESTORE au gardien avec l'accord de l'utilisateur ; profil : recopier `P7\home` et `P7\T6a\addon58` vers `%USERPROFILE%\.claude\skills`, retirer `lp-cart-max.md` et `lp-diag.md` de `%USERPROFILE%\.claude\agents` (déplacement vers `P7\T5\retire\`) | | CHG-332 | 2026-10-12 | ARCH427 | Lot ARCH427 (fiches ARCH427-T1 à T6, ARCH427-DOC, tickets ARCH427-R1 à R4 ; demande de l'utilisateur : remiser les binaires et sources de la version 4.27 et clore la migration), clôture documentaire. Jeu (`D:\Game\LifePlay-master 5.8`, branche `ue5.8`, HEAD d'écriture `ede7dec`, ticket ARCH427-R2) : `Docs/27_Plan_Migration_UE58.md` (l. 72 et 164, D6 avancée), `Docs/28_Synthese_Migration_UE58.md` (l. 201 et 217, D6 réalisée), `Docs/10_Protocole_Operations.md` (règle 6, note de remisage), `Docs/02_Audit_Logiciel.md` (l. 175-176), `Docs/03_Plan_Migration_Tests.md` (bandeau l. 3 et table l. 16, 18, 19), `Docs/08_Guide_Developpeur.md` (l. 113) : annotations « remisé le 2026-10-11 sous `D:\Game\LifePlay_Backup_5.5\ARCH427\` » ; `Docs/21_Sandbox_Addon.md` (registre des reports, une ligne `[x]` « Report D6 » ; pin non modifié) ; `Docs/README.md` (plage du journal, phrase de clôture du § « Historique : migration 4.27 → 5.5 ») ; livrables `etat/ARCH427/` (`ARCH427-PLAN.md`, `ARCH427-T1-INV.md` et ses mesures, `ARCH427-T2-REFS.md`, `ARCH427-T3-AVANT.md`, `ARCH427-T4-MOVE.md`, `ARCH427-T5-VAL.md`, `ARCH427-T6-VAL.md`, `ARCH427-TACHES.md`, `ARCH427-DOC.md`, fiches). Addon 5.5 (`D:\Game\LifePlay-Sandbox`, branche `lot/DC3-atelier`, commit `083a3a0`, ticket ARCH427-R3) et addon 5.8 (`D:\Game\LifePlay-Sandbox-5.8`, branche `ue5.8`, commit `22dd7c3`, ticket ARCH427-R4) : `Tools/claude/skills/lp-paths/SKILL.md` (l. 25-26) et `Tools/claude/skills/lp-env/SKILL.md` (l. 17), identiques dans les deux ; ces deux commits sont des ancêtres du pin actuel (`5cc88c7` / `662f81a`, CHG-331, parents `22dd7c3` / `083a3a0`), le pin du doc 21 n'est donc pas remis en arrière. Hors git, disque : 11 dossiers 4.27 renommés vers `D:\Game\LifePlay_Backup_5.5\ARCH427\` (4 `_backup_*` sous `_backup\`, copie d'origine `LifePlay-master`, `stage427`, `LifePlay-5.5-migration`, `LifePlay-5.5`, `LifePlay_Build_2026.9`, `LifePlay_Build_427_Dev`, `LifePlay-master 4.27`) ; manifestes sous `ARCH427\manifestes\` ; bundle `ARCH427\git\LifePlay_archive-branches_2026-10-11.bundle` ; branches `archive/ue4.27` et `archive/original` supprimées des clones 5.5 et 5.8 (ticket ARCH427-R1). Moteur `D:\Game\Launcher\Engine\UE_4.27` gardé à son chemin | Fin de la migration 4.27 → 5.5 : les chemins 4.27 des docs 02, 03, 08, 10 et des skills `lp-paths` et `lp-env` ne pointaient plus vers des dossiers existants une fois remisés (aucune citation bloquante, `ARCH427-T2-REFS.md` : aucun script de `Tools\`, fichier de `Config\`, skill ni agent n'utilisait un chemin 4.27 comme chemin actif ; 3 lignes de skills à réécrire). D6 (doc 27, archivage de 4.27 après V2.0) est **avancée** : exécutée le 2026-10-11, avant toute publication V2.0 (U8 clos sans publication, CHG-323 et CHG-325), sur décision de l'utilisateur (`ARCH427-PLAN.md` § 9). Preuve : relevé avant `ARCH427-T3-AVANT.md` 137 951 fichiers et 42 565 094 384 octets pour les 11 éléments ; 11 renommages sur le même volume, chacun en moins de 0,04 s, sources absentes et destinations présentes, aucune copie ni suppression (`ARCH427-T4-MOVE.md`, deux arrêts de l'agent avant l'exécution par l'orchestrateur sur ordre direct de l'utilisateur) ; `ARCH427-T5-VAL.md` PASS, 11 comparaisons sur 11 identiques au relevé (mêmes totaux) ; bundle 388 257 233 octets, SHA-256 `9da2f974…12e9`, 2 références, branches absentes des 2 clones (`ARCH427-TACHES.md`, ligne R1) ; `ARCH427-T6-VAL.md` PASS 5 sur 5 (lignes de skills identiques dans les 2 addons, MD5 `lp-paths` `19212b7c…`, `lp-env` `06dd55ba…`). Non rejoué par la DOC : contenu des dossiers remisés, bundle (`git bundle verify`). Aucune ERR : les deux arrêts de T4 sont consignés dans `ARCH427-T4-MOVE.md` | Docs du jeu (diff avant commit) : `02` 2 → 2 lignes, `03` 4 → 4, `08` 1 → 1, `10` +2, `21` +1, `27` 2 → 2, `28` 2 → 2, `README` +6 −1 (dont la plage `CHG-331` → `CHG-332`), journal +1 ligne ; fins de ligne LF conservées ; instantané `ARCH427-docs` ; skills : `lp-paths` et `lp-env` réécrits en T6 (MD5 d'après dans la colonne Raison) | Avant commit : `.\Tools\Snapshot.ps1 -Lot ARCH427-docs-retour` puis `.\Tools\Restore.ps1 -Lot ARCH427-docs` (proposé, jamais lancé sans accord ; la première ligne du manifeste est une entrée parasite `Existed=False` sans chemin réel, née d'un premier appel à `Snapshot.ps1` avec une liste passée en une seule chaîne). Après commit : `git revert` du commit du ticket ARCH427-R2 (`git log --grep ARCH427-R2`) et, pour les skills, de `083a3a0` (addon 5.5) et `22dd7c3` (addon 5.8), par ticket RESTORE au gardien avec l'accord de l'utilisateur. Disque : renommer chaque dossier de `D:\Game\LifePlay_Backup_5.5\ARCH427\` vers son chemin d'origine du tableau de `ARCH427-T4-MOVE.md` (`Move-Item`, même volume, un à la fois, `Test-Path` avant et après ; rien à supprimer) ; branches `archive/*` : `git bundle verify` du bundle puis `git fetch 'refs/heads/archive/*:refs/heads/archive/*'` dans le clone voulu | | CHG-331 | 2026-10-12 | VERR1 | Lot DOC VERR1 (fiches VERR1-SPEC et avenant 1, T1 IMPL, T1v VAL, R1 / R2 INT, T2 DOC) : piège du verrou du gardien et trois règles du gardien portés dans `sk-repo` et `lp-repo`. Addons : `Tools/claude/skills/lp-repo/SKILL.md` (+13 −2 : § 4 puce `VERROU\` avec `Tools\Verrou.ps1 -Prendre / -Rendre -Ticket / -Etat` ou `mkdir` de Git Bash, jamais `New-Item` ; ligne R-REPO1 : ticket `fait` sans commit = passage interrompu ; § 10 trois pièges : `New-Item` non atomique, reprise d'un verrou après interruption, nom d'utilisateur jamais écrit dans une trace), identique dans `D:\Game\LifePlay-Sandbox-5.8` (branche `ue5.8`, commit `5cc88c7`, parent `22dd7c3`, ticket VERR1-R1, instantané `VERR1-addon58`) et dans `D:\Game\LifePlay-Sandbox` (branche `lot/DC3-atelier`, commit `662f81a`, parent `083a3a0`, ticket VERR1-R2, instantané `VERR1-addon`). Hors git : `~/.claude/skills/sk-repo/SKILL.md` (+24 −2 : § 2 ligne d'ouverture, paragraphes « Piège (mesuré) » et « Reprise après interruption » ; § 4 étape 7 alignée sur R-REPO1 et paragraphe « Statut `fait` sans commit » ; § 9 contrôle de donnée personnelle) et sa copie non suivie `Tools/claude/skills/sk-repo/SKILL.md` de l'addon 5.8 (instantané `VERR1-home`). Jeu : livrables `etat/AG/VERR1/` (`VERR1-SPEC.md`, `VERR1-TACHES.md`, `VERR1-T1-IMPL.md`, `VERR1-T1-VAL.md`, `VERR1-INT.md`, `VERR1-DOC.md`, fiches) ; `Docs/21_Sandbox_Addon.md` (pin de la copie 5.8 : `5cc88c7` / `662f81a`) ; `Docs/README.md` (plage du journal) ; `etat/REPO/NUMEROS.md` (CHG-331) ; tickets VERR1-R1 à R3 et `REPO-JOURNAL.md` | Écart E1 du lot OUTC (`etat/OUTC/OUTC-T2-IMPL.md` § 2) : sous pwsh 7.6.6, `New-Item -ItemType Directory` sans `-Force`, 8 threads sur le même chemin, plusieurs succès dans 88 tours sur 100 ; `CreateDirectoryW` 1 succès dans 100 tours sur 100, retenu dans `Tools/Verrou.ps1` (`f4ac257`, CHG-329) ; signalé à ORGA1 après ses commits, hors des périmètres d'ORGA1 et d'OUTC. Contre-essai VERR1 (`VERR1-SPEC.md` § 1) : `mkdir` de pwsh (fonction qui appelle `New-Item`) 92 tours sur 100 à succès multiples, `mkdir` de Git Bash 1 succès dans 100 tours sur 100. SPEC approuvée par l'utilisateur (2026-10-12 : Q1 `sk-repo` § 2 et `lp-repo` § 4 / § 10, Q2 `sk-repo` non commité) ; avenant 1 demandé par Big Boss, approuvé par l'utilisateur (B1 reprise de son propre verrou après interruption, cas OUTC-R1 verrou 105 ; B2 ordre « fait » et commit, OUTC-R1 marqué `fait` sans commit ; B3 nom cherché jamais écrit, OUTC-R2 `d1f7ce5` et ORGA1-R3 ; `BOSS-JOURNAL.md` l. 322, 326 à 328). Écriture : lp-writer arrêté par le mode automatique (« Self-Modification », 5 Edit sur 8 refusés), sans contournement ; refus signalé à Big Boss ; fin d'écriture par l'orchestrateur après ordre direct de l'utilisateur et règle `autoMode.allow` ajoutée par l'utilisateur (2026-10-12). Preuve : `VERR1-T1-VAL.md` PASS (blocs des annexes présents tels quels, diffs −2 +24 et −2 +13, `numstat` `13 2` dans les deux addons, chiffres relus à la source, 0 CR, 0 nom d'utilisateur ; `Verrou.ps1 -Rendre -Ticket` sur `qui.txt` à deux lignes : PASS-STATIC et motif rejoué). Commits des addons par le gardien, verrous 109 et 110 pris et rendus par `Verrou.ps1` | MD5 d'avant → après : `sk-repo/SKILL.md` `ab3ac013…` → `1ce1a1b5df693c70267d699f7124413e` (×2, 115 lignes) ; `lp-repo/SKILL.md` `a575c783…` → `21329cd110678f0988465222a88ebc90` (×2, 112 lignes, blob `0188eb6d`) ; LF, 0 CR ; journal +1 ligne ; index 1 ligne (`CHG-330` → `CHG-331`) ; doc 21 1 ligne (pin) ; `NUMEROS.md` 1 statut (`réservé` → `utilisé`) | Avant commit : `.\Tools\Restore.ps1 -Lot VERR1-home`, `-Lot VERR1-addon58`, `-Lot VERR1-addon` après `Snapshot.ps1 -Lot VERR1-retour` (proposé, jamais lancé sans accord) ; après commit : `git revert` de `5cc88c7` et `662f81a` (`git log --grep VERR1-R1`, `VERR1-R2`) et du commit jeu VERR1-R3, par ticket RESTORE au gardien avec l'accord de l'utilisateur ; `sk-repo` (hors git) par `Restore.ps1 -Lot VERR1-home` et recopie vers l'addon 5.8 | | CHG-330 | 2026-10-12 | MCPA | Lot MCPA (fiches MCPA-T0 à T3, orchestrateur, décision E3 de l'utilisateur sur la recommandation R3 du lot EVAL : 1 070 appels MCP faits dans les sessions principales Opus, aucun agent `lp-*` n'avait d'outil MCP). Hors git, sur accord de l'utilisateur (« approuvé », 2026-10-12) : agents `%USERPROFILE%\.claude\agents\lp-mcp.md` (lecture, N1 sonnet, `maxTurns: 50`, skills sk-protocol, lp-mcp, sk-change-safety, hook PreToolUse de garde lecture seule) et `lp-mcp-bp.md` (écriture Blueprint, N3 opus xhigh, `maxTurns: 75`, skills sk-protocol, sk-change-safety, lp-mcp, lp-lot), tous deux `tools: …, ToolSearch, mcp__unreal-mcp` et `mcpServers: [unreal-mcp]` ; garde `%USERPROFILE%\.claude\hooks\lp-mcp-garde-lecture.py` (admis : `get_`, `find_`, `list_`, `read_`, `describe_`, `search_`, `load_asset`, `hyper_blueprint_debug_inspect`, `hyper_blueprint_snapshot` ; refusés : tout le reste et tout `ProgrammaticToolset`) ; 5 témoins `mcpa-probe-*` déplacés vers `D:\Game\LifePlay_Backup_5.5\MCPA\agents-temoins\`. Dans le dépôt : livrables `Docs/Migration/etat/AG/MCPA/` (TACHES, T1-ESSAI, `temoins/` × 5), brouillons `Docs/Migration/etat/AG/brouillons/agents/lp-mcp.md`, `lp-mcp-bp.md`, `lp-mcp-garde-lecture.md` (texte de la garde, le `.py` n'est pas suivi), `NUMEROS.md`, ticket MCPA-R1 | Essai MCPA-T1 en lecture seule sous BUILD-GO de Big Boss (éditeur headless, 4 lectures `SceneTools.get_current_level`, aucun `save_assets` ; GI, Person et TopRight inchangés, BUILD-FIN contre-vérifié) : un sous-agent appelle `unreal-mcp` en partageant la connexion de la session, qu'il hérite des outils ou qu'il soit restreint par `tools:` + `mcpServers: [unreal-mcp]` ; PASS session connectée, aucun outil session en échec ; une définition `mcpServers` en ligne (`type: http`) ne fournit aucun outil dans l'application de bureau (cause incertaine) ; le hook PreToolUse d'un agent bloque un outil hors liste avant le serveur. Règle adoptée : l'éditeur démarre avant la session qui orchestre le travail MCP, sinon l'utilisateur reconnecte `unreal-mcp` par `/mcp`. Défaut relevé et non corrigé ici : `.hyperai/scripts/Start-HyperAIStudioEditor.ps1` l. 13-14 ne met pas le chemin du projet entre guillemets (l'éditeur s'ouvre sur le navigateur de projets) ; correction approuvée par l'utilisateur, confiée par Big Boss à un autre lot | aucun agent MCP → `lp-mcp` (lecture, garde) et `lp-mcp-bp` (écriture Blueprint) | déplacer `lp-mcp.md`, `lp-mcp-bp.md` hors de `%USERPROFILE%\.claude\agents` et la garde hors de `%USERPROFILE%\.claude\hooks` vers `D:\Game\LifePlay_Backup_5.5\MCPA\` (aucune suppression) ; `git revert` du commit du ticket `MCPA-R1` (`git log --grep MCPA-R1`) pour les livrables, les brouillons, le journal, l'index et `NUMEROS.md`, par ticket RESTORE au gardien avec l'accord de l'utilisateur | | CHG-329 | 2026-10-11 | OUTC | Lot OUTC (fiches OUTC-SPEC, OUTC-T1 à T3 IMPL, OUTC-T6 et OUTC-T7 faites par l'orchestrateur, OUTC-T4a et OUTC-T4b VAL, OUTC-T5 DOC) : quatre scripts neufs sous `Tools/`, chacun avec une ligne de synthèse, une sortie `-Json` et des codes de sortie prouvés. `Tools/CopieEtat.ps1` : contrôle de la copie partagée (processus Unreal et 7z qui citent la copie, MD5 des assets déclarés avec `-Reference` et `-Autorise`, `git status` du jeu, de l'addon et de Modules, dossiers parasites sous `etat/`, HEAD, verrou, charge CPU) ; codes 0 aucune alerte, 1 au moins une alerte, 2 usage, copie, dépôt ou référence introuvable ; tous les appels git avec `--no-optional-locks` (OUTC-T7, point 4 de la VAL A). `Tools/Verrou.ps1` : `-Prendre`, `-Rendre`, `-Etat` selon `sk-repo` § 2, sans paramètre de forçage ; création du dossier par `CreateDirectoryW` (écart E1 : `New-Item` sans `-Force` n'est pas atomique : un seul succès dans 12 tours sur 100 en threads (`etat/OUTC/OUTC-T2-IMPL.md` § 2, mesure d'origine) et dans 10 tours sur 60 (contre-preuve de la VAL B, `etat/OUTC/OUTC-VAL-B_essais.txt` l. 440), contre 100 sur 100 et 60 sur 60 avec `CreateDirectoryW`) ; codes 0 pris, rendu ou libre, 1 occupé ou refusé ou déjà libre, 2 usage. `Tools/Numero.ps1` : `-Reserver CHG, ERR ou DOC` sous verrou (maximum du journal 5.8, de la copie 5.5 et de `NUMEROS.md`, ligne ajoutée par ajout d'octets, CRLF du fichier conservé, préfixe vérifié, verrou rendu dans `finally`) et `-Dernier` en lecture seule ; codes 0 réservé, 1 verrou occupé, 2 erreur. `Tools/GitEtat.ps1` : une ligne par fichier pour les trois dépôts (statut, name-status, fins de ligne `i/` et `w/`, comptes de CR de l'arbre et de HEAD), alerte `FINS` ; codes 0, 1 alerte `FINS`, 2 usage ou dépôt introuvable. Trois scripts modifiés : `Tools/UeState.ps1` (`-Copie`, `-Json`) et `Tools/FileCheck.ps1` (`-Json`), sortie par défaut identique (18 paires comparées à l'ancienne version, octets de stdout, stderr et code ; seule différence, la trace d'exception d'un `throw`) ; `Tools/EtatDir.ps1` (`-EtatDir` relatif sans dossier parasite, racine et parasites refusés, règle `OUT[A-Z]?\d*`, demande de Big Boss). Livrables `Docs/Migration/etat/OUTC/` (`OUTC-SPEC.md`, `OUTC-T1-IMPL.md`, `OUTC-T2-IMPL.md`, `OUTC-T3-IMPL.md`, `OUTC-T6-IMPL.md`, `OUTC-T7-IMPL.md`, `OUTC-VAL-A.md`, `OUTC-VAL-B.md`, `OUTC-DOC.md`, `OUTC-TACHES.md`, fiches) ; `Docs/README.md` (plage du journal) ; `Docs/Migration/etat/REPO/NUMEROS.md` (CHG-329 « utilisé ») ; instantané `D:\Game\LifePlay_Backup_5.5\OUTC` (7 entrées : 4 absentes au départ, 3 existantes) | Décision de l'utilisateur 2026-10-11 E2 « approuvé » sur la recommandation R2 de `etat/EVAL/EVAL-RAPPORT.md` (§ 6 M1, M4, M5 ; § 8 R2) : remplacer les contrôles mécaniques faits à la main par des scripts (empreintes MD5 improvisées, relevés de processus, `git status` de trois dépôts, lecture du verrou, réservation des numéros ; mesures d'EVAL sur 72 h dans `EVAL-STATS.md` § 7 et `EVAL-T6-INV.md` : 538 empreintes, 452 relevés de processus, 1 794 appels d'état git, 1 085 appels de verrou et de tickets). Preuves : `OUTC-VAL-A.md` PASS (V1 à V6, V11, V12 ; code 0 réel sur la copie 5.8 le 2026-10-11 à 07:01:42 puis, pour la version OUTC-T7, à 07:20:36 rejoué par l'orchestrateur après fermeture de l'éditeur ; code 1 réel `PROC` et `GIT` ; durée 4,1 à 5,8 s) et `OUTC-VAL-B.md` PASS (V1, V7 à V10 PASS, V11 PASS-STATIC ; atomicité de `Verrou.ps1` : 13 tours sur 13 à un seul gagnant ; numéros consécutifs de `Numero.ps1` avec préfixe identique et CRLF conservé sur copie de `NUMEROS.md`). CHG-329 réservé par `Numero.ps1` lui-même (premier essai réel, verrou 101, `NUMEROS.md` à 47 lignes CRLF et 0 LF seul). Non rejoués par la VAL : un appel réel de `Build.ps1`, `RunCommandlet.ps1` et `ReimportCorrectif.ps1` avec le nouvel `EtatDir.ps1` (analyse syntaxique seulement), Windows PowerShell 5.1 pour les trois scripts de la VAL B, `7z.exe` réel sur la copie ; les cases « Points à confirmer par l'utilisateur » des deux VAL ne sont pas cochées | MD5 d'avant → après : `Tools/UeState.ps1` `A47107D5…` → `736fbf158c0772bab81e98e96604809f` (+63 −3, 167 lignes) ; `Tools/FileCheck.ps1` `CA9CBA16…` → `1fd13c705ef5869f79e5165d039f3aaa` (+44 −5, 203 lignes) ; `Tools/EtatDir.ps1` `28274CB7…` → `5e18ec5bdbfe9b80d55c985b15f864e4` (+18 −3, 62 lignes) ; `Tools/CopieEtat.ps1` — → `5e441fa06f05b1f1d91b91dcac5b023f` (461 lignes) ; `Tools/Verrou.ps1` — → `788b21f30155200a497c3919fb3cba29` (228 lignes) ; `Tools/Numero.ps1` — → `8803e6a42dad21292dfe3024732bf589` (291 lignes) ; `Tools/GitEtat.ps1` — → `f50a0c23c809cbc446c5d1e3e979beb3` (412 lignes) ; les sept en LF, sans BOM, les quatre neufs en ASCII ; journal +1 ligne ; index 1 ligne modifiée (`CHG-328` → `CHG-329`) ; `NUMEROS.md` 1 statut (`réservé` → `utilisé`, CRLF conservé) | `.\Tools\Restore.ps1 -Lot OUTC` après `.\Tools\Snapshot.ps1 -Lot OUTC-retour` (les quatre scripts neufs sont retirés, jamais supprimés ; `UeState.ps1`, `FileCheck.ps1` et `EtatDir.ps1` d'avant sont rendus ; proposé, jamais lancé sans accord) ; ou `git revert` du commit du ticket `OUTC-R1` (`git log --grep OUTC-R1`), par ticket RESTORE au gardien avec l'accord de l'utilisateur ; les lignes du journal, de l'index et de `NUMEROS.md` ne reviennent que par ce `git revert` (hors du manifeste OUTC) | | CHG-328 | 2026-10-11 | ORGA1 | Lot ORGA1 (fiches ORGA1-SPEC, T1 et T1b IMPL, T1v VAL, R1 / R2 INT, T1d DOC) : protocole Big Boss, rotation des sessions et règles de fiche portés dans les skills et le doc 32. Addons : `Tools/claude/skills/lp-lot/SKILL.md` (+11, section « Copie UE partagée, Big Boss et rotation ») et `Tools/claude/skills/lp-lot/boss.md` (nouveau, annexe de 112 lignes), identiques dans `D:\Game\LifePlay-Sandbox-5.8` (branche `ue5.8`, commit `d77a0e2`, parent `3f94b5e`, ticket ORGA1-R1, instantané `ORGA1-addon58`) et dans `D:\Game\LifePlay-Sandbox` (branche `lot/DC3-atelier`, commit `32c7158`, parent `29747a2`, ticket ORGA1-R2, instantané `ORGA1-addon`). Hors git : `~/.claude/skills/sk-orchestrate/SKILL.md` (+5, § 3 : trois règles « Critère recopié », « Copie nommée », « Test utilisateur » ; § 4 : « Rotation ») et sa copie non suivie `Tools/claude/skills/sk-orchestrate/SKILL.md` de l'addon 5.8 (instantané `ORGA1-home`). Jeu : `Docs/32_Organisation_Agents.md` (en-tête, § 15.2, § 15.8, § 15.9 à § 15.11 ; instantané `ORGA1`) ; livrables `etat/AG/ORGA1/` (`ORGA1-SPEC.md`, `ORGA1-TACHES.md`, `ORGA1-T1-IMPL.md`, `ORGA1-T1b-IMPL.md`, `ORGA1-T1-VAL.md`, `ORGA1-INT-R1R2.md`, `ORGA1-T1-DOC.md`, fiches) ; `Docs/README.md` (plage du journal) ; `etat/REPO/NUMEROS.md` (réservation) | Décisions de l'utilisateur 2026-10-11 E1, E4, E5 « approuvé » sur `etat/EVAL/EVAL-RAPPORT.md` § 9 (source `BOSS-JOURNAL.md` l. 288), recommandations R1, R4, R5, R6 de l'évaluation du lot EVAL (CHG-327). E1 / R1 : rotation des sessions principales à chaque FIN-LOT et dès 250 k de contexte, jamais avec un GO, le jeton ou un verrou en main ; Big Boss en session neuve chaque jour, qui repart de `etat/BOSS/BOSS-ETAT.md` puis de la fin de `BOSS-JOURNAL.md`. E4 / R4 : protocole Big Boss (messages et gabarits, `BUILD-DEMANDE` / `BUILD-GO` / `BUILD-FIN`, réserve « mesure », contrôles de `BUILD-FIN`, jeton du journal, réservations et gels, commits et `FIN-LOT`) dans une annexe de `lp-lot` (0 occurrence de `BUILD-DEMANDE`, `BUILD-GO` ou `Big Boss` dans les skills avant ; 30 par addon après, relevé de `ORGA1-T1-VAL.md` § 3 critère 5). E5 / R5 et R6 : règles de fiche dans `sk-orchestrate` (ne pas recopier un critère d'entrée, nommer la copie visée, tester la faisabilité d'un test utilisateur, découper VAL de lot et diagnostics `lp-cart`) ; doc 32 aligné (§ 15.2 réserve « mesure », § 15.8 mots de message, § 15.9 rotation, § 15.10 règles de fiche, § 15.11 emplacement de ces règles). Texte soumis à l'utilisateur (SPEC « Approuvé » : Q1 annexe `boss.md`, Q2 mot `PASSATION`, Q3 `sk-*` non commité) puis relu par Big Boss (corrections A à G, `ORGA1-T1b-IMPL.md`). VAL `ORGA1-T1-VAL.md` : PASS (`cmp` des deux addons identiques, textes = annexe A de la SPEC, sources `BOSS l. N` relues une à une ; E1 mineur : la source de la dernière phrase du § 1 de `boss.md` est partielle, accepté). Renvois du doc 32 : `CHG-` de l'en-tête remplacé par CHG-328. Pin du doc 21 : non posé ici (arbitrage de Big Boss du 2026-10-11 : le pin final est posé par le lot ARCH427, qui cite les commits du jour) ; aucune entrée d'un autre lot réécrite | MD5 d'avant → après : `lp-lot/SKILL.md` `8A8561F0…` → `0d226f1c3a7b5371ab3c6788485bf859` (70 → 81 lignes, +11 / −0, `git diff --numstat` `11 0` dans chaque addon) ; `lp-lot/boss.md` — → `f5c22134ea2c7fd0dba3d7a7bb61526a` (112 lignes, 0 CR) ; `sk-orchestrate/SKILL.md` `6FC3975E…` → `305e5493e6e51236aa59605701f2d709` (71 → 76 lignes, aux deux emplacements) ; `32_Organisation_Agents.md` `5F652FFD…` → `68c0699eee581d287c41891c3dfd6a20` (476 → 516 lignes, `git diff --numstat` `41 1`, une seule ligne retirée : le titre du § 15) ; journal +1 ligne ; index 1 ligne modifiée ; `NUMEROS.md` +1 ligne (CRLF) | `git revert` de `d77a0e2` (addon `D:\Game\LifePlay-Sandbox-5.8`), de `32c7158` (addon `D:\Game\LifePlay-Sandbox`) et du commit jeu du lot (`git log --grep CHG-328` ; doc 32, journal, index, NUMEROS, livrables), par ticket RESTORE au gardien avec l'accord de l'utilisateur. Ou `.\Tools\Restore.ps1 -Lot ORGA1-addon58`, `-Lot ORGA1-addon`, `-Lot ORGA1-home` (sk-orchestrate, hors git) et `-Lot ORGA1` après `Snapshot.ps1 -Lot ORGA1-retour` (proposé, jamais lancé sans accord) | | CHG-327 | 2026-10-11 | EVAL | `Docs/33_Eval_Organisation_72h.md` (nouveau : évaluation de l'organisation multi-agents du 2026-10-08 05:30 au 2026-10-11 05:30, sous-périodes P0 / P1 / P2, Big Boss et gardien, niveaux, mutualisation, décisions E1 à E7) ; `Docs/README.md` (ligne du doc 33, plage portée à CHG-327) ; `Docs/Migration/etat/REPO/NUMEROS.md` (CHG-327 et DOC 33 « utilisé ») ; livrables `etat/EVAL/` (TACHES, STATS, RAPPORT, relevés T1a à T6-INV, T11-VAL, brouillon du doc 33, tables `data/*.csv` et `.md`) ; hors git : `etat/EVAL/scripts/*.py` et `data/*.txt` (ignorés, `.gitignore:75`) ; instantané `D:\Game\LifePlay_Backup_5.5\EVAL` (journal, README, NUMEROS, doc 33) | demande de l'utilisateur : reprendre l'évaluation des docs 22, 26 et 31 sur 72 h (niveaux, orchestration, mutualisation, statistiques). 7 relevés `lp-inventory` recomptés par l'orchestrateur ; synthèse en N2, sans escalade. Constats : CHG / h active 1,81 → 2,40, erreurs d'outils 3,3 → 1,6 %, jetons par CHG 31 → 54 M, jetons des sessions principales ×3,1 / h, Big Boss 18 % des jetons de P2, attente médiane dans la file 0,4 min. Décision de l'utilisateur « approuvé » (E1 à E7, 2026-10-11) : lots OUTC, MCPA, ORGA1 ouverts ; VAL `etat/EVAL/EVAL-T11-VAL.md` PASS-STATIC (3 réserves corrigées) | — → créé (doc 33) ; README + 1 ligne, plage ; NUMEROS 2 statuts | `git revert` du commit du ticket `EVAL-R1` ; ou `.\Tools\Restore.ps1 -Lot EVAL` (journal, README, NUMEROS ; retirer le doc 33) | | CHG-326 | 2026-10-11 | STE | `Content/BPs/GI.uasset`, fonction `destroyDummy` (fiche STE-H4, correctif C0, MCP 06:28-06:29) : ordre d'exécution `SetActorHiddenInGame` (`CallFunction_0`) → `K2_SetActorTransform` vers l'origine (`_2`) → `ResetVars` (`_1`) → `Set Valid = false` (`VariableSet_0`), au lieu de `ResetVars` avant la téléportation. 0 nœud, 3 liens d'exécution coupés et 3 créés (`destroyDummy` reste à 39 nœuds). Détail : `etat/ST/STE/STE-H4-C0-SPEC.md`, `STE-H4-C0-IMPL.md`, `STE-H4-DIAG.md` ; MD5 16394D43… → FE4406A0… | F5 (`No SkeletalMesh` au `GetSocketInfoByName` des 5 composants attachés aux sockets du mannequin) : la téléportation d'un mannequin déjà vidé de son corps produisait un groupe de 5 avertissements dans la trame du DESTROY (≈ 445 lignes sur un parcours J5, estimé) ; F5 ne cause pas de saccade (trames F5 seules ≤ 47 ms, `STE-H4-DIAG.md` § 3.4). Comportement identique (mannequin déjà caché). Décision de l'utilisateur : « C0, correctif minimal ». VAL PASS-STATIC (`STE-VAL.md` § STE-H4-C0 : dump 39 nœuds, 3 liens changés seulement, CompileAllBlueprints 418/418 0/0, LPTestStringCompat 3120/0/60) ; **preuve en jeu reportée à J6 (STE-H10)**, écart accepté par Big Boss | `git revert` du commit ; ou `.\Tools\Restore.ps1 -Lot STE-H4` éditeur fermé (GI = 16394D43) | | CHG-325 | 2026-10-11 | U8 | Porte U8-T11 close sur NON-PUBLICATION de la V2.0 : la V2.0 reste une version de migration, rien n'est publié (ni téléversement, ni push de `ue5.8`, ni fusion vers `main`, ni tag `v2.0` au titre de U8). Documents : `Docs/27_Plan_Migration_UE58.md` (frontmatter `lot-u8` ; § U8, ligne « Porte T11 »), `Docs/21_Sandbox_Addon.md` (l. 210, 223, 229 : lot propriétaire), `Docs/README.md` (plage du journal, ligne du doc 27), `etat/REPO/NUMEROS.md` (réservation) ; livrables `etat/U58/U8/U8-T11-PORTE.md` (décision) et `etat/U58/U8/U8-DOC2.md` ; clôture déjà écrite au registre `etat/U58/U8/U8-TACHES.md`. Conditions de la porte transférées au prochain cycle de livraison : clôture de G-OB et sortie de ST, contrôle PUB de toute la branche `ue5.8` (dont les chemins personnels des docs 27 et 28), lien, taille et SHA-256 de l'archive au README, push, fusion vers `main`, tag, téléversement. Reports du doc 21 transférés (cases laissées ouvertes) : l. 210 (brouillard Effects Low-Med), l. 223 (publication des 3 archives `2026.10.2.0`), l. 229 (`README.md:4`). Artefacts conservés hors dépôt comme référence de migration, rien supprimé : `D:\Game\LifePlay_Build_5.8_Shipping_U8r2` (+ `_PDB`, `_essai`), `D:\Game\LifePlay_Build_5.8_Development_U8r2` (+ `_essai`), `Releases\2026.10.2.0`, archive `LifePlay_Revival_V2.0_Windows_Game.7z` et dossiers `stage_game_v2_0*` sous `D:\Game\LifePlay_Publication\`, 3 mods `2026.10.2.0`. `README.md` racine (commité en local en `84b6bef`, non poussé) laissé en l'état : il décrit une archive V2.0 « link added at release », à revoir par le prochain cycle ; décision de l'utilisateur attendue | Décision de l'utilisateur du 2026-10-11 (citée) : « décision final v2.0 restera une version de migration et ne sera pas publié. clore T11. Nous attendront un prochain cycle pour livrer la build ». Elle fait suite à CHG-323 (reprise U8, candidat U8r2 sur `4283c13`) et à l'évaluation du lot (T10, `U8-EVAL.md`). Les conditions de la porte inscrites au registre deviennent sans objet pour U8 ; le lot U8 est clos sans publication ; la livraison d'un build aura lieu dans un prochain cycle (lot et numéro de version à définir). Aucun build, aucun fichier de jeu ni dépôt modifié par cette entrée | Documents seulement : doc 27 frontmatter `lot-u8` `pending` → `completed` (contenu précisé), § U8 +1 ligne ; doc 21 : 3 lignes complétées, cases non cochées ; index : plage `CHG-001` à `CHG-324` → `CHG-325`, ligne du doc 27 ; journal +1 ligne ; aucune entrée d'autre lot réécrite | `git revert` du commit de cette DOC (`git log --grep CHG-325`, ticket au gardien avec l'accord de l'utilisateur) : rétablit les reports sous le lot propriétaire U8 et le statut `pending`. Artefacts hors dépôt : aucun changement, rien à restaurer | | CHG-324 | 2026-10-11 | U8P | Lot U8P (pièges de la reprise U8 reportés dans les skills ; fiches U8P-T1 IMPL, U8P-T1v VAL, U8P-T1d DOC) : `Tools/claude/skills/lp-build/SKILL.md` (+3 / −1 : § 4, ligne de renvoi vers `shipping.md` complétée ; § 9, ligne d'exception), `Tools/claude/skills/lp-build/shipping.md` (+25 : trois sections B1, B2, B3) et `Tools/claude/skills/lp-validate/SKILL.md` (+10, § 5 : V1 et V2), identiques dans l'addon `D:\Game\LifePlay-Sandbox-5.8` (branche `ue5.8`, commit `3f94b5e`, ticket U8P-R1, instantané `U8P-addon58`) et dans l'addon `D:\Game\LifePlay-Sandbox` (branche `lot/DC3-atelier`, commit `29747a2`, ticket U8P-R2, instantané `U8P-addon`) ; `Tools/FicheStats.py` du jeu (+6 / −2, expression `FICHE_RE`, instantané `U8P` ; ticket U8P-R3 à venir) ; livrables `etat/U58/U8P/` (`U8P-TACHES.md`, `U8P-T1-IMPL.md`, `U8P-T1-VAL.md`, `U8P-T1-DOC.md`) | Décisions de l'utilisateur 2026-10-11 : liste B1, B2, B3, V1, V2, F1 de `etat/U58/U8/U8-EVAL.md` § 5 « Tout approuver » ; report sur `lot/DC3-atelier` « Oui, comme OBP ». B1 (build Shipping « Target is up to date » : aucun code changé depuis le build précédent, 0 action, ni `Creating makefile` ni `Using Visual Studio` ; critère = code 0 et `git diff --name-only HEAD -- Source Config Plugins LifePlay.uproject` vide, jamais « exe daté de ce build » ; source `U8-T2r2-BUILD.md` § Écarts E1, critère trop strict qui avait arrêté U8-T2r2 sur un succès) → `shipping.md` et `lp-build/SKILL.md` § 9. B2 (`Tools/UeState.ps1:43` ne suit pas UAT, `dotnet AutomationTool.dll` : mise en scène, pak et archivage sans processus des quatre familles ; la cuisson lance `UnrealEditor-Cmd.exe`, famille `Editeur`, donc vue ; retour prématuré de `-WaitExit` estimé, non observé en U8 ; lancer UAT en arrière-plan, attendre la notification, lire `AutomationTool exiting with ExitCode=` ; sources `U8-EVAL.md` § 4, `U8-T5b-BUILD.md` Constats 12) → `shipping.md`. B3 (lancer un `.cmd` : depuis pwsh `cmd.exe /c`, depuis Git Bash `cmd /c` ouvre la bannière sans exécuter le fichier et rend un code 0 trompeur ; cause « conversion de `/c` par MSYS » estimée ; vérifier le produit attendu par `Test-Path` ; source `U8-T8c-BUILD.md` Écarts 1) → `shipping.md`. V1 (un Shipping lancé sans son `.bat` écrit dans le `Saved` réel de `%LOCALAPPDATA%\LifePlay\Saved` : empreinte avant ET après chaque jeu, jamais au lancement ; incident de U8-T6 : caches, `LPKeyboard.ini` et `GameUserSettings.ini` réécrits à 20:37 et 20:48 alors que le relevé « inchangé » datait de 20:33 ; sources `U8-T5ar2-VAL.md` l. 23-27, `U8-T6-VAL.md` l. 29) → `lp-validate/SKILL.md` § 5. V2 (test A/B 5.5 contre 5.8 : vérifier que le réglage existe dans les deux builds avant de solliciter l'utilisateur ; U8-T6 annulée, la V1.5 n'a pas le réglage Effects, une session de jeu perdue ; source `U8-T6-VAL.md` l. 9-11) → `lp-validate/SKILL.md` § 5. F1 (`Tools/FicheStats.py` : suffixes `T5cr2` et `T2r2-T5br2`, tickets `-Rn`, livrables `-VAL`, `DOC`, `INT`, `EVAL`, `CART`, `SPEC`, `IMPL`, `BUILD`, `STATS` ; `--lot U8` compte 16 fiches au lieu de 10) | Addons (chaque) : `lp-build/SKILL.md` 149 → 151 lignes (+3 / −1), `lp-build/shipping.md` 29 → 54 (+25), `lp-validate/SKILL.md` 98 → 108 (+10) ; 38 lignes ajoutées et 1 retirée (le renvoi du § 4, remplacé par 2 lignes) par addon ; jeu : `Tools/FicheStats.py` 162 lignes (+6 / −2) ; chiffres recomptés par `git show --numstat 3f94b5e` et `29747a2` (`3 1`, `25 0`, `10 0`) et `git diff --numstat -- Tools/FicheStats.py` (`6 2`). VAL `U8P-T1-VAL.md` : PASS (`cmp` des trois fichiers entre addons identiques ; LF sans BOM, 0 CR ; `python -I Tools/FicheStats.py --lot U8 --since 2026-10-10T19:00` code 0, 16 fiches contre 10 avant ; non-régression `--lot OBP` 10 fiches, `--lot STE --since 2026-10-11` 1 fiche ; B2 en PASS-STATIC : `UeState.ps1` et `RunUAT.bat` lus, aucun UAT rejoué). Réserve E1 de la VAL (B2 plus fort que la source : « cuisson » et retour prématuré non observés) corrigée ensuite par l'orchestrateur (`U8P-T1-IMPL.md` § 2 écart 4) ; écarts de forme E2 et E3 acceptés. Aucune entrée d'autre lot réécrite | `git revert` de `3f94b5e` (addon `D:\Game\LifePlay-Sandbox-5.8`), de `29747a2` (addon `D:\Game\LifePlay-Sandbox`) et du commit jeu du lot (`git log --grep U8P-R3` ; `FicheStats.py`, livrables, journal, index, doc 21), par ticket RESTORE au gardien avec l'accord de l'utilisateur. Ou `.\Tools\Restore.ps1 -Lot U8P-addon58`, `-Lot U8P-addon` et `-Lot U8P` après `Snapshot.ps1 -Lot U8P-retour` (proposé, jamais lancé sans accord) | | CHG-323 | 2026-10-11 | U8 | Reprise U8 des 2026-10-10 et 2026-10-11 : Shipping V2.0 candidat U8r2 sur `4283c13`, jeu léger d'archive préparé, rien poussé ni publié. Hors git : référence `Releases/2026.10.2.0` recréée, `Saved/Cooked/Windows` recuit, `D:\Game\LifePlay_Build_5.8_Shipping_U8r2` (2 078 fichiers) et `…_Shipping_U8r2_PDB` (PDB et `BUILD-ID.txt`), `D:\Game\LifePlay_Build_5.8_Development_U8r2` (2 100 fichiers), archive `D:\Game\LifePlay_Publication\LifePlay_Revival_V2.0_Windows_Game.7z` ; 3 archives de mods recuites (`D:\Game\LifePlay_Publication\Mods\`, anciennes en `.precedent_*`) ; `README.md` racine préparé pour V2.0 (+64 / −6, LF, non commité, en attente de l'accord de l'utilisateur sur le texte) ; dépôt Modules `c8661cd` (`Clothes4.txt`). Dans git : livrables `etat/U58/U8/` (état des lieux, registre `U8-TACHES.md`, fiches et livrables T0m à T8c), `etat/REPO/NUMEROS.md`, `Docs/README.md` (plage du journal), docs 21 (7 lignes de reports), 27 (§ U8, paragraphe « Reprise »), 29 (défauts connus). Commits de la reprise : `36d1fa4` (U8-R2), `6b038c6` (U8-R3), `c01b543` (U8-R4) ; dépôt Modules `c8661cd` (U8-R1) | Les archives U8 du 2026-10-09 ne reflétaient plus le jeu (48 commits depuis `f90eec1`, 8 Blueprints et 5 classes C++ embarqués changés) et `CheckPackage.ps1` les refusait ; la reprise (`U8-ETAT-2026-10-10.md`, `U8-TACHES.md`) les remplace. Décisions de l'utilisateur du 2026-10-10 : D1 référence recréée sous `2026.10.2.0` (l'ancienne en sauvegarde), D2 départ au commit qui suit le gel, D3 cuisson complète sans `-iterate` et DDC gardée, D4 `Saved` du Shipping dans `%LOCALAPPDATA%` laissé tel quel et écrit au README, D5 Shipping sans journal et mesure sur un Development de la même cuisson, D6 `Clothes4.txt` commité dans le dépôt Modules, D7 3 mods recuits, D8 push, fusion, tag, Mega et README public à la porte T11 seulement, D9 séquence complète jusqu'à T10. Candidat U8r (`36d1fa4`, T2r à T5cr, T7) puis refonte U8r2 après le commit STE `4283c13` : compilation Shipping « up to date » (aucun code changé depuis `36d1fa4`), cuisson complète `FULL COOK` 8 923 paquets 0 / 0 en 151 s, archive Shipping et Development, `.ucas` identiques au SHA-256, `CheckPackage.ps1` 4 PASS (rejoué par l'orchestrateur), référence `2026.10.2.0` recréée. Smoke Shipping U8r2 (T5ar2) PASS : 2 lancements, 0 plantage, mods lus, réglages vidéo Medium conservés après relance (réserve R2 levée, estimé par les fichiers). Mesure Development U8r2 (T5cr2) PASS avec réserves : 88 SPAWN, `ContactMenu` 0, hitchs 0, `Accessed None` 18 (0,20 par SPAWN), 0 Fatal ; `Floats_3` 72 (4 en U8r, 0,82 par SPAWN) ; `No SkeletalMesh` 10 289 (7 971 en U8r), 70 % d'un seul acteur, cause non établie ; `K2Node_CustomEvent_Person` dans `moveToPersonStand` : défaut d'origine établi par STE (journaux C0 et J3), ne bloque pas T11 selon STE. Identité des données (T7b) PASS : `CompileAllBlueprints` 418 / 418, 0 / 0 ; `LPCheckStreetMap` 280 / 280, totaux = U5, CSV identique. T7 PASS avec réserves (critères 1, 5, 6 établis). 3 mods recuits (T8a) : 3 × `BuildMod` code 0, 70 / 84 / 20 paquets, `MODULE_GAME_VERSION` 2026.10.2.0, anciennes archives en `.precedent_*`. T6 (brouillard Effects Low-Med) annulée sur décision de l'utilisateur, sans captures : rendu Low / Med jugé acceptable à l'œil, comparaison 5.5 impossible (la V1.5 n'a pas le réglage). Archive de jeu léger (T8c, décision de l'utilisateur du 2026-10-11) : `vin_Base` et `vin_VanillaRealistic` seuls, 14 modules rangés à côté sans archive de diffusion, 1 452 fichiers, 1 291 890 476 o, SHA-256 `4f68afcb…`, `7z t` code 0, 0 PDB, 0 `.git`, 0 `LPSandbox` ; rien téléversé. Reste : T9 (indicateurs), T10 (évaluation), T11 (porte de publication) avec ses conditions (G-OB clos, sortie de ST, chemins personnels des docs 27 et 28 à nettoyer, contrôle PUB de toute la branche `ue5.8`, lien, taille et SHA-256 de l'archive au README). Livrables : `etat/U58/U8/` (`U8-T3p.md`, `U8-T2r2-BUILD.md` à `U8-T5br2-BUILD.md`, `U8-T5ar2-VAL.md`, `U8-T5cr2-VAL.md`, `U8-T6-VAL.md`, `U8-T7-VAL.md`, `U8-T7b-VAL.md`, `U8-T8a-BUILD.md`, `U8-T8b-DOC.md`, `U8-T8c-BUILD.md`, `U8-DOC.md`) | — → créé (archives, référence et README racine) ; journal +1 ligne ; docs 21, 27, 29 et index complétés, aucune entrée d'autre lot réécrite | Documents : `git revert` du commit de cette DOC (`git log --grep CHG-323`). Référence et cuisson : déplacer `Releases\2026.10.2.0` (U8r2) et `Saved\Cooked\Windows` en sauvegarde sous `D:\Game\LifePlay_Backup_5.5\U8\`, puis remettre `D:\Game\LifePlay_Backup_5.5\U8\Releases_2026.10.2.0_avant-T3r` à `Releases\2026.10.2.0` (chemins et commandes dans `U8-T3p.md`, T3p bis : `Releases_2026.10.2.0_U8r` et `Cooked_Windows_U8r` pour l'état U8r) ; jamais de suppression. README racine : instantané `D:\Game\LifePlay_Backup_5.5\U8\README.md` (MD5 `4E9D91F6E5B45D5A211A971E844E5761`), ou `git restore` par ticket au gardien si le README a été commité. Commits `36d1fa4`, `6b038c6`, `c01b543` : `git revert` par ticket au gardien, avec l'accord de l'utilisateur ; `c8661cd` (dépôt Modules `D:\Game\LifePlay_ModulesGit\5.8.git`) idem. Archives, Development et dossiers de build : hors git, déplacer vers `D:\Game\LifePlay_Backup_5.5\U8` | | CHG-322 | 2026-10-11 | STE | `Content/BPs/GI.uasset`, fonction `AddVariable` (fiche STE-H3c, garde G12, MCP 2026-10-10 23:15) : entre `IfThenElse_3951.then` et `MacroInstance_1960` (IsValid de l'ancienne `Person[0]`), `Branch(IsValidIndex(BreakStruct_1527.Person_24, 0))` (`CallArrayFunction_1`, `IfThenElse_0`) ; `else` → `CallArrayFunction_4346` (`Array_Set`, le chemin `Is Not Valid` d'avant). 2 nœuds (`AddVariable` 49 → 51). Détail : `etat/ST/STE/STE-H5c-IMPL.md`, `STE-H3c-SPEC.md` § 2.2 bis ; MD5 de GI dans CHG-321 | ERR-082 / 084 (F2) : `Attempted to access index 0 from array 'Person_24_…' of length 0` quand une variable de scène est remplacée et que l'ancienne valeur n'a pas de personne (232 en J3). Comportement identique. Décisions de l'utilisateur : Q1 = A, Q-H3c-2 = « seulement si un reste ». VAL PASS-STATIC (`STE-VAL.md`, section STE-H5b / STE-H5c / STE-H3c) ; J5 : `Person_24` 109 (J4) → 13, reste dans les scènes d'animal (`pet/meet_new_person_*`) → fiche STE-H3d | `git revert` du commit (défait aussi CHG-320 et 321, mêmes assets) ; ou `.\Tools\Restore.ps1 -Lot STE-H3c` éditeur fermé (GI = état CHG-320, défait aussi O3 de CHG-321) | | CHG-321 | 2026-10-11 | STE | `Content/BPs/Room.uasset`, EventGraph (fiche STE-H5c, garde O1, MCP 2026-10-10 23:14) : après `CallFunction_235` (`GetSpecific` de la branche IA de `getKnownNpcsHere`), `Branch(IsValid(PersonToReturn))` (`CallFunction_62`, `IfThenElse_73`) ; valide → `CallFunction_199` (`Map_Add KnownNpcsHere`), nul → `Knot_1` (le saut déjà pris par `IfThenElse_43.else`). `Content/BPs/GI.uasset`, `clearScenePersons` (garde O3) : dans la boucle sur `PersonsUsedThisScene`, `Branch(IsValid(Array Element))` (`CallFunction_18`, `IfThenElse_8`) avant `clearDaily` ; nul → tour suivant. 4 nœuds (Room EventGraph 1008 → 1010, `clearScenePersons` 56 → 58), fonction pure `IsValid` + Branche au lieu de la macro (écart tracé). Détail : `STE-H5c-IMPL.md`, `STE-H5c-DIAG.md` ; MD5 Room D051CE94… → E8F58B2A…, GI (avec CHG-322) 4773054E… → 16394D43… | Défaut d'origine (4.27), voisin d'ERR-085 (personne nulle dans le moteur de scènes), prouvé par l'essai C1 sans F-a, non imputable à F-a : `Accessed None … property Person` dans `GI.Dress` par paquets de 2 887 quand la compagne suit le joueur (`GetSpecific` rend None pour une clé déjà prise ; élément nul dans `PersonsUsedThisScene`), avec saccades en fin de scène : J4 32 716, essai C1 sans F-a 25 985 (`STE-J4.md` § 7-8). Décision de l'utilisateur : Q-H5c-2 = « O1 + O3, ciblées ». VAL PASS-STATIC ; J5 : `Dress` 0 pour 13 déplacements de la compagne et 17 fins de scène ; utilisateur : saccades « encore quelques-unes » (moins qu'avant) | `git revert` du commit (défait aussi CHG-320 et 322) ; ou `.\Tools\Restore.ps1 -Lot STE-H5c` éditeur fermé (GI = état CHG-320, Room d'avant) | | CHG-320 | 2026-10-11 | STE | `Content/BPs/GI.uasset`, EventGraph (fiche STE-H5b, correctif F-a, MCP 2026-10-10 21:37-21:42) : entre `IfThenElse_148.else` (`AIDummy.SaveSlot != 0`) et `CallFunction_743` (`PlayScene` d'une routine d'IA), nouvel `AddVariable('AI', 'Person', [AIDummy])` (`CallFunction_568`, tableaux `MakeArray_3` à `_6` partagés avec `CallFunction_739`). 1 nœud (EventGraph 6233 → 6234). Détail : `STE-H5b-SPEC.md`, `STE-J4.md` ; MD5 B8B97C46… → 4773054E… (puis CHG-321 / 322) | ERR-003 (préexistant 4.27), cause établie par `STE-H5-DIAG.md` : `UpdateCheckForScenes` vide `Variables` (`Array_Clear`) pendant la boucle IA `Async`, les routines suivantes perdent `AI` (cas B, muet depuis G5). Effet visible voulu : les routines d'IA s'appliquent au PNJ. Décision de l'utilisateur : Q-H5-1 = « Corriger (F-a) », C0 = « Faire C0 ». Preuve par témoin temporaire (PrintString `STE-H5b-TEMOIN` sur G5, build de diagnostic non commité, retiré par `Restore.ps1 -Lot STE-H5b-temoin`) : C0 sans F-a 18, J4 avec F-a 0 ; VAL PASS-STATIC (témoin absent, `CallFunction` 1563) ; J5 : 18 routines avec personne, 0 « by 0 » | `git revert` du commit (défait aussi CHG-321 et 322) ; ou `.\Tools\Restore.ps1 -Lot STE-H5b` éditeur fermé (GI d'avant, B8B97C46, défait aussi CHG-321 GI et 322) | | CHG-319 | 2026-10-10 | LISIB | `Source/LifePlay/LPReadableTextSubsystem.h`, `Source/LifePlay/LPReadableTextSubsystem.cpp` (nouveaux, 45 + 258 lignes, LF, ASCII : `ULPReadableTextSubsystem`, GameInstanceSubsystem, passe toutes les 0,25 s par `FTSTicker` sur les `USpinBox` et `UEditableTextBox` des menus du jeu, une fois par widget, hors `SettingsScrollBox` laissé à `LPSettingsSubsystem` ; SpinBox : style de Settings (fond 0,06 / 0,12 / 0,16, remplissage actif bleu, remplissage au repos et au survol bleu sombre (0,1 ; 0,22 ; 0,45 ; 0,9), texte blanc à contour noir 2 px, police d'au moins 16, opacité de rendu 1) ; Text Box sans couleur de texte fixée : texte noir opaque et police d'au moins 14, posés par `ULPWidgetStyleLibrary::SetEditableTextBoxStyle` (ERR-088) ; pas demandés en PIE : `CharGen.MoanPitch` Delta 0,01 et 2 décimales, `CharGen` / `StatMenu.VarianceSpinBox` Delta 0,1 et 1 décimale ; journal `LogLifePlay: LISIB : …`, une ligne par widget) ; aucun asset modifié ; `LifePlay.uproject` (+5/−1, réécrit par l'éditeur à la relance du PIE LISIB-J1 à 18:30 et adopté par l'utilisateur : `McpAutomationBridge` perd `"Optional": true`, `InterchangeTests` gagne `SupportedTargetPlatforms` Win64, Linux, Mac) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\LISIB\`, tag `LISIB-avant` ; livrables `etat/ST/LISIB/` | Texte gris clair sur fond gris clair : une SpinBox sans style dans l'asset écrit en `InvertedForeground` #B7B7B7, taille 12, sur le pinceau #E6E6E6 (contraste ≈ 1,6:1) ; une Text Box sans couleur hérite d'un texte clair sur un fond blanc à 80 % (cause C1 de `STD-TXT-DIAG.md`). Défaut d'origine, identique en 5.5. Inventaire `etat/ST/LISIB/LISIB-T1-CART.md` : 548 widgets texte, 56 SpinBox et 16 Text Box visées hors Settings. Décisions de l'utilisateur : « Lot séparé » (PIE STF-T5b : « La police est toujours trop faible, comme dans de nombreux cas ») ; SPEC Q1 a (SpinBox + champs), Q2 a (C++ seul), Q3 a (comme Settings), Q4 a (16) ; en PIE : pas de 0,01 / 0,1 (« C++ LISIB, ce passage », « Oui, les deux »), « commun », « 16 partout » ; stats au pas de 0,1 « Après le gel » (report LISIB-S1 : 2 `Round` dans le graphe de `StatAdjust`) ; `LifePlay.uproject` : « Garder et commiter ». Preuves : compilations 0 erreur, 0 avertissement (`LISIB_Build_20261010-173435.txt`, `LISIB-J1a_Build_20261010-183020.txt`) ; VAL1 PASS-STATIC (D1 corrigé : survol teinté), VAL2 PASS ; PIE J1 conforme ; archive `LifePlay_Build_5.8_STF-STE-LISIB_Development` : « tests terminé, rien de marquant », 32 lignes `LISIB :` distinctes (23 SpinBox, 9 Text Box), aucune pour MainMenu, sortie normale (`LISIB-J2.md`) | `git revert` du commit (rend aussi `LifePlay.uproject` d'avant) ; ou retirer les deux fichiers neufs et recompiler (`.\Tools\Restore.ps1 -Lot LISIB` les retire : `Existed=False`) | | CHG-315 | 2026-10-10 | STE | `Content/BPs/GI.uasset`, EventGraph (fiche STE-H2, garde G-H2, MCP 17:32-17:33) : entre `CallArrayFunction_231` (`Array_Clear UsedMorphValues`) et `MacroInstance_207` (`ForEachLoop` des morphs), `Branch(IsValid(GetSkeletalMesh))` (`IfThenElse_215`, `CallFunction_567`) ; sans maillage, `else` → `UpdatePlayerMesh` (`CallFunction_10426`), comme la boucle à 0 tour d'avant. 2 nœuds. Détail : `etat/ST/STE/STE-GARDES-IMPL.md`, `STE-H2-DIAG.md` ; MD5 A5A0EDF0… → B8B97C46… | ERR-085 (F4) : `Accessed None` `CallFunc_GetSkeletalMesh_ReturnValue` dans `UpdatePlayerMeshWithMorphs` sur les mannequins CheckScenes recyclés dont le corps est vidé au DESTROY (H2 confirmée, `STD-SCN-DIAG.md`). Comportement identique. Décision de l'utilisateur : « Garde + instruire la cause » (cause : STE-H2b, après le gel). VAL PASS-STATIC (`etat/ST/STE/STE-VAL.md` § STE-GARDES) ; J3 PASS : 0 avertissement de pile `UpdatePlayerMeshWithMorphs` (STB-JEU2 : 96) pour 151 SPAWN ; utilisateur : « tests terminé, rien de marquant » | `git revert` du commit (défait aussi CHG-313 et CHG-314, même asset) ; ou `.\Tools\Restore.ps1 -Lot STE-H2` éditeur fermé (rend GI à l'état CHG-314) | | CHG-314 | 2026-10-10 | STE | `Content/BPs/GI.uasset`, `CallFunction` et `CallFunctionReturnBool` (fiche STE-H3b, gardes G7 à G11, MCP 17:26-17:32) : sites `getActorVar` (G7, `else` → `AddVariable` existant), `setActorVar` (G8) et `modifyActorVar` (G9) gardés par `IsValidIndex(Person, 0)` ; `getUntil` (G10) et `hasRelationship` (G11) gardés par `IsValidIndex` puis `IsValid`, chemin « vide » = rejeu exact de l'appel d'origine avec la clé `"0"` (`Map_Find` + `MakeArray` + `AddVariable`, `hasRelationship` + `Set BoolToReturn`). 19 nœuds. Détail : `STE-GARDES-IMPL.md`, `STE-H3b-SPEC.md` (§ 2.4 bis pour G9) ; MD5 62FCCD5B… → A5A0EDF0… | ERR-082 / 083 / 084 (F1 à F3, lectures de `Person[0]` sur tableau vide) : routines d'IA et conditions de scènes sans personne. Comportement identique pour G7, G8, G10, G11 ; G9 supprime l'écriture parasite `ActorVars["0"]` (décision de l'utilisateur : « Oui, poser G9 »). Décisions Q4 = a, Q5 = a (rejeu exact). VAL PASS-STATIC (dumps : +19 nœuds, 0 retiré, liaisons hors gardes 0) ; J3 PASS : `_41`, `_30` à 0 (14, 4) | `git revert` du commit ; ou `.\Tools\Restore.ps1 -Lot STE-H3b` éditeur fermé (rend GI à l'état CHG-313, défait aussi CHG-315) | | CHG-313 | 2026-10-10 | STE | `Content/BPs/GI.uasset` (fiche STE-H3, gardes G1 à G6, MCP 17:19-17:26) : `setActorVar` (G1) et `getActorVar` (G2) gardés par `IsValid(Person)` (G2 : `else` → retour 0.0) ; `ReturnStatIfNeeded` (G3) par `IsValidIndex` puis `IsValid` (`else` → retour 0.0) ; `CallFunction` : `setCurrentLocation` (G4), `setUntil` (G5), `getBuilding` (G6, `else` → `AddVariable` existant) par `IsValidIndex` puis `IsValid`. 20 nœuds. Détail : `STE-GARDES-IMPL.md`, `STE-H3-SPEC.md` ; MD5 606EB437… → 62FCCD5B… | ERR-082 / 084 (F1, F3) : `Accessed None` `Person` et `CallFunc_Array_Get_Item_31/32/33` dans le moteur de scènes (variable de scène vide). Comportement identique sauf G5 : plus d'écriture `AI_Untils["0"]` ni de ligne « (test0104) … by 0 » quand une routine d'IA n'a pas de personne (décisions de l'utilisateur Q1 = A, Q2 = G5 acceptée). VAL PASS-STATIC (dumps 6 graphes : +41 nœuds au total, 0 retiré ; CompileAllBlueprints 418/418 0/0 ; LPTestStringCompat 3120/0/60) ; J3 PASS : `property Person in` 0 (270), `_31/_32/_33` 0 (96/24/33), « by 0 » 0 (24) pour 46 routines valides | `git revert` du commit ; ou `.\Tools\Restore.ps1 -Lot STE-H3` éditeur fermé (GI d'avant les gardes, défait CHG-313 à 315) ; ou tag `STE-GARDES-avant` (ticket RESTORE) | | CHG-318 | 2026-10-10 | DOCSTAT | `Docs/08_Guide_Developpeur.md` l. 5 et `Docs/09_Commandes_Utiles.md` l. 4 (renvoi au doc 10 : « Règles et leçons (référence, V1) : `10_Protocole_Operations.md` ; méthode actuelle : skill `lp-lot` et `32_Organisation_Agents.md` », au lieu de « Méthode de travail obligatoire » / « Méthode ») ; `Docs/21_Sandbox_Addon.md` l. 1 (titre : « ébauche, 2026-10-06 » → « lots S0 à S8 clos, CHG-220 ; pin et registre des reports tenus à jour ») ; `Docs/29_Projet_Stabilisation_V2.md` (frontmatter : `phase0`, `lot-sta`, `gate-gst` → `completed`) ; `Docs/30_Projet_Audit_Obsolescence.md` (frontmatter : `phase0`, `lot-oba` → `completed`, `gate-gob` → `in_progress`) ; `Docs/32_Organisation_Agents.md` (en-tête : statut « proposition (phase 0) » → « appliqué en partie depuis le 2026-10-10 » ; puce de révision ; § 15 ajouté « En vigueur depuis le 2026-10-10 » : en place / pas en place, file de compilation, jeton du journal, R-REPO1 et sa précision, `--amend` (ERR-087), gels et réservations, refus d'autorisation, messages ; § 1 à § 14 inchangés) ; `Docs/README.md` (cellules Statut des docs 21, 29, 30, 32 ; plage portée à CHG-318) ; `Docs/Migration/etat/BOSS/BOSS-JOURNAL.md` commité tel quel (point 5) ; livrables `etat/DOC/DOCSTAT/` (TACHES, SPEC, IMPL, VAL) | Décision de l'utilisateur du 2026-10-10 « 1 - 5 oui » (points 1, 2, 3, 5 ; `BOSS-JOURNAL.md` l. 192) ; statuts relevés en retard par le lot README (`etat/DOC/README/README-T1-INV.md`) et vérifiés dans les registres et commits : STA-T1 à T3 acceptées et porte G-ST validée (`etat/ST/STA/STA-TACHES.md:17`, STA-T4 jamais faite), OBA 7 / 7 acceptées, G-OB tenue en partie (`etat/OB/OBB/OBB-TACHES.md:5-7`, OBB-EVAL GO conditionnel), lot AG commité (`bdb8f6b`, `a8dea6d`, `ee9dce2`, `2cca224`) sans chef, planificateur ni managers. SPEC approuvée ; décisions : « Tout completed » (Q1, Q2), « Appliqué en partie » (Q3), « Aligner les 4 cellules » (Q4) ; VAL `DOCSTAT-VAL.md` PASS-STATIC (V1-V7 : diffs conformes, 0 CR, 27 renvois « BOSS l. N » vérifiés) | 08, 09, 21 : 1 ligne ; 29, 30 : 3 lignes ; 32 : +77 / −2 ; README : 5 lignes | `git revert` du commit du ticket `DOCSTAT-R1` ; ou `.\Tools\Restore.ps1 -Lot DOCSTAT` (instantané : 6 docs, README, journal) | | CHG-317 | 2026-10-10 | STF | `Content/UI/CharGen.uasset` (STF-T5 partie (b), réglage « Counteract Vagina Deform » : `SpinBox_0`, `OnValueChanged` (`ComponentBoundEvent_85`) gardé par `Branche(IsValid(GI))` → `Branche(IsValid(GI.CharacterBeingEdited))` avant `SetMorphTarget` (valeur × -1 inchangée, effet en direct conservé, sorties « faux » non branchées) ; pas de 0,5 (`Delta` 0,5, saisie arrondie au pas, 1 décimale, bornes inchangées) ; widget non remplacé (pas de liaison de propriété)) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STF-T5b\`, tag `STF-T5b-avant` ; livrables `etat/ST/STF/` (`STF-T5-IMPL.md` § 6, `STF-T5-VAL.md` partie (b)) ; `Docs/README.md` : plage du journal portée à CHG-317 | Au premier `SetValue` / `CommitValue` de construction de CharGen, `OnValueChanged` lisait `GI` encore nul : « Accessed None … property GI in CharGen_C » (1 dans le journal de l'archive J1 de STF ; mécanisme d'ERR-057, sans écriture). « Vide » est l'état normal à la construction (règle 4 `lp-mcp`). Décisions utilisateur : lot unique STF-T5 (« Un seul lot, confié à STF »), (b) approuvée, exécutée après le commit STE `073f9df` (STE-TXT + STE-P1) ; pas de 0,5 choisi pendant le PIE (« 0.5 ») ; commit « Maintenant, comme (a) », avant la preuve en jeu (prévue avec (a)) ; police trop faible → lot séparé (LISIB). PIE : effet en direct conservé, 0 « property GI in CharGen_C » ; `CompileAllBlueprints` 418 / 418, 0 erreur, 0 avertissement ; VAL statique `STF-T5-VAL.md` partie (b) PASS-STATIC (seuls ajouts : 2 branches, 2 `IsValid` ; liaisons 32 / 32 inchangées). Candidat hors périmètre noté : `PopulateGenitalSlidersDaz` (`GetSkeletalMesh` nul à l'ouverture de CharGen) | `git revert` du commit ; ou `git checkout STF-T5b-avant -- Content/UI/CharGen.uasset` (ticket RESTORE) ; ou `.\Tools\Restore.ps1 -Lot STF-T5b` éditeur fermé | | CHG-316 | 2026-10-10 | README | `Docs/README.md` (index de la copie 5.8, réécrit : 82 → 114 lignes) : titre « LifePlay — documentation de la copie UE 5.8 (branche ue5.8) : point d'entrée » ; sections nouvelles « État au 2026-10-10 » (migration 5.8 U0-U7b close, U8 et U9 différés ; projets ST et OB), « Organisation du travail » (doc 32, Big Boss, gardien, R-REPO1, `NUMEROS.md`, jeton du journal) ; table des docs 01-32 en colonnes `Document | Statut | Public | Contenu`, statut relu dans chaque doc (bandeau, en-tête, frontmatter), renvoi au CHG le plus récent pour 21, 29, 30 et 32 ; doc 10 classé « référence (règles et leçons, V1) » ; ligne « Autres dossiers de Docs/ » ; plages `CHG-001` à `CHG-316` (CHG-048 absent, noté) et `ERR-001` à `ERR-088` ; ordre de lecture et démarrage de session mis à jour (`git tag --list '*-valide'` retiré : 0 tag) ; ancien contenu 4.27 → 5.5 conservé en section « Historique » ; livrables `etat/DOC/README/` (TACHES, T1-INV, SPEC, IMPL, VAL) | Décision utilisateur du 2026-10-10 : « réactualise le README, il n'est plus d'actualité 4.27 -> 5.5 », fichier visé = index `Docs/README.md` (le `README.md` racine n'est pas touché) ; SPEC approuvée (Q1 a, Q2 b, Q3 b, Q4 a) ; VAL `README-VAL.md` PASS-STATIC (V1-V8 : 32 / 32 docs liés, 36 liens valides, plages égales aux maximums, 0 CR) ; docs 01-32 non modifiés | 82 → 114 lignes | instantané `D:\Game\LifePlay_Backup_5.5\README-T4\Docs\README.md` (MD5 `E43B7D92A66DFA15B090514139945C2F`) ou `git checkout e3df8ca -- Docs/README.md` (gardien) | | CHG-312 | 2026-10-10 | OBP | Lot OBP (suite : pièges P4, P9, P10 et P11 du lot OBB reportés dans les skills ; fiches OBP-T2 IMPL, OBP-T2v VAL, OBP-T2d DOC) : `%USERPROFILE%\.claude\skills\sk-protocol\SKILL.md` (+7 lignes : § 7 P4, l. 58-61, et § 8 P11, l. 84-86) et `%USERPROFILE%\.claude\skills\sk-orchestrate\SKILL.md` (+3 lignes : § 3, bloc « Pièges de rédaction », P4 et P9, l. 46-48), non versionnés, instantané `D:\Game\LifePlay_Backup_5.5\OBP2-user` ; `Tools/claude/skills/lp-repo/SKILL.md` (+5 lignes, § 10 Pièges, P9 et P10, l. 97-101), `Tools/claude/skills/lp-validate/SKILL.md` (+3 lignes, § 1, P10, l. 41-43) et `Tools/claude/skills/lp-doc/gabarits.md` (+4 lignes, gabarit TACHES, P11, l. 89-92), identiques dans l'addon `D:\Game\LifePlay-Sandbox` (branche `lot/DC3-atelier`, commit `1334ac1`, ticket OBP-R6, instantané `OBP2-addon`) et dans l'addon `D:\Game\LifePlay-Sandbox-5.8` (branche `ue5.8`, commit `9227db8`, ticket OBP-R7, instantané `OBP2-addon58`) ; livrables `etat/OB/OBP/` (`OBP-T2-IMPL.md`, `OBP-T2-VAL.md`, `OBP-T2-DOC.md`, `OBP-TACHES.md`) | Décision de l'utilisateur 2026-10-10 : « traite les pièges P4, P9, P10 et P11 » (laissés hors périmètre par CHG-310). Source : `etat/OB/OBB/OBB-EVAL.md` § 6. P4 (Edit ramène en LF un fichier à fins de ligne mixtes : une fiche ne doit pas exiger « fins de ligne conservées » sans prescrire la méthode ; conservation des octets par remplacement d'octets depuis l'instantané, sur décision de l'orchestrateur) → `sk-protocol` § 7 et `sk-orchestrate` ; décision de l'utilisateur : « Garder l'exception » à la règle « Jamais de script » (la correction E1 d'OBB-T1b avait été faite par un script Python, que la règle interdisait). P9 (critère « 0 processus Unreal » à viser sur la copie traitée, et non sur toute la machine : l'éditeur d'une autre copie ne bloque pas un MOVE ; étape 0 d'OBB-R7) → `sk-orchestrate` et `lp-repo`. P10 (`git rev-parse ` donne l'objet tag : ajouter `^{commit}`) → `lp-repo` et `lp-validate`. P11 (tours sous-comptés dans 12 fiches sur 15, écart de 1 à 8 : `Tools/FicheStats.py` fait foi ; ne pas écrire le nombre d'outils à la place des tours) → `sk-protocol` § 8 et gabarit TACHES de `gabarits.md`. R-REPO1 (`lp-repo` § 4) et la règle d'ERR-087 (§ 10) intactes | 22 lignes ajoutées sur 5 fichiers distincts (`sk-protocol` +7, `sk-orchestrate` +3, `lp-repo` +5, `lp-validate` +3, `gabarits.md` +4 dans chaque addon), 0 retirée. VAL `OBP-T2-VAL.md` : PASS (`git diff --numstat` `4 0`, `5 0`, `3 0` dans chaque addon ; `cmp` des trois fichiers entre addons identiques ; `diff` contre `OBP2-user` : 0 ligne retirée ; LF sans BOM, 0 CR avant et après ; chiffres cités conformes à leurs sources). Trois précisions appliquées ensuite par l'orchestrateur (décrites dans `OBP-TACHES.md`, ligne OBP-T2v) : `sk-protocol` § 7, l'exception P4 qualifiée d'exception à « Jamais de script » (décision de l'utilisateur) ; `gabarits.md`, source de la phrase sur la colonne « Jetons » complétée (`OBB-EVAL.md` § 2, § 3, § 6 P11, § 7.7) ; `sk-orchestrate`, chemin d'`OBB-INT-R7.md` précisé | `git revert` de `1334ac1` (addon `D:\Game\LifePlay-Sandbox`), de `9227db8` (addon `D:\Game\LifePlay-Sandbox-5.8`) et du commit jeu du lot (livrables et journal ; ticket RESTORE au gardien). `sk-protocol` et `sk-orchestrate` (non versionnés) : `.\Tools\Restore.ps1 -Lot OBP2-user` après `Snapshot.ps1 -Lot OBP2-retour` (proposé, jamais lancé sans accord) | | CHG-311 | 2026-10-10 | STE | `Source/LifePlay/LPWidgetStyleLibrary.h`, `Source/LifePlay/LPWidgetStyleLibrary.cpp` (nouveaux : `ULPWidgetStyleLibrary::SetEditableTextBoxStyle`, BlueprintCallable « Set Widget Style (Text Box, LP) » : copie du style dans le membre `WidgetStyle`, puis, sous garde UE ≥ 5.8, `SetWidgetStyle(GetWidgetStyle())` pour que Slate pointe sur le membre) ; `Content/UI/CharGen.uasset` et `Content/UI/StatMenu.uasset` : les 4 nœuds « Set WidgetStyle » du flash rouge du nom refusé (`VariableSet_1147` / `_1146` dans chaque asset) remplacés par cet appel (CharGen `CallFunction_51` / `_52`, StatMenu `CallFunction_6` / `_10`), mêmes liens. Détail : `etat/ST/STE/STE-P1-SPEC.md`, `STE-P1-IMPL.md`, `STE-P1-BUILD.md` ; MD5 CharGen 9669B103… → A0DE37AC…, StatMenu 4FA5D803… → 9030531C… | ERR-088 : plantage de l'éditeur et du jeu au refus d'un nom vide (Save Preset), dû au moteur 5.8 (`UEditableTextBox::SetWidgetStyle` donne à Slate l'adresse de son paramètre, `EditableTextBox.cpp:397`, alors que le nœud Set lui passe une temporaire détruite aussitôt ; `SynchronizeTextStyle` relit ensuite la police dans une mémoire libérée). Diagnostic `etat/ST/STE/STE-TXT-DIAG.md` (antérieur à STE-TXT). Aucun autre état réappliqué (pas de `SynchronizeProperties`, qui écraserait le texte saisi). Build 0/0 ; VAL PASS-STATIC (dumps : −2 Set / +2 appels par asset, CompileAllBlueprints 418/418 0/0, LPTestStringCompat 3120/0/60) ; J2bis PASS : 10 refus de suite sans plantage, utilisateur : « oui 10 refus sans crash, texte noir, éditeur fermé ». Décision de l'utilisateur : « Ouvrir la fiche STE-P1 » | `git revert` du commit ; ou `.\Tools\Restore.ps1 -Lot STE-P1` éditeur fermé (rend CharGen à l'état STE-TXT, StatMenu à HEAD, retire les 2 fichiers Source) puis recompilation | | CHG-306 | 2026-10-10 | STE | `Content/UI/CharGen.uasset` (fiche STE-TXT, MCP, éditeur headless 13:15:14-13:17:41) : `FilenameEntry.WidgetStyle.TextStyle.ColorAndOpacity` = Specified (0,0,0,1) (avant : UseForeground) ; `VarianceSpinBox.ForegroundColor` = (0,0,0,1) (avant : 0.4729 gris). Rien d'autre (style relu en entier ; police, fond, HintText, graphe inchangés). MD5 21AB367C… → 9669B103… (puis A0DE37AC… avec CHG-311, même commit, même asset) | Texte du panneau Save Preset de la création de personnage peu lisible (clair sur fond clair : aucune couleur fixée dans l'asset, `etat/ST/STD/STD-TXT-DIAG.md`, cause C1) ; rendu identique en 5.5, correctif « texte noir » approuvé par l'utilisateur (`etat/ST/STD/STD-TACHES.md:21-22`). Conséquence attendue : le HintText s'affiche en noir à 35 %. J2 (13:25) : indice, saisie et Variance conformes ; le refus du nom a planté l'éditeur (ERR-088, antérieur, corrigé par CHG-311) ; J2bis PASS. Commit commun avec CHG-311 (même `CharGen.uasset`, correctifs inséparables) | `git revert` du commit ; ou `.\Tools\Restore.ps1 -Lot STE-TXT` éditeur fermé (CharGen d'avant STE-TXT, défait aussi CHG-311 sur CharGen) | | CHG-310 | 2026-10-10 | OBP | Lot OBP (pièges du lot OBB reportés dans les skills ; fiches OBP-T1 IMPL, OBP-T1v VAL, OBP-T1d DOC) : `%USERPROFILE%\.claude\skills\sk-windows-shell\SKILL.md` (+6 lignes, section de pièges avant « Interdits » ; non versionné, instantané `D:\Game\LifePlay_Backup_5.5\OBP-user`) ; `Tools/claude/skills/lp-build/SKILL.md` (+1 ligne de renvoi, l. 73, fin du § 4) et `Tools/claude/skills/lp-build/shipping.md` (neuf, 29 lignes), identiques dans l'addon `D:\Game\LifePlay-Sandbox` (branche `lot/DC3-atelier`, instantané `OBP-addon`) et dans l'addon `D:\Game\LifePlay-Sandbox-5.8` (branche `ue5.8`, instantané `OBP-addon58`) ; livrables `etat/OB/OBP/` (`OBP-TACHES.md`, `OBP-T1-IMPL.md`, `OBP-T1-VAL.md`, `OBP-T1-DOC.md`) | Décision de l'utilisateur 2026-10-10 : « ouvre le lot DOC des pièges ». Source : `etat/OB/OBB/OBB-EVAL.md` § 6. Pièges P1 (casse PowerShell : une variable de même nom écrase un paramètre), P2 (jeu lancé depuis l'entrée standard : relevés manquants) et P8 (Git Bash : antislashs perdus, `$` et guillemets mangés, liste refusée par `ValidateSet` en `-File`) → `sk-windows-shell`. Pièges P5 (`.rsp` de liaison : contenu valide et non date, limite du contrôle [3] de `CheckPackage`), P6 (`-nodebuginfo` : PDB, `_PDB`, `BUILD-ID.txt`) et P7 (`CheckPackage` : codes de sortie, `-Build`, `-Config`) → `lp-build`, dans une annexe `shipping.md` parce que `lp-build\SKILL.md` dépassait déjà 120 lignes (148) : une seule ligne de renvoi ajoutée au skill. Chaque piège cite sa source OBB. Hors périmètre, sur décision de l'utilisateur : P4, P9, P10, P11, P12 (P3 déjà porté par `lp-paths`) | `sk-windows-shell` 43 → 49 lignes ; `lp-build\SKILL.md` 148 → 149 lignes (dans chaque addon) ; `lp-build\shipping.md` — → créé, 29 lignes (dans chaque addon). VAL `OBP-T1-VAL.md` : PASS (diffs limités aux lignes ajoutées, 0 supprimée ; `cmp` des deux `SKILL.md` et des deux `shipping.md` identiques ; LF sans BOM, 0 CR relevé avant et après ; six pièges exacts et sourcés). Trois corrections de formulation appliquées ensuite par l'orchestrateur (décrites dans `OBP-TACHES.md`, ligne OBP-T1v) : `shipping.md` l. 6 « se cuit » → « se met en scène et s'archive » (l'option agit à la mise en scène) ; `shipping.md` l. 23 « ~1 jour » → « ~17 h » ; `sk-windows-shell` P2 « script d'écriture » → « même symptôme, cause non établie ». Contrôle final : `cmp` des `shipping.md` identiques, CR 0, 49 / 29 / 149 lignes | Addons et jeu : `git revert` des commits des tickets OBP (`git log --grep OBP-R` dans chaque dépôt ; ticket RESTORE au gardien). `sk-windows-shell` (non versionné) : `.\Tools\Restore.ps1 -Lot OBP-user` après `Snapshot.ps1 -Lot OBP-retour` (proposé, jamais lancé sans accord). Avant commit : déplacer `shipping.md` vers `D:\Game\LifePlay_Backup_5.5\OBP` et restaurer `SKILL.md` depuis `OBP-addon` / `OBP-addon58` (jamais supprimer) | | CHG-309 | 2026-10-10 | STF | `Content/UI/MainMenu.uasset` (STF-T5 partie (a), réglage « Depth of Field Strength » : widget `SpinBox_0` et sa liaison Function `Value ← Get_SpinBox_0_Value_0` (`GI.ChargenCameras[0].CameraComponent.PostProcessSettings.DepthOfFieldFarBlurSize × 2`) remplacés par `SpinBoxDOF` sans liaison, mêmes propriétés et même emplacement ; fonction de liaison supprimée ; `OnValueCommitted` gardé par `IsValid(GI)` → `IsValidIndex(ChargenCameras, 0)` → `IsValid(CameraComponent)` puis chaîne d'origine (`DepthOfFieldFarBlurSize ← valeur × 0,5`) ; `Construct` : même cascade de gardes puis `SpinBoxDOF.SetValue(DepthOfFieldFarBlurSize × 2)` avant `UpdateDonors`, chaque sortie « faux » rejoignant `UpdateDonors`) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STF-T5\`, tag `STF-T5-avant` ; livrables `etat/ST/STF/` (`STF-T5-CART.md`, `STF-T5-SPEC.md`, `STF-T5-IMPL.md`, `STF-T5-VAL.md`) | La liaison était évaluée pendant `SynchronizeProperties`, avant que `Construct` affecte `GI` : 5 « Accessed None » par évaluation, 240 dans le journal de l'archive J1 de STF (défaut préexistant, déjà en 5.5). Affecter `GI` plus tôt (`OnInitialized`) est exclu (ERR-057, CHG-294). Changement accepté par l'utilisateur : le champ affiche la valeur lue à l'ouverture du menu au lieu d'une réévaluation à chaque image. Décision utilisateur : « Un seul lot, confié à STF » ; (a) approuvée, commit « Maintenant », avant la preuve en jeu (prévue avec la partie (b), CharGen, bloquée par STE-P1). PIE : champ 2 pour un flou 1, 4 tapé → flou 2 ; 0 `Get_SpinBox_0_Value_0` et 0 erreur `MainMenu_C` au journal (12 avant) ; `CompileAllBlueprints` 418 / 418, 0 erreur, 0 avertissement ; VAL statique `STF-T5-VAL.md` PASS-STATIC (liaisons 19 → 18) | `git revert` du commit ; ou `git checkout STF-T5-avant -- Content/UI/MainMenu.uasset` (ticket RESTORE) ; ou `.\Tools\Restore.ps1 -Lot STF-T5` éditeur fermé | | CHG-308 | 2026-10-10 | OBB | Sous-lot OBB-T7 (preuve de bout en bout de B1 à B3 : Shipping 5.8 neuf, copie UE 5.8 avec BUILD-GO de Big Boss) : T7a compilation Shipping (`Tools\Build.ps1 -Lot OBB -Target LifePlay -Config Shipping -ExtraArgs '-NoUBA'`), T7b cuisson complète et archive `D:\Game\LifePlay_Build_5.8_Shipping_OBB` (`RunUAT BuildCookRun -skipbuild -cook -stage -pak -iostore -compressed -archive`, sans `-iterate`), T7c mise en scène `-skipcook … -nodebuginfo` et archive `D:\Game\LifePlay_Build_5.8_Shipping_OBB2` (sur décision de l'utilisateur, l'option ayant été omise de la fiche T7b alors qu'U8-T4 la portait), T7v verdict PASS-STATIC, T7s démarrage PASS ; docs `21_Sandbox_Addon.md` (l. 227, report U8 coché), `29_Projet_Stabilisation_V2.md` (l. 319) ; livrables `etat/OB/OBB/` (`OBB-T7a-BUILD.md`, `OBB-T7b-BUILD.md`, `OBB-T7c-BUILD.md`, `OBB-T7-VAL.md`, `OBB-T7s-VAL.md`, `OBB-T7-DOC.md`) ; archives hors dépôt `D:\Game\LifePlay_Build_5.8_Shipping_OBB` (avec PDB, redondante, conservée), `…_Shipping_OBB2` (référence), `…_Shipping_OBB_PDB` (PDB et `BUILD-ID.txt`) | Exigence B1 / B3 (G-OB-7) : prouver sur un Shipping neuf, après CHG-301 (`CheckPackage.ps1`), CHG-304 et CHG-307 (`.git` des modules hors de l'arbre), que le paquet ne contient ni `Modules/.git` ni l'addon. Preuves : T7a code 0, 0 erreur, 0 avertissement, 114 s, exe 164 830 208 o (13:05:08), `.rsp` de lien non réécrit mais de contenu valide (0 `LPAnimMeasure`, 0 `LPSandbox`) ; T7b UAT code 0, `FULL COOK`, 0 Error, 0 Warning, 290 s ; `Tools/CheckPackage.ps1` 4 PASS code 0 sur `…_Shipping_OBB` et sur `…_Shipping_OBB2` ; `…_Shipping_OBB2` : 2 078 fichiers, 1 573 286 287 o, contre U8 `…_Shipping_U8` 2 220 fichiers, 2 024 056 223 o, 0 ligne `Modules/.git` au manifeste NonUFS (U8 : 142), 0 `LPSandbox` au manifeste UFS (U8 : 1), 0 PDB, 0 `LastResort`, 0 `.git*` ; écart OBB contre U8 (−219 802 914 o) expliqué à l'octet par la VAL : −450 763 872 o de `.git` (−142 fichiers) + 230 967 022 o de fichiers de debug (PDB 225 570 816 o, `-nodebuginfo` omis) − 6 064 o de différences ; exe sans `LPAnimMeasure` par lecture binaire (U8 : 1), SHA-256 `E590CCF10F11E7E9C598706E41D66090F9820B31400BC131F3108D1B19E4FC11` ; T7s : Shipping `…_OBB` vivant 155 s avec `-UserDir` jetable (arrêté à 166 s), 0 plantage, 0 `CrashReportClient`, `%LOCALAPPDATA%\LifePlay\Saved` inchangé (73 fichiers, 0 différence), 16 modules `vin_*` lus sans `.git` (« jusqu'au menu » estimé, non vu à l'écran). Contenu non commité embarqué : `MainMenu` (STF), `GI` (STE), `CharGen` d'avant STE-TXT (source 13:17:29, cuit 13:09:11), `Clothes4.txt` des Modules (−12 o). Démarrage essayé sur `…_OBB` seulement (exe identique à celui d'`…_OBB2`, pas de PDB en moins au chargement) | Doc 21 l. 227 : `- [ ]` → `- [x]` + preuve ; doc 29 l. 319 : « reste OBB-T7 (…) » → « OBB-T7 fait : … (CHG-308) » (1 ligne chacun) ; aucun fichier suivi de code modifié par T7 ; archives nouvelles `…_Shipping_OBB`, `…_Shipping_OBB2`, `…_Shipping_OBB_PDB` | Code : sans objet (aucun fichier suivi de code modifié par OBB-T7). Docs, livrables et présente entrée : `git revert` du commit du ticket de cette DOC (`git log --grep CHG-308`). Archives de build (hors dépôt) : déplacer vers `D:\Game\LifePlay_Backup_5.5\OBB`, jamais supprimer | | CHG-305 | 2026-10-10 | STE | `Content/BPs/GI.uasset`, EventGraph seulement (fiche STE-GI, MCP, éditeur headless 12:37:39-12:44:20, BUILD-GO de Big Boss) : 5 gardes `Branch(IsValid(…))`, 13 nœuds créés (5 Branch, 5 IsValid, 2 `SetVisibility`, 1 `ClearAllExpressions`), 8 liaisons coupées, 31 posées. R06 : HideUI (`CallFunction_2310`) et ShowUI (`_939`) n'appellent `SetVisibility` sur `TintUI` que s'il est valide, sinon le nœud suivant (`VariableSet_1341`, `CallFunction_760`). R07 / R08 : HideRender (`_5578`) et ShowRender (`_3014`) gardent leurs cibles sûres ; `SceneCapture.RootComponent` passe sur un `SetVisibility` à part (`_490` false, `_494` true, propagation) derrière `IsValid`. R10 : SceneStart (`_472`) appelle `ClearAllExpressions` sur le joueur, puis sur `Companion` seulement s'il est valide (`_565`). Détail : `etat/ST/STE/STE-GI-IMPL.md` ; MD5 D93785FC… → 606EB437… | ERR-062 (R06), ERR-063 (R07 / R08), ERR-065 (R10) : `Accessed None` sur des références vides par construction (`TintUI` jamais affecté depuis 4.27, `FaceCapture` sans `RootComponent` dans la carte, `RootComponent = None` reconfirmé en 5.8 par STE-D D-2 ; pas de compagnon), décisions de l'utilisateur « garde simple » (`etat/ST/STD/STD-TACHES.md:17-18`). Comportement inchangé : le chemin « non valide » rejoint le nœud qui suivait. VAL PASS (`etat/ST/STE/STE-VAL.md` : dump avant / après 6218 → 6231 nœuds, CompileAllBlueprints 418/418 0/0, LPTestStringCompat 3120/0/60) ; J1 PASS, archive commune STF + STE, 0 / 0 / 0 contre 30 / 5 / 8 dans STB-JEU2, utilisateur : « J1 fait, tout est conforme ». Écart d'outil : `hyper_blueprint_debug_inspect` absent du serveur MCP, remplacé par `compile_blueprint` warnings_as_errors + journal (lp-mcp à corriger) | `git revert` du commit ; ou `git checkout STE-avant -- Content/BPs/GI.uasset` (ticket RESTORE) ; ou `.\Tools\Restore.ps1 -Lot STE-GI` éditeur fermé | | CHG-307 | 2026-10-10 | OBB | Sous-lot OBB-T1 étapes 2-3 (B1 : dépôts git des modules déplacés hors de `Content\Modules`) : tickets OBB-R6 (copie 5.8, BUILD-GO de Big Boss) et OBB-R7 (copie 5.5, accord de l'utilisateur « Oui, déplacer la 5.5 » ; 1er passage refusé à l'étape 0 pour un critère d'entrée trop large, corrigé par l'orchestrateur puis 2e passage fait) ; `Content\Modules\.git` → `D:\Game\LifePlay_ModulesGit\5.8.git` et `D:\Game\LifePlay_ModulesGit\5.5.git` (`Move-Item`, même volume, aucune suppression), `core.worktree` posé dans chaque config ; copies de sécurité `D:\Game\LifePlay_Backup_5.5\OBB\modules-git-5.8` et `modules-git-5.5` (142 fichiers, 450 763 872 o, vérifiées avant déplacement) ; docs `21_Sandbox_Addon.md` (l. 227), `27_Plan_Migration_UE58.md` (l. 59), `29_Projet_Stabilisation_V2.md` (l. 319) ; livrables `etat/OB/OBB/` (`OBB-INT-R6.md`, `OBB-INT-R7.md`, `OBB-T1-VAL.md`, `OBB-T1-DOC.md`) | Exigence B1 / G-OB-3 P1-b : le `.git` des modules (450 763 872 o) part dans chaque build empaqueté ; étape 1 (commandes remplacées) faite par CHG-304. Preuves rejouées par la VAL (`OBB-T1-VAL.md`, verdict PASS) pour les deux copies : `.git` absent (`Test-Path` False, recherche `.git*` récursive = 0), HEAD `ade587fc215af31de16707367448a294365082b9`, 115 commits (428 avec reflog), `status` inchangés (5.8 ` M Clothes4.txt`, 5.5 vide), `core.worktree` = `/Content/Modules`, git-dir 142 fichiers / 450 763 928 o (+56 o = ligne `worktree`), commandes de `lp-paths` l. 66-67 en code 0, Grep `git -C.*Content[\\/]Modules` = 0 (témoin non nul), `CheckIntegrity.ps1 -Modules` (5.8) = 1 écart (`Clothes4.txt`) sur 2053 fichiers. Règle : jamais `git -C \Content\Modules` (sans `.git` local, git répond pour le dépôt du jeu : `rev-parse --show-toplevel` rend la racine du jeu) ; toujours `git --git-dir=D:\Game\LifePlay_ModulesGit\<5.8 ou 5.5>.git --work-tree=\Content\Modules` | `Content\Modules\.git` : présent (142 fichiers) → absent dans les deux copies ; dépôts des modules : sous `D:\Game\LifePlay_ModulesGit\` (115 commits chacun). `CheckIntegrity.ps1 -Modules` (5.8) : 1 écart sur 2053 (l'exclusion de CHG-304 s'appliquait déjà). Effet attendu sur le paquet : 0 ligne `Modules/.git` au manifeste NonUFS, −450 763 872 o (estimé, à prouver par OBB-T7 sur un build neuf ; le report U8 du doc 21 reste donc non coché) | Tickets OBB-R6 / OBB-R7, retour arrière proposé et jamais lancé sans accord de l'utilisateur : `git --git-dir='D:\Game\LifePlay_ModulesGit\<5.8 ou 5.5>.git' config --unset core.worktree` puis `Move-Item 'D:\Game\LifePlay_ModulesGit\<5.8 ou 5.5>.git' '\Content\Modules\.git'` (filet : les copies de sécurité `OBB\modules-git-5.8` et `-5.5`) ; les 3 lignes de docs et la présente entrée : `git revert` du commit du ticket de cette DOC (`git log --grep CHG-307`) | | CHG-304 | 2026-10-10 | OBB | Sous-lot OBB-T1b (B1 étape 1 : les commandes git du dépôt des modules passent en `--git-dir` / `--work-tree` avant tout déplacement du `.git`). Deux addons, exemplaires identiques (`cmp`) : `D:\Game\LifePlay-Sandbox` (`lot/DC3-atelier`) et `D:\Game\LifePlay-Sandbox-5.8` (`ue5.8`), `Tools/claude/skills/lp-paths/SKILL.md` (l. 16 ; l. 66-67 remplacées ; l. 68 ajoutée, ligne de commentaire) et `Tools/claude/skills/lp-repo/SKILL.md` (l. 18) ; jeu `D:\Game\LifePlay-master 5.8` : `.gitignore` (l. 82, commentaire ; l. 83 `/Content/Modules/` inchangée) et `Tools/CheckIntegrity.ps1` (l. 30-31, 38-40, 71 : `Content\Modules\.git\` exclu des deux côtés de la comparaison, côté disque dans `Hash-Tree`, côté référence par `Where-Object` ; la référence `ref_modules_5.8.csv` n'est pas réécrite) ; hors dépôt : instantanés `D:\Game\LifePlay_Backup_5.5\OBB`, `OBB-addon`, `OBB-addon58` ; livrables `etat/OB/OBB/` (`OBB-T1b-IMPL.md`, `OBB-T1b-VAL.md`, `OBB-T1b-DOC.md`) | Exigence B1 / G-OB-3 P1-b : le `.git` des modules (450 763 872 o) part dans chaque build empaqueté. Ordre imposé par Big Boss : remplacer les commandes avant de déplacer le `.git`, pour qu'une commande oubliée échoue au lieu de répondre pour le dépôt du jeu (sans `.git` local, git remonte au dépôt du jeu, où `Content/Modules` est ignoré). Preuves rejouées par la VAL (`OBB-T1b-VAL.md`, verdict PASS) : Grep `git -C.*Content[\\/]Modules` sur les `Tools/claude` des deux addons et sur `Tools` des copies 5.8 et 5.5 = 0 (témoin : 2 + 2 dans les instantanés `OBB-addon` et `OBB-addon58`, `lp-paths/SKILL.md:66-67`) ; `git --git-dir='D:\Game\LifePlay_ModulesGit\5.8.git' --work-tree=…` et idem `5.5.git` : `fatal: not a git repository`, code 128 tant que le dossier n'existe pas (voulu) ; `CheckIntegrity.ps1 -Modules` : 1 écart (`Clothes4.txt`) sur 2053 fichiers, code 1 ; faux projet sans `.git` (copie jetable) : script d'origine 143 écarts dont 142 lignes `.git`, script modifié 1 écart ; analyse syntaxique `ParseFile` 0 erreur ; fins de ligne et BOM intacts sur les 6 fichiers (`.gitignore` mixte conservé, seule la ligne 82 change après correction de l'orchestrateur) | `lp-paths/SKILL.md` : 72 → 73 lignes (+4 / −3), `lp-repo/SKILL.md` : 1 ligne modifiée (+1 / −1), identiques dans les deux addons ; `.gitignore` : 1 ligne modifiée (+1 / −1) ; `Tools/CheckIntegrity.ps1` : 89 → 93 lignes (+6 / −2). Grep des anciens `git -C` : 2 + 2 → 0. `CheckIntegrity.ps1 -Modules` : 1 écart sur 2195 → 1 écart sur 2053 (2195 − 142 lignes `.git`). Faux projet sans `.git` : 143 → 1 écart. Le `.git` des modules est toujours en place (`D:\Game\LifePlay_ModulesGit` n'existe pas) : le déplacement n'est pas fait. Suite : déplacement du `.git` 5.8 (sur BUILD-GO), puis 5.5 (accord de l'utilisateur transmis par Big Boss : « approuvé pour OBB »), rejeu de `CheckIntegrity.ps1 -Modules` et du contrôle `rev-parse --show-toplevel` sur le `` (OBB-T1v), tickets du gardien. Limites : un `.git` gitlink (fichier) ou imbriqué dans un module n'est pas exclu ; une future référence (`-InitRef`) ne contiendra plus les lignes `.git` | `git revert` des commits des tickets `OBB-R3` (addon `D:\Game\LifePlay-Sandbox`), `OBB-R4` (addon `D:\Game\LifePlay-Sandbox-5.8`) et `OBB-R5` (jeu) ; avant commit : `.\Tools\Restore.ps1 -Lot OBB-addon` et `-Lot OBB-addon58` (addons), `-Lot OBB -Only .gitignore` et `-Lot OBB -Only Tools\CheckIntegrity.ps1` (jeu), proposés seulement, avec l'accord de l'utilisateur (le manifeste `OBB` contient aussi `Tools\BuildDebug.ps1` et `Tools\SplitModules.ps1` d'OBB-T3 : ne pas les restaurer) | | CHG-303 | 2026-10-10 | STF | `Content/UI/MainMenu.uasset` (12 SpinBox de Settings liées à `GI` par liaison de propriété `Value ← GI.` supprimées avec leur liaison et recréées sous un autre nom, mêmes propriétés et même emplacement, `Value` = défaut GI : ChildGrowthMult → `SpinBoxChildGrowth`, ShadeDepth → `SpinBoxShadeDepth`, SpinBoxBGA → `SpinBoxVolBGA`, SpinBoxMarkerSize → `SpinBoxMapMarkerSize`, SpinBoxMoan → `SpinBoxVolMoan`, SpinBoxPhysicsMult → `SpinBoxPhysics`, SpinBoxSceneFrequency → `SpinBoxSceneFreq`, SpinBoxSexDescription → `SpinBoxSexLineDuration`, SpinBoxSex → `SpinBoxVolSex`, SpinBoxSquirtMult → `SpinBoxSquirt`, SpinBoxUI → `SpinBoxVolUI`, SpinBoxPregnancyTerm → `SpinBoxPregnancyMult` ; les 12 `OnValueChanged` remplacés par `OnValueCommitted` rebranchés sur les chaînes `IsValid → Set` existantes ; MarkerSize : `RetriggerableDelay 2 s → SpawnMapMarkers` suit le `Set` ; ShadeDepth : le matériau de post-traitement suit le `Set` (appliqué en fin de geste, plus d'aperçu pendant le glisser) ; SquirtMult : garde `IsValid` (fonction) + `Branche` ajoutée, GI vide impossible après `Construct`, garde d'uniformité (règle 4 `lp-mcp`) ; `Construct` : 12 `SetValue(GI.)` entre `SpinBoxSexDuration.SetValue` et `UpdateDonors` ; arrondi entier décidé par l'utilisateur pendant le PIE sur `SpinBoxSceneFreq` (Min 0,2 → 1), `SpinBoxMapMarkerSize`, `SpinBoxSexLineDuration` : pas 1, saisie arrondie, 0 décimale) ; `Tools/uasset58.py` (neuf : lecture hors éditeur d'un `.uasset` UE 5.8, commandes `locate`, `events`, `props`) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STF\`, tag `STF-avant`, archive `D:\Game\LifePlay_Build_5.8_STF-STE_Development` ; livrables `etat/ST/STF/` (`STF-SPEC.md` avec § 7 écarts E1-E4, `STF-T1-CART.md`, `STF-T3-IMPL.md`, `STF-T4-PIE.md`, `STF-VAL.md`, `STF-J-BUILD.md`, `STF-J1.md`) | Suite d'ERR-057 : les 12 SpinBox restantes liées à `GI` pouvaient écraser les réglages à chaque ouverture du menu (liaison et `OnValueChanged` exécutés pendant `SynchronizeProperties`) ; désormais `GI` n'est écrit que sur action du joueur. Une seule entrée de lot au lieu de 12 + 1 (STF-SPEC § 4.7). Une valeur de `GI` hors bornes (sauvegarde ancienne, mod) est affichée bornée sans être réécrite tant que le joueur ne valide pas le champ ; une valeur non entière déjà sauvée dans les 3 champs arrondis est affichée arrondie. Constat hors périmètre : `LoadSettings` recharge 9 des 12 réglages depuis `GameSettings.sav` au lancement d'une partie (comportement d'origine). VAL `STF-VAL.md` acceptée avec réserve par l'utilisateur (`CompileAllBlueprints` 418 / 418, 0 erreur, 0 avertissement ; liaisons 31 → 19, aucune vers les 12 variables ; PIE V4-V7) ; preuve en jeu J1 : « J1 fait, tout est conforme » (utilisateur, 2026-10-10) ; `GameSettings.sav` de l'archive : MarkerSize 31, SceneFrequency 18, SexLineDuration 22 (entiers) | `git revert` du commit ; ou `git checkout STF-avant -- Content/UI/MainMenu.uasset` (ticket RESTORE) ; ou `.\Tools\Restore.ps1 -Lot STF` éditeur fermé | | CHG-302 | 2026-10-10 | AG | Addon, deux arbres (`D:\Game\LifePlay-Sandbox-5.8` et `D:\Game\LifePlay-Sandbox`) : `Tools/claude/skills/lp-repo/SKILL.md` (§ 10 Pièges, +3 lignes : commit fautif non poussé corrigé par un nouveau commit ou `git revert`, `--amend` seulement avec l'accord de l'utilisateur, `git status` contrôlé contre la liste du ticket avant tout commit ; tickets AG-R7, AG-R8) ; jeu : `Docs/Registre_Erreurs.md` (ERR-087) ; arbre principal de l'addon : fins de ligne de `Config/DefaultEngine.ini`, `Config/DefaultGame.ini`, `Plugins/LPSandbox/Source/LPAnimMeasure/LPAnimMeasure.cpp` réalignées sur HEAD sans commit (ticket AG-R6) | Incident du gardien sur DOCMV-R3 (`etat/DOC/DOCMV/DOCMV-INT.md` § 3) : 3 fichiers hors ticket emportés par une liste tirée de `git diff --name-only`, corrigé par `--amend` (`d396816` → `cc649fd`, non poussé) ; règle validée par l'utilisateur le 2026-10-10 (« Validate, add to lp-repo ») ; preuve `etat/AG/AG-T8-VAL.md` ; AG-R6 : `ls-files --eol` i/lf w/crlf → i/lf w/lf, MD5 = `git show HEAD:` pour les 3 fichiers, `git diff --ignore-cr-at-eol` vide avant | `lp-repo` 93 → 96 lignes ; ERR-087 — → créé ; 3 fichiers de l'arbre CRLF → LF (contenu identique) | `git revert` des commits des tickets AG-R7 et AG-R8 ; `.\Tools\Restore.ps1 -Lot AG-ERR087 -ProjectRoot D:\Game\LifePlay-Sandbox-5.8` (lp-repo d'avant) ; `.\Tools\Restore.ps1 -Lot AG-R6 -ProjectRoot D:\Game\LifePlay-Sandbox` (fins de ligne CRLF d'avant) ; ligne ERR-087 : `git revert` du commit du ticket AG-R9 | | CHG-301 | 2026-10-10 | OBB | `Tools/CheckPackage.ps1` (neuf, 228 lignes, ASCII, LF : 4 contrôles en lecture seule d'un dossier de build empaqueté, paramètres `-Build`, `-Config Shipping/Development/DebugGame` (déduit de l'exe archivé si absent), `-ProjectRoot` ; (1) `Modules/.git` au manifeste NonUFS et sur disque, (2) `LPSandbox` au manifeste UFS, (3) `LPAnimMeasure` au `.rsp`, (4) `LPSandbox` dans le seul tableau `BuildPlugins` du `.target` ; codes 0 = 4 PASS, 1 = au moins un FAIL, 2 = NON-CONCLUANT sans FAIL, 3 = contrôle impossible ; le `.rsp` et le `.target` du projet ne valent pour le build contrôlé que si l'exe du projet a la même taille et la même date (2 s) que l'exe archivé et que le fichier n'est pas postérieur à cet exe de plus de 10 min, sinon NON-CONCLUANT) ; `Tools/BuildDebug.ps1` (+6 lignes, après la copie des PDB et avant la ligne `archive=` : appel de `CheckPackage.ps1`, tout code différent de 0 arrête le script avec ce code) ; `Tools/SplitModules.ps1` (+7 lignes, avant tout déplacement : code 1 ou 3 = refus par `throw`, code 2 = avertissement et publication poursuivie) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\OBB\manifest.csv`, livrables `etat/OB/OBB/` (`OBB-T3-IMPL.md`, `OBB-T3-VAL.md`, `OBB-T3-DOC.md`) | Exigence B3 / G-OB-7 (`etat/OB/OBA/OBA-T5-EVAL.md` l. 89-98) : le paquet Shipping U8 contenait le dépôt `.git` des modules (142 lignes au manifeste NonUFS) et l'addon `LPSandbox` (1 ligne au manifeste UFS) sans qu'aucun outil ne le signale avant publication. Preuves rejouées par la VAL (`OBB-T3-VAL.md`, verdict PASS) : `Shipping_U8` code 1 (`[1]` FAIL 142, `[2]` FAIL 1, `[3]` et `[4]` NON-CONCLUANT : exe du projet relié à 20:08:50 contre 17:56:48 à l'archive, même taille 164 823 552 o) ; `DC4` avec le projet 5.5 : 4 PASS, code 0 (sans `-ProjectRoot` : code 2, autre taille d'exe) ; `Shipping_AP7` avec le projet 5.5 : `[2]` FAIL 2, `[3]` FAIL 1, `[4]` FAIL 1, code 1 ; `STC_Development` : `[1]` FAIL 142, code 1 ; build inexistant : code 3 ; faux builds jetables : règle des 10 min (9 min PASS, 11 min NON-CONCLUANT), refus de `SplitModules.ps1` prouvé sans déplacement (arbre inchangé). Branchement de `BuildDebug.ps1` : PASS-STATIC (UAT non lancé), analyse syntaxique 0 erreur sur les 3 scripts | 3 fichiers de `Tools` : 1 créé (0 → 228 lignes), `BuildDebug.ps1` 90 → 96 lignes (CRLF gardé), `SplitModules.ps1` 160 → 167 lignes (LF gardé) ; `git diff --stat -- Tools` : 2 fichiers, 13 insertions, 0 suppression. Conséquence : `BuildDebug.ps1` sort en code 1 après l'archivage de tout build tant que `Content\Modules\.git` existe (levé par OBB-T1, suspendue). Limites : (a) les builds Shipping lancés par UAT directement (hors `BuildDebug.ps1`) doivent appeler `CheckPackage.ps1` aussitôt après l'archivage et avant toute recompilation (consigne de skill à venir, `OBB-T3-IMPL.md` Constats 4) ; (b) en publication `[3]` et `[4]` seront souvent NON-CONCLUANT (projet recompilé après l'empaquetage) et ne bloquent pas `SplitModules.ps1` ; (c) un `.git` de sous-module (`Modules//.git`) n'est pas relevé | `git revert` du commit du ticket `OBB-R2` (restitue `BuildDebug.ps1` et `SplitModules.ps1` et retire `Tools/CheckPackage.ps1` de l'arbre suivi) ; hors git : `.\Tools\Restore.ps1 -Lot OBB` (proposé seulement, avec l'accord de l'utilisateur) pour les deux scripts modifiés, et déplacer `Tools\CheckPackage.ps1` vers `D:\Game\LifePlay_Backup_5.5\OBB` (jamais supprimer) | | CHG-300 | 2026-10-10 | DOCMV | **41 fichiers déplacés** (renommages git, contenu identique au déplacement, MD5 contrôlés) : `Docs/Migration/Journal_Modifications.md`, `Registre_Erreurs.md`, `README.md`, `01_Architecture_Initiale.md` à `32_Organisation_Agents.md` → `Docs/` ; `Docs/Migration/correctifs/P01…P06.patch` → `Docs/correctifs/` ; références corrigées : `README.md` racine (12 liens), `Docs/19` (7 liens `../../` → `../`), `Docs/22` l. 7 (lien `Migration/etat/…`), `Docs/05` l. 15, `Docs/08` l. 37 (tableau des dossiers), `Docs/09` l. 92, `Docs/24` l. 409, 411, `Docs/32` l. 129, 274, 285 et § 9, `Docs/29` (méthode et point d'étape), `Docs/README.md` (bandeau, ligne `Migration/etat/`, plage du journal), en-têtes de `Tools/BuildCollections.py`, `CheckIntegrity.ps1`, `ReimportCorrectif.ps1`, `SplitModules.ps1`, `debug/LifePlay_debug_ui.ps1`, archives `etat/U58/U1/U1-MODS-MOTEUR.md` l. 5 et `etat/U58/UA/UA-MODS.md` l. 4 (lien vers le doc 27) ; addon 5.8 (ticket `DOCMV-R2`) : skills `lp-doc`, `lp-lot`, `lp-paths`, `lp-repo`, `lp-build`, `README.md`, `Docs/SB-plan.md`, `Docs/Modding/Creating_Asset_Mods.md`, 7 en-têtes de `Tools/` ; addon 5.5 (ticket `DOCMV-R3`) : les 5 mêmes skills, contenu identique ; hors dépôt : `CLAUDE.md`, agent `lp-writer`, `.cursor/skills/lifeplay-debug-build`, mémoire du projet ; livrables `etat/DOC/DOCMV/` | Décision utilisateur du 2026-10-10 (réponse à Big Boss) : « Déplacer dans Docs\ » ; « Assure-toi que la documentation trace ce changement ». Réponses aux points de la SPEC (`etat/DOC/DOCMV/DOCMV-SPEC.md` § 2) : `correctifs\` « Il monte dans Docs\ » ; en-têtes `Source` « Laisser » ; archives « Corriger les 2 liens seulement » ; addon 5.5 « Inchangé hors skills ». Inventaire `DOCMV-T1-INV.md` (1 190 références relevées, 0 collision dans `Docs\`, aucun outil ne lit ces fichiers hors les commandes de `lp-doc`) ; gel Big Boss `GEL-GO 11:48`, HEAD d'entrée `ee9dce2`, tag `DOCMV-avant` | `Docs/Migration/` : 35 `.md` + `correctifs/` + `etat/` → `etat/` seul ; `Docs/` : 0 → 35 `.md` + `correctifs/` (6). Table ancien → nouveau : `Docs/Migration/.md` → `Docs/.md`, `Docs/Migration/correctifs/` → `Docs/correctifs/`, `Docs/Migration/etat/` inchangé. Non réécrits (décisions) : chemins des entrées passées de ce journal, livrables des lots clos, 11 commentaires de ligne 1 de `Source/LifePlay*/*.h`, 14 commentaires de `Plugins/*/Source` (jeu 2, addon 5.8 12 ; décision « Laisser, comme D2 »), README / Docs / Tools / Plugins de l'addon 5.5 ; la copie 5.5 et `main` ne bougent pas | `git revert` des commits des tickets `DOCMV-R4` (jeu), `DOCMV-R3`, `DOCMV-R2` (addons) ; avant commit : `.\Tools\Restore.ps1 -Lot DOCMV` (remet les 41 fichiers dans `Docs\Migration\`, retire les cibles `Existed=False`), `-Lot DOCMV-addon58`, `-Lot DOCMV-addon55` ; hors dépôt : `D:\Game\LifePlay_Backup_5.5\DOCMV\hors-depot\` (proposé seulement, avec l'accord de l'utilisateur) | | CHG-296 | 2026-10-10 | STC | `Source/LifePlay/LPUserSettings.h`, `.cpp` (neufs : classe `ULPUserSettings`, `UCLASS(config = GameUserSettings)`, `CameraSpeed` = 3 par défaut, entre 1 et 7 ; fonctions Blueprint `ApplyCameraSpeedAtStartup`, `SetCameraSpeed`, `GetCameraSpeed` ; au premier lancement, reprise de `GameSettings.sav` arrondie et bornée ; écriture de l'ini seulement si la valeur change) ; `Source/LifePlay/LPSettingsSubsystem.cpp` (+52 lignes : style lisible appliqué au seul `SliderCameraSpeed`, la valeur n'est jamais touchée) ; `Content/UI/MainMenu.uasset` (SpinBox `SpinBoxCameraSpeed` et `SpinBoxSexDurationMultiplier` retirées avec leurs liaisons de propriété et leurs `OnValueChanged` ; ajout `SliderCameraSpeed` 1 à 7 pas 1 + texte de valeur, écrit seulement sur geste du joueur ; `SpinBoxSexDuration` (max 10) écrit `GI.SexDurationMult` seulement sur `OnValueCommitted` ; `Construct` initialise sans écrire `GI`) ; `Content/BPs/GI.uasset` (`ApplyCameraSpeedAtStartup` `CallFunction_448` inséré après l'appel de `LoadSettings` `CallFunction_1007`) ; hors dépôt : instantanés `D:\Game\LifePlay_Backup_5.5\STC*`, livrables `etat/ST/STC/` (`STC-SPEC.md`, `STC-T3-IMPL.md`, `STC-T5-IMPL-BP.md`, `STC-T6-PIE.md`, `STC-VAL.md`) | ERR-057 (réglages écrasés) et défaut actif de saisie établi en PIE (STC-T1b : taper une valeur dans les champs caméra ou durée écrivait 0,2 dans `GI`, champs à `MaxValue = 0`). Décisions utilisateur : slider caméra 1 à 7, l'ini fait foi et `GameSettings.sav` reste une copie, durée des scènes protégée, 12 autres SpinBox au lot STF. Build `STC_Build_20261010-092036` code 0, 0 erreur ; VAL `STC-VAL.md` PASS (`CompileAllBlueprints` 418 / 418, 0 erreur, 0 avertissement ; `LPTestStringCompat` 3120 / 0 / 60) ; essais PIE V4 à V7 établis ; essai V8 (premier lancement sans ini) et preuve en jeu sur archive : non enregistrés au registre STC à la date du commit. Entrée écrite par l'orchestrateur du lot 29 à la demande de l'utilisateur (« commit stc ») | `git revert` du commit ; ou `.\Tools\Restore.ps1 -Lot STC` éditeur fermé, puis `.\Tools\Build.ps1 -Lot STC` | | CHG-299 | 2026-10-10 | AG | Hors dépôt, `%USERPROFILE%\.claude\skills` (`sk-protocol`, `sk-orchestrate`, `sk-repo`) et `%USERPROFILE%\.claude\agents` ; addon, deux arbres (`D:\Game\LifePlay-Sandbox-5.8` et `D:\Game\LifePlay-Sandbox`) : `Tools/claude/skills/lp-lot`, `lp-doc` (+ `gabarits.md`), `lp-paths` modifiés, `lp-repo` et `lp-mcp` créés (tickets AG-R1 et AG-R2, fusionnés avec ETAT3-R4 et ETAT3-R3, qui portent aussi `lp-build` et `lp-validate` sous CHG-297 / CHG-298) ; jeu : `Docs/Migration/32_Organisation_Agents.md` créé, `etat/BOSS/BOSS-JOURNAL.md` (rôle Big Boss, D-AG10), `.mcp.json` des deux copies réduits au port 8000 (hors git, sauvegardes `.claude\sauvegardes\mcp.json.avant-AG-20261010`) ; ticket AG-R3 | Git réservé au gardien du dépôt, budget de tours par fiche, numéros CHG / ERR / doc réservés, gabarits INT / DOC / EVAL, organisation hiérarchique des agents (doc 32). Chaîne de preuve : `etat/AG/AG-T2-VAL.md` FAIL (écarts E1 à E3) → correction `etat/AG/AG-T1b-IMPL.md` (décision utilisateur « Fix E1+E2+E3 ») → `etat/AG/AG-T2b-VAL.md` PASS (8 paires MD5 égales entre les deux arbres, `git diff` des deux arbres identique, MD5 `7f117a8e…`, fins de ligne LF sans BOM, `lp-mcp` MD5 `35983be2…`). Points restés ouverts à la VAL (non bloquants, à la décision de l'utilisateur) : libellé de `lp-mcp` l. 25 (E3), exception `DC2-BUILD.md` du filtre du hook (R2), hook non installé (`core.hooksPath` inchangé), `lp-build` 148 lignes > 120 (antérieur au lot). Aucune compilation ni test en jeu (documentation d'outillage) | Addon, par arbre : 6 skills suivis modifiés (+93 −57, `git diff --stat`) et 2 créés (`lp-mcp` 62 lignes, `lp-repo` 93 lignes) ; doc 32 et `BOSS-JOURNAL.md` : — → créés ; skills et agents hors dépôt : modifiés (détail `etat/AG/AG-T1-CONCEPTION.md`) | `git revert` des commits des tickets AG-R1 et AG-R2 (attention : ils emportent aussi ETAT3-R4 et ETAT3-R3) et AG-R3 ; instantané `D:\Game\LifePlay_Backup_5.5\AG-fix` (état des skills avant la correction AG-T1b) ; copie des sauvegardes `.mcp.json` ; skills et agents hors dépôt : copies précédentes dans `%USERPROFILE%\Documents\skills` (instantanés BUD1-claude, EDIT2-claude) | | CHG-298 | 2026-10-10 | REPO-MV | `Docs/Migration/etat/REPO/` (neuf dans la copie 5.8 : `NUMEROS.md`, `README.md`, `REPO-JOURNAL.md`, `tickets/*.md` suivis ; `VERROU/` et `hooks/` restent locaux) copié de `D:\Game\LifePlay-master 5.5\Docs\Migration\etat\REPO\` (33 entrées, contrôle octet par octet : 0 écart ; rien supprimé en 5.5, renvoi ajouté à son `LISEZMOI-ARCHIVE.md`) ; chemins du dépôt passés à `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\REPO\` dans les skills `lp-repo` (§ 4), `lp-doc`, `lp-paths` des deux addons (`LifePlay-Sandbox`, cible des jonctions, et `LifePlay-Sandbox-5.8`) et dans l'agent `lp-gardien` (tickets, verrou, livrable INT en chemin absolu 5.8) ; `etat/ST/STC/STC-INT.md` recopié de la 5.5 ; sauvegardes `D:\Game\LifePlay_Backup_5.5\REPO-MV\avant` | Règle de l'utilisateur (2026-10-10, relayée par la session Big Boss) : toute gestion documentaire de lot s'écrit uniquement sous `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\` ; constat Big Boss : 13 fichiers encore écrits dans `etat\REPO\` 5.5 et `STC-INT.md` après le gel ETAT3, à cause des chemins 5.5 de lp-repo, lp-doc, lp-paths et lp-gardien. Recherche finale : 0 référence à `LifePlay-master 5.5\Docs\Migration\etat` dans les skills, agents, `CLAUDE.md`, `AGENTS.md` et `Tools` vivants | `git revert` du commit ; skills et agent : copies de `Backup_5.5\REPO-MV\avant` | | CHG-297 | 2026-10-10 | ETAT3 | `.gitignore` (ligne `/Docs/Migration/etat/` remplacée : `etat/` suivi en texte seul `.md` / `.csv`, `etat/sandbox/DC2/DC2-BUILD.md` exclu car il contient une adresse e-mail) ; `Docs/Migration/etat/` (livrables de lot en `.md` / `.csv`, copiés de la 5.5 par ETAT3-T3, dont `etat/DOC/ETAT3/ETAT3-T6-DOC.md` et `etat/ST/STB/STB-EVAL.md` neufs ; registres `STA-TACHES.md`, `STB-TACHES.md`, `ETAT3-TACHES.md` complétés) ; `Docs/Migration/29_Projet_Stabilisation_V2.md` (chemin des livrables 5.5 → 5.8, section « Point d'étape du 2026-10-10 »), `30_Projet_Audit_Obsolescence.md`, `31_Eval_Methode_Orchestration.md` (chemin 5.5 → 5.8) ; `Registre_Erreurs.md` (ERR-058 à ERR-086) ; `README.md` (plages, ligne `etat/`) ; hors dépôt : `CLAUDE.md` local (exclu par `.git/info/exclude`), agent utilisateur `lp-builder`, skills de l'addon `lp-lot`, `lp-build`, `lp-validate` (nouvel emplacement des livrables) ; numéros réservés dans `etat\REPO\NUMEROS.md` de la 5.5 | décision utilisateur du 2026-10-10 (`etat/DOC/ETAT3/ETAT3-TACHES.md:3-12`) : livrables `etat\` rassemblés dans la copie 5.8 et suivis par git en texte seul, `etat\` 5.5 figé en archive ; inventaire `ETAT3-T1-INV.md` (906 fichiers après copie, 781 candidats au suivi) ; essai `git check-ignore` : `.md` / `.csv` suivis, `.txt` / `.log` ignorés (`ETAT3-TACHES.md:19`) ; journaux synchronisés par ETAT3-T6 : chaque cause R01-R29 (`STA-T2c-DOC.md`), F1-F5 (`STD-SCN-DIAG.md`) et `String_21` reliée à une ligne ERR (29 nouvelles, F5 et STA-D23 = ERR-011) | registre ERR 57 → 86 lignes ; `.gitignore` 1 → 7 lignes ; docs 29-31 : 1 ligne modifiée chacun, doc 29 + 1 section ; README 3 lignes modifiées ; `etat/` : 0 → texte suivi (285 fichiers candidats relevés en T4, `ETAT3-TACHES.md:19`) | jeu : `git revert` du commit du ticket `ETAT3-R` (5.8, `ue5.8`) ; `.gitignore` : reprendre `D:\Game\LifePlay_Backup_5.5\ETAT3\gitignore-avant` ; références hors dépôt : reprendre `D:\Game\LifePlay_Backup_5.5\ETAT3\refs-avant` ; fichiers copiés dans `etat\` 5.8 : déplacer vers `D:\Game\LifePlay_Backup_5.5\ETAT3\` (jamais supprimer) | | CHG-295 | 2026-10-09 | BUD1 | `Docs/Migration/27_Plan_Migration_UE58.md` (§ Orchestration, « Taille des fiches » : budget par niveau et motif), `Tools/FicheStats.py` (niveau lu dans l'en-tête « Niveau Nx », sinon déduit de l'agent et marqué « ? » ; colonne « Niv. » ; options `--budget-turns-n3`, `--budget-peak-n3`), `21_Sandbox_Addon.md` (pin 5.8 `8f6bc11`), README (plage `CHG-295`) ; addon `lot/DC3-atelier` `3d0cb95` et `ue5.8` `8f6bc11` : `Tools/claude/skills/lp-doc/gabarits.md` (registre TACHES : hors budget selon le niveau) ; hors dépôt : `~/.claude/skills/sk-orchestrate/SKILL.md` (rubrique 9 et § Taille) ; instantanés `D:\Game\LifePlay_Backup_5.5\BUD1`, `BUD1-claude`, `BUD1-addon`, `BUD1-addon58` | décision utilisateur du 2026-10-09 (« budget par niveau ») sur les mesures d'OBA (`FicheStats.py --lot OBA`) : les 4 cartographies `lp-cart` N3, déjà découpées par domaine, restaient à 185-234 k et 44-51 tours (5,4 à 7,5 M de jetons, contre 20 à 69 M en U1 / U7). Budget : N0-N2 40 tours, 150 k, 20 min ; N3-N5 60 tours, 250 k, 30 min (la durée de 30 min est un choix de l'orchestrateur, non mesuré). Effet rejoué : OBA 6 → 2 fiches hors budget (OBA-T1 N1 pic 164 k ; OBA-T5 N4 pic 306 k, synthèse lisant tous les comptes rendus) ; U7 6 → 5 (U7-T7 618 k et U7-T6 291 k restent hors budget) | plan 27 : 2 → 7 lignes pour le budget ; `FicheStats.py` 139 → 158 lignes ; `gabarits.md` + 1 ligne ; `sk-orchestrate` 2 lignes modifiées | jeu : `git revert` du commit ; addon : `git revert 3d0cb95` (`lot/DC3-atelier`) et `git revert 8f6bc11` (`ue5.8`) ; hors dépôt : `.\Tools\Restore.ps1 -Lot BUD1-claude -ProjectRoot %USERPROFILE%\.claude` | | CHG-294 | 2026-10-09 | STB-MEN (retour) | `Content/UI/MainMenu.uasset` ramené à son état d'avant CHG-286 (`git checkout 2aa6f64~1 -- Content/UI/MainMenu.uasset`) : l'événement `Event On Initialized` → `Cast To GI` → `Set GI` est retiré ; hors dépôt : instantané de l'état CHG-286 `D:\Game\LifePlay_Backup_5.5\STB-MEN-R` | ERR-057, régression de CHG-286 constatée en jeu (STB-JEU, 2026-10-09, retour utilisateur : caméra environ 10× plus lente, scène sexuelle environ 20× plus rapide avec partenaire). Cause établie par le dump `etat\ST\STB\dumps\MainMenu__EventGraph.txt:275-292, 636-684` : les gestionnaires `OnSpinBoxValueChanged` des réglages (`SpinBoxCameraSpeed` → `GI.CameraSpeed`, `SpinBoxSexDurationMultiplier` → `GI.SexDurationMult`, `SpinBoxSceneFrequency`, `SquirtMult`, etc.) écrivent dans `GI` derrière un `IsValid(GI)` ; ils sont déclenchés par `SynchronizeProperties` (valeur de conception validée par `SSpinBox::SetValue`) avant `Construct`. Avant CHG-286, `GI` y était nul et l'écriture sautée (U8 : `BndEvt__SpinBoxSquirtMult` dans une pile d'`Accessed None` à l'image 0) ; avec `GI` affecté dès `OnInitialized`, les valeurs de conception écrasaient les réglages chargés. R13 / R14 (avertissements de la liaison `Get_SpinBox_0_Value_0`, préexistants depuis 5.5) reviennent ; correctif de remplacement proposé : `IsValid(GI)` dans la liaison, sans changer l'ordre d'initialisation | `.\Tools\Restore.ps1 -Lot STB-MEN-R` éditeur fermé (rétablit CHG-286, déconseillé) | | CHG-293 | 2026-10-09 | EDIT3 | addon `lot/DC3-atelier` `0d2f0d0` et `ue5.8` `4042315` : `Tools/claude/skills/lp-build/SKILL.md` (§ 2 : `LogStats.ps1` prend `-Log`, pas `-Path` ; § 4 : `BuildDebug.ps1` cuit avec `-iterate`, référence ou publication sans `-iterate` ; Shipping sans journal, mesure sur un Development `-skipcook` de même cuisson ; Shipping desktop « installé », `Saved` dans `%LOCALAPPDATA%\LifePlay\Saved`, test isolé par `-UserDir` ; § 8 : `pwsh -File` passe une liste en une seule chaîne, passer par `pwsh -Command`), `Tools/claude/skills/lp-validate/SKILL.md` (§ 5 : `index SPAWN` > 0 avant de mesurer un journal de jeu) ; `Docs/Migration/21_Sandbox_Addon.md` (pin 5.8 `4042315`), README (plage `CHG-293`), `Journal_Modifications.md` (lignes CHG-276 à 279 ramenées aux 6 colonnes de l'en-tête : la colonne d'effet en trop est rattachée à « Raison ») ; hors dépôt : instantanés `D:\Game\LifePlay_Backup_5.5\EDIT3`, `EDIT3-addon`, `EDIT3-addon58` | pièges relevés pendant U8 T2 à T5 (CHG-276), liste « Pièges à reporter dans les skills » de `etat\U58\U8\U8-TACHES.md` ; preuves : `U8-T3-BUILD.md:24,58` (`-Path`, `-Kind` refusé par `ValidateSet`), `U8-T5c-VAL.md:146` (`-Compare`), `U8-T3-BUILD.md:27-31` (`FULL COOK` sans `-iterate`) et `Tools/BuildDebug.ps1:52` (`-iterate`), `Source/LifePlay.Target.cs` (pas de `bUseLoggingInShipping`), `U8-T5a-VAL.md:16` (`App.cpp:218-219`, `-UserDir`), `U8-TACHES.md:15` (1re session T5c, 0 SPAWN, rejetée) ; `lp-build` 133 → 141 lignes, `lp-validate` 93 → 95 | addon : `git revert 0d2f0d0` (`lot/DC3-atelier`) et `git revert 4042315` (`ue5.8`) ; jeu : `git revert` du commit | | CHG-292 | 2026-10-09 | STB-MAP | `Source/LifePlay/LPMapMarkersGuardSubsystem.cpp` (fin de `Guard` : création par `NewObject` du composant de focus invisible `LPFocusWidgetComponent` retirée, 22 → 3 lignes, commentaire de renvoi à CHG-282) ; `Source/LifePlay/LPMapMarkersGuardSubsystem.h` (commentaire d'en-tête mis à jour) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STB-MAP`, fiche `etat\ST\STB\STB-MAP-BUILD.md` | Décision utilisateur C10 (option B) : la lecture de `WidgetComponents[0]` est traitée dans le Blueprint (`FocusOnMapMarkers` teste le tableau, CHG-282) ; le composant à nom fixe recréé sur un composant détruit non encore collecté provoquait des saccades (STA-T2c R29 : 1,77 ms et 11,66 ms en U8). La garde garde le retrait des entrées détruites, la reconstitution depuis les composants existants et la remise à zéro de `Vector2Ds`. Build `STB-MAP_Build_20261009-212857` (lp-builder) : code 0, MSVC 14.50.35717, `LPMapMarkersGuardSubsystem.cpp` compilé, `UnrealEditor-LifePlay.dll` relié, 0 erreur, 0 avertissement compilateur (20 lignes UBT « Plugin 'HyperAIStudio' does not list plugin … » préexistantes) | `git revert` du commit, puis `.\Tools\Build.ps1 -Lot STB-MAP` | | CHG-291 | 2026-10-09 | STB-SEX | `Content/UI/SexInterface.uasset`, EventGraph : branche `K2Node_IfThenElse_2` sur `IsValidIndex(GI.SexPersons, Array Index)` (`K2Node_CallArrayFunction_2`) entre `LoopBody` de la boucle sur les 5 jauges `SOE0..4` (`MacroInstance_1`) et la macro `IsValid` (`MacroInstance_2`) ; hors bornes → `VariableSet_1` (jauge masquée, chemin « Is Not Valid » existant) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STB-SEX` | STA-T2c R26 (VILLE K6, 3 événements U8, conditionnel D9) : le dump `SexInterface__EventGraph.txt:200-270` confirme le mécanisme (`SexPersons[i]` lu pour i = 0 à 4 ; avec 2 participants, i = 2 à 4 hors bornes rendent None, la jauge est masquée). Même résultat, sans les lectures hors bornes. Par MCP (outils Epic : `create_node` ×2, `break_pins`, `connect_pins` ×6), liaisons relues par `get_node_infos`, `compile_blueprint` + `hyper_blueprint_debug_inspect` : à jour, 0 diagnostic (5 graphes, 124 nœuds) | `git revert` du commit, ou `.\Tools\Restore.ps1 -Lot STB-SEX` éditeur fermé | | CHG-290 | 2026-10-09 | STB-GIC | `Content/BPs/GI.uasset` : fonction `determinePersonVars` (branche `K2Node_IfThenElse_7` sur `IsValid(currentMatchRace)` (`K2Node_CallFunction_32`) entre l'entrée et `getRace` ; non valide → `VariableSet_27` (`Dice`), `getRace` et `getEthnicity` sautés) ; fonction `clearScenePersons` (`CumOn(['Clear'])` `CallFunction_4` réduit à `PlayerCharacter` ; puis `K2Node_IfThenElse_6` sur `IsValid(Companion)` → nouveau `CumOn` `K2Node_CallFunction_6`, et `K2Node_IfThenElse_7` sur `IsValid(Interacting)` → nouveau `CumOn` `K2Node_CallFunction_15`, avant `CallFunction_5`) ; EventGraph : `clearDaily` `CallFunction_864` réduit à `PlayerCharacter`, puis `K2Node_IfThenElse_206` sur `IsValid(Interacting)` (`K2Node_CallFunction_432`) → nouveau `clearDaily` `K2Node_CallFunction_435`, les deux chemins vers `MacroInstance_53` ; `PlayIdle` du partenaire (`CallFunction_866`) derrière `K2Node_IfThenElse_207` (même `IsValid`) ; `PlayDaily` `CallFunction_863` réduit à `PlayerCharacter`, puis `K2Node_IfThenElse_208` sur `IsValid(Interacting)` (`K2Node_CallFunction_438`) → nouveau `PlayDaily` `K2Node_CallFunction_441` (même `Anim`), les deux chemins vers `IfThenElse_511` ; `PerTick` : `K2Node_IfThenElse_209` sur l'`IsValid(Interacting)` existant (`CallFunction_952`) avant `VariableSet_339` ; non valide → nouveau `Set PerTick` (`K2Node_VariableSet_392`) = `SelectInt(12, 3, nuit)` (`K2Node_CallFunction_445`, condition `CallFunction_950`), sans lire `Interacting.Valid` ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STB-GIC` | STA-T2c R15 (30 événements U8 : `currentMatchRace` nul par conception, déjà testé plus loin), R09 (4 : `Companion` et `Interacting` nuls en fin de scène sans compagnon ni partenaire), R05 (7 : `Interacting` nul quand le joueur agit seul ; le `BooleanAND_91` pur lisait `Interacting.Valid` même quand le `IsValid` voisin était faux). Les appels à cible multiple exécutent chaque cible dans l'ordre : le joueur d'abord, puis la cible valide, comme avant. Conditionnels R06-R08, R10 non traités (à trancher, D11 / E4 / E5). Par MCP (outils Epic : `create_node` ×18, `set_pin_value` ×2, `break_pins` ×10, `connect_pins` ×45), liaisons relues par `get_node_infos`, `compile_blueprint` + `hyper_blueprint_debug_inspect` : à jour, 0 diagnostic (EventGraph 6 216 nœuds, `clearScenePersons` 56, `determinePersonVars` 114) | `git revert` du commit, ou `.\Tools\Restore.ps1 -Lot STB-GIC` éditeur fermé | | CHG-289 | 2026-10-09 | STB-ROO | `Content/BPs/Room.uasset`, fonction `pickPresetWorld` : branche `K2Node_IfThenElse_1` sur `IsValidIndex(BuildingPoints, 1)` (`K2Node_CallArrayFunction_0`, soit au moins 2 points) entre `VariableSet_1` (`len`) et `VariableSet_2` ; vrai → chemin existant (graine tirée des 2 premiers points) ; faux → nouveau `Set string` (`K2Node_VariableSet_0`) = `Strings[0]` (`GetArrayItem_3`) → `PrintString` existant → `FunctionResult_0` ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STB-ROO` | STA-T2c R24 (STA-T2b-VILLE K3 : `BuildingPoints[0]` et `[1]` lus sur un tableau vide quand le joueur est dans la rue, 4 événements U8, 10 en référence). Avec un tableau vide la graine valait 0 et le préréglage retenu était déjà `Strings[0]` (`street___vin01`) : même résultat, sans les lectures hors bornes. Risque voisin non traité (non observé) : `len = 0` (aucun préréglage pour l'amenity). Par MCP (outils Epic : `create_node` ×3, `set_pin_value`, `break_pins`, `connect_pins` ×8), liaisons relues par `get_node_infos`, `compile_blueprint` + `hyper_blueprint_debug_inspect` : à jour, 0 diagnostic (39 graphes, 2 030 nœuds) | `git revert` du commit, ou `.\Tools\Restore.ps1 -Lot STB-ROO` éditeur fermé | | CHG-288 | 2026-10-09 | STB-SMS | `Content/BPs/StreetMap_Static.uasset` : fonction `SearchByAmenitySafe` (`IsValid(GI.CurrentCityExpansion)` `K2Node_CallFunction_8` ; branche `K2Node_IfThenElse_7` après `IfThenElse_5.then` : valide → `VariableSet_3` (recherche dans l'extension), non valide → `IfThenElse_2` (repli existant sur la ville principale) ; branche `K2Node_IfThenElse_8` après `IfThenElse_5.else` : valide → `IfThenElse_6`, non valide → `FunctionResult_0` (bâtiments de la ville principale)) ; fonction `findNearbyBuilding` (`IsValid` `K2Node_CallFunction_7`, branche `K2Node_IfThenElse_8` sur `IfThenElse_0.else` : valide → `VariableSet_2`, non valide → `IfThenElse_4`, passage au second tour sur la ville principale) ; EventGraph, événement `PlayBGA` (`IsValid(BGA)` `K2Node_CallFunction_144` ; `K2Node_IfThenElse_38` après `IfThenElse_22.then` : non valide → `SwitchString_3` ; `K2Node_IfThenElse_39` après `IfThenElse_22.else` : valide → `Stop` (`CallFunction_134`), non valide → fin ; `K2Node_IfThenElse_40` devant `Stop` (`CallFunction_124`, deux entrées `SwitchString_3.Default` et `IfThenElse_21.then`) : non valide → `SpawnSound2D` (`CallFunction_110`)) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STB-SMS` | STA-T2c R22 (`CurrentCityExpansion` lu sans test : 9 événements U8, 16 en référence, dont 2 dans `findNearbyBuilding`) et R23 (`BGA` nul ou détruit : 5 + 4 « pending kill »). Chaque cas non valide reprend le chemin que l'exécution suivait déjà avec la référence nulle (tableau vide → repli sur la ville principale ; `Stop` sur rien → son lancé quand même), sans la lecture fautive. Par MCP (outils Epic : `create_node` ×9, `break_pins` ×7, `connect_pins` ×27), liaisons relues par `get_node_infos`, `compile_blueprint` + `hyper_blueprint_debug_inspect` : à jour, 0 diagnostic (21 graphes, 1 701 nœuds) | `git revert` du commit, ou `.\Tools\Restore.ps1 -Lot STB-SMS` éditeur fermé | | CHG-287 | 2026-10-09 | STB-GIB (données) | `Content/Modules/Clothes4.txt` (hors dépôt : `/Content/Modules/` ignoré par `.gitignore:77`) : espace final retiré sur 12 lignes (62, 193, 225, 295, 369, 437, 623, 711, 731, 746, 835, 855 ; jetons `Sports `, `Asian `, `ParUn `, `Waist `, `Outerwear `, `Foot `, `Accessory `, `Neck `), fins de ligne CRLF conservées, 39 931 → 39 919 octets ; instantané `D:\Game\LifePlay_Backup_5.5\STB-GIB` (empreinte avant `4C14EF29E24E40417290EE0BDF801AB0`) | `STB-GIB-DATA-INV.md` : le dernier jeton de ces lignes garde l'espace final, et un test d'égalité comme `Array_Contains 'sports'` (EventGraph de GI, dump `EG:28783-28787`) peut le manquer. Décision utilisateur du 2026-10-09 (« oui pour les 2 ») : (1) pas de correction de données pour les 570 lignes à 3 champs (champ facultatif, lu sans avertissement depuis CHG-283) ; (2) retrait des 12 espaces finaux. Contrôle : 0 ligne finissant par une espace après la modification. Effet en jeu à confirmer en STB-JEU | `.\Tools\Restore.ps1 -Lot STB-GIB -Only Content\Modules\Clothes4.txt` | | CHG-286 | 2026-10-09 | STB-MEN | `Content/UI/MainMenu.uasset` (EventGraph : nouvel événement `Event On Initialized` (`K2Node_Event_0`) → `Cast To GI` (`K2Node_DynamicCast_1`, objet `GetGameInstance`) → `Set GI` (`K2Node_VariableSet_27`) ; l'affectation existante dans `Event Construct` est conservée, elle réaffecte la même valeur) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STB-MEN` | STA-T2c R13 (30 événements U8) et R14 (2) : la liaison `Get_SpinBox_0_Value_0` est évaluée par `SynchronizeProperties` avant `Construct` (`SpinBox.cpp:120-122`, `UserWidget.cpp:1231-1234`, STA-T2b-GIVAR), donc avec `GI` encore vide ; `OnInitialized` s'exécute dès `CreateWidget`, avant la synchronisation. Décision C6 = A (orchestrateur, recommandation GIVAR). Par MCP (outils Epic : `create_node` ×4, `connect_pins` ×4), liaisons relues, `compile_blueprint` + `hyper_blueprint_debug_inspect` : à jour, 0 diagnostic (EventGraph 398 nœuds) | `git revert` du commit, ou `.\Tools\Restore.ps1 -Lot STB-MEN` éditeur fermé | | CHG-285 | 2026-10-09 | STB-PEB | `Content/BPs/Person.uasset`, fonction `assignHome` : le `BooleanAND` (`Prefix == 'F'` ET `FamilyLiveWiths[SaveSlot]`, évalué en entier) est supprimé et remplacé par une cascade `K2Node_IfThenElse_4` (`Prefix == 'F'`) → `K2Node_IfThenElse_10` (`IsValidIndex(FamilyLiveWiths, SaveSlot)`, `K2Node_CallArrayFunction_0`) → `IfThenElse_1` (valeur lue directement), chaque cas faux vers `IfThenElse_3` comme avant ; branche `K2Node_IfThenElse_11` sur `IsValidIndex(Buildings, 0)` (`K2Node_CallArrayFunction_5`) entre `SearchByAmenitySafe` et `Map_Add(AI_Homes)` : liste vide → rien n'est écrit ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STB-PEB` | STA-T2c R20 (2 événements U8 : lecture de `FamilyLiveWiths` vide même quand `Prefix` ≠ `F`, résultat inchangé) et R21 (2 : domicile vide écrit dans `AI_Homes`) ; décision utilisateur C8 : ne rien écrire quand la recherche de domicile échoue. Par MCP (outils Epic : `create_node` ×5, `delete_node`, `break_pins` ×2, `connect_pins` ×15), liaisons relues par `get_node_infos`, `compile_blueprint` + `hyper_blueprint_debug_inspect` : à jour, 0 diagnostic (`assignHome` 82 nœuds) | `git revert` du commit, ou `.\Tools\Restore.ps1 -Lot STB-PEB` éditeur fermé | | CHG-284 | 2026-10-09 | STB-PEA | `Content/BPs/Person.uasset` : fonction `standIdle` (branche `K2Node_IfThenElse_7` sur `IsValid(Near)` (`K2Node_CallFunction_18`) entre `SetDest` et `SetNearVec` ; non valide → boucle `ForEachLoopWithBreak` directement ; branche `K2Node_IfThenElse_8` sur `IsValidIndex(Room.Standspots_Occupied, Array Index)` (`K2Node_CallArrayFunction_2`) entre le corps de boucle et la macro `IsValid` ; hors bornes → `Knot_1`, l'emplacement est libre comme avant) ; EventGraph : `SelectVector` pur (`K2Node_CallFunction_998`, supprimé) remplacé par une cascade d'exécution avant `SetActorRotation` (`K2Node_CallFunction_442`) : `IsValid(HeadtrackStatic)` → `HeadtrackAimLocation` = position du composant ; sinon `IsValid(HeadtrackTarget)` → position de `CenterBrow` ; sinon rotation sautée (vers `VariableSet_230`) ; nouvelle variable membre `HeadtrackAimLocation` (Vector) lue par `FindLookAtRotation` ; branche `K2Node_IfThenElse_149` sur `IsValid(OccupyingFnt)` avant `IfThenElse_75` (faux → rien, comme le `else` vide d'origine) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STB-PEA` | STA-T2c R16 (56 événements U8), R17 + R18 (17), R19 (10), R27 (15) ; décision utilisateur C7 : sauter la rotation quand aucune cible n'est valide (auparavant orientation vers l'origine du monde, estimé). Le `SelectVector` évaluait ses deux entrées (lecture de la référence nulle). Par MCP (outils Epic : `add_struct_variable`, `create_node` ×12, `delete_node`, `break_pins` ×6, `connect_pins` ×25), liaisons relues par `get_node_infos`, `compile_blueprint` + `hyper_blueprint_debug_inspect` : à jour, 0 diagnostic (EventGraph 3 684 nœuds, `standIdle` 93) | `git revert` du commit, ou `.\Tools\Restore.ps1 -Lot STB-PEA` éditeur fermé | | CHG-283 | 2026-10-09 | STB-GIB (2/2) | `Source/LifePlay/LPStringCompat.h`, `.cpp` (nouvelle fonction BlueprintPure `GetStringAtOrEmpty(Array, Index)` : élément ou chaîne vide, sans avertissement) ; `Content/BPs/GI.uasset` (EventGraph : `K2Node_GetArrayItem_65` (index 3, champ 4 de `Modules/Clothes4.txt`) remplacé par `GetStringAtOrEmpty` `K2Node_CallFunction_423` ; `K2Node_GetArrayItem_56` et `_58` (index 1, lignes de `Modules/MorphTags/.txt`) remplacés par `K2Node_CallFunction_426` et `_429`) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STB-GIB`, fiches `etat\ST\STB\STB-GIB-BUILD.md`, `STB-GIB-DATA-INV.md` | STA-T2c R03 (570 événements U8) et R04 (60) : `STB-GIB-DATA-INV.md` établit que les 570 lignes de `Clothes4.txt` à 3 champs (sur 957) et les 60 lignes sans `': '` des fichiers `MorphTags` (falseBodies 12, falseSexies 28, trueBodies 12, trueSexies 8) sont valides : le dernier champ est facultatif. Le défaut est la lecture sans test de longueur ; une branche aurait supprimé ces éléments du jeu, d'où la fonction qui rend la même valeur qu'aujourd'hui (chaîne vide) sans l'avertissement. Données non modifiées (correction de données en attente de décision utilisateur, la proposition C3 reposant sur des lignes supposées fautives). Build `STB-GIB_Build_20261009-205342` : code 0, 0 erreur, 0 avertissement compilateur, 3 unités ; `LPTestStringCompat` : 3120 / 0 / 60, code 0. Par MCP : 3 `create_node`, 3 `set_pin_value`, 3 `delete_node`, 6 `connect_pins`, liaisons relues, `compile_blueprint` + `hyper_blueprint_debug_inspect` : à jour, 0 diagnostic (6 206 nœuds) | `git revert` du commit, puis `.\Tools\Build.ps1 -Lot STB-GIB` | | CHG-282 | 2026-10-09 | STB-GIB (1/2) | `Content/BPs/GI.uasset` : fonction `clearVariable` (branche `K2Node_IfThenElse_3` sur `IsValidIndex(Person, 0)` (`K2Node_CallArrayFunction_0`) entre `GetVariable` et la suite ; tableau vide → fin) ; EventGraph, événement `FocusOnMapMarkers` (branche `K2Node_IfThenElse_205` sur `IsValidIndex(MapMarkers.WidgetComponents, 0)` (`K2Node_CallArrayFunction_115`) : vrai → `SetInputModeGameAndUI` existant avec le widget ; faux → nouveau `SetInputModeGameAndUI` (`K2Node_CallFunction_412`) sans widget, même contrôleur, mêmes options) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STB-GIA` (GI avant STB) | STA-T2c R12 (GIVAR F1 + VILLE K4 : `Person[0]` lu sur un tableau vide, 72 + 39 événements U8, un appel ne fait rien quand le tableau est vide) et R28 / R11 (VILLE K8, GIUBER : `WidgetComponents[0]` lu avant la création du composant de focus, 1 + 1 ; décision utilisateur C10 : correction en Blueprint, la création du composant par la garde C++ sera retirée en STB-MAP). Par MCP (outils Epic : `create_node` ×5, `break_pins` ×2, `connect_pins` ×10), liaisons relues par `get_node_infos` (tableaux typés `Person` et `Widget Component`), `compile_blueprint` + `hyper_blueprint_debug_inspect` : à jour, 0 diagnostic (`clearVariable` 32 nœuds, EventGraph 6 206). Reste STB-GIB (2/2) : R03 / R04 (lecture d'un champ absent dans les données de vêtements et d'étiquettes) | `git revert` du commit | | CHG-281 | 2026-10-09 | STB-GIA | `Content/BPs/GI.uasset` (EventGraph : appel `ConsolidateBeautyStandards` ajouté dans l'événement `LoadSettings` après `loadAverageAttractiveness` (nœud `K2Node_CallFunction_391`, avant `SetSquirtMult`) et dans `PopulateRaws` après `PopulateBeautyStandardsDefault` (`K2Node_CallFunction_406`, avant `FillPregnancyMorphs`)) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STB-GIA` (SHA256 avant `50174D90…`), dump nommé `Saved/Logs/portage/STB-GIA_LPDumpFunction_20261009-204233.log` | défaut STA-T2b-BEAUTE (R01, porte G-ST) : la table `BeautyStandards` n'était remplie qu'à l'ouverture de la création de personnage, des contacts ou d'une scène ; les PNJ générés avant (Continuer, ville) lisaient `Floats_3` vide : 2 591 « index hors bornes » par session U8 et âge / ethnie / attractivité non tirés (effet en jeu estimé). `ConsolidateBeautyStandards` repart de `BeautyStandards_Default` puis applique `BeautyStandards_Custom` (dump STA-T2a2) ; ordre établi dans `LoadSettings` (dump nommé, STB-T0) : `PopulateRaws` (valeurs par défaut) étape 7, `BeautyStandards_Custom` étape 54, `loadAverageAttractiveness` étape 55, d'où l'insertion après 55 ; second appel dans `PopulateRaws` pour la fermeture du gestionnaire de mods. Par MCP (outils Epic : `create_node` ×2, `break_pins` ×2, `connect_pins` ×4), liaisons relues par `get_node_infos`, `compile_blueprint` + `hyper_blueprint_debug_inspect` : à jour, 0 diagnostic sur 6 203 nœuds. Preuve en jeu à faire (STB-JEU : `array Floats_3` → résidu R02 seulement) | `git revert` du commit, ou `.\Tools\Restore.ps1 -Lot STB-GIA` éditeur fermé | | CHG-280 | 2026-10-09 | STB-T0 | `Source/LifePlayEditorTools/LPDumpFunctionCommandlet.cpp` (3 includes `K2Node_CustomEvent.h`, `K2Node_Event.h`, `K2Node_MacroInstance.h` ; `DescribeNode` nomme les événements personnalisés, les événements et les macros) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STB-T0`, fiche `etat\ST\STB\STB-T0-BUILD.md` (copie 5.5) | décision utilisateur C4 (porte G-ST, lot de corrections STB) : les dumps de STA-T2b ne nommaient pas les événements de l'EventGraph, d'où des rattachements nœud ↔ événement estimés. Build `STB-T0_Build_20261009-203918` : code 0, 0 erreur, 0 avertissement compilateur (20 avertissements UBT de dépendances de HyperAIStudio, déjà présents), 1 unité, `UnrealEditor-LifePlayEditorTools.dll` liée ; essai `LPDumpFunction -BP=MainMenu -Fn=EventGraph` : 5 lignes `evenement personnalise`, 53 `evenement`, 21 `macro` (ex. `evenement 'Construct'`, `evenement personnalise 'CloseSelf'`). Format des dumps : seule la colonne de description des nœuds d'événement et de macro change (auparavant le nom de classe) | `git revert` du commit, puis `.\Tools\Build.ps1 -Lot STB-T0` | | CHG-279 | 2026-10-09 | U8-ADDON | `LifePlay.uproject` (entrée `LPSandbox` : + `"TargetAllowList": ["Editor"]`), `Docs/Migration/21_Sandbox_Addon.md` (registre : addon dans le jeu coché ; + 2 reports : `.git` de `Content/Modules` embarqué, référence `2026.10.2.0` et archives de mods à refaire), README (plage `CHG-279`) ; hors dépôt : `D:\Game\LifePlay-master 5.5\Docs\Migration\etat\U58\U8\U8-ADDON-T1-BUILD.md`, `U8-TACHES.md` (constat) ; instantané `D:\Game\LifePlay_Backup_5.5\U8-ADDON` | constats OBA-T23 (`etat/OB/OBA/OBA-T23-PROJ-CART.md`) transmis par les sessions « Lot 29 » et « Commençons U7 », vérifiés en lecture sur les archives U8 et V2.0 (`.git` 431 Mo / 142 fichiers et 1 ligne `LPSandbox` au manifeste UFS dans les trois) ; la copie 5.5 a le même `.uproject` (`AdditionalPluginDirectories` + `LPSandbox` `Optional`) : V1.5 n'embarquait pas l'addon parce qu'il était construit sans lui (doc 24:95 « absent = ignoré »). Décision utilisateur 2026-10-09 : « éditeur seulement » (plutôt que retirer le répertoire ou une procédure de build). Contrôles : aucun asset de `Content` (9 070, suivis ou non, `grep -rlF`, témoin `/Script/ModdingExtra` = 12) ne référence `/Script/LPSandbox`, `/Script/LPAnimMeasure`, `/Script/LPModTools` ; `TargetAllowList [Editor]` déjà effectif pour les plugins MCP (absents du manifeste Shipping U8) ; U8-ADDON-T1 (lp-builder) : Shipping code 0, 0 / 0, makefile recréé, `.rsp` `LPAnimMeasure` 1 → 0. Le grep de l'outil Grep avait sauté les dossiers ignorés (CHG-278) : contrôle refait par `grep` ; `LPSandbox` lié au jeu → éditeur seulement ; doc 21 : 1 report coché, 2 ajoutés | `git revert` du commit ; ou `.\Tools\Restore.ps1 -Lot U8-ADDON -Only LifePlay.uproject` (proposé, jamais lancé sans accord) puis recompiler | | CHG-278 | 2026-10-09 | EDIT1 | hors dépôt : `~/.claude/skills/sk-protocol/SKILL.md` (§ 7 : Grep depuis la racine d'un dépôt saute les dossiers ignorés par git ; les chercher par `path`) ; README (plage `CHG-278`) ; instantané `D:\Game\LifePlay_Backup_5.5\EDIT1b` (`manifest.md5`) | signalement de la session du lot 29 (sous-agent : plugins ignorés invisibles à Grep), reproduit le 2026-10-09 sur la copie 5.8 : `Grep McpAutomationBridgeSubsystem` depuis la racine → aucun fichier, alors que `Grep Resolve-LPEtatDir` depuis la racine trouve 3 fichiers suivis et que `Grep class` avec `path` = `Plugins/McpAutomationBridge` trouve 1 589 occurrences dans 437 fichiers ; dossiers ignorés vérifiés par `git check-ignore` (`.gitignore:41` pour `McpAutomationBridge`, `.git/info/exclude:15` pour `Plugins/Marketplace` dont HyperAIStudio, plus `Saved`, `Content/Modules`, `Mods`, `Docs/Migration/etat`) ; accord utilisateur ; `sk-protocol` 59 → 62 lignes | hors dépôt : recopier `D:\Game\LifePlay_Backup_5.5\EDIT1b\skills\sk-protocol\SKILL.md` vers `~/.claude/skills/sk-protocol/` ; jeu : `git revert` du commit | | CHG-277 | 2026-10-09 | EDIT2 | addon `lot/DC3-atelier` `3ee14bc` et `ue5.8` `ec23fad` : `Tools/claude/skills/lp-doc/gabarits.md` (livrable rédigé en entier puis un seul Write) ; `Docs/Migration/21_Sandbox_Addon.md` (pin 5.8 `ec23fad`), README (plage `CHG-277`) ; hors dépôt : `~/.claude/skills/sk-protocol/SKILL.md` (§ 7 : règle « agent sans Edit »), `~/.claude/agents/` `lp-builder`, `lp-cart`, `lp-inventory`, `lp-validator` (une ligne chacun, frontmatter inchangé) ; instantanés `D:\Game\LifePlay_Backup_5.5\EDIT2`, `EDIT2-claude`, `EDIT2-addon`, `EDIT2-addon58` | signalement utilisateur (« No such tool available: Edit », sortie d'agent). Transcriptions : 29 appels Edit refusés dans 9 sous-agents sans Edit, dont 8 sur leur propre livrable (`U8-T1-CART.md` 9, `U8-T5c-VAL.md` 6, `U7-T8b-BUILD.md` 5, `TPL1-VAL.md` 3…) ; 7 dans 3 agents avant EDIT1 (16 h 39), 22 dans 6 agents après. Cause : `sk-protocol` § 7 (EDIT1, CHG-267) prescrit Edit à tous les agents alors que l'architecture retire Edit aux agents d'audit, de compilation et de validation (synthèse 28 § 5.2), et les gabarits TPL1 (CHG-274) incitent à retoucher le livrable. Décision utilisateur : option 1, garder le retrait d'Edit et préciser la consigne ; `sk-protocol` 55 → 59 lignes ; 4 agents + 1 ligne ; `gabarits.md` + 1 ligne | addon : `git revert 3ee14bc` (`lot/DC3-atelier`) et `git revert ec23fad` (`ue5.8`) ; jeu : `git revert` du commit ; hors dépôt : `.\Tools\Restore.ps1 -Lot EDIT2-claude -ProjectRoot %USERPROFILE%\.claude` | | CHG-276 | 2026-10-09 | U8 | `Docs/Migration/21_Sandbox_Addon.md` (report U6 cuisson à froid coché ; notes U8 sur hitchs `MapMarkers_C` et PDB ; + 1 report U8 : dossier `Saved` du Shipping), `29_Projet_Stabilisation_V2.md` (STM-T4c : preuve en jeu PASS avec réserve ; défauts connus + 2 lignes), `27_Plan_Migration_UE58.md` (§ U8 : résultat T2 à T5), README (plage `CHG-276`) ; hors dépôt : livrables `D:\Game\LifePlay-master 5.5\Docs\Migration\etat\U58\U8\U8-T2-BUILD.md`, `U8-T3-BUILD.md`, `U8-T4-BUILD.md`, `U8-T5a-VAL.md`, `U8-T5b-BUILD.md`, `U8-T5c-VAL.md`, `U8-TACHES.md` ; archives `D:\Game\LifePlay_Build_5.8_Shipping_U8` (+ `_PDB`, `_essai`), `D:\Game\LifePlay_Build_5.8_Development_U8` (+ `_essai`) ; `Saved\Cooked\Windows` précédent déplacé vers `D:\Game\LifePlay_Backup_5.5\U8\Cooked_Windows_avant-T3` | U8 T2 à T5 sans publication (CHG-275). T2 (lp-builder) : Shipping code 0, 0 / 0, 57 s. T3 (lp-builder) : cuisson complète sans `-iterate`, `FULL COOK`, 8 923 paquets, 0 / 0, 164 s. T4 (lp-builder, hors budget) : UAT `-skipcook` code 0, 2 220 fichiers, exe = `Binaries` au SHA-256, PDB et `BUILD-ID.txt` à part. T5 redéfinie par l'utilisateur (le Shipping n'écrit pas de journal) : T5a smoke Shipping joué par l'utilisateur, PASS, sauvegardes réelles intactes (72 / 72 fichiers, isolement `-UserDir`) ; T5b (lp-builder) archive Development, `.ucas` identique au Shipping ; T5c (lp-validator, hors budget) : `ContactMenu` 63 → 0 (PASS avec réserve d'exposition), `Accessed None` 364 → 223, hitchs `MapMarkers_C` 4 → 2, rafale `Floats_3` nouvelle (2 591, portée au doc 29). Première session T5c (71 s, 0 SPAWN) rejetée par l'orchestrateur et rejouée ; report cuisson à froid ouvert → coché ; STM-T4c « reste à prouver » → PASS avec réserve ; doc 29 : défauts + 2 ; doc 21 : reports + 1 | `git revert` du commit ; `Saved\Cooked\Windows` : déplacer `D:\Game\LifePlay_Backup_5.5\U8\Cooked_Windows_avant-T3` en retour (après avoir mis de côté la cuisson U8) ; archives : les déplacer vers `D:\Game\LifePlay_Backup_5.5\U8` | | CHG-275 | 2026-10-09 | U8 | `Docs/Migration/27_Plan_Migration_UE58.md` (§ U8 : paragraphe « Reprise partielle »), README (plage `CHG-275`) ; hors dépôt : `D:\Game\LifePlay-master 5.5\Docs\Migration\etat\U58\U8\U8-SUIVI.md` (décisions), `U8-TACHES.md` (nouveau, registre au gabarit TACHES) | décisions utilisateur du 2026-10-09 : « reprenons u8 », puis, l'orchestrateur ayant rappelé que G-ST et OB ne sont pas atteintes (docs 29 et 30 en phase 0), choix « U8 T2-T5 sans publier » (report SEQ1 / CHG-269 levé pour T2 à T5 seulement, T6 à T11 différées) et choix A de U8-T1 § 4 (garder la référence `2026.10.2.0` : cuisson sans `-createreleaseversion`, dossier d'archive neuf). T1 non rejouée : `git diff --stat 04cdc22..HEAD -- . ':!Docs'` = `Tools/FicheStats.py` seul (non cuit) | plan 27 § U8 : T2 à T5 différées → autorisées sans publication | `git revert` du commit ; livrables hors dépôt : les déplacer vers `D:\Game\LifePlay_Backup_5.5\U8` | | CHG-274 | 2026-10-09 | TPL1 | `Tools/FicheStats.py` (nouveau : mesures par fiche de sous-agent depuis les transcriptions, tableau Markdown pour le registre, codes 0 / 1 / 2), `Docs/Migration/29_Projet_Stabilisation_V2.md` (STA = lot d'essai des gabarits, indicateurs de comparaison), `21_Sandbox_Addon.md` (pin 5.8 `1b766c2`), README (plage `CHG-274`) ; addon `lot/DC3-atelier` `08d3c7c` et `ue5.8` `1b766c2` : `Tools/claude/skills/lp-doc/gabarits.md` (gabarits à remplir INV, CART, DIAG, SPEC, IMPL, BUILD, VAL, DOC, INT, EVAL, registre TACHES), `lp-doc/SKILL.md` (renvoi) ; hors dépôt : `~/.claude/skills/sk-orchestrate/SKILL.md` (§ 3 fiche d'entrée en bloc à remplir, § 4 registre et contrôle des sections), `~/.claude/agents/` `lp-builder`, `lp-cart`, `lp-impl`, `lp-impl-max`, `lp-inventory`, `lp-validator`, `lp-writer`, `opus-xhigh`, `opus-max`, `fable-top` (gabarit de sortie, une à trois lignes chacun) ; livrables `D:\Game\LifePlay-master 5.5\Docs\Migration\etat\TPL1\TPL1-TACHES.md`, `TPL1-VAL.md` ; instantanés `D:\Game\LifePlay_Backup_5.5\TPL1`, `TPL1-claude`, `TPL1-addon`, `TPL1-addon58` | proposition du 2026-10-09 acceptée par l'utilisateur (« on essaie ça ») : en-tête imposé 63 % → 97 % de conformité (doc 31 § 3) ; gabarits de sortie jusque-là squelettes non préchargés ; pas de registre des tâches par lot (U7 : nommage hétérogène, `U7-SUIVI.md` improvisé). VAL `lp-validator` (première fiche au nouveau gabarit) : PASS avec écarts E1 / E2 (chemins du gabarit non uniformes), corrigés ensuite ; avis du validateur repris (critère 8 sans répéter 4, « modèle utilisé » = environnement, en-tête de fiche de lot, formule « sans objet »). `FicheStats.py --lot U7` : 16 fiches, 6 hors budget, U7-T7 69,8 M (cohérent avec `Saved/STAT1/heavy2.py`) ; `--lot U8` : U8-T1 (Sonnet) déjà hors budget (59 tours, pic 243 k) | — → créé (`FicheStats.py`, 139 lignes ; `gabarits.md` 33 → 72 lignes) ; `sk-orchestrate` 43 → 57 lignes ; agents + 2 à 3 lignes | jeu : `git revert` du commit ; addon : `git revert 08d3c7c` (`lot/DC3-atelier`) et `git revert 1b766c2` (`ue5.8`) ; hors dépôt : `.\Tools\Restore.ps1 -Lot TPL1-claude -ProjectRoot %USERPROFILE%\.claude` ; ne pas restaurer `TPL1` en entier (instantané du journal, du README, des docs 21 et 29 antérieur à CHG-272 / 273) | | CHG-273 | 2026-10-09 | U8 | `Docs/Migration/21_Sandbox_Addon.md` (registre des reports : report U7b HyperAIStudio coché avec preuve ; + 2 lignes `- [ ]` U8 : archivage des PDB du Shipping, mention 5.8 de `README.md:4`), `Docs/Migration/29_Projet_Stabilisation_V2.md` (défauts connus : + cuisson Shipping à froid `LegacyIterative`), README (plage `CHG-273`) ; instantané `D:\Game\LifePlay_Backup_5.5\U8` (docs 21 et 29 ajoutés) | suite de U8-T0 (`etat/U58/U8/U8-T0-INV.md`, anomalies A1, A3, A4), traçabilité seule, aucun code ni contenu touché, aucun éditeur ni commandlet lancé. A1 établi sur les journaux existants : avant le correctif (CHG-260, `cb6697a`, ERR-054), `U7b_CompileAllBlueprints_20261009-140525.log` : 2 lignes `LogHyperAIStudioAutomation: Error`, `Failure - 1 error(s)`, code de sortie 1 ; après, `STM-T4c_CompileAllBlueprints_20261009-162345.log` (HyperAIStudio monté, `AutomationController` chargé l.1281, toolset enregistré l.1687) : 0 erreur, `Success - 0 error(s), 0 warning(s)`, code de sortie 0 (résumé `etat/ST/STM/`) ; idem `ETAT2_…153349` et `OUT1_LPTestStringCompat_20261009-161745` (code 0). A3 : la cuisson à froid (doc 21:214) manquait au tableau du doc 29, seuls brouillard et hitchs y étaient. A4 : PDB (doc 27:300, build Shipping V2.0 sans PDB, anomalie A2) et README (doc 27:200) sans ligne au registre | report HyperAIStudio `- [ ]` → `- [x]` ; registre doc 21 : 2 lignes ajoutées ; tableau doc 29 : 9 → 10 lignes | `git revert` du commit ; ou `.\Tools\Restore.ps1 -Lot U8 -Only Docs\Migration\21_Sandbox_Addon.md` (proposé, jamais lancé sans accord) | | CHG-272 | 2026-10-09 | U8 | `Docs/Migration/27_Plan_Migration_UE58.md` (§ U8 : paragraphe « Avancement »), README (plage `CHG-272`) ; hors dépôt : livrables `D:\Game\LifePlay-master 5.5\Docs\Migration\etat\U58\U8\U8-SUIVI.md`, `U8-T0-INV.md`, `U8-T1-CART.md` ; instantané `D:\Game\LifePlay_Backup_5.5\U8` (3 docs) | décisions utilisateur du 2026-10-09 : « commençons u8 », puis « U8-T0 et T1 seulement » (report SEQ1 maintenu pour T2 à T11) et, sur le résultat de T1, « décider à la reprise ». T0 (lp-inventory) : 3 dépôts propres, pin `aa0c1e5` = HEAD addon, build Shipping V2.0 2 220 fichiers et 0 PDB, 3 archives dans `D:\Game\LifePlay_Publication\Mods\`. T1 (lp-cart, Sonnet, hors budget de taille : 90 appels, ≈ 246 k jetons) : seul `Content/BPs/Person.uasset` (`6cb8e81`) change le contenu cuit depuis `Releases/2026.10.2.0` (10:38) ; comptes recomptés par l'orchestrateur | plan 27 § U8 sans avancement → T0 et T1 faites, choix A / B / C de la référence reporté à la reprise de U8 (T1 rejouée après G-ST et OB) | `git revert` du commit ; livrables hors dépôt : les déplacer vers `D:\Game\LifePlay_Backup_5.5\U8` | | CHG-271 | 2026-10-09 | STAT1 | `Docs/Migration/31_Eval_Methode_Orchestration.md` (nouveau), README (ligne du doc 31, plage `CHG-271`) ; hors git : `Saved/STAT1/` (`sessions.py`, `periods_all.py`, `fiches.py`, `context.py`, `heavy2.py`, scripts de mesure rejouables) ; instantané `D:\Game\LifePlay_Backup_5.5\STAT1` (doc 31 absent, journal, README) | demande utilisateur : document des statistiques avec dates de début et de fin. Période du 2026-10-06 08:07:50 au 2026-10-09 16:41:10, coupure le 2026-10-08 13:30 ; chiffres rejoués par les scripts (`heavy2.py` : 23 agents au pic > 150 k = 84 % des jetons, 5 plus lourds = 43 %) ; correction : l'estimation UA de U0 à U7 est de 13 à 22,5 séances (et non 21,5 comme annoncé en conversation) | — → créé (doc 31) ; README + 1 ligne | jeu : `git revert` du commit ; ou `.\Tools\Restore.ps1 -Lot STAT1` (retire le doc 31) ; supprimer `Saved/STAT1/` | | CHG-270 | 2026-10-09 | SEQ1 | `Docs/Migration/29_Projet_Stabilisation_V2.md` (résumé, objectif, périmètre, S1, S5, § Dépôts : stabilisation menée avant toute publication, sur `ue5.8` non publiée, référence de départ = build Development 5.8 de U6 et `etat/U58/U6/U6-T3-AB.md`, V2.0 publiée par U8 après ST et OB), `30_Projet_Audit_Obsolescence.md` (O4 : A/B contre la base stabilisée à la sortie de ST, avant publication), README (plage `CHG-270`) ; instantané `D:\Game\LifePlay_Backup_5.5\SEQ1` (référence d'avant CHG-268) | alignement des docs 29 et 30 sur la décision utilisateur du 2026-10-09 (« on ne livre rien au client avant la phase de débuggage et d'optimisation », CHG-269) : ils supposaient une V2.0 publiée avant ST (S1 « démarrage après la publication V2.0 », O4 « contre la V2.0.x stable ») ; accord de l'utilisateur sur la proposition d'alignement | doc 29 : 6 lignes modifiées ; doc 30 : 1 ligne modifiée | jeu : `git revert` du commit ; ou `.\Tools\Restore.ps1 -Lot SEQ1` (annule aussi CHG-268 et CHG-269) | | CHG-269 | 2026-10-09 | SEQ1 | `Docs/Migration/27_Plan_Migration_UE58.md` (en-tête : états de UA, G-U, U0 à U6 passés à `completed`, ligne `lot-u7b` ajoutée, U8 « différé après la stabilisation et l'optimisation », U9 « après V2.0, D9 » ; § U8 : paragraphe « Différé » ; titre de U9), `29_Projet_Stabilisation_V2.md` (lot STM : titre et état, T1 / T2 / T3 « fait », T5 « en attente », porte G-STM non liée au Shipping ; preuve `ContactMenu` de T4c reportée de U8 au parcours STA-T1), README (plage `CHG-269`) ; instantané `D:\Game\LifePlay_Backup_5.5\SEQ1` (référence prise avant CHG-268, fichiers déjà au manifeste) | décision utilisateur du 2026-10-09 : « on ne livre rien au client avant la phase de débuggage et d'optimisation » ; états de l'en-tête du plan 27 périmés (U0 à U6 « pending » alors que clos, CHG-249 à CHG-256 ; U7b absent, CHG-259) ; doc 29 annonçait STM « après la V2.0 » alors que T1 à T4c sont faits (CHG-260, 262, 263, 266) | plan 27 : 13 lignes modifiées, + 48 au total avec CHG-268 ; doc 29 : 6 lignes modifiées, + 15 au total avec CHG-268 | jeu : `git revert` du commit ; ou `.\Tools\Restore.ps1 -Lot SEQ1` (annule aussi CHG-268) | | CHG-268 | 2026-10-09 | SEQ1 | `Docs/Migration/27_Plan_Migration_UE58.md` (§ Orchestration : règle « Taille des fiches » ; § U8 : découpage en 12 fiches U8-T0 à T11), `29_Projet_Stabilisation_V2.md` (STA-T2 → T2a / T2b- / T2c ; STA-T4 sur comptes rendus seulement), `30_Projet_Audit_Obsolescence.md` (OBA-T2 / T3 par domaine), README (plage `CHG-268`) ; hors dépôt : `~/.claude/skills/sk-orchestrate/SKILL.md` (§ 3 Taille, § 4 inventaires à `lp-inventory`, § 5 indicateurs par fiche) ; instantanés `D:\Game\LifePlay_Backup_5.5\SEQ1` (5 fichiers) et `SEQ1-skills` (1) | décision utilisateur du 2026-10-09 après l'évaluation du contexte (transcriptions du 2026-10-08 13 h 30 au 2026-10-09) : session principale −28 % de contexte moyen (376 k → 269 k), 0 compactage, mais 23 sous-agents sur 77 au pic > 150 k = 84 % des jetons des sous-agents (5 plus lourds : U7-T7 69 M, U5-T3b 36 M, U1-T1 28 M, U1-T4c 20 M, U7-T6 20 M = 43 %) ; erreurs d'outil 3,0 % contre 3,5 % (gain attendu : coût et contexte) ; orchestrateur ≈ 46 commandes shell par heure | plan 27 : + 27 lignes ; doc 29 : + 4 ; doc 30 : + 3 ; `sk-orchestrate` : + 3 lignes (43 lignes) | jeu : `git revert` du commit ; hors dépôt : recopier `D:\Game\LifePlay_Backup_5.5\SEQ1-skills\sk-orchestrate\SKILL.md` vers `~/.claude/skills/sk-orchestrate/` | | CHG-267 | 2026-10-09 | EDIT1 | addon `lot/DC3-atelier` `d350761` et `ue5.8` `250aa41` : `Tools/claude/skills/lp-doc/SKILL.md` (règle Edit ; « dernier `CHG-248` » et « dernier connu `ERR-043` » remplacés par la commande `Select-String … Measure-Object -Maximum` qui lit le dernier CHG / ERR), `Tools/claude/skills/lp-validate/SKILL.md` (§ 1 : fichier mixte normalisé par Edit à annoncer ; édition par script = écart) ; puis `496ff2c` / `aa0c1e5` : passage `FileCheck.ps1` d'OUT1 (CHG-264) reporté dans `lp-validate` des deux branches (contenu identique ; `FileCheck.ps1` n'existe que dans le jeu 5.8) ; doc 21 (pin 5.8 `aa0c1e5`) ; README (plage `CHG-267`) ; hors dépôt : `~/.claude/skills/sk-protocol/SKILL.md` (§ 7 « Fichiers : outils dédiés »), `~/.claude/skills/sk-windows-shell/SKILL.md` (Interdits), `~/.claude/agents/` `lp-builder`, `lp-cart`, `lp-inventory`, `lp-validator`, `lp-writer`, `lp-impl`, `lp-impl-max`, `opus-xhigh`, `opus-max`, `fable-top` (une ligne chacun, renvoi à `sk-protocol` § 7) ; instantané `D:\Game\LifePlay_Backup_5.5\EDIT1` (`manifest.md5`, 12 fichiers) | audit des transcriptions du 2026-10-09 : 588 éditions par script Python ad hoc, ~7 700 `grep` en Bash contre 394 appels à Grep. La crainte des CRLF n'est pas fondée : essai Edit du 2026-10-09 (CRLF + BOM UTF-8 conservés, ligne ajoutée en CRLF ; fichier mixte normalisé en CRLF) ; copie 5.8 `git ls-files --eol` : 99 CRLF, 443 LF, 2 mixtes (`.gitignore`, `Docs/Modding/ShortGuides/explanation.lpmod`). Règles : modifier par Edit / Write, chercher par Grep / Glob / Read, script réutilisé rangé dans `Saved//` ou proposé pour `Tools/`. Chargement vérifié par un sous-agent `lp-writer` (sk-protocol § 7 et commande de lp-doc présents, « ERR-043 » absent) ; le corps modifié des agents n'est relu qu'au démarrage d'une session (à vérifier dans une nouvelle) | addon : 2 fichiers, 13 insertions, 4 suppressions par branche ; hors dépôt : 12 fichiers, + 1 à + 9 lignes | addon : `git revert d350761` (`lot/DC3-atelier`) et `git revert 250aa41` (`ue5.8`) ; jeu : `git revert` du commit ; hors dépôt : recopier `D:\Game\LifePlay_Backup_5.5\EDIT1\agents\*.md` et `EDIT1\skills\\SKILL.md` vers `~/.claude\` | | CHG-266 | 2026-10-09 | STM | doc 29 (§ 9 : règles d'usage du MCP réécrites en 10 points après T4c, recommandation pour la porte G-STM) | demande utilisateur « met à jour les recommandations » après T4c : rôles (Hyper lit, Epic modifie), lecture fiable des gros Blueprints (`find_nodes`, `get_connected_subgraph`, `get_node_infos` ; `read_graph_dsl` et le relevé Hyper limités aux petits), séquence d'écriture et de contrôle, règle des correctifs `Accessed None` (garde seulement si vide est normal, branches plutôt que AND / OR), preuve par build empaqueté (PIE MCP sans parcours d'interface), volume des réponses, gel annoncé à toutes les sessions actives (incident T4c), périmètre gratuit (offre payante Games by Hyper non retenue, aucun contrôle de licence dans le plugin), aucun serveur MCP supplémentaire (profil « Project Docs Filesystem MCP » écarté). Recommandation G-STM : adopter `unreal-mcp` + HyperAIStudio gratuit en lecture pour le tri et les petits correctifs, `McpAutomationBridge` désactivé, règles à reporter dans les skills `lp-*` (STM-T5) | `git revert` du commit | | CHG-265 | 2026-10-09 | OUT1 | jeu 5.8 `ue5.8` (non commité) : `Tools/uasset.py` (nouveau, parseur hors éditeur des `.uasset` UE 4.27 : `UA`, `Graph`, `rd_props`, `rd_props2`, `rd_fstring`, `rd_ftext`, `graphs`, `graph_info`, `var_defs`, `event_nodes`, `summ`, `show`, `trace`, `sig`, `evmap`, `evsig`) | audit des transcriptions du 2026-10-09 : le seul outil d'analyse de Blueprints hors éditeur (62 appels, 4 agents, cartographie GI et Person) vivait dans `%TEMP%\lp\uasset.py` et a disparu (`__pycache__` vide). Reconstitué en rejouant dans l'ordre les 19 appels Bash qui l'écrivaient (session d3ec373a, sous-agent agent-a139431644aa5f11d, 2026-09-28 22:09–22:19 ; 1 `cat >`, 9 `cat >>`, 2 `sed -i`, 7 `python -`), avec la réécriture `\\` → `\` du harnais Bash : chaque étape redonne la sortie d'origine (11569 puis 11349 octets, 1 NUL puis 0, tracebacks lignes 8, 21, 370, `grep` lignes 140/176/188). Corps = fichier rejoué octet pour octet (18888 octets, 410 lignes CRLF, sha256 `4d202f14…`) + en-tête d'origine et d'usage ; aucun `.pyc` restant pour comparer. Preuve depuis `Tools/` (`PYTHONPATH=Tools`, Python 3.14.4) sur `LifePlay-master 4.27/Content/BPs/GI.uasset` : nc 8740, ec 20115, ic 4419, 19127 nœuds, `evmap` 229 ; Person 3331 / 8945 / 8124 nœuds / 122 événements ; Save `var_defs` 137. UE5 non géré : GI et Save 5.5 (version -8) et 5.8 (-9) → `struct.error` dans `UA()`. Pièces du rejeu : `side-session-notes\local_03589c9b-…\uasset-reconstitution\` | — → créé (20779 octets, 438 lignes CRLF, MD5 `82782B7556D1D17D84D915CF61E55DC0` ; instantané `D:\Game\LifePlay_Backup_5.5\OUT1`, `Existed=False`) | supprimer `Tools/uasset.py` (ou `.\Tools\Restore.ps1 -Lot OUT1 -Only Tools\uasset.py`) ; après commit : `git revert` | | CHG-264 | 2026-10-09 | OUT1 | jeu 5.8 `ue5.8` (non commité) : `Tools/UeState.ps1` (nouveau), `Tools/FileCheck.ps1` (nouveau), `Tools/LogStats.ps1` (`-Latest`, `-Pattern`, `-Context`, `-Max`, `-Tail`, `-Stats`, `-LogDir`), `Tools/Build.ps1` (contrôle de l'éditeur par `UeState.ps1 -Kind Editeur` ; ligne finale `journal : …`), `Tools/RunCommandlet.ps1` (ligne finale `journal : …`), `Tools/EtatDir.ps1` (règle `OUT\d*` à plat → `etat\OUT1\`, plus d'avertissement « hors table » ; OUT1, U7b, U8, ETAT2, STM, SK, DC4 résolus à blanc par `Resolve-LPEtatDir -NoCreate`) ; addon `LifePlay-Sandbox-5.8` `ue5.8` (non commité) : skills `lp-validate` (§ 1 Fins de ligne : `FileCheck.ps1` remplace le `python -c`), `lp-build` (UeState, `LogStats -Latest`), `lp-commandlets` (idem) | audit des transcriptions du 2026-10-09 : scripts improvisés faute d'outil (« Unreal tourne-t-il ? » 474 appels / 95 agents, fins de ligne 475 / 92, MD5 197 / 46, motif compté dans un .log 475 / 60, dernier journal 240 / 31). Preuves (sortie réelle, copie 5.8) : `FileCheck.ps1 -Lot U7b` → 56 fichiers binaires, 28 `*_pose` modifiés, 28 `*_anim` identiques, 0 alerte, code 0 ; essai à blanc (scratchpad) → alertes `FINS` (CRLF → LF, LF → mixte), `BOM` (BOM retiré), `MIXTE`, codes 1 et 2 ; `LogStats.ps1 -Latest U7b_CompileAllBlueprints -Pattern ': Error: '` → `U7b_CompileAllBlueprints_20261009-140525.log`, 2 lignes (`LogHyperAIStudioAutomation`), `Failure - 1 error(s)` ; `UeState.ps1` : rien → code 0 ; faux `UnrealEditor.exe` (copie de `ping.exe`) → listé, code 1, `Build.ps1 -Lot OUT1` → code 3 sans compiler, `-WaitExit -TimeoutSeconds 3` → code 2, puis 0 à sa fin ; faux `cl.exe`, `dotnet.exe` (UnrealBuildTool), ShaderCompileWorker, `LifePlay-Win64-Shipping.exe` → listés, `dotnet.exe` sans UBT ignoré ; `RunCommandlet.ps1 -Lot OUT1 -Commandlet LPTestStringCompat` → code 0, `3120 cas … 0 … 60`, ligne `journal :` affichée. Incident de test : un premier faux éditeur s'est arrêté avant le contrôle et `Build.ps1 -Lot OUT1` a lancé UBT (« Target is up to date », 0 action, 3 s ; `Saved/Logs/portage/OUT1_Build_20261009-161628.log`). Constat : `grep -c $'\r'` sous Git Bash (GNU grep 3.0) compte aussi les lignes LF (faux CRLF) ; `Tools/*.ps1` sont en majorité LF, les deux nouveaux aussi | 2 outils créés (107 et 164 lignes) ; `LogStats.ps1` 78 → 141 lignes, `Build.ps1` 137 → 140, `RunCommandlet.ps1` 74 → 75 ; skills : lp-validate 88 → 93, lp-build 125 → 133, lp-commandlets 54 → 60 lignes (instantanés `D:\Game\LifePlay_Backup_5.5\OUT1`, `OUT1-addon`) | jeu : supprimer `Tools/UeState.ps1` et `Tools/FileCheck.ps1`, `git checkout -- Tools/LogStats.ps1 Tools/Build.ps1 Tools/RunCommandlet.ps1` (pas `Restore.ps1 -Lot OUT1` sans `-Only` : il remettrait aussi le journal) ; addon : `git -C D:\Game\LifePlay-Sandbox-5.8 checkout -- Tools/claude/skills/lp-build/SKILL.md Tools/claude/skills/lp-commandlets/SKILL.md` et, pour lp-validate, retirer à la main le bloc FileCheck (l'instantané `OUT1-addon` est antérieur à la modification EDIT1 du même fichier) ; après commit : `git revert` | | CHG-263 | 2026-10-09 | STM | `Content/BPs/Person.uasset` (fonction `UpdateDailyPose` : nœud OR remplacé par deux branches `secondScreen` puis `IsValid(GI.ContactMenu)` ; 37 → 39 nœuds ; 20 672 239 → 20 703 212 octets) ; doc 29 (lot STM : résultat T4c) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STM-T4c` (`Person.uasset`, MD5 `15AF3C89…`, SHA256 `A4486110…`), journaux `Saved/Logs/portage/STM-T4c_EditorHeadless_20261009-161851.log`, `STM-T4c_CompileAllBlueprints_20261009-162345.log`, résumé `Docs/Migration/etat/ST/STM/STM-T4c_CompileAllBlueprints_20261009-162345.txt` | STM-T4c (décision utilisateur « STM-T4c »), premier correctif réel par MCP. `Accessed None trying to read (real) property ContactMenu in /Game/BPs/GI.GI_C`, fonction `Person_C:UpdateDailyPose`, pile `City.LoadCity` → `GI.MoveCity` : 63 par session (`etat/U58/U6/LifePlay_58_session2.log`, 2e famille). Cause lue par MCP (`get_connected_subgraph`) : `Branch(OR(secondScreen, GI.ContactMenu.DummyPerson == self))`, le OR évalue ses deux entrées, `ContactMenu` vide pendant le chargement de la ville. Correctif sans changement de comportement (vide = « pas le personnage du menu », état normal au chargement) : `secondScreen` vrai → sortie ; sinon `IsValid(ContactMenu)` faux → `Switch` (chemin de l'égalité fausse), vrai → branche d'origine sur l'égalité. Fait par les outils Epic via MCP (création 3 nœuds, 2 liens rompus, 8 liens, OR supprimé), liaisons relues par `get_node_infos`, `compile_blueprint` + `hyper_blueprint_debug_inspect` : compilé, 0 diagnostic ; validation de données à l'enregistrement : 0 erreur ; `CompileAllBlueprints` : code 0, 0 erreur, 0 avertissement. Non prouvé en jeu : à mesurer au build empaqueté (`LogStats`, `ContactMenu` 63 → 0 attendu, U8) | `git revert` du commit (rend `Person.uasset` d'origine) ou `.\Tools\Restore.ps1 -Lot STM-T4c` éditeur fermé (proposé, jamais lancé sans accord) | | CHG-262 | 2026-10-09 | STM | doc 29 (§ 9 : résultats STM-T2 à T4b, règles d'usage MCP ; lot STM : T4 fait, T4b bloqué, T4c ajouté) ; registre ERR-055, ERR-056 ; README (plages) ; correction de CHG-260 : ses résumés sont désormais `Docs/Migration/etat/ST/STM/STM_Build_20261009-144519.txt` et `…/ST/STM/STM_LPTestStringCompat_20261009-144828.txt` (déplacés par CHG-261) ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\STM-T4` (`Content/BPs/TestStatic.uasset`), journaux `Saved/Logs/portage/STM_EditorHeadless_20261009-145312.log` et `STM-T4b_EditorHeadless_20261009-154339.log` ; aucun fichier de jeu modifié au final | lot STM, étapes T2 à T4b (décisions utilisateur 2026-10-09 : « fais le T4 », « option 1 et 2 », puis « Arrêter, Hyper en lecture »). Éditeur 5.8 hors écran avec serveur MCP, session connectée : lecture en 8-16 ms par appel ; 91/109 outils HyperAIStudio enregistrés, tous « source candidate ». T4 sur `TestStatic` (aucun référenceur) par les outils Epic : `set_node_position` (Event Tick y 400 → 600), `compile_blueprint`, `save_assets` ; diff HyperAIStudio = 1 changement ; retour par MCP → diff `identical` (révision `sha256:feae185e…`) ; fichier réenregistré 26 029 octets contre 25 919 ; remis par `git checkout` éditeur fermé : SHA256 `544DC51F…` = instantané = blob du commit. T4b : patch HyperAIStudio à 1 opération refusé (`step_budget_too_small`, ERR-055) ; à 2 opérations (1 sans effet) `valid_dry_run`, puis `hyper_blueprint_apply_patch` refusé (`patch_stage_rejected`, ERR-056), sans mutation (`is_dirty` faux, SHA256 inchangé). Plugin non modifié par décision de l'utilisateur ; défauts à signaler au vendeur. Éditeur arrêté, `git status` vide avant les docs | docs : `git revert` du commit ; `TestStatic.uasset` : `git checkout -- Content/BPs/TestStatic.uasset` (déjà fait) | | CHG-261 | 2026-10-09 | ETAT2 | jeu 5.5 `main` `d4b3ea3` : `Tools/EtatDir.ps1` (nouveau, table lot -> projet, fonction `Resolve-LPEtatDir`), `Tools/RunCommandlet.ps1`, `Tools/ReimportCorrectif.ps1`, `Tools/AssetHeaders.ps1` ; jeu 5.8 `ue5.8` `1d1d283` (cherry-pick de `d4b3ea3`) et `9184ecb` (`Tools/Build.ps1`) ; addon `lot/DC3-atelier` `e99e423` et addon `ue5.8` `408ce33`, `1704741` (report des commits de skills U4 `8d118bb` et U7 `6295829` qui manquaient à `ue5.8`), `1bcfe1b` : 5 gabarits de skills (`lp-build`, `lp-commandlets`, `lp-lot`, `lp-paths`, `lp-validate`) et `Tools/SyncModSources.ps1` (nouveau) ; nouveau pin de la copie 5.8 = `1bcfe1b` ; hors dépôt : `Docs/Migration/etat/` de la copie 5.8 réorganisée (`MAPPING-58.csv`, SHA-256 `034341413821577408AAE04FD7480F69F66053E6B76BAF1A6E005796D0AB8E1E`, `INVENTAIRE.md`), `etat/INVENTAIRE.md` de la copie 5.5 (§ 4 et § 6), tags `ETAT2-avant` (jeu 5.5 `1825884`, jeu 5.8 `cb6697a`, addon `6295829` ; tag partagé par les deux checkouts de l'addon) et `ETAT2-avant-ue58` (addon `ce2e269`), instantanés `D:\Game\LifePlay_Backup_5.5\ETAT2` (4 entrées), `ETAT2-addon`, `ETAT2-58` (5 entrées), `ETAT2-R8` (474 entrées) ; docs 03, 09, 21, registre ERR-046, README | les scripts du jeu écrivaient les preuves à la racine de `etat/` (désordre recréé après CHG-258) et les `ModSources/*/Content`, ignorés par git, manquaient au worktree 5.8 de l'addon (ERR-046). Phase A (copie 5.5 et addon) : `Resolve-LPEtatDir` donne `etat///` (lot hors table : avertissement et `etat//`, jamais la racine) ; `RunCommandlet.ps1`, `ReimportCorrectif.ps1`, `AssetHeaders.ps1` l'utilisent (paramètre `-EtatDir` facultatif) ; gabarits `etat` des 5 skills mis à jour ; `SyncModSources.ps1` copie `ModSources/*/Content` d'un checkout de l'addon vers l'autre (à blanc par défaut, `-Apply` éditeur fermé, rapport CSV avec MD5). Phase B (copie 5.8) : mêmes scripts par cherry-pick, `Build.ps1` adapté ; réorganisation de `etat/` : 362 fichiers déplacés (313 repris de `MAPPING.csv` + 49 nouveaux), MD5 362/362 identiques au manifeste, 3 fichiers restent à la racine (`L0_ref427.csv`, `MAPPING-58.csv`, `INVENTAIRE.md`) ; les 2 fichiers STM sont rangés dans `etat\ST\STM\` (règle de `EtatDir.ps1` : STM est un lot du projet ST) ; 4 dossiers vides déplacés vers `D:\Game\LifePlay_Backup_5.5\ETAT2-R8\dossiers_vides\`. Validations (agent distinct) : T3 (A2) PASS, T5 (A5) PASS (essai à blanc 174 IDENTIQUE, essai réel 174 COPIE_OK, MD5 174/174), T7 (B2) PASS (`Build.ps1 -FromLog` et `RunCommandlet.ps1` réels en 5.8, racine de `etat/` inchangée). Bugs non prioritaires relevés, non corrigés : reports du doc 21, lot **ST** | git : `git revert 9184ecb 1d1d283` (jeu 5.8) ; `git revert d4b3ea3` (jeu 5.5) ; `git revert 1bcfe1b 1704741 408ce33` (addon `ue5.8`) et `git revert e99e423` (addon `lot/DC3-atelier`) ; ou `git checkout ETAT2-avant -- Tools` (jeux) et `git checkout ETAT2-avant-ue58 -- .` (addon `ue5.8`) ; `etat/` hors git : `.\Tools\Restore.ps1 -Lot ETAT2-R8 -WhatIf` d'abord (copie 5.8 ; recopie les 474 fichiers à leur emplacement d'origine, les copies déplacées sont à ranger ensuite vers la sauvegarde d'après `MAPPING-58.csv`), puis `-Lot ETAT2-58` et `-Lot ETAT2` pour les scripts (jamais lancé sans accord, après `Snapshot.ps1 -Lot ETAT2-retour`) ; docs : `git revert` du commit | | CHG-260 | 2026-10-09 | STM | `Source/LifePlayEditorTools/LifePlayEditorTools.h`, `.cpp` (nouveau `StartupModule` : précharge `AutomationController` si le plugin `HyperAIStudio` est activé), `LifePlayEditorTools.Build.cs` (+ `Projects`) ; `LifePlay.uproject` (15 plugins *Toolset* activés par le setup HyperAIStudio : + `TargetAllowList: ["Editor"]` ; `Optional` remis sur `McpAutomationBridge` et `SupportedTargetPlatforms` retiré de `InterchangeTests`, deux retouches du setup annulées) ; `.gitignore` (bloc géré `.hyperai/runtime/` du setup) ; doc 29 (méthode de débogage : arrêt sur exception, Visual Logger, commandes de triche, PDB par build, tableau des outils Epic, choix HyperAIStudio) ; registre ERR-054 ; hors dépôt : `Plugins/Marketplace/HyperAIStudio` (installé dans le projet par l'utilisateur, exclu par `.git/info/exclude`, recompilé depuis ses sources par UBT), `CLAUDE.md`, `AGENTS.md`, `.hyperai/` (exclus localement), instantané `D:\Game\LifePlay_Backup_5.5\STM` (14 entrées) | ERR-054 : à chaque démarrage d'UE (éditeur et commandlets) `LogHyperAIStudioAutomation: Error: Automation probe publication failed: AutomationController is not loaded` → `Failure - 1 error(s)` et code de sortie 1 (journaux U7b `U7b_CompileAllBlueprints_20261009-135244.log`, `…135821.log`). Cause : la sonde vérifie le module au signal `OnPostEngineInit` (`HyperAIStudioAutomationToolset.cpp:1375`, `1432-1448`) sans jamais le charger, or UE 5.8 diffuse ce signal avant de charger les modules `PostEngineInit` (`LaunchEngineLoop.cpp:4837` puis `4861-4863`), dont `AutomationTestToolset` qui charge `AutomationController`. Décision de l'utilisateur (relayée par la session U7, citée « Oui, l'appliquer ») : corriger à la source, dans notre code, sans toucher au plugin du vendeur. Build `STM_Build_20261009-144519` : code 0, MSVC 14.50.35717, 0 erreur, 0 avertissement dans notre code (6 C4996/C5038 et 20 avertissements UBT de dépendances, tous dans `HyperAIStudio`) ; `LPTestStringCompat` (`STM_LPTestStringCompat_20261009-144828.log`) : `AutomationController` chargé l.1281 juste après `LifePlayEditorTools` (l.1280), toolset `HyperAIStudioAutomation` enregistré l.1687, 0 ligne `LogHyperAIStudioAutomation: Error`, `Success - 0 error(s), 1 warning(s)`, code 0, `3120 cas : compat != herite(UE4) : 0 ; moteur != herite(UE4) : 60`. Non rejoué : preuve par l'échec plugin désactivé, état « Ready » dans l'éditeur | `git revert` du commit, puis rebuild `.\Tools\Build.ps1 -Lot STM` ; ou `.\Tools\Restore.ps1 -Lot STM` (sources, `.uproject`, `.gitignore`, `Config`, retire `CLAUDE.md`/`AGENTS.md` ; proposé, jamais lancé sans accord) | | CHG-259 | 2026-10-09 | U7b | addon branche `ue5.8` : `Tools/anim/AnimPipeline.ps1` (tournée Mesure lancée avec `-RenderOffScreen -ExecCmds="r.SetRes 1600x900w"`), `Tools/debug/LifePlay_interaction_sandbox.bat` (transmet les arguments reçus), `Tools/anim/RetargetPack.py` (garde-fou `refuse_unported_engine()`) — commit `ce2e269` (pin 5.8 = `ce2e269`, écrit au doc 21) ; hors dépôt (ignoré par git, `.gitignore:59`) : les 28 `*_pose.uasset` de `Content/FreeAnimationsPack/Demo/Characters/Mannequins/Rigs/Poses/{Manny,Quinn}` régénérées par « Update Source » ; tags `U7b-avant` (jeu `0ee5a76`, addon `d1efdd1`), instantanés `D:\Game\LifePlay_Backup_5.5\U7b` (56 fichiers : 28 `_anim` + 28 `_pose`) et `U7b-addon` (3 fichiers) ; docs 21, 27, 28, journal, registre | lot U7b : reports de U4, U5 et U7 sur l'atelier et les poses (3 fiches de cartographie CART, T4 et T5 en implémentation, T6 en essai, VAL PASS). Décisions de l'utilisateur 2026-10-09 : capture de la tournée hors écran (option A) ; portage de `RetargetPack.py` reporté après V2.0, garde-fou seulement ; poses mises à jour par « Update Source » (option A) ; HyperAIStudio installé par une autre session (lot STM) et gardé. Tournée Mesure hors écran, pack freeanims : géométrie 20/20 lignes `VIGNETTE` / `PLANCHE` identiques à la référence `U4-REF55`, JSON des planches 10/10 identiques (sha256), dimensions d'image 20/20 identiques, 0 `Assertion failed`, 0 `out of bounds` (`-RenderOffScreen` seul : viewport ≈ 888×500, cadrage ×0,555, d'où `r.SetRes`). Poses : `CompileAllBlueprints` 56 lignes (28 avertissements + 28 rappels `LogInit`) → 0 ; 28/28 `_pose` régénérées (MD5 changés), 28/28 `_anim` identiques à l'instantané, aucun autre fichier `Content` touché ; bilan `0 errors and 0 warnings and 0 blueprints that failed to load`, 418 BP. Garde-fou `RetargetPack.py` : refus sous 5.6 et plus (et version illisible) avant toute suppression ou création d'asset, 5.5 inchangé (essai avec faux module `unreal`, pas en éditeur réel). `.bat` : lignes lancées à l'octet identiques sans argument. Reste en erreur : `LogHyperAIStudioAutomation: Error … AutomationController is not loaded` (code de sortie 1 des commandlets, sans lien avec U7b), correctif préparé par la session du lot 29, à appliquer avant la cuisson U8 avec l'accord de l'utilisateur (doc 21). Non rejoué : pilote `AnimPipeline.ps1` de bout en bout, garde-fou dans l'éditeur 5.8 réel, absence de fenêtre pendant la tournée complète. Les 28 poses ne sont dans aucun commit | addon : `git revert ce2e269` (branche `ue5.8`) puis repointer le pin sur `d1efdd1` ; poses : `.\Tools\Restore.ps1 -Lot U7b` depuis la copie 5.8, après `Snapshot.ps1 -Lot U7b-retour` (proposé, jamais lancé sans accord) ; addon, instantané `-Lot U7b-addon` ; docs : `git revert` du commit | | CHG-258 | 2026-10-09 | ETAT | `Docs/Migration/etat/` de la copie 5.5 (hors git) : 317 fichiers déplacés vers `etat///`, nouveaux `etat/INVENTAIRE.md`, `etat/MAPPING.csv` (SHA-256 `c50d24d06e93e4b3d55b36623eaefd6fb928e10e5c9b356184a8f0639d1c262b`), `etat/ETAT-T2-REORG.md` ; hors dépôt : instantané `D:\Game\LifePlay_Backup_5.5\ETAT` (539 entrées au manifeste) ; docs 21, journal | la racine de `etat/` portait 289 fichiers à plat. Réorganisation par projet : portage55 175, anim 87, sandbox 19, post-v1 13, publication 21, U58 2 (U1) = 317 (287 de la racine + 30 en dossiers) ; totaux après : portage55 175, anim 87, sandbox 89, post-v1 13, publication 21, U58 125, VQ 12, SK 6, PROP 9. MD5 de chaque fichier déplacé comparé au manifeste : 317 OK, 0 KO ; 540 fichiers après (539 + `MAPPING.csv`) ; 0 doublon de cible. Exclus : `U58\U7\` (lot en cours), `L0_ref427.csv`, les documents d'inventaire, `PROP`, `SK`, `VQ`, `sandbox`. Exception décidée par l'utilisateur : le déplacement de fichiers à l'intérieur de `etat/` est permis pour cette réorganisation (hors règle « déplacer seulement vers la sauvegarde »). Première invocation du snapshot via Git Bash : barres obliques inverses perdues, manifeste erroné (aucun fichier copié), renommé `manifest_ECHEC_invocation_bash_20261009-1017.csv` (pas supprimé), relancé via `pwsh -Command`. Pas encore faits (reports au doc 21) : scripts écrivant à la racine de `etat/`, gabarits de skills, réorganisation de `etat/` de la copie 5.8 | déplacer chaque fichier de la colonne cible vers la colonne source de `etat/MAPPING.csv` (317 lignes), ou recopier `D:\Game\LifePlay_Backup_5.5\ETAT\Docs\Migration\etat` (jamais lancé sans accord) ; docs : `git revert` du commit | | CHG-257 | 2026-10-09 | U7 | branche `ue5.8` (jeu) : `Source/LifePlay/LPModGuard.h/.cpp` (nouveaux), `LPModInfoSubsystem`, `LPSettingsSubsystem`, `LPModDailies`, `LifePlay.cpp`, `Config/DefaultGame.ini` (`ProjectVersion=2026.10.2.0`) — commit `31615b2` ; `LPHairstyleSubsystem` (C1 + C2) — commit `9242cdb` ; addon branche `ue5.8` : `Tools/BuildMod.ps1` (`EngineVersion`), 3 `.lpmod` (auteur court), `Docs/Modding/Creating_Asset_Mods.md` — commit `d1efdd1` (pin 5.8 = `d1efdd1`, écrit au doc 21) ; addon branche `lot/DC3-atelier` : skills `lp-build`, `lp-validate`, `lp-paths` — commit `6295829` ; docs 21, 27, 28, 29, 30, README, journal, registre ; hors dépôt : tag `U7-avant` = `cb79c24`, instantanés `Backup_5.5\U7`, `U7-addon`, `U7\regles`, `Releases/2026.10.2.0` (copie 5.8, ignoré par git), builds `D:\Game\LifePlay_Build_5.8_U7d` et `D:\Game\LifePlay_Build_5.8_Shipping_V2.0`, 3 archives `D:\Game\LifePlay_Publication\Mods\*-1.0-for-LifePlay-2026.10.2.0.zip` | mods sous UE 5.8 (fiches U7-T4 à U7-T18, U7-VAL). Décisions de l'utilisateur 2026-10-08/09 : référence `2026.10.2.0` produite par un Shipping 5.8 en U7 ; T4 d'abord ; garde D2 à trois contrôles (moteur : en-tête de conteneur + `AssetRegistry.bin` + `EngineVersion` du `.uplugin` ; version min `2026.10.2.0` ; version max = `ProjectVersion`), mod refusé démonté au `StartupModule` avec fenêtre de raison, une case par contrôle dans Settings > Misc, mod sans `MODULE_GAME_VERSION` chargé avec avertissement, `BuildMod` écrit `EngineVersion` ; C1 + C2 des coiffures en 5.8 seulement ; C3, bouton du nom bloqué et libellé moteur non retenus ; reports secondaires en lot U7b. Essais : T4 (mod 5.5 dans le jeu 5.8) plantage au démarrage 2/2 (`FZenPackageHeader`) puis, avec la garde, refus + démontage sans plantage ; cases : moteur levé → refus par min, moteur + min levés → chargé → plantage attendu ; P10 (sauvegarde 5.5 avec coiffure de mod) Continuer sans plantage ; T1/T2 3 mods acceptés, 104 clips, 138 coiffures, aucun avertissement ; C1 « 88 maillage(s) conserve(s) » ; T3 12 coiffures retirées des listes ; T6 Continuer + rechargement ; T5 mod V2.0 dans le jeu 5.5 : plantage au démarrage, `Invalid pak file version (12)` (attendu, consigné au guide moddeurs) ; T7 mod de test `lpr_test_u7t7` : NewMod → HairPipeline → EditMod → BuildMod (6 paquets, 0 erreur) → accepté (conteneur 5, registre 24, `EngineVersion` 5.8.3), coiffure rendue. C2 : journal sans « reconstruction » ni `Accessed None` dans `UpdateDefaultHair`. Builds : éditeur, jeu et Shipping 0 erreur / 0 avertissement (recomptés par `Build.ps1 -FromLog`, MSVC 14.50.35717) ; cuisson Development et Shipping `BUILD SUCCESSFUL`, 1 avertissement (`LegacyIterative`) ; `LPTestStringCompat` 3120 / 0 / 60. Référence `Releases/2026.10.2.0` : `.utoc` identiques entre la référence et l'archive Shipping (SHA-256 `9d4bf712…fcfc24`, conteneur 5, registre 24) ; `2026.10.1.5` et `2026.10.1.6` rangées. Recuisson : 3 archives (70 / 84 / 20 paquets, auteur « LifePlay Revival », `EngineVersion` 5.8.3, formats 5 / 24). VAL U7 : PASS (V1–V7) avec 3 réserves de preuve (constats visuels, rechargement T6) ; écart E1 (mentions « Unreal Engine x.y » dans la fenêtre et le motif `EngineVersion`) tranché conforme par l'orchestrateur : ce sont des faits, la décision non retenue visait la traduction format → version. Rangements : `Releases/2026.10.1.5` et `1.6` → `D:\Game\LifePlay_Backup_5.5\Releases` ; builds de test U7 → `Backup_5.5\U7\builds` (13 copies d'essai (`LifePlay_Build_5.8_U7`, `_U7T4`, `_U7_T4`, `_U7_P10`, `_U7b`, `_U7c`, `_U7c_GM`, `_U7c_T11`, `_U7d_T12`, `_U7d_MODS`, `_U7d_T7`, `LifePlay_Build_5.5_DC4_P10`, `_DC4_T5`)) ; mod de test T7 (sources, JSON, archive, publication) → `Backup_5.5\U7\T7_mod_test` ; 25 builds 5.5 obsolètes mis à la corbeille. Reports : au doc 21 (U7b, lot dédié, doc 29, doc 30) | jeu : `git revert 31615b2 9242cdb` (ou `git checkout U7-avant -- Source Config`) ; addon : `git revert d1efdd1` (branche `ue5.8`) et `git revert 6295829` (branche `lot/DC3-atelier`), puis repointer le pin ; instantané `Tools\Restore.ps1 -Lot U7` et `-Lot U7-addon` (proposé, jamais lancé sans accord) ; rangements : redéplacer depuis `D:\Game\LifePlay_Backup_5.5\Releases`, `U7\builds`, `U7\T7_mod_test`, restaurer les 25 builds depuis la corbeille ; builds, archives et référence : supprimer les dossiers créés seulement sur ordre de l'utilisateur ; docs : `git revert` du commit | | CHG-256 | 2026-10-08 | U6 | branche `ue5.8` (jeu) : `Tools/LogStats.ps1` (regex `Accessed None … (?:\(real\) )?property`), docs 21, 27, 28, journal ; hors dépôt : tag `U6-avant`, instantané `D:\Game\LifePlay_Backup_5.5\U6` (Config, Tools, `SaveGames_DC4`, `Saves_DC4`, `SaveGames_58_session1_*`), build `D:\Game\LifePlay_Build_5.8_Development`, référence `D:\Game\LifePlay_Backup_5.5\ref_modules_5.8.csv` (`CheckIntegrity -InitRef`, 2 195 fichiers, T-STAT-02 OK, Modules `ade587f` identique en 5.5 et 5.8) | comportement en jeu 5.8 (porte G-U6, GO de l'utilisateur le 2026-10-08). Build Development 5.8 OK au 4e essai : 2 échecs (C1001, C2206 / C1907) non déterministes sous UBA, mémoire engagée ~61 / 75 Go, mêmes sources compilés sans erreur avec `-NoUBA` (cause estimée UBA et/ou mémoire, non séparées) ; essai 4 : UAT code 0, `BUILD SUCCESSFUL`, 179 s, archive 2,5 Go, 1 avertissement de cuisson (`LegacyIterative` requis, `bUseZenStore=False`) → Shipping U8 en cuisson à froid. A/B `LogStats -Compare` (même carte, même sauvegarde DC4, 5.5 / 5.8) : personnages 20 / 18, AccessedNone 442 / 364, AccessedNoneMaillage 1 / 1, NoSkeletalMesh 2 315 / 2 723, IndexHorsBornes 808 / 734, fatal / assert / GPU 0 / 0, erreurs 6 / 5, avertissements 4 926 / 5 015 ; verdict A/B équivalent (estimé, un parcours). Outil : 5.8 écrit « (real) property », l'ancienne regex donnait 0 en 5.8 (faux vert), la nouvelle 364 (preuve par l'échec). Incident de préparation : une sauvegarde = `Saved\SaveGames` + `Content\Saves` ; la session 1 de la 5.8 (seuls les `.sav` copiés) avait `LoadTxt ECHEC` sur `Player.lpcharacter` et le menu d'actions absent ; session 2 après copie complète : menu présent (établi : défaut de préparation, pas de 5.8). Retours de l'utilisateur : menu Video à 4 curseurs ; « Recommended » → tout à High, conforme à la VRAM dédiée 8 146 Mo (< 10 Go), même GPU lu par 5.5 et 5.8 ; niveaux relus après relance ; son sans problème ; reprise de partie OK ; rues identiques (pas de captures même cadrage). Reports U3 / U5 absents du jeu : `AutomationTest`, `PersonCumming`, `Save Preset` 0 / 0 ; NaN `FRotator::Quaternion` 0 / 0 ; « pose n'est pas à jour » 0 / 0 au journal du jeu. Propres à 5.8 (estimé bénins) : 4 `Gamethread hitch waiting for resource cleanup` sur `MapMarkers_C.LPFocusWidgetComponent`, 1 `Unable to find RecastNavMesh`. Référence Modules 5.8 figée. VAL U6 : PASS | jeu : `git revert` du commit (ou `git checkout U6-avant -- Tools`) ; instantané `Tools\Restore.ps1 -Lot U6` (proposé, jamais lancé sans accord) ; référence Modules : déplacer `D:\Game\LifePlay_Backup_5.5\ref_modules_5.8.csv` vers `D:\Game\LifePlay_Backup_5.5\U6` | | CHG-255 | 2026-10-08 | U5 | branche `ue5.8` (jeu) : `Content/` (590 paquets hors `Heavy` réenregistrés en 5.8, dont 292 suivis par git ; rien hors `Content`), docs 21, 27, 28, journal ; hors dépôt : tag `U5-avant`, instantané `D:\Game\LifePlay_Backup_5.5\U5` (3 092 fichiers `Content` hors `Heavy` + `Config`) | réenregistrement du contenu sous 5.8 (D10) : 800 paquets hors `Heavy` (798 `.uasset` + 2 `.umap`) moins 210 `__ExternalActors__` / `__ExternalObjects__` orphelins de cartes gabarit absentes (exclus ; retrait éventuel = décision utilisateur future) = 590. `LPResavePackages` code 0, 590/590, 0 échec, 126 s, pic 8,8 Go ; versions `++UE5+Release-5.5` → `5.8` ; −125,65 Mo ; `Content` hors `Heavy` identique 5.5 / 5.8 avant resave (empreinte SHA-256). Empreinte `LPDumpAssets` avant / après : 1 634 lignes = 590 `PackageMetaData` + propriétés dépréciées des assets d'animation (IK Retargeter, IK Rig, Control Rig) ; diagnostic U5-T3b : conversion faite par PostLoad 5.8 au chargement, propriétés `CPF_Deprecated` non resérialisées ; 9 reciblages avant / après identiques au bit près, 3 témoins sensibles → conversion sans perte, resave gardé ; 2 drapeaux Stride Warp de `RTG_Mannequin` (démo Epic, op désactivée) perdus à la conversion au chargement, pas au resave ; dossiers d'animation exclus de la cuisson, aucun paquet du jeu ne les référence. `CompileAllBlueprints` 5.8 avant et après : 410 BP (110 sous `/Game` ; 5.5 : 269 / 103), 0 erreur, 0 avertissement de compilation BP, 28 avertissements « Ressource de la pose … n'est pas à jour » inchangés par le resave. `bEnableMutableContainerWarnings` (décision utilisateur : oui) : 0 nœud ; aucun nœud `Array_*` à corriger avant 5.9 ; `AllowedMutableContainerFunctions` compte 13 entrées (pas 11). `LPCheckStreetMap` 280/280, CSV identique à la référence 5.5. Cuisson complète à froid (décision utilisateur : en U5) : FULL COOK, 8 915 paquets, 0 erreur, 0 avertissement, 6 min 10 (DDC chaude), `Saved\Cooked\Windows` 2,6 Go. Éditeur 5.8 ouvert sur le contenu réenregistré : aucune erreur de chargement (20 `LogAutomationTest` = bruit moteur déjà vu en U3). VAL U5-T7 : PASS (V1–V7). Correction de la synthèse 28 : « réversible par `git checkout` » était inexact (git ne suit que 292 fichiers de `Content` : le filet est l'instantané `Snapshot.ps1`) ; référence propre 5.5 de `CompileAllBlueprints` = L7i (269 BP, 0/0, 121 s), le « 115 s » venait de L1 (avant correctifs) ; 13 fonctions `Array_*` tolérées dans la liste, pas 11. 4 reports ouverts au doc 21 (U7, U6 ×2, utilisateur après V2.0) | contenu : `.\Tools\Restore.ps1 -Lot U5 -WhatIf` puis `.\Tools\Restore.ps1 -Lot U5` (instantané : seul filet pour les 298 paquets non suivis par git ; précéder de `Snapshot.ps1 -Lot U5-retour`, jamais lancé sans accord) ; les 292 paquets suivis : `git checkout U5-avant -- Content` ; dernier recours : recopier les fichiers depuis la copie 5.5, identique avant resave ; docs : `git revert` du commit | | CHG-254 | 2026-10-08 | U4 | branche `ue5.8` (jeu) : `LifePlay.uproject` (`AdditionalPluginDirectories` → `../LifePlay-Sandbox-5.8/Plugins`), `Plugins/StreetMap/Source/StreetMapImporting/StreetMapComponentDetails.cpp`, `Plugins/StreetMap/Source/StreetMapRuntime/StreetMapSceneProxy.cpp`, `Source/LifePlayEditorTools/LPDumpAssetsCommandlet.cpp` (gardes `UE_VERSION_OLDER_THAN(5,8,0)`), docs 21, 27, 28, journal ; addon, worktree `D:\Game\LifePlay-Sandbox-5.8` (branche `ue5.8` créée depuis `f9033a1`, 16 fichiers) : `LPSandbox.uproject`, `Target.cs` ×2 (V7, Unreal5_8), `Config/DefaultEngine.ini` (`CompilerVersion=14.50.35717`), `Config/LPSandbox.ini` (`GameRoot` → 5.8), 5 scripts `.ps1` (moteur lu par `\Tools\Engine.ps1`), `RapportControles.py`, 3 `.bat` (surcharge `LP_ENGINE_ROOT`), `README.md`, `LPHairFromStaticMeshCommandlet.cpp` (garde) ; skill `lp-build` (checkout 5.5 de l'addon) ; hors dépôt : jonction `Content` du worktree → `LifePlay-master 5.8\Content`, tag `U4-avant` (jeu), instantané `D:\Game\LifePlay_Backup_5.5\U4` | retour de l'addon dans la copie 5.8 (décision utilisateur : worktree plutôt que copie ; le checkout `D:\Game\LifePlay-Sandbox` reste en 5.5, branche `lot/DC3-atelier`, pour le jeu 5.5). D12 (décision utilisateur : corriger en U4) : 9 C4996 corrigés sous garde, comportement inchangé (l'ancienne API appelait déjà la nouvelle) : StreetMap ×7 (police `Verdana` gardée telle quelle, `GetDetailsViewSharedPtr`, `SetImportVersion`, `GetMaterialRelevance(GetShaderPlatform())`), `LPDumpAssetsCommandlet.cpp` (`EGetObjectsFlags`), `LPHairFromStaticMeshCommandlet.cpp` (`FInitializationParams`) ; `LifePlayEditor` 5.8 : 0 erreur, 0 avertissement (MSVC 14.50.35717), modules LPSandbox, LPAnimMeasure, LPModTools, StreetMap liés. Projet autonome `LPSandbox.uproject` : défaut trouvé (UBT ne cherche un `.uplugin` que dans les sous-dossiers d'un `AdditionalPluginDirectories`, le chemin désignait le dossier de LPAnimCore ; même défaut en 5.5, établi par le code) → `../LifePlay-master 5.8/Plugins` + `McpAutomationBridge`, `ModdingExtra`, `StreetMap` à `Enabled: false` (testé : code 0, 0/0) ; correction 5.5 reportée. Piège AP7 confirmé en 5.8 : la compilation autonome écrit `Plugins\LPSandbox\Binaries` au même BuildId que le jeu ; dossier déplacé vers `Backup_5.5\U4\T4c-binaries`. Faux succès UBT « Target is up to date » si le `.uproject` garde son horodatage. `Makefile.bin` déplacé vers `Backup_5.5\U4\Makefile`. Référence Mesure 5.5 refaite au pin `f9033a1` (identique à SB2-REF hors horodatages). Tournée 5.8 : E1 boîte `AgMakeout` identique au caractère (centre 20.831 / 1.400 / -0.534, étendue 41.180 / 50.958 / 89.466) → R1 validé ; E4 quaternius (8 avertissements identiques) et freeanims code 0 ; fichiers 44/44 et 73/73, images 20/20 (freeanims) ; écarts : bruit flottant ≤ 3,8e-6 et libellés de segment sur égalités à 0.00 (départage, estimé) → PASS-ÉCART. 1re tentative : plantage D3D12 (`D3D12Texture.cpp:1551`, back buffer 8×8, fenêtre minimisée) ; relance fenêtre visible OK. VAL U4-T7 : PASS (V1–V9), PASS-STATIC pour `BuildMod`, `EditMod`, `HairPipeline` (pas de mode à blanc). Copie 5.5 et addon 5.5 intacts, Mcp désactivé (P7) ; fichier parasite `{0}` déplacé vers `Backup_5.5\U4\stray` (livrables U4) | jeu : `git checkout U4-avant -- .` (ou `git revert` du commit) ; instantané `Tools\Restore.ps1 -Lot U4` (proposé, jamais lancé sans accord) ; addon : `git revert` du commit de la branche `ue5.8` ; worktree : `git worktree remove D:\Game\LifePlay-Sandbox-5.8` seulement sur décision de l'utilisateur ; skill : `git revert` du commit addon concerné | | CHG-253 | 2026-10-08 | U3 | branche `ue5.8` : `LifePlay.uproject` (EngineAssociation 5.8, `AdditionalPluginDirectories` retiré jusqu'à U4, `McpAutomationBridge` désactivé), `Source/LifePlay.Target.cs`, `Source/LifePlayEditor.Target.cs` (V7, Unreal5_8), `Config/DefaultEngine.ini` (`CompilerVersion=14.50.35717`), `Config/DefaultGame.ini` (`bUseZenStore=False`), `Config/DefaultScalability.ini` (`r.TranslucencyLightingVolume.Dim`), `Plugins/LPAnimCore/Source/LPAnimCore/LPCoupleSimCore.cpp` (R1), `Plugins/ModdingExtra/Source/ModdingExtra/Private/LPDataCache.cpp` (R2, forme A, D11), `Source/LifePlay/LifePlay.Build.cs` (commentaire), `Tools/Build.ps1` (nouveau), `Tools/RunCommandlet.ps1`, docs 27, 28 ; addon : skills `lp-build`, `lp-commandlets`, `lp-lot`, `lp-validate` (nouveau) ; hors dépôt : agents `lp-builder`, `lp-validator` | bascule sur UE 5.8 : compilation `LifePlayEditor` 0 erreur, 8 C4996 (StreetMap ×7, `LPDumpAssetsCommandlet.cpp:110`), MSVC 14.50.35717 ; `LPTestStringCompat` 3120/0/60 code 0 après renommage de la CVar dépréciée en 5.7 (ensure au démarrage, code 1) ; éditeur 5.8 ouvert et PIE joué par l'utilisateur, erreurs Blueprint identiques à 5.5 (3 signatures sur 47 propres à 5.8, U6) ; Zen commun 5.8.13 accepté par l'éditeur 5.5 ; R1 sans effet en jeu normal (repli de `FitToBodies`), contrôle décisif en U4 (Sandbox) ; outillage de compilation et de validation figé (`Build.ps1`, `-FromLog`, `lp-validate`) ; porte G-U3 remplie, VAL PASS (livrables `etat/U58/U3/`) | `git revert` du commit (ou `git checkout U3-avant -- .`) ; instantané `Tools\Restore.ps1 -Lot U3` ; addon : `git revert` de son commit ; agents : copies `D:\Game\LifePlay_Backup_5.5\U3\agents` | | CHG-252 | 2026-10-08 | U2 | branche `ue5.8` : `Source/LifePlayEditorTools` (32 fichiers `LPFix*`/`LPConvertAtmosphericFog` retirés, `LifePlayEditorTools.Build.cs`, `LPCheckMeshes`, `LPCheckStreetMap`, `LPTestStringCompat`), `Source/LifePlay` (`LPStringCompat`, `LPAssetRegistryHelpers.h`, `LPDataCompat.h`, `LPNavigationHelpers.h`), `Config/DefaultEngine.ini` (commentaires), `Config/DefaultGame.ini` (`StagingDirectory` `_5.8`), `Tools/Engine.ps1` (nouveau) et 9 scripts de `Tools`, 17 docs (bandeau « historique 4.27 » sur 12, docs 08, 09, 10, 13, index alignés), 27, 28 | retrait de l'outillage 4.27 (D3 : 16 commandlets, `LPResavePackages` et `LPTestStringCompat` gardés) ; un seul point de configuration du moteur, version lue dans `EngineAssociation` (surcharge `LP_ENGINE_ROOT`) ; `CheckIntegrity.ps1` sans référence 4.27 (`-InitRef`, référence Modules figée après G-U6) ; libellés « 4.27 » → « hérité(UE4) » sans changement de comportement ; compilation de contrôle UE 5.5 code 0 (toolset 14.38.33130), `LPTestStringCompat` 3120/0/60 ; VAL PASS | `git revert` du commit (ou `git checkout U2-avant -- .`) ; instantané `Tools\Restore.ps1 -Lot U2` | | CHG-251 | 2026-10-08 | U1 | `Docs/Migration/27_Plan_Migration_UE58.md`, `Docs/Migration/28_Synthese_Migration_UE58.md`, `Docs/Migration/21_Sandbox_Addon.md` (pin), index `Docs/Migration/README.md` ; addon `D:\Game\LifePlay-Sandbox` : `8ec9c64` commandlet `LPAuditBlueprintCalls` (`LPModTools`), `f0af432` skills `lp-*` (dont `lp-ue-compat` mis à jour), `558fe1d` pin | cartographie U1 : contrat des mods inchangé en 5.8 (R2 écarté par le code, recuisson obligatoire, `bUseZenStore` à fixer en U3) ; correctifs R1/R2 spécifiés avec garde de version (repli macro D11 b impossible) ; reliquats 4.27 et chemins moteur inventoriés, décisions utilisateur en § U2 ; relevé Blueprint (option b) : 110 Blueprints, 498 membres natifs, aucun nœud à corriger en 5.8 (estimé), 931 nœuds `Array_*` tolérés jusqu'en 5.9 ; pin addon `79f0205` → `f0af432`, consigné dans le doc 21 (`S3-INT.md` local) ; VAL PASS | `git revert` du commit ; addon : `git -C D:\Game\LifePlay-Sandbox revert 558fe1d f0af432 8ec9c64` et pin `79f0205` | | CHG-250 | 2026-10-08 | U0 | `Docs/Migration/27_Plan_Migration_UE58.md`, `Docs/Migration/28_Synthese_Migration_UE58.md`, `Tools/VS2026/LifePlay-UE58.vsconfig` (nouveau) ; hors dépôt : tag local `ue5.5-final`, copie `D:\Game\LifePlay-master 5.8` (branche `ue5.8`) | clôture de U0 : P1, P6, P7 verrouillées (G-U D5, D6, D4/D7) ; copie de travail 5.8 (17 087 fichiers, `.mcp.json` utilisateur conservé, jonction des skills) ; configuration VS Installer de VS 2026 suivie ; fiches T2, T2b, T3, T4, DOC1 et VAL déléguées (N0 haiku, N1 sonnet), VAL PASS | `git revert` du commit ; copie 5.8 : dossier à supprimer par l'utilisateur ; tag : `git tag -d ue5.5-final` | | CHG-249 | 2026-10-08 | U0-entrée | `.gitignore`, `Config/DefaultEngine.ini`, `Docs/Migration/27_Plan_Migration_UE58.md`, `Docs/Migration/28_Synthese_Migration_UE58.md` (nouveau), index `Docs/Migration/README.md`, `Docs/Migration/etat/` (92 fichiers retirés du suivi) | fiches de travail `etat/` hors dépôt (décision utilisateur : un doc de synthèse suffit ; copie `D:\Game\LifePlay_Backup_5.5\etat\`), `.cursor/` ignoré ; doc 28 = synthèse autonome UA + G-U + SK ; U0-T2/T2b : VS 2026 en coexistence, projet 5.5 épinglé `CompilerVersion=14.38.33130` (compilation de contrôle code 0, toolset 14.38.33130 au journal UBT), toolset 5.8 `14.50.35717` non banni (version `cl.exe` 14.50.35739) | `git revert` du commit ; les fichiers `etat/` restent sur le disque ; ini : `Tools\Restore.ps1 -Lot U0 -Only Config\DefaultEngine.ini` | | CHG-248 | 2026-10-08 | U-PLAN-2 | `Docs/Migration/27_Plan_Migration_UE58.md` | lot UA (audit jeu, plugins, mods, moteur, essai de compilation 5.8, effort et risques) et porte G-U avant tout portage ; orchestration révisée : Opus high orchestre, délègue jusqu'à Fable (niveaux N0–N5, grille de complexité a–f, fiche à 9 rubriques) ; agents `opus-xhigh`, `opus-max`, `fable-top` dans `~/.claude/agents/` | document seul : `git revert` du commit | | CHG-247 | 2026-10-08 | U-PLAN | `Docs/Migration/27_Plan_Migration_UE58.md` (nouveau), index `Docs/Migration/README.md` | plan de migration UE 5.5 → 5.8 (lots U0–U9) ; décisions utilisateur : 4.27 abandonné, gestion des mods figée, correctifs UE4 gardés avec voie UE5 préparée (U9), commandlets du portage 4.27 retirés (U2), dossier séparé `LifePlay-master 5.8`, V2.0 (2026.10.2.0) | document seul : `git revert` du commit | | CHG-246 | 2026-10-08 | DOCNUM | `Docs/Migration/23_Video_Quality.md` → `25_Video_Quality.md`, `24_Eval_Agents_VideoQuality.md` → `26_Eval_Agents_VideoQuality.md` (`git mv`, titres « 25 — », « 26 — »), références mises à jour (journal CHG-237 à 240, `etat/VQ/VQ5/VQ5-VAL.md`, docs 25/26), index `Docs/Migration/README.md` complété (20, 21, 22, 24, 25, 26), report « numéros en double » de `21_Sandbox_Addon.md` coché | numéros de docs en double (23, 24) ; renumérotation par ordre de création | `.\Tools\Restore.ps1 -Lot DOCNUM` | | CHG-245 | 2026-10-07 | DC4 | `LifePlay.uproject` (plugin `McpAutomationBridge` `"Optional": true`), `Source/LifePlay/LifePlay.Build.cs` (dépendance `Json` retirée), docs (`09_Commandes_Utiles.md`, `18_Build_Debug.md`, `21_Sandbox_Addon.md`, `24_Plan_Decouplage_Sandbox.md`, `etat/sandbox/DC4/*`) (commit code `fbbcee1`) | preuve « jeu seul » : clone strictement propre sans addon compile (éditeur + Development, code 0), build Development empaqueté sans addon (BUILD SUCCESSFUL), test en jeu utilisateur (nouvelle partie, sauvegarde, Continuer) ; défaut trouvé : `McpAutomationBridge` (ignoré par git) bloquait un clone propre ; piège UBT `Makefile.bin` documenté dans `09`/`18`. Motif : prouver que le jeu public compile et tourne sans l'addon `LifePlay-Sandbox` | pin inchangé `79f0205` | `.\Tools\Restore.ps1 -Lot DC4` | | CHG-244 | 2026-10-08 | PROP / ERR-043 | `Docs/Migration/etat/PROP/PROP-BUG.md`, `PROP-CART.md` ; dumps `etat/PROP/PROP_LPDumpFunction_20261008-*.txt` ; `Source/LifePlay/LPPersonPropGuardSubsystem.h/.cpp` (nouveaux) | « seul le verre reste apparent » : `destroyDummy` sans `clearProps` + mesh vide. Garde runtime : si Person caché ou `Mesh` sans SkeletalMesh → `clearProps` + purge tableau `Props` + enfants SMC `NODE_AddStaticMeshComponent*` seulement (pas les vetements `*SM`) ; si visible → retire props orphelines (parent ≠ Mesh ou socket None/invalide). Fiche bug complète (symptôme, repro, cause, non-causes, acceptation). Compile `LifePlayEditor` PASS ; **PIE à valider** | — → créés | supprimer `etat/PROP/` et les deux sources | | CHG-243 | 2026-10-08 | ERR-008 | `Source/LifePlay/LPMapMarkersGuardSubsystem.h/.cpp` (nouveaux) | garde runtime : si `MapMarkers.WidgetComponents` est vide, clear `Vector2Ds`, reconstitue depuis les `UWidgetComponent` existants ou ajoute un slot de focus invisible — évite le spam `Array_Get` / `Set Input Mode Game And UI` (FocusOnMapMarkers sans Length). Corrélé à l'approche PNJ (`updateAllPersonButtons` → `SpawnMapMarkers`). Live Coding PASS (nouvelle classe) | — → créés | supprimer ces deux fichiers | | CHG-242 | 2026-10-08 | VQ-fix | `Source/LifePlay/LPSettingsSubsystem.cpp`, `LPSettingsSubsystem.h` | contraste UI Settings : `HardenSettingsControls` force un style Slate sombre/lisible sur toutes les cases et SpinBox (valeurs pâles sur fond flou) ; ticker Settings à 0 pour que `ApplyRows` gagne face au BP. Compile `LifePlayEditor` PASS | — → modifiés | retirer `HardenSettingsControls` / remettre ticker 0.5 | | CHG-241 | 2026-10-08 | VQ-fix | `Source/LifePlay/LPSettingsSubsystem.cpp`, `Source/LifePlay/LPVideoQualitySubsystem.cpp` | correctifs post-VQ : (1) `CategoryOf` ignore les infobulles (faux positifs `screen`/`quality` → Sex Description, Map Marker, NewAnimationsOnly hors Video) + classements par nom UMG (`ShowFPS`, etc.) ; (2) `MainMenu.GI` rattaché sur l'écran titre (spinbox DoF / cases) ; (3) `RepairShowFPS` (style + enabled) ; (4) `ApplyRows` à chaque tick ouvert ; (5) `ApplyToScalability` n'écrit plus que les 4 `sg.*` en `SetByConsole` (fin du spam `SetByScalability ignored` sur ScreenPercentage/PoolSize/SSS). Live Coding PASS | — → modifiés | revenir sur les deux `.cpp` | | CHG-240 | 2026-10-07 | VQ5 | `Docs/Migration/26_Eval_Agents_VideoQuality.md` (nouveau), `Docs/Migration/etat/VQ/VQ5/VQ5-VAL.md` (nouveau) | clôture VQ5 : évaluation des agents du chantier VQ (lots VQ0–VQ4 tenus/coupés/rollback, qualité des consignes, modèle ↔ complexité dont Fable bloqué → repli Sonnet en VQ2-T2, sync PASS en code et BLOCKED-UI en jeu). Décision **GO conditionnel** avec 3 recommandations. Annexe VQ5-VAL : chemins Overall / Custom / Recommended PASS (code), smoke `-nullrhi` de VQ4 relu (pas de nouveau run : aucun code changé, chemins non atteignables par console). Constat : `DefaultScalability.ini` s'écarte de `BaseScalability.ini` au niveau Epic (cascades 10 → 4, `RadiusThreshold`, `DetailMode`, `RefractionQuality` 2 → 3) ; VQ1-VAL jamais produit ; VQ1 et VQ2 sans CHG. Documentation seule, aucun code | — → créés | supprimer ces deux fichiers | | CHG-239 | 2026-10-07 | VQ4 | `Docs/Migration/25_Video_Quality.md` (§ 8 Acceptation V1), `Docs/Migration/etat/VQ/VQ4/VQ4-VAL.md` (nouveau) | clôture V1 du chantier VQ : validation finale PASS (`SetLevels` sync, Recommended VRAM, `CategoryOf` `LPVideo*` + `TabHidden`, `LPColor*` toujours Video, `DefaultScalability.ini` sans cvar L7c : grep 0 hit, `DefaultEngine.ini` inchangé, DLL à jour, démarrage `-nullrhi` exit 0). Critères d'acceptation cochés dans le doc 23 ; test manuel Settings resté BLOCKED-UI. Documentation seule, aucun code | - créés / modifiés | supprimer `VQ4-VAL.md` et retirer le § 8 du doc 23 | | CHG-238 | 2026-10-07 | VQ3 | `Source/LifePlay/LPVideoQualitySubsystem.cpp`, `Source/LifePlay/LifePlay.Build.cs` (module `RHI`), `Docs/Migration/25_Video_Quality.md` (§ 2 Sync), `Docs/Migration/etat/VQ/VQ3/VQ3-IMPL-H.md`, `VQ3-VAL.md` (nouveaux) | lot VQ3 : le bouton `LPVideoRecommended` n'applique plus un niveau fixe mais lit la VRAM dédiée (`RHIGetTextureMemoryStats`, `DedicatedVideoMemory`) : < 4 Go Low, < 6 Med, < 10 High, sinon Epic ; VRAM inconnue (0 / -1 / `-nullrhi`) = High. Application par `SetLevels(FromOverall(niveau), true)` (alignement des 4 curseurs, `Save`, `RefreshWidgets`). Compile `LifePlayEditor` OK, démarrage `-nullrhi` OK ; test manuel Settings BLOCKED-UI | — → modifiés | restaurer le stub (niveau 2 fixe) dans `OnRecommendedClicked` et retirer `RHI` de `LifePlay.Build.cs` | | CHG-237 | 2026-10-07 | VQ0 | `Docs/Migration/25_Video_Quality.md` (nouveau, ébauche), `Docs/Migration/etat/VQ/VQ0/VQ0-VAL.md` (nouveau) | lot VQ0 : validation A-VAL de la cartographie Video (`VQ0-CART`, PASS) ; ébauche de référence qualité vidéo (périmètre V1, sync GameUserSettings/Scalability, ancrage L7c, injection `LPVideo*` avant `LPColor*`, conflits BP Shadow/PP/AA). Documentation seule, aucun code | — → créés | supprimer ces fichiers | | CHG-236 | 2026-10-07 | DC3 | jeu : retrait (57 fichiers suivis) de `Tools/BuildMod.ps1`, `NewMod.ps1`, `EditMod.ps1`, `ModSource.ps1`, `HairPipeline.ps1`, `HairImportFbx.py`, `HairMaterials.py`, `FbxMaterialMap.py`, `ImportQuaternius.py`, `DiagnosePose.py`, `Tools/anim/`, `Tools/hairs/`, `Tools/mods/`, `ModSources/`, `AnimSources/`, `Config/LPSandbox.ini`, `Tools/debug/*_sandbox.bat`, `Docs/Modding/FullGuides/Creating_Asset_Mods.md`, `Docs/Modding/ShortGuides/explanation.lphair` (contenu disque déplacé, non supprimé, vers `D:\Game\LifePlay_Backup_5.5\DC3\deplaces_du_jeu`) ; références `SplitModules.ps1`, `LPModInfoSubsystem.h`, `BuildDebug.ps1`, `explanation.lpmod`, `README.md`, `.gitignore` ; docs (`21_Sandbox_Addon.md`, `09_Commandes_Utiles.md`, `13_Protocole_Coiffure.md`, `16_H3_Mods_Paquets.md`, `10_Protocole_Operations.md`, `23_Cycle_De_Vie_Mod.md`, `20_Chaine_Animations.md`, `README.md`, `etat/sandbox/S3/S3-INT.md`, `etat/sandbox/DC3/*`) ; addon `D:\Game\LifePlay-Sandbox` : atelier de mods (`Tools/*`, `Tools/Roots.ps1` nouveau, `ModSources`, `AnimSources`, lanceurs, `Docs/Modding`, `Config/LPSandbox.ini` section `[Workshop]`, `.gitignore`), `LPAnimCatalogCommandlet.cpp` (`-Livraison=` obligatoire), `LPAnimMeasurePaths.cpp/.h` et `LPSandboxConfig.cpp` (replis vers le jeu retirés) (commits `1f4ec1f` et `79f0205b7281152dde7cd088086d8c813e0b20f5`, branche `lot/DC3-atelier`, tag `lot-DC3-valide`) | lot DC3 : l'atelier de mods vit dans l'addon ; cuisson de `lpr_anim_freeanims` depuis l'addon identique au mod publié (29 fichiers, SHA-256) ; tournée freeanims identique à SB2-REF (DC3-VAL PASS) ; piège UBT `Makefile.bin` (cache généré sans addon) traité. Motif : le jeu public ne doit plus embarquer l'outillage ni les sources de mods du dépôt privé `LifePlay-Sandbox` | pin `97c0d13` → `79f0205` (hash complet `79f0205b7281152dde7cd088086d8c813e0b20f5`) | `.\Tools\Restore.ps1 -Lot DC3` (jeu ; remettre aussi le contenu de `DC3\deplaces_du_jeu`) et `.\Tools\Restore.ps1 -Lot DC3-addon -ProjectRoot D:\Game\LifePlay-Sandbox` ; pin `97c0d13` | | CHG-235 | 2026-10-07 | DC2 | jeu : `Source/LifePlayEditorTools/` (13 sources retirées : `LPAnimEvalCommandlet`, `LPAnimTwistCommandlet`, `LPAnimCatalogCommandlet`, `LPAnimIdentifyCommandlet`, `LPAnimChecks`, `LPHairFromStaticMeshCommandlet` en `.h/.cpp`, `LPAnimMethodSelect.h`), `LifePlayEditorTools.Build.cs`, docs (`21_Sandbox_Addon.md`, `20_Chaine_Animations.md`, `09_Commandes_Utiles.md`, `08_Guide_Developpeur.md`, `etat/sandbox/S3/S3-INT.md`, `etat/sandbox/DC2/*`) ; addon `D:\Game\LifePlay-Sandbox` : module `LPModTools` (nouveau), `LPAnimMeasurePaths.h/.cpp` (nouveau), `LPSkeletonProfile.cpp`, `LPPoseMeasure.cpp`, `LPAnimMeasure.Build.cs`, `LPSandboxConfig.cpp`, `LPSandbox.uplugin` (commit `97c0d134cd1388c3735add79d77ea98817e89fbe`, branche `lot/DC2-modtools`, tag `lot-DC2-valide`) | lot DC2 : les commandlets de mods (`LPAnimEval`, `LPAnimTwist`, `LPAnimCatalog`, `LPAnimIdentify`, `LPHairFromStaticMesh`) passent dans le module éditeur `LPModTools` de l'addon ; le jeu compile sans l'addon (DC2-BUILD) et démarre sans lui (DC2-VAL E5) ; résultats identiques à SB2-REF (DC2-VAL PASS). Motif : le jeu public ne doit plus dépendre du dépôt privé `LifePlay-Sandbox` pour son outillage éditeur | pin `3e9c32f` → `97c0d13` (hash complet `97c0d134cd1388c3735add79d77ea98817e89fbe`) | `.\Tools\Restore.ps1 -Lot DC2` (jeu) et `.\Tools\Restore.ps1 -Lot DC2-addon -ProjectRoot D:\Game\LifePlay-Sandbox` ; pin `3e9c32f` | | CHG-234 | 2026-10-07 | DC1 | jeu : `Plugins/LPAnimCore/*` (nouveau plugin : `LPAnimRedirect.*`, `LPCoupleSim.h`, `LPCoupleSimCore.cpp`), `LifePlay.uproject`, `Source/LifePlay/LifePlay.Build.cs`, docs (`21_Sandbox_Addon.md`, `20_Chaine_Animations.md`, `07_Architecture_5.5.md`, `etat/sandbox/S3/S3-INT.md`, `etat/sandbox/DC1/*`) ; addon `D:\Game\LifePlay-Sandbox` : `LPSandbox.uproject`, `LPSandbox.uplugin`, `LPAnimMeasure.Build.cs`, `LPAnimMeasure.h`, `LPSandbox.Build.cs`, suppression de `LPAnimRedirect.*`, `LPCoupleSim.h`, `LPCoupleSimCore.cpp` (commit `3e9c32f1f27b1abdaf7731dc90496c27ee061718`, branche `lot/DC1-animcore`, tag `lot-DC1-valide`) | lot DC1 : `LPAnimRedirect` et `LPCoupleSim` rapatriés dans le plugin `LPAnimCore` du jeu, `LPAnimMeasure` réduit à la mesure ; compilation PASS, DC1-VAL PASS, contrôle visuel utilisateur 2026-10-07 ; report DC0 SetUALRoot traité. Motif : le jeu public doit compiler sans le dépôt privé `LifePlay-Sandbox` (premier pas du découplage) | pin `16905c6` → `3e9c32f` (hash complet `3e9c32f1f27b1abdaf7731dc90496c27ee061718`) | `.\Tools\Restore.ps1 -Lot DC1` (jeu) et `.\Tools\Restore.ps1 -Lot DC1-addon -ProjectRoot D:\Game\LifePlay-Sandbox` ; pin `16905c6` | | CHG-233 | 2026-10-07 | DC0 | `Docs/Migration/24_Plan_Decouplage_Sandbox.md` (nouveau), `Docs/Migration/etat/sandbox/DC0/DC0-CART.md`, `DC0-SPEC.md`, `DC0-VAL.md` (nouveaux) | lot DC0 : plan du découplage jeu / sandbox (lots DC0 à DC4), cartographie et SPEC approuvées par l'utilisateur le 2026-10-07 (plugin `LPAnimCore` dans le jeu, module éditeur `LPModTools` et tout l'outillage de mods dans l'addon, dépôt Sandbox privé) ; documentation seule, aucun code. Motif : le jeu public doit compiler sans le dépôt privé `LifePlay-Sandbox` (`LifePlay` et `LifePlayEditorTools` dépendent de `LPAnimMeasure`) | aucun pin (documentation seule) | supprimer ces fichiers (documentation seule) ; rien n'est commité dans le dépôt du jeu ni poussé | | CHG-232 | 2026-10-07 | SB4 | addon `D:\Game\LifePlay-Sandbox` : `Plugins/LPSandbox/Source/LPSandbox/LPPairSandbox.cpp`, `LPSandboxModRegistry.cpp`, `LPSandboxModRegistry.h` (SB4-T0 : ouverture par déclencheur éphémère non mémorisée, `sandbox_mode.txt` du pilote), `README.md` (commits `16905c68070992f5139dab907b41b461fb765957` code + pin, tag `lot-SB4-valide`, branche `lot/SB4-final`, tag d'entrée `lot-SB4-avant` = `30e8c18`) ; jeu : `Docs/Migration/etat/sandbox/SB4/SB4-BUILD.md`, `SB4-VAL.md`, `SB4-EVAL.md`, `Docs/Migration/23_Cycle_De_Vie_Mod.md` (§ 7), `Docs/Migration/21_Sandbox_Addon.md`, `Docs/Migration/etat/sandbox/S3/S3-INT.md` | lot SB4 (dernier lot de la sandbox modulaire) : SB4-T0 correctif (ouverture par déclencheur éphémère, `Open=lps_couple` intact), compilation PASS, validation finale F1 à F4 PASS (démarrage, tournées Quaternius et FreeAnimationsPack identiques à SB2-REF, LPAnimEval identique), doc 23 § 7, évaluation `SB4-EVAL.md` : décision GO pour transposer au jeu par petits lots | pin `3d85852` → `16905c6` (hash complet `16905c68070992f5139dab907b41b461fb765957`) | `.\Tools\Restore.ps1 -Lot SB4` (docs du jeu), `.\Tools\Restore.ps1 -Lot SB4-addon -ProjectRoot D:\Game\LifePlay-Sandbox` et `git -C D:\Game\LifePlay-Sandbox checkout lot-SB4-avant` ; rien n'est commité dans le dépôt du jeu ni poussé | | CHG-231 | 2026-10-07 | SB2-O1 | addon `D:\Game\LifePlay-Sandbox` : `Plugins/LPSandbox/Source/LPSandbox/LPSandboxScene.cpp` (`ALPSandboxScene::ShowRoom` : `SetHiddenInGame(false)` puis `SetVisibility(true, true)` sur meubles et murs), `README.md` (commits `3d858527fccfdddd8711c7c7448fa001442e0b8a` code + `30e8c18` pin, tag `lot-SB2-O1-valide`, branche `lot/SB2-O1`, tag d'entrée `lot-SB2-O1-avant` = `b4ca206`) ; jeu : `Docs/Migration/etat/sandbox/SB2/SB2-O1-BUILD.md`, `Docs/Migration/etat/sandbox/S3/S3-INT.md`, `Docs/Migration/21_Sandbox_Addon.md` (pin, reports SB2, porte G-SB3) | mini-lot SB2-O1 : correction du défaut O1 (meubles et murs invisibles au retour de Mesure, `ShowRoom` rendu symétrique de `HideRoom`) ; compilation PASS ; tournée freeanims identique à SB2-REF (73/73 fichiers, JSON/CSV/TXT identiques) ; contrôle visuel utilisateur « c'est bon » (meubles et murs visibles en revenant de Mesure vers Couple et Interaction). Porte G-SB3 (décision utilisateur 2026-10-07) : SB3 abandonné (plugins physiques séparés non faits) ; les mods du jeu sont du contenu (.lpmod + pak), leurs dépendances sont vérifiées par le registre (prouvé en SB1/SB2), coût ≈ 1 à 1,5 lot, `LPAnimMeasure` utilisé par le jeu en Shipping ; on passe à SB4 ; E3 non traité | pin `fece7e9` → `3d85852` (hash complet `3d858527fccfdddd8711c7c7448fa001442e0b8a`) | `.\Tools\Restore.ps1 -Lot SB2-O1` (docs du jeu), `.\Tools\Restore.ps1 -Lot SB2-O1-addon -ProjectRoot D:\Game\LifePlay-Sandbox` et `git -C D:\Game\LifePlay-Sandbox checkout lot-SB2-O1-avant` ; rien n'est commité dans le dépôt du jeu ni poussé | | CHG-230 | 2026-10-07 | SB2 | addon `D:\Game\LifePlay-Sandbox` : `Plugins/LPSandbox/Source/LPSandbox/*` (nouveaux `LPSandboxScene.h/.cpp` ex-`LPSandboxRoomBuilder.cpp`, `LPSandboxActors.h/.cpp`, `LPSandboxCamera.h/.cpp`, `LPSandboxCoupleMod.h/.cpp` ex-`LPCoupleSim.cpp`, `LPSandboxInteractionMod.h`, `LPSandboxMeasureMod.h` ; registre, enveloppes, `LPPairSandbox*`, `LPSandboxInteraction/Measure/MeasureTour` adaptés), `Plugins/LPSandbox/Modules/Mods/lps_asset_integration/lps_asset_integration.lpmod`, `README.md` (commits `fece7e9a0e63b3058b5d24d96d669a3c9c0e9add` code + `b4ca206` pin, tag `lot-SB2-valide`, branche `lot/SB2-bibliotheques`) ; jeu : `Docs/Migration/etat/sandbox/SB2/SB2-VAL.md`, `Docs/Migration/etat/sandbox/S3/S3-INT.md`, `Docs/Migration/21_Sandbox_Addon.md` (pin, SB2, reports) | lot SB2 : scène (pièce, meubles), personnages et caméra extraits du socle en bibliothèques `lps_lib_scene` / `lps_lib_actors` et caméra du socle ; état de chaque mode sorti vers trois mods UObject (`lps_couple`, `lps_interaction`, `lps_asset_integration`) ; contexte filtré par prérequis ; décisions D1 à D7 (voir `etat/sandbox/SB2/SB2-CART.md`) ; validation E1 à E5 PASS + contrôle visuel utilisateur (« tout est conforme » : 3 mods, enchaînement, scène neutre D3, panneau sous MC/PNJ D5, images freeanims) ; O1 (murs et meubles invisibles au retour de Mesure) confirmé par l'utilisateur, préexistant, non corrigé (hors périmètre) | pin `82dae58` → `fece7e9` (hash complet `fece7e9a0e63b3058b5d24d96d669a3c9c0e9add`) | `.\Tools\Restore.ps1 -Lot SB2` (docs du jeu), `.\Tools\Restore.ps1 -Lot SB2-addon -ProjectRoot D:\Game\LifePlay-Sandbox` et `git -C D:\Game\LifePlay-Sandbox checkout lot-SB2-avant` ; rien n'est commité dans le dépôt du jeu ni poussé | | CHG-229 | 2026-10-07 | SB1 | addon `D:\Game\LifePlay-Sandbox` : `Plugins/LPSandbox/Source/LPSandbox/*` (registre `FLPSandboxModRegistry`, journal `LogLPSandboxMods`, `Saved/sandbox_mods.ini`, barre latérale, enveloppes), `Plugins/LPSandbox/Modules/` (7 descripteurs `.lpmod`), `README.md` (commits `82dae58380b76c45f60541fd7cb5a0a409700e10` code + commit pin, tag `lot-SB1-valide`, branche `lot/SB1-registre`) ; jeu : `Docs/Migration/etat/sandbox/SB1/SB1-VAL.md`, `Docs/Migration/etat/sandbox/S3/S3-INT.md`, `Docs/Migration/21_Sandbox_Addon.md` (pin, SB1, reports) | lot SB1 : registre de mods, barre latérale, 7 descripteurs ; modes Pair / Interaction / Mesure enveloppés en `lps_couple` / `lps_interaction` / `lps_asset_integration` ; validation E1 à E5 PASS + contrôle visuel utilisateur (a, b, c, barre latérale, images E5 : pas de défauts constatés) | pin `3b21fd1` → `82dae58` (hash complet `82dae58380b76c45f60541fd7cb5a0a409700e10`) | `.\Tools\Restore.ps1 -Lot SB1` (docs du jeu), `.\Tools\Restore.ps1 -Lot SB1-addon -ProjectRoot D:\Game\LifePlay-Sandbox` et `git -C D:\Game\LifePlay-Sandbox checkout lot-SB1-avant` ; rien n'est commité dans le dépôt du jeu ni poussé | | CHG-228 | 2026-10-07 | SB0 | addon `D:\Game\LifePlay-Sandbox` : `Docs/SB0-conception.md`, `Docs/SB-plan.md`, `README.md` (commits C1 `3b21fd1`, C2 `12d6198`, tags `lot-SB0-avant` / `lot-SB0-valide`, branche `lot/SB0-conception`) ; jeu : `Docs/Migration/etat/sandbox/S3/S3-INT.md`, `Docs/Migration/21_Sandbox_Addon.md` (pin) | conception de la sandbox modulaire demandée par l'utilisateur (modes Pair/Interaction/Mesure → mods `lps_couple` / `lps_interaction` / `lps_asset_integration`, modules système et bibliothèques `lps_*`, `.lpmod` étendu rétrocompatible, interface `ILPSandboxMod`, registre, barre latérale ; plan SB0–SB4 au format du cahier S0–S8) | pin `a3b1b89` → `3b21fd1` (hash complet `3b21fd180c04f0fa49a1b5c9ef1b517ade1cb362`) | `.\Tools\Restore.ps1 -Lot SB0` (jeu) et `.\Tools\Restore.ps1 -Lot SB0-addon -ProjectRoot D:\Game\LifePlay-Sandbox` ; commits addon conservés dans l'historique (branche) ; rien n'est commité dans le dépôt du jeu ni poussé | | CHG-227 | 2026-10-07 | DOC-MOD-3 | `Docs/Migration/23_Cycle_De_Vie_Mod.md` (§ 2.6 nouveau, 7 schémas Mermaid) | schémas du cycle de vie d'un module demandés par l'utilisateur : états (installé, monté, listé, inscrit, actif / inactif, retiré, déchargé), séquence de démarrage (moteur, registre, `GI`, sous-systèmes C++), arbres logiques de `GI.LoadSettings(LoadLastSave)`, `GI.PopulateRaws()`, du gestionnaire (`CreateModManagerWidget(GameStart)`, `ToggleMod(Mod, IsEnabled)`, `SortLoadOrder(ForUp, ModuleIndex)`, `CloseModManager(GameStart)`), appel d'une animation de mod, désactivation et déchargement ; graphes reconstitués depuis le relevé `LPDumpFunction -BP=GI -Fn=EventGraph -Pins -Exec` et l'ordre d'initialisation de `UGameInstance` (moteur) ; 7 schémas rendus sans erreur par Mermaid 11 | aucun changement de code ni de configuration | `.\Tools\Restore.ps1 -Lot DOC-MOD-3` | | CHG-226 | 2026-10-07 | DOC-MOD-2 | `Docs/Migration/23_Cycle_De_Vie_Mod.md` (§ 2.4, 3.1, 3.2, 3.3 et 3.4 nouveaux, 5, 6) ; `Docs/Migration/Journal_Modifications.md` | complément de la documentation du cycle de vie d'un mod, constats vérifiés dans les Blueprints (`GI`, `UI/ModuleTick`, relevés `LPDumpFunction`) et le moteur UE 5.5 : l'ordre de chargement existe (`GI.SortLoadOrder`, `PopulateRaws` : le premier fichier lu par nom gagne, le module le plus bas l'emporte, fichiers texte seulement) ; `vin_Base` verrouillé en dur dans `UI/ModuleTick` ; dépendance `.uplugin` obligatoire absente = le jeu ne démarre pas, donc aucune dépendance entre mods dans le `.uplugin` ; doublons entre `.uplugin`, `.lpmod` et `pack.json`, divergences dues à `New-IfMissing` de `DeliverAnims.ps1` ; évolutions E12 corrigée, E13 à E15 ajoutées | aucun changement de code ni de configuration | `.\Tools\Restore.ps1 -Lot DOC-MOD-2` | | CHG-225 | 2026-10-07 | DOC-MOD | `Docs/Migration/23_Cycle_De_Vie_Mod.md` (nouveau) ; `Docs/Migration/README.md` (ligne d'index) | documentation demandée par l'utilisateur : cycle de vie d'un mod, propriétés réellement lues par le moteur (`.uplugin`) et par le jeu (`.lpmod`), classes, architecture, capacités, évolutions possibles. Constat consigné : `LPModDailies` ne consulte pas la case du gestionnaire de mods (un pack d'animations décoché fournit encore ses clés, évolution E1) ; `MODULE_REQUIREMENTS` n'est pas vérifié | aucun changement de code ni de configuration | supprimer `23_Cycle_De_Vie_Mod.md` et cette entrée ; `.\Tools\Restore.ps1 -Lot DOC-MOD` | | CHG-224 | 2026-10-07 | AP7 | Cuisson DLC et essai en jeu empaqueté. `Config/DefaultGame.ini` : `ProjectVersion=2026.10.1.6` (version de référence d'essai, non publiée) ; `+DirectoriesToNeverCook` pour `/Game/Quaternius`, `/Game/FreeAnimationsPack`, `/Game/AnimPacks`, `/Game/Retarget_ue5` (sources de travail, jamais dans le jeu). `Tools/anim/DeliverAnims.py` : à la copie dans le mod, les réglages de compression qui pointent sur `/Engine/` sont remis à vide (les clips d'un pack UE5 référençaient `/Engine/Animation/DefaultAnim*CompressionSettings` : cuisson DLC refusée) ; la compression par défaut du projet s'applique, comme pour Quaternius | lot AP7, étape 7. Empaquetage Shipping `2026.10.1.6` (`D:\Game\LifePlay_Build_5.5_Shipping_AP7\Windows`, `Releases/2026.10.1.6`) ; mods cuits contre cette version : `lpr_anim_quaternius` (84 paquets, zip 15 798 332 o), `lpr_anim_freeanims` (20 paquets, 0 référence moteur, zip 4 416 299 o) dans `D:\Game\LifePlay_Publication\Mods\` ; module d'essai `lpr_anim_essai` copié dans le seul jeu d'essai (hors du projet : `LifePlay_Backup_5.5/AP7/hors_build`). **Essai utilisateur en jeu empaqueté : animations jouées** (`qua_*`, `fap_*`, témoin `dance`) | `.\Tools\Restore.ps1 -Lot AP7` ; supprimer `D:\Game\LifePlay_Build_5.5_Shipping_AP7` et `Releases/2026.10.1.6` ; rien n'est commité dans le dépôt du jeu | | CHG-223 | 2026-10-07 | AP7 | Pilote. `Tools/anim/AnimPipeline.ps1` (étapes 0 inventaire, 1 import, 2 identification, 3 calque, 4 conversion + torsion, 5 évaluation + rapport HTML + vignettes et planches par la sandbox, 6 livraison dans le mod + fiches + catalogue, 7 cuisson DLC ; rapport JSON par étape dans `Saved/AnimPipeline//etapes`, `etat.json`, arrêt au premier contrôle en échec, reprise `-From`, ancien contenu déplacé dans `precedent_`, `-DryRun`, `-SansCuisson`) ; `BuildMod.ps1 -Anim ` ; `pack.json` étendu (bloc `chaine` : méthode, profil attendu, source glb|uasset, sorties, corps et gabarits Daz `Idle_F_Daz` / `idle_Daz`, mod, dossier de travail, sortie sandbox) ; `AnimSources/freeanims/pack.json` (licence CC BY 4.0, auteur SoerGame, page Fab, page de l'auteur `url_auteur`, 10 animations déclarées) ; outils de livraison et de catalogue génériques (`DeliverAnims -Pipeline -Pack -Vignettes -Planches`, textes du mod et lien d'auteur tirés de `pack.json`, adresse de la source dans `CREDITS.txt`). Défauts corrigés pendant les passages réels : console `start /wait` restée ouverte (lancement par `cmd /c`), lancement de la sandbox par un tuyau qui attendait sa fermeture | lot AP7. Quaternius de bout en bout (reprises à l'étape 4 puis 5 après corrections) : mesures, verdicts, fiches et catalogue identiques au passage précédent (42 fiches, 42 vignettes, 42 planches) ; FreeAnimationsPack de bout en bout en 10 min, code 0 : mod `lpr_anim_freeanims` (10 clips × 2, `.lpmod` CC BY 4.0, crédits), catalogue de 10 fiches. Étape 7 (cuisson DLC) non faite : la version de référence `Releases/2026.10.1.5` (V1.5) ne contient ni le correctif de `Person` ni `LPModDailies` ; nouvel empaquetage à décider avec l'utilisateur | `.\Tools\Restore.ps1 -Lot AP7` (jeu) et `.\Tools\Restore.ps1 -Lot AP7-addon -ProjectRoot D:\Game\LifePlay-Sandbox` (sources de l'addon ; les commits de l'addon restent dans son historique) ; rien n'est commité dans le dépôt du jeu | | CHG-222 | 2026-10-07 | AP7 | Conversion et sandbox. `Tools/RetargetQuaternius.py` déplacé en `Tools/anim/RetargetPack.py`, piloté par `Saved/anim_retarget.json` (méthode, maillage source, dossiers, corps, exclusions, dossier des poses ; défauts = Quaternius, noms d'assets inchangés ; rigs suffixés pour les autres méthodes) ; jeton de cuisson (BuildMod ne retient que les lignes `RETARGET … jeton `). `BuildMod.ps1` : chemins entre guillemets au lancement de l'éditeur (le dossier contient une espace ; l'éditeur se fermait sans journal), lecture complète des journaux modifiés depuis le lancement (l'ancienne lecture à partir de la taille du précédent `LifePlay.log` sautait la ligne de résultat), attente de fermeture de l'éditeur portée à 10 min, `-RetargetConfig`, `-Anim`. Addon `LifePlay-Sandbox` (commits `a3b1b89` puis `159afbf`, pin mis à jour dans `etat/sandbox/S3/S3-INT.md`, `21_Sandbox_Addon.md` et README de l'addon) : `[Sandbox.Pack]` + surcharge `Saved/sandbox_pack.ini` (mode Mesure seulement), `LPAnimRedirect::BodyClipPath`, clip initial du pack, tournée `vignettes planches quitter` (enchaînement et fermeture). Piège rencontré : des DLL périmées du plugin dans `LifePlay-Sandbox/Plugins/LPSandbox/Binaries` (même BuildId) étaient chargées à la place des neuves ; dossier déplacé (non supprimé) dans `LifePlay_Backup_5.5/AP7-addon/Binaries_perimes_2036` | lot AP7 : FreeAnimationsPack (10 clips) converti en `ue5` : 0 rejeté, 0 à revoir, écart 0,0006 %, torsion 0,015° ; **validé visuellement par l'utilisateur** dans la sandbox | `.\Tools\Restore.ps1 -Lot AP7` (jeu) et `.\Tools\Restore.ps1 -Lot AP7-addon -ProjectRoot D:\Game\LifePlay-Sandbox` (sources de l'addon ; les commits de l'addon restent dans son historique) ; rien n'est commité dans le dépôt du jeu | | CHG-221 | 2026-10-07 | AP7 | Méthodes de transformation et identification du squelette. Profil `Tools/anim/profiles/ue5_mannequin.json` (SK_Mannequin UE5, colonne 5 os, cou 2, réglages A→T optionnels) ; méthodes `Tools/anim/methodes/ue4.json` (pose T, ex-« Quaternius »), `ue5.json` (pose A : calques = repos du mannequin UE5 et de Genesis, ajusté à la morphologie), `genesis_direct.json` (copie Daz, déclarée factice). Principe (demande de l'utilisateur) : 1) la pose du mannequin, A ou T, est le calque d'origine ; 2) Bridget et Michael sont placés dans la même pose, calque ajusté à leur morphologie ; 3) le convertisseur choisit le profil de transformation ; 4) application. Addon `LPAnimMeasure` : `SetMethod`, `MethodForProfile`, calque par méthode (`MakeTPose`), cache d'ajustement par méthode, identification à égalité → profil le plus complet (le mannequin UE5 contient tous les noms UE4 : il était pris pour UE4 à 100 %). Commandlets du jeu : `LPAnimIdentify` (nouveau : scores par profil, os manquants, squelette, méthode ; contrôle croisé avec le module de mesure), `-Methode=` sur `LPAnimEval` et `LPAnimTwist` (`Source/LifePlayEditorTools/LPAnimMethodSelect.h`), `-BodyClipDir`, `-Templates`, `-PoseOnly`, borne des réglages séparée pour les doigts `-SeuilReglageDoigts=45` (corps : 30 ; la main du mannequin UE5 est au repos légèrement fermée : ajustement des doigts ≈ 31°) | lot AP7 de `20_Chaine_Animations.md`. Non-régression : Quaternius en `auto` → `ue4`, toutes valeurs et verdicts identiques à AP4 (écart de torsion 4e-5°) | `.\Tools\Restore.ps1 -Lot AP7` (jeu) et `.\Tools\Restore.ps1 -Lot AP7-addon -ProjectRoot D:\Game\LifePlay-Sandbox` (sources de l'addon ; les commits de l'addon restent dans son historique) ; rien n'est commité dans le dépôt du jeu | | CHG-220 | 2026-10-06 | S8 | `Docs/Migration/22_Eval_Agents_Sandbox.md` (nouveau) ; `Docs/Migration/etat/sandbox/S8/S8-VAL.md` (nouveau) ; `Docs/Migration/21_Sandbox_Addon.md` (§ Acceptation : S8 coché, push addon coché, deux cases ouvertes ajoutées `BuildMod -Target` et commit côté jeu ; ligne S8 du tableau des lots) ; `Saved/Logs/S8-VAL-runtime-game.log` (copie locale, non versionnée) | lot S8-T1/T2 : bilan du mode multi-agents + multi-modèles sur S0–S7 (lots tenus / coupés, consignes et reprises, adéquation modèle ↔ fiche : 11 fiches sur 27 tracent le modèle réel, S3-T3 sous-classé, S2-T2 sur-classé ; erreurs de rôle ; friction git : submodule abandonné, jeu jamais commité, trois identités git) ; décision **GO conditionnel** et 3 recommandations (politique modèles tracée, clôture git par lot, séparation VAL / DOC + registre des reports) ; validation S8-VAL **PASS** : `Tools/debug/LifePlay_pair_sandbox.bat` lancé tel quel, plugin monté, `LPPairSandboxGameMode`, 16 lignes `LogLPSandbox`, boîte `AgMakeout` identique à S5 / S7-VAL, 0 crash ; constat : `origin/main` addon = `dae6206` (pin `f09c42e` poussé) | aucun changement de code C++ ni de configuration | retirer `22_Eval_Agents_Sandbox.md`, `etat/sandbox/S8/`, cette entrée ; rétablir § Acceptation et ligne S8 de doc 21 (état S7) | | CHG-219 | 2026-10-06 | S7 | `LifePlay.uproject` (plugin `LPSandbox` : `Optional: true`) ; repo addon `LifePlay-Sandbox` `Plugins/LPSandbox/LPSandbox.uplugin` (`SupportedTargetPlatforms: ["Win64"]`, module `LPSandbox` : `TargetConfigurationDenyList: ["Shipping"]`, description ; commit local `f09c42e`, non poussé) ; `Docs/Migration/21_Sandbox_Addon.md` (§ Acceptation, ligne S7, pin), `Docs/Migration/etat/sandbox/S3/S3-INT.md` (pin) ; `Docs/Migration/etat/sandbox/S7/S7-SPEC.md`, `S7-IMPL-L.md`, `S7-CART.md`, `S7-VAL.md` (nouveaux) ; `Saved/Logs/S7-VAL-*.log` (copies locales, non versionnées) | lot S7-T1..T4 : contrat d'isolation du plugin (aucun include / `LIFEPLAY_API` / module `LifePlay` : 0 résultat ; `Person` en lecture de CDO seule, aucun `GI` / `Room` ; chemins par config) ; `LPSandbox` exclu du Shipping (`TargetAllowList: ["Editor"]` rejeté : le sandbox tourne en `-game`), `LPAnimMeasure` conservé car requis par `LifePlay.Build.cs` ; validation S7-VAL **PASS** : build `LifePlayEditor Development` à jour, plan UBT Game Development (6 occurrences `LPSandbox`) / Shipping (0), smoke Pair ~1 min 45 s (boîte AgMakeout identique à S5-VAL, 0 crash) ; limites : pas de compilation Shipping complète, commit addon non poussé, `Optional` n'évite pas l'échec du build sans clone sibling | aucun changement de code C++ | `git revert f09c42e` dans l'addon, retirer `"Optional": true` du `.uproject`, remettre le pin `c1fdd29`, retirer `S7/`, § Acceptation et l'entrée journal | | CHG-218 | 2026-10-06 | S6 | `Docs/Migration/20_Chaine_Animations.md`, `Docs/Migration/09_Commandes_Utiles.md`, `Docs/Migration/21_Sandbox_Addon.md` (lot S6), `Docs/Migration/etat/sandbox/S6/S6-VAL.md` (nouveau) ; `Saved/AnimPipeline/S6-VAL/`, `Saved/Logs/S6-VAL-LPAnimEval.log` (copies locales, non versionnées) | lot S6-T1…T3 : confirmation que `LifePlayEditorTools.Build.cs` dépend déjà de `LPAnimMeasure` (module addon, aucun include cassé, 0 fichier `Source/LPAnimMeasure/`) ; build `LifePlayEditor Win64 Development` à jour ; doc chaîne animations et commandes alignées (plugin `LPSandbox`, bats `Tools/debug`, sorties `Saved/Measurement`, commandlets `LPAnimEval` / `LPAnimTwist` / `LPAnimCatalog`) ; validation S6-VAL **PASS** : `-run=LPAnimEval -Clips=Idle_Loop -Instants=1` (~1,3 s, code 0, `rapport.json` valide, `LogLPAnimMeasure` actif) ; bat Mesure non rejoué (déjà PASS en S2-VAL) | aucun changement de code C++ | retirer `S6-VAL.md`, entrée journal, rétablir les trois docs | | CHG-217 | 2026-10-06 | S5 | repo addon `LifePlay-Sandbox` (`Plugins/LPSandbox/Source/LPAnimMeasure/LPCoupleSim.h` nouveau 215 l., `LPCoupleSimCore.cpp` nouveau 474 l., `LPSandbox/LPCoupleSim.cpp` 477 → 384 l., commit `c1fdd29` ; `README.md` : table du pin, commit `bed7901`, doc seule, le pin reste `c1fdd29`) ; `Source/LifePlay/LPShowCoupleSubsystem.h/.cpp` (1048 → 805 l., `FSavedMove` imbriquée supprimée, fichiers non suivis par git) ; `Docs/Migration/etat/sandbox/S5/S5-CART.md`, `S5-IMPL-H.md`, `S5-VAL.md` (nouveaux) ; `Docs/Migration/21_Sandbox_Addon.md` (section « CoupleBox », lot S5, pin) ; `Docs/Migration/etat/sandbox/S3/S3-INT.md` (pin) ; `Saved/Logs/S5-VAL-runtime-game.log`, `S5-VAL-build.log` (copies locales, non versionnées) | lot S5-T1…T4 : fin de la dérive de fork entre la sandbox Pair et `LPShowCoupleSubsystem` ; une seule source de vérité `namespace LPCoupleSim` dans le module `LPAnimMeasure` (niveau pur, lecture d'assets, effets de bord, `ResolveCoupleMove` avec `FSweepOptions::Show()` / `Sandbox()`), −336 lignes dupliquées ; écarts conservés par options (plancher −90 / −88, 2 / 3 itérations) ; builds `LPSandboxEditor` (non-unity) et `LifePlayEditor` (unity) 0 erreur / 0 avertissement. Validation S5-VAL : PASS : bat Pair depuis le jeu (~90 s) : plugin monté, `LPPairSandboxGameMode`, 16 lignes d'initialisation `LogLPSandbox`, ligne `Sandbox boite AgMakeout` (fond −90,000 cm), 0 erreur de module, aucun crash ; ShowCouple : PASS-STATIC (compilation, 34 références `LPCoupleSim`, copies locales supprimées), parcours show en jeu non exercé ; pin addon `c1fdd29e2c1036c7d6365ba6389eff5d2f8c8c96` | `LifePlay-Sandbox` au pin `f8102647ccdebad37e4977ccbf2c51e583823a80` (`LPCoupleSim` absent du module partagé) ; `LPShowCoupleSubsystem` et `LPCoupleSim.cpp` (sandbox) avec leurs copies locales de la géométrie | addon : `git checkout f8102647ccdebad37e4977ccbf2c51e583823a80` ; jeu : restaurer `LPShowCoupleSubsystem.h/.cpp` à la version d'avant S5-T2 (fichiers non suivis : pas d'instantané git, défaire à partir de `S5-IMPL-H.md` §3) ; retirer `S5-CART.md`, `S5-IMPL-H.md`, `S5-VAL.md`, cette entrée ; rétablir le pin `f8102647…` dans doc 21 / `S3-INT.md` | | CHG-216 | 2026-10-06 | S4 | repo addon `LifePlay-Sandbox` (`LPInteractionSandbox.h/.cpp` supprimés, `LPSandbox.Build.cs`, `README.md`, `Docs/S3-move.md`, commit `f810264`) ; `Docs/Migration/etat/sandbox/S4/S4-VAL.md` (nouveau) ; `Docs/Migration/21_Sandbox_Addon.md` (lot S4/S6, pin addon) ; `Docs/Migration/etat/sandbox/S3/S3-INT.md` (pin) ; `Saved/Logs/S4-VAL-runtime-game.log` (copie locale, non versionnée) | lot S4-T3/T4a : retrait du GameMode Interaction legacy dans l'addon (~543 LOC, doublon chat/vues) ; grep addon sans `LPInteractionSandbox` / `ALPInteractionGameMode` ; mode Interaction via menu `LPPairSandbox` ; build `LifePlayEditor Win64 Development` OK ; essai Pair ~45 s depuis le jeu : plugin monté, `LPPairSandboxGameMode`, 16 lignes `LogLPSandbox`, 0 erreur module ; pin addon mis à jour `f8102647ccdebad37e4977ccbf2c51e583823a80` | addon : restaurer `LPInteractionSandbox.*` depuis commit `32ad09c` ; jeu : retirer `S4-VAL.md`, entrée journal, rétablir pin `4de1f0b` dans doc 21 / `S3-INT.md` | | CHG-215 | 2026-10-06 | S3 | `LifePlay.uproject` (`AdditionalPluginDirectories`, plugin `LPSandbox`) ; `Source/` (retrait de `LPAnimMeasure/`, `LPPairSandbox*`, `LPInteractionSandbox*`, `LPSandboxConfig*`) ; `Config/LPSandbox.ini` (copie dans l'addon) ; `Source/LifePlay/LifePlay.Build.cs`, `Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs` ; `Docs/Migration/21_Sandbox_Addon.md` (section stratégie git, lot S3) ; `Docs/Migration/etat/sandbox/S3/S3-INT-scaffold.md`, `S3-IMPL-L.md`, `S3-IMPL-H.md`, `S3-INT.md`, `S3-VAL.md` (nouveaux) ; repo addon `LifePlay-Sandbox` (nouveau : `README.md`, `Docs/S3-move.md`, plugin `LPSandbox`) | lot S3 sandbox→addon : code sandbox (`LPSandbox` + `LPAnimMeasure`) transféré vers le dépôt séparé `LifePlay-Sandbox` (https://github.com/edujiro5972/LifePlay-Sandbox.git, `main`) ; stratégie git : deux clones siblings (`D:\Game\LifePlay-master 5.5`, `D:\Game\LifePlay-Sandbox`) + `AdditionalPluginDirectories = ["../LifePlay-Sandbox/Plugins"]`, **pas de submodule** (plugin imbriqué `Plugins/LPSandbox/Plugins/LPSandbox` ou doublon `External/`) ; pin manuel `4de1f0b6764ed3bc575bb687630d3f070e1be221` (S3-T4 : `FLPSandboxModule::StartupModule` injecte `QuaterniusUALRoot` dans `LPAnimRedirect::SetUALRoot`) ; Content monté dans l'addon par junction NTFS (`AdditionalAssetDirectories` absent d'UE 5.5) ; build `LifePlayEditor Win64 Development` OK (S3-INT). Validation S3-VAL : PASS : bat Pair depuis le jeu (~85 s) : plugin monté, `Game class is 'LPPairSandboxGameMode'`, 16 lignes `LogLPSandbox`, 0 erreur de module ; addon mince `LPSandbox.uproject -game` : GameMode et sandbox OK, réserve : 2 458 erreurs de Blueprints du jeu (`StreetMapBuilding`, plugin `StreetMap` non activé dans l'addon), sans effet sur le sandbox ; avertissement hors lot : `/Game/Quaternius/UAL/M_Joints` absent | `LifePlay` : code sandbox et `LPAnimMeasure` dans `Source/` ; aucun `AdditionalPluginDirectories` ni plugin `LPSandbox` dans `LifePlay.uproject` | retirer `AdditionalPluginDirectories` et l'entrée `LPSandbox` de `LifePlay.uproject` ; recopier les sources depuis le dépôt addon (commit `d18243e` pour le code transféré, `4de1f0b` pour le pin) vers `Source/LifePlay/` et `Source/LPAnimMeasure/` (`LPSANDBOX_API` -> `LIFEPLAY_API`) ; rétablir `game=/Script/LifePlay.LPPairSandboxGameMode` dans les trois bats `Tools/debug/` ; supprimer le clone sibling si inutile | | CHG-214 | 2026-10-06 | S2 | `Source/LPAnimMeasure/` (nouveau : `LPAnimMeasure.Build.cs`, `LPAnimMeasure.h/.cpp`) ; `LPPoseMeasure.h/.cpp`, `LPSkeletonProfile.h/.cpp`, `LPPoseOrchestrator.h/.cpp`, `LPAnimRedirect.h/.cpp` (déplacés de `Source/LifePlay/`) ; `LifePlay.uproject`, `Source/LifePlay.Target.cs`, `Source/LifePlayEditor.Target.cs`, `Source/LifePlay/LifePlay.Build.cs`, `Source/LifePlayEditorTools/LifePlayEditorTools.Build.cs`, `Source/LifePlay/LifePlay.cpp`, `Source/LifePlay/LPInteractionSandbox.cpp`, `Tools/LogStats.ps1` (modifiés) ; `Docs/Migration/21_Sandbox_Addon.md` (section module + graphe de dépendances) ; `Docs/Migration/etat/sandbox/S2/S2-CART.md`, `S2-IMPL-H.md`, `S2-VAL.md` (nouveaux) | lot S2 sandboxaddon : chaîne de mesure de poses extraite de `LifePlay` vers le module Runtime `LPAnimMeasure` (8 fichiers déplacés, `LPANIMMEASURE_API`, catégorie `LogLPAnimMeasure`, 6 exports ajoutés pour `LPPairSandbox.cpp`) ; couplage à `LPSandboxConfig` rompu par `LPAnimRedirect::SetUALRoot` appelé depuis `FLifePlayModule::StartupModule` ; module acyclique (aucune dépendance vers `LifePlay`) ; `#include "Engine/TextureCube.h"` ajouté à `LPInteractionSandbox.cpp` (défaut IWYU révélé par la recomposition unity) ; compteur `LogLPAnimMeasure` dans `LogStats.ps1`. Validation S2-VAL : PASS (11 fichiers dans le module, 0 reliquat dans `LifePlay`, `.uproject` et deux `Build.cs` conformes, DLL `UnrealEditor-LPAnimMeasure` du 18:34 postérieure aux sources, bat Mesure lancé : 269 lignes `LogLPAnimMeasure`, profils chargés, mesure et orchestrateur en marche, 0 erreur de module ou de lien). Reste : `S1-CART.md` à mettre à jour, commandlets anim non relancés, contrôle visuel non fait | `LifePlay` : les 8 fichiers étaient dans `Source/LifePlay/` (`LPANIMMEASURE_API` -> `LIFEPLAY_API`, `LogLPAnimMeasure` -> `LogLifePlay`, `LifePlay.h` inclus) ; `LifePlay.cpp` en `FDefaultGameModuleImpl` ; aucun module `LPAnimMeasure` | remettre les 8 fichiers dans `Source/LifePlay/` avec leurs ancres d'origine (fichiers non suivis par git, aucun instantané enregistré : défaire les modifications listées dans `S2-IMPL-H.md` §2) ; supprimer `Source/LPAnimMeasure/` ; retirer l'entrée du `.uproject`, des deux `*.Target.cs` et des deux `Build.cs` ; rétablir `FDefaultGameModuleImpl` dans `LifePlay.cpp` | | CHG-213 | 2026-10-06 | S1 | `Config/LPSandbox.ini` (nouveau) ; `Source/LifePlay/LPSandboxConfig.h/.cpp` (nouveaux) ; `Source/LifePlay/LPPairSandbox.cpp`, `LPAnimRedirect.cpp` (modifiés) ; `Docs/Migration/21_Sandbox_Addon.md` (§ Contrat) ; `Docs/Migration/etat/sandbox/S1/S1-SPEC.md`, `S1-IMPL.md`, `S1-CART.md`, `S1-VAL.md` (nouveaux) | lot S1 sandbox→addon : chemins du sandbox Pair externalisés dans `Config/LPSandbox.ini` (19 clés, 6 sections) lu par `FLPSandboxConfig::Get()` ; defaults = anciens littéraux, donc comportement inchangé sans ini ; 0 littéral `/Game/...` restant dans `LPPairSandbox.cpp` / `LPAnimRedirect.cpp` (S1-CART : 0 OUBLI) ; contrat résumé dans doc 21 ; validation S1-VAL : PASS statique, compilation UBT et runtime non exécutés (DLL `UnrealEditor-LifePlay` plus ancienne que les sources), test override `WorldFile` à faire à la main | `LPPairSandbox.cpp` et `LPAnimRedirect.cpp` : littéraux remplacés par `FLPSandboxConfig::Get().` ; `Mode` lu si `Saved/sandbox_mode.txt` absent | `git checkout` de `LPPairSandbox.cpp` / `LPAnimRedirect.cpp` (ou rétablir les littéraux de S1-SPEC § 2) ; supprimer `LPSandboxConfig.*`, `Config/LPSandbox.ini`, fichiers S1 ; rétablir le placeholder du § Contrat de doc 21 | | CHG-212 | 2026-10-06 | S0 | `.gitignore` ; `Docs/Migration/21_Sandbox_Addon.md` (nouveau) ; `Docs/Migration/etat/sandbox/S0/S0-CART.md`, `S0-VAL.md` (nouveaux) | lot S0 sandbox→addon : motif `.gitignore` `Debug` → `/Debug/` pour que `Tools/debug/*.bat` ne soient plus ignorés sous Windows (`core.ignorecase`) ; ébauche doc 21 et inventaire gelé du périmètre (~7,5 k LOC, commandlets, lanceurs) ; validation S0-T2 (S0-VAL PASS : `git check-ignore` vide sur les 3 bats, sources témoin présentes) | ligne 5 : `Debug` → `/Debug/` | remettre `Debug` ; `git rm` des fichiers S0 et de `21_Sandbox_Addon.md` | | CHG-211 | 2026-10-06 | AP6 | Planches d'images animées du catalogue des animations (mouvement visible au survol de la vignette). Demande de l'utilisateur après validation du catalogue ; un GIF a été écarté (256 couleurs, lourd, aucun encodeur dans Unreal ni dans le Python standard) au profit d'une planche d'images JPEG animée par la page. Modifications : (1) Sandbox (`Source/LifePlay/LPPairSandbox.h/.cpp`, **hors dépôt**) : mode « planches » de la tournée (`Saved/sandbox_tour.txt` contenant `planches`) : par clip, 12 images par seconde de clip (de 4 à 24), à intervalles réguliers (fraction i/N), profil droit, sans calque ni repères ; un même carré pour toutes les images du clip (union des os projetés, marge 15 %), réduit à 256 px ; images collées côte à côte, JPEG qualité 85 (`IImageWrapper`), `Saved/Measurement/planches/.jpg` + `.json` (`images`, `duree_s`, `taille`). Résultat : 43 planches, 4,3 Mo au total (ex. `Walk_Loop` 16 images, 101 Ko), tournée de 16 min 33 s, sans erreur (compilation : `etat/AP6_Build_20261006-160922.txt`). (2) `Tools/anim/Catalogue.py` : option `--planches` ; contrôle bloquant (planche `.jpg` et `.json` présents, `images` >= 2, `taille` 256 ; refus vérifiés pour planche absente et `images` = 1) ; bloc `planche` dans chaque fiche (`fichier`, `images`, `taille`, `ips` = images / durée) ; copie dans `Module/Animations/planches/.jpg`. Page : vignette fixe ; au survol (souris) la planche défile à la cadence du clip et la vignette revient à la sortie ; au toucher, lance / arrête ; la planche n'est chargée qu'au premier survol ; avec la préférence système « réduire les animations », seulement au clic. Correction après essai dans le navigateur : l'image et l'animation masquées restaient affichées (règle CSS `display` plus forte que l'attribut `hidden`), corrigé par `.card img[hidden], .card .anim[hidden] { display: none }`. Résultat : catalogue régénéré dans `ModSources/lpr_anim_quaternius/Module/Animations/` (42 fiches, 42 vignettes, 42 planches), `CATALOGUE OK`. Vérifié dans le navigateur : la planche se charge, l'animation remplace la vignette et avance à la cadence attendue (3 images en 250 ms pour 12,3 i/s) | lot AP6 de `20_Chaine_Animations.md` : planches du catalogue, animation au survol vérifiée dans le navigateur | `.\Tools\Restore.ps1 -Lot AP6` (même instantané qu'AP6 : sandbox, `Catalogue.py`) ; rien n'est commité | | CHG-210 | 2026-10-06 | AP6 | Catalogue des animations (fiches calculées, `pack.json`, vignettes, `catalogue.json` et `catalogue.html`). Modifications : (1) `AnimSources/quaternius/pack.json` (nouveau) : déclaration du pack (source Quaternius Universal Animation Library Standard, CC0 1.0, fichier `.glb`, crédit, préfixe `qua`, exclusion `A_TPose`) et, pour les 42 clés, nom FR/EN, catégorie (les 8 du § 5 plus chute, magie, nage, conduite), accessoire, style, usage FR/EN ; champ facultatif `posture` qui remplace la posture calculée (`"dans l'eau"` pour les deux clips de nage). (2) `Source/LifePlayEditorTools/LPAnimCatalogCommandlet.h/.cpp` (nouveau), `-run=LPAnimCatalog` : pour chaque clé de `livraison.json`, mesure le clip féminin source image par image et contrôle que F et M ont même durée et même nombre d'images ; écrit `Saved/AnimPipeline/quaternius/fiches_calculees.json`. Mesures : durée, images, cadence ; boucle (dernière image comparée à la première, extrémités relatives à la hanche, en % de la taille ; boucle si ≤ 1 %) ; déplacement horizontal de la hanche (cm, cm/s, sens avant / arrière / côté, sur place sous 5 cm) ; posture par image (allongé : tronc > 60° ; à genoux : genou < 12 cm et hanche < 72 % ; assis : hanche < 72 % et plus de 20 cm en arrière des chevilles ; accroupi : hanche < 72 % ; debout sinon), posture du clip si ≥ 60 % des images, sinon « variable », posture de début et de fin ; hauteur d'assise (articulation de hanche, médiane des images assises) ; part des images pied au sol (< 3 cm de la hauteur de repos) ; mains au repos / en mouvement / levées. Deux corrections après la première relecture des fiches : axe avant du corps inversé (Roll sortait « arrière », Sitting_Enter « avant », la position assise sortait « accroupi ») et seuil debout abaissé de 80 % à 72 % (gardes de combat et poussée classées accroupi / assis). Résultat : 42 fiches, 0 échec (`etat/AP6_LPAnimCatalog_20261006-155043.txt`, puis le passage final du même jour). (3) Sandbox (`Source/LifePlay/LPPairSandbox.h/.cpp`, **hors dépôt**) : mode « vignettes » de la tournée (`Saved/sandbox_tour.txt` contenant le mot `vignettes`) : une vue par clip, profil droit à 1/3 de la durée, sans calque, squelettes ni repères de caméra ; image recadrée en carré autour des os du corps de Bridget projetés à l'écran (marge 15 %), réduite à 512 px et écrite par le délégué `UGameViewportClient::OnScreenshotCaptured` dans `Saved/Measurement/vignettes/.png` ; le `tour.csv` de la tournée complète n'est pas remplacé. 43 vignettes. La tournée complète (387 captures) a aussi été refaite après les corrections de torsion d'AP4. (4) `Tools/anim/Catalogue.py` (nouveau) : assemble `catalogue.json`, `catalogue.html` (page autonome hors ligne, filtres catégorie / posture / durée, recherche, clé copiable, thème clair et sombre, lisible sur téléphone) et `vignettes/.png` dans `ModSources//Module/Animations/`. Champs du § 5 ; `taille_ko` = taille des `.uasset` **non cuits** (`taille_cuite: false`, la taille cuite viendra en AP7) ; qualité = « accepté » ou « à revoir » avec motifs (rapport AP4), pire écart brut et pire torsion des deux corps ; empreinte SHA-256 des deux clips. Contrôles bloquants (rien n'est écrit si un échoue) : rapport AP4 valide ; `fiches_calculees.json` sans échec et plus récent que `livraison.json` ; fiche calculée et entrée `pack.json` pour chaque clé ; clés uniques ; aucune collision avec les 17 clés du jeu, les clés `ANIMATION:` / `animate()` des modules texte (hors module d'essai) et les autres catalogues de `ModSources` ; champs obligatoires ; vignette présente. Essais : un succès (42 fiches), trois refus (vignette manquante, collision avec `dance`, fiches plus anciennes que la livraison). Corrections après relecture : hauteur d'assise affichée seulement pour une posture assise ; écart de boucle arrondi ; cartes filtrées réellement masquées ; cadre des vignettes carré. (5) `Tools/anim/DeliverAnims.ps1` : commutateurs `-Catalogue` (après la livraison) et `-CatalogueOnly` (régénère sans relancer Unreal, après le contrôle du rapport AP4). Résultat : `ModSources/lpr_anim_quaternius/Module/Animations/` : `catalogue.json`, `catalogue.html`, 42 vignettes ; `Saved/AnimPipeline/quaternius/catalogue_rapport.json` (`ok: true`, 42 fiches). Relecture des 5 témoins (marche, assis, pistolet, danse, chute) : conforme après corrections (marche sur place, boucle, pieds au sol 68 % ; assis, assise 45 cm ; chute variable, debout puis allongé, 53 cm en arrière, pas de boucle). Compilations `etat/AP6_Build_20261006-*.txt`, 0 erreur. Reste ouvert : taille cuite (AP7) ; validation visuelle de la page par l'utilisateur | lot AP6 de `20_Chaine_Animations.md` : une fiche par clip, champs calculés relus sur 5 clips témoins (marche, assis, pistolet, danse, chute) | `.\Tools\Restore.ps1 -Lot AP6` (retire le commandlet, `pack.json` et `Catalogue.py` ; remet `DeliverAnims.ps1`, la sandbox et les documents) ; le catalogue généré dans `ModSources` et les vignettes dans `Saved` ne sont pas dans l'instantané (sorties régénérables) ; rien n'est commité | | CHG-209 | 2026-10-06 | AP5 | Livraison en mod et appel par `animate()`. Mécanisme du jeu relevé (exports `etat/L6f_dump_Person.txt`, `etat/AP5_LPDumpFunction_20261006-140513.txt`, journal `Saved/Logs/portage/AP5_LPDumpFunction_20261006-140513.log`, `AP5_Room_Dailies_CDO.txt`) : `.lpaction` `ANIMATION:` (`GI::EventGraph`) et `.lpscene` `Actor.animate()` (`GI::CallFunction`, aiguillage `SwitchString_22`, cas `animate` : `AnimateForced` vrai, `Person::PlayDaily(Parameters[0])`, `AnimateForced` faux) appellent `Person::PlayDaily()`. `PlayDaily` : aiguillage `SwitchString_7` de clés écrites en dur (martialart, sneak, dance, na_sleep, write…), sortie `Default` vide (une clé inconnue ne faisait rien) ; chemin générique (cas martialart, sneak, dance, fightlost, knockedout) : debout puis `PlayDailyAnim()`. `PlayDailyAnim` parcourt `Room.Dailies` (tableau fixe de 34 clips, 17 clés × F/M, `/Game/Heavy/New3/Anims/Daily/`, valeur par défaut de Room, aucun graphe de Room ne le modifie), coupe le nom au premier `_`, compare la partie gauche à la clé, prend `_M` si `IsMale`, sinon un suffixe ≠ `M` ; le clip trouvé va dans `currentDaily`, joué par les Anim Blueprints `Daily` (michael_Skeleton) et `Daily_F` (bridget_gp_Skeleton). Aucun chemin construit, aucun registre d'assets : la ligne 14 de `16_H3_Mods_Paquets.md` (animations trouvées par `GetAssetsByClass`) ne vaut donc pas pour ces animations. Squelettes des clips convertis `B_*` / `M_*` : bridget_gp_Skeleton / michael_Skeleton, identiques à ceux de `Daily_F` / `Daily`. Modifications : (1) `Source/LifePlay/LPModDailies.h/.cpp` (nouveaux) : `ULPModDailiesSubsystem` (GameInstance) relève au démarrage les `UAnimSequence` des plugins de type Mod sous `//Anims` nommés `_F` / `_M` (en éditeur, exploration synchrone du dossier, le registre étant asynchrone) ; dès que `GI.Room` existe (et à chaque nouvel acteur Room) les ajoute à la fin de `Room.Dailies` (une clé du jeu reste servie par le clip du jeu ; un clip de mod dont la clé existe déjà dans le jeu est ignoré avec avertissement) ; `ULPModDailiesLibrary::IsModDaily()` (BlueprintPure) ; journalise `PlayDaily() -> cle de mod` ou `cle inconnue`. `LifePlay.Build.cs` : dépendance `Projects`. (2) `Source/LifePlayEditorTools/LPPatchDailiesCommandlet.h/.cpp` (nouveau), `-run=LPPatchDailies [-DryRun]`, appliqué à `Content/BPs/Person.uasset` : (a) sortie `Default` de `SwitchString_7` vers un Branch sur `IsModDaily(clé)` puis le chemin générique (`Knot_13`) ; une clé inconnue du jeu et des mods ne fait toujours rien ; (b) le Split `_` de `PlayDailyAnim` cherche depuis la fin (`SearchDir FromEnd`) : une clé peut contenir `_`, sans effet sur les 17 clés du jeu. Contrôles intégrés (nœuds trouvés une seule fois, Default libre, relecture des liaisons, compilation sans erreur, sinon rien n'est sauvegardé) ; rejouable. Résultats : essai à blanc `etat/AP5_LPPatchDailies_20261006-143052.txt`, application `…-143149.txt`, contrôle `…-143248.txt` (« deja fait »). (3) `Tools/anim/DeliverAnims.ps1` et `Tools/anim/DeliverAnims.py` (nouveaux) : contrôle bloquant de `Saved/AnimPipeline/quaternius/rapport.json` (`valide`), affichage des « à revoir » ; crée `ModSources/lpr_anim_quaternius` (uplugin, `.lpmod` CC0, CREDITS) s'il manque ; monte le mod, copie (sans toucher aux sources) les 42 paires `B_` / `M_` (hors `A_TPose`) vers `/lpr_anim_quaternius/Anims/Female/qua__F` et `/Male/qua__M`, contrôle squelette, nombre d'images et durée, écrit `Saved/AnimPipeline/quaternius/livraison.json`, démonte. Contrôle de sortie `LIVRAISON copies 84 erreurs 0` ; `-DryRun`. Deux corrections pendant le lot : `-FullStdOutLogOutput` (les messages Python de niveau Log n'apparaissaient pas dans la sortie console) et exploration du dossier du mod avant copie (sinon une deuxième passe échouait : copies existantes invisibles du registre). Journal final `etat/AP5_DeliverAnims_20261006-143739.txt`. (4) `ModSources/lpr_anim_quaternius/` (nouveau) : mod d'assets, 42 clés × 2 clips. (5) `Content/Modules/lpr_anim_essai/` (nouveau, **module d'essai, jamais livré**) : action « Essai animations AP5 » (maison) lançant une scène : femme puis homme temporaires, `animate(qua_dance_loop)`, `animate(qua_sitting_idle_loop)`, `animate(qua_pistol_idle_loop)`, témoin `dance`, clé inexistante `qua_cle_inexistante`. Essai (jeu lancé en éditeur `-game`, mod monté dans `Mods/`, journal `Saved/Logs/LifePlay.log` du 2026-10-06 13:14–13:20) : `84 clip(s) ajoute(s) a Room_C_0.Dailies (118 au total)` ; les trois clés `-> cle de mod` sur la femme et l'homme (scène jouée deux fois) ; `qua_cle_inexistante -> cle inconnue`. Contrôle visuel par l'utilisateur, validé sur 5 points : bons clips sur la femme puis l'homme, corps bien posés, deux places distinctes, témoin `dance` normal, enchaînement des trois animations visible. Compilations : `etat/AP5_Build_20261006-143013.txt`, `…-143912.txt`, `…-150926.txt` (0 erreur) ; une première compilation avait échoué (collision de nom dans la compilation unitaire, corrigée par un espace de noms nommé). Reste à faire (hors AP5) : essai en jeu empaqueté avec le mod cuit en DLC (`BuildMod -Name lpr_anim_quaternius`), qui exige une nouvelle version de référence du jeu (`Person` et le C++ ont changé), à faire avec la prochaine publication ou en AP7 ; catalogue (AP6) ; retirer le module d'essai avant toute publication | lot AP5 de `20_Chaine_Animations.md` : livraison en mod, clés appelables depuis un scénario | `.\Tools\Restore.ps1 -Lot AP5` (remet `Person`, `LifePlay.Build.cs` et les documents ; retire les fichiers et dossiers créés : sources C++, outils, `ModSources/lpr_anim_quaternius`, `Content/Modules/lpr_anim_essai`) ; rien n'est commité | | CHG-208 | 2026-10-06 | AP4 | Contrôles indépendants de la formule : nouveau module `LifePlayEditorTools/LPAnimChecks`, calculé à chaque image du clip converti et comparé au mouvement source mis à l'échelle (hauteur de hanche). Six contrôles : sol (pied ou orteil plus bas que la source, cm), glissement (pied qui bouge quand le pied source est posé, cm par image), genou (hyperextension derrière la ligne hanche-cheville au-delà de la source, cm), flexion (écart de flexion coude / genou avec la source, °), saut (rotation d'un os d'une image à l'autre au-delà de 1,5 × la source + 2°), pénétration (main ou coude dans les capsules du tronc, cm). Pas d'actif physique sur `bridget_gp` ni `michael` (recherche par sous-agent) : capsules du tronc construites depuis la peau du maillage (sommets dont l'os dominant est du tronc, une capsule par segment de colonne, rayon au 30e centile des distances à l'axe) ; Bridget : `abdomenLower` 10,1 cm, `abdomenUpper` 10,2, `chestLower` 11,7, `chestUpper` 6,0 ; Michael : 12,0 / 12,7 / 14,1 / 8,1 ; auto-test (articulation de l'os porteur à une profondeur égale au rayon) : écart 0,0000 cm. `LPAnimEval` : contrôles branchés (`controles_.csv`, verdict accepte / a revoir / rejete ; `a_revoir` dans `rapport.json`), seuils étalonnés sur les 43 clips : sol 3 cm, glissement 3 cm/image, genou 1 cm, flexion 5°, saut 10°, pénétration 1 cm ; « rejeté » au-delà de 3 × le seuil (`-RejetFacteur`), seul le rejet bloque ; options `-Meshes`, `-SansControles`, `-Seuil*`. Correction : `-Clips`, `-Bodies` et `-Meshes` s'arrêtaient à la première virgule (`FParse::Value` sans `bShouldStopOnSeparator=false`), aussi dans `LPAnimTwist`. Défaut trouvé par le contrôle de saut et corrigé : la décomposition flexion / torsion d'AP3, faite dans le repère du corps autour de l'axe en pose T, devenait instable quand le segment s'écartait d'environ 180° de cet axe (`PickUp_Table` 147,7° sur `lForearmBend`, `Roll` 44,9° sur `rThighBend`, `Sword_Attack` 26°, `Pistol_Reload` 26°, `Punch_Jab` 14°). Décomposition désormais dans le repère du parent, dans la formule (`LPPoseMeasure::TransferPose`) et dans `LPAnimTwist` (qui reprend la rotation complète portée par l'os Twist : relançable sur des clips déjà traités). Clips retraités (43 + 43) : clip converti 0,51 % → 0,19 % au pire, torsion 0,97° → 0,49° ; sauts : seul `Jump_Start` reste à 23,1° (`lForearmBend`). Relevé final sur 86 clips : 0 rejeté, 8 à revoir (4 par corps : `Death01`, `Fixing_Kneeling`, `Roll` pour le sol, entre 4,4 et 5,6 cm — poses au sol, hauteur de cheville différente entre squelettes ; `Jump_Start` pour le saut). Essai de refus (`-Clips=Jump_Start -SeuilSaut=5`) : code 1. Rapport HTML : `Tools/anim/RapportControles.py` (écrit par un sous-agent, libellé d'unité de la pose T corrigé) produit `/rapport.html` ; vérifié : 43 lignes de contrôles et 129 lignes d'écarts par corps, HTML bien formé, rendu contrôlé | lot AP4 de `20_Chaine_Animations.md` : contrôles indépendants et rapport | `.\Tools\Restore.ps1 -Lot AP4` (remet aussi la formule, `LPAnimTwist` et les clips d'avant AP4 ; `Tools/anim/RapportControles.py`, créé après l'instantané, est à retirer à la main) | | CHG-207 | 2026-10-06 | AP3 | Commandlet `LPAnimTwist` : répartition de la torsion sur les clips convertis. Pour chaque clé et chaque paire Bend / Twist du profil (épaule, avant-bras, cuisse, gauche et droite), la rotation de l'os Bend depuis la pose T ajustée est décomposée autour de l'axe du segment : Bend garde la flexion, l'enfant Twist reçoit la rotation complète ; les autres os gardent leur transformation (contrôle à chaque clé, tolérance 0,01° et 0,01 cm, sinon le clip n'est pas sauvé). `-DryRun`, rapport `rapport_torsion.json`. `LPAnimEval` mesure désormais la torsion (écart de rotation des os Bend et Twist avec la formule, colonnes `torsion_deg`, `torsion_os`, seuil bloquant `-SeuilTorsion` facultatif) ; `TPoses` exporté. Résultat : 43 + 43 clips traités et sauvés, conservation 0,00000° / 0,00000 cm, torsion déplacée jusqu'à 179,9° ; écart de torsion avec la formule 178,9° → 0,97° ; directions : 0,00 % aux instants sur une clé, 0,51 % au pire entre deux clés (`Roll` à 1/3, interpolation séparée de Bend et Twist), 108 instants sur 129 à 0,00 % ; seconde passe : 0,001° encore déplaçable (idempotent). Une recuisson (`RetargetQuaternius.py`) défait ce traitement : à relancer après chaque recuisson jusqu'au pilote AP7 | lot AP3 de `20_Chaine_Animations.md` | `.\Tools\Restore.ps1 -Lot AP3` (remet les clips d'avant) | | CHG-206 | 2026-10-06 | AP2 | Commandlet `LPAnimEval` (`LifePlayEditorTools`, dépendance `Json`) : étapes 3 et 5 de la chaîne sans fenêtre. Pose T de chaque corps (écrit `retarget_pose_.txt`), contrôles : segments ajustés ≤ `SeuilPoseT` (1 %), symétrie gauche / droite ≤ `SeuilSymetrie` (0,5°), réglages ≤ `SeuilReglage` (30°) ; évaluation de la formule et du clip converti sur chaque clip à `Instants` instants, ≤ `SeuilEval` (1 %). Rapports `Saved/AnimPipeline//rapport.json`, `rapport_poseT_.json`, `eval_.csv` ; code de sortie 0 / 1. `LPPoseMeasure` : relevé structuré de l'ajustement (`FLPTFitResult`, `TFitResult`) et fonctions exportées (`LIFEPLAY_API`), `LPSkeletonProfile` exporté. Contrôle : 22 s pour 43 clips × 3 instants × 2 corps (tournée de la sandbox : ~7 min, Bridget seule) ; fichiers de pose identiques à l'octet ; `eval_Bridget.csv` identique ligne à ligne à la tournée ; Michael mesuré pour la première fois : 129 instants, 0,00 % (pire réel 0,0026 %) ; symétrie 0,000°. Essai de refus (seuils impossibles) : code 1, 24 causes listées | lot AP2 de `20_Chaine_Animations.md` | `.\Tools\Restore.ps1 -Lot AP2` (retire le commandlet) | | CHG-205 | 2026-10-06 | AP1 | Profils de squelettes : `Tools/anim/profiles/ue4_mannequin.json` et `genesis8.json` (rôle de chaque os, réglages de pose T Daz). `LPSkeletonProfile` (nouveau, dépendance `Json` dans `LifePlay.Build.cs`) les lit et identifie un squelette (≥ 95 % des os du profil). `LPPoseMeasure` : toutes les tables en dur (segments, segments de pose T, paumes, correspondances, chaînes colonne et cou, contrôles du tronc, repère, réglages A → T) sont dérivées des rôles pour tout couple de profils ; journaux propres à Genesis retirés (attaches, tronc en pose T). Sandbox : points clés, tête et bassin par rôle. `RetargetQuaternius.py` : chaînes et racine dérivées des mêmes profils, identification des maillages. Contrôle : 3 squelettes identifiés à 100 % (C++ et Python) ; 19 segments, 39 segments de pose T, 47 os transférés, 26 chaînes par rig (inchangés) ; `retarget_pose_Bridget.txt` et `_Michael.txt` identiques à l'octet ; tournée complète identique ligne à ligne (129 instants, 0,00 %) ; recuisson 43 + 43 clips, tournée courte sur 5 clips à 0,00 %. Incident : une première version du script de refonte a coupé le mauvais bloc (nom de structure présent deux fois) ; fichier remis depuis l'instantané `AP1` avant de recommencer | lot AP1 de `20_Chaine_Animations.md` : une seule table de correspondance | `.\Tools\Restore.ps1 -Lot AP1` (retire `Tools/anim`, `LPSkeletonProfile.*` à retirer à la main : créés après l'instantané) | | CHG-204 | 2026-10-06 | PoseMeasure | Phase C : `Tools/RetargetQuaternius.py` réécrit. La pose de retarget de `RTG_Bridget` et `RTG_Michael` est la pose T ajustée, lue dans `Saved/Measurement/retarget_pose_.txt` (écrit par la sandbox à l'entrée du mode Mesure, `LPPoseMeasure::WriteRetargetPose`, 34 os : épaule 45,6°, cuisse 8,3°, avant-bras 14,2°… ; Michael calculé sur son propre squelette) ; plus d'alignement par le maillage, de réglages Daz séparés ni d'essais `pole` / `roll180`. Chaîne colonne `abdomenLower → chestUpper` (le pelvis Genesis n'est pas son parent) et cou en *Interpolated* ; 10 chaînes de doigts, chaînes d'orteils. Recuisson : 43 clips `B_` et 43 `M_`. Tournée complète : clip recuit 0,00 % sur les 129 instants (ancien clip : médiane 29,2 %, pire 58,7 %), même résultat que la formule. Non mesuré : répartition de la torsion entre os Bend et Twist (le retargeter met toute la rotation dans l'os Bend), et Michael (sandbox sur Bridget seule). `BuildMod.ps1 -Retarget` échoue depuis l'environnement de l'agent (l'éditeur lancé par `Start-Process` s'arrête aussitôt sans journal) : éditeur lancé par `cmd /c start` avec les mêmes arguments | phase C du plan | `.\Tools\Restore.ps1 -Lot PoseRetarget` | | CHG-203 | 2026-10-06 | PoseMeasure | Calque de pose : le calque orange n'est plus le squelette du mannequin mis à l'échelle (proportions et clavicule du mannequin), mais le squelette de Bridget posé par la formule (directions du mannequin, longueurs de Bridget), calé sur le bassin affiché, sans les os du visage, dessiné au premier plan. En vue pose T, c'est la pose T ajustée. Le contrôle caméra (`MESURE vues`) compare Bridget à ce calque (`CalqueKeys`) : 20 % auparavant (écart de proportions), 0,00 % en vue formule. Les traits depuis l'os racine (sol → hanche) ne sont plus dessinés | le calque mélangeait pose et proportions (question de l'utilisateur) | `.\Tools\Restore.ps1 -Lot PoseCalque` | | CHG-202 | 2026-10-06 | PoseMeasure | La formule devient la vue par défaut du mode Mesure (la boucle de l'orchestrateur ne démarre plus seule, bouton Auto conservé). Navigation : N / P change de clip parmi les 43 clips Quaternius qui ont une copie `B_`, PgUp / PgDn change d'instant (`LPPoseOrchestrator::SampleAt`). Bouton Tournée, ou fichier `Saved/sandbox_tour.txt` posé avant le lancement (noms de clips facultatifs) : chaque clip à 0, 1/3 et 2/3 de sa durée, vues face, profil droit et dos, captures `Saved/Measurement/tour/*.png` (387 images, ~540 Mo) et relevé `tour.csv`. Contrôle du tronc par rotation depuis la pose T (bassin, poitrine, tête) au lieu des segments de colonne. Colonne de la formule : `spine_01` ↔ `abdomenLower` et `spine_03` ↔ `chestUpper` exacts, os intermédiaires interpolés (la poitrine s'écartait de 1 à 6,6 %). Relevé sur 129 instants : formule 0,00 % partout (contrôle de cohérence, pas une validation) ; clip converti médiane 29 %, pire 58,7 % (`Pistol_Aim_Down`, main gauche). Planche visuelle : épée, course, genou à terre, visée cohérents avec le mannequin | étapes 1 et 2 du plan après validation de la formule | `.\Tools\Restore.ps1 -Lot PoseTour` | | CHG-201 | 2026-10-06 | PoseMeasure | Phase B : `LPPoseMeasure::TransferPose`, pose de Bridget calculée directement depuis le mannequin (rotation de chaque os depuis la pose T ajustée, portée par le changement de repère M). Correspondance : bassin → `hip`, clavicules, bras, avant-bras, mains, cuisses, tibias, pieds, orteils, 30 phalanges ; décomposition flexion / torsion (`ToSwingTwist`) entre os Bend et Twist (épaule, avant-bras, cuisse) ; colonne (3 → 4 os) et cou (2 → 3) interpolés à la même fraction de hauteur ; déplacement du bassin mis à l'échelle par la hauteur de hanche ; os non associés en rotation locale de pose T. Touche F ; contrôle `Bridget-formule` à chaque passage ; capture `formule_NNNN_.png` à l'arrêt de la boucle. Relevé : membres, mains, doigts et clavicules ≤ 1 % ; colonne en Idle `abdomenUpper` 6,5 %, `chestUpper` 1,8 % (interpolation de chaîne contre mesure os par os). Capture : poings fermés comme le mannequin, épaules symétriques | méthode : équation de transformation avant l'ajustement fin | `.\Tools\Restore.ps1 -Lot PoseTransfer` | | CHG-200 | 2026-10-06 | PoseMeasure | Journal `POSET tronc` : position des articulations du tronc en pose T (avant / côté / haut depuis la hanche gauche, en % de la taille) pour les deux squelettes. Constat : le pelvis Genesis est au même point qu'`abdomenLower` (segment de longueur nulle, d'où les 60 %) ; la colonne n'a pas les mêmes jonctions (3 os mannequin, 4 Genesis avec `chestLower`) ; la clavicule du mannequin part de l'arrière du tronc (4,8 % derrière la hanche), celle de Genesis du sternum (2,9 % devant) | question de l'utilisateur sur les écarts non ajustés | `.\Tools\Restore.ps1 -Lot PoseTFit` | | CHG-199 | 2026-10-06 | PoseMeasure | Phase A (équivalence en pose T) : `FittedBodyT` ajuste la pose T Daz de Bridget sur la pose T du mannequin (jambes, bras, mains, paumes, 28 phalanges), une fois par session ; tout l'étalonnage passe sur cette pose T ajustée. Touche T : les deux poses T côte à côte et le relevé dans le panneau. Journal `POSET` : écarts avant → après (pouce 17 % → 0, pied 9,4 % → 0, avant-bras 8,2 % → 0, tous les segments ajustés à 0,0 %) et rotations locales à reporter dans `RTG_Bridget` (`POSET reglage`, symétriques gauche/droite : pied 15°, avant-bras 14,2°, main 10,4°, pouce 24 et 22°, autres doigts 0,5 à 8,6°, cuisse, bras 2,3°). Bassin, colonne, cou et clavicules relevés sans ajustement (définition des os). Modèles `metric links4`. En Idle, la main reste tournée d'environ 180° : à confirmer visuellement | méthode : établir l'équivalence des deux poses T avant toute transformation | `.\Tools\Restore.ps1 -Lot PoseTFit` | | CHG-198 | 2026-10-06 | PoseMeasure | `LPPoseMeasure` : tous les segments sont étalonnés sur une pose T commune (`FLPPose.TPose`) : le repos du mannequin ; pour Genesis, le repos plus les réglages Daz A → T de `RetargetQuaternius.py` (`DazToT`, pose de retarget de `RTG_Bridget`). On compare la rotation de chaque os depuis sa pose T. L'épaule redevient le segment clavicule ; paume mesurée par index → auriculaire (avec le pouce, 70° d'écart dès la pose T). Le clip brut est contrôlé à chaque passage (`MESURE Bridget-brut`). Touche M : maillage du mannequin. Relevés : écart entre poses T faible (épaule 1,3 %, cuisse 1,3 %, main 3 %, paume 2,4 %) sauf avant-bras 8,2 %, pied 9,4 %, clavicule 19 %, pelvis 60 % ; clip brut hors seuil (avant-bras 24 à 27 %, main 25 %, pied 12 %, tibia 7,7 %, haut du dos et cou 13 % en Idle) ; corrigé 0,01 %. La main reste tournée de 177° : non validé. `LPPairSandbox.h` (bShowMannequin) est hors instantané `PoseT` | les comparaisons mélangeaient pose, morphologie et définition des os | `.\Tools\Restore.ps1 -Lot PoseT` | | CHG-197 | 2026-10-06 | PoseMeasure | `LPPoseMeasure` : l'épaule n'est plus mesurée par la clavicule étalonnée, mais par la direction base du cou → articulation de l'épaule (`neck_01→upperarm` / `neckLower→ShldrBend`), visée en tournant la clavicule (point de la sphère du mobile sur la demi-droite visée). Champs `Mover` et `Label` (`lShoulder`, `rShoulder`) ajoutés à `FLink`. Modèles `metric links2`. Rotation des clavicules : 24 à 26° (4° avant), bras 17 à 24° ; contrôle 0,29 % au pire, round 854, seuil atteint | contrôle visuel (R) : en brut les épaules sont rejetées en arrière et les bras traversent le corps ; l'étalonnage au repos recopiait l'erreur du retargeting (repos mannequin en T, Genesis en A) | `.\Tools\Restore.ps1 -Lot PoseShoulder` | | CHG-196 | 2026-10-06 | PoseMeasure | Touche R du mode Mesure : Bridget brute (clip `B_` au même instant, sans correction) ou corrigée, au même cadrage, sans lancer de passage (`FLPOrchestratorRound.BridgetRaw`). Le contrôle porte sur la pose affichée. Les passages automatiques repassent en vue corrigée. Corrections relevées dans les modèles : clavicules ~4°, bras ~5°, avant-bras ~48°, mains 106 à 117° | l'utilisateur voit un défaut d'épaule ; il faut savoir s'il vient du clip converti ou de la correction avant d'agir | `.\Tools\Restore.ps1 -Lot PoseRaw` | | CHG-195 | 2026-10-06 | PoseMeasure | Caméra libre du mode Mesure (`LPPairSandbox`) : touche 0, départ au cadrage de la caméra fixe en cours, ZQSD/WASD, E/Espace et C/Ctrl pour monter et descendre, Maj ×3, clic droit + souris pour orienter ; 1 à 9 reviennent aux caméras fixes. Elle survit aux passages automatiques (vue nommée « Libre » dans les captures) et est détruite à la sortie du mode. Aide ajoutée au panneau. Démarrage vérifié (round 840, seuil atteint) ; déplacement non testé | contrôle visuel par l'utilisateur | `.\Tools\Restore.ps1 -Lot PoseFreeCam` | | CHG-194 | 2026-10-06 | PoseMeasure | `LPPoseMeasure` : score, correction et contrôle sur la même table `Links` (19 segments : colonne, cou, pieds, mains, clavicules), au lieu des 10 segments visés. Pelvis et clavicules étalonnés sur la pose de repos (`FLPPose.Rest`) : la rotation de l'os depuis son repos porte la direction de repos du mannequin. Écarts au repos relevés (`ETALON`) : pelvis 60 %, clavicules 19,1 % (= l'écart mesuré en jeu, donc différence de définition), bras 24 à 27 % (pose A contre T, non étalonnés). Modèles `metric links1`, colonne `links`, anciens modèles et `best_Face.png` retirés. Résultat (rounds 829 à 832) : contrôle 0,29 % au pire (lFoot), aucun os au-dessus de 1 %, boucle arrêtée sur « seuil atteint ». Le contrôle n'est plus indépendant de la correction : l'image `shots/` sert de vérification. Le texte du panneau (`LPPairSandbox.cpp`) a aussi changé, hors instantané `PoseLinks` | le contrôle signalait pelvis 50 % et clavicules 19 % alors que le score de l'orchestrateur valait 0 | `.\Tools\Restore.ps1 -Lot PoseLinks` | | CHG-193 | 2026-10-06 | PoseMeasure | Boucle automatique du mode Mesure (`LPPairSandbox`, `LPPoseOrchestrator`) : démarre à l'entrée du mode, un passage toutes les 2 s, capture sans interface 0,6 s après chaque passage (`Saved/Measurement/shots/round_NNNN_.png`), référence `best_.png` à la première capture ou quand le modèle est remplacé. Arrêt au seuil, sur plateau (5 passages identiques) ou après 200 passages ; bouton Auto / Arrêter ; journal `AUTO`. `FLPOrchestratorRound.bKept` ajouté. Vérifié : rounds 804 à 828, arrêt sur plateau, images nettes | l'utilisateur n'apporte rien en lançant chaque passage | `.\Tools\Restore.ps1 -Lot PoseAuto` | | CHG-192 | 2026-10-06 | PoseMeasure | Sandbox Mesure : la sphère de la caméra active n'est plus dessinée (bande jaune), figures à ±90 cm, caméras décalées de 55 cm hors du panneau ; contrôle indépendant `LPPoseMeasure::Compare` sur Bridget après chaque clip (ligne `controle` du panneau, `MESURE os` au journal). Premier relevé : pelvis 49,5 % / 51,7 %, lCollar et rCollar 19,1 %, abdomenLower 9 à 11 % | Bridget était sous le panneau ; le score de l'orchestrateur vaut 0 par construction | `.\Tools\Restore.ps1 -Lot PoseView` | | CHG-191 | 2026-10-06 | PoseMeasure | `LPPoseMeasure.cpp` : score et visée en direction des segments (angle en % de 180°, repère du corps), plus en positions mises à l'échelle. Modèles marqués `metric direction1`, colonne `metric` = `direction` ; anciens `best_*.txt` retirés (copies dans l'instantané). Manches 697 à 712 : 10,76 → 0 (Idle_Loop) et 6,13 → 0 (A_TPose) dès la première manche, puis 0 stable. Ce zéro est attendu par construction (le score mesure ce que la visée règle). Contrôle caméra (positions, calque) : pire vue 20,5 % (rFoot) contre 16,5 % avant. Validation visuelle en attente | le score en positions butait sur les proportions (tronc 7,6 %, jambes 8 %) | `.\Tools\Restore.ps1 -Lot PoseMeasure3` | | CHG-190 | 2026-10-06 | PoseMeasure | `LPPoseOrchestrator.cpp` : rotation locale = Parent⁻¹ * Monde (`LocalRot` l. 138, `ApplyDeltas` l. 166), au lieu de Monde * Parent⁻¹. Les `best_*.txt` calculés avec l'ancien ordre sont retirés (copies dans l'instantané). Deux passes (manches 675 à 696) : chaque « avant » égale l'« après » retenu au tour précédent et le score enregistré (Idle_Loop 6,8047, A_TPose 7,9827). Plateau dès la manche 680 : tronc 7,7 %, jambes 8,2 %, bras 2,5 % (Idle_Loop) | la boucle restait bloquée (passes identiques, kept=0) : le modèle relu donnait 11,66 % au lieu des 6,85 % enregistrés | `.\Tools\Restore.ps1 -Lot PoseMeasure2` | | CHG-189 | 2026-10-05 | PoseMeasure | `LPPoseMeasure`, `LPPoseOrchestrator`, panneau Mesure : score pondéré (tronc 50 %, jambes 30 %, bras 20 %) et la liste de chaque os. Le tronc est verrouillé avant les membres. Un passage qui améliore un genou mais empire le tronc ne remplace pas le modèle. Les anciens `best_*.txt` sans `metric weighted3` ne sont plus rechargés | un seul os (le genou) donnait l'impression que la pose était corrigée | retirer `FLPPoseScore` et revenir au libellé du pire os | | CHG-188 | 2026-10-05 | PoseMeasure | Orchestrateur : 8 échantillons sur la durée, synchro sur le calque du mannequin, archive `Saved/Measurement/history.csv` et `round_XXXX_*.csv`. Le calque jaune est le squelette du mannequin posé sur le bassin. Round 1 : Bridget et Michael restent à 60 % (os `pelvis`), avant = après | comparer les écarts d’un passage à l’autre, et sur toute la durée du clip | `.\Tools\Restore.ps1 -Lot PoseMeasure` | | CHG-187 | 2026-10-05 | PoseMeasure | Chambre `measurement` dans la sandbox (menu Mesure, `LifePlay_measure_sandbox.bat`). Neuf caméras autour des trois corps, squelettes dessinés, écart de chaque vue en pourcentage de la taille. Pire vue mesurée : Droite 14,5 % (pied gauche de Michael) | une seule vue de face ne voyait pas le bras derrière le dos | `.\Tools\Restore.ps1 -Lot PoseMeasure` | | CHG-186 | 2026-10-05 | AnimToGenesis | Pose `pole` : demi-tour des épaules seulement (`lShldrBend`, `rShldrBend`). L'avant-bras et la main gardent l'alignement de ~10°. Idle mesuré : Bridget 2,1 / 6,4 cm devant le buste, Michael −0,8 / 4,0 (mannequin −1,4 / 3,5). 43 clips `B_` et 43 `M_` | la main passait derrière le dos ; un demi-tour de l'avant-bras ne déplace pas le poignet | retirer le mode `pole` dans `Tools/RetargetQuaternius.py` | | CHG-185 | 2026-10-05 | AnimToGenesis | `LPAnimRedirect` lit `Saved/Config/Windows/LPAnimTarget.ini`. `BuildMod.ps1 -Target sandbox -Open` ouvre la sandbox ; `-Target game -Open` ouvre la partie (carte par défaut, sans forcer la sandbox). `game` fait jouer `B_Walk_Loop` / `M_Walk_Loop` par la marche du jeu. `sandbox` laisse cette marche au Blueprint. La sandbox ne subit pas la marche du jeu | choisir la cible des clips convertis sans les déplacer | `.\Tools\Restore.ps1 -Lot AnimToGenesis` | | CHG-184 | 2026-10-05 | AnimToGenesis | `BuildMod.ps1 -Retarget bake` lance `RetargetQuaternius.py` dans UnrealEditor avant la cuisson : les clips Quaternius sont recopiés sur Bridget et Michael. `-Retarget rigs` ne refait que les rigs. `-RetargetOnly` ne cuit pas. Sans `-Retarget`, un mod se cuit comme avant. Les copies effacées sont seulement `B_` / `M_` des clips source | la conversion vers les deux corps du jeu fait partie du build de mod | `.\Tools\Restore.ps1 -Lot AnimToGenesis` | | CHG-183 | 2026-10-05 | Sandbox | Pose Genesis : épaule 43,5°, clavicule 2,5°, cuisse 6°, sens mesuré vers le T | l'alignement par le maillage mettait ~40° sur la clavicule et ~11° sur l'épaule | retirer `apply_daz_adjustments` | | CHG-182 | 2026-10-05 | Sandbox | Cou et tête Genesis exclus de l'alignement par le maillage | le centre du crâne basculait la tête en arrière | réinclure la chaîne Neck dans `auto_align_bones` | | CHG-181 | 2026-10-05 | Sandbox | Pose de retarget Genesis 8 alignée par le maillage (MeshToMesh), pas par la chaîne | ChainToChain ignore un os isolé, donc l'avant-bras et la main restaient en pose A | revenir à `auto_align_all_bones` | | CHG-180 | 2026-10-05 | Sandbox | Recopie Genesis 8 : une chaîne par segment, jamais à travers un os Twist (col+épaule, avant-bras, main, cuisse, tibia, pied) | la chaîne clavicule→main faisait passer la rotation de l'avant-bras dans l'os de torsion | revenir aux chaînes LeftArm / LeftLeg de CHG-179 | | CHG-179 | 2026-10-05 | Sandbox | Recopie Bridget/Michael : os de torsion ignorés, pose cible alignée sur le T du mannequin, rotation un pour un, pas de translation | les bras Daz se repliaient dans le bassin ; le mannequin, lui, était correct | relancer l'ancienne copie sans `auto_align_all_bones` | | CHG-178 | 2026-10-05 | Sandbox | En Interaction, MC et PNJ jouent le même clip Quaternius. Bridget et Michael reçoivent la copie retargetée (`B_` / `M_`) | seul le mannequin jouait ces clips | retirer `Tools/RetargetQuaternius.py`, `Content/Quaternius/Retarget` et les clips `B_` / `M_` | | CHG-177 | 2026-10-05 | Sandbox | Menu toujours visible : MC et PNJ choisissent Mannequin, Bridget ou Michael. Le mannequin joue les clips Quaternius ; Bridget et Michael gardent l'idle Daz ou la paire `_F` / `_M` | le mode Interaction forçait le mannequin sur le MC | retirer `SelectBody` et les listes MC / PNJ | | CHG-176 | 2026-10-05 | Sandbox | Mode Interaction : le MC devient le mannequin Quaternius (`Content/Quaternius/UAL`, CC0, sans root motion). Le menu Marche liste ses 43 clips. Une touche de direction joue le clip choisi, l'arrêt revient à `Idle_Loop`. Pair garde Bridget | les cycles Daz ne pliaient que le pied | retirer `Content/Quaternius`, `LoadQuaternius` et `UseBody` | | CHG-175 | 2026-10-05 | Sandbox | La touche reste collée à la tête du PNJ, du côté de la caméra, et reste dans l'image | la lettre E flottait au milieu de la pièce | remettre le décalage de 42 cm | | CHG-174 | 2026-10-05 | Sandbox | À moins de 1,5 m, la touche `Interact` lue dans `Saved/Config/Windows/LPKeyboard.ini` s'affiche à côté du PNJ. Cette touche ouvre la liste | la lettre était fixe sur E | retirer la pastille et relire E | | CHG-173 | 2026-10-05 | Sandbox | La marche ne joue qu'avec une touche de direction, le repos revient à l'arrêt. En vue Yeux, 5 s sans marche repasse en vue Interaction ; reprendre la marche rend la vue Yeux | le cycle tournait aussi à l'arrêt | retirer le minuteur et rejouer le cycle en continu | | CHG-172 | 2026-10-05 | Sandbox | Le menu Interaction est un panneau opaque, sans texte moteur par-dessus. WHO1 et WHO2 ont une race (Human, Elf, Orc, Vampire) et des cases : temporaire, créature, mariage, relation, collègue, employé, parent, fréquentation, compagnon | les listes étaient couvertes, et le filtre WHO ignorait race et relation | retirer les cases et le panneau | | CHG-171 | 2026-10-05 | Sandbox | Mode Interaction : menu Marche (`Repos`, `walk_F`, `walk_M`, `HighHeelsWalk`, `HighHeels`) joué sur Bridget. Les `.lpaction` de `vin_Base` sont filtrés par WHO1, WHO2, WHERE et WHEN. E, près du PNJ, affiche cette liste | essayer les cycles de marche et voir quelles actions restent pour Bridget et Michael | retirer les menus et `CollectActions` | | CHG-170 | 2026-10-05 | Sandbox | Vue Dessus : bras 2 m, pitch −80°, champ 95°. L'ancienne distance de 8 m passait au-dessus du plafond, vers 4 m | la vue de dessus montrait l'extérieur de la chambre | remettre le bras à 8 m | | CHG-169 | 2026-10-05 | Sandbox | La chambre `work___vin01` sert aux deux essais. Menu en haut à gauche : Pair (collision, animations) ou Interaction (marche, vues, E ne charge que `chat.lpaction`). Les deux .bat ouvrent cette chambre | la vue Interaction séparée restait vide | retirer le menu de mode et `BeginInteraction` | | CHG-168 | 2026-10-05 | Sandbox | `LPInteractionSandbox` et `Tools/debug/LifePlay_interaction_sandbox.bat` : MC (Bridget, idle Daz) et un PNJ (Michael), sol, trois vues (1 Interaction, 2 Dessus, 3 Yeux, C enchaine). E à moins de 150 cm n'ouvre que `chat.lpaction`. Le cycle `walk_F` et la caméra suiveuse ne sont plus appliqués dans la partie : le clip ne pliait que le pied et la vue ne suivait pas | garder la partie intacte pendant l'essai des mouvements et des caméras | supprimer les deux fichiers, le .bat, et rappeler `WalkAnim` / `FollowCamera` | | CHG-167 | 2026-10-05 | Proximité | Marche : `walk_F` ou `walk_M` selon `IsMale`, rythme selon la vitesse, l'animation d'origine revient à l'arrêt. Caméra troisième personne derrière le personnage (bras 3,4 m, pitch entre −55° et −12°) tant que la vue active est `Birdview` ; C rend la main au jeu | le MC glissait sans cycle, et la vue de dessus ne le suivait pas | retirer `FollowCamera`, `WalkAnim` et `RestoreAnim` | | CHG-166 | 2026-10-05 | Proximité | La liste E reste cachée tant que E n'est pas pressé ; un second E ou un clic lance la ligne. Les boutons ne prennent pas le clavier. `PlayerCharacter` n'est pas possédé : `bRunPhysicsWithNoController` pour que `AddMovementInput` le déplace. Les touches digitales sont lues avec `IsPressed` | en ville la liste s'ouvrait seule et le MC ne bougeait pas : aucune ligne `Marche` dans le journal de 13:07, le mouvement sans contrôleur est ignoré | retirer `bPromptOpen` et `bRunPhysicsWithNoController` | | CHG-165 | 2026-10-05 | Clavier | Les touches sont dans `Saved/Config/Windows/LPKeyboard.ini`. `Input.ini` est le cache généré du moteur : à la sortie il l'efface quand le texte à écrire est vide | partie 12:44 : 55 actions écrites dans `Input.ini`, fichier absent après la fermeture de 12:58 | revenir au chemin `Input.ini` de CHG-164 | | CHG-164 | 2026-10-05 | Clavier | `LPKeyboardSubsystem` écrit et relit `Saved/Config/Windows/Input.ini` (`+ActionMappings` / `+AxisMappings`). Le fichier est créé au lancement. `SaveKeyMappings` ne l'écrit pas : `UInputSettings` est `defaultconfig` | le jeu packagé n'avait pas de `Input.ini`, donc les touches n'étaient pas restaurées | retirer `LoadSaved` / `SaveSaved` et revenir à `SaveKeyMappings` | | CHG-163 | 2026-10-05 | Réglages | Curseurs couleur et page Keyboard : même police à contour que les réglages existants, curseur copié sur `SettingSlider`. Couleur relue et écrite dans `Saved/Config/Windows/LPColorGrade.ini`. Les touches restent dans `Saved/Config/Windows/Input.ini` | les derniers réglages et le clavier n'avaient pas le style du menu, et la relecture devait être explicite | retirer le style partagé et revenir à `GConfig` pour la couleur | | CHG-162 | 2026-10-05 | Réglages | Page Keyboard : sections Movement, Camera, Interaction, Menus, Favorites, Time, World, Save, Scene, Other. Le texte d'aide passe à la ligne | la liste alphabétique mélangeait favoris, déplacement et menus | retirer `GroupFor` et le tri par section dans `LPKeyboardSubsystem.cppzzzzzzzzzzzzzzzzzzzzzzzzzzz` | | CHG-161 | 2026-10-05 | Réglages | `LPColorGradeSubsystem` : dans Video, Brightness (compensation d'exposition), Saturation, Contrast, White Balance et Tint. Volume de post-traitement non borné, valeurs neutres du moteur au départ. Fichier `Saved/Config/Windows/LPColorGrade.ini` | l'image trop blanche se règle par l'exposition et le Color Grading d'Unreal, pas par un nouveau pipeline couleur | retirer `LPColorGradeSubsystem.h/.cpp` et le cas `LPColor` dans `CategoryOf` | | CHG-160 | 2026-10-05 | Réglages | Onglets à la largeur du nom, ordre General, Audio, Video, Keyboard, Lewd, Misc. Page clavier en anglais. `Volume - Sex` affiché `Volume - Dialogue`, `Volume - Sex Moans` affiché `Volume - SFX` | les onglets se chevauchaient, le clavier était en français, et les deux volumes gardaient l'ancien libellé | retirer le renommage et les libellés anglais dans `LPSettingsSubsystem.cpp` et `LPKeyboardSubsystem.cpp` | | CHG-159 | 2026-10-05 | Réglages | `LPSettingsSubsystem` : entrée `LPSettingsTitleButton` sur l'écran titre, juste après `ModManagerTitleButton` (donc avant Donate). Le `SettingsButton` d'origine reste masqué par `ColapsedForTitleScreen` ; le clic de la nouvelle entrée rejoue son `OnClicked`. La liste est reconstruite : `InsertChildAt` laissait le bouton en dernier dans la boîte affichée, sous Exit, et le contenu centré le décalait vers la droite | Settings absent du menu principal, puis affiché sous Exit | retirer l'entrée titre dans `PlaceSettingsButton` | | CHG-157 | 2026-10-05 | Proximité | `LPDirectControlSubsystem` : marche ZQSD et WASD sur `MoveForward` / `MoveRight` (les flèches gardent la vue de dessus), journal seulement sur J, action `Interact` sur E. Index des `.lpaction` dont `WHERE` contient `interaction`, et des `.lpnear` (`MESH` / `PROMPT` / `ACTION`). L'invite Slate suit la personne ou le meuble le plus proche (150 cm) ; E appelle `TakeModActionWithBuilding` avec l'`ActionDetail` déjà chargé. `Content/Modules/vin_Base/Proximity/furniture.lpnear` | déplacer le personnage et lancer une action de module sans modifier les Blueprints | retirer `LPDirectControlSubsystem.h/.cpp`, `furniture.lpnear`, et les lignes `MoveForward`, `MoveRight`, `Interact` de `DefaultInput.ini` ; remettre Journal sur Q et WASD sur `LeftRight` / `DownUp` |