74482252d1
Each achievement row now carries a Tooltip whose text is derived from the row's unlock state and the AchievementDef's reward, surfacing information the row layout doesn't already show. Four-state policy: - Unlocked + reward → "Reward: <reward>." (e.g. "Reward: Card Back #1.") - Unlocked + no reward → "Earned!" - Locked, non-secret → "How to unlock: <description>." plus " Reward: <reward>." when one exists - Locked, secret → no tooltip; the existing row-spawn skip preserves the achievement's discovery surprise The row spawn loop tags each row with a new AchievementRow marker so tests can locate them; the helper tooltip_for_row keeps the policy in one place. Six tests pin the policy: one full-flow test for unlocked + reward mention, one secret-row negative test that asserts no tooltip contains the verbatim secret condition or the secret reward, plus four direct unit tests on tooltip_for_row covering all four states. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>