LifePlay-Revival/Docs/Migration/etat/OPT/OPT0/OPT0-A2b-FICHE.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

12 KiB

OPT0-A2b : inventaire Blueprint par MCP, méthode par lots de scripts (lecture seule)

Fiche OPT0-A2b — Niveau N1 — Modèle prévu sonnet | utilisé Sonnet 5.5 — Agent lp-mcp (garde de lecture v2 à v6) — Skills : sk-protocol, lp-mcp, sk-change-safety — Orchestratrice : session « Lower · OPT0-A2 ». Suite de OPT0-A2 (partielle, OPT0-A2-INV.md). Date de rédaction : 2026-10-15. Fiche préparée, non lancée. Copie UE : oui (éditeur headless). Ne pas lancer avant le message « GARDE-V2 ACTIVE » de Big Boss puis un BUILD-GO. Budget : 30 tours. Livrable : D:\Game\LifePlay-master 5.8\Docs\Migration\etat\OPT\OPT0\OPT0-A2b-INV.md (forme : OPT0-A2-INV.md).

1. Objet

Même objet que A2 : inventaire Blueprint de la copie 5.8, lecture seule.

  • nœuds dépréciés (lecture du graphe, sans compilation) ;
  • appelants des trois correctifs U9 (LPStringCompat, LPMeshCompat, LPNavigationHelpers) ;
  • Event Tick par classe ;
  • Delay et Get All Actors Of Class, et s'ils sont atteints depuis un tick (suivi des appels de fonctions entre graphes).

Sans verdict. La grille de décision est la fiche A3.

Changement de méthode par rapport à A2 : A2 lisait un appel par graphe et par motif (infaisable). A2b groupe les lectures dans un script par lot de 10 à 20 Blueprints, un script par lot, pour tenir dans 30 tours.

2. Entrées

  • OPT0-A2-FICHE.md (méthode initiale, périmètre), OPT0-A2-INV.md (§ 3 à 7 : constats partiels, outils et écarts relevés).
  • OPT0-A2-INV.md § 7 : list_graphs {blueprint:{refPath}} liste les graphes ; get_graph ne rend que le refPath ; AssetTools.find_assets {folder_path, name, asset_type:{refPath:"/Script/Engine.Blueprint"}} énumère ; les titres de nœuds sont localisés en français (ex. Ajouterunévénement|ÉvénementTick) ; get_connected_subgraph sur un gros graphe rend un fichier (212 Ko pour 180 nœuds) : le lire depuis le fichier, ne pas le recopier dans le contexte.
  • Skill lp-mcp § 1 (règles), § 3 (pièges d'appel), § 2 (panne du serveur).
  • Claims à vérifier, pas à reprendre : OBA-T5-EVAL (etat\OB\OBA\OBA-T5-EVAL.md) : 56 nœuds Blueprint pour LPMeshCompat, 6 pour LPNavigationHelpers.

3. Périmètre et interdits

  • Copie : D:\Game\LifePlay-master 5.8 (LifePlay.uproject), /Game seulement.
  • Lecture seule, garde v2. Seuls les outils de lecture ; dans ProgrammaticToolset.execute_tool_script, aucun mot d'écriture, aucun import, exec, getattr ni dunder ; chaque appel = outil de lecture avec nom littéral. Tout script qui écrit est refusé par la garde : arrêt et rapport.
  • Aucun create_node, connect_pins, break_pins, set_pin_value, delete_node, compile_blueprint, save_assets, PIE.
  • Aucune commande git qui écrit. Aucun asset sauvegardé. Un seul appel MCP à la fois.
  • hyper_capability_report et describe_toolset complets interdits (volume).
  • Un script par lot ; les scripts vont dans Saved\OPT0-A2b\ (jamais de heredoc ni de python -c).

4. Méthode

Consigne à l'agent (la fiche prime sur son fichier d'agent, qui dit encore « tout ProgrammaticToolset refusé ») : ProgrammaticToolset.execute_tool_script est autorisé, à condition que le script ne fasse que LIRE. Refusés par la garde v2 (profil, MD5 42470dd0) : mots d'écriture (create_, connect_, set_, delete_, add_, run_, execute_, save…, compile…), import, exec, eval, getattr, open, __. Chaque appel nom( doit être un outil de lecture (get_, find_, list_, read_, describe_, search_, load_asset), une fonction Python sûre (len, range, print, str, int, dict, list, sorted, enumerate, zip, min, max, sum, isinstance, append, items, keys, values, get, join, split, strip, lower, startswith, endswith, format, count) ou une fonction définie dans le script ; call_tool('Jeu', 'outil', …) avec nom d'outil littéral de lecture. Un refus de la garde se rapporte, il ne se contourne pas.

  1. Vérifier le message « GARDE-V3 ACTIVE » de Big Boss et le BUILD-GO. Sans les deux : ne rien lancer. Garde v3 : les outils de LECTURE de ProgrammaticToolset (get_execution_environment et tout get_ / list_ / describe_) sont admis ; type( est une fonction sûre ; import reste refusé. Étape 0 : commencer par get_execution_environment, dont le texte complet est enregistré dans Saved\OPT0-A2b\environnement.txt et cité au livrable. S'il exige un import pour appeler les outils, s'arrêter et rapporter la ligne exacte (Big Boss décide d'admettre ce seul module).

  2. Vérifier Tools\UeState.ps1 = 0, port 8000 libre. Lancer l'éditeur headless (lp-mcp § 2), -abslog=…\Saved\OPT0-A2b\OPT0-A2b.log ; Wait-HyperAIStudioMCP.ps1 lancé avec pwsh -File (pas bash).

  3. list_toolsets DIRECTEMENT, sans demander /mcp → Reconnect (règle de l'utilisateur, 2026-10-15 : unreal-mcp reste disponible dans la session ; reconnexion seulement à l'ouverture d'une nouvelle session). Ne demander la reconnexion que si list_toolsets échoue encore, l'éditeur étant prêt.

  4. Énumérer les Blueprints de /Game par AssetTools.find_assets ; écrire la liste complète (chemin, classe) dans Saved\OPT0-A2b\blueprints.txt. Le comptage de A2 (110, manuel) devient un comptage par script.

  5. Étape 0 : reconnaissance (≤ 6 tours), avant tout lot. (1) describe_toolset filtré sur ProgrammaticToolset (jamais le complet) : nom du paramètre du script, façon d'appeler les outils (appel direct ou call_tool), ce qui est rendu (valeur de retour, print, journal), limites. (2) Trois scripts témoins, lecture seule : (a) compter les Blueprints de /Game ; (b) rendre une liste longue (tous les chemins) pour mesurer la taille rendue et une éventuelle troncature ; (c) échouer exprès (outil de lecture sur un chemin inexistant) pour voir la forme de l'erreur. (3) Consigner ces faits dans le livrable, § « Retour de execute_tool_script » (établi). Contrat de retour de chaque lot, fixé d'après l'étape 0 : un seul objet JSON compact {"lot": n, "n_attendu": k, "n_lu": j, "items": [{"bp": refPath, "tick": bool, "delay_tick": n, "gaaoc_tick": n, "appels_u9": [...]}], "erreurs": [{"bp": refPath, "message": "…"}]}, agrégé dans le script (comptes et refPath, jamais les graphes entiers), sous le plafond mesuré à l'étape 0 (réduire la taille du lot sinon). L'agent enregistre chaque retour brut par Write dans Saved\OPT0-A2b\lot<n>.json, puis un script de lecture du lot (python -I, dans Saved\OPT0-A2b\) contrôle le contrat (champs présents, n_lu = n_attendu, erreurs vides) et fusionne en lots.csv. Lot non conforme = rejoué une fois plus petit, sinon signalé ; jamais compté comme fait.

  6. Règles de script (BUILD-FIN 3e relance, Big Boss, 2026-10-15) :

    • Pas de parenthèse après un mot-clé Python : while cond:, if cond:, not x, and, or (la garde v4 lit while ( comme un appel). Garde v5 (while (, if () : rédigée, active seulement après « GARDE-V5 ACTIVE ».
    • Pas de dict.get(clé, défaut) : d[k] if k in d else défaut.
    • Ne jamais lire tous les nœuds d'un Blueprint (un UserRaisedError de get_node_infos n'est pas attrapable et tue le script). Classer par find_nodes (titres anglais : « Tick », « Delay », « Get All Actors », « (UE4) »), puis confirmer par le dernier segment de type_id sur les seuls nœuds trouvés, par get_node_infos en paquets ≤ 20. Un graphe de plus de quelques milliers de nœuds ne se lit jamais sans filtre.
    • Un gros Blueprint (Person, GI) dans un script à lui seul ; un appel risqué par script au plus.
    • Dépréciés : « non mesurable en lecture seule » est un résultat.
    • Chemins contenant « Save » (/Game/BPs/Save, /Game/UI/SaveSlot, tout autre) : sortis des lots, listés au livrable comme « non lus : garde (faux positif sur le chemin) ». Sans contournement (pas de découpage du mot). Garde v6 possible sur décision de l'utilisateur ; si « GARDE-V6 ACTIVE » arrive, un mini-lot final pour ces Blueprints, éditeur ouvert.
    • Vérifier chaque lot contre la liste des 110 avant d'écrire (recompte). Un Blueprint lourd par script. Éditeur fermé après le dernier lot (UeState = 0), puis BUILD-FIN final.
    • blueprints.txt : régénéré par script dans le lot 0.
    • Éditeur : laissé ouvert jusqu'au dernier lot de la file (règle de l'utilisateur, 2026-10-15) ; son pid et le port 8000 dans le BUILD-FIN.
    • Ancienne consigne (2e relance, Big Boss) : chronométrage par t0 = time.perf_counter() (jamais time.time(), refusé par la garde). Chaque Blueprint DOIT être sous try: / except RuntimeError as e: / except Exception as e: (une erreur d'outil lève une exception qui tue tout le script). Contrat de retour complété : {"lot", "n_attendu", "n_lu", "items", "erreurs", "duree_s"}. blueprints.txt écrit à la main lors de la 2e relance : à régénérer par le témoin (b) rejoué dans le lot 0, ou recompté par script avant usage.
  7. Découper la liste en lots de 10 à 20 Blueprints (taille finale fixée par l'étape 0). Un script par lot, via ProgrammaticToolset.execute_tool_script : pour chaque Blueprint, list_graphs, puis find_nodes par motif (Event Tick / ReceiveTick, Delay, Get All Actors Of Class, appels aux trois correctifs U9), puis get_node_infos pour classer les nœuds ; le script rend le contrat JSON ci-dessus, pas le détail.

  8. Nœuds dépréciés : relever les nœuds dont la classe ou le titre est marqué obsolète par la sortie de get_node_infos. Si aucune sortie ne le marque, écrire « non mesurable en lecture seule » et dire quel indicateur manque.

  9. Appelants U9 : pour chaque nœud d'appel, compter par Blueprint et par graphe.

  10. Tick atteint : pour chaque Event Tick relevé, suivre le graphe jusqu'aux appels de fonctions vers d'autres graphes du même Blueprint ; relever Delay et Get All Actors Of Class atteints. Au-delà du Blueprint : non suivi, à dire.

  11. Un lot qui échoue (appel sans succès explicite, panne, script refusé par la garde) : arrêt du lot, rapport, les lots suivants ne sont pas lancés sans accord.

  12. Fermer l'éditeur (Stop-Process sur le pid, après confirmation qu'aucun écrit n'est en attente), puis Tools\UeState.ps1 = 0.

  13. Livrable, recompte par sk-recount (le total des lots doit égaler la liste de l'étape 4), puis BUILD-FIN.

5. Livrable (OPT0-A2b-INV.md)

  • § 0 Retour de execute_tool_script (établi) : taille rendue, troncature, forme de l'erreur, syntaxe retenue.
  • § 1 Périmètre : nombre de Blueprints (script), classes, chemin de la liste.
  • § 2 Lots : nombre de lots, Blueprints par lot, nombre de scripts et d'appels MCP, nombre d'échecs.
  • § 3 Nœuds dépréciés : tableau Blueprint, graphe, nœud, compte, ou « non mesurable » avec l'indicateur manquant.
  • § 4 Appelants U9 : trois lignes (correctif, Blueprint, graphe, nœuds), total comparé à 56 / 6 (OBA-T5-EVAL).
  • § 5 Event Tick par classe : tableau et total.
  • § 6 Delay et Get All Actors Of Class : tableau, avec « atteint depuis un tick : oui / non / non suivi ».
  • § 7 Écarts avec la fiche et avec A2.
  • § 8 Journal de l'éditeur, UeState après arrêt, git status --short de tout l'arbre, MD5 de référence.
  • § 9 Fin. Aucun verdict. Ligne PubCheck : 0 constat(s).

6. Critères d'arrêt

  • Erreur de protocole, appel sans succès explicite, panne du serveur, script refusé par la garde : arrêt, rapport à Big Boss.
  • Un écrit MCP, même accidentel : arrêt immédiat, rapport, pas de correction.
  • Un processus Unreal d'une autre session sur la copie : arrêt, rapport (boss.md § 2).
  • Dépassement de 30 tours : arrêt au lot en cours, état de reprise écrit dans le livrable.

7. Compte rendu

[OPT0-A2→BOSS] OPT0-A2b FIN-FICHE D:\Game\LifePlay-master 5.8\Docs\Migration\etat\OPT\OPT0\OPT0-A2b-INV.md.

2b. Agent et skills

  • Agent : lp-mcp (sonnet). Skills : lp-mcp, sk-protocol, sk-recount.
  • L'orchestratrice recompte le livrable avant de le déclarer fini. Elle ne lance pas l'éditeur sans BUILD-GO.