Solid Queue job conventions for the SourceMonitor engine. Use when creating new background jobs, modifying existing jobs, configuring queues, or working with job scheduling and retry policies.
Installer avec Codex ou Claude Copiez ce prompt, collez-le dans Codex, Claude ou un autre assistant, puis laissez-le vérifier la page du skill et l'installer pour vous.
Une commande directe contourne le prompt de vérification. Examinez la source avant de l'exécuter.
Solid Queue job conventions for the SourceMonitor engine. Use when creating new background jobs, modifying existing jobs, configuring queues, or working with job scheduling and retry policies.
allowed-tools
Read, Write, Edit, Bash, Glob, Grep
SourceMonitor Job Development
Overview
SourceMonitor uses Solid Queue (Rails 8 default) for background processing. All jobs inherit from SourceMonitor::ApplicationJob and use engine-namespaced queues.
The install generator (bin/rails generate source_monitor:install) automatically configures these recurring jobs in config/recurring.yml:
Job
Schedule
SourceMonitor::ScheduleFetchesJob
every minute
SourceMonitor::Scraping::Scheduler.run
every 2 minutes
SourceMonitor::ItemCleanupJob
at 2am every day
SourceMonitor::LogCleanupJob
at 3am every day
The install generator automatically configures config/recurring.yml with these entries AND patches the config/queue.yml dispatcher with recurring_schedule: config/recurring.yml so recurring jobs load on startup. Both steps are idempotent. If you need to customize schedules, edit config/recurring.yml directly.
Retry Policies
FetchFeedJob uses a custom retry strategy via RetryPolicy:
Error Type
Retry Attempts
Wait
Circuit Breaker
Timeout
2
2 min
1 hour
Connection
3
5 min
1 hour
HTTP 429
2
15 min
90 min
HTTP 5xx
2
10 min
90 min
HTTP 4xx
1
45 min
2 hours
Parsing
1
30 min
2 hours
Unexpected
1
30 min
2 hours
CleanupOptions Helper
SourceMonitor::Jobs::CleanupOptions normalizes job arguments for cleanup jobs:
# test/jobs/source_monitor/my_new_job_test.rb# frozen_string_literal: truerequire"test_helper"moduleSourceMonitorclassMyNewJobTest < ActiveJob::TestCase
setup do@source = create_source!
end
test "performs work for valid source"do# Stub external callsMyService.any_instance.expects(:call).once
MyNewJob.perform_now(@source.id)
end
test "silently skips missing source"do
assert_nothing_raised doMyNewJob.perform_now(-1)
endend
test "enqueues on correct queue"do
assert_enqueued_with(job:MyNewJob, queue:SourceMonitor.queue_name(:fetch).to_s) doMyNewJob.perform_later(@source.id)
endendendend
Testing Enqueue from Models
test "fetching enqueues via FetchRunner.enqueue"do
with_inline_jobs do
stub_request(:get, source.feed_url).to_return(status:200, body: feed_xml)
SourceMonitor::Fetching::FetchRunner.enqueue(source)
endend
Checklist
Job inherits from SourceMonitor::ApplicationJob
Uses source_monitor_queue (not queue_as)
Accepts IDs, not AR objects
Guards with find_by + early return
No business logic in the job class
discard_on ActiveJob::DeserializationError
Error handling with retry_on where appropriate
Test covers perform, missing record, and queue assignment
All tests GREEN
References
app/jobs/source_monitor/ -- All engine jobs
lib/source_monitor/jobs/ -- Job support classes (CleanupOptions, Visibility, SolidQueueMetrics)