Aggiornamento 2.207
02/08/2026
v2.207.0.0BETAMINOR
Seymour1 ago 2026
F5-L4: high-level ATEL script panel in the Monster AI Editor (dry-run with diff)
MonsterAiEditor_DataModel.AtelScriptLab.cs(new partial): observableAtelScriptText/AtelScriptResult/AtelScriptDiffSummary/AtelScriptDiffLines+CompileAtelDryRun()— parses/compiles the script against the SELECTED monster (AiAutomation.PickCombatWorker/PickMainEntrypoint) and shows the diff (AiScript_Diff.Compare, Added/Modified/Removed). Dry-run: nothing is saved (save stays on the editor's existing channels). Actionable errors (syntax/emission).MonsterAiAtelScriptLab_Window.axaml+.cs(new): window with script editor (Consolas), "Compile (dry-run)" button, summary + diff ListBox. "Script ATEL (F5)" button added to theMonsterAiEditor_Controltoolbar.- Baseline: 332/332 PASS (329 + 3 from another lane). ### MINOR ### MINOR
v2.206.0.0
v2.207.0.1BETAREVISION
Seymour1 ago 2026
F6: battle/save structs cross-validation (fahrenheit PS2 × our HD offsets)
docs/reverse/PPP_FAHRENHEIT_STRUCTS_CROSSREF_F6_2026-08-01.md: fahrenheit inventory (PS2 ChrRam 0x1EC with stats @0x68–0x77 and equip @0x52/0x53; CtbEntry 4B + CtbBaseData tick_speed; save_impl/ply_save) vs ours (HD MemoryChr with script pointers +0xF78.., FfxSaveSphereGrid with bounds guard, decompiled HD CTB queue). Honest verdict: PS2 ≠ HD (the HD MemoryChr includes the script/VM layer; PS2 executes MIPS) — PS2 stats are field-by-field validation candidates against the HD aggregator (0x7B2DD0); CtbBaseData is semantics reference for the CTB queue; nothing promoted without HD proof. Read-only — baseline 332/332 untouched. ### REVISION ### MINOR
v2.207.0.0
v2.207.0.2BETAREVISION
Seymour1 ago 2026
F7: cross-validation of the ATEL codecs (fahrenheit ↔ ours) — 3/3 validated
docs/reverse/PPP_FAHRENHEIT_CODEC_CROSSVALIDATION_F7_2026-08-01.md: F7-A our syntax → their parser (var x = 0;accepted; their lexer EOF bug documented — crash on trailing newline, lexer.cs:74); F7-B our generated AiFile (324 instructions via AtelLangLab) → walk with their fetch rule (bit 0x80 = operand): closed exactly, 0 opcodes outside their AtelOp enum; F7-C our KnownOpcode (49) ⊆ their enum (123): 0 missing. Limits: their compiler does NOT emit bytes (AtelAssembler never called); validation covers dialect/fetch/table, not the full worker layout. Conclusion: both codecs speak the same dialect — our fixed semantics (v2.198.4.1) is the executable truth. Read-only — baseline 332/332 untouched. ### REVISION ### REVISION
v2.207.0.1
v2.207.0.2BETAREVISION
Seymour1 ago 2026
Operation Demonio session 2: full inventory of the new F8 (InGameMenu of FfxHooksDll)
docs/reverse/F8_UNX_INCONSISTENCY_REGISTER_2026-08-01.md(+45 lines): the new F8 = our ecosystem plugin switchboard (UnX reimplementation over our hook layer). Architecture mapped in dllmain.cpp: gateingame_menu.flag/FFXHOOKS_ENABLE_INGAME_MENU/Aurora config; infra = AuroraD3D11 overlay (Present vtable[8]); input = GetAsyncKeyState (poll on Present) + WndProc subclass (WM_KEYDOWN/SYSKEYDOWN, 90/150ms debounce) - no DirectInput, zero conflict with the probe (contrast with legacy UnX that crashed on GetDeviceState); rows 0-2 = Aurora labels/detail/refresh, 3+ = plugins (Running/Disk-on/Disk-off/Absent); plugin toggle READ-ONLY (staging via editor; live unload blocked); 1.5s refresh; pure GDI draw on memDC.- Verdict: the new F8 does NOT write to game memory (zero writes - no Btl.battle_trigger/HP/.text patch of legacy UnX) - offset/ABI/save-corruption classes do not apply. Risks R-ING-01..05 (low): GetAsyncKeyState per frame on Present; WndProc subclass vs third-party overlays (DiscordHook/SpecialK); F8/INSERT always consumed; 1.5s refresh I/O; R-ING-05 (RT2 pending): Present vtable[8] = same target as UnX SK_BeginBufferSwap - coexistence untested. Known softlock gate already documented in code: field_scout* x native_menu = titl00. No behavior change - baseline untouched.
v2.207.0.1
v2.207.0.3BETAREVISION
Seymour1 ago 2026
IDA GOLDEN RULE: ATEL call-target tables verified on the canonical db + cross-reference comments + F2 doc fix
- Verification (no name without proof): the fahrenheit addresses (0x850050 Common, 0x842618 Battle...) belong to the PS2 binary — lookup on the canonical db showed empty names + non-pointer dwords → NOT renamed on HD. The real HD tables are already named:
AtelCallTargetsCommon@0xC50050,AtelCallTargetsBattle@0xC42618,AtelCallTargets@0x1328518(fahrenheit naming already applied by another lane — validates the nomenclature, not the addresses). - Cross-reference comments applied on the 3 HD tables (16B struct +0 init/+4 exec/+8 ret_float/+0xC ret_int; PS2 refs with counts) — GOLDEN RULE fulfilled.
docs/reverse/PPP_FAHRENHEIT_ATEL_IMPORT_2026-08-01.mdfixed with the verification note (PS2 addresses = reference from the other binary, not HD rename targets). Baseline 332/332 untouched. ### REVISION ### REVISION
v2.207.0.2
v2.207.0.4BETAREVISION
Seymour1 ago 2026
F6.1: stats field-by-field verification PS2×HD on the aggregator (0x7B2DD0) + IDA comment
- Decompile of
FFX_Battle_PoolActorByTargetType_structural(0x7B2DD0) — READ/WRITE dispatcher with 346 actor-property cases. Cases 0x0A–0x13 accumulate 8 bytes atpad_0764[331..337/348](HDFFXBattleActorRecordregion +0x79B..) = candidate 8-stats block (strength/defense/magic/magic_defense/agility/luck/evasion/accuracy). - Confirmed: PS2 offsets (ChrRam +0x68..0x77) do NOT match HD (HD record is much larger; the dispatcher indexes by CASE ID, not offset).
- GOLDEN RULE: cross-reference comment applied at case 0x0A (0x7B2F9D) on the canonical db.
PPP_FAHRENHEIT_STRUCTS_CROSSREF_F6updated (§4b). Pending: pin the 8-stats order (case names — future work). Baseline 332/332 untouched. ### REVISION ### REVISION
v2.207.0.3
v2.207.0.5BETAREVISION
Seymour1 ago 2026
F6.2: FULL case map of dispatcher 0x7B2DD0 + correction of F6.1
- Correction of the previous delivery: the real 8-stats candidate block is 338..345 (cases 0x12C–0x135, 8 contiguous bytes) — not "331..337/348" (7B + 1B from another block).
- Real function semantics: AVERAGE of the property per target type (
total /= counterat the end), not raw stat sum. - Full case→offset map documented (14 blocks: 331..337, 338..345, 346–351, 380–383, 426–434, 436–438, 483–508, 606–643, 674, 698/699, 82–93, 158–176, 326...) in doc F6 §4b.
- GOLDEN RULE: IDA comments applied (function 0x7B2DD0 + case 0x0A 0x7B2F9D). ⚠️ MCP 13337 busy/saving after
set_func_cmt— verify post-save; reapplywork/_ida_set_comments.pyif needed. - Baseline 332/332 untouched. ### REVISION ### REVISION
v2.207.0.4
v2.207.0.6BETAREVISION
Seymour1 ago 2026
F7/F8 reconciliation plan (handoff to the Jarvis-HOOK lane)
docs/reverse/F7F8_RECONCILIATION_PLAN_2026-08-01.md(new, ~250 lines): final consolidation of Operation Demonio findings for the hooks lane. P1 (proven): the new F8 (dashboard, 56 rows, UnX/ProjectX) was removed from dllmain in commit53d82b2a(07/27) and the active 09:05 build has no dashboard - F8 fell back to the InGameMenu switchboard (legacy); source recoverable (blobsc66aa478/a14f8732/76887427/d9516135+RT2OFF/pre_magic_ppp_tracebuilds + .obj). P2-P8: F7 key contention (NativeMenu x LabMenu) and F8 (dashboard x InGameMenu), duplicate gates (ingame_menu_v2.flag), field_scout x native_menu gate to verify, ffx-hooks.ini missing in game dir, Present vtable[8] detour order. 6-step recovery map (git show + 11 diff blocks + vcxproj + config + lab build + gates), target architecture with single key owner (F7=NativeMenu RAM untouched; F8=dashboard; InGameMenu=fallback), classified UnX parity (port cheats/dialog-skip/language via clean hooks; NEVER hardcoded .text patches 0x392930/0x30B040/Btl.battle_trigger/Sleep-5s thread), 4 waves with gates (RT2 on _isolated, baseline 283/283). No behavior change - baseline untouched.
v2.207.0.5
v2.207.0.7BETAREVISION
Seymour1 ago 2026
External Sphere Grid knowledge cross-checked (fahrenheit-crew Discord + FFXRando) + 2 anchor regression tests
docs/reverse/SPHERE_GRID_EXTERNAL_KNOWLEDGE_2026-08-01.md(new): Discord thread (Titan/Dragoon/peppy) cross-checked with our RE: (1) Anchor idx = the link's curve control node (ourAnchorNode;Validate()catches OOB;RemoveNodefixes anchors — link anchored on the removed node becomes straight 0xFFFF); (2) LOCK 3 = content 0x00 is the game's default when it can't find the node (sgelems.cs L215) — our flow never emits it (EmptyContent=0xFF + validated picker); (3) header↔structs coherence (Dragoon) = what our WriteLayout/Validate already guarantee; (4) limits are per-grid (peppy "per-grid") = confirms our RE (static LpAbilityMapEngine 1024/1024/128 per grid); (5) FFXRando (nyterage/FFXRando, MIT, C++):SphereGridRandomizer.cppshuffles CONTENT only (topology/counts preserved; NODE_NULL=skip) — validates the Safe Transplant directive (content edit = safe; new topology = risk, gated by DeployPolicy).- 2 new tests in
SphereGridAddNodeReproTests.cs(4/4 PASS on the area):RemoveNode_WithAnchorLinks_KeepsGraphValid(vanilla Standard has 411 curved links; removing the anchor node keeps the grid valid, no orphan anchors, round-trip OK) +Validate_CatchesOutOfRangeAnchor. No product behavior change. ### REVISION
v2.207.0.6
v2.207.0.8BETAREVISION
Seymour1 ago 2026
Sphere Grid editor write audit formalized ("the secret to not exploding")
docs/reverse/SPHERE_GRID_EDITOR_WRITE_AUDIT_2026-08-01.md(new): YES answer to "does our editor do exactly the safe thing?" — operation→bytes map (drag = pos + recomputed Unknown6; content = 1 byte in dat1X + RedundantContent; cluster; add/remove node/link with full reindex; link repoint) and the 7 invariants enforced byValidate()before ANY write: (1) header counts == real table sizes; (2) Unknown6 == spatial bucket; (3) RedundantContent == content; (4) cluster < clusterCount; (5) Node1/Node2 < nodeCount; (6) AnchorNode 0xFFFF or < nodeCount; (7) content in range (0xFF=empty). Single write path: UI → builder → Build() (throws if invalid) → WriteLayout → project; nothing is written unvalidated. Safe Transplant = byte-local (counts preserved) = proven safe zone; new topology = gated by DeployPolicy until the clean RT2. Residual risks: SphereGridAdapter writes sphere.bin (different file), PanelGrowWriter extends panel.bin. No behavior change. ### REVISION
v2.207.0.7
v2.207.1.0BETAPATCH
Seymour2 ago 2026
F7 In-Live v2: multi-column DIFF (presets + BASE + AUTO + WEAK + RESIST + ABSORB multi-select), numeric input, HP up to 10x, Music with Preview/real names/Save/Reset, black-screen fix, LabMenu → F6
- DIFF redesigned (multi-column): presets became prominent chips on top (Off/Hunter/Sombra de Sin/True Nightmare); side-by-side columns BASE STATUS (HP..LCK — 9 stats, ACC/EVA/LCK now editable too) / AUTO STATUS (25 statuses, multi-select checkboxes) / WEAK / RESIST / ABSORB (5 elements each, multi-select); ACTIONS column (Apply Now/Save/Back); L/R navigates columns and U/D rows; HP range up to 10x (100..10000) and stats up to 5x (100..5000).
- Numeric input: Confirm on a BASE stat opens edit mode — type 0-9, Backspace, Confirm applies (clamped), Esc cancels (becomes "custom").
- Music: new rows Preview (plays the Music Lock track via lab-proved override+SOUNDCMD), Save (persists f7_inlive.json) and Reset (back to default: no lock/battle/randomizer/fade); confirming on "Music Lock"/"Battle Entry" also previews; real names for the 181 tracks (F7TrackName now delegates to the
LabMusicRuntimeNamecrosswalk: "Battle Theme", "Thunder Plain", "Crisis"...). - Black-screen fix: submenu→hub return now uses the pump path (
g_nativeWantSpawn) instead of directSpawnMenu();F7_DifficultyApplyNowgained enemy-list validation (range check) +__try/__except— never kills the pump on invalid context (logs SEM-LISTA/LISTA-INVALIDA/EXCECAO). - Legacy LabMenu moved to F6 (was F7/F8 depending on InGameMenu) — F7 is now exclusive to FFX Editor In-Live; F8 is the InGameMenu (plugin switchboard).
- New F7InLive APIs:
F7_MusicPreview(track),F7_ResetMusic(),F7_StatusName(i)+GetArenaBattleMusicSoundCmdFn()getter in MusicHook. - Build
-WithPolyHook -ReleasePASS; LabDeploy to Steam; RT2Needs Testing(DIFF columns, numeric edit, audible preview, Apply in battle). ### REVISION
v2.207.0.8
v2.207.2.0BETAPATCH
Seymour1 ago 2026
Editor Sphere Grid: rimosso ciò che non ha senso sotto le nuove verità (codice v5 morto) + handoff di freeze per la lane Jarvis-HOOK
- Rimosso dall'editor:
SaveSquareToProject()(codice morto — perse il suo unico chiamante nel cleanup SUPERMD;SaveToProjectcon re-baseline lo copre già) + fallback dev-path mortowork/nul_ward_pack/command.bininResolveCommandBinPath(il file non esiste; il corpus lo copre). L'area editor Sphere Grid ora è 100% libera dai concetti v5 (hook/manifest/sidecar/square). docs/ai/HANDOFF_JARVIS-HOOK_SPHEREGRID_V5_FREEZE_2026-08-01.md(nuovo): istruzione per la lane Jarvis-HOOK di congelare lo stack v5 (SphereGridFullGridCompilerHook.{cpp,h}+SphereGridTrueNewNodeHook.{cpp,h}→legacy/) senza rompere la factory degli altri hook; punti di contatto dllmain (include L49-50, extern L97-98, Enabled L870-876, install 11900-11931, remove 12168-12169); criterio RT2 (pass → delete; fail → lab isolato); ffx-probe.dll NON è un hook (letterale tecnico: NOT) (tenere).- Validazione: build Release 0 errori; test SphereGrid 4/4 PASS (con ancore). Baseline area intatta.
v2.207.1.0
v2.207.2.1BETAREVISION
Seymour2 ago 2026
Sphere Grid lane closure (handoff + PORT_STATUS)
docs/ai/SESSION_HANDOFF.md: lane-closure handoff — the session's 5 commits (SUPERMD cleanup, sphere.bin bits PROVEN, crash forensics, write audit 7 invariants, dead v5 code removal) + state (editor 100% v5-free, game ready for the clean RT2) + pending items (human clean RT2, UI smoke, v5 stack freeze on the Jarvis-HOOK lane) + safe next step.PORT_STATUS.md: closure update — area status consolidated; clean RT2Needs Testing. ### PATCH
v2.207.2.0
v2.207.3.0BETAPATCH
Seymour2 ago 2026
Fix F7 In-Live: layout AUTO (25 status visibili), Force basato su tick (niente Sleep), gate offline RT0
- Fix layout: colonna AUTO STATUS con rowH 0.020 — tutti i 25 status ora entrano a schermo (Haste/Slow erano tagliati).
- Fix Force:
F7_ForceLastBattleora programma per tick (g_forceRepeatLeft+ ~10 frame tra le force, processato inF7_TickMainThread) — ilSleep(120)sul main-thread (stutter ~1s con repeat 9) è sparito. - Gate offline RT0:
RuntimeTools/FfxHooksDll/f7_config_rt0.ps1— valida il contrattof7_inlive.json(24 chiavi, range di clamp, maschere status/element, round-trip chiave-valore) senza lanciare il gioco. (letterale tecnico: key-value)PASS. - Build PASS + LabDeploy a Steam (insieme alla 2.207.4.0). ### REVISION
v2.207.2.1
v2.207.4.0BETAPATCH
Seymour2 ago 2026
Stack hook Sphere Grid v5 CONGELATO (legacy)
- Freeze eseguito (handoff
HANDOFF_JARVIS-HOOK_SPHEREGRID_V5_FREEZE_2026-08-01.md): i 4 file dello stack v5 ( (letterale tecnico: v5-stack)SphereGridFullGridCompilerHook.{cpp,h}+SphereGridTrueNewNodeHook.{cpp,h}) spostati inRuntimeTools/FfxHooksDll/legacy/spheregrid_v5/;dllmain.cppripulito (include, extern,Enabled(), install, remove, chiamate al fault-handler) — zero riferimenti rimasti;vcxproj+build_hooks.ps1ripuliti. Sospetto #1 del crash0xc0000374(08-01, hook attivi + griglia pulita) fuori dalla build. - VEH globale sempre armato (
FaultProbe VEH armed (global fault diagnosis)) — diagnostica crash mantenuta, indipendente dall'hook SG. - Criterio RT2 mantenuto: RT2 pulito (save usa-e-getta, counts+1) PASS → eliminare
legacy/spheregrid_v5/+ flagsg_*+ manifest; FAIL → tornare come lab isolato (FFXHOOKS_SG_861_LAB_OVERRIDE). - Build
-WithPolyHook -ReleasePASS; LabDeploy a Steam. ### PATCH
v2.207.3.0
v2.207.5.0BETAPATCH
Seymour2 ago 2026
Fix schermata nera del submenu DIFF: O_COUNT finto >0 sull'oggetto menu nativo
- Causa radice (il mio bug v2.207.1.0): la DIFF multi-colonna imposta (letterale tecnico: multi-column)
g_f7RowCount = 0(nessuna riga 1D) eF7Sub_SpawnMenuscrivevaO_COUNT = 0sull'oggetto menu nativo — il tick di draw del gioco vedeva count 0 e non chiamava mai il nostro draw → submenu "aperto" ma invisibile → schermata nera (gate forzato senza render 3D e senza menu) → solo F7 (chiusura forzata) tornava al gioco. - Fix:
O_COUNT = g_f7RowCount > 0 ? g_f7RowCount : 8allo spawn (count finto 8 per la DIFF — il nostro draw/input multi-colonna non usa O_COUNT). (letterale tecnico: multi-column) - Extra (diagnostica log): il VEH globale ha catturato 2 AV reali al boot (
FAULT AV READ pc=0x796B11D7/0x796B3908 accessed=0x10CDCDCD— heap liberato; modulo 0x796B = probabilmente fmodex che chiama una callback FFX a rva 0x291488) — sospetto #1 del crash idle dell'utente ("il gioco si chiude da solo mentre è inattivo"); investigare0x291488in IDA il prossimo giro. - Build PASS + LabDeploy a Steam (15:32→v4). ### PATCH
v2.207.4.0
v2.207.6.0BETAPATCH
Seymour2 ago 2026
F7 DIFF: vera navigazione 2D spaziale (preset con L/R, Giù alla BASE, Su sulla riga 0 torna) + edit numerico da zero + chip Custom
- Navigazione corretta (mappa mentale dell'utente): i PRESET ora navigano con (letterale tecnico: PRESETS)L/R (chip orizzontali) e Giù va alla colonna BASE; sulle colonne dati, L/R cambia colonna e U/D muove le righe; Su sulla riga 0 di BASE torna ai preset. Prima: L/R cambiava colonna anche sui preset (dovevi andare di lato per "scendere").
- Edit numerico corretto: entra con il campo azzerato (digiti il NUOVO valore da zero — prima accumulava sul valore corrente: digitare '0' diventava 10000/max); nessuna cifra + Confirm = mantiene il corrente; placeholder (letterale tecnico: NEW)
>> value _mostra il corrente finché digiti; footer contestuale ("type 0-9 / Backspace / X apply / Esc cancel"). - Chip "Custom" (5°): visibile e navigabile — diventa ATTIVO su qualsiasi tweak manuale (toggle/edit) (prima: nessun chip acceso = confusione). Selezionarlo mantiene i valori correnti. Off (vals[0]=0) = disabilitato; custom (4) = abilitato al commit. (letterale tecnico: ACTIVE)
- Build PASS + LabDeploy a Steam. ### PATCH
v2.207.5.0