172 lines
17 KiB
Markdown
172 lines
17 KiB
Markdown
|
|
Fiche MAPDL1-E0 — Niveau N1 — Modèle prévu haiku | utilisé claude-haiku-5-5 — Agent lp-inventory — Skills sk-protocol, lp-paths
|
||
|
|
# MAPDL1-E0-INV : inventaire des Blueprints, de l'API SHA, des dépendances de build (2026-10-22)
|
||
|
|
|
||
|
|
Hors gabarit : aucun. Gabarit INV (`.claude\skills\lp-doc\gabarits.md`, section INV) suivi : 1 commandes, 2 comptes bruts, 3 écarts, 4 établi / estimé / incertain.
|
||
|
|
Note de lecture : `Tools\uasset58.py` et `Tools\` sont dans la copie 5.8 (`Tools\uasset58.py` présent, Glob). Les chemins `Tools\claude\skills\lp-doc\gabarits.md` cités par la fiche n'existent pas dans la copie 5.8 (Read : « File does not exist ») ; le gabarit est lu à `.claude\skills\lp-doc\gabarits.md` (jonction).
|
||
|
|
|
||
|
|
## 1. Commandes exactes
|
||
|
|
|
||
|
|
Q1 (Blueprints contenant `GetAllFilesFromFolder`) :
|
||
|
|
- Contrôle de l'outil : `python -I -X utf8 "D:/Game/LifePlay-master 5.8/Tools/uasset58.py" strings "D:/Game/LifePlay-master 5.8/Content/UI/CityMenu.uasset" --motif "GetAllFilesFromFolder"` (code 0).
|
||
|
|
- Grep seul, pour comparaison : Grep `GetAllFilesFromFolder` sur `D:\Game\LifePlay-master 5.8\Content` (glob `*.uasset`), puis sur `Content\UI` (sans glob, mode count).
|
||
|
|
- Scan complet : `pwsh -NoProfile -ExecutionPolicy Bypass -File "D:/Game/LifePlay-master 5.8/Saved/MAPDL1/E0/q1-scan.ps1"` (script ponctuel écrit par Write dans `D:\Game\LifePlay-master 5.8\Saved\MAPDL1\E0\q1-scan.ps1` ; il énumère `Content\**\*.uasset` hors `Content\Heavy\` et `Content\Modules\`, lance `uasset58.py strings --motif "GetAllFilesFromFolder"` sur chaque fichier, puis `strings --motif "Heavy/StreetMap|StreetMap"` sur chaque hit). Sortie : tâche d'arrière-plan `bvsj17ox9`, fichier `<dossier de session>\tasks\bvsj17ox9.output` (hors projet).
|
||
|
|
- Pour chaque hit, recomptage : Grep `^/Game/Heavy/StreetMap/` (mode count) sur ce fichier de sortie ; Grep `Heavy/StreetMap` (mode count) sur `Content\UI\CityMenu.uasset`.
|
||
|
|
|
||
|
|
Q2 (`Content\UI\City.uasset`) :
|
||
|
|
- `python -I -X utf8 "D:/Game/LifePlay-master 5.8/Tools/uasset58.py" strings "D:/Game/LifePlay-master 5.8/Content/UI/City.uasset" --min 3 --motif "(Installed|Format|Loading)"` (code 0)
|
||
|
|
- `python -I -X utf8 "D:/Game/LifePlay-master 5.8/Tools/uasset58.py" locate "D:/Game/LifePlay-master 5.8/Content/UI/City.uasset" Installed "Not Installed"` (code 0)
|
||
|
|
|
||
|
|
Q3 (moteur, Core Public) :
|
||
|
|
- Grep `SHA256` (sensible à la casse), chemin `D:\Game\Launcher\Engine\UE_5.8\Engine\Source\Runtime\Core\Public`, mode content.
|
||
|
|
- Grep `FSHA1|FIoHashBuilder|class CORE_API FSHA1|FSHA256Signature|FPlatformMisc\b` (glob ciblé).
|
||
|
|
- Grep `FSHA|SHA1|SHA512|HMAC|Sha1|Sha512|IncrementalSha|Update\(|Final\(` sur Core\Public (limite 60 lignes ; bruit de `AppendHash`/`FSHA1` dans `Containers` et `Serialization`).
|
||
|
|
- Grep `class FSHA256|FSHA256|struct FSHA256` sur tout `Runtime\Core`.
|
||
|
|
- Grep `^(struct|class) (CORE_API )?FGenericPlatformMisc` sur `GenericPlatform\GenericPlatformMisc.h` ; Grep `FPlatformMisc;|struct FWindowsPlatformMisc|GetSHA256Signature` sur `Core\Public\Windows`.
|
||
|
|
- Read `GenericPlatform\GenericPlatformMisc.h` lignes 318-325 et 1398-1417 ; Read `Misc\SecureHash.h` lignes 310-350 ; Read `IO\IoHash.h` lignes 15-60.
|
||
|
|
|
||
|
|
Q4 (OpenSSL / libzip) :
|
||
|
|
- Read `D:\Game\Launcher\Engine\UE_5.8\Engine\Source\ThirdParty\OpenSSL\OpenSSL.Build.cs` et `...\ThirdParty\libzip\libzip.Build.cs` (entiers).
|
||
|
|
- Grep `OpenSSL|libzip` sur `D:\Game\Launcher\Engine\UE_5.8\Engine\Source\Runtime` (glob `*.Build.cs`, mode content, sans limite).
|
||
|
|
- Grep `libzip` sur le même chemin (glob `*.Build.cs`, mode count).
|
||
|
|
|
||
|
|
Q5 (`D:\Game\LifePlay-master 5.8\Source\LifePlay\LifePlay.Build.cs`) : Read entier (55 lignes).
|
||
|
|
|
||
|
|
## 2. Comptes bruts
|
||
|
|
|
||
|
|
Q1 (sorties brutes) :
|
||
|
|
- Contrôle de l'outil sur CityMenu : `exports 382 contigus=True noms=571 taille=459239` / `CallFunc_GetAllFilesFromFolder_Files` / `CallFunc_GetAllFilesFromFolder_ReturnValue` / `GetAllFilesFromFolder` / `EXIT=0`.
|
||
|
|
- Grep `GetAllFilesFromFolder` sur `Content` (glob `*.uasset`) : `No files found`. Sur `Content\UI` (count) : `No matches found` / `Found 0 total occurrences across 0 files.` Le Grep ne lit pas les `.uasset` ici : il ne trouve pas le nom que `uasset58.py` trouve dans `CityMenu.uasset`. Grep ne sert donc pas à ce comptage.
|
||
|
|
- Scan (`q1-scan.ps1`), lignes de tête et de synthèse, copiées telles quelles :
|
||
|
|
```
|
||
|
|
fichiers_uasset_hors_Heavy_Modules=798
|
||
|
|
...
|
||
|
|
illisibles=210
|
||
|
|
hits_GetAllFilesFromFolder=6
|
||
|
|
```
|
||
|
|
- Les 210 illisibles (`ILLISIBLE code=2 …`) sont tous sous `Content\__ExternalActors__\` (ThirdPersonMap, VehicleExampleMap, VehicleOffroadExampleMap) ou `Content\__ExternalObjects__\` (mêmes cartes). Comptage : Grep `^ILLISIBLE code=2 Content\\[^_]` sur le fichier de sortie = `No matches found` (0 hors `__`).
|
||
|
|
- Hits (6), dans l'ordre du scan :
|
||
|
|
|
||
|
|
| # | Fichier (sous `Content\`) | Chaînes `StreetMap` (strings --motif, code 0) | Lecture |
|
||
|
|
|---|---|---|---|
|
||
|
|
| 1 | `BPs\GI.uasset` | `/Game/BPs/StreetMap_Static`, puis 562 lignes `^/Game/Heavy/StreetMap/…` (Grep count, fichier de sortie) dont le sous-dossier `/Game/Heavy/StreetMap/Static/…` | Liste de cartes de villes (noms de cartes, pas de contenu de jeu relevé ici) |
|
||
|
|
| 2 | `BPs\Room.uasset` | `/Game/BPs/StreetMap_Static`, `/Script/StreetMapRuntime`, `StreetMap`, `StreetMapBuilding`, `StreetMapBuilding:Amenity`, `StreetMapBuilding:Building`, `StreetMapBuilding:BuildingName`, `StreetMapBuilding:BuildingPoints`, `StreetMapStatic`, `StreetMap_Static_C` | Aucune chaîne `Heavy/StreetMap` |
|
||
|
|
| 3 | `UI\Builder.uasset` | aucune ligne (exports 831) | Motif absent |
|
||
|
|
| 4 | `UI\CharGen.uasset` | aucune ligne (exports 3600) | Motif absent |
|
||
|
|
| 5 | `UI\CityMenu.uasset` | `/Game/BPs/StreetMap_Static`, `/Script/StreetMapRuntime`, `Heavy/StreetMap` (1 ligne, Grep count = 2 lignes binaires), `StreetMapBuilding`, `StreetMapStatic`, `StreetMap_Static_C`, plus une phrase d'infobulle (« The OpenStreetMap data may have a lot of buildings… ») | Attendu connu |
|
||
|
|
| 6 | `UI\StatMenu.uasset` | aucune ligne (exports 318) | Motif absent |
|
||
|
|
|
||
|
|
Q2 (sorties brutes) :
|
||
|
|
```
|
||
|
|
exports 101 contigus=True noms=435 taille=251368
|
||
|
|
CallFunc_Format_ReturnValue
|
||
|
|
Format
|
||
|
|
FormatArgumentData
|
||
|
|
Installed
|
||
|
|
InstalledText
|
||
|
|
K2Node_FormatText
|
||
|
|
Loading, Please Wait ...
|
||
|
|
Not Installed
|
||
|
|
SetLoading
|
||
|
|
EXIT=0
|
||
|
|
```
|
||
|
|
`locate` :
|
||
|
|
```
|
||
|
|
exports 101 contigus=True noms=435 taille=251368
|
||
|
|
== Installed : 6
|
||
|
|
@136830 export #10 ExecuteUbergraph_City classe=Function +3640/6574
|
||
|
|
@139027 export #10 ExecuteUbergraph_City classe=Function +5837/6574
|
||
|
|
@164062 export #22 K2Node_CallFunction_0 classe=K2Node_CallFunction +1188/1238
|
||
|
|
@201100 export #54 K2Node_FormatText_0 classe=K2Node_FormatText +347/617
|
||
|
|
@242145 export #95 InstalledText classe=TextBlock +115/504
|
||
|
|
@243189 export #97 InstalledText classe=TextBlock +115/504
|
||
|
|
== Not Installed : 2
|
||
|
|
@242141 export #95 InstalledText classe=TextBlock +111/504
|
||
|
|
@243185 export #97 InstalledText classe=TextBlock +111/504
|
||
|
|
EXIT=0
|
||
|
|
```
|
||
|
|
|
||
|
|
Q3 (comptes) :
|
||
|
|
- Grep `SHA256` (Core\Public) : 4 lignes, toutes dans `GenericPlatform\GenericPlatformMisc.h` (320, 322, 1405, 1414).
|
||
|
|
- Grep `FSHA|SHA1|…|Final\(` (Core\Public) : sortie tronquée à 60 lignes ; visibles : `Misc\SecureHash.h:313` (`class FSHA1`), `Misc\SecureHash.h:332/335/345/348` (dans la lecture), `Serialization\MemoryLayout.h:322` (`HashLayout(…, FSHAHash&)`) ; `Hash\xxhash.h:214-237` (`Update` xxHash, non cryptographique) ; `IO\IoHash.h:188` (`class FIoHashBuilder : public FBlake3`).
|
||
|
|
- Grep `class FSHA256|FSHA256|struct FSHA256` (Runtime\Core) : 3 lignes : `Core\Private\GenericPlatform\GenericPlatformMisc.cpp:429` (`FSHA256Signature::ToString`), `…cpp:2019` (`FGenericPlatformMisc::GetSHA256Signature`), `Core\Public\GenericPlatform\GenericPlatformMisc.h:322` (définition de la structure).
|
||
|
|
- Grep `^(struct|class) (CORE_API )?FGenericPlatformMisc` : 1 ligne, `GenericPlatformMisc.h:571` (`struct FGenericPlatformMisc`).
|
||
|
|
- Grep `FPlatformMisc;|struct FWindowsPlatformMisc|GetSHA256Signature` (Core\Public\Windows) : 2 lignes, `Windows\WindowsPlatformMisc.h:113` (`struct FWindowsPlatformMisc`), `Windows\WindowsPlatformMisc.h:414` (`typedef FWindowsPlatformMisc FPlatformMisc;`). Aucune redéfinition de `GetSHA256Signature` dans `Public\Windows`.
|
||
|
|
|
||
|
|
Lectures (Read) :
|
||
|
|
- `GenericPlatformMisc.h:320-322` : `/* Holds a computed SHA256 hash. */` / `struct FSHA256Signature` / `uint8 Signature[32];`.
|
||
|
|
- `GenericPlatformMisc.h:1404-1414` : doc « Generates the SHA256 signature of the given data » ; signature exacte, ligne 1414 :
|
||
|
|
`static CORE_API bool GetSHA256Signature(const void* Data, uint32 ByteSize, FSHA256Signature& OutSignature);`
|
||
|
|
- `Misc\SecureHash.h:313-348` : `class FSHA1` (SHA-1), `CORE_API void Reset();` (329), `CORE_API void Update(const uint8 *data, uint64 len);` (332), `template … void Update(const Type& InData)` (338), `CORE_API void Final();` (345), `FSHAHash Finalize()` (348).
|
||
|
|
- `IO\IoHash.h:17-25` : `FIoHash` = BLAKE3-160 ; « use FIoHashBuilder to hash data in blocks with FIoHashBuilder::Update(Block) followed by FIoHashBuilder::Finalize() » ; `IoHash.h:188` `class FIoHashBuilder : public FBlake3`.
|
||
|
|
|
||
|
|
Q4 (comptes) :
|
||
|
|
- `OpenSSL.Build.cs` : version `1.1.1t` (ligne 12). Win64 (lignes 33-54) : `libssl.lib` (ligne 51), `libcrypto.lib` (ligne 52), `crypt32.lib` en `PublicSystemLibraries` (ligne 53). Chemins : `Win64\VS<version>` (42), config `Release` ou `Debug` (17, 49).
|
||
|
|
- `libzip.Build.cs` : version `1.9.2` (ligne 8). Dépendances publiques : `OpenSSL` (ligne 14), `zlib` (ligne 15). Win64 : `Win64\<WindowsLibDir>\Release\zip.lib` (ligne 24). Mac (26-28) et Unix (30-33) hors Win64.
|
||
|
|
- Grep `OpenSSL|libzip` (Runtime, `*.Build.cs`) : 13 lignes, 9 fichiers :
|
||
|
|
```
|
||
|
|
Runtime\Experimental\IoStore\HttpClient\IoStoreHttpClient.Build.cs:12 PrivateDependencyModuleNames.Add("OpenSSL");
|
||
|
|
Runtime\TraceLog\TraceLog.Build.cs:28 PrivateDependencyModuleNames.Add("OpenSSL");
|
||
|
|
Runtime\Online\XMPP\XMPP.Build.cs:17,44,46 (bRequireOpenSSL ; AddEngineThirdPartyPrivateStaticDependencies(Target, "OpenSSL"))
|
||
|
|
Runtime\Online\WebSocketServer\WebSocketServer.Build.cs:27 AddEngineThirdPartyPrivateStaticDependencies(… "OpenSSL", "libWebSockets", "zlib")
|
||
|
|
Runtime\Online\WebSockets\WebSockets.Build.cs:118 AddEngineThirdPartyPrivateStaticDependencies(… "OpenSSL", "libWebSockets", "zlib")
|
||
|
|
Runtime\RSA\RSA.Build.cs:15 PrivateDependencyModuleNames.Add("OpenSSL");
|
||
|
|
Runtime\Online\SSL\SSL.Build.cs:45 AddEngineThirdPartyPrivateStaticDependencies(Target, "OpenSSL");
|
||
|
|
Runtime\Online\HTTP\HTTP.Build.cs:88,183,186 (bPlatformRequiresOpenSSL ; AddEngineThirdPartyPrivateStaticDependencies(Target, "OpenSSL"))
|
||
|
|
Runtime\Online\BuildPatchServices\BuildPatchServices.Build.cs:48,54 (commentaire « OpenSSL is needed on desktop platforms… » ; AddEngineThirdPartyPrivateStaticDependencies(Target, "OpenSSL"))
|
||
|
|
```
|
||
|
|
Total : 13 lignes (sortie complète, `head_limit` 0).
|
||
|
|
- Grep `libzip` (Runtime, `*.Build.cs`, mode count) : `No matches found` / `Found 0 total occurrences across 0 files.` → 0 module Runtime dépend de `libzip` dans un `*.Build.cs`.
|
||
|
|
|
||
|
|
Q5 (lignes de `LifePlay.Build.cs`) :
|
||
|
|
- Dépendances publiques : ligne 17 `Core`, `CoreUObject`, `Engine`, `InputCore`, `AssetRegistry` ; ligne 28 `NavigationSystem` ; ligne 45 `LPAnimCore`.
|
||
|
|
- Dépendances privées : ligne 20 `ImageWrapper`, `ApplicationCore` ; ligne 23 `RHI` ; ligne 31 `EngineSettings` ; ligne 34 `Projects` ; ligne 38 `Slate`, `SlateCore`, `UMG` ; ligne 41 `Chaos`.
|
||
|
|
- Ligne 15 : `PublicIncludePaths.Add(ModuleDirectory)` (pas une dépendance). Ligne 48 : `Slate`/`SlateCore` en commentaire (inactif).
|
||
|
|
- `HTTP` : absent. `Json` (et `JsonUtilities`) : absent. `Slate`, `SlateCore`, `UMG` : présents, tous en privé (ligne 38).
|
||
|
|
|
||
|
|
## 3. Écarts au compte attendu
|
||
|
|
|
||
|
|
- Q1 : attendu connu `Content\UI\CityMenu.uasset` : confirmé (hit 5). Écarts : 210 fichiers illisibles (code 2) sur 798, tous sous `__ExternalActors__` / `__ExternalObjects__` ; ces fichiers ne sont donc pas vérifiés. Le Grep natif ne trouve pas le nom dans les `.uasset` (0 au lieu de 1) : écart d'outil, non de contenu.
|
||
|
|
- Q1 : la fiche demande « tous les `.uasset` » hors Heavy/Modules : 798 lus dont 588 lisibles. Le compte de 798 vient du script (`Get-ChildItem -Recurse -Filter *.uasset`), pas d'un Glob (le Glob `Content/**/*.uasset` inclut Heavy : 9074 au total, non filtré).
|
||
|
|
- Q2 : la fiche attend « Installed » comme texte comparé au clic. Écart : la chaîne `Installed` seule n'existe pas comme FText isolé dans la sortie `strings` ; les occurrences `locate` de `Installed` sont des noms (`ExecuteUbergraph_City`, `K2Node_CallFunction_0`, `InstalledText`) et une sous-chaîne de `Not Installed` (offset +115 = +111 + 4, export 95 et 97).
|
||
|
|
- Q3 : aucune API SHA-256 incrémentale trouvée (écart à l'hypothèse de la fiche, qui la supposait possible).
|
||
|
|
- Q4 : aucun écart de compte ; `libzip` n'a aucun dépendant Runtime.
|
||
|
|
- Q5 : aucun écart.
|
||
|
|
|
||
|
|
## 4. Établi / estimé / incertain
|
||
|
|
|
||
|
|
Établi :
|
||
|
|
- Q1 : `GI.uasset`, `Room.uasset`, `UI\Builder.uasset`, `UI\CharGen.uasset`, `UI\CityMenu.uasset`, `UI\StatMenu.uasset` contiennent `GetAllFilesFromFolder` (6 hits sur 588 fichiers lisibles). Sources : scan `q1-scan.ps1`, sortie `bvsj17ox9.output`, lignes 214, 800, 813, 816, 819, 829.
|
||
|
|
- Q1 : `Heavy/StreetMap` (forme exacte) est présent dans `CityMenu.uasset` seulement parmi les 6 hits ; `GI.uasset` a `/Game/Heavy/StreetMap/…` (562 lignes), `Room.uasset` a `StreetMap` / `StreetMapBuilding` / `/Game/BPs/StreetMap_Static` sans `Heavy/`.
|
||
|
|
- Q2 : textes FText présents : `Not Installed` (export 95 et 97, TextBlock `InstalledText`, offset +111), `Loading, Please Wait ...`. `Format` = `K2Node_FormatText` (export 54).
|
||
|
|
- Q3 : `FSHA256Signature` (struct, `GenericPlatformMisc.h:322`), `GetSHA256Signature` one-shot (`GenericPlatformMisc.h:1414`), `FPlatformMisc` = `FWindowsPlatformMisc` (`WindowsPlatformMisc.h:414`). SHA-1 incrémental : `FSHA1` (`SecureHash.h:313-348`). BLAKE3 incrémental : `FIoHashBuilder` (`IoHash.h:188`). Pas de SHA-256 incrémental dans `Public\`.
|
||
|
|
- Q4 et Q5 : listes ci-dessus, lues dans les fichiers.
|
||
|
|
|
||
|
|
Estimé :
|
||
|
|
- Q1 : les 210 fichiers `__ExternalActors__` / `__ExternalObjects__` sont des acteurs externes de cartes d'exemple (nom du dossier) ; leur contenu n'a pas été lu.
|
||
|
|
- Q3 : `GetSHA256Signature` (Core\Private `.cpp:2019`) est une implémentation générique ; son corps n'a pas été lu, donc la plateforme Windows sous-jacente (CNG ou OpenSSL) est inconnue.
|
||
|
|
- Q2 : le texte comparé au clic est probablement `Not Installed` / `Installed`, par la logique de l'`ExecuteUbergraph_City` ; non établi.
|
||
|
|
|
||
|
|
Incertain :
|
||
|
|
- Q1 : absence de `GetAllFilesFromFolder` dans les 210 fichiers illisibles : non vérifiée (essai qui trancherait : ouvrir `uasset58.py` sur un de ces fichiers pour voir la cause du code 2, ou lire les `.uasset` externes par un autre outil).
|
||
|
|
- Q1 : les hits `GI.uasset` et `Room.uasset` sont dans `Content\BPs\` ; leur rôle n'est pas lu (hors fiche).
|
||
|
|
- Q2 : quel FText est comparé au clic (aucun nœud de comparaison n'a été décodé ; un `locate` sur `K2Node_` pins ou `Equal` serait nécessaire).
|
||
|
|
- Q3 : `Runtime\Core\Public` ne contient pas de SHA-256 incrémental ; la recherche n'a pas couvert `Core\Private` (hors demande) ni les modules `Developer/` ; la sortie `Update(`/`Final(` a été tronquée à 60 lignes (ajouts `head_limit`), donc un Update SHA-256 sous un autre nom est peu probable mais non exclu.
|
||
|
|
- Q4 : `Runtime\**\*.Build.cs` seulement ; les `.cpp` ou `Developer` non couverts (demande : Runtime).
|
||
|
|
- Q4 : lignes `XMPP`, `HTTP`, `WebSockets`, `BuildPatchServices` conditionnelles : les conditions ne sont pas relues (`AddEngineThirdPartyPrivateStaticDependencies` ne prouve que l'appel, pas la liaison effective).
|
||
|
|
|
||
|
|
## Fichiers à commiter
|
||
|
|
|
||
|
|
- A `Docs/Migration/etat/REL/MAPDL1/MAPDL1-E0-INV.md` (ce livrable ; dépôt jeu, `etat/` suivi en texte).
|
||
|
|
- Hors git (ignoré par `.gitignore`, `Saved/`) : `Saved/MAPDL1/E0/q1-scan.ps1` (script ponctuel, à garder dans le lot).
|
||
|
|
- Aucun autre fichier écrit.
|
||
|
|
|
||
|
|
## Constats
|
||
|
|
|
||
|
|
- Résultat : partiel (Q2 et Q3 établies ; Q1 établie pour 588 fichiers sur 798, 210 illisibles ; Q4 et Q5 établies).
|
||
|
|
- Grep (outil) ne cherche pas le nom de fonction dans les `.uasset` : pour un recensement de Blueprints, utiliser `uasset58.py strings --motif` (écart constaté : 0 au Grep, 1 au `uasset58.py` sur `CityMenu.uasset`).
|
||
|
|
- Chemin `Tools\claude\skills\lp-doc\gabarits.md` de la fiche : absent ; gabarit lu à `.claude\skills\lp-doc\gabarits.md`.
|
||
|
|
- À verser : lp-paths § Pièges de poste — « Grep ne lit pas les `.uasset` (0 hit sur CityMenu) ; passer par `Tools\uasset58.py` » (skill à recevoir : lp-paths). Aucune autre ligne à verser.
|
||
|
|
- Suite : orchestrateur doit décider si les 210 `__ExternalActors__`/`__ExternalObjects__` sont à lire avec un autre outil, état : non vérifiés.
|
||
|
|
|
||
|
|
Tours : 16 / 25 (décompte de l'agent, hors écriture du livrable ; `FicheStats` non relancé).
|