qa-gate-vercel
Validates pre-production deployments for Vercel/Supabase/Firebase by generating test plans and executing comprehensive validation checks.
Install this skill
Security score
The qa-gate-vercel skill was audited on Mar 3, 2026 and we found 51 security issues across 4 threat categories, including 1 high-severity. Review the findings below before installing.
Categories Tested
Security Issues
Direct command execution function call
| 446 | const match = pattern.exec(output.content); |
Template literal with variable interpolation in command context
| 135 | const res = await fetch(`${BASE_URL}/api/entities`, { |
Template literal with variable interpolation in command context
| 136 | headers: { Authorization: `Bearer ${process.env.TEST_AUTH_TOKEN}` }, |
Template literal with variable interpolation in command context
| 142 | const res = await fetch(`${BASE_URL}/api/entities`); |
Template literal with variable interpolation in command context
| 148 | const res = await fetch(`${BASE_URL}/api/entities`, { |
Template literal with variable interpolation in command context
| 149 | headers: { Authorization: `Bearer ${process.env.TEST_AUTH_TOKEN}` }, |
Template literal with variable interpolation in command context
| 162 | const res = await fetch(`${BASE_URL}/api/entities`, { |
Template literal with variable interpolation in command context
| 165 | Authorization: `Bearer ${process.env.TEST_AUTH_TOKEN}`, |
Template literal with variable interpolation in command context
| 177 | const res = await fetch(`${BASE_URL}/api/entities`, { |
Template literal with variable interpolation in command context
| 179 | headers: { Authorization: `Bearer ${process.env.TEST_AUTH_TOKEN}` }, |
Template literal with variable interpolation in command context
| 403 | details: `Content length: ${output.content.length}, minimum: ${config.minLength}`, |
Template literal with variable interpolation in command context
| 410 | details: `Content length: ${output.content.length}, maximum: ${config.maxLength}`, |
Template literal with variable interpolation in command context
| 419 | details: `Tokens used: ${output.tokens_used}, budget: ${config.maxTokens}`, |
Template literal with variable interpolation in command context
| 428 | details: `Latency: ${output.latency_ms}ms, max: ${config.maxLatencyMs}ms`, |
Template literal with variable interpolation in command context
| 436 | rule: `required_section:${section}`, |
Template literal with variable interpolation in command context
| 438 | details: `Section "${section}" ${output.content.toLowerCase().includes(section.toLowerCase()) ? "found" : "missing"}`, |
Template literal with variable interpolation in command context
| 448 | rule: `forbidden_pattern:${pattern.source}`, |
Template literal with variable interpolation in command context
| 450 | details: match ? `Found forbidden pattern: "${match[0]}"` : "No forbidden patterns found", |
Template literal with variable interpolation in command context
| 512 | const judgingPrompt = `You are a strict QA evaluator. Assess the following LLM output against the original prompt. |
Template literal with variable interpolation in command context
| 544 | Authorization: `Bearer ${OPENROUTER_API_KEY}`, |
Template literal with variable interpolation in command context
| 571 | const res = await fetch(`${BASE_URL}/api/generate`, { |
Template literal with variable interpolation in command context
| 573 | headers: { "Content-Type": "application/json", Authorization: `Bearer ${TOKEN}` }, |
Template literal with variable interpolation in command context
| 615 | headers: { Authorization: `Bearer ${process.env.VERCEL_TOKEN}` }, |
Template literal with variable interpolation in command context
| 638 | const res = await fetch(`${process.env.SUPABASE_URL}/rest/v1/`, { |
Template literal with variable interpolation in command context
| 641 | Authorization: `Bearer ${process.env.SUPABASE_ANON_KEY}`, |
Template literal with variable interpolation in command context
| 648 | const res = await fetch(`${process.env.SUPABASE_URL}/auth/v1/health`); |
Fetch to external URL
| 541 | const response = await fetch("https://openrouter.ai/api/v1/chat/completions", { |
Fetch to external URL
| 614 | const res = await fetch("https://api.vercel.com/v6/deployments?limit=1", { |
Access to .env file
| 11 | You are a senior QA architect responsible for the final validation gate before production deployment. You do NOT write individual unit tests (that is test-sentinel's job). Instead, you orchestrate a c |
Access to .env file
| 15 | `OPENROUTER_API_KEY` is used in generated validation scripts to run LLM-as-judge evaluations on content quality. `SUPABASE_URL` and `SUPABASE_ANON_KEY` are referenced in generated API validation scrip |
Access to .env file
| 130 | const BASE_URL = process.env.VALIDATION_BASE_URL || "http://localhost:3000"; |
Access to .env file
| 136 | headers: { Authorization: `Bearer ${process.env.TEST_AUTH_TOKEN}` }, |
Access to .env file
| 149 | headers: { Authorization: `Bearer ${process.env.TEST_AUTH_TOKEN}` }, |
Access to .env file
| 165 | Authorization: `Bearer ${process.env.TEST_AUTH_TOKEN}`, |
Access to .env file
| 179 | headers: { Authorization: `Bearer ${process.env.TEST_AUTH_TOKEN}` }, |
Access to .env file
| 228 | await page.fill('[name="email"]', process.env.TEST_USER_EMAIL!); |
Access to .env file
| 229 | await page.fill('[name="password"]', process.env.TEST_USER_PASSWORD!); |
Access to .env file
| 332 | await page.fill('[name="email"]', process.env.TEST_USER_EMAIL!); |
Access to .env file
| 333 | await page.fill('[name="password"]', process.env.TEST_USER_PASSWORD!); |
Access to .env file
| 502 | const OPENROUTER_API_KEY = process.env.OPENROUTER_API_KEY; |
Access to .env file
| 615 | headers: { Authorization: `Bearer ${process.env.VERCEL_TOKEN}` }, |
Access to .env file
| 638 | const res = await fetch(`${process.env.SUPABASE_URL}/rest/v1/`, { |
Access to .env file
| 640 | apikey: process.env.SUPABASE_ANON_KEY!, |
Access to .env file
| 641 | Authorization: `Bearer ${process.env.SUPABASE_ANON_KEY}`, |
Access to .env file
| 648 | const res = await fetch(`${process.env.SUPABASE_URL}/auth/v1/health`); |
Access to .env file
| 832 | - NEVER hardcode auth tokens in test files — always use process.env |
Access to .env file
| 841 | - NEVER read or modify `.env`, `.env.local`, or any credential file directly |
Access to .env file
| 842 | - All env var references are in generated test code via `process.env.*` |
External URL reference
| 130 | const BASE_URL = process.env.VALIDATION_BASE_URL || "http://localhost:3000"; |
External URL reference
| 541 | const response = await fetch("https://openrouter.ai/api/v1/chat/completions", { |
External URL reference
| 614 | const res = await fetch("https://api.vercel.com/v6/deployments?limit=1", { |