<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 320" width="1280" height="320" role="img" aria-label="Unsay — retracts what Alexa just said. The spoken instruction is struck through in amber the instant the update frame lands; the new line stands white beneath.">
<!-- STORYBOARD (dur 8s — must equal this file's single master dur)
  0-12%   steady state: the record AFTER the retraction is the poster — plate, mini mark, outlined wordmark, tagline, metric, tech line and caption complete; the device panel shows WEIGHT BEARING, the green LIVE · SUBSCRIBED dot, Ray's question, the OLD line dimmed and struck in amber with its full stop, "Wait — don’t do that." and "Full weight-bearing as tolerated." white beneath it, the amber "changed just now · Sarah Okafor, physio" dot, and the care-internal:// lane under its dashed rule with NEVER SPOKEN. A no-animation viewer sees the verb.
  12-30%  rewind + trigger: the strike, its full stop, "Wait — don’t do that.", the new line and the changed-by line crossfade out (12-17%) while the old line brightens to white and its caret starts to blink — the instruction is being spoken as current; the mini mark rewinds in sync. The notifications/resources/updated chip slides in at the top-right of the panel (20-23%); the beam sweeps the plate; an amber comet leaves the chip for the start of the spoken line (24-30%).   data-story="beat-2"
  30-48%  mechanism:    The spoken instruction is struck through in amber the instant the update frame lands; the new line stands white beneath.   data-story="beat-3"   (strike draws left→right 30-38%, the line dims 34-40%, the caret stops, the full stop pops at 38%, "Wait — don’t do that." pops 38-43%, "Full weight-bearing as tolerated." rises 42-47%, the lane acknowledges "read · shaped the answer" 36-40% while NEVER SPOKEN stays — nothing crosses the rule)
  48-95%  resolution:   the amber "changed just now · Sarah Okafor, physio" dot pops (48-52%) and the residue holds — struck line, full stop, "Wait — don’t do that.", new line and changed-by are on screen 0-12% and 38-100%, 74% of the loop, so any 3-second window contains the struck line and the new one.   (persistent residue: visible at t=0, so no data-story tag — only the story-only layer starts hidden)
  95-100% breathe + seam: only the story-only layer (chip, comet, lane acknowledgement) fades out 95-98.5%; the struck line, its full stop, "Wait — don’t do that.", the new line and the changed-by line persist, so dur-0.1s and dur+0.1s show the same frame as t=0 (rules 5-7). Every story element's VISIBILITY is SMIL; CSS carries only transforms and the caret blink, so prefers-reduced-motion still shows the retraction.
-->
  <title>Unsay — the assistant that can be corrected, mid-sentence</title>
  <defs>
    <clipPath id="plate"><rect x="0" y="0" width="1280" height="320" rx="20"/></clipPath>
    <linearGradient id="brand" x1="0" y1="0" x2="1" y2="0">
      <stop offset="0" stop-color="#F2A93B"/>
      <stop offset="1" stop-color="#FFC15E"/>
    </linearGradient>
    <!-- userSpaceOnUse: an objectBoundingBox gradient on a zero-height horizontal line renders NOTHING in Chromium.
         #strike spans the mini mark (its own user space, 88→398); #strike-t spans the transcript line (606→1158). -->
    <linearGradient id="strike" gradientUnits="userSpaceOnUse" x1="88" y1="0" x2="398" y2="0">
      <stop offset="0" stop-color="#F2A93B"/>
      <stop offset="1" stop-color="#FFC15E"/>
    </linearGradient>
    <linearGradient id="strike-t" gradientUnits="userSpaceOnUse" x1="606" y1="0" x2="1158" y2="0">
      <stop offset="0" stop-color="#F2A93B"/>
      <stop offset="1" stop-color="#FFC15E"/>
    </linearGradient>
    <linearGradient id="beam" x1="0" y1="0" x2="1" y2="0">
      <stop offset="0" stop-color="#ffffff" stop-opacity="0"/>
      <stop offset="0.5" stop-color="#ffffff" stop-opacity="0.045"/>
      <stop offset="1" stop-color="#ffffff" stop-opacity="0"/>
    </linearGradient>
    <linearGradient id="shine" x1="0" y1="0" x2="1" y2="0">
      <stop offset="0" stop-color="#ffffff" stop-opacity="0"/>
      <stop offset="0.5" stop-color="#ffffff" stop-opacity="0.55"/>
      <stop offset="1" stop-color="#ffffff" stop-opacity="0"/>
    </linearGradient>
    <pattern id="grid" width="48" height="48" patternUnits="userSpaceOnUse">
      <path d="M48 0 H0 V48" fill="none" stroke="#ffffff" stroke-opacity="0.035" stroke-width="1"/>
    </pattern>
    <filter id="aurora" x="-60%" y="-60%" width="220%" height="220%"><feGaussianBlur stdDeviation="46"/></filter>
    <filter id="comet-glow" x="-200%" y="-200%" width="500%" height="500%"><feGaussianBlur stdDeviation="5"/></filter>
    <!-- the "un" glyphs, duplicated as a clip for the shimmer -->
    <clipPath id="un-clip">
      <path transform="translate(112,84)" d="M22.0 0.6L22.0 0.6Q17.1 0.6 13.3-1.6Q9.6-3.7 7.5-7.8Q5.5-11.9 5.5-17.5L5.5-17.5L5.5-48.0L18.4-48.0L18.4-19.7Q18.4-15.3 20.7-12.7Q23.0-10.2 27.1-10.2L27.1-10.2Q29.8-10.2 31.9-11.4Q34.0-12.5 35.2-14.8Q36.4-17.1 36.4-20.2L36.4-20.2L36.4-48.0L49.3-48.0L49.3 0L37.1 0L37.0-10.0Q35.1-5.4 31.9-2.7L31.9-2.7Q28.0 0.6 22.0 0.6ZM71.4-27.8L71.4-27.8L71.4 0L58.5 0L58.5-48.0L70.7-48.0L70.9-38.1Q72.7-42.7 75.9-45.4L75.9-45.4Q79.7-48.6 85.8-48.6L85.8-48.6Q90.8-48.6 94.5-46.5Q98.2-44.3 100.3-40.2Q102.3-36.2 102.3-30.6L102.3-30.6L102.3 0L89.4 0L89.4-28.3Q89.4-32.8 87.1-35.3Q84.8-37.9 80.7-37.9L80.7-37.9Q78.0-37.9 75.9-36.7Q73.8-35.5 72.6-33.3Q71.4-31.0 71.4-27.8Z"/>
    </clipPath>
    <style>
      .sans { font-family: 'Segoe UI', system-ui, -apple-system, sans-serif; }
      .mono { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }
      /* ambient — CSS only, deliberately desynced from the 8s story (rule 4 exception) */
      @keyframes drift-a { from { transform: translate(0,0); } to { transform: translate(-70px, 34px); } }
      @keyframes drift-b { from { transform: translate(0,0); } to { transform: translate(56px, -30px); } }
      .aurora-a { animation: drift-a 16s ease-in-out infinite alternate; }
      .aurora-b { animation: drift-b 19s ease-in-out infinite alternate; }
      /* story — every keyframe set runs on the master 8s */
      @keyframes metric-pulse { 0%, 50%, 100% { opacity: 1; } 25%, 75% { opacity: .68; } }
      .metric { animation: metric-pulse 8s ease-in-out infinite; }
      @keyframes live-pulse { 0%, 100% { opacity: 1; } 50% { opacity: .55; } }
      .live-dot { animation: live-pulse 8s ease-in-out infinite; }
      /* caret: hidden at rest (the line is struck), blinks only while the old line is being spoken (17-30%) */
      @keyframes caret { 0%, 17.9% { opacity: 0; } 18%, 21%, 24%, 27% { opacity: 1; } 19.5%, 22.5%, 25.5%, 28.5% { opacity: 0; } 30%, 100% { opacity: 0; } }
      [data-story].caret { animation: caret 8s steps(1, end) infinite; }
      /* pops carry TRANSFORM only — every story element's visibility is a SMIL opacity animate, so the retraction still plays under prefers-reduced-motion */
      @keyframes pop-wait { 0%, 12% { transform: translateY(0); } 17%, 38% { transform: translateY(10px); } 43%, 100% { transform: translateY(0); } }
      .pop-wait { transform-box: fill-box; transform-origin: left center; animation: pop-wait 8s cubic-bezier(.2,1.4,.4,1) infinite; }
      @keyframes pop-new { 0%, 12% { transform: translateY(0); } 17%, 42% { transform: translateY(8px); } 47%, 100% { transform: translateY(0); } }
      .pop-new { transform-box: fill-box; transform-origin: left center; animation: pop-new 8s cubic-bezier(.2,1.4,.4,1) infinite; }
      @keyframes pop-dot { 0%, 12% { transform: scale(1); } 17%, 48% { transform: scale(0); } 51.5% { transform: scale(1.35); } 54%, 100% { transform: scale(1); } }
      .pop-dot { transform-box: fill-box; transform-origin: center; animation: pop-dot 8s cubic-bezier(.2,1.4,.4,1) infinite; }
      @keyframes pop-stop { 0%, 12% { transform: scale(1); } 17%, 37.5% { transform: scale(0); } 40% { transform: scale(1.4); } 42%, 100% { transform: scale(1); } }
      .pop-stop { transform-box: fill-box; transform-origin: center; animation: pop-stop 8s cubic-bezier(.2,1.4,.4,1) infinite; }
      @media (prefers-reduced-motion: reduce) { * { animation: none !important; } }
    </style>
  </defs>

  <!-- ═══ backdrop: the plate is mandatory — it is what makes this hero self-sufficient on light and dark GitHub ═══ -->
  <g clip-path="url(#plate)">
    <rect x="0" y="0" width="1280" height="320" fill="#0B0D0E"/>
    <rect x="0" y="0" width="1280" height="320" fill="url(#grid)"/>
    <g filter="url(#aurora)">
      <circle class="aurora-a" cx="1090" cy="40" r="230" fill="#F2A93B" opacity="0.17"/>
      <circle class="aurora-b" cx="140" cy="330" r="200" fill="#3F9E63" opacity="0.11"/>
    </g>
    <rect x="-300" y="-60" width="200" height="440" fill="url(#beam)" transform="skewX(-18)">
      <animate attributeName="x" values="-300;-300;1600;1600" keyTimes="0;.18;.42;1" dur="8s" repeatCount="indefinite"/>
    </rect>
  </g>
  <rect x="0.5" y="0.5" width="1279" height="319" rx="20" fill="none" stroke="#ffffff" stroke-opacity="0.09"/>

  <!-- ═══ left: brand ═══ -->
  <!-- mini mark: the icon geometry at 48px; complete at t=0, rewinds at 12-18%, strikes again in sync with the transcript -->
  <g transform="translate(48,36) scale(0.09375)">
    <rect x="0" y="0" width="512" height="512" rx="116" fill="#0B0D0E"/>
    <rect x="6" y="6" width="500" height="500" rx="112" fill="none" stroke="#ffffff" stroke-opacity="0.12" stroke-width="10"/>
    <line x1="110" y1="197" x2="336" y2="197" stroke="#636C72" stroke-width="46" stroke-linecap="round">
      <animate attributeName="stroke" values="#636C72;#636C72;#F2F4F5;#F2F4F5;#636C72;#636C72" keyTimes="0;.12;.18;.34;.40;1" dur="8s" repeatCount="indefinite"/>
    </line>
    <path d="M88 197 L378 197" pathLength="100" stroke="url(#strike)" stroke-width="20" stroke-linecap="round" fill="none" stroke-dasharray="100" stroke-dashoffset="0">
      <animate attributeName="opacity" values="1;1;0;0;1;1" keyTimes="0;.12;.17;.295;.30;1" dur="8s" repeatCount="indefinite"/>
      <animate attributeName="stroke-dashoffset" values="0;0;100;100;0;0" keyTimes="0;.17;.18;.30;.38;1" dur="8s" repeatCount="indefinite"/>
    </path>
    <circle cx="398" cy="197" r="30" fill="#F2A93B">
      <animate attributeName="opacity" values="1;1;0;0;1;1" keyTimes="0;.12;.17;.375;.38;1" dur="8s" repeatCount="indefinite"/>
    </circle>
    <path d="M110 315 L284 315" pathLength="100" stroke="#F2F4F5" stroke-width="46" stroke-linecap="round" fill="none" stroke-dasharray="100" stroke-dashoffset="0">
      <animate attributeName="opacity" values="1;1;0;0;1;1" keyTimes="0;.12;.17;.415;.42;1" dur="8s" repeatCount="indefinite"/>
      <animate attributeName="stroke-dashoffset" values="0;0;100;100;0;0" keyTimes="0;.17;.18;.42;.48;1" dur="8s" repeatCount="indefinite"/>
    </path>
  </g>

  <!-- outlined wordmark: Inter 700 at 88px via opentype.js (wordmarks.json). "un" carries the amber ramp — the act of retraction — "say" stays white. -->
  <g transform="translate(112,84)">
    <path fill="url(#brand)" d="M22.0 0.6L22.0 0.6Q17.1 0.6 13.3-1.6Q9.6-3.7 7.5-7.8Q5.5-11.9 5.5-17.5L5.5-17.5L5.5-48.0L18.4-48.0L18.4-19.7Q18.4-15.3 20.7-12.7Q23.0-10.2 27.1-10.2L27.1-10.2Q29.8-10.2 31.9-11.4Q34.0-12.5 35.2-14.8Q36.4-17.1 36.4-20.2L36.4-20.2L36.4-48.0L49.3-48.0L49.3 0L37.1 0L37.0-10.0Q35.1-5.4 31.9-2.7L31.9-2.7Q28.0 0.6 22.0 0.6ZM71.4-27.8L71.4-27.8L71.4 0L58.5 0L58.5-48.0L70.7-48.0L70.9-38.1Q72.7-42.7 75.9-45.4L75.9-45.4Q79.7-48.6 85.8-48.6L85.8-48.6Q90.8-48.6 94.5-46.5Q98.2-44.3 100.3-40.2Q102.3-36.2 102.3-30.6L102.3-30.6L102.3 0L89.4 0L89.4-28.3Q89.4-32.8 87.1-35.3Q84.8-37.9 80.7-37.9L80.7-37.9Q78.0-37.9 75.9-36.7Q73.8-35.5 72.6-33.3Q71.4-31.0 71.4-27.8Z"/>
    <g transform="translate(111,0)">
      <path fill="#F2F4F5" d="M24.6 0.9L24.6 0.9Q18.8 0.9 14.3-0.7Q9.8-2.4 7.0-5.5Q4.2-8.7 3.4-13.1L3.4-13.1L15.3-15.2Q16.3-11.9 18.6-10.2Q21.0-8.5 25.0-8.5L25.0-8.5Q28.7-8.5 30.8-9.9Q32.9-11.3 32.9-13.4L32.9-13.4Q32.9-15.3 31.4-16.5Q29.9-17.7 26.7-18.4L26.7-18.4L18.4-20.1Q11.5-21.5 8.0-24.9Q4.6-28.4 4.6-33.7L4.6-33.7Q4.6-38.4 7.1-41.7Q9.7-45.0 14.2-46.8Q18.7-48.6 24.8-48.6L24.8-48.6Q30.5-48.6 34.6-47.1Q38.8-45.5 41.4-42.6Q44.0-39.7 44.8-35.8L44.8-35.8L33.4-33.8Q32.7-36.3 30.6-37.8Q28.5-39.4 25.0-39.4L25.0-39.4Q21.8-39.4 19.6-38.1Q17.5-36.7 17.5-34.5L17.5-34.5Q17.5-32.7 18.9-31.5Q20.3-30.2 23.7-29.5L23.7-29.5L32.3-27.8Q39.3-26.4 42.7-23.2Q46.1-20.0 46.1-14.8L46.1-14.8Q46.1-10.1 43.3-6.6Q40.6-3.0 35.7-1.0Q30.9 0.9 24.6 0.9ZM66.4 0.9L66.4 0.9Q61.9 0.9 58.2-0.7Q54.6-2.3 52.5-5.5Q50.4-8.7 50.4-13.4L50.4-13.4Q50.4-17.4 51.9-20.2Q53.4-22.9 56.0-24.5Q58.5-26.1 61.8-27.0Q65.0-27.8 68.6-28.2L68.6-28.2Q72.7-28.6 75.3-29.0Q77.9-29.3 79.0-30.1Q80.2-30.9 80.2-32.5L80.2-32.5L80.2-32.7Q80.2-34.8 79.4-36.2Q78.5-37.6 76.8-38.3Q75.1-39.1 72.7-39.1L72.7-39.1Q70.2-39.1 68.4-38.3Q66.5-37.6 65.4-36.4Q64.2-35.1 63.6-33.6L63.6-33.6L51.8-35.5Q53.1-39.7 55.9-42.6Q58.8-45.5 63.1-47.1Q67.4-48.6 72.7-48.6L72.7-48.6Q76.6-48.6 80.3-47.7Q83.9-46.8 86.8-44.9Q89.7-42.9 91.4-39.8Q93.1-36.7 93.1-32.4L93.1-32.4L93.1 0L80.9 0L80.9-6.7L80.5-6.7Q79.3-4.4 77.4-2.7Q75.5-1.0 72.7-0.0Q70.0 0.9 66.4 0.9ZM70.1-8.1L70.1-8.1Q73.1-8.1 75.4-9.3Q77.7-10.5 79.0-12.6Q80.3-14.7 80.3-17.2L80.3-17.2L80.3-22.4Q79.8-22.0 78.6-21.6Q77.4-21.3 76.0-21.0Q74.6-20.8 73.2-20.5Q71.8-20.3 70.8-20.2L70.8-20.2Q68.4-19.9 66.6-19.1Q64.8-18.3 63.8-17.0Q62.8-15.8 62.8-13.8L62.8-13.8Q62.8-11.9 63.8-10.7Q64.7-9.4 66.3-8.8Q68.0-8.1 70.1-8.1ZM102.0 17.0L102.0 17.0L105.0 7.3L106.6 7.7Q109.1 8.4 111.2 8.1Q113.2 7.8 114.4 6.4Q115.6 5.1 115.9 2.7L115.9 2.7L116.2 0.1L98.2-48.0L111.9-48.0L120.0-23.1Q121.4-18.4 122.4-13.7L122.4-13.7Q122.7-12.1 123.0-10.4L123.0-10.4Q123.4-12.1 123.8-13.7L123.8-13.7Q125.0-18.4 126.5-23.1L126.5-23.1L134.9-48.0L148.5-48.0L128.1 5.7Q126.6 9.5 124.3 12.4Q122.0 15.2 118.6 16.8Q115.2 18.3 110.4 18.3L110.4 18.3Q107.9 18.3 105.6 17.9Q103.4 17.6 102.0 17.0Z"/>
    </g>
  </g>
  <!-- shimmer: a skewed highlight sweeping under the clip of the "un" glyphs -->
  <g clip-path="url(#un-clip)">
    <rect x="60" y="20" width="44" height="100" fill="url(#shine)" transform="skewX(-22)">
      <animate attributeName="x" values="60;60;300;300" keyTimes="0;.56;.70;1" dur="8s" repeatCount="indefinite"/>
    </rect>
  </g>

  <text class="sans" x="48" y="134" font-size="16.5" fill="#C3CACF">The assistant that can be corrected — mid-sentence.</text>
  <text class="mono metric" x="48" y="170" font-size="12.5" fill="#F2A93B">200/200 retractions landed inside the speech window · loopback</text>
  <text class="mono" x="48" y="196" font-size="11.5" fill="#7C858B">MCP 2025-11-25 · Streamable HTTP · Alexa+ · TypeScript · Node 22</text>
  <text class="mono" x="48" y="292" font-size="10.5" fill="#7C858B">Illustration of the mechanism · figures in docs/proof/bench.txt</text>

  <!-- ═══ right: the product story — Ray's device card ═══ -->
  <rect x="592" y="24" width="648" height="272" rx="16" fill="#121517" stroke="#ffffff" stroke-opacity="0.09"/>

  <!-- steady layer of the panel -->
  <text class="mono" x="618" y="56" font-size="11" letter-spacing="2.4" fill="#7C858B">WEIGHT BEARING</text>
  <circle class="live-dot" cx="1112" cy="52" r="4" fill="#3F9E63"/>
  <text class="mono" x="1122" y="56" font-size="10.5" letter-spacing="1.4" fill="#5CB77E">LIVE · SUBSCRIBED</text>
  <text class="sans" x="618" y="92" font-size="15" fill="#9BA3A8">“Can I put weight on it yet?”</text>

  <!-- the spoken line: white while it is being spoken, dimmed when struck. textLength pins its width so the strike fits on every OS font. -->
  <text class="sans" x="618" y="140" font-size="23" font-weight="600" fill="#6E777C" textLength="520" lengthAdjust="spacingAndGlyphs">You can put about half your weight on it—<animate attributeName="fill" values="#6E777C;#6E777C;#F2F4F5;#F2F4F5;#6E777C;#6E777C" keyTimes="0;.12;.18;.34;.40;1" dur="8s" repeatCount="indefinite"/></text>
  <rect class="caret" data-story="beat-2" x="1142" y="121" width="3" height="23" rx="1" fill="#F2F4F5" opacity="0"/>

  <line x1="618" y1="262" x2="1214" y2="262" stroke="#ffffff" stroke-opacity="0.16" stroke-dasharray="3 5"/>
  <text class="mono" x="618" y="283" font-size="10.5" fill="#7C858B">care-internal://ray/risk · fall risk HIGH</text>
  <text class="mono" x="1214" y="283" font-size="10.5" letter-spacing="1.4" fill="#D9564A" text-anchor="end">NEVER SPOKEN</text>

  <!-- persistent residue — visible at t=0 (the poster carries the verb), crossfades out 12-17% for the replay, returns at the beat, and is still there at the seam -->
  <path d="M606 132 L1150 132" pathLength="100" stroke="url(#strike-t)" stroke-width="3" stroke-linecap="round" fill="none" stroke-dasharray="100" stroke-dashoffset="0">
    <animate attributeName="opacity" values="1;1;0;0;1;1" keyTimes="0;.12;.17;.295;.30;1" dur="8s" repeatCount="indefinite"/>
    <animate attributeName="stroke-dashoffset" values="0;0;100;100;0;0" keyTimes="0;.17;.18;.30;.38;1" dur="8s" repeatCount="indefinite"/>
  </path>
  <circle class="pop-stop" cx="1158" cy="132" r="5" fill="#F2A93B">
    <animate attributeName="opacity" values="1;1;0;0;1;1" keyTimes="0;.12;.17;.375;.38;1" dur="8s" repeatCount="indefinite"/>
  </circle>
  <text class="sans pop-wait" x="618" y="180" font-size="27" font-weight="700" fill="#F2F4F5">Wait — don’t do that.<animate attributeName="opacity" values="1;1;0;0;1;1" keyTimes="0;.12;.17;.38;.43;1" dur="8s" repeatCount="indefinite"/></text>
  <text class="sans pop-new" x="618" y="212" font-size="21" font-weight="500" fill="#E6E9EB">Full weight-bearing as tolerated.<animate attributeName="opacity" values="1;1;0;0;1;1" keyTimes="0;.12;.17;.42;.47;1" dur="8s" repeatCount="indefinite"/></text>
  <circle class="pop-dot" cx="623" cy="241" r="5.5" fill="#F2A93B">
    <animate attributeName="opacity" values="1;1;0;0;1;1" keyTimes="0;.12;.17;.48;.50;1" dur="8s" repeatCount="indefinite"/>
  </circle>
  <text class="mono" x="637" y="246" font-size="12" fill="#F2A93B">changed just now<tspan fill="#9BA3A8"> · Sarah Okafor, physio</tspan><animate attributeName="opacity" values="1;1;0;0;1;1" keyTimes="0;.12;.17;.50;.54;1" dur="8s" repeatCount="indefinite"/></text>

  <!-- story-only layer: hidden at t=0, fades out 95-98.5% so the seam pair equals the poster -->
  <g opacity="1">
    <animate attributeName="opacity" values="1;1;0;0" keyTimes="0;.95;.985;1" dur="8s" repeatCount="indefinite"/>

    <!-- beat 2 · the update frame arrives -->
    <g data-story="beat-2" opacity="0">
      <animate attributeName="opacity" values="0;0;1;1" keyTimes="0;.20;.23;1" dur="8s" repeatCount="indefinite"/>
      <animateTransform attributeName="transform" type="translate" values="14 0;14 0;0 0;0 0" keyTimes="0;.20;.23;1" dur="8s" repeatCount="indefinite"/>
      <text class="mono" x="1214" y="92" font-size="11.5" fill="#F2A93B" text-anchor="end">notifications/resources/updated</text>
      <text class="mono" x="1214" y="108" font-size="10.5" fill="#9BA3A8" text-anchor="end">care://ray/weight_bearing → v3</text>
    </g>
    <g data-story="beat-2" opacity="0">
      <animate attributeName="opacity" values="0;0;1;1;0;0" keyTimes="0;.24;.245;.30;.315;1" dur="8s" repeatCount="indefinite"/>
      <g>
        <animateMotion path="M1090,104 C 900,104 720,132 606,132" keyPoints="0;0;1;1" keyTimes="0;.24;.30;1" calcMode="linear" dur="8s" repeatCount="indefinite"/>
        <circle cx="0" cy="0" r="9" fill="#F2A93B" filter="url(#comet-glow)" opacity="0.9"/>
        <circle cx="0" cy="0" r="4" fill="#FFC15E"/>
      </g>
    </g>

    <!-- beat 3 · the lane's acknowledgement (the interjection itself is persistent residue above) -->
    <text class="mono" data-story="beat-3" x="1094" y="283" font-size="10.5" fill="#9BA3A8" text-anchor="end" opacity="0">read · shaped the answer<animate attributeName="opacity" values="0;0;0.95;0.95" keyTimes="0;.36;.40;1" dur="8s" repeatCount="indefinite"/></text>
  </g>
</svg>
