Fiche KEY2-VAL-04 — Niveau N1 — Modèle prévu sonnet | utilisé Sonnet 5.5 — Agent lp-validator — Skills sk-protocol, sk-recount, debug-verification, lp-validate # KEY2-VAL-04 : VAL statique du regroupement du menu Clavier (KEY2-IMPL-02) (2026-10-20) Verdict : **PASS-STATIC** (3 réserves, aucune bloquante). Rien n'a été modifié hors ce livrable, sauf un effet de bord de `Build.ps1 -FromLog` signalé en réserve R1. ## 1. Fiches amont relues - `KEY2-SPEC-02.md` (§ 0 décisions, § 2 tableau des 9 sections, § 3 option A, § 4 changements prévus) ; - `KEY2-TACHES.md` l. 19 (KEY2-IMPL-02) et l. 20 (KEY2-BUILD-03) : il n'existe pas de fiche `KEY2-IMPL-02.md` séparée, la fiche IMPL est la ligne de TACHES (écart de gabarit : pas de section « Points à confirmer » IMPL à reprendre ; voir § 2) ; - `KEY2-BUILD-03.md` (builds, unités, MD5) ; - journaux `Saved\Logs\portage\KEY2_Build_20261020-162228.log` et `-162323.log`. ## 2. Points à confirmer des IMPL amont sans objet : KEY2-IMPL-02 n'a pas de livrable propre avec rubrique 5 (vérifié : `Glob` du dossier KEY2, aucun `KEY2-IMPL-02.md`; seule la ligne TACHES l. 19). Les attentes de la SPEC-02 § 0 et § 4 sont contrôlées au § 3. ## 3. Critères rejoués | # | Critère | Commande / lecture | Résultat | Verdict | |---|---|---|---|---| | 1a | MD5 de `LPKeyboardSubsystem.cpp` = 0eb6a592 | `FileCheck.ps1 -Path @('…\Source\LifePlay\LPKeyboardSubsystem.cpp')` | `CRLF 1491 0 0 - 0EB6A5929F857CB68920AE989E11E14E`, alertes=0 | PASS | | 1b | Instantané KEY2-IMPL3 = 9d450aaf, CRLF | `FileCheck.ps1` sur `D:\Game\LifePlay_Backup_5.5\KEY2-IMPL3\Source\LifePlay\LPKeyboardSubsystem.cpp` | `CRLF 1490 0 0 - 9D450AAF8E1E0FB64519AA70D41D9500` | PASS | | 1c | Fins de ligne : CRLF pur (LF seul = 0, CR seul = 0) | idem (colonnes LF, CR) | 1491 CRLF, 0, 0 ; 1490 → 1491 = +1 ligne, cohérent avec +63 / −62 | PASS | | 2 | Seul l'affichage change | `git diff -U2 -- Source/LifePlay/LPKeyboardSubsystem.cpp` lu en entier ; `git diff --stat` : `63 insertions(+), 62 deletions(-)` (recompte = TACHES et SPEC § 0) | voir détail ci-dessous | PASS | | 2b | `DefaultInput.ini` non modifié | `git diff --stat -- Config` (sortie vide) ; `git status --short -- Source Config Content Plugins` : aucun fichier Config | aucune modification | PASS | | 3 | `GroupFor` : 9 sections dans l'ordre, Other par défaut | lecture `LPKeyboardSubsystem.cpp:207-252` et `DefaultInput.ini:95-162` (Grep des noms) | voir § 3.1 | PASS | | 4 | Flèches : 2 lignes, même liaison | lecture `:491-506`, `:578-615` | voir § 3.2 | PASS-STATIC | | 5 | Libellés : pas de texte adulte nouveau, pas de faute | diff lu | voir § 3.3 | PASS | | 6 | Builds | `Build.ps1 -FromLog` ×2 et Grep des journaux | voir § 3.4 | PASS | | 7 | PubCheck | `pwsh -NoProfile -File Tools/PubCheck.ps1 -Fichiers Source/LifePlay/LPKeyboardSubsystem.cpp -Depot "D:/Game/LifePlay-master 5.8"` ; idem sur `KEY2-BUILD-03.md` | `PubCheck : 0 constat(s)`, code 0 (×2) | PASS | ### Détail critère 2 (diff) Lignes modifiées, toutes dans l'espace de noms anonyme (affichage) : - constantes `KbSceneOrder` / `KbCharactersSub` (l. 47-49) remplacées par `KbMapOrder = 3` / `KbCoupleOrder = 4` ; - `FBindRow` : ajout du champ `Section` (l. 106) ; - `ActionLabel` : libellé d'ActionPanel (l. 148) ; `AxisLabel` : CameraHeight (l. 191) ; - `FBindGroup` sans `Sub` / `SubTitle` ; `GroupFor` réécrit ; nouvelle fonction `KbArrowLabel` (l. 255-264) ; - `Rebuild` : tri et dessin par `Section` (l. 491-537). Non touchés (vérifié par le diff, aucune ligne hors ces blocs) : les noms internes (`KbMoveForward`, `KbActionPanel`, `KbCameraHeight`, `KbCoupleMoveY`, les chaînes `TEXT("…")` des tests de nom), `KeyboardIniPath`, les appels `File.GetArray/AddToSection` (l. 1289-1461 hors diff), `KbVersion = 2`, la migration. Les appels `BeginWait` / `RemoveBinding` utilisent les mêmes champs qu'avant (`Name, bAxis, Scale, Key, modificateurs`, l. 557, 592, 608). Aucune lecture ni écriture nouvelle de `LPKeyboard.ini` ni de `DefaultInput.ini` n'apparaît dans le diff. ### 3.1 GroupFor (l. 207-252), comparé à SPEC-02 § 2 | Ordre | Section | Code | SPEC | | |---|---|---|---|---| | 1 | Movement | MoveForward, MoveRight | idem | conforme | | 2 | Camera | SwitchCamera, RotateCamera, ScrollDownUp, CameraHeight | idem | conforme | | 3 | Map & World | NextBuilding, PreviousBuilding (+ copie de LeftRight, DownUp ajoutée par Rebuild) | idem | conforme | | 4 | Couple (scene) | CoupleMoveY, LeftRight, DownUp, ManualAnimating, PenisRotation (axe de rotation) ; « Move couple with » en tête (l. 534-536) | idem | conforme | | 5 | Actions & Interaction | Interact, ActionPanel, SwapRoles, Recommended | idem | conforme | | 6 | Menus | Journal, Inventory, MainMenu, CharacterMenu, ModuleMenu, CityMenu, StatMenu, ContactsMenu, SearchBarToggle (Pause sorti) | idem | conforme | | 7 | Time | Pause, SpeedUp, SpeedDown | idem | conforme | | 8 | Favorites | préfixe `Favorite` | idem | conforme | | 9 | System | QuickSave, Quickload, TestScenes | idem | conforme | | 10 | Other | défaut `{10, "Other"}` (l. 251) | « Other par défaut » | conforme | Recompte des noms de `DefaultInput.ini:95-162` (Grep) : ActionMappings Pause, SearchBarToggle, CharacterMenu, ModuleMenu, Inventory, CityMenu, MainMenu, StatMenu, ContactsMenu, RotateCamera, ManualAnimating, SpeedUp, SpeedDown, SwapRoles, SwitchCamera, NextBuilding, PreviousBuilding, TestScenes, Recommended, Journal, Interact, ActionPanel, QuickSave, Quickload, Favorite0-9 ; AxisMappings LeftRight, DownUp, ScrollDownUp, MoveForward, MoveRight, PenisRotation, CameraHeight, CoupleMoveY ; ActionX/ActionY et CursorX/CursorY. Chacun est classé par `GroupFor`. **Aucune action ni aucun axe ne tombe dans Other.** ActionX/ActionY/CursorX/CursorY ne sont pas affichés (écartés avant `GroupFor` par `IsRemappable`, `:117-120`, inchangé : l'établissement repose sur la lecture du code, `ActionX/Y` étant supposées sur des touches de souris, non relu dans le .ini ; sans effet sur le verdict, ces lignes n'étaient pas affichées à l'instantané non plus). Ordre d'affichage : le tri est par `Section` (1 à 10), puis libellé, puis nom de touche (l. 507-518) ; l'ordre 1 à 9 est donc celui de la SPEC. ### 3.2 Flèches (option A) - Rebuild marque chaque ligne par `GroupFor(Row.Name).Order` (LeftRight / DownUp → 4, Couple) puis, pour tout axe `LeftRight` / `DownUp`, copie la ligne (`FBindRow MapRow = Row`, l. 500) avec `Section = KbMapOrder` et le libellé « Map … » ; la ligne d'origine reçoit « Couple … » (`KbArrowLabel`, l. 255-264). Résultat attendu : « Couple Forward / Back / Right / Left » en section 4, « Map Forward / Back / Right / Left » en section 3 (SPEC § 2, lignes 3 et 4). - Les deux lignes ont la même `Name`, `bAxis`, `Scale`, `Key` et modificateurs (copie de la structure) ; Change (`BeginWait`, l. 592) et Remove (`RemoveBinding`, l. 608) n'utilisent que ces champs et jamais `Section` (Grep : `Section` n'est lu qu'aux l. 496-534). Il n'existe qu'un seul mapping `+AxisMappings` sous-jacent par touche : un changement dans l'une vaut donc pour l'autre, et `RefreshMenu` redessine depuis les réglages. - Établi par lecture. Non exécuté : le comportement à l'écran (deux lignes, Change qui vaut pour les deux) n'est pas rejoué ici. - Titre de la section 3 pour les lignes de flèches : `Row.Section == KbMapOrder ? FBindGroup{KbMapOrder, "Map & World"}` (l. 528) ; la section 3 sans bâtiment ni flèche ne serait pas dessinée (comme avant). ### 3.3 Libellés (diff) Nouveaux textes : titres de section « Camera », « Map & World », « Couple (scene) », « Actions & Interaction », « Time », « System » (« Movement », « Menus », « Favorites » inchangés) ; « Map Right / Left / Forward / Back », « Couple Right / Left / Forward / Back » ; « Camera Height Up (scene) » / « Camera Height Down (scene) » ; « Action Panel (also Alt / middle click) ». Aucun texte adulte nouveau (doc 27) ; « Rotation + / − » (axe `PenisRotation`) est inchangé et le nom interne n'apparaît pas à l'écran. Aucune faute relevée en anglais. Les commentaires de code sans accents suivent le style du fichier. Les libellés de l'ancienne forme « (map view / couple) » (l. 169-176) restent dans `AxisLabel` mais ne servent plus : `Row.Label` est écrasé par `KbArrowLabel` pour LeftRight / DownUp (code mort, voir R2). ### 3.4 Builds `Tools\Build.ps1 -Lot KEY2-VAL -FromLog ''` (sortie brute, un appel par journal) : ``` journal 162228 : code=-1 duree=0s erreurs=0 avertissements=1 autres=20 unites=2 chaine : Using Visual Studio 14.50.35739 toolchain (C:\Program Files\Microsoft Visual Studio\18\Community\VC\Tools\MSVC\14.50.35717) … journal 162323 : code=-1 duree=0s erreurs=0 avertissements=1 autres=0 unites=2 chaine : Using Visual Studio 14.50.35739 toolchain (…MSVC\14.50.35717) … ``` (`code=-1` : `-FromLog` ne relit pas le code de sortie ; le code vient de `Result:`, ci-dessous. `unites=2` : le résumé compte Compile `LPKeyboardSubsystem.cpp` et `Module.LifePlay.cpp`.) Lecture directe des journaux (Grep) : | Journal | Result | Unités | Avertissement | Toolchain | |---|---|---|---|---| | 162228 (LifePlayEditor) | `Result: Succeeded` (l. 54) | `[1/5] Compile LPKeyboardSubsystem.cpp` (l. 42), `[2/5] Compile Module.LifePlay.cpp` (l. 43), `Link UnrealEditor-LifePlay.dll` (l. 48) | l. 44 : C4701 `Aim`, `LPCameraModeSubsystem.cpp(2378)` | MSVC 14.50.35717 | | 162323 (LifePlay Development, NoUba) | `Result: Succeeded` (l. 31) | `[1/4] Compile LPKeyboardSubsystem.cpp [NoUba]` (l. 20), `Module.LifePlay.cpp` (l. 21), `Link LifePlay.exe` (l. 24) | l. 22 : même C4701 | MSVC 14.50.35717 | Erreurs : 0 (aucun `error C` ni `error LNK` dans les deux journaux). Le seul avertissement est le C4701 connu (`TickCoupleMouse`, hors fichier validé). Les 20 « autres » du journal éditeur sont les lignes UBT HyperAIStudio signalées par KEY2-BUILD-03 ; non relues une à une ici (incertain, sans effet sur le verdict). ## 4. Diff lu en entier 1 fichier suivi du lot : `Source/LifePlay/LPKeyboardSubsystem.cpp`, +63 / −62 (`git diff --stat`), lu en entier (sortie `git diff -U2`), conforme à SPEC § 4 points 1 à 6. Fichiers non annoncés dans `git status --short -- Source Config Content Plugins` : `Source/LifePlay/LPCityWaterSubsystem.h` (M), `Source/LifePlayEditorTools/LPBuildCityWaterCommandlet.cpp` (M), `Source/LifePlay/LPCityWaterMask.h` (??) : lot STM1, hors périmètre KEY2, non lus ; à ne pas inclure dans le ticket KEY2. Remarque : `KEY2-BUILD-03.md` § 3 cite deux fichiers modifiés, or `LPCityWaterSubsystem.h` est apparu depuis (STM1, travail concurrent). ## 5. Verdict **PASS-STATIC.** Conforme à la SPEC-02 (§ 0 et § 2) par lecture du diff complet, des MD5, des fins de ligne et des deux journaux de build. Non rejoué : le rendu en jeu du menu (9 sections, flèches doublées, Change valable pour les deux lignes), `LPTestStringCompat` (sans lien avec le lot, aucune chaîne de données touchée) et la porte G-U3. Témoin en jeu : à créer (correctif de comportement visible : ordre des 9 sections, deux lignes de flèches, Change sur une flèche de Map & World change aussi Couple (scene), mention dans Action Panel) ; je demande à l'orchestrateur une ligne COMMUN-.. Réserves : - **R1 (effet de bord de ma VAL).** `Build.ps1 -FromLog` a créé, faute de règle pour le lot `KEY2-VAL` dans `Tools\EtatDir.ps1`, deux résumés dans un dossier non prévu : `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\KEY2-VAL\KEY2-VAL_BuildLog_20261020-162643.txt` et `…162644.txt`. Je ne les ai ni déplacés ni supprimés (consigne). À déplacer vers `etat\REL\KEY2\` (ou à supprimer par l'orchestrateur) ; ils ne sont pas dans les fichiers à commiter. - **R2 (code mort, mineur).** Les branches `LeftRight` / `DownUp` de `AxisLabel` (l. 169-176, « … (map view / couple) ») ne sont plus atteintes : le libellé est écrasé par `KbArrowLabel` (l. 499). Sans effet à l'écran ; à nettoyer éventuellement. - **R3 (hérité, non modifié).** L'axe `ScrollDownUp` n'a pas de libellé connu : `AxisLabel` rend `ScrollDownUp +` / `ScrollDownUp −` (l. 198), affiché dans Camera. Présent avant le lot ; la SPEC le nomme « zoom » (§ 2) sans demander de libellé. ## 6. Points à confirmer par l'utilisateur - [ ] Capture du menu Clavier à la prochaine build d'essai : 9 sections dans l'ordre Movement, Camera, Map & World, Couple (scene), Actions & Interaction, Menus, Time, Favorites, System. - [ ] Changer une flèche (par ex. Map Right) puis constater que « Couple Right » porte la même touche (et inversement). - [ ] Remove sur une ligne doublée retire la liaison dans les deux sections (voulu, SPEC § 5). - [ ] Décision de l'orchestrateur sur R1 (dossier `etat\KEY2-VAL\`). Fichiers écrits : `D:\Game\LifePlay-master 5.8\Docs\Migration\etat\REL\KEY2\KEY2-VAL-04.md` (ce livrable) ; effet de bord : les deux `.txt` de R1. Fichiers à commiter : A `Docs/Migration/etat/REL/KEY2/KEY2-VAL-04.md`. Aucun git qui écrit. Tours : 8 / 40