Update 2.61
9.6.2026
v2.61.0BETA
Seymour
Natives Menü SCHRITT 3: Quelle der nativen Listenzeilen per RE ermittelt + `list-read` (Probe) + Live-Auswahl lesen
- Weiter in der lane des nativen In-Game-Menüs (Yojinbo→): Die Lücke Nr. 1 von Schritt 3 ("Woher kommen die Zeilen der nativen Liste?") ist per IDA geschlossen: Die EINGABE (
FFX_Menu_List_UpdateInput 0x8B4460) ist zu 100 % generisch — reine Feld-Mathematik über dem 152-Byte-Objekt (+40state,+48count,+50top,+52target,+58page,+66slots,+69result,+70scroll,+72selected,+28validator), berührt kein Global und wird von 10 verschiedenen Buildern wiederverwendet — aber jedes native Zeichnen ist item-förmig: Die Scene3-Liste (FFX_Menu_CreateScene3ScrollableList 0x8B4FB0→ draw0x8B4A00→ row0x8B4B20) liest Zeilen ausunk_159EC30[64*i](64-Byte-Strukturen) +byte_1866250[](Typ), wobei der Item-Name über0x86C3C0(id→table)aufgelöst wird und ein optionales direktes Label beirowPtr+32liegt (Typ 1); sie lädt scene3/33/34 und hängt von Customize-Globals ab. Es gibt kein "Freitext-Listen"-Zeichnen im Binär — eine native Liste mit UNSEREM Text (die Arena / Aurora-Photo-Mode-Shell) erfordert daher einen DLL-Zeichnen-Callback (Schritt 5, der in tick-bible §4 vorgesehene Weg), mit dem handgefertigten Rezept dokumentiert (generische Eingabe0x8B4460+ ein DLL-Zeichnen mitsub_8F5F70-Fenster /sub_9016B0-String /sub_8C0640-Cursor, das+69/+72liest). HEUTE per Probe ausgeliefert: neues Verbffxprobectl list-read [handleHex](nur-lesend), das den Pool der Menüobjekte (g_FFX_MenuObjPool 0x18408C0, 32 Tombola × 152B) — findet JEDE aktive native Liste/Popup und identifiziert sie über ihre Callbacks — plus die Abkürzungen "aktuelle Liste"-Globals (dword_1866214/186A5DC/23CC120). ✅ RT2 PASS (live, 2026-06-09): Bei geöffnetem Customize-Ausrüstungs-Menü im Spiel erfasste der Pool-Scan die navigierte Liste (slot[3]@0x017A0A88,input=0x8D57E0, ein dünner Wrapper des generischen0x8B4460), und+72/SELECTEDverfolgte den Cursor in Echtzeit (35→42), als der Bediener ihn bewegte → "Auswahl einer nativen navigierbaren Liste lesen" aus Schritt 3 BEWIESEN, ohne etwas zu schreiben. (Bonus: Das+62 = group 0x101des Reset-Objekts stimmt mitFFX_MenuObj_Reset(IDA) überein — Offsets gegen den Speicher bestätigt.) Kein Kamera-RAM / Aurora /dllmain.cpp/ Save angefasst; IDA nur-lesend (_claude_ida-Kopie, rename-queue im Doc).ffxprobectl-Build 0 Fehler. Schritt 5 (Blueprint): Paste-ready-Gerüst der nativen Shell unterRuntimeTools/NativeMenuShell/NativeMenuShell.h(+README) — Objekt-Hand-Roll + Zeichnen-Callback (Fenster+Zeilen+Cursor) + FFX-Font-Encoder + entkoppelte Brücke zu Auroras Photo-Mode-Aktionen; ABIs/Offsets bestätigt (IDA-Verify-Workflow) und adversarially geprüft (2 Linsen FFX-vs-IDA + C++ → kein Crash/Compile-Blocker); x86-Guard + Anti-OOB-Klemmung + tragende Invarianten annotiert; nicht verdrahtet, fasstdllmain.cpp. an. Schritt 5.1 (Wire-Blueprint, NICHT angewendet): Plan + Patch-Entwurf (docs/ai/HANDOFF_BAHAMUT_NATIVE_MENU_WIRE_BLUEPRINT_2026-06-09.md+docs/patches/BAHAMUT_NATIVE_MENU_WIRE_DRAFT_2026-06-09.patch), der die Shell überffx-hooks.dlleinen Detour auf der Menü-PumpeFFX_Menu_PerFramePump 0x8A9C50(int __cdecl(uint), IDA-verifiziert, Main-Thread) in einbindet — standardmäßig AUS (FFXHOOKS_ENABLE_NATIVE_MENU+ F7), die Brücke ruft nurPhotoMode::*; adversarially geprüft (2 Linsen) kein Blocker (Compile-Reviewer hat es auf einen Scratch-Tree angewendet,git apply --recount --checkexit 0);dllmain.cppNICHT angefasst/committet. Doc:docs/reverse/FFX_NATIVE_MENU_LIST_ROW_SOURCE_2026-06-09.md. [previous:v2.60.2]
v2.61.1BETA
Seymour
Atlas-Gear-Shop-Slot-Value-Guard (`proved-candidate`) + Item-Shop ehrlich `blocked`
- Zweiter Durchgang des Shop-Scouts (
HANDOFF_ATLAS_RIKKU_SHOP_SLOT_VALUE_INDEXER): denselben Value-Guard für Shop freischalten, den Treasure bereits bewiesen hat. Verifiziert durch einen 8-Agenten-Workflow (5 forensische + 2 adversariale + 1 Synthese): derRawValuedes Editor-Slots ist der rohe on-disk little-endian ushort (ShopTable_File≡ReadBaselineSlotValue), undgear_shop_slots.csvsslot_value_hex(445/445 befüllt, dershop_arms.bin-Index) ist dasselbe Wort — der Bodyguard ist also ein Ganzzahlvergleich im selben Raum mit keinem Off-by-one (der Katalog istMinIndex=0, Index 0 = reservierter NULL-Eintrag, erstes verkäufliches Gear = Index 1 =0x01). Neuer Nur-Lese-AccessorSpiraDataAtlasCatalog.TryGetShopGearSlot(bank, slot, currentRawValue)+ lazy_shopGearSlotValues(nur devwork/, kein kompiliertes Fallback, wie das Sphere-Grid-Knoten-Detail): löstatlas:gear:gear-shop-0x{bank}-slot-{n}nur auf, solange der aktuelle Wert des Tombola noch dem Korpus entspricht (und ≠ 0) → das Editieren des Tombola blendet das Abzeichen aus (kein Stale). Das--spiraatlas-rt0-Gate gewann 5 dauerhafte Asserts (positiver Lookup Tidus/Wert 1, Value-Guard-Abweichung 999 blendet aus, leerer Slot roh 0, bank-ohne-Korpus, Randfall0x2E/427), alle PASS. Item-Shop =blocked: der Korpus trägt den Rohwert nicht (item_shop_slots.csv.slot_value_hexzu 100 % leer —ItemShopDataObject.toString()druckt nur den Namen); ein String-Guard ist NICHT fake-sicher (Potion/Phönixfeder/Antidot x47 → stale; Platzhalter + US-vs-JP → falsch-negative). Freischaltung = 1-Zeilen-Parser-Patch + Neu-Run (Korpus-Aufgabe, außerhalb dieses Codes). Ehrliche Stufe:proved read-only candidate (parser-corpus + reader-semantics + RT0), nieruntime/byte-grounded(keinarms_shop.binwurde hier hexdump-t). Keine UI-, Writer-, SIN-, Runtime- oderCommon-Badge-Engine-Änderungen (ANIMA). Build 0 Fehler / 361 Warnungen;--spiraatlas-rt0+--aicmdmeta-rt0PASS. Doc:docs/ai/ATLAS_RIKKU_SHOP_SLOT_VALUE_INDEXER_RESULT_2026-06-09.md. [previous:v2.61.0]
v2.61.2BETA
Seymour
Atlas-Evidenz-Badge im Shop-Explorer (nur Gear, wert-geschützt)
- Nur-lesende UI, die den
TryGetShopGearSlot-Accessor (bewiesen inv2.61.1) in denShopExplorereinbindet: jeder Gear-Shop-Slot zeigt<common:AtlasEvidenceBadgeStrip>mit Origin/Badges/"wo es erscheint" des Gear-Belohnung des Tombola — nur solange der aktuelleRawValuedes Tombola noch zum Korpus passt.ShopEditableSlotRow.Evidence(init) wird inFrom():source.Kind == Gear && TryGetShopGearSlot(entry.Index, slot.SlotIndex, slot.RawValue). Da die Zeile bei JEDER Mutation neu gebaut wird (ComboBox/Set Empty/Undo/Discard/Save/Refresh →RebuildSelectedSlots), berechnet das Bearbeiten des Tombola die Evidenz neu und blendet den Strip aus (kein stale Badge). Item-Shop bekommt nie ein Badge (Kind == Gear-Bodyguard + Doppel-Guard: Item hat keinen Korpus-Eintrag); ein leerer Slot (raw 0) short-circuited. Verifiziert durch einen 3-Linsen-adversarial-Workflow (erschöpfender Lifecycle / item-shop+Binding / Ehrlichkeit) → allesound, 0 Defekte. Nutzt ANIMAsCommon-Infra wieder (Engine unangetastet); kein neuer Writer, kein neuer Parser, kein SIN/runtime/Aurora/native-Menü. Tierparser-corpus+RT0+read-only, nie runtimeproved. Build 0 Fehler / 361 Warnungen;--spiraatlas-rt0+--aicmdmeta-rt0PASS (kein--shop*-Gate inProgram.cs). Doc:docs/ai/ATLAS_RIKKU_SHOP_GEAR_BADGE_UI_RESULT_2026-06-09.md. [previous:v2.61.1]
v2.61.3BETA
Seymour
Atlas-Provider: normalisiertes `BlitzballPrizeRef` (read-only) ersetzt den 76-zeiligen Roh-Scrape
- Der
SpiraDataAtlasCatalog-Preisbereich scrapet nicht mehr rohbltz0200/0201; er liest jetzt WAKKAs normalisierten Datensatz (work/step0_blitzball_prize_ref_2026-06-09): 164 Preis-Index-Zeilen (101 Treasureproved-candidateviaprize+220 -> takara 220..320 -> reward, geschlossen durch 3 Offline-Quellen — Fahrenheitblitz_prize.cs+bltz0201 obtainTreasure+bltz0200/0201 Treasure-Label— über RT0-proved takara; 60 Techpartial; 3 Overdrivemetadata-only) + 64blocked-Script-Sites (der Preis pro Event ist eine Runtime/Save-Variable). Guardrail neu geschrieben: Regelproved-candidateoffline, der konkrete Preis pro League/Tournamentblocked, nie RT2, nie ein Writer. Das--spiraatlas-rt0-Gate ging von14739auf14891Details (BlitzballPrizeRef 76 -> 228) und bekam datenfundierte Asserts (Treasure 101 / Tech 60 / Overdrive 3 / Sites 64; Preis 0 -> takara 220 Hi-Potion; Preis 100 -> takara 320 Phönixfeder; Treasureproved-candidate-nicht-RT2; Overdrivemetadata-only; Siteblocked). Patch vor der Anwendung von einem 4-Agenten-Adversarial-Review verifiziert. Keine UI, kein Writer, kein SIN/Runtime; berührt nicht Shop/Treasure/Basteln (RIKKU), dieCommon-Badge-Engine (ANIMA) oder Aurora/native-menu. Build 0 Fehler / 361 Warnungen;--spiraatlas-rt0+--aicmdmeta-rt0PASS. Doc:docs/ai/ATLAS_WAKKA_BLITZBALL_PROVIDER_INTEGRATION_RESULT_2026-06-09.md. [previous:v2.61.2]
v2.61.4BETA
Seymour
Native Menu Shell in `ffx-hooks.dll` VERDRAHTET (Schritt 5 angewandt,
- standardmäßig OFF). Der Schritt-5.1-Patch (adversarisch reviewed, kein Blocker) ist jetzt auf
dllmain.cppangewandt (minimaler Patch: NURdllmain.cpp, +166 Zeilen, 0 Löschungen) — er verdrahtetNativeMenuShell.h(nativer Menü mit UNSEREM Text) an die Aurora-Bridge (PhotoModeActions.h) über einen Detour auf die Menü-PumpeFFX_Menu_PerFramePump 0x8A9C50(int __cdecl(uint), IDA-verifiziert, MAIN-THREAD). Standardmäßig OFF:FFXHOOKS_ENABLE_NATIVE_MENU=1armiert den Detour; das Menü öffnet nur über die F7-Hotkey. Auroras Vertrag AKZEPTIERT und befolgt:PhotoMode::Tick()= Option A (oben inAuroraD3DRender, vor dem Early-Return, mitFFXHOOKS_ENABLE_AURORA_OVERLAY=1, AURORA-eigener Hunk); FREEZE Single-Ownerg_pm.frozen;NtSuspendProcessVERBOTEN;PhotoMode::g_base=g_baseim Init. Der Wire ruft nurPhotoMode::*— er schreibt nicht Kamera-RAM (0xD378A0) oder Actor-RAM. Build-WithPolyHook -ReleasePASS (dllmain+MusicHook+ElementHook→ffx-hooks.dll). Schritt 6A/NPC AUSSEN VOR in diesem Patch. RT2-pending: F7 in einem Menü/Feld → die native „PHOTO MODE"-Shell sollte erscheinen (verwerfbarer Save). Doku:docs/ai/HANDOFF_BAHAMUT_NATIVE_MENU_WIRE_BLUEPRINT_2026-06-09.md. [vorher:v2.61.3]
v2.61.5BETA
Seymour
Atlas-Evidenz-Badge im Item Shop (wertgeschützt) — schließt das Gear+Item-Paar
- Klont den in
v2.61.2bewiesenen Gear-Shop-Wert-Guard in den Item-Shop, jetzt wov2.61.1+ das Corpus-Unlock Item einen byte-fundierten 1:1-Rohwert gaben. Neuer Read-Only-AccessorSpiraDataAtlasCatalog.TryGetShopItemSlot(bank, slot, currentRawValue)+ lazy_shopItemSlotValues(liestitem_shop_slots.csv, nur devwork/, kein kompiliertes Fallback) — ein exaktes Spiegelbild vonTryGetShopGearSlot: löstatlas:item-shop:item-shop-0x{bank}-slot-{n}nur auf, solange der aktuelleRawValuedes Tombola noch mit dem Corpus übereinstimmt (das On-Disk-LE-ushort = Items-Spielindex0x2xxx, der Raum des Editors) und ≠ 0 ist.ShopExplorer_DataModelberechnet jetztEvidencepro Shop-Kind (Gear/Item-Switch); das<common:AtlasEvidenceBadgeStrip>in der Slot-Karte war bereits geteilt (v2.61.2), also zeigen Item-Slots jetzt das Badge ohne XAML-Änderung; das Bearbeiten des Tombola baut die Zeile neu und versteckt das Strip (kein Stale). Das--spiraatlas-rt0-Gate bekam 4 Item-Asserts (Lookup0x2000/Potion, Mismatch0x9999versteckt, leerer raw 0, No-Corpus-Slot 3), alle PASS (Gear weiterhin PASS).work/step0_consolidated_v5/item_shop_slots.csvmitslot_value_hexneu generiert (404/404, nur dev, nicht committet). Read-only: kein Writer, keine Treasure/Basteln/Änderungen; ANIMAsCommon-Engine nur konsumiert. Build 0 Fehler / 361 Warnungen;--spiraatlas-rt0+--aicmdmeta-rt0PASS. Doc:docs/ai/ATLAS_RIKKU_SHOP_ITEM_BADGE_UI_RESULT_2026-06-09.md. [previous:v2.61.4]