digraph handover_agent { rankdir=TB bgcolor="#0a0e17" fontname="Helvetica" node [fontname="Helvetica" fontsize=10 style=filled color="#1e2a4a" fontcolor="#e8eaf0"] edge [fontname="Helvetica" fontsize=9 fontcolor="#8892a8" color="#4a5568"] label="Shift Handover Agent" labelloc=t fontsize=14 fontcolor="#0066ff" start [label="START" fillcolor="#0066ff" shape=circle fontcolor="white" width=0.5] end_done [label="END" fillcolor="#00c853" shape=doublecircle fontcolor="white" width=0.5] subgraph cluster_gather { label="Node: gather_all (parallel across 5 hubs)" color="#0066ff" fontcolor="#0066ff" gather_point [label="" shape=point width=0] subgraph cluster_per_hub { label="Per hub (ORD, EWR, IAH, SFO, DEN)" color="#1e2a4a" fontcolor="#4a5568" h1 [label="get_irregular_ops\n[shared]" fillcolor="#0d1a33" shape=box] h2 [label="get_airport_status\n[shared] ★ LIVE" fillcolor="#0d2a0d" shape=box fontcolor="#00c853"] h3 [label="get_pending_rebookings\n[ops]" fillcolor="#0d1a33" shape=box] } subgraph cluster_global { label="Global" color="#1e2a4a" fontcolor="#4a5568" g1 [label="get_hub_forecasts\n[shared] ★ LIVE" fillcolor="#0d2a0d" shape=box fontcolor="#00c853"] g2 [label="get_crew_duty_status\n[ops]" fillcolor="#0d1a33" shape=box] g3 [label="get_maintenance_flags\n[shared]" fillcolor="#0d1a33" shape=box] } } subgraph cluster_triage { label="Node: triage" color="#ff3d00" fontcolor="#ff3d00" triage [label="Score each issue:\nseverity × time_sensitivity\n\nCategorize:\nIMMEDIATE (score > 50)\nMONITOR (score > 20)\nFYI (rest)" fillcolor="#121829" shape=box] subgraph cluster_items { rank=same color="#1e2a4a" fontcolor="#4a5568" label="Triage Categories" imm [label="IMMEDIATE\n▶ crew limits\n▶ cancellations\n▶ ground stops" fillcolor="#3a0d0d" shape=box fontcolor="#ff3d00"] mon [label="MONITOR\n⚠ weather risk\n⚠ GDP active\n⚠ MEL restrictions" fillcolor="#3a2a0d" shape=box fontcolor="#ffc107"] fyi [label="FYI\nℹ nominal hubs\nℹ resolved items" fillcolor="#1a1a2a" shape=box fontcolor="#8892a8"] } } subgraph cluster_synth { label="Node: synthesize" color="#1e2a4a" fontcolor="#8892a8" synth [label="generate_narrative()\n[ops server]\n\nStructured brief:\nheader → immediate → monitor → fyi" fillcolor="#121829" shape=box] } subgraph cluster_format { label="Node: format_output" color="#1e2a4a" fontcolor="#8892a8" format [label="Structure brief JSON\nStore as ops://handover/latest\nRecord timing" fillcolor="#121829" shape=box] } // Flow start -> gather_point gather_point -> h1 [color="#0066ff"] gather_point -> h2 [color="#0066ff"] gather_point -> h3 [color="#0066ff"] gather_point -> g1 [color="#0066ff"] gather_point -> g2 [color="#0066ff"] gather_point -> g3 [color="#0066ff"] h1 -> triage [color="#4a5568"] h2 -> triage [color="#4a5568"] h3 -> triage [color="#4a5568"] g1 -> triage [color="#4a5568"] g2 -> triage [color="#4a5568"] g3 -> triage [color="#4a5568"] triage -> imm [style=invis] triage -> mon [style=invis] triage -> fyi [style=invis] imm -> synth [color="#ff3d00"] mon -> synth [color="#ffc107"] fyi -> synth [color="#8892a8"] synth -> format format -> end_done }