Fiche STM1-B6 (IMPL O2 + BUILD-FIN, STM1-SPEC-08) — Niveau N3 — Modèle prévu opus medium | utilisé claude-opus-5-5 — Agent session « Medium · STM1 » (pas de sous-agent) — Skills sk-protocol # STM1-B6 : masquage des maisons génériques posées dans l'eau (O2, option D) (2026-10-20) Décisions : - choix de l'utilisateur, tapé dans cette session et cité mot pour mot : « option D » ; - GO de Big Boss sur SPEC-08 et sur le code sans processus UE ; - puis GO de jeton UE (après la BUILD-FIN de KEY2). Ordre : CopieEtat, instantané, éditeur, commandlet (`Water/CentralLondon_Mask`, seul asset écrit), Development. **Résultat : code et builds à 0. Masque écrit (59 centres). Aucun autre asset modifié.** L'essai en jeu reste à faire (build d'essai sur ordre de l'utilisateur). ## 1. Code | Fichier | État | MD5 avant (instantané `STM1-O2`) | MD5 après | Lignes | Fins de ligne | |---|---|---|---|---|---| | `Source/LifePlay/LPCityWaterMask.h` | A | – | `966dc14d525c34c7fd19d0f0b73b8a6d` | 34 | LF (0 CR) | | `Source/LifePlay/LPCityWaterSubsystem.h` | M | `DEB58EC1…` | `2cdc10018eb1287d7f9e302eee182185` | 72 | LF (0 CR) | | `Source/LifePlay/LPCityWaterSubsystem.cpp` | M | `EC0946C5…` | `9c0b257ee0ae377146aeda72519330bf` | 323 | LF (0 CR) | | `Source/LifePlayEditorTools/LPBuildCityWaterCommandlet.cpp` | M | `C5709BDD…` (après O3) ; `69746A35…` avant O3 (instantané `STM1-O3`) | `fa6fbb72cabc0fd73663ef0e86942309` | 731 | LF (0 CR) | - **`ULPCityWaterMask`** (`UDataAsset`, module `LifePlay`) : `City`, `SourceBuildingCount`, `Centers` (centres de boîte, repère de la carte, cm) et `AreasM2`. - **Commandlet**, deux options : - `-ListBuildingsInWater= [-ThresholdM2]` (O3) ; - `-MaskOnly` (O2) : écrit `/Game/Heavy/StreetMap/Water/_Mask`. Il ne relit ni ne réécrit le maillage d'eau, refuse d'écraser un masque existant, et ne fait qu'un rapport en `-DryRun`. - **Sous-système de l'eau** : - `LoadMask` est appelé à chaque changement de carte ; - `HideHousesInWater` traite les `UInstancedStaticMeshComponent` de `MapMarkers` dont le maillage commence par `House` ou `Skyscraper`. Les arbres et jeeps ne sont pas touchés ; - chaque instance est ramenée dans le repère de la carte, puis comparée aux centres du masque (≤ 50 cm, cases de 1 m) ; - une instance trouvée est mise à l'échelle 0 par `UpdateInstanceTransform`, avec un `MarkRenderStateDirty` par composant ; - une nouvelle passe a lieu quand le nombre d'instances change ; - constantes : `SpareAboveAreaM2 = 0` (option D : aucune épargne), `MatchToleranceCm = 50`, `MaskCellCm = 100` ; - témoin, écrit au changement seulement : `[LPCity] EAU : masque n centres ; instances maisons N ; masquees m ; epargnees k (seuil s m2) ; centres sans instance c`. - Aucun Blueprint, GI, MapMarkers ni carte modifié. Aucune lecture du GI ajoutée. ## 2. Builds et commandlet (jeton UE) | # | Geste | Résultat | Résumé | |---|---|---|---| | 1 | `CopieEtat -Lot STM1` avant | `proc=0` ; alertes GIT attendues (fichiers STM1 et `LPKeyboardSubsystem.cpp` de KEY2) | `STM1-B6-AVANT.json` | | 2 | Instantané `STM1-O2` : 3 sources, puis `Content\Heavy\StreetMap\Water` (`CentralLondon` `5BDF4F0A`, `M_LP_Water` `D413292C`) | 5 entrées | `LifePlay_Backup_5.5\STM1-O2\manifest.csv` | | 3 | `Build.ps1 -Lot STM1 -EtatDir ` (éditeur) | `code=0 duree=52s erreurs=0 avertissements=1 unites=3` | `STM1_Build_20261020-162803.txt` | | 4 | `LPBuildCityWater … -MaskOnly -DryRun` | `code=0` ; 59 centres ; masque non écrit | `STM1_LPBuildCityWater_20261020-162902.txt` | | 5 | `LPBuildCityWater … -MaskOnly` | `code=0 duree=21s` ; `asset ecrit : /Game/Heavy/StreetMap/Water/CentralLondon_Mask, 59 centres sur 49425 batiments ; maillage d'eau non touche` | `STM1_LPBuildCityWater_20261020-162935.txt` | | 6 | `Build.ps1 -Lot STM1 -Target LifePlay -Config Development -EtatDir ` | `code=0 duree=53s erreurs=0 avertissements=1 unites=2` | `STM1_Build_20261020-163006.txt` | | 7 | `CopieEtat -Lot STM1` après ; `UeState` | `proc=0 parasites=0 verrou=243:libre` ; `processus=0` | `STM1-B6-APRES.json` | L'avertissement unique des deux builds est le C4701 de `LPCameraModeSubsystem.cpp(2378)`, fichier du lot CAM2 et antérieur à STM1. Les sorties des commandlets sont passées par le scratchpad (chemin sans espace, leçon d'O3) ; ce chemin est neutralisé dans les résumés. ## 3. MD5 des assets | Asset | MD5 | Taille | État | |---|---|---|---| | `Content/Heavy/StreetMap/Water/CentralLondon_Mask.uasset` | `F6F684B295B31298F8FB747F4F5946F4` | 2 712 o | **A** (seul fichier écrit dans `Content`, hors git) | | `Water/CentralLondon.uasset` | `5BDF4F0A6B3E709DAE9EFCFE8BCA2F6E` | 391 602 o | inchangé | | `Water/M_LP_Water.uasset` | `D413292C80C8C190766AD83ACFE2E418` | 5 717 o | inchangé | | `BPs/GI` / `BPs/MapMarkers` / `BPs/StreetMap_Static` | `32FC0A97` / `FB72765C` / `B7F20462` | – | inchangés (identiques à B5) | | `StreetMap/CentralLondon` / `Static/CentralLondon` | `A6C4D9B6` / `FBA15A84` | – | inchangés | `find Content -newer ` ne renvoie que `CentralLondon_Mask.uasset`. `LPKeyboardSubsystem.cpp` (KEY2) vaut toujours `0eb6a592` : non touché. ## 4. Essai en jeu (à faire, sur ordre de l'utilisateur) Une build d'essai cuite est nécessaire : elle inclut le masque, puisque `/Game` est cuit en entier. Sur la carte de Londres, en mode par défaut : - plus aucune maison générique sur la Tamise (59 bâtiments visés) ; - ponts, jeeps, arbres et quais intacts ; - une ligne `[LPCity] EAU CentralLondon : masque 59 centres ; … masquees ≈ 59 ; epargnees 0 (seuil 0 m2) ; centres sans instance ≈ 0`. Si le nombre de centres sans instance est élevé, le repère des instances diffère de celui de la carte : à diagnostiquer avant toute retouche. ## 5. Fichiers - Projet : `LPCityWaterMask.h` (A) ; `LPCityWaterSubsystem.h` et `.cpp` (M) ; `LPBuildCityWaterCommandlet.cpp` (M). - Hors git : `Content/Heavy/StreetMap/Water/CentralLondon_Mask.uasset` (A). - Livrables : `STM1-SPEC-08.md`, `STM1-B6-FIN.md`, `STM1-B6-AVANT.json`, `STM1-B6-APRES.json`, résumés de build et de commandlet ci-dessus. - CHG : à réserver (brouillon). État : O2 implémenté et compilé, jeton UE rendu ; essai en jeu en attente.