The user's question broke my first story: "did lynx host tho?" He did (Oracle
joined LYNX's lobby that night) -- but more importantly the affected players'
logs read mode=steam, which gets the FULL menu, so the FeJoinOnly fix in
3109cfc patched a real gap (mode=join) that is NOT the path the affected trio
ran. Oracle COULD see and cycle the selector; it still didn't matter. Traced:
* The steam lobby serialized exactly three member fields: nm / vh / cl.
Experience never travelled.
* The steam HOST rebuilds mission.pilots[] from the lobby roster
(name/vehicle/color only), so every non-self page has EMPTY experience --
and BTFeMission_WriteEgg stamps the "veteran" fallback on empty.
* The steam JOINER writes NO egg at all (spec->eggPath[0]=0); his mission
arrives from the HOST's console feed -- i.e. the host's egg, where HIS
page says veteran no matter what his own console shows.
* The host's own page keeps his menu choice only as slot-0 residue of the
pre-roster self fill -- why BOTH hosts (Sauron AND Lynx) were clean while
all three joiners heated in "standard".
FIX: experience is now published as lobby member data ("xp") beside nm/vh/cl,
unpacked into BTLobbyMember, and stamped onto each member's egg page in the
host's roster loop. Both exported lobby entry points + PublishSelf gain the
parameter; the fe passes the local menu selection. An older client in the
lobby simply has no "xp" -- the veteran fallback applies to THAT member only,
exactly the pre-fix behavior, so mixed-build lobbies do not break.
Per-player mixing (the original design, per the user: the sysop set each
user's tier; mixed matches were legal) now works over steam end to end: each
member's OWN choice -> lobby -> the host-authored egg page -> the console feed
-> that node's master player.
VERIFICATION BOUNDARY: builds both configs; the chain is code-traced; the
lobby legs need a real Steam session -- field re-test is a JOINER selecting
Standard and logging [exp] experience=1 heatModelOn=0 (plus the [fe] line on
both sides). The 3109cfc join-trim selector stays: correct for mode=join.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>