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
- Run mint.py for the genre first to produce stills
- 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), andView on GitHub (pinned to 8321021c54)