---
title: Video E2E visibility
description: Run local end-to-end video generation and inspect the inputs, IR, frames, FFmpeg logs, and output video.
section: Video
order: 4
updatedAt: 2026-05-24
slug: video/e2e
---
# Video E2E visibility

The Video E2E path should make the whole generation pipeline inspectable:

1. YAML input
2. Parsed Composition IR
3. Rendered frame images
4. FFmpeg command and logs
5. Final encoded video
6. Summary metadata

## Run the deterministic E2E test

From the video repository:

```bash
cd ~/Code/cuitty/video
node --import tsx --test packages/render/src/e2e.test.ts
```

The test parses a YAML composition, checks the generated IR, renders frames when Playwright and FFmpeg are available, and verifies the output artifact.

## Run the visible artifact workflow

Use the visible workflow when you want to keep artifacts after the run:

```bash
./run e2e:visible
```

The visible workflow should write a timestamped directory under the E2E artifacts root. Keep that directory when debugging local failures or uploading CI artifacts.

Expected files:

| Artifact | Purpose |
| --- | --- |
| `input.yaml` | Exact DSL input used by the test. |
| `composition.ir.json` | Parsed and normalized Composition IR. |
| `render-options.json` | Render options passed into the renderer. |
| `frames/` | Sampled frame HTML and PNG files. |
| `ffmpeg/args.json` | Encoder command arguments. |
| `ffmpeg/stderr.log` | Captured encoder stderr. |
| `trace-events.json` | Renderer trace events from composition through encode. |
| `output/e2e-smoke.mp4` | Final rendered video. |
| `output/ffprobe.json` | ffprobe metadata when ffprobe is available. |
| `manifest.json` | Artifact index with dimensions, frame count, codec, size, and timings. |
| `summary.md` | Human-readable CI summary. |

## CI expectations

CI 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.

## Troubleshooting

If rendering is skipped, check for missing local prerequisites:

```bash
ffmpeg -version
node --import tsx --test packages/render/src/e2e.test.ts
```

Use CLI `--dry-run` to separate DSL or IR failures from browser and encoder failures:

```bash
cuitty-video render composition.yaml --dry-run
```