Mise à jour 2.61
09/06/2026
v2.61.0BETA
Seymour
Menu natif ÉTAPE 3 : source de lignes de liste native rétro-ingénierée + `list-read` (sonde) + lecture de sélection en direct
- Continuant la voie du menu natif en jeu (Yojimbo→), l'écart étape-3 #1 (« d'où viennent les lignes de la liste native ? ») est fermé via IDA : l'INPUT de la liste (
FFX_Menu_List_UpdateInput 0x8B4460) est 100% générique — pur calcul de champs sur l'objet 152-octets (+40état,+48compte,+50top,+52cible,+58page,+66slots,+69résultat,+70scroll,+72sélectionné,+28validateur), ne touche aucun global, et est réutilisé par 10 builders distincts — mais chaque draw natif est en forme d'item : la liste scene3 (FFX_Menu_CreateScene3ScrollableList 0x8B4FB0→ draw0x8B4A00→ row0x8B4B20) lit les lignes depuisunk_159EC30[64*i](structs 64 octets) +byte_1866250[](type), avec le nom d'item résolu par0x86C3C0(id→table)et un label direct optionnel àrowPtr+32(type 1) ; elle charge scene3/33/34 et dépend des globals Customize. Il n'y a aucun draw de « liste texte libre » dans le binaire — donc une liste native avec NOTRE texte (l'arène / la coquille Aurora Photo-Mode) nécessite un callback de draw DLL (étape 5, le chemin prévu dans tick-bible §4), avec la recette hand-rolled documentée (input générique0x8B4460+ un draw DLL utilisant la fenêtresub_8F5F70/ la chaînesub_9016B0/ le curseursub_8C0640, lisant+69/+72). Livré via sonde AUJOURD'HUI : nouveau verbeffxprobectl list-read [handleHex](lecture seule) qui scanne le POOL d'objets menu (g_FFX_MenuObjPool 0x18408C0, 32 slots × 152B) — trouve TOUTE liste/popup native active et l'identifie par ses callbacks — plus le raccourci globals « liste courante » (dword_1866214/186A5DC/23CC120). ✅ RT2 PASS (live, 2026-06-09) : avec le jeu dans le menu Customize equipment, le scan du pool a attrapé la liste naviguée (slot[3]@0x017A0A88,input=0x8D57E0, un wrapper fin du générique0x8B4460) et+72/SELECTEDa suivi le curseur en temps réel (35→42) pendant que l'opérateur le déplaçait → étape-3 « lire la sélection d'une liste native navigable » PROUVÉ sans rien écrire. (Bonus : le+62 = group 0x101de l'objet réinitialiser correspond àFFX_MenuObj_Reset(IDA) — offsets confirmés contre la mémoire.) Pas de RAM caméra / Aurora /dllmain.cpp/ save touchés ; IDA en lecture seule (copie_claude_ida, rename-queue dans le doc).ffxprobectlbuild 0 erreurs. Étape 5 (blueprint) : squelette paste-ready de la coquille native àRuntimeTools/NativeMenuShell/NativeMenuShell.h(+README) — objet hand-roll + callback draw (fenêtre+rangs+curseur) + encodeur de police FFX + pont découplé vers les actions Photo Mode d'Aurora ; ABIs/offsets confirmés (workflow IDA) et revu adversarially (2 lenses FFX-vs-IDA + C++ → pas de bloqueur crash/compile) ; garde x86 + clamp anti-OOB + invariants porteurs annotés ; pas câblé, ne touche pasdllmain.cpp. Étape 5.1 (blueprint de câblage, PAS appliqué) : plan + brouillon 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) câblant la coquille dansffx-hooks.dllvia un detour sur la pompe menuFFX_Menu_PerFramePump 0x8A9C50(int __cdecl(uint), IDA-vérifié, main-thread) — OFF par défaut (FFXHOOKS_ENABLE_NATIVE_MENU+ touche F7), le pont appelle seulementPhotoMode::*; revu adversarially (2 lenses) pas de bloqueur (le reviewer compile l'a appliqué à un arbre scratch,git apply --recount --checkexit 0) ;dllmain.cppPAS touché/committé. Doc :docs/reverse/FFX_NATIVE_MENU_LIST_ROW_SOURCE_2026-06-09.md
v2.60.2
v2.61.1BETA
Seymour
value-guard Gear Shop Atlas (`proved-candidate`) + item-shop honnêtement `blocked`
- Deuxième passe du scout Shop (
HANDOFF_ATLAS_RIKKU_SHOP_SLOT_VALUE_INDEXER) : débloquer le MÊME value-guard pour Shop que Treasure a déjà prouvé. Vérifié par un workflow 8-agents (5 forensiques + 2 adversariaux + 1 synthèse) : leRawValuede slot de l'éditeur est le ushort little-endian brut on-disk (ShopTable_File≡ReadBaselineSlotValue), etgear_shop_slots.csvdeslot_value_hex(445/445 peuplés, l'indexshop_arms.bin) est ce même mot — donc la garde est une comparaison d'entiers même-espace avec aucun off-by-one (le catalogue estMinIndex=0, index 0 = entrée NULL réservée, premier gear vendable = index 1 =0x01). Nouvel accesseur en lecture seuleSpiraDataAtlasCatalog.TryGetShopGearSlot(bank, slot, currentRawValue)+_shopGearSlotValueslazy (devwork/seulement, pas de repli compilé, comme le détail Sphere Grid node) : résoutatlas:gear:gear-shop-0x{bank}-slot-{n}seulement tant que la valeur actuelle du slot égale encore le corpus (et ≠ 0) → éditer le slot cache le badge (pas de stale). La porte--spiraatlas-rt0a gagné 5 assertions durables (lookup positif Tidus/valeur 1, mismatch value-guard 999 cache, slot vide raw 0, bank-sans-corpus, bord0x2E/427), toutes PASS. Objets-shop =blocked: le corpus ne porte pas la valeur brute (item_shop_slots.csv.slot_value_hex100% vide —ItemShopDataObject.toString()imprime seulement le nom) ; une garde de chaîne n'est PAS fake-safe (Potion/Queue de phénix/Antidote x47 → stale ; placeholders + US-vs-JP → faux négatifs). Déblocage = patch parser 1 ligne + re-run (tâche corpus, hors de ce code). Tier honnête :proved read-only candidate (parser-corpus + reader-semantics + RT0), jamaisruntime/byte-grounded(aucunarms_shop.binhexdumpé ici). Pas de changement UI, écrivain, SIN, runtime, ni moteur de badgeCommon(ANIMA). Build 0 erreur / 361 warning ;--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 preuve Atlas dans le Shop Explorer (gear-only, value-guarded)
- UI en lecture seule branchant l'accesseur
TryGetShopGearSlot(prouvé dansv2.61.1) dansShopExplorer: chaque slot de gear-shop montre<common:AtlasEvidenceBadgeStrip>avec l'origine/badges/« où il apparaît » de la récompense gear de ce slot — seulement tant que leRawValueactuel du slot correspond encore au corpus.ShopEditableSlotRow.Evidence(init) est calculé dansFrom():source.Kind == Gear && TryGetShopGearSlot(entry.Index, slot.SlotIndex, slot.RawValue). Comme la rangée est reconstruite à CHAQUE mutation (ComboBox/Set Empty/Undo/Discard/Save/Refresh →RebuildSelectedSlots), éditer le slot recalcule l'evidence et cache la bande (pas de badge obsolète). Objets-shop n'obtient jamais de badge (gardeKind == Gear+ double-garde : item n'a pas d'entrée corpus) ; un slot vide (raw 0) short-circuite. Vérifié par un workflow adversarif 3-lens (cycle de vie exhaustif / item-shop+binding / honnêteté) → toussound, 0 défauts. Réutilise l'infraCommond'ANIMA (moteur intact) ; pas de nouvel écrivain, pas de nouveau parser, pas de SIN/runtime/Aurora/native-menu. Tierparser-corpus+RT0+read-only, jamais runtimeproved. Build 0 erreur / 361 warning ;--spiraatlas-rt0+--aicmdmeta-rt0PASS (pas de porte--shop*dansProgram.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` normalisé (lecture seule) remplace le scrape brut de 76 lignes
- La section prix de
SpiraDataAtlasCatalogne scrape plus le brutbltz0200/0201; elle lit désormais le dataset normalisé de WAKKA (work/step0_blitzball_prize_ref_2026-06-09) : 164 rangées d'index de prix (101 treasureproved-candidateviaprize+220 -> takara 220..320 -> reward, fermées par 3 sources hors ligne — Fahrenheitblitz_prize.cs+bltz0201 obtainTreasure+bltz0200/0201 Treasure-Label— sur takara RT0-prouvé ; 60 techpartial; 3 overdrivemetadata-only) + 64blockedscript-sites (le prix par événement est une variable runtime/save). Garde-fou réécrit : règleproved-candidatehors ligne, le prix concret par league/tournamentblocked, jamais RT2, jamais un écrivain. La porte--spiraatlas-rt0est passée de14739à14891détails (BlitzballPrizeRef 76 -> 228) et a gagné des assertions data-grounded (treasure 101 / tech 60 / overdrive 3 / sites 64 ; prize 0 -> takara 220 Potion + ; prize 100 -> takara 320 Queue de phénix ; treasureproved-candidate-not-RT2 ; overdrivemetadata-only; siteblocked). Patch vérifié par une revue adversariale 4-agents avant application. Pas d'UI, pas d'écrivain, pas de SIN/runtime ; ne touche pas Shop/Treasure/Alchimie (RIKKU), le moteur de badgeCommon(ANIMA), ni Aurora/native-menu. Build 0 erreur / 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 Blindage CÂBLÉ dans `ffx-hooks.dll` (étape 5 appliquée, OFF par défaut)
- Le patch étape-5.1 (revu adversarially, sans bloqueur) est désormais appliqué à
dllmain.cpp(patch minimal :dllmain.cppSEULEMENT, +166 lignes, 0 suppressions) — il câbleNativeMenuShell.h(menu natif avec NOTRE texte) au pont d'Aurora (PhotoModeActions.h) via un detour sur la pompe de menuFFX_Menu_PerFramePump 0x8A9C50(int __cdecl(uint), IDA-vérifié, THREAD PRINCIPAL). OFF par défaut :FFXHOOKS_ENABLE_NATIVE_MENU=1arme le detour ; le menu ne s'ouvre que sur la touche F7. Le contrat d'Aurora ACCEPTÉ et suivi :PhotoMode::Tick()= Option A (en haut deAuroraD3DRender, avant le early-return, avecFFXHOOKS_ENABLE_AURORA_OVERLAY=1, hunk AURORA-owned) ; FREEZE owner uniqueg_pm.frozen;NtSuspendProcessINTERDIT ;PhotoMode::g_base=g_basedans init. Le câblage appelle seulementPhotoMode::*— il n'écrit pas la RAM caméra (0xD378A0) ni la RAM acteur. Build-WithPolyHook -ReleasePASS (dllmain+MusicHook+ElementHook→ffx-hooks.dll). Step 6A/NPC gardé HORS de ce patch. RT2-pending : F7 dans un menu/field → la coquille native "PHOTO MODE" devrait apparaître (sauvegarde jetable). Doc :docs/ai/HANDOFF_BAHAMUT_NATIVE_MENU_WIRE_BLUEPRINT_2026-06-09.md
v2.61.3
v2.61.5BETA
Seymour
badge de preuve Atlas dans l'Objets Shop (value-guarded) — ferme la paire gear+item
- Clone le value-guard gear-shop prouvé dans
v2.61.2vers item-shop, maintenant quev2.61.1+ le déblocage du corpus ont donné à item une valeur brute 1:1 byte-grounded. Nouvel accesseur en lecture seuleSpiraDataAtlasCatalog.TryGetShopItemSlot(bank, slot, currentRawValue)+_shopItemSlotValueslazy (lititem_shop_slots.csv, devwork/seulement, pas de repli compilé) — un miroir exact deTryGetShopGearSlot: résoutatlas:item-shop:item-shop-0x{bank}-slot-{n}seulement tant que leRawValueactuel du slot correspond encore au corpus (le ushort LE on-disk = game-index Items0x2xxx, l'espace de l'éditeur) et est ≠ 0.ShopExplorer_DataModelcalcule désormaisEvidencepar kind de shop (switch Gear/Objets) ; le<common:AtlasEvidenceBadgeStrip>dans la carte de slot était déjà partagé (v2.61.2), donc les slots d'item montrent maintenant le badge sans changement XAML ; éditer le slot reconstruit la rangée et cache la bande (pas de stale). La porte--spiraatlas-rt0a gagné 4 assertions item (lookup0x2000/Potion, mismatch0x9999caché, raw 0 vide, slot 3 sans corpus), toutes PASS (gear toujours PASS). Régénéréwork/step0_consolidated_v5/item_shop_slots.csvavecslot_value_hex(404/404, dev-only, pas committé). Lecture seule : pas d'écrivain, pas de changement Treasure/Alchimie/Common/Aurora/native-menu/runtime ; le moteurCommond'ANIMA seulement consommé. Build 0 erreur / 361 warning ;--spiraatlas-rt0+--aicmdmeta-rt0PASS. Doc :docs/ai/ATLAS_RIKKU_SHOP_ITEM_BADGE_UI_RESULT_2026-06-09.md
v2.61.4