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?
-
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.
-
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.
-
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.
-
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 brokeAsk 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
One call cannot hold a thirty-second film at lock resolution, and a model asked for shots 3A–3D will cheerfully return 1A–1D.
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.
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 storyWhat brokeThe 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
Two departments each believed they owned the list of shots.
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.
One source of truth per fact, enforced by a projection, not by a prompt asking everyone to be careful.
The full storyWhat brokeThe 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
Subscriptions carry changes. They cannot order first drafts, because an empty artifact emits nothing to subscribe to.
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.
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 storyMost 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
- auto-propagatetext-only, free
- flag for reviewyou decide
- hard-invalidateregenerate
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
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
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
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
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
- 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
- gate.opened you “a 10-second clip of high fashion in the slums of India”
- ask.answered you shoot treatment B: the fitting
- lock.changed director vision → v1 · spine → image_led
- dept.woke story writing the beats · bundle recorded
- artifact.committed story script v1 · the turn is in beat 3
- flag.raised camera on script, against spine · revise: beat 2 needs hands
- ruling.issued director uphold · Story keeps the hands off screen
- artifact.committed story script v2 · resolves the flag
- board
- margins
- call sheet
- render sheet
- dailies
- ledger
- inspector
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
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
- 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
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
- 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
- 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
- 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
- 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
- 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
- The first design: version one, the dependency graph, the cascades and the locks, and the wall it hit.
- Departments are data: seven rows, what each owns, and why nine became seven.
- One harness, five roles: assemble, generate, critique, resolve, record; who sees what.
- Four messages, four rules: propose, flag, ask, offer; single writer; the Director rules; guess or ask.
- Gates and convergence: the stage table, the staleness table, the round cap.
- The log is the film: events, projections, the why chain, time travel, the ledger, the dailies.
- Engineering surprise: offers, previews, the roads not taken.
- The render sheet: production and post, by hand.
- The board: six surfaces, three depths.
- One loop, nine events: a script rewrite, settled without an orchestrator.
- Against the plan: what the prototype built, skipped, and has not yet tested.
- The design document: the September 2026 proposal the council was built from.
- The prototype: run it.