Skip to main content
A caller that builds on DeckTalk reads four things and nothing else: the --json result of each command, the events file of each run, the files in build/final/, and the exit code. Those four keep their shape within a schema version, and a change to one of them is a new schema. Everything else under build/ is DeckTalk’s private cache. Its files and their shapes are what Build artifacts describes, which is how the engine works today and not a promise. A newer release that cannot read a cache file builds it again, except the paid records below.

The result of a command

Every command prints one flat JSON object with --json, and every library call returns the same object as a frozen model. decktalk schema NAME prints the JSON Schema of one command’s result, and decktalk schema with no name prints every command with the result it answers with, the exit codes and the error codes. The same schemas are committed in the repository under schemas/v1/results/, one file per command, in the folder the schema number names.

The events file

Every run of a project appends one JSON object per line to build/events/<run>.jsonl, where <run> is the run of the result. --events prints the same lines on stderr as they happen. Every line carries event, which names its kind, and time, seq and run. seq counts within the run, so a reader can tell a gap from a lost line. The last line of a run is run.done, with the run’s outcome and, when it failed, the same error the result carries. decktalk schema event prints every kind and every field, and the same schema is committed in the repository as schemas/v1/events.json.

build/final/

The deliverables, named after [project] name, which is <name> below.

Exit codes

The paid records

Four kinds of file record money spent, so they are never treated as a cache. Each stays where it is and is never deleted by DeckTalk. The take store sits outside every project, and a take is written there first, once, when it is bought. A take’s suffix is the one its voice declares for the format it asks for, which is .mp3 for every ElevenLabs format. A newer release reads the words files and the ledger or refuses them with a sentence. It never builds one again and never deletes one, because counting a paid record as absent would buy what it records again. The refusal says so, and leaves the file where it is for the person whose money it is. A take no section plays any more stays too, and decktalk status lists it so its author can remove it with git rm. The take index, takes.json, is not one of them. It is a cache over the takes on disk, which narrate builds again from them when it does not read, so a broken index buys nothing.