Lifecycle update (2026-07-21): Video Story is now maintenance-only and a feature mine for existing projects/frozen APIs. New long-term production-engine behavior belongs in standalone Hermes Video and is promoted into tenant-local Caduceus Video through the versioned capability contract. For new concept→blueprint→contract work, canon, durable jobs, attempts, deterministic finishing, editing, recovery, and promotion, load
hermes-video-production. Continue using this skill for Video Story compatibility, repair, and migration evidence.
references/legacy-video-hub-to-tenant-module-audit.md when auditing a standalone video factory absorbed into a tenant-local product: distinguish domain/human/agent/runtime parity; trace plugin paths through the real gate; challenge in-memory “durable worker” claims; inspect adapter no-ops, deployment-image dependencies, state/credential migration, exact supplied-frame workflows, accounting drift, and one real disposable-tenant production.references/chat-video-delivery-brief-vs-actual-2026-06-08.md for the chat-delivery correction: when Alex asks for a video, a brief/contact sheet/project is not the deliverable; send an actual MP4 in-chat, and if the full AI pipeline is slow/stalled, make a deterministic 9:16 fallback MP4 from references + captions + TTS/ffmpeg while the full render continues.references/visible-speaker-reference-lock-2026-06-05.md for the June 2026 visible-speaker/reference-lock lesson: real-person quote/parables videos need named-character identity binding, dialogue segment typing, B-roll limits, duration enforcement, and QA; prompt wording alone is insufficient.references/seedance-storyboard-no-last-frame-workflows-2026-06-02.md for the June 2026 Seedance storyboard no-last-frame audit pattern: 3×3 Grid and Storyboard Refs must be treated as reference-workflows rather than first/last-frame workflows; audit provider defaults, UI/backend guards, and fal endpoint tests together.references/wan27-ltx23-i2v-integration-2026-06.md for the June 2026 Wan 2.7 / LTX 2.3 I2V integration pattern: prefer newer I2V/R2V models for precise/storyboard workflows when export can trim to audio timing; keep Wan 2.2 as fallback; avoid text-to-video unless explicitly requested.references/ltx23-fal-video-beat-unprocessable-2026-06-02.md for the LTX 2.3 fal grouped-beat Unprocessable Entity failure pattern: Seedance grouped beats can produce durations/resolutions outside LTX's allowed enum values; normalize via the selected video profile before retrying and persist provider payload/error bodies.references/brief8-classic-ltx-fal-10s-smoke-test-2026-06-02.md for the exact-duration LTX/fal smoke-test pattern: full classic timeline can overrun a 10s target via narration planning, so provider/model smoke tests may need a direct LTX call from Creative assets plus ffmpeg trim/ffprobe verification.references/generated-subject-video-qa-alan-watts-2026-06-05.md for the generated subject-video QA pattern: when a user supplies a real-person/reference image, enforce single-subject reference lock, no unrequested new characters, export-level readable text, duration verification, and post-render video-watch QA before delivery.references/production-intent-blueprint-anti-overstory-2026-06-05.md for the top-of-pipeline production-intent fix: classify quote/documentary/music/ad/ambient/story intent first; carry subject policy, reference lock, allow-new-humans, narrative policy, and visual boundaries through downstream story/scene/shot prompts so Video Story does not force every request into a fictional hero/seeker/transformation arc.references/real-person-quote-talking-portrait-voice-lipsync-2026-06-05.md for the real-person quote/talking-portrait contract: the referenced person must be visible and lip-synced when requested, generated script should be dialogue/quotes only unless narration is explicitly requested, and master-audio exports must avoid doubled speech from lip-synced clip audio mixed under narration.references/product-music-video-zero-character-analysis-2026-06-05.md for the product/music-video analysis pitfall: product-focused classic YOLO prompts can fail with Analysis produced no characters; until product-only analysis is supported, include one minimal abstract performer/hand model/mascot or promote the product as the hero entity without letting it become a fictional protagonist.references/adaptive-production-blueprint-implementation-2026-06-05.md for the adaptive preflight/production-blueprint implementation pattern: model profiles as production contracts, timeline modality maps, no-spend approval summaries, classifier edge-case tests, and route/port smoke verification.references/direct-audio-driven-talking-portrait-fallback-2026-06-05.md for the direct-provider fallback lesson: for simple real-person/reference quote videos, prefer an audio-driven talking portrait model (image_url + audio_url) before forcing Video Story through story/scene/shot planning; use Video Story only as a comparative/richer pipeline attempt unless the user asks for that complexity.references/seedance-fal-audio-ref-public-url-2026-06-06.md for the Seedance/fal audio-ref failure pattern: generated TTS segment paths like /home/avalon/apps/video-story/uploads/...mp3 must be converted/uploaded to provider-accessible URLs before being stored in video_beats.audio_urls_json or sent as fal audio_urls; otherwise fal returns generic Unprocessable Entity.references/elevenlabs-audio-api-integration-2026-06-03.md: ElevenLabs API integration guidance for VideoStory audio: TTS provider selection, voice/character mapping, Text-to-Dialogue, SFX/music beds, STT alignment/captions, audio isolation, voice changer, dubbing, and why direct API integration should be primary over Eleven Creative Studio.references/image-model-smoke-test-2026-06-03.md: VideoStory image model smoke-test pattern for checking every core/advanced model, verifying generated S3 URLs, and preserving provider quirks such as Replicate FLUX resolution enums and Nano Banana 2 thinking_level values.references/hermes-creative-brief-to-videostory-ltx-fal.md: Hermes Creative brief handoff into Video Story with classic timeline, LTX 2.3 on fal.ai, provenance-preserving recovery from missing references, export stability checks, and duration-target caveats.references/seedance-provider-audio-duration.md: Seedance provider-audio strategies, export audio preservation, and short-duration target guardrails.references/seedance-3x3-grid-pipeline-semantics-2026-06-02.md: 3×3 Grid / seedance_storyboard_grid contract: one contact-sheet board, one timing/scene/shot unit, single @Image1 Seedance reference prompt, no default narration/dialogue.references/seedance-3x3-yolo-smoke-tests-2026-06-02.md: short 10s two-variant 3×3 smoke-test pattern; verify one timing unit/scene/shot/beat, use explicit audio strategies, and remember Hermes/API-triggered YOLO needs generate-story + analyze before /yolo.references/seedance-3x3-provider-routing-not-found-2026-06-02.md: after 3×3 semantics pass, distinguish provider Not Found routing/model failures from story/timeline/scene regressions; includes DB contract checks and triage steps.references/seedance-3x3-video-phase-no-last-frame-ui-2026-06-02.md: 3×3 Video tab/backend gating pattern: label the grid as the single reference, hide Last Frame UI, and allow single-shot video queueing without last_frame_url.references/video-model-profile-ui-selector-2026-06-02.md: Homepage/API pattern for showing per-mode default model badges and compact model dropdowns wired to video_model_profile project creation/update.HERMES_API_SERVER_URL + HERMES_API_SERVER_KEY), which routes text/script work through Alex's main Hermes provider — currently OpenAI Codex OAuth/subscription rather than billable OpenAI API keys.OPENAI_API_KEY is configured, then direct Anthropic API as final fallback.invalid x-api-key from story/script generation, inspect the whole provider chain. A visible Anthropic 401 can be a secondary fallback failure after OpenRouter returned 402 insufficient credits or after the Hermes bridge is not configured. Test Hermes /v1/chat/completions, OpenRouter credits, Anthropic auth, and OpenAI fallback independently, and keep LLM failures separate from fal/image billing failures.references/llm-provider-fallback-and-auth-2026-05-31.md for the provider-chain debugging and verification recipe.Hermes Creative video briefs should map into video-story's native reference model rather than arrive as generic prompts. Treat Creative as the upstream brand/vault intelligence layer and video-story as the execution workspace for video drafts.
Implemented baseline (commit 068cf7b, 2026-05-30): video-story supports project_mode='social_creative', Creative provenance tables (creative_imports, creative_import_assets), token-protected POST /api/hermes/creative-brief-drafts, idempotent draft creation by Creative project slug + brief id, entity/guide-image seeding, and UI banner/label changes for imported social creative drafts. Draft import never starts YOLO automatically.
Live-audit pitfalls (2026-05-31): Creative media assets may arrive as relative /media/... URLs that only resolve on hermes-creative.apps.poofc.com, not on video-story.apps.poofc.com; normalize/prefix these to absolute Creative public URLs before storing or sending to providers. Also infer vertical aspect ratios from slash-style social channels like reel/instagram, not only exact enum values such as instagram_reels.
Expected mapping:
- Creative character_reference assets → characters plus guide_images.
- Creative set_reference assets → sets plus guide_images; preserve the existing set rule: empty environment, no people/characters.
- Creative prop_reference / product_reference assets → props plus guide_images; preserve object-only/no people unless deliberately specified.
- Creative style_reference assets and prompt fragments → project.reference_style_prompt and project.frame_style_prompt.
- Creative logo_reference assets → overlay/end-card/logo reference fields in the derived video project.
- Creative brief strategy/copy → script seed, beat outline, hook, CTA, duration, aspect ratio.
Bridge safety: creating a video-story project from a Creative brief should create a draft only. Do not launch YOLO/rendering automatically unless the Creative review state and Alex's instruction explicitly approve execution. See Hermes Creative reference phase-2-media-reference-and-video-bridge-2026-05-30.md.
Workflow recommendations (2026-06-01): Creative handoffs should include a video_story_workflow recommendation instead of relying on Video Story to hard-code one mode. Keep seedance_cinematic as the default production recommendation, but preserve explicit workflow requests such as seedance_storyboard_refs, seedance_storyboard_grid, seedance_prompt_batch, and seedance_dialogue. Video Story should normalize the recommendation through its own workflow/profile registry and persist generation_mode, video_model_profile, workflow_mode, visual_planning_mode, export_strategy, reference_strategy, and audio strategy from that resolved workflow. See references/hermes-creative-workflow-recommendations-2026-06-01.md.
project_mode='social_creative', production beat sheets are not narration. Visual:, Overlay:, CTA/Note:, beat labels, timing labels, and production notes must never be sent to TTS.segmentSocialCreativeForAudio() / extractSocialCreativeBeats() in server/llm.js to parse beat sheets and create audio segments from Voiceover: fields only. This fixed the Brief 7 failure where the narrator spoke the entire beat metadata and stretched a 30s reel into ~209s./api/projects/:id/generate-audio and the internal /yolo audio step. Do not let YOLO call generic segmentStoryForAudio() for social creative projects; that regression caused Brief 8 to narrate beat metadata until patched.tests/server/social-creative-script.test.js; keep them passing when changing social/ad script generation. For live Creative reruns, inspect script_segments.text before video generation and confirm it contains only spoken voiceover copy.beats[].visual, overlay_text, voiceover, production_note, timing) and feed scenes/shots from that structure instead of re-parsing plain text.character_reference entities during the Analysis / Define Scenes / Breakdown Shots path. In the 2026-05-31 North Star Venus–Jupiter test, Creative imported Venus/Jupiter transparent god assets as character references, but /api/projects/:id/analyze deleted the initially seeded characters and recreated scenes with glyph/prop language; /define-scenes then wiped scene_characters, and /breakdown-shots emitted characters_visible: [] for the transit shots.characters contains the imported characters with reference_image_url / guide_image_url.scene_characters links those characters to the relevant scenes.shots.characters_visible is not [] for shots meant to show the imported characters.creative_import_assets where slot_role='character_reference', insert matching guide_images, relink scenes, and patch shot prompts before frame generation. Durable product fix: make social analysis preserve imported character references through scene and shot generation automatically.image + last_image)appearance fieldNarrator in their place. Script segments should be only the requested speaker's dialogue/quotes unless narration glue is explicitly requested. In master-audio exports, strip/mute generated clip audio unless it is explicitly ambience/SFX-only; lip-synced clip speech mixed under the master track creates doubled/overlapping voices. See references/real-person-quote-talking-portrait-voice-lipsync-2026-06-05.md.reference_priority (required|recommended|optional|prompt_only), reuse_scope, and reference_reason; bulk generation should default to required/recommended only. One-off props, chat text, notifications, overlays, transient VFX, abstract motifs, atmosphere/mood, and set dressing should usually stay prompt-only while still appearing in scene/shot prompts. First/last-frame workflows reduce the need for one-shot prop refs because the first frame can carry local continuity into the last frame. See references/continuity-reference-prioritization-2026-06-02.md.guide_images table stores multiple guide photos per entity (entity_type, entity_id, image_url, sort_order)guide_image_url column on characters/sets/props stays in sync (first guide image)/:entityType/:id/guide-images, DELETE /guide-images/:guideIdguide_images array attached to each entity via attachGuideImages() helpergetGuideImageUrls() from guide_images tablereference_image_url unless the user explicitly requests an "edit existing reference" behaviorimage_url vs image_urls, PuLID single ref, Qwen caps, etc.).fileInputRefs use a ref object keyed by ${type}_${id} for per-card file inputsreference_image_url = NULL without deleting guide images
- Endpoint pattern: DELETE /api/:entityType/:id/reference-imagegenerate-advanced endpoint builds prompt via buildCharacterPrompt/buildSetPrompt/buildPropPrompt when empty prompt sent
- IMPORTANT: disable generate while entity save is in flight (saving) so users cannot save and immediately regenerate against stale DB state⚙️ Account button above the Video Story titlefixed inset-0 z-50 flex justify-end pattern as ActivityPanel / DetailPanelGET /api/account/overviewserver/account-status.js is the source of truth for:noteCivitai offers two API surfaces:
- Site API (https://civitai.com/api/v1): Browse/search models, images, creators, tags, AIR identifiers. Public endpoints; authenticated for /me.
- Orchestration API (https://orchestration.civitai.com): Submit generation jobs, polls, blobs. Requires Authorization: Bearer <token>.
allowMatureContent: true does NOT bypass downstream provider safety filters. It only controls whether Civitai masks mature blob URLs in responses. The actual generation still passes through the selected engine's moderation.enablePromptExpansion: true (default). Even with explicit pornographic prompts, output was nsfwLevel: "pg". For potentially mature prompts through Qwen, consider enablePromptExpansion: false or use a different engine.1000 Buzz ≈ $1 in some routes. Use whatif=true for exact cost previews.GetWorkflow for fresh signed URLs if the first expires.wait=0 and poll for status. Inline waiting times out for most jobs.hideMatureContent query param on workflow endpoints controls URL visibility, not generation behavior.GET /api/v1/me (Site API), not the orchestrator.GET https://api.fal.ai/v1/account/billing?expand=creditsFAL_KEY, the UI must show balance unavailable and explain that billing reads require an ADMIN keyGET https://api.replicate.com/v1/account returns account identity (e.g. username) but does not expose remaining credit balance in the currently used API flowserver/account-status.js imports dotenv/config directly so standalone scripts/tests loading it still see .env$0.07/video WAN estimate for Seedance projects.video_beats.requested_duration_s for grouped Seedance workflows; fall back to pending framed shots and video_requested_duration_s/duration_ms when no beats exist./api/projects/:id/cost-estimate and frontend VideoPhase inline “remaining” estimate.references/seedance-cost-estimation-2026-06-01.md for the session-derived implementation pattern and no-disruption verification nuance.references/seedance-dialogue-audio-strategies-2026-06-02.md for the Seedance dialogue audio strategy pattern: prompt-native audio vs audio refs, provider routing, beat-level audio refs, and export rules for preserving provider audio.references/seedance-dialogue-smoke-test-ops-2026-06-02.md for the short ≤6s Seedance Dialogue smoke-test recipe, including the current fal reference profile routing, manual one-shot recovery for stalled shot breakdown, first-frame-as-last-frame unblock, and ffprobe/provenance verification.<a download> fails on iOS PWAyoloStep (camelCase), recent logs arrayrefreshKey every 5s during YOLO. ALL phase components
(Analysis, Timeline, Images, Video, Export) must accept refreshKey prop and include it in their
useEffect fetch dependency array: useEffect(() => { fetchData() }, [project.id, refreshKey])Math.floor(duration_target / 60) for sub-minute targets; use seconds-aware labels (6s, 45s, 1m 15s). For prompt-native/silent/visual-first modes that do not generate local TTS, scale placeholder script/timing segments to duration_target so story/timeline planning cannot expand a 6s or 10s request into a 40–50s composition.breakdownShots() LLM decides cinematography; code computes duration_ms from segment timestamps-t flag-t ${audDuration} (not -shortest)actual_video_duration_ms stored after generation for drift monitoringBeat N, Scene N, panel/take headings, markdown headings, timing labels, or production notes enter TTS segmentation; they become bogus audio slots and desync scenes/shots/lip-sync. Strip them before segmentStoryForAudio() and keep classic story prompts free of structural labels. See references/classic-timeline-nonspoken-headings-audio-sync-2026-06-02.md.image_urls (array) for reference images — including Qwen standard Editimage_url (single string) which caused 422. ALL Qwen variants need array.advanced-images.js: kontext/reve use image_url (single), everything else uses image_urls (array)generate-advanced, server auto-builds from entity fields using same functions as default generatebuildCharacterPrompt/buildSetPrompt/buildPropPromptprompt: ''wan-2.7-atlas-i2v). Wan 2.2 via Replicate remains a legacy/fallback profile because it fits the older first/last-frame shot architecture and accepts sub-second-ish durations after app-side rounding/trimming.generation_mode, video_model_profile, requested duration, audio strategy, and actual sent prompt/provider/model at generation time.video_model_profile into project creation/update. See references/video-model-profile-ui-selector-2026-06-02.md.bytedance/seedance-2.0/image-to-video as the first Video Story integration over fal.ai reference-to-video: Atlas exposes explicit image (first frame) and last_image fields that map directly to the shot frame contract.4..15 seconds (-1 auto on Atlas). Seedance mode must be timing-aware upstream: generated clips must fit 4–15s, but beat boundaries should be story/content dependent, not mechanically derived by dividing target duration. Treat target duration as a creative budget / pacing constraint after understanding the story, storyboard, ad structure, hook/proof/CTA, and visual aims.video_beats clip per 4–15s beat, using the first covered shot's first frame and the last covered shot's last frame when the workflow is first_last. Export assembles video_beats directly for grouped Seedance projects instead of repeating/chopping the same beat per original shot.Seedance Cinematic / internal seedance_cinematic mode, and Precise Narrated Story for classic_timeline. Keep internal keys stable for compatibility.workflow_mode, visual_planning_mode, export_strategy, reference_strategy, and frameReferenceMode) and storyboard persistence (storyboards, storyboard_frames, storyboard_runs) so reference-to-video can produce one or more storyboard reference takes, 3×3 grid takes, or prompt-batch takes without distorting the classic shot timeline. The landing-page mode selector is selecting these workflow strategies, not merely providers; do not key copy/behavior solely off generationMode.startsWith('seedance') or experimental modes like seedance_dialogue will inherit misleading cinematic 4–15s warnings.Storyboard Refs and 3×3 Grid should be modeled as reference compositions/panels that can change inside a Seedance clip via references and prompt direction. UI/progress/generate-all-frame logic should consult frameReferenceMode and hide/skip mandatory last-frame generation for no-last-frame workflows.3×3 Grid / seedance_storyboard_grid is one contact-sheet board workflow, not nine scenes/shots/clips. Generate exactly one grid motion plan (Global motion direction + Panel 1–9), one visual timing unit, one scene, one shot/take, one grid reference image, and one Seedance @Image1 prompt that tells the model to read panels left-to-right/top-to-bottom with timestamped internal panel beats. Do not use generic first-frame/last-frame prompt language or require last_frame_url for this mode. Entity references are separate: character/set/prop refs must stay normal portraits/objects/locations and must not inherit 3×3/contact-sheet style language; only the shot/grid reference is a 3×3 contact sheet. The Video tab must also be mode-aware: label the image as 3×3 Grid Reference, hide any Last Frame / No frame panel, and let single-shot/backend queue gating proceed without last_frame_url. If manual or YOLO testing surfaces bad 3×3 semantics, stop the run before video spend and regenerate from corrected upstream phases. See references/seedance-3x3-grid-pipeline-semantics-2026-06-02.md and references/seedance-3x3-video-phase-no-last-frame-ui-2026-06-02.md.generate_audio: false) because Video Story audio/narration remains the master timeline. Do not present Seedance Dialogue as production-ready unless audio refs/lip-sync/replacement policy are implemented.video_audio_strategy='provider_native_audio', local TTS is skipped; Atlas still sends generate_audio:false; video_beats.audio_urls_json remains empty; and export normalizes clips with -an before only mixing project.audio_file_path if present. Result: silent clips/exports. Prefer fixing this by switching Dialogue to a TTS-backed master-audio strategy and optional lip sync rather than relying on provider-native Seedance audio. See references/seedance-dialogue-audio-gap-2026-06-02.md.Unprocessable Entity) so future log reviews can identify schema/enum mismatches without re-running./home/avalon/apps/video-story/.env ATLASCLOUD_API_KEY; Hermes root uses /home/avalon/.hermes/.env ATLASCLOUD_VIDEO_API_KEY.data.outputs[] (not only output, url, or video_url). If Video Story reports timed out ... Last status: completed, poll the Atlas prediction ID, extract data.outputs[0], upload to S3, and mark the shot video_status='complete' (not completed) so export can assemble it.@fal-ai/client import shape before debugging prompts or credentials. Use the documented import { fal } from '@fal-ai/client' shape; an import * as fal namespace may not expose fal.config, causing fal.config is not a function before provider generation starts. Also treat Videos: 0/N done as failure, not a completed YOLO run. See references/yolo-seedance-fal-and-wan-failure-audit-2026-06-01.md.Unprocessable Entity, inspect video_beats durations/profile first, normalize the actual LTX payload, and rerun only failed videos. Do not immediately switch providers when the evidence points to an LTX schema/API-call mismatch; fix the selected provider call first. See references/ltx23-fal-video-beat-unprocessable-2026-06-02.md.references/seedance-atlas-primary-rerun-2026-06-01.md.references/seedance2-atlascloud-vs-fal-2026-05-31.md for the schema, payload, pricing notes, and implementation pitfalls.references/seedance-video-mode-implementation-2026-05-31.md for implementation shape, verification checklist, and UX copy cautions for Seedance mode.references/seedance-video-mode-landing-2026-05-31.md for the landed per-shot Atlas Seedance implementation notes, provenance fields, honest per_shot defaults, and final verification recipe.references/brief8-seedance-test-atlas-output-and-social-yolo-audio-2026-05-31.md for the live Brief 8 rerun lessons: YOLO must use social voiceover parsing, Atlas MP4 URLs can live under data.outputs[], and export requires video_status='complete'.references/seedance-grouped-beat-timing-2026-06-01.md for the grouped Seedance beat timing implementation and verification recipe: 4s+ upstream planning, video_beats generation, grouped export, and the final-sub-4s tail merge regression.references/seedance-workflow-modes-storyboard-2026-06-01.md for the workflow-mode architecture and experimental Seedance storyboard/reference modes: workflow_mode strategy metadata, storyboard persistence tables, @ImageN reference prompting, 3×3 contact-sheet prompting, UI affordances, and the default-audio-strategy pitfall.references/mode-aware-story-scene-shot-audio-planning-2026-06-01.md for the durable implementation pattern: mode must drive Generate Story, Analyze, Define Scenes, Breakdown Shots, audio policy, provider audio settings, and export assumptions — not just final video provider selection.references/seedance-duration-beats-and-reference-mode-2026-06-01.md for Alex's correction on Seedance Duration Beats: beat rhythm is story/content dependent; target duration is a budget, not a mechanical divider; and storyboard/grid/reference workflows must not require last frames.server/lipsync.jskwaivgi/kling-lip-sync) at $0.014/secsync/lipsync-2) at $0.05/secffmpeg -ss {start} -t {duration} from full narration to get per-shot dialogue audiolipsync_url and lipsync_status columns on shots tableCOALESCE(lipsync_url, video_url) — prefers lip-synced version when availablesegment_type = 'dialogue' on the shot's linked script_segmentGET /api/projects/:id/lipsync-status — status + cost estimatePOST /api/projects/:id/lipsync-all — batch process (runs in background, logs progress)POST /api/shots/:id/lipsync — single shot (synchronous)video_status='generating' rows can survive with no active job. getQueueStatus(projectId) should reset those rows to pending when activeJobs===0 and queue.length===0, and /video-status should expose active/waiting/halted/maxConcurrent so the UI can explain what is actually running. See references/video-queue-refresh-and-qwen-pro-ref-cap-2026-05-18.md.CUDA out of memory during YOLO video generation is usually provider capacity/concurrency, not prompt failure. If most clips complete but a few fail, retry those clips and consider lowering max active video jobs; a live audit saw 20 active WAN jobs, 20/22 completed, and 2 failed from GPU OOM. See references/yolo-seedance-fal-and-wan-failure-audit-2026-06-01.md.reference_image_prompt values can become stale. On save, invalidate auto-generated prompts (but preserve [ADVANCED:...] and [CUSTOM_UPLOAD] prompts) so later regeneration rebuilds from current structured fields.reference_image_url, first_frame_url, last_frame_url). Do not delete guide images or prompts. Clearing is for resetting generation state, not deleting upstream inputs.POST /api/hermes/projects/create-and-runGET /api/hermes/projects/:id/statusGET /api/hermes/projects/:id/exportMEDIA:/absolute/final_video.mp4.1080x1920) before sending.no_agent delivery watcher as a backup, but make it idempotent and quiet: store delivered project IDs in ~/.hermes/state, print only when an export is ready or a project has a meaningful error, include MEDIA:/absolute/final_video.mp4, and use a relative script name under ~/.hermes/scripts/ when creating the cron job. If Alex asks to stop a watcher, remove the cron first, then continue manual status/export checks.aspect_ratio: 16:9 unless portrait requestedreference_image_model: gpt-image-2frame_image_model: gpt-image-2
references/video-queue-refresh-and-qwen-pro-ref-cap-2026-05-18.md — session detail for stale video generating rows after PM2 restart, maxConcurrent status reporting, and the live Fal Qwen Pro Edit 3-reference cap.
references/reference-generation-gpt-image-2-fallback-race-2026-06-02.md — session detail for YOLO reference-image races where GPT Image 2 jobs are still active but the no-progress monitor prematurely invokes fal.ai FLUX fallback, causing logs/UI provenance to disagree.references/stale-export-assembling-after-restart-2026-06-02.md — session detail for exports stuck on “assembling video” after PM2/server restart: verify no live ffmpeg job, confirm completed clips/beats, reset stale projects.status='assembling' to videos, rerun /api/projects/:id/assemble, then ffprobe the final MP4 before sending.references/hermes-creative-video-brief-draft-bridge-2026-05-30.md — detailed Creative→Video Story draft bridge plan: token-protected draft import endpoint, slot mapping, provenance tables, idempotency, and draft-only UI/safety rules.references/hermes-creative-bridge-media-url-aspect-2026-05-31.md — hardening follow-up: Creative media URLs must be absolute https://hermes-creative.apps.poofc.com/media/... before Video Story uses them, Video Story defensively prefixes /media/..., reel/short/story/tiktok channel strings infer 9:16, and existing bad imports need SQLite backfill across import/reference tables.references/hermes-creative-video-bridge-live-audit-2026-05-31.md — live audit of the Creative→Video Story integration: verified draft-only handoff, DB/API inspection snippets, relative /media/... URL pitfall, and slash-style reel aspect-ratio inference pitfall.references/provenance-inspection-metadata-2026-05-31.md.app-pipeline-inspector: add append-only pipeline_trace_events, expose /api/projects/:id/pipeline-trace?entity_type=...&entity_id=..., and provide contextual ↕ Pipeline buttons beside existing prompt/model inspection surfaces. In video-story specifically, high-value entity scopes are character/set/prop reference images, shot_frame with frame_type=first|last, and video_clip for the generated shot video. Capture exact input → prompt → model/tool → decision → output snapshots at generation time, with legacy fallback snapshots for old rows. See references/pipeline-inspector-video-story-2026-05-31.md.gpt-image-2 and persist provider/model provenance. See references/gpt-image-2-codex-default-2026-05-31.md.reference_priority and not generate prompt_only props by accident. See references/frame-generation-active-worker-fallback-race-2026-05-31.md and references/reference-generation-gpt-image-2-fallback-race-2026-06-02.md.projects.status='assembling' may survive while progressStore is empty, making /export-progress report “Starting assembly...” forever. Verify no ffmpeg process exists, confirm clips/beats are complete, reset the project to videos, call /api/projects/:id/assemble, and ffprobe the final MP4 before sending. See references/stale-export-assembling-after-restart-2026-06-02.md.COALESCE(lipsync_url, video_url) so one failed lipsync does not destroy the whole pipeline.