UX: make the creation flow accessible for marketing, redactors, and product managers #1
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Problem
The current workflow was designed with a developer/AI-operator mental model. For a marketing team or redactor to use it independently, several friction points block them.
1. No way to bring in context from your own files
The only input today is a single free-text "Intent" field (+ voice). There is no way to:
For marketing, context is the work. A brief might be a PDF, a Word doc, or a Google Doc excerpt. Without a way to bring that in, users must manually summarise everything into a single text box — lossy and time-consuming.
2. Intent field is too narrow and unstructured
Marketing briefs have structure: audience, key message, tone of voice, call to action, platform/format. A single textarea discards all of that. The AI generates generic scenes because it lacks the context that lives in those fields.
Minimum structured brief fields needed:
3. Scene prompts are exposed as raw AI prompts
In the Planning step, each scene shows an Image Prompt and a Video Prompt textarea — raw AI generation prompts. A redactor or PM does not know what makes a good Stable Diffusion or Kling prompt. They think in terms of what the scene should show and feel, not model directives.
The interface should let them describe the scene in plain language and handle prompt engineering internally, or at minimum label/hide the technical fields behind an "Advanced" toggle.
4. No brand/campaign context at the collection level
Collections have only a Name. There is no place to attach:
Every project inside a collection starts from scratch, so brand consistency requires repeating the same context in every Intent field.
5. Pipeline step naming is technical
The steps Planning → Imaging → Video → Assembly map to the system's internal architecture. For non-technical users the natural language is closer to:
This is a label change but it meaningfully lowers the cognitive load for new users.
6. No per-scene editorial notes
A redactor reviewing AI-generated scenes needs to leave written feedback per scene before approving. Right now the only options are "Approve" or edit the raw prompt. There is no notes/comments field, so feedback has to happen out-of-band (Slack, email).
7. No script / storyboard import
Marketing teams often arrive with a pre-written script (numbered scenes, voiceover copy, shot descriptions). There is no way to import that structure — they would have to manually create each scene and fill in the fields one by one.
A plain-text import ("one scene per paragraph" or a simple numbered format) would unlock a large share of real-world workflows.
Acceptance criteria
Out of scope for this issue
Implementation Spec — Issue #1: UX for Non-Technical Users
Objective
Make the hero_videos creation flow accessible to marketing teams, redactors, and product managers by replacing raw-AI-prompt surfaces with plain-language fields, adding structured brief inputs at project creation, surfacing brand/campaign context at the collection level, adding per-scene editorial notes, enabling script/scene-list import, adding platform/format selection, and renaming pipeline steps to audience-appropriate language.
Architecture Context
crates/hero_videos_server/schemas/videos/schema.oschema— changing this triggersbuild.rswhich regeneratestypes_generated.rs,types_wasm_generated.rs, andosis_server_generated.rs. The generated files must never be edited by hand.crates/hero_videos_app/src/types.rsmirrors the generated types for WASM; it must be kept in sync manually.crates/hero_videos_server/src/rpc/mod.rs. New RPC methods must also be declared incrates/hero_videos_server/openrpc.json.crates/hero_videos_app/src/. Thecreate_projectcall currently receives onlycollection_id,name, andintent— this must be extended.crates/hero_videos_server/src/providers/ai.rssends the projectintentstring to the LLM. New structured fields will be synthesised intointentserver-side; no AI interface changes are needed.Requirements
style_notesandvisual_referencetoCollection; display in collection card and pre-populate project brief.Project:target_audience,key_message,tone_style,platform(enum:landscape_16_9,portrait_9_16,square_1_1),duration_target_s(integer).intentas a synthesised string derived from structured fields; the AI interface is unchanged.notes(editorial comment) toScene.image_prompttextarea behind an "Advanced" disclosure toggle by default; surface a plain-language "Scene Description" input instead.style_notesandvisual_referencefields.Files to Modify / Create
crates/hero_videos_server/schemas/videos/schema.oschemacrates/hero_videos_server/src/rpc/mod.rscreate_collection,create_project,update_scene; addimport_scenesRPCcrates/hero_videos_server/openrpc.jsoncrates/hero_videos_app/src/types.rscrates/hero_videos_app/src/components/collections_page.rscrates/hero_videos_app/src/components/projects_page.rscrates/hero_videos_app/src/components/editor/planning.rscrates/hero_videos_app/src/components/editor/mod.rsImplementation Plan
Step 1 — Extend the OSchema definition
File:
crates/hero_videos_server/schemas/videos/schema.oschemaDependencies: none
Add
style_notes: str,visual_reference: strtoCollection.Add
target_audience: str,key_message: str,tone_style: str,platform: str,duration_target_s: u32toProject.Add
notes: strtoScene.The
intent: strfield stays — it is the synthesised string fed to the AI.After saving, run
cargo build -p hero_videos_serverto trigger codegen before any other step proceeds.Step 2 — Sync WASM types
File:
crates/hero_videos_app/src/types.rsDependencies: Step 1
Add new fields to
Collection,Project, andScenestructs with#[serde(default)]so existing stored objects deserialise cleanly.Step 3 — Extend the server RPC handler
File:
crates/hero_videos_server/src/rpc/mod.rsDependencies: Step 1 (codegen must have run)
create_collection: accept optionalstyle_notesandvisual_referenceparams.create_project: accept optionaltarget_audience,key_message,tone_style,platform,duration_target_s; synthesiseintentfrom them when the free-text override is absent; prepend collectionstyle_notesif set.update_scene: accept optionalnotesparam.import_scenesmethod: parse a plain-text numbered scene list and create oneSceneper line; replace existing scenes only if none are approved.Intent synthesis (server-side, no AI call):
Step 4 — Update openrpc.json
File:
crates/hero_videos_server/openrpc.jsonDependencies: Step 3
create_collection,create_project,update_scene.import_scenes(params:project_id,script; result:Project).Collection,Project,Sceneschema components.Step 5 — Collections page UI
File:
crates/hero_videos_app/src/components/collections_page.rsDependencies: Step 2
style_notesandvisual_referenceinputs to the New Collection modal.create_collectionpayload.style_notes(truncated to 60 chars) below the collection name on the card.Step 6 — Projects page UI (structured brief)
File:
crates/hero_videos_app/src/components/projects_page.rsDependencies: Steps 2, 3, 4
<details>"Advanced" disclosure.key_message(orintentfallback) as the project card preview.Step 7 — Planning step UI
File:
crates/hero_videos_app/src/components/editor/planning.rsDependencies: Steps 2, 3, 4
Scene card changes:
VoiceInputin<details><summary>Advanced — AI prompt</summary>.notes, persisted viaupdate_scene).PlanningStep changes:
textarea+ "Import Scenes" button (callsimport_scenesRPC) + "Cancel" button.Step 8 — Rename pipeline step labels in editor
File:
crates/hero_videos_app/src/components/editor/mod.rsDependencies: none (cosmetic only, can run in parallel with Steps 5–7)
Apply same step label mapping as Step 6 wherever pipeline steps are rendered in the editor tab/header.
Dependency Graph
Steps 5, 6, 7, and 8 can all proceed in parallel once Steps 1–4 are done.
Acceptance Criteria
create_projectsynthesisesintentfrom structured fields; existing free-text intent path is preserved.update_scene.import_scenesRPC.cargo check --workspaceand WASM check both pass.Notes
types.rsis hand-written and must be kept in sync with the schema manually.intentfield must not be removed — the AI pipeline reads it directly.image_promptfield must not be renamed — the image generation worker reads it directly; "Scene Description" is a UI-only relabelling.import_scenesreplaces existing scenes only if none are approved; otherwise appends (to prevent data loss).Test Results
All tests passed. The 3 unit tests in hero_videos_server cover collection CRUD, project CRUD, and all-objects retrieval. The 1 ignored test is a doc-test placeholder in hero_videos_sdk.
Implementation Summary
All acceptance criteria from the spec have been implemented.
Changes Made
Schema & types (
crates/hero_videos_server/schemas/videos/schema.oschema,crates/hero_videos_app/src/types.rs):Collectiongainsstyle_notesandvisual_referencefieldsProjectgainstarget_audience,key_message,tone_style,platform, andduration_target_sfieldsScenegainsnotes(editorial comment) fieldServer RPC (
crates/hero_videos_server/src/rpc/mod.rs,sockets/mod.rs):create_collectionaccepts optionalstyle_notesandvisual_referencecreate_projectaccepts structured brief fields;intentis synthesised server-side from them (collectionstyle_notesis prepended as brand context when set); free-text intent override is still acceptedupdate_sceneaccepts optionalnotesimport_scenesmethod: parses a numbered plain-text scene list and populates scene cards (appends if any scene is already approved, replaces otherwise)OpenRPC spec (
crates/hero_videos_server/openrpc.json):Collections page (
crates/hero_videos_app/src/components/collections_page.rs):style_notes(truncated to 60 chars) below the nameProjects page (
crates/hero_videos_app/src/components/projects_page.rs):key_message(falls back tointent)Planning step (
crates/hero_videos_app/src/components/editor/planning.rs):update_sceneimport_scenesRPC and populates scene cardsEditor step labels (
crates/hero_videos_app/src/components/editor/mod.rs):Test Results
cargo check --workspaceand WASM check both cleanAcceptance Criteria Status
create_projectsynthesisesintentfrom structured fields; existing free-text intent path is preservedupdate_sceneimport_scenesRPC