Aggiornamento 2.198
01/08/2026
v2.198.0.0BETAMINOR
Seymour31 lug 2026
P3-L2: `GameEnvironmentProbe` (runtime environment health check)
Core/GameEnvironmentProbe.cs(new, 10 tests): version detector / health check of the runtime environment — fulfills the P3 contract (prompt L410-416: detector · install/config/permission/path contract · fallback · actionable error without raw stack trace · compatibility matrix). Detects:FFX.exe(FileVersionInfo version + region viadata\jppc/intl/us/eu),modules\ffx-probe.dll+modules\FfxHooksDll.dll, active flags (config\*.flagand root), live probe viaFfxProbe_Service(MMFLocal\FFXProbeBlock_v1— IsAttached/IsHooked/Heartbeat, read-only, nothing armed). Game root discovery:FFX_GAME_ROOTenv → Steam registry →libraryfolders.vdf(unescape parse, testable) → common candidates. Typed resultGameEnvironmentReport(State Ok/Warning/Error +EnvironmentIssueCode/Message/ActionableMessage) — UI shows typed state, never a raw stack trace.- Baseline: 233/233 PASS (223 + 10 new). ### REVISION ### REVISION
v2.197.1.1
v2.198.1.0BETAPATCH
Seymour31 lug 2026
P3-L3: hardening piattaforma operazioni (cancel/rollback/journal/lock/redaction) + suite resilienza (12 test)
Core/OperationExecutorV2.cs(hardening):ExecuteAsync(plan, CancellationToken)con checkpoint (prima della stage, tra le op, prima del promote, durante il promote) e propagazione inStageAsync; rollback automatico al promote (fallimento/cancel ripristina gli output già promossi dai backup, o rimuove gli output creati da questo promote); (letterale tecnico: already-promoted)journal.json in BackupRoot (stati promoting/success/cancelled/failed — contratto di recovery, best-effort non fa mai fallire l'op); lock statico che serializza il promote (contratto di concorrenza — 2 op sullo stesso output non si interleccano mai); redaction (LlmRedactor) in ErrorMessage/RecoveryInstructions/journal (il segreto non appare mai sulle superfici di fallimento).FFXProjectEditor.Tests/Core/OperationResilienceTests.cs(nuovo, 12 test): annullamento prima della stage / durante la stage (l’adapter osserva il token) → nulla scritto; fallimento promozione iniettata → rollback dell’output già promosso (hash originale ripristinato); journal di fallimento/successo + backup .bak con i byte originali; concorrenza (2 esecuzioni parallele sullo stesso output → risultato intatto, un vincitore completo); segreto redatto dai messaggi di errore; piano vuoto → "Nessuna operazione"; diff proibito (EditSession.Build rifiuta il campo fuori allowlist); round-trip JSON dell’OperationPlan; ricevuta di errore coerente (FilesWritten=0). (letterale tecnico: already-promoted)- Baseline: 245/245 PASS (233 + 12 nuovi). ### MINOR ### MINOR
v2.198.0.0
v2.198.2.0BETAPATCH
Seymour31 lug 2026
FfxSaveSphereGrid hardening (guardia bounds + verità nativa) + import tabella simboli Ghidra/Fahrenheit nel DB canonico (8.281 rename)
FfxLib/Save/FfxSaveSphereGrid.cs(fix):FfxSaveSphereGridNodeSnapshot.Read/Write/ReadActivation/WriteActivationora proteggonoNodeIndex(0..859 nel modello legacy FFXED) conArgumentOutOfRangeExceptionactionable — corregge una scrittura OOB latente nel buffer di salvataggio; nuove costantiNativeTableBase(=8684) eNativeMaxNodeIndex(=1279) espongono la capacità nativa del save; i doc XML chiariscono lo skew +64 vsFfxSaveSphereGridRuntimeTablee che 860 NON è il limite dell'engine. (letterale tecnico: NOT)FfxLib/Save/FfxSaveSphereGridRuntimeTable.cs(doc): contro-confermato dalla tabella simboli Fahrenheit/Ghidra — (letterale tecnico: cross-confirmed)eiAbmDataInit(SaveSphereGrid*)@ 0xA53DE0 eMsGetSaveAbilityMap() → SaveSphereGrid*@ 0x785000 provano che il blocco stato è un tipo engine reale; capacità nativa 1280 nodi / 1280 link / cursore.FfxLib/Save/FfxSaveBatchActions.cs(doc):ImportSphereGridRegiondocumentato come modello legacy +64; percorso nativo segnalato (span 8684..13579) per griglie >860.- RE — import tabella simboli Fahrenheit-crew/fahrenheit (Ghidra): (letterale tecnico: symbol-table) 7.609 funzioni + 672 global rinominati sul DB base
ffxoficial.exe.i64(8.281 totali; fonti USER_DEFINED 460 + IMPORTED 2.816 + ANALYSIS filtrate 7.570; non sovrascrive mai i nomi progettoFFX_*— 3.774 preservati); le global hanno ricevuto tipi primitivi; backupbackups_ffxoficial\ffxoficial.exe.before_ghidra_renames_20260731_231338.i64. Propagato al DB di lavoro del teamffxoficial_COPY.i64via il plugin RPC ida-pro-mcp dentro la GUI (porta 13338): 7.440 funzioni + 490 global applicate sulla COPY, 17 saltate (nomi GUI preservati), DB salvato; backupffxoficial_COPY.before_ghidra_renames_20260731_233813.i64. Findings: structLpAbilityMapEngine(0x12FC0; clusters[128]/nodes[1024]/links[1024] — layout completo nel doc), buffer statico.data0x16AD870(InitLpamng @ A572E0), 12 funzioni con loop1024mappate (RenderPathNodes A50290, eiAbmCalc A53570, eiAbmParaGet A54860, ClearNodeTransforms A57120, ReadAndProcessInputState A57520, BuildLinkBatchSegment A57710, UpdatePlacementSlotTransform A58080, DialogDispatch A583E0, InitPlacementGrid A5B230, +3), render 861 (681DB0/7F4900), nomi originalieiAbm*/+AbmapState_*/abmap_*, tipoSaveSphereGridconfermato. Conclusione chiave: il save nativo supporta già 1280/1280 — il collo di bottiglia per superare 1024 è la struct runtime statica + i loop + il render, non il save. Doc:docs/reverse/FFX_GHIDRA_FAHRENHEIT_SYMBOL_IMPORT_2026-07-31.md; script/report inwork/_fahrenheit_probe/. - Status:
Needs Testing— build verde; le nuove guardie non hanno consumer fuori range (nessun uso nel codice oltre i docs). (letterale tecnico: out-of-range) ### PATCH
v2.198.1.0
v2.198.2.1BETAREVISION
Seymour31 lug 2026
fahrenheit-excel: real kernel field names applied to the editor (KeyItem/Important + Treasure/takara) + "Excel" container documented
- Source: second fahrenheit repo (
fahrenheit-excel) with 8 new structs +excel.csrewrite (Excel container:ExcelProlog0x8 +ExcelHeader0xC +ExcelTextOffset0x4 — matches ourCustomization_File.ReadHeader, HeaderLength 0x14). FfxLib/Common/KeyItem_File.cs+ KeyItemEditor (rename):PrimerByte10/RawByte11/RawByte12/OrderingByte13→ItemType/ItemValue/Icon/Number(real Ghidra names; 0x10 = "is Al Bhed Primer?", 0x13 = primer number) — XAML, summaries and RT0 updated.FfxLib/Treasure/Treasure_File.cs+ TreasureEditor + BukiGetTreasureCatalog + TaskRewardGameFileLoader + TreasureRt0 (rename):Treasure_Entry.Type→ItemId(confirms fahrenheitTreasure{item_id u16}); VMTreasureRow.Type/TypeHex/TypeDecimal→ItemId/ItemIdHex/ItemIdDecimal; XAML bindings updated.- Confirmations:
MixRecipe= ushort[0x70] matchesMixTable_File(EntryLength 0xE0);SphereGridNodeType.amount@0x14confirmsIncreaseAmount;SphereGridNodeTypeInfo→SphereGridNodeTypeUiInfo(lpamngnode_type_infosarray is UI-only). - Documented (future writers):
Sphere(ACTIVATOR/MODIFIER + 11-stat bitmask + NORMAL/UNLIMITED range),Rate,WeaponName,HelpText/NameHelpText,Treasure. - Baseline: 245/245 PASS · Build 0 errors. Doc:
docs/reverse/FFX_GHIDRA_FAHRENHEIT_SYMBOL_IMPORT_2026-07-31.md§fahrenheit-excel. ### PATCH
v2.198.2.0
v2.198.3.0BETAPATCH
Seymour31 lug 2026
P3-L4: release — `scripts/release_manifest.ps1` (manifest verificabile) + doc processo
scripts/release_manifest.ps1(nuovo, operativo): manifest release — versione letta da<Version>nel csproj (fonte di verità), SHA-256 di ogni artefatto build.exe/.dll(+ sidecar.sha256via .NET SHA256 — compatibile con la PS di questa macchina), prima voce changelog (cross-check),gitCommit/gitDirty(release con worktree sporco = alert) e (letterale tecnico: dirty-worktree)signing: "not-signed"(la firma non è mai dichiarata fatta senza eseguirla). Validato: 103 artefatti della build Release con hash corretti.docs/ai/P3_RELEASE_2026-07-31.md(nuovo): flusso release in 7 passi (build → test → offline_ci → deploy su tutti i target → manifest → verifica hash → firma); audit.gitignore(coverage già presente — bin/obj/work/.vs, nessuna modifica necessaria; nessun cleanup distruttivo in un worktree con lavoro estraneo); la firma documentata COME PIANO (letterale tecnico: AS A PLAN) (signtool/Authenticode — non eseguita, nessun certificato importato).- Nessun cambio di comportamento editor — baseline 245/245 PASS intatta. ### PATCH
v2.198.3.3
v2.198.3.1BETAREVISION
Seymour31 lug 2026
P3-L5: short Gemini contract (UI ↔ Core)
docs/ai/P3_GEMINI_CONTRACT_2026-07-31.md(contract based on the real types): file ownership (Core = backend / Modules+AXAML = UI); public DTOs (CapabilityDescriptor, OperationPlanPreview/ChangeSetSummary, OperationProgress, CommitReceipt, ValidationResult, OperationResult, FilePreviewSummary/OperationPreview, GameEnvironmentReport); commands (EditSession fluent, OperationExecutorV2, OperationPreview, ReceiptBuilder, GameEnvironmentProbe); typed states loading/empty/unavailable/warning/blocked/failure with real origins; ValidationIssue codes; the 10 real capability IDs; mock/provisional (heuristic Steam discovery, LAB FfxProbe_Service, opt-in LlmHttpAdapter, OperationProgress without full wiring); hard rules (UI never creates a writer outside OperationPlan; messages already redacted; AXAML/themes only with coordination). Read-only — baseline 245/245 PASS untouched. ### PATCH
v2.198.3.0
v2.198.3.2BETAREVISION
Seymour31 lug 2026
P3-L6: per-family RT2 protocol (reproducible, logged)
docs/ai/P3_RT2_PROTOCOL_2026-07-31.md(protocol; execution = human runtime): distinct RT0/RT1/RT2 with exit gates (RT0 = CLI byte-identity gates; RT2 = reproducible before/after log + throwaway save); session prerequisites (probe deployed,ffxprobectl mon, throwaway save, editor closed); Phase Rotation family pilot in 7 steps (apply recipe → hash H2 → deploy with vanilla backup H1 → battle → 5 observed turns → read-only counter-var read → restore H1 → promotion only with log); per-family checklist (probe PROVEN/Force Battle 1 scenario/Phase Rotation pending/hooks partial/read-only probes); promotion rules (never RT0→production without RT2; never the main save; never CreateRemoteThread); Force Battle contradiction referenced (PROVEN mechanism / LAB product). Read-only — baseline 245/245 PASS untouched. ### REVISION ### REVISION
v2.198.3.1
v2.198.3.3BETAREVISION
Seymour1 ago 2026
Gemini prompt updated: full P3 backend reflected (245/245, executor cancel/rollback/journal/lock, real adapter IDs, mandatory UI↔Core contract)
docs/ai/PROMPT_GEMINI_UI_UX_FINAL_2026-08-01.md(updated): header with version2.198.3.2+ 245/245 PASS; mandatory reading now includesP3_GEMINI_CONTRACT_2026-07-31.md(item 5 — the official UI↔Core contract); Core table with updatedOperationExecutorV2(CancellationToken 4 checkpoints, automatic rollback, journal.json, PromoteGate, redacted messages) + new typesOperationPreview/FilePreviewSummary(3-layer diff); adapter table fixed (10 registered — was "8" with 10 rows — and REAL IDs:ability-commandandatel-recipe-phase-rotation, which were wrong);GameEnvironmentProbewith discovery (env/registry/libraryfolders.vdf); new "Backend state" block (245/245, trustworthy executor, already-redacted messages, exception-free health check, 3-layer preview, release manifest, RT2 protocol, other-lane changes — FfxSaveSphereGrid bounds guard, fahrenheit renames, known annotated FAILmcyt00_21); Limits now include selective commits (lane race — nevergit add -A). No behavior change — baseline 245/245 PASS untouched. ### REVISION ### REVISION
v2.198.3.2
v2.198.3.4BETAPATCH
Seymour1 ago 2026
sphere.bin SphereGrid adattato alla struct `Sphere` di fahrenheit (nomi reali + enum + fix validator provato dal corpus)
FfxLib/SphereGrid/SphereGrid_File.cs(+Write.cs) (rename+enum):SphereGridSphereTypeEntryActionValue/ActivationBitfield/RangeValue/AlwaysZero→Behavior/Activates/Range/Reserved0x0E(nomiSpheredi Ghidra/fahrenheit); nuove enumSphereBehavior(Niente/Activator/Modifier),SphereTargets[Flags] (11 stat,All=0x07FF— ordine bit non provato, valori vanilla documentati),SphereRange(Niente/Normal/Unlimited=0x20); proprietà derivateBehaviorKind/ActivatesTargets/RangeKind;ActionLabelcorretto ("Mutator"→"Modifier").Core/Writers/SphereGridAdapter.cs(fix+hardening): chiavi rinominate (Behavior/Activates/Range/Reserved0x0E);SpecialRolevalidator corretto 0x0F→0x1F (il corpus vanilla usa ruoli speciali fino a 24 — sphere.bin slots 14..29; il vecchio validator rifiutava griglie legittime);Behaviorvalidato 0..2 (il corpus prova solo 0..2); i messaggi citano le enum.SphereGridExplorer(rename): VMSphereGridSphereTypeEditorRow+ stato + helper + XAML aggiornati;SetSelectedOptions/diffs/baseline rinominati.- Prova corpus (jppc
battle\kernel\sphere.bin, 50 voci, elem 0x10): ACTIVATOR=1 (Ability/Power/Majix 2/Speed/Augurio + Key L1–L4 special 8..11 + Friend 0x07FF), MODIFIER=2 (Return=1, Teleport=2, Clear=3, Master=4), range 0x01 NORMAL / 0x20 UNLIMITED; gli indici corrispondono aSphereGridNodeSphereRequirementKind(Ability=0..Augurio=4). Doc:docs/reverse/FFX_GHIDRA_FAHRENHEIT_SYMBOL_IMPORT_2026-07-31.md§sphere.bin. - Baseline: 245/245 PASS · Build 0 errori. Status:
validated(rename byte-idempotenti + RT0/RoundTrip intatti). ### REVISION
v2.198.3.3
v2.198.4.0BETAPATCH
Seymour1 ago 2026
Percorso test RT2 pulito senza hook per True New Node + correzione della teoria del crash + conferma community esterna (1024/1024/128)
SphereGridDeployPolicy.cs(revisione): il finding "crash 861/882 senza hook all’uscita" veniva dai run RT2 dello stack hook v5 ritirato (manifest/sidecar/SEH) — (letterale tecnico: no-hook)mai da un deploy pulito. Con la RE di oggi (engine guidato dall’header (letterale tecnico: header-driven)LpAbilityMapEnginestatico 1024/1024/128; save nativo 1280/1280), i conteggio ≤ 1024 NON richiedono hook. Tetto reale sospettato: render (681DB0buffer 861×48 + gate +7F4900n861 >= 861Nuovo override opt-inbuilder.AllowRuntimeTestDeploy(predefinito OFF) sblocca SaveToProject/SaveSquareToProject con conteggi modificati per il test pulito.SphereGrid_File.Builder.cs: proprietàAllowRuntimeTestDeploy+ docs.SphereGridCanvas_DataModel.cs+SphereGridCanvas_Control.axaml: checkbox toolbar "Allow RT2 test deploy (no-hook)";RefreshTopologySafetySummarymostra lo stato del test (🧪 rilasciato con warning save usa-e-getta / 🚫 bloccato con la spiegazione corretta). (letterale tecnico: disposable-save)- Conferma esterna: EvelynTSMG (fahrenheit-crew) ha confermato il tetto 1024 nodi / 1024 link / 128 cluster — corrispondenza esatta con la
LpAbilityMapEngineche abbiamo provato (array a 0x808/0xA808/0x8, buffer.data0x16AD870). Dragoon (community) testa add/tie/expand nel suo editor. - Protocollo test RT2 pulito documentato (doc RE §conferma esterna): Standard → Square Mode → +1 nodo/+1 link → checkbox → Save → deploy → save usa-e-getta → apri/muovi/esci → nessun crash = tetto superato (ripeti 900/1024); crash = il render è il tetto (patch 2 byte, niente hook).
- Baseline: 245/245 PASS · Build 0 errori. Status:
Needs Testing(RT2 umano). ### PATCH
v2.198.3.4
v2.198.4.1BETAPATCH
Seymour1 ago 2026
semantic fix of ATEL comparison opcodes (0x0A/0x0B/0x0E/0x0F) — proven by interpreter decompile
- Discovery (source: noclip.website
src/FinalFantasyX/script.ts— field-script opcode enum): the codec mapping (GT=0x0A, LT=0x0B, GE=0x0E, LE=0x0F) was inverted vs noclip (LT=0x0A, GT=0x0B...). Proven by decompile ofFFX_Atel_InterpretWorkerOpcodes@0x864180+FFX_FieldVM_PopOperand@0x86DE90(pop = top): with stack[A(base), B(top)], 0x0B testsA < B, 0x0A testsA <= B(0x0E/0x0F = float variants). There is no direct "greater-than" — the compiler expressesA > Bas[B, A] + 0x0B(B < A). The RT0 gate (structural round-trip) cannot catch semantic errors — only the decompile exposes them. - Fix:
AiVarConditionBuilder(GreaterThan/GreaterOrEqual now emit swapped order[N, var]+ LT/LE; LessOrEqual fixed 0x0F→0x0A),AiAutomation(field/status/Overdrive guards:[threshold, field]+ LT; GT/GE constants removed),AiPhaseRotationRecipe(final-phase guard:[FinalLimit, counter]+ LT),AiBibleCatalog(0x0A–0x0F table corrected with real semantics)..i64commented at the cases (0x8646E4/0x864759) — GOLDEN RULE. Doc:docs/reverse/FFX_ATEL_COMPARISON_OPCODE_SEMANTICS_2026-08-01.md(3 sources: interpreter = truth, noclip = direction, fahrenheit = naming). - Validation:
--phase-rotation-rt0319/319 PASS · AI + platform tests 64/64 PASS · baseline 254 (1 failure is a new SphereGrid-lane test in progress, out of scope). ### PATCH
v2.198.4.0
v2.198.4.2BETAREVISION
Lulu1 ago 2026
C3-1: catalogo resource-key delle magic DLL VALIDATO - premessa di draft confutata (0/149 chiavi indicizzano la tabella radice; la semantica reale = tabella globale host, popolata a runtime)
v2.198.4.1