LifePlay-Revival/Docs/Migration/19_Plan_Outillage_Debug.md

286 lines
11 KiB
Markdown
Raw Normal View History

# 19 — Plan d'outillage debug (pilotage)
> Plan de lot révisé (game manager + senior). Procédure opérationnelle et mesures :
> [`18_Build_Debug.md`](18_Build_Debug.md). Skill agent :
> [`.cursor/skills/lifeplay-debug-build/`](../../.cursor/skills/lifeplay-debug-build/).
> Protocole lots : [`10_Protocole_Operations.md`](10_Protocole_Operations.md).
**État :** gates I0–I6 mesurés (voir §4 et relevés dans `18`). Prochain lot d'optimisation
proposé : **G6** (pas O10 en premier) — décision dans `18` § mesures.
---
## 1. Brief production (game manager)
### Mission
Livrer une **capacité de mesure reproductible** (pipeline + preuves), pas une optimisation joueur. Après ce lot, l'équipe peut décider *quoi* corriger (G6 à-coups, O10 physique) avec des chiffres, pas au feeling.
### Succès (Definition of Done globale)
Le lot est **terminé** seulement si :
1. Un tiers (ou un agent futur) peut packager DebugGame/Development et lancer sessions A/B/C **sans scripts hors dépôt**.
2. Trois jeux de preuves archivés (`Dbg-I4`, `Dbg-I5`, `Dbg-I6`) sous `D:\Game\LifePlay_Backup_5.5\`.
3. Une note chiffrée classe les priorités suivantes (G6 vs O10 vs autre) — **décision**, pas encore le fix.
4. Shipping **inchangé** en comportement joueur (`IncludeDebugFiles=False`, pas de coût runtime Shipping).
5. Skill + `18_Build_Debug.md` alignés sur le livré.
### Hors scope (explicitement)
| Inclus | Exclu jusqu'à preuves I4–I6 |
|---|---|
| Scripts packaging / lanceurs / collecte | Optimisation GI / timers / async load |
| Sous-système debug non-Shipping | Refonte collisions ville / LOD / morphs |
| Doc + skill | Montée UE 5.8 (préparer seulement la portabilité) |
| Mesure G6 / Physics | Intégration Tracy / Optick / ASAN / ImGui |
| Outils gratuits documentés | Builds Shipping « debug » pour joueurs |
### Priorité joueur (pourquoi ce lot)
| Signal existant (O0/O9) | Impact ressenti | Ce lot livre |
|---|---|---|
| À-coups GameThread (G6) | Stutters irréguliers | Preuve nommée → backlog fix priorisé |
| Physics ~463 Mo (O0) ; ~172 Mo session B post-O9 | Risque machines modestes | Chiffre Physics + CVD → backlog O10 |
| Régime 16,7 ms | OK aujourd'hui | Garde-fou non-régression (I6) |
**Règle produit :** ne pas ouvrir un lot d'optimisation tant que I4 (hitches) **et** I5 (mémoire) n'ont pas leurs gates verts.
### Effort et dépendances (ordre de grandeur)
| Phase | Effort estimé | Qui | Dépendance |
|---|---|---|---|
| I0 skill | 15 min | Agent | — |
| I1 scripts + 1er cook DebugGame | 0,5–1 j (+ cook long) | Agent ; cook machine | UE 5.5, Content/Heavy dispo |
| I2 C++ + compile / smoke | 0,5 j | Agent | I1 ou Editor Development pour smoke |
| I3 doc + sync skill | 0,25 j | Agent | I1–I2 stabilisés |
| I4 / I5 / I6 playtests | 3× ~20–30 min jeu + analyse | **Utilisateur** joue ; agent archive/analyse | Builds prêtes |
**Chemin critique :** temps de cook DebugGame + disponibilité playtest humain.
### Risques production
| Risque | Impact | Mitigation |
|---|---|---|
| Cook DebugGame très long / échec | Bloque I1 | Smoke I2 en Editor d'abord ; `-SkipBuild` / iterate ; un seul cook DebugGame pour I4–I5 |
| Confusion DebugGame vs Dev sur les ms | Fausses régressions | Dual-build documenté ; I6 = Development only vs O0 |
| Instrumentation fuit dans Shipping | Perf / logs joueur | `#if !UE_BUILD_SHIPPING` strict ; pas de changement `DefaultGame.ini` Shipping |
| Scope creep « on corrige GI tout de suite » | Lot interminable | Hors scope ; nouveau lot après I6 |
| Trace Insights trop lourde | Machine saturée (déjà vu O9) | Trace courte ciblée ; channels limités ; bookmarks |
| Playtest non standard | Mesures incomparables | Scénario O0 figé 15 min ; même type de save |
### Gouvernance
- Protocole lots : [`10_Protocole_Operations.md`](10_Protocole_Operations.md) (tag, snapshot, journal).
- Skill obligatoire : [`.cursor/skills/lifeplay-debug-build/`](../../.cursor/skills/lifeplay-debug-build/).
- **Go / No-Go** à chaque gate In : critères verts ou stop + re-mesure.
- Commit : uniquement si demandé ; un sous-lot = un objectif mesuré.
---
## 2. Brief technique (senior gameplay / engine)
### Principes
1. **Zero cost Shipping** — tout debug derrière `!UE_BUILD_SHIPPING` ; flags CLI opt-in.
2. **Réutiliser** `ULPSessionLogSubsystem` patterns (`FParse`, `FAutoConsoleCommand`, `FName` categories).
3. **Pas de modification Blueprint GI** dans ce lot — C++ subsystem + ModdingExtra hotspots only.
4. **DebugGame rare** — un cook pour plongée ; itération code en Editor/Development.
5. **Portable 5.8** — Insights/ChaosVD/CSV + attach process ; pas de plugin profiler tiers.
### Architecture cible
```mermaid
flowchart TB
subgraph mgmt [DoD_produit]
Proof[Preuves_A_B_C]
Decision[Priorite_G6_vs_O10]
end
subgraph pipe [Pipeline]
BuildPs[BuildDebug.ps1]
Bats[Tools/debug_bats]
Collect[CollectDebugArtifacts.ps1]
end
subgraph runtime [Runtime_non_Shipping]
LPDebug[ULPDebugSubsystem]
Named[SCOPED_NAMED_EVENT_LoadTxt_Cache]
SessLog[ULPSessionLogSubsystem_existant]
end
BuildPs --> Bats
Bats --> LPDebug
Bats --> SessLog
Named --> Insights[UnrealInsights]
LPDebug --> Insights
Bats --> Collect
Collect --> Proof
Proof --> Decision
```
### Dual-build
| Config | Rôle | Comparer ms absolus |
|---|---|---|
| **Development** | Baseline chiffrée / I6 vs O0 | Oui |
| **DebugGame** | Plongée I2/I4/I5 (checks, PDB) | Non |
| **Shipping** | Joueurs | Hors lot |
### Livrables techniques
| Livrable | Contenu clé |
|---|---|
| [`Tools/BuildDebug.ps1`](../../Tools/BuildDebug.ps1) | `-Config DebugGame\|Development`, pas `-nodebuginfo`, stage des bats |
| [`Tools/CollectDebugArtifacts.ps1`](../../Tools/CollectDebugArtifacts.ps1) | `-Lot -BuildDir -Session` → backup |
| `Tools/debug/*.bat` | Sessions A/B/C + bugs/gpu/collision |
| `ULPDebugSubsystem` | Hitch + bookmark + MemSnapshot + CollisionDump |
| Named events | `LoadTxt`, `LPDataCache` |
| [`18_Build_Debug.md`](18_Build_Debug.md) | Procédure + mesures + Agent/skill |
### Sessions de capture
Scénario unique (O0 §5, ~15 min) : save avancée → carte → intérieur → extérieur → multi-PNJ → quit.
| Session | Build | Gate métier |
|---|---|---|
| A | DebugGame | Top contributeurs hitch **chiffrés** |
| B | DebugGame | Physics Mo + CVD ou dump collision |
| C | Development | Non-régression vs O0 (médiane ~16,7 ms) |
Auxiliaires hors chemin critique : bugs / gpu (PIX **ou** RGP) / collision.
### Stack outils (gratuite, pas de trial)
Insights + Memory Insights, CSV/LLM, ChaosVD, RenderDoc, PIX, Radeon RGP/RMV, µProf, VS Diagnostics.
Écartés : Tracy, Optick, ASAN, Superluminal, Nsight par défaut (machine AMD).
Détail : [`.cursor/skills/lifeplay-debug-build/reference.md`](../../.cursor/skills/lifeplay-debug-build/reference.md).
### Pièges techniques connus
- Jamais `-csvCaptureFrames` (crash RHI).
- Mesurer packaged, pas Editor `-game`, pour I6.
- Shipping `NO_LOGGING` — ne pas s'y fier pour l'analyse.
- Traces Insights lourdes : rester court + bookmarks.
- I6 **sans** `-LPHitchLog` (overhead off by default).
---
## 3. Skills (obligatoire agent)
| Skill | Usage |
|---|---|
| [`SKILL.md`](../../.cursor/skills/lifeplay-debug-build/SKILL.md) | Lire **avant** tout code (I0) |
| [`reference.md`](../../.cursor/skills/lifeplay-debug-build/reference.md) | Flags, chemins, mapping symptôme→outil |
Ne pas diverger (mega-lanceur, Tracy, rebuild DebugGame systématique) sans maj skill + ce plan.
---
## 4. Planning itératif mesurable
### Règle de sortie
> On ne quitte **In** que si **tous** les critères de mesure sont verts.
> Code sans artefact / impression en jeu = **rouge**.
> Rouge → corriger → **re-mesurer**. Pas de skip vers In+1.
```mermaid
flowchart LR
I0[I0] --> I1[I1]
I1 --> G1{Gate}
G1 -->|non| I1
G1 -->|oui| I2[I2]
I2 --> G2{Gate}
G2 -->|non| I2
G2 -->|oui| I3[I3]
I3 --> G3{Gate}
G3 -->|non| I3
G3 -->|oui| I4[I4]
I4 --> G4{Gate}
G4 -->|non| I4
G4 -->|oui| I5[I5]
I5 --> G5{Gate}
G5 -->|non| I5
G5 -->|oui| I6[I6]
I6 --> G6{Gate}
G6 -->|non| I6
G6 -->|oui| DoD[DoD_lot]
```
### Statut des gates
| Itération | Objectif | Gate (résumé) | Statut |
|---|---|---|---|
| I0 | Skill | Procédure partagée | Fait |
| I1 | Pipeline scripts | Build + Collect smoke | Fait |
| I2 | `ULPDebugSubsystem` | Hitch / bookmark / MemSnapshot | Fait |
| I3 | Doc 18 + skill sync | Doc = réalité | Fait |
| I4 | Session A | utrace + hitches chiffrés G6 | Fait — voir `18` |
| I5 | Session B | Physics Mo + CVD | Fait — voir `18` |
| I6 | Session C vs O0 | Médiane ≤ 17 ms, hitches | Fait — voir `18` |
### Détail des itérations
#### I0 — Alignement
- **Owner :** Agent
- **Mesure :** skill lu ; scope hors Tracy/mega-lanceur confirmé
#### I1 — Pipeline (P0 technique)
- **Livrables :** `BuildDebug.ps1`, `CollectDebugArtifacts.ps1`, bats
- **Gate :** UAT DebugGame OK + exe + bats staged + Collect smoke → backup non vide
#### I2 — Runtime debug (P0 technique)
- **Livrables :** `ULPDebugSubsystem` + named events ; Shipping-safe
- **Gate :** compile clean ; hitch log ; Bookmark ; MemSnapshot non vide
#### I3 — Doc / skill = réalité
- **Gate :** noms bats/flags identiques doc↔skill↔Tools ; section Agent ; piège CSV documenté
#### I4 — Mesure G6 hitches (P0 produit)
- **Owner :** Utilisateur (jeu) + Agent (analyse)
- **Gate :** `.utrace` ; bookmarks/hitch alignés ; top contributeurs avec ms/% ; Collect OK
- **Livrable décision :** causes candidates classées
#### I5 — Mesure Physics / fuites (P0 produit)
- **Gate :** Physics Mo ; MemReport ; CVD ou CollisionDump ; delta mémoire ; Collect OK
#### I6 — Non-régression Development
- **Gate :** CSV ≥1×9000 frames ; LLM ; tableau vs O0 ; médiane ≤17 ms (±1) ou écart causé ; Collect OK
- **Sans** `-LPHitchLog`
### Après DoD
Lots suivants (chacun avec baseline avant/après) :
1. **Fix G6** (étalement `ExecuteUbergraph_GI` / `City`, `PopulateRaws`) — priorité décidée en I4/I6
2. O10 collisions / trimesh — après G6
3. Montée 5.8 — réutiliser cette pipeline
---
## 5. Critères d'acceptation (checklist manager)
- [x] Aucun changement comportement Shipping joueur
- [x] Scripts versionnés ; plus de dépendance à `LifePlay_profil_O0.bat` hors repo
- [x] I4 + I5 + I6 verts avec backups
- [x] Décision écrite G6 vs O10 (priorité prochain lot) — dans [`18_Build_Debug.md`](18_Build_Debug.md)
- [x] Skill + doc 18 synchronisés
- [ ] Temps cook / playtest consigné au journal (`Journal_Modifications.md`) si publication du lot
---
## 6. Ordre d'exécution (référence)
1. I0 skill
2. I1 scripts ; cook DebugGame
3. I2 C++ ; recook DebugGame si besoin
4. I3 doc + sync skill
5. I4 → gate → I5 → gate → I6 → gate
6. Revue DoD + proposition du prochain lot d'optimisation