Fiche STF-T0 — Niveau N1 — Modèle prévu orchestrateur STF (Opus 5.5) | utilisé claude-opus-5-5 — Agent orchestrateur — Skills lp-lot, lp-mcp, sk-protocol # STF-T0 : les 12 SpinBox de MainMenu liées à GI (hors caméra / durée), carte préalable (2026-10-10) Copie `D:\Game\LifePlay-master 5.8` (branche `ue5.8`, HEAD `20620f6`), **pendant le gel STC** : aucune écriture, aucun outil d'écriture MCP. Sources : `etat\ST\STC\STC-T0-CART.md` (bornes, défauts GI), diagnostic `side-session-notes\local_b6d8fc6e-…\STC-reponse-fable.md` § 1.1 (liaisons, lecture binaire de l'asset), dump `etat\ST\STB\dumps\MainMenu__EventGraph.txt` (2026-10-09, **antérieur à CHG-294** : CHG-294 n'a retiré que `OnInitialized` ; gestionnaires SpinBox réputés inchangés, **à relire par `get_node_infos` après le gel**, § 4), source `Source\LifePlay\LPSettingsSubsystem.cpp`. Deux appels MCP en lecture seule (`list_toolsets`, `ObjectTools.list_properties` sur `/Game/UI/MainMenu.MainMenu`), éditeur de la session STC, aucune autre session MCP active. ## 1. Les 12 couples (établi : bornes et défauts STC-T0, liaisons diagnostic § 1.1) | # | SpinBox | Variable GI | Min / Max | Défaut GI | Liaison `Value` | Gestionnaire `OnValueChanged` (n°) | Chaîne écrite (dump) | |---|---|---|---|---|---|---|---| | 1 | ChildGrowthMult | ChildGrowthMultiplier | 0.01 / 10000 | 1 | Property `GI.ChildGrowthMultiplier` | 6 | `IsValid` (Macro_2) → `Set` (VariableSet_1) ; GI = VariableGet_29 (partagé avec 13, 17) | | 2 | ShadeDepth | ShadeDepth | 0 / 1 | 0.5 | Property `GI.ShadeDepth` | 118 | `IsValid` (Macro_40) → `Set` (VariableSet_106) → **`Cast MID` du blendable [1] du `PostProcessVolume` de GI → `SetScalarParameterValue('ShadeDepth', valeur)`**, échec → `PrintString 'Cast failed'` | | 3 | SpinBoxBGA | Vol_BGA | 0 / 5 | 0.5 | Property `GI.Vol_BGA` | 20 | `IsValid` (Macro_10) → `Set` (VariableSet_16) ; GI = VariableGet_1 (partagé avec 21, 22, 23) | | 4 | SpinBoxMarkerSize | MarkerSize | 1 / 100 | 28 | Property `GI.MarkerSize` | 13 | `IsValid` (Macro_5) → `Set` (VariableSet_6) ; **`OnValueCommitted` existant (15)** : `RetriggerableDelay 2 s` → `GI.SpawnMapMarkers(false)` | | 5 | SpinBoxMoan | Vol_Moan | 0 / 5 | 1 | Property `GI.Vol_Moan` | 23 | `IsValid` (Macro_8) → `Set` (VariableSet_19) | | 6 | SpinBoxPhysicsMult | PhysicsMult | 0 / 100 | 1 | Property `GI.PhysicsMult` | 17 | `IsValid` (Macro_7) → `Set` (VariableSet_11) | | 7 | SpinBoxSceneFrequency | SceneFrequency | 0.2 / 100 | 10 | Property `GI.SceneFrequency` | 178 | `IsValid` (Macro_42) → `Set` (VariableSet_116) | | 8 | SpinBoxSexDescription | SexLineDuration | 1 / 100 | 15 | Property `GI.SexLineDuration` | 84 | `IsValid` (Macro_90) → `Set` (VariableSet_48) | | 9 | SpinBoxSex | Vol_Sex | 0 / 5 | 1 | Property `GI.Vol_Sex` | 22 | `IsValid` (Macro_12) → `Set` (VariableSet_18) | | 10 | SpinBoxSquirtMult | SquirtMult | 0 / 100 | 2 | Property `GI.SquirtMult` | 26 | **`Set` (VariableSet_25) sans `IsValid`** (GI = VariableGet_40) | | 11 | SpinBoxUI | Vol_UI | 0 / 5 | 1 | Property `GI.Vol_UI` | 21 | `IsValid` (Macro_11) → `Set` (VariableSet_17) | | 12 | SpinBoxPregnancyTerm | PregnancyMultiplier | 0.01 / 3 | 1 | Property `GI.PregnancyMultiplier` | 42 (nom d'événement hérité `BndEvt__SpinBox_0_…_42`) | `IsValid` (Macro_57) → `Set` (VariableSet_70) | Persistance (`etat\ST\STB\STB-SET-INV.md` § 2-3) : seules `SceneFrequency` et `SexLineDuration` figurent dans `GameSettings.sav` ; les 10 autres ne sont dans aucun `.sav` (estimé : défauts de GI à chaque lancement). Compte : 12 liaisons Property, 12 gestionnaires `OnValueChanged`, 1 `OnValueCommitted` existant (MarkerSize). Hors périmètre : `SpinBox_0` (flou de champ CharGen, liaison Function, `OnValueCommitted` 19), caméra et durée (STC). ## 2. Points particuliers (établi par le dump, à confirmer au § 4) - **ShadeDepth (2)** : le gestionnaire applique aussi la valeur au matériau de post-traitement. Déplacé sur `OnValueCommitted`, l'aperçu en direct pendant un glisser disparaît (application en fin de geste, saisie ou flèche). La chaîne entière (Set + matériau) part sur `OnValueCommitted`, comportement à la validation inchangé. - **SquirtMult (10)** : aucune garde `IsValid`. Aujourd'hui `SynchronizeProperties` (GI nul) déclenche donc un `Set` sur None à chaque ouverture du menu (Accessed None probable, **estimé** : non relevé dans `LogStats`). Après correctif, le gestionnaire ne part que sur action du joueur (GI valide) ; ajout d'un `IsValid` pour l'uniformité, état « vide » impossible après `Construct` (règle 4 `lp-mcp` : écrit au CHG). - **Nœuds `GI` partagés** : VariableGet_29 (6, 13, 17), VariableGet_1 (20-23) ; déplacer un gestionnaire ne doit pas couper les autres (rebrancher les broches d'exécution et `InValue` seulement). - **Volumes (3, 5, 9, 11)** : `Vol_*` sont relus par GI ailleurs (`GI__EventGraph.txt:22870-22898`) ; l'effet suit à la prochaine lecture, un commit en fin de geste ne change rien d'audible pendant le glisser (**estimé**). - **Construct** (dump l. 121-141) : `Construct` → `Cast To GI` → `Set GI` (VariableSet_2904) → `CallFunction_1278` (`UpdateDonors`). STC y insère ses `SetValue` (STC-SPEC § 3.3) ; STF s'insère **après** la chaîne STC, avant `UpdateDonors`. - **C++** : `LPSettingsSubsystem.cpp:256-366` (`CollectSpinBoxes`, `HardenSettingsControls`) traite les SpinBox par type (style, police), jamais par nom ni par valeur : un remplacement de widget reste couvert. Aucune autre référence aux 12 noms dans `Source\`. ## 3. Retrait d'une liaison Property : méthode (ouvert) - STC-SPEC § 1 : « aucun outil MCP ne retire une liaison de propriété » → **remplacement du widget** par un widget neuf d'un autre nom (méthode A, modèle STC). - `ObjectTools.list_properties` sur `/Game/UI/MainMenu.MainMenu` renvoie les propriétés de la classe générée (variables de widgets, `gI`…), pas le tableau `Bindings` du `UWidgetBlueprint` (établi, cette session). Écriture directe du tableau (méthode B : garder les noms et les événements) : **non démontrée** ; à mesurer en STF-T1, après le gel, sans écriture (lecture du tableau par un autre chemin d'objet ou par `UMGToolSet`, `MVVMToolset`). - Choix tranché en STF-T1 sur deux faits : (1) ce qu'a donné la méthode A en STC (avertissements de liaisons orphelines, STC-SPEC § 7, relecture des `Bindings` après STC) ; (2) existence d'une écriture du tableau `Bindings` par un outil Epic. Sans (2), méthode A. ## 4. Reste à mesurer après la levée du gel STC (STF-T1) 1. `get_node_infos` sur les 12 gestionnaires et sur la chaîne `Construct` réelle (après STC) : confirmer le § 1 sur l'asset courant. 2. `UMGToolSet.GetWidgets` : parent, créneau, propriétés (style, police, `MinFractionalDigits`, `Delta`, bornes de glisser) de chacun des 12 widgets, pour la méthode A. 3. Relecture binaire des deux tableaux `Bindings` après STC (attendu 33 − 2 = 31 entrées, dont nos 12). 4. Méthode B : existe ou non (§ 3). Fichiers à commiter : aucun (`Docs/Migration/etat/` est ignoré par git, `.gitignore:74` de la copie 5.5).