Attendance and visiting crowd
Dev58 provides independent launch fields:
{"version":1,"rules":{"profile":"original"},"crowd":{"fill":65,"away_percent":25}}
Both values accept finite percentages from 0 through 100. Either may be omitted. Omitted appearance preserves native appearance, explicit zero selects the home population and 100 selects away artwork. Reset is distinct from setting zero.
During play, acquire a control lease and use the Python crowd_command / crowd_appearance_command helpers or TypeScript crowdCommand / crowdAppearanceCommand. These read fresh state and prepare the guarded command. Persist the exact returned command body before POST /v1/commands. Read GET /v1/crowd and GET /v1/crowd/appearance; require health ready and matching run/scene/epoch/revision.
The hook controls native near and distant spectators without editing an arena, stadium, floor or model. Appearance uses the selected teams' actual clothing/palette resources and stable nested whole-row membership without consuming game randomness. Weighted actual allocation can differ from the request. Fullness thresholds are quantized by the game.
Away share is global. Named sections, placement behind the bench, static mesh spectators, bench personnel and crowd audio are separate. Generic or identical team source artwork remains generic and is reported. Replacement mips use the documented box filter; exact equivalence to every packed source mip is not claimed.
A live change may be indeterminate if native application occurred before the expected rendering acknowledgement. Inspect receipt/state before another action; SDK mutation calls never retry automatically. Stale/replay/finished/missing-lease changes are refused. Requested startup choices do not leak into the next scene.
The full attendance contract, appearance contract and API examples document fields, diagnostics, reset behavior and resource lifetime limits.