@@ -92,9 +92,9 @@ buttons, Video Count toggle) are not part of this flow. See § 4.3.
9292- 3D camera blocking view (S5 right panel). Candidate for a later slice on
9393 ` packages/model3d ` .
9494- In-dialog painting. Brush, palette and eraser open the existing image editor
95- on the still; the result comes back as a new version.
95+ on the still. The result comes back as a new version.
9696- PDF or share-link export. ZIP stays.
97- - Changes to the Director prompt beyond genre, scenes and lighting; changes to
97+ - Changes to the Director prompt beyond genre, scenes and lighting. Changes to
9898 Assemble, the timeline, or the script editor.
9999- Inferring the flow from a plain prompt. A plain prompt on the New Project
100100 surface keeps going to the project agent. Shape selection across
@@ -104,9 +104,9 @@ buttons, Video Count toggle) are not part of this flow. See § 4.3.
104104### 4.3 Non-goals
105105
106106- No plan gating or upsell chrome in the flow. Studio's account page owns plan
107- state; the flow never shows a remaining-projects banner.
107+ state. The flow never shows a remaining-projects banner.
108108- No second board component. ` StoryboardBoard ` gains scene headers and card
109- affordances; the Studio page and the workspace tab keep hosting it.
109+ affordances. The Studio page and the workspace tab keep hosting it.
110110- No change to what ` Start ` does on the New Project surface. The flow is
111111 reached only through the explicit Storyboard entry (§ 6.0).
112112
@@ -141,15 +141,15 @@ Boards saved before this PRD carry no stage and read as `done`.
141141
142142Stepper across the top, ` 1. Idea ` active. Heading "What's your story?",
143143subline "We'll turn it into a screenplay and storyboard." Three inspiration
144- chips seeded from the shipped example boards' loglines; one click fills the
144+ chips seeded from the shipped example boards' loglines. One click fills the
145145textarea. The prompt card keeps ` @ ` mentions, ref images and entities. ` / `
146146skill completion is off inside the flow. Placeholder: "One sentence is enough,
147147or paste a full script."
148148
149149Right column, three option cards and one tutorial card:
150150
151151- ** Upload your file** (PDF, DOCX, FDX). See § 8 for the extraction path and
152- the error contract. The text lands in the textarea; FDX also yields typed
152+ the error contract. The text lands in the textarea. FDX also yields typed
153153 scenes and dialogue that step 2 uses verbatim.
154154- ** Import your shotlist** (CSV). "Download template" serves a static file.
155155 Import creates scenes and shots, sets ` setupStage: "look" ` , and advances to
@@ -173,24 +173,24 @@ board. `Back`, `Review your screenplay`.
173173(when present) the parsed script. On success the store applies the screenplay
174174and sets ` setupStage: "review" ` . On failure the stage stays ` genre ` and the
175175error shows on the button. Closing the tab mid-call loses the in-flight result
176- only; rerunning is the recovery.
176+ only. Rerunning is the recovery.
177177
178178** Review.** The screenplay as text: title, logline, then each scene as a
179179slugline header with its lighting note, and the shots beneath as action lines
180180with dialogue. Every field is editable inline and writes through the store
181- (` updateShot ` , ` updateScene ` ); the document is the draft, since nothing else
181+ (` updateShot ` , ` updateScene ` ). The document is the draft, since nothing else
182182writes it during review. ` Re-direct ` sends the current screenplay back to the
183183Director as context and applies the revision through ` setScreenplay ` , which
184184already merges by shot id and keeps media. Shots the revision drops are
185- removed; new ones are appended. ` Back ` returns to genre and keeps the
185+ removed. New ones are appended. ` Back ` returns to genre and keeps the
186186screenplay. ` Continue to storyboard ` sets ` setupStage: "look" ` .
187187
188188** Imported scripts.** An FDX yields typed paragraphs, so scenes and dialogue
189189are built deterministically by the parser: one scene per ` Scene Heading ` , one
190190shot per ` Action ` paragraph or dialogue block, ` dialogue ` set from the
191191` Character ` and ` Dialogue ` paragraphs verbatim. The Director is asked only for
192192camera, motion and duration per shot and may not alter ` dialogue ` or scene
193- order; a post-check (` verifyImportedText ` ) compares the returned dialogue and
193+ order. A post-check (` verifyImportedText ` ) compares the returned dialogue and
194194scene sequence against the parse and restores the parsed values where they
195195differ, with a review-step notice naming the shots it corrected. PDF and DOCX
196196yield plain text, so the Director structures it and the same post-check flags,
@@ -256,7 +256,7 @@ Card:
256256Toolbar during and after a batch: ` Retry N failed ` appears while any shot's
257257last job failed and retries each with its saved fields. A banner "Style
258258changed. N stills and M clips are stale. Re-render stills" appears when § 7.4
259- finds stale versions; clicking renders stills only, clips stay stale until
259+ finds stale versions. Clicking renders stills only, clips stay stale until
260260` Render clips ` .
261261
262262Batch jobs are server jobs. A board closed mid-batch reattaches on open: the
@@ -274,7 +274,7 @@ selection footer from Phase 0 keeps only `Edit`, `Iterate`, `Regenerate`,
274274 overwrite. Version pager ` k / n ` .
275275- ** Right.** The existing takes gallery: every version, select or delete.
276276- ** Header row.** ` SCENE N: ` slugline as a dropdown that runs ` moveShot ` to the
277- end of the chosen scene; the scene's lighting note, editable.
277+ end of the chosen scene. The scene's lighting note, editable.
278278- ** Table row.** Scene, Shot, Description, Dialogue, ERT, Size, Perspective,
279279 Movement, Equipment, Focal length, Aspect ratio, Notes. Field mapping in
280280 § 7.2. Aspect ratio is the board's value, read-only, linking to Board
@@ -283,7 +283,7 @@ selection footer from Phase 0 keeps only `Edit`, `Iterate`, `Regenerate`,
283283 speaker; ` Edit in script ` opens the script at the first line. The script
284284 owns words. On an unlinked board the cell is a textarea.
285285- ** ERT on a linked board.** Shows the value with the existing ` from takes ` /
286- ` pinned ` chip. Typing a value pins it (` duration_source: "manual" ` ); the
286+ ` pinned ` chip. Typing a value pins it (` duration_source: "manual" ` ). The
287287 chip toggles back to ` audio ` , which restores the takes' duration. On an
288288 unlinked board it is a plain number.
289289- ** Script panel** for a linked board stays below the table.
@@ -293,7 +293,7 @@ Save semantics: the table row and the header row are a draft. `Save` commits
293293the draft as one store update and one undo step. ` Regenerate ` saves first, then
294294renders from the saved fields. Closing with unsaved changes asks "Discard
295295changes?" with ` Save ` and ` Discard ` . Version selection, deletion, flip and
296- upload are not draft state; they commit immediately, as they do today.
296+ upload are not draft state. They commit immediately, as they do today.
297297
298298Keyboard: ` Esc ` closes (with the confirm above when dirty), ` ← ` /` → ` step
299299versions, ` Cmd/Ctrl+S ` saves.
@@ -341,10 +341,10 @@ render_inputs?: RenderInputs; // see 7.4
341341Equipment vocabulary in ` cameraOptions.ts ` : handheld, tripod, steadicam,
342342gimbal, dolly, slider, crane, drone.
343343
344- Table column → field: Description → ` action ` ; Dialogue → ` dialogue ` ; ERT →
345- ` duration_seconds ` with ` duration_source ` ; Size → ` camera.framing ` ;
346- Perspective → ` camera.angle ` ; Movement → ` camera.movement ` ; Equipment →
347- ` camera.equipment ` ; Focal length → ` camera.lens ` ; Notes → ` notes ` .
344+ Table column → field: Description → ` action ` . Dialogue → ` dialogue ` . ERT →
345+ ` duration_seconds ` with ` duration_source ` . Size → ` camera.framing ` ;
346+ Perspective → ` camera.angle ` . Movement → ` camera.movement ` . Equipment →
347+ ` camera.equipment ` . Focal length → ` camera.lens ` . Notes → ` notes ` .
348348
349349### 7.3 Ordering contract
350350
@@ -392,7 +392,7 @@ export interface RenderInputs {
392392Written when the job is enqueued and stored on the version when the asset
393393lands, so a render that finishes after a style change carries its
394394enqueue-time inputs. A version is ** stale** when its ` render_inputs ` differs
395- from the inputs the same shot would use now; the comparison is pure
395+ from the inputs the same shot would use now. The comparison is pure
396396(` isVersionStale(shot, board) ` ) and derived at render time, never persisted as
397397a flag. Versions without a record (legacy, upload, flip, image-editor edit)
398398are never stale. A keyframe-mode clip is also stale when its
@@ -424,7 +424,7 @@ never enter a prompt.
424424` setStylePreset(entityId) ` : one store operation, one undo step. Removes every
425425entity of kind ` style ` from ` board.entityIds ` , adds the chosen id, sets
426426` board.style ` to its descriptor. Per-shot include and exclude lists for
427- characters, locations and props are untouched; a per-shot exclusion of a style
427+ characters, locations and props are untouched. A per-shot exclusion of a style
428428entity is removed, since styles apply board-wide. Nothing renders. Staleness
429429follows from § 7.4.
430430
@@ -456,13 +456,13 @@ Columns, header row required, order free:
456456scene, shot, description, dialogue, duration_seconds, size, perspective, movement, equipment, focal_length, notes
457457```
458458
459- ` scene ` and ` description ` are required; a file missing either header is
459+ ` scene ` and ` description ` are required. A file missing either header is
460460refused with the missing names. Parsing is RFC 4180 through a real CSV parser:
461461quoted fields, embedded commas, multiline dialogue. A ` scene ` value that starts
462- with ` INT. ` , ` EXT. ` or ` INT./EXT. ` becomes the slugline; otherwise the scene is
462+ with ` INT. ` , ` EXT. ` or ` INT./EXT. ` becomes the slugline. Otherwise the scene is
463463named ` Scene N ` . Vocabulary columns match the option lists
464- case-insensitively; a non-match leaves the field unset. ` duration_seconds `
465- must be a positive number; otherwise unset. Every discarded value is listed in
464+ case-insensitively. A non-match leaves the field unset. ` duration_seconds `
465+ must be a positive number. Otherwise unset. Every discarded value is listed in
466466the import report (row, column, value) shown after import, so the creator can
467467fix it in the dialog. A row with an empty ` description ` is skipped and
468468reported.
@@ -471,7 +471,7 @@ reported.
471471
472472Shipped as system entities of kind ` style ` , one row each, read-only,
473473thumbnails under a ` package:// ` path, seeded the way example boards are.
474- ` Add your own style ` always creates a user-owned copy; a preset's descriptor
474+ ` Add your own style ` always creates a user-owned copy. A preset's descriptor
475475never changes under a user.
476476
477477## 8. Imports
@@ -503,26 +503,26 @@ imports the rest and shows the report.
503503
504504- ** D1 — One setup component, two hosts.** ` StoryboardSetupFlow ` renders
505505 inside the New Project tab and Studio home. The board's ` setupStage ` and
506- fields are the flow's state; there is no wizard store.
506+ fields are the flow's state. There is no wizard store.
507507- ** D2 — Explicit entry only.** The flow starts from the Storyboard card or the
508508 Studio "Make a video" card. A plain or ` /skill ` prompt on the New Project
509509 surface keeps going to the project agent. (Resolves F1.)
510510- ** D3 — Persisted stage, not inferred state.** ` setupStage ` decides where a
511511 board opens. No field value (shots, style, genre) is read as progress.
512512 (Resolves F2.)
513513- ** D4 — Review before pixels.** The Director runs at the end of step 2 and its
514- output is shown as text; no still renders before step 3's button.
514+ output is shown as text. No still renders before step 3's button.
515515- ** D5 — Scenes on the screenplay, one global order.** § 7.3. Assemble, the
516516 script link and the timeline keep reading ` shot.index ` . (Resolves F4.)
517517- ** D6 — Style preset = style entity, applied by one operation.** § 7.5. No
518518 ` stylePreset ` field. (Resolves F6.)
519519- ** D7 — Staleness is derived from a per-version render record.** § 7.4. No
520520 stale flag is stored. (Resolves F6.)
521521- ** D8 — Camera fields reach the prompt or they do not ship.** § 7.5 is in
522- scope for P1; the dialog's fields are not rearranged before their prompt
522+ scope for P1. The dialog's fields are not rearranged before their prompt
523523 effect exists. (Resolves F5.)
524524- ** D9 — The script owns words.** On a linked board dialogue is read-only in
525- the board and edited in the script; duration follows takes unless pinned,
525+ the board and edited in the script. Duration follows takes unless pinned,
526526 through the existing toggle. Studio still extracts a linked script, now at
527527 ` Continue to storyboard ` . (Resolves F3, Q1.)
528528- ** D10 — Imported dialogue is deterministic.** FDX dialogue and scene order
@@ -579,10 +579,10 @@ tests on the store and hooks, not on the parsers. The
5795793 . Genre appears in the Director prompt (asserted in the hook's test) and as a
580580 chip on the board.
5815814 . The review step renders the directed screenplay as text with no render job
582- started; a shot edited there is the shot that renders in step 3. Re-direct
582+ started. A shot edited there is the shot that renders in step 3. Re-direct
583583 keeps the ids and media of shots the revision retains.
5845845 . An FDX import's dialogue lines and scene order appear in the review verbatim
585- and in order, asserted against the fixture; a Director response that
585+ and in order, asserted against the fixture. A Director response that
586586 changes one is restored and the shot is named in the notice.
5875876 . Studio extracts the linked script at ` Continue to storyboard ` , from the
588588 reviewed screenplay.
@@ -595,10 +595,10 @@ tests on the store and hooks, not on the parsers. The
595595 Assemble's clip order equals ` shot.index ` .
59659610 . Each field marked yes in § 7.5 appears in the composed prompt for that mode
597597 and is absent otherwise, in the UI path and the headless path.
598- 11 . Hover toolbar: download saves the still or clip; duplicate inserts after
598+ 11 . Hover toolbar: download saves the still or clip. Duplicate inserts after
599599 the source with script links dropped and ` duration_source: "manual" ` ;
600600 delete asks once.
601- 12 . Entity names in a card's action render as chips; a shot with dialogue shows
601+ 12 . Entity names in a card's action render as chips. A shot with dialogue shows
602602 the filled icon.
60360313 . "~ M: SS remaining" appears only when a duration was measured for that model
604604 and kind.
@@ -607,13 +607,13 @@ tests on the store and hooks, not on the parsers. The
607607 read-only on a linked board and the ERT chip toggles ` duration_source ` .
60860815 . Flip, image-editor edits and uploads each add a version, never overwrite;
609609 upload selects the new version.
610- 16 . PDF, DOCX and FDX uploads land as text through the extraction route; a
610+ 16 . PDF, DOCX and FDX uploads land as text through the extraction route. A
611611 scanned PDF and a malformed file write nothing and show the § 8.2 notice.
612- 17 . A CSV missing ` scene ` or ` description ` is refused naming the header; a
613- multiline quoted dialogue cell imports intact; an invalid duration and an
612+ 17 . A CSV missing ` scene ` or ` description ` is refused naming the header. A
613+ multiline quoted dialogue cell imports intact. An invalid duration and an
614614 unknown vocabulary value import with the field unset and appear in the
615615 report.
616- 18 . A board closed during a batch shows the landed versions on reopen; failed
616+ 18 . A board closed during a batch shows the landed versions on reopen. Failed
617617 shots show Retry and ` Retry N failed ` retries only those.
61861819 . Every criterion above that is a document operation also passes when driven
619619 through the § 10 tools during setup and on the board.
@@ -627,7 +627,7 @@ tests on the store and hooks, not on the parsers. The
627627 genre, scenes and lighting, ordering operations in the store, ` shot-prompt `
628628 module wired into ` useGenerateShot ` and the headless render tools, render
629629 record on enqueue and land, ` isVersionStale ` , ` setStylePreset ` ,
630- ` duplicateShot ` , tool additions in § 10. No UI change. Ships alone; the
630+ ` duplicateShot ` , tool additions in § 10. No UI change. Ships alone. The
631631 board already benefits from prompt composition.
632632- ** P2 — Setup flow.** Entry cards, stepper, inspiration chips, genre grid,
633633 Direct with stage transitions, review view, aspect select, preset tiles from
@@ -648,13 +648,13 @@ P2 and P3 are independent after P1. P4 depends on P3's card footer.
648648
649649- ** R1 — Director quality with scenes.** Asking for scenes and shots in one
650650 structured call may lower shot quality. Evaluate on the shipped example
651- briefs before P2; fall back to two calls (scenes, then shots per scene).
651+ briefs before P2. Fall back to two calls (scenes, then shots per scene).
652652- ** R2 — Inspector removal.** Creators work in the docked inspector today. The
653653 dialog must reach parity (script panel, cost line, entity chips, duration
654654 toggle) before P4 removes fields.
655655- ** R3 — Prompt change alters existing renders.** § 7.5 adds lens, angle and
656656 lighting to every still prompt, so a regenerate after P1 differs from before.
657- Acceptable; the render record makes the difference visible as stale.
657+ Acceptable. The render record makes the difference visible as stale.
658658- ** R4 — Batch reattachment.** Criterion 18 depends on the generation store
659659 reconciling by job id on open. If today's overlay only tracks in-memory
660660 jobs, P3 adds the persisted pending-job list.
0 commit comments