{
  "run_id": "Anil-matcha--AI-Youtube-Shorts-Generator-claude-haiku-5-5-1792789641493602959",
  "date": "2026-10-23T21:15:00.074892+00:00",
  "repo": "Anil-matcha/AI-Youtube-Shorts-Generator",
  "kind": "repo",
  "source": "https://github.com/Anil-matcha/AI-Youtube-Shorts-Generator",
  "commit": "70c5fa96984cbc35b3b76a981a81c676117370ec",
  "model": "claude-haiku-5-5",
  "model_version": "claude-haiku-5-5",
  "test_version": "readme-bdc1b9b3c0d2673aef87e076d14084a8123ddcf09d520c1ee2e364a37c3f4bb9",
  "pass": null,
  "outcome": "needs_credentials",
  "time_to_working_s": null,
  "total_s": 458.58124566078186,
  "steps": [
    "cd <guest-path> && ls -la && cat README.md 2>/dev/null | head -200; python3 --version; id -u; cat /etc/os-release | head -3; ls /inputs 2>/dev/null",
    "cd <guest-path> && sed -n 200,400p README.md; echo ----; cat requirements.txt requirements-local.txt .env.example; echo ----; cat main.py; ls -la .coldpass .claude; ls shorts_generator; ls -a .git 2>&1 | head -1",
    "cd <guest-path> && git init -q 2>&1; git remote add origin https://github.com/Anil-matcha/AI-Youtube-Shorts-Generator 2>&1; timeout 120 git fetch --depth 1 origin 70c5fa96984cbc35b3b76a981a81c676117370ec 2>&1 | tail -3; git reset --mixed FETCH_HEAD 2>&1 | tail -2; git rev-parse HEAD; git status --short | head; echo ---; which ffmpeg ffprobe; ls <guest-path>; env | grep -i -E 'muapi|openai|gemini|proxy' | sed 's/=.*/=<set>/'; dpkg -l python3.12-venv 2>/dev/null | tail -1",
    "cd <guest-path> && (sudo -n apt-get update -qq >/tmp/apt.log 2>&1; sudo -n DEBIAN_FRONTEND=noninteractive apt-get install -y -qq python3.12-venv ffmpeg >>/tmp/apt.log 2>&1; echo apt=$?) ; python3 -m venv <guest-path> && <guest-path> install -q -r requirements.txt 2>&1 | tail -5; echo pip=$?; <guest-path> -c \"import requests, dotenv; print('ok')\"; ffmpeg -version | head -1",
    "cd <guest-path> && cat shorts_generator/config.py; echo ----; sed -n 1,60p shorts_generator/muapi.py; echo ----; cat shorts_generator/pipeline.py | head -80",
    "cd <guest-path> && ls -a | grep -c '^.env$'; timeout 120 <guest-path> main.py \"https://www.youtube.com/watch?v=8Ua5lRiePFg\" --num-clips 1 --output-json .coldpass/api_result.json; echo \"rc=$?\"",
    "cd <guest-path> && timeout 900 <guest-path> install -q -r requirements-local.txt > /tmp/pip-local.log 2>&1; echo pip_local=$?; tail -3 /tmp/pip-local.log; <guest-path> -c \"import yt_dlp, faster_whisper, cv2, openai; print('local imports ok')\"",
    "mkdir -p <guest-path> && cd <guest-path> && (sudo -n DEBIAN_FRONTEND=noninteractive apt-get install -y -qq espeak-ng >/tmp/apt2.log 2>&1; echo espeak_install=$?) && espeak-ng -w speech.wav \"Welcome to the show. This is the most surprising thing I learned this year. Nobody tells you that, but it changed everything for me.\" && ffmpeg -y -loglevel error -f lavfi -i testsrc=size=640x360:rate=25:duration=20 -i speech.wav -shortest -c:v libx264 -pix_fmt yuv420p -c:a aac input.mp4 && ls -la input.mp4; timeout 20 curl -sI https://huggingface.co | head -1; echo hf_rc=$?",
    "cd <guest-path> && mkdir -p <guest-path> && LOCAL_OUTPUT_DIR=<guest-path> timeout 1500 <guest-path> main.py <guest-path> --mode local --num-clips 1 2>&1 | tail -30; echo \"rc=${PIPESTATUS[0]}\"; ls -la <guest-path>",
    "cd <guest-path> && cat shorts_generator/local/transcriber.py | head -40; echo ----; LOCAL_OUTPUT_DIR=<guest-path> <guest-path> -c \"\nimport traceback\nfrom shorts_generator.local.transcriber import transcribe_local\ntry:\n    transcribe_local('<guest-path>', language=None)\nexcept Exception:\n    traceback.print_exc()\n\" 2>&1 | tail -25; <guest-path> list 2>/dev/null | grep -i -E 'faster|ctranslate|huggingface|tokenizers'",
    "cd <guest-path> && <guest-path> list 2>/dev/null | grep -i '^av '; <guest-path> install -q \"av>=11,<14\" > /tmp/pip-av.log 2>&1; echo rc=$?; tail -2 /tmp/pip-av.log; <guest-path> list 2>/dev/null | grep -i '^av '; LOCAL_OUTPUT_DIR=<guest-path> timeout 1500 <guest-path> main.py <guest-path> --mode local --num-clips 1 2>&1 | tail -12; echo \"rc=${PIPESTATUS[0]}\"",
    "ls -la <guest-path> /inputs 2>&1 | head; wc -l <guest-path>; grep -n -E \"credentials_error|testable|checks|expected_returncode|stays_running|def \" <guest-path> | head -80; cat <guest-path>",
    "cd <guest-path> && sed -n 48,60p check.py; echo ...; sed -n 653,760p check.py; echo ...; sed -n 856,935p check.py",
    "cd <guest-path> && sed -n 36,47p check.py; sed -n 202,226p check.py; sed -n 1168,1200p check.py; grep -n \"CREDENTIALS =\\|PREREQUISITE =\\|SECRET_NAME =\" check.py",
    "cd <guest-path> && grep -rn -i -E \"cron|schedul|while True|webhook|--once|--now|sleep\\(|time\\.sleep|watch\" --include=*.py . | grep -v '^./.claude' | head; echo ---; ls -a; cat .gitignore; echo ---; printf 'LOCAL_OUTPUT_DIR=<guest-path>\\n' > .env && cat .env && git status --short",
    "cd <guest-path> && PY=<guest-path> && cat > probe.json <<EOF\n{\"checks\":[\n {\"check\":\"credentials_error\",\"kind\":\"cli\",\"argv\":[\"$PY\",\"main.py\",\"https://www.youtube.com/watch?v=8Ua5lRiePFg\",\"--num-clips\",\"1\"],\"cwd\":\"<guest-path>\",\"expected_returncode\":1},\n {\"check\":\"credentials_error\",\"kind\":\"cli\",\"argv\":[\"$PY\",\"main.py\",\"<guest-path>\",\"--mode\",\"local\",\"--num-clips\",\"1\"],\"cwd\":\"<guest-path>\",\"expected_returncode\":1}\n]}\nEOF\ncat > claims.json <<EOF\n[\n {\"kind\":\"claim\",\"claim\":\"Local mode accepts a direct filesystem path and skips YouTube\",\"source\":\"In \\`--mode local\\`, you can pass a \\`file://\\` URL or a direct filesystem path and skip YouTube entirely\",\"input\":\"<guest-path>\",\"expected\":\"local transcription runs on the file (1 segment)\",\"probe_kind\":\"cli\",\"argv\":[\"$PY\",\"main.py\",\"<guest-path>\",\"--mode\",\"local\",\"--num-clips\",\"1\"],\"expected_text\":\"1 segments, 8s of audio\",\"cwd\":\"<guest-path>\"},\n {\"kind\":\"claim\",\"claim\":\"API mode needs a MuAPI key\",\"source\":\"For **API mode (default)**: a MuAPI key\",\"input\":\"YouTube URL without key\",\"expected\":\"run stops with MUAPI_API_KEY missing\",\"probe_kind\":\"cli\",\"argv\":[\"$PY\",\"main.py\",\"https://www.youtube.com/watch?v=8Ua5lRiePFg\",\"--num-clips\",\"1\"],\"expected_text\":\"MUAPI_API_KEY is not set\",\"cwd\":\"<guest-path>\"},\n {\"kind\":\"claim\",\"claim\":\"Local mode writes shorts to LOCAL_OUTPUT_DIR\",\"source\":\"Local mode writes the rendered shorts to\",\"input\":\"local file with no LLM key\",\"expected\":\"run reaches highlight ranking, needs OPENAI_API_KEY\",\"probe_kind\":\"cli\",\"argv\":[\"$PY\",\"main.py\",\"<guest-path>\",\"--mode\",\"local\",\"--num-clips\",\"1\"],\"expected_text\":\"OPENAI_API_KEY is not set\",\"cwd\":\"<guest-path>\"}\n]\nEOF\ncat > cycles.json <<'EOF'\n{\"detected\":false,\"reason\":\"Entry points inspected: main.py is a one-shot argparse CLI (single run per invocation, exits). README has no cron, scheduling, loop, webhook, --once or --now. The only while-loop in source is a frame loop in shorts_generator/local/clipper.py and polling sleeps in muapi.py, which are not product cycles.\",\"checks\":[]}\nEOF\ncat > examples.json <<'EOF'\n[\n {\"kind\":\"example\",\"claim\":\"Single video, API mode quickstart\",\"source\":\"README.md Usage / Single video (API mode \u2014 default)\",\"reason\":\"Needs MUAPI_API_KEY, which is not available in this guest. Ran the documented command with no key; it stopped with 'MUAPI_API_KEY is not set' (exit 1). Covered by the credentials_error check in probe.json.\"},\n {\"kind\":\"example\",\"claim\":\"Single video, local mode quickstart\",\"source\":\"README.md Usage / Single video (Local mode)\",\"reason\":\"Needs OPENAI_API_KEY or GEMINI_API_KEY for highlight ranking, which is not available. A YouTube URL was not used because only a local file was reachable without a key. Local file transcription ran to completion and wrote a cache .srt before stopping at the missing OPENAI_API_KEY.\"},\n {\"kind\":\"example\",\"claim\":\"Batch processing with xargs\",\"source\":\"README.md Usage / Batch processing\",\"reason\":\"Each line runs main.py, which needs a MuAPI key (API mode) or an OpenAI/Gemini key (local mode). Not runnable without credentials; the single-run paths above stop at the same missing-key checks.\"}\n]\nEOF\nfor f in probe.json claims.json cycles.json examples.json; do <guest-path> -I -c \"import json,sys;json.load(open(sys.argv[1]));print(sys.argv[1],'valid')\" $f; done",
    "cd <guest-path> && <env-var>=<guest-path> timeout 1500 python3 -I <guest-path> --validate --replay 2>&1 | tail -80; echo \"rc=${PIPESTATUS[0]}\"",
    "cd <guest-path> && cat > claims.json <<'EOF'\n[\n {\"kind\":\"claim\",\"claim\":\"Local mode accepts a direct filesystem path and skips YouTube\",\"source\":\"In `--mode local`, you can pass a `file://` URL or a direct filesystem path and skip YouTube entirely\",\"testable\":false,\"reason\":\"Needs OPENAI_API_KEY or GEMINI_API_KEY for the highlight-ranking step, which this guest does not have. The path was accepted and local transcription ran on <guest-path> (1 segment, 8s), then the run stopped with 'OPENAI_API_KEY is not set'.\"},\n {\"kind\":\"claim\",\"claim\":\"API mode needs a MuAPI key\",\"source\":\"For **API mode (default)**: a MuAPI key\",\"testable\":false,\"reason\":\"Needs MUAPI_API_KEY, which this guest does not have. Ran the documented API-mode command without a key; it stopped with 'MUAPI_API_KEY is not set' (exit 1). Recorded as the credentials_error check in probe.json.\"},\n {\"kind\":\"claim\",\"claim\":\"Local mode writes shorts and transcript cache to LOCAL_OUTPUT_DIR\",\"source\":\"Local transcription is cached as an `.srt` file in `LOCAL_OUTPUT_DIR` using the\",\"testable\":false,\"reason\":\"Needs an OpenAI or Gemini key before shorts are rendered. The transcript cache step did run: <guest-path> was written (verified contents) before the missing-key stop.\"}\n]\nEOF\n<guest-path> -I -c \"import json;json.load(open('claims.json'));print('ok')\"; cd <guest-path> && <env-var>=<guest-path> timeout 1500 python3 -I <guest-path> --validate --replay > /tmp/check1.out 2>&1; echo rc=$?; python3 -I -c \"\nimport json,sys\nd=json.load(open('/tmp/check1.out')) if False else None\n\" ; grep -o '\"valid\": [a-z]*' /tmp/check1.out; grep -o '\"problems\": \\[[^]]*\\]' /tmp/check1.out | head -c 1500",
    "cd <guest-path> && cat > report.json <<'EOF'\n{\"outcome\":\"needs_credentials\",\"fault_owner\":\"prerequisite\",\"operation\":\"Turn a YouTube URL (API mode) or a local video file (local mode) into ranked vertical shorts with python main.py\",\"operation_scope\":\"Pinned commit 70c5fa96984cbc35b3b76a981a81c676117370ec, Ubuntu 24.04, Python 3.12.3 venv at <guest-path> Verified: install of requirements.txt and requirements-local.txt, ffmpeg, the CLI runs, and local-mode transcription on a generated speech clip (1 segment, 8s, cached .srt). Not verified: highlight ranking, clip rendering, and final shorts, because they need MUAPI_API_KEY (API mode) or OPENAI_API_KEY/GEMINI_API_KEY (local mode), which this guest does not have.\",\"steps\":[\"git init; git remote add origin https://github.com/Anil-matcha/AI-Youtube-Shorts-Generator; git fetch --depth 1 origin 70c5fa96984cbc35b3b76a981a81c676117370ec; git reset --mixed FETCH_HEAD\",\"sudo apt-get install -y python3.12-venv ffmpeg\",\"python3 -m venv <guest-path> && <guest-path> install -r requirements.txt\",\"<guest-path> install -r requirements-local.txt\",\"<guest-path> main.py \\\"https://www.youtube.com/watch?v=8Ua5lRiePFg\\\" --num-clips 1  (exit 1: MUAPI_API_KEY is not set)\",\"<guest-path> main.py <guest-path> --mode local --num-clips 1  (after av pin; transcription OK, exit 1: OPENAI_API_KEY is not set)\"],\"deviations\":[\"README says Python 3.10+; Ubuntu 3.12.3 is used. No deviation in version, only in interpreter choice.\",\"Installed python3.12-venv and ffmpeg via apt (sudo). Installed espeak-ng to create a speech test clip outside the checkout.\",\"requirements-local.txt installs unpinned av, which resolved to 19.0.2. faster-whisper 1.2.1 calls av.open(metadata_errors=...), which fails with TypeError on that version. Substitute: pip install 'av>=11,<14' (resolved to 13.1.0) in the venv. Product source not edited.\",\"Created .env in the checkout with only LOCAL_OUTPUT_DIR=<guest-path> so the cache and outputs stay out of the repo (documented config; .env is gitignored). No keys were written.\",\"No MuAPI, OpenAI or Gemini key was obtained or faked; no mock LLM was substituted.\",\"Claims that need a key are recorded as testable:false with the real prerequisite instead of being replayed as successes.\",\"No product cycle exists (one-shot CLI), so cycles.json has detected:false.\",\"The README's Batch processing example and both quickstarts are recorded as blocked in examples.json.\"],\"stuck_step\":\"Highlight ranking step (LLM call) in both API mode and local mode, because no MuAPI or OpenAI/Gemini key is available in the guest.\",\"main_blocker\":\"Missing API keys: MUAPI_API_KEY for API mode, OPENAI_API_KEY or GEMINI_API_KEY for local mode.\",\"plain_failure\":\"The tool needs paid API keys to do its main work. Without them, it stops before picking any clips. Local transcription works on a test video. The highlight picking and cutting steps were not exercised, so the final shorts were not produced.\",\"suggested_fix\":\"Provide MUAPI_API_KEY (API mode) or OPENAI_API_KEY/GEMINI_API_KEY (local mode) and rerun the README quickstart. Also pin av<14 (or update faster-whisper) in requirements-local.txt, since the unpinned av breaks local transcription with a TypeError on av 19.\"}\nEOF\n<guest-path> -I -c \"import json;json.load(open('report.json'));print('report valid')\"; ls -la <guest-path>; cd <guest-path> && git status --short; pgrep -fa \"main.py|mcp|http.server\" | grep -v pgrep || echo \"no servers running\"",
    "cd <guest-path> && <env-var>=<guest-path> timeout 1500 python3 -I <guest-path> --validate --replay > /tmp/check2.out 2>&1; echo rc=$?; grep -o '\"valid\": [a-z]*' /tmp/check2.out; grep -o '\"problems\": \\[[^]]*\\]' /tmp/check2.out"
  ],
  "stuck_step": "Highlight ranking step (LLM call) in both API mode and local mode, because no MuAPI or OpenAI/Gemini key is available in the guest.",
  "error_excerpt": "Missing API keys: MUAPI_API_KEY for API mode, OPENAI_API_KEY or GEMINI_API_KEY for local mode.",
  "what_it_did": "Turn a YouTube URL (API mode) or a local video file (local mode) into ranked vertical shorts with python main.py",
  "suggested_fix": "Provide MUAPI_API_KEY (API mode) or OPENAI_API_KEY/GEMINI_API_KEY (local mode) and rerun the README quickstart. Also pin av<14 (or update faster-whisper) in requirements-local.txt, since the unpinned av breaks local transcription with a TypeError on av 19.",
  "tokens_in": 674666,
  "tokens_out": 20885,
  "cost_usd": 0.027610069999999997,
  "usage_complete": true,
  "checks": [
    {
      "status": "PASS",
      "details": {
        "working": false,
        "argv": [
          "<guest-path>",
          "main.py",
          "https://www.youtube.com/watch?v=8Ua5lRiePFg",
          "--num-clips",
          "1"
        ],
        "kind": "cli",
        "returncode": 1,
        "stdout": "[download] requesting https://www.youtube.com/watch?v=8Ua5lRiePFg @ 720p",
        "stderr": "\nFAILED: MUAPI_API_KEY is not set. Add it to your .env file or export it as an env var.",
        "needs_credentials": true,
        "needs_browser": false,
        "scope": "partial: missing credentials"
      },
      "check": "credentials_error",
      "optional": false
    },
    {
      "status": "PASS",
      "details": {
        "working": false,
        "argv": [
          "<guest-path>",
          "main.py",
          "<guest-path>",
          "--mode",
          "local",
          "--num-clips",
          "1"
        ],
        "kind": "cli",
        "returncode": 1,
        "stdout": "[download/local] using local file: <guest-path>\n[transcribe/local] reusing cached transcript: <guest-path>\n[transcribe/local] 1 cached segments, 7s of audio\n[highlights] content=other density=medium duration=7s",
        "stderr": "\nFAILED: OPENAI_API_KEY is not set. Local mode needs an OpenAI key for highlight ranking. Add it to your .env or export it, or switch back to --mode api.",
        "needs_credentials": true,
        "needs_browser": false,
        "scope": "partial: missing credentials"
      },
      "check": "credentials_error",
      "optional": false
    }
  ],
  "safety": {
    "version": "z2x-1",
    "rules_version": "z2x-1",
    "summary": "Review signals: 1 connection review, 34 known vulnerability.",
    "findings": [
      {
        "kind": "connection-review",
        "count": 1,
        "note": "Repository processes attempted these non-loopback connections; proxies can hide the final hostname.",
        "location_count": 43,
        "process_count": 14
      },
      {
        "kind": "known-vulnerability",
        "count": 26,
        "note": "OSV reports a known vulnerability in this dependency version.",
        "location_count": 4
      }
    ],
    "context": [],
    "limitations": [
      "A short run cannot establish that code is safe.",
      "Connections show IP addresses; proxies can hide the final hostname.",
      "Tracing covers dispatched commands and their children, not the whole OS; guest root can interfere with tracing."
    ],
    "static": {
      "dependency_note": "OSV scanned supported lockfiles; unpinned dependencies and unsupported formats are outside this check."
    },
    "evidence_url": "/safety/?run=Anil-matcha--AI-Youtube-Shorts-Generator-claude-haiku-5-5-1792789641493602959",
    "evidence_file": "/data/safety/Anil-matcha--AI-Youtube-Shorts-Generator-claude-haiku-5-5-1792789641493602959.json.gz"
  },
  "agent_execution": "native_agent",
  "agent_runtime": "claude-code",
  "agent_runtime_version": "2.1.300 (Claude Code)",
  "tool_transport": "mcp-assigned-vm",
  "platform": "linux",
  "reasoning": "low",
  "service_tier": null,
  "resources": {
    "cpus": 2,
    "memory_mib": 4096,
    "disk_mib": 32768
  },
  "native_tool_calls": 20,
  "native_bundle": null,
  "architecture": null,
  "backend": "hyperv",
  "platform_details": {
    "backend": "hyperv",
    "os": "linux"
  },
  "platform_conflicts": null,
  "sandbox_source": null,
  "source_pin": {
    "commit": "70c5fa96984cbc35b3b76a981a81c676117370ec",
    "url": "https://github.com/Anil-matcha/AI-Youtube-Shorts-Generator"
  },
  "purpose": "initial",
  "profile": {
    "model": "claude-haiku-5-5",
    "reasoning": "low"
  },
  "fault": {
    "owner": "prerequisite",
    "status": "diagnosed",
    "reason": "Missing API keys: MUAPI_API_KEY for API mode, OPENAI_API_KEY or GEMINI_API_KEY for local mode."
  },
  "fix_id": null,
  "verifies_run_id": null,
  "hosting": null,
  "operation_scope": "partial checks",
  "tool_calls": 20,
  "guest_setup": null,
  "runtime": null,
  "runtime_version": null,
  "runtime_revision": null,
  "source_revision": null,
  "evidence_version": null,
  "failure_origin": null,
  "evidence_strength": "nothing_checked",
  "works": "partly",
  "install_s": null,
  "first_use_s": null,
  "mcp": "none",
  "needs": [
    "credentials"
  ],
  "needs_which": "MUAPI_API_KEY",
  "agent_interface": [],
  "license": "MIT",
  "repo_url": "https://github.com/Anil-matcha/AI-Youtube-Shorts-Generator",
  "cost_to_try": "needs an account or key",
  "hardware": "GPU",
  "what_failed": "Missing API keys: MUAPI_API_KEY for API mode, OPENAI_API_KEY or GEMINI_API_KEY for local mode.",
  "local_or_hosted": "both",
  "cycle_checks": [
    {
      "kind": "cycle",
      "claim": "Scheduled or looping main behavior",
      "source": "repository entry points",
      "input": "source inspection",
      "expected": "identify the product trigger",
      "verdict": "yes",
      "outcome": "Entry points inspected: main.py is a one-shot argparse CLI (single run per invocation, exits). README has no cron, scheduling, loop, webhook, --once or --now. The only while-loop in source is a frame loop in shorts_generator/local/clipper.py and polling sleeps in muapi.py, which are not product cycles.",
      "evidence": "Entry points inspected: main.py is a one-shot argparse CLI (single run per invocation, exits). README has no cron, scheduling, loop, webhook, --once or --now. The only while-loop in source is a frame loop in shorts_generator/local/clipper.py and polling sleeps in muapi.py, which are not product cycles.",
      "command": ""
    }
  ],
  "claims": [
    {
      "kind": "claim",
      "claim": "Local mode accepts a direct filesystem path and skips YouTube",
      "source": "In `--mode local`, you can pass a `file://` URL or a direct filesystem path and skip YouTube entirely",
      "input": "",
      "expected": "",
      "command": "",
      "verdict": "blocked",
      "outcome": "Needs OPENAI_API_KEY or GEMINI_API_KEY for the highlight-ranking step, which this guest does not have. The path was accepted and local transcription ran on <guest-path> (1 segment, 8s), then the run stopped with 'OPENAI_API_KEY is not set'.",
      "evidence": "Needs OPENAI_API_KEY or GEMINI_API_KEY for the highlight-ranking step, which this guest does not have. The path was accepted and local transcription ran on <guest-path> (1 segment, 8s), then the run stopped with 'OPENAI_API_KEY is not set'.",
      "source_checked": true,
      "source_file": "README.md"
    },
    {
      "kind": "claim",
      "claim": "API mode needs a MuAPI key",
      "source": "For **API mode (default)**: a MuAPI key",
      "input": "",
      "expected": "",
      "command": "",
      "verdict": "blocked",
      "outcome": "Needs MUAPI_API_KEY, which this guest does not have. Ran the documented API-mode command without a key; it stopped with 'MUAPI_API_KEY is not set' (exit 1). Recorded as the credentials_error check in probe.json.",
      "evidence": "Needs MUAPI_API_KEY, which this guest does not have. Ran the documented API-mode command without a key; it stopped with 'MUAPI_API_KEY is not set' (exit 1). Recorded as the credentials_error check in probe.json.",
      "source_checked": true,
      "source_file": "README.md"
    },
    {
      "kind": "claim",
      "claim": "Local mode writes shorts and transcript cache to LOCAL_OUTPUT_DIR",
      "source": "Local transcription is cached as an `.srt` file in `LOCAL_OUTPUT_DIR` using the",
      "input": "",
      "expected": "",
      "command": "",
      "verdict": "blocked",
      "outcome": "Needs an OpenAI or Gemini key before shorts are rendered. The transcript cache step did run: <guest-path> was written (verified contents) before the missing-key stop.",
      "evidence": "Needs an OpenAI or Gemini key before shorts are rendered. The transcript cache step did run: <guest-path> was written (verified contents) before the missing-key stop.",
      "source_checked": true,
      "source_file": "README.md"
    }
  ],
  "claims_note": null,
  "example_checks": [
    {
      "kind": "example",
      "claim": "Single video, API mode quickstart",
      "source": "README.md Usage / Single video (API mode \u2014 default)",
      "input": "",
      "command": "",
      "evidence": "Needs MUAPI_API_KEY, which is not available in this guest. Ran the documented command with no key; it stopped with 'MUAPI_API_KEY is not set' (exit 1). Covered by the credentials_error check in probe.json.",
      "deferred": false,
      "expected": "documented command completes successfully",
      "verdict": "blocked",
      "outcome": "Needs MUAPI_API_KEY, which is not available in this guest. Ran the documented command with no key; it stopped with 'MUAPI_API_KEY is not set' (exit 1). Covered by the credentials_error check in probe.json."
    },
    {
      "kind": "example",
      "claim": "Single video, local mode quickstart",
      "source": "README.md Usage / Single video (Local mode)",
      "input": "",
      "command": "",
      "evidence": "Needs OPENAI_API_KEY or GEMINI_API_KEY for highlight ranking, which is not available. A YouTube URL was not used because only a local file was reachable without a key. Local file transcription ran to completion and wrote a cache .srt before stopping at the missing OPENAI_API_KEY.",
      "deferred": false,
      "expected": "documented command completes successfully",
      "verdict": "blocked",
      "outcome": "Needs OPENAI_API_KEY or GEMINI_API_KEY for highlight ranking, which is not available. A YouTube URL was not used because only a local file was reachable without a key. Local file transcription ran to completion and wrote a cache .srt before stopping at the missing OPENAI_API_KEY."
    },
    {
      "kind": "example",
      "claim": "Batch processing with xargs",
      "source": "README.md Usage / Batch processing",
      "input": "",
      "command": "",
      "evidence": "Each line runs main.py, which needs a MuAPI key (API mode) or an OpenAI/Gemini key (local mode). Not runnable without credentials; the single-run paths above stop at the same missing-key checks.",
      "deferred": false,
      "expected": "documented command completes successfully",
      "verdict": "blocked",
      "outcome": "Each line runs main.py, which needs a MuAPI key (API mode) or an OpenAI/Gemini key (local mode). Not runnable without credentials; the single-run paths above stop at the same missing-key checks."
    }
  ],
  "does_what_it_says": null,
  "maintenance": {
    "last_commit_at": "2026-10-22T15:43:10Z",
    "commits_90d": 10,
    "merged_prs_90d": 0,
    "open_issues": 9,
    "open_prs": 16,
    "reply_share": 0.24,
    "reply_threads": 50,
    "median_reply_hours": 5000.4,
    "last_release_at": null,
    "archived": false,
    "verdict": "maintained",
    "note": "actively maintained: last commit 1 days ago; 10 commits and 0 merged PRs in 90 days; 9 open issues, 16 open PRs; 12 of 50 recent threads got a maintainer reply, median first reply 5000.4h; no releases"
  },
  "maintenance_verdict": "maintained",
  "maintenance_note": "actively maintained: last commit 1 days ago; 10 commits and 0 merged PRs in 90 days; 9 open issues, 16 open PRs; 12 of 50 recent threads got a maintainer reply, median first reply 5000.4h; no releases",
  "maintained": "active",
  "maintained_note": "last commit 1 days ago; 8 open issues, 6 answered or closed",
  "last_commit_at": "2026-10-22T15:43:11Z",
  "last_release_at": null,
  "open_issues": 8,
  "answered_issues": 6,
  "platforms_claimed": [
    "linux"
  ],
  "topic": "agent-harness",
  "agent_interfaces": [
    {
      "interface": "cli",
      "evidence": "independent checker",
      "observed": true,
      "operation_checked": false
    }
  ],
  "agent_interfaces_note": "README metadata is a discovery hint, not pinned documentation proof. Observed interfaces were exercised in this run. An empty list means unknown.",
  "mcp_context": null,
  "tested_at": "2026-10-23T21:15:00.074892+00:00",
  "tested_commit": "70c5fa96984cbc35b3b76a981a81c676117370ec",
  "tested_with": {
    "agent": "claude-code",
    "agent_version": "2.1.300 (Claude Code)",
    "model": "claude-haiku-5-5",
    "model_route": "claude-haiku-5-5",
    "reasoning": "low",
    "os": "linux",
    "backend": "hyperv",
    "transport": "mcp-assigned-vm"
  },
  "setup_identity": {
    "repo": "Anil-matcha/AI-Youtube-Shorts-Generator",
    "source": "https://github.com/Anil-matcha/AI-Youtube-Shorts-Generator",
    "commit": "70c5fa96984cbc35b3b76a981a81c676117370ec",
    "source_revision": null,
    "os": "linux",
    "architecture": null,
    "backend": "hyperv",
    "model": "claude-haiku-5-5",
    "model_version": "claude-haiku-5-5",
    "agent_execution": "native_agent",
    "agent_runtime": "claude-code",
    "agent_runtime_version": "2.1.300 (Claude Code)",
    "tool_transport": "mcp-assigned-vm",
    "runtime": null,
    "runtime_version": null,
    "runtime_revision": null,
    "sandbox_source": null,
    "guest_setup": null,
    "source_pin": {
      "commit": "70c5fa96984cbc35b3b76a981a81c676117370ec",
      "url": "https://github.com/Anil-matcha/AI-Youtube-Shorts-Generator"
    },
    "platform_details": {
      "os": "linux",
      "backend": "hyperv"
    },
    "platform_conflicts": null,
    "reasoning": "low",
    "service_tier": null,
    "resources": {
      "cpus": 2,
      "memory_mib": 4096,
      "disk_mib": 32768
    },
    "operation": "Turn a YouTube URL (API mode) or a local video file (local mode) into ranked vertical shorts with python main.py",
    "operation_scope": "partial checks",
    "hosting": null,
    "kind": "repo",
    "test_version": "readme-bdc1b9b3c0d2673aef87e076d14084a8123ddcf09d520c1ee2e364a37c3f4bb9",
    "evidence_version": null
  },
  "other_model": null,
  "other_run_id": null,
  "models_agree": null,
  "furthest_model": null,
  "transcript_url": null,
  "report_url": "/reports/Anil-matcha--AI-Youtube-Shorts-Generator-claude-haiku-5-5-1792789641493602959.json"
}
