Fiche STF-T3 — Niveau N2 — Modèle prévu orchestrateur STF (Opus 5.5) | utilisé claude-opus-5-5 — Agent orchestrateur — Skills lp-mcp, lp-lot, sk-change-safety, sk-protocol # STF-T3 : MainMenu, 12 SpinBox protégées par MCP (2026-10-10) Copie `D:\Game\LifePlay-master 5.8` (branche `ue5.8`, HEAD `b63196a` = tag `STF-avant`, ticket STF-R1). BUILD-GO STF-T3 de « Big Boss » (après STE-D). Accord utilisateur : « STF approuvé » (2026-10-10). Instantané : `D:\Game\LifePlay_Backup_5.5\STF\manifest.csv` (11:04). Éditeur 5.8 sans rendu, journal `Saved\Logs\portage\STF-T3_Editor_20261010-111552.log`. Outils Epic (`UMGToolSet`, `BlueprintTools`, `ObjectTools`, `AssetTools`, appelés via `ProgrammaticToolset`) ; contrôle `hyper_diagnose`. | Fichier | Avant | Après | |---|---|---| | `Content/UI/MainMenu.uasset` | 59d1ee7190afb88bf51b90eda26fcc32 (2 171 521 o) | **39135bcd5a13167a507e6b5059efbeb0** (2 245 641 o) | | `Content/BPs/GI.uasset` | d93785fca90e3342575fc0b601cc2e93 | d93785fca90e3342575fc0b601cc2e93 (inchangé) | `git status -- Content Config Source` après : ` M Content/UI/MainMenu.uasset` seul. ## 1. Méthode (A, STF-T1 § 5) et un écart assumé à la SPEC Par couple : lecture des 34 propriétés du widget et des 4 de son slot → suppression de l'événement `OnValueChanged` (et de `ComponentBoundEvent_15` pour MarkerSize) → `RemoveWidget` → `AddWidget` (SpinBox, même parent, indice 1) → `set_properties` (mêmes valeurs, sauf `Value` = défaut GI) et slot → `ToggleWidgetAsVariable` → `BindToEventProperty` `OnValueCommitted` → événement placé à la position de l'ancien → branchements → relecture des propriétés (0 écart) et des liens → `compile_blueprint` (avertissements = erreurs). **Écart à SPEC § 1.2 (A)** : la chaîne `IsValid → Set` existante de chaque couple est **gardée et rebranchée** sur le nouvel événement (exécution → entrée de la macro `IsValid`, `InValue` → valeur du `Set`) au lieu d'être recréée. Même graphe d'exécution que la SPEC (c'est le geste de la méthode B appliqué aux nœuds), moins de nœuds créés ; nœuds `GI` partagés intacts. ## 2. Résultat par couple (établi, `get_node_infos` après branchement) | # | Ancien → neuf | Événement neuf | Chaîne | Value / Min / Max | |---|---|---|---|---| | 1 | ChildGrowthMult → SpinBoxChildGrowth | `ComponentBoundEvent_32` | → `MacroInstance_2` → `VariableSet_1` | 1 / 0.01 / 10000 | | 2 | ShadeDepth → SpinBoxShadeDepth | `_33` | → `MacroInstance_40` → `VariableSet_106` → Cast MID → `SetScalarParameterValue` (inchangé) | 0.5 / 0 / 1 | | 3 | SpinBoxBGA → SpinBoxVolBGA | `_34` | → `MacroInstance_10` → `VariableSet_16` | 0.5 / 0 / 5 | | 4 | SpinBoxMarkerSize → SpinBoxMapMarkerSize | `_35` | → `MacroInstance_5` → `VariableSet_6` → **`CallFunction_44` RetriggerableDelay 2 s → `CallFunction_31` SpawnMapMarkers(false)** (ancien `_15` supprimé) | 28 / 1 / 100 | | 5 | SpinBoxMoan → SpinBoxVolMoan | `_36` | → `MacroInstance_8` → `VariableSet_19` | 1 / 0 / 5 | | 6 | SpinBoxPhysicsMult → SpinBoxPhysics | `_37` | → `MacroInstance_7` → `VariableSet_11` | 1 / 0 / 100 | | 7 | SpinBoxSceneFrequency → SpinBoxSceneFreq | `_39` | → `MacroInstance_42` → `VariableSet_116` | 10 / 0.2 / 100 | | 8 | SpinBoxSexDescription → SpinBoxSexLineDuration | `_40` | → `MacroInstance_90` → `VariableSet_48` | 15 / 1 / 100 | | 9 | SpinBoxSex → SpinBoxVolSex | `_43` | → `MacroInstance_12` → `VariableSet_18` | 1 / 0 / 5 | | 10 | SpinBoxSquirtMult → SpinBoxSquirt | `_46` | → **`IfThenElse_9` (Branche) ← `CallFunction_78` IsValid(`VariableGet_40`)** → `VariableSet_25` | 2 / 0 / 100 | | 11 | SpinBoxUI → SpinBoxVolUI | `_44` | → `MacroInstance_11` → `VariableSet_17` | 1 / 0 / 5 | | 12 | SpinBoxPregnancyTerm → SpinBoxPregnancyMult | `_45` | → `MacroInstance_57` → `VariableSet_70` | 1 / 0.01 / 3 | - Propriétés : recopie des 34 propriétés du widget (style, police Roboto Bold 20, couleur, `Delta`, chiffres, bornes, `bOverride_*`, visibilité…) et du slot (Automatic, marge 0, Fill / Fill), relues après écriture : **0 écart** sur les 12 (seule `Value` change, au défaut GI) ; propriétés identiques à `SpinBoxSexDuration` (STC) hors valeur et bornes. - SquirtMult : garde ajoutée sur le modèle STC (`IsValid` fonction + `Branche`), car le type `Utilities|IsValid` (macro) est ambigu dans `find_node_types` (2 entrées). GI vide impossible après `Construct` : garde d'uniformité (règle 4 `lp-mcp`, à écrire au CHG). - Numéros d'événements 38 et 41 : déjà pris (délégués `OnClicked` de boutons, avant et après STF ; correction après STF-VAL statique) ; 42 libéré (ancien PregnancyTerm). ## 3. `Construct` (établi, parcours de la chaîne) `Event_1` → Cast To GI → Set GI → `CallFunction_72` (slider caméra) → `_74` (texte caméra) → `_73` (SexDuration) → **`_79` ChildGrowth → `_80` ShadeDepth → `_81` VolBGA → `_83` MapMarkerSize → `_84` VolMoan → `_85` Physics → `_87` SceneFreq → `_88` SexLineDuration → `_89` VolSex → `_90` Squirt → `_91` VolUI → `_92` PregnancyMult** → `_1278` UpdateDonors (inchangé ensuite). Chaque `SetValue` (SpinBox, broche `NewValue`) : `self` ← `Get`, `NewValue` ← `GI.` (cible `VariableGet_50`, le `GI` déjà utilisé par STC). Incident : un premier essai s'est arrêté sur `Classe|GI|ObtenirVol_BGA` inexistant (le type s'écrit `ObtenirVolBGA`) ; 7 nœuds déjà créés, sans aucun lien, ont été réutilisés au second essai (vérifié : 0 lien avant branchement) ; le lien `_73 → _1278` n'a été coupé qu'après validation des 36 nœuds. ## 4. Contrôles de l'asset (SPEC § 3) | Contrôle | Résultat | |---|---| | `compile_blueprint` (warnings_as_errors) après chaque couple et après `Construct` | sans erreur | | `hyper_diagnose` (`loaded_blueprint_health`) | MainMenu `up_to_date` ; seul signalement : paquet modifié (avant `save_assets`) | | Journal éditeur | aucun avertissement MainMenu ; 1 `LogScript: Warning` = l'essai `ObtenirVol_BGA` ; avertissements MCP connus (`LogJson` schéma, `WriteBytes`, multicast) | | Événements liés (tous) | 14 `OnValueCommitted` (SpinBox_0, SexDuration STC, 12 neufs) + 1 `OnValueChanged` (SliderCameraSpeed) ; **aucun `OnValueChanged` de SpinBox** | | Anciens widgets | 0 dans l'arbre ; 0 nœud à leur nom | | Relecture binaire après sauvegarde | 11 anciens noms : 0 occurrence (`ShadeDepth` : 2 = variable GI et paramètre matériau) ; 12 neufs : 5 chacun = profil des widgets sans liaison de STC (`SpinBoxSexDuration`, `SliderCameraSpeed` : 5) ; `SpinBox_0` : 6 (inchangé) → **0 liaison vers GI sur les 12** (estimé : décompte de chaînes, cohérent avec STF-T1 § 4) | | `save_assets ["/Game/UI/MainMenu"]` | `true` | | `CompileAllBlueprints` éditeur fermé | **reporté en STF-T4** (VAL V1, commandlet) | ## 5. Suite - STF-T4 (lp-validator) : V1 `CompileAllBlueprints` (418 / 418, 0 / 0), V2-V3 relecture, V4-V7 PIE avec l'utilisateur, V8 MD5 des `.sav` contre l'instantané. - CHG : réservation à faire dans `etat\REPO\NUMEROS.md` (une entrée par SpinBox + `Construct`, ou une entrée de lot si le gardien les regroupe) ; à y écrire : écart § 1, garde SquirtMult, `Value` de conception ramenées aux défauts GI, ShadeDepth appliqué en fin de geste (plus d'aperçu pendant le glisser), valeur GI hors bornes affichée bornée sans être réécrite (SPEC § 6). - Commit : ticket STF-R2 (MainMenu, journal, traces STF-R1), après VAL et preuve en jeu. Fichiers écrits : `Content/UI/MainMenu.uasset` ; ce livrable. Éditeur fermé (`UeState.ps1` : 0 processus).