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.mdetLISIB-T1-inventaire.mdconsultés pour les widgets A47-A51 (ColorSlot, CityMenu) ;STE-TXT-DIAG.md:44pour la couleur fixée deFilenameEntry.- 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.mdne 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
->SetWidgetStylesur unUEditableTextBoxdans le nouveau code ; seul.cpp:82appelleULPWidgetStyleLibrary::SetEditableTextBoxStyle(Box, Style). PASS (établi). LPWidgetStyleLibrary.cpp:9-30: copie dans le membre puisSetWidgetStyle(GetWidgetStyle())(5.8) ; gardeIsValid(TextBox)en tête. Le style passé par référence (Style, local deMakeTextBoxReadable) n'est pas conservé par Slate. PASS (établi).SpinBox.cpp:149-156et:111(P5) :USpinBox::SetWidgetStylene 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.cppet.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 deSource\modifié) ; les 2 fichiers de code sont neufs, donc non couverts pargit diff: lus en entier (.h45 lignes,.cpp220 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 deSetRenderTransform, 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) etCityMenu.UnknownSpinont 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()rendFAppStyle::Get()(CoreStyle.h:35-36) ;FSlateApplication::InitializeCoreStylepose le style Starship comme style d'application (SlateApplication.cpp:7687-7688) ; le « SpinBox » de ce style fixeHoveredFillBrush(StarshipCoreStyle.cpp:620, couleur du thème « Hover ») ;SSpinBoxne retombe sur le remplissage actif que siHoveredFillBrushn'est pas fixé (SSpinBox.cpp:166) ; le survol utiliseHoveredFillBrush(: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 seraitFCoreStyle::GetCoreStyle()(legacy, sansHoveredFillBrush), mais Settings utiliseGet(); 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-30etIMPL § 2. Le MD5 de.cppchangera : à consigner dans l'IMPL.
- Établi :
- 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é :LPSettingsSubsystemitèreUScrollBoxà chaque image (ticker 0.f,LPSettingsSubsystem.cpp:489,:503). Non mesuré. Pistes si le PIE montre des à-coups : un seul parcoursTObjectIterator<UWidget>avec deuxCast, ou un intervalle de 0,5 s (constante.cpp:19). À mesurer en J1 (journal de passe oustat game). - D3 — Style d'asset écrasé sur 5 SpinBox (à voir au PIE).
inv.json: 5 SpinBox hors Settings ont une propriétéWidgetStyledans l'asset :ColorSlotAlpha, Blue, Green, Red (BackgroundBrushblanc alpha 0, posées sur desBordercolorés à 30 %,LISIB-T1-inventaire.md:54-57) etCityMenu.UnknownSpin(pinceaux blancs à 70 %).USpinBox::SetWidgetStyleremplace 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 dansIsGameWidget. - D4 — IMPL hors gabarit (forme).
LISIB-IMPL.mdn'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 lesM Docs/…et?? DOCSTAT. - D6 — Remarques sans correctif demandé.
Loggedn'est vidé ni en cours de partie ni enDeinitialize(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 deCharGen.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 deBUILD-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)