JARVIS-UI
Update 2.159
6/20/2026
v2.159.0.0MINORJarvis-UI
Save Editor Character tab: FFXED parity (abilities, party, OD modes, overdrives)
- The Character tab is no longer stats + batch buttons only: new
SaveEditor_CharacterBindings+FfxSaveCharacterFieldCatalogmirror the FFXED v0.749 panel — Activation/Overdrive Mode combos, party (7 slots @15768), ~95 abilities (bitfield @22090), 20 overdrive modes with counters, overdrives and special abilities, sphere level / OD gauge with max fields (22088/22086).FfxSaveCore.ReadSaveBit/WriteSaveBitfixes bits >7 (FFXED semanticsoffset + bit/8). UI reorganized into a 3-column layout like FFXED. Release build 0 errors
v2.158.2.0
v2.159.1.0PATCHJarvis-UI
Runtime DLL Manager: ModuleMasterDetail_Shell pilot + heroGradient + responsive + offline/detached banners + empty state + a11y
- Continues the module-by-module UI audit on the Runtime DLL Manager (
Modules/RuntimeDllManager/), perPROMPT_UI_RUNTIMEDLL_2026-06-20.md. (P0) Inline hero gradient →Classes="heroGradient"; chrome hex#20303Bremoved from.axaml(usesRailHoverBrush/PanelStrokeBrush). (P1) First repo consumer ofModuleMasterDetail_Shell: master = 3 status cards (Game root / FFX open / Hooks); detail = hero + DLL list. (P1)rsp:Responsive.Breakpoints+UserControl.narrowstyle collapses the master. (P2)WarningBrush/DangerBrushbanners whenIsGameClosed(game closed — toggles only arm disk) andIsRuntimeDetached(FFX open with no probe/hook — live status unreliable).Border#EmptyStatewhen!GameRootReady. (P3)AutomationProperties.Nameon status checkboxes and action buttons;ToggleA11yNameper item. Scope respected: deploy/toggle/DLL/hook/probe logic untouched — visual container only
v2.159.0.0
v2.159.2.0PATCHJarvis-UI
Blitzball Hub: migrate the duplicated shell to the reusable `SubTabHub`
BlitzballHub_Control(Modules/BlitzballHub/) was a near-exact duplicate of whatSubTabHub_Controlalready provides — thetabPillsub-tab strip,tabPillActive, per-tab lazy load + cache, the Writer/Read-only mode pill, and thePlayAlternative()click audio.MenuItem_Blitzballnow builds aSubTabHub_Controlwith a fluentAddTabfor the 5 tabs (4 Writer + 1 Prize Atlas Read-only), with identical pill texts andrequiresProject: falseon all of them (the four writers keep their own "project not loaded" empty states; Atlas opens without a project).BlitzballHub_Control(.axaml+.axaml.cs) is deleted —grepno longer findsnew BlitzballHub_Control()in production. Scope respected:FfxLib/Blitzball/*, RT0/RT2,ByteSnapshotEditorSession, and the internal content of the five sub-editors are all untouched — only the visual container changed. Becomes the template for a futureSaveEditorHubmigration (7 hardcoded tabs). Release build 0 errors (401 preexisting warnings)
v2.159.1.0
v2.159.3.0PATCHJarvis-UI
Save Editor Hub Phase 2: dirty chip + payload SHA256 + session discard guard
- Continues the module-by-module UI audit on the Save Editor Hub (
Modules/SaveEditor/), perdocs/ai/PROMPT_UI_SAVEEDITOR_HUB_PHASE2_2026-06-20.md. (P0) Unsaved changes chip in the header card using existingautosaveChip/autosaveOrb/autosaveLabelclasses fromStudioTheme, bound toIsDirty— appears when the user edits Character/Gil/Equipment/etc. and disappears after Save/Save As (DataModel already resetsIsDirty). (P1) Payload SHA256 short (first 12 chars + "…") viaFfxSaveHash.Sha256Hex(session.Core.Data)in the header, with tooltip showing full 64-char hash; recalculated on Load/Save/MC switch — not recalculated onTouchDirty(hash = fingerprint of in-memory blob; dirty ≠ hash change until Apply+mutate). NewPayloadHashShort/PayloadHashFullproperties andRefreshPayloadHash()method in the DataModel. (P2) Confirmation before replacing session: newAvaloniaDialog_Util.ConfirmYesNoAsynchelper (Yes/No modal, no new asset) is called before Load (toolbar + empty state CTA) and before MC slot switch whenIsDirty; the MC slot combo no longer uses direct TwoWay binding and instead routes throughSelectionChangedwith a confirmation guard + manual combo↔DataModel sync. Scope respected: FFXED sub-tabs, offsets,FfxSaveFilewriters, batch tags, and CLI--ffx-save-rt2are all untouched — only the hub shell and DataModel gained new properties. Release build 0 errors
v2.159.2.0
v2.159.4.0PATCHJarvis-UI
Magic DLL Browser: 9 hex → tokens + ModuleMasterDetail_Shell (2nd consumer) + empty states + responsive + a11y
- Continues the module-by-module UI audit on the Magic DLL Browser (
Modules/Extras/), perdocs/ai/PROMPT_UI_MAGICDLLBROWSER_2026-06-20.md. (P0) The 11 chrome#RRGGBBvalues (Wave4 editing guidance#E8A040, Value Workbench family warning#E8A040, and the 3 inline RT2 badges — dead#3B1A1A/#E85050/#F0A0A0, proved#3B2719/#E8A040/#F0C070, risk#2A2A1A/#C0A040/#E8D080) are promoted to existingStudioThemetokens/classes:WarningBrushon the guidance/family-warning text; rt2-dead badge →Classes="pillDanger"; rt2-timing PROVED badge →Classes="pillWriter"; rt2-timing RISK badge →PanelAltBrushbackground +WarningBrush(border/foreground). (P1) 2nd repo consumer ofModuleMasterDetail_Shell(1st = RuntimeDllManager): the hand-rolledColumnDefinitions="330,*"body becomes the shell withMasterHeaderLabel="Magic DLLs"— master = Source Root summary + Search +magic_*.dllListBox; detail = action hero + Wave4 Attribution + Direct Patch Builder + dense TabControl (Sections/Exports/Imports/Sound (SeSep)/Overlay Slots/Role Candidates/Family Comparator/Logical Decompile/Strings/Warnings). Master ~260pxMinWidthcomes from the shell. (P2)Border#EmptyStatein the detail when!HasSelectedDll("No DLL selected" title + subtitle pointing to the list /magicFiles\FFXroot); master empty state when!HasDllList(new computed flagDlls.Count > 0, notified inApplyFilterto cover both Refresh and Search);rsp:Responsive.Breakpointson the root +UserControl.narrowstyle collapses the master below 760px (the action WrapPanel keeps critical buttons like Extract/Repack reachable). (P3)AutomationProperties.Nameon the ~16 detail action buttons (Open DLL/Extract/Logical Decompile/Repack/Patch Plan/C/ASM Project/Semantic RE Report/Magic Viewer/Phyre Package I/O/Clone/Apply Byte Patch/Apply ASCII Patch/Stage+Apply value patch/Stage+Apply host-offset patch/Deploy ps3data clone/Open PS3 Magic & folders). Header card kept as a plaincard(decision:heroGradienton a secondary context header would be heavy — the real hero lives in the inspection panel once a DLL is selected). Scope respected: PE overlay, Direct Patch Builder, Value Workbench, logical decompile,MagicDllBrowser_DataModeldecompile/repack/patch logic, and theOpenPs3MagicRequested/OpenMagicViewerRequestedevents +Main_Windowwiring are all untouched — only the visual container changed (1 UI-onlyHasDllListproperty added). Release build 0 errors (401 preexisting warnings); zero literal#RRGGBBin the module's.axaml
v2.159.3.0
v2.159.5.0PATCHJarvis-UI
UI Optionals Master: 28 backlog optional IDs closed in a single PATCH (Jarvis-UI)
- Full execution of
docs/ai/PROMPT_UI_OPTIONALS_MASTER_2026-06-20.mdsec. 5 — all 28 pending IDs implemented (OPT-F2 was already done inv2.159.4.0, not redone). Scope: container-only UI polish (tokens, responsive, a11y, empty states, pills, emojis) — writers/save bytes/hooks/FfxLib/RT0/RT2 untouched. Sprint B (reusable SubTabHub): OPT-B1/B2 —AutomationProperties.Nameon everytabPillbutton generated byAddTab(), with an optionaltabA11yName(default derives from the label: "Tab X"); OPT-B3 — a staticBlitzballSubTabHubFactory.Create()extracts the 5-tab construction out ofMenuItem_Blitzball(≤5 lines); OPT-B4 — therequiresProjectplaceholder copy is now per-hub configurable (RequiresProjectMessage), default legacy PT preserved. Sprint F (Magic DLL Browser residual): OPT-F1 — header cardheroGradient; OPT-F3 — action buttons in 2 fixed rows (Open/View | Author/Patch; was a single WrapPanel); OPT-F4 —IsMasterExpandedpersisted in the DataModel (TwoWay on the shell); OPT-F5 — detail heroheroGradient; OPT-F6 — master empty!HasDllListasBorder#EmptyState(icon + copy, parity with the detail empty); OPT-F7 —StatusSeverity(None/Info/Warning/Danger) derived fromStatusText+ a newStatusSeverityBrushConverterpaints errors/warnings inDangerBrush/WarningBrush; OPT-F8 —AutomationProperties.Nameon the Search TextBox; OPT-F9 —WRITER LAB · native magicFiles DLL · RT2 pendingpill in the header. Sprint A + C (Save Editor): OPT-A1 — responsive (header becomes a vertical StackPanel, actions stack when narrow); OPT-A2 — headerheroGradient; OPT-A3 —READ-ONLY · FFXED port · RT2 via CLIpill in the header; OPT-A4 — copy-on-click of the full SHA256 hash (clipboard viaTopLevel.Clipboard, newIconCopy); OPT-C1 —StatusSeverityonStatusSummary(reuses the converter); OPT-C2–C5 — master lists of the Character/Equipment/Items/Blitzball sub-tabs wrapped in a collapsibleExpander(ExpandDirection="Left", expanded by default). Sprint A5/A6/D (Sphere Grid + Blitzball): OPT-A5 —🏐emoji removed from the BlitzballSetModuletitle and the RostersectionLabel; OPT-A6 —♻️ Restaurar→ "Restore original", the link✕→ "Remove" + a11y; OPT-D1 — v1 form responsive (3-column Grids →WrapPanelthat stacks when narrow); OPT-D2 —ActiveToolModeenum in the DataModel + atoolActivevisual class on the active mode button (mirrored viaPropertyChangedin code-behind); OPT-D3 —AutomationProperties.Nameon the Load/Save/Validate CTAs. Sprint E (RuntimeDll residual): OPT-E2 — Refresh button in theIsGameClosedbanner; OPT-E3 — C# toggle-pill hex (ToggleBrush/ToggleBorderBrush/ToggleForeground/ToggleGlow/RuntimeBrush) promoted toRuntimeToggle*/RuntimeRuntime*tokens inStudioTokens(resolved viaResources.TryGetValue, no hex left in the module); OPT-E1 — skipped (the DLL toggle is synchronous viaFile.Move/File.Copy; there is no perceptible >300ms async operation — documented in sec. 7). Release build 0 errors (401 preexisting warnings, none in the touched files); zero new literal#RRGGBBin the touched.axaml
v2.159.4.0
v2.159.6.0PATCHJarvis-UI
Frontend P0/P1 visual polish: heroGradient sweep + MonsterAi hex tokens + narrow drawer + P1-7 design tokens (Jarvis-UI)
- Execution of the P0/P1 backlog from
docs/ai/FRONTEND_AUDIT_P0_P1_2026-06-19.mdper the approved plan. Scope: UI / design-system polish — writers/save bytes/hooks/FfxLib/RT0/RT2 untouched;MonsterAiEditor2_*(discontinued) untouched. P0-1 (heroGradient sweep): 26 inline gradients across 25Modules/files migrated — 18 canonical (#163245/#0F1821/#214F69) →Classes="heroGradient"; 8 identity variants preserved as new named tokens (heroPurple/heroGreen/heroBrown/heroTeal/heroBlueinStudioTheme.axaml+HeroXxxA/B/CColorinStudioTokens.axaml) — Aurora keeps purple, AutoAbility/Formation/Customization keep green, KeyItem brown, AlBhed/CtbBase/PlayerGrowth teal, MixTable blue.Main_Window.axamlheader (its ownPanelDeepColorpalette) intentionally preserved. P0-2 (MonsterAi hex → tokens): all 4 active MonsterAiEditor cluster files migrated — 261 literal hex values (Background/BorderBrush/Foreground) collapsed to{DynamicResource ...}by family (Shell/Protect/Regen/Gold/Forbidden/Cycle + Panel/Stroke), normalizing intra-family drift (~20 teal fills → oneAccentShellFillBrush). Added 14 newAccentXxxForegroundBrushtokens (only Gold had one before) plus aBorder.accentXxxfamily (15 styles +> TextBlockselectors) inStudioTheme, parallel to existingButton.accentXxx.MonsterAiEditor2_Control.axamlkeeps its 71 hex (discontinued). P0-4 (narrow drawer): fixed the bug where inWindow.narrowthe "≡" button andCtrl+Bappeared dead (Window.narrow Border#IconRailCol → IsVisible=Falsewon over the toggle) — new floating<Popup Name="RailDrawer">inMain_Window.axamlwith the 6 nav groups as vertical text buttons (more scannable than 22px icons on small screens),IsLightDismissEnabled=True;ToggleIconRail()now branches narrow→Popup / wide→Border, reusing the sameMenuItem_*handlers. P1-7 (structural design tokens): new families inStudioTokens.axaml— Spacing (SpacingXs/Sm/Md/Lg/XlThickness +StackGapSm/Md/Lgdoubles), Radius (RadiusSm=8/Md=10/Lg=12/Pill=999), Motion (DurationFast/Normal/Slow), Elevation (Border.elevation1/2/3BoxShadow). Pilot adoption:StudioTheme.axamlconsumes radius/motion onBorder.card/cardSoft/Button.primaryAction/secondaryAction/railIcon/tabPill;MonsterAiEditor_Control.axamldemosSpacingLg/Mdon 4 pilot cards. Audit divergences noted: P0-3 (Ctrl+B) was already implemented (no longer a "lying comment"); P1-8 (shell) already had 2 consumers; P1-5/P1-6 (nav architecture) out of scope due to high merge risk. Release build 0 errors (401 preexisting warnings). Sweep scripts:work/_hero_gradient_sweep_20260620.ps1,work/_monster_ai_hex_sweep_20260620.ps1
v2.159.5.0
v2.159.6.1PATCHJarvis-UI
Boot fix: P1-7 radius/motion tokens resolve at runtime (Jarvis-UI)
- Hotfix for
v2.159.6.0:StudioTheme.axamlreferenced new P1-7 tokens (RadiusLg/Md/Sm,DurationNormal/Fast) via{StaticResource ...}while those keys live inApplication.Resources(StudioTokens.axaml) after the themeStyleInclude— Avalonia threwKeyNotFoundException: Static resource 'RadiusLg' not foundon startup and the app never showed a window. Fix: promote those references to{DynamicResource ...}. Also fixesModuleMasterDetail_Shell.axamlbindings forMasterHeader/MasterList/Detail/MasterHeaderLabel/IsMasterExpandedto useRelativeSource AncestorType=ModuleMasterDetail_Shell(they were binding the module DataModel, leaving Magic DLL Browser and Runtime DLL Manager master/detail empty). Writers/save/hooks untouched. Release build 0 errors
v2.159.6.0