<!-- The benchmark protocol as one picture: two fixed inputs, every tool gets the same
     pair, every claim a tool makes is checked against the source document rather than
     read off its screen. A diagram, not a chart: no series palette to validate. Inks
     are the house set (#16181d / #636b78 / #8c8481 on #fafbfc, brand #b8470a for the
     one emphasized stage). Arrows are PATHS (no arrow glyphs; glyph arrows are
     tofu-prone on iOS). -->
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 420" width="1000" height="420" role="img" font-family="'Helvetica Neue', Helvetica, 'Segoe UI', Arial, sans-serif">
  <title>How the benchmark ran. Two fixed inputs: one control resume, a two page PDF for a fictional senior data platform engineer containing Kafka twice, Spark five times, Iceberg three times and Flink zero times; and one job posting, Senior Staff Data Platform Engineer at ServiceNow, which names Kafka, Apache Iceberg and Apache Spark in its title. The same pair went into each tool: Teal, Jobright, Simplify and JobShifu. Then every claim was checked against the source document: a skill marked missing is searched for in the text, a generated line is checked for support, and no count is read off a screenshot.</title>
  <rect width="1000" height="420" fill="#fafbfc"/>

  <text x="30" y="34" font-size="17" font-weight="700" fill="#636b78" letter-spacing="0.06em">HOW THE BENCHMARK RAN</text>

  <!-- Stage 1: the two fixed inputs -->
  <rect x="30" y="70" width="280" height="150" rx="10" fill="#ffffff" stroke="#e7e1df" stroke-width="1.5"/>
  <text x="50" y="100" font-size="18" font-weight="700" fill="#16181d">One control resume</text>
  <text x="50" y="126" font-size="15.5" fill="#636b78">2 pages, fictional identity,</text>
  <text x="50" y="148" font-size="15.5" fill="#636b78">senior data platform engineer.</text>
  <text x="50" y="176" font-size="15.5" fill="#16181d">Kafka 2 &#183; Spark 5 &#183; Iceberg 3</text>
  <text x="50" y="198" font-size="15.5" fill="#16181d">Flink 0 &#183; "Apache" 0</text>

  <rect x="30" y="240" width="280" height="120" rx="10" fill="#ffffff" stroke="#e7e1df" stroke-width="1.5"/>
  <text x="50" y="270" font-size="18" font-weight="700" fill="#16181d">One job posting</text>
  <text x="50" y="296" font-size="15.5" fill="#636b78">Senior Staff Data Platform</text>
  <text x="50" y="318" font-size="15.5" fill="#636b78">Engineer, ServiceNow. Kafka,</text>
  <text x="50" y="340" font-size="15.5" fill="#636b78">Iceberg and Spark in the title.</text>

  <!-- merge arrows into stage 2 -->
  <g stroke="#8c8481" stroke-width="2" fill="none" stroke-linecap="round">
    <path d="M 310 145 C 350 145, 350 195, 390 205"/>
    <path d="M 310 300 C 350 300, 350 250, 390 240"/>
    <path d="M 390 205 L 381 200 M 390 205 L 382 212"/>
    <path d="M 390 240 L 381 234 M 390 240 L 382 246"/>
  </g>

  <!-- Stage 2: the same pair into every tool -->
  <rect x="395" y="120" width="250" height="200" rx="10" fill="#ffffff" stroke="#e7e1df" stroke-width="1.5"/>
  <text x="415" y="150" font-size="18" font-weight="700" fill="#16181d">The same pair,</text>
  <text x="415" y="173" font-size="18" font-weight="700" fill="#16181d">into every tool</text>
  <g font-size="15.5">
    <rect x="415" y="190" width="90" height="32" rx="16" fill="#f2ede8"/>
    <text x="460" y="211" fill="#16181d" text-anchor="middle">Teal</text>
    <rect x="513" y="190" width="110" height="32" rx="16" fill="#f2ede8"/>
    <text x="568" y="211" fill="#16181d" text-anchor="middle">Jobright</text>
    <rect x="415" y="230" width="110" height="32" rx="16" fill="#f2ede8"/>
    <text x="470" y="251" fill="#16181d" text-anchor="middle">Simplify</text>
    <rect x="533" y="230" width="106" height="32" rx="16" fill="#fdece2"/>
    <text x="586" y="251" fill="#b8470a" text-anchor="middle">JobShifu</text>
  </g>
  <text x="415" y="296" font-size="14.5" fill="#8c8481">JobShifu is the publisher's own</text>
  <text x="415" y="314" font-size="14.5" fill="#8c8481">product, labeled as such.</text>

  <!-- arrow into stage 3 -->
  <path d="M 645 220 L 700 220" stroke="#8c8481" stroke-width="2" fill="none"/>
  <path d="M 700 220 L 690 213 M 700 220 L 690 227" stroke="#8c8481" stroke-width="2" fill="none" stroke-linecap="round"/>

  <!-- Stage 3: the check -->
  <rect x="705" y="105" width="265" height="230" rx="10" fill="#fdf5ef" stroke="#b8470a" stroke-width="1.5"/>
  <text x="725" y="135" font-size="18" font-weight="700" fill="#b8470a">Every claim, checked</text>
  <text x="725" y="158" font-size="18" font-weight="700" fill="#b8470a">against the source</text>
  <text x="725" y="188" font-size="15.5" fill="#16181d">A skill marked missing is</text>
  <text x="725" y="210" font-size="15.5" fill="#16181d">searched for in the text.</text>
  <text x="725" y="238" font-size="15.5" fill="#16181d">A generated line is checked</text>
  <text x="725" y="260" font-size="15.5" fill="#16181d">for support in the source.</text>
  <text x="725" y="288" font-size="15.5" fill="#16181d">No count is read off</text>
  <text x="725" y="310" font-size="15.5" fill="#16181d">a screenshot.</text>

  <text x="30" y="392" font-size="14.5" fill="#8c8481">Run 2026-08-27 on mobile web, one earlier desktop observation dated 2026-08-10.</text>
  <text x="30" y="412" font-size="14.5" fill="#8c8481">Protocol and results: the benchmark JSON linked in the post.</text>
</svg>
