Summary
Production GET /rest/v1/map_analysis returns 503 for multiple standard pairs (e.g. ENISA→ISO 27001, ENISA→NIST 800-53 v5, Cloud Controls Matrix→NIST 800-53 v5).
Heroku logs show:
- Cache miss for the pair
Redis/RQ unavailable (connection refused to localhost:6379)
- Synchronous fallback attempts Neo4j (
c13a6d96.databases.neo4j.io) and fails DNS resolution
- Response:
503 Database/graph backend unavailable
Root cause
Commit/PR #823 (d796ff53, merged ~2026-06-09) removed the Heroku cache-only guard (if os.environ.get("HEROKU"): abort(404)) and replaced the Redis-unavailable fallback with a direct db.gap_analysis() Neo4j call.
This regressed a prior fix in #915 (00f1721c) that served precomputed GA from SQL cache only on Heroku. Production was force-updated from the #915 fix back to d796ff53.
Expected behavior
On Heroku/read-only production:
- Serve material cached GA results from Postgres (
gap_analysis_results)
- On cache miss: return 404 (no Redis queue, no Neo4j computation on web dyno)
Acceptance criteria
Summary
Production
GET /rest/v1/map_analysisreturns 503 for multiple standard pairs (e.g.ENISA→ISO 27001,ENISA→NIST 800-53 v5,Cloud Controls Matrix→NIST 800-53 v5).Heroku logs show:
Redis/RQ unavailable(connection refused tolocalhost:6379)c13a6d96.databases.neo4j.io) and fails DNS resolution503 Database/graph backend unavailableRoot cause
Commit/PR #823 (
d796ff53, merged ~2026-06-09) removed the Heroku cache-only guard (if os.environ.get("HEROKU"): abort(404)) and replaced the Redis-unavailable fallback with a directdb.gap_analysis()Neo4j call.This regressed a prior fix in #915 (
00f1721c) that served precomputed GA from SQL cache only on Heroku. Production was force-updated from the #915 fix back tod796ff53.Expected behavior
On Heroku/read-only production:
gap_analysis_results)Acceptance criteria
opencreorgand validate failing pairs