210 lines
40 KiB
Markdown
210 lines
40 KiB
Markdown
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
|
||
1. **Skills** : l'en-tête cite `lp-lot` en plus de `sk-protocol` et `lp-doc`, parce que les trois sont préchargés dans le contexte de l'agent.
|
||
2. **Point amont 5 (dumps)** : la fiche cite `RandomizeFace` et `RandomizeAll` de Person et `MapMarkers`. BEAUTE ne les demande pas : `RandomizeAll` et `RandomizeFace` sont des événements du graphe d'événements de Person, déjà dumpé (appel de `RandomizeFace` en `Person__EventGraph.txt:17802`, BEAUTE § 1 pile 2) ; ils manquent de nom, pas de dump. `MapMarkers_C` est noté « non dumpé » par VILLE (§ Compte rendu 5), sans demande de dump. Les deux sont listés « mentionnés, non demandés » au § D.
|
||
3. **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_24` sur 39 précèdent un avertissement `clearVariable`, 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 ».
|
||
4. **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).
|
||
5. **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.
|
||
6. **Total 3 549 / 1 121** : il couvre les catégories (a) `Accessed None` et (b) index hors bornes (INV § 2.4). Les hitchs K9 (2 / 4, catégorie (e)) et les 4 lignes `pending kill` de `BGA` en U6 (INV § 2.7 n° 24, catégorie (d)) sont hors de ce total ; ils sont dans le tableau avec la mention « hors total ».
|
||
7. **Contradiction entre DIAG** (PERSON F et VILLE K1), non tranchée ici : voir § Constats F.1.
|
||
8. **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 `:64X` de R02, attribution `_28` / `_29`, contenu de `BeautyStandardTags`, comportement de `GetVariable` sur une variable inexistante) ; la répartition des 3 messages `Person_24` hors `clearVariable` (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.
|
||
1. **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.
|
||
2. **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.
|
||
3. **Chiffres** : `awk` sur 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 par `echo $((…))` en Bash.
|
||
4. **Incertitudes** : contradiction PERSON F / VILLE K1 (F.1) ; 3 messages `Person_24` sans source (R12) ; efforts et types estimés ; `ConsolidateBeautyStandards` non dumpée (R01 reste conditionnel à D1).
|
||
5. **Écarts** : voir § 4 (8 points). Fichier écrit : `D:\Game\LifePlay-master 5.5\Docs\Migration\etat\ST\STA\STA-T2c-DOC.md` (seul).
|
||
6. **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.
|