- **THEN** the response is `200` with `generatedAt` within one second of the server clock and the keys `live`, `today` and `recentRooms`, and no `nodes` key on CE
`services` (status `active`, every kind but `STANDARD`), `participantsByKind` (every kind, `0` when absent),
`publishers` (active STANDARD with `isPublisher`), `egresses` (status `starting`, `active` or `ending`) and
`ingressSessions` (status `publishing`).
#### Scenario: Mixed kinds
- **GIVEN** 12 active rooms holding 85 active STANDARD, 2 SIP, 3 EGRESS and 2 AGENT participants, 54 STANDARD publishers and 1 INGRESS publisher, 3 egresses in status `active`, 1 in `ending` and 1 `complete`, and 1 `publishing` ingress session
#### Scenario: Joining participants are not active
- **GIVEN** a room with one `active` and one `joining` STANDARD participant
- **WHEN** the client requests the overview
- **THEN** `live.participants` is `1`
### Requirement: Stale hints
Edition: CE. `live.stale` SHALL carry `rooms` and `participants`, the number of `active` documents whose `lastStatsAt`
is older than `olderThanMs` at `generatedAt`, and `olderThanMs` itself: the stale window `max(90 s, 60 s + I + 15 s)` of
the batch interval I that `GET /api/v1/status` reports as `writer.batchIntervalMs` (the largest among the nodes seen in
the last hour, 10 s when none reports one); documents without `lastStatsAt` SHALL NOT be counted.
#### Scenario: Stale room and participants
- **GIVEN** nodes reporting `batchIntervalMs: 10000`, an active room whose `lastStatsAt` is 100 s old with two active participants with `lastStatsAt` 100 s old, and another active room with fresh stats
- **GIVEN** an active participant that never published nor subscribed and has no `lastStatsAt`
- **WHEN** the client requests the overview
- **THEN** it is not counted in `live.stale.participants`
#### Scenario: Slow writer
- **GIVEN** a node seen in the last hour with `batchIntervalMs: 60000` and an active room with one active participant, both with `lastStatsAt` 100 s old
- **GIVEN** node documents without `batchIntervalMs`
- **WHEN** the client requests the overview
- **THEN** `live.stale.olderThanMs` is `90000`
#### Scenario: Window at the default interval
- **GIVEN** the default batch interval of 10 s
- **WHEN** the overview is requested
- **THEN** `live.stale.olderThanMs` is 90 000
### Requirement: Today's figures
Edition: CE. `today` SHALL carry `tz`, `since` (local midnight of `tz` in UTC), `rooms`, `participantSessions`,
`participantMinutes`, `egresses`, `ingressSessions` and `approximate`, summed from the `global` hourly rollups
whose bucket starts at or after the hour containing `since`; `approximate` is `true` when `since` is not on an
hour boundary.
#### Scenario: Whole-hour zone
- **GIVEN** `tz=Europe/Madrid` at 12:40 local time on 2026-10-13 and hourly `global` rollups since 22:00 UTC of the previous day summing `rooms.created` 143, `participants.joined` 1204, `participants.minutes` 18340, `egress.started` 21 and `ingress.sessionsStarted` 4
`analytics_hourly { scope, bucket }`), examining at most each collection's active documents plus 20 rooms; `nodes`,
bounded by the node count, is read whole for the stale window's batch interval; `schema_meta` is not read.
#### Scenario: Explain plans
- **GIVEN** a database generated by the data generator at scenario M
- **WHEN** each overview query is explained
- **THEN** no plan on `rooms`, `participants`, `egresses`, `ingress_sessions` or `analytics_hourly` contains `COLLSCAN`, and `totalDocsExamined` of the room and participant aggregations equals the number of active documents