Revue R1 (SK-ARBRE) — Session principale (orchestrateur) — Modèle claude-opus-5-5 — Skills lus : lp-mcp, lp-validate, lp-commandlets, lp-doc # SK-REVUE : plugin Epic « Unreal Engine Skills for Claude Code » — revue et recyclage (2026-10-15) Demande de l'utilisateur (2026-10-15) : « si le gain est faible je désactive, mais avant essaies de récupérer ce qui est exploitable et qui donnerait un véritable bonus pour nos agents et skills ». Ce document est la revue R1 et une **proposition** : aucun skill, agent ni réglage n'a été modifié (R11 ; règle auto-mode du 2026-10-12 : SPEC approuvée et fichiers réservés par Big Boss avant toute écriture de skill). ## 1. Source (R2) - Dépôt `github.com/EpicGames/unreal-engine-skills-for-claude-code-plugin`, licence MIT, version `3.1.1` (`plugin.json`). Révision épinglée par la marketplace `claude-plugins-official` : `a6aa73ada02a9fb1f5415bec491f9942c519b297` (établi pour le catalogue ; estimé pour la copie installée, qui ne porte pas de SHA). - Copie installée par l'application : `%APPDATA%\Claude\local-agent-mode-sessions\…\rpm\plugin_01WDbGcSbMipS8o8yLaofHQ4\`. - Copie de sauvegarde, qui survit à la désactivation : `D:\Game\LifePlay_Backup_5.5\UES1\unreal-engine-skills-3.1.1\` (12 fichiers, manifeste `MD5.txt` ; `skills/unreal-mcp/SKILL.md` = `f8e2d497…`, `create-toolset/SKILL.md` = `f2dc9d3d…`). - Activation : `enabledPlugins` dans `.claude/settings.json` du projet ; `.claude/` est ignoré par git (`.gitignore:72`), rien n'atteint le dépôt public (établi, `git check-ignore -v`). ## 2. Contenu relu en entier (établi) | Fichier | Ce qu'il fait | |---|---| | `hooks/hooks.json` + `unreal-context.sh` | SessionStart (startup, resume, clear), bash, 5 s : cherche un `.uproject` en remontant, émet 2-3 phrases de contexte (« projet Unreal, conventions UE, utilise `unreal-mcp`, `.mcp.json` présent »). Lecture seule, aucun réseau. Lève la question ouverte de SK-T2 l. 227. | | `skills/unreal-mcp/SKILL.md` + `references/setup.md`, `operations.md` | Mode d'emploi du serveur MCP de l'éditeur : 3 méta-outils, règles de sécurité, dépannage, proxy. | | `skills/create-toolset/SKILL.md` | Écrire un jeu d'outils (C++ ou Python) pour `ToolsetRegistry` : principes, documentation, erreurs, tests. | | `skills/unreal-skill/SKILL.md` | Écrire un « Agent Skill » enregistré dans l'éditeur (UAsset ou classe Python). | | Pas de `.mcp.json`, pas de `bin/` | Aucun serveur ni exécutable ajouté. Notre `.mcp.json` (`unreal-mcp`, 8000) reste la seule connexion. | Écart à nos règles : l'installation du plugin entier contrevient à **R3** (« aucun hook tiers, aucun plugin entier ; le plugin Epic n'est pas installé »). La désactivation rétablit la conformité ; le garder exigerait d'amender R3. Concurrence : les déclencheurs larges de `unreal-mcp` (`BP_`, acteurs, « in my game ») le font choisir à la place de `lp-mcp`, alors qu'il prescrit l'inverse de nos règles (§ 5). ## 3. À recycler : vrai bonus (priorité A) | # | Idée | Cible | Gain attendu | |---|---|---|---| | A1 | Un outil peut rendre un statut d'échec **sans exception** : seul un succès explicite autorise l'appel suivant | `lp-mcp` § 1 règle 3 | Moins de faux « fait » dans `lp-mcp-bp` | | A2 | Dépannage du serveur : `RefreshTools`, port occupé, PIE, compilation en cours, preuve par un appel de lecture | `lp-mcp` § 2 (+ consigne `BLOCKED-MCP` des deux agents) | Diagnostic d'un `BLOCKED-MCP` sans tâtonnement | | A3 | Description de skill avec **clause d'exclusion** (motif « SKIP for » d'Epic) | descriptions des paires proches ; règle R12 | Déclenchement plus juste entre nos 20 skills | | A4 | Règles de rédaction : « nouveau », « économe », test de la ligne, relecture par la description seule | SK-ARBRE (R13) + `lp-doc` | Skills plus courts (R9 : `lp-build` 148, `lp-validate` 144 lignes) | | A5 | Stub Python de l'éditeur (`Intermediate/PythonStub/unreal.py`) comme référence d'API 5.8 | `lp-commandlets` | Scripts `-run=pythonscript` sans API devinée | **A1 — texte proposé** (fin de `lp-mcp` § 1 règle 3) : > Un résultat d'outil se lit avant l'appel suivant : `compile_blueprint`, `create_node`, `save_assets`… peuvent rendre un > échec sans erreur de protocole. Tout ce qui n'est pas un succès explicite arrête la fiche (source : plugin Epic 3.1.1). **A2 — texte proposé** (nouvelle puce de `lp-mcp` § 2, « Panne du serveur ») : > - Outils absents ≠ éditeur arrêté : prouver l'état par un appel de lecture (`list_toolsets`), pas par la liste d'outils. > - Jeu d'outils manquant : console `ModelContextProtocol.RefreshTools` ; s'il manque encore, le plugin du jeu d'outils > n'est pas activé dans `LifePlay.uproject` (on les active un par un, pas `AllToolsets`). > - « Failed to listen on port » : un autre processus tient 8000 (`Get-NetTCPConnection -LocalPort 8000`) ; plusieurs > éditeurs : vérifier lequel tient le port avant de conclure. > - Appels qui pendent : compilation (C++, shaders) ou chargement de niveau en cours → attendre, ne pas réessayer en > boucle ; PIE active → les outils d'édition (création d'asset) se comportent autrement : arrêter la PIE d'abord. Incertain, à tester en VAL : passer `RefreshTools` à l'éditeur headless (`-ExecCmds=` ou outil de console par MCP). **A3 — exemple** (description de `lp-mcp`, phrase ajoutée) : « Pas pour : un commandlet ou un script pythonscript éditeur fermé (`lp-commandlets`), une compilation (`lp-build`). » Paires à traiter : `lp-build`/`ue-cpp-build`, `lp-validate`/`sk-recount`/`debug-verification`, `lp-repo`/`sk-repo`, `lp-mcp`/`lp-commandlets`. R8 impose 3 scénarios par skill touché : les clauses changent le déclenchement. **A4 — texte proposé** (R13 de SK-ARBRE, reformulé d'après `unreal-skill` et `create-toolset`) : > Une ligne de skill n'entre que si l'agent ne peut pas la savoir ni l'apprendre par un outil ; une ligne qu'un lecteur > compétent déduirait du nom, de la signature ou du contexte se coupe. Avant remise : relire la seule description et > se demander si un agent saurait, d'après elle, quand activer le skill et quand ne pas l'activer. Écarté : leur règle « pas de nom d'outil » ; nos pièges d'appel exacts (`lp-mcp` § 3) sont voulus et datés. **A5 — texte proposé** (`lp-commandlets`, avant un nouveau script) : > API Python de l'éditeur : chercher (grep, jamais lecture entière) dans `Intermediate/PythonStub/unreal.py`, généré par > le mode développeur du plugin Python. Prérequis : le stub est **absent** aujourd'hui (établi). Il faut activer le mode développeur, un réglage par utilisateur (estimé : `[/Script/PythonScriptPlugin.PythonScriptPluginUserSettings] bDeveloperMode=True` dans `EditorPerProjectUserSettings.ini`), puis lancer l'éditeur une fois. Décision de l'utilisateur. ## 4. À garder pour plus tard (priorité B, utile sous condition) | # | Idée | Condition | |---|---|---| | B1 | Tests par MCP : `AutomationTestToolset` (`DiscoverTests` obligatoire d'abord, sinon résultats vides → `ListTests` → `RunTests` → `GetTestStatus` → `GetTestResults`) ; en ligne de commande, éditeur headless (≈ 30 s de démarrage) | Le projet n'a **aucun** test d'automatisation (`grep` de `IMPLEMENT_*_AUTOMATION_TEST` et `BEGIN_DEFINE_SPEC` : 0, établi). Sert si `LPTestStringCompat` devient un test d'automatisation (piste pour `lp-validate`). | | B2 | Jeu d'outils LifePlay en lecture dans `LifePlayEditorTools`, par exemple ce que `find_nodes` ne donne pas (noms d'événements et de macros, aujourd'hui par `LPDumpFunction -Pins -Exec`). Règles d'Epic à reprendre : méthodes statiques, types réels (pas de JSON dans une chaîne), succès = valeur et échec = erreur levée, doc minimale, un test par chemin de succès et par erreur. | Lot à part (IMPL C++). Compatible avec `lp-mcp` règle 9 : un jeu d'outils de plus dans `unreal-mcp`, pas un serveur de plus. Les règles iraient dans une annexe reformulée `lp-mcp/references/toolset.md` (R9, R4). | | B3 | Hook SessionStart **maison** (Python, ≤ 5 s) inspiré du leur, qui dit ce qu'une session ignore : port 8000 joignable ou non, `UeState` (éditeur, build), verrou du dépôt pris ou libre | R3 n'interdit que les hooks tiers. Coût de contexte à chaque session : à mesurer. | ## 5. Écarté (et pourquoi) - Recompiler par `LiveCodingToolset.CompileLiveCoding` : contraire à `lp-build` (`Tools/Build.ps1`, `lp-builder`, journal archivé). Live Coding laisse aussi des binaires patchés hors de la chaîne UBT. - « Sauvegarde avant et après », sauvegardes en masse : contraire à `lp-mcp-bp` (seuls les assets de la fiche) ; notre point de retour est `Snapshot.ps1`. - `describe_toolset` sans filtre : contraire à `lp-mcp` règle 6 (75-116 Ko). - « Modifie l'éditeur au lieu de demander à l'utilisateur » : contraire à la porte SPEC, BUILD-GO, instantané. - `ProgrammaticToolset.execute_tool_script` : Python arbitraire ; déjà refusé par la garde de `lp-mcp`, limité aux lectures groupées dans `lp-mcp-bp`. Rien à reprendre. - Agent Skills de l'éditeur (UAsset ou Python, `ListSkills` / `GetSkills` / `CreateSkill`) : servent l'agent intégré à l'éditeur, que nous n'utilisons pas. - Proxy `unreal_mcp_proxy` (session gardée pendant les relances, ce qui supprimerait le `/mcp` → Reconnect) : **absent** du moteur (`UE_5.8\Engine\Plugins\Experimental\ModelContextProtocol\` n'a pas d'`Extras/Proxy`, établi). À revoir à la prochaine version du moteur (R7). - Installation (`AllToolsets`, `bAutoStartServer`, `GenerateClientConfig`) : déjà en place (`EditorPerProjectUserSettings.ini` : port 8000, `/mcp`, `bAutoStartServer=True`, `bEnableToolSearch=True`). - Le hook bash d'Epic : remplacé, si l'utilisateur le veut, par B3. ## 6. Suite proposée 1. L'utilisateur choisit les idées retenues (A1-A5, B1-B3) : ce choix vaut SPEC. 2. Lot `UES1` (nom provisoire, charte doc 36 à vérifier) : réservation par Big Boss de `lp-mcp`, `lp-commandlets`, `lp-doc` et des descriptions touchées (addon 5.8, jonction), de `SK-ARBRE.md` et des deux agents MCP ; instantané ; scénarios R8 pour A3 ; `LICENSE` dans le dossier `lp-mcp`, comme pour `ue-cpp-build` (MIT, révision, « reformulé ») ; VAL ; CHG ; ticket au gardien. 3. Désactivation du plugin à tout moment : la copie de sauvegarde (§ 1) suffit au lot.