mvanhorn/last30days-skill · error · RuntimeError

No sources are available for this run.

Error message

No sources are available for this run.

What it means

RuntimeError raised in run_pipeline after the available-sources list is assembled (including auto-added 'grounding' and 'jobs'). It means every candidate source was filtered out — either the caller requested sources that are all unavailable/unknown, or no source is currently available given the config (missing API keys, digg/yt-dlp binaries not on PATH, etc.). The pipeline refuses to run a sweep that could never fetch anything.

Source

Thrown at skills/last30days/scripts/lib/pipeline.py:2014

    # submitted to the network executor below.
    if corpus_requested and "corpus" not in excluded_sources and "corpus" not in available:
        available.append("corpus")
    if web_backend == "none":
        available = [s for s in available if s != "grounding"]
    elif web_backend in ("brave", "exa", "serper", "parallel", "keyless") and "grounding" not in available:
        available.append("grounding")
    if (
        hiring_signals_mode
        or (not requested_sources and _company_topic_likely(topic))
    ) and "jobs" not in available:
        available.append("jobs")
    if hiring_signals_mode:
        config = dict(config)
        config["_hiring_signals_mode"] = True
        if not requested_sources:
            available = ["jobs"]
    if not available:
        raise RuntimeError("No sources are available for this run.")

    planner_requested_sources = requested_sources
    if hiring_signals_mode and not planner_requested_sources:
        planner_requested_sources = ["jobs"]

    if external_plan is not None:
        # External plan provided (e.g., from Claude Code via --plan flag).
        # Explicit input is a contract: validate it before permissive sanitization.
        planner.validate_external_plan(external_plan)
        plan = planner._sanitize_plan(
            external_plan, topic, available, planner_requested_sources, depth,
        )
        plan_source = "external"
    else:
        plan = planner.plan_query(
            topic=topic,
            available_sources=available,
            requested_sources=planner_requested_sources,

View on GitHub (pinned to c7460f6114)

Solutions

  1. Run without requested_sources to let the pipeline use whatever keyless sources are available (reddit, hackernews).
  2. Configure credentials for the sources you want: SCRAPECREATORS_API_KEY for x/instagram, and ensure digg-pp-cli / yt-dlp are on PATH.
  3. Check requested source names for typos; an unknown name yields no available source.
  4. Re-run setup (python3 skills/last30days/scripts/setup_wizard or the onboarding flow) to restore missing keys.

Example fix

# before: only x requested, but no key configured
run_pipeline(topic, requested_sources=["x"], config={})

# after: keyless sources, or provide the key
run_pipeline(topic, requested_sources=["reddit", "hackernews"], config={"SCRAPECREATORS_API_KEY": key})
Defensive patterns

Strategy: validation

Validate before calling

from skills.last30days.scripts.lib import pipeline
# dry-check availability first (same helper the pipeline uses)
avail = pipeline.available_sources(config, requested_sources or None, x_pending=False)
if not avail:
    raise SystemExit("configure credentials or drop requested_sources")

Try / catch

try:
    result = run_pipeline(topic, requested_sources=sources, config=config)
except RuntimeError as exc:
    if "No sources are available" in str(exc):
        result = run_pipeline(topic, config=config)  # keyless defaults
    else:
        raise

Prevention

When it happens

Trigger: requested_sources=['x'] with no X backend resolvable (no ScrapeCreators key, no bird session); requested_sources naming only sources whose availability check fails; hiring_signals_mode collapsing available to ['jobs'] but 'jobs' itself unavailable in a path that later intersects with requested; a mock-less run where available_sources() returns [] for every requested source.

Common situations: Fresh install with no credentials configured; ScrapeCreators key expired/revoked so x is unavailable; digg-pp-cli and yt-dlp not on the agent subprocess PATH (per AGENTS.md PATH gating); explicitly passing --sources with names that are all unavailable.

Related errors


AI-assisted analysis of mvanhorn/last30days-skill@c7460f6114 (2026-08-15). Data as JSON: /api/errors/0f0cf7d21d8fb2fb. Report an issue: GitHub.