LifePlay-Revival/Docs/Migration/etat/OB/OBB/OBB-T3-VAL.md

115 lines
17 KiB
Markdown
Raw Normal View History

Fiche OBB-T3v — Niveau N1 — Modèle prévu modèle de l'agent lp-validator | utilisé Sonnet 5.5 (claude-sonnet-5-5) — Agent lp-validator — Skills sk-protocol, sk-recount, debug-verification, lp-validate (préchargés), lp-doc (gabarit VAL lu)
# OBB-T3-VAL : validation de `Tools\CheckPackage.ps1` et de ses deux appels (`BuildDebug.ps1`, `SplitModules.ps1`) (2026-10-10)
Copie `D:\Game\LifePlay-master 5.8`, branche `ue5.8`, HEAD `b63196a`, tag de départ `OBB-avant`. Entrée contrôlée avant tout
essai : `git status --short -- Tools` = exactement `M Tools/BuildDebug.ps1`, `M Tools/SplitModules.ps1`, `?? Tools/CheckPackage.ps1` ;
MD5 de `CheckPackage.ps1` = `7173F917718C206DD6750064AC1A224F` (attendu) ; contrôlés de nouveau en fin de session : identiques
(aucune modification concurrente, pas d'arrêt). Rien n'a été écrit dans `Tools`, les builds, le projet ; aucune date de fichier
réelle modifiée ; ni Unreal, ni UAT, ni UBT lancés ; `BuildDebug.ps1` et `SplitModules.ps1` réels non lancés.
Scratchpad (abrégé `SCR\`) : `%USERPROFILE%\AppData\Local\Temp\claude\D--Game-LifePlay-master-5-8\0b6366db-34d6-4803-8aee-2e309785cb38\scratchpad\obb-t3v\`
(sorties : `u8.txt`, `dc4_p55.txt`, `dc4.txt`, `ap7.txt`, `absent.txt`, `fixtures_out.txt`, `split_out.txt` ; scripts d'essai
`fixtures.ps1`, `split.ps1`, `parse.ps1` ; faux builds `fake\`, `splitfake\`).
## 1. Fiches amont relues
- `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\OB\OBB\OBB-T3-IMPL.md` : lu en entier (§ 1 à 6, Constats 1 à 6).
- `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\OB\OBA\OBA-T5-EVAL.md` l. 89-98 (exigence B3 : 4 contrôles, preuve par l'échec attendue) : lu.
- `Tools\CheckPackage.ps1` (228 lignes) : lu en entier ; `Tools\SplitModules.ps1` et `Tools\BuildDebug.ps1` : lus en entier.
- Autres livrables OBB (T1, T1a, INT) : non utilisés par cette fiche, non relus.
- Le livrable amont suit le gabarit IMPL : sections 1 à 6 présentes dans l'ordre (Fichiers modifiés, Écarts à la SPEC, Instantané, Ce qui n'a pas été fait, Points à confirmer en VAL, Fichiers à commiter), ligne `Tours` et `## Constats` présentes. Aucun écart de gabarit.
## 2. Points à confirmer des IMPL
| # | Point (IMPL § 5) | Résultat | Preuve |
|---|---|---|---|
| P1 | U8 `-Config Shipping` : [1] FAIL 142, [2] FAIL 1, [3]/[4] NON-CONCLUANT « autre date 2026-10-09 20:08:50 contre 17:56:48 (meme taille 164823552 o) », code 1 | **PASS** | `SCR\u8.txt`, rejoué : `[1] FAIL 142`, `[2] FAIL 1` (l. 958 `RemappedPlugins/LPSandbox/LPSandbox.uplugin`), `[3]`/`[4]` NON-CONCLUANT avec le motif exact, `CODE=1`. Recompté autrement : Grep (count) `Modules/.git` à l'anchre `^LifePlay/Content/Modules/\.git(/|\t)` dans le manifeste NonUFS d'U8 = 142 ; Grep `LPSandbox` dans le manifeste UFS d'U8 = 1 |
| P2 | DC4 `-ProjectRoot …5.5` : 4 PASS code 0 ; sans `-ProjectRoot` : [1]/[2] PASS, [3]/[4] NON-CONCLUANT « autre taille 330207744 o … 291694592 o », code 2 | **PASS** | `SCR\dc4_p55.txt` : `[1]`..`[4]` PASS 0, `CODE=0`. `SCR\dc4.txt` : `[1]`/`[2]` PASS, `[3]`/`[4]` NON-CONCLUANT « exe du projet d'une autre taille : 330207744 o (2026-10-10 09:57:34) contre 291694592 o archive : autre build », `CODE=2` |
| P3 | Règle (c), 10 min : relue dans `Get-StaleReason`, non exercée par un cas réel | **PASS** (lecture + copie jetable) | Lecture : `CheckPackage.ps1:117-121` (`$after = ($t - $proj.LastWriteTimeUtc).TotalMinutes` ; `-gt $MaxAfterExeMinutes` (10) → motif « fichier posterieur… »). Copie jetable : voir § 3, cas `ok_plus9` (+9 min → PASS), `late_plus11` (+11 min → NON-CONCLUANT « posterieur de 11,0 min »), `late_plus11_dirty` (+11 min avec contenu fautif → NON-CONCLUANT, pas FAIL, compte lu 1 « non retenu »), `early_minus30` (avant l'exe → PASS). Borne exacte 10,0 min non essayée |
| P4 | AP7 + projet 5.5 : [2], [3], [4] FAIL | **PASS** | `SCR\ap7.txt` : `[1] PASS 0`, `[2] FAIL 2`, `[3] FAIL 1` (l. 619, `LPAnimMeasure\Module.LPAnimMeasure.cpp.obj`), `[4] FAIL 1` (l. 3707 `"LPSandbox",`), `CODE=1`. Recompté : Grep `LPAnimMeasure` dans le `.rsp` Shipping 5.5 = 1 ; Grep `LPSandbox` dans le `.target` 5.5 = 2 lignes (l. 3538 chemin `Path` hors section, l. 3707 dans `BuildPlugins` l. 3614-…) : le script en compte 1 → il lit bien la section et pas tout le fichier |
| P5 | `ParseFile` = 0 erreur sur les 3 scripts | **PASS** | `SCR\parse.ps1` : `CheckPackage.ps1 errors=0`, `BuildDebug.ps1 errors=0`, `SplitModules.ps1 errors=0` |
| P6 | `git diff --stat -- Tools` = 2 fichiers, 13 insertions ; `git status` = 2 `M` + 1 `??`, rien d'autre | **PASS** | `git diff --stat -- Tools` : `BuildDebug.ps1 | 6 ++++++`, `SplitModules.ps1 | 7 +++++++`, `2 files changed, 13 insertions(+)` ; `git status --short -- Tools` : 3 lignes attendues (relevé au début et à la fin) |
| P7 | Fins de ligne : BuildDebug CRLF (96/96), SplitModules LF (0), CheckPackage LF, ASCII | **PASS** | Comptage d'octets (`parse.ps1`, pas `grep -c`) : `CheckPackage.ps1` CR=0 LF=228 non-ASCII=0 ; `BuildDebug.ps1` CR=96 LF=96 ; `SplitModules.ps1` CR=0 LF=167. Versions `OBB-avant` (`git show OBB-avant:Tools/<f>`) : BuildDebug CR=90 LF=90, SplitModules CR=0 LF=160 : style inchangé (CRLF / LF), +6 lignes et +7 lignes |
| P8 | Aucune écriture dans les builds, `Intermediate`, `Binaries` : dates inchangées | **PASS** | Les dates affichées aux rejouages (exe projet 5.8 Shipping 2026-10-09 20:08:50 ; exe Development 5.8 2026-10-10 09:57:34 ; exe 5.5 DC4 2026-10-07 20:13:28) sont celles de l'IMPL ; le script ne contient aucun appel d'écriture (lu en entier : seuls `Get-Item`, `ReadLines`, `Write-Host`) |
| P9 | Écarts 1, 2, 4 : code relu = `exit 3` dans le `catch`, `Write-Warning` sur 2 et `throw` sur 1 / 3 dans `SplitModules.ps1`, repli `WindowsNoEditor` | **PASS** | Lecture : `CheckPackage.ps1:225-228` (`catch` → `exit 3`) ; `SplitModules.ps1:43-44` (`-eq 2` → `Write-Warning`, `-ne 0` → `throw`) ; `CheckPackage.ps1:139-142` (repli). Exécutés sur copie jetable (§ 3) : code 3 (`nowin`, `twoexes`), repli (`winnoeditor` PASS code 0), warning (S2), throw (S1, S3) |
| P10 | Premier passage réel par `BuildDebug.ps1` : 4 PASS attendus pour [2]-[4], [1] FAIL tant que P1 non appliqué | **reporté** (prochain build de la file du Big Boss) | Non rejouable ici (UAT interdit). Prévision cohérente avec `STC_Development` : `[1] FAIL 142`, `[2]`..`[4]` PASS 0, code 1 (rejoué, § 3) |
## 3. Critères rejoués (commande → résultat)
Commande de base : `pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Tools\CheckPackage.ps1" <arguments>` ; les essais complexes sont dans
des .ps1 du scratchpad (sk-windows-shell).
**3.1 Réels (builds du poste, lecture seule)**
| Essai | Arguments | [1] | [2] | [3] | [4] | Code |
|---|---|---|---|---|---|---|
| U8 | `-Build …5.8_Shipping_U8 -Config Shipping` | FAIL 142 (+ disque : dossier) | FAIL 1 | NON-CONCLUANT (autre date) | NON-CONCLUANT (autre date) | **1** |
| DC4 + 5.5 | `-Build …5.5_DC4 -ProjectRoot '…5.5'` | PASS 0 | PASS 0 | PASS 0 | PASS 0 | **0** |
| DC4 sans `-ProjectRoot` | `-Build …5.5_DC4` | PASS 0 | PASS 0 | NON-CONCLUANT (autre taille) | NON-CONCLUANT (autre taille) | **2** (la fiche écrivait « code 2 » : conforme) |
| AP7 + 5.5 | `-Build …5.5_Shipping_AP7 -ProjectRoot '…5.5'` | PASS 0 | FAIL 2 | FAIL 1 | FAIL 1 | **1** |
| STC_Development | `-Build …5.8_STC_Development` | FAIL 142 | PASS 0 | PASS 0 | PASS 0 | **1** |
| DebugGame 5.5 | `-Build …5.5_DebugGame -ProjectRoot '…5.5'` | PASS 0 | PASS 0 | PASS 0 | PASS 0 | **0** |
| Build inexistant | `-Build D:/Game/LifePlay_Build_inexistant` | — | — | — | — | **3** (« controle impossible : Impossible de trouver le chemin d'accès… ») |
Les « 4 PASS » de DC4/DebugGame ne sont pas un résultat vide suspect : les mêmes contrôles rendent FAIL sur U8, AP7 et STC avec des comptes recomptés (P1, P4).
**3.2 Les 4 contrôles conformes à B3 (`OBA-T5-EVAL.md:94-98`) : lecture du code**
1. `Modules/.git` : manifeste NonUFS par `Find-Lines` (motif `(^|[\\/])Modules[\\/]\.git([\\/]|\s|$)`, `CheckPackage.ps1:169`) **et** disque (`Get-Item … -Force`, l. 163-164, dossier ou fichier) ; FAIL si l'un ou l'autre. Conforme (plus large que la fiche).
2. `LPSandbox` au manifeste UFS (l. 182-188). Conforme.
3. `LPAnimMeasure` au `.rsp` Shipping (l. 191-202), nom par configuration (l. 51-55). Conforme.
4. `LPSandbox` dans `BuildPlugins` : **le script lit la section seulement** (`Find-BuildPlugin`, l. 72-99 : machine à états 0/1/2, entrée exacte `"LPSandbox"` entre `"BuildPlugins": [` et le premier `]`). Preuve sur donnée réelle : le `.target` 5.5 contient 2 occurrences de `LPSandbox` (l. 3538 hors section, l. 3707 dans la section) et le script en compte 1 ; sur copie jetable, `EnabledPlugins` et `Other` contenant `"LPSandbox"` n'ont déclenché aucun FAIL (cas `ok_plus5`), `"LPSandboxFoo"` dans la section non plus (égalité exacte), et `"LPSandbox"` dans la section est relevé, en tableau multiligne comme en ligne unique (`dirty_plus5`, `dirty_oneline`).
Preuve par l'échec attendue sur U8 (`OBA-T5-EVAL.md:98`) : (1) 142 : **rejouée** ; (2) ≥ 1 : **rejouée** (1) ; (3) ≥ 1 et (4) présent : **non rejouables sur U8** (NON-CONCLUANT, `.rsp`/`.target` réécrits après le build, motif exact et vérifié) ; rejoués avec succès sur AP7 5.5 (FAIL 1 / FAIL 1). Cet écart par rapport à l'exigence d'origine est décrit par l'IMPL § 4 et accepté par l'orchestrateur ; il est confirmé ici.
**3.3 Règle des 10 minutes et rattachement, copie jetable** (`SCR\fixtures.ps1`, sorties `SCR\fixtures_out.txt`)
Faux build minimal (exe de 200 o, manifestes sans faute) et faux projet (exe de même taille et même date, `.rsp`, `.target`) dans le scratchpad ; les dates `LastWriteTime` ne sont modifiées que sur ces copies. Exe archivé et exe du projet datés 2026-01-01 12:00:00 sauf mention.
| Cas | Mise en scène | Résultat | Code |
|---|---|---|---|
| `ok_plus5` | `.rsp`/`.target` = exe + 5 min, propres | 4 PASS | 0 |
| `ok_plus9` | + 9 min | 4 PASS | 0 |
| `late_plus11` | + 11 min | [3]/[4] NON-CONCLUANT « fichier posterieur de 11,0 min a l'exe du projet (2026-01-01 12:11:00 contre 12:00:00) : autre build » | 2 |
| `late_plus11_dirty` | + 11 min, `LPAnimMeasure` au `.rsp`, `LPSandbox` dans `BuildPlugins` | [3]/[4] NON-CONCLUANT (« compte lu, non retenu : 1 »), pas de FAIL | 2 |
| `early_minus30` | 30 min avant l'exe | 4 PASS (l'avance n'est pas pénalisée) | 0 |
| `dirty_plus5`, `dirty_oneline` | contenu fautif, + 5 min | [3] FAIL 1 (l. 2), [4] FAIL 1 (l. 8 ; l. 6 en ligne unique) | 1 |
| `gap1s_ok` | exe du projet + 1 s | 4 PASS | 0 |
| `gap3s_nc` | exe du projet + 3 s (même taille) | [3]/[4] NON-CONCLUANT « autre date… relie depuis » | 2 |
| `gitdisk` | `Modules\.git\` dossier sur disque, manifeste sans entrée | [1] FAIL 0 (+ ligne « disque : … present (dossier) ») | 1 |
| `gitentry` | entrée exacte `LifePlay/Content/Modules/.git` au manifeste (cas du `.git` fichier) | [1] FAIL 1 | 1 |
| `winnoeditor` | dossier `WindowsNoEditor` seul | 4 PASS (repli) | 0 |
| `nowin` | pas de dossier `Windows` | « controle impossible : Dossier Windows introuvable… » | 3 |
| `twoexes` | deux exe sans `-Config` | « configuration non deduite : 2 exe… ; preciser -Config » | 3 |
Les cas `ok_plus9` / `late_plus11` encadrent la règle (c) : établi pour 9 et 11 min ; la borne exacte (10,0) ne l'est pas, et la tolérance de 2 s (b) est encadrée par 1 s / 3 s.
**3.4 Branchement de `SplitModules.ps1` : preuve par l'échec sans déplacement** (`SCR\split.ps1`, sortie `SCR\split_out.txt`)
Copie jetable de `SplitModules.ps1` et `CheckPackage.ps1` (copies octet pour octet depuis `Tools`, non modifiées) dans `SCR\splitfake\Tools\` ; faux builds sous `SCR\splitfake\builds\` ; chaque faux build contient un module optionnel `vin_opt` (qui serait déplacé), instantané `chemin + taille` de `builds\` et `out\` avant et après.
| Cas | Faux build | Sortie | Exit | Fichiers avant / après |
|---|---|---|---|---|
| S1 | `Content\Modules\.git\HEAD` sur disque | `[1] FAIL 0 … disque : …\Modules\.git present (dossier)` ; `Resultat : FAIL (code 1)` ; `throw` `SplitModules.ps1:44` « CheckPackage en echec (code 1) : build refuse pour la publication » | 1 | 6 / 6, **inchangé = True** (pas de dossier `_modules_optionnels`, `vin_opt` en place) |
| S3 | aucun exe (code 3) | « controle impossible : configuration non deduite : 0 exe… » ; `throw` « (code 3) : build refuse… » | 1 | 10 / 10, **inchangé = True** |
| S2 | propre, `.rsp`/`.target` absents (NON-CONCLUANT, code 2) | `AVERTISSEMENT : CheckPackage : controle(s) NON-CONCLUANT(S) (voir ci-dessus), publication poursuivie` puis déplacement de `vin_opt`, archive `out\t.zip` | 0 | 15 / 17 (module déplacé, témoin que le garde ne bloque pas à tort) |
Le refus (FAIL et code 3) précède tout déplacement ; le comportement 2 = avertissement, 1 et 3 = refus correspond à la décision de l'orchestrateur.
**3.5 Branchement de `BuildDebug.ps1` : PASS-STATIC**
Lu en entier : appel `BuildDebug.ps1:92-95` placé après la copie des `.bat` et des PDB, avant la ligne `archive=` ; `-Build $ArchiveDir -Config $Config -ProjectRoot $ProjectRoot` (les valeurs `DebugGame`/`Development` sont dans le `ValidateSet` de `CheckPackage.ps1`) ; `$LASTEXITCODE` lu aussitôt, `exit $check` si ≠ 0. Le mécanisme `& script` / `$LASTEXITCODE` est le même que celui exécuté en 3.4 pour `SplitModules.ps1` (exit du script appelé sans fermer l'appelant). Non exécuté : toute la partie amont du script est une compilation UAT (`BuildDebug.ps1:56`) ; isoler la partie aval demanderait de réécrire une copie du script, ce qui ne prouverait plus le script d'origine. Motif de PASS-STATIC : UAT interdit.
## 4. Diff lu en entier
- `git diff -- Tools` lu en entier : 2 fichiers modifiés, 13 lignes ajoutées, 0 supprimée (`git diff --stat -- Tools` : 6 + 7) ; `CheckPackage.ps1` neuf (non suivi), 228 lignes lues en entier.
- Ajouts non demandés : aucun hors l'écart accepté (code 3, repli `WindowsNoEditor`, motif de rattachement par exe). `BuildDebug.ps1` : 6 lignes (commentaire de 2 lignes + 4 lignes de code) ; `SplitModules.ps1` : 7 lignes (blanc, commentaire de 2 lignes, 4 lignes de code).
- Aucun fichier de `Tools` modifié par script (`sed -i`, `-replace`) : non vérifiable directement ; les fins de ligne gardées (P7) sont cohérentes avec un usage de l'outil Edit.
- Recomptes : P1 (142, 1), P4 (1, 2 contre 1), P7 (CR/LF), P6 (13 insertions).
## 5. Verdict
**PASS.** Critère de la fiche (rubrique 8) : (a) les rejouages donnent les codes attendus (U8 1, DC4 + 5.5 0, DC4 sans projet 2, AP7 1, inexistant 3) ; (b) la règle des 10 min est prouvée sur copie jetable (9 min PASS, 11 min NON-CONCLUANT, y compris avec un contenu fautif) en plus de la lecture du code ; (c) le refus de `SplitModules.ps1` est prouvé sans déplacement (S1, S3 : arbre inchangé). Nuance : le branchement de `BuildDebug.ps1` est **PASS-STATIC** (§ 3.5) ; la preuve par l'échec d'origine sur U8 est établie pour (1) et (2), remplacée pour (3) et (4) par AP7 5.5 (§ 3.2), comme annoncé par l'IMPL et accepté.
Sources : établi (rejoué) pour tout ce qui précède sauf l'exécution réelle de `BuildDebug.ps1` (statique) et la borne exacte de 10,0 min (incertain : essai à faire avec un fichier à +10,0 min ± 1 s, sans enjeu).
## 6. Points à confirmer par l'utilisateur
- [ ] `BuildDebug.ps1` sortira en code 1 après l'archivage de tout build contenant `Content\Modules\.git` ([1] FAIL 142 tant que P1 de `OBA-T23-PROJ-CART.md:133` n'est pas appliqué ; vu sur `STC_Development`) : comportement voulu par la fiche, à rappeler aux fiches BUILD (IMPL Constats 1).
- [ ] `SplitModules.ps1` : NON-CONCLUANT (code 2) laisse passer en avertissement ; en publication, [3]/[4] seront souvent non concluants (projet recompilé après l'empaquetage). Bloquer aussi sur 2, ou archiver `.rsp`/`.target` avec le build ? (IMPL Constats 3, décision hors fiche.)
- [ ] [1] ne couvre que `Modules/.git` à la racine du dépôt des modules ; un `.git` de sous-module (`Modules/<module>/.git`) ne serait pas relevé (IMPL Constats 5). Étendre le motif à tout le manifeste NonUFS ?
- [ ] Limite restante déjà notée par l'IMPL (Constats 2) : un `.rsp` réécrit sans relink dans les 10 min suivant l'exe, ou deux liaisons à moins de 2 s et de même taille, passeraient.
Fichiers à commiter (dépôt du jeu `D:\Game\LifePlay-master 5.8`, branche `ue5.8`) :
- `A Docs/Migration/etat/OB/OBB/OBB-T3-VAL.md` (ce livrable). Aucun autre fichier modifié par cette VAL (le scratchpad est hors dépôt).
Tours : 13 / 40
## Constats
1. Dans le motif du cas `gitdisk`, le compte [1] affiche `FAIL 0` (0 ligne au manifeste, mais `.git` sur disque) : lisible grâce à la ligne « disque : … », mais le chiffre peut surprendre. Pas un défaut (IMPL § 2 écart 5).
2. `SplitModules.ps1` appelle `CheckPackage.ps1` sans `-ProjectRoot` : le projet est le parent de `Tools` de la copie qui lance le script. Sur un build produit par l'autre copie (5.5), [3]/[4] seront NON-CONCLUANT « autre taille » (cas `dc4` sans projet) ; sans effet bloquant.
3. `git rev-parse OBB-avant` rend `ede1f012…` (objet de tag annoté) et non `b63196a` : normal pour un tag annoté, `HEAD` = `b63196a` ; les comparaisons `git show OBB-avant:Tools/<f>` sont valides.