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

38 KiB
Raw Blame 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}dansBOSS-JOURNAL.md`
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é)

  1. 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).
  2. Sous-lot A, EventGraph : M1, puis M2 (si GQ4 = supprimer), puis M6 (si GQ3 ≠ fermer). Compilation, journal propre, save_assets.
  3. Sous-lot B, SavePreset : M3, puis M4 (si GQ1 ≠ laisser), puis M5. Compilation, journal propre, save_assets.
  4. Sous-lot C, fonctions à effet : M7 (si GQ6 = oui), puis M8 (si GQ2 = oui et capacité MCP établie). Compilation, journal propre, save_assets.
  5. 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.