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.mdl. 89-98 (exigence B3 : 4 contrôles, preuve par l'échec attendue) : lu.Tools\CheckPackage.ps1(228 lignes) : lu en entier ;Tools\SplitModules.ps1etTools\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
Tourset## Constatspré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
Modules/.git: manifeste NonUFS parFind-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).LPSandboxau manifeste UFS (l. 182-188). Conforme.LPAnimMeasureau.rspShipping (l. 191-202), nom par configuration (l. 51-55). Conforme.LPSandboxdansBuildPlugins: 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.target5.5 contient 2 occurrences deLPSandbox(l. 3538 hors section, l. 3707 dans la section) et le script en compte 1 ; sur copie jetable,EnabledPluginsetOthercontenant"LPSandbox"n'ont déclenché aucun FAIL (casok_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/.targetréé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 -- Toolslu en entier : 2 fichiers modifiés, 13 lignes ajoutées, 0 supprimée (git diff --stat -- Tools: 6 + 7) ;CheckPackage.ps1neuf (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
Toolsmodifié 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.ps1sortira en code 1 après l'archivage de tout build contenantContent\Modules\.git([1] FAIL 142 tant que P1 deOBA-T23-PROJ-CART.md:133n'est pas appliqué ; vu surSTC_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/.targetavec le build ? (IMPL Constats 3, décision hors fiche.)- [1] ne couvre que
Modules/.gità la racine du dépôt des modules ; un.gitde 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
.rspréé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
- Dans le motif du cas
gitdisk, le compte [1] afficheFAIL 0(0 ligne au manifeste, mais.gitsur disque) : lisible grâce à la ligne « disque : … », mais le chiffre peut surprendre. Pas un défaut (IMPL § 2 écart 5). SplitModules.ps1appelleCheckPackage.ps1sans-ProjectRoot: le projet est le parent deToolsde la copie qui lance le script. Sur un build produit par l'autre copie (5.5), [3]/[4] seront NON-CONCLUANT « autre taille » (casdc4sans projet) ; sans effet bloquant.git rev-parse OBB-avantrendede1f012…(objet de tag annoté) et nonb63196a: normal pour un tag annoté,HEAD=b63196a; les comparaisonsgit show OBB-avant:Tools/<f>sont valides.