LifePlay-Revival/Docs/Migration/etat/ST/STD/STD-SCN-DIAG.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

20 KiB
Raw Blame History

Fiche STD-SCN — Niveau N3 — Modèle prévu (modèle de l'agent lp-cart) | utilisé claude-opus-5-5 — Agent lp-cart — Skills lp-doc (gabarits), sk-protocol

STD-SCN-DIAG : familles du moteur de scènes, origine STB ou préexistante (2026-10-10)

Lecture seule stricte : aucun lancement (jeu, éditeur, commandlet, build), aucune écriture hors de ce fichier. Copie D:\Game\LifePlay-master 5.8 lue à HEAD 20620f6 (gelée par STC).

Abréviations des journaux (chemins absolus) :

  • L2 = STB-JEU2 D:\Game\LifePlay_Build_5.8_STB-JEU2_Development\Windows\LifePlay\Saved\Logs\LifePlay.log
  • L1 = STB-JEU D:\Game\LifePlay_Build_5.8_STB-JEU_Development\Windows\LifePlay\Saved\Logs\LifePlay-backup-2026.10.09-20.30.49.log
  • LU8 = base U8 D:\Game\LifePlay_Build_5.8_Development_U8_essai\Windows\LifePlay\Saved\Logs\LifePlay-backup-2026.10.09-16.46.02.log
  • DC4 = 5.5 avant migration D:\Game\LifePlay-master 5.5\Docs\Migration\etat\U58\U6\LifePlay_55_DC4_avantU6.log
  • U6-55 / U6-58 = ...\etat\U58\U6\LifePlay_55_session2.log / LifePlay_58_session2.log
  • P10-55 / P10-58 = ...\etat\U58\U7\P10\5.5\LifePlay.log / ...\U7\P10\5.8\LifePlay.log (5.8 avant STB, 2026-10-09 06:4x)
  • JM = D:\Game\LifePlay-master 5.8\Docs\Migration\Journal_Modifications.md
  • Dumps : STA-d = D:\Game\LifePlay-master 5.5\Docs\Migration\etat\ST\STA\dumps\, STB-d = ...\etat\ST\STB\dumps\

1. Symptôme et reproduction

Session STB-JEU2 (parcours : nouvelle partie avec éditeur de personnage, ville, actions seul et avec partenaire, scènes dont meet_couple, STB-JEU-VAL.md:14-15). Comptes bruts dans L2 (Grep, mode count, rejouables) :

Famille Motif Grep exact L2
F1 Accessed None … Person property Person in 270 (en tête de pile : GI_C:ReturnStatIfNeeded:64X 93, GI_C:getActorVar:64X 142, GI_C:setActorVar:64X 32 ; 3 non ventilées)
F2 index hors bornes « tableau sans nom » Person_24_4B712C904750AD4CE1580DBEBD9E7396' of length 0 351 (le tableau est le membre Person de la structure /Game/Structs/Variable, d'où le nom à GUID)
F3 CallFunc_Array_Get_Item_31/32/33/41 property CallFunc_Array_Get_Item_(31|32|33|41) 167 (171 avec _\d+ : 4 lignes _30 hors fiche, L2:12087, 12097, 22396, 22406) ; dont _33 : 33
F4 CallFunc_GetSkeletalMesh_ReturnValue property CallFunc_GetSkeletalMesh_ReturnValue 99 ; variante GI (multiligne, en-tête GI_C:ExecuteUbergraph_GI:) 96
F5 « No SkeletalMesh » No SkeletalMesh 15 793 (51 % des 30 995 lignes) ; Person_C_2147481850 10 751, Person_C_2147481946 1 040 ; socket CenterBrow 3 264
Dénominateurs CHECKING: / index SPAWN / DestroyDummy was from CheckScenes / \(test0104\) for [0-9.]+ hours by 0 / Actor cleared and destroyed 2 318 / 123 / 185 / 24 / 1 (L2:2226)

Lien avec les lignes de scène (établi, même horodatage et même image) :

  • F1 par le contrôle des scènes : L2:5226 CHECKING: …meet_random/meet_new_person.lpscene puis L2:5227-5238 (UpdateCheckForScenes → CheckConditionsOther → CheckEachCondition → CalculateString → Calculator → ReturnStatIfNeeded). La ligne OTHER de la scène lit la stat d'un acteur peut-être absent : D:\Game\LifePlay-master 5.8\Content\Modules\vin_Base\Scenes\meet_random\meet_new_person.lpscene:5 (isWithCompanion() && Random(0, 200) < CurrentCompanion:interpersonal). Même chose au démarrage d'une scène : L2:20166 CHECKING: …family/child_sexual.lpscene → L2:20167-20178 (PlayScene → CheckConditionsOther → … → ReturnStatIfNeeded).
  • F1/F2/F3 par la lecture du script d'une scène lancée : L2:20189-20200 (hors bornes Person_24 + getActorVar sous PlayScene → ReadSceneLine → CallFunction), L2:20327-20339 (CallFunc_Array_Get_Item_33 dans CallFunction), L2:20398-20411 (setActorVar). Chaque groupe 33, 32, 31, 31, 31, 31 est suivi de quelques dizaines de lignes par (test0104) for <n> hours by 0 (ex. L2:20331 → L2:20397 ; L2:20581 → 20647 ; L2:29929 → 29995) : 24 démarrages d'action « by 0 », presque tous dans la rafale 21:32:09 à 21:32:21.
  • F4 : L2:5173-5199 : CHECKING: …dating/sociable_dating.lpscene (WHO = getSpecific(Dating), ...\Scenes\dating\sociable_dating.lpscene:4) → Person_C_2147481850 index SPAWN → avertissement (pile UpdateCheckForScenes → CheckConditionsWho → ReadSceneLine → CallFunction → GetSpecific → LoadPreset → GenerateAndApplyStrings → PlayerChangeRace → UpdatePlayerMeshWithMorphs) → DESTROY… Slot: 1 → DestroyDummy was from CheckScenes, WHO unmatched. 96 SPAWN sur 123 sont suivis à la ligne suivante de F4 (multiligne index SPAWN \(test0304\)\r?\n[^\n]*property CallFunc_GetSkeletalMesh_ReturnValue in → 96).
  • F5 : L2:5193 test0304 DESTROY… index Person_C_2147481850 puis L2:5194-5198 et suivantes : GetSocketInfoByName (Head ×2, pelvis, chestUpper, hip, CenterBrow) à chaque image sur le même acteur recyclé. Écart à la fiche : « Actor cleared and destroyed » n'apparaît qu'une fois (L2:2226) ; le déclencheur réel est la libération test0304 DESTROY du mannequin (acteur gardé en réserve, réutilisé au SPAWN suivant : Person_C_2147481850 revient dans la plupart des 123 SPAWN).

Comptage par scène : sans objet au sens strict pour F3, F1 (getActorVar/setActorVar) : le fichier joué par PlayScene n'est pas écrit dans le journal (aucune ligne lpscene hors CHECKING: et timed out, Grep GI_C_\d+\] ([^C]|C[^H]).*(lpscene|lpaction|lpquest) → 17 lignes timed out seulement). Normalisation retenue : par démarrage d'action « by 0 » (F1, F3), par ligne CHECKING: (F1, F2, F5), par SPAWN de mannequin CheckScenes (F4).

2. Hypothèse testée (une seule)

H : les cinq familles sont préexistantes au lot STB — (a) leur fréquence normalisée dans L2 égale celle d'un journal antérieur à STB, et (b) aucune fonction ni aucun événement de leur pile n'est modifié par CHG-281 à CHG-294.

3. Essai et résultat brut

3.1 Fonctions modifiées par STB (critère b)

Lecture de JM:1135-1148 (CHG-294 à CHG-281). Graphe GI touché : événements LoadSettings, PopulateRaws (CHG-281, JM:1148), FocusOnMapMarkers et fonction clearVariable (CHG-282, JM:1147), nœuds de lecture Clothes4 / MorphTags (CHG-283, JM:1146), clearDaily, PlayIdle, PlayDaily, PerTick et fonctions determinePersonVars, clearScenePersons (CHG-290, JM:1139). Person : standIdle, rotation de tête (HeadtrackTarget → CenterBrow), OccupyingFnt (CHG-284, JM:1145), assignHome (CHG-285, JM:1144). Autres : MainMenu (CHG-286 retiré par CHG-294), StreetMap_Static, Room, SexInterface, garde C++ des marqueurs. Aucun des noms de pile n'y figure : UpdateCheckForScenes, PlayScene, CheckConditionsWho, CheckConditionsOther, CheckEachCondition, CalculateString, Calculator, ReturnStatIfNeeded, ReadSceneLine, CallFunction, getActorVar, setActorVar, GetSpecific, getPerson, LoadPreset, GenerateAndApplyStrings, PlayerChangeRace, UpdatePlayerMeshWithMorphs. Réserve : ExecuteUbergraph_GI (EventGraph) est modifié, mais dans d'autres événements ; pour F4, le câblage de UpdatePlayerMeshWithMorphs est identique avant et après STB (§ 3.5). Point de contact indirect pour F5 : CHG-284 (lecture CenterBrow dans l'EventGraph de Person), voir § 3.6.

3.2 Tableau des comptes bruts (Grep, mode count ; L1 et LU8 avec le motif neutre de format)

Motif F1 neutre (5.5 écrit …property Person sans « (real) … in ») : Accessed None trying to read (\(real\) )?property Person\b. F3 en 5.5 : property CallFunc_Array_Get_Item_(31|32|33|41)\b. F4 variante GI : multiligne property CallFunc_GetSkeletalMesh_ReturnValue( in not an UClass)?\r?\n\s+GI_C [^\n]*\n\s+Function /Game/BPs/GI\.GI_C:ExecuteUbergraph_GI:.

Journal (moteur, date) CHECKING by 0 SPAWN Dummy CheckScenes F1 F2 F3 F3 _33 F4 (GI) F5
DC4 (5.5, 2026-10-08) 5 410 56 76 0 664 1 379 395 77 0 10 974
U6-55 (5.5) 831 — 20 0 3 87 0 — 0 2 315
P10-55 (5.5) 213 — 6 0 1 23 0 — 0 1 254
U6-58 (5.8) 380 — 18 0 2 59 0 — 0 2 723
P10-58 (5.8, avant STB) 1 429 — 33 57 1 119 0 — 10 10 388
LU8 (5.8, avant STB) 374 0 15 — 2 39 0 — 0 871 (STA-T3-DOC.md:60 ; Grep combiné F4+F5+SPAWN = 886)
L1 (STB complet) 2 515 — — — 152 204 84 — 97 ≤ 18 226 (Grep combiné F5 + SPAWN + Dummy, non séparé)
L2 (STB, CHG-286 retiré) 2 318 24 123 185 270 351 167 33 96 15 793

« — » = non compté (budget). by 0 = \(test0104\) for [0-9.]+ hours by 0 ; U58 : DC4 seul (56). Dummy CheckScenes = DestroyDummy was from CheckScenes ; U58 : P10-58 seul (57).

3.3 F1 et F2 : ReturnStatIfNeeded, getActorVar, setActorVar (Person / tableau Person_24…)

  • Mécanisme, lu dans STA-d GI__ReturnStatIfNeeded.txt : chaîne X:stat coupée sur : (Split, :409-417) → GetVariable(Name = X) (:140-145) → Variable.Person[0] (K2Node_GetArrayItem_10794, :156-159) → Set Person (:39-43) → Person.QueryStat (:160-168), sans test. Variable jamais affectée → tableau vide → F2 puis F1 ; variable affectée à une référence nulle → F1 seul (cas L2:5227, sans ligne F2 avant). Chemin sans : → PlayerCharacter (:31-53), toujours valide.
  • Même signature et même pile en 5.5 avant migration : DC4:13020-13031 (Accessed None trying to read property Person, ReturnStatIfNeeded:036D, pile UpdateCheckForScenes → CheckConditionsOther → … → ReturnStatIfNeeded).
  • Fréquence normalisée : F1 par démarrage « by 0 » : L2 270 / 24 = 11,3 ; DC4 664 / 56 = 11,9. Par CHECKING: : L2 0,116 ; DC4 0,123. Les sessions U6/U7/U8 sans démarrage « by 0 » restent à 1-3.
  • F2 : présent dans tous les journaux 5.5 et 5.8 (DC4 1 379, U6-55 87, P10-58 119, LU8 39). Plus bas en L2 qu'en DC4 par démarrage (14,6 contre 24,6) : une partie de F2 en DC4 vient de clearVariable (DC4:8624-8637, pile GeneratePerson → clearVariable), lecture supprimée par CHG-282 (estimé : non décompté par fonction).

3.4 F3 : CallFunc_Array_Get_Item_31/32/33/41 dans CallFunction

  • Même nœuds, même pile en 5.5 : DC4:31616-31626 (CallFunc_Array_Get_Item_33, CallFunction:ADF7, pile PlayScene → ReadSceneLine → CallFunction, précédé du hors bornes Person_24) ; _32 en DC4:31689-31691.
  • Fréquence : _33 par démarrage « by 0 » : L2 33 / 24 = 1,38 ; DC4 77 / 56 = 1,375. Journaux 5.8 antérieurs sans démarrage « by 0 » : 0 (aucune ligne F3 dans etat\U58 hors DC4, ni dans LU8).
  • Cause : argument « personne » lu en Variable.Person[0] sur une variable d'acteur vide, puis fonction appelée sur None (estimé : dump de CallFunction absent, § 3.7).

3.5 F4 : CallFunc_GetSkeletalMesh_ReturnValue (GI)

  • Nœud : événement UpdatePlayerMeshWithMorphs (STB-d GI__EventGraph.txt:1160-1197) : CharacterBeingEdited.Mesh (K2Node_VariableGet_7384) → LPMeshCompat::GetSkeletalMesh (K2Node_CallFunction_1101, :29255-29258) → MorphTargets (K2Node_VariableGet_7134, :1189-1191) → ForEachLoop, sans test. ULPMeshCompat::GetSkeletalMesh rend Cast<USkeletalMesh>(GetSkinnedAsset()), donc nullptr sans message quand le composant n'a pas de maillage (D:\Game\LifePlay-master 5.8\Source\LifePlay\LPMeshCompat.cpp:9-19). Correspondance nom compilé CallFunc_GetSkeletalMesh_ReturnValue ↔ nœud _1101 : estimée (seul GetSkeletalMesh vu sur la chaîne de cet événement).
  • Câblage identique avant STB : STA-d GI__EventGraph.txt:1041-1044, 1070-1072, 29148-29151.
  • Avant STB en 5.8 : P10-58:39196-39221, même pile (via getPerson au lieu de GetSpecific), 10 avertissements pour 10 SPAWN de mannequin CheckScenes (index SPAWN suivi de F4 : 10). Les SPAWN de génération (GeneratePerson, GenerateUnknown) étaient suivis de currentMatchRace (P10-58 : 21 ; LU8 : 15/15), avertissement retiré par CHG-290 ; ils ne donnent pas F4.
  • En 5.5 : aucun SPAWN de mannequin CheckScenes dans les journaux disponibles (DestroyDummy was from CheckScenes : 0 dans DC4, U6-55, P10-55) ; les 2 F4 de DC4 sont d'autres nœuds (CharGen PopulateGenitalSlidersDaz DC4:7424-7432, Person BackupMorphs DC4:58139-58148). Origine 5.5 ou migration 5.8 : non tranchée.
  • Rapport L2 : 96 F4 pour 96 SPAWN suivis immédiatement de F4 ; la hausse 10 → 96 suit le nombre de mannequins CheckScenes (57 → 185), lui-même lié au parcours (relations du personnage créé).

3.6 F5 : « GetSocketInfoByName(...): No SkeletalMesh » (STA-D23)

  • Même schéma en 5.5 avant migration : DC4:8821-8828 (index SPAWN, DESTROY… Slot: 1, puis Head ×2, pelvis, chestUpper, hip sur le même acteur).
  • Par CHECKING: : L2 6,8 ; P10-58 (avant STB) 7,3 ; U6-58 7,2 ; LU8 2,3 ; 5.5 : DC4 2,0, U6-55 2,8, P10-55 5,9. L2 reste dans la plage 5.8 d'avant STB.
  • Part CenterBrow (seul socket touché par CHG-284) : L2 3 264 / 15 793 = 20,7 % ; P10-58 6 953 / 10 388 = 66,9 % ; DC4 2 470 / 10 974 = 22,5 %. Aucune hausse après CHG-284, plutôt une baisse (cohérent avec l'évaluation conditionnelle qui remplace le SelectVector, JM:1145 ; estimé : la part dépend aussi du parcours).
  • Lecteur par image (tête, bassin, poitrine, hanche, sourcils) non identifié : EventGraph de Person ou AnimBP (point à confirmer).

3.7 Dumps

Présents : ReturnStatIfNeeded (STA-d), EventGraph GI avant / après STB (UpdateCheckForScenes, PlayScene, UpdatePlayerMeshWithMorphs), EventGraph de Person (STB-d). Dump requis (non produit, copie gelée), tailles lues dans STA-d GI__graphes.txt : CallFunction (1 538 nœuds, :50), getActorVar (15, :262), setActorVar (32, :263), LoadPreset (109, :20), CheckConditionsWho (32, :42), ReadSceneLine (105, :49), GenerateAndApplyStrings (391, :27) ; ainsi que GetSpecific, getPerson, PlayerChangeRace, CheckConditionsOther, Calculator (taille non relevée).

4. Verdict : confirmée (F1, F2, F3, F5) ; confirmée vis-à-vis de STB, indécise 5.5 / 5.8 pour F4

Famille Cause Origine Correctif proposé (non appliqué) Effort
F1 Person dans ReturnStatIfNeeded / getActorVar / setActorVar stat ou variable lue sur un acteur de scène vide ou nul (X:stat, ex. meet_new_person.lpscene:5), sans test avant QueryStat préexistante (5.5 : DC4:13020-13031 ; 11,3 contre 11,9 par démarrage) ReturnStatIfNeeded : IsValidIndex(Variable.Person, 0) puis IsValid(Person) entre GetVariable (K2Node_CallFunction_81822) et QueryStat (K2Node_CallFunction_7798) ; sinon Float = 0.0 (valeur rendue aujourd'hui). Même garde dans getActorVar (valeur par défaut) et setActorVar (écriture sautée) S (≈ 5 nœuds par fonction, schéma de CHG-282) ; dumps get/set requis
F2 hors bornes Person_24… même lecture Person[0] sur tableau vide préexistante (DC4 1 379, P10-58 119, LU8 39) ; baisse partielle due à CHG-282 (estimé) couvert par F1 et F3 (même lecture) —
F3 CallFunc_Array_Get_Item_31/32/33/41 4 lectures Variable.Person[0] passées comme cible dans CallFunction, fonction appelée sur None préexistante (DC4:31616-31626 ; _33 1,38 contre 1,375 par démarrage) aide C++ GetPersonAtOrNone (modèle GetStringAtOrEmpty, CHG-283) pour la lecture, plus IsValid avant chaque appel ; ou abstention si l'on juge le cas normal (contenu de module, piège 5) M (1 538 nœuds ; dump requis pour situer les 4 cas)
F4 CallFunc_GetSkeletalMesh_ReturnValue UpdatePlayerMeshWithMorphs lit MorphTargets du maillage du mannequin recyclé, sans maillage au moment de LoadPreset préexistante au lot STB (P10-58:39196-39221, 1 par SPAWN CheckScenes) ; indécise 5.5 / 5.8 (chemin absent des journaux 5.5) garde IsValid(GetSkeletalMesh) avant le ForEachLoop (_1101 → _7134) ; cause amont (ordre maillage / changement de race) à instruire (§ 5) S (garde) ; M (cause)
F5 « No SkeletalMesh » mannequin libéré (DESTROY) gardé en réserve sans maillage, toujours interrogé par image (5-6 sockets) préexistante (DC4:8821-8828 ; 6,8 par CHECKING contre 7,3 avant STB) ; STA-D23 désactiver tick / animation du mannequin au DESTROY et réactiver au SPAWN, ou garde dans les lecteurs de sockets ; abstention conseillée tant qu'aucun effet visible (STA-D23, STA-T3-DOC.md:60) M (lecteur à identifier)

Effet visible estimé (non vérifié en jeu) : F1, F2, F3 : stat lue à 0 et appel sauté, donc la branche de condition est fausse et la ligne de script ne fait rien ; cohérent avec un acteur absent, aucun effet visible attendu. F4 : sans effet pour un mannequin détruit aussitôt (WHO unmatched) ; incertain pour un mannequin gardé pour la scène (P10-58:40222 → 40350, détruit plus tard par DestroyPerson) : morphs peut-être non appliqués au chargement. F5 : acteur sans maillage, donc invisible ; coût = volume du journal (51 % de L2) et appels par image.

Origine STB : aucune famille ne l'est. Les hausses de L2 par rapport à LU8 suivent les dénominateurs (démarrages « by 0 » 0 → 24, mannequins CheckScenes 0 → 185, CHECKING 374 → 2 318), pas un changement de taux.

Établi / estimé / incertain :

  • Établi : comptes du § 3.2 (Grep rejouables) ; piles identiques en 5.5 (DC4) pour F1, F3, F5 et en 5.8 avant STB (P10-58) pour F4 ; mécanisme de ReturnStatIfNeeded (dump STA) et de UpdatePlayerMeshWithMorphs (dumps STA et STB) ; aucune fonction de pile citée par CHG-281 à 294.
  • Estimé : taux comparés (même parcours non garanti) ; rôle de CallFunction (sans dump) ; nœud _1101 ; effet partiel de CHG-282 sur F2 ; effet visible.
  • Incertain : fichier joué par PlayScene avant chaque démarrage « by 0 » ; origine 5.5 ou 5.8 de F4 ; lecteur de sockets de F5 ; morphs d'un mannequin gardé (F4).

5. Hypothèse suivante proposée, et à quel niveau

  • H2 (F4, N3, lp-cart) : le maillage du mannequin recyclé est vidé au DESTROY et LoadPreset → GenerateAndApplyStrings → PlayerChangeRace déclenche UpdatePlayerMeshWithMorphs avant la réaffectation du corps. Essai : dumps LoadPreset, GenerateAndApplyStrings, PlayerChangeRace, GetSpecific (copie dégelée), puis contre-épreuve 5.5 sur une partie ayant des relations (mannequins CheckScenes) pour trancher 5.5 / 5.8.
  • H3 (F1/F3, N2, lp-cart) : identifier la scène jouée par PlayScene avant chaque démarrage « by 0 » (dumps PlayScene dans l'EventGraph STB-d, CallFunction, getActorVar, setActorVar) pour dire si l'acteur vide est normal (contenu) ou un défaut de moteur.
  • H4 (F5, N2) : identifier le lecteur par image des sockets (EventGraph Person STB-d, AnimBP à dumper).

Constats

Contre-épreuve U8 (parcours à rejouer par l'utilisateur, archive avant STB)

Archive : D:\Game\LifePlay_Build_5.8_Development_U8_essai\Windows\ (même moteur 5.8, sans CHG-281 à 294).

  1. Copier d'abord ...\Saved\Logs\LifePlay.log (contre-épreuve de 22:35) à part : le prochain lancement le renomme.
  2. Lancer LifePlay.exe de l'archive U8 ; Nouvelle partie avec l'éditeur de personnage, valider.
  3. En ville, enchaîner au moins 20 actions seul de plusieurs heures (but : ≥ 20 lignes for … hours by 0).
  4. Laisser tourner la ville au moins 3 minutes sans menu (but : ≥ 1 000 lignes CHECKING: et des mannequins DestroyDummy was from CheckScenes, qui demandent un personnage avec relations : celui de la nouvelle partie).
  5. Obtenir une scène meet_couple puis une scène à deux, comme en STB-JEU2.
  6. Quitter par le menu ; copier le LifePlay.log produit. Mesure (pwsh 7, depuis D:\Game\LifePlay-master 5.8) : & .\Tools\LogStats.ps1 -Compare <journal U8 neuf>,<L2>, puis les motifs Grep du § 3.2 sur les deux journaux. Décision : taux U8 ≈ L2 (± 50 %) pour F1 / « by 0 » (≈ 11), F3 _33 / « by 0 » (≈ 1,4), F4 / SPAWN CheckScenes (≈ 1), F5 / CHECKING (≈ 7) → préexistence confirmée sur le même parcours ; famille absente de U8 avec dénominateur non nul → attribuer à STB et rouvrir.

État de reprise par famille

F1, F2, F3, F5 : origine tranchée, correctifs proposés, dumps get/set/CallFunction à produire avant toute SPEC. F4 : origine STB tranchée, origine 5.5 / 5.8 ouverte (H2). Aucune décision prise : choix des correctifs et de l'abstention (contenu de module) à l'utilisateur.