Mise à jour 2.207
02/08/2026
v2.207.0.0BETAMINOR
Seymour1 août 2026
F5-L4 : panneau de script ATEL de haut niveau dans le Monster AI Editor (dry-run avec diff)
MonsterAiEditor_DataModel.AtelScriptLab.cs(nouveau partial) : observablesAtelScriptText/AtelScriptResult/AtelScriptDiffSummary/AtelScriptDiffLines+CompileAtelDryRun()— parse/compile le script contre le monstre SÉLECTIONNÉ (AiAutomation.PickCombatWorker/PickMainEntrypoint) et montre le diff (AiScript_Diff.Compare, Added/Modified/Removed). Dry-run : rien n'est sauvegardé (la sauvegarde reste sur les canaux existants de l'éditeur). Erreurs actionnables (syntaxe/émission).MonsterAiAtelScriptLab_Window.axaml+.cs(nouveaux) : fenêtre avec éditeur de script (Consolas), bouton « Compile (dry-run) », résumé + ListBox de diff. Bouton « Script ATEL (F5) » ajouté à la barre d'outils deMonsterAiEditor_Control.- Baseline : 332/332 PASS (329 + 3 d'une autre voie). ### MINOR ### MINOR
v2.206.0.0
v2.207.0.1BETAREVISION
Seymour1 août 2026
F6 : cross-validation des structs battle/save (fahrenheit PS2 × nos offsets HD)
docs/reverse/PPP_FAHRENHEIT_STRUCTS_CROSSREF_F6_2026-08-01.md: inventaire fahrenheit (ChrRam PS2 0x1EC avec stats @0x68–0x77 et équip @0x52/0x53 ; CtbEntry 4B + CtbBaseData tick_speed ; save_impl/ply_save) vs les nôtres (MemoryChr HD avec pointeurs de script +0xF78.., FfxSaveSphereGrid avec garde de bornes, file CTB HD décompilée). Verdict honnête : PS2 ≠ HD (le MemoryChr HD inclut la couche script/VM ; la PS2 exécute du MIPS) — les stats PS2 sont des candidats de validation champ par champ contre l'agrégateur HD (0x7B2DD0) ; CtbBaseData est une référence de sémantique pour la file CTB ; rien de promu sans preuve HD. Lecture seule — baseline 332/332 intacte. ### RÉVISION ### MINOR
v2.207.0.0
v2.207.0.2BETAREVISION
Seymour1 août 2026
F7 : cross-validation des codecs ATEL (fahrenheit ↔ les nôtres) — 3/3 validés
docs/reverse/PPP_FAHRENHEIT_CODEC_CROSSVALIDATION_F7_2026-08-01.md: F7-A notre syntaxe → leur parser (var x = 0;accepté ; leur bug de lexer EOF documenté — crash sur newline finale, lexer.cs:74) ; F7-B notre AiFile généré (324 instructions via AtelLangLab) → walk avec leur règle de fetch (bit 0x80 = opérande) : fermé exactement, 0 opcode hors de leur énum AtelOp ; F7-C notre KnownOpcode (49) ⊆ leur énum (123) : 0 manquant. Limites : leur compilateur n'émet PAS d'octets (AtelAssembler jamais appelé) ; la validation couvre dialecte/fetch/table, pas le layout complet du worker. Conclusion : les deux codecs parlent le même dialecte — notre sémantique corrigée (v2.198.4.1) est la vérité exécutable. Lecture seule — baseline 332/332 intacte. ### RÉVISION ### RÉVISION
v2.207.0.1
v2.207.0.2BETAREVISION
Seymour1 août 2026
Opération Demonio session 2 : inventaire complet du nouveau F8 (InGameMenu de FfxHooksDll)
docs/reverse/F8_UNX_INCONSISTENCY_REGISTER_2026-08-01.md(+45 lignes) : le nouveau F8 = notre standard téléphonique de plugins d'écosystème (re-implémentation d'UnX par-dessus notre couche de hooks). Architecture mappée dans dllmain.cpp : porteingame_menu.flag/FFXHOOKS_ENABLE_INGAME_MENU/Aurora config ; infra = overlay AuroraD3D11 (Present vtable[8]) ; entrée = GetAsyncKeyState (poll sur Present) + sous-classe WndProc (WM_KEYDOWN/SYSKEYDOWN, debounce 90/150ms) — pas de DirectInput, zéro conflit avec la sonde (contraste avec l'UnX hérité qui crashait sur GetDeviceState) ; lignes 0-2 = labels/détail/refresh Aurora, 3+ = plugins (Running/Disk-on/Disk-off/Absent) ; toggle de plugin EN LECTURE SEULE (staging via l'éditeur ; déchargement live bloqué) ; refresh 1,5s ; dessin GDI pur sur memDC.- Verdict : le nouveau F8 n'écrit PAS dans la mémoire du jeu (zéro écriture — pas de patch Btl.battle_trigger/HP/.text de l'UnX hérité) — les classes offset/ABI/corruption-de-sauvegarde ne s'appliquent pas. Risques R-ING-01..05 (faibles) : GetAsyncKeyState par frame sur Present ; sous-classe WndProc vs overlays tiers (DiscordHook/SpecialK) ; F8/INSERT toujours consommés ; I/O de refresh 1,5s ; R-ING-05 (RT2 en attente) : Present vtable[8] = même cible que le SK_BeginBufferSwap d'UnX — coexistence non testée. Porte de softlock connue déjà documentée dans le code : field_scout* x native_menu = titl00. Aucun changement de comportement — baseline intacte.
v2.207.0.1
v2.207.0.3BETAREVISION
Seymour1 août 2026
RÈGLE D'OR IDA : tables de call-targets ATEL vérifiées sur la base canonique + commentaires de cross-ref + correctif du doc F2
- Vérification (pas de nom sans preuve) : les adresses fahrenheit (0x850050 Common, 0x842618 Battle...) appartiennent au binaire PS2 — la recherche sur la base canonique montrait des noms vides + des dwords non-pointeurs → PAS renommées sur HD. Les vraies tables HD sont déjà nommées :
AtelCallTargetsCommon@0xC50050,AtelCallTargetsBattle@0xC42618,AtelCallTargets@0x1328518(le nommage fahrenheit déjà appliqué par une autre voie — valide la nomenclature, pas les adresses). - Commentaires de cross-ref appliqués sur les 3 tables HD (struct 16B +0 init/+4 exec/+8 ret_float/+0xC ret_int ; réfs PS2 avec comptes) — RÈGLE D'OR remplie.
docs/reverse/PPP_FAHRENHEIT_ATEL_IMPORT_2026-08-01.mdcorrigé avec la note de vérification (adresses PS2 = référence de l'autre binaire, pas des cibles de rename HD). Baseline 332/332 intacte. ### RÉVISION ### RÉVISION
v2.207.0.2
v2.207.0.4BETAREVISION
Seymour1 août 2026
F6.1 : vérification champ par champ des stats PS2×HD sur l'agrégateur (0x7B2DD0) + commentaire IDA
- Décompile de
FFX_Battle_PoolActorByTargetType_structural(0x7B2DD0) — dispatcher READ/WRITE avec 346 cas de propriétés d'acteur. Les cas 0x0A–0x13 accumulent 8 octets àpad_0764[331..337/348](régionFFXBattleActorRecordHD +0x79B..) = bloc candidat de 8 stats (strength/defense/magic/magic_defense/agility/luck/evasion/accuracy). - Confirmé : les offsets PS2 (ChrRam +0x68..0x77) ne correspondent PAS au HD (le record HD est bien plus grand ; le dispatcher indexe par ID DE CAS, pas par offset).
- RÈGLE D'OR : commentaire de cross-ref appliqué au cas 0x0A (0x7B2F9D) sur la base canonique.
PPP_FAHRENHEIT_STRUCTS_CROSSREF_F6mis à jour (§4b). En attente : épingler l'ordre des 8 stats (noms de cas — travail futur). Baseline 332/332 intacte. ### RÉVISION ### RÉVISION
v2.207.0.3
v2.207.0.5BETAREVISION
Seymour1 août 2026
F6.2 : carte de cas COMPLÈTE du dispatcher 0x7B2DD0 + correction de F6.1
- Correction de la livraison précédente : le vrai bloc candidat des 8 stats est 338..345 (cas 0x12C–0x135, 8 octets contigus) — pas « 331..337/348 » (7B + 1B d'un autre bloc).
- Vraie sémantique de fonction : MOYENNE de la propriété par type de cible (
total /= counterà la fin), pas une somme brute de stats. - Carte complète cas→offset documentée (14 blocs : 331..337, 338..345, 346–351, 380–383, 426–434, 436–438, 483–508, 606–643, 674, 698/699, 82–93, 158–176, 326...) dans le doc F6 §4b.
- RÈGLE D'OR : commentaires IDA appliqués (fonction 0x7B2DD0 + cas 0x0A 0x7B2F9D). ⚠️ MCP 13337 occupé/sauvegarde après
set_func_cmt— vérifier post-save ; réappliquerwork/_ida_set_comments.pysi besoin. - Baseline 332/332 intacte. ### RÉVISION ### RÉVISION
v2.207.0.4
v2.207.0.6BETAREVISION
Seymour1 août 2026
Plan de réconciliation F7/F8 (passation à la voie Jarvis-HOOK)
docs/reverse/F7F8_RECONCILIATION_PLAN_2026-08-01.md(nouveau, ~250 lignes) : consolidation finale des constats d'Opération Demonio pour la voie de hooks. P1 (prouvé) : le nouveau F8 (dashboard, 56 lignes, UnX/ProjectX) a été retiré de dllmain au commit53d82b2a(07/27) et le build actif 09:05 n'a pas de dashboard — F8 est retombé sur le standard InGameMenu (hérité) ; source récupérable (blobsc66aa478/a14f8732/76887427/d9516135+ buildsRT2OFF/pre_magic_ppp_trace+ .obj). P2-P8 : contention de clé F7 (NativeMenu x LabMenu) et F8 (dashboard x InGameMenu), portes dupliquées (ingame_menu_v2.flag), porte field_scout x native_menu à vérifier, ffx-hooks.ini manquant dans le dossier du jeu, ordre du détour Present vtable[8]. Carte de récupération en 6 étapes (git show + 11 blocs de diff + vcxproj + config + build lab + portes), architecture cible avec propriétaire de clé unique (F7=NativeMenu RAM intact ; F8=dashboard ; InGameMenu=repli), parité UnX classifiée (porter les cheats/skip de dialogue/langue via des hooks propres ; JAMAIS de patches .text codés en dur 0x392930/0x30B040/Btl.battle_trigger/thread Sleep-5s), 4 vagues avec portes (RT2 sur _isolated, baseline 283/283). Aucun changement de comportement — baseline intacte.
v2.207.0.5
v2.207.0.7BETAREVISION
Seymour1 août 2026
Connaissance externe de la Sphere Grid cross-vérifiée (Discord fahrenheit-crew + FFXRando) + 2 tests de régression d'ancres
docs/reverse/SPHERE_GRID_EXTERNAL_KNOWLEDGE_2026-08-01.md(nouveau) : fil Discord (Titan/Dragoon/peppy) cross-vérifié avec notre RE : (1) Anchor idx = le nœud de contrôle de courbe du lien (notreAnchorNode;Validate()attrape l'OOB ;RemoveNodecorrige les ancres — un lien ancré sur le nœud retiré devient droit 0xFFFF) ; (2) LOCK 3 = contenu 0x00 est le défaut du jeu quand il ne trouve pas le nœud (sgelems.cs L215) — notre flux ne l'émet jamais (EmptyContent=0xFF + picker validé) ; (3) cohérence en-tête↔structs (Dragoon) = ce que notre WriteLayout/Validate garantit déjà ; (4) les limites sont par grille (peppy « per-grid ») = confirme notre RE (LpAbilityMapEngine statique 1024/1024/128 par grille) ; (5) FFXRando (nyterage/FFXRando, MIT, C++) :SphereGridRandomizer.cppmélange le CONTENU seulement (topologie/comptes préservés ; NODE_NULL=skip) — valide la directive Safe Transplant (édition de contenu = sûre ; nouvelle topologie = risque, gardée par DeployPolicy).- 2 nouveaux tests dans
SphereGridAddNodeReproTests.cs(4/4 PASS sur la zone) :RemoveNode_WithAnchorLinks_KeepsGraphValid(le Standard vanilla a 411 liens courbes ; retirer le nœud d'ancre garde la grille valide, pas d'ancres orphelines, round-trip OK) +Validate_CatchesOutOfRangeAnchor. Aucun changement de comportement produit. ### RÉVISION
v2.207.0.6
v2.207.0.8BETAREVISION
Seymour1 août 2026
Audit d'écriture de l'éditeur Sphere Grid formalisé (« le secret pour ne pas exploser »)
docs/reverse/SPHERE_GRID_EDITOR_WRITE_AUDIT_2026-08-01.md(nouveau) : réponse OUI à « notre éditeur fait-il exactement la chose sûre ? » — map opération→octets (drag = pos + Unknown6 recalculé ; contenu = 1 octet dans dat1X + RedundantContent ; cluster ; add/remove node/link avec réindexation complète ; re-pointage de lien) et les 7 invariants imposés parValidate()avant TOUTE écriture : (1) comptes d'en-tête == vraies tailles de tables ; (2) Unknown6 == bucket spatial ; (3) RedundantContent == contenu ; (4) cluster < clusterCount ; (5) Node1/Node2 < nodeCount ; (6) AnchorNode 0xFFFF ou < nodeCount ; (7) contenu dans la plage (0xFF=vide). Chemin d'écriture unique : UI → builder → Build() (throw si invalide) → WriteLayout → projet ; rien n'est écrit non validé. Safe Transplant = local aux octets (comptes préservés) = zone sûre prouvée ; nouvelle topologie = gardée par DeployPolicy jusqu'au RT2 propre. Risques résiduels : SphereGridAdapter écrit sphere.bin (autre fichier), PanelGrowWriter étend panel.bin. Aucun changement de comportement. ### RÉVISION
v2.207.0.7
v2.207.1.0BETAPATCH
Seymour2 août 2026
F7 In-Live v2 : DIFF multi-colonnes (préréglés + BASE + AUTO + WEAK + RESIST + ABSORB multi-sélection), saisie numérique, HP jusqu'à 10x, Musique avec Preview/vrais noms/Save/Reset, correctif d'écran noir, LabMenu → F6
- DIFF redessiné (multi-colonnes) : les préréglés sont devenus des chips proéminents en haut (Off/Hunter/Sombra de Sin/Cauchemar absolu) ; colonnes côte à côte BASE STATUS (HP..LCK — 9 stats, ACC/EVA/LCK désormais éditables aussi) / AUTO STATUS (25 statuts, cases multi-sélection) / WEAK / RESIST / ABSORB (5 éléments chacun, multi-sélection) ; colonne ACTIONS (Apply Now/Save/Back) ; L/R navigue les colonnes et U/D les lignes ; plage HP jusqu'à 10x (100..10000) et stats jusqu'à 5x (100..5000).
- Saisie numérique : Confirm sur une stat BASE ouvre le mode édition — tapez 0-9, Backspace, Confirm applique (clampé), Esc annule (devient « custom »).
- Musique : nouvelles lignes Preview (joue la piste Music Lock via l'override+S SOUNDCMD prouvé par lab), Save (persiste f7_inlive.json) et Reset (retour au défaut : pas de lock/battle/randomizer/fade) ; confirmer sur « Music Lock »/« Battle Entry » prévisualise aussi ; vrais noms pour les 181 pistes (F7TrackName délègue désormais au crosswalk
LabMusicRuntimeName: « Battle Theme », « Thunder Plain », « Crisis »...). - Correctif d'écran noir : le retour sous-menu→hub utilise désormais le chemin de pump (
g_nativeWantSpawn) au lieu d'unSpawnMenu()direct ;F7_DifficultyApplyNowa gagné une validation de liste d'ennemis (vérification de plage) +__try/__except— ne tue jamais le pump sur un contexte invalide (logs SEM-LISTA/LISTA-INVALIDA/EXCECAO). - LabMenu hérité déplacé en F6 (était F7/F8 selon InGameMenu) — F7 est désormais exclusif à FFX Editor In-Live ; F8 est l'InGameMenu (standard de plugins).
- Nouvelles API F7InLive :
F7_MusicPreview(track),F7_ResetMusic(),F7_StatusName(i)+ getterGetArenaBattleMusicSoundCmdFn()dans MusicHook. - Build
-WithPolyHook -ReleasePASS ; LabDeploy vers Steam ; RT2Needs Testing(colonnes DIFF, édition numérique, preview audible, Apply en bataille). ### RÉVISION
v2.207.0.8
v2.207.2.0BETAPATCH
Seymour1 août 2026
Éditeur Sphere Grid : retrait de ce qui n'a plus de sens au vu des nouvelles vérités (code v5 mort) + passation de gel pour la voie Jarvis-HOOK
- Retiré de l'éditeur :
SaveSquareToProject()(code mort — a perdu son seul appelant dans le nettoyage SUPERMD ;SaveToProjectavec re-baseline le couvre déjà) + repli de chemin dev mortwork/nul_ward_pack/command.bindansResolveCommandBinPath(le fichier n'existe pas ; le corpus le couvre). La zone de l'éditeur Sphere Grid est désormais 100 % sans concepts v5 (hook/manifeste/sidecar/square). docs/ai/HANDOFF_JARVIS-HOOK_SPHEREGRID_V5_FREEZE_2026-08-01.md(nouveau) : instruction pour la voie Jarvis-HOOK de geler la pile v5 (SphereGridFullGridCompilerHook.{cpp,h}+SphereGridTrueNewNodeHook.{cpp,h}→legacy/) sans casser la fabrique des autres hooks ; points de contact dllmain (includes L49-50, externs L97-98, Enabled L870-876, installs 11900-11931, removes 12168-12169) ; critère RT2 (pass → supprimer ; fail → lab isolé) ; ffx-probe.dll n'est PAS un hook (garder).- Validation : build Release 0 erreurs ; tests SphereGrid 4/4 PASS (avec ancres). Baseline de zone intacte.
v2.207.1.0
v2.207.2.1BETAREVISION
Seymour2 août 2026
Fermeture de la voie Sphere Grid (passation + PORT_STATUS)
docs/ai/SESSION_HANDOFF.md: passation de fermeture de voie — les 5 commits de la session (nettoyage SUPERMD, bits sphere.bin PROUVÉS, forensics de crash, audit d'écriture 7 invariants, retrait du code mort v5) + état (éditeur 100 % sans v5, jeu prêt pour le RT2 propre) + éléments en attente (RT2 propre humain, smoke UI, gel de la pile v5 sur la voie Jarvis-HOOK) + prochaine étape sûre.PORT_STATUS.md: mise à jour de fermeture — statut de zone consolidé ; RT2 propreNeeds Testing. ### PATCH
v2.207.2.0
v2.207.3.0BETAPATCH
Seymour2 août 2026
Correctifs F7 In-Live : mise en page AUTO (25 statuts visibles), Force basé sur les ticks (sans Morphée), porte RT0 hors ligne
- Correctif de layout : colonne AUTO STATUS avec rowH 0.020 — les 25 statuts tiennent désormais à l'écran (Booster/Somni étaient rognés).
- Correctif Force :
F7_ForceLastBattleplanifie désormais par ticks (g_forceRepeatLeft+ ~10 frames entre les forces, traité dansF7_TickMainThread) — leSleep(120)sur le thread principal (bégaiement ~1s avec repeat 9) a disparu. - Porte RT0 hors ligne :
RuntimeTools/FfxHooksDll/f7_config_rt0.ps1— valide le contratf7_inlive.json(24 clés, plages clampées, masques statut/élément, round-trip clé-valeur) sans lancer le jeu. PASS. - Build PASS + LabDeploy vers Steam (avec le 2.207.4.0). ### RÉVISION
v2.207.2.1
v2.207.4.0BETAPATCH
Seymour2 août 2026
Pile de hooks Sphere Grid v5 GELÉE (héritée)
- Gel exécuté (passation
HANDOFF_JARVIS-HOOK_SPHEREGRID_V5_FREEZE_2026-08-01.md) : les 4 fichiers de la pile v5 (SphereGridFullGridCompilerHook.{cpp,h}+SphereGridTrueNewNodeHook.{cpp,h}) déplacés versRuntimeTools/FfxHooksDll/legacy/spheregrid_v5/;dllmain.cppnettoyé (includes, externs,Enabled(), installs, removes, appels du fault-handler) — zéro référence restante ;vcxproj+build_hooks.ps1nettoyés. Le suspect n°1 du crash0xc0000374(08-01, hooks actifs + grille propre) sorti du build. - VEH global de faute désormais toujours armé (
FaultProbe VEH armed (global fault diagnosis)) — diagnostics de crash conservés, indépendants du hook SG. - Critère RT2 conservé : RT2 propre (sauvegarde jetable, comptes+1) PASS → supprimer
legacy/spheregrid_v5/+ les drapeauxsg_*+ le manifeste ; FAIL → retour en lab isolé (FFXHOOKS_SG_861_LAB_OVERRIDE). - Build
-WithPolyHook -ReleasePASS ; LabDeploy vers Steam. ### PATCH
v2.207.3.0
v2.207.5.0BETAPATCH
Seymour2 août 2026
Correctif de l'écran noir du sous-menu DIFF : O_COUNT >0 fictif sur l'objet du menu natif
- Cause racine (mon bug v2.207.1.0) : le DIFF multi-colonnes pose
g_f7RowCount = 0(pas de lignes 1D) etF7Sub_SpawnMenuécrivaitO_COUNT = 0sur l'objet du menu natif — le tick de dessin du jeu voyait le compte 0 et n'appelait jamais notre draw → sous-menu « ouvert » mais invisible → écran noir (porte forcée sans rendu 3D et sans menu) → seul F7 (force close) revenait au jeu. - Correctif :
O_COUNT = g_f7RowCount > 0 ? g_f7RowCount : 8au spawn (faux compte 8 pour DIFF — notre draw/input multi-colonnes n'utilise pas O_COUNT). - Bonus (diagnostics de log) : le VEH global a capturé 2 vrais AV au boot (
FAULT AV READ pc=0x796B11D7/0x796B3908 accessed=0x10CDCDCD— tas libéré ; module 0x796B = probablement fmodex appelant un callback FFX à la rva 0x291488) — suspect n°1 du crash-idle de l'utilisateur (« le jeu se ferme au hasard en idle ») ; investiguer0x291488dans IDA à la prochaine ronde. - Build PASS + LabDeploy vers Steam (15:32→v4). ### PATCH
v2.207.4.0
v2.207.6.0BETAPATCH
Seymour2 août 2026
F7 DIFF : navigation spatiale 2D réelle (préréglages avec L/R, Bas vers BASE, Haut sur la ligne 0 pour revenir) + édition numérique depuis zéro + puce Custom
- Navigation corrigée (carte mentale de l'utilisateur) : les PRÉRÉGLÉS naviguent désormais avec L/R (chips horizontales) et Down va vers la colonne BASE ; sur les colonnes de données, L/R change de colonne et U/D déplace les lignes ; Up sur la ligne 0 de BASE revient aux préréglés. Avant : L/R changeait de colonne même sur les préréglés (il fallait aller de côté pour « descendre »).
- Édition numérique corrigée : entre avec le champ mis à zéro (tapez la NOUVELLE valeur de zéro — avant, elle s'accumulait sur la valeur actuelle : taper '0' devenait 10000/max) ; pas de chiffres + Confirm = garde l'actuel ; placeholder
>> value _montre l'actuel jusqu'à la frappe ; pied de page contextuel (« type 0-9 / Backspace / X apply / Esc cancel »). - Chip « Custom » (5e) : visible et navigable — devient ACTIVE à tout réglage manuel (toggle/edit) (avant : aucun chip allumé = déroutant). La sélectionner garde les valeurs actuelles. Off (vals[0]=0) = désactivé ; custom (4) = activé au commit.
- Build PASS + LabDeploy vers Steam. ### PATCH
v2.207.5.0