{
  "slug": "video/e2e",
  "title": "Video E2E visibility",
  "description": "Run local end-to-end video generation and inspect the inputs, IR, frames, FFmpeg logs, and output video.",
  "url": "https://cuitty.com/docs/video/e2e",
  "markdown_url": "https://cuitty.com/docs/video/e2e.md",
  "json_url": "https://cuitty.com/docs/video/e2e.json",
  "frontmatter": {
    "title": "Video E2E visibility",
    "description": "Run local end-to-end video generation and inspect the inputs, IR, frames, FFmpeg logs, and output video.",
    "order": 4,
    "section": "Video",
    "updatedAt": "2026-05-24"
  },
  "headings": [
    {
      "depth": 1,
      "slug": "video-e2e-visibility",
      "text": "Video E2E visibility"
    },
    {
      "depth": 2,
      "slug": "run-the-deterministic-e2e-test",
      "text": "Run the deterministic E2E test"
    },
    {
      "depth": 2,
      "slug": "run-the-visible-artifact-workflow",
      "text": "Run the visible artifact workflow"
    },
    {
      "depth": 2,
      "slug": "ci-expectations",
      "text": "CI expectations"
    },
    {
      "depth": 2,
      "slug": "troubleshooting",
      "text": "Troubleshooting"
    }
  ],
  "body_markdown": "# Video E2E visibility\n\nThe Video E2E path should make the whole generation pipeline inspectable:\n\n1. YAML input\n2. Parsed Composition IR\n3. Rendered frame images\n4. FFmpeg command and logs\n5. Final encoded video\n6. Summary metadata\n\n## Run the deterministic E2E test\n\nFrom the video repository:\n\n```bash\ncd ~/Code/cuitty/video\nnode --import tsx --test packages/render/src/e2e.test.ts\n```\n\nThe test parses a YAML composition, checks the generated IR, renders frames when Playwright and FFmpeg are available, and verifies the output artifact.\n\n## Run the visible artifact workflow\n\nUse the visible workflow when you want to keep artifacts after the run:\n\n```bash\n./run e2e:visible\n```\n\nThe visible workflow should write a timestamped directory under the E2E artifacts root. Keep that directory when debugging local failures or uploading CI artifacts.\n\nExpected files:\n\n| Artifact | Purpose |\n| --- | --- |\n| `input.yaml` | Exact DSL input used by the test. |\n| `composition.ir.json` | Parsed and normalized Composition IR. |\n| `render-options.json` | Render options passed into the renderer. |\n| `frames/` | Sampled frame HTML and PNG files. |\n| `ffmpeg/args.json` | Encoder command arguments. |\n| `ffmpeg/stderr.log` | Captured encoder stderr. |\n| `trace-events.json` | Renderer trace events from composition through encode. |\n| `output/e2e-smoke.mp4` | Final rendered video. |\n| `output/ffprobe.json` | ffprobe metadata when ffprobe is available. |\n| `manifest.json` | Artifact index with dimensions, frame count, codec, size, and timings. |\n| `summary.md` | Human-readable CI summary. |\n\n## CI expectations\n\nCI should upload the visible artifact directory for every E2E run, including failures. That makes a failed render debuggable without reproducing the exact runner state locally.\n\n## Troubleshooting\n\nIf rendering is skipped, check for missing local prerequisites:\n\n```bash\nffmpeg -version\nnode --import tsx --test packages/render/src/e2e.test.ts\n```\n\nUse CLI `--dry-run` to separate DSL or IR failures from browser and encoder failures:\n\n```bash\ncuitty-video render composition.yaml --dry-run\n```",
  "links_out": []
}