| CHG-002 | 2026-09-29 | L0 | `.gitattributes` (nouveau) | aucune conversion de fin de ligne : restauration git identique à l'octet | — → créé | supprimer le fichier |
| 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 |
| 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 |
| 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` |
| 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` |
| 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) |
| 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` |
| **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 |
| 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` |
| 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 |
| 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` |
| 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 |
| 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.
| 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` |
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` |
| 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.*` |
| 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 |
Dépôt : [https://github.com/edujiro5972/LifePlay-Revival](https://github.com/edujiro5972/LifePlay-Revival) (fork de `vinfamy/LifePlay`, AGPL-3.0), compte `edujiro5972`.
[https://mega.nz/file/zloFkL7T#3P5GDfcfF5U352T0s472vCtyNh131RLgNWn__PSNL2I](https://mega.nz/file/zloFkL7T#3P5GDfcfF5U352T0s472vCtyNh131RLgNWn__PSNL2I). Principe de l'archive de l'auteur
| 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-restauration60930-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-restauration60930-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.
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 |
| 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` |
| 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`) |
| 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
| 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-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-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(lieuxextérieurs),lerendrevisiblequandlapièceredevientintérieure(seulements'ill'amasqué);aucunBlueprintniassetmodifié;build`LifePlay_Build_5.5_L7cdj`|supprimerles2fichiers(`gitcheckoutfa3d98e--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 `/<nom>.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\<nom>\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/<Nom>/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-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/<pack>/etapes`, `etat.json`, arrêt au premier contrôle en échec, reprise `-From`, ancien contenu déplacé dans `precedent_<date>`, `-DryRun`, `-SansCuisson`) ; `BuildMod.ps1 -Anim <pack>` ; `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 <j>`). `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=<id|auto>` 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().<clé>` ; `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/<Clip>.jpg` + `<Clip>.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/<clé>.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 <12cmethanche<72%;assis:hanche<72%etplusde20cmenarrièredeschevilles;accroupi:hanche<72%;deboutsinon),postureduclipsi≥60%desimages,sinon«variable»,posturededébutetdefin;hauteurd'assise(articulationdehanche,médianedesimagesassises);partdesimagespiedausol(<3cmdelahauteurderepos);mainsaurepos/enmouvement/levées.Deuxcorrectionsaprèslapremièrerelecturedesfiches:axeavantducorpsinversé(Rollsortait«arrière»,Sitting_Enter«avant»,lapositionassisesortait«accroupi»)etseuildeboutabaisséde80%à72%(gardesdecombatetpousséeclasséesaccroupi/assis).Résultat:42fiches,0échec(`etat/AP6_LPAnimCatalog_20261006-155043.txt`,puislepassagefinaldumêmejour).(3)Sandbox(`Source/LifePlay/LPPairSandbox.h/.cpp`,**hors dépôt**):mode«vignettes»delatournée(`Saved/sandbox_tour.txt`contenantlemot`vignettes`):unevueparclip,profildroità1/3deladurée,sanscalque,squelettesnirepèresdecaméra;imagerecadréeencarréautourdesosducorpsdeBridgetprojetésàl'écran(marge15%),réduiteà512pxetécriteparledélégué`UGameViewportClient::OnScreenshotCaptured`dans`Saved/Measurement/vignettes/<Clip>.png`;le`tour.csv`delatournéecomplèten'estpasremplacé.43vignettes.Latournéecomplète(387captures)aaussiétérefaiteaprèslescorrectionsdetorsiond'AP4.(4)`Tools/anim/Catalogue.py`(nouveau):assemble`catalogue.json`,`catalogue.html`(pageautonomehorsligne,filtrescatégorie/posture/durée,recherche,clécopiable,thèmeclairetsombre,lisiblesurtéléphone)et`vignettes/<clé>.png`dans`ModSources/<mod>/Module/Animations/`.Champsdu§5;`taille_ko`=tailledes`.uasset`**non cuits**(`taille_cuite:false`,lataillecuiteviendraenAP7);qualité =«accepté»ou«àrevoir»avecmotifs(rapportAP4),pireécartbrutetpiretorsiondesdeuxcorps;empreinteSHA-256desdeuxclips.Contrôlesbloquants(rienn'estécritsiunéchoue):rapportAP4valide;`fiches_calculees.json`sanséchecetplusrécentque`livraison.json`;fichecalculéeetentrée`pack.json`pourchaqueclé;clésuniques;aucunecollisionavecles17clésdujeu,lesclés`ANIMATION:`/`animate()`desmodulestexte(horsmoduled'essai)etlesautrescataloguesde`ModSources`;champsobligatoires;vignetteprésente.Essais:unsuccès(42fiches),troisrefus(vignettemanquante,collisionavec`dance`,fichesplusanciennesquelalivraison).Correctionsaprèsrelecture:hauteurd'assiseaffichéeseulementpourunepostureassise;écartdebouclearrondi;cartesfiltréesréellementmasquées;cadredesvignettescarré.(5)`Tools/anim/DeliverAnims.ps1`:commuta
| 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(<clé>)` (`GI::CallFunction`, aiguillage `SwitchString_22`, cas `animate` : `AnimateForced` vrai, `Person::PlayDaily(Parameters[0])`, `AnimateForced` faux) appellent `Person::PlayDaily(<clé>)`. `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(<clé>)`. `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 `/<Mod>/Anims` nommés `<clé>_F` / `<clé>_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(<clé>)` (BlueprintPure) ; journalise `PlayDaily(<clé>) -> 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_<Clip>` / `M_<Clip>` (hors `A_TPose`) vers `/lpr_anim_quaternius/Anims/Female/qua_<clip>_F` et `/Male/qua_<clip>_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
| 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_<Corps>.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 `<dossier>/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_<Corps>.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/<run>/rapport.json`, `rapport_poseT_<Corps>.json`, `eval_<Corps>.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_<Corps>.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_<vue>.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_<vue>.png`), référence `best_<vue>.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` |