Grok's review of the branch (low): ModuleInfo read talentChanges from the data's module record — the full-potential one — so at 潜能1 余's 闲云隐市 still read 「生命上限2%(+0.5%)」 while 局内数值 and the battle use 1.5 % (异客 +10 %(+2 %) vs +8 %). ModuleInfo takes `potential` and composes the elite at it first (shared/potential.js atPotential; the module's traitOverride does not depend on potential); the detail passes the operator's setting. - Test: test/ui/loadout-rows.test.js — 余's module card at none / 潜能6 / 潜能1, 不装备's base 特性, the detail's prop.