# 05 — Correctifs isolés et protocole de réimport sous contrôle renforcé > Décision D-01 (2026-09-29) : les correctifs appliqués avant la reprise n'ont été ni suivis ni > testés. Ils sont **isolés** : retirés du contenu (retour à la base 4.27 en L1) ou exportés en > patchs relisibles pour le code. Chacun est **réimporté seul**, selon le protocole du §3. > Décision D-02 : R-03 et R-04 sont annulés partout. --- ## 1. Correctifs de code (conservés, relisibles) Le code 5.5 est nécessaire pour compiler : il reste en place, mais chaque écart avec 4.27 est exporté dans `Docs/Migration/correctifs/` pour relecture. | ID | Patch | Contenu | Nécessaire à | Statut | |---|---|---|---|---| | CX-C01 | `P06` | `Target.cs` : `BuildSettingsVersion.V5`, `Unreal5_5` | compilation | conservé | | CX-C02 | `P06` | `.uproject` : `EngineAssociation 5.5`, suppression des 5 entrées de plugins (Victory, VisualStudioTools, SteamVR, ModdingPlus, MultiTask) | ouverture du projet | conservé ; section `Plugins` explicite en L2 | | CX-C03 | `P06` | `.uplugin` : suppression de `EngineVersion "4.27.0"` | chargement des plugins | conservé | | CX-C04 | `P03` | `ModdingExtra` : inclusions UE5 (`Engine.h` retiré), `Path.Combine` | compilation | conservé | | CX-C05 | `P04` | `StreetMap` : portage LWC (`FVector3f`, `FBox3f`), R-01 (`FAssetRegistryTagsContext`), R-02 (initialiseurs) | compilation, 280 villes | conservé ; vérifié en L4 (`LPCheckStreetMap` 4.27 et 5.5) | | CX-C06 | `P01`, `P05` | `LPVictoryCompat` (2 fonctions) + 3 `[CoreRedirects]` Victory → LifePlay | chargement de `GI`, `ExtImg`, `FaceTexture`, `MainMenu`, `Inventory` | conservé ; à contrôler en L4 (T-LOAD-01) | | CX-C07 | `P01` | `LPAssetRegistryHelpers::GetAssetByObjectPath` : conversion `FSoftObjectPath` | compilation | conservé | | CX-C08 | `P01` | `LPAssetRegistryHelpers::GetAssetsByClassName`, `GetAssetObjectPath` (nouvelles fonctions) | réimport de CX-B01 | conservé, **inutilisé** tant que CX-B01 n'est pas réimporté | | CX-C09 | `P01` | `LPNavigationHelpers` (enrobage pur de `K2_GetRandomLocationInNavigableRadius`) | R-04 | conservé ; **utilisé par CX-B11** (L7b) | | CX-C10 | `P01` | `LifePlay.Build.cs` : `PublicIncludePaths`, `NavigationSystem`, `ImageWrapper`, `ApplicationCore` | compilation | conservé | | CX-C11 | `P05` | `Config` : `[CoreRedirects]`, 4 clés PhysX retirées, classes Enhanced Input par défaut, description, `StagingDirectory`, section `McpAutomationBridgeSettings` | — | conservé ; relu en L2 | | CX-C12 | `P03` (hors patch : ajouté le 2026-09-28) | instrumentation `LogLPModdingTrace` | diagnostic | **retiré** en L3 (CHG-016 : `LogModdingExtra` en `Verbose`) | | CX-C13 | `P02` | commandlets `LifePlayEditorTools` (1 777 lignes) | outillage éditeur | conservé ; ne touche pas au jeu | | CX-C14 | — | `LPSessionLogSubsystem` : résumé de démarrage, bilan de session, options de diagnostic `-LPDump*`/`-LPTrace*` | EX-07, diagnostic | ajouté (L3, L5, L7i, L7l) | | CX-C15 | — | `LPStringCompat`, `LPMeshCompat` : fonctions au comportement 4.27, cibles de CX-B08, B10, B12 | parité 4.27 | ajouté | | CX-C16 | — | `LPSecondScreenSubsystem` : cadrage du visage du contact pendant un appel | ERR-031 (amélioration) | ajouté (L7j, CHG-054), validé en jeu | | CX-C17 | — | `LPOutdoorRoomSubsystem` : plafond `WallT` masqué dans les lieux extérieurs | ERR-036 (amélioration) | ajouté (L7l, CHG-057), validé en jeu | | CX-C18 | — | `Config` : rendu explicite (L7c), clés de nativisation retirées, `DirectoriesToAlwaysCook=/Game` | parité, cuisson complète | ajouté (CHG-025, CHG-049) | ## 2. Correctifs de contenu (retirés en L1, à réimporter un par un) | ID | Outil | Cible | Effet attendu | Justification | Priorité | Statut | |---|---|---|---|---|---|---| | CX-B00 | `LPFixAssetRegistryNodes` (portage 4.27) | `GI`, `Person`, `Room`, `UI/VisualMorph` | `GetAssetByObjectPath` en nœud pur | **déjà présent dans la base 4.27** (les 4 assets importent `LifePlay.LPAssetRegistryHelpers`) | — | inclus dans la base | | CX-B01 | `LPFixAssetRegistryPins` | `GI` : 3 `GetAssetsByClass` (+ 2 broches associées) | nœuds rebranchés sur `GetAssetsByClassName` avec la valeur de classe d'origine | **candidat n°1 pour ERR-002** : sans lui, `GetAssetsByClass` interroge avec un chemin de classe vide ; aucun corps, vêtement ni coiffure énumérable | 1 | **réimporté** (CHG-018, validé statiquement) ; A/B d'exécution après CX-B02 | | CX-B02 | `LPFixEditableTextBoxFont` | `UI/CharGen`, `UI/StatMenu` : 6 nœuds `Make/Break EditableTextBoxStyle` | broche `Font` orpheline retirée | **bloque la cuisson** (6 erreurs, cook du 2026-09-07) | 2 | **réimporté** (CHG-022) ; commandlet corrigée au passage (ERR-025) | | CX-B03 | `LPFixZeroScaleActors -Fix -Scale=0.1` | `Scenes/CentralLondon` : `Wall.StaticMeshComponent0` | échelle X 0 → 0,1 | corps physique invalide ; `ensure InverseFast` (plantage éditeur du 2026-09-07) | 3 | **réimporté** (CHG-023) | | CX-B04 | `LPFixOrphanBoundEvents` | `UI/TopRight` (1), `UI/CharGen` (2) | 3 événements `On Clicked` orphelins supprimés | avertissements ; clics déjà morts | 4 | **réimporté** (CHG-024) | | CX-B05 | `LPFixDeprecatedNodes` (R-03) | 56 nœuds `SkeletalMesh`, 10 Blueprints | `GetSkeletalMeshAsset()` | **rejeté** : aggrave ERR-002 (16,6 → 35 `Accessed None`/perso) car les proxies sont des `USkinnedMeshComponent` | — | à refaire autrement (L7a) | | CX-B06 | `LPFixDeprecatedNodes` (R-04) | 6 nœuds, `AI`, `Person`, `Room` | `LPNavigationHelpers` | avertissements de dépréciation seulement | 5 | **remplacé par CX-B11** (commandlet sans contrôle, embarquait aussi la variante R-03 rejetée) | | CX-B08 | `LPFixParseIntoArray` (nouveau) | 114 nœuds `ParseIntoArray`, 17 Blueprints | rebranchés sur `LPStringCompat::ParseIntoArray` (algorithme UE 4.27) | UE5 renvoie `[""]` pour une chaîne vide : cause d'ERR-027 (personnages de quête invisibles/dévêtus) | 1 | **réimporté** (CHG-029), validé en jeu | | CX-B09 | `LPFixButtonPadding` (nouveau) | 430 `UButton`, 46 Widget Blueprints | marges des boutons remises au défaut UE 4.27 (Normal 2,2,2,2 ; Pressed 2,3,2,1), composante par composante | le style par défaut de `UButton` est passé à 12 px horizontaux en UE5 (`FUMGCoreStyle`) ; les assets 4.27 ne stockent pas la marge par défaut : cause d'ERR-034 (barre de temps décalée) | 1 | **réimporté** (CHG-033), validé en jeu | | CX-B10 | `LPFixSkeletalMeshGet` (nouveau) | 56 nœuds `Get SkeletalMesh`, 8 Blueprints (`Person` 28, `GI` 17, `CharGen` 3, `Inventory` 3, `Hairstyle` 2, `CharGenSlider`, `Cursor`, `Inventory_Cloth` 1) | remplacés par `LPMeshCompat::GetSkeletalMesh(Component)` = `Cast(GetSkinnedAsset())`, la sémantique exacte du getter déprécié, valable pour tout `USkinnedMeshComponent` | R-03 refait (L7a) ; remplace CX-B05 rejeté | 1 | **réimporté** (CHG-036), validé en jeu | | CX-B11 | `LPFixNavRandomPoint` (nouveau) | 6 nœuds `GetRandomPointInNavigableRadius` (`Person` 3, `Room` 2, `AI` 1) | remplacés par `LPNavigationHelpers::GetRandomLocationInNavigableRadius` : nœud pur, mêmes broches, même corps que la fonction dépréciée (appel de `K2_GetRandomLocationInNavigableRadius`, identique en 4.27 et 5.5) ; liaisons et valeurs par défaut reportées broche par broche | R-04 (L7b) : 6 derniers avertissements de compilation ; le remplaçant moteur est impur (broches d'exécution), d'où l'enrobage pur | 1 | **réimporté** (CHG-037), retiré à tort (CHG-038) puis réappliqué (CHG-039) ; validé en jeu | | CX-B12 | `LPFixStringSearch` (nouveau) | 385 nœuds `Contains` (160), `Split` (222), `FindSubstring` (3), 28 Blueprints (`GI` 240, `Person` 35, `Room` 16, `CharGen` 14…) | rebranchés sur `LPStringCompat::Contains/Split/FindSubstring` : mêmes broches ; sous-chaîne vide en mode insensible à la casse depuis le début → « non trouvé » comme en 4.27 (UE5 : trouvé en position 0) | ERR-005 (`getBeautyValue` ×38 : `filterMorphList` sans étiquette laissait passer tous les morphs) et toute recherche de texte avec un motif vide | 1 | **réimporté** (CHG-042), validé en jeu (CHG-043) | | CX-B07 | `LPResavePackages` (nouveau) | 239 paquets UE4 restants (`UI` 147, `Structs` 57, `BPs` 22, `Render` 11, `Characters` 1, `Scenes` 1) | format UE5, contenu inchangé | EX-03 ; T-STAT-01 | 6 | **réimporté** (CHG-035), diff avant/après neutre ; validé en jeu (build V1rc, V1) | ## 3. Protocole de réimport sous contrôle renforcé Un correctif = un sous-lot (`L4-CX-B01`, …) = un commit. Pas de regroupement. | Étape | Action | Preuve archivée dans `Docs/Migration/etat/` | |---|---|---| | 1 | `git tag L4-CX-xx-avant` ; `Tools\Snapshot.ps1 -Lot L4-CX-xx -Path ` | manifeste MD5 | | 2 | **Photographie avant** : `LPDumpFunction -BP= -Fn= -Pins` | `_dump_avant.txt` | | 3 | **Simulation** : commandlet avec `-DryRun` ; le nombre de nœuds trouvés doit égaler celui attendu (§2) | `_dryrun.txt` ; tout écart arrête le sous-lot | | 4 | Application réelle | journal de la commandlet | | 5 | **Photographie après** + diff avant/après : seuls les nœuds attendus diffèrent | `_dump_apres.txt`, `_diff.txt` | | 6 | `CompileAllBlueprints` + `LPCheckMeshAssignment` : aucune erreur **nouvelle** par rapport au relevé de base | résumés `RunCommandlet` | | 7 | Si le correctif touche le gameplay (CX-B01) : build Development + A/B avec la référence 4.27 (`Tools\LogStats.ps1 -Compare`) | tableau A/B | | 8 | Journal `CHG`, commit, `git tag L4-CX-xx-apres` ; en cas d'échec : `Tools\Restore.ps1 -Lot L4-CX-xx` | entrée de journal | Critère d'acceptation commun : **effet attendu observé, aucun effet de bord mesuré**.