.vbw-planning/milestones/07-rails-audit-and-refactoring/07-rails-audit-round-2/03-PLAN.md
Key context: ImportOpmlJob has 160 lines of business logic (entry selection, dedup, source creation, broadcasting). ScrapeItemJob has rate-limiting that duplicates Scraping::Enqueuer logic. DownloadContentImagesJob orchestrates Item, ItemContent, and ActiveStorage. All violate the "shallow jobs" convention: jobs should contain only deserialization + delegation. </context> <tasks> <task type="auto"> <name>Extract ImportOpmlJob to OPMLImporter service (H2)</name> <files> app/jobs/source_monitor/import_opml_job.rb lib/source_monitor/import_sessions/opml_importer.rb lib/source_monitor.rb test/jobs/source_monitor/import_opml_job_test.rb test/lib/source_monitor/import_sessions/opml_importer_test.rb </files> <action>
Note: feed_fetcher.rb swallowed exceptions are handled by Plan 05 (which also modifies that file for L14+L15). </action> <verify> grep -r "rescue.*nil" lib/source_monitor/scraping/ -- should return no silent rescues </verify> <done> No silent exception swallowing in scraping/state.rb. StalledFetchReconciler PG query is documented with version info. </done> </task> </tasks> <verification>
<success_criteria>
03-SUMMARY.md </output>