Update 2.11
6/5/2026
v2.11.0BETA
Seymour
🧠 AI ASSEMBLER PRODUCTIZED (a usable monster-AI editor):
- the codec's "edit the AI 100% freely" became a FEATURE. New in the
FfxLib/Ai+Modules/MonsterAiEditorlane: - Behavior library (
AiSnippetLibrary): parameterized templates whose bytes MIRROR proven corpus idioms — linear (force-cmd/perform-cmd/grant-field/set-stat/raw-call) and conditional (RNG 1-in-K rotate, on-event force-command for counter/phase). - Pre-flight validator (
AiValidator): opcode∈48, HasOperand vs 0x80, dangling branch/entrypoint (names which one, instead of the opaque throw), operand ranges, RT0 self-check, Rebuild dry-run, grow/shrink;SaveAssembleris now defensive (refuses to write on errors). - Friendly command selector (
AiCommandId): performCommand operand ↔ name via(cat<<12)|idoverCommandCharacter/CommandMonster1_Dictionary; UI dropdown (no more raw hex). - New codec primitives (
AiScript_File):GrowWorkerJumpTable(adds slots to a worker's jump-table — enables a NEW branch) +AppendGuardedAction(prepends a guarded action to an entrypoint, preserving the original handler) +OperandKindOf. - UI in
MonsterAiEditor: Behavior Library card + Validate button/report + command dropdown. - Gate
AiScriptLab --ai2PASS (real corpus, 361): jump-grow 898/898 workers, guarded-action 692/692 (first+last entrypoint) + synthetic sentinel 1/1, validator clean 346/346, AiCommandId 620/620, positive-catch 8/8/8 (jumpOOB via the editor path). Original--RT0 gate 361/361 intact. - A 4-agent adversarial review found + fixed 2 bugs (one-past-end sentinel self-loop;
OperandKinddropped on the editor save path), now locked by the gate. Docs:docs/reverse/FFX_AI_JUMPTABLE_GROW_PROVEN_2026-06-05.md+docs/ai/FFX_AI_ASSEMBLER_PRODUCTIZED_2026-06-05.md. - ⚠️ Structure proven OFFLINE; in-game behaviour (RT2) pending Halyson's OK (probe). Templates "heal ally < 25% HP" and "enrage on turn N" NOT shipped (HP-field / turn-counter anchor not byte-confirmed).
SUCESSOR_FFX_HD_MODELOS_MASTER_2026-06-05.mdclosed for sum/npc. - Textures (manifest-driven):
extract-texture-batchinRuntimeTools/PhyreModelExportLabgained--from-manifest, which reads the<id>.ahwin32g_fileNames[](authoritative asset manifest) and extracts the EXACT texture the game loads. 305 PNGs (pc/npc/sum), provenance maptexture-provenance-map.json, 0 silent mismatch. RE: theahwin32is a readable C header — resolves cross-refs (c906←c106,c908←c108,c806←c805) AND multi-texture (c101+c101_01,n238+n238_hair,n356←n238_hair) with no IDA. Bonus find: NPC rig-inheritance key =0x6NNNin the.chr(nXXX→kNNN map, 222/222 valid). Docdocs/reverse/FFX_AHWIN32_ASSET_MANIFEST_2026-06-05.md. - Bake (mesh+texture+anim): driver
work/_scratch_mgrp/bake_cast.pyviaphyre_chr_gate. Static 253/253 (whole cast textured, clean). Animated: sum own motion, npc inheritsskl/<base>. - Visual QA (workflow, 21 vision agents): 248 animated triaged via F3D — 157 clean / 58 torsion / 33 exploded. Bind picker (rest/A1) on the 33 did not fix.
- 🔧 Blender CORRECTION (2026-06-06): F3D was LYING on skinned animation. Blender diagnosis (mesh
EXPLODE_RATIO≈1.0, no growth) + truthful Eevee render proved the "exploded" ones have an intact body, only a limb/accessory stretched. Re-QA (8 agents over Blender renders) corrects to 175 clean (71%) / 59 torsion (24%) / 14 exploded (6%) — 20 models rescued, the offline bake was always ~94% usable. The 14 genuine = 11 Aeons + 3 npc (non-humanoid rig; need mocap/parent-map RE). Rule updated: the BLENDER screen decides, F3D lies. Pipelinework/_scratch_mgrp/blender_{diagnose,render_anim,batch_render}.py. - 🎯 RETARGET SOLVED via
--retarget-delta(2026-06-06): 175→215 clean (87%). Newphyre_chr_gateflag that applies inherited motion as a delta from frame0 onto the npc REST (M=restLocal·inv(m0)·mf), preserving npc proportions instead of imposing the base's. IDA RE proved the.chr@0x30remap was already applied — the cause was the rest-pose retarget, not the remap (docFFX_INHERITED_MOTION_REMAP_RUNTIME_2026-06-06.md). Pilot+batch of 73 fudidos + Blender re-QA + per-model keep-best: +40 clean, 44 rescued, ZERO regression (1 kept because it would regress). NPC animated = 200/222 clean (90%), 0 exploded; 8 Aeons still exploded (mesh immune → mocap). Solves the MASTER §2.4 "A1-universal" without A1's risk. - 🐉 WHOLE CAST closed offline (2026-06-06): 498/643 clean (77%), 90% usable. Extended truthful-Blender-QA + retarget-delta + keep-best to the rest: obj/wep/pc (46 clean/55, party clean) AND the 340 MONSTERS. The old monster QA (bbox) claimed "0 explosions" = a lie; truthful Blender QA (29 agents) found 127 real fudidos; retarget-delta on the 66 inherited → 36 promoted, monsters 206→237 clean. Total animated (643): 498 clean / 86 torsion / 51 exploded / 8 blank. Residual (9%) = divergent mesh / degenerate bind → mocap/mesh-RE, not retarget.
- obj/wep/pc (2026-06-06): same pipeline extended — static obj 110/110 + wep 79/79 + pc 34/49 (15 pc fails = dummy
c8xxslots with no PS2.chr). Whole HD cast static = 476 models. obj/wep mostly rigid (sparse anim 25/7); screen spot-check: f001/w001/c004=Auron clean. - Gallery
work/cast_hd_gallery.html(model-viewer, static/anim toggle, sum/npc/obj/wep/pc filter). All inwork/(gitignored): only the COMMANDS are code. No csproj bump (lab/RE in RuntimeTools).FFX_TOOLBOX_DISCOVERY_PLAYBOOK_2026-06-05.md): an online sweep + license vetting of external FFX HD/PS2 tooling (VBF, Phyre, kernel.bin, ATEL, FMOD, TM2, FMV) and editor NuGets. Vetted key finds: External File Loader (ffgriever, BSD-2) loose-file with no repack, Kaitai Struct (C# runtime MIT) to generate C#+JS readers, fahrenheit (MIT, C#) hook+DLL mod framework, and confirmation that FFXDataParser has NO LICENSE (study only). Thetested?column is still❌— oracle test against the local corpus is pending, plan included in the doc itself. Doc-only: no csproj bump (lab/RE doc-only rule). 58packaged dossiers;- one manifest per dossier;
- one Git-safe mirrored copy under
docs/history/DOSSIÊ FFX 01-06-2026/; - one exclusion report for the single giant external binary blocked by GitHub size limits.
- separate workshop-range knowledge bases;
- one aggregated master atlas;
- root
KNOWLEDGE_BASE.mdas the single entrypoint; - one official merge plan;
- a
Pt6/Pt9dependent-workshops annex; - formal technical family lines for the project.
merge in docsExtras nowExtras laterfrozen researchhistorical cleanupps3dataffx_ps2- executive closeout
- child-workshop compendium
- runtime/AI atlas
- successor bootstrap
- short maturity board
Extras nowverdictExtras laterverdict- frozen research boundaries
- derived
Pt67product role ps3datavsffx_ps2split- provenance rulebook
- mandatory citation facets ### Added
important.bina_ability.binReadNo-Edit Byte IdentityReread- additive text token contracts in
FFXProjectEditor/FfxLib/Text/* - a pure validation / round-trip decision utility
TextLabTools/TextContractHarnessas the first production-side smoke consumerdocs/history/BATTLE_AI_FRONTIER_2026-05-31.mddocs/history/MODELVIEWER_BINDING_FRONTIER_2026-05-31.mddocs/history/PT23_TO_PT34_KNOWLEDGE_BASE.mddocs/history/PT23_TO_PT34_CHANGELOGS.mddocs/history/PT23_TO_PT34_BRANCH_MAP.mddocs/history/PT23_TO_PT45_CODE_KNOWLEDGE_BASE.mddocs/history/PT23_TO_PT45_CHANGELOGS.mddocs/history/PT23_TO_PT45_BRANCH_MAP.mdKNOWLEDGE_BASE.mddocs/history/PT2_TO_PT11_KNOWLEDGE_BASE.mddocs/history/PT12_TO_PT22_KNOWLEDGE_BASE.mddocs/history/PT23_TO_PT45_KNOWLEDGE_BASE.mddocs/history/PT2_TO_PT45_MASTER_KNOWLEDGE_BASE.mddocs/history/PT6_PT9_DEPENDENT_WORKSHOPS_ANNEX.mddocs/history/NON_FFX_EDITOR_THREADS_ANNEX.mddocs/history/PT_FAMILY_LINES_ANNEX.mddocs/history/OFFICIAL_MERGE_PLAN_2026-05-31.mddocs/history/PS3DATA_FULL_TREE_RESEARCH_PLAN.mddocs/history/PS2_FULL_TREE_RESEARCH_PLAN.mddocs/history/PT50_TO_PT58_ABSORPTION_PLAN.mddocs/history/PT52_TO_PT58_CLOSEOUT_REPORT_2026-05-31.mddocs/history/PT50_PT51_HISTORICAL_CLEANUP_2026-05-31.mddocs/history/PT6_TEMPORARY_CLOSEOUT_2026-05-31.mddocs/history/PT6_CHILD_WORKSHOPS_COMPENDIUM.mddocs/history/PT6_RUNTIME_AI_DISCOVERY_ATLAS.mddocs/history/PT6_SUCCESSOR_BOOTSTRAP.mdhistory/pt23-battleai-structurehistory/pt24-exactlaunch-seamhistory/pt25-selectorbank-materializationhistory/pt26-battlestate-diffhistory/pt27-routereplay-truthhistory/pt28-battlecapacity-prephistory/pt29-keyitem-crashfixhistory/pt30-autoability-crashfixhistory/pt31-geometryviewport-blockhistory/pt32-chrcarrier-decodehistory/pt33-aislice-payloadhistory/pt34-legacybridge-narrowing### ChangedCurrentWorkspaceOverviewCurrentMonsterEditorCurrentItemsCurrentBattleExplorerCurrentLiveBattleLabCurrentStringExplorerEncodeSafeDecodeOnlyRawPreserveUnknownRiskReuseOriginalBytesReencodeAllowedBlocked- operational wrappers for the
Extras / ps3dataline - useful
Pt6 / Pt23AI micro-workshops with preserved knowledge and archive-safe status merge nowmerge laterExtras/read-onlyknowledge onlyPt56,Pt52,Pt54,Pt58= attack now in softwarePt57and parts ofPt53/Pt55= attack later, still read-onlyPt53,Pt55,Pt57= aggressive research without overclaimPt50,Pt51= historical cleanup before they count as clean sourcesMagicPackageViewerBatEffPackageViewerMagicEffectCrosswalkExplorernever blind merge### Validated- purpose
- utility
- merge likelihood
- per-workshop mini changelog
binding truthlanguage- strong narrowing for
owner/target/parentage/commit - guardrail base for
Pt6andPt23 formation 0..7enemy actor rows 0..10rawMonsterId -> corpuscomposition truthvsactor-surface truthPt46 / AIBlobParityGrammarLabPt47 / AIRuntimeDispatchLabPt48 / SafeAIMicroProbeLabas part of the runtime/AI legacy, even without writer or patcher claims.- old-wave base
Pt2..Pt11 - middle-wave base
Pt12..Pt22 - heavy-wave base
Pt23..Pt45 - one single aggregated atlas with memory/runtime/binding/guardrails
- satellites of
Pt6 - satellites of
Pt9 - production-side exceptions
Pt29/30 Model Viewer / BindingBattle / AI / Runtime TruthText SafetyKernel / ShopTooling / Safety / ReleaseProduction Crashfixes### Notes ### Planned ### BacklogTextSourceCapabilityIndex*StringExplorerUI wiring0x10 + 0x120x13### Blocked ## [v2.13.0] - 2026-06-05 ### Added ### Notes ## [v2.12.0] - 2026-06-05 ### AddedFfxLib/BattleMap/BattleArenaPositionWriter.csre-stamps each actor's X/Y/Z in the chunk3 anchor array IN PLACE (on-field monsters = pointer+0x20; also party/aeon/staging byrole), value-only: never touches the header/pointers/count/other chunks, preserves W verbatim. Since the battle→scene transform is IDENTITY (IDA-proven, v2.10.0.1), a coord picked in scene space is written verbatim. Same slot-safe pattern asFormationSlotWriter(guard + backup-onceWriteLooseFile). ### Validated RT0 (no-edit == byte-identical) 862/862, POSITION-ONLY (diff confined to the+0x20array) 862/862, RE-READ 862/862, + SAVE LIFECYCLE (no-edit/edit/restore on a temp copy) PASS. BiancaCatalogLab + AuroraChamberLab + BattleArenaPositionLab (previously left out). Full CI PASS (7/7 gates): ReverseHarness, AiScriptLab, FormationSlotLab, AbilityCommandLab + the 3 new ones. ### Deferred offline; the in-game screen is the arbiter. Add/remove monster slot (vary count) = structural (Rebuild), next. ## [v2.11.1] - 2026-06-05 ### Added box that filters the dialogue rows by text content, and (2) a language filter (English/Japanese checkboxes, English by default) — previously JP and EN were dumped in the SAME list (Japanese first = a wall of Japanese). RefactoredEventExplorer_DataModel(allTextRows+ApplyTextFilter, English-first) + axaml (search TextBox + JP/US CheckBoxes). Does NOT touch the writer (Tier 1 stays--event-rt0397/397 + edit 12/12). ### Notes translation injection, out of the writer scope). Word search is within the selected event. ## [v2.10.0.1] - 2026-06-05 ### Proven (RE / IDA, offline) copies the chunk3 (battle-local) coordinates VERBATIM into the actor's world node — no flip-Z, scale, or rotation; only Y gains a per-actor model-height (actor+0x534). Since the.dae.phyrescene == the raw Phyre vertex frame 1:1, P_scene(X,Y,Z) = P_battle(X,Y,Z) (s=1, R=I, T=0). Proven chain:FFX_Battle_AreaChunk_GetSetPosition(0x7AC000; chunk3 base0x112A9B0; copies 4 floats verbatim; actor world pos @+0x3B0) →FFX_Battle_ResolveActorPlacement(0x7A9AE0) →FFX_Battle_GetActorByIndex(0x794030, stride0xF90== RT2 enemy). The flip-Z guess was an artifact of including off-field staging rows (party-back Z≈-168). Doc:docs/reverse/FFX_AURORA_BATTLE_TO_SCENE_TRANSFORM_IDA_PROVEN_2026-06-05.md(+ rename-queue for the real.i64). ### Changed (Aurora Chamber — honesty) plots anchors directly in scene coords (default was already identity) and the flip-Z toggle becomes DISPROVEN/comparison;aurora-actors.jsoncoordSpace=scene_world_identity_ida_proven. ### Deferred≈ chunk3(residual ~0) + measure the exact Y term. Probe AUTHORIZED by Halyson; pending only the game being open (READ via the existing probe, no new code). SPIRA FORGE stays paused. ## [v2.10.0] - 2026-06-05 ### Added container) is no longer read-only. Editing cutscene/event dialogue is now a BUTTON.FfxLib/Event/Event_File.Write.cs(new): byte-faithful EV01 container repack — every chunk re-aligned to0x40, the absolute offset table + EOF terminator recomputed (magic +0xFFFFFFFFsentinel preserved). No-edit = guaranteed VERBATIM; edited text reusesTextTable_File.Write(chunks JP=1/EN=4); ATEL script (0), Unknown 2 and FTCX (3) preserved byte-for-byte. Tier 2 hookScriptChunkOverride(re-stitch of an edited chunk-0).Event_File.cs: captures the raw header + text tables; tolerates null-pointer field-string entries (8 files) by preserving the chunk verbatim (documented text-editable frontier).TextTable_File.Writeadditive overload (includeTrailingPadding): emit table+pool without internal padding (the container re-pads to 0x40). Does NOT break--textstr-rt0(default = legacy behavior).Modules/EventExplorerbecame a dialogue EDITOR: editable JP/EN strings (TwoWay TextBox) + a "Save dialogue" button that re-packs and writes the.ebp. (FfxLib/Ai/AiScript_File.cs, used read-only as a donor) reads/edits the event script (same AiFile family).- Byte-local operand PATCH PROVEN (12/12): editing one chunk-0 operand changes only those bytes; the container re-stitches identically elsewhere; the re-read carries the new operand.
- GROW (AppendCode) is a documented frontier: the donor
AppendCode(built for battle, descriptors in DATA) does not relocate the header-resident descriptors event scripts use ([0x38..scriptStart)) — needs event-aware relocation (coordinate with the AI Assembler lane). ### Validated round-trip 12/12** (swap a string → repack → re-read: edited string matches, untouched chunks verbatim, idempotent). 397/397; byte-local operand patch 12/12. Editor builds 0 errors. (0 breaks), EOF==filesize,0xFFFFFFFFsentinel. Docs indocs/reverse/FFX_EVENT_*_2026-06-05.md. ### Honesty / Deferred text-editable yet). Tier 2 = patch proven; append/grow + structural authoring = Tier 3, documented not closed. Verification preferred offline byte-RT0; in-game RT2 of edited dialogue is still recommended. ## [v2.9.0] - 2026-06-05 ### Added btlmap scene catalog) to the MapViewer and lifts actor coordinates out of chunk3. Dedicated to Aurora & Bianca. 💛 - Scene Picker consumes
BattleMapCatalog_File/BattlefieldSceneResolver(read-only) — list/select scenes by area and map-key. - Render drives
PhyreMapExportLab(on-demand glTF export of the btlmap scene) and opensFFXMapViewerWebvia the?catalog=/?map=/?actors=deep-link — a per-scene mini-catalog, never touching the sharedcatalog.jsonnor rewritingapp.js. - Coordinates via the new
FfxLib/BattleMap/BattleArenaAnchors_File.csreader (pure/Avalonia-free): decodes chunk3 (96B area-record, pointers+0x10..+0x2C, live monsters+0x20, 16B XYZW Y-up elements), lists the battle-local anchors and exports JSON for Encounter Authoring. anchor gizmos from?actors=+ a "pick" mode (y=0 plane raycast → world coords). Non-intrusive (hookswindow.ffxMapViewerDebug; no-ops without?actors/pick; never editsapp.js). ### Validated klyt00_00/sins02_00/mihn00_00 == doc-proven coords); corpus 862/862 clean (0 NaN/Inf, W==0 on live monsters); deterministic; BIANCA→scene→battle→anchors pipeline 52/52 mapped scenes carry anchors. 10,804 triangles,gatePass: true). Editor builds with 0 errors (verified in an isolated HEAD worktree). ### Honesty / Deferred UNCALIBRATED** (P_scene = R·s·P_battle + T; flip-Z/yaw-180 unresolved) — anchors are raw battle-local, not engine-exact. Probe calibration = Wave 3 (needs Halyson's OK). SPIRA FORGE stays PAUSED; Aurora only CONSUMES MapViewer + BIANCA (read-only/additive), never starting the hub. ## [v2.8.0] - 2026-06-05 ### Added (catalogs the 25 areas / 56 scenes of HDps3data/btlmap—<area>NN_<variant>withmdl/d3d11/<leaf>.dae.phyre) +FfxLib/BattleMap/BattlefieldSceneResolver.cs. Pure/Avalonia-free, compiles into the editor (0 errors). "azit03"), NOT thebattlefieldu16 (that is a global arena id, shared across maps —bf=1061spans nagi/test/tori/zzzz). Doc:docs/reverse/FFX_BATTLEFIELD_SCENE_BRIDGE_2026-06-05.md. pointer+0x20(float32 X,Y,Z,W; Y-up; W=0; 16-byte stride; formation slot ↔ entry). Party+0x10, aeon+0x18, camera+0x2C. Doc:docs/reverse/FFX_BATTLE_FORMATION_POSITION_CHUNK3_DECODED_2026-06-05.md. (-- export --ps3-root <ps3data> --area btlmap/azit/azit03_a). Actor-overlay plan + probe coordinate calibration (DESIGN):docs/ai/FFX_AURORA_COORDINATE_SYSTEM_AND_CALIBRATION_2026-06-05.md(probe only with Halyson's OK). ### Validated deterministic; 56/56 scenes with exactly one primary model; bridge with 0 unexplained misses (22 HD-orphan maps = cut/PS2-only EXPECTED; 4 orphan scenes bika04/grid00/nagi03/sfia00 = boss/story EXPECTED). ### Deferred the DINPUT8 probe needs Halyson's OK and SPIRA FORGE is PAUSED. ## [v2.7.1] - 2026-06-05 ### Added / Validated WeaponNameTable, MacroDictionary, NameDescriptionTextTable, NameDescriptionTextPrefixTable, BtlTextTable, SphereGrid, ShopGearCatalog, BukiGetTreasureCatalog, AlBhedDictionary, PointerScriptTable, BattleTextTable, ShopTable. Preserve-only pattern (WriteIdentityfor the lossy-rebuild ones). New gate-sweepTools/Wave1Rt0.cs. ## [v2.7.0] - 2026-06-05 ### Added swaps the AiFile partition for one of a DIFFERENT length, 16-pads the AiFile, shifts later sections and rewrites the header section pointers (m###.bin), writing the AiFile verbatim (no codeLength clobber). The AI Assembler UI now SAVES grow/shrink (was length-preserving only). Clobber cause documented + fixed by design (Option B: minimal surface, does NOT touchMonster_File.Write→--monster-rt0stays 361/361). VM from worker counts + per-worker datalen (round 16) (NOT partition/DeclaredLength/codeLength) and trusts the in-file pointers → grow relocation is honored and trailing pad is safe. (golden rule: rename-queue.) ### Validated (insert → grow-aware splice → re-read clean + tail/header preserved verbatim + 16-aligned + idempotent), SHRINK 346/346 (remove a non-targeted instr → negative delta → re-read clean + tail preserved).--monster-rt0361/361 (no regression). Corpus alignment: 16/32/64/128/256, 0 trailing pad. (free-edit)"** card rendered with the editable instruction list (opcode/operand/remove) + Insert/Save Structural + preview. Screenshotwork/spira_forge_qa/monster_ai_assembler_v01.png. ### Deferred DINPUT8 probe (shared) — under Halyson's explicit OK. Offline + RE prove byte/game-safety; the in-game screen is the final arbiter. ## [v2.6.0] - 2026-06-05 ### Added (insert / remove / modify) on top of the byte-local operand editor. The rebuilt AiFile comes fromAiScript_File.Rebuild(RT0-proven: relocates entrypoints + jump tables via an old→new map). Editable list (opcode/operand hex + remove checkbox), insert-after-selected, delta preview. Save is enabled only for length-preserving edits (codeLength unchanged) → byte-safe splice viaSpliceAiFileIntoMonster. GROW/SHRINK is LAB (honest message): the loose-file save needs a header-aware monster relayout + alignment padding + in-game proof. --ctbbase-rt0→CtbBase_File(ctb_base.bin), preserve-only.--mixtable-rt0→MixTable_File(prepare.bin), preserve-only.--aiasm-rt0→ proves the AI Assembler structural save (no-edit Rebuild + relayout + splice byte-identical) and measures the corpus AiFile→WorkerFile alignment. ### Validated length-preserving editing is byte-safe. Grow=LAB (cause:Monster_File's 0x34 header overlapsAiFile[0..4)=codeLength + a length change breaks WorkerFile alignment; corpus is 16/32/64/128/256-aligned, 0 trailing pad). ### Blocked / LAB ## [v2.5.0] - 2026-06-05 ### Added controls (Open Spector,Capture Next Frame,Export Last Capture) plus a firstMaterial Debugpanel with live inventory of the loaded glTF materials, a selector, fact chips, and per-slot texture cards (map,normalMap,aoMap,envMap, etc.). records what landed, what was validated, and what remains explicitly outside proof. ### Validated controls appeared, and theMaterial Debugpanel populated from the loaded glTF. trustworthy way, the viewer degrades toFrame preview unavailable/Texture preview unavailable on this source surfaceinstead of pretending to show valid visual evidence. ## [v2.4.4] - 2026-06-05 ### Added selectable battles; picking one publishes toFieldContext.SelectedBattleIdand the Formation Editor jumps straight to that battle (loads its formation). Realizes the masterplan's "click a zone, swap the formation" via the shared spine, no shell plumbing.FieldContextgainedSelectedBattleId/SelectBattle. ### Validated 37 BattleIds with no folder + 37 folders never referenced (special/event battles) — the handoff filters to the ones that exist. Editor jumped to the loaded battle). Screenshotwork/spira_forge_qa/handoff_encounter_to_formation_v04.png. ## [v2.4.3.1] - 2026-06-05 ### Reverse / Proof hypothesis (CONTINUE_AQUI_PERNAS_HD): the "52m_skeletonMatrices→ 79 joints" map lives in the Phyre file, not in IDA.- The skin palette is
PMatrix4[0..51](linked fromPMeshfield 12); it equals the livem_skeletonMatricesbyte-for-byte (maxDist=0.00000). - The slot→node map is the
intat offset 12 of eachPSkeletonJointBounds[j](52 slots → 52 nodes, bijection). - Composing
m_defaultPosethroughm_matrixParentsreproduces the authored inverse-bind EXACTLY:0/52nodes diverge. So--hd-defpose+--hd-parentsis already the game's real bind. - Root cause of the historical coil: a bake without
--hd-defpose/--hd-parentsfalls back toinvBind = PMatrix4[52+b](raw LOCAL matrix) → the mesh explodes. The defpose+parents recipe is the fix and is already the gallery default. - New read-only probes:
work/_scratch_mgrp/phyre_palette_probe(locates the palette, proves the bind is exact, emitsnode_to_slot.json) andphyre_legs_probe(matcher; illustrates the coincident-translation pitfall). ### Validated c007 (Rikku) — in forced rest, battle (id5_c4318 t0.0–0.9), 4 calf angles in a deep crouch, and multi-clip (c4333/c4365/c4886). Numerically: leg-joint local/world matrices are perfect rigids (scale=1, det=+1, ortho 0.0000). No IDA. Full proof indocs/reverse/FFX_HD_SKIN_PALETTE_DECODED_LEGS_NOT_BIND_2026-06-05.md. ## [v2.4.3] - 2026-06-05 ### Added existed but had never been byte-gated, closing 4 more concrete editable-base families: --keyitem-rt0(Tools/KeyItemRt0) →KeyItem_File(important.bin), preserve-only writer (clones the original bytes + re-stamps onlyPrimerByte10/OrderingByte13).--treasure-rt0(Tools/TreasureRt0) →Treasure_File(takara.bin), full-decode round-trip (4 bytes/entry).--customization-rt0(Tools/CustomizationRt0) →Customization_Filegear kaizou.bin + aeon sum_grow.bin (preserves the header prefix/tail + re-emits the decoded entries).--autoability-rt0(Tools/AutoAbilityRt0) →AutoAbility_File.WriteAbilities(a_ability.bin, DATA section), preserve-only writer. (Readsarms_rate.binonly to satisfy the read contract; does NOT write arms_rate and does NOT coverWriteAbilitiesAndText/text repack.) ### Validated takara.bin (503 entries, 2012 B), kaizou.bin (125) + sum_grow.bin (77), a_ability.bin (134 entries, 19590 B). No-edit save = byte-identical; edit = byte-local (same preserve-only pattern that closed Monster/Encounter). Partially lifts the historical caveat "important.bin/a_ability.bin blocked for mutation-safe writer claims": field (data-section) editing is now proven; text-pool repack remains unclaimed (same monmagic-style drift risk — out of scope for this gate). ## [v2.4.2] - 2026-06-05 ### Added inline (e.g.[m003 - Murussu, m003 - Murussu, m009 - Dingo]). Lazy-loaded + cached + capped (≤90 visible battles; with the full list it asks to filter by area). Read-only; brings the masterplan's "zones painted with the monsters that spawn there" into the editor (encounter↔formation fusion made visible). ## [v2.4.1] - 2026-06-05 ### Added production helper (slot-only guard + backup-once.spiraforge.bak+ write). Now used by the Formation Editor (PersistSnapshot) AND tested by the headless gate — same code in the editor and the test, no duplication. ### Validated workspace/asset, read-only respected): (a) no-edit Save = disk byte-identical + backup==original; (b) edit Save = slot-only on disk + reread match + backup preserved; (c) restore from backup = byte-identical. PASS. Closes the v0.2 honesty gap (in-app save proven on disk, reversible). Corpus still 858/858;offline_ci4 gates PASS. ## [v2.4.0] - 2026-06-05 ### Added Entries/Groups/Formations (VARIABLE counts + create tables), assigns fresh dataOffsets, rebuilds chunk0 + the chunk table, preserves block-sharing + padding. Gate--encounter-rebuild-rt0. The structural base for "CREATE ENCOUNTERS". ### Validated (4096/4096)** + grow-test (add 1 formation, end 0x1000→0x1002, 2 chunks intact) valid. family; fixed the trailing padding drift. Honest note: the StringExplorerhelp_txt.binregistrations are DEAD in this extraction (file absent) — the writer is proven on a real field-string (spcodedic.bin). ## [v2.3.2] - 2026-06-05 ### Added (Ability_Command.ReadList→WriteList), whichKernelCommandsalready uses to Save but was never byte-gated. References the editor project (deep dep tree), calls only static FfxLib methods. Wired intooffline_ci.ps1. ### Validated (1 byte) 4/4. PASS. This is the proven foundation for the "new Black magic" dream feature (lives in command.bin). ### Blocked monmagic original shares/dedups text whileWriteListre-appends (FfxEncoding.WriteBytesIntoTextFileonly appends; command/item are pure-append → they match). Risk: KernelCommands' MonMagic Save bloats the file — gate it until a dedup-aware writer passes. Audit + fix target:docs/reverse/FFX_ABILITY_WRITER_AUDIT_2026-06-05.md. ## [v2.3.1] - 2026-06-04 ### Added past EOF (kino03_*,mihn05_*,cdsp00_02): treats the past-EOF chunk (and beyond) as absent instead of rejecting the whole file; earlier chunks (incl. formation @2) stay valid. Those battles are now editable in the Formation Editor. ### Validated re-read 858/858 PASS. The prior 843 unchanged. ## [v2.3.0] - 2026-06-04 ### Added monsters (16 bytes) of a btl_* formation viaBattle_File.WriteWithFormationSlots, byte-safe slot-only. Consumes theFieldContextspine (pre-filters battles by the Hub's selected field area). Monster picker (Monster_Dictionary+ Empty, preserves the raw high nibble). Save writes a workspace loose-file with a.spiraforge.bakbackup +AssertSlotOnlyDiffguard, viaByteSnapshotEditorSession(Undo/Discard). Offline, no probe.offline_ci.ps1(-BtlRootparam). Additive read-only members onBattle_File(FormationChunkOffset/FormationSlotsOffset/FormationSlotsLength). ### Validated (15 btl_* unparseable by the reader at the time — fixed in v2.3.1.) ## [v2.2.0] - 2026-06-04 ### Added spine keyed byfield_token. Field picker fed by the bridge CSV (ps3data-map-btlmap-fieldid-bridge.csv, 357 fields, structural-candidate). Selecting a field publishes toFieldContext(observable singleton) and 2 consumers react read-only: map deep-link (?map=map/<area>/<field>for FFXMapViewerWeb) + encounter peek (readsbtl.binviaEncounterTable_File, candidate area↔map join). CSV copied to output via csproj<Content>. Offline; the picker runs without a project. No writer, no probe. ### Validated Screenshotwork/spira_forge_qa/field_hub_v01.png. ## [v2.1.1] - 2026-06-04 ### Validated--player-rt0gate:ply_save.bin(3098) +ply_rom.bin(2161) -> no-edit RT0 byte-identical. (Writers already existed slot-only; now gated.) ## [v2.1.0] - 2026-06-04 ### Addedbtl.binbyte-for-byte and re-stamps only the editable fields (tableId/Unknown0C, groupBattlefield/Danger/TotalWeight, formationId/Weight).--encounter-rt0gate in the editor. ### Validated ## [v2.0.0] - 2026-06-04 > NEW ERA — MAJOR. The editor crossed from "offline file editing" to PROVEN LIVE RUNTIME EDITING: > editing a monster's AI bytecode in RAM and seeing the behavior change on screen, no crash, reversible — > the project's supreme goal #1, realized. MAJOR = a new capability class (not a contract/save/build > break — we only added and hardened).-betabecause RT2/God-Mode are not yet productized into gated UI. > Milestone of the Claude Code / VSCode wave + the union with the 2nd Codex account. ### Highlights changes on screen — Flame Flan Firaga→Thundaga, no crash, reversible. Chain:enemy-list(0xD34460) ->MemoryChr.Ptr_script_chunks(+0xF78) -> live AiFile === diskm0NN.binbyte-identical. global ability — the monster doesn't need to "own" it. Proof: a Skoll spat Ifrit's Hellfire on screen. data revive (death flags + KO), all viaMemoryChr+ probe. ### Added offset** (+delta) -> a valid larger AiFile (the path to "ADD AI", beyond the byte-local budget). jump labels + inferred worker type), operand editing + loose-file Save.FFX_MUSIC_SYSTEM_AND_MOD_IDEA(Music Remapper),FFX_AI_BYTECODE_OPCODE_TABLE_PROVEN,CODEX_MAPVIEWER_WATCH_JARVIS,FFX_MAP_DEVELOPMENT_TOOL_MASTERPLAN(Spira Forge). ### Changed / Validated StatSheet/Loot + preserve header Signature/Padding (the Padding overlappedAiFile[0..3]). ### Blocked / Deferred (honest) (game-closed rebuild). Player found:FFX_FmodMusic_PlayTrackByIndex(181 tracks); the PS2 SPU FIFO is stubbed on HD. ### Absorbed from Labs / Multi-agent union with the 2nd Codex account (MapViewer / model-texture lane): exporter now exposes material-role signals (TextureSampler1/normalMap/reflection/water/PhyreWaterShader), external-viewer comparison (glTF-Sample-Viewer as oracle; gap proven exporter-side, not shell), and the Spira Forge masterplan kickoff. Multi-agent coordination logged indocs/ai/CODEX_MAPVIEWER_WATCH_JARVIS.md. ## [v1.7.0] - 2026-06-04 ### AddedAppendCode: appends instructions at the end + relocates the data section.Rebuild: insert/remove/modify an instruction ANYWHERE + AUTOMATICALLY relocates all jumps + entrypoints (old→new linker map) + the data section. Orphan branch (removed instr) -> honest error. ### Validated workers resolve, post-insertion entrypoint relocated0x2D1→0x2D4on its own; grow-test (AppendCode) RT0. ## [v1.6.0] - 2026-06-04 ### Validated StatSheet/Loot + preserve headerSignature/Padding(the Padding overlappedAiFile[0..3]). ## [v1.5.0] - 2026-06-04 ### Validated / Blocked swap BLOCKED** (FMOD API__thiscall, probe cdecl-only). DocFFX_MUSIC_SYSTEM_AND_MOD_IDEA(Music Remapper). ## [v1.4.0] - 2026-06-04 ### Validated (live) ability — the monster doesn't need to "own" it. Proof: a Skoll spat Ifrit's Hellfire on screen. ## [v1.3.1] - 2026-06-04 ### Fixed / Validated (live) flags). Auto-scan (Scanstatus) toggled live. ## [v1.3.0] - 2026-06-04 ### Validated (live) (POINTER_BATTLE_ENEMY_LIST 0xD34460, stride0xF90) + probe. ## [v1.2.0] - 2026-06-04 ### Added jump labels) + operand editing + loose-file Save. ## [v1.1.0] - 2026-06-04 ### Validated (🏆 HEADLINE — supreme goal #1) behavior changes on screen (Flame Flan Firaga→Thundaga), no crash, reversible. Chain:enemy-list 0xD34460->MemoryChr.Ptr_script_chunks +0xF78-> live AiFile === diskm0NN.binbyte-identical. Doc:docs/reverse/FFX_AI_RT2_LIVE_EDIT_PROVEN_2026-06-04.md. ## [v1.0.0] - 2026-06-01 Maturity milestone for the editor as a real reading, validation, and knowledge-navigation platform, with enoughExtrasproduct surface to justify an honest1.0even though runtime, AI, and body-playback bosses are still open. ### HighlightsPS2 KnowledgeTextures (TM2 + TXC/CLT/FMT/SPS2 support lane)BIN-FTC AtlasProject / PipelineMagic EffectsPresentation ContainersBattle Corpus Crosswalk### AddedMagicPackageViewerBatEffPackageViewerMagicEffectCrosswalkExplorerFtcHeaderInspectorBinSidecarGraphSignature Groupin the shellTxcCltPairExplorer- cold
fmt/sps2metadata ### Changed ### Validated read-onlydo not promoteno runtime proofwhere applicablepipeline/support onlywhere applicable ### Notesmagic solvedAI solvedModelViewer playback solved- broad writer authorization ## [v0.11.0-beta.2] - 2026-06-01 Real product evolution for the
Extrasline inmain. ### Highlights masterffx_ps2ps3dataPS2 KnowledgeTextures (TM2)BIN-FTC AtlasProject / Pipeline### AddedExtrasSourceResolverExtrasEvidenceBadgeModelExtrasProvenanceModelExtrasReadonlyBoundaryModelExtrasFileOpenServiceCdIndexExplorerProjectDescriptorViewerAbmapSupportGraphdocs/history/PT52_BIN_FTC_FILE_MEANING_GUIDE_2026-06-01.mddocs/history/PT53_BATTLE_MAGIC_FILE_MEANING_GUIDE_2026-06-01.mddocs/history/PT54_PROJECT_ABMAP_FILE_MEANING_GUIDE_2026-06-01.mddocs/history/PT56_TEXTURE_PALETTE_FILE_MEANING_GUIDE_2026-06-01.mddocs/history/PT57_PRESENTATION_CONTAINER_FILE_MEANING_GUIDE_2026-06-01.mddocs/history/PT58_FFX_PS2_OWNERSHIP_AND_LINKAGE_GUIDE_2026-06-01.md### Changed ### Validated- no writer
- no repack
- no final decode claims
- no mixing cold research with runtime proof ### Notes
kernel -> mag_* -> bat_eff## [v0.10.0-beta.1] - 2026-05-31 Main-branch consolidation beta after the first strong wave of curated workshop absorption. ### Highlights ### AddedShop ExplorerFfxLib/ShopAssets/Shop- a guarded writer for
item_shop.binandarms_shop.bin NameDescriptionTextPrefixTable_Filereader + no-edit guardforimportant.binreader + no-edit guardfora_ability.bin### Changed ### Validated ### Deferred ### Blocked ## [v0.9.0-beta.1] - 2026-05-31 First version that honestly assumes the real size of the editor and of the ecosystem around it. ### Main Branch Highlights ### Production Surface Present In Main ### Absorbed From WorkshopsTextLabTools;ProductionAuditTools;- conservative text/monster harness and release.
PlayerGrowthEditor;CtbBaseEditor;MixTableEditor;- the historical line that later sustained
KeyItemEditor. AutoAbilityEditor;- conservative parsers from
AutoAbility_File.csandArms_Rate.cs. Shop Explorer;FfxLib/Shop;Assets/Shop;- guarded writer for
item_shop.binandarms_shop.bin. ### Governance And Versioning ### Validated ### Still Blocked ### Why This Is Still Beta ## Historical Semantic Reconstruction Important editorial note: ## [v0.8.0-beta.1] - historical reconstruction (pre-Git official SemVer) Milestone where the ecosystem already operates as a large modular editor with multiple specialized fronts alive at the same time. ### Main Surface At This Stage ### Ecosystem Pressure ### Still Missing ## [v0.7.0] - historical reconstruction (pre-Git official SemVer) Milestone where the main line shifts from “more modules” to “more proof.” ### Added ### Changed ### Not Yet Safe ## [v0.6.0] - historical reconstruction (pre-Git official SemVer) Milestone where the kernel line and the conservative hardening of secondary systems stop being a promise and become part of a serious editor. ### Added ### Changed ### Still Missing ## [v0.5.0] - historical reconstruction (pre-Git official SemVer) Milestone of the strongKernelTablesLabwave. ### Added ### Changed ### Still Missing ## [v0.4.0] - historical reconstruction (pre-Git official SemVer) Milestone where the project learns to say “yes” and “no” in text with real criteria. ### Added ### Changed proven reader;conservative writer;blocked; ### Still Missing ## [v0.3.0] - historical reconstruction (pre-Git official SemVer) Milestone where the editor stops being only a file browser and starts touching AI, runtime, and high-value gameplay surfaces. ### Added ### Changed ### Still Missing ## [v0.2.0] - historical reconstruction (pre-Git official SemVer) Milestone of the editor's structural expansion into large visible systems. ### Added ### Changed ### Still Missing ## [v0.1.0] - historical reconstruction (pre-Git official SemVer) Honest minimum milestone where a real editor already existed, far above a disposable prototype. ### Added ### Changed ### Still Missing ## [baseline-2026-05-31] - 2026-05-31 Honest initial import of production into Git. ### Added ### Preserved ### Validated ### Notes ## Workshop Mini-Version History Note: ## [pt2-v0.3.0-superseded.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt3-v0.8.0-freeze.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt4-v0.5.0-hold.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt5-v0.9.0-final.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt6-v0.7.0-beta.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt7-v0.9.0-final.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt8-v0.7.0-freeze.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch OutcomeShop Explorer;FfxLib/Shop;Assets/Shop;- guardrails documented in
docs/history/PT8_SHOP_GUARDRAILS.md. ### Final Status ## [pt9-v0.6.0-alpha.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt10-v0.2.0-final.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt11-v0.3.0-blocked.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt12-v0.3.0-package.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt13-v0.3.0-package.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt14-v0.2.0-architecture.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt15-v0.2.0-architecture.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt16-v0.2.0-architecture.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt17-v0.3.0-guardrail.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt18-v0.3.0-governance.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt19-v0.3.0-surface.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt20-v0.2.0-strategy.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ##v2.227.0.0(2026-08-08) — Visual QA infra: opencode FREE models inverboo_router.py(honest limits + power comparison). MINOR. Lane Jarvis-CLINE. [previous:v2.226.0.0] ##v2.226.0.0(2026-08-08) — Visual QA infra: OpenCode Go integration (gpt-5.6-luna) +descmode + humanized UX prompt + report fix. MINOR. Lane Jarvis-CLINE. [previous:v2.225.2.0] ##v2.225.2.0(2026-08-06) — F7 Monster AI Swap: status-on-ability via RAM. MINOR. Lane Jarvis-HOOK. [previous:v2.225.1.0] ##v2.225.1.0(2026-08-06) — Treasure Map: ATEL header parse + glossary fix. PATCH. Lane Jarvis-CLINE. [prev:v2.225.0.0]
v2.11.0BETA
Seymour
🧠 AI ASSEMBLER PRODUCTIZED (a usable monster-AI editor):
- the codec's "edit the AI 100% freely" became a FEATURE. New in the
FfxLib/Ai+Modules/MonsterAiEditorlane: - Behavior library (
AiSnippetLibrary): parameterized templates whose bytes MIRROR proven corpus idioms — linear (force-cmd/perform-cmd/grant-field/set-stat/raw-call) and conditional (RNG 1-in-K rotate, on-event force-command for counter/phase). - Pre-flight validator (
AiValidator): opcode∈48, HasOperand vs 0x80, dangling branch/entrypoint (names which one, instead of the opaque throw), operand ranges, RT0 self-check, Rebuild dry-run, grow/shrink;SaveAssembleris now defensive (refuses to write on errors). - Friendly command selector (
AiCommandId): performCommand operand ↔ name via(cat<<12)|idoverCommandCharacter/CommandMonster1_Dictionary; UI dropdown (no more raw hex). - New codec primitives (
AiScript_File):GrowWorkerJumpTable(adds slots to a worker's jump-table — enables a NEW branch) +AppendGuardedAction(prepends a guarded action to an entrypoint, preserving the original handler) +OperandKindOf. - UI in
MonsterAiEditor: Behavior Library card + Validate button/report + command dropdown. - Gate
AiScriptLab --ai2PASS (real corpus, 361): jump-grow 898/898 workers, guarded-action 692/692 (first+last entrypoint) + synthetic sentinel 1/1, validator clean 346/346, AiCommandId 620/620, positive-catch 8/8/8 (jumpOOB via the editor path). Original--RT0 gate 361/361 intact. - A 4-agent adversarial review found + fixed 2 bugs (one-past-end sentinel self-loop;
OperandKinddropped on the editor save path), now locked by the gate. Docs:docs/reverse/FFX_AI_JUMPTABLE_GROW_PROVEN_2026-06-05.md+docs/ai/FFX_AI_ASSEMBLER_PRODUCTIZED_2026-06-05.md. - ⚠️ Structure proven OFFLINE; in-game behaviour (RT2) pending Halyson's OK (probe). Templates "heal ally < 25% HP" and "enrage on turn N" NOT shipped (HP-field / turn-counter anchor not byte-confirmed).
SUCESSOR_FFX_HD_MODELOS_MASTER_2026-06-05.mdclosed for sum/npc. - Textures (manifest-driven):
extract-texture-batchinRuntimeTools/PhyreModelExportLabgained--from-manifest, which reads the<id>.ahwin32g_fileNames[](authoritative asset manifest) and extracts the EXACT texture the game loads. 305 PNGs (pc/npc/sum), provenance maptexture-provenance-map.json, 0 silent mismatch. RE: theahwin32is a readable C header — resolves cross-refs (c906←c106,c908←c108,c806←c805) AND multi-texture (c101+c101_01,n238+n238_hair,n356←n238_hair) with no IDA. Bonus find: NPC rig-inheritance key =0x6NNNin the.chr(nXXX→kNNN map, 222/222 valid). Docdocs/reverse/FFX_AHWIN32_ASSET_MANIFEST_2026-06-05.md. - Bake (mesh+texture+anim): driver
work/_scratch_mgrp/bake_cast.pyviaphyre_chr_gate. Static 253/253 (whole cast textured, clean). Animated: sum own motion, npc inheritsskl/<base>. - Visual QA (workflow, 21 vision agents): 248 animated triaged via F3D — 157 clean / 58 torsion / 33 exploded. Bind picker (rest/A1) on the 33 did not fix.
- 🔧 Blender CORRECTION (2026-06-06): F3D was LYING on skinned animation. Blender diagnosis (mesh
EXPLODE_RATIO≈1.0, no growth) + truthful Eevee render proved the "exploded" ones have an intact body, only a limb/accessory stretched. Re-QA (8 agents over Blender renders) corrects to 175 clean (71%) / 59 torsion (24%) / 14 exploded (6%) — 20 models rescued, the offline bake was always ~94% usable. The 14 genuine = 11 Aeons + 3 npc (non-humanoid rig; need mocap/parent-map RE). Rule updated: the BLENDER screen decides, F3D lies. Pipelinework/_scratch_mgrp/blender_{diagnose,render_anim,batch_render}.py. - 🎯 RETARGET SOLVED via
--retarget-delta(2026-06-06): 175→215 clean (87%). Newphyre_chr_gateflag that applies inherited motion as a delta from frame0 onto the npc REST (M=restLocal·inv(m0)·mf), preserving npc proportions instead of imposing the base's. IDA RE proved the.chr@0x30remap was already applied — the cause was the rest-pose retarget, not the remap (docFFX_INHERITED_MOTION_REMAP_RUNTIME_2026-06-06.md). Pilot+batch of 73 fudidos + Blender re-QA + per-model keep-best: +40 clean, 44 rescued, ZERO regression (1 kept because it would regress). NPC animated = 200/222 clean (90%), 0 exploded; 8 Aeons still exploded (mesh immune → mocap). Solves the MASTER §2.4 "A1-universal" without A1's risk. - 🐉 WHOLE CAST closed offline (2026-06-06): 498/643 clean (77%), 90% usable. Extended truthful-Blender-QA + retarget-delta + keep-best to the rest: obj/wep/pc (46 clean/55, party clean) AND the 340 MONSTERS. The old monster QA (bbox) claimed "0 explosions" = a lie; truthful Blender QA (29 agents) found 127 real fudidos; retarget-delta on the 66 inherited → 36 promoted, monsters 206→237 clean. Total animated (643): 498 clean / 86 torsion / 51 exploded / 8 blank. Residual (9%) = divergent mesh / degenerate bind → mocap/mesh-RE, not retarget.
- obj/wep/pc (2026-06-06): same pipeline extended — static obj 110/110 + wep 79/79 + pc 34/49 (15 pc fails = dummy
c8xxslots with no PS2.chr). Whole HD cast static = 476 models. obj/wep mostly rigid (sparse anim 25/7); screen spot-check: f001/w001/c004=Auron clean. - Gallery
work/cast_hd_gallery.html(model-viewer, static/anim toggle, sum/npc/obj/wep/pc filter). All inwork/(gitignored): only the COMMANDS are code. No csproj bump (lab/RE in RuntimeTools).FFX_TOOLBOX_DISCOVERY_PLAYBOOK_2026-06-05.md): an online sweep + license vetting of external FFX HD/PS2 tooling (VBF, Phyre, kernel.bin, ATEL, FMOD, TM2, FMV) and editor NuGets. Vetted key finds: External File Loader (ffgriever, BSD-2) loose-file with no repack, Kaitai Struct (C# runtime MIT) to generate C#+JS readers, fahrenheit (MIT, C#) hook+DLL mod framework, and confirmation that FFXDataParser has NO LICENSE (study only). Thetested?column is still❌— oracle test against the local corpus is pending, plan included in the doc itself. Doc-only: no csproj bump (lab/RE doc-only rule). 58packaged dossiers;- one manifest per dossier;
- one Git-safe mirrored copy under
docs/history/DOSSIÊ FFX 01-06-2026/; - one exclusion report for the single giant external binary blocked by GitHub size limits.
- separate workshop-range knowledge bases;
- one aggregated master atlas;
- root
KNOWLEDGE_BASE.mdas the single entrypoint; - one official merge plan;
- a
Pt6/Pt9dependent-workshops annex; - formal technical family lines for the project.
merge in docsExtras nowExtras laterfrozen researchhistorical cleanupps3dataffx_ps2- executive closeout
- child-workshop compendium
- runtime/AI atlas
- successor bootstrap
- short maturity board
Extras nowverdictExtras laterverdict- frozen research boundaries
- derived
Pt67product role ps3datavsffx_ps2split- provenance rulebook
- mandatory citation facets ### Added
important.bina_ability.binReadNo-Edit Byte IdentityReread- additive text token contracts in
FFXProjectEditor/FfxLib/Text/* - a pure validation / round-trip decision utility
TextLabTools/TextContractHarnessas the first production-side smoke consumerdocs/history/BATTLE_AI_FRONTIER_2026-05-31.mddocs/history/MODELVIEWER_BINDING_FRONTIER_2026-05-31.mddocs/history/PT23_TO_PT34_KNOWLEDGE_BASE.mddocs/history/PT23_TO_PT34_CHANGELOGS.mddocs/history/PT23_TO_PT34_BRANCH_MAP.mddocs/history/PT23_TO_PT45_CODE_KNOWLEDGE_BASE.mddocs/history/PT23_TO_PT45_CHANGELOGS.mddocs/history/PT23_TO_PT45_BRANCH_MAP.mdKNOWLEDGE_BASE.mddocs/history/PT2_TO_PT11_KNOWLEDGE_BASE.mddocs/history/PT12_TO_PT22_KNOWLEDGE_BASE.mddocs/history/PT23_TO_PT45_KNOWLEDGE_BASE.mddocs/history/PT2_TO_PT45_MASTER_KNOWLEDGE_BASE.mddocs/history/PT6_PT9_DEPENDENT_WORKSHOPS_ANNEX.mddocs/history/NON_FFX_EDITOR_THREADS_ANNEX.mddocs/history/PT_FAMILY_LINES_ANNEX.mddocs/history/OFFICIAL_MERGE_PLAN_2026-05-31.mddocs/history/PS3DATA_FULL_TREE_RESEARCH_PLAN.mddocs/history/PS2_FULL_TREE_RESEARCH_PLAN.mddocs/history/PT50_TO_PT58_ABSORPTION_PLAN.mddocs/history/PT52_TO_PT58_CLOSEOUT_REPORT_2026-05-31.mddocs/history/PT50_PT51_HISTORICAL_CLEANUP_2026-05-31.mddocs/history/PT6_TEMPORARY_CLOSEOUT_2026-05-31.mddocs/history/PT6_CHILD_WORKSHOPS_COMPENDIUM.mddocs/history/PT6_RUNTIME_AI_DISCOVERY_ATLAS.mddocs/history/PT6_SUCCESSOR_BOOTSTRAP.mdhistory/pt23-battleai-structurehistory/pt24-exactlaunch-seamhistory/pt25-selectorbank-materializationhistory/pt26-battlestate-diffhistory/pt27-routereplay-truthhistory/pt28-battlecapacity-prephistory/pt29-keyitem-crashfixhistory/pt30-autoability-crashfixhistory/pt31-geometryviewport-blockhistory/pt32-chrcarrier-decodehistory/pt33-aislice-payloadhistory/pt34-legacybridge-narrowing### ChangedCurrentWorkspaceOverviewCurrentMonsterEditorCurrentItemsCurrentBattleExplorerCurrentLiveBattleLabCurrentStringExplorerEncodeSafeDecodeOnlyRawPreserveUnknownRiskReuseOriginalBytesReencodeAllowedBlocked- operational wrappers for the
Extras / ps3dataline - useful
Pt6 / Pt23AI micro-workshops with preserved knowledge and archive-safe status merge nowmerge laterExtras/read-onlyknowledge onlyPt56,Pt52,Pt54,Pt58= attack now in softwarePt57and parts ofPt53/Pt55= attack later, still read-onlyPt53,Pt55,Pt57= aggressive research without overclaimPt50,Pt51= historical cleanup before they count as clean sourcesMagicPackageViewerBatEffPackageViewerMagicEffectCrosswalkExplorernever blind merge### Validated- purpose
- utility
- merge likelihood
- per-workshop mini changelog
binding truthlanguage- strong narrowing for
owner/target/parentage/commit - guardrail base for
Pt6andPt23 formation 0..7enemy actor rows 0..10rawMonsterId -> corpuscomposition truthvsactor-surface truthPt46 / AIBlobParityGrammarLabPt47 / AIRuntimeDispatchLabPt48 / SafeAIMicroProbeLabas part of the runtime/AI legacy, even without writer or patcher claims.- old-wave base
Pt2..Pt11 - middle-wave base
Pt12..Pt22 - heavy-wave base
Pt23..Pt45 - one single aggregated atlas with memory/runtime/binding/guardrails
- satellites of
Pt6 - satellites of
Pt9 - production-side exceptions
Pt29/30 Model Viewer / BindingBattle / AI / Runtime TruthText SafetyKernel / ShopTooling / Safety / ReleaseProduction Crashfixes### Notes ### Planned ### BacklogTextSourceCapabilityIndex*StringExplorerUI wiring0x10 + 0x120x13### Blocked ## [v2.13.0] - 2026-06-05 ### Added ### Notes ## [v2.12.0] - 2026-06-05 ### AddedFfxLib/BattleMap/BattleArenaPositionWriter.csre-stamps each actor's X/Y/Z in the chunk3 anchor array IN PLACE (on-field monsters = pointer+0x20; also party/aeon/staging byrole), value-only: never touches the header/pointers/count/other chunks, preserves W verbatim. Since the battle→scene transform is IDENTITY (IDA-proven, v2.10.0.1), a coord picked in scene space is written verbatim. Same slot-safe pattern asFormationSlotWriter(guard + backup-onceWriteLooseFile). ### Validated RT0 (no-edit == byte-identical) 862/862, POSITION-ONLY (diff confined to the+0x20array) 862/862, RE-READ 862/862, + SAVE LIFECYCLE (no-edit/edit/restore on a temp copy) PASS. BiancaCatalogLab + AuroraChamberLab + BattleArenaPositionLab (previously left out). Full CI PASS (7/7 gates): ReverseHarness, AiScriptLab, FormationSlotLab, AbilityCommandLab + the 3 new ones. ### Deferred offline; the in-game screen is the arbiter. Add/remove monster slot (vary count) = structural (Rebuild), next. ## [v2.11.1] - 2026-06-05 ### Added box that filters the dialogue rows by text content, and (2) a language filter (English/Japanese checkboxes, English by default) — previously JP and EN were dumped in the SAME list (Japanese first = a wall of Japanese). RefactoredEventExplorer_DataModel(allTextRows+ApplyTextFilter, English-first) + axaml (search TextBox + JP/US CheckBoxes). Does NOT touch the writer (Tier 1 stays--event-rt0397/397 + edit 12/12). ### Notes translation injection, out of the writer scope). Word search is within the selected event. ## [v2.10.0.1] - 2026-06-05 ### Proven (RE / IDA, offline) copies the chunk3 (battle-local) coordinates VERBATIM into the actor's world node — no flip-Z, scale, or rotation; only Y gains a per-actor model-height (actor+0x534). Since the.dae.phyrescene == the raw Phyre vertex frame 1:1, P_scene(X,Y,Z) = P_battle(X,Y,Z) (s=1, R=I, T=0). Proven chain:FFX_Battle_AreaChunk_GetSetPosition(0x7AC000; chunk3 base0x112A9B0; copies 4 floats verbatim; actor world pos @+0x3B0) →FFX_Battle_ResolveActorPlacement(0x7A9AE0) →FFX_Battle_GetActorByIndex(0x794030, stride0xF90== RT2 enemy). The flip-Z guess was an artifact of including off-field staging rows (party-back Z≈-168). Doc:docs/reverse/FFX_AURORA_BATTLE_TO_SCENE_TRANSFORM_IDA_PROVEN_2026-06-05.md(+ rename-queue for the real.i64). ### Changed (Aurora Chamber — honesty) plots anchors directly in scene coords (default was already identity) and the flip-Z toggle becomes DISPROVEN/comparison;aurora-actors.jsoncoordSpace=scene_world_identity_ida_proven. ### Deferred≈ chunk3(residual ~0) + measure the exact Y term. Probe AUTHORIZED by Halyson; pending only the game being open (READ via the existing probe, no new code). SPIRA FORGE stays paused. ## [v2.10.0] - 2026-06-05 ### Added container) is no longer read-only. Editing cutscene/event dialogue is now a BUTTON.FfxLib/Event/Event_File.Write.cs(new): byte-faithful EV01 container repack — every chunk re-aligned to0x40, the absolute offset table + EOF terminator recomputed (magic +0xFFFFFFFFsentinel preserved). No-edit = guaranteed VERBATIM; edited text reusesTextTable_File.Write(chunks JP=1/EN=4); ATEL script (0), Unknown 2 and FTCX (3) preserved byte-for-byte. Tier 2 hookScriptChunkOverride(re-stitch of an edited chunk-0).Event_File.cs: captures the raw header + text tables; tolerates null-pointer field-string entries (8 files) by preserving the chunk verbatim (documented text-editable frontier).TextTable_File.Writeadditive overload (includeTrailingPadding): emit table+pool without internal padding (the container re-pads to 0x40). Does NOT break--textstr-rt0(default = legacy behavior).Modules/EventExplorerbecame a dialogue EDITOR: editable JP/EN strings (TwoWay TextBox) + a "Save dialogue" button that re-packs and writes the.ebp. (FfxLib/Ai/AiScript_File.cs, used read-only as a donor) reads/edits the event script (same AiFile family).- Byte-local operand PATCH PROVEN (12/12): editing one chunk-0 operand changes only those bytes; the container re-stitches identically elsewhere; the re-read carries the new operand.
- GROW (AppendCode) is a documented frontier: the donor
AppendCode(built for battle, descriptors in DATA) does not relocate the header-resident descriptors event scripts use ([0x38..scriptStart)) — needs event-aware relocation (coordinate with the AI Assembler lane). ### Validated round-trip 12/12** (swap a string → repack → re-read: edited string matches, untouched chunks verbatim, idempotent). 397/397; byte-local operand patch 12/12. Editor builds 0 errors. (0 breaks), EOF==filesize,0xFFFFFFFFsentinel. Docs indocs/reverse/FFX_EVENT_*_2026-06-05.md. ### Honesty / Deferred text-editable yet). Tier 2 = patch proven; append/grow + structural authoring = Tier 3, documented not closed. Verification preferred offline byte-RT0; in-game RT2 of edited dialogue is still recommended. ## [v2.9.0] - 2026-06-05 ### Added btlmap scene catalog) to the MapViewer and lifts actor coordinates out of chunk3. Dedicated to Aurora & Bianca. 💛 - Scene Picker consumes
BattleMapCatalog_File/BattlefieldSceneResolver(read-only) — list/select scenes by area and map-key. - Render drives
PhyreMapExportLab(on-demand glTF export of the btlmap scene) and opensFFXMapViewerWebvia the?catalog=/?map=/?actors=deep-link — a per-scene mini-catalog, never touching the sharedcatalog.jsonnor rewritingapp.js. - Coordinates via the new
FfxLib/BattleMap/BattleArenaAnchors_File.csreader (pure/Avalonia-free): decodes chunk3 (96B area-record, pointers+0x10..+0x2C, live monsters+0x20, 16B XYZW Y-up elements), lists the battle-local anchors and exports JSON for Encounter Authoring. anchor gizmos from?actors=+ a "pick" mode (y=0 plane raycast → world coords). Non-intrusive (hookswindow.ffxMapViewerDebug; no-ops without?actors/pick; never editsapp.js). ### Validated klyt00_00/sins02_00/mihn00_00 == doc-proven coords); corpus 862/862 clean (0 NaN/Inf, W==0 on live monsters); deterministic; BIANCA→scene→battle→anchors pipeline 52/52 mapped scenes carry anchors. 10,804 triangles,gatePass: true). Editor builds with 0 errors (verified in an isolated HEAD worktree). ### Honesty / Deferred UNCALIBRATED** (P_scene = R·s·P_battle + T; flip-Z/yaw-180 unresolved) — anchors are raw battle-local, not engine-exact. Probe calibration = Wave 3 (needs Halyson's OK). SPIRA FORGE stays PAUSED; Aurora only CONSUMES MapViewer + BIANCA (read-only/additive), never starting the hub. ## [v2.8.0] - 2026-06-05 ### Added (catalogs the 25 areas / 56 scenes of HDps3data/btlmap—<area>NN_<variant>withmdl/d3d11/<leaf>.dae.phyre) +FfxLib/BattleMap/BattlefieldSceneResolver.cs. Pure/Avalonia-free, compiles into the editor (0 errors). "azit03"), NOT thebattlefieldu16 (that is a global arena id, shared across maps —bf=1061spans nagi/test/tori/zzzz). Doc:docs/reverse/FFX_BATTLEFIELD_SCENE_BRIDGE_2026-06-05.md. pointer+0x20(float32 X,Y,Z,W; Y-up; W=0; 16-byte stride; formation slot ↔ entry). Party+0x10, aeon+0x18, camera+0x2C. Doc:docs/reverse/FFX_BATTLE_FORMATION_POSITION_CHUNK3_DECODED_2026-06-05.md. (-- export --ps3-root <ps3data> --area btlmap/azit/azit03_a). Actor-overlay plan + probe coordinate calibration (DESIGN):docs/ai/FFX_AURORA_COORDINATE_SYSTEM_AND_CALIBRATION_2026-06-05.md(probe only with Halyson's OK). ### Validated deterministic; 56/56 scenes with exactly one primary model; bridge with 0 unexplained misses (22 HD-orphan maps = cut/PS2-only EXPECTED; 4 orphan scenes bika04/grid00/nagi03/sfia00 = boss/story EXPECTED). ### Deferred the DINPUT8 probe needs Halyson's OK and SPIRA FORGE is PAUSED. ## [v2.7.1] - 2026-06-05 ### Added / Validated WeaponNameTable, MacroDictionary, NameDescriptionTextTable, NameDescriptionTextPrefixTable, BtlTextTable, SphereGrid, ShopGearCatalog, BukiGetTreasureCatalog, AlBhedDictionary, PointerScriptTable, BattleTextTable, ShopTable. Preserve-only pattern (WriteIdentityfor the lossy-rebuild ones). New gate-sweepTools/Wave1Rt0.cs. ## [v2.7.0] - 2026-06-05 ### Added swaps the AiFile partition for one of a DIFFERENT length, 16-pads the AiFile, shifts later sections and rewrites the header section pointers (m###.bin), writing the AiFile verbatim (no codeLength clobber). The AI Assembler UI now SAVES grow/shrink (was length-preserving only). Clobber cause documented + fixed by design (Option B: minimal surface, does NOT touchMonster_File.Write→--monster-rt0stays 361/361). VM from worker counts + per-worker datalen (round 16) (NOT partition/DeclaredLength/codeLength) and trusts the in-file pointers → grow relocation is honored and trailing pad is safe. (golden rule: rename-queue.) ### Validated (insert → grow-aware splice → re-read clean + tail/header preserved verbatim + 16-aligned + idempotent), SHRINK 346/346 (remove a non-targeted instr → negative delta → re-read clean + tail preserved).--monster-rt0361/361 (no regression). Corpus alignment: 16/32/64/128/256, 0 trailing pad. (free-edit)"** card rendered with the editable instruction list (opcode/operand/remove) + Insert/Save Structural + preview. Screenshotwork/spira_forge_qa/monster_ai_assembler_v01.png. ### Deferred DINPUT8 probe (shared) — under Halyson's explicit OK. Offline + RE prove byte/game-safety; the in-game screen is the final arbiter. ## [v2.6.0] - 2026-06-05 ### Added (insert / remove / modify) on top of the byte-local operand editor. The rebuilt AiFile comes fromAiScript_File.Rebuild(RT0-proven: relocates entrypoints + jump tables via an old→new map). Editable list (opcode/operand hex + remove checkbox), insert-after-selected, delta preview. Save is enabled only for length-preserving edits (codeLength unchanged) → byte-safe splice viaSpliceAiFileIntoMonster. GROW/SHRINK is LAB (honest message): the loose-file save needs a header-aware monster relayout + alignment padding + in-game proof. --ctbbase-rt0→CtbBase_File(ctb_base.bin), preserve-only.--mixtable-rt0→MixTable_File(prepare.bin), preserve-only.--aiasm-rt0→ proves the AI Assembler structural save (no-edit Rebuild + relayout + splice byte-identical) and measures the corpus AiFile→WorkerFile alignment. ### Validated length-preserving editing is byte-safe. Grow=LAB (cause:Monster_File's 0x34 header overlapsAiFile[0..4)=codeLength + a length change breaks WorkerFile alignment; corpus is 16/32/64/128/256-aligned, 0 trailing pad). ### Blocked / LAB ## [v2.5.0] - 2026-06-05 ### Added controls (Open Spector,Capture Next Frame,Export Last Capture) plus a firstMaterial Debugpanel with live inventory of the loaded glTF materials, a selector, fact chips, and per-slot texture cards (map,normalMap,aoMap,envMap, etc.). records what landed, what was validated, and what remains explicitly outside proof. ### Validated controls appeared, and theMaterial Debugpanel populated from the loaded glTF. trustworthy way, the viewer degrades toFrame preview unavailable/Texture preview unavailable on this source surfaceinstead of pretending to show valid visual evidence. ## [v2.4.4] - 2026-06-05 ### Added selectable battles; picking one publishes toFieldContext.SelectedBattleIdand the Formation Editor jumps straight to that battle (loads its formation). Realizes the masterplan's "click a zone, swap the formation" via the shared spine, no shell plumbing.FieldContextgainedSelectedBattleId/SelectBattle. ### Validated 37 BattleIds with no folder + 37 folders never referenced (special/event battles) — the handoff filters to the ones that exist. Editor jumped to the loaded battle). Screenshotwork/spira_forge_qa/handoff_encounter_to_formation_v04.png. ## [v2.4.3.1] - 2026-06-05 ### Reverse / Proof hypothesis (CONTINUE_AQUI_PERNAS_HD): the "52m_skeletonMatrices→ 79 joints" map lives in the Phyre file, not in IDA.- The skin palette is
PMatrix4[0..51](linked fromPMeshfield 12); it equals the livem_skeletonMatricesbyte-for-byte (maxDist=0.00000). - The slot→node map is the
intat offset 12 of eachPSkeletonJointBounds[j](52 slots → 52 nodes, bijection). - Composing
m_defaultPosethroughm_matrixParentsreproduces the authored inverse-bind EXACTLY:0/52nodes diverge. So--hd-defpose+--hd-parentsis already the game's real bind. - Root cause of the historical coil: a bake without
--hd-defpose/--hd-parentsfalls back toinvBind = PMatrix4[52+b](raw LOCAL matrix) → the mesh explodes. The defpose+parents recipe is the fix and is already the gallery default. - New read-only probes:
work/_scratch_mgrp/phyre_palette_probe(locates the palette, proves the bind is exact, emitsnode_to_slot.json) andphyre_legs_probe(matcher; illustrates the coincident-translation pitfall). ### Validated c007 (Rikku) — in forced rest, battle (id5_c4318 t0.0–0.9), 4 calf angles in a deep crouch, and multi-clip (c4333/c4365/c4886). Numerically: leg-joint local/world matrices are perfect rigids (scale=1, det=+1, ortho 0.0000). No IDA. Full proof indocs/reverse/FFX_HD_SKIN_PALETTE_DECODED_LEGS_NOT_BIND_2026-06-05.md. ## [v2.4.3] - 2026-06-05 ### Added existed but had never been byte-gated, closing 4 more concrete editable-base families: --keyitem-rt0(Tools/KeyItemRt0) →KeyItem_File(important.bin), preserve-only writer (clones the original bytes + re-stamps onlyPrimerByte10/OrderingByte13).--treasure-rt0(Tools/TreasureRt0) →Treasure_File(takara.bin), full-decode round-trip (4 bytes/entry).--customization-rt0(Tools/CustomizationRt0) →Customization_Filegear kaizou.bin + aeon sum_grow.bin (preserves the header prefix/tail + re-emits the decoded entries).--autoability-rt0(Tools/AutoAbilityRt0) →AutoAbility_File.WriteAbilities(a_ability.bin, DATA section), preserve-only writer. (Readsarms_rate.binonly to satisfy the read contract; does NOT write arms_rate and does NOT coverWriteAbilitiesAndText/text repack.) ### Validated takara.bin (503 entries, 2012 B), kaizou.bin (125) + sum_grow.bin (77), a_ability.bin (134 entries, 19590 B). No-edit save = byte-identical; edit = byte-local (same preserve-only pattern that closed Monster/Encounter). Partially lifts the historical caveat "important.bin/a_ability.bin blocked for mutation-safe writer claims": field (data-section) editing is now proven; text-pool repack remains unclaimed (same monmagic-style drift risk — out of scope for this gate). ## [v2.4.2] - 2026-06-05 ### Added inline (e.g.[m003 - Murussu, m003 - Murussu, m009 - Dingo]). Lazy-loaded + cached + capped (≤90 visible battles; with the full list it asks to filter by area). Read-only; brings the masterplan's "zones painted with the monsters that spawn there" into the editor (encounter↔formation fusion made visible). ## [v2.4.1] - 2026-06-05 ### Added production helper (slot-only guard + backup-once.spiraforge.bak+ write). Now used by the Formation Editor (PersistSnapshot) AND tested by the headless gate — same code in the editor and the test, no duplication. ### Validated workspace/asset, read-only respected): (a) no-edit Save = disk byte-identical + backup==original; (b) edit Save = slot-only on disk + reread match + backup preserved; (c) restore from backup = byte-identical. PASS. Closes the v0.2 honesty gap (in-app save proven on disk, reversible). Corpus still 858/858;offline_ci4 gates PASS. ## [v2.4.0] - 2026-06-05 ### Added Entries/Groups/Formations (VARIABLE counts + create tables), assigns fresh dataOffsets, rebuilds chunk0 + the chunk table, preserves block-sharing + padding. Gate--encounter-rebuild-rt0. The structural base for "CREATE ENCOUNTERS". ### Validated (4096/4096)** + grow-test (add 1 formation, end 0x1000→0x1002, 2 chunks intact) valid. family; fixed the trailing padding drift. Honest note: the StringExplorerhelp_txt.binregistrations are DEAD in this extraction (file absent) — the writer is proven on a real field-string (spcodedic.bin). ## [v2.3.2] - 2026-06-05 ### Added (Ability_Command.ReadList→WriteList), whichKernelCommandsalready uses to Save but was never byte-gated. References the editor project (deep dep tree), calls only static FfxLib methods. Wired intooffline_ci.ps1. ### Validated (1 byte) 4/4. PASS. This is the proven foundation for the "new Black magic" dream feature (lives in command.bin). ### Blocked monmagic original shares/dedups text whileWriteListre-appends (FfxEncoding.WriteBytesIntoTextFileonly appends; command/item are pure-append → they match). Risk: KernelCommands' MonMagic Save bloats the file — gate it until a dedup-aware writer passes. Audit + fix target:docs/reverse/FFX_ABILITY_WRITER_AUDIT_2026-06-05.md. ## [v2.3.1] - 2026-06-04 ### Added past EOF (kino03_*,mihn05_*,cdsp00_02): treats the past-EOF chunk (and beyond) as absent instead of rejecting the whole file; earlier chunks (incl. formation @2) stay valid. Those battles are now editable in the Formation Editor. ### Validated re-read 858/858 PASS. The prior 843 unchanged. ## [v2.3.0] - 2026-06-04 ### Added monsters (16 bytes) of a btl_* formation viaBattle_File.WriteWithFormationSlots, byte-safe slot-only. Consumes theFieldContextspine (pre-filters battles by the Hub's selected field area). Monster picker (Monster_Dictionary+ Empty, preserves the raw high nibble). Save writes a workspace loose-file with a.spiraforge.bakbackup +AssertSlotOnlyDiffguard, viaByteSnapshotEditorSession(Undo/Discard). Offline, no probe.offline_ci.ps1(-BtlRootparam). Additive read-only members onBattle_File(FormationChunkOffset/FormationSlotsOffset/FormationSlotsLength). ### Validated (15 btl_* unparseable by the reader at the time — fixed in v2.3.1.) ## [v2.2.0] - 2026-06-04 ### Added spine keyed byfield_token. Field picker fed by the bridge CSV (ps3data-map-btlmap-fieldid-bridge.csv, 357 fields, structural-candidate). Selecting a field publishes toFieldContext(observable singleton) and 2 consumers react read-only: map deep-link (?map=map/<area>/<field>for FFXMapViewerWeb) + encounter peek (readsbtl.binviaEncounterTable_File, candidate area↔map join). CSV copied to output via csproj<Content>. Offline; the picker runs without a project. No writer, no probe. ### Validated Screenshotwork/spira_forge_qa/field_hub_v01.png. ## [v2.1.1] - 2026-06-04 ### Validated--player-rt0gate:ply_save.bin(3098) +ply_rom.bin(2161) -> no-edit RT0 byte-identical. (Writers already existed slot-only; now gated.) ## [v2.1.0] - 2026-06-04 ### Addedbtl.binbyte-for-byte and re-stamps only the editable fields (tableId/Unknown0C, groupBattlefield/Danger/TotalWeight, formationId/Weight).--encounter-rt0gate in the editor. ### Validated ## [v2.0.0] - 2026-06-04 > NEW ERA — MAJOR. The editor crossed from "offline file editing" to PROVEN LIVE RUNTIME EDITING: > editing a monster's AI bytecode in RAM and seeing the behavior change on screen, no crash, reversible — > the project's supreme goal #1, realized. MAJOR = a new capability class (not a contract/save/build > break — we only added and hardened).-betabecause RT2/God-Mode are not yet productized into gated UI. > Milestone of the Claude Code / VSCode wave + the union with the 2nd Codex account. ### Highlights changes on screen — Flame Flan Firaga→Thundaga, no crash, reversible. Chain:enemy-list(0xD34460) ->MemoryChr.Ptr_script_chunks(+0xF78) -> live AiFile === diskm0NN.binbyte-identical. global ability — the monster doesn't need to "own" it. Proof: a Skoll spat Ifrit's Hellfire on screen. data revive (death flags + KO), all viaMemoryChr+ probe. ### Added offset** (+delta) -> a valid larger AiFile (the path to "ADD AI", beyond the byte-local budget). jump labels + inferred worker type), operand editing + loose-file Save.FFX_MUSIC_SYSTEM_AND_MOD_IDEA(Music Remapper),FFX_AI_BYTECODE_OPCODE_TABLE_PROVEN,CODEX_MAPVIEWER_WATCH_JARVIS,FFX_MAP_DEVELOPMENT_TOOL_MASTERPLAN(Spira Forge). ### Changed / Validated StatSheet/Loot + preserve header Signature/Padding (the Padding overlappedAiFile[0..3]). ### Blocked / Deferred (honest) (game-closed rebuild). Player found:FFX_FmodMusic_PlayTrackByIndex(181 tracks); the PS2 SPU FIFO is stubbed on HD. ### Absorbed from Labs / Multi-agent union with the 2nd Codex account (MapViewer / model-texture lane): exporter now exposes material-role signals (TextureSampler1/normalMap/reflection/water/PhyreWaterShader), external-viewer comparison (glTF-Sample-Viewer as oracle; gap proven exporter-side, not shell), and the Spira Forge masterplan kickoff. Multi-agent coordination logged indocs/ai/CODEX_MAPVIEWER_WATCH_JARVIS.md. ## [v1.7.0] - 2026-06-04 ### AddedAppendCode: appends instructions at the end + relocates the data section.Rebuild: insert/remove/modify an instruction ANYWHERE + AUTOMATICALLY relocates all jumps + entrypoints (old→new linker map) + the data section. Orphan branch (removed instr) -> honest error. ### Validated workers resolve, post-insertion entrypoint relocated0x2D1→0x2D4on its own; grow-test (AppendCode) RT0. ## [v1.6.0] - 2026-06-04 ### Validated StatSheet/Loot + preserve headerSignature/Padding(the Padding overlappedAiFile[0..3]). ## [v1.5.0] - 2026-06-04 ### Validated / Blocked swap BLOCKED** (FMOD API__thiscall, probe cdecl-only). DocFFX_MUSIC_SYSTEM_AND_MOD_IDEA(Music Remapper). ## [v1.4.0] - 2026-06-04 ### Validated (live) ability — the monster doesn't need to "own" it. Proof: a Skoll spat Ifrit's Hellfire on screen. ## [v1.3.1] - 2026-06-04 ### Fixed / Validated (live) flags). Auto-scan (Scanstatus) toggled live. ## [v1.3.0] - 2026-06-04 ### Validated (live) (POINTER_BATTLE_ENEMY_LIST 0xD34460, stride0xF90) + probe. ## [v1.2.0] - 2026-06-04 ### Added jump labels) + operand editing + loose-file Save. ## [v1.1.0] - 2026-06-04 ### Validated (🏆 HEADLINE — supreme goal #1) behavior changes on screen (Flame Flan Firaga→Thundaga), no crash, reversible. Chain:enemy-list 0xD34460->MemoryChr.Ptr_script_chunks +0xF78-> live AiFile === diskm0NN.binbyte-identical. Doc:docs/reverse/FFX_AI_RT2_LIVE_EDIT_PROVEN_2026-06-04.md. ## [v1.0.0] - 2026-06-01 Maturity milestone for the editor as a real reading, validation, and knowledge-navigation platform, with enoughExtrasproduct surface to justify an honest1.0even though runtime, AI, and body-playback bosses are still open. ### HighlightsPS2 KnowledgeTextures (TM2 + TXC/CLT/FMT/SPS2 support lane)BIN-FTC AtlasProject / PipelineMagic EffectsPresentation ContainersBattle Corpus Crosswalk### AddedMagicPackageViewerBatEffPackageViewerMagicEffectCrosswalkExplorerFtcHeaderInspectorBinSidecarGraphSignature Groupin the shellTxcCltPairExplorer- cold
fmt/sps2metadata ### Changed ### Validated read-onlydo not promoteno runtime proofwhere applicablepipeline/support onlywhere applicable ### Notesmagic solvedAI solvedModelViewer playback solved- broad writer authorization ## [v0.11.0-beta.2] - 2026-06-01 Real product evolution for the
Extrasline inmain. ### Highlights masterffx_ps2ps3dataPS2 KnowledgeTextures (TM2)BIN-FTC AtlasProject / Pipeline### AddedExtrasSourceResolverExtrasEvidenceBadgeModelExtrasProvenanceModelExtrasReadonlyBoundaryModelExtrasFileOpenServiceCdIndexExplorerProjectDescriptorViewerAbmapSupportGraphdocs/history/PT52_BIN_FTC_FILE_MEANING_GUIDE_2026-06-01.mddocs/history/PT53_BATTLE_MAGIC_FILE_MEANING_GUIDE_2026-06-01.mddocs/history/PT54_PROJECT_ABMAP_FILE_MEANING_GUIDE_2026-06-01.mddocs/history/PT56_TEXTURE_PALETTE_FILE_MEANING_GUIDE_2026-06-01.mddocs/history/PT57_PRESENTATION_CONTAINER_FILE_MEANING_GUIDE_2026-06-01.mddocs/history/PT58_FFX_PS2_OWNERSHIP_AND_LINKAGE_GUIDE_2026-06-01.md### Changed ### Validated- no writer
- no repack
- no final decode claims
- no mixing cold research with runtime proof ### Notes
kernel -> mag_* -> bat_eff## [v0.10.0-beta.1] - 2026-05-31 Main-branch consolidation beta after the first strong wave of curated workshop absorption. ### Highlights ### AddedShop ExplorerFfxLib/ShopAssets/Shop- a guarded writer for
item_shop.binandarms_shop.bin NameDescriptionTextPrefixTable_Filereader + no-edit guardforimportant.binreader + no-edit guardfora_ability.bin### Changed ### Validated ### Deferred ### Blocked ## [v0.9.0-beta.1] - 2026-05-31 First version that honestly assumes the real size of the editor and of the ecosystem around it. ### Main Branch Highlights ### Production Surface Present In Main ### Absorbed From WorkshopsTextLabTools;ProductionAuditTools;- conservative text/monster harness and release.
PlayerGrowthEditor;CtbBaseEditor;MixTableEditor;- the historical line that later sustained
KeyItemEditor. AutoAbilityEditor;- conservative parsers from
AutoAbility_File.csandArms_Rate.cs. Shop Explorer;FfxLib/Shop;Assets/Shop;- guarded writer for
item_shop.binandarms_shop.bin. ### Governance And Versioning ### Validated ### Still Blocked ### Why This Is Still Beta ## Historical Semantic Reconstruction Important editorial note: ## [v0.8.0-beta.1] - historical reconstruction (pre-Git official SemVer) Milestone where the ecosystem already operates as a large modular editor with multiple specialized fronts alive at the same time. ### Main Surface At This Stage ### Ecosystem Pressure ### Still Missing ## [v0.7.0] - historical reconstruction (pre-Git official SemVer) Milestone where the main line shifts from “more modules” to “more proof.” ### Added ### Changed ### Not Yet Safe ## [v0.6.0] - historical reconstruction (pre-Git official SemVer) Milestone where the kernel line and the conservative hardening of secondary systems stop being a promise and become part of a serious editor. ### Added ### Changed ### Still Missing ## [v0.5.0] - historical reconstruction (pre-Git official SemVer) Milestone of the strongKernelTablesLabwave. ### Added ### Changed ### Still Missing ## [v0.4.0] - historical reconstruction (pre-Git official SemVer) Milestone where the project learns to say “yes” and “no” in text with real criteria. ### Added ### Changed proven reader;conservative writer;blocked; ### Still Missing ## [v0.3.0] - historical reconstruction (pre-Git official SemVer) Milestone where the editor stops being only a file browser and starts touching AI, runtime, and high-value gameplay surfaces. ### Added ### Changed ### Still Missing ## [v0.2.0] - historical reconstruction (pre-Git official SemVer) Milestone of the editor's structural expansion into large visible systems. ### Added ### Changed ### Still Missing ## [v0.1.0] - historical reconstruction (pre-Git official SemVer) Honest minimum milestone where a real editor already existed, far above a disposable prototype. ### Added ### Changed ### Still Missing ## [baseline-2026-05-31] - 2026-05-31 Honest initial import of production into Git. ### Added ### Preserved ### Validated ### Notes ## Workshop Mini-Version History Note: ## [pt2-v0.3.0-superseded.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt3-v0.8.0-freeze.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt4-v0.5.0-hold.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt5-v0.9.0-final.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt6-v0.7.0-beta.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt7-v0.9.0-final.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt8-v0.7.0-freeze.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch OutcomeShop Explorer;FfxLib/Shop;Assets/Shop;- guardrails documented in
docs/history/PT8_SHOP_GUARDRAILS.md. ### Final Status ## [pt9-v0.6.0-alpha.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt10-v0.2.0-final.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt11-v0.3.0-blocked.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt12-v0.3.0-package.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt13-v0.3.0-package.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt14-v0.2.0-architecture.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt15-v0.2.0-architecture.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt16-v0.2.0-architecture.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt17-v0.3.0-guardrail.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt18-v0.3.0-governance.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt19-v0.3.0-surface.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status ## [pt20-v0.2.0-strategy.1] - 2026-05-31 ### Mission ### Evolution ### Main Branch Outcome ### Final Status