LifePlay-Revival/Docs/Migration/etat/U58/U7b/U7b-T3-CART.md

182 lines
23 KiB
Markdown
Raw Normal View History

Fiche U7b-T3 — Niveau N3 — Modèle prévu lp-cart | utilisé claude-opus-5-5 — Agent lp-cart — Skills sk-protocol, lp-commandlets (chargés aussi : ue-cpp-build, lp-paths)
# U7b-T3 — Les 28 avertissements « Ressource de la pose … n'est pas à jour » (UE 5.8) : cartographie
Lecture seule. Rien n'a été lancé (ni éditeur ni commandlet), rien n'a été modifié, rien n'a été commis. Seul ce fichier a été écrit.
Moteur 5.8 lu : `D:\Game\Launcher\Engine\UE_5.8` (5.8.3, CL 58210709, `Engine/Build/Build.version`). Moteur 5.5 lu : `UE_5.5` (5.5.4).
## 1. Synthèse
1. **Ce n'est pas une régression 5.8 (établi).** Les 28 mêmes avertissements existent sous UE 5.5.4, avec le même GUID stocké et le même GUID calculé. La phrase « 0 en 5.5 » de `U5-T2-AVANT.md:9` repose sur la référence L7i du 2026-10-01. Or le pack `FreeAnimationsPack` n'a été ajouté que le 2026-10-05. La comparaison n'était donc pas valable (§ 4).
2. **Cause (établie par le code moteur).** `UPoseAsset::PostLoad` compare le GUID stocké dans la pose (`SourceAnimationRawDataGUID`) au GUID recalculé à partir de son animation source. Ce contrôle n'est compilé que dans l'éditeur (`#if WITH_EDITORONLY_DATA`). Pour les 28 poses de démo Manny / Quinn, le GUID stocké ne correspond plus depuis la livraison du pack (paquets enregistrés en 5.3). Un resave ne recalcule pas ce GUID. Seul « Update Source » (`UpdatePoseFromAnimation`) le régénère (§ 3).
3. **Effet sur le jeu : nul (établi).** Le pack est exclu de la cuisson (`DirectoriesToNeverCook`). Le journal de cuisson U5 n'en contient aucune mention, et aucun asset hors du pack ne référence les poses. Le contrôle n'existe pas dans un binaire cuit. Le journal du jeu en U6 en contient 0, en 5.5 comme en 5.8 (`U6-T3-AB.md:50`).
4. **Recommandation.** Option A (« Update Source » par script Python éditeur sur les 28 poses de la copie 5.8, après instantané), précédée d'un essai décisif sur une seule pose. Repli : option D (ignorer, avec filtre des avertissements attendus). B est sans effet (déjà prouvé en U5). C est sans effet (déjà en place pour la cuisson) ou trop invasive (retrait du contenu). La décision appartient à l'utilisateur.
## 2. Les 28 avertissements (établi)
Sources :
- Journal après resave : `D:\Game\LifePlay-master 5.8\Saved\Logs\portage\U5_CompileAllBlueprints_20261008-203108.log`.
- Manny : lignes 2718–2731, émises au chargement de `ABP_Manny_PostProcess` (ligne 2717 « Loading and Compiling »).
- Quinn : lignes 2736–2749, émises au chargement de `ABP_Quinn_PostProcess` (ligne 2735).
- Récapitulatif `LogInit` : lignes 3029–3056. Bilan `Success - 0 error(s), 28 warning(s)` à la ligne 3058 : ce sont les **seuls** avertissements du passage.
- Journaux avant resave : `U5_CompileAllBlueprints_20261008-200207.log` et `…-201219.log`, 28 lignes chacun.
Comptes :
- `grep -c "^\[[^]]*\]\[[^]]*\]LogAnimation: Warning: Ressource de la pose" <log>` donne 28 pour chacun des 3 journaux U5.
- Recomptage par chemin unique (`grep -o "Ressource de la pose [^ ]*" | sort -u | wc -l`) : 28 également, soit 14 Manny et 14 Quinn.
Texte moteur d'origine (anglais), `Engine/Source/Runtime/Engine/Private/Animation/PoseAsset.cpp:1083` (5.8) :
`"PoseAsset {AssetName} is out-of-date with its source animation {SourceAsset} {Stored} vs {Found}"`.
Ce texte est émis par `UE_LOGF(LogAnimation, Warning, …)` (ligne 1084). La version française est la traduction de la clé `PoseAssetSourceOutOfDate`.
Exemple de ligne complète (journal 203108, ligne 2718) :
`LogAnimation: Warning: Ressource de la pose /Game/FreeAnimationsPack/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_calf_l_pose.Manny_calf_l_pose n'est pas à jour avec son animation source /Game/FreeAnimationsPack/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_calf_l_anim.Manny_calf_l_anim 8E2B50DD07CBD0EC07FCDD7DE6C03CCF vs 1D634D8727C63225C22E9D7F4FA6C1E2`
Toutes les poses et animations sont sous `/Game/FreeAnimationsPack/Demo/Characters/Mannequins/Rigs/Poses/<Perso>/`. Le Blueprint « émetteur » est celui dont le chargement déclenche le `PostLoad` de la pose : `ABP_Manny_PostProcess` pour Manny, `ABP_Quinn_PostProcess` pour Quinn. Chacun contient un nœud `AnimGraphNode_PoseDriver` et référence 14 poses (`grep -ao` sur les `.uasset`).
Le tableau a été produit par script à partir des journaux, sans recopie manuelle :
- GUID stocké : 1er hash ;
- GUID trouvé avant resave : 2e hash dans `U1_LPAuditBlueprintCalls_20261008-145335.log` (5.5.4) et dans `U5_…-200207.log` (5.8). Ces deux journaux sont identiques sur les 28 lignes (`diff` vide) ;
- GUID trouvé après resave : 2e hash dans `U5_…-203108.log`.
| # | Perso | Pose (`…/Rigs/Poses/<Perso>/`) | Animation source | GUID stocké | GUID trouvé 5.5.4 et 5.8 avant resave | GUID trouvé 5.8 après resave |
|---|---|---|---|---|---|---|
| 1 | Manny | `Manny_calf_l_pose` | `Manny_calf_l_anim` | `8E2B50DD07CBD0EC07FCDD7DE6C03CCF` | `CC78212CC2D05F60DB49B336943F61D9` | `1D634D8727C63225C22E9D7F4FA6C1E2` |
| 2 | Manny | `Manny_calf_r_pose` | `Manny_calf_r_anim` | `7894484DF77F696ECE86F5E48B21970F` | `8FE1687880D683625E543FF1464725DB` | `E0B2D01A3946223C131E09195B080C5F` |
| 3 | Manny | `Manny_clavicle_l_pose` | `Manny_clavicle_l_anim` | `6CEA229F225BD38F08A7E79F1708B2C3` | `85F8EF1345C47A8C9C76736EC7A3FE90` | `14E8D54C13944109415935F4256A2C4D` |
| 4 | Manny | `Manny_clavicle_r_pose` | `Manny_clavicle_r_anim` | `5011953F65839BC59E3AB711A254A94E` | `ADA1E6650A76F8713148B97EF6AF9A89` | `A5B15C429C01316F463D09E0D6693820` |
| 5 | Manny | `Manny_foot_l_pose` | `Manny_foot_l_anim` | `E1CD278520DDF4FB187D1CBC17C34C12` | `27DE3409653F529F13DE46FBC2B19C83` | `448C04B7FACFD0356FEB53BAB78E3663` |
| 6 | Manny | `Manny_foot_r_pose` | `Manny_foot_r_anim` | `9B48B63BBAECCB8F6D4567982FCD3450` | `73E77D69CA585135BF157B81788D5D86` | `B4615E0AEE2C238A3D6E440F2090E5EB` |
| 7 | Manny | `Manny_hand_l_pose` | `Manny_hand_l_anim` | `9B42FC91272EF6C74D20196D6DFE60F4` | `AB6FD63C9D139264C0008EDBECC735F0` | `EC8E9E7236153A9769E75A67F8F5C4E9` |
| 8 | Manny | `Manny_hand_r_pose` | `Manny_hand_r_anim` | `23D2F7543DE7F7C42CEDA5C43C0F6FB1` | `93329CC316356DE7E397D2DEB2E3AFD1` | `56207E6B9D90A70472B8FDF3C596E99C` |
| 9 | Manny | `Manny_lowerarm_l_pose` | `Manny_lowerarm_l_anim` | `C5886899902BFF210DE43F818588A597` | `011865FD95B823CF80CFFC7D480E61C6` | `580060AF49122B44A85554A39457F698` |
| 10 | Manny | `Manny_lowerarm_r_pose` | `Manny_lowerarm_r_anim` | `875F291D3A6E3ECDAF9BE4BCE6F094DD` | `1BB05015D9BFA1ECD7E35B013381E1BD` | `CF1A5F5A4915261ED4BF3837AAC9C99E` |
| 11 | Manny | `Manny_thigh_l_pose` | `Manny_thigh_l_anim` | `44456FC574BD040D2281CA549C0C8191` | `4CB65F0128C1D0D989355D4955DCE16F` | `2C9E16368BC5337AA26408355D3F02C0` |
| 12 | Manny | `Manny_thigh_r_pose` | `Manny_thigh_r_anim` | `364BC1D823C760EAFC55654DBF9144FE` | `E90CD50BD93DFBC0B3D7B8B240DA9861` | `401F21146275AD58FCE72FEA97F3C5F2` |
| 13 | Manny | `Manny_upperarm_l_pose` | `Manny_upperarm_l_anim` | `E74586CE1E5E44B3F8048DBFC7950641` | `664563D92C58772CAB9EEAD42C191D1A` | `F7D9E3082FD0C227554316675CAB98DE` |
| 14 | Manny | `Manny_upperarm_r_pose` | `Manny_upperarm_r_anim` | `63B9CCF17675B52E40416075E3A9DDE3` | `9AAB8175306B1E429602738D99BAB05C` | `8615091CAA1F7B42FC841A0F705E8894` |
| 15 | Quinn | `Quinn_calf_l_pose` | `Quinn_calf_l_anim` | `BF93398AAD6D62DF112655B8ED3CF20E` | `5A55CD7B35467F4ADD5A6CC1B13D289D` | `E93DCCE9D988EF7272F279839E33D057` |
| 16 | Quinn | `Quinn_calf_r_pose` | `Quinn_calf_r_anim` | `D11B0FF3E4621425787FFC399F21396D` | `5468A5BB128F04D48B018D8E17FCBDC7` | `E75C10E44FD1FDC914810B0760E00274` |
| 17 | Quinn | `Quinn_clavicle_l_pose` | `Quinn_clavicle_l_anim` | `90AAB2AD3EA4047FBE7D2A7CE3811DF5` | `0437958046206607984E793A4BAB7891` | `D23181AE1DF1FA00F21F1E35BB97D138` |
| 18 | Quinn | `Quinn_clavicle_r_pose` | `Quinn_clavicle_r_anim` | `DB3BE353909BB74F14506F1FB1BAB9A7` | `F280BF597FEBF701CAC3D3ACE24A4D61` | `1D22F04FBB0AE44F66E58D351BBD0EF3` |
| 19 | Quinn | `Quinn_foot_l_pose` | `Quinn_foot_l_anim` | `360E98B0F3906A082B5BA3BBA45E6C28` | `3ADAF7669471D3A979FEF2C51472E452` | `83D2730DEFBFD6DDAEEF78977E8F0F5D` |
| 20 | Quinn | `Quinn_foot_r_pose` | `Quinn_foot_r_anim` | `89448E65AE039761CBFCDEEC88DB6C82` | `3852C8B628D1BB773F0D538C598631A8` | `776F95E4E46CF3322E953E6A63C822EF` |
| 21 | Quinn | `Quinn_hand_l_pose` | `Quinn_hand_l_anim` | `2A557BC6687C70264FEDCEEDAF3D74BB` | `E6F07F6D3BD0BE6E891C648D2A318C30` | `58D208DB13C68CB060DF5CEB574DC234` |
| 22 | Quinn | `Quinn_hand_r_pose` | `Quinn_hand_r_anim` | `2B22506D82674CF44564930E27D311D6` | `D5991895CD282302D41EF7F9F364FBAC` | `3FCEB9448C190BA93169A21C5CD414F2` |
| 23 | Quinn | `Quinn_lowerarm_l_pose` | `Quinn_lowerarm_l_anim` | `985499B159549072FA9713240591A554` | `427F2443D721BD92A5A93071F651FCEB` | `85E00A57FD4459ECCF93BD6F37987917` |
| 24 | Quinn | `Quinn_lowerarm_r_pose` | `Quinn_lowerarm_r_anim` | `D1FE6DF936268DDC00C0C17E7F8BC69F` | `34A548CA4E486B5139BF249993DFCA51` | `750D21AD38A9FBC18E0682C45B730DF2` |
| 25 | Quinn | `Quinn_thigh_l_pose` | `Quinn_thigh_l_anim` | `8FD955B082A11940A2C9F05A42AAC255` | `6C031DEF5FE15B1E967C0D4F8A148FA8` | `1A137639E5FDCFA8D434FF7D49C6E07D` |
| 26 | Quinn | `Quinn_thigh_r_pose` | `Quinn_thigh_r_anim` | `402E6140D127A78E8862B816DFCBBE8B` | `632D5907227D4F63143AED122D634459` | `77EA10A74DE8CE458A0564D8030DE2FA` |
| 27 | Quinn | `Quinn_upperarm_l_pose` | `Quinn_upperarm_l_anim` | `A497D2F503AC58C6B107EFCED5062AA7` | `C8F1E2335EFB744131777D8605D42BC5` | `D78B797C7850A25F651A1E87F61BA531` |
| 28 | Quinn | `Quinn_upperarm_r_pose` | `Quinn_upperarm_r_anim` | `799E453D1F53700BCBF31ADE6FE99CE5` | `45C9349E90CE819467A6664D9F8772D6` | `241B9C8C77E17A4F1599C7EEB108AD47` |
Contrôles sur les 28 lignes (script sur les extractions ; les fichiers intermédiaires sont dans le scratchpad, pas dans le dépôt) :
- GUID stocké identique avant et après le resave : 28/28.
- GUID trouvé différent avant et après le resave : 28/28.
- GUID stocké différent du GUID trouvé après le resave : 28/28.
## 3. Mécanisme (sources 5.8, établi sauf mention)
| Point | Source | Statut |
|---|---|---|
| Le contrôle est dans `UPoseAsset::PostLoad` (1013), à l'intérieur de `#if WITH_EDITORONLY_DATA` (1017 → `#endif` 1119). Il est actif seulement si le paquet a la version `PoseAssetRawDataGUIDUpdate` (1065) et si `SourceAnimation` n'est pas nul (1067). Il charge l'animation source (1070-1071) puis compare `SourceAnimationRawDataGUID` à `GetSourceAnimationGuid()` (1073-1074). | `PoseAsset.cpp:1013-1087`, `:1119` | établi |
| Conséquence : aucun message dans un jeu cuit (`WITH_EDITORONLY_DATA = 0`). `SourceAnimation` lui-même n'existe qu'en éditeur. | `PoseAsset.h:347-354` (`#if WITH_EDITORONLY_DATA`, `UPROPERTY(Category=Source, EditAnywhere) SourceAnimation`, `UPROPERTY() SourceAnimationRawDataGUID`) | établi |
| `GetSourceAnimationGuid()` met `bIncludeTimingData = false` quand la pose a été enregistrée avant la version `AnimModelGuidGenerationSettings` (= 54). Cette version est absente de 5.5 : `grep` = 0 dans `UE_5.5/…/UE5ReleaseStreamObjectVersion.h`. | `PoseAsset.cpp:2097-2117` ; `Core/Public/UObject/UE5ReleaseStreamObjectVersions.inl:172` ; valeurs par défaut à 1 : `IAnimationDataModel.h:355` | établi |
| Explication du changement du 2e hash au resave U5. Avant le resave, les paquets venaient de 5.3 (chaîne `++UE5+Release-5.3` dans `Manny_calf_l_pose.uasset` de la copie 5.5) : calcul sans le timing, d'où le même hash qu'en 5.5. Après le resave (`++UE5+Release-5.8`, 2026-10-08 20:28), la version est ≥ 54 : calcul avec le timing, d'où un autre hash. Le hash stocké, lui, ne bouge pas. | code ci-dessus + `grep -ao "++UE5+Release-5\.[0-9]*"` sur les `.uasset` des deux copies | établi |
| Le resave ne peut pas corriger : `PreSave` n'appelle que `UpdateRetargetSourceAssetData()`, et rien dans `Serialize` ne touche le GUID. | `PoseAsset.cpp:1125-1144` ; constat U5 `U5-T3-RESAVE.md:95-97` (28 avant, 28 après) | établi |
| Seul `CreatePoseFromAnimation` réécrit le GUID stocké (1676) et marque la pose comme régénérée (1674, `GRegeneratedPoseAssets`, ce qui force le calcul avec le timing, 2107-2111). Il est appelé par `UpdatePoseFromAnimation` (1681-1710), qui est `UFUNCTION(BlueprintCallable)`. | `PoseAsset.cpp:1582-1710` ; `PoseAsset.h:446-448` | établi |
| Le bouton éditeur « Update Source » (panneau Détails de la pose) appelle `PoseAsset->Modify()` puis `UpdatePoseFromAnimation(SourceAnimation)`. | `Editor/DetailCustomizations/Private/PoseAssetDetails.cpp:315-316`, `:646-658`, libellé `:719` | établi |
| `BreakAnimationSequenceGUIDComparison()` (qui invalide le GUID) n'est pas une `UFUNCTION` et n'est donc pas accessible depuis Python. | `PoseAsset.h:535`, `PoseAsset.cpp:1353-1356` | établi |
| Pourquoi le GUID stocké était déjà faux dans le pack livré : soit Epic a généré les poses avec un ancien calcul de GUID, soit les `_anim` ont été réenregistrées après coup. On ne peut pas trancher. Le défaut est connu sur le contenu mannequin et MetaHuman d'Epic (voir § 6). | — | estimé / incertain (sans incidence sur le correctif) |
## 4. Le défaut existait-il en 5.5 ? Oui (établi)
- La référence L7i (`etat/portage55/L7i/L7i_CompileAllBlueprints_20261001-191653.txt`, journal complet `D:\Game\LifePlay-master 5.5\Saved\Logs\portage\L7i_CompileAllBlueprints_20261001-191653.log:1741` : `0 warning(s)`) ne contient aucune mention de `FreeAnimationsPack` (`grep -c` = 0) : 269 BP compilés contre 410 en U5.
- Date du dossier `Content\FreeAnimationsPack` dans la copie 5.5 : **2026-10-05 15:59** (`ls --time-style=full-iso`). Le pack est donc postérieur à L7i (2026-10-01). Aucun `CompileAllBlueprints` 5.5 n'a été lancé après cette date (12 journaux, le dernier est L7i).
- Preuve directe en 5.5 : `D:\Game\LifePlay-master 5.5\Saved\Logs\portage\U1_LPAuditBlueprintCalls_20261008-145335.log`, moteur `5.5.4-40574608` (ligne 290). On y trouve 28 lignes « Ressource de la pose », 28 uniques, avec des hashes **identiques** à ceux de 5.8 avant resave (`diff` vide sur les 28). Bilan : `Success - 0 error(s), 29 warning(s)` (ligne 1288).
- À corriger dans la documentation (je n'y ai pas touché) : `U5-T2-AVANT.md:9` (« Nouveauté vs 5.5 … 0 en 5.5 ») et la mention « nouveauté » qui en dépend.
## 5. Les assets, la cuisson et les références (établi)
- 28 `*_pose.uasset` et 28 `*_anim.uasset` sous `Content\FreeAnimationsPack\Demo\Characters\Mannequins\Rigs\Poses\{Manny,Quinn}` (`find … | wc -l` = 28 / 28). Ce sont des assets de démo Epic (pack Fab « FreeAnimationsPack »), **ignorés par git** (`U5-T1-CART.md:22,80`).
- Chaîne de références :
| De | Vers | Preuve |
|---|---|---|
| `SKM_Manny` | `ABP_Manny_PostProcess` (anim BP de post-traitement) | `grep -ao` |
| `SKM_Quinn` | `ABP_Quinn_PostProcess` | `grep -ao` |
| `ABP_*_PostProcess` | 14 poses chacun (PoseDriver) | `grep -ao` |
| chaque pose | son `_anim` | `SourceAnimation` |
- Références depuis l'extérieur du pack (`grep -rla "FreeAnimationsPack/Demo/Characters/Mannequins"` sur tout `Content` en 5.8, hors pack) : 3 paquets seulement, `Retarget_ue5/IK_Source_ue5`, `RTG_Bridget_ue5`, `RTG_Michael_ue5`, tous vers `Meshes/SKM_Manny`.
- Aucun paquet hors `Retarget_ue5` ne référence `/Game/Retarget_ue5`. Résultat nul, mais la méthode est validée par un contrôle positif : 5 auto-références dans le dossier.
- Rien hors du pack ne référence `SKM_Quinn`.
- Cuisson : `Config/DefaultGame.ini:55` `+DirectoriesToNeverCook=(Path="/Game/FreeAnimationsPack")` et `:57` `…/Game/Retarget_ue5` (copie 5.5 : lignes 52 et 54).
- `U5_Cook_20261008-211802.log` : 0 occurrence de `FreeAnimationsPack` et 0 « Ressource de la pose ».
- `Saved\Cooked\Windows\LifePlay\Content` ne contient ni `FreeAnimationsPack` ni `Retarget_ue5`.
- Chaîne d'animation de l'atelier : `RetargetPack.py` (addon) produit les `RTG_*_ue5` avec `SKM_Manny` comme maillage source.
- L'export par lot (`duplicate_and_retarget`, donc `IKRetargetBatchOperation`) évalue la source avec `UAnimPoseExtensions::GetAnimPoseAtFrame` et `OptionalSkeletalMesh` : un simple `FBoneContainer`, sans composant ni anim instance. L'ABP de post-traitement (et donc les poses) n'intervient pas dans les clips produits.
- Sources : `Plugins/Animation/IKRig/Source/IKRigEditor/Private/RetargetEditor/IKRetargetBatchOperation.cpp:456-477` ; `Editor/AnimationBlueprintLibrary/Private/AnimPose.cpp:627-680` (aucun `Component` ; les seuls composants du fichier sont aux lignes 493-523, dans `EvaluateAnimationBlueprintWithInputPose`).
- Statut : établi pour le chemin du lot. L'aperçu dans le viewport de l'éditeur de reciblage peut, lui, exécuter le post-traitement : incertain, sans effet sur les clips.
## 6. Recherche web (sources tierces = données)
- https://forums.unrealengine.com/t/594063 (« Warning: PoseAsset XXX is out-of-date with its source animation ») :
- correctif = bouton « Update Source » de la pose (post 4, 2022) ;
- traitement en lot par `UpdatePoseFromAnimation` (AssetActionUtility, post 5 ; script Python MIT, post 16, 2025) ;
- autre contournement : vider `Source Animation` (post 4) ;
- **plantages signalés** de « Update Source » en éditeur (posts 4 et 18) ;
- action de menu contextuel « update source animation » signalée en 5.5 (post 17) : **non retrouvée** dans les sources 5.8 lues (incertain).
- https://forums.unrealengine.com/t/768165 (post 2, UE 5.1) : même avertissement sur `…/Mannequins/Rigs/Poses/Manny/Manny_upperarm_r_pose` dans un contenu tiers qui reprend le rig mannequin d'Epic. Indice que le contenu mannequin d'Epic est livré dans cet état (estimé).
- Recherche faite par `curl` sur l'API Discourse du forum (`search.json`, `t/<id>.json`), car aucun outil de recherche web n'était disponible.
## 7. Options
Réversibilité commune : `Content` est hors git pour ce pack. Retour arrière par `Tools\Snapshot.ps1` / `Restore.ps1` de la copie 5.8, avant toute écriture. L'instantané U5 `D:\Game\LifePlay_Backup_5.5\U5\manifest.csv` contient déjà 155 entrées `FreeAnimationsPack`, à l'état d'avant le resave.
### A — Régénérer les 28 poses depuis leur animation (« Update Source »), par script Python éditeur (recommandée)
- **Principe.**
- Lancer `-run=pythonscript` (avec `-FullStdOutLogOutput`) sur la copie 5.8, éditeur fermé.
- Pour chaque `*_pose` du dossier : `anim = pose.get_editor_property("source_animation")`, puis `pose.modify()`, puis `pose.update_pose_from_animation(anim)`, puis `unreal.EditorAssetLibrary.save_loaded_asset(pose, False)`.
- Mode `-DryRun` d'abord : liste des 28, animation source non nulle, même squelette. Le compte trouvé doit être égal à 28.
- Les noms Python sont **estimés** à partir de la `UFUNCTION` et de la `UPROPERTY` (pas de stub `Intermediate/PythonStub/unreal.py`). Le DryRun les confirme.
- **Effet attendu.** Le GUID stocké devient le GUID calculé avec le timing (`PoseAsset.cpp:1674-1676`). Après enregistrement en 5.8, le paquet a la version ≥ 54, donc le calcul au rechargement inclut aussi le timing. Les deux GUID devraient correspondre : 28 → 0 avertissement (estimé, à confirmer par l'essai).
- **Effort.** Environ 1 h : script d'environ 40 lignes, instantané, DryRun, exécution, `CompileAllBlueprints` de contrôle.
- **Risques.**
1. Les données des poses sont recalculées depuis les `_anim`. Si celles-ci diffèrent des poses enregistrées, les correctifs PoseDriver des démos Manny / Quinn changent. Impact limité à la démo et à l'aperçu éditeur, aucun sur le jeu ni sur les clips (§ 5).
2. Plantage possible signalé sur le forum. En commandlet, un plantage ne laisse aucun paquet partiellement écrit (estimé) : retour par l'instantané.
3. Une réimportation du pack depuis Fab ramènerait les avertissements.
- **Effet sur la cuisson et le jeu : aucun** (pack non cuit, contrôle réservé à l'éditeur).
- **Variante A-bis.** Vider `source_animation` sur les 28 poses : le contrôle est ignoré (`PoseAsset.cpp:1067`) et les données des poses restent intactes. On perd en revanche le lien vers la source, et donc toute régénération future. Effort et risque plus faibles que A, mais cela masque le défaut sans le corriger.
### B — Resave ciblé : à écarter (établi sans effet)
Le resave U5 a déjà touché ces 28 paquets : le GUID stocké est inchangé (28/28) et il reste 28 avertissements (`U5-T3-RESAVE.md:95-97`). Le code de `PreSave` / `Serialize` ne touche pas le GUID (`PoseAsset.cpp:1125-1144`).
### C — Retirer les assets de démo de la cuisson : déjà fait, sans effet sur l'avertissement
- La cuisson exclut déjà le pack (`DefaultGame.ini:55`), et l'avertissement est émis par l'éditeur, pas par la cuisson.
- Variante « retirer du contenu » (déplacer vers `Backup_5.5\U7b`) : elle casse `Retarget_ue5` → `SKM_Manny` → `ABP_Manny_PostProcess` → poses Manny. Il faudrait aussi modifier le `PostProcessAnimBlueprint` de `SKM_Manny`.
- Seule la branche Quinn (`SKM_Quinn`, `ABP_Quinn_PostProcess`, poses Quinn) n'est pas référencée hors du pack. Mais `ABP_Quinn`, `SK_Mannequin`, `CR_Mannequin_Procedural` et les `MF_*` du pack la référencent.
- Effort moyen, risque moyen, gain de 14 avertissements seulement. Non recommandée.
### D — Ignorer, avec justification (repli)
- **Justification.** Le défaut existe en 5.5.4 depuis l'ajout du pack. Il est réservé à l'éditeur, le pack n'est pas cuit, et le journal du jeu U6 en contient 0. Il s'agit d'un défaut connu du contenu d'Epic.
- **Effort.** Documentation seulement, plus un filtre « avertissements attendus = ces 28 chemins » dans la ligne de base VAL de `CompileAllBlueprints`. Sans ce filtre, 28 avertissements de bruit masquent les nouveaux.
- **Risque.** Nul pour le jeu. Le bruit reste au journal.
## 8. Recommandation et essai décisif
- **Recommandation.** Option A sur la copie 5.8 seulement. Le pack n'est pas cuit : la copie 5.5 n'a pas besoin du correctif, mais elle garde le défaut. Ordre : instantané → DryRun → essai sur une pose → généralisation. Si l'essai plante ou modifie fortement les données, passer à D (ou A-bis si l'utilisateur veut un journal propre sans toucher aux données).
- **Essai décisif** (à lancer par un agent d'exécution, après accord) :
1. `Snapshot.ps1` sur `Content\FreeAnimationsPack\Demo\Characters\Mannequins\Rigs\Poses`.
2. `LPDumpAssets` (`-List=` réduit à `Manny_calf_l_pose`) : photo « avant ».
3. Script Python A en `-DryRun` : 28 trouvées, 28 avec une animation source valide.
4. Script A réel sur **`Manny_calf_l_pose` uniquement**.
5. `CompileAllBlueprints` : PASS si 27 avertissements et aucune ligne `Manny_calf_l_pose`.
6. `LPDumpAssets` « après » et diff (GUID filtrés) : mesure de la variation des données de pose (`PoseContainer`).
- Le critère qui tranche est le résultat de l'étape 5 (27 au lieu de 28), et l'étape 6 donne le risque réel sur les données. Si l'étape 4 plante, `Restore.ps1`, puis option D.
- **Points d'appel à casser** (pour l'agent d'exécution) : `UPoseAsset::SourceAnimationRawDataGUID` (réécrit uniquement par `CreatePoseFromAnimation`, `PoseAsset.cpp:1676`) ; entrée publique `UpdatePoseFromAnimation` (`PoseAsset.h:446-448`) ; déclencheur `UPoseAsset::PostLoad` (`PoseAsset.cpp:1065-1087`).