From 444e07d1416e5622ec75fd6167b22587dade04ed Mon Sep 17 00:00:00 2001 From: Hiten Shah Date: Sun, 17 May 2026 15:54:45 -0700 Subject: [PATCH 1/2] fix: preserve requested sources in quick plans --- skills/last30days/scripts/lib/planner.py | 28 ++++++++++++++++++++++-- tests/test_planner_v3.py | 24 ++++++++++++++++++++ 2 files changed, 50 insertions(+), 2 deletions(-) diff --git a/skills/last30days/scripts/lib/planner.py b/skills/last30days/scripts/lib/planner.py index 207d5c4..35646f4 100644 --- a/skills/last30days/scripts/lib/planner.py +++ b/skills/last30days/scripts/lib/planner.py @@ -274,7 +274,15 @@ def _sanitize_plan( freshness_mode=freshness_mode, cluster_mode=cluster_mode, raw_topic=topic, - subqueries=_normalize_subquery_weights(_trim_subqueries_for_depth(subqueries, intent, depth, eligible_sources)), + subqueries=_normalize_subquery_weights( + _trim_subqueries_for_depth( + subqueries, + intent, + depth, + eligible_sources, + requested_sources=requested_sources, + ) + ), source_weights=source_weights, notes=[str(note).strip() for note in raw.get("notes") or [] if str(note).strip()], ) @@ -307,6 +315,7 @@ def _trim_subqueries_for_depth( intent: str, depth: str, available_sources: list[str], + requested_sources: list[str] | None = None, ) -> list[schema.SubQuery]: # At non-quick depth, expand sources: use capability routing for intents # that define it, or all available sources otherwise. The LLM planner may @@ -336,6 +345,15 @@ def _trim_subqueries_for_depth( for subquery in subqueries: if depth in {"quick", "default"}: preferred_sources = ranked_sources[:limit] + if requested_sources: + requested = [ + source + for source in requested_sources + if source in available_sources and source in subquery.sources + ] + for source in requested: + if source not in preferred_sources: + preferred_sources.append(source) else: preferred_sources = [source for source in ranked_sources if source in subquery.sources][:limit] if len(preferred_sources) < limit: @@ -428,7 +446,13 @@ def _fallback_plan( cluster_mode=_default_cluster_mode(intent), raw_topic=topic, subqueries=_normalize_subquery_weights( - _trim_subqueries_for_depth(subqueries[:_max_subqueries(intent, topic)], intent, depth, list(source_weights)) + _trim_subqueries_for_depth( + subqueries[:_max_subqueries(intent, topic)], + intent, + depth, + list(source_weights), + requested_sources=requested_sources, + ) ), source_weights=_normalize_weights(source_weights), notes=[note], diff --git a/tests/test_planner_v3.py b/tests/test_planner_v3.py index fffdd68..20ff29f 100644 --- a/tests/test_planner_v3.py +++ b/tests/test_planner_v3.py @@ -96,6 +96,30 @@ class PlannerV3Tests(unittest.TestCase): self.assertEqual(1, len(plan.subqueries)) self.assertEqual(["reddit", "x"], plan.subqueries[0].sources) + def test_quick_mode_preserves_explicit_requested_sources(self): + raw = { + "intent": "product", + "freshness_mode": "balanced_recent", + "cluster_mode": "debate", + "subqueries": [ + { + "label": "primary", + "search_query": "AI coding agents", + "ranking_query": "What are people saying about AI coding agents?", + "sources": ["reddit", "youtube", "grounding", "digg"], + "weight": 1.0, + } + ], + } + plan = planner._sanitize_plan( + raw, + "AI coding agents", + ["reddit", "youtube", "grounding", "digg"], + ["reddit", "youtube", "grounding", "digg"], + "quick", + ) + self.assertIn("digg", plan.subqueries[0].sources) + def test_default_comparison_uses_all_capable_sources(self): plan = planner.plan_query( topic="codex vs claude code", From 0bb01c2d6af09385d4adc702ecd75e0584d4a2f1 Mon Sep 17 00:00:00 2001 From: Hiten Shah Date: Mon, 18 May 2026 07:43:10 -0700 Subject: [PATCH 2/2] test: cover requested sources in fallback quick plans --- tests/test_planner_v3.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tests/test_planner_v3.py b/tests/test_planner_v3.py index 20ff29f..77881bb 100644 --- a/tests/test_planner_v3.py +++ b/tests/test_planner_v3.py @@ -120,6 +120,17 @@ class PlannerV3Tests(unittest.TestCase): ) self.assertIn("digg", plan.subqueries[0].sources) + def test_quick_mode_preserves_explicit_requested_sources_in_fallback_plan(self): + plan = planner.plan_query( + topic="AI coding agents", + available_sources=["reddit", "youtube", "github"], + requested_sources=["reddit", "github"], + depth="quick", + provider=None, + model=None, + ) + self.assertIn("github", plan.subqueries[0].sources) + def test_default_comparison_uses_all_capable_sources(self): plan = planner.plan_query( topic="codex vs claude code",