Use when moving slow or failure-prone work out of a request path, designing job queues, retries, checkpoints, progress reporting, cancellation, or worker concurrency. Covers inline-vs-background decisions, queue contracts, state machines, idempotency, retry/backoff, progress signals, worker leases, and user-visible completion reporting. Do NOT use for time-based schedule design (use `cron-scheduling`), live browser transport choice (use `real-time-updates`), or async message schema ownership (use `event-contract-design`). Do NOT use for choose the cron expression for a daily run. Do NOT use for design an SSE or WebSocket browser update channel. Do NOT use for define an event envelope and topic naming standard. Do NOT use for debug why this already-running worker crashed. Do NOT use for model the database schema for the business entity being processed.
A background job system has five primitives: a producer records durable work, a queue orders and deduplicates it, a worker leases and executes it, a state store records progress and outcomes, and a notification path tells humans or systems what changed.
Coverage
Inline-vs-background execution decisions for web requests, API routes, workers, and serverless functions.
Queue and worker patterns: push queues, pull queues, leases, deduplication, priority, rate control, and concurrency limits.
Reliability patterns: idempotency keys, retry classification, exponential backoff with jitter, checkpoints, dead-letter handling, and partial failure recovery.
User-visible progress: stage names, percentages, timestamps, cancellation, completion notification, and stale status handling.
Verification: proving long work left the request path without losing observability or recovery paths.
Philosophy of the skill
Background jobs are not just "run this later." They are a reliability boundary between interactive work and processing work. A request handler is optimized for short, synchronous feedback. A worker is optimized for durable execution, retries, checkpoints, and controlled resource use.
The most common failure is moving code into a worker while keeping request-handler assumptions: no durable state, no idempotency, no progress, no cancellation, and no evidence of completion. That makes the system feel faster only until the first timeout, duplicate enqueue, or partial failure. A good job design makes the execution contract visible before choosing a queue product.
Execution Decision Gate
Use this gate before adding a queue. If any answer in the right column is true, design a background job instead of inline request work.
Question
Inline request is acceptable when
Background job is required when
Duration
Work predictably completes within a few seconds
Work can exceed the request budget or has unbounded input size
Failure shape
Failure is atomic and easy to show immediately
Failure can be partial, transient, or recoverable
User feedback
The caller needs the result before continuing
The caller can continue with progress or later completion
Retry safety
Retrying the request is harmless and visible
Retrying needs idempotency, checkpointing, or backoff
Resource use
Work uses normal request resources
Work may saturate CPU, memory, database connections, or external limits
Coordination
One request owns the whole operation
Many producers, workers, or duplicate triggers can touch the same work
Rule of thumb: if you need progress, checkpointing, retry classification, cancellation, concurrency control, or delayed completion, you are already designing a background job.
Job Contract
Every background job needs a durable contract. The exact storage can be a database row, queue message plus result table, workflow engine state, or object store record, but the same fields need clear ownership.
Field
Purpose
Failure if omitted
Job ID
Stable handle for status, logs, and support
Cannot find or correlate work after enqueue
Type
Routes to the correct handler
Workers need payload guessing or brittle branching
Use failed for terminal failure after retry policy is exhausted. Use cancelled only when the system intentionally stops work. Do not collapse retryable and terminal failures into one ambiguous error state.
Queue And Worker Patterns
Pattern
Use when
Watch out for
Database-backed queue
You need simple durability near app data and moderate volume
Polling cadence, lock contention, cleanup of old rows
Managed queue
You need high throughput, delayed retry, and dead-letter support
Message visibility timeouts and at-least-once delivery
Workflow engine
You need multi-step orchestration, step retries, or human-visible traces
Vendor lock-in and over-modeling simple jobs
In-process worker
You need low-latency local processing in a persistent service
Process restarts lose work unless the queue is durable
Fire-and-forget task
Work is non-critical and safe to lose
Most product work is not actually safe to lose
Lease-Based Pull Worker
Use a lease when workers pull from a shared store. The lease prevents two workers from processing the same job while still letting another worker recover abandoned work after the lease expires.
Background workers must assume at-least-once execution. A retry, duplicate enqueue, worker crash, or lease expiry can run the same logical job more than once.
Use an idempotency key that represents the logical work, not the physical attempt:
The worker should also make side effects idempotent. Deduplicating enqueue is helpful but not sufficient because messages can be delivered more than once.
Retry Classification
Not every failure deserves a retry.
Failure class
Retry?
Handling
Transient network or service unavailable
Yes
Exponential backoff with jitter
Rate limited
Yes
Respect retry-after signals when available
Validation error
No
Mark terminal failure and expose the fixable input issue
Missing permission
No
Mark terminal failure and request operator action
Partial progress
Yes
Resume from checkpoint instead of restarting
Unknown failure
Limited
Retry a small number of times, then dead-letter with context
Use jitter so a shared outage does not cause every worker to retry at the same moment:
Progress writes are product value only when they communicate meaningful change. Updating progress after every item in a large batch can overload the same database or cache the job is trying to use.
Use one of these gates:
Update every N items.
Update every T seconds.
Update when the stage changes.
Update at completion or terminal failure.
User-Facing Progress
The UI does not need internal worker details. It needs a stable status contract.
Duration
Progress contract
UX expectation
Under 5 seconds
Pending state only
Inline spinner or disabled action
5-30 seconds
Status plus short message
Progress bar or step label
30 seconds-5 minutes
Status, stage, count, and cancel option when safe
Dedicated progress panel or status row
Over 5 minutes
Durable status page plus completion signal
User can leave and return later
Avoid fake precision. If you do not know the denominator, report stages or processed counts instead of a misleading percentage.
Concurrency And Priority
Concurrency limits protect shared resources. Define at least one limit before shipping a worker:
Limit
Protects
Example
Global worker concurrency
CPU, memory, queue pressure
Max 10 running jobs total
Per-workspace concurrency
Fairness and duplicate work
Max 1 import per workspace
Per-job-type concurrency
Hot paths and external services
Max 3 report renders
Rate limit
External calls or expensive writes
Max 100 requests per minute
Priority should reorder queued work, not bypass safety. A high-priority job still needs idempotency, leases, and retry policy.
Observability
Background jobs need enough telemetry to answer four questions without reading code:
Was the job enqueued?
Did a worker claim it?
What progress or checkpoint was last committed?
Did it succeed, fail terminally, retry, or get cancelled?
Log job ID, type, attempt number, state transitions, duration, failure class, and queue latency. Emit metrics for queue depth, age of oldest queued job, success rate, retry rate, terminal failure rate, and worker saturation. Trace multi-step jobs when a single user action fans out into several worker operations.
Verification
After applying this skill, verify:
Long or unbounded work is outside the interactive request path.
Every enqueued job has a durable status that can be queried after refresh or worker restart.
The job contract includes idempotency, attempts, progress, result, and failure reason.
Backoff includes jitter or an equivalent herd-prevention mechanism.
Long jobs checkpoint the last committed unit of work.
Progress updates are throttled by item count, time, stage, or completion.
Worker concurrency is bounded globally and at any needed fairness boundary.
Terminal failure and cancellation are visible to users or operators.
Tests or manual probes cover duplicate enqueue, retry, resume, and terminal failure behavior.
Do NOT Use When
Use instead
When
cron-scheduling
You are choosing when recurring work starts, validating cron expressions, or preventing overlap in a scheduled trigger.
real-time-updates
You are choosing polling, Server-Sent Events, or WebSocket transport for browser freshness.
event-contract-design
You are defining async event envelopes, topic names, replay semantics, or producer/consumer compatibility.
observability-modeling
You are designing telemetry vocabulary across logs, metrics, traces, and alerts without changing job execution behavior.
debugging
A deployed worker or queue is already failing and needs root-cause investigation.
Anti-Patterns
Anti-pattern
Why it fails
Better pattern
Long work in a request handler
Timeouts and partial side effects are user-visible failures
Enqueue durable work and return a job ID
Fire-and-forget without a status record
No one can tell whether work ran, failed, or is still pending
Store job state and expose status
Retrying every failure
Validation and permission failures waste capacity and hide real action items
Classify failures before retrying
Restarting from zero after partial progress
Retries get slower and can duplicate side effects
Save checkpoints at committed boundaries
Unlimited workers
Shared resources get saturated during spikes
Bound concurrency and add leases
Progress update per item
Progress tracking becomes the bottleneck
Throttle progress writes
Queue code owns domain rules
Worker infrastructure becomes hard to test and reuse
Keep domain logic in services; workers orchestrate execution
Skill Graph context
Classification
Subject: backend-engineering
Public: true
Domain: engineering/async/background-jobs
Scope: Use when moving slow or failure-prone work out of a request path, designing job queues, retries, checkpoints, progress reporting, cancellation, or worker concurrency. Covers inline-vs-background decisions, queue contracts, state machines, idempotency, retry/backoff, progress signals, worker leases, and user-visible completion reporting. Do NOT use for time-based schedule design (use cron-scheduling), live browser transport choice (use real-time-updates), or async message schema ownership (use event-contract-design).
When to use
move this report generation out of the API handler and still show progress
design a queue-backed import job that can resume after failure
choose retry and dead-letter behavior for a worker
avoid duplicate processing when a job is enqueued twice
add cancellation and progress to a long-running export
Mental model: A background job system has five primitives: a producer records durable work, a queue orders and deduplicates it, a worker leases and executes it, a state store records progress and outcomes, and a notification path tells humans or systems what changed. Reliability comes from making each primitive explicit instead of hiding long work inside a request handler.
Purpose: Background jobs keep interactive requests short while preserving reliable processing for slow, retryable, or batch-oriented work. They replace timeout-prone inline execution and untracked fire-and-forget calls with durable state, resumable progress, controlled concurrency, and observable outcomes.
Boundary: This skill is not schedule design, browser push transport design, event schema design, or incident debugging. It begins after work has been requested and ends with execution state, retry, progress, completion, cancellation, and failure handling.
Analogy: A background job is a numbered work order in a shop: the front desk accepts the request, the workshop picks it up when capacity exists, and the status board shows where it is.
Common misconception: Putting work in a worker is not enough. Without durable state, idempotency, progress, retry policy, and observability, a background job is just an invisible request handler with a longer timeout.
Keywords
background jobs, job queue, worker queue, async processing, long-running task, retry backoff, dead letter queue, checkpointing, worker concurrency, idempotent job
1---2name: background-jobs3description: Use when moving slow or failure-prone work out of a request path, designing job queues, retries, checkpoints, progress reporting, cancellation, or worker concurrency. Covers inline-vs-background decisions, queue contracts, state machines, idempotency, retry/backoff, progress signals, worker leases, and user-visible completion reporting. Do NOT use for time-based schedule design (use `cron-scheduling`), live browser transport choice (use `real-time-updates`), or async message schema ownership (use `event-contract-design`). Do NOT use for choose the cron expression for a daily run. Do NOT use for design an SSE or WebSocket browser update channel. Do NOT use for define an event envelope and topic naming standard. Do NOT use for debug why this already-running worker crashed. Do NOT use for model the database schema for the business entity being processed.4license: MIT5---6# Background Jobs78## Concept of the skill910A background job system has five primitives: a producer records durable work, a queue orders and deduplicates it, a worker leases and executes it, a state store records progress and outcomes, and a notification path tells humans or systems what changed.1112## Coverage1314- Inline-vs-background execution decisions for web requests, API routes, workers, and serverless functions.15- Durable job contracts: job identity, payload, state, priority, ownership, attempts, progress, result, and failure record.16- Queue and worker patterns: push queues, pull queues, leases, deduplication, priority, rate control, and concurrency limits.17- Reliability patterns: idempotency keys, retry classification, exponential backoff with jitter, checkpoints, dead-letter handling, and partial failure recovery.18- User-visible progress: stage names, percentages, timestamps, cancellation, completion notification, and stale status handling.19- Verification: proving long work left the request path without losing observability or recovery paths.2021## Philosophy of the skill22Background jobs are not just "run this later." They are a reliability boundary between interactive work and processing work. A request handler is optimized for short, synchronous feedback. A worker is optimized for durable execution, retries, checkpoints, and controlled resource use.2324The most common failure is moving code into a worker while keeping request-handler assumptions: no durable state, no idempotency, no progress, no cancellation, and no evidence of completion. That makes the system feel faster only until the first timeout, duplicate enqueue, or partial failure. A good job design makes the execution contract visible before choosing a queue product.2526## Execution Decision Gate2728Use this gate before adding a queue. If any answer in the right column is true, design a background job instead of inline request work.2930| Question | Inline request is acceptable when | Background job is required when |31|---|---|---|32| Duration | Work predictably completes within a few seconds | Work can exceed the request budget or has unbounded input size |33| Failure shape | Failure is atomic and easy to show immediately | Failure can be partial, transient, or recoverable |34| User feedback | The caller needs the result before continuing | The caller can continue with progress or later completion |35| Retry safety | Retrying the request is harmless and visible | Retrying needs idempotency, checkpointing, or backoff |36| Resource use | Work uses normal request resources | Work may saturate CPU, memory, database connections, or external limits |37| Coordination | One request owns the whole operation | Many producers, workers, or duplicate triggers can touch the same work |3839**Rule of thumb:** if you need progress, checkpointing, retry classification, cancellation, concurrency control, or delayed completion, you are already designing a background job.4041## Job Contract4243Every background job needs a durable contract. The exact storage can be a database row, queue message plus result table, workflow engine state, or object store record, but the same fields need clear ownership.4445| Field | Purpose | Failure if omitted |46|---|---|---|47| Job ID | Stable handle for status, logs, and support | Cannot find or correlate work after enqueue |48| Type | Routes to the correct handler | Workers need payload guessing or brittle branching |49| Payload | Immutable input to the handler | Retries run against changing state by accident |50| Idempotency key | Deduplicates repeated enqueue attempts | Duplicate processing and double side effects |51| Status | Communicates lifecycle state | Work disappears into a black box |52| Attempts and max attempts | Controls retry lifecycle | Infinite retry loops or premature dead-lettering |53| Progress | Shows percentage, count, stage, or checkpoint | Humans see a spinner with no useful signal |54| Result | Records output or pointer to output | Completion cannot be consumed reliably |55| Failure reason | Records actionable failure class | Operators see failed without knowing why |56| Lease or lock | Ensures one worker owns an active job | Two workers process the same job concurrently |5758### State Machine5960Keep states few and explicit:6162```text63queued -> running -> succeeded64 -> retry_waiting -> running65 -> failed66 -> cancelled67```6869Use `failed` for terminal failure after retry policy is exhausted. Use `cancelled` only when the system intentionally stops work. Do not collapse retryable and terminal failures into one ambiguous error state.7071## Queue And Worker Patterns7273| Pattern | Use when | Watch out for |74|---|---|---|75| Database-backed queue | You need simple durability near app data and moderate volume | Polling cadence, lock contention, cleanup of old rows |76| Managed queue | You need high throughput, delayed retry, and dead-letter support | Message visibility timeouts and at-least-once delivery |77| Workflow engine | You need multi-step orchestration, step retries, or human-visible traces | Vendor lock-in and over-modeling simple jobs |78| In-process worker | You need low-latency local processing in a persistent service | Process restarts lose work unless the queue is durable |79| Fire-and-forget task | Work is non-critical and safe to lose | Most product work is not actually safe to lose |8081### Lease-Based Pull Worker8283Use a lease when workers pull from a shared store. The lease prevents two workers from processing the same job while still letting another worker recover abandoned work after the lease expires.8485```typescript86async function claimNextJob(workerId: string) {87 return updateOneJob(88 {89 status: "queued",90 runAfter: { lte: new Date() },91 },92 {93 status: "running",94 leaseOwner: workerId,95 leaseExpiresAt: new Date(Date.now() + 5 * 60 * 1000),96 startedAt: new Date(),97 },98 { sort: { priority: 1, createdAt: 1 } },99 );100}101```102103## Reliability Patterns104105### Idempotency106107Background workers must assume at-least-once execution. A retry, duplicate enqueue, worker crash, or lease expiry can run the same logical job more than once.108109Use an idempotency key that represents the logical work, not the physical attempt:110111```typescript112const idempotencyKey = `report:${workspaceId}:${periodStart}:${periodEnd}`;113114await enqueueJob({115 type: "report.generate",116 idempotencyKey,117 payload: { workspaceId, periodStart, periodEnd },118});119```120121The worker should also make side effects idempotent. Deduplicating enqueue is helpful but not sufficient because messages can be delivered more than once.122123### Retry Classification124125Not every failure deserves a retry.126127| Failure class | Retry? | Handling |128|---|---|---|129| Transient network or service unavailable | Yes | Exponential backoff with jitter |130| Rate limited | Yes | Respect retry-after signals when available |131| Validation error | No | Mark terminal failure and expose the fixable input issue |132| Missing permission | No | Mark terminal failure and request operator action |133| Partial progress | Yes | Resume from checkpoint instead of restarting |134| Unknown failure | Limited | Retry a small number of times, then dead-letter with context |135136Use jitter so a shared outage does not cause every worker to retry at the same moment:137138```typescript139function retryDelayMs(attempt: number) {140 const base = 1000;141 const cap = 5 * 60 * 1000;142 const exponential = Math.min(base * 2 ** attempt, cap);143 const jitter = Math.floor(Math.random() * base);144 return exponential + jitter;145}146```147148### Checkpointing149150Long jobs need resumable checkpoints. A checkpoint should identify the last committed unit of work, not just a percentage.151152```typescript153async function processPages(jobId: string) {154 let cursor = await loadCheckpoint(jobId);155156 while (true) {157 const page = await fetchNextPage(cursor);158 if (page.items.length === 0) break;159160 await processBatch(page.items);161 cursor = page.nextCursor;162 await saveCheckpoint(jobId, cursor);163 await updateProgress(jobId, { stage: "processing", processed: page.totalProcessed });164 }165}166```167168### Progress Throttling169170Progress writes are product value only when they communicate meaningful change. Updating progress after every item in a large batch can overload the same database or cache the job is trying to use.171172Use one of these gates:173174- Update every N items.175- Update every T seconds.176- Update when the stage changes.177- Update at completion or terminal failure.178179## User-Facing Progress180181The UI does not need internal worker details. It needs a stable status contract.182183| Duration | Progress contract | UX expectation |184|---|---|---|185| Under 5 seconds | Pending state only | Inline spinner or disabled action |186| 5-30 seconds | Status plus short message | Progress bar or step label |187| 30 seconds-5 minutes | Status, stage, count, and cancel option when safe | Dedicated progress panel or status row |188| Over 5 minutes | Durable status page plus completion signal | User can leave and return later |189190Avoid fake precision. If you do not know the denominator, report stages or processed counts instead of a misleading percentage.191192## Concurrency And Priority193194Concurrency limits protect shared resources. Define at least one limit before shipping a worker:195196| Limit | Protects | Example |197|---|---|---|198| Global worker concurrency | CPU, memory, queue pressure | Max 10 running jobs total |199| Per-workspace concurrency | Fairness and duplicate work | Max 1 import per workspace |200| Per-job-type concurrency | Hot paths and external services | Max 3 report renders |201| Rate limit | External calls or expensive writes | Max 100 requests per minute |202203Priority should reorder queued work, not bypass safety. A high-priority job still needs idempotency, leases, and retry policy.204205## Observability206207Background jobs need enough telemetry to answer four questions without reading code:208209- Was the job enqueued?210- Did a worker claim it?211- What progress or checkpoint was last committed?212- Did it succeed, fail terminally, retry, or get cancelled?213214Log job ID, type, attempt number, state transitions, duration, failure class, and queue latency. Emit metrics for queue depth, age of oldest queued job, success rate, retry rate, terminal failure rate, and worker saturation. Trace multi-step jobs when a single user action fans out into several worker operations.215216## Verification217218After applying this skill, verify:219220- [ ] Long or unbounded work is outside the interactive request path.221- [ ] Every enqueued job has a durable status that can be queried after refresh or worker restart.222- [ ] The job contract includes idempotency, attempts, progress, result, and failure reason.223- [ ] Retry policy distinguishes transient, rate-limit, validation, permission, partial-progress, and unknown failures.224- [ ] Backoff includes jitter or an equivalent herd-prevention mechanism.225- [ ] Long jobs checkpoint the last committed unit of work.226- [ ] Progress updates are throttled by item count, time, stage, or completion.227- [ ] Worker concurrency is bounded globally and at any needed fairness boundary.228- [ ] Terminal failure and cancellation are visible to users or operators.229- [ ] Tests or manual probes cover duplicate enqueue, retry, resume, and terminal failure behavior.230231## Do NOT Use When232233| Use instead | When |234|---|---|235| `cron-scheduling` | You are choosing when recurring work starts, validating cron expressions, or preventing overlap in a scheduled trigger. |236| `real-time-updates` | You are choosing polling, Server-Sent Events, or WebSocket transport for browser freshness. |237| `event-contract-design` | You are defining async event envelopes, topic names, replay semantics, or producer/consumer compatibility. |238| `observability-modeling` | You are designing telemetry vocabulary across logs, metrics, traces, and alerts without changing job execution behavior. |239| `debugging` | A deployed worker or queue is already failing and needs root-cause investigation. |240241## Anti-Patterns242243| Anti-pattern | Why it fails | Better pattern |244|---|---|---|245| Long work in a request handler | Timeouts and partial side effects are user-visible failures | Enqueue durable work and return a job ID |246| Fire-and-forget without a status record | No one can tell whether work ran, failed, or is still pending | Store job state and expose status |247| Retrying every failure | Validation and permission failures waste capacity and hide real action items | Classify failures before retrying |248| Restarting from zero after partial progress | Retries get slower and can duplicate side effects | Save checkpoints at committed boundaries |249| Unlimited workers | Shared resources get saturated during spikes | Bound concurrency and add leases |250| Progress update per item | Progress tracking becomes the bottleneck | Throttle progress writes |251| Queue code owns domain rules | Worker infrastructure becomes hard to test and reuse | Keep domain logic in services; workers orchestrate execution |252253## Skill Graph context254255<!-- skill-graph-context:start (generated — do not edit by hand) -->256257**Classification**258- Subject: `backend-engineering`259- Public: `true`260- Domain: `engineering/async/background-jobs`261- Scope: Use when moving slow or failure-prone work out of a request path, designing job queues, retries, checkpoints, progress reporting, cancellation, or worker concurrency. Covers inline-vs-background decisions, queue contracts, state machines, idempotency, retry/backoff, progress signals, worker leases, and user-visible completion reporting. Do NOT use for time-based schedule design (use `cron-scheduling`), live browser transport choice (use `real-time-updates`), or async message schema ownership (use `event-contract-design`).262263**When to use**264- move this report generation out of the API handler and still show progress265- design a queue-backed import job that can resume after failure266- choose retry and dead-letter behavior for a worker267- avoid duplicate processing when a job is enqueued twice268- add cancellation and progress to a long-running export269- Triggers: `background-jobs-skill`, `job-queue-skill`, `async-processing-skill`, `long-running-task-skill`, `worker-pattern-skill`270271**Not for**272- choose the cron expression for a daily run273- design an SSE or WebSocket browser update channel274- define an event envelope and topic naming standard275- debug why this already-running worker crashed276- model the database schema for the business entity being processed277278**Related skills**279- Verify with: `observability-modeling`, `testing-strategy`280- Related: `event-contract-design`, `cron-scheduling`, `real-time-updates`, `observability-modeling`281282**Concept**283- Mental model: A background job system has five primitives: a producer records durable work, a queue orders and deduplicates it, a worker leases and executes it, a state store records progress and outcomes, and a notification path tells humans or systems what changed. Reliability comes from making each primitive explicit instead of hiding long work inside a request handler.284- Purpose: Background jobs keep interactive requests short while preserving reliable processing for slow, retryable, or batch-oriented work. They replace timeout-prone inline execution and untracked fire-and-forget calls with durable state, resumable progress, controlled concurrency, and observable outcomes.285- Boundary: This skill is not schedule design, browser push transport design, event schema design, or incident debugging. It begins after work has been requested and ends with execution state, retry, progress, completion, cancellation, and failure handling.286- Analogy: A background job is a numbered work order in a shop: the front desk accepts the request, the workshop picks it up when capacity exists, and the status board shows where it is.287- Common misconception: Putting work in a worker is not enough. Without durable state, idempotency, progress, retry policy, and observability, a background job is just an invisible request handler with a longer timeout.288289**Keywords**290- `background jobs`, `job queue`, `worker queue`, `async processing`, `long-running task`, `retry backoff`, `dead letter queue`, `checkpointing`, `worker concurrency`, `idempotent job`291292<!-- skill-graph-context:end -->
Run npx skillmds@latest add jacob-balslev/background-jobs in your terminal (requires Node.js), paste this page's agent-chat prompt into Claude, Cursor, or any MCP-connected agent, or download the SKILL.md file and copy it into your agent's skills directory.
Use when moving slow or failure-prone work out of a request path, designing job queues, retries, checkpoints, progress reporting, cancellation, or worker concurrency. Covers inline-vs-background decisions, queue contracts, state machines, idempotency, retry/backoff, progress signals, worker leases, and user-visible completion reporting. Do NOT use for time-based schedule design (use `cron-scheduling`), live browser transport choice (use `real-time-updates`), or async message schema ownership (use `event-contract-design`). Do NOT use for choose the cron expression for a daily run. Do NOT use for design an SSE or WebSocket browser update channel. Do NOT use for define an event envelope and topic naming standard. Do NOT use for debug why this already-running worker crashed. Do NOT use for model the database schema for the business entity being processed. It is listed under AI & ML, Coding & Dev Tools on SkillMD.
This skill has not completed SkillMD's automated safety review yet. Capability flags: makes network calls. SkillMD never runs a skill's scripts for you; review the SKILL.md before installing.
This skill is tagged as working with Claude Code, Claude.ai, OpenAI Codex. SKILL.md is an open format, so most agents that read a skills directory can load it too.
Yes. Installing skills from SkillMD is free. This skill is licensed under MIT.
jacob-balslev (@jacob-balslev) published this skill. Their other Agent Skills are listed on their SkillMD profile.