implement-background-job
Skill26 starsChanged 4 months agoMITView on GitHub
Use when adding or reviewing an Active Job / Sidekiq / Solid Queue worker. Cover idempotency, retry_on, and discard_on. Trigger words: background job, Active Job, Sidekiq, Solid Queue, worker.
In this repository32 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- apply-code-conventionsSkill
- apply-stack-conventionsSkill
- code-reviewSkill
- create-engine-installerSkill
- create-engineSkill
- document-engineSkill
- extract-engineSkill
- generate-api-collectionSkill
- implement-authorizationSkill
- implement-graphqlSkill
- implement-hotwireSkill
- load-contextSkill
- optimize-performanceSkill
- plan-testsSkill
- rails-featureSkill
- rails-maintenanceSkill
- rails-reviewSkill
- refactor-codeSkill
- release-engineSkill
- review-architectureSkill
- review-engineSkill
- review-migrationSkill
- security-checkSkill
- seed-databaseSkill
- setup-environmentSkill
- test-engineSkill
- test-serviceSkill
- upgrade-engineSkill
- version-apiSkill
- write-testsSkill
The file
We split this skill into the rules it gives an agent
5 rules. About 0 are common, 4 are distinctive, and 1 is very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈4
Distinctive · estimate
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 17
Use this skill when the task is to add, configure, or review background jobs in a Rails application.
- Distinctive: line 50
Write the job spec first — idempotency, retry, and error handling — and run it to confirm it fails.
- Distinctive: line 51
Write the job class following the perform contract in HARD-GATE.
- Very specific: line 52
Add retry_on with explicit attempts: limit and discard_on for at least one permanent error.
- Distinctive: line 53
Run the full test suite.
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Implement Background Job
Use this skill when the task is to add, configure, or review background jobs in a Rails application.
HARD-GATE
EVERY job MUST have its test written and validated BEFORE implementation:
1. Write the job spec (idempotency, retry, error handling)
2. Run the spec — verify it fails
3. ONLY THEN write the job class
The authoritative perform contract — EVERY perform method does exactly three things:
1. Load the record from the passed ID
2. Guard for idempotency / permanent no-op conditions
3. Delegate the side effect or orchestration to a service object
If perform needs more than that, extract a service.
EVERY job that performs a side effect (charge, email, API call) MUST have
an idempotency check BEFORE the side effect.Core Rules
| Aspect | Rule |
| Arguments | Pass IDs, not objects |
| Retries | retry_on (explicit attempts:) for transient; discard_on for permanent errors |
| Backend (Rails 8) | Solid Queue (database-backed, no Redis) |
| Backend (Rails 7) | Sidekiq + Redis for high throughput |
| Recurring | config/recurring.yml (Solid Queue) or cron/sidekiq-cron |
| Anti-patterns | No ActiveRecord objects as args; no :inline/:async in production; no business logic in perform |
Core Process
- Write the job spec first — idempotency, retry, and error handling — and run it to confirm it fails.
- Write the job class following the perform contract in HARD-GATE.
- Add
retry_onwith explicitattempts:limit anddiscard_onfor at least one permanent error. - Run the full test suite.
- Enqueue or perform the job twice — confirm the second run is a no-op.
- For recurring jobs, define them in
config/recurring.yml(Rails 8) or the chosen scheduler config.
Extended Resources
Rails 8 vs Rails 7
| Aspect | Rails 7 and earlier | Rails 8 |
| Default | No default; set queue_adapter (often Sidekiq) | Solid Queue (database-backed) |
| Dev/test | :async or :inline | Same |
| Recurring | External (cron, sidekiq-cron) | config/recurring.yml |
| Dashboard | Third-party (Sidekiq Web) | Mission Control Jobs |
Examples
Thin job with idempotency and retry:
class SendInvoiceReminderJob < ApplicationJob
queue_as :default
retry_on Net::OpenTimeout, wait: :polynomially_longer, attempts: 5
discard_on ActiveRecord::RecordNotFound
def perform(invoice_id)
invoice = Invoice.find(invoice_id)
return if invoice.reminder_sent_at?
InvoiceReminders::Send.call(invoice:)
end
endService owns the side effect and state update:
module InvoiceReminders
class Send
def self.call(invoice:)
InvoiceMailer.overdue(invoice).deliver_now
invoice.update!(reminder_sent_at: Time.current)
end
end
end- BACKENDS.md — Solid Queue vs Sidekiq setup, configuration details, and Redis requirements. Load these files only when their specific content is needed:
- assets/job_patterns.md — Use when implementing multi-step orchestration or batch job patterns
- assets/retry_examples.md — Use when configuring
retry_on/discard_onfor specific error classes beyond the basic patterns above
Output Checklist
- Backend decision stated (Rails version/scale → Solid Queue or Sidekiq)
- Job spec shown first; command run; confirms failure before implementation
performreceives IDs, loads record, guards idempotency, delegates to serviceretry_onwithattempts:limit anddiscard_onfor permanent error- Double-run verification confirms second run is a no-op
- Recurring job (if any) defined in
config/recurring.ymlor scheduler config - If ops docs requested: record backend, retry, recurring schedule, and idempotency decisions in
process_log.md
Integration
| Skill | When to chain |
| review-migration | Solid Queue uses DB tables; add migrations safely |
| security-check | Jobs receive serialized input; validate like any entry point |
| write-tests | TDD gate: write job spec before implementation; use perform_enqueued_jobs |
| create-service-object | Keep perform thin; call service objects for business logic |
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

