# Files and outputs

> The folder of a film, the files each verb writes into out/, and the run log that records every call.

Canonical: https://vawe.dev/docs/files-and-outputs

This page lists where vawe keeps a film and what each verb writes. The sources are the usage text of `bin/vawe <verb> --help`, `harness/media/render-page.mjs`, `harness/media/frames.mjs`, `harness/media/ship-job.mjs` and `harness/lib/`.

## The folder of a film

`bin/vawe new <name>` writes `films/<name>/`. A film carries its own files.

| Path                           | What it is                                                                   | Written by                                      |
| ------------------------------ | ---------------------------------------------------------------------------- | ----------------------------------------------- |
| `films/<name>/page.html`       | The page. The film                                                           | `new`, then you                                 |
| `films/<name>/brief.md`        | The brief, with the Board and the Motion pass                                | `new`, then you                                 |
| `films/<name>/directions.html` | Three key frames side by side, one per family, before any motion             | `new`                                           |
| `films/<name>/assets/`         | The fonts, images and audio of the film. Relative paths only                 | `new` copies the starter face. You add the rest |
| `films/<name>/DESIGN.md`       | Palette roles, type, ground and light, one line per rung of the skill ladder | you, at stage 3                                 |
| `films/<name>/kit/`            | The ground layers and the parts that move, each its own element              | you, at stage 3                                 |
| `films/<name>/frames.html`     | The key frames of the worlds, with a click-to-zoom view                      | `frames`                                        |

A recreation lives in `films/recreations/<name>/` and holds `SPEC.md`. See [Match a reference film](https://vawe.dev/docs/match-a-reference).

## The out folder

Every render goes to `out/` in the vawe checkout. `<name>` is the folder name of the film. A `--param` or `--aspect` adds a suffix, such as `-look-riso` or `-2x1`, so two renders do not overwrite each other.

| File                                     | Verb                                                    | What it is                                                                         |
| ---------------------------------------- | ------------------------------------------------------- | ---------------------------------------------------------------------------------- |
| `out/<name>-draft.mp4`                   | `dev`                                                   | The <Term id="draft">draft</Term>                                                  |
| `out/<name>-draft-<from>-<to>.mp4`       | `dev --from --to`                                       | A window of the draft. It is silent                                                |
| `out/<name>-draft.png`                   | `dev`                                                   | The key-frame sheet, next to the mp4                                               |
| `out/<name>-draft-full.png`              | `dev`                                                   | A full-size still of one review frame, for you to read                             |
| `out/<name>.dev.md`                      | `dev`                                                   | Every note of the last draft, including the taste lines                            |
| `out/<name>.acceptance.json`             | `dev` of the whole film (no `--from` or `--to`), `ship` | The acceptance rows and their history                                              |
| `out/<name>.checks.json`                 | `dev`                                                   | The stored result of each draft check, so an unchanged page runs no check again    |
| `out/<name>-frames/<id>.png`             | `frames`                                                | One still per world                                                                |
| `out/<name>-frames.png`                  | `frames`                                                | The contact sheet                                                                  |
| `out/looks-<name>/`                      | `frames --looks`                                        | One grid per second of lens looks                                                  |
| `out/still/<name>-<s>s.png`              | `still`                                                 | One frame                                                                          |
| `out/strip/<film>/`                      | `strip`                                                 | The grids. `--onion` writes `out/onion/<film>`, `--velocity` writes `out/velocity` |
| `out/sheet-<name>.png`                   | `sheet`                                                 | A labelled contact sheet                                                           |
| `out/<name>-animatic.mp4`                | `animatic`                                              | The timing check of the key frames                                                 |
| `out/<name>-storyboard.html`             | `storyboard`                                            | A board with a card per world                                                      |
| `out/<name>.mp4`                         | `ship`                                                  | The <Term id="final">final</Term>                                                  |
| `out/<name>.web.mp4`                     | `ship`                                                  | A small web copy beside the master                                                 |
| `out/<name>-9x16.mp4`                    | `ship --aspect all`                                     | One final per aspect, with the aspect in the name (`9x16` for 9:16)                |
| `out/ship-jobs/<id>.json` and `<id>.log` | `ship`                                                  | The state and the log of a background final. The id starts with the film name      |
| `out/<name>.approved`                    | `approve`                                               | The sign-off of the owner. `ship` needs one that matches the page                  |
| `out/<name>.judge.json`                  | `judge --verdict`                                       | A recorded PASS or FIX                                                             |
| `out/<name>-waveform.png`                | `sound --waveform`                                      | The mixed waveform                                                                 |
| `out/<name>.runs.jsonl`                  | every verb                                              | The run log                                                                        |

The `ship` verb refuses to run without the approval file. See [Ship](https://vawe.dev/docs/ship). A render stores its captured frames in `<out>.frames-<key>/`. See <Term id="kept-frames">kept frames</Term>.

## The run log

Every call of `bin/vawe` appends one JSON line to `out/<film>.runs.jsonl`. A call that names no film goes to `out/_unfiled.runs.jsonl`. The log tells you where the time went, what failed and why, and whether each draft fixed what the last one flagged. See <Term id="run-log">run log</Term>.

Each line starts with the same fields (`harness/lib/runlog.mjs`):

| Field          | What it is                                                 |
| -------------- | ---------------------------------------------------------- |
| `at`           | ISO time of the write                                      |
| `cmd`          | The kind of event                                          |
| `film`         | The film key                                               |
| `session`      | The Claude Code session id, or null                        |
| `agent`        | `VAWE_AGENT`, else the session plus a short tag            |
| `model`        | `VAWE_MODEL`, else `CLAUDE_CODE_SUBAGENT_MODEL`, else null |
| `git`          | The short commit of the checkout                           |
| `trackedDirty` | True when tracked files have changes                       |

Set `VAWE_AGENT=<name>` and `VAWE_MODEL=<model>` in your shell, one name per agent. A subagent shares the session id with its parent, so only `VAWE_AGENT` tells them apart.

### Events

| `cmd`     | When                                        | Fields it adds                                                                                                                                                                                        |
| --------- | ------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `verb`    | Every call                                  | `verb`, `args`, `stage`, `start`, `durationS`, `exitCode`, `error`, `slotWaitS`, `images`, `tagged`, and `pageHash`, `help`, `usage`, `refused` when they apply                                       |
| `new`     | `vawe new`                                  | `template`, `length`, `answered`, `guessed`, `signature`                                                                                                                                              |
| `dev`     | A draft                                     | The seconds of each phase (`captureS`, `encodeS`, `audioS`, …), `frames`, `fps`, `width`, `height`, `workers`, `checksS`, `acceptance`, `rules_fired`. A failed draft has `failed: true` and `reason` |
| `judge`   | A judge run                                 | `stage`, `verdict`, `scores`, `total`, `notes`, `waivers`                                                                                                                                             |
| `ship`    | A final ends                                | `verdict`, `renderS`, `acceptance`. A failed final adds `failedAt`, `reason` and `page`                                                                                                               |
| `approve` | `vawe approve`                              | `verdict`, `note`, `draft`, `pageHash`                                                                                                                                                                |
| `read`    | An agent reads an image that a verb printed | `image`                                                                                                                                                                                               |

A `verb` line from a failed draft, trimmed:

```json
{"at":"2026-10-31T18:20:27.510Z","cmd":"verb","film":"colour-sting","agent":"6d021684#e5d4","git":"4d9a5acb4","verb":"dev","args":["films/examples/colour-sting/page.html","--silent","--no-judge","--fast","--out","/ref-draft.mp4"],"stage":"dev","durationS":2.8,"exitCode":1,"error":"exit 1: error: Error: ENOENT: no such file or directory, mkdir '/ref-draft.mp4.frames-..."}
```

### Read the log

```bash
bin/vawe runs my-film
bin/vawe runs --all
bin/vawe runs --taste
bin/vawe runs my-film --json
```

| Call                    | What it prints                                                                                                                |
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------- |
| `bin/vawe runs <film>`  | Where a film’s time went, per stage and verb, with the slot wait. What failed, by cause. The draft series                     |
| `bin/vawe runs --all`   | One row per film of the last 30 days: drafts, median draft seconds, first and best judged total, PASS. Then medians per model |
| `bin/vawe runs --taste` | The taste report over every film: per rule fired, fixed, waived and the score gain                                            |
| `--json`                | The records, or with `--all` or `--taste` the report, as JSON                                                                 |
| `--dir <path>`          | The folder that holds the `.runs.jsonl` files. Default `out`                                                                  |

A corrupt line in the log is dropped when it is read, not an error (`readRuns`).

{/* sources (vawe 4d9a5acb4):
  films/<name> files: harness/cli/new.mjs:472-473, 525-535; AGENTS.md stage 3 table row
  frames.html: harness/media/frames.mjs:4
  out file names: harness/cli/verbs.mjs lines 121, 164, 214, 217, 237, 378, 414, 537, 581, 635; harness/media/frames.mjs:4-8; harness/media/render-page.mjs:10, 988-996, 1109, 1171; harness/lib/check-runner.mjs:19 (saved only with cache on: render-page.mjs:1241, the dev draft); acceptance written by draftAcceptance when the render is whole (render-page.mjs:1127) and finalAcceptance (ship-job.mjs:114); draft-full.png: harness/live/dev-end.mjs:21; harness/media/acceptance-run.mjs:2; harness/lib/approval.mjs:14
  ship jobs: harness/media/ship-job.mjs:10
  run-log fields and events: harness/lib/runlog.mjs, harness/lib/run-events.mjs, harness/lib/verb-log.mjs, harness/live/log-read.mjs:29
  bin/vawe runs: bin/vawe runs --help
  example line: out/colour-sting.runs.jsonl, a failed run on this checkout
  */}
