Files
aetherbound-guild/docs/runtime/M58_MARKET_READ_SURFACE_DEFECTS.md
T

5.0 KiB

M58 Market Read-Surface Defect Inventory

Step M58-A record. Source: tools/m52_market_visual_probe.gd captures (static-only, dynamic-only on a neutral field, final composite) at 760x360, 844x390 and 1280x720 in zh_CN and en. Retained source-bound attempt:

ABG_TEST_ATTEMPT_PASS label=m58-market-probe
artifact=/private/tmp/aetherbound-guild-test-evidence/m58-market-probe/20260913T083440Z-44499

1. Fixture honesty (fixed in this step)

The fixture hardcoded "profession_id": "PF-B01" and "trait_id": "TR-001" for every offer and one price for all three, so the board rendered three copies of one recruit and could not validate the board or the ledger portrait binding. The three offers now carry real base professions and per-offer prices, with the catalogue role names in both locales:

Offer profession_id profession (zh / en) price
R-001 PF-B01 盾卫 / Hearthguard 14
R-002 PF-B05 弓手 / Farstring 18
R-003 PF-B07 治疗 / Kindhand 22

The three cards now render three different portraits and the ledger portrait follows the selected offer.

2. Root cause: fixed-pixel chrome against proportional text slots

market_chrome.gd draws its card, ledger and title surfaces in fixed pixels (_draw_card uses Rect2(5, 13, size.x - 10, size.y - 18), a ribbon band at rect.y + 8 .. rect.y + 26, a price strip 25 px from the bottom and 16 px tall) while m52_market_slots.gd places the labels as proportional fractions of the same control (card.profession = (0.12, 0.055, 0.76, 0.10), card.price = (0.14, 0.88, 0.72, 0.08)). Both cannot be right at every fixture, and the measured capture confirms the drift.

Measured on the 1280x720 zh_CN final composite, card region x 90..275:

Row band Content
y 227..243 accent ribbon band (172-176 blue pixels per row)
y 241..243 only rows where the white profession glyphs touch the band
y 244+ parchment face; the rest of the glyph falls on it

So the profession label is vertically centred on the ribbon band's lower edge: its top three rows read as white-on-blue, the remainder is white-on-parchment and effectively disappears. The market page places its content on the fixed 1280x720 design canvas, so this mismatch is constant rather than fixture-dependent: the label always straddles the band edge. The price strip had the same defect (the cost label crossed the strip's top edge) and the coin icon was anchored to a fraction that drifted over the leading characters of 可招募 (M58-I06).

3. Measured contrast (1280x720 zh_CN final composite)

WCAG contrast of the label against its own surface, sampled from the capture:

Label Measured Verdict
Ledger profession line (盾卫) 3.39:1 below the 4.5:1 small-text floor
Ledger cost amount (可招募 14 金币) n/a label overflowed a strip only ~10 px tall while its glyphs are ~11 px, so it had no single owner surface
Card profession ribbon (盾卫) n/a label straddled the accent band and the parchment face, so it had no single pair
Card trait chip 12.78:1 passes
Card cost amount 11.57:1 passes
Card name plate 10.11:1 passes
Ledger detail line 4.89:1 passes, weakest passing label

M58-I02 is the carried-over M57-I05 defect: the ledger's profession line and cost amount are below the readable floor.

4. Trait chip ownership

The trait chip ribbon carries ornaments at both ends that consume the strip the label needs; the label only survives because the fixture text is short (M58-I05).

5. Type floor

The market module labels were authored at the raw token sizes (micro 11 px, label 14 px) while the view-level labels use _market_text_size, which doubles the token on the fixed canvas. On a 760-wide window that left the module labels at roughly 6.5 physical pixels. M58-B gives every Market module the same canvas scale as the view, so micro renders at 22 canvas pixels there too.

6. Remaining flat/vector chrome on text-bearing surfaces

  • Footer navigation (返回公会, 返回委托) draws vector chevrons over the plate and leaves the label on a flat plate.
  • The header settings control is a flat dark square with a vector gear, while Readiness now uses the hand-drawn plate family.
  • The 可用招募 board band, the card shells and the ledger shell still use page-local flat chrome rather than the shared hand-drawn material (M58-I04).

M59 机器检查发现的残留缺陷(2026-09-13,已修)

M59_PROBE_INK_CHECKS 的 ui_ink_check.gd 在普通与最长文案 fixture 上 一次命中 6 处 M58 类别残留缺陷,全部在本里程碑内修复;逐条实测与修复见 docs/plans/M59_PROBE_INK_CHECKS.md。其中最深的约束是"标签矩形 ≠ 材质 可见内框":名牌端帽与缎带端帽会盖住首尾字,而仅比较"文字 ≤ 标签矩形" 的检查无法发现。修复后 ABG_M59_INK_CHECK_OK scanned=12 violations=0。