Superb! Can’t believe I missed both the platform lexicon and the Where to Buy link 
Here’s the updated lexicon then:
use games.gamesgamesgamesgames.platform;
use app.bsky.embed.external;
/// A live "now playing a game" status, one per account.
/// Consider this record abandoned if staleAt >> now.
/// Be mindful of players' privacy preferences. Do not create this record
/// without consent from the owner to publish their live activity, and
/// consider what 'covert play' looks like in your app.
@key("literal:self")
record status {
/// The game being played (link to a games.gamesgamesgamesgames.game record)
game!: AtUri,
/// The storefront/platform being used
platform: platform, // games.gamesgamesgamesgames.platform open union
/// The kind of session this is (eg. "Daily Challenge", "4-player game")
state: string constrained {
maxGraphemes: 128,
maxLength: 1280,
},
/// The task being handled right now in the game
/// eg. "Level 5-2", "Ranked - Diamond II", "Turn 14 of 20"
details: string constrained {
maxGraphemes: 128,
maxLength: 1280,
},
/// Details only relevant if you're playing.
/// It's presence implies you're playing, not watching.
playing: {
/// An ID for this gaming session which will be the same for all players playing together
id: string constrained { maxLength: 128 }
/// Who's playing in this session (only for 'playing' activity)
party: {
/// Count of players currently in the party
current!: integer constrained { minimum: 1 },
/// Who they are, including yourself, may be less than current count
/// eg. if some players don't have atproto accounts.
/// Be mindful of players' privacy preferences.
/// Ignore DIDs of players who don't also have
/// an equivalent record (use `id` to match)
dids: Did[] constrained { minLength: 1 },
/// Capacity, if there's a hard limit
max: integer constrained { minimum: 1 },
},
// Space for lobby details & other playing-specific metadata
},
/// A card representing the game/session
embed: embed, // app.bsky.embed.external
/// When this session began
createdAt!: Datetime,
/// When this record should be considered abandoned.
/// Active sessions should update this regularly (eg. every 5 mins)
/// to a few minutes in the future.
staleAt!: Datetime,
}
As (more verbose) lexicon JSON
{
"$type": "com.atproto.lexicon.schema",
"lexicon": 1,
"id": "games.gamesgamesgamesgames.actor.status",
"defs": {
"main": {
"type": "record",
"description": "A live \"now playing a game\" status, one per account.\nConsider this record abandoned if staleAt >> now.\nBe mindful of players' privacy preferences. Do not create this record\nwithout consent from the owner to publish their live activity, and\nconsider what 'covert play' looks like in your app.",
"key": "literal:self",
"record": {
"type": "object",
"required": [
"game",
"createdAt",
"staleAt"
],
"properties": {
"game": {
"type": "string",
"format": "at-uri",
"description": "The game being played (link to a games.gamesgamesgamesgames.game record)"
},
"platform": {
"type": "union",
"refs": [
"games.gamesgamesgamesgames.platform"
],
"description": "The storefront/platform being used"
},
"state": {
"type": "string",
"maxGraphemes": 128,
"maxLength": 1280,
"description": "The kind of session this is (eg. \"Daily Challenge\", \"4-player game\")"
},
"details": {
"type": "string",
"maxGraphemes": 128,
"maxLength": 1280,
"description": "The task being handled right now in the game\neg. \"Level 5-2\", \"Ranked - Diamond II\", \"Turn 14 of 20\""
},
"playing": {
"type": "object",
"required": [],
"properties": {
"id": {
"type": "string",
"maxLength": 128,
"description": "An ID for this gaming session which will be the same for all players playing together"
},
"party": {
"type": "object",
"required": [
"current"
],
"properties": {
"current": {
"type": "integer",
"minimum": 1,
"description": "Count of players currently in the party"
},
"dids": {
"type": "array",
"items": {
"type": "string",
"format": "did"
},
"minLength": 1,
"description": "Who they are, including yourself, may be less than current count\neg. if some players don't have atproto accounts.\nBe mindful of players' privacy preferences.\nIgnore DIDs of players who don't also have\nan equivalent record (use `id` to match)"
},
"max": {
"type": "integer",
"minimum": 1,
"description": "Capacity, if there's a hard limit"
}
},
"description": "Who's playing in this session (only for 'playing' activity)"
}
},
"description": "Details only relevant if you're playing.\nIt's presence implies you're playing, not watching."
},
"embed": {
"type": "ref",
"ref": "app.bsky.embed.external",
"description": "A card representing the game/session"
},
"createdAt": {
"type": "string",
"format": "datetime",
"description": "When this session began"
},
"staleAt": {
"type": "string",
"format": "datetime",
"description": "When this record should be considered abandoned.\nActive sessions should update this regularly (eg. every 5 mins)\nto a few minutes in the future."
}
}
}
}
}
}