Getting Started
Connect Resolue to your stack in under 5 minutes. By the end of this guide, Resolue will be watching your production and ready to auto-resolve incidents.
Prerequisites
- A GitHub repository with your application code
- A deploy platform with preview deployments (Vercel, Cloudflare Pages, Netlify, etc.)
- An error tracking tool (Sentry, Datadog, CloudWatch, etc.)
- Node.js 18+ for the auth middleware
Setup
Go to github.com/apps/resolue-ai and install the app on your organization. Select the repositories you want Resolue to monitor and fix.
# Resolue gets:
# ✓ Read access to code (for diagnosis)
# ✓ Write access to PRs (to open fix PRs)
# ✓ Read access to deployments (to detect previews)
In the Resolue dashboard, connect your deploy platform. Resolue detects preview deployments automatically to verify fixes on live URLs.
Supported: Vercel (Log Drain + preview deploys), Cloudflare Pages (coming soon), Netlify (coming soon).
Connect your error tracking tool. Resolue configures webhooks to receive production errors in real-time.
Supported: Sentry (issue.created + regression.detected), Datadog (coming soon), CloudWatch (coming soon).
Install the @resolue/auth middleware so Resolue can test authenticated routes on preview deployments. See the Preview Auth guide.
npm install @resolue/auth
Create a resolue.yaml in your repo root to configure confidence thresholds, ignored paths, and auto-merge rules. See the Configuration guide.
What happens next
When a production incident is detected, Resolue follows this pipeline:
- Signal ingestion — Error signals arrive from your monitoring stack (Sentry, Vercel, Datadog, etc.). Resolue deduplicates and triages.
- Signal correlation — Multiple signals (backend error + frontend fetch failure + log spike) are correlated to a single root cause.
- Diagnosis — AI analyzes stack traces, breadcrumbs, recent commits, and code context to identify the exact file, function, and introducing commit.
- Fix generation — A minimal patch is generated. Pushed to a branch. Your platform builds a preview deployment.
- Verification — Automated tests run against the live preview. Tests pass. Video recorded. Before/after screenshots captured. BDD regression tests generated.
- PR with proof — A full evidence PR is opened: root cause analysis, code diff, video, screenshots, regression tests, and confidence score.
You review. You merge. Resolue never auto-merges.
Verification infrastructure
Resolue verifies every fix on a live preview deployment before opening a PR. It runs automated browser tests in isolated cloud environments — you don't need to install or configure anything.
Three tiers of verification:
- Tier 1 — Zero-config smoke checks (always runs): Preview loads without errors, no console errors matching the original bug, key page elements are present.
- Tier 2 — Your existing tests (auto-detected): If your repo has end-to-end tests, Resolue discovers and runs your full suite against the preview automatically.
- Tier 3 — Generated regression tests (auto-generated): For every fix, Resolue generates tests covering the error case, a dependency failure, and the happy path. Committed alongside the fix.
AI Configuration
Choose which AI model powers Resolue's diagnosis and fix generation. Bring your own API key, or use a self-hosted model for full data sovereignty.
Supported Models
| Provider | Model | Method | Best for |
|---|---|---|---|
| Anthropic | claude-sonnet-4 | API key | Default — best fix accuracy |
| Anthropic | claude-opus-4 | API key | Complex multi-file fixes |
| OpenAI | gpt-4o | API key | Fast, good for simple fixes |
| OpenAI | o3 | API key | Deep reasoning for hard bugs |
| AWS Bedrock | Claude via Bedrock | IAM role | Enterprise / AWS-native |
| Azure OpenAI | GPT-4o via Azure | Azure AD | Enterprise / Azure-native |
| Self-hosted | Llama 3, Mistral, etc. | OTLP endpoint | Air-gapped / full sovereignty |
Configuration
Set the AI provider in your resolue.yaml:
# resolue.yaml — this file is committed to your repo!
ai:
provider: anthropic # anthropic | openai | bedrock | azure | custom
model: claude-sonnet-4 # Model identifier
api_key_env: RESOLUE_AI_KEY # ← name of the env var, NOT the key itself
api_key_env stores the name of the environment variable (e.g. RESOLUE_AI_KEY), not the actual key. The real key lives in your platform's secret storage (Vercel Env Vars, Cloudflare Secrets, GitHub Secrets, AWS SSM).
✕ Wrong:
api_key: sk-ant-api03-abc123...✓ Right:
api_key_env: RESOLUE_AI_KEY
Bring Your Own Key (BYOK)
For SaaS users, you can use Resolue's default model allocation or bring your own API key for any supported provider:
From Anthropic Console, OpenAI Dashboard, or your provider's portal.
# Vercel
vercel env add RESOLUE_AI_KEY preview production
# Cloudflare Pages
wrangler pages secret put RESOLUE_AI_KEY
# Or add directly in your platform's dashboard
ai:
api_key_env: RESOLUE_AI_KEY
Self-Hosted LLM
For organizations that cannot send code to external APIs, Resolue supports connecting to a self-hosted model via an OpenAI-compatible endpoint:
# resolue.yaml
ai:
provider: custom
endpoint: https://llm.internal.company.com/v1
model: llama-3.1-70b
api_key_env: INTERNAL_LLM_KEY
timeout: 120 # seconds — larger models may need more time
/v1/chat/completions format. Most self-hosted solutions (vLLM, Ollama, text-generation-inference) support this out of the box.Model Selection Strategy
Resolue can use different models for different stages of the pipeline:
ai:
diagnosis:
model: claude-opus-4 # Deep reasoning for root cause
fix_generation:
model: claude-sonnet-4 # Fast, accurate patches
confidence_scoring:
model: claude-sonnet-4 # Evaluate fix quality
Preview Auth
Set up @resolue/auth to let Resolue test authenticated routes on preview deployments — securely, without real user credentials.
Why this is needed
When Resolue deploys a fix to a preview URL and runs Playwright tests, it needs to reach the authenticated pages where the bug lives — checkout flows, dashboards, admin panels. Without auth bypass, Playwright hits the login screen and can't verify the fix.
Installation
npm install @resolue/auth
Setup
# Vercel
vercel env add RESOLUE_SECRET preview
# Cloudflare Pages
wrangler pages secret put RESOLUE_SECRET
# Netlify
netlify env:set RESOLUE_SECRET --context deploy-preview
# Paste the secret from your Resolue dashboard
// middleware.ts
import { resolueAuth } from '@resolue/auth/next';
// Standalone:
export default resolueAuth();
// Or wrap your existing auth (Clerk, NextAuth, etc):
import { authMiddleware } from '@clerk/nextjs';
export default resolueAuth(authMiddleware());
import { resolueAuth } from '@resolue/auth/express';
// Add BEFORE your auth middleware
app.use(resolueAuth());
app.use(passport.authenticate('session'));
import { checkResolue } from '@resolue/auth/node';
const resolue = checkResolue(req);
if (resolue.isVerification) {
req.user = resolue.testUser;
}
resolueAuth({
testUser: {
id: 'resolue-verify',
email: 'verify@yourcompany.com',
role: 'user', // Use minimum required role
orgId: 'test-org-123',
}
});
Security Layers
Five independent safety layers protect against unauthorized access:
| Layer | Protection | What it blocks |
|---|---|---|
| 1. Environment gate | Hardcoded production check | Middleware is no-op in production |
| 2. HMAC-SHA256 | Signed token validation | Forged headers without the secret |
| 3. Token expiry | 5-minute TTL | Replay attacks with intercepted tokens |
| 4. No real credentials | Synthetic test user only | Credential theft (nothing to steal) |
| 5. Secret rotation | Instant invalidation | Compromised secrets |
Secret Rotation
If you need to rotate the shared secret:
- Generate a new secret in the Resolue dashboard
- Update the
RESOLUE_SECRETenv var on your preview deployment - All old tokens fail validation immediately — no downtime, no redeployment
Error Replay
How Resolue reproduces the exact failure conditions from production — even when the preview environment's APIs work fine.
The Problem
A user hits a checkout error because Stripe returns a 500. Resolue generates a fix and deploys it to a preview. But on the preview, Stripe works fine — so the Playwright test passes without actually proving the fix handles the failure. The video shows a happy path, not a verified fix.
This happens with: external API failures (Stripe, geocoding, payment), database state issues (out of stock, duplicate records), race conditions, third-party timeouts, and edge cases triggered by specific user data.
How It Works
From Sentry breadcrumbs and OTel traces, Resolue extracts: the failing request payload, the API response that triggered the error, the sequence of HTTP calls leading to the failure, and the user's state at the time.
During verification, Resolue sends two additional signed headers alongside the auth token:
X-Resolue-Context— the full error context (failing request, breadcrumbs, stack trace)X-Resolue-Fixtures— API mocks and test data to replay the failure
Both headers are HMAC-SHA256 signed with the same shared secret. The middleware validates them before using the data.
Browser-level: For client-side API calls, Resolue intercepts outbound requests and returns the mocked failure response automatically. Zero app-side code needed.
Server-level: For server-side API calls (API routes, SSR), the @resolue/auth middleware intercepts outbound requests during the verification lifecycle. Your API route calls fetch('https://api.stripe.com/charge') and gets back the same 500 that production saw.
The verification exercises the exact code path that broke: the same request body, the same failing API response, the same edge case. The video shows the fix actually handling the error — not a happy path.
Setup: Browser-Level Mocking
This works automatically — no app-side code needed. Resolue sets up request interceptors before navigating to your preview.
Setup: Server-Level Mocking
For errors in API routes, server components, or SSR — where the failing fetch() runs on the server — you need to enable the fetch interceptor:
// instrumentation.ts (Next.js) or app initialization
import { patchFetch } from '@resolue/auth/replay';
// Only patch on preview environments
if (process.env.RESOLUE_SECRET) {
patchFetch();
}
This patches globalThis.fetch once. It's a no-op when there are no active Resolue mocks — zero performance impact on normal requests.
When @resolue/auth detects a verification request with fixtures, it automatically activates the mocks. When the request completes, mocks are cleared. Your API routes don't need any changes.
What Gets Mocked
Resolue builds fixtures automatically from the error context:
| Error source | What Resolue mocks | Example |
|---|---|---|
| External API failure | Returns the same error response | Stripe returns 500 → mock returns 500 |
| API timeout | Adds artificial delay | Payment API took 30s → mock delays 30s |
| Connection refused | Returns network error | Inventory service down → mock returns 503 |
| Edge case data | Seeds the test user state | Cart with 0-quantity item → test user gets same cart |
| Specific request body | Replays the original request | POST /checkout with exact payload that failed |
Fixtures Format
// What Resolue sends in X-Resolue-Fixtures
{
"apiMocks": [
{
"pattern": "https://api.stripe.com/v1/charges**",
"method": "POST",
"response": {
"status": 500,
"body": { "error": { "type": "api_error", "message": "Internal server error" } },
"delay_ms": 0
}
}
],
"replayRequest": {
"method": "POST",
"path": "/api/checkout",
"body": { "cartId": "cart_abc", "userId": "usr_123" }
},
"userStateSeed": {
"cartItems": 3,
"accountAge": "returning"
}
}
resolue.yaml Configuration
# resolue.yaml
verify:
replay:
enabled: true
mock_external_apis: true # Mock failing external APIs
replay_request_body: true # Use the original failing request
seed_user_state: true # Inject user state from error context
mock_timeout_ms: 30000 # Max delay for timeout mocks
Security
The context and fixtures headers use the same security model as the auth token:
- HMAC-SHA256 signed with the same shared secret — cannot be forged
- Only parsed on preview environments — production ignores them
- Fixtures never contain real credentials — only request shapes and mock responses
- Mocks are scoped to the verification request — cleared immediately after
patchFetch() wraps globalThis.fetch. It only intercepts requests when Resolue mocks are active (during verification). For all other requests, it passes through to the original fetch with zero overhead. If you're uncomfortable with a global patch, use browser-level mocking only (no app-side code needed).Supported Errors
Resolue is best at single-file bugs in TypeScript and JavaScript applications. Here's what it can fix today and what's coming next.
What Resolue Fixes Today
These error types have the highest fix rate and confidence scores:
| Error Type | Examples | Typical Confidence |
|---|---|---|
| Null/undefined access | Cannot read property 'id' of null, missing optional chaining | 90–98% |
| Unhandled exceptions | Missing try/catch, unhandled promise rejections, uncaught async errors | 85–95% |
| API error handling | No error response for 500s, missing timeout handling, unhandled fetch failures | 80–92% |
| Type mismatches | Wrong argument types, missing required fields, runtime schema failures | 85–95% |
| Missing env vars | Undefined environment variables in serverless, edge function crashes | 90–98% |
| Import/export errors | Broken imports, missing default exports, circular dependencies | 88–96% |
What makes these fixable?
- Single file — the root cause and the fix are in one file
- Clear stack trace — Sentry points to the exact line
- Pattern-based — these are well-known error patterns with well-known fixes
- Small diff — typically 1–10 lines changed
Coming Soon
These error types are on the roadmap. Resolue can currently diagnose them but may not generate a verified fix:
| Error Type | Challenge | Current Behavior |
|---|---|---|
| Multi-file logic bugs | Fix spans 2+ files with cross-module dependencies | Diagnostic report + root cause |
| Database/state bugs | Caused by data state, not code — requires environment seeding | Diagnostic report + suggested query |
| Race conditions | Timing-dependent, hard to reproduce deterministically | Diagnostic report + concurrency analysis |
| Infrastructure errors | DNS, networking, memory — outside code scope | Classified as infra, routed to ops |
| Third-party SDK bugs | Bug is in a dependency, not your code | Identifies the dependency + suggests workaround |
Language & Framework Support
| Stack | Support Level |
|---|---|
| Next.js + TypeScript | Full — primary target |
| React + Vite | Full |
| Node.js + Express | Full |
| Remix / SvelteKit | Partial — verification works, fix generation improving |
| Python / Go / Java | Roadmap — diagnosis works, fix generation coming |
When Resolue Can't Fix It
Not every production error gets a fix PR. Here's what happens at each confidence level — and why even "failures" deliver value.
Confidence Tiers
Resolue assigns a confidence score to every incident based on: stack trace clarity, code complexity, number of files involved, and test pass rate on the preview.
High Confidence (80–99%): Verified Fix PR
The ideal path. Resolue understands the root cause, generates a minimal patch, deploys it to a preview, runs tests, and records video. A full evidence PR is opened on your repo.
What you get: code diff, root cause analysis, video proof, before/after screenshots, confidence breakdown, and BDD regression tests.
Medium Confidence (50–79%): Draft PR with Caveats
Resolue identified the root cause and generated a fix, but something prevented full verification — tests partially failed, the fix touches multiple files, or the preview didn't fully reproduce the error.
What you get: a draft PR (not ready to merge) with the patch, a clear list of what was verified vs. what wasn't, and flags for areas that need human review. Think of it as "here's 80% of the work done."
Low Confidence (<50%): Diagnostic Report
The bug is too complex for an automated fix — multi-service, infrastructure-related, or lacking code context. Resolue does NOT open a PR. Instead, it delivers a diagnostic report.
What you get:
- Root cause analysis with the AI's best theory
- Affected files and functions identified
- Related recent commits that may have introduced the bug
- User impact data (how many users, frequency, severity)
- Suggested approach for your team to fix it manually
Configuration
You control the thresholds in resolue.yaml:
# resolue.yaml
confidence:
min_to_open_pr: 70 # Below this → diagnostic report only
min_to_auto_merge: 101 # 101 = never auto-merge (default)
draft_pr_threshold: 50 # 50–69 → draft PR, 70+ → ready PR
Why This Matters
Most AI coding tools only show you the success case. They demo a clean fix on a simple bug and imply everything works that way. We think that's dishonest.
Production bugs are messy. Context is missing. State is inconsistent. Services fail in weird ways. Resolue is designed to handle that reality — which means being transparent about when it can help and when it can't.
The confidence scoring, draft PRs, and diagnostic reports aren't failure modes — they're the product working as intended. A tool that says "I don't know" when it doesn't know is more valuable than one that silently pushes a wrong fix.
Test Generation
Every Resolue fix PR includes AI-generated BDD tests — so the bug is fixed AND permanently covered by a regression test that didn't exist before.
What Gets Generated
When Resolue opens a fix PR, it commits four test files alongside the code patch:
| File | Purpose | Format |
|---|---|---|
*.feature | Human-readable BDD spec | Gherkin (Given/When/Then) |
*.spec.ts | Executable Playwright test | Playwright + TypeScript |
*.api.spec.ts | API-level regression test | Playwright API testing |
*.fixtures.ts | Test data from error context | TypeScript const export |
All files are committed to tests/resolue/ on the fix branch. When you merge the PR, the tests become part of your codebase permanently.
Example: Checkout Null Check
For a TypeError: Cannot read property 'id' of null in checkout.tsx:
Generated Feature File
# Auto-generated by Resolue — incident inc_4821
Feature: Checkout handles type error correctly
Regression test for incident inc_4821.
Error originated in checkout.tsx:18.
Triggered by POST /api/checkout.
Scenario: TypeError in checkout.tsx is handled
Given a user is on the application
And the id may not be present
When they submit a request to /api/checkout
Then no TypeError should be thrown
And the page should respond without a 500 error
And the user should be redirected or see a graceful fallback
Scenario: Application handles Stripe API failure gracefully
Given a user is performing the action
And the Stripe API returns a 500 error
When they submit /api/checkout
Then the user should see a meaningful error message
And the application should not crash with a 500
And the error should be recoverable
Scenario: Normal flow still works after the fix
Given a user is authenticated
And all external services are responding normally
When they use /api/checkout
Then the page should load successfully
And no errors should appear in the console
Generated Playwright Spec
// Auto-generated by Resolue — incident inc_4821
import { test, expect } from '@playwright/test';
import { fixtures } from './resolue-checkout-inc4821.fixtures';
test.describe('Checkout handles TypeError correctly', () => {
// Scenario: TypeError in checkout.tsx is handled
// Given: a user is on the application, the id may not be present
// When: they submit a request to /api/checkout
// Then: no TypeError, no 500, graceful fallback
test('TypeError in checkout.tsx is handled', async ({ page }) => {
await page.goto('/checkout');
await expect(page).not.toHaveTitle(/error|500/i);
const errors: string[] = [];
page.on('pageerror', e => errors.push(e.message));
expect(errors.filter(
e => e.includes("Cannot read property 'id'")
)).toHaveLength(0);
});
// Scenario: Stripe failure handled gracefully
test('handles Stripe http error gracefully', async ({ page }) => {
// Mock Stripe to return 500
await page.route('https://api.stripe.com/v1/charges**', async route => {
await route.fulfill({
status: 500,
contentType: 'application/json',
body: JSON.stringify(fixtures.mocks['stripe']),
});
});
await page.goto('/checkout');
await expect(page.locator('body'))
.not.toContainText('Internal Server Error');
});
// Scenario: Happy path regression
test('normal flow still works after the fix', async ({ page }) => {
await page.goto('/checkout');
await expect(page).not.toHaveTitle(/error|500/i);
await expect(page.locator('body'))
.not.toContainText('Something went wrong');
});
});
Generated Fixtures
// Auto-generated by Resolue — incident inc_4821
export const fixtures = {
"incidentId": "inc_4821",
"error": {
"type": "TypeError",
"message": "Cannot read property 'id' of null",
"file": "checkout.tsx",
"line": 18
},
"failingRequest": {
"method": "POST",
"path": "/api/checkout",
"body": { "cartId": "cart_abc" },
"headers": { "authorization": "[REDACTED]" }
},
"mocks": {
"stripe": { "error": { "type": "api_error" } }
}
} as const;
Three Scenarios Per Bug
Resolue always generates at least three BDD scenarios for every fix:
| Scenario | What it tests | Why |
|---|---|---|
| 1. Error case | The exact code path that broke | Proves the fix works |
| 2. Dependency failure | External API fails gracefully | Proves resilience (if applicable) |
| 3. Happy path | Normal flow still works | Catches regressions from the fix |
Configuration
# resolue.yaml
testgen:
enabled: true
output_dir: tests/resolue # Where to put generated tests
runner: playwright # playwright | vitest | jest
generate_feature: true # Include .feature Gherkin files
generate_api_test: true # Include API-level tests
generate_fixtures: true # Include fixture data files
sanitize_headers: true # Redact auth headers in fixtures
How AI Writes the Tests
The test generator uses three inputs:
- Error context — what broke, what the user was doing, which APIs failed, the breadcrumb trail from Sentry/OTel
- Code diff — what the fix changed. The AI reads the diff to understand what edge case was unhandled and writes tests that target that specific code path
- Fixtures — the API mocks needed to reproduce the failure. These become the test's mock data
The AI doesn't write generic "page loads" tests. It writes targeted tests that exercise the exact failure mode — with the exact request payload, the exact API error, and the exact edge case data that triggered the bug in production.
Security
Generated test fixtures are automatically sanitized:
- Auth headers are replaced with
[REDACTED] - Real user data is never included — only the data shape (e.g., "3 cart items" not the actual cart contents)
- API keys in request bodies are stripped
- Fixture files are committed to your repo — review them in the PR diff before merging
CLI — resolue dev
Run Resolue locally during development. Auto-generate e2e tests for your code changes before you push — so you never write a Playwright test by hand again.
Install
npm install -D @resolue/auth
# or globally:
npm install -g @resolue/auth
Quick Start
resolue init
Creates resolue.yaml and the tests/resolue/ directory.
Add a feature, fix a bug, refactor — whatever you're working on. No test writing needed.
resolue test:gen
Resolue reads your git diff against main, analyzes every changed file, and generates BDD tests with Playwright implementations. Tests appear in tests/resolue/.
resolue test:run
# or directly:
npx playwright test tests/resolue/
Tests run against your local dev server. Review the generated tests, tweak if needed, commit with your PR.
Commands
| Command | Description |
|---|---|
resolue init | Initialize Resolue — creates resolue.yaml and test directory |
resolue dev | Watch mode — monitors file changes, press 'g' to generate tests |
resolue test:gen | Generate tests for current diff against base branch |
resolue test:run | Run all generated Resolue tests |
resolue test:ci | CI mode — generate tests + run + report (for GitHub Actions) |
Options
| Flag | Default | Description |
|---|---|---|
--base <branch> | main | Base branch for the diff |
--output <dir> | tests/resolue | Output directory for generated tests |
--dry | false | Preview generated files without writing them |
Watch Mode
Run resolue dev and it watches your source files. When you save a change, it tells you what changed and waits for your command:
$ resolue dev
─────────────────────────────────────────
❯❯ Resolue — Production Incident Autopilot
─────────────────────────────────────────
Watching: src, app
Save a file to see test suggestions.
Commands:
Press 'g' + Enter → generate tests for current diff
Press 'r' + Enter → run generated tests
Press 'q' + Enter → quit
Changed: api/checkout/route.ts
→ Run 'g' + Enter to generate tests for these changes
> g
Generating tests...
Generated 4 files (3 scenarios)
✓ tests/resolue/api-checkout-route.feature
✓ tests/resolue/api-checkout-route.spec.ts
✓ tests/resolue/api-checkout-route.api.spec.ts
✓ tests/resolue/api-checkout-route.fixtures.ts
What Gets Generated
Resolue analyzes each changed file and generates different test types based on what it is:
| File type | What Resolue generates |
|---|---|
API route app/api/*/route.ts | Per-method tests (GET/POST/PUT/DELETE), auth checks, validation tests, error handling |
React component *.tsx | Render test, interaction tests, null/error state handling, happy path |
Utility/lib lib/*.ts | Function-level tests for exported functions |
CI Integration
Add Resolue test generation to your GitHub Actions workflow so every PR gets auto-generated tests:
# .github/workflows/resolue-tests.yml
name: Resolue Tests
on: [pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0 # Full history for diff
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- name: Generate & run Resolue tests
run: npx resolue test:ci
env:
RESOLUE_AI_KEY: ${{ secrets.RESOLUE_AI_KEY }}
How It Differs from Production Fix Tests
| Production fix tests | CLI dev tests | |
|---|---|---|
| Trigger | Production error detected | Developer runs resolue test:gen |
| Input | Error context + Sentry breadcrumbs | Git diff against base branch |
| Focus | The specific bug that broke | All changed code paths |
| API mocks | Replays actual failing responses | Generates common failure patterns |
| Committed by | Resolue bot on fix PR | Developer on feature PR |
resolue.yaml
Configuration file reference. Place resolue.yaml in your repository root to control how Resolue operates on your project.
Full Example
# resolue.yaml — committed to your repo (no secrets here!)
version: 1
# AI model — api_key_env is the NAME of the env var, not the key
ai:
provider: anthropic
model: claude-sonnet-4
api_key_env: RESOLUE_AI_KEY # ← reads from $RESOLUE_AI_KEY at runtime
# Repository settings
repo:
base_branch: main
ignore_paths:
- node_modules/**
- dist/**
- .next/**
- *.test.ts
- *.spec.ts
# Branch strategy for production auto-fixes
branches:
prefix: fix/resolue- # Branch name: fix/resolue-{incident_id}
target: main # PR targets this branch
auto_delete: true # Delete branch after merge
# Confidence thresholds
confidence:
min_to_open_pr: 70 # Below this → diagnostic report only
draft_pr_threshold: 50 # 50–69 → draft PR, 70+ → ready PR
min_to_auto_merge: 101 # 101 = never auto-merge (safest default)
require_video: true
# Verification
verify:
playwright: true
smoke_checks: true # Auto-generate if no Playwright config
timeout: 180
# Test generation
testgen:
enabled: true
output_dir: tests/resolue
runner: playwright
generate_feature: true # BDD .feature files
generate_api_test: true
generate_fixtures: true
# Notifications
notify:
slack_channel: #incidents
on_pr_opened: true
on_fix_failed: true
api_key_env to reference environment variable names. The actual keys go in Vercel Env Vars, GitHub Secrets, or your secrets manager.Field Reference
ai
| Field | Type | Default | Description |
|---|---|---|---|
provider | string | anthropic | AI provider: anthropic, openai, bedrock, azure, custom |
model | string | claude-sonnet-4 | Model identifier |
api_key_env | string | — | Name of the env var holding the API key (NOT the key itself) |
endpoint | string | — | Custom endpoint URL (for self-hosted) |
timeout | number | 60 | AI request timeout in seconds |
repo
| Field | Type | Default | Description |
|---|---|---|---|
base_branch | string | main | Default branch for diffing and PR targets |
ignore_paths | string[] | [] | Glob patterns to exclude from analysis and test generation |
branches
Controls how Resolue creates branches for production auto-fix PRs. Does not apply to CLI test generation (which works on your current branch).
| Field | Type | Default | Description |
|---|---|---|---|
prefix | string | fix/resolue- | Branch name prefix. Full name: {prefix}{incident_id} |
target | string | main | Branch the fix PR targets |
auto_delete | boolean | true | Delete fix branch after PR is merged |
resolue test:gen locally or in CI, tests are generated on your current branch — Resolue never creates a new branch for developer-triggered test generation.confidence
| Field | Type | Default | Description |
|---|---|---|---|
min_to_open_pr | number | 70 | Minimum confidence score to open a PR |
min_to_auto_merge | number | 101 | Auto-merge threshold (101 = disabled) |
require_video | boolean | true | Require video proof in every PR |
Integrations
Per-integration setup guides for each tool in the Resolue pipeline.
Vercel
What Resolue uses: Log Drain for runtime error streaming, preview deployments for fix verification.
In the Resolue dashboard, click Connect Vercel. Select your team and project.
Resolue configures a Log Drain on your project. All runtime errors stream in real-time.
Every fix branch triggers a Vercel preview deployment. Resolue runs verification against this URL.
Sentry
What Resolue uses: Exception webhooks, stack traces, breadcrumbs, user impact data.
Click Connect Sentry in the dashboard. Select your Sentry project.
Resolue installs webhooks for issue.created, event.alert, and regression.detected.
GitHub
What Resolue uses: Code read access for diagnosis, PR write access for fix delivery.
Go to github.com/apps/resolue and install on your organization.
Choose specific repos or grant access to all.
Playwright
What Resolue uses: Test suite execution against preview, video recording.
playwright.config.ts in your repo. If found, your full test suite runs against the preview. If not, Resolue generates smart smoke checks.OpenTelemetry
What Resolue uses: Distributed traces, metrics, and logs from any OTel-compatible source.
# In your OTel Collector config, add Resolue as an exporter:
exporters:
otlphttp:
endpoint: https://ingest.resolue.ai/v1
headers:
Authorization: Bearer ${RESOLUE_INGEST_KEY}
service:
pipelines:
traces:
exporters: [otlphttp, your-existing-exporter]
Works with HyperDX, Grafana, Jaeger, SigNoz, Honeycomb, and any OTLP exporter.
Security
How Resolue protects your code, credentials, and production environment.
Threat Model
Attacker sends forged X-Resolue-Verify header
Blocked by: HMAC-SHA256 signature validation. Without the shared secret (256-bit keyspace), the attacker cannot produce a valid signature.
Attacker intercepts a valid token and replays it
Mitigated by: 5-minute token expiry. Each token also contains a unique run ID that can be monitored for duplicates.
Attacker gains access to RESOLUE_SECRET
Impact: The attacker could forge tokens to access preview deployments (never production) as the test user (never admin, unless misconfigured). Mitigation: Rotate the secret immediately in the Resolue dashboard.
Middleware accidentally deployed to production
Blocked by: Hardcoded environment check. The middleware is a complete no-op when NODE_ENV=production or VERCEL_ENV=production. This cannot be overridden by configuration.
Token Format
base64({ ts, rid, iid, v }).hmac_sha256_hex(secret)
| Field | Description |
|---|---|
ts | Unix timestamp (seconds) — checked against 5-min TTL |
rid | Verification run ID — for audit trailing |
iid | Incident ID being verified |
v | Token version (currently 1) |
What Resolue Never Accesses
- Your real user passwords or credentials
- Your session tokens or JWTs
- Your OAuth tokens
- Your database credentials or connection strings
- Your
.envfiles (onlyRESOLUE_SECRETis shared)
Audit Logging
resolueAuth({
onVerify: (info) => {
logger.info('Resolue verification', {
runId: info.runId,
incidentId: info.incidentId,
timestamp: info.timestamp,
});
}
});
Self-Hosted
Deploy Resolue on your own infrastructure for full data sovereignty. Your code never leaves your network.
Overview
Self-hosted Resolue runs inside your infrastructure — VPC, Kubernetes, or on-premise. It connects to your internal GitHub Enterprise, error tracking, and deploy pipeline. Same functionality as the cloud version, fully air-gapped.
What's included
- Full Resolue engine — diagnosis, fix generation, verification, PR creation
- Browser verification — runs in isolated containers within your network
- Pluggable AI backend — use any OpenAI-compatible endpoint (vLLM, Ollama, AWS Bedrock, Azure OpenAI, or your own model server)
- Dashboard — same dashboard, hosted on your domain
Deployment options
| Method | Best for |
|---|---|
| Docker Compose | Small teams, dev environments |
| Helm Chart | Kubernetes clusters |
| On-premise | Enterprise with strict compliance requirements |
API Reference
Webhooks, REST endpoints, and event types for integrating Resolue into your workflow programmatically.
Webhook Events
Configure a webhook URL in the Resolue dashboard to receive events:
| Event | Trigger | Payload includes |
|---|---|---|
incident.detected | New production error detected | error, affected_users, source, signals |
incident.diagnosed | Root cause identified | root_cause, file, function, commit |
fix.generated | Patch created and pushed | branch, diff, files_changed |
fix.verified | Playwright verification complete | tests_passed, video_url, confidence |
pr.opened | Fix PR opened on GitHub | pr_url, pr_number, evidence |
pr.merged | Fix PR merged by user | pr_url, merged_by, time_to_merge |
fix.failed | Fix attempt failed at any stage | stage, error, incident_id |
Webhook Payload Example
{
"event": "pr.opened",
"timestamp": "2026-03-29T14:22:00Z",
"incident_id": "inc_4821",
"data": {
"pr_url": "https://github.com/acme/web-app/pull/248",
"pr_number": 248,
"confidence": 94,
"video_url": "https://resolue.ai/v/run_abc123",
"files_changed": ["src/checkout.tsx"],
"lines_changed": 3,
"tests_passed": 47,
"tests_total": 47,
"regressions": 0
}
}
REST API
List incidents
GET /api/v1/incidents
Authorization: Bearer {api_key}
Get incident detail
GET /api/v1/incidents/{incident_id}
Retry a failed fix
POST /api/v1/incidents/{incident_id}/retry
Trigger manual scan
POST /api/v1/scan
{
"repo": "acme/web-app",
"error_url": "https://sentry.io/issues/4821"
}
Authentication
All API requests require a Bearer token. Generate one in the Resolue dashboard under Settings → API Keys.
curl -H "Authorization: Bearer rsl_live_abc123..." \
https://api.resolue.ai/v1/incidents