Version: 1.1.0 Last Updated: 2026-07-07 Description: Complete catalog of GRASS event types and categories
This page is GRASS (NATS) only. For structsd Tendermint events (structs.structs.EventAttack, ugc_moderated, …) see chain-events.md.
| Event Name | Description | Subject Pattern | Schema |
|---|---|---|---|
| block | Block updates | consensus |
event-schemas.md#BlockEvent |
| Event Name | Description | Subject Pattern | Schema |
|---|---|---|---|
| guild_consensus | Guild consensus data updates | structs.guild.* |
event-schemas.md#GuildConsensusEvent |
| guild_meta | Guild metadata updates | structs.guild.* |
event-schemas.md#GuildMetaEvent |
| guild_membership | Guild membership changes | structs.guild.* |
event-schemas.md#GuildMembershipEvent |
| guild_rank_permission | Guild rank permissions set or revoked | structs.guild.* |
event-schemas.md#EventGuildRankPermission |
These are planet_activity rows; they arrive on the planet subject structs.planet.{planet_id}.{player_id} (the owning player id was appended 2026-07-07; subscribe with structs.planet.{planet_id}.*). Every payload also carries a top-level player_id (or noPlayer when unresolved).
| Event Name | Description | Subject Pattern | Schema |
|---|---|---|---|
| raid_status | Raid status changes | structs.planet.*.* |
event-schemas.md#PlanetRaidStatusEvent |
| shield_change | Planetary shield value changed (planetary_shield / planetary_shield_old) |
structs.planet.*.* |
– |
| block_raid_start | Raid vulnerability clock (blockStartRaid) armed |
structs.planet.*.* |
– |
| planet_activity | Generic planet activity wrapper from the planet_activity table |
structs.planet.*.* |
event-schemas.md#PlanetActivityEvent |
| fleet_arrive | Fleet arrival | structs.planet.*.* |
event-schemas.md#FleetArriveEvent |
| fleet_depart | Fleet departure | structs.planet.*.* |
– |
fleet_advanceexists in the category enum but is not emitted by the current indexer — fleet movement surfaces asfleet_departthenfleet_arrive. Do not wait onfleet_advance.
These are planet_activity rows and arrive on the planet subject structs.planet.{planet_id}.{player_id} (not the struct subject; subscribe structs.planet.{planet_id}.*). See struct_attack stubbing below.
| Event Name | Description | Subject Pattern | Schema |
|---|---|---|---|
| struct_attack | Struct attack (per-shot detail; stubbed when large — see below) |
structs.planet.*.* |
– |
| struct_health | Struct HP changed (health / health_old) |
structs.planet.*.* |
– |
| struct_defense_remove | Defense structure removed | structs.planet.*.* |
– |
| struct_defense_add | Defense structure added | structs.planet.*.* |
– |
| struct_defender_clear | Defense relationships cleared from a struct | structs.planet.*.* |
– |
| struct_status | Struct status changes (online / offline / destroyed) | structs.planet.*.* |
event-schemas.md#StructStatusEvent |
| struct_move | Struct movement | structs.planet.*.* |
– |
| struct_block_build_start | Build operation started | structs.planet.*.* |
– |
| struct_block_ore_mine_start | Mining operation started | structs.planet.*.* |
– |
| struct_block_ore_refine_start | Refining operation started | structs.planet.*.* |
– |
The PostgreSQL notification trigger can replace a large planet activity payload
with a stub containing subject, planet_id, player_id, seq, category,
time, and stub: "true", without detail. Small attacks carry full detail.
Accept the boolean form of true as well. Use the authenticated
exact event lookup with the full
(time, planet_id, seq) key, preserving microseconds, then validate the returned
identity/category before replay. Await this fetch before later events on the same
stream; discard late responses after session or planet replacement. No durable
notification replay is implied. Refresh current state after delivery gaps.
| Event Name | Description | Subject Pattern | Schema |
|---|---|---|---|
| player_consensus | Player state updates, including UGC username/pfp on structs.player |
structs.player.> |
event-schemas.md#PlayerConsensusEvent |
| player_address | Address added to / changed on a player | structs.player.> |
– |
| player_address_pending | Pending address registration appeared | structs.player.> |
– |
| Event Name | Description | Subject Pattern |
|---|---|---|
| address_register | Address registration events | structs.address.register.* |
ugc_moderated is not a GRASS event. Catalog, subscribe query, and attributes: chain-events.md. Attribute table: ugc-moderation.md.
The corresponding player_consensus GRASS events fire when sync-state commits UGC updates to structs.player. guild_meta fires for off-chain guild config on structs.guild_meta.
| Entity | Pattern | Specific Format | Example |
|---|---|---|---|
| Player | structs.player.> |
structs.player.{guild_id}.{player_id} |
structs.player.0-1.1-11 |
| Guild | structs.guild.* |
structs.guild.{guild_id} |
structs.guild.0-1 |
| Planet | structs.planet.> |
structs.planet.{planet_id}.{player_id} |
structs.planet.2-1.1-11 |
| Struct | structs.struct.* |
structs.struct.{struct_id} |
structs.struct.5-1 |
| Fleet | structs.fleet.* |
structs.fleet.{fleet_id} |
structs.fleet.9-1 |
| Address | structs.address.register.* |
structs.address.register.{code} |
structs.address.register.ABC123 |
| Grid | structs.grid.> |
structs.grid.{object_type}.{object_id}.{player_id} |
structs.grid.struct.5-1.1-11 |
| Global | structs.global |
structs.global |
structs.global |
NATS wildcard rule:
*matches exactly one token;>matches one or more trailing tokens. Since grid and planet subjects now end with the ownerplayer_id,structs.planet.*(two tokens) no longer matches — usestructs.planet.{planet_id}.*for one planet orstructs.planet.>for all. The player subject is three tokens (structs.player.{guild_id}.{player_id}), so usestructs.player.>. Payloads for grid/planet events also carry a top-levelplayer_id(ornoPlayer).
api/streaming/event-schemas.md - Event schema definitionsapi/streaming/subscription-patterns.md - Subscription patternsprotocols/streaming.md - Streaming protocolapi/streaming/README.md - Streaming overview