LifePlay-Revival/Docs/Migration/etat/REL/ALPHA/REL-ALPHA-V-SPEC.md

79 lines
5.5 KiB
Markdown
Raw Normal View History

Fiche REL-ALPHA-V1 — Niveau N3 — Modèle prévu opus | utilisé claude-opus-5-5 (session REL) — Agent session REL — Skills lp-lot, lp-paths
# REL-ALPHA-V-SPEC : version de jeu terminée par une lettre (`2026.10.2.1a`) dans `LPModGuard` (2026-10-14)
**Décision de l'utilisateur** (option B, transmise par Big Boss le 2026-10-14, mot pour mot : « Lettre acceptée ») : `ProjectVersion=2026.10.2.1a`, et `LPModGuard` accepte une version qui se termine par une lettre. Le format `MODULE_GAME_VERSION` du contrat des mods change ici par sa décision.
Règle (Big Boss) :
- Le dernier composant peut finir par une ou plusieurs lettres ASCII `a`-`z`, sans casse, sans espace.
- Ce suffixe est ignoré à la comparaison.
- Toute autre forme reste illisible, avec le comportement actuel.
- Aucune trace nouvelle en Shipping.
Le code ne s'y oppose pas (ci-dessous).
## 1. Constat (lecture du code, établi)
- `Source/LifePlay/LPModGuard.cpp:52-74` : `ParseVersion` découpe la chaîne sur `.` et refuse toute composante vide, de plus de 9 caractères, ou qui contient un caractère autre qu'un chiffre.
- Il n'a que trois appels :
- l. 273, version du jeu : `GGameVersion` lu dans `GeneralProjectSettings.ProjectVersion`, l. 240 ;
- l. 274 : `MinGameVersion` = `2026.10.2.0`, l. 31 ;
- l. 367 : `MODULE_GAME_VERSION` de chaque mod.
- `CompareVersions` (l. 77-90) compare des entiers : le changer n'est pas nécessaire.
- Aucun autre analyseur de version :
- `LPVersionSubsystem.cpp:15` et `LPModInfoSubsystem.cpp:124` affichent la chaîne ;
- aucun Blueprint ne lit `ProjectVersion` (`grep -a` sur `Content/**/*.uasset` : 0 ; seul `GI.uasset` contient `version_text`, l'affichage).
- **Outils PowerShell** (jeu et addon 5.8, `grep -i "[version]|ProjectVersion|GAME_VERSION"`) :
- `BuildMod.ps1:181-183` lit `ProjectVersion=(.+)` comme une chaîne (`Trim`), sans `[version]` ni regex de chiffres. `:279` l'écrit telle quelle dans `MODULE_GAME_VERSION`. Rien à changer.
- Aucun `[version]` dans `Tools/*.ps1` du jeu ni dans `Tools/*.ps1` de l'addon 5.8.
- **`.uplugin` des mods** : `NewMod.ps1:43` écrit `Version = 1` (entier propre au mod) et `VersionName = $ModVersion`, la version **du mod** (`MODULE_VERSION`, `BuildMod.ps1:202, 284`). Aucun champ numérique ne dépend de la version du jeu.
## 2. Changement (un seul fichier, une fonction)
Fichier : `Source/LifePlay/LPModGuard.cpp`, fonction `ParseVersion` (l. 52-74), plus le commentaire de `LPModGuard.h:19` si son texte devient faux. L'IMPL vérifie : la règle « suffixe ignoré » s'y ajoute en une demi-ligne.
- Pour la **dernière** composante seulement, retirer les lettres ASCII de fin (`'a'..'z'`, `'A'..'Z'`, tests explicites, pas `FChar::IsAlpha`, qui accepte des lettres non ASCII), puis appliquer **les contrôles existants, inchangés**, à ce qui reste : non vide, 9 caractères au plus, chiffres seulement.
- Commentaire de la fonction : mentionner le lot REL-ALPHA, la décision de l'utilisateur et l'exemple `"2026.10.2.1a" -> {2026, 10, 2, 1}`.
- Rien d'autre : ni `CompareVersions`, ni journal nouveau, ni changement des messages.
Comportement attendu (tableau de la VAL) :
| Entrée | Résultat | Composantes |
|---|---|---|
| `2026.10.2.0` | lisible | 2026, 10, 2, 0 |
| `2026.10.2.1` | lisible | 2026, 10, 2, 1 |
| `2026.10.2.1a` | lisible | 2026, 10, 2, 1 |
| `2026.10.2.1A` | lisible | 2026, 10, 2, 1 |
| `2026.10.2.1rc` | lisible | 2026, 10, 2, 1 |
| `2026.10.2.1-a` | illisible (`-` reste) | — |
| `2026.10.2.a` | illisible (composante vide après retrait) | — |
| `2026.10a.2.1` | illisible (lettre hors de la dernière composante) | — |
| `2026.10.2.1 a` | illisible (l'espace reste) | — |
| chaîne vide | illisible (le moteur 5.8 rend 1 composante vide, refusée par `IsEmpty`) | — |
Conséquences :
- Le jeu `2026.10.2.1a` vaut `2026.10.2.1`.
- Un mod `2026.10.2.0` passe le contrôle min (= `MinGameVersion`) et le contrôle max (≤ jeu).
- Un mod construit pour l'alpha (`2026.10.2.1a`, `BuildMod`) passe sur l'alpha, et serait refusé par le contrôle max d'un jeu `2026.10.2.0`, ce qui est attendu.
## 3. Fiches
- **V2 IMPL** (lp-impl) :
- instantané `Tools\Snapshot.ps1 -Lot REL-ALPHA -Path Source\LifePlay\LPModGuard.cpp, Source\LifePlay\LPModGuard.h`, fait par la session REL avant l'envoi ;
- Edit de `ParseVersion` ;
- sans compiler ;
- LF et ASCII gardés ;
- livrable `REL-ALPHA-V2-IMPL.md` (diff, MD5 avant et après).
- **V3 VAL** (lp-validator distinct, statique) :
- le diff limité à `ParseVersion` (et au commentaire `.h` s'il est touché) ;
- le tableau du § 2, cas par cas, tracé dans le code (`fichier:ligne`) ;
- aucun `UE_LOG` ni message nouveau ;
- `FChar::IsAlpha` absent ;
- LF, ASCII ;
- compilabilité estimée.
Livrable : `REL-ALPHA-V3-VAL.md`.
- Puis **T1** (`ProjectVersion=2026.10.2.1a`) et **T1v**, puis la demande d'UE-GO pour T2 : le Shipping de livraison compile ce C++. Pas de build Development d'essai.
## 4. Essai (dans l'essai Shipping de l'utilisateur, T4)
- **Ligne d'essai :** l'alpha `2026.10.2.1a` est lancée avec un mod d'assets (`Mods\<id>`) construit en 5.8 (`MODULE_GAME_VERSION` = `2026.10.2.0`, ou `2026.10.2.1a` s'il est reconstruit). Attendus :
- le mod est chargé : il apparaît dans le gestionnaire de mods, et ses assets ou ses scènes sont visibles en jeu ;
- aucune fenêtre de refus des mods ;
- les cases « Mods: … (restart) » de Settings > Misc restent cochées.
- Sans journal en Shipping, la preuve est visuelle (fenêtre absente, mod présent) et se fait avec l'utilisateur.