Commit graph

34 commits

Author SHA1 Message Date
39c41c689d Show why a picture could not be redrawn 2026-09-19 15:38:51 +00:00
03052f7182 The author can say what is wrong with a picture, and have it redrawn
report_frame_fault existed in the worker and was on no page.
2026-09-19 15:33:35 +00:00
00c4bc38b5 Say that the revision has started when Revise is pressed 2026-09-19 15:19:03 +00:00
c89a92e72f The price on Draw is the worker's own picture count, looks and back views included 2026-09-19 15:17:16 +00:00
c02eb5d511 Looks per scene, a change prompt on every character picture, click to enlarge
Each scene now shows who is in it as they look IN THAT SCENE, with one box:
'Change how Stewart looks from this scene on'. Cast cards show every look
front, side and back. Every picture opens large. The storyboard waits until
all pictures exist. A box for the author's notes on the script as a whole,
and Revise is always on offer.
2026-09-19 15:16:26 +00:00
3f5bd70f24 Remove the duplicated page tail left after the closing html tag
A dollar sign before a quote is a substitution token to patch_git_file, so a
price label spliced the rest of the page in after itself. trailer.html carried
33 KB of raw JavaScript after its closing tag, which rendered as garbled text
in the page body; script.html carried 65 KB, commented out. The copy above the
first closing tag was verified complete: it parses, and it defines every
function and calls every action the removed text did.
2026-09-19 13:51:23 +00:00
d7ac094c9c Recover a shot left stuck on "filming" by a worker restart
Third occurrence of this shape after cuts and the storyboard reel: a flag
meaning "work is happening" set before an in-memory thread starts, never
cleared when a deploy kills it, and a page that then hides the buttons for
ever. Anything older than 25 minutes is treated as gone.
2026-09-17 22:20:15 +00:00
a1ededf9c5 Repair the picture-check button, broken by a $-quote in patch text
A literal $' in replacement text is consumed as a special pattern by the
patch API, which truncated the block mid-string and swallowed the
if (unfilmed) line with it. BROWSER_TESTS.md records this exact hazard.
The price is now built by concatenating the dollar sign separately so no
$-quote sequence appears in patch text at all.
2026-09-17 20:58:07 +00:00
ac4ece69a5 Add the button that runs the picture check
Separate from filming on purpose: a re-film decision wants the audio and
picture verdicts together, and an existing film can be checked without
paying to shoot it again.
2026-09-17 20:57:20 +00:00
5eb4aac2cc Show what the picture check found, beside what the audio check found
Every clip has been transcribed and compared with its script since the first
film. Nothing looked at the picture, which is where this engine actually
fails - two identical photographs on a mantel, half a car, a person nobody
asked for. This renders the visual verdict the same way, and lists each
fault with the wording change that would have prevented it.
2026-09-17 20:57:07 +00:00
4d0d375dbb Honour the "and play" half once the audio is ready 2026-09-17 18:24:53 +00:00
f3cfb15d51 Play automatically when preparation finishes, and stop implying failure
"Prepare and play" only prepared. And a shot with no dialogue has no audio
by design, so 13 of 20 spoken is not 7 failures - say how many are silent.
2026-09-17 18:24:46 +00:00
acfc51b2d9 Keep refreshing while the storyboard audio is being prepared
The page polls only while it believes something is working, and preparing
the reel was not on that list - so the progress froze at whatever the last
manual refresh had seen (5/20) while the job ran happily to completion.

Also: treat a reel job older than 15 minutes as gone, the way cuts already
are, so a worker restart cannot leave the button disabled for ever; and
start playing automatically once preparation finishes, since "Prepare and
play" promised both.
2026-09-17 18:24:19 +00:00
153c38e6b8 Quote the storyboard from what will actually be drawn
The estimate was cast x 3 + shots x 2. It counted characters who appear in
no shot, whose sheets are skipped, and knew nothing about the per-day
wardrobe sheets a multi-day story needs. On the Memory Road board that is
73 quoted against 82 drawn.
2026-09-17 17:34:33 +00:00
0b11c4c262 Wire the storyboard player's controls
Jump-to scrolls to the shot and highlights it, so a note can be written
against the moment that was just heard.
2026-09-17 14:08:03 +00:00
fc858729f3 Play the storyboard: frames and narration, in order, at the top
Reviewing meant scrolling to a shot, pressing play, listening, scrolling to
the next - which destroys exactly the flow a trailer is made of, so faults of
sequence were the hardest to notice and the ones we kept shipping.

This plays the whole thing: opening frame, then closing frame, while the
shot's lines are spoken, then on to the next. Stop, or jump to any shot to
leave a note. It is the trailer before it is filmed, for cents of speech
rather than dollars of video.
2026-09-17 14:07:50 +00:00
70bf7758e3 Styles for the storyboard player, and make the tab score readable
"Claude Opus 5 ★75" is unreadable when the model's own name ends in a digit -
it was read as a score of 5. The score now sits in its own bordered pill.
2026-09-17 14:07:20 +00:00
efa861f227 Recover from a job killed by a deploy, and show when a cut reorders
cuts_state is set before the thread starts and cleared when it finishes, so
a deploy in between left the page waiting forever on work that was no longer
running, with the retry button hidden. Fifteen minutes is longer than the
work can legitimately take.

A cut may reorder as well as drop, which changes what it is - worth saying
rather than leaving the reader to spot it in the id list.
2026-09-17 12:51:27 +00:00
8a3e257637 Await the repaint before playing, and show each shot's day
openTab fetches the draft, so the video element did not exist 60ms later and
the first play was a no-op.
2026-09-17 12:45:04 +00:00
fabb7d2ed8 Load the watch-through numbers alongside the cuts
The views table already records how far every viewer of a share page got.
Once each published cut has its own page, "which version holds people" is a
query, and this is where the answer is shown.
2026-09-17 12:44:52 +00:00
7b4ee1895a Wire up the cuts: propose, play in order, publish
playCut steps one video element through the cut's clips. No render, no
upload, no cost - which is the whole reason ten proposals are worth looking
at rather than one.
2026-09-17 12:44:44 +00:00
73a8f5d166 Render the proposed cuts, with a free in-browser preview
A cut is an ordered list of shot ids, so previewing one costs nothing: the
page plays that cut's clips back to back. That is what makes asking for ten
proposals reasonable. Only a cut somebody chooses gets joined into a real
mp4 with its own share page, which is also what makes the watch-through
numbers comparable - one page per version.
2026-09-17 12:44:23 +00:00
800ba28387 Styles for the cuts panel and its player 2026-09-17 12:44:02 +00:00
170895644d Offer the revision when the script is over its running time
Revising was reachable only after readers had reviewed it or the author had
left a note. Being ninety seconds over budget is a reason to revise on its
own, and the button now says how much it will cut.
2026-09-17 12:18:09 +00:00
d94390d135 Put "Time it for real" on the bar and the result under the header
Nothing on the page could trigger the measurement, so the running time a
revision cuts against was only reachable through the API.
2026-09-17 12:16:10 +00:00
9a00b66b68 Show the script's measured running time, not the writer's estimate
The runtime in the header is the sum of the edit_seconds the writer typed,
which is a guess made from a word count. timingHtml renders what the lines
actually take when the cast speaks them, and how far over the target that
puts the trailer - which is the number a revision has to cut to.
2026-09-17 12:16:00 +00:00
8a668a9b25 Add the timing panel styles 2026-09-17 12:15:49 +00:00
e0301dc514 Show each shot's scene slug, so a wrong grouping is visible
Shots sharing a scene are drawn from one frame of that place. When the
grouping is wrong the symptom is a set that drifts, and until now the
slug doing the grouping was not on the page at all.
2026-09-17 12:14:36 +00:00
c900dce0aa trailer.html: show the story the writer worked out, above the script
The writer now reads the book and commits to what the story IS before writing
a single shot - premise, protagonist, the emotional engine stated as a moment,
what a viewer must understand, which moments have to be SHOWN rather than
narrated, and how it ends so it knows what it is withholding.

That document is worth more to an author than the script is. It is where a
misreading of the book is visible and cheap to fix; by the time it is
twenty-six shots and a storyboard it is neither. So it sits above the shots,
collapsed, and the two lists that decide whether the trailer works - what a
viewer must understand, and what must be dramatised - are open by default.

"What a viewer must understand" is also literally the checklist the
comprehension test measures against, so the two panels now read as a pair: here
is what it must convey, and here is what three readers actually took away.
2026-09-17 07:25:34 +00:00
50157f0d5b trailer.html: show what viewers understood, not what reviewers thought
The review panel rendered the old critique shape - errors, suggestions,
strengths. The comprehension test produces something else: three summaries
written by readers who saw only the script, and the writer's own list of what
the trailer failed to convey.

The gap list leads, because that is what the revision consumes and what the
author needs to decide about. Each reader's summary is then shown verbatim,
with what they were still asking and whether they would watch the film -
reading three strangers describe your trailer badly is the most persuasive
evidence there is that it does not tell the story.

"Got wrong" is called out separately from "missed". A trailer that leaves
something out is incomplete; one that leads a viewer to the wrong conclusion is
worse, and they are different problems to fix.
2026-09-17 06:45:22 +00:00
d21360ea2b trailer.html: edit, draw, film and reassemble one shot at a time
The trailer was all-or-nothing. If one shot was wrong - a line cut short, a
character duplicated, a scene missing from the front - the only lever was to
film all twenty-four again.

Every shot now carries its own controls: describe a change and have the writer
turn it into a proper shot, draw its two frames, film just that one, watch the
clip that came back, and read the machine check that compared what it says with
what the script says. "Add a scene here" sits between shots, because the note
that prompted this was that the trailer needed an opening the writer never
thought to include.

Assemble is separate and cheap - it joins whatever has been filmed - so
re-cutting after changing one shot costs nothing but the one shot.

Prices are on the buttons because they differ by two orders of magnitude:
rewriting a shot is cents, drawing it is fourteen, filming it is about a
dollar.
2026-09-17 06:31:29 +00:00
a20ed2d57b trailer.html: pick a head writer, read the reviews, revise, film
The four scripts had no next step. Everything after "read them" lived in the
API and nothing on the page reached it.

The choice of head writer is the author's, and it is a judgement about concept
rather than a score, so it is a button on each tab rather than a leaderboard.
Naming the lead first also changes what the reviews are for: three models
arguing about how to fix THIS script is a more useful argument than three
models arguing about whose is better.

Reviews are split the way they come back - errors are things that are wrong
and are worth fixing, suggestions are matters of judgement, and "keeps" is
what a revision must not quietly remove. The author's shot notes outrank all
of it and the revise button says so.

Film is priced and gated on having a storyboard, because every shot needs an
opening frame to film from.
2026-09-17 03:08:17 +00:00
c6788afba5 trailer.html: draw the storyboard, and show the cast sheets
The draw button is live and priced from what that writer actually wrote -
three sheets a character plus an opening and a closing frame a shot - so a
14-shot trailer costs $3.33 and a 30-shot one costs more, rather than both
being quoted an average.

Cast sheets render as head/front/side, because they are the thing that stops a
face drifting between shots and the author should be able to reject a face
before seventy pictures are drawn from it.

Progress is per picture rather than a spinner: drawing takes minutes and a
spinner that might mean "working" or "hung" is worse than a count.
2026-09-17 02:23:59 +00:00
5ea49c386c trailer.html: one tab per writer, with a play button and a note box
Reading a trailer tells you what happens; hearing it tells you the line is
four seconds too long and the grandmother sounds thirty. So the play button
ships before the draw button - speaking a whole trailer costs fractions of a
cent against five dollars to draw it - and it prints the spoken length against
the length the writer planned, which is the most common fault in these scripts.

The note box saves as you stop typing. A note you have to remember to save is
a note that gets lost when you switch tabs.

The draw button is priced from what the writer actually wrote - three sheets a
character plus an opening and a closing frame a shot - rather than from an
estimate, and is disabled until that stage lands.
2026-09-17 01:35:29 +00:00