<svg width="100%" viewBox="0 0 760 240" role="img" xmlns="http://www.w3.org/2000/svg">
  <title>Where the device's audio cues come from</title>
  <desc>announce.py owns lifecycle tones (boot, ready, error); lk_client.py owns in-conversation cues tied to the agent state.</desc>
  <style>
    text{font-family:"Anthropic Sans",-apple-system,system-ui,"Segoe UI",sans-serif}
    .t{font-size:14px;font-weight:500;text-anchor:middle;dominant-baseline:central}
    .s{font-size:12px;text-anchor:middle;dominant-baseline:central}
    rect{stroke-width:.5}
    .green{fill:#27500a;stroke:#97c459}   .gt{fill:#c0dd97} .gs{fill:#97c459}
    .neutral{fill:#444441;stroke:#b4b2a9} .nt{fill:#d3d1c7} .ns{fill:#b4b2a9}
    .arrow{fill:none;stroke:#9c9a92;stroke-width:1.5}
  </style>
  <defs>
    <marker id="a" viewBox="0 0 10 10" refX="8" refY="5" markerWidth="6" markerHeight="6" orient="auto-start-reverse">
      <path d="M2 1L8 5L2 9" fill="none" stroke="context-stroke" stroke-width="1.5" stroke-linecap="round" stroke-linejoin="round"/>
    </marker>
  </defs>

  <rect class="green" x="40"  y="40"  width="280" height="80" rx="8"/>
  <text class="t gt" x="180" y="66">announce.py</text>
  <text class="s gs" x="180" y="88">lifecycle tones</text>
  <text class="s gs" x="180" y="106">boot · ready · error · pairing</text>

  <rect class="green" x="40"  y="140" width="280" height="80" rx="8"/>
  <text class="t gt" x="180" y="166">lk_client.py</text>
  <text class="s gs" x="180" y="188">conversation cues</text>
  <text class="s gs" x="180" y="206">listening · thinking · speaking</text>

  <rect class="neutral" x="500" y="90" width="220" height="80" rx="8"/>
  <text class="t nt" x="610" y="116">🔊  speaker</text>
  <text class="s ns" x="610" y="138">language-neutral tones</text>
  <text class="s ns" x="610" y="156">the device's only feedback</text>

  <path class="arrow" d="M 320  80 C 400  80, 440 120, 498 120" marker-end="url(#a)"/>
  <path class="arrow" d="M 320 180 C 400 180, 440 140, 498 140" marker-end="url(#a)"/>
</svg>
