LifePlay-Revival/Docs/Migration/etat/OB/OBB/OBB-T3-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

17 KiB

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(/
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
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.