fix #430 #440: character panel — tooltips can mount, and rows refresh on the authoritative record
Some checks failed
CI / linux-portable (push) Failing after 3m25s
CI / windows-gate (push) Successful in 6m12s
CI / release (push) Has been skipped

Two defects the owner found at the CA5 drive, one shared theme: the data
was right and the presentation seam was dead.

#430 (tooltips): the TS-85 Batch-B port set runtime TooltipText on the
runtime-built attribute/vital/skill rows but never gave them a popup
locator, and RetailTooltipPresenter.OnTooltipShow refuses any widget with
AuthoredTooltipRootElementId == 0 — the tooltip could never mount, on any
row, ever. (The register's 'live-verified on the Character tab' was the
OPTIONS panel's Character tab — authored elements with authored locators;
a different surface.) Rows now carry the shared popup skin
0x10000395/0x21000041 — live-DAT probed as the ONLY locator pair the
character layout references, and the same inference UiItemSlot already
ships for runtime-built widgets. TS-85's row carries the dated correction.

#440 (train row stuck): training a skill debited credits on screen but
left the row in the untrained section until the NEXT click — because the
sheet-changed subscription only refreshed the captured sheet, and row
STRUCTURE rebuilt exclusively in click handlers (the raise 'completed'
callback runs after SEND, before the server answers; the owner's second
click was simply the first rebuild after the record landed, and ACE's
rejection of that second train — 'Failed to train', no credit change —
matches the owner's report exactly). The same gap kept CA4's
awaiting-ghost from visually releasing. CharacterStatController.Bind now
returns the data-changed refresh and MountCharacter invokes it on every
authoritative sheet change, mirroring retail's quality-change broadcast
(InfoRegion::OnQualityChanged @ 0x004F0EB0).

Pinned by DataChangedRefresh_MovesATrainedSkillToItsSection_WithoutAClick
and Rows_CarryTheSharedTooltipPopupLocatorAndDescriptionText. Owner
visual re-check owed next session (hover-dwell a row; train a skill and
watch it move immediately). Full hermetic suite 15,329 passed / 0 failed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Erik 2026-08-24 16:51:58 +02:00
parent bd943849b1
commit bce17b3cfb
5 changed files with 177 additions and 7 deletions

View file

@ -24,6 +24,34 @@ What does NOT go here:
- Every session: scan OPEN issues at start; promote/close anything we touched during the session before ending.
- Promoting to a Phase: mark as `DONE (promoted to Phase X)` + commit SHA where the Phase entry landed.
## #440 — CLOSED: Trained skill did not move to its section (and raise buttons never visually un-ghosted) until the next click
**Status:** CLOSED 2026-08-24, found by the owner during the CA5 drive.
**Component:** character panel / row refresh
**Symptom (owner):** training an untrained skill consumed credits (visible
immediately) and the confirmation text appeared, but the skill stayed in
the untrained section; clicking Train AGAIN (which the server rejects —
"Failed to train", no credit change) made it move.
**Root cause:** the panel's sheet-changed subscription only refreshed the
captured `currentSheet` — per-frame text pulls (credits, values) updated,
but the ROW STRUCTURE (section buckets, selection, raise-button states)
rebuilt only on clicks (`RefreshAfterRaise` ran as the raise's `completed`
callback — synchronously after SEND, before the server's answer). The
second click was simply the first row rebuild after the record landed.
The same gap kept CA4's awaiting-ghost from visually releasing.
**Fix:** `CharacterStatController.Bind` now returns the data-changed
refresh (`RefreshAfterRaise(null)` — rebuild + reselect + re-evaluate
buttons), and `RetailUiRuntime.MountCharacter`'s subscription invokes it on
every authoritative sheet change — mirroring retail's quality-change
broadcast (`InfoRegion::OnQualityChanged @ 0x004F0EB0`
`ListenToElementMessage @ 0x004EFBE0`). Pinned by
`DataChangedRefresh_MovesATrainedSkillToItsSection_WithoutAClick`.
---
## #439 — Flake candidate: LossySession_FivePercentSeeded_ZeroMessageLoss_Headroom256 fails under full parallel suite load
**Status:** OPEN (observation filed; do NOT chase individually per docs/release-gate.md)
@ -419,9 +447,21 @@ immediately (F2 overlay shows guids).
---
## #430 — No tooltips on skills and attributes in the character panel
## #430 CLOSED: No tooltips on skills and attributes in the character panel
**Status:** OPEN
**Status:** CLOSED 2026-08-24 (found during the CA5 gate follow-up).
Root cause: the TS-85 Batch-B port set runtime `TooltipText` on the
runtime-built rows but never gave them a popup locator, and
`RetailTooltipPresenter.OnTooltipShow` refuses any widget with
`AuthoredTooltipRootElementId == 0` — the tooltip could NEVER mount.
(TS-85's "live-verified on the Character tab" was the OPTIONS panel's
Character tab — authored elements with authored locators.) Fix: rows now
carry the shared popup skin `0x10000395`/`0x21000041` — live-DAT probed as
the ONLY locator pair layout `0x2100002E` references, and the same
inference `UiItemSlot` already ships for runtime-built widgets. Pinned by
`Rows_CarryTheSharedTooltipPopupLocatorAndDescriptionText`. Owner visual
re-check owed at the next session (hover a row, hold the mouse still for
the 0.25 s dwell).
**Severity:** LOW (information affordance missing)
**Filed:** 2026-08-23 (owner report)
**Component:** retail UI / character panel