# OPT0-A3-GRILLE : grille de décision de l'héritage UE4 vers UE 5.8 natif Fiche OPT0-A3 (`OPT0-A3-FICHE.md`) — Niveau N3 — Modèle prévu opus (Medium) | utilisé Opus 5.5 — Session « Medium · OPT0-A3 » — Skills : sk-orchestrate, lp-lot, lp-doc, sk-protocol. Date : 2026-10-15. Lecture seule : aucun éditeur, aucun build, aucune modification de code, d'asset ni de configuration, aucun git qui écrit. **Sans verdict d'exécution.** La grille classe les éléments et dit quelle preuve chaque changement exigera. Les lots d'exécution sont A4+, un groupe à la fois, A/B contre la base de l'alpha (doc 30 O4, `Docs\30_Projet_Audit_Obsolescence.md:38`). Niveaux : **établi** (fichier:ligne relu, entrée de BC établie, compte mesuré) ; **estimé** (déduction, BC estimée, guide) ; **incertain** (source unique non vérifiée, ou fait à relever). ## 1. Contraintes qui pèsent sur toutes les preuves - **Base de comparaison** : build Development 5.8, parcours S2 du doc 29, avec `LogStats` (temps de démarrage, taille du paquet, durée de cuisson) : doc 30 O4 (`30_Projet_Audit_Obsolescence.md:38`). Établi. - **Le banc P1 (PresentMon) ne mesure rien sur ce poste** : aucune image captée en 6 essais (`OPT0-TACHES.md:204`) ; la reprise est la fiche B2-ter (`OPT0-TACHES.md:212-215`). Établi. - **Le CSV Profiler est absent en Shipping par défaut** (`CsvProfilerConfig.h:10, :31`, cité `OPT0-TACHES.md:210`). Une preuve de coût CPU par catégorie demande donc une build **Development** avec `-csvprofile` (BUILD-GO). Établi. - **Aucun seuil PASS/FAIL standard** (BC-INDEX, lacunes R4, `BC-INDEX.md:32`) : les seuils se fixent sur la première mesure de l'alpha (`OPT0-TACHES.md:183`). Établi. - Conséquence : tant que B2-ter n'a pas abouti ou qu'une build Development avec CSV n'est pas faite, **aucun gain de performance ne peut être prouvé** ; seuls les changements dont la preuve est « non-régression » (compilation, banc, parcours) sont exécutables. Estimé. ## 2. Preuves exigées (définitions) | Code | Preuve | Outil, source | Coût | |---|---|---|---| | P0 | aucune (rien à changer, ou garder) | — | nul | | P1 | compilation C++ sans erreur ni nouvel avertissement | `Tools\Build.ps1` (skill lp-build) | faible, sans éditeur | | P2 | recompilation de tous les Blueprints sans erreur ni nouvel `Accessed None` | commandlet `CompileAllBlueprints`, journal archivé (REFAC-TRANSFO-T3 l. 21) | faible à moyen, copie UE | | P3 | banc `LPTestStringCompat` (3120 / 0 / 60) étendu au cas visé | skill lp-validate ; REFAC-TRANSFO-T2 l. 19 | faible | | P4 | parcours S2 joué par un humain, `LogStats` A/B contre l'alpha (non-régression : F5, DESTROY, à-coups avec `-Stats`) | `Tools\LogStats.ps1` (OPT0-PLAN l. 18) | moyen, humain | | P5 | mesure de coût A/B : CSV Profiler + PerfReportTool sur build Development (catégories Game Thread, Blueprint), ou banc P1 une fois B2-ter réussi | skill lp-perf, `OPT\DOC\DOC-CSVProfiler-PerfReportTool.md` | moyen à élevé, BUILD-GO | | P6 | A/B de rendu : temps GPU, durée de cuisson, taille du paquet, session sans plantage GPU (ERR-138) | lp-perf ; BC R5-14 à R5-17 | élevé | | P7 | relevé préalable par MCP (lecture seule, lp-mcp) : le fait manque pour décider | lp-mcp, méthode des lots A2b | moyen, éditeur | ## 3. Grille par élément Colonnes : élément (source et compte) ; remplaçant natif 5.8 ; gain attendu ; risque ; preuve exigée ; groupe A4+ ; niveau. ### 3.1 Éléments de A1 (C++ de l'addon et de StreetMap, INI, C4996) | Id | Élément (source, compte) | Remplaçant natif 5.8 | Gain attendu | Risque | Preuve | Groupe | Niveau | |---|---|---|---|---|---|---|---| | E01 | Motifs UE4 dans le C++ de l'addon et de StreetMap : `ENGINE_*_VERSION`, `UE_DEPRECATED` / `PRAGMA_DISABLE_DEPRECATION_WARNINGS`, `GetTimeSeconds`, `FindObject<`, `StaticLoadObject` : **0** chacun (A1 § 3, `OPT0-A1-INV.md:36-40`) | rien à faire | nul | nul | P0 | — | établi | | E02 | `ConstructorHelpers` : 1 (`Plugins/StreetMap/Source/StreetMapRuntime/StreetMapComponent.cpp:40`, A1 § 3) | garder : idiome UE5 courant dans un constructeur ; aucune entrée de BC ni de REFAC-API-58 ne le donne déprécié | nul | nul | P0 | — | estimé | | E03 | `FName(...TEXT(` sur une ligne : 3 (`LPSkeletonProfile.cpp:80, :81` ; `LPSandboxCoupleMod.cpp:238`, A1 § 3) | garder : aucun site dans un tick (0 `GetTimeSeconds`, A1 § 3 limites) ; `TEXT(` total 1 189 + 87 est un compte de référence, pas un élément | nul (code froid) | nul | P0 | — | estimé | | E04 | **Entrée legacy** : `ActionMappings` 55 (`Config/DefaultInput.ini:95-149`), `AxisMappings` 15 (l. 150-164), section `Engine.InputSettings` (l. 3), `bEnableLegacyInputScales=True` (l. 81, relu ce jour) | **Enhanced Input** : un asset Input Action par nom, Mapping Contexts par mode (BC R1-01, R1-02, établies). Déjà en place : `DefaultPlayerInputClass=/Script/EnhancedInput.EnhancedPlayerInput` et `DefaultInputComponentClass=…EnhancedInputComponent` (`DefaultInput.ini:165-166`, relu) ; plugin `EnhancedInput` activé (`LifePlay.uproject:49-50`). Seules les **liaisons** sont legacy. | aucun gain de performance attendu ni documenté (BC R1 n'en cite aucun) ; gain de durabilité : le moteur 5.8 permet de marquer des mappings dépréciés (`InputSettings.h:116-120` `bEnabledLegacyMappingDeprecationWarnings`, `:202-208` `DeprecatedActionAndAxisNames`), ce qui prépare un retrait futur ; débogueur d'entrée 5.8 (R1-103) | **élevé** : 70 mappings ; nombre de nœuds Blueprint `InputAction` / `InputAxis` **non relevé** par A2b ; pièges signalés (axes qui ne partent plus à chaque tick au repos, action 2D en Vector2D : R1-04, non vérifié) ; régression 5.7 sur les touches tenues (R1-05, non vérifié) | P7 (compter les nœuds d'entrée legacy par Blueprint) puis P2 + P4 (toutes les entrées du parcours S2) | G1 | établi (config, en-têtes) ; estimé (absence de gain) ; incertain (volume Blueprint) | | E04b | Liaisons d'entrée en C++ du jeu : `BindAction` / `BindAxis` / `InputComponent` dans `Source\` : **0** (grep relu ce jour) | sans objet : la passerelle `ENHANCED_INPUT_ALLOW_LEGACY_BINDING` (BC R1-102 ; `EnhancedInputComponent.h:600-610`, défaut 0) ne concerne que le C++ | nul | nul | P0 | G1 | établi | | E05 | Clés de rendu `r.` : 79 (`DefaultEngine.ini` 11, `DefaultScalability.ini` 68 ; A1 § 4) | garder : réglages du projet et de la scalabilité, voie native (BC R5-13) ; pas un héritage UE4 en soi. Seul le choix SM5 / SM6 est un candidat (E20) | nul | nul | P0 | — | estimé | | E06 | `gc.` : 0 ; `bUseFixedFrameRate` : 0 (A1 § 4) | rien à faire : le GC incrémental est expérimental et peu sûr vis-à-vis des threads (BC R8-02, R8-04, établies) ; aucun nouveau réglage GC en 5.6 à 5.8 (R8-101) | nul sans mesure | moyen si on active le GC incrémental | P0 ; P5 avant tout réglage GC | — | établi | | E07 | `C4996` : 0 dans les 4 derniers journaux de build (A1 § 5) ; candidat « StreetMap C4996 » d'OPT0-PLAN l. 41 | **clos** : plus aucun C4996 de StreetMap ni de l'addon. Les 5 C4996 restants sont dans le plugin Marketplace HyperAIStudio (`STM_Build_20261009-144519.log`, A1 § 5), hors périmètre | nul | nul | P0 (P1 à chaque montée de version, BC R1-101) | — | établi | ### 3.2 Éléments de A2b (110 Blueprints) | Id | Élément (source, compte) | Remplaçant natif 5.8 | Gain attendu | Risque | Preuve | Groupe | Niveau | |---|---|---|---|---|---|---|---| | E08 | Nœuds dépréciés des Blueprints : **non mesurables en lecture seule** (A2b § 3, `OPT0-A2b-INV.md:42`) | — (élément de mesure) : relever les avertissements de dépréciation à la compilation | — | nul (lecture) | P2 en lecture : journal `CompileAllBlueprints`, comptage des avertissements « deprecated » | G0 | établi (lacune) | | E09 | Appels `LPStringCompat` : 502, dans 36 Blueprints (A2b § 4 ; classement **estimé**) | **garder** : 60 écarts du natif sur 3120 cas (REFAC-INDEX l. 43 ; OPT0-PLAN l. 16) | — | élevé si on passe au natif (découpage de données changé : ERR-027, ERR-005, REFAC-TRANSFO-T2 l. 18) | P0 ; P3 avant toute révision | G2 (T2 seulement) | établi | | E10 | Appels `LPMeshCompat` : 56 (Person 28, GI 17, …, A2b § 4) ; mêmes totaux qu'OBA (R22) | `GetSkinnedAsset` + cast (`SkinnedMeshComponent.h:1222-1223`, REFAC-INDEX l. 28) : REFAC-TRANSFO-T3 | une fonction C++ de moins ; **aucun gain de performance démontré** (REFAC-INDEX l. 43 ; T3 l. 24) | faible, volume moyen (56 sites, T3 l. 20) | P2 + P4 (T3 l. 21) ; écriture par lp-mcp-bp sous instantané | G2 | établi | | E11 | Appels `LPNavigationHelpers` : 6 (Person 3, Room 2, AI 1, A2b § 4) ; R22 | `K2_GetRandomLocationInNavigableRadius` (`NavigationSystem.h:515-516`, impur) ; REFAC-TRANSFO-T5 | nettoyage seulement | faible à moyen : le nœud natif est impur, recâblage du flux d'exécution ; vérifier si `RandomLocation` et `ReturnValue` ont plusieurs consommateurs (T5 l. 16-17) | P7 (consommateurs sur les 6 graphes) puis P2 + essai en jeu des déplacements (Person `standIdle`, `jumpOffFnt` ; Room `moveToBedIfPossible`, `getStandSpots`) | G2 | établi (signatures) ; estimé (réévaluation) | | E12 | `Event Tick` : 24 Blueprints sur 110, 1 nœud chacun (11 `/Game/BPs`, 13 `/Game/UI`, A2b § 5) ; nœuds atteints depuis le Tick : Person 103, Tutorial 20, TestPerson 13, PC 8, les autres 1 (A2b § 6) | selon le cas : intervalle de Tick (R2-04), événement ou dispatcher au changement (R2-02), Timer (R2-05), désactivation du Tick des widgets sans travail continu (R2-01) ; passage en C++ des seuls points chauds mesurés (R2-12, R2-13, non vérifiées) | **inconnu** : aucun coût par Blueprint mesuré. Les Ticks à 1 nœud atteint (20 sur 24) font peu de travail ; le candidat principal est Person (103 nœuds, personnage répété) | moyen : Epic prévient qu'un événement en rafale peut coûter plus qu'un Tick (R2-03) ; Test* sont des Blueprints de test | P5 d'abord (coût du Tick de Person, de PC, de Tutorial) ; puis P2 + P4 + P5 A/B. Sans P5 : aucun changement | G3 | établi (comptes) ; estimé (gain) | | E13 | `Delay` / `RetriggerableDelay` : 89 nœuds dans 46 Blueprints ; **0 atteint depuis un Tick** (A2b § 6) | garder : le Delay est la voie native pour une action différée (R2-05, établie) | nul | nul | P0 | — | établi (dans le Blueprint ; appels hors Blueprint non suivis, A2b § 6) | | E14 | `Get All Actors Of Class` : 0 (A2b § 6) | rien à faire (R2-06 sans objet) | nul | nul | P0 | — | établi | | E15 | Blueprints d'animation : 7 FreeAnimationsPack + 3 Heavy, graphes d'animation **non classés** (A2b § 5) | Thread Safe Update Animation + Property Access (R1-06, R9-06, R9-07) ; Fast Path (R1-07, R9-08) ; Animation Budget Allocator si plusieurs personnages (R9-01 à R9-03) | inconnu ; potentiellement le plus fort de l'axe A si des Cast ou des calculs tournent dans l'EventGraph à chaque image (R9-06 : EventGraph « souvent le plus coûteux ») | moyen (pose, root motion : R9-09) | P7 (EventGraph des AnimBP, option « Warn About Blueprint Usage » en lecture du journal, R1-07) puis P5 | G4 | estimé | ### 3.3 Candidats nommés par OPT0-PLAN et par la base de refactorisation | Id | Élément (source) | Remplaçant natif 5.8 | Gain attendu | Risque | Preuve | Groupe | Niveau | |---|---|---|---|---|---|---|---| | E16 | Branche UE4 morte R20 : garde `ENGINE_MAJOR_VERSION >= 5` toujours vraie (`OBA-T5-EVAL.md:139`), aujourd'hui à `Source/LifePlayEditorTools/LPDumpFunctionCommandlet.cpp:105` (relu ; la ligne a bougé depuis OBA, l. 89-90) | supprimer la branche | propreté ; nul en jeu (commandlet d'éditeur) | nul | P1 (build Editor, OBA-T5-EVAL:139) | G5 | établi | | E17 | 10 gardes de version `UE_VERSION_*` / `ENGINE_*_VERSION` (REFAC-TRANSFO-T1), dont E16 | retirer les branches 5.5 | propreté | faible ; casse la compilation de la copie 5.5 si on y reporte | P1 ; décision de l'utilisateur sur la copie 5.5 (REFAC-INDEX l. 40) | G5 | établi | | E18 | `Victory_LoadTexture2D_FromFile` (5 assets) : REFAC-TRANSFO-T4 | `ImportFileAsTexture2D` (`KismetRenderingLibrary.h:210`, REFAC-INDEX l. 28) | nettoyage | moyen (REFAC-INDEX l. 39) | P7 (appelants) + P2 + P4 (images chargées en jeu) | G5, facultatif | estimé | | E19 | JSON écrit à la main dans l'addon (1 site) : REFAC-TRANSFO-T6 | `FJsonObject` + sérialiseur | nul | très faible (REFAC-INDEX l. 41) | P1 + relecture du fichier produit | G5, facultatif | estimé | | E20 | **SM5 contre SM6 / DX12** (EVAL-FAB-4 ; OPT0-PLAN l. 42) : `DefaultGraphicsRHI_DX12` (`Config/DefaultEngine.ini:129`) ; aucun format de shader fixé par le projet, donc défaut du moteur `+D3D12TargetedShaderFormats=PCD3D_SM5` (`Engine/Config/BaseEngine.ini:3411`, relu) | SM6 : cible recommandée par Epic, SM5 limité à 8 UAV par shader (R5-01) ; Lumen, Nanite, VSM exigent SM6 (R5-02, R5-03) ; la page des réglages Windows le marque « Experimental » (R5-04) | **non chiffré** (BC-INDEX l. 33 : aucun gain SM6/SM5 chiffré) ; ouvre Lumen et Nanite, pas un gain direct | **élevé** : recompilation de tous les shaders, durée de cuisson, rendu changé, antécédent de plantage GPU `DXGI_ERROR_DEVICE_RESET` (ERR-138 ; R5-14) ; matériel du poste RX 6600M dans la gamme RX 6000 (R5-02 ; variante mobile non vérifiée) | P6 complet + P4 ; décision de l'utilisateur | G6 | établi (config) ; incertain (gain) | | E21 | **Startup Movie Player** R23 : `[/Script/MoviePlayer.MoviePlayerSettings]` `+StartupMovies=loading` (`Config/DefaultGame.ini:7-10`) ; `Content/Movies/loading.mp4` 82 696 632 octets (relevé ce jour, = 78,9 Mio d'OBA-T5-EVAL:284) | aucun remplaçant prêt : Media Framework le remplacera « dans une version future » (R1-08, établie) ; module encore présent en 5.6 / 5.7 (R1-09, non vérifié) | nul en performance ; taille du paquet si le film est réencodé (hors héritage) | retrait futur sans date | P0 : suivi seulement (OBA-T5-EVAL:142) ; P1 à chaque montée de version | — (suivi) | établi | | E22 | Banc `LPTestStringCompat` étendu à `ParseIntoArray` : REFAC-TRANSFO-T2 | — (préalable de mesure) | aucun en jeu ; sécurise E09 et E10 | aucun (commandlet d'éditeur, T2 l. 18) | P3 | G2 (en premier) | établi | ## 4. Groupes d'exécution A4+ (proposition, sans décision) | Groupe | Éléments | Nature | Préalable | Preuve d'acceptation | Ordre proposé | |---|---|---|---|---|---| | G0 | E08 | mesure : avertissements de dépréciation des Blueprints | copie UE, commandlet (BUILD-GO) | journal archivé, compte brut | 1 (peu coûteux, peut révéler d'autres éléments) | | G2 | E22, E10, E11 (E09 garder) | nettoyage U9 : T2 → T3 → T5 (REFAC-INDEX l. 36-38) | E22 d'abord ; P7 pour E11 | P3, P2, P4 | 2 | | G5 | E16, E17, E18, E19 | nettoyage C++ | décision sur la copie 5.5 pour E17 | P1 (+ P2 et P4 pour E18) | 3, regroupable avec G2 | | G1 | E04, E04b | migration de l'entrée vers Enhanced Input | P7 : nœuds d'entrée legacy par Blueprint ; décision de l'utilisateur | P2 + P4 (toutes les entrées du parcours S2) | 4 (durabilité, aucun gain de performance) | | G4 | E15 | AnimBP thread-safe, Fast Path, budget | P7 ; P5 disponible | P5 A/B + P4 | 5, après B2-ter ou CSV Development | | G3 | E12 | Ticks Blueprint | P5 disponible (mesure de Person, PC, Tutorial) | P5 A/B + P2 + P4 | 5, après B2-ter ou CSV Development | | G6 | E20 | SM6 / DX12 | décision de l'utilisateur ; P6 outillé (B2-ter) | P6 + P4 | 6, en dernier | | — | E01, E02, E03, E05, E06, E07, E13, E14, E21 | rien à faire, garder ou suivre | — | P0 | — | Lecture d'ensemble (estimé) : aucun élément de l'axe A n'a aujourd'hui de **gain de performance prouvé**. Les seuls candidats à gain possible sont E12 (Ticks, surtout Person) et E15 (AnimBP), et les deux exigent une mesure P5 que le poste ne sait pas encore produire (§ 1). Les groupes G0, G2 et G5 sont des nettoyages sans risque notable, prouvables par compilation et parcours. ## 5. Recompte contre A1 et A2b | Source | Compte de la source | Rattaché dans la grille | Écart | |---|---|---|---| | A1 § 3 : 5 motifs à 0 + `ConstructorHelpers` 1 + `FName(TEXT` 3 + `TEXT(` 1 276 (référence) | 8 lignes de motif | E01 (5 motifs), E02 (1), E03 (3 + référence) | 0 | | A1 § 4 : `ActionMappings` 55, `AxisMappings` 15, `Engine.InputSettings` 1, `bUseFixedFrameRate` 0, `r.` 79, `gc.` 0 | 6 motifs | E04 (3), E06 (2), E05 (1) | 0 | | A1 § 5 : C4996 0 sur 4 journaux, + 5 hors périmètre | 1 constat | E07 | 0 | | A2b § 3 : dépréciés non mesurables | 1 | E08 | 0 | | A2b § 4 : String 502 + Mesh 56 + Navigation 6 = 564 | 3 correctifs | E09, E10, E11 | 0 (502 + 56 + 6 = 564) | | A2b § 5 : Event Tick 24 (11 + 13 = 24) ; AnimBP 10 (7 + 3) non classés | 2 | E12, E15 | 0 | | A2b § 6 : Delay 89 / 46 Blueprints ; GAAOC 0 | 2 | E13, E14 | 0 | | OPT0-PLAN l. 37-43 : 6 candidats (entrée legacy, U9 R22, R20, StreetMap C4996, SM5/SM6, Movie Player R23) | 6 | E04, E10 + E11, E16, E07, E20, E21 | 0 | | REFAC-INDEX l. 34-41 : T1 à T6 | 6 | E17 (T1), E22 (T2), E10 (T3), E18 (T4), E11 (T5), E19 (T6) | 0 | | Ajouts de cette fiche (relus ce jour) | — | E04b (0 liaison C++), `bEnableLegacyInputScales` dans E04, formats de shader dans E20 | ajouts signalés | Total : 23 lignes de grille (E01 à E22 et E04b). Tout élément de A1 et de A2b est rattaché. ## 6. Décisions à soumettre à l'utilisateur (par Big Boss) 1. Ordre des groupes A4+ (§ 4) : accord, ou autre priorité. 2. G1 (Enhanced Input) : migrer sans gain de performance, pour la durabilité, ou attendre une dépréciation effective du moteur. 3. G5 / E17 : retirer les gardes de version 5.5 (le développement 5.5 est arrêté selon la décision du 2026-10-12, à confirmer par Big Boss). 4. G6 / E20 : instruire SM6 maintenant, ou après la réparation du banc (B2-ter) et la stabilisation ERR-138. 5. G3 et G4 : accepter qu'aucun changement de Tick ou d'AnimBP ne parte avant une mesure P5 (B2-ter ou CSV Profiler sur build Development avec BUILD-GO). ## 6b. Décisions de l'utilisateur, 2026-10-15 (transmises par Big Boss) 1. Ordre A4+ : « Ordre proposé (Recommandé) » : G0, G2, G5, G1, puis G3 et G4 après mesure, G6 en dernier. 2. G1 (Enhanced Input) : « Oui, pour la durabilité ». 3. G5 / E17 (gardes de version 5.5) : « Oui (Recommandé) ». 4. G6 / E20 (SM6) : « Après B2-ter et ERR-138 (Recommandé) ». 5. G3 / G4 : aucun changement avant une mesure P5 (conséquence du § 1, non contestée). G0 n'est pas lancé : il demandera un ordre de l'utilisateur et un BUILD-GO. ## 7. Limites - Aucun coût mesuré : tous les « gains » sont des attentes, au mieux estimées. - Le nombre de nœuds d'entrée legacy (`InputAction`, `InputAxis`) dans les Blueprints n'a été relevé par aucune fiche (E04, P7 à faire). - A2b ne suit pas les appels hors Blueprint ni les délégués (A2b § 6) : un Delay ou un coût atteint depuis un Tick par un autre chemin n'est pas exclu. - Les entrées R1-04 et R1-05 (pièges de migration de l'entrée) restent non vérifiées ; la seule preuve locale est l'existence de l'option de dépréciation des mappings dans `InputSettings.h:116-120`, qui ne prouve pas un retrait. - Le classement String de A2b reste estimé (A2b § 4). - Faits du moteur relus directement par cette session (sans délégation) : `InputSettings.h:96-120, :202-208`, `EnhancedInputComponent.h:600-615`, `BaseEngine.ini:3411-3412`, `Config/DefaultInput.ini:81, :165-166`, `Config/DefaultEngine.ini:127-129`, `Config/DefaultGame.ini:7-10`, `LifePlay.uproject:49-50`, `LPDumpFunctionCommandlet.cpp:105`. ## 8. Fin Fichiers écrits : `OPT0-A3-FICHE.md`, ce livrable, la ligne A3 de `OPT0-TACHES.md` (tous dans `etat\`, suivis par git : `.gitignore` l. 77). Fichiers à commiter (ticket de Big Boss) : - A `Docs/Migration/etat/OPT/OPT0/OPT0-A3-FICHE.md` - A `Docs/Migration/etat/OPT/OPT0/OPT0-A3-GRILLE.md` - M `Docs/Migration/etat/OPT/OPT0/OPT0-TACHES.md` Journal : sans objet (aucun fichier hors `etat\` modifié). Fin : `[A3→BOSS] OPT0 FIN-FICHE A3 D:\Game\LifePlay-master 5.8\Docs\Migration\etat\OPT\OPT0\OPT0-A3-GRILLE.md`