LifePlay-Revival/Docs/Migration/etat/ST/STF/STF-T3-IMPL.md
edujiro5972 8084622450 LifePlay UE 5.8 : état de développement au 2026-10-19
Tickets : REP1-T4

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-19 22:57:42 +02:00

84 lines
7.6 KiB
Markdown

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<widget neuf>`,
`NewValue` ← `GI.<variable>` (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).