LifePlay-Revival/Docs/Migration/etat/CAM/CAM-B2p-J-PC-VAL.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

202 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

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

Fiche CAM-B2p-J-PC-VAL — Niveau N1 — Modèle prévu non précisé par la demande | utilisé claude-sonnet-5-5 — Agent lp-validator (A-VAL) — Skills sk-protocol, sk-recount, debug-verification, lp-validate
# CAM-B2p-J-PC-VAL : validation de CAM-B2p-J-PC (PC, Espace rendu à sa fonction pendant le sexe, G-g (2) défait) (2026-10-14)
Verdict global : **PASS** (V5, V6, MD5 et UeState rejoués à neuf, éditeur fermé). Non vérifiés : le comportement en jeu
(V7), le défaut de `SexC3` (hérité de B2p-G, inchangé par cette fiche) et le compte à la main 157 vers 156 de l'IMPL
(remplacé par le dump à la machine). Les écarts de forme de l'IMPL sont listés en § 1.
Copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8` (`git branch --show-current` = `ue5.8`). Aucun asset, code ni doc
validée modifié par la VAL. Seuls fichiers écrits : les 2 sorties de commandlets (§ 3), leurs 2 journaux sous
`Saved\Logs\portage\`, 2 diffs bruts sous `Saved\` (`CAM-B2p-J-PC-VAL_diff_G.txt`, `CAM-B2p-J-PC-VAL_diff_K.txt`, produits
par `git diff --no-index --output=`, dossier ignoré par git) et ce livrable. Aucune commande git qui écrit. Le jeton UE
était tenu par l'orchestrateur ; les commandlets ont tourné un à la fois. Les commandes ont été lancées par des `.ps1` du
scratchpad (`pwsh -NoProfile -File`) : crochet `ecriture-gardien` oblige, pas de `>` ni de tube.
## 1. Fiches amont relues
- `CAM-B2p-J-PC-FICHE.md` (barème, état attendu, écritures 1 à 5, amendement B2p-J-PC-a l. 44-50, VAL V5 / V6, retour
arrière) : relue en entier.
- `CAM-B2p-J-PC-IMPL.md` (agent lp-mcp-bp, modèle déclaré claude-opus-5-5, `Tours : 36 / 60` déclaré, 15 au premier passage
et 21 à la reprise) : relue en entier. Gabarit IMPL de `lp-doc` : les 6 sections numérotées sont présentes et dans l'ordre
(1 Fichiers modifiés, 2 Écarts, 3 Instantané, 4 Ce qui n'a pas été fait, 5 Points à confirmer, 6 Fichiers à commiter),
plus `Reprise` (insérée après la section 3), `Mesuré` et `Constats`. `Reprise` est hors gabarit et n'est pas annoncée en
tête (`Hors gabarit : <motif>` absent) : écart de forme mineur, le même que B2p-G. « Modèle prévu non précisé par la
fiche » : même écart de forme que B2p-G, non bloquant. Le nombre de tours (36) est celui de l'agent ; `FicheStats.py`
fait foi et n'a pas été rejoué ici.
- `CAM-B2p-G-PC-VAL.md` : modèle de forme et source des références.
- Références de dump et de compilation : `CAM-B2p-G-PC-VAL_LPDumpFunction_20261014-135527.txt` (1447 nœuds),
`CAM-B2kmn-VAL_LPDumpFunction_20261014-011816.txt` (avant G, 1439 nœuds),
`CAM-B2p-G-PC-VAL_CompileAllBlueprints_20261014-135635.txt` (code 3).
- Instantané d'avant : `D:\Game\LifePlay_Backup_5.5\CAM-B2p-J-PC\manifest.csv` relu : une ligne, `Content\BPs\PC.uasset`,
3424059 octets, MD5 `B07F16A9EC04CA297A8504F126D406E1`, 2026-10-14T15:21:31.
- Recoupe de 3 citations de l'IMPL : journal de l'éditeur `…\CAM-B2p-J-PC-editeur_20261014-152203.log` ligne 2314 =
`LogFileHelpers: Saving Package: /Game/BPs/PC` (une seule ligne `Saving Package` dans tout le journal) ; 16 lignes
`Dispatching toolset tool` (= 16 appels MCP annoncés) ; taille et date du PC (3420303 octets, 15:27:09) : conformes.
## 2. Points à confirmer des IMPL
| Id | Point (IMPL § 5, fiche) | Verdict | Preuve |
|---|---|---|---|
| J-1 | V5 : dump du PC contre `…G-PC-VAL_LPDumpFunction_20261014-135527.txt` ; seules différences : 1447 vers 1445 nœuds (sans `IfThenElse_134` ni `CallFunction_408`), `40.then` vers 277, `22.SexOn` vers 15 seul | **PASS** | § 3.2 : 37 hunks, 6 de corps tous classés, 31 d'en-tête sans nœud ; EventGraph 1445 (en-tête l. 121 et l. 6509) ; `Grep IfThenElse_134|CallFunction_408|VariableGet_387` sur le nouveau dump : 0 occurrence |
| J-2 | V5 : la voie d'Espace (40 vers 277) identique à `CAM-B2kmn-VAL_LPDumpFunction_20261014-011816.txt` | **PASS** | § 3.3 : aucun hunk du diff contre la référence d'avant G sur 63, 40, 277, `VariableSet_0` ni `VariableGet_22` ; lignes relues côte à côte |
| J-3 | V6 : `CompileAllBlueprints` égal à `…G-PC-VAL_CompileAllBlueprints_20261014-135635.txt` | **PASS** | § 3.4 : code 3, 25 lignes / 16 signatures d'erreur, 55 / 42 d'avertissement identiques, 420 réussies, 421 chargements, PC compilé sans erreur ni avertissement |
| J-4 | MD5 du PC sur disque, éditeur fermé : `707220A6794E8E5469DD8F84437720CD` | **PASS** | § 3.1 (avant) et § 3.5 (après) ; Room, GI, Person inchangés |
| J-5 | Comptes 157 vers 156 des appels 7 et 9 de l'IMPL, faits à la main ; seule l'absence de `IfThenElse_134` est établie | **Reporté** | éditeur fermé, `find_nodes` non rejouable. Remplacé par le dump à la machine : absence de 134 et 408 prouvée (J-1) et 1445 = 1447 − 2. Les 157 / 156 eux-mêmes ne sont pas rejoués |
| J-6 | Effet (estimé par l'IMPL) : Espace vers `PlayClick` puis `GamePaused = NOT GamePaused`, sans branche sur `SexOn` | **PASS-STATIC** | chaîne lue au dump : § 3.3. L'équivalence avec la voie d'avant G est établie par l'identité des lignes avec la référence ; le jeu n'est pas rejoué (V7) |
## 3. Critères rejoués
Environnement : éditeur fermé ; moteur `D:\Game\Launcher\Engine\UE_5.8`. `.\Tools\UeState.ps1` relevé à l'entrée, avant
V5, après V5, avant V6, après V6 et à la fin (via `entree.ps1`, `v5.ps1`, `v6.ps1`, `v6cmp.ps1`) :
`processus=0 editeur=0 compilation=0 shaders=0 jeu=0` à chaque relevé (UeState = 0 partout). V6 a démarré après la fin de
V5.
### 3.1 MD5 de départ (avant tout lancement) : **PASS**
```
$ pwsh -NoProfile -File entree.ps1 (Get-FileHash -Algorithm MD5, taille, date)
707220A6794E8E5469DD8F84437720CD Content\BPs\PC.uasset 3420303 2026-10-14 15:27:09
931387479E2D15F80BC4F36398907712 Content\BPs\Room.uasset 6428769 2026-10-14 10:07:40
32FC0A970AB194626E8DC07DF3A9633D Content\BPs\GI.uasset 52686555 2026-10-14 10:33:14
8668A47C627F7A5254910CF0AC33B12A Content\BPs\Person.uasset 20821244 2026-10-13 17:42:36
processus=0 editeur=0 compilation=0 shaders=0 jeu=0 (exit UeState = 0)
```
Attendu : PC `707220A6…` (avant : `B07F16A9…`), Room `93138747…`, GI `32FC0A97…`, Person `8668A47C…` : conforme.
### 3.2 V5 PC (dump) : **PASS**
Commande (`v5.ps1`, `Set-Location` sur la copie, `UeState` = 0 vérifié avant) :
```
.\Tools\RunCommandlet.ps1 -Lot CAM-B2p-J-PC-VAL -Commandlet LPDumpFunction -Args "-BP=PC -Fn=EventGraph -Pins -Exec" -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\CAM"
code=0 duree=57s erreurs=0 avertissements=6438
resume : D:\Game\LifePlay-master 5.8\Docs\Migration\etat\CAM\CAM-B2p-J-PC-VAL_LPDumpFunction_20261014-153047.txt
journal : D:\Game\LifePlay-master 5.8\Saved\Logs\portage\CAM-B2p-J-PC-VAL_LPDumpFunction_20261014-153047.log
```
Trace : `CAM-B2p-J-PC-VAL_LPDumpFunction_20261014-153047.txt` — Fiche CAM-B2p-J-PC-VAL — 2026-10-14 15:30-15:31.
Environnement : copie 5.8, branche `ue5.8`, éditeur fermé, PC `707220A6…`.
Attendu (écrit avant lancement, d'après la fiche et la demande) : code 0 ; EventGraph 1445 nœuds ; ni
`IfThenElse_134` ni `CallFunction_408` ; `40.then` vers `CallFunction_277` ; `277.execute` venant de `40.then` seul ;
`VariableGet_22.SexOn` vers `IfThenElse_15.Condition` seul ; `CallFunction_35` présent sans lien ; G-d (`SexC3`, 132, 133,
385, 386, 39, 58) et coupures G-g (1) inchangés ; rien d'autre.
Obtenu : code 0, 0 erreur ; les « 6438 avertissements » sont le dump lui-même (canal `LogLPDump: Warning`), pas des
diagnostics. Pied : `Success - 0 error(s), 6388 warning(s)` (référence G : 6397, soit −9 = 4 lignes du nœud 408 + 5 du nœud
134).
Lecture : le fichier contient deux copies du dump (journal complet l. 121 à 6508, puis écho stdout tronqué l. 6509 à 6558 à
13 nœuds) ; le recompte retranche l'écho.
**Recompte indépendant des nœuds** (autre méthode que l'en-tête du dump) :
| Élément | Référence G | Nouveau | Méthode | Verdict |
|---|---|---|---|---|
| En-tête `=== PC :: EventGraph (… noeuds) ===` | 1447 | 1445 (l. 121 et l. 6509) | `Grep noeuds\)` | −2 = attendu |
| Lignes de nœud `K2Node_` (deux copies) | 1460 | 1458 | `Grep` en comptage de `^(LogInit: Display: )?LogLPDump: Warning: K2Node_` | −2 |
| Moins l'écho tronqué (13 nœuds : `Event_0`, `Self_0`, `CallFunction_126`, `CreateWidget_4`, `VariableGet_2454`, `VariableSet_23`, `InputAction_6`, `IfThenElse_582`, `VariableSet_148`, `VariableGet_188`, `CallFunction_1067`, `CallFunction_1068`, `IfThenElse_316`) | −13 | −13 (comptés par `Read` l. 6510 à 6558) | lecture | 1445 confirmé (1458 − 13) |
**Diff contre G** : `git diff --no-index --unified=0 CAM-B2p-G-PC-VAL_LPDumpFunction_20261014-135527.txt CAM-B2p-J-PC-VAL_LPDumpFunction_20261014-153047.txt --output=Saved\CAM-B2p-J-PC-VAL_diff_G.txt` (depuis le dossier `etat\CAM`).
Bilan brut (`--stat`) : `1 file changed, 67 insertions(+), 76 deletions(-)` ; diff de 184 lignes ; **37 hunks** (`Select-String '^@@'` = 37 ; `Grep -o '^@@'` = 37 en-têtes énumérés). Répartition par numéro de ligne de début de hunk du fichier de référence :
- **31 hunks d'en-tête** (diff l. 5 à 157 ; lignes 1 à 108 de la référence : date, durée, journal, BOM de la 1re ligne, histogramme « Avertissements : 6447 vers 6438 lignes, 4785 vers 4779 signatures (100 premieres) », classement des signatures réordonné) : bruit de l'histogramme, aucun ne touche un nœud. Équilibre : 61 insertions et 61 suppressions (total moins le corps).
- **6 hunks de corps et de pied** (EventGraph), tous classés ci-dessous : 6 insertions, 15 suppressions.
- Total : 61 + 6 = 67 insertions, 61 + 15 = 76 suppressions, 31 + 6 = 37 hunks : égal au `--stat` et au comptage des `@@`.
Les 6 hunks de corps (lignes du **nouveau** fichier) :
| Réf. l. | Nœud / broche | Avant (G) vers après (J) | Attendu |
|---|---|---|---|
| 121 | en-tête EventGraph | `1447 noeuds` vers `1445 noeuds` | 2 nœuds en moins |
| 987 | `VariableGet_22.SexOn` | `IfThenElse_15.Condition, IfThenElse_134.Condition` vers `IfThenElse_15.Condition` | 22 vers 15 seul |
| 1549 | `IfThenElse_40.then` (l. 1546-1550 : execute ← `63.else`, Condition ← `CallFunction_125`, else → `41`) | `IfThenElse_134.execute` vers `CallFunction_277.execute` | `40.then` vers 277 |
| 4424 | `CallFunction_277.execute` (`PlayClick`) | `IfThenElse_134.else` vers `IfThenElse_40.then` | 277 venant de 40 seul |
| 6509 (nouveau) | fin du journal : nœuds `CallFunction_408` (4 lignes) et `IfThenElse_134` (5 lignes) | supprimés (−9 lignes), plus la ligne d'écho `(1447 noeuds)` vers `(1445 noeuds)` | 134 et 408 absents |
| 6568 vers 6559 | pied `Success - 0 error(s)` | `6397` vers `6388 warning(s)` | −9 = lignes des 2 nœuds |
Total : 6 insertions (1 par hunk), 15 suppressions (1 + 1 + 1 + 1 + 10 + 1).
Rien d'autre : aucun hunk sur `IfThenElse_23`, `IfThenElse_44`, `IfThenElse_123`, `IfThenElse_15`, `IfThenElse_10`, `CallFunction_35`, `IfThenElse_63`, `CustomEvent_5`, `CustomEvent_11`, ni sur les nœuds 132, 133, 385, 386, 39, 58. Nœud `CallFunction_35` : l. 3008-3011 `execute (vide)`, `then (vide)`, `self (vide)` (présent, sans lien).
Lecture directe des lignes G-d et G-g (1) dans le nouveau dump (confirme l'absence de hunk) :
| Lien | Lu |
|---|---|
| `23.then` vers `132` | l. 1727 |
| `132` : Condition ← `VariableGet_385.SexC3` ; then → `VariableSet_39` ; else → `133` | l. 6482-6485 |
| `39` : `SexC3 = 'false'`, then → `44.execute` | l. 6489-6494 |
| `133` : Condition ← `VariableGet_386.POVOn` ; then → `44.execute` ; else → `58` | l. 6495-6499 |
| `58` : `SexC3 = 'true'`, then vide | l. 6503-6508 |
| `44.execute` ← `CustomEvent_5.then`, `VariableSet_39.then`, `IfThenElse_133.then` | l. 1738 |
| coupure `123.then` (vide) ; `15.then` (vide) ; `35.execute` (vide) ; `10.execute` ← `CustomEvent_11.then` seul | l. 829, 992, 3009, 3022 |
| `15` : execute ← `19.then` ; Condition ← `22` ; else → `160` | l. 989-993 |
### 3.3 V5, voie d'Espace contre la référence d'avant G : **PASS**
Référence : `CAM-B2kmn-VAL_LPDumpFunction_20261014-011816.txt`. Commande :
`git diff --no-index --unified=0 CAM-B2kmn-VAL_LPDumpFunction_20261014-011816.txt CAM-B2p-J-PC-VAL_LPDumpFunction_20261014-153047.txt --output=Saved\CAM-B2p-J-PC-VAL_diff_K.txt`.
Bilan brut : `102 insertions(+), 74 deletions(-)`, diff de 216 lignes, **36 hunks**. Hunks de corps (diff l. 162 à 216, lus en entier) : 9, tous classés : en-tête EventGraph (1439 vers 1445), les coupures G-g (1) (829, 992, 3009, 3022), `23.then` vers 132 (1727), `44.execute` (1738), le bloc des 6 nœuds G-d (28 lignes ajoutées l. 6481, +29 −1 avec la ligne d'écho) et le pied (6360 vers 6388, +28 = 5 + 3 + 6 + 5 + 3 + 6). Corps : 37 insertions, 9 suppressions. Hunks d'en-tête : 27 (36 − 9, déduit), 65 insertions et 65 suppressions (102 − 37 et 74 − 9, équilibre).
**Aucun hunk** sur `IfThenElse_63`, `IfThenElse_40`, `CallFunction_277`, `VariableSet_0` ni `VariableGet_22`. Lignes relues dans les deux fichiers (mêmes numéros), identiques mot pour mot :
```
VariableGet_22 (l. 986-988) SexOn -> IfThenElse_15.Condition ; self -> VariableGet_6044.GI
VariableSet_0 (l. 1517-1522) execute <- CallFunction_277.then ; then -> CallFunction_112.execute ; GamePaused <- CallFunction_75.ReturnValue ; self <- VariableGet_2873.GI
IfThenElse_40 (l. 1546-1550) execute <- IfThenElse_63.else ; Condition <- CallFunction_125.ReturnValue ; then -> CallFunction_277.execute ; else -> IfThenElse_41.execute
IfThenElse_63 (l. 3855-3859) execute <- InputAction_3.Pressed ; Condition <- VariableGet_175.BuilderOn ; then (vide) ; else -> IfThenElse_40.execute
CallFunction_277 (l. 4423-4426) execute <- IfThenElse_40.then ; then -> VariableSet_0.execute ; self (vide)
```
La voie d'Espace (`InputAction_3` → 63.else → 40.then → `PlayClick` → `VariableSet_0` `GamePaused`) est donc **identique** à celle d'avant G, `277.execute` venant de `40.then` seul (aucune autre source dans le dump) et `22.SexOn` revenu à `15.Condition` seul. Non vérifié : le contenu de `CallFunction_75` (la bascule) : hors diff, identique à la référence (aucun hunk).
### 3.4 V6 CompileAllBlueprints : **PASS**
Attendu (écrit avant lancement, d'après la référence G) : code 3 ; 25 lignes d'erreur / 16 signatures ; 55 lignes d'avertissement / 42 signatures ; toutes `CR_FaceExpRig` / `RLExpStruct` (moteur) ; `Compiling Completed with 3 errors and 0 warnings and 0 blueprints that failed to load` ; 420 compilations réussies ; 421 lignes `Loading and Compiling` ; PC compilé sans erreur ni avertissement.
```
.\Tools\RunCommandlet.ps1 -Lot CAM-B2p-J-PC-VAL -Commandlet CompileAllBlueprints -EtatDir "D:\Game\LifePlay-master 5.8\Docs\Migration\etat\CAM"
code=3 duree=198s erreurs=25 avertissements=55
resume : D:\Game\LifePlay-master 5.8\Docs\Migration\etat\CAM\CAM-B2p-J-PC-VAL_CompileAllBlueprints_20261014-153243.txt
journal : D:\Game\LifePlay-master 5.8\Saved\Logs\portage\CAM-B2p-J-PC-VAL_CompileAllBlueprints_20261014-153243.log
```
Trace : Fiche CAM-B2p-J-PC-VAL — 2026-10-14 15:32-15:36. Lecture : code 3 est le code de la référence (le moteur compte les 3 erreurs de `CR_FaceExpRig`), pas un échec nouveau.
| Élément | Référence G | J rejoué | Méthode | Verdict |
|---|---|---|---|---|
| Code de sortie | 3 | 3 | RunCommandlet | identique |
| Lignes d'erreur / signatures | 25 / 16 | 25 / 16 | en-tête du résumé (l. 6) | identique |
| Lignes d'avertissement / signatures | 55 / 42 | 55 / 42 | `erreurs=25 avertissements=55` de RunCommandlet | identique |
| Lignes 5 à 81 des résumés (blocs Erreurs et Avertissements) | — | — | `Compare-Object` (comparaison par multiensemble) | seules différences : les 2 lignes de ligne de commande (nom du journal) ; mêmes signatures, mêmes comptes. L'ordre des signatures à comptes égaux varie (ex. `ModeIndexConversion` / `GetMinCurveValue`) : bruit de tri |
| `Compiling Completed with …` | `3 errors and 0 warnings and 0 blueprints that failed to load` (journal l. 3302) | même texte (journal l. 3303) | `Select-String` des deux journaux | identique (décalage d'une ligne : une ligne `Compacting FUObjectHashTables` de plus, § Constats) |
| Compilations réussies | 420 | 420 | comptage de `La compilation de .* a r.ussi` (journal) | identique |
| Lignes `Loading and Compiling` | 421 | 421 | comptage | identique (421 = 420 + `CR_FaceExpRig` en erreur) |
| Ensemble des BP compilés (nom + chemin) | 420 | 420 | `Compare-Object` des lignes normalisées (horodatage et durée retirés) | mêmes 420 BP ; seules différences : les durées au-dessus de 1 000 ms (séparateur de milliers non normalisé) |
| `PC` | `La compilation de PC a réussi ! (/Game/BPs/PC.PC)` (journal l. 2021) | même ligne (journal l. 2021) | `Select-String` | **PC sans erreur ni avertissement** |
| Lignes `Error:` / `Warning:` citant `PC`, `SexC3`, `IfThenElse_13x`, `CallFunction_408` | 0 | 0 | `Where-Object` sur le journal | aucune |
Journaux complets comparés après normalisation (horodatage, durées, GUID, numéros d'index) : 3396 lignes (G) contre 3397 (J) ; 75 lignes différentes (38 côté J, 37 côté G), toutes lues : en-tête et pied de journal (`Log file open/closed`, pid, `CrashGUID`, mémoire), cache Zen / DDC (latence, maintenance), registre d'assets (nom du cache), ordre des scripts Python de démarrage, lignes `Compacting FUObjectHashTables` (2,3 à 15 ms), durée du commandlet. Aucune ligne de compilation, d'erreur ou d'avertissement.
Limite : les 6 durées au-dessus de 1 000 ms ne sont pas normalisées par mon script ; elles ne sont pas un critère. Le contenu des blocs d'erreur est lu par `Compare-Object` et non ligne à ligne à l'œil.
### 3.5 MD5 et UeState après les commandlets : **PASS**
```
$ pwsh -NoProfile -File v6cmp.ps1 (relevé après V5 et V6)
707220A6794E8E5469DD8F84437720CD Content\BPs\PC.uasset 3420303 2026-10-14 15:27:09
931387479E2D15F80BC4F36398907712 Content\BPs\Room.uasset 6428769 2026-10-14 10:07:40
32FC0A970AB194626E8DC07DF3A9633D Content\BPs\GI.uasset 52686555 2026-10-14 10:33:14
8668A47C627F7A5254910CF0AC33B12A Content\BPs\Person.uasset 20821244 2026-10-13 17:42:36
processus=0 editeur=0 compilation=0 shaders=0 jeu=0
```
Identiques au § 3.1, taille et date comprises : les commandlets n'ont rien écrit dans ces 4 assets. `git status --short -- Content/BPs Content/UI` : `GI`, `PC`, `Person`, `Room` et `TopRight` en `M` (lots antérieurs non commités, comme avant la fiche), aucun autre fichier de ces dossiers. `Tools/RunCommandlet.ps1` : 3782 octets, 2026-10-09 16:14:51 (non modifié par le lot).
## 4. Diff lu en entier
- Diffs de dump : deux diffs lus en entier (184 lignes contre G, 37 hunks ; 216 lignes contre l'état d'avant G, 36 hunks pour le corps lu et 27 d'en-tête déduits), classés au § 3.2 et § 3.3. Recompte indépendant : `--stat` (67 / 76 et 102 / 74), `@@` (37 et 36), nombre de nœuds par l'en-tête (1445) et par les lignes `K2Node_` moins l'écho (1458 − 13), absence de 134 / 408 / 387 par `Grep` (0).
- Diff de V6 : § 3.4 (résumés, journaux normalisés) : aucune différence de contenu.
- Fichier du dépôt modifié par le lot : `Content/BPs/PC.uasset` seul (binaire, non lisible en diff texte ; son contenu est validé par le dump) ; instantané et MD5 de l'IMPL recoupés (§ 1, § 3.1). Room, GI, Person : MD5 inchangés.
- Fins de ligne : sans objet : aucun fichier texte du jeu modifié par le lot en dehors de livrables Markdown neufs ; `PC.uasset` est binaire.
- Inventaire des ajouts non demandés : `Get-ChildItem CAM-B2p-J-PC*` dans `etat\CAM` avant écriture de ce livrable = FICHE, IMPL et les 2 sorties de commandlets ; aucun autre fichier du lot.
## 5. Verdict
**PASS** : V5 (1445 nœuds = 1447 − 2, `IfThenElse_134` et `CallFunction_408` absents, `40.then` vers 277, `277.execute` venant de 40 seul, `22.SexOn` vers 15 seul, `CallFunction_35` présent sans lien, G-d et G-g (1) inchangés, aucune autre différence), voie d'Espace identique à la référence d'avant G, V6 (= référence G, PC sans erreur ni avertissement), MD5 (PC `707220A6…` ; Room, GI, Person inchangés, avant et après), UeState = 0 à tous les relevés.
Non rejoué ou non vérifié : comportement en jeu (V7 : Espace pendant le sexe, Alt bref et clic molette en C++), `LogStats`, défaut de `SexC3` (hérité de G, non touché), export orphelin éventuel dans `PC.uasset`, comparaison octet à octet de `PC.uasset` avec l'instantané, comptes 157 / 156 de l'IMPL (J-5), contenu de `CallFunction_75`, autres graphes du PC, compilation du C++ de J4 (hors fiche : « Ne pas compiler le C++ »).
## 6. Points à confirmer par l'utilisateur
- [ ] V7 en jeu (build empaqueté contenant le C++ J4 et le PC `707220A6…`) : pendant le sexe, Espace joue `PlayClick` puis met en pause / reprend comme hors du sexe ; Alt bref et le clic molette ouvrent le panneau des positions ; les clics courts gauche et droit ne le basculent pas.
- [ ] `LogStats` en jeu sans `Accessed None` nouveau sur le PC. Lecture statique : le PC perd une lecture de `GI` (`134.Condition` ← `VariableGet_22`) ; `22` reste lu par `15` seul ; aucune lecture nouvelle.
- [ ] Défaut de `SexC3` = faux (point ouvert de B2p-G, non touché ici) : lecture du CDO du PC à l'ouverture de l'éditeur, ou effet en jeu.
## Fichiers à commiter
Aucun fichier du jeu modifié par la VAL. Livrables à ranger par le gardien (dépôt du jeu, branche `ue5.8`, sous `etat/`) :
- A `Docs/Migration/etat/CAM/CAM-B2p-J-PC-VAL.md`
- A `Docs/Migration/etat/CAM/CAM-B2p-J-PC-VAL_LPDumpFunction_20261014-153047.txt`
- A `Docs/Migration/etat/CAM/CAM-B2p-J-PC-VAL_CompileAllBlueprints_20261014-153243.txt`
- (déjà annoncés par l'IMPL : M `Content/BPs/PC.uasset`, A `Docs/Migration/etat/CAM/CAM-B2p-J-PC-IMPL.md`)
- Non à commiter : `Saved/CAM-B2p-J-PC-VAL_diff_G.txt`, `Saved/CAM-B2p-J-PC-VAL_diff_K.txt` et les journaux `Saved/Logs/portage/` (dossier ignoré par git).
Tours : 15 / 40
## Constats
- Les deux fichiers de sortie de cette VAL n'ont plus de BOM UTF-8 (premiers octets `43 6F 6D`) alors que les références G en ont un (`EF BB BF`) : c'est le premier hunk du diff de dump et de résumé. `Tools/RunCommandlet.ps1` n'a pas changé depuis le 2026-10-09 ; cause estimée : G a été lancé par `powershell` 5.1 (BOM par défaut), cette VAL par `pwsh` 7 (sans BOM). Sans effet sur les résultats ; à retenir si un diff octet à octet de traces est attendu.
- Le dump contient deux copies de l'EventGraph (journal complet, puis écho stdout tronqué à 13 nœuds). Un comptage de lignes `K2Node_` donne 1458 ici (1460 pour G) : retrancher les 13 de l'écho.
- Le résumé de `CompileAllBlueprints` trie les signatures à comptes égaux dans un ordre qui change d'un lancement à l'autre ; une comparaison ligne à ligne donne de faux écarts, une comparaison par multiensemble (`Compare-Object`) non.
- Le journal de `CompileAllBlueprints` de J a une ligne de plus que celui de G (3397 contre 3396), due aux lignes `LogUObjectHash: Compacting …` qui varient ; elle décale d'un cran le numéro de la ligne `Compiling Completed`.
- Crochet `ecriture-gardien` : aucune redirection ni tube utilisés ; toutes les lectures par Read / Grep, les mesures par `.ps1` du scratchpad lancés avec `pwsh -NoProfile -File` (aucun refus rencontré).
- Écarts de forme de l'IMPL (non bloquants) : section `Reprise` hors gabarit non annoncée ; « Modèle prévu non précisé par la fiche ».