affaan-m/ECC · error · SystemExit

no media and no stills in the pack - nothing to lay down

Error message

no media and no stills in the pack - nothing to lay down

What it means

resolve_ingest.py's build_clips raises SystemExit when the pack contains neither media files nor stills, so there is nothing from which to lay clips on the timeline. Cadence alone cannot produce clips - at least one media item or still is required.

Solutions

  1. Run mint.py first to populate the pack with stills/media
  2. Verify the stylepack's stills and media directories exist and are non-empty
  3. Ensure resolve_ingest uses the same --genre/--root as the mint run
  4. If media was moved, restore it into the pack before ingest

Example fix

// before
python resolve_ingest.py noir --root stylepacks   # empty pack
// after
python mint.py noir --refs ref.mp4
python resolve_ingest.py noir --root stylepacks
Defensive patterns

Strategy: validation

Validate before calling

from pathlib import Path
sp = Path(root) / genre
has_content = any((sp / 'stills').glob('*')) or any((sp / 'media').glob('*'))
if not has_content:
    raise SystemExit("pack empty - run mint.py before resolve_ingest")

Try / catch

try:
    build_clips(...)
except SystemExit as e:
    if 'nothing to lay down' in str(e):
        run_mint_then_retry(genre, refs)

Prevention

When it happens

Trigger: Running resolve_ingest against a stylepack whose media/stills directories are empty or absent - e.g. mint never ran, mint produced no stills, or files were moved/deleted after minting.

Common situations: Pointing at the wrong --root or genre so the pack directories don't exist; a mint run that failed to export stills; manually cleaning the pack directory and re-running ingest only.

Understand the failure class

Background: EmptyResultError / "no results found": when an API or scraper succeeds but returns zero rows — this error's family across 9 libraries.

Related errors


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

Appendix: source

Thrown at skills/taste-application/scripts/resolve_ingest.py:218

        else:
            print(f"  !! no such media path, skipping: {e}", file=sys.stderr)
    if not out:
        out = sp.stills()
        if out:
            print(f"  no --media given; using {len(out)} pack stills as an animatic")
    return out


def build_clips(media: list[Path], cad: cad_mod.Cadence) -> list[dict]:
    """Marry media files to the reference's shot-length distribution.

    The cadence is the payload here. Whichever list is longer sets the clip
    count: extra media gets durations sampled from the reference distribution
    (``Cadence.plan_shots``), extra shots cycle back through the media. Either
    way the *rhythm* of the result is the reference's, not 5-seconds-a-clip.
    """
    if not media:
        raise SystemExit("no media and no stills in the pack - nothing to lay down")

    durations = [
        float(s.get("duration", 0.0)) for s in cad.shots if float(s.get("duration", 0.0)) > 0.04
    ]
    if not durations:
        durations = [max(cad.mean_shot, 1.0)]

    n = max(len(media), len(durations))
    if n > len(durations):
        # Extend by sampling the reference's own distribution rather than
        # repeating the tail, so the added shots inherit its variance.
        shortfall = (n - len(durations)) * max(cad.mean_shot, 0.5)
        durations = durations + list(cad.plan_shots(shortfall))
    if len(durations) < n:  # plan_shots is stochastic; top up by cycling
        base = list(durations)
        durations += [base[i % len(base)] for i in range(n - len(base))]
    durations = durations[:n]

View on GitHub (pinned to 8321021c54)