Raxx · internal docs

internal · gated

RCA — Investigate workflow silently creates no FreeScout tickets

Incident ID: 2026-06-19-investigate-no-tickets Date: 2026-06-19 Severity: SEV-3 Duration: Unknown — regression was present since feature shipped; detected 2026-06-19 UTC when operator reported "NO tickets" in the Investigate workflow Blast radius: Internal ops tooling only. No customer-facing impact. Every Investigate click on any degraded surface returned {degraded: true} silently rather than creating a FreeScout ticket. Author: sre-agent

Summary

The Investigate button on the Console status dashboard has never successfully created a FreeScout ticket since the feature shipped. Two compounding root causes: (1) five required Heroku env vars were never set on raxx-console-prod (FREESCOUT_API_URL, FREESCOUT_API_KEY, CF_ACCESS_SVC_TICKETS_CLIENT_ID, CF_ACCESS_SVC_TICKETS_CLIENT_SECRET, FREESCOUT_INSTANCE_URL), so freescout_client.create_conversation() returned reason="freescout_not_configured" before making any network call; and (2) even if those vars had been set, the freescout_client did not send CF Access service-token headers, so every outbound call to tickets.raxx.app/api/* would have received HTTP 403 from CF Access (the /api path is gated by CF Access app ca6fd315, decision=non_identity). The recent SSL fix to tickets.raxx.app (CF 526 resolved) was a necessary but not sufficient condition for the path to work. Fix: env vars set via Heroku Platform API from vault; code change adds cf_access_tickets_headers() helper and _base_headers() merger into all six freescout_client call sites; 13 new tests; PR #3717.

Timeline (all times UTC)

Impact

What went well

What didn't go well

Root cause analysis

Detection

Resolution

Action items

# Action Owner Due Issue
1 Add startup_check_investigate_configured() call in console/app/__init__.py (log ERROR-level + emit Sentry event if any Investigate prereq var is missing when flag is ON) feature-developer 2026-07-03 file as type:reliability
2 Add Sentry alert rule: freescout_not_configured in freescout_client logger > 2 events in 10m → alert to ops@ sre-agent 2026-06-26 file as type:reliability
3 Add FREESCOUT_API_URL to console deployment checklist / migration prerequisite list so future flag enables check that it's provisioned sre-agent 2026-06-26 update docs/ops/runbooks/auto-ticketing-runbook.md
4 Update freescout_client module docstring and migration 0053 to list CF Access headers as a named prerequisite (not just FREESCOUT_API_KEY / FREESCOUT_API_URL) sre-agent 2026-06-26 in this PR (already done)

References