Three additions to the VIN Decode Observability dashboard, all read-only.
Faz 2a — Error fingerprint drill-down
- New route /projects/sase/vin-decode/errors/[key] where [key] is one
of the eight bucket keys (BUDGET_EXCEEDED, UNKNOWN_VIN, TIMEOUT, …).
- getErrorBucketDetail(key, range) returns: total + unique-user count,
hourly time series, top 10 affected brands (joined to brands.name/
slug), top providers (winning + chain attempts from timings keys),
top 20 affected users with link to their detail page, six distinct
sample error messages, last 30 raw failures (sanitized VIN, source,
RT, message).
- Error breakdown cards on the main dashboard now link to this page
with the current time range preserved.
- ERROR_BUCKET_KEYS + ErrorBucketKey exported so the [key] route
validates against the same list.
Faz 2b — Deploy regression analysis
- listSaseDeploys(limit) fetches the Sase.tr Coolify app's recent
finished deployments via the Coolify API (COOLIFY_API_TOKEN).
- analyzeDeployRegressions(deploys) slices a 30-minute window
before deploy.startedAt and after deploy.finishedAt, computes the
success-rate delta, and flags rows where the drop ≥ 10pp (and
both windows have ≥ 5 samples).
- Dashboard card lists last ~10 deploys with before/after rates and
Δ pp, color-coded; "regression" badge on flagged rows.
Faz 2c — BIP integration
- getVinRelatedInsights() reads from the panel-pg `insights` table:
type='provider_quality' (always VIN-related by prompt-tag routing)
+ bug_triage insights whose body mentions VIN/decode/provider
keywords. Deduped, severity-then-recency sorted.
- New dashboard card surfaces insight titles with severity + type
badges, occurrence/user counts, confidence, and a link to the
Gitea issue if one was opened.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>