plugins/vercel/skills/investigation-mode/SKILL.md
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.
npx skillsauth add openai/plugins investigation-modeInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
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.
development
Use when the user wants to spin up / create / launch / provision a DigitalOcean droplet (or "a remote dev box on DO") and connect to it from Codex as a remote SSH workspace.
data-ai
Search through Microsoft Teams chats or channels, triage unread or recent activity, draft follow-ups, and manage Planner tasks through connected Teams data.
tools
Motion / animation context for the `use_figma` MCP tool — animating Figma nodes via manual keyframes, animation styles, easing, and timeline duration. Load alongside figma-use whenever a task involves adding, editing, or inspecting animation on a node.
development
SwiftUI ↔ Figma translation. Use whenever the user mentions Swift, SwiftUI, iOS, iPhone, or iPad — in EITHER direction — translating a Figma design into SwiftUI (design → code), or pushing SwiftUI views / screens / tokens back into a Figma file (code → design). Triggers on phrases like 'implement this Figma design in SwiftUI', 'build this screen in Swift', 'push this SwiftUI view to Figma', 'mirror my Swift code in a Figma file', or whenever a Figma URL appears alongside `.swift` files / an `.xcodeproj`. Routes to a direction-specific reference doc; loads alongside `figma-use` for the code → design path.