.vbw-planning/milestones/ui-fixes-and-smart-scraping/phases/02-feed-reliability/02-SUMMARY.md
When a user force-fetches a source that is already being fetched, the system now fails fast with a clear "Fetch already in progress" warning toast instead of retrying 5 times over 2.5 minutes. Scheduled fetches retain their existing retry behavior.
The solution works at two levels:
FetchRunner.enqueue detects fetch_status == "fetching" before even creating a job, returning :already_fetching immediatelyConcurrencyError (race condition), it skips retries and resets the source status to idleTask 1: ConcurrencyError handling in FetchFeedJob (verified existing - commit 47361b2)
rescue_from ConcurrencyError differentiates force vs scheduled fetchesTask 2: Pre-enqueue check in FetchRunner.enqueue (commit 6ada960)
:already_fetching when force: true and source is fetchingTask 3: SourceRetriesController warning toast (commit cfe7016)
FetchRunner.enqueueTask 4: Tests (commit 6731ac5)
force_fetch_lock_test.rb: 6 tests for FetchRunner pre-enqueue behaviorfetch_feed_job_test.rb: 3 new tests for force-fetch ConcurrencyError handlingsource_retries_controller_test.rb: 1 new test for warning toast responselib/source_monitor/fetching/fetch_runner.rb - pre-enqueue checkapp/controllers/source_monitor/source_retries_controller.rb - warning toast handlingapp/jobs/source_monitor/fetch_feed_job.rb - (Task 1, pre-existing commit)test/lib/source_monitor/fetching/force_fetch_lock_test.rb - integration teststest/jobs/source_monitor/fetch_feed_job_test.rb - force-fetch ConcurrencyError teststest/controllers/source_monitor/source_retries_controller_test.rb - warning toast test47361b2 feat(fetching): handle force-fetch ConcurrencyError without retries (pre-existing)6ada960 feat(fetching): add pre-enqueue check for force-fetch lock contentioncfe7016 feat(controller): show warning toast when force-fetch is already in progress6731ac5 test(fetching): add tests for force-fetch lock contention handlingNone. All tasks completed as planned.
bin/rubocop: 0 offenses on all modified filesbin/rails test: 1257 runs, 3895 assertions, 0 failures, 0 errors, 0 skips