Aggiornamento 2.61
09/06/2026
v2.61.0BETA
Seymour
menu nativo STEP 3: row source lista nativa reverse-engineered + (letterale tecnico: native-list)`list-read` (probe) + lettura selezione live
- Continuando la lane menu nativo in-game (Yojimbo→), il gap #1 dello step-3 ("da dove vengono le righe della lista nativa?") è chiuso via IDA: l'INPUT della lista (
FFX_Menu_List_UpdateInput 0x8B4460) è 100% generico — pura matematica di campo sull'oggetto 152-byte (+40state,+48count,+50top,+52target,+58page,+66slots,+69result,+70scroll,+72selected,+28validator), non tocca nessun global, ed è riusato da 10 builder distinti — ma ogni draw nativo è item-shaped: la lista scene3 (FFX_Menu_CreateScene3ScrollableList 0x8B4FB0→ draw0x8B4A00→ row0x8B4B20) legge le righe daunk_159EC30[64*i](struct 64-byte) +byte_1866250[](tipo), con il nome item risolto da0x86C3C0(id→table)e un'etichetta diretta opzionale arowPtr+32(tipo 1); carica scene3/33/34 e dipende dai global Customize. Non esiste un draw "lista free-text" nel binario — quindi una lista nativa con il NOSTRO testo (la shell arena / Aurora Photo-Mode) richiede un callback draw DLL (step 5, il percorso previsto in tick-bible §4), con la ricetta hand-rolled documentata (input generico0x8B4460+ un draw DLL che usa la finestrasub_8F5F70/ la stringasub_9016B0/ il cursoresub_8C0640, leggendo+69/+72). Distribuito via probe OGGI: nuovo verbo (letterale tecnico: TODAY)ffxprobectl list-read [handleHex](READ-only) che scansiona il POOL oggetti menu (letterale tecnico: menu-object) (g_FFX_MenuObjPool 0x18408C0, 32 slot × 152B) — trova QUALSIASI lista/popup nativa attiva e la identifica dai suoi callback — più la scorciatoia global "current list" ( (letterale tecnico: ANY)dword_1866214/186A5DC/23CC120). ✅ RT2 PASS (live, 2026-06-09): con il gioco nel menu Customize equipment, la scansione del pool ha catturato la lista navigata (slot[3]@0x017A0A88,input=0x8D57E0, un wrapper sottile del generico0x8B4460) e+72/SELECTEDha tracciato il cursore in tempo reale (35→42) mentre l'operatore lo muoveva → lo step-3 "leggi la selezione di una lista nativa navigabile" PROVEN senza scrivere nulla. (Bonus: l'oggetto reset+62 = group 0x101corrisponde aFFX_MenuObj_Reset(IDA) — offset confermati contro la memoria.) Nessuna RAM camera / Aurora /dllmain.cpp/ save toccati; IDA read-only (copia_claude_ida, rename-queue nel doc).ffxprobectlbuild 0 errori. Step 5 (blueprint): skeleton paste-ready della shell nativa inRuntimeTools/NativeMenuShell/NativeMenuShell.h(+README) — hand-roll oggetto + callback draw (window+rows+cursor) + encoder font FFX + bridge disaccoppiato alle azioni Photo Mode di Aurora; ABI/offset confermati (workflow verify IDA) e rivisti avversarialmente (2 lens FFX-vs-IDA + C++ → nessun blocker crash/compile); guardia x86 + clamp anti-OOB + invarianti load-bearing annotate; non wired, non toccadllmain.cpp. Step 5.1 (wire blueprint, NON applicato): piano + bozza patch (docs/ai/HANDOFF_BAHAMUT_NATIVE_MENU_WIRE_BLUEPRINT_2026-06-09.md+docs/patches/BAHAMUT_NATIVE_MENU_WIRE_DRAFT_2026-06-09.patch) che collega la shell inffx-hooks.dllvia un detour sul pump menuFFX_Menu_PerFramePump 0x8A9C50(int __cdecl(uint), IDA-verified, main-thread) — OFF di default (FFXHOOKS_ENABLE_NATIVE_MENU+ hotkey F7), il bridge chiama soloPhotoMode::*; rivisto avversarialmente (2 lens) nessun blocker (il reviewer compile lo ha applicato a un albero scratch,git apply --recount --checkexit 0);dllmain.cppNOT touched/committed. Doc:docs/reverse/FFX_NATIVE_MENU_LIST_ROW_SOURCE_2026-06-09.md
v2.60.2
v2.61.1BETA
Seymour
Atlas Gear Shop slot value-guard (`proved-candidate`) + item-shop honestly `blocked`
- Second pass of the Shop scout (
HANDOFF_ATLAS_RIKKU_SHOP_SLOT_VALUE_INDEXER): unlock the SAME value-guard for Shop that Treasure already proved. Verified by an 8-agent workflow (5 forensic + 2 adversarial + 1 synthesis): the editor's slotRawValueis the raw on-disk little-endian ushort (ShopTable_File≡ReadBaselineSlotValue), andgear_shop_slots.csv'sslot_value_hex(445/445 populated, theshop_arms.binindex) is that same word — so the guard is a same-space integer compare with no off-by-one (the catalog isMinIndex=0, index 0 = reserved NULL entry, first sellable gear = index 1 =0x01). New read-only accessorSpiraDataAtlasCatalog.TryGetShopGearSlot(bank, slot, currentRawValue)+ lazy_shopGearSlotValues(devwork/only, no compiled fallback, like the Sphere Grid node detail): resolvesatlas:gear:gear-shop-0x{bank}-slot-{n}only while the slot's current value still equals the corpus (and ≠ 0) → editing the slot hides the badge (no stale). The--spiraatlas-rt0gate gained 5 durable asserts (positive lookup Tidus/value 1, value-guard mismatch 999 hides, empty slot raw 0, bank-without-corpus, edge0x2E/427), all PASS. Item-shop =blocked: the corpus does not carry the raw value (item_shop_slots.csv.slot_value_hex100% empty —ItemShopDataObject.toString()prints only the name); a string-guard is NOT fake-safe (Potion/Phoenix Down/Antidote x47 → stale; placeholders + US-vs-JP → false negatives). Unlock = 1-line parser patch + re-run (corpus task, outside this code). Honest tier:proved read-only candidate (parser-corpus + reader-semantics + RT0), neverruntime/byte-grounded(noarms_shop.binwas hexdumped here). No UI, writer, SIN, runtime, orCommonbadge-engine changes (ANIMA). Build 0 errors / 361 warnings;--spiraatlas-rt0+--aicmdmeta-rt0PASS. Doc:docs/ai/ATLAS_RIKKU_SHOP_SLOT_VALUE_INDEXER_RESULT_2026-06-09.md
v2.61.0
v2.61.2BETA
Seymour
badge evidenza Atlas nello Shop Explorer (gear-only, value-guarded)
- UI read-only che collega l'accessor (letterale tecnico: Read-only)
TryGetShopGearSlot(provato inv2.61.1) nelloShopExplorer: ogni slot gear-shop mostra<common:AtlasEvidenceBadgeStrip>con origin/badge/"where it appears" della ricompensa gear di quello slot — solo mentre ilRawValuecorrente dello slot corrisponde ancora al corpus.ShopEditableSlotRow.Evidence(init) è calcolato inFrom():source.Kind == Gear && TryGetShopGearSlot(entry.Index, slot.SlotIndex, slot.RawValue). Poiché la riga è ricostruita a OGNI mutazione (ComboBox/Set Empty/Undo/Discard/Save/Refresh → (letterale tecnico: EVERY)RebuildSelectedSlots), modificare lo slot ricalcola l'evidenza e nasconde la strip (nessun badge stantio). L'item-shop non riceve MAI un badge (letterale tecnico: Item-shop) (guardiaKind == Gear+ doppia guardia: l'item non ha voce corpus); uno slot vuoto (raw 0) fa short-circuit. Verificato da un workflow avversario 3-lens (lifecycle esaustivo / item-shop+binding / honesty) → tutto (letterale tecnico: double-guard) (letterale tecnico: short-circuits)sound, 0 difetti. Riusa l'infraCommondi ANIMA (motore intatto); nessun nuovo writer, nessun nuovo parser, nessun SIN/runtime/Aurora/native-menu. Tierparser-corpus+RT0+read-only, mai runtimeproved. Build 0 errori / 361 warning;--spiraatlas-rt0+--aicmdmeta-rt0PASS (nessun gate--shop*inProgram.cs). Doc:docs/ai/ATLAS_RIKKU_SHOP_GEAR_BADGE_UI_RESULT_2026-06-09.md
v2.61.1
v2.61.3BETA
Seymour
provider Atlas: `BlitzballPrizeRef` normalizzato (read-only) sostituisce lo scrape raw a 76 righe
- La sezione premi di
SpiraDataAtlasCatalognon scrape piùbltz0200/0201raw; ora legge il dataset normalizzato di WAKKA (work/step0_blitzball_prize_ref_2026-06-09): 164 righe prize-index (101 treasureproved-candidateviaprize+220 -> takara 220..320 -> reward, chiuse da 3 fonti offline — Fahrenheitblitz_prize.cs+bltz0201 obtainTreasure+bltz0200/0201 Treasure-Label— su takara RT0-proved; 60 techpartial; 3 overdrivemetadata-only) + 64blockedscript-sites (il premio per-evento è una variabile runtime/save). Guardrail riscritto: regolaproved-candidateoffline, il premio concreto per-league/tournamentblocked, mai RT2, mai un writer. Il gate--spiraatlas-rt0è passato da14739a14891dettagli (BlitzballPrizeRef 76 -> 228) e ha guadagnato assert data-grounded (treasure 101 / tech 60 / overdrive 3 / sites 64; prize 0 -> takara 220 Hi-Potion; prize 100 -> takara 320 Coda di fenice; treasureproved-candidate-not-RT2; overdrivemetadata-only; siteblocked). Patch verificata da una review avversaria a 4 agenti prima dell'apply. Nessuna UI, nessun writer, nessun SIN/runtime; non tocca Shop/Treasure/Cocktail (RIKKU), il motore badgeCommon(ANIMA), o Aurora/native-menu. Build 0 errori / 361 warning;--spiraatlas-rt0+--aicmdmeta-rt0PASS. Doc:docs/ai/ATLAS_WAKKA_BLITZBALL_PROVIDER_INTEGRATION_RESULT_2026-06-09.md
v2.61.2
v2.61.4BETA
Seymour
Native Menu Shell WIRED in `ffx-hooks.dll` (passaggio 5 applicato, DISATTIVATO per default)
- La patch step-5.1 (rivista avversarialmente, nessun blocker) è ora applicata a
dllmain.cpp(patch minimale:dllmain.cppSOLO, +166 righe, 0 eliminazioni) — collega (letterale tecnico: ONLY)NativeMenuShell.h(menu nativo con il NOSTRO testo) al bridge di Aurora ( (letterale tecnico: OUR)PhotoModeActions.h) via un detour sul pump menuFFX_Menu_PerFramePump 0x8A9C50(int __cdecl(uint), IDA-verified, MAIN THREAD). DISATTIVATO per default: (letterale tecnico: OFF)FFXHOOKS_ENABLE_NATIVE_MENU=1arma il detour; il menu si apre solo con l'hotkey F7 . Il contratto di Aurora ACCETTATO e seguito: (letterale tecnico: ACCEPTED)PhotoMode::Tick()= Option A (top diAuroraD3DRender, prima dell'ritorno anticipato, con (letterale tecnico: early-return)FFXHOOKS_ENABLE_AURORA_OVERLAY=1, hunk di proprietà AURORA); FREEZE unico proprietario (letterale tecnico: AURORA-owned)g_pm.frozen;NtSuspendProcessPROHIBITED;PhotoMode::g_base=g_basein init. Il wire chiama soloPhotoMode::*— non scrive la RAM camera (0xD378A0) né la RAM attore. Build-WithPolyHook -ReleasePASS (dllmain+MusicHook+ElementHook→ffx-hooks.dll). Step 6A/NPC tenuto FUORI (letterale tecnico: OUT) da questa patch. RT2 in sospeso: (letterale tecnico: RT2-pending) F7 dentro un menu/campo → la shell nativa "PHOTO MODE" dovrebbe apparire (save scartabile). Doc:docs/ai/HANDOFF_BAHAMUT_NATIVE_MENU_WIRE_BLUEPRINT_2026-06-09.md
v2.61.3
v2.61.5BETA
Seymour
badge evidenza Atlas nell'Oggetti Shop (value-guarded) — chiude la coppia gear+item
- Clona il value-guard gear-shop provato in
v2.61.2all'item-shop, ora chev2.61.1+ lo sblocco corpus hanno dato all'item un valore raw 1:1 byte-grounded. Nuovo accessor read-onlySpiraDataAtlasCatalog.TryGetShopItemSlot(bank, slot, currentRawValue)+_shopItemSlotValueslazy (leggeitem_shop_slots.csv, devwork/only, nessun fallback compilato) — un mirror esatto diTryGetShopGearSlot: risolveatlas:item-shop:item-shop-0x{bank}-slot-{n}solo mentre ilRawValuecorrente dello slot corrisponde ancora al corpus (il ushort LE on-disk = item game-index0x2xxx, lo spazio dell'editor) ed è ≠ 0.ShopExplorer_DataModelora calcolaEvidenceper kind shop (switch Gear/Oggetti); il<common:AtlasEvidenceBadgeStrip>nella card slot era già condiviso (v2.61.2), quindi gli slot item ora mostrano il badge senza cambio XAML; modificare lo slot ricostruisce la riga e nasconde la strip (nessuno stantio). Il gate--spiraatlas-rt0ha guadagnato 4 assert item (lookup0x2000/Potion, mismatch0x9999nasconde, empty raw 0, slot 3 no-corpus), tutti PASS (gear ancora PASS). Rigeneratowork/step0_consolidated_v5/item_shop_slots.csvconslot_value_hex(404/404, dev-only, non committato). Read-only: no writer, nessun cambio Treasure/Cocktail/Common/Aurora/native-menu/runtime; il motoreCommondi ANIMA solo consumato. Build 0 errori / 361 warning;--spiraatlas-rt0+--aicmdmeta-rt0PASS. Doc:docs/ai/ATLAS_RIKKU_SHOP_ITEM_BADGE_UI_RESULT_2026-06-09.md
v2.61.4