Atualização 2.198
01/08/2026
v2.198.0.0BETAMINOR
Seymour31 de jul. de 2026
P3-L2: `GameEnvironmentProbe` (health check do ambiente de runtime)
Core/GameEnvironmentProbe.cs(novo, 10 testes): detector de versão / health check do ambiente de runtime — cumpre o contrato P3 (prompt L410-416: detector · contrato de install/config/permission/path · fallback · erro acionável sem stack cru · matriz de compatibilidade). Detecta:FFX.exe(versão FileVersionInfo + região viadata\jppc/intl/us/eu),modules\ffx-probe.dll+modules\FfxHooksDll.dll, flags ativas (config\*.flage raiz), probe ao vivo viaFfxProbe_Service(MMFLocal\FFXProbeBlock_v1— IsAttached/IsHooked/Heartbeat, read-only, nada armado). Descoberta da raiz do jogo: envFFX_GAME_ROOT→ registro Steam →libraryfolders.vdf(parse unescape, testável) → candidatos comuns. Resultado tipadoGameEnvironmentReport(State Ok/Warning/Error +EnvironmentIssueCode/Message/ActionableMessage) — UI mostra estado tipado, nunca stack cru.- Baseline: 233/233 PASS (223 + 10 novos). ### REVISION ### REVISION
v2.197.1.1
v2.198.1.0BETAPATCH
Seymour31 de jul. de 2026
P3-L3: hardening da operations-platform (cancelamento/rollback/journal/lock/redaction) + suíte de resiliência (12 testes)
Core/OperationExecutorV2.cs(hardening):ExecuteAsync(plan, CancellationToken)com checkpoints (antes do stage, entre ops, antes do promote, durante o promote) e propagação emStageAsync; rollback automático no promote (falha/cancelamento restaura saídas já promovidas a partir dos backups, ou remove saídas criadas por este promote); journal.json em BackupRoot (estados promoting/success/cancelled/failed — contrato de recuperação, a tentativa de melhor esforço nunca falha a operação); lock estático serializando o promote (contrato de concorrência — 2 ops na mesma saída nunca intercalam); redação (LlmRedactor) em ErrorMessage/RecoveryInstructions/journal (segredo nunca aparece em superfícies de falha).FFXProjectEditor.Tests/Core/OperationResilienceTests.cs(novo, 12 testes): cancel antes do stage / durante o stage (adapter observa o token) → nada escrito; falha de promote injetada → rollback da saída already-promoted (hash original restaurado); journal failed/success + backup .bak com bytes originais; concorrência (2 execuções paralelas na mesma saída → resultado intacto, um vencedor completo); segredo redigido das mensagens de falha; plano vazio → "No operations"; diff proibido (EditSession.Build rejeita campo fora da allowlist); OperationPlan JSON round-trip; recibo de falha consistente (FilesWritten=0).- Baseline: 245/245 PASS (233 + 12 novos). ### MINOR ### MINOR
v2.198.0.0
v2.198.2.0BETAPATCH
Seymour31 de jul. de 2026
Hardening do FfxSaveSphereGrid (guard de limites + verdade nativa) + importação da tabela de símbolos do Ghidra/Fahrenheit para o DB canônico (8.281 renames)
FfxLib/Save/FfxSaveSphereGrid.cs(fix):FfxSaveSphereGridNodeSnapshot.Read/Write/ReadActivation/WriteActivationagora guardaNodeIndex(0..859 no modelo FFXED legado) comArgumentOutOfRangeExceptionacionável — corrige uma escrita OOB latente no buffer de save; novas constantesNativeTableBase(=8684) eNativeMaxNodeIndex(=1279) expõem a capacidade nativa do save; docs XML esclarecem o skew +64 vsFfxSaveSphereGridRuntimeTablee que 860 é NOT o limite do engine.FfxLib/Save/FfxSaveSphereGridRuntimeTable.cs(doc): cross-confirmed pela tabela de símbolos Fahrenheit/Ghidra —eiAbmDataInit(SaveSphereGrid*)@ 0xA53DE0 eMsGetSaveAbilityMap() → SaveSphereGrid*@ 0x785000 provam que o bloco de estado é um tipo real do engine; capacidade nativa 1280 nós / 1280 links / cursor.FfxLib/Save/FfxSaveBatchActions.cs(doc):ImportSphereGridRegiondocumentado como modelo legado +64; caminho nativo apontado (span 8684..13579) para grids >860.- RE — import Fahrenheit-crew/fahrenheit (Ghidra) symbol-table: 7.609 funções + 672 globals renomeadas no DB base
ffxoficial.exe.i64(8.281 total; fontes USER_DEFINED 460 + IMPORTED 2.816 + ANALYSIS filtrado 7.570; nunca sobrescreve nomesFFX_*do projeto — 3.774 preservados); globals ganharam tipos primitivos; backupbackups_ffxoficial\ffxoficial.exe.before_ghidra_renames_20260731_231338.i64. Propagado para o DBffxoficial_COPY.i64de trabalho da equipe via o plugin ida-pro-mcp RPC dentro do GUI (porta 13338): 7.440 funções + 490 globals aplicadas no COPY, 17 puladas (nomes GUI preservados), DB salvo; backupffxoficial_COPY.before_ghidra_renames_20260731_233813.i64. Achados: structLpAbilityMapEngine(0x12FC0; clusters[128]/nodes[1024]/links[1024] — layout completo no doc), buffer.dataestático0x16AD870(InitLpamng @ A572E0), 12 funções com loop1024mapeadas (RenderPathNodes A50290, eiAbmCalc A53570, eiAbmParaGet A54860, ClearNodeTransforms A57120, ReadAndProcessInputState A57520, BuildLinkBatchSegment A57710, UpdatePlacementSlotTransform A58080, DialogDispatch A583E0, InitPlacementGrid A5B230, +3), render 861 (681DB0/7F4900), nomes originaiseiAbm*/+AbmapState_*/abmap_*, tipoSaveSphereGridconfirmado. Conclusão-chave: o save nativo já suporta 1280/1280 — o gargalo para exceder 1024 é a struct estática de runtime + loops + render, não o save. Doc:docs/reverse/FFX_GHIDRA_FAHRENHEIT_SYMBOL_IMPORT_2026-07-31.md; scripts/relatórios emwork/_fahrenheit_probe/. - Status:
Needs Testing— build verde; novos guards não têm consumidores out-of-range (sem uso de código além de docs). ### PATCH
v2.198.1.0
v2.198.2.1BETAREVISION
Seymour31 de jul. de 2026
fahrenheit-excel: nomes reais de campo de kernel aplicados ao editor (KeyItem/Important + Treasure/takara) + container "Excel" documentado
- Source: segundo repo fahrenheit (
fahrenheit-excel) com 8 structs novos + reescritaexcel.cs(container Excel:ExcelProlog0x8 +ExcelHeader0xC +ExcelTextOffset0x4 — bate com nossoCustomization_File.ReadHeader, HeaderLength 0x14). FfxLib/Common/KeyItem_File.cs+ KeyItemEditor (rename):PrimerByte10/RawByte11/RawByte12/OrderingByte13→ItemType/ItemValue/Icon/Number(nomes reais do Ghidra; 0x10 = "é Al Bhed Primer?", 0x13 = número do primer) — XAML, resumos e RT0 atualizados.FfxLib/Treasure/Treasure_File.cs+ TreasureEditor + BukiGetTreasureCatalog + TaskRewardGameFileLoader + TreasureRt0 (rename):Treasure_Entry.Type→ItemId(confirma oTreasure{item_id u16}do fahrenheit); VMTreasureRow.Type/TypeHex/TypeDecimal→ItemId/ItemIdHex/ItemIdDecimal; bindings XAML atualizados.- Confirmações:
MixRecipe= ushort[0x70] bate comMixTable_File(EntryLength 0xE0);SphereGridNodeType.amount@0x14confirmaIncreaseAmount;SphereGridNodeTypeInfo→SphereGridNodeTypeUiInfo(o array lpamngnode_type_infosé UI-only). - Documentado (writers futuros):
Sphere(ACTIVATOR/MODIFIER + bitmask de 11 stats + faixa NORMAL/UNLIMITED),Rate,WeaponName,HelpText/NameHelpText,Treasure. - Baseline: 245/245 PASS · Build 0 erros. Doc:
docs/reverse/FFX_GHIDRA_FAHRENHEIT_SYMBOL_IMPORT_2026-07-31.md§fahrenheit-excel. ### PATCH
v2.198.2.0
v2.198.3.0BETAPATCH
Seymour31 de jul. de 2026
P3-L4: release — `scripts/release_manifest.ps1` (manifesto verificável) + documento de processo
scripts/release_manifest.ps1(novo, operacional): manifest de release — versão lida de<Version>no csproj (fonte de verdade), SHA-256 de cada artefato de build.exe/.dll(+ sidecars.sha256via .NET SHA256 — compatível com o PS desta máquina), primeira entrada de changelog (cross-check),gitCommit/gitDirty(dirty-worktree release = alerta) esigning: "not-signed"(assinatura nunca declarada pronta sem executar). Validado: 103 artefatos do build Release com hashes corretos.docs/ai/P3_RELEASE_2026-07-31.md(novo): fluxo de release em 7 passos (build → testes → offline_ci → deploy em todos os alvos → manifest → verificação de hash → assinatura); auditoria.gitignore(cobertura já presente — bin/obj/work/.vs, sem mudanças necessárias; sem cleanup destrutivo em worktree com trabalho alheio); assinatura documentada AS A PLAN (signtool/Authenticode — não executada, nenhum certificado importado).- Sem mudança de comportamento do editor — baseline 245/245 PASS intocado. ### PATCH
v2.198.3.3
v2.198.3.1BETAREVISION
Seymour31 de jul. de 2026
P3-L5: contrato curto Gemini (UI ↔ Core)
docs/ai/P3_GEMINI_CONTRACT_2026-07-31.md(contrato baseado nos tipos reais): ownership de arquivo (Core = backend / Modules+AXAML = UI); DTOs públicos (CapabilityDescriptor, OperationPlanPreview/ChangeSetSummary, OperationProgress, CommitReceipt, ValidationResult, OperationResult, FilePreviewSummary/OperationPreview, GameEnvironmentReport); comandos (EditSession fluente, OperationExecutorV2, OperationPreview, ReceiptBuilder, GameEnvironmentProbe); estados tipados loading/empty/unavailable/warning/blocked/failure com origens reais; códigos ValidationIssue; os 10 IDs de capacidade reais; mock/provisional (descoberta Steam heurística, LAB FfxProbe_Service, opt-in LlmHttpAdapter, OperationProgress sem wiring completo); regras duras (UI nunca cria writer fora de OperationPlan; mensagens já redigidas; AXAML/themes só com coordenação). Read-only — baseline 245/245 PASS intocado. ### PATCH
v2.198.3.0
v2.198.3.2BETAREVISION
Seymour31 de jul. de 2026
P3-L6: protocolo per-family RT2 (reproduzível, logado)
docs/ai/P3_RT2_PROTOCOL_2026-07-31.md(protocolo; execução = runtime humano): RT0/RT1/RT2 distintos com gates de saída (RT0 = CLI byte-identity gates; RT2 = log reproduzível antes/depois + save descartável); pré-requisitos de sessão (probe deployado,ffxprobectl mon, save descartável, editor fechado); piloto da família Phase Rotation em 7 passos (aplicar receita → hash H2 → deploy com backup vanilla H1 → batalha → 5 turnos observados → leitura read-only counter-var → restore H1 → promoção só com log); checklist per-family (probe PROVEN/Force Battle 1 cenário/Phase Rotation pendente/hooks parciais/probes read-only); regras de promoção (nunca RT0→produção sem RT2; nunca o save principal; nunca CreateRemoteThread); contradição de Force Battle referenciada (PROVEN mecanismo / LAB produto). Read-only — baseline 245/245 PASS intocado. ### REVISION ### REVISION
v2.198.3.1
v2.198.3.3BETAREVISION
Seymour1 de ago. de 2026
prompt Gemini atualizado: backend P3 completo refletido (245/245, executor cancel/rollback/journal/lock, IDs de adapter reais, contrato obrigatório UI↔Core)
docs/ai/PROMPT_GEMINI_UI_UX_FINAL_2026-08-01.md(atualizado): header com versão2.198.3.2+ 245/245 PASS; leitura obrigatória agora incluiP3_GEMINI_CONTRACT_2026-07-31.md(item 5 — o contrato oficial UI↔Core); tabela Core comOperationExecutorV2atualizado (CancellationToken 4 checkpoints, rollback automático, journal.json, PromoteGate, mensagens redigidas) + novos tiposOperationPreview/FilePreviewSummary(diff de 3 camadas); tabela de adapter corrigida (10 registrados — era "8" com 10 linhas — e IDs REAL:ability-commandeatel-recipe-phase-rotation, que estavam errados);GameEnvironmentProbecom descoberta (env/registry/libraryfolders.vdf); novo bloco "Backend state" (245/245, executor confiável, mensagens already-redacted, health check exception-free, preview de 3 camadas, manifest de release, protocolo RT2, other-lane changes — guard de limites FfxSaveSphereGrid, renames fahrenheit, FAILmcyt00_21anotados conhecidos); Limits agora incluem commits seletivos (lane race — nuncagit add -A). No behavior change — baseline 245/245 PASS intocado. ### REVISION ### REVISION
v2.198.3.2
v2.198.3.4BETAPATCH
Seymour1 de ago. de 2026
SphereGrid sphere.bin adaptado à struct `Sphere` do fahrenheit (nomes reais + enums + correção do validator comprovada pelo corpus)
FfxLib/SphereGrid/SphereGrid_File.cs(+Write.cs) (rename+enums):SphereGridSphereTypeEntryActionValue/ActivationBitfield/RangeValue/AlwaysZero→Behavior/Activates/Range/Reserved0x0E(nomes Ghidra/fahrenheitSphere); novos enumsSphereBehavior(None/Activator/Modifier),SphereTargets[Flags] (11 stats,All=0x07FF— ordem de bit não provada, valores vanilla documentados),SphereRange(None/Normal/Unlimited=0x20); props derivadasBehaviorKind/ActivatesTargets/RangeKind;ActionLabelcorrigido ("Mutator"→"Modifier").Core/Writers/SphereGridAdapter.cs(fix+hardening): chaves renomeadas (Behavior/Activates/Range/Reserved0x0E);SpecialRolevalidador corrigido 0x0F→0x1F (corpus vanilla usa papéis especiais até 24 — slots sphere.bin 14..29; o validador antigo rejeitava grids legítimos);Behaviorvalidado 0..2 (corpus prova só 0..2); mensagens citam os enums.SphereGridExplorer(rename): VMSphereGridSphereTypeEditorRow+ estado + helpers + XAML atualizados;SetSelectedOptions/diffs/baseline renomeado.- Prova de corpus (jppc
battle\kernel\sphere.bin, 50 entradas, elem 0x10): ACTIVATOR=1 (Ability/Power/Mana/Speed/Luck + Key L1–L4 especiais 8..11 + Friend 0x07FF), MODIFIER=2 (Return=1, Teleport=2, Clear=3, Master=4), faixa 0x01 NORMAL / 0x20 UNLIMITED; índices batem comSphereGridNodeSphereRequirementKind(Ability=0..Luck=4). Doc:docs/reverse/FFX_GHIDRA_FAHRENHEIT_SYMBOL_IMPORT_2026-07-31.md§sphere.bin. - Baseline: 245/245 PASS · Build 0 erros. Status:
validated(renames byte-idempotent + RT0/RoundTrip intactos). ### REVISION
v2.198.3.3
v2.198.4.0BETAPATCH
Seymour1 de ago. de 2026
Caminho de teste RT2 limpo e sem hook para True New Node + correção da teoria do crash + confirmação externa da comunidade (1024/1024/128)
SphereGridDeployPolicy.cs(revisão): o achado "no-hook 861/882 crasham ao sair" veio de execuções RT2 da stack de hook v5 aposentada (manifest/sidecar/SEH) — nunca de um deploy limpo. Com o RE de hoje (engine header-driven;LpAbilityMapEngineestático 1024/1024/128; save nativo 1280/1280), contagens ≤ 1024 não precisam de hook. Teto real suspeito: render (buffers681DB0861×48 + gate7F4900n861 >= 861). Novo override opt-inbuilder.AllowRuntimeTestDeploy(default OFF) desbloqueia SaveToProject/SaveSquareToProject com contagens alteradas para o teste limpo.SphereGrid_File.Builder.cs: propriedadeAllowRuntimeTestDeploy+ docs.SphereGridCanvas_DataModel.cs+SphereGridCanvas_Control.axaml: checkbox de toolbar "Permitir RT2 de teste (no-hook)";RefreshTopologySafetySummarymostra o estado do teste (🧪 liberado com aviso disposable-save / 🚫 bloqueado com a explicação corrigida).- Confirmação externa: EvelynTSMG (fahrenheit-crew) confirmou o teto 1024 nós / 1024 links / 128 clusters — batida exata com o
LpAbilityMapEngineque provamos (arrays em 0x808/0xA808/0x8, buffer.data0x16AD870). Dragoon (comunidade) testando add/tie/expand no editor dele. - Protocolo de teste RT2 limpo documentado (doc RE §confirmação externa): Standard → Square Mode → +1 nó/+1 link → checkbox → Save → deploy → save descartável → abrir/mover/sair → sem crash = teto excedido (repetir 900/1024); crash = render é o teto (patch de 2 bytes, sem hook).
- Baseline: 245/245 PASS · Build 0 erros. Status:
Needs Testing(RT2 humano). ### PATCH
v2.198.3.4
v2.198.4.1BETAPATCH
Seymour1 de ago. de 2026
fix semântico dos opcodes de comparação ATEL (0x0A/0x0B/0x0E/0x0F) — provado por decompile do interpreter
- Descoberta (source: noclip.website
src/FinalFantasyX/script.ts— enum de opcode field-script): o mapeamento do codec (GT=0x0A, LT=0x0B, GE=0x0E, LE=0x0F) estava invertido vs noclip (LT=0x0A, GT=0x0B...). Provado por decompile deFFX_Atel_InterpretWorkerOpcodes@0x864180+FFX_FieldVM_PopOperand@0x86DE90(pop = topo): com a stack[A(base), B(top)], 0x0B testaA < B, 0x0A testaA <= B(0x0E/0x0F = variantes float). Não existe "greater-than" direto — o compilador expressaA > Bcomo[B, A] + 0x0B(B < A). O gate RT0 (round-trip estrutural) não consegue pegar erros semânticos — só o decompile os expõe. - Fix:
AiVarConditionBuilder(GreaterThan/GreaterOrEqual agora emitem ordem trocada[N, var]+ LT/LE; LessOrEqual corrigido 0x0F→0x0A),AiAutomation(guards de field/status/Overdrive:[threshold, field]+ LT; constantes GT/GE removidas),AiPhaseRotationRecipe(guard final-phase:[FinalLimit, counter]+ LT),AiBibleCatalog(tabela 0x0A–0x0F corrigida com semântica real)..i64comentado nos casos (0x8646E4/0x864759) — GOLDEN RULE. Doc:docs/reverse/FFX_ATEL_COMPARISON_OPCODE_SEMANTICS_2026-08-01.md(3 fontes: interpreter = verdade, noclip = direção, fahrenheit = nomenclatura). - Validação:
--phase-rotation-rt0319/319 PASS · AI + testes de plataforma 64/64 PASS · baseline 254 (1 falha é um novo SphereGrid-lane test em progresso, fora do escopo). ### PATCH
v2.198.4.0
v2.198.4.2BETAREVISION
Lulu1 de ago. de 2026
C3-1: catálogo de resource-keys das magic DLL VALIDADO — premissa do draft refutada (0/149 keys indexam a tabela root; semântica real = tabela global do host, populada em runtime)
v2.198.4.1