Files
nova/docs/graphs/handover_agent.svg

275 lines
18 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!-- Generated by graphviz version 14.1.2 (0)
-->
<!-- Title: handover_agent Pages: 1 -->
<svg style="background:#0a0e17" width="1702pt" height="1552pt"
viewBox="0.00 0.00 1702.00 1552.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="graph0" class="graph" transform="scale(2 2) rotate(0) translate(4 771.79)">
<title>handover_agent</title>
<polygon fill="#0a0e17" stroke="none" points="-4,4 -4,-771.79 847,-771.79 847,4 -4,4"/>
<text xml:space="preserve" text-anchor="middle" x="421.5" y="-750.49" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#0066ff">Shift Handover Agent</text>
<g id="clust1" class="cluster">
<title>cluster_gather</title>
<polygon fill="#0a0e17" stroke="#0066ff" points="8,-551.03 8,-678.25 835,-678.25 835,-551.03 8,-551.03"/>
<text xml:space="preserve" text-anchor="middle" x="421.5" y="-660.95" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#0066ff">Node: gather_all &#160;(parallel across 5 hubs)</text>
</g>
<g id="clust2" class="cluster">
<title>cluster_per_hub</title>
<polygon fill="#0a0e17" stroke="#1e2a4a" points="16,-559.03 16,-636.28 409,-636.28 409,-559.03 16,-559.03"/>
<text xml:space="preserve" text-anchor="middle" x="212.5" y="-618.98" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#4a5568">Per hub (ORD, EWR, IAH, SFO, DEN)</text>
</g>
<g id="clust3" class="cluster">
<title>cluster_global</title>
<polygon fill="#0a0e17" stroke="#1e2a4a" points="417,-559.03 417,-636.28 827,-636.28 827,-559.03 417,-559.03"/>
<text xml:space="preserve" text-anchor="middle" x="622" y="-618.98" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#4a5568">Global</text>
</g>
<g id="clust4" class="cluster">
<title>cluster_triage</title>
<polygon fill="#0a0e17" stroke="#ff3d00" points="226,-297.03 226,-543.03 588,-543.03 588,-297.03 226,-297.03"/>
<text xml:space="preserve" text-anchor="middle" x="407" y="-525.73" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#ff3d00">Node: triage</text>
</g>
<g id="clust5" class="cluster">
<title>cluster_items</title>
<polygon fill="#0a0e17" stroke="#1e2a4a" points="234,-305.03 234,-405.28 580,-405.28 580,-305.03 234,-305.03"/>
<text xml:space="preserve" text-anchor="middle" x="407" y="-387.98" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#4a5568">Triage Categories</text>
</g>
<g id="clust6" class="cluster">
<title>cluster_synth</title>
<polygon fill="#0a0e17" stroke="#1e2a4a" points="299,-176.78 299,-289.03 511,-289.03 511,-176.78 299,-176.78"/>
<text xml:space="preserve" text-anchor="middle" x="405" y="-271.73" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#8892a8">Node: synthesize</text>
</g>
<g id="clust7" class="cluster">
<title>cluster_format</title>
<polygon fill="#0a0e17" stroke="#1e2a4a" points="316,-81.28 316,-168.78 494,-168.78 494,-81.28 316,-81.28"/>
<text xml:space="preserve" text-anchor="middle" x="405" y="-151.48" font-family="Helvetica,sans-Serif" font-size="14.00" fill="#8892a8">Node: format_output</text>
</g>
<!-- start -->
<g id="node1" class="node">
<title>start</title>
<ellipse fill="#0066ff" stroke="#1e2a4a" cx="405" cy="-714.39" rx="28.15" ry="28.15"/>
<text xml:space="preserve" text-anchor="middle" x="405" y="-711.27" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">START</text>
</g>
<!-- gather_point -->
<g id="node3" class="node">
<title>gather_point</title>
<ellipse fill="#1e2a4a" stroke="#1e2a4a" cx="405" cy="-644.64" rx="0.36" ry="0.36"/>
</g>
<!-- start&#45;&gt;gather_point -->
<g id="edge1" class="edge">
<title>start&#45;&gt;gather_point</title>
<path fill="none" stroke="#4a5568" d="M405,-685.83C405,-675.75 405,-664.9 405,-657.02"/>
<polygon fill="#4a5568" stroke="#4a5568" points="408.5,-657.21 405,-647.21 401.5,-657.21 408.5,-657.21"/>
</g>
<!-- end_done -->
<g id="node2" class="node">
<title>end_done</title>
<ellipse fill="#00c853" stroke="#1e2a4a" cx="405" cy="-26.64" rx="22.64" ry="22.64"/>
<ellipse fill="none" stroke="#1e2a4a" cx="405" cy="-26.64" rx="26.64" ry="26.64"/>
<text xml:space="preserve" text-anchor="middle" x="405" y="-23.51" font-family="Helvetica,sans-Serif" font-size="10.00" fill="white">END</text>
</g>
<!-- h1 -->
<g id="node4" class="node">
<title>h1</title>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="124.38,-603.03 23.62,-603.03 23.62,-567.03 124.38,-567.03 124.38,-603.03"/>
<text xml:space="preserve" text-anchor="middle" x="74" y="-588.28" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">get_irregular_ops</text>
<text xml:space="preserve" text-anchor="middle" x="74" y="-575.53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">[shared]</text>
</g>
<!-- gather_point&#45;&gt;h1 -->
<g id="edge2" class="edge">
<title>gather_point&#45;&gt;h1</title>
<path fill="none" stroke="#0066ff" d="M404.3,-644.29C390.03,-644.43 161.28,-646.65 134,-636.28 120.11,-631 107.14,-621.06 96.83,-611.4"/>
<polygon fill="#0066ff" stroke="#0066ff" points="99.48,-609.1 89.92,-604.53 94.54,-614.06 99.48,-609.1"/>
</g>
<!-- h2 -->
<g id="node5" class="node">
<title>h2</title>
<polygon fill="#0d2a0d" stroke="#1e2a4a" points="247.25,-603.03 142.75,-603.03 142.75,-567.03 247.25,-567.03 247.25,-603.03"/>
<text xml:space="preserve" text-anchor="middle" x="195" y="-588.28" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#00c853">get_airport_status</text>
<text xml:space="preserve" text-anchor="middle" x="195" y="-575.53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#00c853">[shared] ★ LIVE</text>
</g>
<!-- gather_point&#45;&gt;h2 -->
<g id="edge3" class="edge">
<title>gather_point&#45;&gt;h2</title>
<path fill="none" stroke="#0066ff" d="M404.62,-644.27C396.77,-644.15 270.97,-642.11 256,-636.28 242.02,-630.83 228.85,-620.87 218.35,-611.24"/>
<polygon fill="#0066ff" stroke="#0066ff" points="220.9,-608.84 211.28,-604.39 216.03,-613.86 220.9,-608.84"/>
</g>
<!-- h3 -->
<g id="node6" class="node">
<title>h3</title>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="400.62,-603.03 265.38,-603.03 265.38,-567.03 400.62,-567.03 400.62,-603.03"/>
<text xml:space="preserve" text-anchor="middle" x="333" y="-588.28" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">get_pending_rebookings</text>
<text xml:space="preserve" text-anchor="middle" x="333" y="-575.53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">[ops]</text>
</g>
<!-- gather_point&#45;&gt;h3 -->
<g id="edge4" class="edge">
<title>gather_point&#45;&gt;h3</title>
<path fill="none" stroke="#0066ff" d="M404.79,-644.11C402.53,-642.28 381.98,-625.66 363.45,-610.66"/>
<polygon fill="#0066ff" stroke="#0066ff" points="365.75,-608.03 355.78,-604.46 361.35,-613.47 365.75,-608.03"/>
</g>
<!-- g1 -->
<g id="node7" class="node">
<title>g1</title>
<polygon fill="#0d2a0d" stroke="#1e2a4a" points="530.62,-603.03 425.38,-603.03 425.38,-567.03 530.62,-567.03 530.62,-603.03"/>
<text xml:space="preserve" text-anchor="middle" x="478" y="-588.28" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#00c853">get_hub_forecasts</text>
<text xml:space="preserve" text-anchor="middle" x="478" y="-575.53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#00c853">[shared] ★ LIVE</text>
</g>
<!-- gather_point&#45;&gt;g1 -->
<g id="edge5" class="edge">
<title>gather_point&#45;&gt;g1</title>
<path fill="none" stroke="#0066ff" d="M405.21,-644.11C407.51,-642.28 428.34,-625.66 447.13,-610.66"/>
<polygon fill="#0066ff" stroke="#0066ff" points="449.28,-613.42 454.91,-604.45 444.91,-607.95 449.28,-613.42"/>
</g>
<!-- g2 -->
<g id="node8" class="node">
<title>g2</title>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="671.25,-603.03 548.75,-603.03 548.75,-567.03 671.25,-567.03 671.25,-603.03"/>
<text xml:space="preserve" text-anchor="middle" x="610" y="-588.28" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">get_crew_duty_status</text>
<text xml:space="preserve" text-anchor="middle" x="610" y="-575.53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">[ops]</text>
</g>
<!-- gather_point&#45;&gt;g2 -->
<g id="edge6" class="edge">
<title>gather_point&#45;&gt;g2</title>
<path fill="none" stroke="#0066ff" d="M405.68,-644.29C414.83,-644.44 513,-645.85 540,-636.28 555.73,-630.7 571.04,-620.44 583.32,-610.64"/>
<polygon fill="#0066ff" stroke="#0066ff" points="585.48,-613.39 590.9,-604.29 580.99,-608.02 585.48,-613.39"/>
</g>
<!-- g3 -->
<g id="node9" class="node">
<title>g3</title>
<polygon fill="#0d1a33" stroke="#1e2a4a" points="818.62,-603.03 689.38,-603.03 689.38,-567.03 818.62,-567.03 818.62,-603.03"/>
<text xml:space="preserve" text-anchor="middle" x="754" y="-588.28" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">get_maintenance_flags</text>
<text xml:space="preserve" text-anchor="middle" x="754" y="-575.53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">[shared]</text>
</g>
<!-- gather_point&#45;&gt;g3 -->
<g id="edge7" class="edge">
<title>gather_point&#45;&gt;g3</title>
<path fill="none" stroke="#0066ff" d="M405.71,-644.28C420.16,-644.36 651.82,-645.39 680,-636.28 696.65,-630.89 712.97,-620.52 726.04,-610.59"/>
<polygon fill="#0066ff" stroke="#0066ff" points="728.1,-613.42 733.75,-604.45 723.74,-607.94 728.1,-613.42"/>
</g>
<!-- triage -->
<g id="node10" class="node">
<title>triage</title>
<polygon fill="#121829" stroke="#1e2a4a" points="479.38,-509.78 330.62,-509.78 330.62,-413.28 479.38,-413.28 479.38,-509.78"/>
<text xml:space="preserve" text-anchor="middle" x="405" y="-496.28" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Score each issue:</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-483.53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">severity × time_sensitivity</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-458.78" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Categorize:</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-446.03" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">IMMEDIATE (score &gt; 50)</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-433.28" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">MONITOR (score &gt; 20)</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-420.53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">FYI (rest)</text>
</g>
<!-- h1&#45;&gt;triage -->
<g id="edge8" class="edge">
<title>h1&#45;&gt;triage</title>
<path fill="none" stroke="#4a5568" d="M103.05,-566.62C112.7,-561.22 123.64,-555.52 134,-551.03 194.43,-524.82 265.27,-501.94 319.36,-486.02"/>
<polygon fill="#4a5568" stroke="#4a5568" points="320.22,-489.41 328.84,-483.25 318.26,-482.69 320.22,-489.41"/>
</g>
<!-- h2&#45;&gt;triage -->
<g id="edge9" class="edge">
<title>h2&#45;&gt;triage</title>
<path fill="none" stroke="#4a5568" d="M225.09,-566.62C250.07,-552.17 286.85,-530.89 320.66,-511.33"/>
<polygon fill="#4a5568" stroke="#4a5568" points="322.36,-514.39 329.26,-506.35 318.85,-508.33 322.36,-514.39"/>
</g>
<!-- h3&#45;&gt;triage -->
<g id="edge10" class="edge">
<title>h3&#45;&gt;triage</title>
<path fill="none" stroke="#4a5568" d="M343.32,-566.62C350.7,-554.16 361.09,-536.63 371.24,-519.5"/>
<polygon fill="#4a5568" stroke="#4a5568" points="373.97,-521.75 376.06,-511.37 367.95,-518.19 373.97,-521.75"/>
</g>
<!-- g1&#45;&gt;triage -->
<g id="edge11" class="edge">
<title>g1&#45;&gt;triage</title>
<path fill="none" stroke="#4a5568" d="M467.54,-566.62C460.06,-554.16 449.52,-536.63 439.23,-519.5"/>
<polygon fill="#4a5568" stroke="#4a5568" points="442.49,-518.13 434.34,-511.36 436.49,-521.74 442.49,-518.13"/>
</g>
<!-- g2&#45;&gt;triage -->
<g id="edge12" class="edge">
<title>g2&#45;&gt;triage</title>
<path fill="none" stroke="#4a5568" d="M580.63,-566.62C556.75,-552.47 521.82,-531.76 489.38,-512.54"/>
<polygon fill="#4a5568" stroke="#4a5568" points="491.55,-509.76 481.17,-507.67 487.98,-515.78 491.55,-509.76"/>
</g>
<!-- g3&#45;&gt;triage -->
<g id="edge13" class="edge">
<title>g3&#45;&gt;triage</title>
<path fill="none" stroke="#4a5568" d="M717.06,-566.61C705.33,-561.34 692.22,-555.7 680,-551.03 617.42,-527.09 545.27,-504.03 490.57,-487.46"/>
<polygon fill="#4a5568" stroke="#4a5568" points="491.91,-484.2 481.32,-484.67 489.88,-490.91 491.91,-484.2"/>
</g>
<!-- imm -->
<g id="node11" class="node">
<title>imm</title>
<polygon fill="#3a0d0d" stroke="#1e2a4a" points="333.5,-372.03 242.5,-372.03 242.5,-313.03 333.5,-313.03 333.5,-372.03"/>
<text xml:space="preserve" text-anchor="middle" x="288" y="-358.53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ff3d00">IMMEDIATE</text>
<text xml:space="preserve" text-anchor="middle" x="288" y="-345.78" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ff3d00">▶ crew limits</text>
<text xml:space="preserve" text-anchor="middle" x="288" y="-333.03" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ff3d00">▶ cancellations</text>
<text xml:space="preserve" text-anchor="middle" x="288" y="-320.28" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ff3d00">▶ ground stops</text>
</g>
<!-- triage&#45;&gt;imm -->
<!-- mon -->
<g id="node12" class="node">
<title>mon</title>
<polygon fill="#3a2a0d" stroke="#1e2a4a" points="458,-372.03 352,-372.03 352,-313.03 458,-313.03 458,-372.03"/>
<text xml:space="preserve" text-anchor="middle" x="405" y="-358.53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ffc107">MONITOR</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-345.78" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ffc107">⚠ weather risk</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-333.03" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ffc107">⚠ GDP active</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-320.28" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#ffc107">⚠ MEL restrictions</text>
</g>
<!-- triage&#45;&gt;mon -->
<!-- fyi -->
<g id="node13" class="node">
<title>fyi</title>
<polygon fill="#1a1a2a" stroke="#1e2a4a" points="571.75,-365.65 476.25,-365.65 476.25,-319.4 571.75,-319.4 571.75,-365.65"/>
<text xml:space="preserve" text-anchor="middle" x="524" y="-352.15" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#8892a8">FYI</text>
<text xml:space="preserve" text-anchor="middle" x="524" y="-339.4" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#8892a8"> nominal hubs</text>
<text xml:space="preserve" text-anchor="middle" x="524" y="-326.65" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#8892a8"> resolved items</text>
</g>
<!-- triage&#45;&gt;fyi -->
<!-- synth -->
<g id="node14" class="node">
<title>synth</title>
<polygon fill="#121829" stroke="#1e2a4a" points="503,-255.78 307,-255.78 307,-184.78 503,-184.78 503,-255.78"/>
<text xml:space="preserve" text-anchor="middle" x="405" y="-242.28" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">generate_narrative()</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-229.53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">[ops server]</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-204.78" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Structured brief:</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-192.03" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">header → immediate → monitor → fyi</text>
</g>
<!-- imm&#45;&gt;synth -->
<g id="edge17" class="edge">
<title>imm&#45;&gt;synth</title>
<path fill="none" stroke="#ff3d00" d="M316.02,-312.73C330.19,-298.17 347.65,-280.22 363.35,-264.08"/>
<polygon fill="#ff3d00" stroke="#ff3d00" points="365.85,-266.53 370.32,-256.92 360.84,-261.65 365.85,-266.53"/>
</g>
<!-- mon&#45;&gt;synth -->
<g id="edge18" class="edge">
<title>mon&#45;&gt;synth</title>
<path fill="none" stroke="#ffc107" d="M405,-312.73C405,-299.1 405,-282.51 405,-267.21"/>
<polygon fill="#ffc107" stroke="#ffc107" points="408.5,-267.35 405,-257.35 401.5,-267.35 408.5,-267.35"/>
</g>
<!-- fyi&#45;&gt;synth -->
<g id="edge19" class="edge">
<title>fyi&#45;&gt;synth</title>
<path fill="none" stroke="#8892a8" d="M501.62,-318.91C486.3,-303.43 465.52,-282.43 447.15,-263.88"/>
<polygon fill="#8892a8" stroke="#8892a8" points="450.04,-261.82 440.52,-257.17 445.07,-266.74 450.04,-261.82"/>
</g>
<!-- format -->
<g id="node15" class="node">
<title>format</title>
<polygon fill="#121829" stroke="#1e2a4a" points="485.75,-135.53 324.25,-135.53 324.25,-89.28 485.75,-89.28 485.75,-135.53"/>
<text xml:space="preserve" text-anchor="middle" x="405" y="-122.03" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Structure brief JSON</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-109.28" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Store as ops://handover/latest</text>
<text xml:space="preserve" text-anchor="middle" x="405" y="-96.53" font-family="Helvetica,sans-Serif" font-size="10.00" fill="#e8eaf0">Record timing</text>
</g>
<!-- synth&#45;&gt;format -->
<g id="edge20" class="edge">
<title>synth&#45;&gt;format</title>
<path fill="none" stroke="#4a5568" d="M405,-184.32C405,-172.39 405,-159.08 405,-147.25"/>
<polygon fill="#4a5568" stroke="#4a5568" points="408.5,-147.52 405,-137.52 401.5,-147.52 408.5,-147.52"/>
</g>
<!-- format&#45;&gt;end_done -->
<g id="edge21" class="edge">
<title>format&#45;&gt;end_done</title>
<path fill="none" stroke="#4a5568" d="M405,-88.96C405,-81.58 405,-73.17 405,-64.99"/>
<polygon fill="#4a5568" stroke="#4a5568" points="408.5,-65.23 405,-55.23 401.5,-65.23 408.5,-65.23"/>
</g>
</g>
</svg>