Root Cause Analysis

skopos.app/dashboard — Root Cause Analysis
✦ 3 new insights

Stripe webhook signature verification failing

2 min ago · payment-svc · 7 occurrences

Confidence92%

Root cause: Stripe webhook signature verification fails because the raw request body is being parsed by middleware before reaching the verification handler. Stripe's signature is computed against the raw body, so parsing it as JSON breaks the HMAC comparison.

Suggested fix

- app.use(express.json());
- app.post('/webhook', handleStripeWebhook);
+ app.post('/webhook',
+   express.raw({ type: 'application/json' }),
+   handleStripeWebhook
+ );
+ app.use(express.json());

Database connection pool exhausted

12 min ago · user-service · 14 occurrences

Confidence84%

Root cause: A long-running analytics query holds a connection for ~45s while an async retry loop in the request handler keeps requesting new connections from the same pool. With pool_size=20 and avg query time of 50ms, the pool empties in under 2 seconds during traffic spikes.

Suggested fix

- pool = create_pool(size=20)
+ pool = create_pool(size=20, timeout=5)
+
+ # Move analytics queries to a dedicated pool
+ analytics_pool = create_pool(size=5)
+
- result = await pool.fetch(analytics_query)
+ result = await analytics_pool.fetch(analytics_query)

Rate-limit middleware reading wrong client IP

1 hr ago · api-gateway · 5 occurrences

Confidence67%

Root cause: The rate-limit middleware reads the client IP from req.connection.remoteAddress, but the service runs behind a load balancer that terminates TLS. Every request appears to come from the same upstream proxy IP, so per-user rate limits never trigger correctly.

Suggested fix

- const ip = req.connection.remoteAddress;
+ const forwarded = req.headers['x-forwarded-for'];
+ const ip = (typeof forwarded === 'string'
+   ? forwarded.split(',')[0].trim()
+   : req.connection.remoteAddress);
+ // Ensure 'trust proxy' is set:
+ app.set('trust proxy', 1);

Debug in minutes, not hours

Pattern detection

Errors are grouped by fingerprint. Once a pattern hits 5+ occurrences, Claude analyzes it automatically.

Plain-English explanations

No more cryptic stack traces. Get a clear narrative of what failed, where, and why — written in human language.

Actionable code fixes

Suggested fixes come as real code diffs you can copy-paste, not vague advice. Built for engineers in a hurry.

Confidence scoring

Every insight ships with a 0–100% confidence score so you know when to trust the AI and when to dig deeper.

Language-agnostic

Works with Python, Node.js, Go, Ruby, Java — anything that produces logs. The model reasons about the failure, not syntax.

Cached for cost

Repeated patterns reuse cached analyses. You pay for the first occurrence, not the next 100.

← Back to features