Mise à jour 2.198
01/08/2026
v2.198.0.0BETAMINOR
Seymour31 juil. 2026
P3-L2 : `GameEnvironmentProbe` (vérification de santé de l'environnement runtime)
Core/GameEnvironmentProbe.cs(nouveau, 10 tests) : détecteur de version / vérification de santé de l'environnement runtime — remplit le contrat P3 (prompt L410-416 : détecteur · contrat install/config/permission/path · repli · erreur actionnable sans stack trace brut · matrice de compatibilité). Détecte :FFX.exe(version FileVersionInfo + région viadata\jppc/intl/us/eu),modules\ffx-probe.dll+modules\FfxHooksDll.dll, drapeaux actifs (config\*.flaget racine), sonde live viaFfxProbe_Service(MMFLocal\FFXProbeBlock_v1— IsAttached/IsHooked/Heartbeat, lecture seule, rien d'armé). Découverte de la racine du jeu : envFFX_GAME_ROOT→ registre Steam →libraryfolders.vdf(parse unescape, testable) → candidats communs. Résultat typéGameEnvironmentReport(État Ok/Warning/Error +EnvironmentIssueCode/Message/ActionableMessage) — l'UI montre un état typé, jamais une stack trace brute.- Baseline : 233/233 PASS (223 + 10 nouveaux). ### RÉVISION ### RÉVISION
v2.197.1.1
v2.198.1.0BETAPATCH
Seymour31 juil. 2026
P3-L3 : durcissement de la plateforme d'opérations (annulation/retour arrière/journal/verrouillage/caviardage) + suite de résilience (12 tests)
Core/OperationExecutorV2.cs(durcissement) :ExecuteAsync(plan, CancellationToken)avec checkpoints (avant stage, entre les ops, avant promote, pendant promote) et propagation dansStageAsync; rollback automatique au promote (échec/cancel restaure les sorties déjà promues depuis les backups, ou supprime les sorties créées par ce promote) ; journal.json dans BackupRoot (états promoting/success/cancelled/failed — contrat de récupération, best-effort ne fait jamais échouer l'op) ; lock statique sérialisant le promote (contrat de concurrence — 2 ops sur la même sortie ne s'entrelacent jamais) ; rédaction (LlmRedactor) dans ErrorMessage/RecoveryInstructions/journal (un secret n'apparaît jamais sur les surfaces d'échec).FFXProjectEditor.Tests/Core/OperationResilienceTests.cs(nouveau, 12 tests) : cancel avant stage / pendant stage (l'adaptateur observe le token) → rien d'écrit ; échec de promote injecté → rollback de la sortie déjà promue (hash d'origine restauré) ; journal failed/success + backup .bak avec les octets d'origine ; concurrence (2 exécutions parallèles même sortie → résultat intact, un seul gagnant complet) ; secret rédigé des messages d'échec ; plan vide → « No operations » ; diff interdit (EditSession.Build rejette un champ hors allowlist) ; round-trip JSON d'OperationPlan ; reçu d'échec cohérent (FilesWritten=0).- Baseline : 245/245 PASS (233 + 12 nouveaux). ### MINOR ### MINOR
v2.198.0.0
v2.198.2.0BETAPATCH
Seymour31 juil. 2026
Durcissement de FfxSaveSphereGrid (garde de bornes + vérité native) + import de la table des symboles Ghidra/Fahrenheit dans la base canonique (8,281 renommages)
FfxLib/Save/FfxSaveSphereGrid.cs(correctif) :FfxSaveSphereGridNodeSnapshot.Read/Write/ReadActivation/WriteActivationgardent désormaisNodeIndex(0..859 dans le modèle hérité FFXED) avecArgumentOutOfRangeExceptionactionnable — corrige une écriture OOB latente dans le buffer de sauvegarde ; nouvelles constantesNativeTableBase(=8684) etNativeMaxNodeIndex(=1279) exposent la capacité de sauvegarde native ; les docs XML clarifient le décalage +64 vsFfxSaveSphereGridRuntimeTableet que 860 n'est PAS la limite du moteur.FfxLib/Save/FfxSaveSphereGridRuntimeTable.cs(doc) : cross-confirmé par la table de symboles Fahrenheit/Ghidra —eiAbmDataInit(SaveSphereGrid*)@ 0xA53DE0 etMsGetSaveAbilityMap() → SaveSphereGrid*@ 0x785000 prouvent que le bloc d'état est un vrai type moteur ; capacité native 1280 nœuds / 1280 liens / curseur.FfxLib/Save/FfxSaveBatchActions.cs(doc) :ImportSphereGridRegiondocumenté comme modèle hérité +64 ; le chemin natif signalé (span 8684..13579) pour les grilles >860.- RE — import de la table de symboles Fahrenheit-crew/fahrenheit (Ghidra) : 7 609 fonctions + 672 globaux renommés sur la base
ffxoficial.exe.i64(8 281 au total ; sources USER_DEFINED 460 + IMPORTED 2 816 + ANALYSIS filtrés 7 570 ; n'écrase jamais les nomsFFX_*du projet — 3 774 préservés) ; les globaux ont reçu des types primitifs ; backupbackups_ffxoficial\ffxoficial.exe.before_ghidra_renames_20260731_231338.i64. Propagé vers la base de travail de l'équipeffxoficial_COPY.i64via le plugin ida-pro-mcp RPC dans la GUI (port 13338) : 7 440 fonctions + 490 globaux appliqués sur la COPY, 17 sautés (noms GUI préservés), base sauvegardée ; backupffxoficial_COPY.before_ghidra_renames_20260731_233813.i64. Découvertes : structLpAbilityMapEngine(0x12FC0 ; clusters[128]/nodes[1024]/links[1024] — layout complet dans le doc), buffer.datastatique0x16AD870(InitLpamng @ A572E0), 12 fonctions avec une boucle1024mappées (RenderPathNodes A50290, eiAbmCalc A53570, eiAbmParaGet A54860, ClearNodeTransforms A57120, ReadAndProcessInputState A57520, BuildLinkBatchSegment A57710, UpdatePlacementSlotTransform A58080, DialogDispatch A583E0, InitPlacementGrid A5B230, +3), rendu 861 (681DB0/7F4900), noms originauxeiAbm*/+AbmapState_*/abmap_*, typeSaveSphereGridconfirmé. Conclusion clé : la sauvegarde native supporte déjà 1280/1280 — le goulot d'étranglement pour dépasser 1024 est la struct runtime statique + les boucles + le rendu, pas la sauvegarde. Doc :docs/reverse/FFX_GHIDRA_FAHRENHEIT_SYMBOL_IMPORT_2026-07-31.md; scripts/rapports danswork/_fahrenheit_probe/. - Statut :
Needs Testing— build vert ; les nouvelles gardes n'ont pas de consommateurs hors plage (aucun usage de code au-delà des docs). ### PATCH
v2.198.1.0
v2.198.2.1BETAREVISION
Seymour31 juil. 2026
fahrenheit-excel : de vrais noms de champs kernel appliqués à l'éditeur (KeyItem/Important + Treasure/takara) + conteneur « Excel » documenté
- Source : deuxième dépôt fahrenheit (
fahrenheit-excel) avec 8 nouvelles structs + réécritureexcel.cs(conteneur Excel :ExcelProlog0x8 +ExcelHeader0xC +ExcelTextOffset0x4 — correspond à notreCustomization_File.ReadHeader, HeaderLength 0x14). FfxLib/Common/KeyItem_File.cs+ KeyItemEditor (rename) :PrimerByte10/RawByte11/RawByte12/OrderingByte13→ItemType/ItemValue/Icon/Number(vrais noms Ghidra ; 0x10 = « is Al Bhed Primer? », 0x13 = numéro de primer) — XAML, résumés et RT0 mis à jour.FfxLib/Treasure/Treasure_File.cs+ TreasureEditor + BukiGetTreasureCatalog + TaskRewardGameFileLoader + TreasureRt0 (rename) :Treasure_Entry.Type→ItemId(confirmeTreasure{item_id u16}de fahrenheit) ; VMTreasureRow.Type/TypeHex/TypeDecimal→ItemId/ItemIdHex/ItemIdDecimal; liaisons XAML mises à jour.- Confirmations :
MixRecipe= ushort[0x70] correspond àMixTable_File(EntryLength 0xE0) ;SphereGridNodeType.amount@0x14confirmeIncreaseAmount;SphereGridNodeTypeInfo→SphereGridNodeTypeUiInfo(le tableaunode_type_infosde lpamng est UI-only). - Documenté (futurs écrivains) :
Sphere(ACTIVATOR/MODIFIER + masque de bits 11-stats + plage NORMAL/UNLIMITED),Rate,WeaponName,HelpText/NameHelpText,Treasure. - Baseline : 245/245 PASS · Build 0 erreurs. Doc :
docs/reverse/FFX_GHIDRA_FAHRENHEIT_SYMBOL_IMPORT_2026-07-31.md§fahrenheit-excel. ### PATCH
v2.198.2.0
v2.198.3.0BETAPATCH
Seymour31 juil. 2026
P3-L4 : release — `scripts/release_manifest.ps1` (manifeste vérifiable) + documentation de processus
scripts/release_manifest.ps1(nouveau, opérationnel) : manifeste de release — version lue depuis<Version>du csproj (source de vérité), SHA-256 de chaque artefact de build.exe/.dll(+ sidecars.sha256via SHA256 .NET — compatible avec le PS de cette machine), première entrée de changelog (cross-check),gitCommit/gitDirty(release sur arbre de travail sale = alerte) etsigning: "not-signed"(une signature n'est jamais déclarée faite sans exécution). Validé : 103 artefacts du build Release avec les bons hashs.docs/ai/P3_RELEASE_2026-07-31.md(nouveau) : flux de release en 7 étapes (build → tests → offline_ci → déploiement de toutes les cibles → manifeste → vérification des hashs → signature) ; audit.gitignore(couverture déjà présente — bin/obj/work/.vs, aucun changement nécessaire ; pas de nettoyage destructif dans un worktree avec du travail étranger) ; signature documentée COMME UN PLAN (signtool/Authenticode — non exécutée, aucun certificat importé).- Aucun changement de comportement d'éditeur — baseline 245/245 PASS intacte. ### PATCH
v2.198.3.3
v2.198.3.1BETAREVISION
Seymour31 juil. 2026
P3-L5 : contrat Gemini court (UI ↔ Core)
docs/ai/P3_GEMINI_CONTRACT_2026-07-31.md(contrat basé sur les vrais types) : propriété des fichiers (Core = backend / Modules+AXAML = UI) ; DTOs publics (CapabilityDescriptor, OperationPlanPreview/ChangeSetSummary, OperationProgress, CommitReceipt, ValidationResult, OperationResult, FilePreviewSummary/OperationPreview, GameEnvironmentReport) ; commandes (EditSession fluent, OperationExecutorV2, OperationPreview, ReceiptBuilder, GameEnvironmentProbe) ; états typés loading/empty/unavailable/warning/blocked/failure avec de vraies origines ; codes ValidationIssue ; les 10 vrais ids de capacité ; mock/provisoire (découverte Steam heuristique, LAB FfxProbe_Service, LlmHttpAdapter opt-in, OperationProgress sans câblage complet) ; règles dures (l'UI ne crée jamais d'écrivain hors OperationPlan ; messages déjà rédigés ; AXAML/thèmes seulement en coordination). Lecture seule — baseline 245/245 PASS intacte. ### PATCH
v2.198.3.0
v2.198.3.2BETAREVISION
Seymour31 juil. 2026
P3-L6 : protocole RT2 par famille (reproductible, journalisé)
docs/ai/P3_RT2_PROTOCOL_2026-07-31.md(protocole ; exécution = runtime humain) : RT0/RT1/RT2 distincts avec portes de sortie (RT0 = portes CLI d'identité d'octets ; RT2 = log reproductible avant/après + sauvegarde jetable) ; prérequis de session (sonde déployée,ffxprobectl mon, sauvegarde jetable, éditeur fermé) ; pilote de la famille Phase Rotation en 7 étapes (appliquer la recette → hash H2 → déployer avec backup vanilla H1 → bataille → 5 tours observés → lecture en lecture seule de la contre-var → restaurer H1 → promotion seulement avec log) ; checklist par famille (sonde PROVEN/Force Battle 1 scénario/Phase Rotation en attente/hooks partiels/sondes en lecture seule) ; règles de promotion (jamais RT0→production sans RT2 ; jamais la sauvegarde principale ; jamais CreateRemoteThread) ; contradiction Force Battle référencée (mécanisme PROVEN / produit LAB). Lecture seule — baseline 245/245 PASS intacte. ### RÉVISION ### RÉVISION
v2.198.3.1
v2.198.3.3BETAREVISION
Seymour1 août 2026
Prompt Gemini mis à jour : tout le backend P3 reflété (245/245, cancel/rollback/journal/verrou de l'exécuteur, vrais ids d'adaptateurs, contrat UI↔Core obligatoire)
docs/ai/PROMPT_GEMINI_UI_UX_FINAL_2026-08-01.md(mis à jour) : en-tête avec version2.198.3.2+ 245/245 PASS ; lecture obligatoire incluant désormaisP3_GEMINI_CONTRACT_2026-07-31.md(item 5 — le contrat officiel UI↔Core) ; table Core avecOperationExecutorV2mis à jour (CancellationToken 4 checkpoints, rollback automatique, journal.json, PromoteGate, messages rédigés) + nouveaux typesOperationPreview/FilePreviewSummary(diff 3 couches) ; table d'adaptateurs corrigée (10 enregistrés — était « 8 » avec 10 lignes — et VRAIS IDs :ability-commandetatel-recipe-phase-rotation, qui étaient faux) ;GameEnvironmentProbeavec découverte (env/registre/libraryfolders.vdf) ; nouveau bloc « Backend state » (245/245, exécuteur digne de confiance, messages déjà rédigés, vérification de santé sans exception, aperçu 3 couches, manifeste de release, protocole RT2, changements d'autres voies — garde de bornes FfxSaveSphereGrid, renames fahrenheit, FAIL annoté connumcyt00_21) ; les Limites incluent désormais les commits sélectifs (course de voies — jamaisgit add -A). Aucun changement de comportement — baseline 245/245 PASS intacte. ### RÉVISION ### RÉVISION
v2.198.3.2
v2.198.3.4BETAPATCH
Seymour1 août 2026
SphereGrid sphere.bin adapté à la structure `Sphere` de fahrenheit (vrais noms + énumérations + correctif du validateur prouvé par le corpus)
FfxLib/SphereGrid/SphereGrid_File.cs(+Write.cs) (rename+énums) :SphereGridSphereTypeEntryActionValue/ActivationBitfield/RangeValue/AlwaysZero→Behavior/Activates/Range/Reserved0x0E(nomsSphereGhidra/fahrenheit) ; nouvelles énumsSphereBehavior(Rien/Activator/Modifier),SphereTargets[Flags] (11 stats,All=0x07FF— ordre de bits non prouvé, valeurs vanilla documentées),SphereRange(Rien/Normal/Unlimited=0x20) ; props dérivéesBehaviorKind/ActivatesTargets/RangeKind;ActionLabelcorrigé (« Mutator »→« Modifier »).Core/Writers/SphereGridAdapter.cs(correctif+durcissement) : clés renommées (Behavior/Activates/Range/Reserved0x0E) ;SpecialRolevalidateur corrigé 0x0F→0x1F (le corpus vanilla utilise des rôles spéciaux jusqu'à 24 — slots 14..29 de sphere.bin ; l'ancien validateur rejetait des grilles légitimes) ;Behaviorvalidé 0..2 (le corpus prouve seulement 0..2) ; les messages citent les énums.SphereGridExplorer(rename) : VMSphereGridSphereTypeEditorRow+ état + helpers + XAML mis à jour ;SetSelectedOptions/diffs/baseline renommés.- Preuve corpus (jppc
battle\kernel\sphere.bin, 50 entrées, elem 0x10) : ACTIVATOR=1 (Ability/Power/Bimentale/Speed/Bonne étoile + Key L1–L4 spéciaux 8..11 + Friend 0x07FF), MODIFIER=2 (Return=1, Teleport=2, Clear=3, Master=4), range 0x01 NORMAL / 0x20 UNLIMITED ; les indices correspondent àSphereGridNodeSphereRequirementKind(Ability=0..Bonne étoile=4). Doc :docs/reverse/FFX_GHIDRA_FAHRENHEIT_SYMBOL_IMPORT_2026-07-31.md§sphere.bin. - Baseline : 245/245 PASS · Build 0 erreurs. Statut :
validated(renames byte-idempotents + RT0/RoundTrip intacts). ### RÉVISION
v2.198.3.3
v2.198.4.0BETAPATCH
Seymour1 août 2026
Chemin de test RT2 propre et sans hook pour True New Node + correction de la théorie du crash + confirmation de la communauté externe (1024/1024/128)
SphereGridDeployPolicy.cs(révision) : la découverte « 861/882 crashent à la sortie » venait des runs RT2 de la pile de hooks v5 retirée (manifeste/sidecar/SEH) — jamais d'un déploiement propre. Avec la RE d'aujourd'hui (moteur piloté par en-tête ;LpAbilityMapEnginestatique 1024/1024/128 ; sauvegarde native 1280/1280), les comptes ≤ 1024 ne nécessitent aucun hook. Plafond réel suspecté : le rendu (681DB0buffers 861×48 + porte7F4900n861 >= 861). Nouvel override opt-inbuilder.AllowRuntimeTestDeploy(défaut OFF) débloque SaveToProject/SaveSquareToProject avec des comptes changés pour le test propre.SphereGrid_File.Builder.cs: propriétéAllowRuntimeTestDeploy+ docs.SphereGridCanvas_DataModel.cs+SphereGridCanvas_Control.axaml: case de barre d'outils « Allow RT2 test deploy (no-hook) » ;RefreshTopologySafetySummarymontre l'état de test (🧪 libéré avec avertissement de sauvegarde jetable / 🚫 bloqué avec l'explication corrigée).- Confirmation externe : EvelynTSMG (fahrenheit-crew) a confirmé le plafond 1024 nœuds / 1024 liens / 128 clusters — correspondance exacte avec le
LpAbilityMapEngineque nous avons prouvé (tableaux à 0x808/0xA808/0x8, buffer.data0x16AD870). Dragoon (communauté) teste add/tie/expand dans son éditeur. - Protocole de test RT2 propre documenté (doc RE §confirmation externe) : Standard → Square Mode → +1 nœud/+1 lien → case → Save → déploiement → sauvegarde jetable → ouvrir/déplacer/sortir → pas de crash = plafond dépassé (répéter 900/1024) ; crash = le rendu est le plafond (patch 2 octets, pas de hook).
- Baseline : 245/245 PASS · Build 0 erreurs. Statut :
Needs Testing(RT2 humain). ### PATCH
v2.198.3.4
v2.198.4.1BETAPATCH
Seymour1 août 2026
correctif sémantique des opcodes de comparaison ATEL (0x0A/0x0B/0x0E/0x0F) — prouvé par décompile d'interpréteur
- Découverte (source : noclip.website
src/FinalFantasyX/script.ts— énum d'opcodes de scripts de field) : le mapping du codec (GT=0x0A, LT=0x0B, GE=0x0E, LE=0x0F) était inversé vs noclip (LT=0x0A, GT=0x0B...). Prouvé par décompile deFFX_Atel_InterpretWorkerOpcodes@0x864180+FFX_FieldVM_PopOperand@0x86DE90(pop = top) : avec la pile[A(base), B(top)], 0x0B testeA < B, 0x0A testeA <= B(0x0E/0x0F = variantes float). Il n'y a pas de « greater-than » direct — le compilateur exprimeA > Bcomme[B, A] + 0x0B(B < A). La porte RT0 (round-trip structurel) ne peut pas attraper les erreurs sémantiques — seule la décompile les expose. - Correctif :
AiVarConditionBuilder(GreaterThan/GreaterOrEqual émettent désormais l'ordre inversé[N, var]+ LT/LE ; LessOrEqual corrigé 0x0F→0x0A),AiAutomation(gardes field/statut/Overdrive :[threshold, field]+ LT ; constantes GT/GE retirées),AiPhaseRotationRecipe(garde de phase finale :[FinalLimit, counter]+ LT),AiBibleCatalog(table 0x0A–0x0F corrigée avec la vraie sémantique)..i64commenté aux cases (0x8646E4/0x864759) — RÈGLE D'OR. Doc :docs/reverse/FFX_ATEL_COMPARISON_OPCODE_SEMANTICS_2026-08-01.md(3 sources : interpréteur = vérité, noclip = direction, fahrenheit = nommage). - Validation :
--phase-rotation-rt0319/319 PASS · tests AI + plateforme 64/64 PASS · baseline 254 (1 échec est un nouveau test de la voie SphereGrid en cours, hors périmètre). ### PATCH
v2.198.4.0
v2.198.4.2BETAREVISION
Lulu1 août 2026
C3-1 : catalogue des clés de ressources de magic DLL VALIDÉ — prémisse de l'ébauche réfutée (0/149 clés indexent la table racine ; sémantique réelle = table globale de l'hôte, alimentée à l'exécution)
v2.198.4.1