{
  "checker": {
    "claims": [
      {
        "claim": "choreo renders audio alone into a visual music video",
        "command": "<guest-path> -m muvid.choreo render <guest-path> <guest-path> --archetype star_guitar",
        "evidence": "\"n_frames\": 360,\n    \"render_s\": 11.11\n  }\n}\n",
        "expected": "video file written; JSON reports 360 frames",
        "input": "12 s generated test song.wav",
        "kind": "claim",
        "outcome": "Real input produced the expected result: \"n_frames\": 360",
        "returncode": 0,
        "source": "Audio in, nothing else.",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      },
      {
        "claim": "lyric video: words appear in time with the singing",
        "command": "<guest-path> -m muvid.lyricvid render <guest-path> <guest-path> --subtitles <guest-path>",
        "evidence": "\"timing_source\": \"srt\",\n    \"timing_measured\": false\n  }\n}\n",
        "expected": "render completes with SRT timing source",
        "input": "song.wav plus SRT timed lyrics",
        "kind": "claim",
        "outcome": "Real input produced the expected result: \"timing_source\": \"srt\"",
        "returncode": 0,
        "source": "A song in, a typographic music video out: the words appear in time with the",
        "source_checked": true,
        "source_file": "README.md",
        "verdict": "yes"
      }
    ],
    "cycle_checks": [
      {
        "claim": "Scheduled or looping main behavior",
        "command": "",
        "evidence": "Entry points inspected (muvid CLI, muvid.choreo, muvid.lyricvid, muvid.montage, README). No scheduler, cron, loop, daemon, or webhook trigger exists in the product; the only 'cron' match is a comment in muvid/lyrics.py. Each render runs once per invocation.",
        "expected": "identify the product trigger",
        "input": "source inspection",
        "kind": "cycle",
        "outcome": "Entry points inspected (muvid CLI, muvid.choreo, muvid.lyricvid, muvid.montage, README). No scheduler, cron, loop, daemon, or webhook trigger exists in the product; the only 'cron' match is a comment in muvid/lyrics.py. Each render runs once per invocation.",
        "source": "repository entry points",
        "verdict": "yes"
      }
    ],
    "details": {
      "argv": [
        "<guest-path>",
        "-m",
        "muvid.choreo",
        "render",
        "<guest-path>",
        "<guest-path>",
        "--archetype",
        "star_guitar"
      ],
      "kind": "cli",
      "needs_browser": false,
      "needs_credentials": false,
      "returncode": 0,
      "scope": "product operation",
      "stderr": "",
      "stdout": "{\n  \"output\": \"<guest-path>\",\n  \"duration_s\": 12.021333,\n  \"artifacts\": {\n    \"events\": \"/tmp/muvid-choreo-w2f931cz/events.json\",\n    \"scene\": \"/tmp/muvid-choreo-w2f931cz/scene.json\",\n    \"treatment\": \"/tmp/muvid-choreo-w2f931cz/treatment.json\"\n  },\n  \"meta\": {\n    \"archetypes\": [\n      \"star_guitar\"\n    ],\n[excerpt truncated]",
      "working": true
    },
    "evidence_strength": "readme_checked",
    "example_checks": [
      {
        "claim": "lyricvid vocabulary lists the archetypes, free and key-free",
        "command": "<guest-path> -m muvid.lyricvid vocabulary",
        "deferred": false,
        "evidence": "igner provides it.\",\n    \"line\": \"The whole line arrives together, at the line's start.\",\n    \"beat\": \"Snapped to the nearest beat. Rhythmic, forgiving of alignment error.\",\n    \"downbeat\": \"Snapped to the nearest bar start. Slow, deliberate.\"\n  },\n  \"cut_styles\": {\n    \"hard\": \"Instant change between scenes.\",\n    \"crossfade\": \"Brief dissolve between scenes.\",\n    \"hold\": \"The previous scene stays until the next has fully arrived.\"\n  },\n  \"cases\": {\n    \"as_written\": \"Exactly as the lyrics are written.\",\n    \"upper\": \"ALL CAPS.\",\n    \"lower\": \"all lowercase.\",\n    \"title\": \"Title Case.\"\n  }\n}",
        "expected": "JSON archetype catalogue including one_word_centred",
        "input": "no arguments",
        "kind": "example",
        "outcome": "command completed successfully",
        "returncode": 0,
        "source": "README.md: python -m muvid.lyricvid vocabulary",
        "verdict": "yes"
      }
    ],
    "status": "PASS"
  },
  "deviations": [
    "Installed from the pinned workspace source (pip install '.[lyricvid]') instead of PyPI 'pip install muvid[lyricvid]', so the tested code is the pinned commit.",
    "Used apt ffmpeg 6.1.1 (README requires ffmpeg on PATH; not pinned by README).",
    "README lists .srt as a valid --lyrics input, but 'python -m muvid.lyricvid render ... --lyrics lyrics.srt' failed with 'No offline aligner is available'. Worked around by passing the same SRT with --subtitles, which the error message suggests.",
    "Plain-text --lyrics and the 'analyze' and 'propose' subcommands need faster-whisper for transcription when no timed lyrics are given; not installed (not in the lyricvid extra), so those README commands were not verified. 'analyze' and 'propose' failed with RuntimeError.",
    "The song was a generated 12 s sine-tone file made with ffmpeg, not a real recording; the AI pipeline (ElevenLabs/fal keys), muvid.visualize, muvid.montage, and the footage/MCP tools were not exercised.",
    "No product scheduler or cycle exists, so no cycle was triggered."
  ],
  "fault_owner": null,
  "main_blocker": null,
  "operation": "Render audio-driven videos from a song file with the README's key-free CLIs: python -m muvid.choreo render (visual music) and python -m muvid.lyricvid render with --subtitles timed lyrics (lyric video), plus python -m muvid.lyricvid vocabulary.",
  "operation_scope": "Linux guest (Ubuntu, Python 3.12.3, ffmpeg 6.1.1). Installed muvid from the pinned source with pip into <guest-path> using the lyricvid extra. No API keys, no browser, no faster-whisper. Input was a 12 s generated test tone (not a real song). Verified: choreo render (360 frames, exit 0), lyricvid render with SRT timing (exit 0), vocabulary (exit 0), and the checker validate+replay PASS.",
  "outcome": "working",
  "plain_failure": null,
  "steps": [
    "sudo apt-get -o DPkg::Lock::Timeout=300 install -y ffmpeg",
    "python3 -m venv <guest-path>",
    "<guest-path> install '.[lyricvid]' (from <guest-path>)",
    "<guest-path> -m muvid.choreo render song.wav out.mp4 --archetype star_guitar",
    "<guest-path> -m muvid.lyricvid render song.wav out.mp4 --subtitles lyrics.srt",
    "<guest-path> -m muvid.lyricvid vocabulary"
  ],
  "stuck_step": null,
  "suggested_fix": "No fix needed for the verified operations. Consider making README's '--lyrics <file.srt>' route work without faster-whisper, or document that SRT needs --subtitles, and state that analyze/propose need faster-whisper."
}
