Atualização 2.61
09/06/2026
v2.61.0BETA
Seymour
Menu nativo STEP 3: fonte de linhas native-list reverse-engineered + `list-read` (probe) + leitura de seleção ao vivo
- Continuando a lane de menu nativo in-game (Yojimbo→), o gap step-3 #1 ("de onde vêm as linhas da lista nativa?") é fechado via IDA: a lista INPUT (
FFX_Menu_List_UpdateInput 0x8B4460) é 100% genérica — matemática pura de campo sobre o objeto de 152 bytes (estado+40, count+48, top+50, target+52, page+58, slots+66, result+69, scroll+70, selected+72, validator+28), toca nenhum global, e é reutilizada por 10 builders distintos — mas todo draw nativo é item-shaped: a lista scene3 (FFX_Menu_CreateScene3ScrollableList 0x8B4FB0→ draw0x8B4A00→ linha0x8B4B20) lê linhas deunk_159EC30[64*i](structs de 64 bytes) +byte_1866250[](tipo), com o nome do item resolvido por0x86C3C0(id→table)e um label direto opcional emrowPtr+32(tipo 1); carrega scene3/33/34 e depende de globals do Customize. Não há draw de "free-text list" no binário — então uma lista nativa com texto OUR (o shell da arena / Aurora Photo-Mode) exige um callback de draw DLL (passo 5, o caminho previsto em tick-bible §4), com a receita hand-rolled documentada (input genérico0x8B4460+ um draw DLL usando janelasub_8F5F70/ stringsub_9016B0/ cursorsub_8C0640, lendo+69/+72). Shipado via probe TODAY: novo verboffxprobectl list-read [handleHex](READ-only) que escaneia o menu-object POOL (g_FFX_MenuObjPool 0x18408C0, 32 slots × 152B) — encontra ANY lista/popup nativo ativo e o identifica pelos callbacks — mais o atalho "current list" globals (dword_1866214/186A5DC/23CC120). ✅ RT2 PASS (ao vivo, 2026-06-09): com o jogo no menu Customize equipment, o scan do pool pegou a lista navegada (slot[3]@0x017A0A88,input=0x8D57E0, um wrapper fino do genérico0x8B4460) e+72/SELECTEDrastrearam o cursor em tempo real (35→42) enquanto o operador o movia → step-3 "ler a seleção de uma lista nativa navegável" PROVEN sem escrever nada. (Bônus: o+62 = group 0x101do objeto reset casa comFFX_MenuObj_Reset(IDA) — offsets confirmados contra memória.) Sem câmera RAM / Aurora /dllmain.cpp/ save tocados; IDA read-only (cópia_claude_ida, rename-queue no doc). Buildffxprobectl0 erros. Passo 5 (blueprint): esqueleto paste-ready do shell nativo emRuntimeTools/NativeMenuShell/NativeMenuShell.h(+README) — objeto hand-roll + callback de draw (janela+linhas+cursor) + encoder de fonte FFX + ponte desacoplada para as ações do Photo Mode da Aurora; ABIs/offsets confirmados (workflow verify IDA) e revisados adversarialmente (2 lentes FFX-vs-IDA + C++ → sem blocker de crash/compile); guard x86 + clamp anti-OOB + invariantes load-bearing anotados; não ligado, não tocadllmain.cpp. Passo 5.1 (blueprint de wire, NOT aplicado): plano + rascunho de patch (docs/ai/HANDOFF_BAHAMUT_NATIVE_MENU_WIRE_BLUEPRINT_2026-06-09.md+docs/patches/BAHAMUT_NATIVE_MENU_WIRE_DRAFT_2026-06-09.patch) ligando o shell emffx-hooks.dllvia um detour no pump de menuFFX_Menu_PerFramePump 0x8A9C50(int __cdecl(uint), IDA-verified, main-thread) — OFF por default (FFXHOOKS_ENABLE_NATIVE_MENU+ hotkey F7), a ponte só chamaPhotoMode::*; revisado adversarialmente (2 lentes) sem blocker (revisor de compile aplicou numa árvore 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
slot value-guard do Gear Shop do Atlas (`proved-candidate`) + item-shop honestamente `blocked`
- Segundo pass do scout do Shop (
HANDOFF_ATLAS_RIKKU_SHOP_SLOT_VALUE_INDEXER): desbloqueia o SAME value-guard para Shop que o Treasure já provou. Verificado por um workflow de 8 agentes (5 forenses + 2 adversarial + 1 síntese): o slotRawValuedo editor é o ushort on-disk little-endian cru (ShopTable_File≡ReadBaselineSlotValue), e ogear_shop_slots.csvdeslot_value_hex(445/445 populados, o índiceshop_arms.bin) é essa mesma word — então o guard é uma comparação de inteiro same-space com sem off-by-one (o catálogo éMinIndex=0, índice 0 = entrada reservada NULL, primeiro gear vendável = índice 1 =0x01). Novo accessor read-onlySpiraDataAtlasCatalog.TryGetShopGearSlot(bank, slot, currentRawValue)+ lazy_shopGearSlotValues(só devwork/, sem fallback compilado, como o node detail): resolvesatlas:gear:gear-shop-0x{bank}-slot-{n}somente enquanto o valor atual do slot ainda é igual ao corpus (e ≠ 0) → editar o slot oculta o badge (sem estado obsoleto). O gate--spiraatlas-rt0ganhou 5 asserts duráveis (busca positiva Tidus/valor 1, divergência value-guard 999 oculta, slot vazio raw 0, banco sem corpus, limite0x2E/427), todos PASS. Item-shop =blocked: o corpus não carrega o valor raw (item_shop_slots.csv.slot_value_hex100% vazio —ItemShopDataObject.toString()imprime somente o nome); um string-guard é NOT fake-safe (Potion/Phoenix Down/Antidote x47 → stale; placeholders + US-vs-JP → falsos negativos). Desbloqueio = patch de uma linha no parser + nova execução (tarefa de corpus, fora deste código). Camada honesta:proved read-only candidate (parser-corpus + reader-semantics + RT0), nuncaruntime/byte-grounded(nenhumarms_shop.binfoi hexdumpado aqui). Sem mudanças de UI, writer, SIN, runtime ouCommonbadge-engine (ANIMA). Build 0 erros / 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 de evidência do Atlas no Shop Explorer (gear-only, value-guarded)
- Read-only UI ligando o accessor
TryGetShopGearSlot(provado emv2.61.1) emShopExplorer: cada slot gear-shop mostra<common:AtlasEvidenceBadgeStrip>com origem/badges/"onde aparece" da recompensa de gear daquele slot — só enquanto oRawValueatual do slot ainda casa com o corpus.ShopEditableSlotRow.Evidence(init) é computado emFrom():source.Kind == Gear && TryGetShopGearSlot(entry.Index, slot.SlotIndex, slot.RawValue). Como a linha é reconstruída na mutação EVERY (ComboBox/Set Empty/Undo/Discard/Save/Refresh →RebuildSelectedSlots), editar o slot recomputa a evidência e esconde a faixa (sem badge obsoleto). Item-shop nunca ganha badge (guardKind == Gear+ double-guard: item não tem entrada de corpus); um slot vazio (raw 0) short-circuits. Verificado por um workflow adversarial de 3 lentes (ciclo de vida exaustivo / item-shop+binding / honestidade) → todossound, 0 defeitos. Reutiliza a infraCommonde ANIMA (engine intocado); sem writer novo, sem parser novo, sem SIN/runtime/Aurora/native-menu. Tierparser-corpus+RT0+read-only, nunca runtimeproved. Build 0 erros / 361 avisos;--spiraatlas-rt0+--aicmdmeta-rt0PASS (sem gate--shop*emProgram.cs). Doc:docs/ai/ATLAS_RIKKU_SHOP_GEAR_BADGE_UI_RESULT_2026-06-09.md
v2.61.1
v2.61.3BETA
Seymour
Provider do Atlas: `BlitzballPrizeRef` normalizado (read-only) substitui o scrape cru de 76 linhas
- A seção de prêmio
SpiraDataAtlasCatalognão raspa maisbltz0200/0201cru; agora lê o dataset normalizado de WAKKA (work/step0_blitzball_prize_ref_2026-06-09): 164 linhas prize-index (101proved-candidatede treasure viaprize+220 -> takara 220..320 -> reward, fechadas por 3 fontes offline — Fahrenheitblitz_prize.cs+bltz0201 obtainTreasure+bltz0200/0201 Treasure-Label— sobre RT0-proved takara; 60partialde tech; 3metadata-onlyde overdrive) + 64blockedscript-sites (o prêmio per-event é uma variável runtime/save). Guardrail reescrito: regraproved-candidateoffline, o prêmio concreto per-league/de torneioblocked, nunca RT2, nunca um writer. O gate--spiraatlas-rt0foi de14739para14891detalhes (BlitzballPrizeRef 76 -> 228) e ganhou asserts data-grounded (treasure 101 / tech 60 / overdrive 3 / sites 64; prêmio 0 -> takara 220 Hi-Potion; prêmio 100 -> takara 320 Phoenix Down; treasureproved-candidate-not-RT2; overdrivemetadata-only; siteblocked). Patch verificado por uma revisão adversarial de 4 agentes antes do apply. Sem UI, sem writer, sem SIN/runtime; não toca Shop/Treasure/Mix (RIKKU), o engine de badgeCommon(ANIMA), nem Aurora/native-menu. Build 0 erros / 361 avisos;--spiraatlas-rt0+--aicmdmeta-rt0PASS. Doc:docs/ai/ATLAS_WAKKA_BLITZBALL_PROVIDER_INTEGRATION_RESULT_2026-06-09.md
v2.61.2
v2.61.4BETA
Seymour
Menu nativo Shell WIRED em `ffx-hooks.dll` (passo 5 aplicado, OFF por default)
- O patch step-5.1 (revisado adversarialmente, sem blocker) agora é aplicado a
dllmain.cpp(patch mínimo:dllmain.cppONLY, +166 linhas, 0 deleções) — ligaNativeMenuShell.h(menu nativo com texto OUR) à ponte da Aurora (PhotoModeActions.h) via um detour no pump de menuFFX_Menu_PerFramePump 0x8A9C50(int __cdecl(uint), IDA-verified, MAIN THREAD). OFF por default:FFXHOOKS_ENABLE_NATIVE_MENU=1arma o detour; o menu só abre na hotkey F7. O contrato da Aurora ACCEPTED e seguido:PhotoMode::Tick()= Option A (topo deAuroraD3DRender, antes do early-return, comFFXHOOKS_ENABLE_AURORA_OVERLAY=1, hunk AURORA-owned); FREEZE dono únicog_pm.frozen;NtSuspendProcessPROHIBITED;PhotoMode::g_base=g_baseno init. O wire só chamaPhotoMode::*— não escreve câmera RAM (0xD378A0) nem actor RAM. Build-WithPolyHook -ReleasePASS (dllmain+MusicHook+ElementHook→ffx-hooks.dll). Steps 6A/NPC mantidos OUT deste patch. RT2-pending: F7 dentro de um menu/campo → o shell nativo "PHOTO MODE" deve aparecer (save descartável). Doc:docs/ai/HANDOFF_BAHAMUT_NATIVE_MENU_WIRE_BLUEPRINT_2026-06-09.md
v2.61.3
v2.61.5BETA
Seymour
Badge de evidência do Atlas no Item Shop (value-guarded) — fecha o par gear+item
- Clona o gear-shop value-guard provado em
v2.61.2para item-shop, agora quev2.61.1+ o unlock do corpus deram ao item um valor cru byte-grounded 1:1. Novo accessor read-onlySpiraDataAtlasCatalog.TryGetShopItemSlot(bank, slot, currentRawValue)+ lazy_shopItemSlotValues(lêitem_shop_slots.csv, só devwork/, sem fallback compilado) — um espelho exato deTryGetShopGearSlot: resolveatlas:item-shop:item-shop-0x{bank}-slot-{n}só enquanto oRawValueatual do slot ainda casa com o corpus (o ushort on-disk LE = Items game-index0x2xxx, o espaço do editor) e é ≠ 0.ShopExplorer_DataModelagora computaEvidencepor kind de shop (switch Gear/Item); o<common:AtlasEvidenceBadgeStrip>no card do slot já era compartilhado (v2.61.2), então slots de item agora mostram o badge sem mudança XAML; editar o slot reconstrói a linha e esconde a faixa (sem stale). O gate--spiraatlas-rt0ganhou 4 asserts de item (lookup0x2000/Potion, mismatch0x9999esconde, raw 0 vazio, slot 3 no-corpus), todos PASS (gear ainda PASS).work/step0_consolidated_v5/item_shop_slots.csvregenerado comslot_value_hex(404/404, dev-only, não commitado). Read-only: sem writer, sem mudanças de Treasure/Mix/Common/Aurora/native-menu/runtime; o engineCommonde ANIMA só consumido. Build 0 erros / 361 avisos;--spiraatlas-rt0+--aicmdmeta-rt0PASS. Doc:docs/ai/ATLAS_RIKKU_SHOP_ITEM_BADGE_UI_RESULT_2026-06-09.md
v2.61.4