digraph efhas_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="FCE Agent — Behind Every Departure" labelloc=t fontsize=14 fontcolor="#0066ff" start [label="START" fillcolor="#0066ff" shape=circle fontcolor="white" width=0.5] end_skip [label="END\n(no notification)" fillcolor="#4a5568" shape=doublecircle fontcolor="#e8eaf0" width=0.6] end_done [label="END" fillcolor="#00c853" shape=doublecircle fontcolor="white" width=0.5] subgraph cluster_triage { label="Node: triage" color="#1e2a4a" fontcolor="#8892a8" triage [label="get_flight_status()\n\ndelay < 10min → skip\nON_TIME → skip" fillcolor="#121829" shape=box] } subgraph cluster_gather { label="Node: gather_context (parallel)" color="#0066ff" fontcolor="#0066ff" gather_label [label="" shape=point width=0] subgraph cluster_gather_tools { rank=same g1 [label="get_flight_\ndetails\n[shared]" fillcolor="#0d1a33" shape=box] g2 [label="get_route_\nweather\n[shared] ★ LIVE" fillcolor="#0d2a0d" shape=box fontcolor="#00c853"] g3 [label="get_airport_\nstatus\n[shared] ★ LIVE" fillcolor="#0d2a0d" shape=box fontcolor="#00c853"] g4 [label="get_airport_\ncongestion\n[shared] ★ HYBRID" fillcolor="#0d2a0d" shape=box fontcolor="#ffc107"] g5 [label="get_crew_\nnotes\n[ops]" fillcolor="#0d1a33" shape=box] } } subgraph cluster_synth { label="Node: synthesize" color="#1e2a4a" fontcolor="#8892a8" synth [label="generate_notification()\n[passenger server]\n\nContext → empathetic text\nMissing data → omit section" fillcolor="#121829" shape=box] } subgraph cluster_format { label="Node: format_output" color="#1e2a4a" fontcolor="#8892a8" format [label="Structure notification JSON\nAttach data sources\nRecord timing" fillcolor="#121829" shape=box] } subgraph cluster_review { label="Node: human_review" color="#1e2a4a" fontcolor="#8892a8" review [label="Human approval gate\n(auto-approve in demo)" fillcolor="#121829" shape=box] } // Flow start -> triage triage -> end_skip [label="should_notify = false" style=dashed color="#ff3d00" fontcolor="#ff3d00"] triage -> gather_label [label="should_notify = true"] gather_label -> g1 [color="#0066ff"] gather_label -> g2 [color="#0066ff"] gather_label -> g3 [color="#0066ff"] gather_label -> g4 [color="#0066ff"] gather_label -> g5 [color="#0066ff"] g1 -> synth [style=invis] g2 -> synth [style=invis] g3 -> synth [style=invis] g4 -> synth [style=invis] g5 -> synth [style=invis] {g1 g2 g3 g4 g5} -> synth [label="" color="#4a5568" constraint=true] synth -> format format -> review review -> end_done }