Skip to main content

Administration Board

Single-pane observability and recruiter-activity dashboard. Entry point: /admin (redirects to /admin/board). Requires ADMIN_SECRET.

Sections

TabData sourcePurpose
System/api/war-room/data (in-memory telemetry)Live metrics, SLO status, recent errors, time-series charts — same data as the public War Room, polled every 60s when visible
RecruitersFirestore chat_sessions + chat_memory via /api/admin/sessionsSession list (message count, engagement score, email capture), full conversation drill-down
LogsCloud Logging via /api/admin/logsStructured logs with severity filter, trace ID links, time range
Metrics/api/metrics (Prometheus text exposition)App-wide counters, histograms, gauges — scrapable by any Prometheus-compatible system

Data model (Firestore)

  • chat_sessionssession_id, started_at, last_activity_at, message_count, cache_hits, rate_limited, status, engagement_score, recruiter_email, total_duration_ms, trace_id
  • chat_memorymessages[] (role + content) for conversation context

No additional collections or GCP services beyond what the app already uses.

APIs

EndpointMethodAuthPurpose
/api/war-room/dataGETPublicTelemetry JSON (60s server cache)
/api/admin/sessionsGETX-Admin-SecretSession list from Firestore
/api/admin/sessions/[id]GETX-Admin-SecretFull conversation for a session
/api/admin/logsGETX-Admin-SecretCloud Run structured logs
/api/admin/board/statsGETX-Admin-SecretAggregates (7d sessions, email count)
/api/admin/board/viewPOSTX-Admin-SecretRecords board view (analytics)
/api/metricsGETX-Admin-SecretPrometheus text exposition format

Auth

Single ADMIN_SECRET (header or session cookie after first auth). Same credential for all admin routes. The secret is stored in GCP Secret Manager and injected into Cloud Run via cloudbuild.yaml.

Architecture

Browser → /admin/board
  ├── System tab     → GET /api/war-room/data (public, 60s cache)
  ├── Recruiters tab → GET /api/admin/sessions (Firestore)
  │                  → GET /api/admin/sessions/[id] (drill-down)
  ├── Logs tab       → GET /api/admin/logs (Cloud Logging API)
  └── Metrics tab    → GET /api/metrics (in-memory telemetry → Prometheus format)

All data is read-only. The board adds no write paths. War Room polling uses the Page Visibility API — background tabs do not poll (see ADR-002).