.vbw-planning/milestones/polish-and-reliability/phases/06-fetch-throughput-defaults/06-UAT.md
Scenario: Verify error handling safety net prevents sources from getting permanently stuck in "fetching" status.
Expected: DB errors propagate (not swallowed), broadcast errors are rescued, ensure block exists as safety net.
Result: PASS
update_source_state! (fetch_runner.rb:90-100): source.update!(attrs) is bare (no rescue), broadcast wrapped in begin/rescuerun method (lines 72-78): ensure block reloads source, resets "fetching" to "failed", defensive inner rescueFollowUpHandler#call (follow_up_handler.rb:19-25): per-item begin/rescue wraps each enqueue call with loggingScenario: Verify fixed-interval path uses jitter instead of exact intervals.
Expected: Fixed-interval path uses adjusted_interval_with_jitter(fixed_seconds) for +-10% jitter.
Result: PASS
fixed_seconds = fixed_minutes * 60.0, then adjusted_interval_with_jitter(fixed_seconds) — no longer exact minutesScenario: Verify scheduler defaults are small-server friendly and configurable.
Expected: batch_size=25, stale_timeout=5, both configurable via DSL.
Result: PASS
@scheduler_batch_size = 25, @stale_timeout_minutes = 5 in reset!Scenario: Verify queue separation: 7 non-fetch jobs on maintenance, only 2 jobs on fetch.
Expected: 3 queues (fetch, scrape, maintenance), proper job assignments, example config updated.
Result: PASS
maintenance_queue_name defaults to "source_monitor_maintenance", concurrency 1queue_name_for(:maintenance) and concurrency_for(:maintenance) both work:maintenance: source_health_check, import_session_health_check, import_opml, log_cleanup, item_cleanup, favicon_fetch, download_content_images:fetch: fetch_feed, schedule_fetches