| name | dispatch-hermes-content-run |
| description | Trigger Hermes's deterministic 11-agent video-production pipeline for an editorially-approved run, and poll it to completion. Use when submit-editorial-review records a human PASS and the approved asset bundle is ready to actually produce. |
| metadata | {"agent":"chief-editor","source":"Project Atlas Requirements §3.5/10.2","layer":"executive","host":"railway"} |
dispatch-hermes-content-run
Hand off an editorially-approved run to Hermes's production pipeline (Soul Reference ->
Visual/Presenter/Narration/Music/Asset Sourcing/Thumbnail -> Captioning -> Video Assembly ->
Render QC -> Video Publish), and wait for it to finish.
When to use
submit-editorial-review recorded a human PASS (content_assets.status = APPROVED).
- The upstream judgment outputs (
select-vibe, direct-voice, direct-music,
direct-visuals, plan-assets, generate-thumbnails, generate-seo-metadata, all owned
by content-factory) and the approved script are available.
Workflow
- Assemble the
ContentRunRequest payload:
script_text and graphics_cues — both from the approved script (the Script agent's
output carries graphics_cues for lower-third identification graphics; pass them through).
target_format — "shorts" / "reels" / "long_form" per the topic's format decision.
Do NOT omit this: it defaults to long_form, which renders the 16:9 20-minute composition.
asset_planner_output (from plan-assets), voice_assignment (from direct-voice).
music_director_output (from direct-music) — without it the video has NO music, no
beat-synced cuts, and no sound effects.
visual_director_output (from direct-visuals) — without it every shot falls back to a
default crossfade with no color grade.
thumbnail_concepts (from generate-thumbnails),
personality_id/personality_name/reference_image_urls.
publish_metadata -- title/description/tags from generate-seo-metadata's output,
privacy_status set directly (unrelated to SEO, defaults to "private" if omitted).
- Refuse to dispatch if any upstream judgment output carries
"simulated": true — that
marks a mock produced by a misconfigured Hermes deployment, and dispatching it spends real
generation budget filming fake data. Surface it for human follow-up instead.
- Call the
hermes-bridge MCP tool start_content_run(payload) — returns {run_id, status: "started"} immediately. A 422 response means the run's projected cost exceeded the
RUN_BUDGET_USD cap — surface it for human review rather than trimming the payload yourself.
- Poll
get_content_run_status(run_id) (a few minutes apart; this is a multi-minute pipeline, do not poll tightly) until status is completed or failed.
- On
completed, record the result's publish_result.live_url against the run — and surface
plan_warnings, remediation.notes, qc_result.vision_warnings, and cost_summary.total_usd
to the editorial record; on failed, surface the failed stage for human follow-up.
Function signature (manifest contract)
def dispatch_hermes_content_run(run_id: str, content_run_payload: dict) -> dict:
"""Starts and awaits Hermes's content-run pipeline. Returns the final
{"status": "completed"|"failed", ...} result."""
Backend dependency
None beyond the hermes-bridge MCP tool (openclaw/mcp/hermes-bridge/) and Hermes's own
Temporal worker (hermes/temporal_worker.py) — already wired, no stub.
Model
Chief Editor model (gemini-direct/gemini-2.5-flash).