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.

PathWhat it isWritten by
films/<name>/page.htmlThe page. The filmnew, then you
films/<name>/brief.mdThe brief, with the Board and the Motion passnew, then you
films/<name>/directions.htmlThree key frames side by side, one per family, before any motionnew
films/<name>/assets/The fonts, images and audio of the film. Relative paths onlynew copies the starter face. You add the rest
films/<name>/DESIGN.mdPalette roles, type, ground and light, one line per rung of the skill ladderyou, at stage 3
films/<name>/kit/The ground layers and the parts that move, each its own elementyou, at stage 3
films/<name>/frames.htmlThe key frames of the worlds, with a click-to-zoom viewframes

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.

FileVerbWhat it is
out/<name>-draft.mp4devThe draftA draft is a fast render at half size and 30 fps, with sound, made by vawe dev.
out/<name>-draft-<from>-<to>.mp4dev --from --toA window of the draft. It is silent
out/<name>-draft.pngdevThe key-frame sheet, next to the mp4
out/<name>-draft-full.pngdevA full-size still of one review frame, for you to read
out/<name>.dev.mddevEvery note of the last draft, including the taste lines
out/<name>.acceptance.jsondev of the whole film (no --from or --to), shipThe acceptance rows and their history
out/<name>.checks.jsondevThe stored result of each draft check, so an unchanged page runs no check again
out/<name>-frames/<id>.pngframesOne still per world
out/<name>-frames.pngframesThe contact sheet
out/looks-<name>/frames --looksOne grid per second of lens looks
out/still/<name>-<s>s.pngstillOne frame
out/strip/<film>/stripThe grids. --onion writes out/onion/<film>, --velocity writes out/velocity
out/sheet-<name>.pngsheetA labelled contact sheet
out/<name>-animatic.mp4animaticThe timing check of the key frames
out/<name>-storyboard.htmlstoryboardA board with a card per world
out/<name>.mp4shipThe finalA final is the full-quality render: 60 fps, motion blur and the mixed audio, followed by a final check.
out/<name>.web.mp4shipA small web copy beside the master
out/<name>-9x16.mp4ship --aspect allOne final per aspect, with the aspect in the name (9x16 for 9:16)
out/ship-jobs/<id>.json and <id>.logshipThe state and the log of a background final. The id starts with the film name
out/<name>.approvedapproveThe sign-off of the owner. ship needs one that matches the page
out/<name>.judge.jsonjudge --verdictA recorded PASS or FIX
out/<name>-waveform.pngsound --waveformThe mixed waveform
out/<name>.runs.jsonlevery verbThe 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):

FieldWhat it is
atISO time of the write
cmdThe kind of event
filmThe film key
sessionThe Claude Code session id, or null
agentVAWE_AGENT, else the session plus a short tag
modelVAWE_MODEL, else CLAUDE_CODE_SUBAGENT_MODEL, else null
gitThe short commit of the checkout
trackedDirtyTrue 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

cmdWhenFields it adds
verbEvery callverb, args, stage, start, durationS, exitCode, error, slotWaitS, images, tagged, and pageHash, help, usage, refused when they apply
newvawe newtemplate, length, answered, guessed, signature
devA draftThe seconds of each phase (captureS, encodeS, audioS, …), frames, fps, width, height, workers, checksS, acceptance, rules_fired. A failed draft has failed: true and reason
judgeA judge runstage, verdict, scores, total, notes, waivers
shipA final endsverdict, renderS, acceptance. A failed final adds failedAt, reason and page
approvevawe approveverdict, note, draft, pageHash
readAn agent reads an image that a verb printedimage

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
CallWhat 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 --allOne 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 --tasteThe taste report over every film: per rule fired, fixed, waived and the score gain
--jsonThe 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

On this page