affaan-m/ECC · error · ProviderDisabledError

live distillation requires explicit separately authorized…

Error message

live distillation requires explicit separately authorized execution; this package ships no provider adapters and performs no network calls. Use distill_local() (offline, deterministic, dry-run) instead.

What it means

distill_live exists solely to fail closed: this package ships no provider adapters and performs no network calls, so any attempt at live (provider-backed) distillation raises ProviderDisabledError immediately. The message directs you to distill_local(), the offline deterministic dry-run path.

Solutions

  1. Replace distill_live(profile) with distill_local(profile) — offline, deterministic, dry-run
  2. Remove any code paths/config expecting live provider execution from this package
  3. If live distillation is truly required, use a different package that ships provider adapters; do not monkey-patch this one

Example fix

// before
from tasteforge.distill import distill_live
spec = distill_live(profile)
// after
from tasteforge.distill import distill_local
spec = distill_local(profile)
Defensive patterns

Strategy: try-catch

Validate before calling

from tasteforge.distill import distill_live
def live_supported() -> bool:
    return False  # this package never supports live distillation

Try / catch

from tasteforge.distill import ProviderDisabledError, distill_local
try:
    spec = distill_live(profile)
except ProviderDisabledError:
    spec = distill_local(profile)  # offline, deterministic fallback

Prevention

When it happens

Trigger: Directly invoking tasteforge.distill.distill_live(profile) — always, unconditionally, by design. There is no flag, env var, or config that enables it.

Common situations: Migrating code from a different package that had a working live path, assuming an API key or provider flag would enable live mode, or copy-pasting a call chain from another tool.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of affaan-m/ECC@8321021c54 (2026-09-16). Data as JSON: /api/errors/b75afe1986ed0e8b. Report an issue: GitHub.

Appendix: source

Thrown at skills/taste-application/scripts/tasteforge/distill.py:113

    if sp is not None:
        grade = sp.read_json(sp.grade_path)
        cadence = sp.read_json(sp.cadence_path)
        grounding_text = grounding_from_grade(grade, cadence)
        grounding_used = bool(grounding_text)

    spec = build_spec(
        look,
        pack_name=sp.name if sp is not None else profile.get("genre"),
        grounding_used=grounding_used,
    )
    if grounding_text:
        spec["grounding"] = grounding_text
    return spec


def distill_live(profile: dict[str, Any]) -> dict[str, Any]:
    """Refuse live provider distillation. Fails closed, always."""
    raise ProviderDisabledError(_FAIL_CLOSED)


def grounding_from_grade(grade: dict[str, Any], cadence: dict[str, Any]) -> str:
    """Measured ground truth as a factual preamble (canonicalized port).

    Numeric facts belong here, not in the model's judgment: the first
    ungrounded run of the recovered pipeline produced a spec asserting "no
    apparent color grading" for a reference measuring a*+24.9 in the
    midtones. Stating measurements as facts inverts the dependency.
    """
    if not grade:
        return ""

    lines = [
        "MEASURED GROUND TRUTH for this reference set, from numeric analysis "
        "of the sampled frames. These are FACTS. Do not contradict them. Do "
        "not describe this footage as neutral, ungraded, or clinical:",
    ]

View on GitHub (pinned to 8321021c54)