20 KiB
Fiche OBB-T3 — Niveau N2 — Modèle prévu modèle de l'agent lp-impl | utilisé Opus 5.5 (claude-opus-5-5) — Agent lp-impl — Skills sk-protocol, ue-cpp-build, lp-build, lp-ue-compat (préchargés), sk-windows-shell (invoqué), lp-doc (gabarits.md lu)
OBB-T3-IMPL : contrôle de paquet Tools\CheckPackage.ps1 (B3 / G-OB-7), branché sur BuildDebug.ps1 et SplitModules.ps1 (2026-10-10)
Copie D:\Game\LifePlay-master 5.8, branche ue5.8, HEAD b63196a (= tag OBB-avant). Départ : git status --short -- Tools
vide (pas d'arrêt). Rien lancé hors CheckPackage.ps1 et l'analyse syntaxique (ni UE, ni UAT, ni UBT, ni BuildDebug.ps1,
ni SplitModules.ps1). Sorties brutes : scratchpad
%USERPROFILE%\AppData\Local\Temp\claude\D--Game-LifePlay-master-5-8\0b6366db-34d6-4803-8aee-2e309785cb38\scratchpad\obb-t3\
(abrégé SCR\, un .txt par essai).
1. Fichiers modifiés (chemins, lignes)
D:\Game\LifePlay-master 5.8\Tools\CheckPackage.ps1: neuf, 228 lignes après la reprise (211 à la tentative 1), ASCII (0 octet non ASCII), fins de ligne LF (commeSplitModules.ps1,Build.ps1,Engine.ps1). Paramètres-Build(obligatoire),-Config Shipping|Development|DebugGame(absent : déduit de l'exe présent sousWindows\LifePlay\Binaries\Win64),-ProjectRoot(défaut : parent deTools). Contrôles :- [1]
Windows\Manifest_NonUFSFiles_Win64.txt, lecture par[IO.File]::ReadLines, motif(^|[\\/])Modules[\\/]\.git([\\/]|\s|$)insensible à la casse (entrée exacteModules/.git=.gitfichier, ou préfixeModules/.git/= dossier) ; plus le disque :Get-Item -LiteralPath <win>\LifePlay\Content\Modules\.git -Force(dossier ou fichier). Le compte affiché est celui du manifeste ; la présence sur disque est ajoutée en ligne fautive. - [2]
Windows\Manifest_UFSFiles_Win64.txt: lignes contenantLPSandbox. - [3]
<ProjectRoot>\Intermediate\Build\Win64\x64\LifePlay\<Config>\<exe>.rsp: lignes contenantLPAnimMeasure. - [4]
<ProjectRoot>\Binaries\Win64\<exe sans .exe>.target: entrées"LPSandbox"du seul tableau"BuildPlugins". - [3] et [4], critère de rattachement (reprise, décision de l'orchestrateur, remplace le seuil de 2 h) : le
.rspet le.targetne valent pour le build contrôlé que si (a) l'exe du projet<ProjectRoot>\Binaries\Win64\<exe>a la même taille que l'exe archivé<Build>\Windows\LifePlay\Binaries\Win64\<exe>, (b) la même date à 2 s près ($MaxExeGapSeconds = 2), et (c) le fichier n'est pas postérieur à l'exe du projet de plus de 10 min ($MaxAfterExeMinutes = 10). Sinon, ou fichier absent, ou exe absent : NON-CONCLUANT avec le motif (taille ou date des deux exe citées). FonctionGet-StaleReason; l'en-tête de sortie affiche les deux exe (chemin, date, taille). La mise en scène garde la date de liaison (Shipping_U8: exe 17:56:48, dossier 18:12) ; le compte lu d'un fichier non rattaché est affiché « non retenu ». - Sortie :
[n] PASS|FAIL|NON-CONCLUANT <compte> <fichier>puis 3 lignes fautives au plus (numéro: texte) ; ligne finaleResultat : … (code n). Codes : 0 = 4 PASS, 1 = un FAIL, 2 = NON-CONCLUANT sans FAIL, 3 = contrôle impossible. - Noms par configuration, lus sur le disque (point (b) de la fiche) :
Config exe archivé ( Binaries\Win64).rsp.targetLu sur Shipping LifePlay-Win64-Shipping.exeShipping\LifePlay-Win64-Shipping.exe.rspLifePlay-Win64-Shipping.targetShipping_U8, projet 5.8 et 5.5Development LifePlay.exeDevelopment\LifePlay.exe.rspLifePlay.target5.5_DC4,5.5_Development,5.8_STC_Development, projet 5.8 et 5.5DebugGame LifePlay-Win64-DebugGame.exeDebugGame\LifePlay-Win64-DebugGame.exe.rspLifePlay-Win64-DebugGame.target5.5_DebugGame, projet 5.5 (aucun DebugGame dans le projet 5.8)
- [1]
D:\Game\LifePlay-master 5.8\Tools\BuildDebug.ps1: lignes 89-94 ajoutées (aprèsWrite-Host "pdb copies=…", l. 88, avantWrite-Host "archive=…") ; CRLF gardé (CR = LF = 96, contre 90 avant).D:\Game\LifePlay-master 5.8\Tools\SplitModules.ps1: lignes 39-45 ajoutées (après le contrôle du dossier des modules, l. 37, avant$assetMods) ; LF gardé (CR = 0, LF = 167, contre 160 avant).
Diff complet (git diff -- Tools, 2 fichiers, 13 insertions, 0 suppression ; CheckPackage.ps1 non suivi) :
--- a/Tools/BuildDebug.ps1
+++ b/Tools/BuildDebug.ps1
@@ -86,5 +86,11 @@ if (Test-Path $pdbSrc) {
}
}
Write-Host "pdb copies=$copied -> $bin"
+
+# Controle du paquet (B3 / G-OB-7) : .git des modules, addon LPSandbox (pak, .rsp, .target). Un build Development ou
+# DebugGame est aussi interdit d'addon depuis CHG-279 : tout code != 0 (FAIL, NON-CONCLUANT, erreur) arrete le script.
+& (Join-Path $PSScriptRoot 'CheckPackage.ps1') -Build $ArchiveDir -Config $Config -ProjectRoot $ProjectRoot
+$check = $LASTEXITCODE
+if ($check -ne 0) { exit $check }
Write-Host "archive=$ArchiveDir exe=$exe"
exit 0
--- a/Tools/SplitModules.ps1
+++ b/Tools/SplitModules.ps1
@@ -36,6 +36,13 @@ $cfg = Get-Content $Config -Raw | ConvertFrom-Json
$modules = Join-Path $Build 'Windows\LifePlay\Content\Modules'
if (-not (Test-Path $modules)) { throw "Dossier des modules introuvable : $modules" }
+# Controle du paquet (B3 / G-OB-7) avant tout deplacement : FAIL (code 1) ou controle impossible (3) = refus.
+# NON-CONCLUANT (2) : .rsp / .target du projet reecrits depuis ce build, signale sans bloquer.
+& (Join-Path $PSScriptRoot 'CheckPackage.ps1') -Build $Build
+$check = $LASTEXITCODE
+if ($check -eq 2) { Write-Warning 'CheckPackage : controle(s) NON-CONCLUANT(S) (voir ci-dessus), publication poursuivie' }
+elseif ($check -ne 0) { throw "CheckPackage en echec (code $check) : build refuse pour la publication" }
+
# Un build de distribution ne contient aucun mod d'assets installe (sa partie texte serait livree sans ses paquets) :
Reprise (critère de rattachement), rejouée (sorties SCR\r2_*.txt, même commande) :
| Essai | exe archivé | exe du projet | [1] | [2] | [3] / [4] | Code |
|---|---|---|---|---|---|---|
r2_shipping_u8 (-Config Shipping) |
164 823 552 o, 2026-10-09 17:56:48 | …5.8\Binaries\Win64\LifePlay-Win64-Shipping.exe 164 823 552 o, 20:08:50 |
FAIL 142 | FAIL 1 | NON-CONCLUANT : « exe du projet d'une autre date : 2026-10-09 20:08:50 contre 2026-10-09 17:56:48 archive (meme taille 164823552 o) : relie depuis » ; compte lu 0, non retenu | 1 |
r2_dc4_p55 (-ProjectRoot …5.5) |
291 694 592 o, 2026-10-07 20:13:28 | …5.5\Binaries\Win64\LifePlay.exe 291 694 592 o, 20:13:28 |
PASS 0 | PASS 0 | PASS 0 / PASS 0 | 0 |
r2_dc4 (projet 5.8 par défaut) |
idem | …5.8\…\LifePlay.exe 330 207 744 o, 2026-10-10 09:57:34 |
PASS 0 | PASS 0 | NON-CONCLUANT : « exe du projet d'une autre taille : 330207744 o (2026-10-10 09:57:34) contre 291694592 o archive : autre build » | 2 |
r2_stc_dev |
330 207 744 o, 2026-10-10 09:57:34 | identique | FAIL 142 | PASS 0 | PASS 0 / PASS 0 | 1 |
r2_ap7_p55 (-ProjectRoot …5.5) |
141 238 784 o, 2026-10-07 02:26:56 | identique | PASS 0 | FAIL 2 | FAIL 1 (l. 619) / FAIL 1 (l. 3707) | 1 |
r2_dbg55_p55 (-ProjectRoot …5.5) |
291 868 672 o, 2026-10-04 12:41:24 | identique | PASS 0 | PASS 0 | PASS 0 / PASS 0 | 0 |
Relevé de l'orchestrateur confirmé (exe Shipping 5.8 et U8 : même taille, dates 20:08:50 / 17:56:48). Analyse syntaxique
après reprise : CheckPackage.ps1 errors=0, BuildDebug.ps1 errors=0, SplitModules.ps1 errors=0. CheckPackage.ps1 :
CR = 0, LF = 228, 0 octet non ASCII, 0 occurrence de MaxGapHours. git diff --stat -- Tools inchangé (2 fichiers, +13).
Contrôles de la tentative 1 (seuil de 2 h, remplacé ; gardés pour trace), pwsh 7.6.6, pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Tools\CheckPackage.ps1" … :
Essai (SCR\) |
Arguments | [1] | [2] | [3] | [4] | Code |
|---|---|---|---|---|---|---|
shipping_u8.txt (preuve par l'échec) |
-Build D:\Game\LifePlay_Build_5.8_Shipping_U8 -Config Shipping |
FAIL 142 (+ disque : dossier présent) | FAIL 1 (958: RemappedPlugins/LPSandbox/LPSandbox.uplugin) |
NON-CONCLUANT (écart 2,20 h : .rsp 2026-10-09 20:08:32, exe 17:56:48 ; compte lu 0) |
NON-CONCLUANT (écart 2,20 h : .target 20:08:52 ; compte lu 0) |
1 |
dc4.txt (témoin) |
-Build D:\Game\LifePlay_Build_5.5_DC4 (Development déduit) |
PASS 0 | PASS 0 | NON-CONCLUANT (.rsp 5.8 du 2026-10-10 09:56:57, écart 61,72 h) |
NON-CONCLUANT (écart 61,74 h) | 2 |
dc4_p55.txt (témoin, projet d'origine) |
… DC4 -ProjectRoot 'D:\Game\LifePlay-master 5.5' |
PASS 0 | PASS 0 | PASS 0 | PASS 0 | 0 |
ap7_p55.txt (témoin positif de [2]-[4]) |
-Build D:\Game\LifePlay_Build_5.5_Shipping_AP7 -ProjectRoot '…5.5' |
PASS 0 | FAIL 2 (851: RemappedPlugins/LPSandbox/LPSandbox.uplugin, 1547: LifePlay/Config/LPSandbox.ini) |
FAIL 1 (619: …\LPAnimMeasure\Module.LPAnimMeasure.cpp.obj) |
FAIL 1 (3707: "LPSandbox",) |
1 |
stc_dev.txt |
-Build D:\Game\LifePlay_Build_5.8_STC_Development |
FAIL 142 | PASS 0 | PASS 0 | PASS 0 | 1 |
dbg55_p55.txt (noms DebugGame) |
-Build D:\Game\LifePlay_Build_5.5_DebugGame -ProjectRoot '…5.5' |
PASS 0 | PASS 0 | PASS 0 | PASS 0 | 0 |
absent.txt |
-Build D:\Game\LifePlay_Build_inexistant |
— | — | — | — | 3 (« controle impossible : Impossible de trouver le chemin d'accès… ») |
- Les 0 du témoin DC4 ne sont pas un échec de méthode : chaque contrôle a rendu un FAIL ailleurs ([1] 142 sur U8 et STC ;
[2], [3], [4] sur AP7) ; le manifeste NonUFS de DC4 compte 2 053 lignes
^LifePlay/Content/Modules/(Grep, count) et le.rspDevelopment 5.5 citeLPAnimCore(1, Grep count) : fichiers lus et pertinents. - Mécanisme des branchements (sans lancer les deux scripts) :
pwsh -NoProfile -Command '$ErrorActionPreference="Stop"; & "…\Tools\CheckPackage.ps1" -Build "…Shipping_U8" *> $null; "LASTEXITCODE=$LASTEXITCODE"; & … DC4 -ProjectRoot …5.5'→LASTEXITCODE=1 (appelant toujours vivant)puisLASTEXITCODE=0:exit ndu script appelé par&renseigne$LASTEXITCODEsans fermer l'appelant [ét.]. - Analyse syntaxique :
[System.Management.Automation.Language.Parser]::ParseFile(<fichier>,[ref]$t,[ref]$e)→CheckPackage.ps1 errors=0,BuildDebug.ps1 errors=0,SplitModules.ps1 errors=0(versions HEAD : 0 et 0). Un premier essai lancé depuis Git Bash avait affiché 1 pour les trois fichiers : guillemets de$emangés par bash (artefact de la commande, refait enpwsh -Command '…'à guillemets simples).
2. Écarts à la SPEC (obligatoire)
- Code 3 (contrôle impossible : build introuvable, configuration non déduite, erreur de lecture) ajouté aux codes
0/1/2 de la fiche, pour ne pas confondre une erreur avec un FAIL (une exception non rattrapée rendrait 1 sous
pwsh -File). SplitModules.ps1: le code 3 refuse aussi (throw), pas seulement le FAIL : un contrôle qui n'a pas pu tourner ne doit pas laisser passer une publication. NON-CONCLUANT (2) :Write-Warning, la publication continue (la fiche ne demande lethrowque pour FAIL). À trancher par l'orchestrateur (Constats 2).BuildDebug.ps1: tout code ≠ 0 sort avec ce code, comme demandé ; cela inclut NON-CONCLUANT (2) et 3.- Repli
WindowsNoEditorsi<Build>\Windowsmanque (même repli queBuildDebug.ps1:64-66) ; sans effet sur les builds 5.x. - Compte de [1] = lignes du manifeste seulement (142 attendu) ; le
.gitsur disque est une ligne fautive en plus et suffit à rendre FAIL. Manifeste absent et.gitabsent du disque : NON-CONCLUANT. - Compte
-(au lieu d'un nombre) quand le fichier n'est pas lu ou que sa lecture n'est pas retenue (NON-CONCLUANT). - [2] cherche
LPSandboxdans toute la ligne (comme la fiche) : sur AP7 il relève aussiLifePlay/Config/LPSandbox.ini.
Décisions de l'orchestrateur à la reprise : écarts 1 (code 3), 2 (SplitModules : 2 = avertissement, 1 et 3 = refus) et 4
(repli WindowsNoEditor) acceptés. Seuil de 2 h remplacé par le critère de rattachement du § 1 (taille et date de
l'exe du projet, .rsp / .target au plus 10 min après) : appliqué tel que demandé, sans autre écart.
3. Instantané (lot, manifeste)
Pris par l'orchestrateur avant l'envoi : D:\Game\LifePlay_Backup_5.5\OBB\manifest.csv. Concordance relevée au départ :
md5sum Tools/BuildDebug.ps1 Tools/SplitModules.ps1 → ffe1bc2f8007240bc841af3fc0adda25, 1c42108efb53d3e04d20ffed0f0427b5
(= FFE1BC2F…, 1C42108E… de la fiche). Après : d01647ac47f1cf2bf284e84964cbedcc, 43ae1bf6fc1cf891b41724fc0e53b4ac ;
CheckPackage.ps1 neuf 7173f917718c206dd6750064ac1a224f après la reprise (ed1f478e… à la tentative 1). Retour arrière : Tools\Restore.ps1 -Lot OBB (proposé seulement)
et retrait de Tools\CheckPackage.ps1 (déplacer vers la sauvegarde, ne pas supprimer).
4. Ce qui n'a pas été fait
BuildDebug.ps1etSplitModules.ps1ne sont pas exécutés (interdit : UAT, déplacements) ; leur branchement n'est prouvé que par l'analyse syntaxique, le diff et l'essai du mécanisme&/$LASTEXITCODE(§ 1).- [3]/[4] concluants sur
Shipping_U8: impossibles, le.rspet le.targetShipping du projet 5.8 ont été réécrits à 20:08 le 2026-10-09 (build du correctif CHG-279, estimé d'aprèsOBB-T6-INV.md:110et la date du commit67d3e6820:12) ; l'exe Shipping du projet date aussi de 20:08:50, contre 17:56:48 dans l'archive. L'attendu « (3) ≥ 1, (4) présent » (OBA-T5-EVAL.md:98) n'est donc pas rejouable sur U8 ; il est rejoué sur AP7 5.5 (FAIL 1 et FAIL 1). - Règle (c) du rattachement (
.rsp/.targetpostérieur de plus de 10 min à l'exe du projet) : non exercée par un cas réel ; aucun build existant ne la déclenche et la provoquer demanderait de toucher aux dates des fichiers du projet (interdit). Seules (a) taille (DC4 contre projet 5.8) et (b) date (U8 contre projet 5.8) ont rendu NON-CONCLUANT. - Aucun build DebugGame 5.8 n'existe : les noms DebugGame sont ceux de la copie 5.5 (même cible
LifePlay, mêmes règles de nommage d'UBT : estimé). - Aucun skill ni doc modifié ; texte proposé pour la fiche DOC (consigne des fiches qui lancent UAT directement) en Constats 4.
5. Points à confirmer en VAL
pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Tools\CheckPackage.ps1" -Build D:\Game\LifePlay_Build_5.8_Shipping_U8 -Config Shipping→[1] FAIL 142,[2] FAIL 1,[3]/[4]NON-CONCLUANT avec le motif « exe du projet d'une autre date : 2026-10-09 20:08:50 contre 2026-10-09 17:56:48 archive (meme taille 164823552 o) », code 1.pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Tools\CheckPackage.ps1" -Build D:\Game\LifePlay_Build_5.5_DC4 -ProjectRoot 'D:\Game\LifePlay-master 5.5'→ 4 PASS, code 0 (sans-ProjectRoot:[1]/[2]PASS,[3]/[4]NON-CONCLUANT motif « autre taille : 330207744 o … contre 291694592 o », code 2).- Règle (c) des 10 min : relue dans
Get-StaleReason(non exercée par un cas réel, § 4). pwsh -NoProfile -File "D:\Game\LifePlay-master 5.8\Tools\CheckPackage.ps1" -Build D:\Game\LifePlay_Build_5.5_Shipping_AP7 -ProjectRoot 'D:\Game\LifePlay-master 5.5'→ [2], [3], [4] FAIL (détection positive de chaque contrôle).ParseFile= 0 erreur pourTools\CheckPackage.ps1,Tools\BuildDebug.ps1,Tools\SplitModules.ps1.git diff --stat -- Tools= 2 fichiers, 13 insertions ;git status --short -- Tools= ces 2M+?? Tools/CheckPackage.ps1, rien d'autre.- Fins de ligne :
BuildDebug.ps1CRLF (CR = LF = 96),SplitModules.ps1LF (CR = 0),CheckPackage.ps1LF, ASCII. - Aucune écriture dans les dossiers de build,
Intermediate,Binaries: dates des fichiers lus inchangées (.rspShipping 5.8 2026-10-09 20:08:32,LifePlay.target5.8 2026-10-10 09:57:35). - Écarts 1, 2 et 4 du § 2 : acceptés par l'orchestrateur à la reprise ; vérifier que le code relu leur correspond (
exit 3dans lecatch,Write-Warningsur 2 etthrowsur 1 / 3 dansSplitModules.ps1). - Premier vrai passage par
BuildDebug.ps1(prochain build, file du Big Boss) : 4 PASS attendus pour [2]-[4] ; [1] FAIL tant que P1 (sortie du.gitdeContent\Modules) n'est pas appliqué, doncBuildDebug.ps1sortira en code 1 après l'archivage jusque-là (Constats 1).
6. Fichiers à commiter
Dépôt du jeu D:\Game\LifePlay-master 5.8, branche ue5.8 :
A Tools/CheckPackage.ps1M Tools/BuildDebug.ps1M Tools/SplitModules.ps1A Docs/Migration/etat/OB/OBB/OBB-T3-IMPL.md(ce livrable)
Tours : 14 / 40 (tentative 1) ; reprise courte : 6 / 12
Constats
- Conséquence immédiate à connaître : tant que
Content\Modules\.gitexiste dans la copie 5.8 (P1 deOBA-T23-PROJ-CART.md:133non appliqué), tout build mis en scène le contient ([1] FAIL 142 surSTC_Development, build du 2026-10-10).BuildDebug.ps1archivera donc le build puis sortira en code 1 (les.batet PDB sont déjà copiés, l'archive reste sur le disque). C'est le comportement voulu par la fiche ; à rappeler aux fiches BUILD qui l'utilisent avant P1. - Seuil de 2 h remplacé (reprise). Tentative 1 : sur
Shipping_U8, l'écart n'était que de 2,20 h ; un seuil de 3 h aurait lu le.rspdu build suivant (correctif CHG-279, compte 0) comme celui d'U8 (faux PASS), et une recompilation faite moins de 2 h après un empaquetage aurait été prise pour le build contrôlé. Appliqué à la demande de l'orchestrateur : l'exe du projet doit avoir la même taille et la même date (≤ 2 s) que l'exe archivé, et le.rsp/.targetne pas lui être postérieur de plus de 10 min. Résultat : U8 reste NON-CONCLUANT pour le bon motif (même taille 164 823 552 o, exe relié à 20:08:50, preuve qu'un relink sans changement de taille est bien vu) ; DC4 contre projet 5.5 devient concluant (4 PASS) ; DC4 contre projet 5.8 est refusé sur la taille. Limite restante [est.] : deux liaisons du même code à moins de 2 s d'écart et de même taille ne se distinguent pas (cas improbable : la date d'une liaison UBT est celle de l'exe écrit, une nouvelle liaison la change) ; un.rspréécrit sans relink (action annulée avant la liaison) dans les 10 min suivant l'exe passerait aussi. - NON-CONCLUANT dans
SplitModules.ps1: non bloquant ici (fiche : seul FAIL bloque). Pour une publication, [3]/[4] seront souvent non concluants (le projet est recompilé après l'empaquetage). Décision proposée à l'orchestrateur : bloquer aussi sur 2 en publication, ou garder le.rsp/.targetdans l'archive au moment deBuildDebug.ps1(copie dans un sous-dossier de l'archive, contrôlée ensuite parCheckPackage.ps1) ; les deux sont hors fiche. - Texte prêt pour la fiche DOC (consigne des fiches qui lancent UAT directement, skill
lp-build§ 4, non modifié ici) : « Tout empaquetage lancé par UAT horsTools\BuildDebug.ps1(cas U8) est suivi, aussitôt après l'archivage et avant tout autre build, depwsh -NoProfile -File "<copie>\Tools\CheckPackage.ps1" -Build <dossier d'archive> -Config <cfg>(lecture seule). Code 0 = 4 PASS ; 1 = FAIL : build refusé pour la publication et pour la VAL de publication ; 2 = NON-CONCLUANT :.rsp/.targetdu projet réécrits depuis ce build, relancer le contrôle avant toute recompilation ; 3 = contrôle impossible. Le compte rendu BUILD recopie les 4 lignes[n]et le code. » - [1] ne couvre que
Modules/.git(racine du dépôt des modules), comme la fiche ; un.gitd'un sous-module (Modules/<module>/.git) ne serait pas relevé. Extension possible : motif(^|/)\.git(/|$)sur tout le manifeste NonUFS. - Fichiers hors périmètre vus dans
git status --shorten fin de session (autres sessions, non touchés) :M Docs/Migration/etat/ST/STE/STE-TACHES.md,?? Docs/Migration/etat/OB/OBB/OBB-T1-SPEC.md,?? …/OBB-T1a-INV.md,?? Docs/Migration/etat/ST/STE/STE-D-INV.md(absents du statut initial de la session).