Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when analyzing an existing TypeScript or JavaScript codebase to decide where and how to introduce Inngest. Covers repository discovery, framework and package detection, finding durability gaps in HTTP handlers, webhooks, cron jobs, queues, long-running jobs, AI agents, polling loops, and side-effect-heavy code, then producing and implementing an incremental integration plan.
.claude/skills/asymmetric-al-inngest-brownfield-audit/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-08 | ✗→✓ | ▲ Improved | 69% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 92% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 208% | 0% |
| case-09 | ✗→✓ | ▲ Improved | 108% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 89% | 0% |
Use this skill when the user asks Codex to inspect an existing codebase, add Inngest "where it makes sense", migrate fragile background work, or find durability gaps before making changes.
This is an agent-first workflow. Do the audit from evidence in the repo, name the specific files and call sites that drove each conclusion, and make small integration moves that preserve current behavior.
Use this skill for requests like:
If the user is starting from scratch instead of a brownfield repo, use inngest-setup, inngest-durable-functions, inngest-events, inngest-steps, and, for AI workflows, the agent patterns in this skill.
package.json, workspace files, app/router structure, server entrypoints, deployment config, and test scripts.
Hono, Fastify, Remix, SvelteKit, Astro, NestJS, worker-only service, or other.
inngest, createFunction, serve(, /api/inngest,INNGEST_, step.run, step.sleep, step.waitForEvent, step.sendEvent, step.invoke, step.ai, inngest.send, and @inngest/realtime.
registered functions, event naming, env vars, and v3/v4 API shape before changing anything.
void someAsync(), un-awaited promises,.then( chains, setTimeout, setInterval, detached jobs after HTTP response, and background work in route handlers.
cron, node-cron, agenda, bull,bullmq, bee-queue, qstash, sqs, temporal, trigger.dev, deployment cron config, and scheduled API routes.
Slack, Shopify, HubSpot, Linear, Svix, and generic webhook.
processing, embeddings, bulk email, imports, ETL, sync jobs, polling loops, retries, and external API calls.
human approval, multi-step reasoning, vector search, eval loops, and provider calls that need rate limits or retry-safe state.
webhook, or crash-prone workflow.
noisy 429s, or poor observability.
idempotency key, failure mode, recommended Inngest primitive, migration size, and confidence.
step.run one boundary at a time.Run commands that fit the repo. Prefer rg; keep output focused.
bashrg -n "inngest|createFunction|step\\.|serve\\(|/api/inngest|INNGEST_" . rg -n "setTimeout|setInterval|Promise\\.all|void [a-zA-Z0-9_]+\\(|\\.then\\(" . rg -n "cron|node-cron|schedule|bull|bullmq|bee-queue|agenda|qstash|sqs" . rg -n "webhook|stripe|svix|clerk|github|shopify|slack|hubspot|linear" . rg -n "retry|backoff|poll|status|timeout|429|rate limit|rate-limit" . rg -n "openai|anthropic|ai\\.|generateText|streamText|tool|agent|embedding" .
When the repo is large, narrow searches to app source directories and exclude generated/vendor folders.
| Existing shape | Inngest fit | Primary primitives | | ----------------------------------------------------- | --------------------------------------- | -------------------------------------------------- | | HTTP handler does slow side effects before responding | Emit event, return fast | inngest.send, event trigger, step.run | | Webhook must acknowledge quickly but process reliably | Verify signature, emit idempotent event | Event ID, step.run, retries | | Cron job loses progress midway | Cron-triggered durable function | Cron trigger, page-level step.run, flow control | | Polling loop waits for external async work | Durable wait or durable poll | step.waitForEvent, step.sleep, step.run | | Large fan-out exceeds request/serverless limits | Split orchestration and item work | step.sendEvent, per-item function, concurrency | | External API hits 429s | Move limits to function config | throttle, rateLimit, concurrency | | Human review can take days | Persist the wait in Inngest | step.waitForEvent, timeout, realtime | | AI agent/tool loop needs retry-safe progress | One step per tool/model boundary | step.ai, step.run, step.sleep, realtime | | Existing queue only hides fragile work | Replace queue boundary gradually | Event trigger, idempotency, function-level retries |
Before editing, summarize findings in this compact shape:
textInngest audit: - Existing Inngest: none / partial / healthy / risky - Framework: <framework and evidence> - Best first slice: <file + workflow> - Why: <loss/timeout/retry/idempotency failure> - Proposed primitives: <event, steps, flow control, waits, realtime> - Idempotency key: <source of truth> - Files likely touched: <short list> - Tests/checks: <commands or focused cases>
Then implement unless the user asked for audit-only.
If Inngest is already present, verify:
id is a stable slug and is not derived from deploy-specific data.INNGEST_DEV=1; production usesINNGEST_SIGNING_KEY.
/api/inngest.domain/noun.verb.inngest/realtime, not the v3@inngest/realtime package.
Use Inngest when an AI or agent workflow needs durable progress across model calls, tool calls, waits, approvals, or streaming UI updates.
Good candidates:
Recommended shape:
id.
step.run.its own step.ai or step.run boundary.
step.waitForEvent or step.waitForSignal with a timeout.step.realtime.publish between steps, orinngest.realtime.publish inside an existing step.run.
concurrency, throttle, or rateLimit, notad hoc in-process throttlers.
Avoid:
memoized.
setTimeout or a cron poller for follow-ups and approvals.itself is durable elsewhere.
behavior with a thin Inngest slice.
them.
outside steps in the new function.
side effects.
endpoint and run available type/tests.
Pick checks that prove the integration path:
calls the same domain operations in step boundaries" where the repo supports it.
the function syncs, then send a sample event.
not verified.
These upstream Inngest instructions are vendored for agent tooling and integration work in this monorepo.
Use this skill when inngest-brownfield-audit matches the current Inngest task. If the right skill is unclear, start with docs/ai/skills/inngest/SKILL.md.
integration.
inngest-brownfield-audit before changing existing app workflows orfragile background work.
AGENTS.md, reporulebooks, framework docs, and runtime evidence.
INNGEST_* envrequirements out of agent-tooling-only changes.
or dependencies.
workflow behavior.
port.
docs/ai/skills/inngest/references/upstream.md.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-08 | fail→pass | 15,883 | 9,556 | -40% | 1 | 1 | 0% | 2,655 | 4,498 | +69% | 0 | 0 | — |
case-01 | fail→fail | 20,730 | 5,036 | -76% | 1 | 1 | 0% | 3,337 | 3,056 | -8% | 0 | 0 | — |
case-02 | fail→fail | 16,076 | 5,709 | -64% | 1 | 1 | 0% | 2,796 | 3,270 | +17% | 0 | 0 | — |
case-03 | fail→fail | 31,966 | 4,567 | -86% | 1 | 1 | 0% | 6,204 | 3,084 | -50% | 0 | 0 | — |
case-04 | pass→pass | 19,306 | 10,608 | -45% | 1 | 1 | 0% | 3,316 | 4,987 | +50% | 0 | 0 | — |
case-05 | fail→pass | 13,448 | 6,442 | -52% | 1 | 1 | 0% | 1,994 | 3,826 | +92% | 0 | 0 | — |
case-06 | pass→pass | 15,314 | 10,488 | -32% | 1 | 1 | 0% | 2,445 | 4,734 | +94% | 0 | 0 | — |
case-07 | fail→pass | 8,098 | 6,852 | -15% | 1 | 1 | 0% | 1,273 | 3,925 | +208% | 0 | 0 | — |
case-09 | fail→pass | 10,453 | 4,343 | -58% | 1 | 1 | 0% | 1,738 | 3,611 | +108% | 0 | 0 | — |
case-10 | pass→pass | 13,715 | 12,584 | -8% | 1 | 1 | 0% | 2,345 | 5,034 | +115% | 0 | 0 | — |
case-11 | pass→pass | 15,746 | 14,169 | -10% | 1 | 1 | 0% | 2,565 | 5,399 | +110% | 0 | 0 | — |
case-12 | fail→pass | 14,454 | 11,015 | -24% | 1 | 1 | 0% | 2,459 | 4,647 | +89% | 0 | 0 | — |
case-13 | pass→pass | 16,436 | 13,755 | -16% | 1 | 1 | 0% | 2,588 | 5,109 | +97% | 0 | 0 | — |
case-14 | fail→pass | 11,794 | 8,410 | -29% | 1 | 1 | 0% | 1,907 | 4,361 | +129% | 0 | 0 | — |
case-15 | pass→pass | 14,029 | 8,635 | -38% | 1 | 1 | 0% | 2,404 | 4,323 | +80% | 0 | 0 | — |
case-16 | pass→pass | 5,797 | 6,311 | +9% | 1 | 1 | 0% | 1,028 | 3,912 | +281% | 0 | 0 | — |
case-17 | pass→pass | 12,311 | 3,275 | -73% | 1 | 1 | 0% | 2,091 | 3,379 | +62% | 0 | 0 | — |
case-18 | pass→pass | 6,025 | 2,044 | -66% | 1 | 1 | 0% | 918 | 3,122 | +240% | 0 | 0 | — |
case-19 | pass→pass | 11,507 | 8,570 | -26% | 1 | 1 | 0% | 1,967 | 4,326 | +120% | 0 | 0 | — |
case-20 | pass→pass | 8,986 | 5,285 | -41% | 1 | 1 | 0% | 1,646 | 3,830 | +133% | 0 | 0 | — |
case-21 | pass→pass | 9,322 | 4,385 | -53% | 1 | 1 | 0% | 1,763 | 3,639 | +106% | 0 | 0 | — |
case-22 | pass→fail | 5,913 | 30,673 | +419% | 1 | 1 | 0% | 1,168 | 5,877 | +403% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +23 percentage points is the difference between those two pass rates over the 18 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.