Orchestrated debugging coordinator. Triggers on frustration signals (stuck, hung, broken, waiting) and systematically triages: runtime logs → workflow status → browser verify → deploy/env. Reports findings at every step.
73
91%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
View guide
Passed
No findings from the security scan
When a user reports something stuck, hung, broken, or not responding, you are the diagnostic coordinator. Do not guess. Follow the triage order, report what you find at every step, and stop when you have a high-confidence root cause.
Every investigation step MUST follow this pattern:
Never silently move between steps. The user is already frustrated — silence makes it worse.
Work through these in order. Stop as soon as you find the root cause.
vercel logs --follow (production) or vercel logs <deployment-url>Tell the user: "Checking runtime logs…" → share what you found → explain next step.
If the app uses workflows, queues, or cron jobs:
vercel workflow runs list to check recent run statusesrunning state — likely a missing await or unresolved promisevercel workflow runs get <run-id>Tell the user: "Checking workflow run status…" → share the run state → explain next step.
Use agent-browser to visually verify what the user sees:
Tell the user: "Taking a browser screenshot to see the current state…" → share the screenshot → explain what you see.
vercel inspect <deployment-url> — check build output, function regions, environmentvercel ls — verify the latest deployment succeededTell the user: "Checking deployment status…" → share the deployment state → explain findings.
Stop investigating when:
Do not keep cycling through steps hoping something appears. If logs are empty and workflows look fine, say so and ask the user what they expected to happen.
When logs point to code issues, check for these frequent culprits:
await: Async functions called without await cause silent failureswhile(true) without break conditions, recursive calls without base casesnew Promise() that never calls resolve() or reject()process.env.X returning undefined causing silent auth/DB failuresnext() or returns a responsevercel.json maxDuration)If the investigation reveals insufficient observability, add structured logging immediately — you cannot debug what you cannot see.
// API routes — wrap handlers with try/catch + logging
export async function POST(request: Request) {
console.log('[api/route] incoming request', { method: 'POST', url: request.url });
try {
const result = await doWork();
console.log('[api/route] success', { resultId: result.id });
return Response.json(result);
} catch (error) {
console.error('[api/route] failed', { error: String(error), stack: (error as Error).stack });
return Response.json({ error: 'Internal error' }, { status: 500 });
}
}// Workflow steps — log entry/exit of every step
const result = await step.run('process-data', async () => {
console.log('[workflow:process-data] step started');
const data = await fetchData();
console.log('[workflow:process-data] step completed', { count: data.length });
return data;
});Key principle: Every async boundary, every external call, every step entry/exit should have a log line. When something hangs, the last log line tells you exactly where it stopped.
Cross-reference: For comprehensive logging setup (OpenTelemetry, log drains, Sentry, Vercel Analytics), see the observability skill. For workflow-specific debugging, see the workflow skill.
d416fd5
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.