digraph job_flow { rankdir=TB node [shape=box, style=rounded, fontname="Helvetica"] edge [fontname="Helvetica", fontsize=10] labelloc="t" label="MPR - Job Flow" fontsize=16 fontname="Helvetica-Bold" graph [splines=ortho, nodesep=0.6, ranksep=0.6] // API entry points subgraph cluster_api { label="API Entry Points" style=dashed color=gray rest_create [label="POST /api/jobs/", shape=ellipse] gql_create [label="mutation createJob", shape=ellipse] rest_cancel [label="POST /api/jobs/{id}/cancel", shape=ellipse] rest_callback [label="POST /api/jobs/{id}/callback", shape=ellipse] } // Job states subgraph cluster_states { label="Job States" style=filled fillcolor="#f8f8f8" pending [label="PENDING", fillcolor="#ffc107", style="filled,rounded"] processing [label="PROCESSING", fillcolor="#17a2b8", style="filled,rounded", fontcolor=white] completed [label="COMPLETED", fillcolor="#28a745", style="filled,rounded", fontcolor=white] failed [label="FAILED", fillcolor="#dc3545", style="filled,rounded", fontcolor=white] cancelled [label="CANCELLED", fillcolor="#6c757d", style="filled,rounded", fontcolor=white] } // State transitions pending -> processing [xlabel="worker picks up"] processing -> completed [xlabel="success"] processing -> failed [xlabel="error"] pending -> cancelled [xlabel="user cancels"] processing -> cancelled [xlabel="user cancels"] failed -> pending [xlabel="retry"] rest_create -> pending gql_create -> pending rest_cancel -> cancelled [style=dashed] // Executor dispatch subgraph cluster_dispatch { label="Executor Dispatch" style=filled fillcolor="#fff8e8" dispatch [label="MPR_EXECUTOR", shape=diamond] } pending -> dispatch // Local path subgraph cluster_local { label="Local Mode (Celery)" style=filled fillcolor="#e8f4e8" celery_task [label="Celery Task\n(transcode queue)"] s3_download [label="S3 Download\n(MinIO)"] ffmpeg_local [label="FFmpeg\ntranscode/trim"] s3_upload [label="S3 Upload\n(MinIO)"] db_update [label="DB Update\n(update_job_progress)"] } dispatch -> celery_task [xlabel="local"] celery_task -> s3_download s3_download -> ffmpeg_local ffmpeg_local -> s3_upload s3_upload -> db_update db_update -> completed [style=dotted] // Lambda path subgraph cluster_lambda { label="Lambda Mode (AWS)" style=filled fillcolor="#fde8d0" sfn_start [label="Step Functions\nstart_execution"] lambda_fn [label="Lambda\nFFmpeg container"] s3_dl_aws [label="S3 Download\n(AWS)"] ffmpeg_aws [label="FFmpeg\ntranscode/trim"] s3_ul_aws [label="S3 Upload\n(AWS)"] callback [label="HTTP Callback\nPOST /jobs/{id}/callback"] } dispatch -> sfn_start [xlabel="lambda"] sfn_start -> lambda_fn lambda_fn -> s3_dl_aws s3_dl_aws -> ffmpeg_aws ffmpeg_aws -> s3_ul_aws s3_ul_aws -> callback callback -> completed [style=dotted] rest_callback -> completed [style=dashed, xlabel="Lambda reports"] }