LifePlay-Revival/Docs/Migration/etat/ST/STE/STE-TXT-DIAG.md

255 lines
21 KiB
Markdown
Raw Normal View History

Fiche STE-TXT-DIAG — Niveau N3 — Modèle prévu (non précisé par la fiche) | utilisé claude-opus-5-5 — Agent lp-cart (A-CART) — Skills sk-protocol, lp-doc (gabarits), lp-paths, lp-commandlets, ue-cpp-build
# STE-TXT-DIAG : plantage PIE du panneau Save Preset de CharGen (nom vide), lien avec STE-TXT (2026-10-10)
Lecture seule : aucun éditeur, commandlet, build ni écriture git. Seule écriture : ce fichier. Les comparaisons binaires
passent par `python -I -` lu sur l'entrée standard (aucun fichier écrit), qui importe la fonction `load` de
`Tools\uasset58.py` (en-tête de paquet 5.8, tables de noms, d'imports et d'exports).
**Réponse** : le plantage est **antérieur à STE-TXT**. STE-TXT n'en est pas la cause. La cause est un défaut du moteur
5.8, déclenché par le graphe d'origine de CharGen. La preuve est établie sur l'asset et sur le code du moteur. Il manque
une reproduction sans STE-TXT (§ 5).
## 1. Symptôme et reproduction
- Geste (fiche) : PIE, création de personnage, panneau Save Preset, champ `FilenameEntry` vidé, clic sur Save Preset.
Le nom vide est refusé et le fond clignote en rouge.
- Rapport `Saved\Crashes\UECC-Windows-6F2B4B3F49C4EC25E9BAD5BECC3DFA1A_0000\CrashContext.runtime-xml` :
- `:11` : `EXCEPTION_ACCESS_VIOLATION reading address 0x0000000000000000` ;
- `:30` : moteur 5.8.3-58210709 ;
- `:15` : `SecondsSinceStart` 425. Le journal commence à 11:25:21 UTC (`LifePlay.log:639`), donc le plantage a lieu
vers 11:32:26 UTC. Le dossier du rapport date de 13:32:31 heure locale (`ls`).
- Pile complète (`:104-248`), lue de haut en bas :
- `:104` : `FCachedTypefaceData::FCachedTypefaceData` (`FontCacheCompositeFont.cpp:93`) ;
- `:105` : `FCachedCompositeFontData::FCachedCompositeFontData`, ligne **153**. C'est la typeface de repli, pas celle
par défaut (ligne 152) ;
- `:106` : `GetCachedCompositeFont` (`:914`), puis `:107` : `GetDefaultFontData` (`:509`) ;
- `:108-117` : `FSlateFontRenderer::GetMaxHeight`, `FSlateTextRun::Measure`, mise en page `FTextLayout` ;
- `:118` : `SEditableText::SynchronizeTextStyle` (`SEditableText.cpp:578`) ;
- `:119-121` : rappel d'un attribut Slate (`FSlateAttributeMetaData::UpdateAttributesImpl`) ;
- `:122-233` : Prepass récursif ;
- `:234-245` : `SlatePrepass`, `DrawPrepass`, `FSlateApplication::Tick`, `FEngineLoop::Tick`.
- **Pile Blueprint juste avant le plantage : aucune.**
- Le fil du plantage ne contient aucune trame `ScriptCore` ni `ProcessEvent` (`:104-248`). Le Grep
`Script|Blueprint|CharGen|ExecuteUbergraph` sur le rapport ne trouve que des noms de DLL (`:2209` et suivantes).
- `LifePlay.log` compte 2 807 lignes (Grep, nombre). Sa dernière ligne est `:2807` (11:32:16 UTC, LogEOS).
- La dernière ligne `LogScript` est `:2801-2804` (11:29:21) : `GI_C:SavePreset`, Accessed None
`CallFunc_GetSkeletalMesh_ReturnValue_3`, trois minutes avant le plantage. C'est probablement un enregistrement
précédent avec un nom non vide (estimé).
- La branche du refus n'écrit rien au journal (§ 3.3).
- C'est le seul rapport de cette signature. Le Grep `FCachedTypefaceData::FCachedTypefaceData|SEditableText::SynchronizeTextStyle`
sur `Saved\Crashes` trouve 1 fichier (3 lignes). Le dossier contient 3 rapports, dont 2 du 2026-10-08.
- Reproduction : non faite, la fiche l'interdit (§ 5).
## 2. Hypothèse testée (une seule)
H : « les deux valeurs posées par STE-TXT causent le plantage ». Ces valeurs sont
`FilenameEntry.WidgetStyle.TextStyle.ColorAndOpacity` = (0,0,0,1) Specified et `VarianceSpinBox.ForegroundColor` =
(0,0,0,1). Trois essais :
- (a) l'asset avant et après : d'autres données diffèrent-elles ? la police est-elle intacte ?
- (b) le graphe du flash rouge ;
- (c) le code moteur : quelle donnée est fausse, et une couleur peut-elle jouer ?
## 3. Essai et résultat brut
### 3.1 Fichiers comparés
| | Chemin | MD5 (`md5sum`) | Taille | Date |
|---|---|---|---|---|
| avant | `D:\Game\LifePlay_Backup_5.5\STE-TXT\Content\UI\CharGen.uasset` | `21ab367c77c2af4718873e601b1298ef` | 5 028 080 | 2026-10-08 20:28:38 |
| après | `Content\UI\CharGen.uasset` | `9669b103d0a056f0bd9089936d848963` | 5 047 338 | 2026-10-10 13:17:29 |
`git show HEAD:Content/UI/CharGen.uasset | md5sum` donne `21ab367c…` : l'instantané est identique à HEAD. Le dernier
commit qui touche le fichier est `809102a` (U5).
### 3.2 Différences entre les deux fichiers
Méthode : `load()` sur les deux fichiers ; exports appariés par chemin complet (chaîne des `outer`) ; comparaison des
octets de chaque export ; `difflib.SequenceMatcher` sur les exports qui diffèrent ; noms résolus par paires
(index, numéro) de la table des noms.
- Tables :
- en-tête total : 2 229 758 → 2 241 225 ;
- noms : 1 596 de chaque côté, **identiques et dans le même ordre**, donc les octets restent comparables ;
- imports : 351 de chaque côté, identiques ;
- exports : 3 582 de chaque côté. Un seul chemin change de nom :
`CharGen_C.ComponentDelegateBinding_0` → `_1`, objet régénéré par la compilation.
- 194 exports sur 3 582 ont des octets différents :
| Groupe | Nb | Écart de taille | Nature de l'écart |
|---|---|---|---|
| `FilenameEntry` (EditableTextBox), dans `CharGen.WidgetTree` et `CharGen_C.WidgetTree` | 2 | +191 o | (1) Une étiquette `ColorAndOpacity` est insérée dans `TextStyle` à l'octet 206, juste après `Font`. C'est une StructProperty `SlateColor` : `SpecifiedColor` = LinearColor `00000000 00000000 00000000 0000803f` = (0,0,0,1) et `ColorUseRule` = `ESlateColorStylingMode::UseColor_Specified`. (2) Les deux tailles englobantes changent : `WidgetStyle` 180 → 371 (octet 45), `TextStyle` 123 → 314 (octet 94). Les octets 0 à 205 sont identiques, y compris `Font` (`FontObject`, `Size`). |
| `VarianceSpinBox` (SpinBox), mêmes deux arbres | 2 | +122 o | Une étiquette `ForegroundColor` (`SlateColor`, `SpecifiedColor` (0,0,0,1)) est insérée à l'octet 112, après `Font` (`TypefaceFontName` Italic, `Size`). Rien d'autre ne change. |
| Fonctions compilées `CharGen_C.*` | 185 | +3 013 o au total (+4 pour 128 d'entre elles) | Bytecode régénéré. Pour 173 fonctions sur 185, la taille croît exactement du nombre d'octets `0x5A` / `0x5E` ajoutés. Ce sont `EX_WireTracepoint` et `EX_Tracepoint`, notés « Only observed in the editor » (`Script.h:286`, `:290`). Les 12 autres fonctions s'en écartent de quelques octets. Exemple : `ExecuteUbergraph_CharGen` +1 947 o, dont 1 731 octets `0x5A`/`0x5E` (le reste viendrait des décalages, estimé). Cause estimée : compilée dans l'éditeur par STE-TXT (`compile_blueprint`) ; le resave U5 était fait par commandlet. Aucun lien avec les valeurs de style. |
| `CharGen_C` (WidgetBlueprintGeneratedClass) | 1 | +4 152 o | Classe régénérée par la même compilation (estimé). |
| `K2Node_CallFunction_109`, `_237`, `_317` (`RetriggerableDelay`) et `_5310` (`Delay`) | 4 | 0 | Une chaîne de 32 caractères hexadécimaux est remplacée (octets 549 à 581, après la broche `then`). Exemple pour `_5310` : `6E2BF543…` → `B4A488ED…`. Le reste du nœud est identique (liens et valeurs). Ce sont les 4 nœuds latents du graphe. Identifiant probablement régénéré par la compilation (estimé, nature exacte non lue). |
- Aucun autre export ne diffère. En particulier `K2Node_IfThenElse_366`, `K2Node_VariableGet_3348`,
`K2Node_BreakStruct_62`, `K2Node_MakeStruct_62` à `_65` et `K2Node_VariableSet_1146` / `_1147` sont identiques octet
pour octet : ils sont absents de la liste des 194.
- Conclusion : dans les données de widget, seules les deux propriétés de STE-TXT diffèrent. La police de FilenameEntry
est identique octet pour octet, et le graphe aussi. Le reste est la sortie d'une nouvelle compilation.
### 3.3 Le flash rouge dans le graphe
Sources :
- relevé 5.8 `Saved\Logs\portage\U5_assets_apres.txt` (présent, 233 673 521 o, 2026-10-08 20:31). Il est postérieur à
l'instantané (20:28) et représente donc l'état d'avant STE-TXT (estimé). Le graphe étant identique (§ 3.2), il vaut
aussi pour l'état actuel ;
- le dump 5.5 `L4-CX-B04_dump_apres_CharGen_EventGraph.txt` porte les mêmes noms de nœuds (`:1035-1099`).
Déroulé :
- `K2Node_IfThenElse_366` (`:1191697-1191704`) :
- execute ← `K2Node_ComponentBoundEvent_1418.then` ;
- Condition ← `K2Node_CallFunction_5138.ReturnValue`. La fiche dit `Greater_IntInt(Len, 0)` ; je ne l'ai pas relu ;
- then → `K2Node_CallFunction_5375` (enregistrement) ;
- else → `K2Node_VariableSet_1147`.
- `K2Node_VariableSet_1147` (`:1195450-1195460`) : nœud Set de `EditableTextBox.WidgetStyle` sur `FilenameEntry`
(`K2Node_VariableGet_2400`), valeur ← `K2Node_MakeStruct_62`. Ensuite :
- `K2Node_CallFunction_5310` (Delay, durée non lue) ;
- puis `K2Node_VariableSet_1146` (`:1195439-1195449`), valeur ← `K2Node_MakeStruct_64`.
- `K2Node_MakeStruct_62` et `_64` (`EditableTextBoxStyle`, `:1192103-1192125` et `:1192136-1192158`) : toutes leurs
broches viennent de `K2Node_BreakStruct_62`, qui casse `K2Node_VariableGet_3348.WidgetStyle`, c'est-à-dire le style
courant de FilenameEntry (`:1184402-1184415`). Deux exceptions :
- `BackgroundColor` ← `K2Node_MakeStruct_63` (rouge (1,0,0,1), `:1192134`) ou `_65` (blanc, `:1192167`) ;
- `FocusedForegroundColor` n'est pas reliée : UseColor_Foreground par défaut (`:1192122`, `:1192155`).
- Réponses :
- Le style est-il reconstruit ? **Oui**, en entier : Break puis Make, deux fois. Il est réécrit par deux nœuds Set
séparés par le Delay.
- La police est-elle reportée ? **Oui** : `TextStyle` est recopié du style courant (`:1184408` → `:1192118`,
`:1192151`). La couleur posée par STE-TXT est recopiée avec.
- ERR-025 (`Make_64` sans police) n'est pas présent : la broche `TextStyle` de `_64` est reliée, en 5.8 comme dans le
dump 5.5 (`L4-CX-B04_dump_apres_CharGen_EventGraph.txt:1063`).
- ERR-021 : la broche `Font` n'existe plus sur ce Make (`ShowPinForProperties` sans `Font`, `:1192105`) ; le membre
s'appelle désormais `Font_DEPRECATED` (`SlateTypes.h:1063`).
- Dump 5.8 de l'EventGraph : pas nécessaire, le graphe est identique octet pour octet à l'état du relevé (§ 3.2). Si
l'orchestrateur veut une confirmation sur l'état courant (non lancé) :
`.\Tools\RunCommandlet.ps1 -Lot STE-D -Commandlet LPDumpFunction -Args '-BP=CharGen -Fn=EventGraph -Pins -Exec'`.
- Autres graphes exposés : Grep des `VariableReference … UMG.<classe>' … MemberName="WidgetStyle"|"Style"` sur tout
le relevé. Résultat : 4 nœuds Set, tous de `EditableTextBox.WidgetStyle` : CharGen `_1146` / `_1147` et StatMenu
`_1146` / `_1147` (`:1415089-1415110`). S'y ajoutent leurs copies `ExecuteUbergraph_*`. Aucune autre classe UMG.
### 3.4 Code moteur installé (`D:\Game\Launcher\Engine\UE_5.8\Engine\Source`)
Chaîne complète, du nœud Set au plantage :
1. **`WidgetStyle` a un setter natif en 5.8.** Déclaration : `UPROPERTY(EditAnywhere, BlueprintReadWrite, Getter, Setter, …)`
(`Runtime\UMG\Public\Components\EditableTextBox.h:51-52`). En 5.5 la propriété n'a pas de `Setter`
(`UE_5.5\…\EditableTextBox.h:48-49`).
- Le setter s'appelle par défaut `Set` + nom de la propriété, soit `SetWidgetStyle`
(`Programs\Shared\EpicGames.UHT\Types\UhtClass.cs:1199`, `:1203`).
- Ce n'est pas une UFUNCTION (`EditableTextBox.h:261`), donc il n'y a pas de `BlueprintSetter`. La compilation
Kismet ne remplace un nœud Set que pour un `BlueprintSetter` (`Editor\BlueprintGraph\Private\K2Node_VariableSet.cpp:501-519`) :
le nœud reste un Set.
2. **La VM appelle ce setter, à travers une valeur temporaire.** Dans `UObject::execLet`, quand `HasSetter()` est vrai
(`CoreUObject\Private\UObject\ScriptCore.cpp:2906-2929`) :
- une valeur temporaire est allouée sur la pile virtuelle de la VM (`:2909-2912`) ;
- l'expression y est évaluée (`:2916`) ;
- `SetValue_InContainer(Container, LocalTempResult)` est appelé (`:2921-2925`) ;
- puis la temporaire est **détruite** (`:2927-2929`).
`SetValue_InContainer` passe par `CallSetter` (`UnrealType.h:635-644`). Le code généré par UHT transmet la valeur
par référence : `T& Value = *(T*)InValue; Obj->SetWidgetStyle(Value);` (`UhtHeaderCodeGeneratorCppFile.cs:2832-2842`).
3. **`UEditableTextBox::SetWidgetStyle` donne à Slate l'adresse de son paramètre.** Il copie le style dans le membre,
puis appelle `MyEditableTextBlock->SetStyle(&InStyle)` (`Runtime\UMG\Private\Components\EditableTextBox.cpp:392-398`).
`SynchronizeProperties` donne au contraire `&WidgetStyle` (`:133`).
4. **`SEditableTextBox::SetStyle` garde ce pointeur.** Il enregistre `Style = InStyle`, ainsi que les pointeurs
`BorderImage*` qui visent l'intérieur de ce style (`Runtime\Slate\Private\Widgets\Input\SEditableTextBox.cpp:113-131`).
Après l'étape 2, `Style` vise une temporaire détruite : **le pointeur pend**.
5. **Le Prepass suivant relit la police à travers ce pointeur.** L'attribut `Font` de `SEditableText` est lié à
`SEditableTextBox::DetermineFont` (`SEditableTextBox.cpp:65`), qui renvoie `Style->TextStyle.Font` (`:342-346`).
- Quand cette valeur change, l'attribut appelle `SynchronizeTextStyle` (`SEditableText.cpp:37-38` ; pile
`CrashContext:118-121`).
- `SynchronizeTextStyle` recopie la police (`SEditableText.cpp:543-550`) et rafraîchit la mise en page
(`:575-578`).
- La mise en page mesure le texte : `FSlateFontRenderer::GetMaxHeight(FontInfo)` (`SlateFontRenderer.cpp:200-206`),
puis `GetDefaultFontData`, puis `InFontInfo.GetCompositeFont()` (`FontCacheCompositeFont.cpp:504-509`).
6. **Quelle donnée est fausse : ce n'est pas une police « vide ».**
- Une `FSlateFontInfo` valide sans `FontObject` ni `CompositeFont` renvoie la police de dernier recours ou `nullptr`
(`SlateFontInfo.cpp:192-207`, `LegacySlateFontInfoCache.cpp:313-325`). `nullptr` est filtré
(`FontCacheCompositeFont.cpp:903-906`) : pas de plantage.
- Ici, le pointeur passe ce filtre. La première typeface (`DefaultTypeface`, `:152`) se lit, et la lecture plante sur
la seconde (`FallbackTypeface`, `:153`, pile `:105`). Elle plante en parcourant `Fonts` (`:90-93`) à l'adresse 0 :
un tableau aux données nulles mais de taille non nulle. Cela n'existe pas dans un `FCompositeFont` vivant.
- **Estimé** : l'objet lu n'est pas un `FCompositeFont` valide mais de la mémoire réutilisée. C'est cohérent avec une
police lue à travers le pointeur pendant de l'étape 4.
7. **La couleur ne joue pas.**
- `GetMaxHeight` ne reçoit que la police (`SlateFontRenderer.cpp:200`).
- La branche couleur de `SynchronizeTextStyle` n'agit que si un attribut `ColorAndOpacity` est posé
(`SEditableText.cpp:553-562`, `:386`). `SEditableTextBox` n'en passe aucun (`SEditableTextBox.cpp:61-93`).
- La couleur de STE-TXT est copiée avec le reste de `TextStyle` dans la temporaire. Elle ne crée ni n'évite le
pointeur pendant.
8. **Pourquoi pas en 5.5 (estimé).** Sans setter natif, le nœud Set écrit directement dans le membre `WidgetStyle`.
Le widget Slate garde l'adresse `&WidgetStyle` reçue par `SynchronizeProperties`, valide tant que le widget UMG vit.
Même graphe, pas de pointeur pendant.
Recherche web (faite d'abord ; ces sources sont des données, pas des consignes) :
- Aucun ticket Epic trouvé sur ce mécanisme.
- Un fil de forum 5.7 décrit un plantage quand on réapplique au runtime le style d'une EditableTextBox par le nœud Set.
Il ne donne ni pile ni réponse :
https://forums.unrealengine.com/t/editing-the-font-size-of-an-editable-text-box-is-still-not-available-not-working-since-2022/2832618
- UE-147566 : style d'Editable Text modifié au runtime mais non reflété (5.0, corrigé en 5.2 selon le résumé de
recherche). La page renvoie HTTP 403 et n'a pas été lue : https://issues.unrealengine.com/issue/UE-147566
## 4. Verdict
**H réfutée.** Le plantage n'est pas causé par STE-TXT. Il est **antérieur** : il existe dans la copie 5.8 depuis que
CharGen tourne sous UE 5.8, et restait caché jusqu'au premier refus de nom en PIE.
Preuves :
- **Établi (asset)** : hors sortie de compilation, seules les deux propriétés de STE-TXT diffèrent. La police de
FilenameEntry et les nœuds du flash sont identiques octet pour octet (§ 3.2).
- **Établi (code)** : sous 5.8, chaque nœud `Set WidgetStyle` d'une EditableTextBox exécuté par un Blueprint laisse
`SEditableTextBox::Style` sur une temporaire détruite (§ 3.4, étapes 1 à 4). La pile du plantage est exactement le
chemin qui relit ce pointeur (étape 5). Ce chemin ne dépend d'aucune valeur du style, couleur comprise (étapes 6-7).
- **Estimé** : la police lue est de la mémoire réutilisée. Le plantage n'arrive pas forcément à chaque refus : il dépend
de ce qui réécrit la pile virtuelle de la VM entre le nœud Set et le Prepass.
- **Incertain (reste à faire)** : aucune reproduction sans STE-TXT (§ 5, T1 et T2).
Cause : un défaut du moteur 5.8. Le setter natif `SetWidgetStyle` conserve l'adresse de son paramètre, et la VM
l'appelle avec une temporaire. Le graphe d'origine de CharGen le déclenche (`K2Node_VariableSet_1147`, puis `_1146`
après le Delay). StatMenu porte le même graphe (§ 3.3) : même risque (estimé).
Correction du livrable amont : `STD-TXT-DIAG.md:70-71` et `:174-178` affirment que le nœud Set « écrit le champ
directement et n'appelle pas ce setter », et que le constat est « sans effet ici ». C'est vrai pour la compilation,
mais faux à l'exécution en 5.8 : la VM appelle le setter (`ScriptCore.cpp:2906-2925`).
**Correctif proposé.** Non appliqué ; la décision revient à l'utilisateur ; le moteur n'est pas modifié.
- **P1 (recommandé).** Ajouter au module de jeu une fonction C++ `BlueprintCallable` (nom et bibliothèque à fixer en
SPEC) :
```cpp
static void SetEditableTextBoxStyle(UEditableTextBox* Box, const FEditableTextBoxStyle& InStyle)
{ if (IsValid(Box)) { Box->WidgetStyle = InStyle; Box->SynchronizeProperties(); } }
```
- Écrire directement le membre évite `SetWidgetStyle`. `SynchronizeProperties` est publique (`Widget.h:938`,
`EditableTextBox.h:270`) et redonne à Slate l'adresse du membre (`EditableTextBox.cpp:133`).
- `WidgetStyle` est public et non déprécié en 5.8 (`EditableTextBox.h:50-52`). En 5.5, à vérifier en BUILD
(`:47-49`, section `public` estimée).
- Ensuite, dans CharGen **et** StatMenu, remplacer chaque nœud `Set WidgetStyle` (`K2Node_VariableSet_1146`, `_1147`)
par un appel à cette fonction, avec les mêmes entrées : cible `FilenameEntry`, style issu de `K2Node_MakeStruct_62`
ou `_64`. Cela modifie le graphe : il faut une nouvelle fiche (`STE-TXT.md` § 6).
- À vérifier en VAL : `SynchronizeProperties` réapplique le texte par sa liaison (`EditableTextBox.cpp:130-134`) ; le
texte saisi doit être conservé.
- **P2 (Blueprint seul).** Supprimer le flash, ou le porter par un autre widget (Border parent et `SetBrushColor`). Le
rendu ou l'arbre de widgets change : moins fidèle.
- **P3.** Signaler le défaut à Epic : `SetWidgetStyle` devrait passer `&WidgetStyle` et non `&InStyle`. Sans effet tant
que le moteur installé n'est pas corrigé.
- Registre : réserver une ligne ERR. Signature : AV `FCachedTypefaceData` sous `SEditableText::SynchronizeTextStyle`,
après un nœud `Set WidgetStyle` d'EditableTextBox exécuté en Blueprint sous UE 5.8.
## 5. Hypothèse suivante proposée, et à quel niveau
H2 (N2-N3, éditeur, avec l'utilisateur) : « le plantage se reproduit sans STE-TXT et disparaît avec P1 ».
- **T1**, sans toucher CharGen : en PIE, ouvrir StatMenu (accès en jeu à confirmer), vider le nom, cliquer sur Save
Preset, répéter plusieurs fois. StatMenu n'est pas modifié par STE-TXT (`git status` du jeu : seul CharGen est
modifié dans `Content`). Attendu : plantage avec la même pile.
- **T2**, copie 5.5 (branche `main`) : même geste dans CharGen en PIE 5.5. Attendu : pas de plantage, faute de setter
natif.
- **T3**, après P1 (instantané d'abord) : 10 refus de suite dans CharGen et dans StatMenu. Attendu : aucun plantage,
flash rouge visible, texte noir avant et après.
- Option N4, sans éditeur interactif : ouvrir `UEMinidump.dmp` au débogueur avec les symboles 5.8.3, et vérifier que
`SEditableTextBox::Style` pointe hors de l'objet `UEditableTextBox`.
Tours : 33 / 60
## Constats
- STE-J2 : le point 6 (`STE-J2.md:13`, provoquer un refus) passe par le même nœud Set et risque de refaire planter
l'éditeur tant que P1 n'est pas en place. Les points 4, 5 et 7 (valeurs de STE-TXT) restent vérifiables.
- Le livrable `STE-TXT-IMPL.md` n'existe pas encore. Sources lues à la place : `fiches\STE-TXT.md`, `STE-TACHES.md:18`,
`STE-J2.md`.
- Commandes Python : cinq passes `python -I -` en lecture seule, lancées avec `cd /d/`, sans fichier écrit.
- Une passe `difflib` sur tout l'ubergraph (tâche de fond `bnwu14rk3`) a été dépassée par une version plus légère, qui a
fourni les chiffres ci-dessus. Elle n'écrit que dans son propre fichier de sortie, dans le dossier temporaire de la
session. Elle peut encore tourner : elle est sans effet sur le projet.
- Fichiers écrits : `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\ST\STE\STE-TXT-DIAG.md`.
- Fichiers à commiter (dépôt du jeu, branche `ue5.8`, par le gardien) : `A Docs/Migration/etat/ST/STE/STE-TXT-DIAG.md`.