Files and outputs
The folder of a film, the files each verb writes into out/, and the run log that records every call.
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.
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 draftA draft is a fast render at half size and 30 fps, with sound, made by vawe dev. |
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 finalA final is the full-quality render: 60 fps, motion blur and the mixed audio, followed by a final check. |
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. A render stores its captured frames in <out>.frames-<key>/. See kept framesThe kept frames are the captured frames that a render stores in a folder named after its render key..
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 run logThe run log is out/<film>.runs.jsonl, one JSON line for each command with its stage, time and result..
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:
{"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
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).
From the blogAI agent observability: one JSONL line per command