LifePlay-Revival/Docs/Migration/etat/REL/GIREV/GIREV-PRE.md
2026-10-21 09:36:04 +02:00

258 lines
38 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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`.