affaan-m/ECC · error · SystemExit

pack ' ' has no stills - run mint.py first

Error message

pack '{genre}' has no stills - run mint.py first

What it means

Precondition guard in apply: the pack directory for the requested genre contains no still images, meaning mint.py was never run for that genre; apply aborts before any paid generation to avoid producing a roughcut with no frames.

Solutions

  1. Run mint.py for the genre first to produce stills
  2. Check --root points at the stylepacks directory that actually contains the pack
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at skills/taste-application/scripts/apply.py:317 when the library encounters an invalid state.

Common situations: See trigger scenarios.


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

Appendix: source

Thrown at skills/taste-application/scripts/apply.py:317

    tier: str | None = None,
) -> dict:
    if fps is not None and (not math.isfinite(fps) or fps <= 0):
        raise ValueError("fps must be finite and positive")
    # Fail before uploads/generation, and keep every run's paid originals.
    from forge import validate_output
    out_path = Path(out) if out else Path("out") / f"{genre}_roughcut.mp4"
    validate_output(out_path)
    takes_dir = out_path.parent / f"{out_path.stem}_takes"
    manifest_path = out_path.with_suffix(".generation.json")
    for destination in (takes_dir, manifest_path):
        if destination.exists() or destination.is_symlink():
            raise FileExistsError(f"output already exists; choose a new --out: {destination}")
    if tier:
        falapi.use_tier("reference_to_video", tier)
    sp = pack_mod.load(genre, root=root)
    stills = sp.stills()
    if not stills:
        raise SystemExit(f"pack '{genre}' has no stills - run mint.py first")

    spec = sp.read_json(sp.spec_path)
    if not spec:
        print(
            f"  !! no spec.json in pack; prompts will rely on --style-steer alone.\n"
            f"     run: python distill.py --genre {genre}",
            file=sys.stderr,
        )

    grade = grade_mod.load_stats(sp.grade_path) if sp.grade_path.exists() else None
    cad = cad_mod.load(sp.cadence_path) if sp.cadence_path.exists() else cad_mod.Cadence()

    # Plan TAKES, not shots.
    #
    # One generation per shot is the obvious reading of "match the reference's
    # cadence" and it is economically absurd here: this pack averages 0.78s per
    # shot while the endpoint refuses anything under 4s, so a 10s piece becomes
    # twelve calls, 48 generated seconds for 10 used (21% efficiency), and

View on GitHub (pinned to 8321021c54)