The 13 ID_ChatOption_TextFilter_* labels (and their _Desc tooltips) live
in string table 0x2300000D, not the 0x23000003 options table the section
headers and slider labels use. Dat-verified: the targeted sweep missed
(0x23000001-0A), the control key resolved ('Auto Target' — machinery
fine), and the exhaustive all-tables sweep (ProbeFilterLabelHome, now a
permanent env-gated probe) hit exactly once: 0x2300000D -> 'Combat'. The
initializer decomp confirms the hash KEYS are the symbol names verbatim
(the vftable-member operands at 0x006f04cd are the known pooled-string
artifact); only the research doc's table attribution was inferred rather
than dat-verified — corrected in §8.
All 13 rows now render their captions instead of the honest-fallback
blanks the first connected gate saw. Full Release suite green (one
Core.Net loss-simulation timing flake on the first run, green targeted
and on rerun).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
The re-reviewer byte-decoded ALL six caption sites independently (no
transposition; a third evidence line from the fixture's authored
left/right label geometry), re-verified the audio chain through the one
place an inversion could still hide (the checkbox pass-throughs), and
hand-traced the 97-key conformance table (exactly 97, none invented or
dropped). Residuals applied here: SF-1 the AudioSettings doc comment's
wrong function attribution (the SetDefaultValue literals live in
gmConfigUI::InitOptions @0x0049E435/E457/E479, not InitUIPreferences);
SF-2 the gate script no longer asserts an unread DAT caption — it gates
on behaviour and asks the tester to report the authored English
verbatim; lane A's stale '24 option rows' corrected to 27 (the 39-item
pin is the authoritative tally). AudioSettings.cs change is
comment-only (no executable-code delta; suite state carries from
67b0815c, re-verified at the next code commit).
Campaign state: OP1-OP7 ALL CODE-COMPLETE; OP3/OP4/OP5/OP6 gates ready;
OP8 (Configure Keyboard) is the sole remaining implementation slice.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
R1: UiRoot now delivers WM_CAPTURECHANGED (0x215 — retail's own Win32
event-id space) to the element losing pointer capture on BOTH release
and re-target; UiScrollbar terminates a mid-drag gesture there,
completing it (one DragCompleted flush persisting the user's last-seen
value) and unlatching IsDragging — a panel-close keybind mid-drag or a
second-button re-target can no longer latch the drag flag forever and
silently suppress every later settings flush. Normal MouseUp paths
no-op (the latch is already clear when capture releases).
R2: the scalar latch arms BEFORE the track-click jump applies, so the
jump's own ScalarChanged tick defers its flush to the MouseUp's single
DragCompleted — one flush per press gesture, never the
inline-then-completed double; the DragCompleted doc now states the real
contract (fires once per value-capable gesture incl. capture loss)
instead of the refuted never-on-jump claim.
Tests: capture-loss mid-drag (ends + completes once + stray-MouseUp
no-double), no-drag capture-change no-op, bare-track-click
single-completion with the latch observed armed during the jump tick.
Also reconciles the research doc's U4 row to its closure (the six
caption pairs, the BN zero-fold post-mortem) per the OP6 rework's flag.
Full Release suite: 13,128 passed / 4 skipped / 0 failed (one
documented #250-class allocation flake on first run, green in
isolation and on full-suite rerun).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Final of four Opus research lanes for the retail Options panel campaign:
- One LayoutDesc 0x2100002B owns the tab control (0x10000208, Type 8),
the four mounted tab pages, and the seven option-row templates. Pages:
gmGameplayOptionsUI 0x2100002A/0x10000202 (default tab),
gmCharacterSettingsUI 0x21000028/0x100001F9 (InitOptions @0x004A02F0),
gmChatOptionsUI 0x2100005C/0x1000050A (@0x0049FC60),
gmConfigUI 0x21000029/0x100001FF (@0x0049E400). Tab declarations are a
data table (property 0x2E structs {0x30 button, 0x31 page, 0x32
default}); rows build via UIElement_ListBox::AddItemFromTemplateList
against authored template lists in ListBox property 0x64 (all three
template arrays decoded).
- Open path: input action 0x1000001A ToggleOptionsPanel, retail-default
F11 (VERIFIED in retail-default.keymap.txt:148); toolbar button
0x1000019B authors P0x12=0x1000001A (VERIFIED in the committed
toolbar fixture); host is gmFloatyPanelUI 0x2100006E slot 0x1000018D —
the same floating shell CH6 ports.
- Apply/Reset/Defaults are PER TAB, and clicking an LED APPLIES
IMMEDIATELY (SetCurrentValue -> Apply(1)); Apply commits the undo
baseline + CPlayerModule::SaveToServer (flushes 0x01A1 if dirty);
Reset reverts to baseline; Defaults applies live without committing.
Hiding a page auto-reverts uncommitted edits; showing auto-applies.
- Chat tab fully enumerated (2 linked opacity sliders + 5 per-window
filter blocks, 13 checkbox masks byte-decoded; main window omits the
Gameplay checkbox - 12 rows vs floaties' 13). Config tab = 6 sections
/ 27 rows, ALL UserPreferences.ini-backed, nothing on the wire.
- Two new widgets needed: Type 8 tab control, Type 5 template-list
ListBox (both also needed by Configure Keyboard). U1: the Character
tab's Defaults behavior is genuinely unestablished (never calls
SetDefaultValue). U3: the 50th row (PK deaths) is a later-build
addition (DAT string exists, hash-verified). U7: Urgent Assistance /
Report Abuse ShellExecute dead support URLs — register-row candidates.
Research phase complete: all four lanes landed and seam-verified.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>