26 KiB
Fiche MAPDL1-E3B-VAL — Niveau N1 — Modèle prévu haiku | utilisé haiku (claude-haiku-5-5, déclaré par l'environnement ; non vérifié par claude -p) — Agent lp-validator — Skills lp-validate, sk-recount, sk-protocol, debug-verification
MAPDL1-E3B-VAL : validation statique de l'étape E5, téléchargement et pose des packs (2026-10-22)
Hors gabarit : aucun. Gabarit VAL (D:\Game\LifePlay-Sandbox\Tools\claude\skills\lp-doc\gabarits.md) suivi, sections 1 à 6 dans l'ordre. La fiche demande en plus le tableau des critères (§ 5), les MD5 (§ 3), les sorties brutes (§ 3) et les fichiers à commiter (fin de document).
Lecture seule. Aucune compilation, aucun commandlet, aucun éditeur, aucun lancement du jeu, aucun appel réseau. Tools\Build.ps1 -FromLog non lancé : il écrit un résumé dans etat\ (lot MAPDL1-E2T hors table de Tools\EtatDir.ps1, avertissement déjà noté dans MAPDL1-E2T-BUILD.md § 2) ; le recomptage des journaux est fait par Grep (§ 3.10). LPTestStringCompat non lancé (commandlet interdit par la fiche).
Verdict global : PASS-STATIC. Aucun critère de la fiche § 3 n'est contredit. Une réserve de code reste ouverte (R-1, § 5). Les points de jeu sont reportés (§ 2 et § 6).
Relevés : 2026-10-22, mtimes des fichiers E5 entre 16:49:22 et 17:27:49 ; journaux E2T écrits à 17:29:09 et 17:31:09.
1. Fiches amont relues
MAPDL1-E5-FICHE.md: lue en entier (127 l.).MAPDL1-E5-IMPL.md: lue en entier (§ 1 à 6, Constats 1 à 3).MAPDL1-E2T-BUILD.md: lue en entier (compilation éditeur et jeu, correctif C2365).MAPDL1-E3-VAL.md: lue en entier (forme du livrable, sections 1 à 7).MAPDL1-JOURNAL-BROUILLON.md: lue en entier (ligne ERR du correctifUI).- Instantanés lus :
D:\Game\LifePlay_Backup_5.5\MAPDL1-E5\manifest.csv,D:\Game\LifePlay_Backup_5.5\MAPDL1-E2T\manifest.csv; fichiers…\MAPDL1-E5\Source\LifePlay\LPCityMapsSubsystem.h,LPCityMapsSubsystem.cpp,LifePlay.Build.cs,…\MAPDL1-E5\Content\Data\LPCityMaps.json(diffs § 4) ;…\MAPDL1-E2T\Source\LifePlay\LPCityMapsDownload.cpp(diff § 3.11). - Code lu en entier :
LPCityMapsDownload.h(180 l.),LPCityMapsDownload.cpp(1406 l.),LPCityMapsWindow.h(67 l.),LPCityMapsWindow.cpp(585 l.),LPCityMapsSubsystem.h(178 l.),LPCityMapsSubsystem.cpp(946 l.),LifePlay.Build.cs(63 l.),LPCityMaps.json(15 l.). - Non relus en entier : les deux licences (copies à l'octet, MD5 seulement) ;
MAPDL1-E1-IMPL.mdetMAPDL1-E4-TESTS.md(Grep seulement). - Moteur 5.8 lu (fichier:ligne) :
D:\Game\Launcher\Engine\UE_5.8\Engine\Source\Runtime\Core\Public\HAL\FileManager.h:110, 113(signatures deCopyetMove) ;…\Core\Private\HAL\FileManagerGeneric.cpp:136-147(Copy),:175-234(CopyWithProgress, suppression l. 233),:299-325(Move, suppression de la destination l. 303 siReplace).
2. Points à confirmer des IMPL : un par ligne
Points de MAPDL1-E5-IMPL.md § 5 (V-1 à V-15) et écarts E-1 à E-6 (voir Constats).
| Point (E5-IMPL § 5) | Verdict | Preuve |
|---|---|---|
| V-1 includes THIRD_PARTY autour d'OpenSSL et libzip | PASS (compilation) | LPCityMapsDownload.cpp:16-23 ; journaux E2T sans error C ni error LNK (§ 3.10) ; jeu lié Result: Succeeded (E2T-BUILD § 5). |
V-2 push/pop macro de commdlg.h |
PASS (compilation) | LPCityMapsDownload.cpp:29-49 ; 0 warning C dans les deux journaux (§ 3.10). |
V-3 BindSP, FTickerDelegate::CreateSP, Async, lambdas |
PASS (compilation) | Journal jeu : Result: Succeeded (ligne 38), unités 1 à 9 compilées (E2T-BUILD § 2). |
V-4 attributs *_Lambda Slate |
PASS (compilation) | LPCityMapsWindow.cpp:177-236, :300-304, :334-345, :396-409 ; journaux sans erreur. |
| V-5 0 avertissement nouveau | PASS | Grep warning C : 0 dans les deux journaux (§ 3.10). Avertissements UBT Plugin 'HyperAIStudio' connus (E2T-BUILD § 4). |
| V-6 liaison HTTP, OpenSSL, libzip, Development | PASS (liaison Development) | LifePlay.exe lié, Result: Succeeded (journal jeu, E2T-BUILD § 5). Liaison Shipping (comdlg32) : reporté (jeu, non compilé). |
V-7 Content/Data/Licenses/*.txt dans le pak |
reporté (cuisson) | Config\DefaultGame.ini:75 présent (§ 3.6). Stage UFS récursif non lu ici. |
| V-8 rendu de la fenêtre | reporté (jeu) | LPCityMapsWindow.cpp:245-258 (fond, fenêtre, boutons). |
V-9 redirections, Range, Content-Range |
reporté (jeu, réseau) | LPCityMapsDownload.cpp:852-859 (Range), :921-926 (URL finale), :962 (Content-Range). Aucun réseau en VAL. |
| V-10 coupure, reprise, 200 sur reprise, SHA faux, miroir, recours | reporté (jeu) | :942-952 (200 sur reprise), :1158-1163 (SHA faux), :1009-1031 (URL suivante puis recours). |
V-11 pose transactionnelle, retour arrière, _ancien, « Restart required » |
reporté (jeu empaqueté) ; lecture statique faite | :523-597 (pose), :313-325 (retour arrière), LPCityMapsSubsystem.cpp:846-853 (RestartRequired). |
| V-12 éditeur : « Download only » possible, « Full install » refusé | reporté (jeu éditeur) ; statique établi | LPCityMapsDownload.cpp:773-778, :1268-1273 ; LPCityMapsWindow.cpp:457-465. |
V-13 Deinitialize pendant un téléchargement |
reporté (jeu) ; statique établi | LPCityMapsSubsystem.cpp:299-304 (fermeture) ; LPCityMapsDownload.cpp:609-622 (annulation, .part gardé). |
| V-14 dépôt : ordre E1, E5, STM1 | PASS (statique) ; ordre de commit reporté au gardien | git status (§ 3.8) : E5 en ??, LifePlay.Build.cs et DefaultGame.ini en M. |
| V-15 reste d'E1 (E-1 ticker, V-5 à V-12 d'E1) | reporté (E1, jeu) ; diff de DecorateRows lu |
Le diff E5 n'ajoute à DecorateRows que la branche RestartRequired (LPCityMapsSubsystem.cpp:755-773, § 4). |
3. Critères rejoués (commande → résultat)
3.1 MD5 (Get-FileHash -Algorithm MD5), comparés à MAPDL1-E5-IMPL.md § 1
C1070FF639EF5710578BA33FB32E51D4 …\Source\LifePlay\LPCityMapsDownload.h
8319FC65523AF62DEE70A41ED98217D0 …\Source\LifePlay\LPCityMapsDownload.cpp
E2F30E7FE5814C99E7816D42DF44FBDD …\Source\LifePlay\LPCityMapsWindow.h
094FF220C4827C11594338163085408E …\Source\LifePlay\LPCityMapsWindow.cpp
7B7222797ED66A664F157058D3268228 …\Source\LifePlay\LPCityMapsSubsystem.h
568B7217AC1B456096E6FE47A74839CB …\Source\LifePlay\LPCityMapsSubsystem.cpp
38C28745AC538EE3A643A016A125EA16 …\Source\LifePlay\LifePlay.Build.cs
00298B7B8846244BD4992D61A8C306BD …\Content\Data\LPCityMaps.json
B1DAB51315B0BA903B527ECD5A988666 …\Content\Data\Licenses\OpenStreetMap_Geodata_License.txt
FB4E3868914D1822BA2974106C0FBDFE …\Content\Data\Licenses\Vinfamy_License.txt
B1DAB51315B0BA903B527ECD5A988666 …\Licenses\OpenStreetMap_Geodata_License.txt
FB4E3868914D1822BA2974106C0FBDFE …\Licenses\Vinfamy_License.txt
Résultat : 11 fichiers identiques à IMPL § 1 (« après »), à la lettre. Seul écart : LPCityMapsDownload.cpp, MD5 8319FC65… au lieu de 0F5D9DDD… (IMPL), écart attendu et permis par la fiche (correctif UI). Preuve que c'est le seul changement : § 3.11.
Fichiers STM1 (Get-FileHash, 9 fichiers) : CC146CC6… LPCityWaterSubsystem.cpp, 4A6C6711… .h, E5027FD7… LPCityWaterMask.h, F3783338… LPCityNamesSubsystem.cpp, 10639483… .h, 01CC49D8… LPCityHouses.h, B4FF95AE… LPCityLandmarks.h, 7B44F5FA… LPAssetRegistryHelpers.cpp, 8E3B725A… .h. Résultat : 9/9 identiques à MAPDL1-E5-IMPL.md Constats 2 (valeurs complètes relues). Référence « avant » indépendante : absente (IMPL § 1 ne couvre pas STM1) ; dates d'écriture STM1 antérieures à l'instantané E5 (MAPDL1-E3-VAL.md § 3.3).
3.2 Fins de ligne : Tools\FileCheck.ps1
Commande : pwsh -NoProfile -Command "& 'D:\Game\LifePlay-master 5.8\Tools\FileCheck.ps1' -Path @(…10 chemins…)"
LF 0 180 0 - C1070FF639EF5710578BA33FB32E51D4 Source\LifePlay\LPCityMapsDownload.h
LF 0 1406 0 - 8319FC65523AF62DEE70A41ED98217D0 Source\LifePlay\LPCityMapsDownload.cpp
LF 0 67 0 - E2F30E7FE5814C99E7816D42DF44FBDD Source\LifePlay\LPCityMapsWindow.h
LF 0 585 0 - 094FF220C4827C11594338163085408E Source\LifePlay\LPCityMapsWindow.cpp
LF 0 178 0 - 7B7222797ED66A664F157058D3268228 Source\LifePlay\LPCityMapsSubsystem.h
LF 0 946 0 - 568B7217AC1B456096E6FE47A74839CB Source\LifePlay\LPCityMapsSubsystem.cpp
LF 0 63 0 - 38C28745AC538EE3A643A016A125EA16 Source\LifePlay\LifePlay.Build.cs
LF 0 15 0 - 00298B7B8846244BD4992D61A8C306BD Content\Data\LPCityMaps.json
LF 0 155 0 - B1DAB51315B0BA903B527ECD5A988666 Content\Data\Licenses\OpenStreetMap_Geodata_License.txt
LF 0 5 0 - FB4E3868914D1822BA2974106C0FBDFE Content\Data\Licenses\Vinfamy_License.txt
fichiers=10 LF=10 alertes=0 introuvables=0
Résultat : 0 alerte (critère de la fiche § 1 : 0 alerte attendue). Lignes CR = 0 et BOM = 0 sur les 10 fichiers. Code de sortie : l'outil Bash n'a pas rendu de code de sortie pour cette commande ; le résumé « alertes=0 » est la preuve retenue.
Note : LPCityMapsDownload.cpp = 1406 l. (IMPL : 1403) ; les 3 lignes d'écart sont celles du correctif (§ 3.11).
3.3 Test-Json de LPCityMaps.json et champs fichier
Commande : Get-Content -Raw -LiteralPath '…\Content\Data\LPCityMaps.json' | Test-Json, puis lecture des champs.
True
osm -> Data/Licenses/OpenStreetMap_Geodata_License.txt
lifeplay_ancienne -> Data/Licenses/Vinfamy_License.txt
Résultat : JSON valide. Les deux chemins pointent sur Content\Data\Licenses\ (fichiers présents, § 3.1 et § 3.7).
3.4 Critère a : suppressions et Move
- Grep
Delete|DeleteDirectory|RemoveDirectory|DeleteFile|\.Delete\(surSource\LifePlay\LPCityMaps*: aucun résultat. - Grep
Remove(même périmètre,LPCityMapsDownload.*) : 4 occurrences, toutesFTSTicker::GetCoreTicker().RemoveTicker(...)(LPCityMapsDownload.cpp:615, 1039, 1094, 1329). Ce ne sont pas des suppressions de fichier. - Grep
Copy\(|Move\(|Replace:Moveune seule fois,LPCityMapsDownload.cpp:112:IFileManager::Get().Move(*Destination, *Source, false, false, false, true). Tous les appels passent parMoveFileSafe(:110-113), doncReplace = false(3e argument) partout.Copy:LPCityMapsDownload.cpp:1235:FileManager.Copy(*Final, *SourcePath, false). - Moteur :
FileManager.h:113(Move(Dest, Src, Replace=1, EvenIfReadOnly=0, Attributes=0, bDoNotRetryOrError=0)) ;FileManager.h:110(Copy(…, Replace=1, …)). LeReplacevrai supprime la destination (FileManagerGeneric.cpp:303) : évité ici.
Résultat : établi. Réserve R-4 : la copie du moteur supprime sa propre destination partielle en cas d'échec (FileManagerGeneric.cpp:231-234) ; cette destination est neuve (la version précédente est mise de côté avant, LPCityMapsDownload.cpp:1229-1233), et la source (fichier du joueur) n'est jamais supprimée.
3.5 Critère 4 (compilation sans l'addon)
- Grep
LPSandbox|LPModTools|LifePlaySandboxsurSource\LifePlay\LPCityMaps*: aucun résultat. GrepLPModInfo|#include "LPMod: une occurrence en commentaire (LPCityMapsWindow.h:2) etLPCityMapsSubsystem.cpp:21(#include "LPModGuard.h"). - Glob
**/LPModGuard.hsousSource:Source\LifePlay\LPModGuard.h, dans le module du jeu (pas l'addon). LifePlay.Build.cslu en entier (63 l.) : aucune dépendance LPSandbox ni LPModTools ; dépendances E5"HTTP", "OpenSSL", "libzip"à:49.
Résultat : établi.
3.6 Critère i : DirectoriesToAlwaysStageAsUFS
Grep DirectoriesToAlwaysStageAsUFS|LPModGuard|LPSandbox|LPModTools sur Config\ : Config\DefaultGame.ini:75 = +DirectoriesToAlwaysStageAsUFS=(Path="Data").
Résultat : établi.
3.7 Mods\ et licences
- Glob
*sousMods\:No files found(dossier présent, vide). - Glob
*sousContent\Data\Licenses\:Content\Data\Licenses\OpenStreetMap_Geodata_License.txt,Content\Data\Licenses\Vinfamy_License.txt(deux fichiers, aucun autre).
3.8 État git (lecture seule : git status --short, git diff --stat)
M Config/DefaultGame.ini
M Source/LifePlay/LifePlay.Build.cs
?? Content/Data/
?? Source/LifePlay/LPCityMapsDownload.cpp
?? Source/LifePlay/LPCityMapsDownload.h
?? Source/LifePlay/LPCityMapsSubsystem.cpp
?? Source/LifePlay/LPCityMapsSubsystem.h
?? Source/LifePlay/LPCityMapsWindow.cpp
?? Source/LifePlay/LPCityMapsWindow.h
Config/DefaultGame.ini | 1 +
Source/LifePlay/LifePlay.Build.cs | 8 ++++++++
2 files changed, 9 insertions(+)
Résultat : aucun fichier hors périmètre parmi les fichiers E5 ; Mods\ absent de git status (vide, § 3.7). Pas de Blueprint, pas de fichier de Tools\.
3.9 Dates d'écriture et ordre compilation / modification
2026-10-22 16:49:22 6836 Source\LifePlay\LPCityMapsDownload.h
2026-10-22 17:27:49 42383 Source\LifePlay\LPCityMapsDownload.cpp
2026-10-22 16:55:24 2530 Source\LifePlay\LPCityMapsWindow.h
2026-10-22 17:10:54 20313 Source\LifePlay\LPCityMapsWindow.cpp
2026-10-22 17:11:35 7214 Source\LifePlay\LPCityMapsSubsystem.h
2026-10-22 17:12:39 30413 Source\LifePlay\LPCityMapsSubsystem.cpp
2026-10-22 17:12:50 3300 Source\LifePlay\LifePlay.Build.cs
2026-10-22 17:12:50 693 Content\Data\LPCityMaps.json
2026-10-22 17:29:09 6346 Saved\Logs\portage\MAPDL1-E2T_Build_20261022-172856.log
2026-10-22 17:31:09 2780 Saved\Logs\portage\MAPDL1-E2T_Build_20261022-172922.log
Résultat : la dernière écriture d'un fichier E5 (17:27:49) précède le début de la compilation éditeur du journal 172856 (17:28:56 d'après son nom). La compilation porte donc sur le contenu actuel. Les fichiers modifiés après la compilation : aucun.
3.10 Recomptage des journaux de compilation (Grep, sans Build.ps1 -FromLog)
Commande : Grep error C|error LNK|warning C|Result:|Total execution time|Using Visual Studio sur les deux journaux.
MAPDL1-E2T_Build_20261022-172856.log (éditeur)
33:Using Visual Studio 14.50.35739 toolchain (…\MSVC\14.50.35717) and Windows 10.0.22621.0 SDK (…)
52:Result: Succeeded
53:Total execution time: 12.02 seconds
MAPDL1-E2T_Build_20261022-172922.log (jeu Development)
14:Using Visual Studio 14.50.35739 toolchain (…\MSVC\14.50.35717) and Windows 10.0.22621.0 SDK (…)
38:Result: Succeeded
39:Total execution time: 105.68 seconds
Résultat : 0 error C, 0 error LNK, 0 warning C dans les deux journaux. Concordance avec MAPDL1-E2T-BUILD.md § 4 (lignes 52-53 et 38-39, Result: Succeeded). Les chiffres du résumé E2T (0 erreur, 0 avertissement compilateur, 1 et 9 unités) ne sont pas recomptés ici : ce recomptage porte sur les lignes d'erreur et de résultat.
3.11 Correctif UI : diff contre l'instantané E2T (seule différence)
Commande : git diff --no-index -- "…\MAPDL1-E2T\Source\LifePlay\LPCityMapsDownload.cpp" "…\Source\LifePlay\LPCityMapsDownload.cpp" (MD5 de l'instantané : 0F5D9DDD3614CFE23FCCD0EA55A3B7B1, d'après MAPDL1-E2T\manifest.csv et Get-FileHash).
@@ -14,10 +14,13 @@
#include "Misc/Paths.h"
// OpenSSL (EVP, SHA-256) et libzip : avant les en-tetes Windows …
+// UI : le typedef d'OpenSSL heurte l'espace de noms UI du moteur (C2365, E2 bis) ; meme parade que BuildPatchServices/Crypto.cpp.
+#define UI UI_ST
THIRD_PARTY_INCLUDES_START
#include "openssl/evp.h"
#include "libzip/zip.h"
THIRD_PARTY_INCLUDES_END
+#undef UI
#if PLATFORM_WINDOWS
Résultat : établi. Trois lignes ajoutées (commentaire, #define UI UI_ST avant les en-têtes OpenSSL, #undef UI après THIRD_PARTY_INCLUDES_END), aucune ligne retirée, aucune autre modification. Les lignes 16 à 25 du fichier actuel contiennent ce correctif et rien d'autre. Code de sortie git diff --no-index : 1 (différences, pas une erreur).
3.12 Diffs des fichiers suivis contre les instantanés E5 (décompte recalculé)
21 3 …\MAPDL1-E5\Source\LifePlay\LPCityMapsSubsystem.h => …\Source\LifePlay\LPCityMapsSubsystem.h
109 5 …\MAPDL1-E5\Source\LifePlay\LPCityMapsSubsystem.cpp => …\Source\LifePlay\LPCityMapsSubsystem.cpp
4 0 …\MAPDL1-E5\Source\LifePlay\LifePlay.Build.cs => …\Source\LifePlay\LifePlay.Build.cs
2 2 …\MAPDL1-E5\Content\Data\LPCityMaps.json => …\Content\Data\LPCityMaps.json
Concordance avec MAPDL1-E5-IMPL.md § 1 : +21 −3, +109 −5, +4 −0, +2 −2 : identique. Diff du JSON : seules les lignes 7 et 11 ("fichier") changent ; titre inchangé (voir § 4).
4. Diff lu en entier (fichiers, compte)
| Fichier | État | Compte | Lu |
|---|---|---|---|
Source/LifePlay/LPCityMapsDownload.h |
neuf (??) |
180 l. | en entier |
Source/LifePlay/LPCityMapsDownload.cpp |
neuf (??) |
1406 l. (1403 + 3 du correctif) | en entier ; diff E2T lu (§ 3.11) |
Source/LifePlay/LPCityMapsWindow.h |
neuf (??) |
67 l. | en entier |
Source/LifePlay/LPCityMapsWindow.cpp |
neuf (??) |
585 l. | en entier |
Source/LifePlay/LPCityMapsSubsystem.h |
neuf (??, E1 + E5) |
178 l. ; E5 : +21 −3 | en entier ; diff E5 lu (§ 3.12) |
Source/LifePlay/LPCityMapsSubsystem.cpp |
neuf (??, E1 + E5) |
946 l. ; E5 : +109 −5 | en entier ; diff E5 lu, 5 hunks (imports, RestartRequired, SortGroup, clic, Deinitialize, Tick, DecorateRows, OpenCityWindow, MarkRestartRequired) |
Source/LifePlay/LifePlay.Build.cs |
M | 63 l. ; E5 : +4 −0 ; contre HEAD : 8 insertions | en entier ; diff E5 lu |
Content/Data/LPCityMaps.json |
neuf (??) |
15 l. ; E5 : +2 −2 | en entier ; diff E5 lu |
Content/Data/Licenses/*.txt (2) |
neufs (??) |
155 l. et 5 l. | MD5 seulement (copies à l'octet) |
Config/DefaultGame.ini |
M | +1 contre HEAD | ligne 75 seule (Grep, § 3.6) ; diff E1 lu dans E3-VAL § 3.4 |
Ajouts de E5 hors fiche : aucun. Modifications faites par le validateur : aucune (§ Constats).
5. Verdict et contrôles de la fiche (§ 3 de la fiche)
| # | Critère (fiche E5 § 3 et § 2) | Verdict | Preuve (fichier:ligne) |
|---|---|---|---|
| a | Aucun Delete / DeleteDirectory / Remove (fichier) ; Move avec Replace=false |
établi | § 3.4 : aucun Delete ; Move unique LPCityMapsDownload.cpp:112, Replace=false ; Copy :1235 avec false. Réserve R-4 (moteur, destination partielle). |
| b | Installation complète refusée si GIsEditor : au clic et avant la pose |
établi | LPCityMapsDownload.cpp:773-778 (au clic, avant tout téléchargement) ; :1268-1273 (avant la pose) ; LPCityMapsWindow.cpp:457-465 (appel). |
| c | Membre avec .. ou ., ou chemin absolu : refusé ; pose sous ProjectDir |
établi, avec réserve R-1 | :209-265 : \ et : (:218), chemin absolu (:224), segments .. et . (:236), préfixes autorisés (:246-251). Pose : Root = ProjectDir (:445), destinations Root / Tree / Rel (:572). Racines de l'archive vérifiées avant toute extraction (:389-436). |
| d | SHA-256 contrôlé avant toute pose ; écart : fichier déplacé (pas supprimé), URL suivante | établi | Pose seulement depuis OnPackageReady (:1248-1263), elle-même après OnVerified conforme (:1138-1201). Écart :1158-1163 : RejectFile (déplacement dans _rejet, :1388-1406) puis NextUrl (:1058-1069). Cache : :1165-1177. |
| e | Seules les URL https acceptées (lecture de l'index) |
établi | LPCityMapsSubsystem.cpp:123-126 (IsHttps), :415-433 (liens et page filtrés à la lecture), LPCityMapsDownload.cpp:808-812 (contrôle repris au départ de l'essai). |
| f | Aucun texte de licence sans son fichier ; accord demandé avant le téléchargement | établi | LPCityMapsWindow.cpp:71 (non coché à l'ouverture), :199-207 (boutons de téléchargement actifs seulement si bAccepted), :459 (OnStart), :500-539 (texte chargé depuis ProjectContentDir()/<fichier>, :523, sinon Licence text not found, :534). |
| g | Les 2 fichiers de Licenses identiques à l'octet à Licenses\ |
établi | MD5 § 3.1 : B1DAB513… et FB4E3868… des deux côtés. |
| h | LPCityMaps.json valide (Test-Json), champs fichier existants sous Content\ |
établi | § 3.3 (True) ; Content\Data\Licenses\*.txt présents (§ 3.7) ; LPCityMaps.json:7 et :11. |
| i | DefaultGame.ini : +DirectoriesToAlwaysStageAsUFS=(Path="Data") |
établi | Config\DefaultGame.ini:75 (§ 3.6). |
| 4 | Compilation sans l'addon : aucun include ni module LPSandbox / LPModTools | établi | § 3.5 : aucun. LPModGuard.h est dans Source\LifePlay\ (jeu). |
Verdict global : PASS-STATIC.
Réserves (pas de contradiction, mais à trancher) :
- R-1 (ouverte) :
LPCityMapsDownload.cpp:236ne refuse que..et.. Un segment fait seulement de points, comme..., passe. Le critère, tel qu'écrit, est satisfait ; le risque est que Windows normalise...et fasse remonter l'écriturePoseDir / Member.Name(:473) hors deSaved/Downloads/<pack>/_pose. Le comportement de normalisation n'est pas lu dans les sources : incertain. Essai qui tranche : un zip de test à segments..., posé dans un dossier jetable hors du jeu, ou la lecture de la normalisation Win32 dans les sources du moteur. Recommandation : refuser tout segment fait seulement de points. - R-4 (note) : la copie du moteur supprime sa destination partielle en cas d'échec (
FileManagerGeneric.cpp:231-234). La destination est neuve ; la source n'est jamais touchée. - R-5 (en jeu) : si
RejectFileéchoue après un SHA faux (:1161), le.partreste et est re-vérifié à l'URL suivante (:814-833,:1113-1136). La pose reste bloquée par le contrôle ; c'est à confirmer en jeu.
Témoin en jeu : à créer. La fiche de tests MAPDL1-E4-TESTS.md ne contient aucun cas E5 (Grep E5|LPCityMapsDownload|téléchargement|Témoin|COMMUN sans résultat). Demande à l'orchestrateur : ouvrir le cas (fiche FIT, gabarit de lp-doc).
6. Points à confirmer par l'utilisateur (cases)
- R-1 : refuser aussi les segments faits seulement de points (
...) ? La correction est à donner à une IMPL ; le validateur ne corrige pas. - E-2 : accepter les entrées de dossier parents (
LifePlay/,LifePlay/Mods/,LifePlay/Content/,LifePlay/Content/Modules/) ? La fiche § 2.4 disait « chaque nom commence par … ». - E-1 : accepter
zip_source_win32w_create+zip_open_from_source(ZIP_RDONLY)à la place dezip_open(fiche § 2.4 étape 2) ? - Témoin en jeu : cas à créer pour E5 (R8) ; demande à l'orchestrateur.
- Ordre de commit E1, E5 et STM1 (V-14) : décision du gardien.
villes: []dansLPCityMaps.json: aucune ville téléchargeable tant que l'index n'est pas généré ; l'essai en jeu demande un index d'essai (Saved\LPCityMaps.json).
Points qui ne se vérifient qu'en jeu (non rejoués, non mesurés) : V-6 Shipping (comdlg32), V-7 (licences dans le pak), V-8 (rendu), V-9 (redirections, Range, casse de Content-Range), V-10 (coupure, reprise, 200 sur reprise, SHA faux, miroir, recours), V-11 (pose, retour arrière, _ancien, « Restart required », montage au lancement suivant), V-12 (éditeur), V-13 (Deinitialize), R-1 (test de segments ...), R-5 (.part corrompu), lecture de licence en build empaqueté (FFileHelper sur ProjectContentDir()), sélecteur « Choose file » (GetOpenFileNameW, jamais utilisé dans le moteur, MAPDL1-E5-IMPL.md Constats 1).
Tours : 8 / 40 (décompte de l'agent au moment de l'écriture, ce tour compris ; FicheStats non lancé)
Constats
Écarts à la fiche (déclarés par l'IMPL, vérifiés) :
- E-1 :
zip_source_win32w_create(LPCityMapsDownload.cpp:274) puiszip_open_from_source(…, ZIP_RDONLY, …)(:281), au lieu dezip_open. Non contraire au critère c. Décision § 6. - E-2 : dossiers parents admis (
:252-262), au lieu du refus littéral de la fiche § 2.4. Non contraire au critère c (aucun..,.ni chemin absolu). Décision § 6. - E-3 : pose fichier par fichier (
:523-586,IFileManager::Moveun fichier à la fois). Établi. - E-4 : refus
GIsEditorau clic (:773) et avant la pose (:1268), plus tôt que l'étape 1 de la pose. Même résultat. Établi. - E-5 : surveillance de Téléchargements démarrée à l'entrée du recours (
:1076,LPCityMapsWindow.cpp:553). Établi. - E-6 : statut HTTP jugé à la fin (
:915-916,:930), sansOnStatusCodeReceived. Établi.
Choix C-1 à C-12 : revus, aucun ne contredit une règle de la fiche. C-12 (fichier du joueur copié, jamais déplacé : :1224-1235) est conforme à la fiche § 2.5.
Modifications faites par le validateur sur la copie : aucune. Commandes de lecture seulement (Get-FileHash, FileCheck.ps1, Test-Json, git status, git diff --stat, git diff --no-index, Grep, Glob, Read). Une commande Bash a été refusée par le crochet ecriture-gardien (accent grave dans la commande, aucun effet sur les fichiers) ; elle a été relancée sans ce caractère. Seul fichier écrit : ce livrable.
Non mesuré : compilation (non relancée, par consigne), Build.ps1 -FromLog (non lancé, § en-tête), LPTestStringCompat (commandlet interdit), LogStats (aucun journal de jeu), réseau, tout comportement en jeu.
Fichiers à commiter : aucun. La VAL ne commite pas ; le livrable MAPDL1-E3B-VAL.md reste hors dépôt jusqu'à décision du gardien.
À verser : aucun nouveau (le piège du recomptage sans Build.ps1 -FromLog est déjà versé par MAPDL1-E3-VAL.md, lp-validate § 2).
Suite : orchestrateur doit trancher R-1, E-1, E-2 (§ 6), ouvrir le cas témoin E5 (R8), et programmer E2 bis (compilation déjà faite par E2T) ou les essais en jeu ; état : code écrit et compilé à code 0 (E2T-BUILD), validation statique PASS-STATIC, jeu non testé.