152 lines
16 KiB
Markdown
152 lines
16 KiB
Markdown
# U7-T16-T7 : essai d'acceptation T7 (moddeur, coiffure) : ÉCHEC à HairPipeline Inspect
|
||
|
||
Fiche U7-T16 — Niveau N1 — Modèle prévu lp-builder | utilisé claude-haiku-5-5 — Agent lp-builder — Skills lp-build, lp-commandlets, sk-windows-shell, sk-protocol
|
||
|
||
## 1. Objet
|
||
|
||
Essai T7 (`etat/U58/UA/UA-MODS.md` § 4, ligne T7) : un moddeur fabrique un mod de coiffure de bout en bout avec
|
||
l'atelier de l'addon 5.8 (`D:\Game\LifePlay-Sandbox-5.8\Tools`), contre la référence `Releases/2026.10.2.0`.
|
||
Premier passage de `HairPipeline.ps1` en 5.8 (report U4).
|
||
|
||
Résultat : **échec** à l'étape b (`HairPipeline.ps1 -Step Inspect`). Arrêt au premier échec, conformément à la fiche (point 9).
|
||
Étapes c (`BuildMod.ps1`) et d (copie d'essai) **non exécutées**. Pas de copie d'essai prête.
|
||
|
||
## 2. Source de la coiffure (établi)
|
||
|
||
- `D:\Game\LifePlay-Sandbox-5.8\ModSources\lpr_hair_pocolov\Module\Hairstyles\pocolov15.lphair` existe (utilisée par `lpr_hair_pocolov`).
|
||
- `D:\Game\LifePlay-Sandbox-5.8\Tools\hairs\HAIRS1.json` : `Pocolov15` → `"archive": "D:/Game/pocolov-hair-15.zip"`, `CC BY 4.0`.
|
||
- `D:/Game/pocolov-hair-15.zip` présent, 1 565 386 octets, daté 2026-10-02 18:21 (commande : `ls -la D:/Game/pocolov-hair-15.zip`).
|
||
- Doc 13 (`D:\Game\LifePlay-master 5.5\Docs\Migration\13_Protocole_Coiffure.md:195-196`) cite la même archive.
|
||
- Aucun téléchargement effectué.
|
||
|
||
## 3. Commandes et codes
|
||
|
||
| Étape | Commande (interpréteur pwsh 7) | Code | Durée | Sortie clé |
|
||
|---|---|---|---|---|
|
||
| Préconditions | Get-Process UnrealEditor* ; Test-Path des cibles ; `Mods\` 5.8 ; `git branch` | — | — | éditeur 0 ; cibles absentes ; `Mods\` vide ; branche `ue5.8` ; `CompilerVersion=14.50.35717` (`DefaultEngine.ini`) |
|
||
| a. NewMod | `& "D:\Game\LifePlay-Sandbox-5.8\Tools\NewMod.ps1" -Name lpr_test_u7t7 -Title "LPR test U7-T7" -Author "LifePlay Revival" -Hairs -GameRoot "D:\Game\LifePlay-master 5.8"` | **non relevé** (`$LASTEXITCODE` vide après appel `&` dans `-Command`) ; aucune exception levée | < 1 s | `Configuration des coiffures : ...\Tools\mods\lpr_test_u7t7.json` ; `Mod cree : ...\ModSources\lpr_test_u7t7` ; suite indiquée : EditMod puis BuildMod |
|
||
| (saisie) | Entrée `hairs` de `Tools\mods\lpr_test_u7t7.json` : une coiffure Pocolov15 (name, archive, title, url, thicken 1, sex F, cap_opacity white, license, author) | — | — | **sans** les champs `"auto"` (voir § 5) |
|
||
| b. Inspect | `pwsh -NoProfile -File "...\Tools\HairPipeline.ps1" -Config "...\Tools\mods\lpr_test_u7t7.json" -Step Inspect -GameRoot "D:\Game\LifePlay-master 5.8"` (lancé en arrière-plan) | **non relevé** (le code de pwsh n'a pas été capturé ; la notification « exit 0 » concerne le wrapper bash) | import UE : 09:16:28 → 09:16:38 (heure du journal UE) | voir § 4 |
|
||
| b. Apply | non lancé | — | — | — |
|
||
| c. BuildMod | non lancé | — | — | — |
|
||
| d. Copie d'essai | non lancée | — | — | — |
|
||
|
||
Journal de l'Inspect : `%USERPROFILE%\AppData\Local\Temp\claude\D--Game-LifePlay-master-5-5\ab8918a1-261f-45b4-904a-678ecfce98f7\scratchpad\U7T16_b_inspect.log`.
|
||
Sortie de NewMod (copie) : sortie console reproduite au § 3 (le fichier tee n'a pas été écrit).
|
||
|
||
## 4. Erreur exacte (Inspect)
|
||
|
||
Sortie du journal (texte intégral, dernière ligne) :
|
||
|
||
```
|
||
[31;1mHairPipeline.ps1: [31;1mNous ne pouvons pas lier l'argument au param<61>tre <20><>Path<74><68>, car il s'agit d'une valeur nulle.[0m
|
||
```
|
||
|
||
Lignes du journal avant l'erreur : `Mod lpr_test_u7t7 monte dans Mods\lpr_test_u7t7` ; `== Pocolov15 : inspection` ;
|
||
import FBX réussi (`HAIRIMPORT ... Head.Head : 21262 triangles` ; `Hair_15.Hair_15 : 6714 triangles, emplacements ['Hair_Base', 'Hair_01']` ;
|
||
`2 maillage(s) statique(s) importe(s) dans /lpr_test_u7t7/Hairs/_Work_Pocolov15`) ; puis `Mod lpr_test_u7t7 remis dans ModSources\lpr_test_u7t7` (fermeture du montage, `finally`).
|
||
|
||
**Localisation** : la ligne n'est pas donnée par le message. Le point d'échec est dans le bloc `try` de l'Inspect, après l'import.
|
||
Candidat unique : `HairPipeline.ps1:215` (`Split-Path $h.diffuse -Leaf` et `Split-Path $h.strands_opacity -Leaf` dans `$report += ...`), appelé avec `$null` :
|
||
`$h.diffuse` n'est affecté que si `& $auto 'diffuse'` est vrai (`HairPipeline.ps1:204`), et `$auto` ne contient que les champs valant `"auto"` (`HairPipeline.ps1:191-192`). Comme aucun champ n'est marqué `"auto"`, `auto_fields` reste vide et `diffuse` reste `$null`.
|
||
**Non confirmé par un essai** : l'hypothèse n'a pas été testée (arrêt prescrit par la fiche). Essai qui la tranche : même Inspect après ajout des champs `"auto"`.
|
||
|
||
## 5. Écarts avec le guide moddeurs (`Docs\Modding\FullGuides\Creating_Asset_Mods.md`, copie addon `ModSources`/`Docs/Modding/Creating_Asset_Mods.md`)
|
||
|
||
1. **Champs `"auto"` absents** : le guide (`Creating_Asset_Mods.md:83`) et le protocole (`13_Protocole_Coiffure.md:198`) demandent `"mesh": "auto", "head": "auto", "cap_slots": "auto", "diffuse": "auto", "strands_opacity": "auto"`. Mon entrée JSON ne les contient pas (écart de saisie de ma part, pas un défaut du script démontré). Le JSON de référence `Tools\mods\lpr_hair_pocolov.json` n'en contient aucun non plus, à la différence de son `auto_fields` mémorisé.
|
||
2. **Étape de saisie non décrite** : le guide ne dit pas quels champs saisir à la main pour une coiffure neuve (`archive`, `title`, `url`, `license`, `author`, `sex`, `thicken`, `cap_opacity`) ; le message de `NewMod.ps1` renvoie à `lpr_hair_pocolov.json`.
|
||
3. **Chemins 5.5 restants** : `"backup": "D:/Game/LifePlay_Backup_5.5/mods/lpr_test_u7t7"` (généré par NewMod) ; les `Docs\Migration\...` cités par le protocole pointent sur `D:\Game\LifePlay_Backup_5.5\<lot>`.
|
||
4. **Code de sortie** : `NewMod.ps1` n'expose pas de code de sortie dans `-Command` ; à relever avec `-File` au prochain essai.
|
||
5. `HairPipeline.ps1` et `Tools\Roots.ps1` ne sont pas conçus pour un message d'erreur explicite quand un champ `"auto"` manque : l'erreur sort sous forme de `Split-Path` nul, sans numéro de ligne.
|
||
|
||
## 6. Chaîne créée (pour le rangement ; rien supprimé)
|
||
|
||
Dans l'addon 5.8 :
|
||
- `D:\Game\LifePlay-Sandbox-5.8\ModSources\lpr_test_u7t7\` : `lpr_test_u7t7.uplugin`, `Module\lpr_test_u7t7.lpmod`, `Module\CREDITS.txt`, `Content\` (contient `Content\Hairs\_Work_Pocolov15\Hair_15.uasset` et `Head.uasset`, écrits par l'import et remis en place au démontage).
|
||
- `D:\Game\LifePlay-Sandbox-5.8\Tools\mods\lpr_test_u7t7.json` (créé par NewMod ; entrée `hairs` ajoutée par moi).
|
||
|
||
Dans la sauvegarde 5.5 (créée par l'Inspect) :
|
||
- `D:\Game\LifePlay_Backup_5.5\mods\lpr_test_u7t7\Pocolov15\` : `import.json`, `norm\` (hair.fbx et 9 textures), `src\` (extraction de `pocolov-hair-15.zip` : `source\` et `textures\`, plus `Pocolov Hair 15.zip.done`).
|
||
|
||
Dans la copie 5.8 : aucun fichier créé ; `Mods\` vide (`0 entrées`) après démontage ; aucun dossier `Content\Modules\lpr_test_u7t7` ni `Plugins\lpr_test_u7t7`.
|
||
|
||
Non touché : `lpr_hair_pocolov`, `lpr_anim_*`, leurs archives, les scripts, les configs existantes, `LifePlay_Build_5.8_U7d` (non modifié), aucun commit.
|
||
|
||
## 7. Copie d'essai
|
||
|
||
**Non prête.** `D:\Game\LifePlay_Build_5.8_U7d_T7` n'a pas été créé (étape d non atteinte, absent à la vérification).
|
||
|
||
## 8. Critère
|
||
|
||
Critère non atteint (archive `lpr_test_u7t7-1.0-for-LifePlay-2026.10.2.0.zip` absente, copie d'essai absente). Échec documenté ; reprise à décider par l'orchestrateur (ajout des champs `"auto"` puis Inspect, selon le guide, est la piste la plus probable).
|
||
|
||
## 9. Points à confirmer
|
||
|
||
- Code de sortie réel de `NewMod.ps1` et de `HairPipeline.ps1 -Step Inspect` (non relevé).
|
||
- Hypothèse § 4 (Split-Path nul sur `$h.diffuse`) : à confirmer par un Inspect avec `"auto"`.
|
||
- Durée de l'Inspect complet (fin non horodatée dans le journal ; import UE 09:16:28 → 09:16:38).
|
||
|
||
## 10. Reprise (ordre de l'orchestrateur)
|
||
|
||
État : **arrêt à l'étape d'application, avant BuildMod** (écart « dépendances A VERIFIER »). Pas de BuildMod, pas de copie d'essai.
|
||
|
||
1. Champs ajoutés à l'entrée Pocolov15 de `D:\Game\LifePlay-Sandbox-5.8\Tools\mods\lpr_test_u7t7.json` : `"mesh"`, `"head"`, `"cap_slots"`, `"diffuse"`, `"strands_opacity"` = `"auto"`. Rien d'autre modifié. Le script a ensuite réécrit ces champs (valeurs ci-dessous) et `auto_fields`.
|
||
2. Inspect relancé (`-File`, code **0** relevé dans `%USERPROFILE%\AppData\Local\Temp\claude\D--Game-LifePlay-master-5-5\ab8918a1-261f-45b4-904a-678ecfce98f7\scratchpad\U7T16_reprise_inspect.log`, ligne `EXIT=0`). Comparaison avec `Tools\hairs\HAIRS1.json` (Pocolov15) :
|
||
|
||
| Champ | Reprise (rapport Inspect) | Référence HAIRS1 | Écart |
|
||
|---|---|---|---|
|
||
| mesh | `/lpr_test_u7t7/Hairs/_Work_Pocolov15/Hair_15` | `.../_Work_Pocolov15/Hair_15` | aucun |
|
||
| head | `/lpr_test_u7t7/Hairs/_Work_Pocolov15/Head` | `.../Head` | aucun |
|
||
| cap_slots | `Hair_Base` | `Hair_Base` | aucun |
|
||
| diffuse | `tex01_Hair_01_Gray.png` | `tex01_Hair_01_Gray.png` | aucun |
|
||
| strands_opacity | `tex02_Hair_01A1.jpg` | `tex02_Hair_01A1.jpg` | aucun |
|
||
|
||
3. Apply lancé (`-Step Apply`, journal `...\scratchpad\U7T16_reprise_apply.log`, code **0**, `EXIT=0`). Résultat : `Pocolov15 : OK, echelle X=1.194 Y=1.276, bornes IsValid=true, ... dependances A VERIFIER` (`D:\Game\LifePlay_Backup_5.5\mods\lpr_test_u7t7\rapport_Apply.txt`). Éléments établis dans le journal :
|
||
- LPHairFromStatic : coiffure placée, transfert de poids 9 749 / 4 541 sommets, 950 repoussés, `-DryRun` puis conversion ; fichier produit `D:\Game\LifePlay-Sandbox-5.8\ModSources\lpr_test_u7t7\Module\Hairstyles\pocolov15.lphair`.
|
||
- HairMaterials.py : `HAIRMAT emplacement Hair_Base -> Pocolov15_Cap`, `Hair_01 -> Pocolov15_Strands`, puis `HAIRMAT dependances de Pocolov15 : ['/lpr_test_u7t7/Hairs/Pocolov15_Skeleton'] -> A VERIFIER`.
|
||
- BuildCollections : 13 collections, 14 051 chemins, 0 inconnu (écrites dans `D:\Game\LifePlay-master 5.8\Saved\Collections`).
|
||
- Écart : la référence HAIRS1 affiche `dependances OK`. Le squelette `Pocolov15_Skeleton` est un asset du mod lui-même (même dossier `/lpr_test_u7t7/`), donc la cause probable est un contrôle de chemin, non un manque, mais ce n'est pas établi. Essai qui tranche : lire la règle `A VERIFIER` dans `Tools\HairMaterials.py` et vérifier l'existence de `Content\Hairs\_Work_Pocolov15` / `Pocolov15_Skeleton` dans l'assemblage du mod.
|
||
4. BuildMod non lancé (arrêt sur écart non expliqué).
|
||
5. Copie d'essai `D:\Game\LifePlay_Build_5.8_U7d_T7` non créée.
|
||
|
||
## 11. Écarts à consigner (liste des bugs)
|
||
|
||
- **Robustesse de `HairPipeline.ps1`** : un champ de coiffure omis (ici `"auto"` absents) provoque `Nous ne pouvons pas lier l'argument au paramètre Path, car il s'agit d'une valeur nulle.` à `HairPipeline.ps1:215` (`Split-Path $h.diffuse`), sans message expliquant le champ manquant. À corriger en message explicite (non corrigé ici).
|
||
- **Journal sans code de sortie** : `NewMod.ps1` lancé par `&` dans `-Command` ne rend pas `$LASTEXITCODE` ; à lancer par `-File`.
|
||
- **Rangement à faire (décision orchestrateur)** : `D:\Game\LifePlay-Sandbox-5.8\ModSources\lpr_test_u7t7\` (y compris `Content\Hairs\_Work_Pocolov15\` et `Module\Hairstyles\pocolov15.lphair`), `D:\Game\LifePlay-Sandbox-5.8\Tools\mods\lpr_test_u7t7.json`, `D:\Game\LifePlay_Backup_5.5\mods\lpr_test_u7t7\`, `D:\Game\LifePlay-master 5.8\Saved\Collections\` (13 fichiers, écrits par BuildCollections). Aucun n'a été supprimé.
|
||
|
||
## 12. Reprise 2 (ordre de l'orchestrateur) : BuildMod, contrôles, copie d'essai
|
||
|
||
**Résultat : BuildMod réussi (code 0), archive conforme aux contrôles demandés, copie d'essai prête.** Réserve : `dépendances A VERIFIER` (Apply) reste non tranché (§ 12.4).
|
||
|
||
### 12.1 BuildMod (étape c)
|
||
- Commande : `pwsh -NoProfile -File "D:\Game\LifePlay-Sandbox-5.8\Tools\BuildMod.ps1" -Name lpr_test_u7t7 -GameRoot "D:\Game\LifePlay-master 5.8"` (arrière-plan). Code **0** (`EXIT=0`, journal `...\scratchpad\U7T16_reprise2_buildmod.log`). Durée : 11:20:37 → 11:20:57 (20 s).
|
||
- Cuisson : `-run=Cook -dlcname=lpr_test_u7t7 -basedonreleaseversion=2026.10.2.0`, moteur 5.8.3. **6 paquet(s) cuit(s)** (`Cooked packages 6 Packages Remain 0 Total 6`), `LogInit: Success - 0 error(s), 0 warning(s)`, 0 ligne d'erreur dans le journal `D:\Game\LifePlay-master 5.8\Saved\Logs\portage\mods\lpr_test_u7t7_20261009_112038.log`.
|
||
- Conteneur : 8 fichiers, tous sous `Mods/lpr_test_u7t7/` (contrôle du script).
|
||
- Archive : `D:\Game\LifePlay_Publication\Mods\lpr_test_u7t7-1.0-for-LifePlay-2026.10.2.0.zip`, 302 984 octets, 8 fichiers, SHA-256 `960735B6BC0A4993050809B80673A71AA64DB7076074C8A124A0962B2831AA30` (sortie du script).
|
||
|
||
### 12.2 Contrôles de l'archive (extraite dans `...\scratchpad\U7T16_archive_r2`, hors projet)
|
||
- `lpr_test_u7t7.lpmod` (Content/Modules) : `MODULE_PACKAGED: 2026-10-09` et **`MODULE_GAME_VERSION: 2026.10.2.0`**.
|
||
- `lpr_test_u7t7.uplugin` (Mods) : **`"EngineVersion": "5.8.3"`**.
|
||
- Formats : version du TOC (`lpr_test_u7t7LifePlay-Windows.utoc`, octet 16) = **8**, identique à la référence `Releases\2026.10.2.0\Windows\LifePlay-Windows.utoc` (octet 16 = 8). La consigne « formats 5/24 » n'est pas interprétable de façon sûre ici : **incertain**, non vérifié.
|
||
- Contenu du conteneur (noms trouvés dans `.ucas` et `.utoc`) : `Pocolov15`, `Pocolov15_Skeleton`, `Pocolov15_Cap`, `Pocolov15_Strands`, `Pocolov15_Diffuse`, `Pocolov15_StrandsOpacity` : **6 noms, pour 6 paquets cuits** (estimé : la liste nominative des 6 paquets n'est pas imprimée par le journal ; seuls `Pocolov15_Diffuse` et `_StrandsOpacity` y figurent explicitement, lignes `LogTexture`).
|
||
- Réponse à la question de l'orchestrateur : `Pocolov15_Cap` et `Pocolov15_Strands` **sont** dans le conteneur. Le contrôle `A VERIFIER` ne vient donc pas d'un paquet absent. Cause du flag non établie (§ 12.4).
|
||
|
||
### 12.3 Copie d'essai (étape d)
|
||
- Vérification préalable : `D:\Game\LifePlay_Build_5.8_U7d_T7` absent ; `LifePlay.exe` est sous `D:\Game\LifePlay_Build_5.8_U7d\Windows\` (contenu du jeu sous `Windows\LifePlay\`), donc l'archive s'extrait dans `Windows\`.
|
||
- Robocopy : `robocopy D:\Game\LifePlay_Build_5.8_U7d D:\Game\LifePlay_Build_5.8_U7d_T7 /E /XD Saved` (journal `...\scratchpad\U7T16_reprise2_robocopy.log`). Code **1** (fichiers copiés, aucun échec) ; 2 250 fichiers, 2,432 Go, 0 échec, 0:00:23.
|
||
- Extraction : `7z x -y -o"D:\Game\LifePlay_Build_5.8_U7d_T7\Windows" D:\Game\LifePlay_Publication\Mods\lpr_test_u7t7-1.0-for-LifePlay-2026.10.2.0.zip` : code 0, 8 fichiers.
|
||
- Vérifications : `Windows\LifePlay.exe` OK ; `Windows\LifePlay\Mods\lpr_test_u7t7` OK (dont `Content\Paks\Windows\lpr_test_u7t7LifePlay-Windows.utoc`) ; `Windows\LifePlay\Content\Modules\lpr_test_u7t7\lpr_test_u7t7.lpmod` OK.
|
||
- `Mods\` de la copie 5.8 (`D:\Game\LifePlay-master 5.8\Mods`) : **0 entrée** après l'essai.
|
||
- Le jeu n'a pas été lancé, l'éditeur n'a pas été ouvert, `EditMod` non lancé.
|
||
|
||
### 12.4 Point ouvert
|
||
- `HAIRMAT dependances de Pocolov15 : ['/lpr_test_u7t7/Hairs/Pocolov15_Skeleton'] -> A VERIFIER` reste inexpliqué : les matériaux sont dans le conteneur, la liste de contrôle ne les cite pas. Essai qui tranche : lire la règle de `Tools\HairMaterials.py` (dépendances) et comparer le journal de `lpr_hair_pocolov` (`D:\Game\LifePlay_Backup_5.5\mods\lpr_hair_pocolov\rapport_Apply.txt`, OK pour 5 coiffures).
|
||
|
||
### 12.5 Liste de rangement (rien supprimé)
|
||
- `D:\Game\LifePlay-Sandbox-5.8\ModSources\lpr_test_u7t7\` ; `D:\Game\LifePlay-Sandbox-5.8\Tools\mods\lpr_test_u7t7.json`
|
||
- `D:\Game\LifePlay_Backup_5.5\mods\lpr_test_u7t7\` (import, norm, src, rapports)
|
||
- `D:\Game\LifePlay-master 5.8\Saved\Collections\` (13 fichiers, BuildCollections), `D:\Game\LifePlay-master 5.8\Saved\Logs\portage\mods\lpr_test_u7t7_20261009_112038.log`
|
||
- `D:\Game\LifePlay_Publication\Mods\lpr_test_u7t7-1.0-for-LifePlay-2026.10.2.0.zip`
|
||
- `D:\Game\LifePlay_Build_5.8_U7d_T7\` (copie d'essai, ~2,4 Go, prête)
|
||
- Scratchpad (hors projet) : `U7T16_archive_r2\`, journaux `U7T16_*`.
|