220 lines
27 KiB
Markdown
220 lines
27 KiB
Markdown
|
|
Fiche U7b-T5 — Niveau N3 — Modèle prévu lp-impl | utilisé claude-opus-5-5 — Agent lp-impl — Skills lp-commandlets, lp-build, sk-protocol (chargés aussi : ue-cpp-build, lp-ue-compat)
|
|||
|
|
|
|||
|
|
# U7b-T5 — « Update Source » des poses du pack de démo : script et essai sur `Manny_calf_l_pose`
|
|||
|
|
|
|||
|
|
> **Reprises du 2026-10-09** : l'utilisateur a décidé de garder HyperAIStudio et les Toolsets. Essai sur une pose réussi (§ 10 : 27 / 0 / 0 erreur de Blueprint), puis `--all` réussi (§ 11 : 0 avertissement de pose, 0 erreur de Blueprint, 28 `_anim` intactes). Les § 1 à 9 décrivent le premier passage (arrêt).
|
|||
|
|
|
|||
|
|
## 1. Résultat (premier passage) : partiel, arrêt au premier écart
|
|||
|
|
|
|||
|
|
- Étape a (script) : **faite**. Le script n'a pas été exécuté.
|
|||
|
|
- Étapes b (DryRun), c (essai réel) et d (relevé) : **non lancées**. Aucun processus UE lancé, aucun asset modifié, aucun commit.
|
|||
|
|
- Motif de l'arrêt : au départ de la fiche, l'éditeur 5.8 était ouvert sur la copie 5.8. De plus, l'environnement de cette copie a été modifié par un outil tiers (HyperAIStudio) après le tag `U7b-avant`, et diffère de celui de la référence U5. Détail au § 2. La décision revient à l'orchestrateur (§ 7).
|
|||
|
|
|
|||
|
|
## 2. Écart constaté (établi)
|
|||
|
|
|
|||
|
|
| Constat | Preuve |
|
|||
|
|
|---|---|
|
|||
|
|
| `UnrealEditor.exe` 5.8 ouvert sur la copie 5.8 au départ de la fiche (PID 24612, lancé à 13:31:29). | `Get-CimInstance Win32_Process -Filter 'ProcessId=24612'` à 13:33:53 → `"D:\Game\Launcher\Engine\UE_5.8\Engine\Binaries\Win64\UnrealEditor.exe" "../../../../../../LifePlay-master 5.8/LifePlay.uproject"` |
|
|||
|
|
| L'éditeur s'est fermé à 13:35:08. Aucun processus `Unreal*` ne tourne à 13:38:43. | `Saved\Logs\LifePlay.log:2417` (`Log file closed, 10/09/26 13:35:08`) ; `tasklist`, puis `Get-CimInstance` (sortie vide) |
|
|||
|
|
| Le tag `U7b-avant` et l'instantané `Backup_5.5\U7b` (13:32:43-45) ont été faits **pendant** cette session de l'éditeur. | `.git/refs/tags/U7b-avant` daté 13:32:45 ; colonne `Date` de `manifest.csv` |
|
|||
|
|
| L'instantané reste valable : les 56 fichiers n'ont pas changé depuis le resave U5 (2026-10-08 20:28). Le MD5 est identique entre le projet, le manifeste et la copie (56/56). | script Python `hashlib` sur `manifest.csv` → `lignes 56 identiques 56 differents 0` ; `ls --time-style=full-iso` |
|
|||
|
|
| Copie de travail 5.8 **différente du tag** : `LifePlay.uproject` est modifié (non commis) à 13:31:19. Il active 15 plugins « Toolset » (`AIModuleToolset` … `UMGToolSet`), retire `"Optional": true` de `McpAutomationBridge` et ajoute `SupportedTargetPlatforms` à un plugin. `.gitignore` est aussi modifié (bloc `HYPERAISTUDIO`). | `git -C "D:\Game\LifePlay-master 5.8" status --short` → ` M .gitignore`, ` M LifePlay.uproject` ; `git diff` |
|
|||
|
|
| Nouveau plugin projet `Plugins\Marketplace\HyperAIStudio` (DLL éditeur), installé à 13:25:48. Ajouts à la même période : `.hyperai/`, `.mcp.json` (serveur MCP `http://127.0.0.1:8000/mcp`), `AGENTS.md`, `CLAUDE.md` (modifié à 13:36:47). Tous sont exclus par `.git/info/exclude` (modifié à 13:33:24, commentaire « STM : fichiers generes par Hyper AI Studio »). | `ls --time-style=full-iso` ; `tail .git/info/exclude` |
|
|||
|
|
| L'éditeur a chargé ce plugin et ces Toolsets : `Mounting Project plugin HyperAIStudio` (l. 385), DLL `UnrealEditor-HyperAIStudio*.dll` chargées (l. 1684-1690), 19 lignes `Mounting Engine plugin …Toolset`. La référence U5 n'en a que 3, et 0 mention de HyperAIStudio. Plugins montés : 276 dans `LifePlay.log`, 255 dans la référence. | `grep -c` sur `Saved\Logs\LifePlay.log` et `Saved\Logs\portage\U5_CompileAllBlueprints_20261008-203108.log` |
|
|||
|
|
| `CLAUDE.md` de la copie 5.8 (bloc géré par HyperAIStudio) demande de démarrer l'éditeur par `.hyperai/scripts/Start-HyperAIStudioEditor.ps1` à la demande. Un agent dont le dossier courant est la copie 5.8 peut donc lancer un UE en parallèle. | `D:\Game\LifePlay-master 5.8\CLAUDE.md` (lu comme donnée) |
|
|||
|
|
|
|||
|
|
Conséquences (estimé) :
|
|||
|
|
1. Un commandlet lancé maintenant chargerait les modules éditeur de HyperAIStudio et les 15 Toolsets. Le plugin déclare des modules `"Type": "Editor"` (`HyperAIStudio.uplugin:22-23`), chargés aussi en commandlet. C'est du code tiers non audité, et il écrit dans le projet (`.hyperai/runtime`, `.uproject`).
|
|||
|
|
2. Le critère « 27 avertissements » de `CompileAllBlueprints` ne serait plus comparable à la référence U5 (28 avertissements, tous des poses), parce que d'autres plugins peuvent ajouter des avertissements. Le décompte propre aux poses resterait lisible (§ 6), mais la ligne `Success - 0 error(s), N warning(s)` ne le serait plus.
|
|||
|
|
3. La fiche impose « éditeur fermé, un seul processus UE ». Cette condition n'était pas remplie au départ, et elle n'est pas garantie pendant le passage tant que HyperAIStudio peut relancer l'éditeur.
|
|||
|
|
|
|||
|
|
## 3. Script (étape a)
|
|||
|
|
|
|||
|
|
- Chemin : `D:\Game\LifePlay-master 5.8\Saved\U7b\update_pose_sources.py`. Hors Content ; hors git (`git check-ignore -v` → `.gitignore:4:Saved`). 148 lignes, MD5 `bef4beb39ee2878d3f0dfc08f89ca2bf`, syntaxe vérifiée par `ast.parse` (Python local, `-I`).
|
|||
|
|
- Paramètres :
|
|||
|
|
- `--dry-run` : relevé seul.
|
|||
|
|
- `--only <nom>` : une pose.
|
|||
|
|
- `--all` : toutes les poses. Ajout de garde-fou : sans `--only` ni `--all`, le mode réel refuse de tourner.
|
|||
|
|
- Déroulé :
|
|||
|
|
1. Journalise `dir(unreal.PoseAsset)`, filtré sur pose / source / retarget / modify, et la présence de `update_pose_from_animation`. Si la méthode est absente : arrêt sans modification.
|
|||
|
|
2. Registre d'assets : `scan_paths_synchronous([ROOT], True)`, puis `get_assets_by_path(ROOT, True)`, filtre sur la classe `PoseAsset`. Compte attendu : 28. En mode réel, un autre compte arrête tout avant la moindre modification ; en DryRun, il produit un avertissement « ECART ».
|
|||
|
|
3. Pour chaque pose : `unreal.load_asset`, `source_animation`, squelette de la pose et de la source (même chemin ?), nombre de poses, GUID stocké (lecture tentée, voir § 4). Une ligne `U7B-POSE nn/28 …` par pose.
|
|||
|
|
4. Mode réel, pose ciblée seulement :
|
|||
|
|
- vérifie que la source existe et que le squelette est le même ;
|
|||
|
|
- appelle `pose.modify()` puis `pose.update_pose_from_animation(source)`, ce qui reproduit le bouton « Update Source » ;
|
|||
|
|
- journalise les paquets sales ;
|
|||
|
|
- appelle `unreal.EditorAssetLibrary.save_loaded_asset(pose, False)`, qui n'enregistre que le paquet de la pose ;
|
|||
|
|
- si l'enregistrement est refusé, ou si le nombre de poses traitées diffère du nombre de cibles : `RuntimeError`, donc commandlet en code ≠ 0.
|
|||
|
|
5. Ligne `U7B-POSE BILAN mode=… trouvees=… avec_source=… cibles=… traitees=…` et rapport `Saved\U7b\update_pose_sources_<mode>_<horodatage>.txt`.
|
|||
|
|
- Fichier préparé pour le dump : `D:\Game\LifePlay-master 5.8\Saved\U7b\liste_manny_calf_l_pose.txt`, une ligne : `/Game/FreeAnimationsPack/Demo/Characters/Mannequins/Rigs/Poses/Manny/Manny_calf_l_pose`.
|
|||
|
|
|
|||
|
|
## 4. API utilisée : lue dans les sources 5.8 (méthode Python non encore confirmée à l'exécution)
|
|||
|
|
|
|||
|
|
| Élément | Source | Statut |
|
|||
|
|
|---|---|---|
|
|||
|
|
| `UpdatePoseFromAnimation(UAnimSequence*)` est `UFUNCTION(BlueprintCallable)`, en éditeur seulement. Nom Python attendu : `update_pose_from_animation`. | `Runtime/Engine/Classes/Animation/PoseAsset.h:446-448` (bloc `#if WITH_EDITOR` 421-468) | C++ établi ; nom Python **estimé**, que le `dir()` du DryRun confirmera |
|
|||
|
|
| Effet : garde les noms de poses, appelle `CreatePoseFromAnimation`, réécrit `SourceAnimationRawDataGUID` (1676) et marque la pose comme régénérée (1674). Ne marque pas le paquet comme sale, d'où l'appel préalable à `modify()`. | `Runtime/Engine/Private/Animation/PoseAsset.cpp:1582-1710` | établi |
|
|||
|
|
| `SourceAnimation` : `UPROPERTY(Category=Source, EditAnywhere)`, en éditeur seulement, donc lisible par `get_editor_property("source_animation")` quand `GIsEditor` est vrai. | `PoseAsset.h:349-350` ; règle d'export `PythonScriptPlugin/Private/PyGenUtil.cpp:1811-1815` | établi |
|
|||
|
|
| **« Out of date » non exposé à Python** : `SourceAnimationRawDataGUID` est un `UPROPERTY()` sans `Edit` ni `BlueprintVisible`, et `GetSourceAnimationGuid()` n'est pas une `UFUNCTION`. Le script tente la lecture et journalise l'exception attendue. L'état se lit donc (a) dans l'avertissement moteur émis au chargement par `PostLoad`, présent dans le journal du DryRun, et (b) dans le dump `LPDumpAssets`, qui exporte toutes les propriétés non transitoires différentes de l'objet par défaut de la classe (CDO). | `PoseAsset.h:353-354`, `:519` ; `PyGenUtil.cpp:1609-1613`, `:1811-1815` ; `PoseAsset.cpp:1065-1087` ; `Source/LifePlayEditorTools/LPDumpAssetsCommandlet.cpp:17-37` | établi pour l'API ; lecture du GUID dans le dump **estimée** |
|
|||
|
|
| `GIsEditor` est vrai dans `-run=pythonscript` : `UCommandlet` met `IsEditor = true` par défaut, et le moteur recopie cette valeur. | `Runtime/Engine/Private/Commandlets/Commandlet.cpp:33` ; `Runtime/Launch/Private/LaunchEngineLoop.cpp:3995` | établi |
|
|||
|
|
| Le skeleton est lisible : `Skeleton` est `VisibleAnywhere`. | `Runtime/Engine/Classes/Animation/AnimationAsset.h:993-994` | établi |
|
|||
|
|
| `modify(always_mark_dirty=True)` | `PythonScriptPlugin/Private/PyWrapperObject.cpp:1130` | établi |
|
|||
|
|
| `EditorAssetLibrary.save_loaded_asset` (`EditorScriptingUtilities`, désactivé par défaut mais requis par le plugin `Bridge`, actif dans le projet) ; `EditorLoadingAndSavingUtils.get_dirty_content_packages` | `Plugins/Editor/EditorScriptingUtilities/.../EditorAssetLibrary.h:261-262` ; `EditorScriptingUtilities.uplugin:13` ; `Editor/UnrealEd/Public/FileHelpers.h:143-144` | établi (chargement par `Bridge` : estimé) |
|
|||
|
|
| `get_assets_by_path` renvoie la liste, ou `None`, parce que le retour `bool` est replié sur le paramètre de sortie. | `Runtime/AssetRegistry/Public/AssetRegistry/IAssetRegistry.h:310-311` ; `PyGenUtil.cpp:1161-1171` | établi |
|
|||
|
|
| Passage des arguments : `-script="<chemin avec espace>.py --dry-run"`. Le jeton garde ses guillemets internes ; le commandlet lit la chaîne entre guillemets ; le plugin sépare le chemin du `.py` et les arguments (`sys.argv`). La forme `"-script=<chemin avec espace> …"` couperait le chemin à l'espace. | `LaunchEngineLoop.cpp:1605-1632` ; `Core/Private/Misc/Parse.cpp:935-1017` ; `PythonScriptPlugin/Private/PythonScriptCommandlet.cpp:17-33` ; `PythonScriptPlugin.cpp:814-895`, `:196-215` | établi par lecture ; non exécuté |
|
|||
|
|
|
|||
|
|
## 5. Sorties DryRun, résultat de l'essai, MD5 après, dump
|
|||
|
|
|
|||
|
|
**Rien n'a été produit** (étapes b à d non lancées). Le compte de 28 poses trouvées n'est donc pas mesuré par le script.
|
|||
|
|
Constat disque seulement : `find …\Rigs\Poses -name "*_pose.uasset" | wc -l` = 28, `*.uasset` = 56.
|
|||
|
|
|
|||
|
|
MD5 « avant » (établi, `md5sum`, identique au manifeste `Backup_5.5\U7b`) :
|
|||
|
|
- `Manny_calf_l_pose.uasset` : `9C1E12CE72C826FD6F1DDDF9ADB24ABB` (204 017 octets, 2026-10-08 20:28:01) ;
|
|||
|
|
- `Manny_calf_l_anim.uasset` : `21AF225AF6AF3E7986ABB27247EF3611`.
|
|||
|
|
|
|||
|
|
## 6. Commandes prêtes (pwsh, depuis `D:\Game\LifePlay-master 5.8`, éditeur fermé, un seul UE)
|
|||
|
|
|
|||
|
|
```powershell
|
|||
|
|
# d0 — dump avant
|
|||
|
|
.\Tools\RunCommandlet.ps1 -Lot U7b -Commandlet LPDumpAssets -Args '-List="D:/Game/LifePlay-master 5.8/Saved/U7b/liste_manny_calf_l_pose.txt" -Out="D:/Game/LifePlay-master 5.8/Saved/U7b/dump_Manny_calf_l_pose_avant.txt"'
|
|||
|
|
# b — DryRun (attendu : 28 lignes U7B-POSE nn/28, BILAN trouvees=28 avec_source=28, 28 avertissements moteur de pose)
|
|||
|
|
.\Tools\RunCommandlet.ps1 -Lot U7b -Commandlet pythonscript -Args '-script="D:/Game/LifePlay-master 5.8/Saved/U7b/update_pose_sources.py --dry-run"'
|
|||
|
|
# c — essai réel, une pose
|
|||
|
|
.\Tools\RunCommandlet.ps1 -Lot U7b -Commandlet pythonscript -Args '-script="D:/Game/LifePlay-master 5.8/Saved/U7b/update_pose_sources.py --only Manny_calf_l_pose"'
|
|||
|
|
# d — relevé
|
|||
|
|
.\Tools\RunCommandlet.ps1 -Lot U7b -Commandlet CompileAllBlueprints
|
|||
|
|
.\Tools\RunCommandlet.ps1 -Lot U7b -Commandlet LPDumpAssets -Args '-List="D:/Game/LifePlay-master 5.8/Saved/U7b/liste_manny_calf_l_pose.txt" -Out="D:/Game/LifePlay-master 5.8/Saved/U7b/dump_Manny_calf_l_pose_apres.txt"'
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
Décomptes sur le journal `Saved\Logs\portage\U7b_CompileAllBlueprints_<horodatage>.log`. La forme stricte est celle de T3, car `grep -c "Ressource de la pose"` simple compte aussi le récapitulatif `LogInit` (56 sur la référence) :
|
|||
|
|
- `grep -c "^\[[^]]*\]\[[^]]*\]LogAnimation: Warning: Ressource de la pose" <log>` → attendu 27 (référence U5 : 28) ;
|
|||
|
|
- `grep -c "Manny_calf_l_pose" <log>` → attendu 0 (référence : 2) ;
|
|||
|
|
- ligne `Success - 0 error(s), N warning(s)` (référence : `…203108.log:3058`, 28).
|
|||
|
|
|
|||
|
|
## 7. Décision demandée à l'orchestrateur
|
|||
|
|
|
|||
|
|
1. Confirmer que l'environnement HyperAIStudio (uproject modifié, plugin `Plugins\Marketplace\HyperAIStudio`, 15 Toolsets) est voulu par l'utilisateur et accepté pour U7b. Si oui, ajouter avant l'étape c un `CompileAllBlueprints` « avant », dans le même environnement, comme base de comparaison (critère : seules les lignes de pose passent de 28 à 27). Sinon, l'utilisateur décide de neutraliser l'outil le temps du passage (je n'ai rien touché : `.uproject`, `.gitignore`, `.hyperai`, `Plugins\Marketplace` sont dans l'état laissé par l'outil).
|
|||
|
|
2. Garantir qu'aucun éditeur ni démarrage HyperAIStudio n'aura lieu pendant les étapes b à d (lanceur `.hyperai/scripts/Start-HyperAIStudioEditor.ps1`).
|
|||
|
|
3. Ensuite, relancer cette fiche, ou une fiche de reprise, à partir de l'étape b avec les commandes du § 6.
|
|||
|
|
|
|||
|
|
## 8. Écarts à la fiche
|
|||
|
|
|
|||
|
|
- Étapes b, c et d non faites (arrêt, § 2). Critère de la fiche non évalué.
|
|||
|
|
- Ajouts au script : paramètre `--all` ; refus du mode réel sans `--only`/`--all` ; contrôle bloquant « 28 poses » en mode réel ; journal des paquets sales ; rapport texte dans `Saved\U7b`.
|
|||
|
|
- Ajout : fichier liste `liste_manny_calf_l_pose.txt` pour `LPDumpAssets`.
|
|||
|
|
- « État out of date » : non lisible par l'API Python (§ 4). Remplacé par l'avertissement `PostLoad` dans le journal et par le dump.
|
|||
|
|
|
|||
|
|
## 9. Fichiers écrits
|
|||
|
|
|
|||
|
|
- `D:\Game\LifePlay-master 5.8\Saved\U7b\update_pose_sources.py` (dossier `Saved\U7b` créé)
|
|||
|
|
- `D:\Game\LifePlay-master 5.8\Saved\U7b\liste_manny_calf_l_pose.txt`
|
|||
|
|
- `D:\Game\LifePlay-master 5.5\Docs\Migration\etat\U58\U7b\U7b-T5-IMPL.md` (ce livrable)
|
|||
|
|
|
|||
|
|
Aucun asset, aucun fichier suivi par git, aucun fichier de l'addon modifié. Pas de commit, pas de suppression.
|
|||
|
|
|
|||
|
|
## 10. Reprise (orchestrateur, décision utilisateur : HyperAIStudio et Toolsets gardés)
|
|||
|
|
|
|||
|
|
Lancement : `pwsh -File <scratchpad>\u7b_run.ps1 -Step <cab|dumpav|dry|reel|dumpap>`. Ce lanceur s'arrête (code 90) si un processus `UnrealEditor` ou `UnrealEditor-Cmd` tourne, puis appelle `Tools\RunCommandlet.ps1 -Lot U7b` avec les arguments du § 6. Aucun UE n'était en cours avant chaque étape (`tasklist`). Six passages ont été faits, l'un après l'autre.
|
|||
|
|
|
|||
|
|
### 10.1 Résultat : réussi
|
|||
|
|
|
|||
|
|
| Étape | Journal (`D:\Game\LifePlay-master 5.8\Saved\Logs\portage\`) | Résultat (établi) |
|
|||
|
|
|---|---|---|
|
|||
|
|
| b0 `CompileAllBlueprints` avant | `U7b_CompileAllBlueprints_20261009-135244.log` (201 s) | 418 BP, `Compiling Completed with 0 errors and 0 warnings and 0 blueprints that failed to load`. **28** lignes de pose. Les 28 lignes sont identiques, GUID compris, à la référence U5 `…20261008-203108.log` (`diff` des `sort -u` vide). Bilan `Failure - 1 error(s), 28 warning(s)`. |
|
|||
|
|
| d0 dump avant | `U7b_LPDumpAssets_20261009-135645.log` | `Saved\U7b\dump_Manny_calf_l_pose_avant.txt` (12 lignes) : `SourceAnimationRawDataGUID = 8E2B50DD07CBD0EC07FCDD7DE6C03CCF`, `bAdditivePose = True`, `BasePoseIndex = 0` |
|
|||
|
|
| b DryRun | `U7b_pythonscript_20261009-135709.log` | **28 trouvées, 28 avec source, même squelette `SK_Mannequin` pour les 28** ; `BILAN mode=dryrun trouvees=28 avec_source=28 cibles=0 traitees=0`. 28 lignes de pose au chargement. Aucun fichier du dossier `Poses` modifié (`find -newermt` = 0). Rapport : `Saved\U7b\update_pose_sources_dryrun_20261009-135720.txt` |
|
|||
|
|
| c réel `--only Manny_calf_l_pose` | `U7b_pythonscript_20261009-135737.log` | `modify()` puis `update_pose_from_animation`. Après : 5 poses, mêmes noms. **1 seul paquet sale** (la pose), enregistré (`-> True`). `BILAN mode=reel trouvees=28 avec_source=28 cibles=1 traitees=1`. Rapport : `Saved\U7b\update_pose_sources_reel_20261009-135748.txt` |
|
|||
|
|
| d `CompileAllBlueprints` après | `U7b_CompileAllBlueprints_20261009-135821.log` (191 s) | 418 BP, 0 erreur et 0 avertissement de compilation. **27** lignes de pose ; **0** ligne `Manny_calf_l_pose` (2 en b0). Bilan `Failure - 1 error(s), 27 warning(s)`. |
|
|||
|
|
| d dump après | `U7b_LPDumpAssets_20261009-140147.log` | `Saved\U7b\dump_Manny_calf_l_pose_apres.txt`. Plus d'avertissement de pose au rechargement (seule reste la ligne propre à `LPDumpAssets`). |
|
|||
|
|
|
|||
|
|
Comparaison b0 → d (script `cmpwarn.py` : lignes Warning et Error, horodatage et GUID neutralisés) : la **seule** différence est la disparition des 2 lignes `Manny_calf_l_pose` (l'avertissement et son rappel `LogInit`). Il n'y a aucune ligne nouvelle. Les 27 autres lignes de pose sont identiques, GUID compris.
|
|||
|
|
|
|||
|
|
### 10.2 Nouveautés de l'environnement (établi, présentes dans b0, inchangées en d)
|
|||
|
|
|
|||
|
|
- **1 erreur à chaque lancement d'UE**, venant de HyperAIStudio :
|
|||
|
|
`LogHyperAIStudioAutomation: Error: Automation probe publication failed: AutomationController is not loaded; the probe never loads it from a tool call.`
|
|||
|
|
Elle apparaît dans les 6 journaux (1 chacun, `grep -c`). Le bilan affiche donc `Failure - 1 error(s)`, et le **code de sortie de chaque passage est 1**, alors que chaque commandlet finit en `result 0` et qu'aucune autre ligne `Error` n'apparaît (0 dans les 6 journaux).
|
|||
|
|
- **+8 BP compilés** (418 contre 410 en U5) : `/PCGToolset/Skills/Skill_*` (8 assets), tous compilés sans erreur.
|
|||
|
|
- **Aucun avertissement nouveau** dû aux Toolsets ni à HyperAIStudio dans `CompileAllBlueprints` (b0 contre U5 : seules les 2 lignes HyperAIStudio s'ajoutent).
|
|||
|
|
- Le critère « 0 erreur » est donc atteint pour la compilation des Blueprints (0 erreur, 0 échec de chargement). Il n'est **pas** atteint au sens strict du bilan moteur : il reste 1 erreur HyperAIStudio, la même qu'en b0. À trancher par l'orchestrateur, en particulier pour les lots qui lisent le code de sortie de `RunCommandlet.ps1`.
|
|||
|
|
|
|||
|
|
### 10.3 MD5 et données de la pose
|
|||
|
|
|
|||
|
|
- `Manny_calf_l_pose.uasset` : `9C1E12CE72C826FD6F1DDDF9ADB24ABB` → **`BF33442362466150D387A0D4D0EFE4ED`**. Taille inchangée (204 017 octets), date 2026-10-09 13:57:48.
|
|||
|
|
- Les 55 autres fichiers sont identiques au manifeste `Backup_5.5\U7b` (contrôle `hashlib`). Seul ce fichier a changé sous `Content` depuis 13:50 (`find Content -newermt`).
|
|||
|
|
- Dump avant → après (`diff` des 12 lignes, puis analyse de `PoseContainer` par `cmppose.py`) :
|
|||
|
|
- `SourceAnimationRawDataGUID` : `8E2B50DD…` → **`1D634D8727C63225C22E9D7F4FA6C1E2`**, c'est-à-dire le « GUID trouvé après resave » de la ligne 1 du tableau T3 (`U7b-T3-CART.md:44`) ;
|
|||
|
|
- `PoseFNames` identiques ; `TrackPoseInfluenceIndices` identiques (48 valeurs) ; `SourceAnimation`, `Skeleton`, `bAdditivePose`, `BasePoseIndex`, `RetargetSourceAsset` inchangés ;
|
|||
|
|
- `Tracks` : 150 pistes, identiques **à la casse près**. 20 noms ont changé de casse (ex. `lowerarm_correctiveRoot_l` → `lowerarm_correctiveroot_l`, `calf_kneeBack_l` → `calf_kneeback_l`). Les noms viennent maintenant des pistes de l'animation source (`PoseAsset.cpp:1609-1615`). Les `FName` se comparent sans tenir compte de la casse : sans effet sur le fonctionnement (estimé) ;
|
|||
|
|
- transformées (`SourceLocalSpacePose` 5 × 150, `LocalSpacePose` 7/7/6/4) : même nombre, écart maximal **3e-06** en translation et **1e-06** en rotation, échelle 0. Cela correspond à la précision d'export (6 décimales) : les données de pose sont inchangées à cette précision.
|
|||
|
|
- Avertissement pendant c : `LogUObjectGlobals: Warning: Objet 'Object /Game/Characters/Heroes/Mannequin/Meshes/SKM_Manny.SKM_Manny' introuvable`, émis à l'enregistrement. Il vient de `PreSave` → `UpdateRetargetSourceAssetData` (`PoseAsset.cpp:1135-1143`), parce que `RetargetSourceAsset` pointe vers un maillage absent du projet. Ce n'est **pas nouveau** : la même ligne figure au resave U5 de cette même pose (`U5_LPResavePackages_20261008-202628.log:2025`).
|
|||
|
|
|
|||
|
|
### 10.4 Commandes, fichiers et écarts de la reprise
|
|||
|
|
|
|||
|
|
- Fichiers écrits :
|
|||
|
|
- `D:\Game\LifePlay-master 5.8\Saved\U7b\dump_Manny_calf_l_pose_{avant,apres}.txt`
|
|||
|
|
- `…\Saved\U7b\update_pose_sources_{dryrun_20261009-135720,reel_20261009-135748}.txt`
|
|||
|
|
- résumés `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\U7b_*_20261009-*.txt` (6, écrits par `RunCommandlet.ps1`)
|
|||
|
|
- scripts d'analyse dans le scratchpad de session (`u7b_run.ps1`, `cmpwarn.py`, `cmppose.py`), hors projet.
|
|||
|
|
- Asset modifié : `Content\FreeAnimationsPack\Demo\Characters\Mannequins\Rigs\Poses\Manny\Manny_calf_l_pose.uasset` seulement. Retour arrière possible par l'instantané `Backup_5.5\U7b`.
|
|||
|
|
- Ordre réel : b0, dump avant, b, c, d, dump après. Le dump avant a été placé avant b, ce qui ne change rien (lecture seule).
|
|||
|
|
- Pas de commit, pas de suppression ; addon non touché. `git status` de la copie 5.8 : seuls `.gitignore`, `LifePlay.uproject` (HyperAIStudio) et `Docs/Migration/29_Projet_Stabilisation_V2.md` (session voisine) sont modifiés, aucun par cette fiche.
|
|||
|
|
|
|||
|
|
## 11. Reprise 2 (orchestrateur : essai validé, `--all`)
|
|||
|
|
|
|||
|
|
Avant chaque lancement : aucun `UnrealEditor` ni `UnrealEditor-Cmd` (`tasklist`, puis le garde-fou de `u7b_run.ps1`). L'éditeur n'a pas planté (chaque commandlet finit en `result 0`).
|
|||
|
|
|
|||
|
|
### 11.1 Résultat : réussi
|
|||
|
|
|
|||
|
|
| Étape | Journal (`D:\Game\LifePlay-master 5.8\Saved\Logs\portage\`) | Résultat (établi) |
|
|||
|
|
|---|---|---|
|
|||
|
|
| réel `--all` | `U7b_pythonscript_20261009-140444.log` | `BILAN mode=reel trouvees=28 avec_source=28 cibles=28 traitees=28`. 28 × `enregistrement du paquet … -> True`, 28 × `Saving Package`. Chaque enregistrement n'avait **qu'1** paquet sale (28 × « paquets sales (1) »). Nombre de poses par asset identique au DryRun (28/28). 27 lignes de pose au chargement, puisque `Manny_calf_l_pose` était déjà corrigée. Rapport : `Saved\U7b\update_pose_sources_reel_20261009-140457.txt` |
|
|||
|
|
| `CompileAllBlueprints` après | `U7b_CompileAllBlueprints_20261009-140525.log` (191 s) | 418 BP, **même liste qu'en b0** (`diff` vide). `Compiling Completed with 0 errors and 0 warnings and 0 blueprints that failed to load`. **0** ligne « Ressource de la pose », **0** mention du dossier `Rigs/Poses`. Bilan `Failure - 1 error(s), 0 warning(s)`. |
|
|||
|
|
|
|||
|
|
- Comparaison b0 → après (`cmpwarn.py`) : il ne reste **aucune ligne nouvelle**. Seules ont disparu les 56 lignes de pose : 28 avertissements et 28 rappels `LogInit`. Il reste 3 lignes Warning/Error : l'erreur `LogHyperAIStudioAutomation` (connue, § 10.2), son rappel `LogInit`, et l'en-tête `Warning/Error Summary`. Code de sortie 1 à cause de cette erreur, relevé sans arrêt comme demandé.
|
|||
|
|
- `Manny_calf_l_pose` a été **repassée** par `--all` (le script traite les 28) : paquet réenregistré, contenu **identique** (MD5 `BF334423…` inchangé).
|
|||
|
|
- Avertissements pendant `--all` : `SKM_Manny.SKM_Manny' introuvable` et `SKM_Quinn.SKM_Quinn' introuvable` (1 chacun). Même cause que § 10.3 (`PreSave` → `UpdateRetargetSourceAssetData`). Tous deux figurent déjà au resave U5 (`U5_LPResavePackages_20261008-202628.log`, 1 chacun) : pas nouveaux.
|
|||
|
|
|
|||
|
|
### 11.2 MD5 (projet contre instantané `Backup_5.5\U7b`, script `hashlib` / `md5sum`)
|
|||
|
|
|
|||
|
|
- **28 `_anim` : 28/28 identiques à l'instantané.**
|
|||
|
|
- 28 `_pose` : 28/28 différentes de l'instantané. Pour 27 d'entre elles, le changement vient de `--all` ; `Manny_calf_l_pose` était déjà changée en § 10. Aucun autre fichier de `Content` modifié depuis 14:04 en dehors des 28 poses (`find Content -newermt` = 28 fichiers, tous `_pose.uasset`).
|
|||
|
|
|
|||
|
|
| # | Pose | MD5 instantané (avant) | MD5 après |
|
|||
|
|
|---|---|---|---|
|
|||
|
|
| 1 | `Manny_calf_l_pose` | `9C1E12CE72C826FD6F1DDDF9ADB24ABB` | `BF33442362466150D387A0D4D0EFE4ED` |
|
|||
|
|
| 2 | `Manny_calf_r_pose` | `C5AC8F8AD252FD2286F8CEBB85DE7964` | `80440A445DA5605440C940C2AA116F3A` |
|
|||
|
|
| 3 | `Manny_clavicle_l_pose` | `FBE6588EFF1C3C24DB47E03B121F4995` | `364498931173892E8A7E5CBCB8A0E32E` |
|
|||
|
|
| 4 | `Manny_clavicle_r_pose` | `83992B82FF3AFF337B260F02C09EE3C9` | `19590B1AA20F6D38A750CDF3D0455A7C` |
|
|||
|
|
| 5 | `Manny_foot_l_pose` | `CEB404696D9A634F8BDD1BB4C4E97D9B` | `7E3C76798094AEC74A6D5A68E5BDFEC1` |
|
|||
|
|
| 6 | `Manny_foot_r_pose` | `D36A6BAD11960A8EBE37F66615B5DA6E` | `4761F8381F99739053A1CBF423E21E1D` |
|
|||
|
|
| 7 | `Manny_hand_l_pose` | `6423B44465D78B8699D2CC09355A05D2` | `BF7697ACCE0F1F99D4F28F2511A2A208` |
|
|||
|
|
| 8 | `Manny_hand_r_pose` | `79E5E4CBD126D1D90AE4DAF8D7AF2814` | `C0E8674910602886C3F1DA4117FDC01B` |
|
|||
|
|
| 9 | `Manny_lowerarm_l_pose` | `27F1C2064C9BB63BD470FFEFE87D8CBE` | `E1A655F61F4797CEE2CB112A52F6FABE` |
|
|||
|
|
| 10 | `Manny_lowerarm_r_pose` | `75B45B3E3407FF416CF3BFA21D8AD4AB` | `40851ABEBFF6371AAFEF91435AC0701D` |
|
|||
|
|
| 11 | `Manny_thigh_l_pose` | `D941A96A008000215B9083A0C45F7C39` | `49622581DFF154DF7D831F2269707708` |
|
|||
|
|
| 12 | `Manny_thigh_r_pose` | `A9D32E045AC4530D274191F08EAD05DF` | `EF4837F0151AA2771EAA74C2AF22594E` |
|
|||
|
|
| 13 | `Manny_upperarm_l_pose` | `6B6E49BC94AFD43BAA636D01A5278FCF` | `10627AEA91544747176360DFCF7179CE` |
|
|||
|
|
| 14 | `Manny_upperarm_r_pose` | `64557ACB3C7931E4CA53423879AF6BA0` | `83BB0CF9FEDAAABFA366DC7C6069BD1B` |
|
|||
|
|
| 15 | `Quinn_calf_l_pose` | `2D449021CAB6DDC2C13D5659CF41107E` | `17BC525DF148591BE5B8C53A5CE81445` |
|
|||
|
|
| 16 | `Quinn_calf_r_pose` | `429B6977970E1C5AE15FEC43D1143BCD` | `8CE3C79A02AE72579EAD7D45A6E5B4C2` |
|
|||
|
|
| 17 | `Quinn_clavicle_l_pose` | `3C2B2CFE01474FDB93330089DE1303A2` | `98AFFF211966E346A460013C12841CC7` |
|
|||
|
|
| 18 | `Quinn_clavicle_r_pose` | `4F1D631A68AA52FC0E339EC2BC7CEE9B` | `3F913D9E1D417BF6603FECDD6282CACA` |
|
|||
|
|
| 19 | `Quinn_foot_l_pose` | `6E4CB8776794E99F27982951835CBD37` | `39E3DB80EEF1C08C7F850D175C71FE13` |
|
|||
|
|
| 20 | `Quinn_foot_r_pose` | `E8FBA4176BDF2E55698F87B76A57A61E` | `5AF029696214813579A51676A1E56237` |
|
|||
|
|
| 21 | `Quinn_hand_l_pose` | `1182CF966A2C19F1217900498EA25B02` | `00B63CD047BD8490A8647FCE1B49E785` |
|
|||
|
|
| 22 | `Quinn_hand_r_pose` | `E0BBF6092FD28C3AF8175E1DF09475E8` | `C8C2AADF209C01DF363CD2804E35F04A` |
|
|||
|
|
| 23 | `Quinn_lowerarm_l_pose` | `30A19BAED9C4CF85E773D52EE9980A1F` | `7F0D7EB3F36A4F5BBB7DE6E54912D86B` |
|
|||
|
|
| 24 | `Quinn_lowerarm_r_pose` | `EBD5B6E355D75B8C82D9E264C393CF4C` | `7374C94AA406A9DB5056A6E0545BD857` |
|
|||
|
|
| 25 | `Quinn_thigh_l_pose` | `2CA1EF7515B0027C3A44EDCF120C3725` | `B334150EEFA55C9933E0FEC4116BE4E9` |
|
|||
|
|
| 26 | `Quinn_thigh_r_pose` | `30CE357A08D908FE9862BEE7CBF008B4` | `DF001FB043887FADC50AC05BC5A98953` |
|
|||
|
|
| 27 | `Quinn_upperarm_l_pose` | `EF6EEA9863F60AC8714E813654D208BD` | `306F99A8B454AB852F274FEB9F957E5C` |
|
|||
|
|
| 28 | `Quinn_upperarm_r_pose` | `40F827880C81BCBF9C3AB5AB0DC6E31B` | `B971C7656E9AEB8792F93A34739EF0A0` |
|
|||
|
|
|
|||
|
|
### 11.3 Fichiers et écarts de la reprise 2
|
|||
|
|
|
|||
|
|
- Assets modifiés : les 28 `*_pose.uasset` de `Content\FreeAnimationsPack\Demo\Characters\Mannequins\Rigs\Poses\{Manny,Quinn}`, seulement. Retour arrière par l'instantané `Backup_5.5\U7b` (56 fichiers).
|
|||
|
|
- Écrits : `Saved\U7b\update_pose_sources_reel_20261009-140457.txt` ; résumés `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\U7b_pythonscript_20261009-140444.txt` et `U7b_CompileAllBlueprints_20261009-140525.txt`. Relevés MD5 dans le scratchpad (`md5_avant_all.txt`, `md5_apres_all.txt`).
|
|||
|
|
- Pas de dump « après » des 27 autres poses (non demandé). L'écart de données n'est mesuré que sur `Manny_calf_l_pose` (§ 10.3).
|
|||
|
|
- Pas de commit, pas de suppression, addon non touché.
|