LifePlay-Revival/Docs/Migration/etat/REL/GIREV/GIREV-PRE.md

259 lines
38 KiB
Markdown
Raw Normal View History

Fiche GIREV-PRE — Niveau N2+ — Modèle prévu non précisé par la fiche | utilisé claude-sonnet-5-5 — Agent lp-cart — Skills sk-protocol, ue-cpp-build, lp-commandlets, lp-paths
# GIREV-PRE : étude préliminaire de la révision unique de `GI.uasset` (liste, ordre, dumps, découpage, retour arrière) (2026-10-20)
Hors gabarit : la rubrique 3 est subdivisée (3.1 à 3.10) pour porter la liste ordonnée, les dumps à produire, le découpage, la durée et le retour arrière demandés par la fiche. Lecture seule : ni copie UE, ni MCP, ni éditeur, ni commandlet. Seul ce fichier est écrit. Descriptions neutres (doc 27) : les noms de sections et de morphs réservés ne sont pas cités. Les questions de cette étude sont numérotées `GQ1` à `GQ9` pour ne pas les confondre avec les Q7 et Q8 de CG2, le Q7 de KEY2 et le Q7 de FIX1-F6.
Ordre de l'utilisateur, cité : « Lance l'étude de la révision unique de GI (liste et ordre des modifications) » (`BOSS-JOURNAL.md:1056`). Règle : `GI.uasset` n'est révisé qu'une fois, en build 2 (`BOSS-JOURNAL.md:693`, `:870`).
## Résumé (à lire en premier)
1. **La liste de la fiche n'est pas entièrement dans GI** (établi, § 3.3). C8, Q7, Q8 et R7 visent `CharGen` ; le remappage de Y/N vise `PC` ; ERR-145 n'a pas de cause établie. Ces six points sortent de la révision de GI. Restent dans GI : C10, C11, D2, D9, D17, ERR-142, F7a, le message de F6 et les deux commandes de console.
2. **Le message de F6 et C11 sont le même nœud** (établi pour la position, § 3.2 M2) : le texte « copy your old … Content\Saves … » est le champ `Content` du nœud `K2Node_CallFunction_20748`, que C11 supprime parce qu'il est orphelin (aucune liaison d'exécution dans le dump 5.8 du 2026-10-13). Les fiches F6 le traitent comme un message affiché : contradiction à lever avant d'écrire (GQ4).
3. **D17 est en grande partie déjà couvert par le C++** (établi, § 3.2 M6) : le nœud appelle un assistant C++ qui journalise un avertissement pour tout chemin non résolu. Il ne reste que le cas « asset trouvé mais pas une texture ».
4. **D9 est bloqué par deux inconnues** : la décision de comportement n'est pas prise (R06 § 5.5 n° 2) et la capacité du MCP à créer une variable locale n'est pas connue (§ 3.2 M8).
5. **Dumps 5.8** : le dump EventGraph de GI du 2026-10-14 10:38 est postérieur à la dernière sauvegarde de GI (10:33) et reste utilisable tant que le MD5 vaut `32fc0a97…`. Trois dumps manquent ou sont à rafraîchir : `SavePreset`, `GenerateAndApplyFloats`, `CalculateHeadtrack` (§ 3.7).
6. **Ordre** : préparation, puis EventGraph (M1, M2, M6), `SavePreset` (M3, M4, M5), enfin les fonctions à effet (M7, M8), clôture (§ 3.6). **Trois sous-lots** d'au plus 50 tours dans une seule session d'éditeur et un seul instantané (§ 3.8). Charge estimée : 50 à 90 écritures relues (§ 3.9).
## 1. Objet et périmètre
Un domaine : établir la liste exacte et ordonnée des modifications de `Content/BPs/GI.uasset` à faire en un seul passage (build 2, `2026.11.3.1a` vers le 3 novembre, `BOSS-ETAT.md:106`), avec nœuds, nature, dépendances, risque, voie, preuve en jeu, dumps préalables, découpage, durée et retour arrière. Sources demandées : lot CG2 (CART, SPEC, TACHES, IMPL, VAL, DOC), référentiel CG de l'addon, ERR-142, KEY2, FIX1-F7-PRE, FIX1-F6-SPEC, QPERS-PRE, BOSS-ETAT « Reports en build 2 », CAM2. Hors périmètre : toute écriture, tout essai, la décision sur chaque point.
## 2. Commandes et lectures (exactes) avec compte brut
| # | Commande ou lecture | Résultat brut |
|---|---|---|
| 1 | Read `lp-doc/gabarits.md` (CART) | gabarit lu |
| 2 | Read `BOSS-ETAT.md:100-160`, `BOSS-JOURNAL.md:690-695`, `:767`, `:868-872` ; Grep `revision unique de GI[^|]{0,200}` dans `BOSS-JOURNAL.md` | `:1056` (ordre de l'utilisateur) ; autres lignes citées en § 3 |
| 3 | Read `37_Feuille_De_Route_Alpha2.md:100-189` | § 2.7 = `:148-151` (ne liste pas C8, C10…) |
| 4 | Read `CG2-SPEC-01.md` (226 l.), `CG2-IMPL-01.md:140-249`, `CG2-TACHES.md:15-64` et `:72`, `CG2-CART-01.md:1-140` | cités en § 3 |
| 5 | Grep `CG2-VAL-01.md`, `CG2-DOC-01.md` (`GI.uasset`, `B2`, `C10`…) | VAL `:32-35`, `:143-144`, `:184` ; DOC `:33-35` |
| 6 | Read `CGREF1-T3-MCP.md:55-102`, `CGREF1-T3c-MCP.md:56-71`, `CGREF1-T7-TEST.md:14-53` (addon, `Docs/etat/CG/CGREF1/`) | nœuds `SavePreset`, `LoadDefaultTextures`, `GenerateAndApplyFloats` |
| 7 | Grep `Registre_Erreurs.md` `ERR-142\|ERR-145` ; Read `:49`, `:152` | `:149` (ERR-142), `:152` (ERR-145), `:49` (ERR-042) |
| 8 | Grep `\bR7\b` dans `etat/REL/KEY2`, puis dans `etat` | KEY2 : aucun ; sens trouvé : `BOSS-JOURNAL.md:767`, `CG2-TACHES.md:72` |
| 9 | Read `FIX1-F7-PRE.md`, `FIX1-F6-SPEC.md`, `QPERS-PRE.md` (entiers) | cités en § 3 |
| 10 | Grep `KEY2` (`GI\.uasset\|build 2\|Y/N\|remapp`) ; Grep `\bGI\b` dans `KEY2-SPEC-02.md` (compte) | KEY2-SPEC-01 `:34`, `:246` ; KEY2-TACHES `:35` ; `KEY2-SPEC-02.md` : 0 occurrence |
| 11 | Grep `\bGI\b` dans `CAM2-SPEC-02.md` ; Grep `GI\.uasset\|…build 2…` dans `CAM2-{CART,DIAG,TACHES,JOURNAL}*.md` | SPEC-02 `:24-82` ; autres fiches CAM2 : aucune ligne |
| 12 | Grep `r[ée]vision (unique )?(de \|du \|des )?`?GI\|…\|S1-BP` (`-o`, `*.md`) dans `etat` | 24 lignes ; STM1-SPEC-01 `:87`, STM1-SPEC-02 `:54`, STM1-SPEC-06 `:39`, SET1-PRE `:123`, COMMUN-17-BILAN `:123`, CAM2-SPEC-02 `:58`, `:63` |
| 13 | `git log --format="%h %ad %s" --date=short -8 -- Content/BPs/GI.uasset` | 8 lignes ; tête : `c4cf6f3 2026-10-14 STE : alpha 2026.10.2.1a, GI et TopRight …(CHG-347)` |
| 14 | `ls -l Content/BPs/GI.uasset` ; `git ls-files --eol` ; `md5sum` | 52 686 555 octets, 14 oct. 10:33 ; `i/-text w/-text attr/-text` ; `32fc0a970ab194626e8dc07df3a9633d` |
| 15 | `rg --no-ignore -N --no-filename -o "^Commandlet : LPDumpFunction -BP=GI -Fn=\S+" -g "*LPDumpFunction*.txt" Docs/Migration/etat \| sort \| uniq -c` | 55 variantes de `-Fn=` ; `EventGraph` ×16, `SavePreset` ×2, `LoadPreset` ×1, `GenerateAndApplyStrings` ×1, `GeneratePerson` ×1, `*` ×1 ; **aucune** ligne `GenerateAndApplyFloats`, **aucune** `CalculateHeadtrack` |
| 16 | même `rg` limité aux noms `SavePreset\|LoadPreset\|GeneratePerson\|GenerateAndApplyStrings\|getSkeletalMeshFromPath` ; `rg -l "-Fn=\*"` | `SavePreset` : `STE-D9_…20261011-051838`, `STE-H10V_…20261013-071350` ; `-Fn=*` : seulement `portage55/L6f/L6f_LPDumpFunction_20260930-102202.txt` (5.5) |
| 17 | Read dump `CAM-B1-PRE_LPDumpFunction_20261013-083048.txt` `:1-12`, `:5262-5357`, `:14770-14830`, `:20255-20305` | en-tête `-Fn=EventGraph -Pins -Exec`, 61 s, code 0 ; nœuds § 3.2 |
| 18 | Grep dump `STE-ORG4cV_LPDumpFunction_20261014-103731.txt` (nœuds M1, M2) ; en-tête | en-tête : `Date : 2026-10-14T10:38:41 duree : 66 s code de sortie : 0` ; lignes `5312`, `5321`, `14818`, `20264`, `20273` (5 lignes, en-têtes de nœuds et littéraux seulement) |
| 19 | Grep même dump `bIncludeOnlyOnDiskAssets\|K2Node_CallFunction_1048 \|K2Node_CustomEvent_96 ` | `28582` (événement `LoadDefaultTextures`), `28601`, `28604` (`'true'`) ; autres : `12342` (`'false'`), `12368`, `12384`, `28669` |
| 20 | Grep dump `STE-H10V_LPDumpFunction_20261013-071350.txt` (nœuds `SavePreset`) | `135` (`Concat_762`), `141` (`VariableSet_930`), `1476-1479` (`EndsWith`, suffixe `Characters\0.lpcharacter`), `1482` (`IfThenElse_2970`), `1487` / `1503` (`PrintString` `_0`, `_1`), `2236-2299` (`_81`, `_86`, `_88`, `_89`, `VariableSet_10`, `_91`) |
| 21 | Read `Source/LifePlay/LPAssetRegistryHelpers.cpp:1-60` ; Grep `GetAssetByObjectPath` dans `Source` | `:34-49` journalise `GetAssetByObjectPath ECHEC` ; 8 lignes (limite atteinte) |
| 22 | Grep (compte) `GetAssetByObjectPath ECHEC` dans le `LifePlay.log` du build `LifePlay_Build_5.8_Development_COM23` | `Found 0 total occurrences across 0 files.` |
| 23 | Grep même journal `Command not recognized: r\.PostProcessAAQuality\|r\.MorphTarget\.Mode is read only\|Missing characters from save\|missing crucial` | `1202` (`[2026.10.20-20.33.03:353][238]Command not recognized: r.PostProcessAAQuality 3`), `1219` (`Error: r.MorphTarget.Mode is read only!`) ; aucune ligne `Missing characters` ni `missing crucial` |
| 24 | Grep `CAM2-IMPL-06.md` (`set_pin_value\|paquet\|dirty\|save_assets`) | `:28`, `:53`, `:78` (leçon IMPL-06) |
| 25 | `ls Tools/{Snapshot,Restore,PubCheck,UeState,FileCheck,RunCommandlet}.ps1` ; `rg -n "GI" etat/REPO/FILE.md` | les 6 scripts présents ; FILE.md : 0 ligne contenant `GI` |
Écart de méthode : les `.txt` d'`etat/` sont ignorés par git ; un Grep de dossier ne les voit pas (FIX1-F7-PRE § 2). Chaque dump a été lu **par son nom**, et les comptages de dumps (n° 15, 16) par `rg --no-ignore` (sans cela, résultat vide à tort).
## 3. Constats `fichier:ligne`
### 3.1 État de GI
- MD5 `32fc0a970ab194626e8dc07df3a9633d`, 52 686 555 octets (n° 14), égal à la référence de `BOSS-JOURNAL.md:693` et de `CG2-IMPL-01.md:224`. Arbre de travail propre pour ce fichier (absent du `git status` de départ). Dernier commit : `c4cf6f3` (2026-10-14), précédé de `0745917`, `a08c134`, `b3ee785` (n° 13).
- Aucun ticket de la file du dépôt ne mentionne GI (n° 25).
- Plusieurs lots exigent que GI reste inchangé jusqu'à la build 2 : `COMMUN-17-BILAN.md:123`, `CAM2-SPEC-02.md:63`, `KEY2-CART-02-FICHE.md:33` (égalité du MD5 exigée avant et après). Après la révision, la référence `32fc0a97…` change dans BOSS-ETAT et dans ces fiches.
- Le doc 37 § 2.7 (`37_Feuille_De_Route_Alpha2.md:148-151`) **ne contient pas** la liste C8, C10… : elle n'existe que dans `BOSS-ETAT.md:143`, avec la mention « à verser » ; `BOSS-JOURNAL.md:767` dit le report « à faire par une fiche ».
### 3.2 Modifications de GI : une fiche par modification
Notation : `EG` = `/Game/BPs/GI.GI:EventGraph`, `SP` = `/Game/BPs/GI.GI:SavePreset`. Les identifiants de nœuds se relisent par `get_node_infos` en tête de session (R1 de la SPEC CG2).
**M1. Commandes de console inutiles au démarrage** (QPERS-PRE, `:44`, `:177`)
- Où : `EG`, événement `UpdateGraphicsQuality` (`K2Node_CustomEvent_1324`). Liaisons lues dans le dump 5.8 `CAM-B1-PRE…083048.txt:5274-5351` (13 octobre) ; le dump du 14 octobre `STE-ORG4cV…` porte les mêmes nœuds aux mêmes lignes (`:5312`, `:5321`, `:20264`, `:20273` : existence seule relue).
- Chaîne lue : `CallFunction_244` (`r.ScreenPercentage`) → `CallFunction_11964` (`sg.PostProcessQuality`) → `CallFunction_11966` (`r.PostProcessAAQuality`, concaténation `…Operator_907`, `Conv_IntToString` `CallFunction_11967`, lecture `VariableGet_3740`) → `CallFunction_311` (`sg.ShadowQuality`) → `CallFunction_11960` (`r.MorphTarget.Mode`, concaténation `…Operator_973`, `SelectString` `CallFunction_316` choisi par `VariableGet_219`, sortie `then` vide : fin de chaîne). Le tronçon entre `CustomEvent_1324` et `CallFunction_244` (`CallFunction_13544` … `CallFunction_15965`) n'a pas été lu.
- Nature : **liaisons et suppressions**.
- a) `break_pins` (`_11964`.then → `_11966`.execute) et (`_11966`.then → `_311`.execute) ; `connect_pins` (`_11964`.then → `_311`.execute) ; `delete_node` `_11966`, `…Operator_907`, `_11967`, `VariableGet_3740` (seulement s'il n'a pas d'autre liaison).
- b) `break_pins` (`_311`.then → `_11960`.execute) ; `delete_node` `_11960`, `…Operator_973`, `_316`, `VariableGet_219` (sa seule sortie va à `_316`.bPickA ; `VariableGet_220`, lecteur de `VariableSet_115`, reste).
- Les variables membres `PostProcessAAQuality` et `CPUSkinning` restent (réglages enregistrés, autres lecteurs et écrivains : dump `:8581-8706`, `:20261-20295`).
- Effet : aucun (établi) : le journal COM23 montre `Command not recognized: r.PostProcessAAQuality 3` (`LifePlay.log:1202`) et `Error: r.MorphTarget.Mode is read only!` (`:1219`) ; `r.PostProcessAAQuality` n'existe pas en 5.8 (`QPERS-PRE.md:42`).
- Dépend de : rien. Risque : très faible (suppression de commandes rejetées) ; seule la rupture de la chaîne `then` est à contrôler.
- Voie : MCP `lp-mcp-bp`. Écritures estimées : 8 à 12.
- Preuve en jeu : journal d'un build Development : 0 ligne `Command not recognized: r.PostProcessAAQuality` et 0 ligne `r.MorphTarget.Mode is read only` (avant : 1 et 1 par session) ; les lignes `Set CVar` de `sg.PostProcessQuality`, `sg.ShadowQuality` et `r.ScreenPercentage` sont inchangées.
**M2. C11 / D27 : nœuds orphelins de l'`EventGraph`, et message de F6** (`CG2-SPEC-01.md:92`, `:193` ; `CG2-CART-01.md:70` ; `FIX1-F6-SPEC.md:85`, `:371`)
- Où : `EG`. `K2Node_CallFunction_20748` (`?::ShowTutorial`, broches `Title`, `Content`, `Force`, `Warning` ; `execute` et `then` **sans liaison** dans le dump du 13 octobre : `CAM-B1-PRE…:14818-14825`). `K2Node_CallFunction_13122` (`PrintString` « Missing characters from save », `execute` sans liaison, `then` → `CallFunction_340`.execute : `CAM-B1-PRE…:14791-14801`). `CallFunction_340` reçoit aussi `IfThenElse_2861`.else (`:14790`) : il reste. Dans le dump du 14 octobre, `_20748` est à la même ligne (`:14818`) ; ses broches n'y ont pas été relues (estimé identique).
- Contenu du nœud `_20748`, `Content` : le texte demandant de recopier l'ancien dossier `Content\Saves` (`CAM-B1-PRE…:14823`). **C'est le message visé par `FIX1-F6-SPEC.md` Q7.** `FIX1-F6-PRE.md:96` et `FIX1-F6-SPEC.md:85` le décrivent comme un message affiché ; le dump du 13 octobre montre qu'aucune exécution n'y mène ; le journal COM23 ne contient ni son texte ni celui du `PrintString` (n° 23 : un seul journal, sans preuve que le cas se soit présenté).
- Nature : **suppression** (C11 : `delete_node` `_20748` ; `break_pins` (`_13122`.then → `_340`.execute) puis `delete_node` `_13122` et ses entrées pures exclusives ; `_340` gardé). Alternative F6 : `set_pin_value` sur `Content` **et** relier l'exécution (changement de comportement visible : le message deviendrait atteignable).
- Dépend de : décision GQ4 (supprimer ou réécrire). Risque : très faible pour la suppression ; moyen pour la réécriture (réactive du code mort).
- Voie : MCP `lp-mcp-bp`. Écritures estimées : 3 à 6 (suppression) ; plus si réécriture.
- Preuve : statique (relecture `get_node_infos`, compilation, `CompileAllBlueprints`, 0 Accessed None nouveau). Aucune preuve en jeu possible pour un code non exécuté ; pour la réécriture : charger une partie dont un slot manque et lire l'écran et le journal.
- Piège : `K2Node_CallFunction_340` n'est pas le même nœud dans le dump 5.5 (`ShowTutorialTxt`, `L6f_dump_GI.txt:64588`) : ne pas croiser avec le dump 5.5.
**M3. C10 / D3 : traces de débogage mortes dans `SavePreset`** (`CG2-SPEC-01.md:91`, `:193` ; `CGREF1-T3-MCP.md:98`)
- Où : `SP`. Nœuds : `VariableSet_10` (`before`, `:2282`), `CallFunction_81` (`:2236`), `_88` et `_89` (`Left`, `:2272`, `:2277`), `_91` (`:2299`), `_0` (`:1487`), `_86` (`:2256`), `_1` (`:1503`) du dump 5.8 `STE-H10V_…20261013-071350.txt`.
- Nature : **suppression**. Règle de la SPEC : supprimer seulement un nœud dont `execute` n'a aucune liaison et dont les sorties ne vont qu'à d'autres nœuds supprimés ; un nœud relié à un chemin atteignable est gardé et noté. La SPEC § 9 attend que seuls `_0` et `_1` soient supprimables ; le constat d'origine (IMPL v1, « E5 ») n'est plus dans `CG2-IMPL-01.md` (v4) : **non relu**.
- Dépend de : rien. Risque : très faible. Voie : MCP. Écritures estimées : 4 à 8 (lecture groupée des 8 nœuds en tête).
- Preuve : statique (compilation, relecture) ; en jeu, l'enregistrement d'un préréglage reste conforme (M4, M5).
- Source : dump 5.8 (13 octobre), nœuds retrouvés par leur nom ; liaisons : lecture MCP de CGREF1-T3 (16 octobre).
**M4. D2 : garde de fin de chemin de `SavePreset`** (`CG2-CART-01.md:45` ; `CGREF1-T3-MCP.md:61`, `:97`)
- Où : `SP`. `IfThenElse_2970` ← `CallFunction_19325` = `EndsWith(File, "Characters\0.lpcharacter", IgnoreCase)` (dump 5.8 `STE-H10V…:1476-1482`) ; `then` non relié (retour sans écrire) ; `else` → `IfThenElse_10253` (liaisons : `CGREF1-T3-MCP.md:61`).
- Constat : le littéral contient un antislash, les chemins de session utilisent `/`, et `File` n'a pas d'extension quand il vient de `CharGen` (l'extension est ajoutée par `Append_762`) : la garde ne se déclenche **probablement jamais** (estimé, `CGREF1-T3-MCP.md:97`).
- Nature : **décision d'abord**. Options : (a) laisser (aucune écriture) ; (b) supprimer la garde et relier `FunctionEntry_799` à `IfThenElse_10253` (≈ 5 écritures, comportement inchangé tant que la garde est inerte) ; (c) corriger le littéral : **change le comportement** si un appelant passe une extension ; non recommandé sans connaître le rôle voulu de la garde.
- Dépend de : décision GQ1 ; M3 avant (même fonction). Risque : faible en (b), moyen en (c). Voie : MCP. Écritures : 0 à 5.
- Preuve en jeu : enregistrer un préréglage sous un nom ordinaire : le fichier est créé ; enregistrement depuis l'écran de création inchangé.
- Piège : une correction par `set_pin_value` seul ne marque pas le paquet (voir § 3.9, IMPL-06).
**M5. ERR-142 : extension `.lpcharacter` ajoutée deux fois** (`Registre_Erreurs.md:149` ; `COMMUN-14-BILAN.md:60`, `:123` ; `CG2-VAL-01.md:184`)
- Où : `SP`. `Append_762` (`Concat_StrStr`, dump `:135`) : `A` ← `SelectString` (`Modules/` ou vide selon `StartsWith(File, "Saves")`), `B` ← `File`, `C` = `.lpcharacter` (`CGREF1-T3-MCP.md:64`) ; résultat → `VariableSet_930` (`FullPath`, dump `:141`). Une seconde chaîne `SaveTxt` relit `GetFullPath` (`CGREF1-T3-MCP.md:68-69`) : elle suit la correction.
- Nature : **nœuds et liaison**. Proposition (estimée) : `EndsWith(File, ".lpcharacter", IgnoreCase)` (pure) et `SelectString` (A = vide, B = `.lpcharacter`, `bPickA` ← `EndsWith`) relié à `Append_762`.C à la place du littéral. Deux fonctions pures sans effet de bord ; la règle 4 de lp-mcp vise les gardes d'`Accessed None`, pas ce choix de valeur. Variante : deux `SetFullPath` derrière une Branche (plus de nœuds).
- Dépend de : M3 (même fonction, ordre) ; indépendante de CG2 C7 (qui filtre `..`, `/`, `\` côté `CharGen`). Risque : faible. Voie : MCP. Écritures estimées : 7 à 10.
- Preuve en jeu : enregistrer sous `test.lpcharacter` : un seul fichier `test.lpcharacter` ; sous `test` : `test.lpcharacter` ; la liste de chargement n'affiche pas de doublon.
**M6. D17 : texture par défaut absente du registre** (`CG2-CART-01.md:60` ; `CGREF1-T3c-MCP.md:58-70`, `:116`)
- Où : `EG`, événement `LoadDefaultTextures` (`K2Node_CustomEvent_96`, dump 5.8 `STE-ORG4cV…:28582`) : `GetAssetByObjectPath` (`LPAssetRegistryHelpers`, `CallFunction_1048`, `bIncludeOnlyOnDiskAssets = 'true'`, `:28601-28604`) → `GetAsset` → `CastToTexture2D` (`DynamicCast_3` pour les textures par défaut, `DynamicCast_2` pour les visages : `CGREF1-T3c-MCP.md:64-65`) ; `CastFailed` non relié.
- Constat nouveau : l'assistant C++ journalise un avertissement unique par chemin non résolu (`LPAssetRegistryHelpers.cpp:34-49`, lot L5, ERR-027), donc « sans message » n'est plus vrai pour l'absence du registre. Reste **le cas du cast** (asset trouvé mais pas une texture). 0 occurrence de l'avertissement dans le journal COM23 (n° 22) : aucune texture par défaut non résolue dans cette session ; que l'événement ait été exécuté dans cette session n'est pas établi.
- Nature : **nœuds** (au plus deux `PrintString` sur les `CastFailed`, journal seul) ; ou aucune écriture si l'utilisateur ferme D17.
- Dépend de : décision GQ3. Risque : très faible (journal seul ; `PrintString` n'imprime rien en Shipping, `CG2-SPEC-01.md:115`). Voie : MCP. Écritures : 0 ou 6 à 8.
- Preuve : journal Development : aucune ligne nouvelle au démarrage normal ; l'effet du `PrintString` ne se voit qu'avec un chemin volontairement faux (essai éditeur, hors fiche).
**M7. F7a : avertissement `CenterBrow` dans `CalculateHeadtrack`** (`FIX1-F7-PRE.md:127`, `:137`, `:145`, `:182`)
- Où : fonction `CalculateHeadtrack` (44 nœuds, dump **5.5** `L6f_dump_GI.txt:42273-42296`, lu de seconde main par FIX1-F7-PRE) : `GetSocketLocation('CenterBrow')` sur le maillage de `From` (`K2Node_CallFunction_3`) et de `To` (`K2Node_CallFunction_1`) ; appelée par les AnimBP `Daily` et `Daily_F` (estimé). **Aucun dump 5.8** (n° 15).
- Nature : **nœuds et liaisons** : garde avant `_1` et `_3` (`IsValid(From)`, `IsValid(To)`, maillage présent par `GetSkinnedAsset`), sinon retour sans calcul (voie A de F7-PRE, 4 à 8 nœuds, 2 coupures). Les sorties de la fonction ne sont pas connues : la branche « non valide » doit renvoyer des valeurs neutres (inconnu).
- Dépend de : dump 5.8 de la fonction ; décision GQ6 (aucun effet visible, avertissement présent depuis la 4.27, `Registre_Erreurs.md:25` d'après F7-PRE). Risque : faible pour le jeu, moyen pour la complexité (fonction appelée à chaque image par des AnimBP). Voie : MCP. Écritures estimées : 15 à 20.
- Preuve en jeu : build Development, au moins un `SPAWN` suivi de `DESTROY`, 3 minutes de jeu : 0 ligne `GetSocketInfoByName(CenterBrow)` (avant : 141 à 6 138 lignes par session, 8 journaux sur 11) et les 521 autres lignes de sockets inchangées (`FIX1-F7-PRE.md:150`). Une session à 0 sans `SPAWN` ne prouve rien.
**M8. D9 : tirage sans alternative retenue** (`CG2-CART-01.md:52` ; `CGREF1-T7-TEST.md:14-36` ; `06-rapport-audit.md:175`)
- Où : fonction `GenerateAndApplyFloats` (`FunctionEntry_11268`), boucle `MacroInstance_7962` (`ForEachLoopWithBreak` sur `Probs`), test `IfThenElse_13010` ← `CallFunction_106418` (`dé <= cumul`), seule écriture de `Value` = `VariableSet_1`, application après la boucle par `IfThenElse_0` (section réservée → `CallFunction_18` `SetMorphTarget`, `Value` ← `VariableGet_8`, `bRemoveZeroWeight = true` ; sinon `SwitchString_1` → `CallFunction_17`). `Value` est une variable **locale**, défaut estimé 0,0, illisible par MCP (`CGREF1-T7-TEST.md:17-20`). **Lecture MCP 5.8 du 2026-10-16 ; aucun dump 5.8** (n° 15).
- Constat : sans alternative retenue, la boucle atteint `Completed`, l'application s'exécute avec la valeur initiale et **retire le morph**. 62 lignes du corpus sont concernées (`CG2-CART-01.md:52`).
- Nature : **nœuds et variable** : distinguer « alternative retenue » de « aucune », puis sauter l'application dans le second cas. Une sortie `Break` et `Completed` mènent au même endroit, donc il faut un indicateur : une variable locale booléenne posée dans la branche vraie (**le MCP sait-il créer une variable locale ? inconnu**) ou une valeur sentinelle de `Value` posée avant la boucle (les comparateurs ne sortent pas de `find_node_types`, `lp-mcp` § 3). Même motif possible dans `GenerateAndApplyStrings` (dump 5.8 du 2026-10-10 présent) et `…Bools` (aucun dump) : non lu.
- Dépend de : décision GQ2 (R06 § 5.5 n° 2 : « pas encore tranché ») ; dump 5.8 ; capacité MCP. Risque : **moyen** (change le résultat du chargement de préréglages). Voie : MCP. Écritures estimées : 12 à 20.
- Preuve en jeu : un préréglage de test dont le total des poids d'une ligne est inférieur à 100 % : la valeur du morph après chargement reste celle d'avant ; comparaison avec un préréglage complet inchangée.
**M9 (conditionnelle, non planifiée). S1-BP : cadrage du studio** (`CAM2-SPEC-02.md:51`, `:58`, `:63` ; `BOSS-JOURNAL.md:870-871`)
- Où : valeur par défaut de la variable membre `CameraSceneTransformDefault` (X -= d) et place du personnage (`GI.ActorTransforms[…]`, à lire). Nature : **valeur** (par défaut de variable, hors graphe) : la voie MCP pour modifier un défaut de variable membre est inconnue. Retenue seulement si S1-C++ est impossible (lecture MCP de la pose de `CharGen` au prochain jeton). Risque : moyen (`CameraSceneTransformDefault` sert d'autres vues).
- STM1 S3 (PrintString dans GI : `STM1-SPEC-01.md:87`) est conditionnelle de la même façon et n'est pas retenue (S1 C++ retenue).
### 3.3 Points de la fiche qui ne sont pas dans GI
| Point | Où il se trouve | Source |
|---|---|---|
| C8 (D21) | `CharGen.PopulatePresets` : `ClearChildren` entre `CG.K2Node_CustomEvent_139` et `VariableSet_508`, Branche dans la boucle `MacroInstance_64` | `CG2-SPEC-01.md:75`, `:190` ; `CG2-IMPL-01.md:153`, `:237` |
| Q7 (CG2) | masquer le champ anti-déformation de `CharGen` (décision « oui » de l'utilisateur) | `CG2-TACHES.md:22` |
| Q8 (CG2) | fermer l'écran par `GI.CloseCharGen` au lieu de désactiver les boutons : écriture dans `CharGen` ; GI seulement **lu** (événement `CustomEvent_101`) ; suspendu jusqu'aux essais | `CG2-TACHES.md:23` ; `CGREF1-T3-MCP.md:84` ; `CG2-VAL-01.md:144` |
| R7 | 2 `Accessed None` `GetSkeletalMesh` dans une fonction `Populate…SlidersDaz` de `CharGen`, antérieurs à CG2 | `CG2-TACHES.md:72` ; `BOSS-JOURNAL.md:767` |
| Remappage de Y/N (KEY2 Q7) | `PC` : `K2Node_InputKey_2` et `_5` | `KEY2-SPEC-01.md:34`, `:246` ; `KEY2-TACHES.md:35` |
| ERR-145 | cause non établie (pistes : `FirstPersonSM`, `C1Hidden`) : C++ ou Person | `Registre_Erreurs.md:152` |
| F7b, F7c, F8b | Person et C++ | `FIX1-F7-PRE.md:137` |
| Condition `IsMale` de `VisualMorph` | `VisualMorph` | `CG2-SPEC-01.md:195-196` |
Conséquence : ces points relèvent d'une révision de `CharGen` / `PC` / `Person`, pas de celle de GI. C8 et Q7 vont avec les fichiers `CharGen` (autre binaire) ; le report de BOSS-ETAT (`:143`) les range en « build 2 » sans dire que GI n'est pas le fichier.
### 3.4 Candidats « B2 » de la CART qui touchent GI et ne sont pas dans la liste
D1 (broches de sortie de `SavePreset`, incertain), D8 (conflits de morphs, décision), D10 (`BlendPreset` : collision `x` / `ax`), D12 (`LoadPreset` : trace `StatOnly` morte), n° 32 (`ReadLine` sans branche d'erreur), n° 37 (graphes non lus), n° 35 (listes fermées : hors lot) : `CG2-CART-01.md:44`, `:51`, `:53`, `:55`, `:75`, `:83`, `:85`. Non retenus par BOSS-ETAT `:143` ; à demander (GQ5). Autres candidats nés de QPERS : les lignes `r.SSS.Scale`, `r.DynamicRes.*`, `r.Streaming.PoolSize` posées par `UpdateGraphicsQuality` (`CAM-B1-PRE…:17106`, `:17113`, `:25642`, `:25656`), jugées sans effet par QPERS-PRE `:45`, `:50` (estimé) : non demandées.
### 3.5 Dépendances
- **Décisions préalables** : GQ4 avant M2 ; GQ1 avant M4 ; GQ3 avant M6 ; GQ2 et la capacité MCP avant M8 ; GQ6 avant M7.
- **Même fonction** : M3, M4, M5 dans `SavePreset` ; M1, M2, M6 dans l'`EventGraph`. Les faire à la suite évite de relire deux fois le graphe.
- **M3 avant M4 et M5** : les suppressions mortes simplifient la lecture de la tête de fonction ; M4 et M5 touchent des nœuds distincts (`IfThenElse_2970` / `Append_762`).
- **Dumps 5.8** (§ 3.7) avant M4/M5 (rafraîchi), M7, M8.
- **Externes** : CG2 (VAL et build 2 de CharGen) n'a pas besoin de GI ; publication de la build 1 (vers le 24 octobre) **avant** tout accès en écriture à GI ; CAM2 (lecture MCP du studio, S1-C++) pour savoir si M9 existe ; KEY2 et CAM2 ne modifient pas GI mais leurs fiches comparent le MD5 de GI.
- **Gel** de `GI.uasset` annoncé à toutes les sessions pendant la révision (`lp-mcp` § 1 règle 7).
### 3.6 Ordre proposé (une seule session d'éditeur, un seul instantané)
0. **Préparation** : gel annoncé ; `Snapshot.ps1 -Lot GIREV -Path Content\BPs\GI.uasset` (MD5 attendu `32fc0a97…`) ; éditeur headless puis `list_toolsets` (`lp-mcp` § 2) ; `load_asset` de GI ; `is_dirty` ; compilation de référence de GI **sans modification** (durée et diagnostics « avant ») ; lectures de contrôle de tous les nœuds ci-dessous (tout écart arrête).
1. **Sous-lot A, `EventGraph`** : M1, puis M2 (si GQ4 = supprimer), puis M6 (si GQ3 ≠ fermer). Compilation, journal propre, `save_assets`.
2. **Sous-lot B, `SavePreset`** : M3, puis M4 (si GQ1 ≠ laisser), puis M5. Compilation, journal propre, `save_assets`.
3. **Sous-lot C, fonctions à effet** : M7 (si GQ6 = oui), puis M8 (si GQ2 = oui et capacité MCP établie). Compilation, journal propre, `save_assets`.
4. **Clôture** : `is_dirty`, date et MD5 du `.uasset` **avant** de fermer l'éditeur, `git status --short -- Content/`, fermeture, `UeState` = 0, `RunCommandlet.ps1 -Lot GIREV -Commandlet CompileAllBlueprints` (éditeur fermé), build Development, essai en jeu (§ 3.2, preuves).
Raison de l'ordre : du moins risqué au plus risqué (suppressions sans effet, puis réparations locales, puis changements de comportement) et par graphe, pour qu'un arrêt à la fin d'un sous-lot laisse GI cohérent.
### 3.7 Dumps 5.8 à produire avant (éditeur fermé, copie UE)
| Fonction | Dump 5.8 existant | À faire |
|---|---|---|
| `EventGraph` (M1, M2, M6, Q8 en lecture) | `STE-ORG4cV…20261014-103731.txt` (10:38, postérieur à la sauvegarde de GI à 10:33) ; liaisons de M1 et M2 lues dans `CAM-B1-PRE…083048.txt` (13 octobre) | **non** tant que le MD5 de GI vaut `32fc0a97…` (à recontrôler le jour du passage) ; relire les broches de `_20748` par MCP |
| `SavePreset` (M3, M4, M5) | `STE-H10V…20261013-071350.txt`, antérieur au dernier commit de GI (`c4cf6f3`, 14 octobre) ; l'heure des commits du 13 octobre n'est pas relevée | **oui** : `.\Tools\RunCommandlet.ps1 -Lot GIREV -Commandlet LPDumpFunction -Args '-BP=GI -Fn=SavePreset -Pins -Exec'` |
| `GenerateAndApplyFloats` (M8) | aucun (5.5 seulement, et lecture MCP du 2026-10-16) | **oui** : `-Fn=GenerateAndApplyFloats` ; ajouter `GenerateAndApplyStrings` (existant du 2026-10-10, à rafraîchir) et `GenerateAndApplyBools` (aucun) |
| `CalculateHeadtrack` (M7) | aucun (5.5 : `L6f_dump_GI.txt:42273-42296`) | **oui** : `-Fn=CalculateHeadtrack` |
Quatre à six dumps ; 61 à 66 s pour l'EventGraph (n° 17, 18), moins pour une fonction (non mesuré). Le dump plein de GI en 5.8 n'existe pas (seul le 5.5 : n° 16). Un `LPDumpFunction` sur un AnimBP (`Daily`) pour confirmer les appelants de `CalculateHeadtrack` : accepté ou non par la commande, inconnu (`FIX1-F7-PRE.md:201`).
### 3.8 Découpage en sous-lots (une session de révision, un instantané)
| Sous-lot | Contenu | Écritures (estimées) | Fiche |
|---|---|---|---|
| A | préparation + M1 + M2 + M6 | 15 à 30 | 1 fiche N3 `lp-mcp-bp`, ≤ 50 tours |
| B | M3 + M4 + M5 | 11 à 25 | 1 fiche, ≤ 50 tours |
| C | M7 + M8 + clôture | 27 à 40 | 1 fiche, ≤ 50 tours (la clôture peut passer à l'orchestrateur) |
Chaque fiche finit par compilation, journal sans erreur ni avertissement nouveau, `save_assets`, MD5 noté. Un seul instantané en tête (A) ; **un seul commit** de `GI.uasset` à la fin, par le gardien. Chaque `save_assets` réécrit 52,7 Mo sur le disque : « révision unique » est entendue ici comme un instantané et un commit, pas comme une écriture disque unique (à confirmer, GQ7).
### 3.9 Voie, risques transverses, durée
- **Voie** : MCP `lp-mcp-bp`, écritures unitaires relues (`lp-mcp` § 1 règle 3). Alternative commandlet : aucun commandlet de modification de nœuds de GI n'existe en 5.8 (les 16 `LPFix*` ont été retirés en U2, `lp-commandlets`) ; un nouveau demanderait une compilation C++ et un modèle (`LPFixDeprecatedNodes`) pour ≈ 8 modifications : non recommandé (estimé).
- **Leçon IMPL-06** (`CAM2-IMPL-06.md:28`, `:53`, `:78`) : `set_pin_value` seul ne marque pas le paquet ; `save_assets` renvoie vrai sans rien écrire. M4 (c) et toute réécriture de texte (M2) sont à risque. Règle : après un `set_pin_value` sans autre écriture de graphe, marquer le paquet par une opération réversible (couper puis rétablir à l'identique une liaison du même nœud), vérifier `is_dirty`, puis date et MD5 du fichier **avant** de fermer l'éditeur. Les suppressions et liaisons (M1, M2, M3, M5…) marquent le paquet.
- **Permission** : en mode auto, un `create_node` a été refusé deux fois dans `CharGen` (`CG2-SPEC-01.md:210`) ; la règle de permission `mcp__unreal-mcp__call_tool` doit être en place avant la session, et il faut compter un tour par écriture relue (`CG2-IMPL-01.md:242-244`).
- **Compilation de GI** : décrite comme « longue » (`CG2-SPEC-01.md:94`), durée **non mesurée** dans les sources lues ; la compilation de référence de l'étape 0 la mesure.
- **Durée estimée** : 50 à 90 écritures relues (somme des fourchettes M1 à M8), donc 3 fiches de 25 à 45 tours. Base : 1 tour par écriture, `CG2-IMPL-01.md:242-244` (cœur : 22 tours, C7 : 23 tours). La cadence d'horloge par tour n'est pas mesurée (CG2-SPEC § 8 annonçait ≈ 5 h pour 22 tours : estimation de SPEC, non confirmée). À prévoir : 3 créneaux de jeton UE (demi-journée à une journée chacun), plus un créneau de build et d'essai en jeu (≈ 1 h de jeu par l'utilisateur). Fenêtre : après la publication de la build 1 (≈ 24 octobre) et assez avant la build 2 (≈ 3 novembre) pour l'essai.
### 3.10 Retour arrière
- **Instantané unique** : `Tools\Snapshot.ps1 -Lot GIREV -Path Content\BPs\GI.uasset` avant toute écriture ; manifeste cité dans chaque livrable ; MD5 de référence `32fc0a970ab194626e8dc07df3a9633d`. Retour à l'octet : `Tools\Restore.ps1 -Lot GIREV -WhatIf`, puis `-Only Content\BPs\GI.uasset`, **éditeur fermé** (`CG2-SPEC-01.md:104`).
- **Second filet** : le fichier est identique à `c4cf6f3` (arbre propre) : le gardien peut le restaurer depuis git sur ticket.
- **Retour partiel** : un sous-lot enregistré et validé reste ; un sous-lot en échec se défait par les opérations inverses (liaisons rétablies) si le graphe est lisible, sinon restauration complète. Chaque `save_assets` de fin de sous-lot est précédé d'une compilation sans erreur ; en cas de plantage de l'éditeur, le fichier sur disque est l'état du dernier `save_assets`.
- **Après coup** : tout retour arrière après l'essai en jeu ramène aussi la référence MD5 de BOSS-ETAT.
## 4. Établi / estimé / incertain
**Établi (lu à la source)** :
- MD5, taille, historique et arbre propre de GI (n° 13, 14) ; aucun ticket GI (n° 25).
- Les liaisons de M1 et la position de `_20748` / `_13122` sans exécution entrante dans le dump 5.8 du 13 octobre (n° 17) ; les mêmes nœuds existent aux mêmes lignes dans le dump du 14 octobre (n° 18, existence seule).
- Les nœuds de M3, M4, M5 existent dans le dump 5.8 du 13 octobre (n° 20), y compris le suffixe à antislash.
- Le nœud de M6 est dans le dump 5.8 le plus récent, `bIncludeOnlyOnDiskAssets = 'true'` (n° 19) ; l'assistant C++ journalise les échecs (n° 21).
- C8, Q7, Q8, R7, Y/N ne sont pas dans GI (§ 3.3, avec sources) ; ERR-145 n'a pas de cause.
- Les deux commandes de M1 sont rejetées au démarrage (journal COM23, n° 23).
- Aucun dump 5.8 de `GenerateAndApplyFloats` ni de `CalculateHeadtrack` (n° 15) ; aucun dump plein de GI en 5.8 (n° 16).
- Le doc 37 § 2.7 ne porte pas la liste (§ 3.1).
**Estimé (déduit)** :
- M2 : `_20748` encore sans exécution entrante le 14 octobre (même ligne) ; l'absence de message « fichiers manquants » vient du code mort (une seule preuve : dump, sans exécution).
- M4 : garde inerte ; M7 : appelants `Daily` et `Daily_F` (FIX1-F7-PRE) ; M8 : défaut de `Value` = 0,0 ; décompte des écritures, durée et ordre de grandeur de la compilation ; l'absence d'effet de `r.SSS.*` et `r.DynamicRes.*` (QPERS-PRE).
**Incertain (essai qui trancherait)** :
- Le MCP peut-il créer une variable locale ou modifier le défaut d'une variable membre ? (`describe_toolset` filtré sur `variable`, sans écriture.)
- Les sorties de `CalculateHeadtrack` et le rôle exact des appelants (dump 5.8 + dump AnimBP).
- Le motif de M8 existe-t-il dans `…Strings` et `…Bools` ? (lecture des dumps.)
- Le tronçon de `UpdateGraphicsQuality` entre `CustomEvent_1324` et `CallFunction_244` (lecture MCP).
- Pourquoi la règle stricte de C10 ne retient d'abord aucun nœud (IMPL v1 non conservé).
- Durée de compilation de GI ; cadence d'horloge d'une écriture MCP.
- Si le message « fichiers manquants » est atteignable par un chemin que le dump n'affiche pas (relecture MCP de la broche `execute` de `_20748`).
## 5. Points à confirmer (repris par la fiche suivante)
1. Relire par MCP `execute` et `then` de `K2Node_CallFunction_20748` et `K2Node_CallFunction_13122` (confirmation du code mort) avant de trancher GQ4.
2. Produire les dumps du § 3.7 et relire `GenerateAndApplyStrings` / `…Bools` pour le motif de D9.
3. `describe_toolset` (filtre `variable`) : création de variable locale, défaut d'une variable membre.
4. Lire le tronçon de `UpdateGraphicsQuality` non relu et les autres lecteurs de `PostProcessAAQuality` et `CPUSkinning` (aucun nœud supprimé ne doit porter une autre liaison).
5. Recontrôler le MD5 de GI le jour du passage (`32fc0a97…`) et le journal des lots qui comparent ce MD5.
6. Compilation de référence de GI : durée et diagnostics.
## 6. Questions pour la SPEC ou l'utilisateur
1. **GQ1 (D2)** : quel est le rôle voulu de la garde `Characters\0.lpcharacter` ? Recommandation : laisser (a) ou supprimer (b) ; ne pas corriger le littéral (c) sans ce rôle.
2. **GQ2 (D9)** : un préréglage incomplet doit-il **laisser le morph inchangé** (correction) ou le **remettre à zéro** (comportement actuel) ? Décision pas prise (`06-rapport-audit.md:175`).
3. **GQ3 (D17)** : fermer D17 (journal C++ déjà présent pour le chemin non résolu) ou ajouter les deux traces de cast ?
4. **GQ4 (message de F6 / C11)** : supprimer le nœud mort et clore le message de F6, ou le réécrire **et** le relier (comportement nouveau pour le joueur) ?
5. **GQ5** : D1, D8, D10, D12, n° 32 et les lignes `r.SSS.*` / `r.DynamicRes.*` entrent-ils dans la révision ?
6. **GQ6 (F7a)** : garder l'avertissement `CenterBrow` (sans effet visible) hors de la révision ? Le coût est le plus élevé de la liste (15 à 20 écritures) pour un gain de journal.
7. **GQ7** : « révision unique » = un instantané et un commit (une sauvegarde par sous-lot) ou une seule sauvegarde en fin de session (risque de perte en cas de plantage) ?
8. **GQ8** : confirmer que C8, Q7, Q8, R7 vont dans une révision de `CharGen` (et Y/N dans une de `PC`), et que la ligne de BOSS-ETAT `:143` est corrigée en conséquence.
9. **GQ9** : le doc 37 § 2.7 doit-il recevoir la liste (BOSS-JOURNAL `:767` : « à faire par une fiche ») ?
Tours : 32 / 35 (28 jusqu'à la première écriture du livrable, un contrôle PubCheck, la réécriture, un second contrôle et le rendu du compte rendu ; `Tools/FicheStats.py` fait foi)
## Constats
- Fichier écrit : `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\REL\GIREV\GIREV-PRE.md`.
- Fichiers à commiter : `A Docs/Migration/etat/REL/GIREV/GIREV-PRE.md` (dépôt du jeu, branche `ue5.8`, par le gardien sur ticket). Aucun autre fichier écrit.
- À verser : `lp-mcp` § 3 — le message de GI « copy your old … Content\Saves » est le champ `Content` d'un nœud `ShowTutorial` orphelin : lire `execute` d'un nœud de message avant de le déclarer « affiché ». À verser : `lp-commandlets` — un `rg --no-ignore` ciblé sur les `LPDumpFunction*.txt` donne la couverture des dumps par fonction (`-Fn=`) ; un Grep de dossier sur `etat/` saute les `.txt`.