40 KiB
Fiche STA-T2c — Niveau N1 — Modèle prévu (modèle de l'agent lp-writer) | utilisé claude-sonnet-5-5 — Agent lp-writer — Skills sk-protocol, lp-doc, lp-lot
STA-T2c-DOC : consolidation des 5 diagnostics STA-T2b en un tableau famille → cause → correctif (2026-10-09)
Lecture seule des livrables amont. Aucun DIAG, registre ni doc numéroté modifié ; aucun CHG / ERR ; aucun commit.
Abréviations : U8 = journal CIBLE (build Development 5.8 U8 essai, LifePlay.log, 52 550 lignes) ; U6 = journal REF (LifePlay_58_session2.log, 17 317 lignes) ;
CSV:n = ligne n de STA-T1-familles.csv ; BEAUTE, GIUBER, GIVAR, PERSON, VILLE = STA-T2b-<nom>-DIAG.md (dossier D:\Game\LifePlay-master 5.5\Docs\Migration\etat\ST\STA\) ;
INV = STA-T1-INV.md. Les chiffres des colonnes U8 / U6 sont ceux des DIAG et du CSV, repris tels quels. Un compte absent des DIAG est écrit « non donné ».
Les colonnes Type, Effort et la répartition en « confirmée / estimée / indécise » (§ B) sont des lectures de T2c (estimé), pas des constats des DIAG, sauf mention.
1. Fichiers écrits
D:\Game\LifePlay-master 5.5\Docs\Migration\etat\ST\STA\STA-T2c-DOC.md(ce livrable, un seul Write). Aucun autre fichier écrit.
2. Numéros pris (CHG, ERR) et commande de contrôle
sans objet : la fiche interdit toute entrée CHG / ERR (§ 6) ; aucun numéro pris, aucun fichier de journal ou de registre touché.
3. Index et plages mis à jour
sans objet : aucun doc numéroté créé, README.md et STA-TACHES.md non touchés (le registre appartient à l'orchestrateur).
4. Écarts à la fiche
- Skills : l'en-tête cite
lp-loten plus desk-protocoletlp-doc, parce que les trois sont préchargés dans le contexte de l'agent. - Point amont 5 (dumps) : la fiche cite
RandomizeFaceetRandomizeAllde Person etMapMarkers. BEAUTE ne les demande pas :RandomizeAlletRandomizeFacesont des événements du graphe d'événements de Person, déjà dumpé (appel deRandomizeFaceenPerson__EventGraph.txt:17802, BEAUTE § 1 pile 2) ; ils manquent de nom, pas de dump.MapMarkers_Cest noté « non dumpé » par VILLE (§ Compte rendu 5), sans demande de dump. Les deux sont listés « mentionnés, non demandés » au § D. - Point amont 1 (fusion K4 / clearVariable) : fusionnés en une ligne (R12) et un correctif, mais les comptes ne sont pas identiques. GIVAR § 1 : 36 messages
Person_24sur 39 précèdent un avertissementclearVariable, les 3 autres « viennent d'ailleurs » ; VILLE K4 range les 39 sous la même cause. R12 garde donc 72 + 39 = 111 événements U8, dont 3 en bucket « indécise ». - Point amont 4 (clés indécises) :
Array_Get_Item_53(GIUBER, non traité) porte la même pile que VILLE K8 (FocusOnMapMarkers, CIBLE:7382-7399 contre 7380-7399) ; T2c le rattache à R28 (estimé), il ne reste donc qu'une clé réellement non traitée,Companion/ SceneStart (R10). Les « 12 / 18 restants » de BEAUTE sont R02. Les clés indécises restantes sont R06, R07, R08 (GIUBER K4-K6), R25, R26 (VILLE K5-K6). - Point amont 3 (priorité S3) : « S3 = 1 » est posée sur R01 seulement. Les DIAG ne classent pas les autres lignes en S3 (doc 29:55 : 1 visible ou plantage, 2 erreur au journal, 3
Accessed None, 4 avertissement récurrent) ; le classement S3 de chaque ligne est laissé à STA-T4. - Total 3 549 / 1 121 : il couvre les catégories (a)
Accessed Noneet (b) index hors bornes (INV § 2.4). Les hitchs K9 (2 / 4, catégorie (e)) et les 4 lignespending killdeBGAen U6 (INV § 2.7 n° 24, catégorie (d)) sont hors de ce total ; ils sont dans le tableau avec la mention « hors total ». - Contradiction entre DIAG (PERSON F et VILLE K1), non tranchée ici : voir § Constats F.1.
- Aucun recomptage des journaux : T2c lit les DIAG et le CSV. Les sommes sont recalculées sur les chiffres repris (commandes en § B).
Constats
A. Tableau consolidé (29 lignes, une par clé de DIAG ; fusions et clés « hors total » signalées)
Types : Blueprint (BP) / C++ / données. Garde : « oui » = le DIAG juge l'état None ou vide normal ; « non » = corriger l'état ; « à trancher » = question ouverte. Effort (estimé T2c) : S = un point de modification (1 à 3 nœuds), aucun prérequis bloquant ; M = plusieurs nœuds ou événements, ou une vérification préalable ; « provisoire » = cause indécise, effort non confirmé ; « non estimable » = nœud non localisé. Prérequis : D<n> = dump du § D, C<n> = décision du § C, E<n> = lecture ou essai du § D.
| ID | Famille / clé (DIAG) | U8 / U6 | Cause | Verdict | Correctif proposé | Type | Garde | Effet en jeu | Effort | Prérequis | Source |
|---|---|---|---|---|---|---|---|---|---|---|---|
| R01 | BEAUTE-A : GI_C:getBeautyValue, getRandomAge, getRandomEthnicity / Floats_3 |
2 579 / 0 (getBeautyValue 2 493, getRandomAge 56, getRandomEthnicity 30 ; 2 493 = 2 505 − 12 de R02) | Table BeautyStandards vide pendant la génération des PNJ (Map_Find dont la sortie « trouvé » n'est pas testée) ; remplie seulement à l'ouverture de la création de personnage, des contacts ou au début d'une scène |
confirmée ; mécanisme précis estimé (ConsolidateBeautyStandards non dumpée) |
A : appel de ConsolidateBeautyStandards dans GI.EventGraph entre CallFunction_1037.then et CallFunction_41.execute (variante A' : 3 gardes Map_Length = 0) |
BP | non : corriger l'état, une table vide n'est pas normale | visible en jeu (estimé) : âge = premier tag d'âge, ethnie = premier tag d'ethnie, morphs tirés au hasard sans attractivité ; S3 = 1 | M | D1, D4, C2 (P1-P3 de BEAUTE C3) | BEAUTE § 3b, C2, C3 ; CSV:2, 15, 24 |
| R02 | BEAUTE-B : résidu Floats_3 de getBeautyValue |
12 / 18 (tous index 0, féminins ; U8 : trame 419 ; inclus dans les 2 505 / 18 de CSV:2) | Clés de la liste féminine absentes de BeautyStandards une fois remplie (morph, ou tag de forme ou d'ethnie) ; lesquelles : inconnu ; nœud :64X non résolu |
indécise (H2 à faire) | B1 : ajouter les clés dans beauty_standards_default.txt ; B2 : 3 IfThenElse (F0, F8, F5) sur Map_Find.ReturnValue dans getBeautyValue uniquement |
données (B1) ou BP (B2) | à trancher (C1) ; aucun garde dans getRandomAge / getRandomEthnicity |
B2 : résultat inchangé (Accum garde sa valeur initiale, estimé) ; B1 : non donné |
M | D1 à D4, E3, C1 | BEAUTE § 4, C4 ; CSV:2 |
| R03 | GIUBER-K1 : GI_C:ExecuteUbergraph_GI / CallFunc_ParseIntoArray_ReturnValue_3 |
570 / 570 | Ligne de données de vêtements découpée sur ': ' : 3 champs, 4e champ (index 3) lu sans test (événement populateClothes4, estimé ; cause « 3 champs » estimée) |
confirmée (nœud GetArrayItem_65 et mécanisme établis) |
Branch Array_Length(CallFunction_1061.ReturnValue) > 3 avant le consommateur ; faux → chaîne vide vers MakeStruct_8.Strings2 (pas de Select pur) |
BP (+ données selon C3) | oui (compte identique U8 / U6) | journal seul (estimé nul : le moteur journalise et poursuit) | S | C3, E2 | GIUBER K1 ; CSV:9 |
| R04 | GIUBER-K2 : ExecuteUbergraph_GI / …ParseIntoArray_ReturnValue_29 et _28 |
60 / 60 (40 + 20 / 40 + 20) | Ligne de Modules/MorphTags/<nom>.txt sans ': ' : tableau de longueur 1, index 1 lu sans test (PopulateEachMorphTags) ; nature des lignes : incertaine |
confirmée (GetArrayItem_56 et _58 ; attribution _28 / _29 à 1012 / 1016 incertaine) |
Branch Array_Length >= 2 avant Map_Add dans MacroInstance_64 et _65 ; faux → ligne ignorée (ou valeur vide : SPEC) |
BP (+ données) | oui (constant U8 / U6) | non donné | S | C3, C4, E1 | GIUBER K2 ; CSV:10, 11 |
| R05 | GIUBER-K3 : ExecuteUbergraph_GI / Interacting in GI_C |
7 / 24 | Interacting None, état posé par le graphe lui-même ; appels clearDaily, PlayDaily, PlayIdle à cible multiple et BooleanAND_91 pur, sans garde ; 3 événements (StopDurationUpdate, TakeModActionWithBuilding, ActionDurationUpdate) |
estimée : mécanisme confirmé, nœud par événement estimé (deux) ou incertain (un) ; écart 7 / 24 non analysé | (a) CallFunction_864, _863 : séparer la cible multiple, Interacting derrière IsValid ; (b) _866 idem ; (c) BooleanAND_91 → Branch(IsValid(Interacting)) |
BP | oui | non donné | M | C4 (ou remontée d'exécution, N2) | GIUBER K3 ; CSV:3 |
| R06 | GIUBER-K4 : ExecuteUbergraph_GI / TintUI in GI_C |
5 / 17 | TintUI non valide dans HideUI et ShowUI ; 0 VariableSet dans l'EventGraph (écriture ailleurs ou absente) |
indécise (nœuds identifiés, estimé) | Conservatoire : IsValid sur VariableGet_1375 avant CallFunction_2310 et sur VariableGet_2515 avant CallFunction_939, la branche non valide rejoint VariableSet_1341 / CallFunction_760 |
BP | à trancher (normal ou défaut d'affectation) | non donné ; défaut d'affectation possible | S (provisoire) | D11 | GIUBER K4 ; CSV:4 |
| R07 | GIUBER-K5 : ExecuteUbergraph_GI / CallFunc_K2_GetRootComponent_ReturnValue_1 |
1 / 6 | RootComponent de SceneCapture None sur SetVisibility(false) dans HideRender (estimé) ; acteur apparemment valide sans racine (incertain) |
indécise | Séparer la cible multiple de CallFunction_5578 ; SceneCapture.RootComponent derrière IsValid |
BP | à trancher | non donné | S (provisoire) | E4 (affectation de SceneCapture, trace N3) |
GIUBER K5 ; CSV:6 |
| R08 | GIUBER-K6 : ExecuteUbergraph_GI / CallFunc_K2_GetRootComponent_ReturnValue_2 |
0 / 5 (U6 seul) | Même mécanisme dans ShowRender (CallFunction_3014) ; getter fautif _3097 ou _3103 incertain |
indécise (comme R07) | Cibles RootComponent de CallFunction_3014 derrière IsValid (même lot que R07) |
BP | à trancher | non donné | S (provisoire) | E4 ; rejouer la création de personnage | GIUBER K6 ; CSV:8 |
| R09 | GIUBER-K7 : GI_C:clearScenePersons / Companion + Interacting |
4 / 8 (2 + 2 / 4 + 4) | CumOn(['Clear']) appelé sur PlayerCharacter, Companion et Interacting sans garde ; les deux derniers sont None en fin de scène sans compagnon ni partenaire |
confirmée | Séparer CallFunction_4 en trois appels, ou Companion et Interacting derrière IsValid (motif de MacroInstance_1) |
BP | oui | non donné | S | aucun | GIUBER K7 ; CSV:34, 35 |
| R10 | GIUBER-NT1 : ExecuteUbergraph_GI / Companion in GI_C (SceneStart) |
2 / 4 | Non traité (budget) ; pile SceneStart via ReadSceneLine ; 19 VariableGet 'Companion' dans l'EventGraph, aucun rattaché |
non traité | non donné | — | — | non donné | non estimable | E5, C4 | GIUBER § Clés non traitées ; CSV:5 |
| R11 | GIUBER-NT2 : ExecuteUbergraph_GI / CallFunc_Array_Get_Item_53 (FocusOnMapMarkers) |
1 / 2 | Non traité par GIUBER ; VILLE K8 § 1 donne la même pile (CIBLE:7380-7399) : suite de la lecture WidgetComponents[0] sur tableau vide (rattachement par T2c) |
estimée (fusion probable avec R28) | Celui de R28 (Branch Array_IsValidIndex sur CustomEvent_183) |
BP | oui (via R28) | sans plantage (VILLE K8) | S | C10 ; en VAL, vérifier que la ligne disparaît avec R28 | GIUBER § Clés non traitées ; VILLE K8 § 1 ; CSV:7 |
| R12 | Fusion GIVAR-F1 + VILLE-K4 : GI_C:clearVariable / CallFunc_Array_Get_Item in not an UClass et GI_C:(Script Msg) / Person_24 in Variable |
111 / 153 (72 + 39 / 94 + 59) | GetVariable(Var).Person[0] sur un tableau Person vide (longueur 0), lu aussi dans la condition d'un OR pur (Prefix, SaveSlot) ; 36 appels × 2 avertissements ; 36 des 39 messages hors plage précèdent un avertissement clearVariable, 3 viennent d'ailleurs (GIVAR § 1) |
confirmée (préexistant 5.5, journal 55 lu par GIVAR) ; 3 messages sur 39 : source non identifiée | IfThenElse après GetVariable sur Array_IsValidIndex(Person, 0) ; faux → fin. Une fonction corrigée pour 4 appelants (getRelative 28, GetSpecific 30, getPerson 10, GeneratePerson 4) |
BP | oui : vide = rien à effacer, comportement déjà « aucune action » | journal seul (GIVAR § 4) | S | D5, C11 | GIVAR F1 ; VILLE K4 ; CSV:12, 16 |
| R13 | GIVAR-F2 : MainMenu_C:Get_SpinBox_0_Value_0 (4 clés CSV) |
30 / 30 (12 + 6 + 6 + 6 / idem) | Binding de SpinBox_0 évalué dans SynchronizeProperties avant l'événement qui remplit GI ; 6 évaluations × 5 avertissements |
confirmée (préexistant 5.5, 45 lignes au journal 55) | A (racine, préféré) : déplacer GetGameInstance → Cast To GI → Set GI vers un nouvel Event On Initialized. B : IsValid(GI) dans le binding, else → retour 0.0 |
BP | B oui (état transitoire voulu par le moteur) ; A corrige l'ordre | valeur 0.0 pendant 3 évaluations à la construction (estimé) | M (A) ou S (B) | D7, C6 | GIVAR F2 ; CSV:20 à 23 |
| R14 | GIVAR-F2 (mention) : MainMenu_C:ExecuteUbergraph_MainMenu / GI in MainMenu_C |
2 / 2 | Même cause que R13 (BndEvt__SpinBoxSquirtMult, CommitValue de la construction) |
estimée (GIVAR § 4 : « estimé ») | Traité par R13-A seul ; B ne le traite pas | BP | — | non donné | inclus en R13 | D7, C6 | GIVAR F2 § 4-5 ; INV 2.4 n° 19 ; CSV:40 |
| R15 | GIVAR-F3 : GI_C:determinePersonVars / currentMatchRace in GI_C |
30 / 34 | MatchRace None (paramètre facultatif) ; getRace et getEthnicity appelés avant le test IsValid déjà présent |
confirmée (préexistant 5.5, 36 lignes au journal 55) | IfThenElse entre FunctionEntry_0 et CallFunction_18, condition = IsValid existant CallFunction_30, else → VariableSet_27 |
BP | oui (None prévu, déjà testé) | comportement inchangé (GIVAR § 4) | S | aucun | GIVAR F3 ; CSV:19 |
| R16 | PERSON-A : Person_C:standIdle / Near (42 / 30) + sans propriété (14 / 10) |
56 / 40 | Near optionnel (None depuis PlayIdle) lu par VariableSet_6 (NearVec) avant la garde ; 3 « Near » + 1 nu par appel |
confirmée | IsValid(Near) entre VariableSet_3.then et VariableSet_6.execute ; non valide → MacroInstance_1 |
BP | oui, neutre (NearVec non consommé si None) | neutre | S | D6 (non bloquant) | PERSON A ; CSV:13, 14 |
| R17 | PERSON-B : Person_C:ExecuteUbergraph_Person / HeadtrackStatic |
11 / 10 | SelectVector_998 pur : HeadtrackStatic.K2_GetComponentLocation évalué même si non valide ; HeadtrackStatic remis à None (EG:19002) |
confirmée | Variable locale « cible » par deux Branch / IsValid avant K2_SetActorRotation ; deux None → sauter |
BP | oui | si les deux sont None : orientation vers l'origine du monde aujourd'hui (estimé), donc visible possible | M | C7, D6 | PERSON B ; CSV:25 |
| R18 | PERSON-C : ExecuteUbergraph_Person / HeadtrackTarget (3 / 2) + sans propriété (3 / 2) |
6 / 4 | Même instruction que R17, cas « les deux None » | confirmée | Celui de R17 (une seule modification) | BP | oui | idem R17 | inclus en R17 | C7 | PERSON C ; CSV:27, 28 |
| R19 | PERSON-D : ExecuteUbergraph_Person / OccupyingFnt |
10 / 17 | Personnage sans meuble occupé ; StaticMesh lu sans test dans le test de nom |
confirmée | IsValid(OccupyingFnt) avant IfThenElse_75 (rebrancher IfThenElse_89.else et VariableSet_173.then) ; pas d'IsValid en entrée d'un AND / OR |
BP | oui, neutre | neutre | S | aucun | PERSON D ; CSV:26 |
| R20 | PERSON-E : Person_C:assignHome / FamilyLiveWiths |
2 / 2 | BooleanAND_2 évalue FamilyLiveWiths[SaveSlot] même si Prefix n'est pas F ; tableau vide |
confirmée | Cascade de Branch : Prefix == 'F' → IsValidIndex → valeur → Map_Add ; sinon IfThenElse_3 |
BP | oui, neutre (hors bornes donne faux) | neutre | S | aucun | PERSON E ; CSV:36 |
| R21 | PERSON-F : Person_C:assignHome / CallFunc_SearchByAmenitySafe_Buildings |
2 / 1 | Buildings vide → RandomInteger(0) → index 0 → Map_Add d'une structure par défaut dans AI_Homes ; amont : CurrentCityExpansion None (R22) |
confirmée (conséquence) | Branch(Array_Length(Buildings) > 0) avant Map_Add ; correctif amont préféré par PERSON (voir écart 7) |
BP | à trancher (C8) | PNJ sans domicile exploitable (estimé), donc visible possible | S | C8 ; R22 d'abord | PERSON F ; CSV:37 |
| R22 | VILLE-K1 : StreetMap_Static_C:SearchByAmenitySafe / CurrentCityExpansion in GI_C + sans propriété |
10 / 15 (9 + 1 / 14 + 1) | CurrentCityExpansion None tant que la ville n'a pas d'extension sauvegardée (état normal), lu sans IsValid ; le repli sur StreetMap.Buildings donne un résultat juste |
confirmée (9) ; forme nue (1) : même appel, nœud incertain | Deux macros IsValid : entre IfThenElse_5.then et VariableSet_3, entre IfThenElse_5.else et IfThenElse_6 ; même garde dans findNearbyBuilding |
BP | oui | journal seul (résultat juste) | S | D10 (non bloquant) | VILLE K1 ; CSV:30, 31 |
| R23 | VILLE-K2 : StreetMap_Static_C:ExecuteUbergraph_StreetMap_Static / BGA |
5 / 6 (+ 4 pending kill en U6, hors total) |
BGA None avant le premier SpawnSound2D (et après collecte) ; 3 lectures sans IsValid |
confirmée | 3 IsValid(BGA) (IfThenElse_22 then et else, devant CallFunction_124) |
BP | oui | bénin (Stop sur None ne fait rien, le son est lancé) |
S | aucun | VILLE K2 ; CSV:32 |
| R24 | VILLE-K3 : Room_C:pickPresetWorld / BuildingPoints |
4 / 10 | Rue sans polygone ; BuildingPoints[0] et [1] lus sans test |
confirmée (tableau vide normal) | Branch Array_Length >= 2 entre IfThenElse_0.else et VariableSet_1 ; faux → Strings[0] ; risque voisin non observé : len = 0 |
BP | oui | préréglage fixe (le premier de la liste), sans défaut visible (estimé) | S | aucun | VILLE K3 ; CSV:33 |
| R25 | VILLE-K5 : GI_C:(Script Msg) / Texture2dArray_3 in Te2dArray |
6 / 0 | Lecture [0] d'un tableau vide au changement d'animation de la scène de couple (estimé) ; fonction de GI non localisée |
indécise | Générique : Array_IsValidIndex(Texture2dArray, 0) avant le Get |
BP | à trancher | non donné | M (provisoire) | D8 | VILLE K5 ; CSV:17 |
| R26 | VILLE-K6 : SexInterface_C:(Script Msg) / SexPersons in GI_C |
3 / 0 | Lectures à index fixes 2, 3, 4 pour 2 participants (estimé) | indécise | Array_IsValidIndex(GI.SexPersons, i) devant chaque emplacement, ou ForEach |
BP | à trancher | bénin pour une scène à deux (estimé) | M (provisoire) | D9 | VILLE K6 ; CSV:38 |
| R27 | VILLE-K7 : Person_C:(Script Msg) / Standspots_Occupied in Room_C |
15 / 9 | Tableau parallèle creux (Array_Set avec bSizeToFit) ; le Get hors bornes rend None, l'emplacement est vu libre |
confirmée (bénin) | Branch Array_IsValidIndex(Standspots_Occupied, Array Index) avant MacroInstance_3 ; faux → Knot_1. Autre voie : dimensionner dans Room (non dumpé) |
BP | oui | bénin, comportement voulu | S | aucun | VILLE K7 ; CSV:29 |
| R28 | VILLE-K8 : GI_C:(Script Msg) / WidgetComponents in MapMarkers_C |
1 / 2 | FocusOnMapMarkers (CustomEvent_183) lit WidgetComponents[0] avant le tick de la garde C++ (0,25 s) |
confirmée (reste d'ERR-008) | Branch Array_IsValidIndex(MapMarkers.WidgetComponents, 0) après l'événement ; faux → SetInputMode_GameAndUIEx sans widget, ou rien |
BP | oui | sans plantage | S | C10 | VILLE K8 ; CSV:18 |
| R29 | VILLE-K9 : hitch MapMarkers_C.LPFocusWidgetComponent |
2 / 4 (hors total 3 549 / 1 121, catégorie (e)) | NewObject à nom fixe sur un composant détruit non encore collecté (LPMapMarkersGuardSubsystem.cpp:127) |
confirmée | MakeUniqueObjectName(Markers, UWidgetComponent::StaticClass(), TEXT("LPFocusWidgetComponent")) (une ligne ; même signature en 5.5 et 5.8) |
C++ | sans objet (pas un garde) | saccades mesurées en U8 : 1,77 ms et 11,66 ms | S + BUILD | C10 | VILLE K9 ; INV 2.8 |
A2. Clés du CSV sans DIAG (cause non donnée)
| ID | Famille / clé | U8 / U6 | Remarque | Source |
|---|---|---|---|---|
| H1 | GI_C:ReturnStatIfNeeded / Person in not an UClass |
2 / 2 | Aucun diagnostic. Constant des deux côtés (INV § Constats 1.5) | CSV:39 |
| H2 | GI_C:isCreatureType / Actor in not an UClass |
1 / 0 | Aucun diagnostic. Nouveau côté U8 (INV § Constats 1.6) | CSV:41 |
| H3 | PC_C:ExecuteUbergraph_PC / CallFunc_getFirstDick_Person_1 in not an UClass |
1 / 0 | Aucun diagnostic. Nouveau côté U8 | CSV:42 |
| H4 | Person_C:UpdateDailyPose / ContactMenu in GI_C |
0 / 63 | Objet du correctif déjà appliqué, 0 événement en U8 (INV § Constats 1.7) | CSV:43 |
| H5 | CharGen_C:ExecuteUbergraph_CharGen / sans propriété (0 / 2) et GI in CharGen_C (0 / 1) |
0 / 3 | Chemin non joué en U8 (création de personnage) | CSV:44, 45 |
| H6 | StreetMap_Static_C:findNearbyBuilding / CurrentCityExpansion in GI_C |
0 / 2 | Citée par VILLE K1 (même garde que R22, fonction non dumpée) | CSV:46 |
| H7 | CharGen_C:PopulateGenitalSlidersDaz / CallFunc_GetSkeletalMesh_ReturnValue in not an UClass |
0 / 1 | Chemin non joué en U8 | CSV:47 |
| H8 | CityMenu_C:ExecuteUbergraph_CityMenu / GI in CityMenu_C |
0 / 1 | Chemin non joué en U8 | CSV:48 |
| Total H1 à H8 (9 clés CSV : H5 en compte 2) | 4 / 72 |
Comptage des clés : 38 clés du CSV portées par les lignes R01 à R28 (R01 = 3 clés, R02 = 0 car sous-ensemble de la clé CSV:2 de R01, R04 = 2, R09 = 2, R12 = 2, R13 = 4, R16 = 2, R18 = 2, R22 = 2, les 19 autres lignes 1 chacune : 3 + 0 + 2 + 2 + 2 + 4 + 2 + 2 + 2 + 19 = 38) + 9 clés en A2 (H5 = 2 clés) = 47 = awk sur le CSV (§ B). R29 n'est pas une clé du CSV (hitch).
B. Couverture chiffrée (événements U8, total STA-T1 = 3 549 = 256 Accessed None + 3 293 index hors bornes)
Commande de contrôle des totaux (lecture seule) :
awk -F';' 'NR>1{n++;c+=$4;r+=$5;if($2=="A"){ac+=$4;ar+=$5}else{bc+=$4;br+=$5}}END{print n,c,r,ac,ar,bc,br}' STA-T1-familles.csv → 47 3549 1121 256 390 3293 731.
B1. Par niveau de cause (U8)
| Niveau de cause | Lignes (événements U8) | Total U8 |
|---|---|---|
| Confirmée | R01 2 579 ; R03 570 ; R04 60 ; R09 4 ; R12 108 (72 + 36) ; R13 30 ; R15 30 ; R16 à R21 87 (56 + 11 + 6 + 10 + 2 + 2) ; R22 9 ; R23 5 ; R24 4 ; R27 15 ; R28 1 | 3 502 |
| Estimée (mécanisme ou rattachement estimé) | R05 7 ; R14 2 ; R11 1 ; R22 forme nue 1 | 11 |
| Indécise | R02 12 ; R06 5 ; R07 1 ; R08 0 ; R12 3 (messages Person_24 hors clearVariable) ; R25 6 ; R26 3 |
30 |
| Non traitée | R10 2 | 2 |
| Sans DIAG (A2) | H1 2 ; H2 1 ; H3 1 | 4 |
| Total | 3 502 + 11 + 30 + 2 + 4 | 3 549 |
Contrôle : echo $((3502+11+30+2+4)) → 3549. Sous-totaux : echo $((2579+570+60+4+108+30+30+87+9+5+4+15+1)) → 3502 ; echo $((7+2+1+1)) → 11 ; echo $((12+5+1+0+3+6+3)) → 30.
Règle de classement (T2c) : « confirmée » = verdict du DIAG sans réserve sur le nœud ou la cause de l'événement ; « estimée » = mécanisme confirmé mais nœud ou rattachement estimé par le DIAG (R05, R22 forme nue, R14) ou par T2c (R11) ; « indécise » = verdict du DIAG ou de T2c « indécise ».
B2. Par DIAG source (U8 / U6)
| DIAG | Lignes | U8 | U6 | Remarque |
|---|---|---|---|---|
| BEAUTE | R01, R02 | 2 591 | 18 | 2 579 + 12 ; U6 : 0 + 18 |
| GIUBER | R03 à R11 | 650 | 696 | ExecuteUbergraph_GI 646 / 688 + clearScenePersons 4 / 8 (GIUBER § 0.1) |
| GIVAR | R12 (part clearVariable 72 / 94), R13, R14, R15 | 134 | 160 | 72 + 30 + 2 + 30 / 94 + 30 + 2 + 34 |
| PERSON | R16 à R21 | 87 | 74 | 56 + 27 + 4 / 40 + 31 + 3 (PERSON § Totaux) |
| VILLE (hors K9) | R12 (part Person_24 39 / 59), R22, R23, R24, R25, R26, R27, R28 | 83 | 101 | 10 + 5 + 4 + 39 + 6 + 3 + 15 + 1 / 15 + 6 + 10 + 59 + 0 + 0 + 9 + 2 |
| Sans DIAG | H1 à H8 | 4 | 72 | A2 |
| Total | 3 549 | 1 121 | echo $((2591+650+134+87+83+4)) → 3549 ; echo $((18+696+160+74+101+72)) → 1121 |
Somme des lignes R01 à R28 (R12 pour 111 / 153) : U8 3 545, U6 1 049 (echo du total des cellules du tableau A) ; + A2 (4 / 72) = 3 549 / 1 121. R29 (hitch) est en dehors.
C. Décisions à prendre (questions Q des 5 DIAG, dédoublonnées)
| # | Décision | Origine | Lignes | Posée à | Bloque |
|---|---|---|---|---|---|
| C1 | Résidu Floats_3 : ajouter les clés manquantes au fichier de normes (B1, dépôt local Modules jamais poussé) ou garde dans getBeautyValue (B2) ? Dépend de D1 à D4 et E3 |
BEAUTE Q1 | R02 | SPEC ou utilisateur | IMPL-GI-A (partie résidu) |
| C2 | Point d'insertion du correctif A : après PopulateBeautyStandardsDefault (CallFunction_1037) ou après le chargement des réglages (entre CallFunction_1055.then et VariableSet_353.execute) ? Selon P2 (D1) |
BEAUTE Q2 | R01 | SPEC | IMPL-GI-A |
| C3 | Données de vêtements et de tags : garde seule, ou aussi correction des données (et des mods) ? Pour K2 : ligne ignorée ou Map_Add avec valeur vide ? |
GIUBER Q1 | R03, R04 | SPEC | IMPL-GI-B (partie données) |
| C4 | Faire imprimer par l'outil de dump le nom des événements personnalisés (CustomFunctionName, référence d'événement) et des temporaires compilés. Besoin cité par quatre DIAG : GIUBER Q2 et 0.7, GIVAR F2 (K2Node_Event_1), PERSON (remarque transverse), VILLE (§ Établi / estimé). Modifier l'outil de dump est un changement hors T2c |
GIUBER Q2 (+ GIVAR, PERSON, VILLE) | R04, R05, R10, R13 et tous les rattachements « estimés » | orchestrateur | non bloquant, mais lève la plupart des « estimé » |
| C5 | Retirer le « décalage :<offset>X » de la méthode : il vaut 64X pour toutes les lignes (GIUBER 0.2 : 646 / 646 ; PERSON remarque transverse), donc inopérant |
GIUBER Q3 (+ PERSON) | toutes | orchestrateur (méthode) | aucun |
| C6 | Correctif de Get_SpinBox_0_Value_0 : A seul, B seul ou A + B ? (GIVAR recommande A ; B ne traite pas R14) |
GIVAR § 5 (arbitrage de l'orchestrateur) | R13, R14 | orchestrateur | IMPL-MENU-A |
| C7 | Si ni HeadtrackStatic ni HeadtrackTarget n'est valide : sauter la rotation (proposé) ou garder l'orientation vers le vecteur nul (comportement probable aujourd'hui) ? |
PERSON Q1 | R17, R18 | SPEC ou utilisateur | IMPL-PERSON-A |
| C8 | Si la recherche de domicile échoue : garder l'écriture d'un domicile vide dans AI_Homes, ou ne rien écrire (proposé) ? Dépend de R22 et de l'écart 7 |
PERSON Q2 | R21 | SPEC ou utilisateur | IMPL-PERSON-B (partie R21) |
| C9 | Ouvrir les DIAG voisins demandés par PERSON Q3 : Standspots_Occupied est traité par VILLE K7 (R27) ; SearchByAmenitySafe / CurrentCityExpansion par VILLE K1 (R22), qui répond « None = ville sans extension sauvegardée », pas « lié à MakePermanent ». Question caduque sous réserve de confirmation par l'orchestrateur |
PERSON Q3 | R21, R22, R27 | orchestrateur | aucun |
| C10 | Garder la garde C++ et corriger seulement le nom (MakeUniqueObjectName, R29), ou corriger FocusOnMapMarkers en Blueprint (R28, R11) et retirer la création du composant de focus ? La première voie ne touche aucun Blueprint |
VILLE Q1 | R11, R28, R29 | SPEC ou utilisateur | IMPL-CPP-A, partie de IMPL-GI-B |
| C11 | Une seule fiche IMPL pour clearVariable (GIVAR F1 + VILLE K4). Les deux DIAG le recommandent ; R12 l'applique. À valider |
VILLE Q2 (+ GIVAR § 5, fiche T2c) | R12 | orchestrateur | IMPL-GI-B |
Aucune autre question n'est posée dans les 5 DIAG. Les « Points à confirmer » (P1 à P3 de BEAUTE, nom de K2Node_Event_1, etc.) sont des vérifications techniques, listées au § D.
D. Dumps et essais complémentaires (liste unique, dédoublonnée)
Forme de commande reprise des DIAG, non rejouée : RunCommandlet.ps1 -Commandlet LPDumpFunction -Args '-BP=<BP> -Fn=<fonction> -Pins -Exec' (BEAUTE § 5). Rappel : le Grep lancé sur dumps\ depuis un dossier ignoré par git renvoie 0 résultat (BEAUTE C5, .gitignore:74) ; chercher par fichier ou par path explicite.
| # | Blueprint | Objet à dumper | Demandé par | Lève | Bloque |
|---|---|---|---|---|---|
| D1 | GI | fonction ConsolidateBeautyStandards (16 nœuds, GI__graphes.txt:355) |
BEAUTE § 5 (H2-1), C3 P1 à P3 | R01, R02 | IMPL-GI-A (bloquant) |
| D2 | GI | fonction filterMorphList |
BEAUTE § 5 (H2-1) | R02 | résidu de IMPL-GI-A |
| D3 | Person | fonction pickAppropriateFaces (59 nœuds, Person__graphes.txt:115) |
BEAUTE § 5 (H2-1) | R02 | résidu de IMPL-GI-A |
| D4 | GI | CDO (LPDumpCDO) : BeautyStandardTags, Shapes, Ethnics, fichier source de MorphTags_false |
BEAUTE § 5 (H2-2) | R01 (tags aux indices 7-13 et 15-20), R02 | IMPL-GI-A |
| D5 | GI | fonctions getRelative, GetSpecific, getPerson (aucune ne doit dépendre de l'effet du cas vide) |
GIVAR F1 § 5 (vérification N1) | R12 | IMPL-GI-B |
| D6 | Person | fonction PlayIdle (corps absent des dumps ; transmission Near, affectation de HeadtrackStatic hors EventGraph) |
PERSON § Établi / estimé / incertain | R16, R17 | non bloquant |
| D7 | MainMenu | nom ou référence de K2Node_Event_1 (Construct ou Pre Construct ?), par un dump qui imprime l'événement ou un coup d'œil dans l'éditeur |
GIVAR F2 § 5 | R13, R14 | IMPL-MENU-A (correctif A) |
| D8 | GI | 6 fonctions candidates : PlayAppropriateSexAnimation, PlayAnimationMorph, PersonPlayAnimationMorph, getFaceTexture, getMID, CumSound (GI__graphes.txt:80, 8, 81, 267, 26, 269), puis recherche de Texture2dArray_3 |
VILLE K5 § 5 (N0) | R25 | IMPL-GI-B (partie R25) |
| D9 | SexInterface | liste des graphes (-BP=SexInterface), puis la fonction qui lit SexPersons |
VILLE K6 § 5 (N0) | R26 | IMPL-SEX-A |
| D10 | StreetMap_Static | fonction findNearbyBuilding (U6 : 2 événements) |
VILLE K1 § 4 | H6 | non bloquant (même garde que R22) |
| D11 | GI | écriture de TintUI : -Fn=* ou dump des widgets qui écrivent GI.TintUI, puis recherche de variable 'TintUI' |
GIUBER K4 § 5 (N2) | R06 | IMPL-GI-C (partie R06) |
| D12 | tous | noms des K2Node_CustomEvent et des temporaires (outil de dump, voir C4) |
GIUBER Q2 | R04, R05, R10, R13 | non bloquant |
14 fonctions nommées en D1 à D12 (1 + 1 + 1 + 3 + 1 + 6 + 1 : D1, D2, D3, D5, D6, D8, D10), plus la liste de SexInterface (D9), un CDO (D4), un nom d'événement (D7) et un changement d'outil (D12).
Lectures et essais hors dump
| # | Essai | Demandé par | Lève |
|---|---|---|---|
| E1 | Lister les lignes sans ': ' de Content/Modules/MorphTags/*.txt (N1) |
GIUBER K2 § 5 | R04 |
| E2 | Identifier les lignes à 3 champs lues par populateClothes4 (N2) | GIUBER K1 § 5 | R03 |
| E3 | Différence entre les morphs de la liste féminine filtrée et les clés du fichier de normes (après D2 à D4) | BEAUTE § 5 (H2-3) | R02 |
| E4 | Lire l'affectation de SceneCapture dans GI et tracer IsValid / GetRootComponent dans une build de diagnostic (N3) ; rejouer la création de personnage après correction |
GIUBER K5, K6 § 5 | R07, R08 |
| E5 | Remonter l'exécution depuis les 19 VariableGet 'Companion' jusqu'à SceneStart (dump GI__EventGraph.txt existant) |
GIUBER § Clés non traitées | R10 |
| E6 | Remonter le déclencheur de CallFunction_3040 (chaîne readUniforms > PopulateAllMorphTags > PopulateBeautyStandardsDefault) avant toute entrée en pièce (P3), dans le dump existant |
BEAUTE C3 P3 | R01 |
Mentionnés, non demandés : Person RandomizeFace et RandomizeAll (événements de Person__EventGraph.txt, déjà dumpés, noms absents : écart 2) ; MapMarkers_C (non dumpé, VILLE § Compte rendu 5 ; la destruction du composant de focus par HideAllMarkers reste « estimée ») ; Room au-delà de pickPresetWorld (alternative de R27). Le corps de FocusOnMapMarkers est localisé par VILLE K8 (GI__EventGraph.txt:13185-13212) : GIUBER ne l'avait pas localisé, aucun dump nécessaire.
E. Lots IMPL proposés (par Blueprint, un lot = une famille de causes)
« U8 visés » = somme des événements U8 des lignes du lot (comptes repris du § A) ; « cond. » = ligne dont la cause est indécise ou non traitée, à n'inclure qu'après le prérequis. Ordre et priorité : renvoyés à STA-T4. Les lots d'un même Blueprint modifient le même asset binaire : à exécuter l'un après l'autre (estimé, pas de fusion d'assets).
| Lot | Blueprint | Famille de causes | Lignes | U8 visés | Mesure de VAL attendue (reprise des DIAG) | Prérequis | Effort |
|---|---|---|---|---|---|---|---|
| IMPL-GI-A | GI (EventGraph) | Table BeautyStandards non remplie à la génération des PNJ |
R01 ; cond. R02 | 2 579 ; cond. 12 | array Floats_3_ : 0 pour getRandomAge et getRandomEthnicity, résidu seul dans getBeautyValue (BEAUTE C3) ; visible en jeu (estimé), S3 = 1 |
D1, D4, E6, C2 (C1 pour le résidu avec D2, D3, E3) | M |
| IMPL-GI-B | GI (EventGraph, clearVariable) |
Lecture d'un tableau vide ou court sans test de longueur | R03, R04, R12, R28, R11 ; cond. R25 | 743 (570 + 60 + 111 + 1 + 1) ; cond. 6 | GI_C:clearVariable: = 0 ; array 'Person_24…' of length 0 = 3 (les 3 messages hors clearVariable) ; R03 et R04 : non donné (attendu 0) ; R28 et R11 : non donné |
D5, C3, C10, C11 ; cond. D8 | M |
| IMPL-GI-C | GI (EventGraph, clearScenePersons, determinePersonVars) |
Référence None normale utilisée sans IsValid |
R05, R09, R15 ; cond. R06, R07, R08, R10 | 41 (7 + 4 + 30) ; cond. 8 (5 + 1 + 0 + 2) | property currentMatchRace in /Game/BPs/GI.GI_C = 0 (GIVAR F3) ; clearScenePersons = 0 (GIUBER K7) ; R05 : non donné |
C4 (rattachement de R05) ; cond. D11, E4, E5 | M |
| IMPL-PERSON-A | Person (standIdle, EventGraph) |
Référence None, ou nœud pur évalué en entier, sans IsValid |
R16, R17, R18, R19 | 83 (56 + 11 + 6 + 10) | −56 / −40 (R16) ; −17 / −14 (R17 + R18) ; −10 / −17 (R19), U8 / U6 (PERSON § 4) | C7 | M |
| IMPL-PERSON-B | Person (assignHome, standIdle) |
Tableau vide ou creux lu sans test | R20, R21, R27 | 19 (2 + 2 + 15) | −2 / −2 (R20) ; −2 / −1 (R21, si garde locale) ; R27 : non donné. À enchaîner après IMPL-PERSON-A (même fonction standIdle) |
C8, R22 | S |
| IMPL-MENU-A | MainMenu | Ordre d'initialisation : binding évalué avant GI |
R13, R14 | 32 (30 + 2) | Get_SpinBox_0_Value_0:64X = 0 et property GI in /Game/UI/MainMenu.MainMenu_C = 0 (GIVAR F2 § 5) |
D7, C6 | M (A) / S (B) |
| IMPL-SMS-A | StreetMap_Static | Référence None normale sans IsValid |
R22, R23 | 15 (10 + 5) | 0 ligne property CurrentCityExpansion, 0 forme nue sous SearchByAmenitySafe ; 0 ligne property BGA ou via property BGA (VILLE K1, K2) |
D10 (non bloquant) | S |
| IMPL-ROOM-A | Room (pickPresetWorld) |
Tableau vide lu sans test | R24 | 4 | 0 ligne array BuildingPoints, préréglage de la rue inchangé (VILLE K3) |
aucun | S |
| IMPL-SEX-A (conditionnel) | SexInterface | Tableau court lu à index fixes | R26 | cond. 3 | non donné | D9 | M (provisoire) |
| IMPL-CPP-A | C++ LPMapMarkersGuardSubsystem |
Nom d'objet fixe sur un composant détruit non collecté | R29 | 0 (2 hitchs, hors total) | 0 ligne overwrite took sur LPFocusWidgetComponent, ligne de garde slot de focus toujours présente (VILLE K9 § 5) |
C10 | S + BUILD |
Contrôle : lots fermes 2 579 + 743 + 41 + 83 + 19 + 32 + 15 + 4 = 3 516 ; conditionnels 12 + 6 + 8 + 3 = 29 ; 3 516 + 29 = 3 545 = lignes R01 à R28 (§ B) ; + 4 sans DIAG = 3 549 (echo $((2579+743+41+83+19+32+15+4)) → 3516 ; echo $((12+6+5+1+0+2+3)) → 29).
F. Constats transverses et points de vigilance
F.1 Contradiction entre PERSON F et VILLE K1 (non tranchée). PERSON F (§ 4) désigne CurrentCityExpansion None comme cause racine de R21 et écrit que le correctif amont « rend cette garde inutile dans le cas observé ». VILLE K1 (§ 3 et § 4) établit que, avec CurrentCityExpansion None, SearchByAmenitySafe rend déjà le repli StreetMap.Buildings et que « le résultat de la fonction est juste » : le correctif R22 est neutre sur le contenu de Buildings. Lecture de T2c (estimée) : R22 supprime l'avertissement Accessed None qui précède R21, mais ne garantit pas que Buildings cesse d'être vide. Essai qui trancherait : après IMPL-SMS-A, rejouer le parcours MakePermanent / SetDating et compter CallFunc_SearchByAmenitySafe_Buildings (2 attendus si R21 subsiste). D'ici là, la garde locale de R21 ne doit pas être écartée au motif de R22.
F.2 Technique commune. Quatre DIAG reposent sur le même piège : un nœud pur (AND, OR, Select, macro de lecture) est évalué en entier, donc un IsValid placé en entrée n'empêche pas la lecture fautive. Les correctifs proposés remplacent le nœud par des branches en cascade : R05 (c), R12, R17 et R18, R20, R19 (consigne explicite). Les cibles multiples d'un nœud d'appel (R05, R09, R07) se traitent en séparant les cibles.
F.3 Préexistant 5.5. Établi seulement pour trois lignes (R12, R13, R15), par lecture du journal 55 (GIVAR). Pour les autres, U6 tourne déjà sur 5.8 : l'absence de régression de la montée 5.8 est estimée (PERSON A, VILLE K1 à K8), non vérifiée contre un journal 5.5.
F.4 Rafale R01 : pas un écart propre à 5.8. U6 tourne aussi sur 5.8 et n'a que le résidu (18) : la différence vient du scénario (création de personnage ou non avant la première génération de PNJ). L'hypothèse amont « boucle de reprise de pickAppropriateFaces » est réfutée (compte fixe par sexe, BEAUTE § 3b). Correction de STA-T2a (BEAUTE § 1) : RandomizeAll, RandomizeFace, pickAppropriateFaces sont absents des dumps, pas du Blueprint.
F.5 Fusions et dépendances entre lignes. R12 = GIVAR F1 + VILLE K4 (écart 3). R11 rattachée à R28 (écart 4). R17 + R18 = une seule modification. R07 + R08 = un seul lot (même mécanisme). R14 traitée par R13-A seulement. R21 dépend de la décision C8 et de l'essai F.1. R27 et R16 sont dans la même fonction standIdle.
F.6 Budgets. Les cinq DIAG sont marqués « hors budget » dans STA-TACHES.md (154 à 235 k jetons) ; BEAUTE, GIUBER et VILLE sont « partiels ». Cette consolidation ne les rouvre pas.
F.7 Établi / estimé / incertain (sk-protocol § 1).
- Établi : les 47 clés, leurs totaux (3 549 / 1 121, A 256 / 390, B 3 293 / 731) relus au CSV par
awk; les comptes par clé repris des DIAG avec leur source ; les sommes de B1, B2 et E recalculées (echo $((…)), sorties citées). - Estimé : colonnes Type et Effort ; classement en niveaux de cause (B1) ; rattachement de R11 à R28 ; contradiction F.1 ; ordre d'exécution des lots d'un même Blueprint ; « 2 493 = 2 505 − 12 » (soustraction de T2c à partir de BEAUTE § 3b : 12 appels de la trame 419, tous
getBeautyValue). - Incertain : tout ce que les DIAG marquent incertain (nœud de la forme nue de R22, site
:64Xde R02, attribution_28/_29, contenu deBeautyStandardTags, comportement deGetVariablesur une variable inexistante) ; la répartition des 3 messagesPerson_24horsclearVariable(R12) ; les comptes U6 de GIVAR F1 et F3 (« non recomptés », repris de STA-T1).
Compte rendu (sk-protocol § 3)
[sk-protocol] Skills présents : sk-protocol, lp-doc, lp-lot.
- Résultat : réussi. 29 lignes consolidées (5 DIAG, 47 clés CSV dont 38 portées par les lignes et 9 sans DIAG), 11 décisions, 12 dumps et 6 essais, 10 lots IMPL proposés.
- Preuves : lecture des 5 DIAG (§ Constats et tableaux d'abord), de
STA-T1-familles.csv,STA-T1-INV.md,STA-TACHES.md,gabarits.md,29_Projet_Stabilisation_V2.md:55(définition de S3). Chaque ligne cite sa section de DIAG et sa ligne de CSV. - Chiffres :
awksur le CSV →47 3549 1121 256 390 3293 731; niveaux de cause 3 502 + 11 + 30 + 2 + 4 = 3 549 ; par DIAG 2 591 + 650 + 134 + 87 + 83 + 4 = 3 549 (U6 : 18 + 696 + 160 + 74 + 101 + 72 = 1 121) ; lots 3 516 + 29 = 3 545 (+ 4 sans DIAG). Toutes les sommes recalculées parecho $((…))en Bash. - Incertitudes : contradiction PERSON F / VILLE K1 (F.1) ; 3 messages
Person_24sans source (R12) ; efforts et types estimés ;ConsolidateBeautyStandardsnon dumpée (R01 reste conditionnel à D1). - Écarts : voir § 4 (8 points). Fichier écrit :
D:\Game\LifePlay-master 5.5\Docs\Migration\etat\ST\STA\STA-T2c-DOC.md(seul). - Handoff : Suite : l'orchestrateur doit accepter STA-T2c, lancer un N0 pour D1 à D12, trancher C1 à C11 (priorité C2, C6, C7, C10), puis passer le tout à STA-T4 ; état : consolidation livrée, aucune modification du projet.