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 Tickpar classe ;DelayetGet 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_graphne 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_subgraphsur 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 pourLPMeshCompat, 6 pourLPNavigationHelpers.
3. Périmètre et interdits
- Copie :
D:\Game\LifePlay-master 5.8(LifePlay.uproject),/Gameseulement. - Lecture seule, garde v2. Seuls les outils de lecture ; dans
ProgrammaticToolset.execute_tool_script, aucun mot d'écriture, aucunimport,exec,getattrni 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_reportetdescribe_toolsetcomplets interdits (volume).- Un script par lot ; les scripts vont dans
Saved\OPT0-A2b\(jamais de heredoc ni depython -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.
-
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 deProgrammaticToolset(get_execution_environmentet toutget_/list_/describe_) sont admis ;type(est une fonction sûre ;importreste refusé. Étape 0 : commencer parget_execution_environment, dont le texte complet est enregistré dansSaved\OPT0-A2b\environnement.txtet cité au livrable. S'il exige unimportpour appeler les outils, s'arrêter et rapporter la ligne exacte (Big Boss décide d'admettre ce seul module). -
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.ps1lancé avecpwsh -File(pas bash). -
list_toolsetsDIRECTEMENT, sans demander/mcp→ Reconnect (règle de l'utilisateur, 2026-10-15 :unreal-mcpreste disponible dans la session ; reconnexion seulement à l'ouverture d'une nouvelle session). Ne demander la reconnexion que silist_toolsetséchoue encore, l'éditeur étant prêt. -
Énumérer les Blueprints de
/GameparAssetTools.find_assets; écrire la liste complète (chemin, classe) dansSaved\OPT0-A2b\blueprints.txt. Le comptage de A2 (110, manuel) devient un comptage par script. -
Étape 0 : reconnaissance (≤ 6 tours), avant tout lot. (1)
describe_toolsetfiltré surProgrammaticToolset(jamais le complet) : nom du paramètre du script, façon d'appeler les outils (appel direct oucall_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 parWritedansSaved\OPT0-A2b\lot<n>.json, puis un script de lecture du lot (python -I, dansSaved\OPT0-A2b\) contrôle le contrat (champs présents,n_lu = n_attendu,erreursvides) et fusionne enlots.csv. Lot non conforme = rejoué une fois plus petit, sinon signalé ; jamais compté comme fait. -
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 litwhile (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
UserRaisedErrordeget_node_infosn'est pas attrapable et tue le script). Classer parfind_nodes(titres anglais : « Tick », « Delay », « Get All Actors », « (UE4) »), puis confirmer par le dernier segment detype_idsur les seuls nœuds trouvés, parget_node_infosen 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()(jamaistime.time(), refusé par la garde). Chaque Blueprint DOIT être soustry:/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.
- Pas de parenthèse après un mot-clé Python :
-
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, puisfind_nodespar motif (Event Tick/ReceiveTick,Delay,Get All Actors Of Class, appels aux trois correctifs U9), puisget_node_infospour classer les nœuds ; le script rend le contrat JSON ci-dessus, pas le détail. -
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. -
Appelants U9 : pour chaque nœud d'appel, compter par Blueprint et par graphe.
-
Tick atteint : pour chaque
Event Tickrelevé, suivre le graphe jusqu'aux appels de fonctions vers d'autres graphes du même Blueprint ; releverDelayetGet All Actors Of Classatteints. Au-delà du Blueprint : non suivi, à dire. -
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.
-
Fermer l'éditeur (
Stop-Processsur le pid, après confirmation qu'aucun écrit n'est en attente), puisTools\UeState.ps1= 0. -
Livrable, recompte par
sk-recount(le total des lots doit égaler la liste de l'étape 4), puisBUILD-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 Tickpar classe : tableau et total. - § 6
DelayetGet 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 --shortde 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.