LifePlay-Revival/Docs/Migration/etat/CAM/CAM-B2p-J-PC-VAL.md

203 lines
23 KiB
Markdown
Raw Normal View History

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 ».