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

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

23 KiB

Fiche LISIB-VAL1 — Niveau N1 — Modèle prévu (hérité) | utilisé claude-sonnet-5-5 — Agent lp-validator — Skills sk-protocol, lp-validate, sk-recount (+ debug-verification)

LISIB-VAL1 : validation statique de ULPReadableTextSubsystem (2026-10-10)

Portée : lecture seule, hors éditeur, commandlet, build et écriture git. Copie D:\Game\LifePlay-master 5.8, branche ue5.8 (git branch --show-current), LISIB-avant^{commit} = 71511a24ba4db539b0fad04c55b3564b89415a7e. Moteur lu : D:\Game\Launcher\Engine\UE_5.8\Engine\Source (préfixe Runtime\).

Verdict : PASS-STATIC, sans défaut bloquant, avec 1 écart mineur à la SPEC à corriger avant BUILD-GO (D1) et 4 points à regarder au PIE (D2, D3, D5). Rien n'est compilé : la compilabilité est estimée par lecture des signatures (§ 3 c).

1. Fiches amont relues

  • LISIB-SPEC.md (§ 3, § 4, § 8 : Q1 a, Q2 a, Q3 a, Q4 a, Q5 a) : lue en entier.
  • LISIB-IMPL.md (45 + 220 lignes annoncées, MD5, points de surveillance § 3) : lue en entier.
  • LISIB-TACHES.md (statuts, périmètre « 2 fichiers neufs, aucun autre ») ; LISIB-T1-CART.md et LISIB-T1-inventaire.md consultés pour les widgets A47-A51 (ColorSlot, CityMenu) ; STE-TXT-DIAG.md:44 pour la couleur fixée de FilenameEntry.
  • Gabarit VAL : D:\Game\LifePlay-Sandbox\Tools\claude\skills\lp-doc\gabarits.md (lu avant écriture).
  • Il n'y a ni livrable BUILD ni journal de build : la fiche n'en demande pas (VAL avant BUILD-GO).
  • Écart de forme (mineur, D4) : LISIB-IMPL.md ne suit pas le gabarit IMPL (pas de sections « Écarts à la SPEC », « Ce qui n'a pas été fait », « Points à confirmer en VAL » ; il a « Points à surveiller » § 3 à la place).

2. Points à confirmer des IMPL

LISIB-IMPL.md n'a pas de section « points à confirmer en VAL » ; sont repris ses « Points à surveiller » (§ 3) et ses affirmations vérifiables (§ 1, § 2).

# Point (source IMPL) Résultat Preuve
P1 2 fichiers neufs, 45 et 220 lignes, LF, ASCII, MD5 c916efb8… / b1251955… (§ 1) PASS § 3 e : 45 LF et 220 LF, 0 CR, 0 octet non ASCII, MD5 identiques
P2 Aucun autre fichier de Source\ modifié ; LifePlay.Build.cs non modifié ; aucun .uasset (§ 1) PASS pour Source ; écart extérieur au lot pour .uasset git status --short -- Source : seuls les 2 ?? ; git diff LISIB-avant --stat -- Source vide ; Content/BPs/GI.uasset est M (voir D5, pas du lot LISIB)
P3 Build.cs dépend déjà de Slate, SlateCore, UMG (l. 38) (§ 1) PASS LifePlay.Build.cs:38 : PrivateDependencyModuleNames.AddRange(new string[] { "Slate", "SlateCore", "UMG" });
P4 Aucun appel direct à UEditableTextBox::SetWidgetStyle (§ 2) PASS Grep SetWidgetStyle dans le .cpp : l. 45 (commentaire) et l. 47 (Spin->SetWidgetStyle, SpinBox) ; dans le .h : l. 13 (commentaire). La Text Box passe par ULPWidgetStyleLibrary::SetEditableTextBoxStyle (.cpp:82)
P5 USpinBox::SetWidgetStyle recopie dans le membre, Slate pointe sur le membre (SpinBox.cpp:111, :149-154) (§ 2) PASS SpinBox.cpp:149-156 : WidgetStyle = InWidgetStyle; … InvalidateStyle() ; :111 : MySpinBox->SetWidgetStyle(&WidgetStyle) (adresse du membre) et :67 .Style(&WidgetStyle)
P6 « Le style de base FCoreStyle "SpinBox" est celui de Settings » (§ 3) PASS (même appel) LPSettingsSubsystem.cpp:336 et LPReadableTextSubsystem.cpp:33 : FCoreStyle::Get().GetWidgetStyle<FSpinBoxStyle>("SpinBox")
P7 « Le style ne fixe pas HoveredFillBrush : au survol, le moteur prend le remplissage actif (SSpinBox.cpp:166) » (§ 2) PASS sur le code, FAIL sur l'hypothèse Le code ne fixe pas HoveredFillBrush, mais le style de base le fixe en 5.8 (D1)
P8 Une SpinBox neuve garde l'ancien style au plus 0,25 s (§ 3) reporté (J1) Cohérent avec .cpp:19 (PassInterval = 0.25f) et :133-142 ; à voir en PIE
P9 12 → 16 peut élargir Builder (Loc, Rot, Scl, Spin*) et CharGen (X, Y, Z) (§ 3) reporté (J1) Une seule constante : .cpp:21
P10 « La compilation n'est pas faite » (§ 3) BLOCKED-BUILD (compilation) Attend BUILD-GO ; compilabilité estimée en § 3 c

3. Critères rejoués (commande → résultat)

Niveaux : établi (lu à la source), estimé (déduit), incertain (non vérifié).

a. Conformité à la SPEC § 4 (LPReadableTextSubsystem.cpp, comparé à LPSettingsSubsystem.cpp:312-440)

Élément SPEC Code Référence Settings Verdict
Fond (0,06 ; 0,06 ; 0,06 ; 0,95) :34 :337, :340 identique, PASS
Fond survol 0,12 / 0,98 :35 :338, :341 identique, PASS
Fond actif 0,16 / 1 :36 :339, :342 identique, PASS
Remplissage actif bleu (0,2 ; 0,45 ; 0,9 ; 0,85) :37 :343 identique, PASS
Remplissage au repos (0,1 ; 0,22 ; 0,45 ; 0,9), « au repos et au survol » :38 (InactiveFillBrush seulement) absent de Settings repos PASS ; survol écart D1
Texte blanc :39 (ForegroundColor) et :48 (SetForegroundColor) :344, :391 identique, PASS
Contour noir 2 px (0,95) :50-52 :393-395 identique, PASS
Taille minimale 16 (SpinBox) :21, :53-56 (garde les tailles plus grandes) Settings 18 (:396) PASS (Q4 a)
Opacité de rendu 1 :58-61 (seulement si < 1) :389 PASS
Pas de SetIsEnabled Grep SetIsEnabled : 0 occurrence dans .cpp et .h Settings :388 en pose un PASS
Text Box : noir opaque seulement si couleur non fixée :70-74 (!IsColorSpecified()) STE-TXT PASS
Text Box : taille minimale 14 :22, :75-79 — PASS
HintText, fond inchangés seuls TextStyle.ColorAndOpacity et TextStyle.Font.Size sont touchés (:70-79) — PASS
Exclusion SettingsScrollBox :89-109 (nom :94), appelée en :177 et :203 nom identique à LPSettingsSubsystem.cpp:506 PASS
CharGen.FilenameEntry non touchée (couleur fixée), A40 au style commun couleur déjà fixée dans l'asset (STE-TXT-DIAG.md:44) → IsColorSpecified() vrai (SlateColor.h:150-153, règle UseColor_Specified) ; A40 est une SpinBox → MakeSpinReadable SPEC § 4 fin PASS (estimé : l'état de l'asset est lu dans la doc STE, pas dans l'asset)

Établi : le style d'une Text Box non fixée est bien « non spécifié » : UMGCoreStyle.cpp:238-242 (NormalText … SetColorAndOpacity(FSlateColor::UseForeground())), repris par NormalEditableTextBox (:554-555) et par USpinBox/UEditableTextBox via DefaultStyleCache.cpp:40. Le test IsColorSpecified() est donc faux pour les 16 champs, et le noir est posé.

b. ERR-088

  • Grep (voir P4) : aucun appel ->SetWidgetStyle sur un UEditableTextBox dans le nouveau code ; seul .cpp:82 appelle ULPWidgetStyleLibrary::SetEditableTextBoxStyle(Box, Style). PASS (établi).
  • LPWidgetStyleLibrary.cpp:9-30 : copie dans le membre puis SetWidgetStyle(GetWidgetStyle()) (5.8) ; garde IsValid(TextBox) en tête. Le style passé par référence (Style, local de MakeTextBoxReadable) n'est pas conservé par Slate. PASS (établi).
  • SpinBox.cpp:149-156 et :111 (P5) : USpinBox::SetWidgetStyle ne transmet pas l'adresse du paramètre à Slate. PASS (établi).

c. Compilabilité estimée (jamais compilé : estimé, pas établi)

API / contrainte Preuve moteur ou projet Verdict
USpinBox::GetFont() const → const FSlateFontInfo&, SetFont(const FSlateFontInfo&) SpinBox.h:192, :195 ; SpinBox.cpp:249-261 OK
USpinBox::SetForegroundColor(FSlateColor) SpinBox.h:271 ; SpinBox.cpp:446 OK
USpinBox::SetWidgetStyle(const FSpinBoxStyle&) SpinBox.h:145 OK
UWidget::GetRenderOpacity() const, SetRenderOpacity(float) Widget.h:598, :602 OK
UEditableTextBox::GetWidgetStyle() const → const FEditableTextBoxStyle& EditableTextBox.h:263 OK
FEditableTextBoxStyle::TextStyle (FTextBlockStyle), TextStyle.Font (FSlateFontInfo), .ColorAndOpacity (FSlateColor) SlateTypes.h:1072 ; :854, :342 ; :371 ; l'ancien Font est Font_DEPRECATED (:1063), non utilisé OK
FSlateColor::IsColorSpecified() const SlateColor.h:150 OK
FSpinBoxStyle membres BackgroundBrush, HoveredBackgroundBrush, ActiveBackgroundBrush, ActiveFillBrush, InactiveFillBrush, ForegroundColor SlateTypes.h:1505, :1514, :1509, :1519, :1529, :1539 (publics, FSlateBrush et FSlateColor) OK
FSlateFontInfo::Size (float), OutlineSettings.OutlineSize (int32), bApplyOutlineToDropShadows, OutlineColor SlateFontInfo.h:175 ; :42, :59, :67 OK (pas de conversion rétrécissante)
FTSTicker::GetCoreTicker().AddTicker(const FTickerDelegate&, float), RemoveTicker(FDelegateHandle), FTSTicker::FDelegateHandle Ticker.h:32, :45, :66 ; même motif dans 14 sous-systèmes du projet (ex. LPPersonPropGuardSubsystem.cpp:66-72) OK
TObjectIterator<T> (sans paramètre) UObjectIterator.h:262 (exclut RF_ClassDefaultObject) ; motif présent dans LPSettingsSubsystem.cpp:503 OK
UWidget::GetParent() const → UPanelWidget* Widget.h:769 ; PanelWidget.h inclus (.cpp:7) OK
UObject::GetTypedOuter<T>() const UObjectBaseUtility.h:551 ; assignation UUserWidget* → const UWidget* OK car UserWidget.h inclus (.cpp:5) OK
UWidget::GetGameInstance() const → UGameInstance* (appelé via UUserWidget) ; UGameInstanceSubsystem::GetGameInstance() const Widget.h:871 (non-modèle choisi avant le modèle :877) ; GameInstanceSubsystem.h:25 ; Engine/GameInstance.h inclus (.cpp:9) OK
TSet<TWeakObjectPtr<UWidget>> : Contains/Add depuis USpinBox* / UEditableTextBox* constructeur implicite TWeakObjectPtr(U Object) si U convertible en T* (WeakObjectPtrTemplates.h:62) ; Contains(KeyInitType) et Add(const ElementType&) (CompactSet.h.inl:699, :1148) ; TSet<TWeakObjectPtr<AActor>> déjà utilisé (LPPersonPropGuardSubsystem.h:36) OK
It.RemoveCurrent() sur TSet::CreateIterator() CompactSet.h.inl:286, :313, :1344 OK
TOptional<FSpinBoxStyle> (IsSet, GetValue, affectation) CoreMinimal.h:110 inclut Misc/Optional.h OK
UWidget déclaré en avant dans le .h pour TWeakObjectPtr<UWidget> le constructeur à contrôle statique est dans le corps du modèle, pour permettre la déclaration en avant (WeakObjectPtrTemplates.h:62-66) ; destructeur par défaut OK (estimé)
Accès à un membre déprécié (C4996, UE_DEPRECATED) aucun accès direct aux membres WidgetStyle, Font, ForegroundColor, Value des widgets (tous marqués UE_DEPRECATED(5.1/5.2)) : le code n'appelle que des accesseurs (SpinBox.h:40, :75, :108 ; EditableTextBox.h:50-52) OK
LogLifePlay déclaré LifePlay.h:9 (LIFEPLAY_API DECLARE_LOG_CATEGORY_EXTERN(LogLifePlay, Log, All)), inclus .cpp:11 OK
LIFEPLAY_API sur la classe .h:25 OK
.generated.h dernier include .h:20 (dernière directive #include) ; class UWidget; après OK
Modules Slate/SlateCore/UMG : P3 ; Engine, CoreUObject publics (LifePlay.Build.cs:14) OK
Noms en double (unity build) namespace LPReadableText n'existe nulle part ailleurs (Grep Source, 1 seule définition) ; TintBrush local au namespace masque celui de Settings OK
Ternaire FString / TEXT("?") (.cpp:114) conversion implicite de const TCHAR* vers FString OK (estimé)

Aucune erreur de compilation prévisible. Incertain : un avertissement MSVC de portée (variable masquée, etc.) ne se voit qu'au build.

d. Comportement

Point Preuve Verdict
Aucun chemin d'asset en dur Grep /Game/|LoadObject|StaticLoad|ConstructorHelpers dans .cpp et .h : 0 PASS (établi)
Objets par défaut et archétypes exclus TObjectIterator exclut RF_ClassDefaultObject ; IsGameWidget exclut RF_ClassDefaultObject | RF_ArchetypeObject pour le widget et son UUserWidget (.cpp:146, :151) PASS (établi)
Widgets du designer (sans GameInstance) exclus .cpp:150-151 : Owner requis et Owner->GetGameInstance() == GetGameInstance() ; UWidget::GetGameInstance passe par GetWorld()->GetGameInstance() (Widget.cpp:1167-1175), nul sans monde de jeu PASS (estimé : monde de prévisualisation du designer supposé sans GameInstance)
Un widget non encore attaché à un monde est réessayé Done.Add n'a lieu qu'après IsGameWidget vrai (.cpp:172-176, :198-202) PASS (établi)
Purge des pointeurs faibles .cpp:157-163 (au début de chaque passe) ; Deinitialize vide Done (:129) PASS (établi). Logged n'est jamais vidé (borné par le nombre de noms distincts : négligeable, D6)
Pas de boucle infinie dans IsUnderSettings borne Depth < 64 (.cpp:92) ; GetTypedOuter part de l'Outer (pas du widget lui-même) et rend nullptr à la racine → la boucle s'arrête (Current nul) PASS (établi pour la borne)
Remontée à travers les widgets utilisateur imbriqués .cpp:98-106 : GetParent(), sinon GetTypedOuter<UUserWidget>() PASS (estimé)
Pas de pose répétée Done : un widget traité (ou sous Settings) n'est plus repris (.cpp:172-177, :198-203) PASS (établi)
Valeurs reprises de Settings identiques tableau a. PASS (établi)
Coût par passe voir D2 PASS avec réserve (estimé)
Tick retourne true (le ticker continue) ; CreateUObject lie un pointeur faible .cpp:141, :123 PASS (établi)

e. Fins de ligne, encodage, MD5

Commandes : pwsh -Command "& .\Tools\FileCheck.ps1 -Path 'Source\LifePlay\LPReadableTextSubsystem.h','Source\LifePlay\LPReadableTextSubsystem.cpp'" (code 0, fichiers=2 LF=2 alertes=0), puis tr -cd '\r', tr -cd '\n', LC_ALL=C tr -d '\000-\177' | wc -c, md5sum.

Fichier Fins LF CR Non ASCII BOM MD5 relevé MD5 IMPL Verdict
LPReadableTextSubsystem.h LF 45 0 0 non c916efb806176452a1657666bc1e28f7 c916efb8…28f7 PASS
LPReadableTextSubsystem.cpp LF 220 0 0 non b1251955ba068cd9e6cd2118701916a5 b1251955…16a5 PASS
Les deux fichiers finissent par un saut de ligne (dernier octet 0a). FileCheck -Lot LISIB non rejoué : les 2 fichiers sont Existed=False au manifeste (D:\Game\LifePlay_Backup_5.5\LISIB\manifest.csv, 7 entrées relevées).

f. Inventaire visé recompté

Commandes : python -I Saved\LISIB\lisib_ana.py Saved\LISIB\inv.json <scratchpad>\val1_ana.md (sortie JSON de 548 lignes de relevé), puis un second décompte Python indépendant du résumé imprimé (filtre settings == False par classe).

Élément Annoncé Recompté Verdict
Relevé total — 548 widgets —
SpinBox hors Settings 56 56 (15 autres sous Settings) confirmé
EditableTextBox hors Settings 17 (dont 1 déjà corrigée par STE-TXT) 17, tous « défaut (UseForeground) » dans le relevé confirmé
EditableTextBox visées par le code 16 16 = 17 moins CharGen.FilenameEntry (couleur fixée depuis dans l'asset, STE-TXT-DIAG.md:44) confirmé
Le résumé imprimé par lisib_ana.py indique EditableTextBox: 4 : ce sont seulement les widgets « signalés » (taille ≤ 12, gris, transparence), pas l'inventaire visé ; ne pas confondre. Le relevé source est U5_assets_apres.txt, antérieur à STE-TXT (lisib_inv.py:1), d'où CharGen.FilenameEntry encore « défaut » dans inv.json.
Au PIE, le journal doit compter au plus 56 SpinBox lisible et 16 Text Box lisible (moins les écrans non ouverts, et un seul compte par paire menu.widget).

4. Diff lu en entier

  • git status --short : fichiers de lot attendus ?? Source/LifePlay/LPReadableTextSubsystem.cpp et .h ; ?? Docs/Migration/etat/ST/LISIB/ (5 fichiers : TACHES, T1-CART, T1-inventaire, SPEC, IMPL) ; ?? …/REPO/tickets/LISIB-R1.md, M …/REPO/REPO-JOURNAL.md.
  • git diff LISIB-avant --stat -- Source : vide (aucun fichier suivi de Source\ modifié) ; les 2 fichiers de code sont neufs, donc non couverts par git diff : lus en entier (.h 45 lignes, .cpp 220 lignes) et comparés ligne à ligne à LPSettingsSubsystem.cpp:312-440 (HardenSettingsControls) et à LPWidgetStyleLibrary.h/.cpp (complets, 35 et 31 lignes).
  • Fichiers non annoncés par la fiche, vus à l'état git (voir D5) : M Content/BPs/GI.uasset (modifié à 17:26:38, après l'IMPL de 17:21), M Docs/08, 09, 21, 29, 30, 32, M …/BOSS-JOURNAL.md, M …/STE-H3b-SPEC.md, M …/STE-INT.md, ?? …/DOC/DOCSTAT/*, ?? …/REPO/tickets/STE-R4.md. Ils ne viennent pas du lot LISIB.
  • Aucun fichier modifié par script dans le lot (les deux sources sont à fins LF et au style des fichiers voisins) ; non vérifiable autrement.
  • Aucun ajout non demandé dans le code : pas de SetIsEnabled, pas de SetRenderTransform, pas de modification de Slider ni de CheckBox (contrairement à HardenSettingsControls).

5. Verdict

PASS-STATIC. Contrôles a, b, c, d, e, f : conformes, sauf l'écart D1 (survol du remplissage). Aucun défaut bloquant. Compilation, LPTestStringCompat et PIE non rejoués (hors portée de la fiche).

6. Points à confirmer par l'utilisateur (cases)

  • D1 : faut-il aligner le survol du remplissage sur le bleu sombre de la SPEC § 4 (ligne « au repos et au survol »), en ajoutant une ligne avant le BUILD-GO ? Recommandé (voir Constats).
  • D3 : au PIE (étape Builder et ColorSlot), les 4 curseurs de ColorSlot (R, V, B, A) et CityMenu.UnknownSpin ont un style d'asset (fond transparent ou blanc à 70 %) : accepter qu'ils prennent le fond sombre ? Sinon, les exclure par leur nom.
  • D2 : la passe parcourt tous les objets deux fois toutes les 0,25 s ; accepter ce coût (précédent : LPSettingsSubsystem), ou le mesurer au PIE (J1).
  • J1 : lisibilité écran par écran et mise en page 12 → 16 (P8, P9) : LISIB-J1.

Constats

Défauts (classés)

Bloquants : aucun.

Mineurs

  • D1 — Remplissage au survol non teinté (écart à la SPEC § 4, hypothèse IMPL erronée).
    • Établi : FCoreStyle::Get() rend FAppStyle::Get() (CoreStyle.h:35-36) ; FSlateApplication::InitializeCoreStyle pose le style Starship comme style d'application (SlateApplication.cpp:7687-7688) ; le « SpinBox » de ce style fixe HoveredFillBrush (StarshipCoreStyle.cpp:620, couleur du thème « Hover ») ; SSpinBox ne retombe sur le remplissage actif que si HoveredFillBrush n'est pas fixé (SSpinBox.cpp:166) ; le survol utilise HoveredFillBrush (:240-241).
    • Conséquence : au survol, le remplissage devient gris « Hover », pas le bleu voulu. Le texte reste blanc avec contour noir, donc lisible : l'écart est esthétique, mais il contredit la SPEC et le commentaire IMPL § 2. Le style du moteur non retenu serait FCoreStyle::GetCoreStyle() (legacy, sans HoveredFillBrush), mais Settings utilise Get() ; ne pas changer.
    • Incertain : le rendu exact du gris « Hover » (thème) ; le PIE le montrera.
    • Correctif proposé (pour l'orchestrateur, non appliqué) : dans MakeSpinStyle(), après la ligne 38 : TintBrush(SpinStyle.HoveredFillBrush, FLinearColor(0.1f, 0.22f, 0.45f, 0.9f));. Sans risque : si le pinceau n'est pas fixé (NoDrawType), la teinte ne le fait pas apparaître ; mettre aussi à jour le commentaire .cpp:29-30 et IMPL § 2. Le MD5 de .cpp changera : à consigner dans l'IMPL.
  • D2 — Coût de la passe plus grand que la SPEC § 6 ne l'annonce (estimé). TObjectIterator<USpinBox> et <UEditableTextBox> parcourent tout le tableau global des UObject (pas seulement « moins de 200 widgets »), soit 2 parcours complets toutes les 0,25 s, y compris dans le menu principal. Précédent accepté : LPSettingsSubsystem itère UScrollBox à chaque image (ticker 0.f, LPSettingsSubsystem.cpp:489, :503). Non mesuré. Pistes si le PIE montre des à-coups : un seul parcours TObjectIterator<UWidget> avec deux Cast, ou un intervalle de 0,5 s (constante .cpp:19). À mesurer en J1 (journal de passe ou stat game).
  • D3 — Style d'asset écrasé sur 5 SpinBox (à voir au PIE). inv.json : 5 SpinBox hors Settings ont une propriété WidgetStyle dans l'asset : ColorSlot Alpha, Blue, Green, Red (BackgroundBrush blanc alpha 0, posées sur des Border colorés à 30 %, LISIB-T1-inventaire.md:54-57) et CityMenu.UnknownSpin (pinceaux blancs à 70 %). USpinBox::SetWidgetStyle remplace tout le style : leur fond transparent passe à 0,95 sombre (conforme à la SPEC Q3 a, qui couvre ColorSlot, mais la fiche ne dit pas que ce fond était voulu transparent). Vérifier au PIE (Builder et ColorSlot). Correctif éventuel : exclure ces 5 noms dans IsGameWidget.
  • D4 — IMPL hors gabarit (forme). LISIB-IMPL.md n'a pas les sections « Écarts à la SPEC », « Ce qui n'a pas été fait » ni « Points à confirmer en VAL » (gabarit IMPL, gabarits.md). Sans effet sur le code.
  • D5 — Fichiers étrangers au lot dans l'arbre de travail. M Content/BPs/GI.uasset (52 Mo, modifié à 17:26:38) apparaît après le relevé initial de la session et après l'IMPL (17:21) ; la fiche (TACHES) place GI sous STE via Big Boss. Ne pas l'inclure dans le commit LISIB-R2 ni le prendre pour une écriture de ce lot (« aucun .uasset » du lot reste vrai). Idem les M Docs/… et ?? DOCSTAT.
  • D6 — Remarques sans correctif demandé.
    • Logged n'est vidé ni en cours de partie ni en Deinitialize (borné par les noms distincts, sans effet).
    • Une ligne de réglage créée en deux temps (créée, puis ajoutée à SettingsScrollBox à une image d'écart) pourrait être vue par la passe avant son rattachement et recevoir le style LISIB (Settings le réécrit ensuite : même fond, remplissage repos différent, opacité 1). Estimé improbable (création et ajout dans le même graphe, donc la même image) ; sans effet visible.
    • Le compteur « Text Box lisible » ne compte que les champs réellement modifiés (:203, :84) : une Text Box déjà noire et en 14 ou plus n'est pas journalisée (cas attendu de CharGen.FilenameEntry).

Non rejoué

  • Compilation (Tools\Build.ps1), Build.ps1 -FromLog, LPTestStringCompat (3120 cas), ouverture de l'éditeur (G-U3), PIE : hors périmètre de cette fiche, en attente de BUILD-GO.
  • Effet visuel (D1, D3) et coût réel (D2) : seuls le PIE (J1) et le journal de jeu les tranchent.

Fichiers à commiter

Aucun par cette VAL, à part ce livrable : A Docs/Migration/etat/ST/LISIB/LISIB-VAL1.md (à joindre au ticket LISIB-R2 avec le reste du lot LISIB). Aucun fichier de code ou de doc existant n'a été modifié par ce validateur ; seul un fichier temporaire a été écrit hors dépôt (…\scratchpad\val1_ana.md, sortie JSON de lisib_ana.py).

Tours : ≈ 35 / 30 (budget de la fiche dépassé de ≈ 5 tours ; mesure faisant foi : python -I Tools/FicheStats.py --lot LISIB)