Tester Views
Server-side views that answer player-level support questions: "what did this player upload, when, and why was a session blocked?". Backed by SQL views in the public schema, prefixed support_*, plus an identity-lookup helper.
Lookup flow
The canonical lookup path for a tester report is:
playroll_users_view
Identity resolution. Maps any of the identifiers a player might mention back to a user_id.
| Column | Type |
|---|---|
user_id | text |
steam_id | text |
steam_username | text |
avatar_url | text |
email | character varying |
discord_username | text |
support_player_upload_summary
One row per player. The starting point for triage: scope of activity, completeness, and time range.
| Column | Type | Meaning |
|---|---|---|
user_id, display_name, steam_id, avatar_url, discord_username | text | Identity. |
search_text | text | Concatenated searchable identity string. |
total_sessions_seen | bigint | All sessions observed for this player. |
sessions_with_uploads | bigint | Sessions with at least one artifact landed. |
valid_current_sessions | bigint | Sessions meeting the MP4+CSV contract. |
valid_future_triplet_sessions | bigint | Sessions meeting MP4+CSV+JSON. |
partial_upload_sessions / no_upload_sessions | bigint | Breakdowns of incompleteness. |
total_files, mp4_files, csv_files, json_files, ogg_files | numeric | Artifact counts by type. |
total_size_bytes, total_size_pretty | bigint / text | Total bytes uploaded. |
first_upload_at, last_upload_at | timestamptz | Activity window. |
games | text[] | Games seen for this player. |
sessions_with_known_duration, known_recorded_seconds, known_recorded_hours | bigint / numeric | Duration coverage. |
duration_coverage_pct_for_valid_current_sessions | numeric | Fraction of valid sessions with a known duration. |
support_recording_sessions
One row per recording session. The main drill-down surface for "why did this session not upload?".
| Column | Type | Meaning |
|---|---|---|
user_id, display_name, steam_id, avatar_url, discord_username | text | Identity. |
session_id | text | Session key. |
game, game_slug, game_name | text | Game references. |
recording_session_status | text | Server-side lifecycle status. |
session_created_at, session_updated_at, client_ended_at, server_verified_at | timestamptz | Lifecycle anchors. |
first_upload_at, last_upload_at | timestamptz | Upload window. |
recording_started_at, recording_ended_at | timestamptz | Capture window. |
duration_seconds, duration_quality | bigint / text | Measured duration and confidence label. |
total_files, mp4_count, csv_count, json_count, ogg_count | bigint | Artifact counts. |
total_size_bytes | bigint | Bytes for the session. |
has_current_required_pair, has_future_required_triplet | boolean | Contract checks. |
upload_consistency_status | text | Coherence between expected and observed artifacts. |
required_artifact_mode | text | Whether the session is evaluated against the current (pair) or future (triplet) contract. |
uploadability_status | text | Final disposition: uploadable, blocked, partial, etc. |
block_reason | text | Human-readable reason when uploadability_status is blocking. |
mp4_s3_keys, csv_s3_keys, json_s3_keys, ogg_s3_keys | text[] | S3 keys per type, for direct fetch. |
files | jsonb | Full per-artifact metadata. |
detected_resolution | jsonb | Capture resolution(s) observed for the session. |
support_recording_files
One row per uploaded artifact. Use this when investigating a specific file or building an S3 link to share with a player.
| Column | Type | Meaning |
|---|---|---|
upload_id | uuid | Artifact key. |
user_id, display_name, steam_id, avatar_url, discord_username | text | Identity. |
session_id | text | Owning session. |
game_slug | text | Game reference. |
file_type, filename, size_bytes | text / text / bigint | Artifact descriptors. |
status | text | Upload status of the artifact. |
uploaded_at | timestamptz | When it landed. |
recording_started_at, recording_ended_at | timestamptz | Capture window of the source session. |
s3_bucket, s3_key, s3_uri, s3_object_url | text | Destination references. |
Operational helpers
These public views are not tester- or VC-facing per se, but are consumed by the views above:
daily_upload_stats— daily file/user/session/byte counts by type.session_completion_status—expected_chunksvsuploaded_chunksper session, plusis_complete.complete_triplets— per(user, session, chunk_dir)whether mp4+csv+json are all present.upload_summary_by_user— per-user totals including games list (older shape; prefersupport_player_upload_summary).
Relationship to OTEL dashboards
Tester views answer "what arrived on the server?" — server-authoritative state. OTEL dashboards (e.g. Capture Pipeline) answer "what did the client try to do?" — client-emitted telemetry. When a player reports a missing session, the recommended order is:
- OTEL Errors & Auth to confirm the client was authenticated and not blocked.
- OTEL Capture Pipeline (client) to confirm the recording funnel reached
recording.stop. support_recording_sessionsto see whether the server received the session and whatuploadability_status/block_reasonsays.support_recording_filesto look at the specific artifacts and their S3 destinations.