Addresses roborev jobs 205/208 (reviewing pre-merge draft/original commits of #33/#34, now split and merged as #69/#70): - Restore `res$year <- as.integer(res$year)` in .query_covered_years(), dropped during the #33 rebuild as apparently-dead code. Its own roxygen promises an integer `year` column; without the coercion the implementation no longer matches that documented contract. - Guard .query_covered_years() against empty `candidates`, mirroring the existing `gap_years` guard. Not reachable via .build_suggestions() today (candidates is checked non-empty before this is called), but the extracted helper is independently callable and previously built a malformed `WHERE r.recipe_id IN ()` clause for a hypothetical direct caller with no candidates. - Add a direct fixture-only unit test of .query_candidate_recipes()'s category_type filtering (#34) in both flow directions -- queries only summary_categories/harmonization_recipes metadata, so it runs without skip_if_no_corpus(), unlike the two existing end-to-end tests. 1080 tests pass (2 skipped live-corpus). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>