← Projects In progress 2025–

Spiral

An AI filmmaking tool built around revision, not one-shot prompts: seven AI departments that argue their way to a locked film, on the record.

Open the prototype replay a production diary · or bring your own key

  • 7departments, one artifact each
  • 4gates, ideation to post
  • 5roles in the one harness
  • 2films it grew out of

How do seven AI departments agree on one film?

you · three jobs choose the treatment · answer what can't be guessed · judge the takes a fourth when a disagreement outlives its rounds: decide
producer · owns the brief the only channel to you subscribed to every ASK and every cost · guesses what is cheap to undo
director · owns the vision + spine rules, never writes subscribed to every FLAG and OFFER · uphold, modify, dismiss
one writer Story owns the script
one writer Look & Cast owns the bibles
one writer Camera owns the shot list
one writer Sound owns the audio timeline
one writer Unit + Edit owns the cut
the production diary · append-only gate.opened · dept.woke · artifact.committed · flag.raised · ruling.issued · guess.taken · offer.made · asset.rejected every event carries its actor, its cause and its cost · every screen is a projection of it · nothing is ever edited
  1. 01 of 04

    A treatment, chosen by a person.

    You pick the film from the treatments offered, answer the questions nobody can guess, and judge the takes. That is the whole job. The Producer is the only department that talks to you, and it guesses anything that is cheap to undo.

  2. 02 of 04

    Each department writes exactly one thing.

    Story owns the script. Look & Cast owns the bibles, Camera the shot list, Sound the audio timeline, Unit the cut. No department messages another, and nobody edits anyone else's artifact. A department can only write its own, and read what the others have locked.

  3. 03 of 04

    Camera's shot list cites a character nobody has written yet. Who catches it?

    • Camera, when it re-reads the script
    • A flag against the lock, ruled on by the Director
    • You, at the gate

    A flag. A department that thinks another's work is wrong raises a flag against a named lock; the Director rules (uphold, modify, dismiss) and the owner revises. Rounds are capped. A gate cannot close until every department the locks bind has read the latest version.

  4. 04 of 04

    Everything lands in the log first.

    There is no database. Every wake, commit, flag and ruling is an appended event with an actor, a cause and a cost, and the board, the margins, the call sheet and the dailies are all projections of it. Delete a projection and replay; the film is the log.

It began as one agent and a dependency graph. It is now seven departments and one rule: a gate cannot close until every department the locks bind has read the latest version.

Three things that broke. What would you have done?

What broke

Ask a department for the whole shot list and the answer arrives cut off, or valid JSON about the wrong shots.

What would you have done?Why, the fix, and what it changed
Why

One call cannot hold a thirty-second film at lock resolution, and a model asked for shots 3A–3D will cheerfully return 1A–1D.

Fix

Every artifact is written in parts: one scene per call, a handful of ids per call, and each retry asks for fewer ids until it is asking for one. The resolver pins the answer to the ids it asked for and merges it in; a batch about the wrong ids is refused, not committed.

Result

A failed call costs one part, not the gate. The same code is the recovery path: "write the missing parts" is the only retry button.

The full story
What broke

The shot list invented shots the script never wrote, and the render sheet happily prompted them.

What would you have done?Why, the fix, and what it changed
Why

Two departments each believed they owned the list of shots.

Fix

The script decides which shots exist. The shot list is checked against it, never the other way round; drift is named on the board, and the human can waive it or send Story back.

Result

One source of truth per fact, enforced by a projection, not by a prompt asking everyone to be careful.

The full story
What broke

The design said order would fall out of subscriptions. The first shot list cited character ids nobody had written yet.

What would you have done?Why, the fix, and what it changed
Why

Subscriptions carry changes. They cannot order first drafts, because an empty artifact emits nothing to subscribe to.

Fix

First drafts at each gate run in dependency order: Story, then Look & Cast, then Camera, Sound and Unit in parallel. Everything after the first draft is subscription and staleness, as designed.

Result

The orchestrator the design refused to have exists, but only for the opening move of a gate. The rest of the gate is still unscripted.

The full story
The deep dive
  • Claude API
  • Multi-agent orchestration
  • Event sourcing
  • React
  • Product design

Most AI video tools assume filmmaking is linear: prompt in, video out. Real work isn’t like that. It’s revision, where every change ripples into everything downstream. Spiral is a tool that works that way from the start, and shows its reasoning as it goes so your judgment stays in the loop. It is what making thisness and Samudra Manthan by hand taught me to want.

It has had two versions. The first was one agent revising one film through a typed dependency graph, with locks, cascades and a converge step. That taught me the primitives, and then it hit the wall every single-agent tool hits: one context window cannot hold a director’s taste, a cinematographer’s eye for what a video model can actually generate, and a sound designer’s argument about whose clock the film runs on. Real crews split that up and then argue. So the current version is a council. You type one sentence. Seven departments take it through four gates and hand back a render sheet, an edit sheet and a mix sheet you follow in your own tools, and every argument along the way is on the record. Each section below is one mechanism in a line and a picture; the page it links to is the how.

Version one: a dependency graph that hit the single-agent wall

node story
edit here scene
node shot
node frame
cascade ↓
  • auto-propagatetext-only, free
  • flag for reviewyou decide
  • hard-invalidateregenerate
locks style · character · motif · voice — injected into every prompt downstream, so the film stays one film
converge gathers what's unresolved, works out the consequences, walks you through settling them. Then, and only then, paid generation.

Version one: a film as a typed dependency graph (story, scene, shot, frame). An edit anywhere cascades downstream in one of three modes; locks for style, character, motif and voice are injected into every prompt below them; a converge step settles what is unresolved before anything paid is generated. Seven prototype iterations in plain HTML, CSS and JavaScript. Every one of those mechanics survives in the council, and the wall it hit is why there is one. The first design →

Four gates, from logline to delivery

gate →
Ideation locks logline · beats · spine
Pre-production locks script · bibles · shot list
Production locks every take you accepted
Post locks the cut · the mix · delivery
Producer
leads
active
active
leads
Director
leads
active
watches dailies
leads
Story
leads
leads
advises
advises
Look & Cast
sketches
leads
critiques
grades
Camera
advises
leads
critiques
advises
Sound
sets the spine
temp track
leads
leads
Unit + Edit
—
runs tests
leads
leads
Departments persist; stages gate. The lead changes hands as the film moves from words to pictures to sound to the cut, and a department that is not at a gate is not woken.

Four gates: ideation locks the logline, the beats and the spine; pre-production locks the script, the bibles and the shot list; production locks every take you accepted; post locks the cut, the mix and delivery. You have three jobs across all of them (choose the treatment, answer what cannot be guessed, judge the takes) and a fourth when a disagreement outlives its rounds. The gates, and how one closes →

A department is a row in a table and a five-step wake

code assemble decides what this task sees: the locks that bind it, what changed since it last read them, its open flags, its last rationale. The bundle is recorded.
model generate writes one part of the artifact it owns, and may FLAG, ASK or OFFER on the side.
model · a different prompt critique scores the proposal on three named dimensions against the locks; can force one revision before commit.
code resolve pins the answer to the ids it asked for, merges the part in, bumps the lock, routes flags to the Director and asks to the Producer.
code record appends every step, with its cause and its cost, to the log. Then the department sleeps.
The generator and the critic are the same department in different roles: a different prompt, and, in the design, a different model family. Everything else is code, and cannot be talked out of anything.

A department is a row in a table: the one artifact it owns, the locks it subscribes to, the question its critic asks. Every department, at every gate, runs through the same five-step wake. The design had nine departments; the build has seven, and the two merges are one row each. Departments are data → · One harness, five roles →

One writer per artifact; the Director rules

targets your own artifact PROPOSE a new part of the one thing you own. Becomes a commit when the resolver accepts it.
targets someone else’s artifact · against a lock FLAG a concern, with a severity: note · revise · block. Read-only; it cannot change anything by itself.
targets the human, via the Producer ASK a question only you can answer, with why it matters, a best guess, and the undo cost of guessing.
targets any artifact · at most one per wake OFFER something nobody asked for, noticed while reading another department’s work, with a text preview.

One writer per artifact. A department that thinks another’s work is wrong raises a flag against a named lock; the Director rules; the owner revises. No department ever calls another. Every gap in the brief becomes a guess if it is cheap to undo, or a question for you if it is not. The four messages and the four rules →

A gate closes on a table, not a feeling

seen ↓ · current →
visionv1
spinev1
scriptv5
biblesv2
shot_listv3
audiov2
open flags
Produceractive
v1
v1
v5
v2
v3
v2
none
Directoractive
v1
v1
v5
v2
v3
v2
none
Storylead
v1
v1
–
v2
–
v2
none
Look & Castlead
v1
–
v4
–
–
–
none
Cameralead
–
v1
v4
v2
–
–
1
Soundtemp track
v1
v1
v4
–
v3
–
none
Unit + Edittests
–
–
–
v2
v3
v2
none
not converged script moved to v5; Look & Cast, Camera and Sound last read v4 and will be woken as critics. Camera has one flag open. The gate closes when every cell is green and no revise or block flag is open.

A gate closes on a table, not a feeling: no revise-or-block flag open, and every active department has evaluated the current version of every lock that binds it. This is version one’s cascade made honest: a change to the script does not propagate to Camera, it makes Camera stale, and stale departments are woken to re-read. Rounds are capped; loops end in a question, never in silence. Convergence, staleness and the round cap →

There is no database: every screen is a projection of the log

one event
id
evt_m1x…
at
10:42:18
gate · round
ideation · 3
actor
camera · critic · model · camera@v2
caused_by
evt_m1w… (artifact.committed)
type
flag.raised
target
script an artifact, never a department
against
spine@v1
payload
severity · reason · suggested
cost
1.8k in · 0.4k out · $0.011 · 6.2s
why? · walk the chain back
  1. gate.opened you “a 10-second clip of high fashion in the slums of India”
  2. ask.answered you shoot treatment B: the fitting
  3. lock.changed director vision → v1 · spine → image_led
  4. dept.woke story writing the beats · bundle recorded
  5. artifact.committed story script v1 · the turn is in beat 3
  6. flag.raised camera on script, against spine · revise: beat 2 needs hands
  7. ruling.issued director uphold · Story keeps the hands off screen
  8. artifact.committed story script v2 · resolves the flag
projections · rebuilt from the log
  • board
  • margins
  • call sheet
  • render sheet
  • dailies
  • ledger
  • inspector
If one is ever wrong, delete it and replay. Drag the scrubber and every screen shows the project as it stood after event N.

There is no database. Every change is an appended event with an actor, a cause and a cost, and every screen is a projection rebuilt from the log. So “why did this happen?” walks a chain back to the sentence you typed, “what did it see when it decided?” is the recorded bundle, and the whole film can be scrubbed back to any event. The log is the film → · One loop, nine events →

Surprises live in offers, never in locks

sound · generator, one extra question “reading this, is there something worth offering?” noticed while: reading script v2 — beat 4 ends on a held frame with no sound line
offer.made · targets the audio timeline drop the score two bars early preview: the cue as text · if accepted: the last 2.5s carry only the street · cost so far: nothing
you · on the call sheet
try itnot now
tried → the owner incorporates it and every stale critic re-reads · passed → recorded in the dailies as offered, not taken

Every generator is asked one extra question on every wake: reading this, is there something worth offering that nobody asked for? Surprises live in proposals, never in locks (the film is offered to you, not changed under you) and the dailies keep the roads not taken. Engineering surprise →

The council writes text; you render

the council writes · text only the render sheet
  • referencesone image prompt per character and environment in the bible
  • shotsone video prompt each, carrying that shot’s native-sound line and the standing negative verbatim
  • music · voice · SFXone prompt each for a text-to-music or voice tool
you render · in your own tools copy · paste · generate then report, per take, with a note
accept reject → rewrite skip
a rejection is an event the owner rewrites that one prompt “change what the note names; keep the same subject description, the same native sound line, the same negatives.” Every stale critic re-reads, cheaply.
the gate closes when every item on the sheet has a take accepted or skipped, no revise-or-block flag is open, and every critic has read the current sheet. The budget is the number of times you clicked accept.

The council writes text. Nothing renders inside it. You render every prompt in your own tools and report accept, reject or skip per take; a rejection with a note rewrites that one prompt. Iteration in text is free; anything that costs money is a click you made. That line was drawn in version one and has not moved. The render sheet → · The board, and its three depths →

A working prototype, with no film through it yet

  1. v0 · built the log and one worker planned: an events table, projections as views, one worker that wakes departments by subscription in the prototype: an append-only array in the browser, projections rebuilt on every event, the five-role harness, subscription and staleness
  2. v1 · not built durable execution planned: workflows that sleep for days waiting on a human, activities with retries and heartbeats in the prototype: a wake is a chain of fetches in a tab; close the tab mid-round and the round is lost, though the log is not
  3. v2 · built the board planned: board, margins, call sheet, ledger over server-sent events; inspector last in the prototype: all six surfaces, including the inspector, the scrubber and export / import of the whole diary
  4. v3 · not built telemetry and provenance planned: OpenTelemetry spans; a manifest on every rendered asset; signed credentials at export in the prototype: frames are rendered by hand outside the council, so there is nothing yet to attach a manifest to
  5. v4 · built offers and dailies planned: the extra question on every wake, a surprise budget, the recorder’s digest in the prototype: one offer per department per wake; dailies written from the log at every gate close, with the roads not taken

A working prototype, in a browser, one model playing every role, no film delivered through it yet. The log, the board, offers and dailies are real; durable execution and provenance are not. Two of the design’s bets are still untested, and the question version one left open, one user to many, is still open. Design versus build → · The design document →

Go deeper