Update 2.77
6/10/2026
SIN Chain Builder Gate 3: AiScriptLab validation bridge for the `SinApplyPlan` (read-only) — validates plans, does NOT apply; SIN stays BLOCKED for writing.
Read notes
Maechen connected to Spira
Beta Update
Current notesEarlier beta notes, preserved as originally published.
This is the archive of earlier beta notes. New notes are on the main updates page.
6/10/2026
SIN Chain Builder Gate 3: AiScriptLab validation bridge for the `SinApplyPlan` (read-only) — validates plans, does NOT apply; SIN stays BLOCKED for writing.
Read notes
6/10/2026
SIN Chain Builder Gate 2: dry-run / preview planner (`SinApplyPlan`) — preview-only, SIN stays BLOCKED for writing.
Read notes
6/10/2026
Blitzball Prize Table becomes a TREE: League/Tournament → 1st/2nd/3rd/Top Scorer → draw → prizes (+ RE-proven draw detection).
Read notes
6/10/2026
Navigation consolidated: 4 new aggregator hubs (Battle Commands, Items, Sphere Grid, Text/Reference) + a reusable `SubTabHub` component + a leaner sidebar. Second IA pass by lane Jarvis-RIN (Halyson's pile of notes). New generic component `SubTabHub_Control` (`Modules/SubTabHub`): an FFX-styled sub-tab strip (reuses Blitzball's `tabPill`/mode-pill), built in code via `AddTab(label, factory, mode, pill, requiresProject)`, lazy-loaded (each sub-tab builds its control on first selection and caches it) with a `requiresProject` guard (a project-gated tab shows a placeholder instead of crashing). On top of it, 4 hubs (each HOSTS the existing controls, untouched): (1) Battle Commands → `Comandos/Magias de Personagem` (command.bin) · `Monster Commands 1` (monmagic1) · `Monster Commands 2` (monmagic2); (2) Items → `Items` (item.bin) · `Key Items` (important.bin, guarded) · `Shop` (guarded slot payload) — Shop and Key Items moved here from loose screens; (3) Sphere Grid → `Explorer (DB)` · `Builder` · `Canvas` (3→1; Explorer needs a project, Builder/Canvas open without one); (4) Text / Reference → `String Explorer` · `Macro Explorer` · `Weapon Names` · `Battle Text` · `Event Explorer` (5→1). Each sub-tab carries an honest mode pill (writer amber / read-only teal) with the real file/scope. Sidebar: Core Authoring dropped from 23 → 15 buttons; Auto-Abilities now sits right next to Customizations / Aeons; Monster AI Explorer removed from the menu (handler/code preserved — only the nav option is gone). Scope (RIN): navigation/hosting only — the 4 new `Main_Window` handlers build a `SubTabHub` via factories (`CreateKernelCommandsControl(...)` for the kernel tables; `new XxxControl()` for the rest) and the old handlers stay in code (`ShowKernelCommands`/`CreateKernelCommandsControl` intact = back/forward and nav-restore keep working). Does not touch writer/parser/runtime/save/SIN/provider or the INTERNALS of any other lane's module (MAGIC/Sphere); it only edits the `Main_Window` nav lines (shared file) + adds `Modules/SubTabHub`. The Battle Commands extras (universal search, per-tab search, multi-edit) are deferred to a follow-up (they touch the command-editor logic = MAGIC lane). MINOR (4 NEW navigation modules/tabs + a new reusable component). Build compiles 0 errors / 361 warnings; editor relaunched at v2.74.0.0.
Read notes
6/10/2026
Blitzball Hub: the 5 scattered screens become 1 "Blitzball" tab with sub-tabs + an honest mode pill + a visual polish of all 5 windows. Navigation + UX consolidation (lane Jarvis-RIN). The sidebar had 5 loose buttons (`Blitzball Prizes`/`Roster`/`Recruits`/`Prizes (Edit)`/`Prize Table`) with clashing names (3 said "prize"); it is now 1 button `Blitzball 🏐` opening the new module `BlitzballHub_Control` (`Modules/BlitzballHub`) with 5 sub-tabs in an FFX-styled strip (`tabPill` pills, active tab with a teal underline): Roster · Recruits · Prize Pool · Prize Table · Atlas. Each sub-tab shows an honest mode pill right below the strip — `WRITER LAB · <file> · RT0 proven · RT2 pending` (amber) for the 4 writers, `READ-ONLY · Spira Data Atlas` (teal) for Atlas — because the hub's outer "Mode" badge is now neutral (`Atlas + Writer Lab`) and can no longer assert a single mode. Tabs are lazy-loaded (each UserControl is built only on first selection and cached) → the hub never holds 4 `ByteSnapshotEditorSession`s at once. Visual polish of all 5 windows (presentation only — no writer/parser/binding/DataModel touched): smaller hero via the new `heroGradient` class (dedupes the 3 copy-pasted literal gradients), `Save` now uses `primaryAction` (teal) on the 4 writers (it was the LEAST-styled button of each screen before), Roster's 8 `cardSoft` boxes collapse into one table (aligned header, right-aligned a/b/c/type), Prize Table is grouped into a category accordion (5 collapsible groups — League/Tournament Standings, League/Tournament Top Scorer, Roll Threshold/odds — closed by default, each with a family-color dot + site count; the text filter auto-expands matching groups) to tame the ~849 options, plus a per-row per-family color stripe (teal=prize-index, amber=odds) + condensed text + normalized padding, Prize Pool groups Quantity/Raw Type into `cardSoft` with a tighter Quantity column, Recruits demotes the `@0x` offset to a subtitle and makes the player combo the primary element, Atlas gets a colored evidence pill in the grid (proved-candidate=teal / partial=amber / metadata-only=blue / blocked=danger) and literal colors (`#9AD7E2`/`#9EB0C2`) swapped for tokens. New additive classes in `StudioTheme.axaml` (`tabPill`/`tabPillActive`, `heroGradient`, `pillWriter`/`pillReadonly`, `numField`) — selectors that did not exist → zero regression on other screens (I did NOT touch the global `TabControl` theme, precisely to avoid affecting the 8 screens that use bare tabs). 2 new presentation-only converters (`PrizeFamilyBrushConverter`, `EvidenceStatusBrushConverter`). MINOR (NEW navigation module/IA + the first reusable sub-tab strip; the polish alone would be PATCH but it rides along with the new module). Does not touch writer/parser/runtime/save/SIN/Atlas provider/other lanes; the 5 `_Control.axaml.cs` and DataModels stayed intact. Build compiles 0 errors / 361 warnings (the final `.exe` failed to copy only because the editor was open — unrelated to the code).
Read notes
6/10/2026
Blitzball Prize Table: now also edits the ODDS (390 roll thresholds) — "edit everything". Extends the `Blitzball Prize Table 🏐` tab (`v2.71.0`): on top of the 459 prize-index sites, it now edits the 390 threshold immediates that set the PROBABILITIES — the `case >= N` / `case <= M` bounds over `GetRandomInRange(100)` (bytecode `29 AE <thr> 0E/0F D7/D6` = `DUP·PUSHII·GE/LE·jump`). A bucket caught by `roll >= lo` and `roll <= hi` has ~`(hi-lo+1)%` odds; widen the bucket = better odds for that prize. New `BlitzballPrizeStructure_File.FindRollThresholds`/`SetThresholdAt` (scan scoped to ≤768B of a prize-index site so it never touches an unrelated switch) — using the SAME 2-byte writer (`Event_File.PatchScriptUInt16`). Unified UI: the filter gains "Roll Threshold (odds)", each row inline-editable (prize rows show the live resolved reward; threshold rows show the bucket bound). The `--blitzball-prizestruct-rt0` gate is extended and PASSES on the real `bltz0200.ebp`: 459 prize + 390 thresholds (195 `<=` / 195 `>=` = a perfect pairing), no-edit byte-identical, a prize-index AND a threshold edit both isolated to their 2 bytes (`<=10 → <=50` @0xC108), re-read confirms both. MINOR (NEW capability: odds editing). Does not touch save/runtime/SIN/other lanes. Build 0 errors / 361 warnings; `--blitzball-prizestruct-rt0` PASS. Doc: `docs/reverse/FFX_BLITZBALL_PRIZE_STRUCTURE_RE_2026-06-10.md`.
Read notes
6/10/2026
Blitzball Prize Table: EDIT which prize each placement/random bucket awards (459 immediates in `bltz0200.ebp`) — disproves the "blocked" label. The read-only explorer (`v2.62.0`) marked `BlitzballLeague/TournamentPrizeIndex`/`TopScorer` as `blocked` (runtime/save) — too conservative: it only saw the read/display side in `bltz0201` (`PrizeIndex + 220 → Treasure Label`). The assignment lives in `bltz0200.ebp` as 459 constant immediates in the ATEL script: `Set BlitzballPrizeIndex[slot] = <prize-index>` inside a switch over `GetRandomInRange(100)` (the random reward distribution). Game-file editable, just like recruitment (only the immediate is 2 bytes, since it exceeds 255). New module/tab `Blitzball Prize Table 🏐` (`Modules/BlitzballPrizeStructEditor`): a filterable list (by variable/reward/index) of all 459 sites with inline prize-index editing + the live resolved reward (takara `prize+220`, or MacroDict#8 for >100). New primitives `Event_File.PatchScriptUInt16`/`ReadScriptUInt16` (length-preserving 2-byte immediate patch via `ScriptChunkOverride`) + `FfxLib/Blitzball/BlitzballPrizeStructure_File.cs` (scan/`SetPrizeIndexAt`) + gate `Tools/BlitzballPrizeStructRt0.cs` (`--blitzball-prizestruct-rt0`). PROVEN on the real `bltz0200.ebp` (222,464 B): 459 sites (141 League + 188 Tournament + 65 League-TS + 65 Tournament-TS = matches the corpus count), no-edit byte-identical, a single prize-index edit isolated to its 2 bytes (League 1st `0x0001→0x0099` @0xC0A2), re-read confirms. RE finding: ATEL var ids are per-file (`0x28` in bltz0201 vs `0x30` in bltz0200); the bltz0200 ids (`0x30`/`0x31`/`0x32`/`0x33`) are proved from the file's own switch/Set sites. Honesty: edits WHICH prize index each placement awards (game-file, RT0 isolation proven, RT2 pending); the reward each index GIVES = takara (the `Blitzball Prizes (Edit)` tab); the odds (roll thresholds) are a separate immediate set, not exposed yet. MINOR (NEW module + new 2-byte writer). Does not touch save/runtime/SIN/other lanes. Build 0 errors / 361 warnings; `--blitzball-prizestruct-rt0` PASS. Doc: `docs/reverse/FFX_BLITZBALL_PRIZE_STRUCTURE_RE_2026-06-10.md`.
Read notes
6/10/2026
Blitzball Prizes Editor: UI to edit the 101 blitzball prizes in the GAME FILE (takara.bin 220..320). New module/tab `Blitzball Prizes (Edit) 🏐` (`Modules/BlitzballPrizesEditor`) that edits the blitzball prize POOL (prize 0..100 → takara row 220+k → reward; the proved-candidate rule closed in `v2.62.0`): a master-detail over the 101 prizes, each with an item dropdown (filter by name/id) + quantity + Raw Type/Kind/resolved reward. It REUSES the proven `TreasureEditor_DataModel` internally (item dictionary, name resolution, `ByteSnapshotEditorSession`, full-table writer) filtered to rows 220..320 → the save is the SAME writer as the Treasures tab, writing `takara.bin` and preserving all 498 entries byte-for-byte except the edited prize. Registered in `Main_Window` (nav + `SetModule`). Honesty: "Writable (Lab)" badge — edits the POOL (which reward each prize index gives), not WHICH prize you win per league/tournament/event (= runtime/save); for gear/key-item prizes or finer Kind control, use the Treasures tab. Complements the read-only `Blitzball Prizes 🏐` explorer (`v2.62.0`) with real editing. MINOR (NEW module/tab). Reuses `TreasureEditor_DataModel`/`Treasure_File`/`Item_Dictionary`; does not add a new writer or touch the player save/runtime/SIN/other lanes. Build 0 errors / 361 warnings.
Read notes