<div class="cover-page">
  <div class="cover-header">
    <div class="cover-eyebrow">Quality Assurance</div>
    <div class="cover-title">example-coffee-shop.com</div>
    <div class="cover-subtitle">Automated scan of example-coffee-shop.com via QA Explorer. Covered 50 pages, ran 308 scripted test cases (222 passed), and surfaced 59 unique findings across functionality, UX, accessibility, performance, and security.</div>
    <div class="cover-confidential">Confidential</div>
  </div>
  <div class="cover-meta">
    <table>
      <tr><td>Environment</td><td><a href="https://example-coffee-shop.com">https://example-coffee-shop.com</a></td></tr>
      <tr><td>Project</td><td>example-coffee-shop.com</td></tr>
      <tr><td>Methodology</td><td>Automated end-to-end exploratory scan (browser automation + DOM extraction)</td></tr>
      <tr><td>Tester</td><td>QA Explorer (automated)</td></tr>
      <tr><td>Report Date</td><td>2026-06-07</td></tr>
          </table>
  </div>
  <div class="cover-stats">
    <div class="stats-grid">
      <div class="stat-card accent"><div class="stat-number">59</div><div class="stat-label">New Bugs</div></div>
      <div class="stat-card"><div class="stat-number">—</div><div class="stat-label">Bugs Fixed</div></div>
      <div class="stat-card"><div class="stat-number">—</div><div class="stat-label">UX Improved</div></div>
      <div class="stat-card"><div class="stat-number">308</div><div class="stat-label">Cases Run</div></div>
      <div class="stat-card"><div class="stat-number">222</div><div class="stat-label">Passed</div></div>
    </div>
  </div>
<div class="cover-summary">
<strong>59 findings · 8 high · 59 unique</strong>
<div class="impact-banner critical"><strong>Production Impact:</strong> 8 high-severity findings should be addressed before this build is promoted.</div>
</div>
</div>

<div class="section">
<div class="section-header"><span class="section-number">1</span><span class="section-title">Executive Summary</span></div>
<div class="section-intro">
Example Coffee Shop&#39;s website is a functioning e-commerce platform for specialty coffee with solid fundamentals: all 49 reachable pages return successful responses, SSL/TLS is in place, and basic meta infrastructure is present. However, the scan uncovered a broad set of security, accessibility, and content-quality issues that collectively present real risk to customers, the business&#39;s legal standing under GDPR/KVKK, and search engine visibility.
<br><br>
The most serious concerns are security-related. Forms across the site — including the login, registration, and checkout flows — lack CSRF protection, meaning an attacker could trick a logged-in customer into placing orders or changing account data without their knowledge. The XSRF-TOKEN cookie is not marked HttpOnly, making it readable by JavaScript and vulnerable to theft. There is no Content Security Policy, leaving the site open to cross-site scripting attacks. Additionally, no cookie consent banner is present despite third-party cookies being set on load, which is a direct violation of Turkish KVKK and EU GDPR rules and exposes the business to regulatory fines. A required legal document (the KVKK application form PDF) is completely inaccessible — a broken link on a compliance page.
<br><br>
Accessibility is a systemic weakness: 215 buttons and 392 links have no readable label for screen-reader users, colour contrast fails on multiple pages, and nearly every inner page is missing a unique meta description and Open Graph metadata, severely hurting SEO and social sharing. The homepage alone weighs 4.81 MB, which will result in slow load times on mobile connections. The team should prioritise CSRF protection and cookie consent first as legal/security obligations, then address accessibility and SEO gaps which directly affect customer reach and inclusivity.
<br><br>
<strong>Production impact.</strong> 8 high-severity findings should be addressed before this build is promoted.
</div>
</div>

<div class="section">
<div class="section-header"><span class="section-number">2</span><span class="section-title">Test Scope &amp; Environment</span></div>
<table class="data-table">
  <thead>
    <tr><th style="width: 180px;">Field</th><th>Value</th></tr>
  </thead>
  <tbody>
    <tr><td><strong>Application</strong></td><td class="">example-coffee-shop.com</td></tr>
    <tr><td><strong>Environment</strong></td><td class="">https://example-coffee-shop.com</td></tr>
    <tr><td><strong>Methodology</strong></td><td class="">Automated end-to-end exploratory scan — a headless browser crawls same-origin links, captures DOM/console/screenshots, analyzer derives findings.</td></tr>
    <tr><td><strong>Pages Scanned</strong></td><td class="">50</td></tr>
    <tr><td><strong>Duration</strong></td><td class="">9 min 45 s</td></tr>
    <tr><td><strong>Report ID</strong></td><td class="mono">3a20b969-f0cb-4740-a2d6-cd7a9a22a5d9</td></tr>
    <tr><td><strong>Analyzer</strong></td><td class="mono">QA Explorer Engine</td></tr>
  </tbody>
</table>
</div>

<div class="section">
<div class="section-header"><span class="section-number">3</span><span class="section-title">Test Execution Details</span></div>
<div class="section-intro">Scripted test cases executed against the target. Status values follow the test runner's convention (PASS / FAIL / UX / BLOCKED).</div>
<div class="test-suite-label">TS-NAV — Navigation &amp; Page Load Tests</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Open <span class="mono">homepage</span></td><td>The homepage should load successfully with all primary content visible.</td><td>HTTP 200, loaded in 2.59s, 23 headings, 84 links, 17 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>Open <span class="mono">Alisveris page</span></td><td>The Alisveris page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.33s, 73 headings, 266 links, 69 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>Open <span class="mono">Kahveler page</span></td><td>The Kahveler page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.54s, 27 headings, 128 links, 23 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>Open <span class="mono">Ekipmanlar page</span></td><td>The Ekipmanlar page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.31s, 37 headings, 156 links, 33 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">5</td><td>Open <span class="mono">Aksesuar page</span></td><td>The Aksesuar page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.65s, 31 headings, 138 links, 27 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">6</td><td>Open <span class="mono">Abonelikler page</span></td><td>The Abonelikler page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.32s, 28 headings, 74 links, 15 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">7</td><td>Open <span class="mono">Kahve Aboneligi Otomatik Kahve Makinesi page</span></td><td>The Kahve Aboneligi Otomatik Kahve Makinesi page should load successfully with all content visible.</td><td>HTTP 200, loaded in 1.91s, 28 headings, 75 links, 11 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">8</td><td>Open <span class="mono">Kahve Aboneligi Espresso page</span></td><td>The Kahve Aboneligi Espresso page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.04s, 28 headings, 75 links, 11 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">9</td><td>Open <span class="mono">Kahve Aboneligi page</span></td><td>The Kahve Aboneligi page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.08s, 28 headings, 75 links, 11 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">10</td><td>Open <span class="mono">Demleme Teknikleri page</span></td><td>The Demleme Teknikleri page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.35s, 18 headings, 77 links, 16 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">11</td><td>Open <span class="mono">Filtre Kahve page</span></td><td>The Filtre Kahve page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.08s, 21 headings, 70 links, 8 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">12</td><td>Open <span class="mono">Espresso page</span></td><td>The Espresso page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.30s, 19 headings, 70 links, 8 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">13</td><td>Open <span class="mono">French Press page</span></td><td>The French Press page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.08s, 21 headings, 70 links, 8 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">14</td><td>Open <span class="mono">Moka Pot page</span></td><td>The Moka Pot page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.18s, 21 headings, 70 links, 8 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">15</td><td>Open <span class="mono">Hario V60 page</span></td><td>The Hario V60 page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.15s, 21 headings, 70 links, 8 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">16</td><td>Open <span class="mono">Aeropress page</span></td><td>The Aeropress page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.09s, 21 headings, 70 links, 8 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">17</td><td>Open <span class="mono">Turk Kahvesi page</span></td><td>The Turk Kahvesi page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.04s, 21 headings, 70 links, 8 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">18</td><td>Open <span class="mono">Magazalar page</span></td><td>The Magazalar page should load successfully with all content visible.</td><td>HTTP 200, loaded in 3.10s, 11 headings, 109 links, 112 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">19</td><td>Open <span class="mono">Makaleler page</span></td><td>The Makaleler page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.65s, 20 headings, 79 links, 20 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">20</td><td>Open <span class="mono">Kahveni Bul page</span></td><td>The Kahveni Bul page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.13s, 19 headings, 71 links, 7 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">21</td><td>Open <span class="mono">Kaydol page</span></td><td>The Kaydol page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.09s, 11 headings, 74 links, 7 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">22</td><td>Open <span class="mono">Oturumac page</span></td><td>The Oturumac page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.08s, 11 headings, 72 links, 7 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">23</td><td>Open <span class="mono">homepage</span></td><td>The homepage should load successfully with all primary content visible.</td><td>HTTP 200, loaded in 2.41s, 23 headings, 84 links, 17 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">24</td><td>Open <span class="mono">Kahve Abonelikleri page</span></td><td>The Kahve Abonelikleri page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.62s, 28 headings, 74 links, 15 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">25</td><td>Open <span class="mono">Iletisim page</span></td><td>The Iletisim page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.29s, 11 headings, 70 links, 7 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">26</td><td>Open <span class="mono">Example Coffee Shop Grounded Collection Oversized White T Shirt page</span></td><td>The Example Coffee Shop Grounded Collection Oversized White T Shirt page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.20s, 15 headings, 76 links, 12 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">27</td><td>Open <span class="mono">Grounded Collection Oversized Green Hoodie page</span></td><td>The Grounded Collection Oversized Green Hoodie page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.35s, 15 headings, 76 links, 12 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">28</td><td>Open <span class="mono">Etiyopya Korcha Natural Filtre page</span></td><td>The Etiyopya Korcha Natural Filtre page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.34s, 16 headings, 76 links, 13 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">29</td><td>Open <span class="mono">Latte Fincani Logolu page</span></td><td>The Latte Fincani Logolu page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.26s, 14 headings, 75 links, 11 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">30</td><td>Open <span class="mono">Etkinlik Egitim page</span></td><td>The Etkinlik Egitim page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.07s, 11 headings, 75 links, 7 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">31</td><td>Open <span class="mono">Hikayemiz page</span></td><td>The Hikayemiz page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.04s, 11 headings, 70 links, 9 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">32</td><td>Open <span class="mono">Iletisim page</span></td><td>The Iletisim page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.27s, 11 headings, 70 links, 7 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">33</td><td>Open <span class="mono">Sss page</span></td><td>The Sss page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.04s, 49 headings, 70 links, 9 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">34</td><td>Open <span class="mono">Menuler page</span></td><td>The Menuler page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.37s, 11 headings, 70 links, 11 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">35</td><td>Open <span class="mono">Kahve Hakkinda page</span></td><td>The Kahve Hakkinda page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.27s, 13 headings, 83 links, 8 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">36</td><td>Open <span class="mono">Kvkk page</span></td><td>The Kvkk page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.22s, 11 headings, 70 links, 7 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">37</td><td>Open <span class="mono">Aydinlatma page</span></td><td>The Aydinlatma page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.15s, 11 headings, 70 links, 7 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">38</td><td>Open <span class="mono">Cerez page</span></td><td>The Cerez page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.09s, 11 headings, 70 links, 7 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">39</td><td>Load <span class="mono">the PDF file at /pdf/kvkk_basvuru.pdf</span></td><td>The file should load successfully and display its content.</td><td>The file did not load. The server did not provide a response after 0.75 seconds, indicating the file may be unavailable or inaccessible.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">40</td><td>Open <span class="mono">Odeme page</span></td><td>The Odeme page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.92s, 11 headings, 72 links, 7 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">41</td><td>Open <span class="mono">Hario V60 Dripper Seti page</span></td><td>The Hario V60 Dripper Seti page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.23s, 15 headings, 77 links, 11 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">42</td><td>Open <span class="mono">Cezve page</span></td><td>The Cezve page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.27s, 15 headings, 77 links, 11 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">43</td><td>Open <span class="mono">Hario Kettle Buono page</span></td><td>The Hario Kettle Buono page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.13s, 15 headings, 77 links, 13 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">44</td><td>Open <span class="mono">Shopping page</span></td><td>The Shopping page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.46s, 73 headings, 266 links, 69 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">45</td><td>Open <span class="mono">Filtre Kahve page</span></td><td>The Filtre Kahve page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.48s, 20 headings, 107 links, 16 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">46</td><td>Open <span class="mono">Rare page</span></td><td>The Rare page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.51s, 21 headings, 84 links, 31 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">47</td><td>Open <span class="mono">Espresso page</span></td><td>The Espresso page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.31s, 15 headings, 92 links, 11 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">48</td><td>Open <span class="mono">Turk Kahvesi page</span></td><td>The Turk Kahvesi page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.21s, 12 headings, 83 links, 8 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">49</td><td>Open <span class="mono">Ve Dahasi page</span></td><td>The Ve Dahasi page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.12s, 13 headings, 86 links, 9 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">50</td><td>Open <span class="mono">Kenya Kirinyaga page</span></td><td>The Kenya Kirinyaga page should load successfully with all content visible.</td><td>HTTP 200, loaded in 2.18s, 15 headings, 76 links, 13 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-LINKS — Internal Link Health</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>HEAD <span class="mono">/</span><span class="step-subtitle">&quot;Anasayfa&quot; · linked from 49 pages</span></td><td>The &quot;Anasayfa&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>HEAD <span class="mono">/alisveris</span><span class="step-subtitle">&quot;Online Dükkan&quot; · linked from 49 pages</span></td><td>The &quot;Online Dükkan&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>HEAD <span class="mono">/alisveris/kategori/kahveler</span><span class="step-subtitle">&quot;Kahveler&quot; · linked from 49 pages</span></td><td>The &quot;Kahveler&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>HEAD <span class="mono">/alisveris/kategori/ekipmanlar</span><span class="step-subtitle">&quot;Ekipmanlar&quot; · linked from 49 pages</span></td><td>The &quot;Ekipmanlar&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">5</td><td>HEAD <span class="mono">/alisveris/kategori/aksesuar</span><span class="step-subtitle">&quot;Aksesuar&quot; · linked from 48 pages</span></td><td>The &quot;Aksesuar&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">6</td><td>HEAD <span class="mono">/abonelikler</span><span class="step-subtitle">&quot;Abonelikler&quot; · linked from 47 pages</span></td><td>The &quot;Abonelikler&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">7</td><td>HEAD <span class="mono">/alisveris/urun/kahve-aboneligi-otomatik-kahve-makinesi</span><span class="step-subtitle">&quot;Otomatik Makineler&quot; · linked from 47 pages</span></td><td>The &quot;Otomatik Makineler&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">8</td><td>HEAD <span class="mono">/alisveris/urun/kahve-aboneligi-espresso</span><span class="step-subtitle">&quot;Espresso&quot; · linked from 47 pages</span></td><td>The &quot;Espresso&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">9</td><td>HEAD <span class="mono">/alisveris/urun/kahve-aboneligi</span><span class="step-subtitle">&quot;Filtre&quot; · linked from 47 pages</span></td><td>The &quot;Filtre&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">10</td><td>HEAD <span class="mono">/demleme-teknikleri</span><span class="step-subtitle">&quot;Demleme Teknikleri&quot; · linked from 49 pages</span></td><td>The &quot;Demleme Teknikleri&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">11</td><td>HEAD <span class="mono">/demleme-teknik/filtre-kahve</span><span class="step-subtitle">&quot;Filtre Kahve&quot; · linked from 49 pages</span></td><td>The &quot;Filtre Kahve&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">12</td><td>HEAD <span class="mono">/demleme-teknik/espresso</span><span class="step-subtitle">&quot;Espresso&quot; · linked from 49 pages</span></td><td>The &quot;Espresso&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">13</td><td>HEAD <span class="mono">/demleme-teknik/french-press</span><span class="step-subtitle">&quot;French Press&quot; · linked from 49 pages</span></td><td>The &quot;French Press&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">14</td><td>HEAD <span class="mono">/demleme-teknik/moka-pot</span><span class="step-subtitle">&quot;Moka Pot&quot; · linked from 49 pages</span></td><td>The &quot;Moka Pot&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">15</td><td>HEAD <span class="mono">/demleme-teknik/hario-v60</span><span class="step-subtitle">&quot;Hario V60&quot; · linked from 49 pages</span></td><td>The &quot;Hario V60&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">16</td><td>HEAD <span class="mono">/demleme-teknik/aeropress</span><span class="step-subtitle">&quot;Aeropress&quot; · linked from 49 pages</span></td><td>The &quot;Aeropress&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">17</td><td>HEAD <span class="mono">/demleme-teknik/turk-kahvesi</span><span class="step-subtitle">&quot;Türk Kahvesi&quot; · linked from 49 pages</span></td><td>The &quot;Türk Kahvesi&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">18</td><td>HEAD <span class="mono">/magazalar</span><span class="step-subtitle">&quot;Nerelerdeyiz&quot; · linked from 49 pages</span></td><td>The &quot;Nerelerdeyiz&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">19</td><td>HEAD <span class="mono">/makaleler</span><span class="step-subtitle">&quot;Blog&quot; · linked from 49 pages</span></td><td>The &quot;Blog&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">20</td><td>HEAD <span class="mono">/kahveni-bul</span><span class="step-subtitle">&quot;Kahveni Bul&quot; · linked from 49 pages</span></td><td>The &quot;Kahveni Bul&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">21</td><td>HEAD <span class="mono">/kullanici/kaydol</span><span class="step-subtitle">&quot;Üye Ol&quot; · linked from 49 pages</span></td><td>The &quot;Üye Ol&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">22</td><td>HEAD <span class="mono">/kullanici/oturumac</span><span class="step-subtitle">&quot;Giriş Yap&quot; · linked from 49 pages</span></td><td>The &quot;Giriş Yap&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">23</td><td>HEAD <span class="mono">/?setLang=en</span><span class="step-subtitle">&quot;EN&quot;</span></td><td>The &quot;EN&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">24</td><td>HEAD <span class="mono">/alisveris/kategori/kahve-abonelikleri</span><span class="step-subtitle">&quot;Abonelikler&quot; · linked from 49 pages</span></td><td>The &quot;Abonelikler&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">25</td><td>HEAD <span class="mono">/iletisim</span><span class="step-subtitle">&quot;Toptan Satış&quot; · linked from 49 pages</span></td><td>The &quot;Toptan Satış&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">26</td><td>HEAD <span class="mono">…/urun/example coffee shop-grounded-collection-oversized-white-t-shirt</span><span class="step-subtitle">&quot;Grounded Collection Oversized White T-Shirt&quot; · linked from 5 pages</span></td><td>The &quot;Grounded Collection Oversized White T-Shirt&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">27</td><td>HEAD <span class="mono">/alisveris/urun/grounded-collection-oversized-green-hoodie</span><span class="step-subtitle">&quot;Grounded Collection Oversized Green Hoodie&quot; · linked from 5 pages</span></td><td>The &quot;Grounded Collection Oversized Green Hoodie&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">28</td><td>HEAD <span class="mono">/alisveris/urun/etiyopya-korcha-natural-filtre</span><span class="step-subtitle">&quot;Etiyopya Korcha Natural (Filtre)&quot; · linked from 6 pages</span></td><td>The &quot;Etiyopya Korcha Natural (Filtre)&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">29</td><td>HEAD <span class="mono">/alisveris/urun/latte-fincani-logolu</span><span class="step-subtitle">&quot;Example Coffee Shop Latte Fincanı&quot; · linked from 7 pages</span></td><td>The &quot;Example Coffee Shop Latte Fincanı&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">30</td><td>HEAD <span class="mono">/alisveris/kategori/etkinlik-egitim</span><span class="step-subtitle">&quot;Etkinlikler&quot; · linked from 49 pages</span></td><td>The &quot;Etkinlikler&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">31</td><td>HEAD <span class="mono">/hikayemiz</span><span class="step-subtitle">&quot;Hikayemiz&quot; · linked from 49 pages</span></td><td>The &quot;Hikayemiz&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">32</td><td>HEAD <span class="mono">/iletisim?kariyer=1</span><span class="step-subtitle">&quot;Kariyer&quot; · linked from 49 pages</span></td><td>The &quot;Kariyer&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">33</td><td>HEAD <span class="mono">/sss</span><span class="step-subtitle">&quot;S. S. S.&quot; · linked from 49 pages</span></td><td>The &quot;S. S. S.&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">34</td><td>HEAD <span class="mono">/menuler</span><span class="step-subtitle">&quot;Menü&quot; · linked from 49 pages</span></td><td>The &quot;Menü&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">35</td><td>HEAD <span class="mono">/kahve-hakkinda</span><span class="step-subtitle">&quot;Kahvelerimiz Hakkında&quot; · linked from 49 pages</span></td><td>The &quot;Kahvelerimiz Hakkında&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">36</td><td>HEAD <span class="mono">/kvkk</span><span class="step-subtitle">&quot;KVKK ve Gizlilik Politikası&quot; · linked from 49 pages</span></td><td>The &quot;KVKK ve Gizlilik Politikası&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">37</td><td>HEAD <span class="mono">/aydinlatma</span><span class="step-subtitle">&quot;Aydınlatma Metni&quot; · linked from 49 pages</span></td><td>The &quot;Aydınlatma Metni&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">38</td><td>HEAD <span class="mono">/cerez</span><span class="step-subtitle">&quot;Çerez Politikası&quot; · linked from 49 pages</span></td><td>The &quot;Çerez Politikası&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">39</td><td>Check <span class="mono">if the PDF file at /pdf/kvkk_basvuru.pdf is reachable</span></td><td>The file should be accessible and return a success response or a valid redirect.</td><td>The file is not reachable. No response was received from the server after 3.37 seconds.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">40</td><td>HEAD <span class="mono">/odeme</span><span class="step-subtitle">&quot;Satın Al&quot; · linked from 49 pages</span></td><td>The &quot;Satın Al&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">41</td><td>HEAD <span class="mono">/alisveris/urun/Hario-v60-Dripper-seti</span><span class="step-subtitle">&quot;Sepete Ekle&quot; · linked from 49 pages</span></td><td>The &quot;Sepete Ekle&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">42</td><td>HEAD <span class="mono">/alisveris/urun/cezve</span><span class="step-subtitle">&quot;Sepete Ekle&quot; · linked from 49 pages</span></td><td>The &quot;Sepete Ekle&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">43</td><td>HEAD <span class="mono">/alisveris/urun/hario-kettle-buono</span><span class="step-subtitle">&quot;Sepete Ekle&quot; · linked from 49 pages</span></td><td>The &quot;Sepete Ekle&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">44</td><td>HEAD <span class="mono">/shopping</span><span class="step-subtitle">&quot;EN&quot; · linked from 3 pages</span></td><td>The &quot;EN&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">45</td><td>HEAD <span class="mono">/alisveris/kategori/filtre-kahve</span><span class="step-subtitle">&quot;Filtre Kahve&quot; · linked from 8 pages</span></td><td>The &quot;Filtre Kahve&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">46</td><td>HEAD <span class="mono">/alisveris/kategori/rare</span><span class="step-subtitle">&quot;RARE&quot; · linked from 8 pages</span></td><td>The &quot;RARE&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">47</td><td>HEAD <span class="mono">/alisveris/kategori/Espresso</span><span class="step-subtitle">&quot;Espresso&quot; · linked from 8 pages</span></td><td>The &quot;Espresso&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">48</td><td>HEAD <span class="mono">/alisveris/kategori/turk-kahvesi</span><span class="step-subtitle">&quot;Türk Kahvesi&quot; · linked from 8 pages</span></td><td>The &quot;Türk Kahvesi&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">49</td><td>HEAD <span class="mono">/alisveris/kategori/ve-dahasi</span><span class="step-subtitle">&quot;Ve Dahası&quot; · linked from 8 pages</span></td><td>The &quot;Ve Dahası&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">50</td><td>HEAD <span class="mono">/alisveris/urun/kenya-kirinyaga</span><span class="step-subtitle">&quot;Kenya Kirinyaga Washed&quot; · linked from 4 pages</span></td><td>The &quot;Kenya Kirinyaga Washed&quot; link should resolve to a working page.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-SEC — Security Headers &amp; Cookies</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Check <span class="mono">Strict-Transport-Security security header</span><span class="step-subtitle">sampled 2 pages</span></td><td>Header present with max-age ≥ 31536000 (1 year)</td><td>Present, max-age=31536000; includeSubDomains.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>Verify <span class="mono">Content-Security-Policy security header is set</span></td><td>The server should send a Content-Security-Policy header to protect against malicious scripts.</td><td>This security header is not set. The site is missing an important protection against code injection attacks.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">3</td><td>Check <span class="mono">X-Content-Type-Options security header</span><span class="step-subtitle">sampled 2 pages</span></td><td>Header value is exactly &quot;nosniff&quot;</td><td>Present, nosniff.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>Check <span class="mono">X-Frame-Options security header</span><span class="step-subtitle">sampled 2 pages</span></td><td>DENY or SAMEORIGIN</td><td>Present, SAMEORIGIN.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">5</td><td>Check <span class="mono">Referrer-Policy security header</span><span class="step-subtitle">sampled 2 pages</span></td><td>Header present (any directive)</td><td>Present, strict-origin-when-cross-origin.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">6</td><td>Check <span class="mono">Permissions-Policy security header</span><span class="step-subtitle">sampled 2 pages</span></td><td>Header present (any directive set)</td><td>Present, geolocation=self.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">7</td><td>Check <span class="mono">that the XSRF-TOKEN cookie is protected with the HttpOnly flag</span></td><td>The cookie should be marked HttpOnly so it cannot be accessed by JavaScript, preventing theft via malicious scripts.</td><td>The HttpOnly flag is not set on this cookie. A malicious script could potentially steal this token.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">8</td><td>Cookie <span class="mono">&quot;XSRF-TOKEN&quot; — Secure flag</span><span class="step-subtitle">sampled from /</span></td><td>Secure attribute set</td><td>Secure attribute present</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">9</td><td>Cookie <span class="mono">&quot;XSRF-TOKEN&quot; — SameSite attribute</span><span class="step-subtitle">sampled from /</span></td><td>SameSite=Strict / Lax / None</td><td>SameSite=none</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">10</td><td>Cookie <span class="mono">&quot;example coffee shop_session&quot; — HttpOnly flag</span><span class="step-subtitle">sampled from /</span></td><td>HttpOnly attribute set</td><td>HttpOnly attribute present</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">11</td><td>Cookie <span class="mono">&quot;example coffee shop_session&quot; — Secure flag</span><span class="step-subtitle">sampled from /</span></td><td>Secure attribute set</td><td>Secure attribute present</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">12</td><td>Cookie <span class="mono">&quot;example coffee shop_session&quot; — SameSite attribute</span><span class="step-subtitle">sampled from /</span></td><td>SameSite=Strict / Lax / None</td><td>SameSite=none</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">13</td><td>Mixed <span class="mono">Content scan across crawled pages</span><span class="step-subtitle">scanned 50 pages of console messages</span></td><td>No `http://` resources requested on HTTPS pages</td><td>No Mixed Content messages observed during crawl</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-A11Y — Accessibility Audit</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Verify <span class="mono">every page declares a language attribute</span></td><td>All pages should include a lang attribute in the HTML tag so screen readers and browsers know the page language.</td><td>1 out of 50 pages is missing this attribute, preventing assistive technology from reading the page correctly.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">2</td><td>Verify <span class="mono">each page has exactly one main heading (H1)</span></td><td>Every page should declare one H1 element to identify its primary title for screen reader users.</td><td>7 out of 50 pages have multiple H1 elements, which confuses screen readers about the page&#39;s main topic.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">3</td><td>Verify <span class="mono">heading hierarchy is properly structured</span></td><td>Headings should descend in order (H1 → H2 → H3) without skipping levels, so screen reader users can navigate the page outline.</td><td>1 out of 50 pages skips a heading level, creating gaps in the navigation structure that confuse assistive technology.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">4</td><td>Images <span class="mono">declare an `alt` attribute</span><span class="step-subtitle">inspected 800 images across 50 pages</span></td><td>Every `&lt;img&gt;` declares meaningful alt text (`alt=&quot;&quot;` only for purely decorative images)</td><td>All images declare a non-empty `alt`</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">5</td><td>Decorative <span class="mono">images use intentional empty alt</span><span class="step-subtitle">inspected 800 images</span></td><td>`alt=&quot;&quot;` is reserved for purely decorative images (review each occurrence)</td><td>No images declare empty `alt=&quot;&quot;`</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">6</td><td>Image <span class="mono">resources return 2xx</span><span class="step-subtitle">HEAD-checked 30 of 237 unique image srcs</span></td><td>Every `&lt;img src&gt;` resolves to a 2xx response</td><td>All 30 probed images returned 2xx</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">7</td><td>Verify <span class="mono">all buttons have descriptive labels</span></td><td>Every button should have visible text or an aria-label so users with screen readers know what it does.</td><td>215 buttons across 49 pages lack an accessible name. Users relying on screen readers cannot understand these buttons&#39; purpose.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">8</td><td>Verify <span class="mono">all links have descriptive labels</span></td><td>Every link should have text, an aria-label, or an image with alt text so screen readers know where it goes.</td><td>392 links across 49 pages have no accessible name. Screen reader users cannot understand the destination or purpose of these links.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-XSS — Static XSS Surface</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Verify <span class="mono">text inputs limit the amount of text that can be entered</span></td><td>Each text input should have a maxlength attribute to prevent excessively long payloads.</td><td>All 117 text inputs across 49 pages lack a maxlength attribute, leaving the site vulnerable to oversized malicious input.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">2</td><td>Verify <span class="mono">forms that modify data include CSRF protection</span></td><td>Every form that changes data should carry a hidden CSRF token to prevent unauthorized requests from other sites.</td><td>All 117 data-modifying forms lack a visible CSRF token. The site may rely on other defenses (like SameSite cookies) not detectable externally.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">3</td><td>Verify <span class="mono">forms do not use inline event handlers</span></td><td>Forms should avoid onclick, onload, and similar inline handlers; instead use addEventListener.</td><td>392 inline event handlers are present across 49 pages, making the code harder to secure and harder to maintain.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">4</td><td>Verify <span class="mono">links do not use javascript: URLs</span></td><td>Link href attributes should use proper URLs, not javascript: code execution.</td><td>49 links use javascript: URLs across 49 pages, increasing the risk of script execution vulnerabilities.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-COOKIE — Cookies &amp; Consent</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>No <span class="mono">unrecognized cookies set before consent</span><span class="step-subtitle">homepage Set-Cookie · HTTP 200</span></td><td>Either no cookies on first load, or only strictly-necessary / functional ones</td><td>2 cookies set (all match strict-necessary naming)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>Check <span class="mono">for a cookie or privacy consent banner on the homepage</span></td><td>The homepage should display a consent banner or cookie notice so users can manage their privacy preferences.</td><td>No consent banner was found in the homepage HTML, which may violate privacy regulations in some jurisdictions.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">3</td><td>Verify <span class="mono">cookies are scoped to the site&#39;s own domain</span></td><td>All cookies set by the homepage should belong to the site&#39;s domain, not third parties.</td><td>Both cookies set belong to a different domain, indicating third-party tracking or analytics cookies without a visible consent mechanism.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-PAGE — Pagination Structure</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Check <span class="mono">for pagination on multi-page listings</span></td><td>If any pages list multiple items, they should include next/previous links or numbered pagination.</td><td>No pagination patterns were detected on any crawled page.</td><td class="col-status"><span class="badge badge-blocked">⊘ BLOCKED</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-AUTHZ — Authorization Boundary</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Verify <span class="mono">the /admin path is not publicly accessible</span></td><td>Attempting to access /admin should return a login redirect or error, not admin content.</td><td>The path returns a 301 redirect to https://example-coffee-shop.com/admin, indicating the site properly gates this path.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">2</td><td>Verify <span class="mono">the /admin/ path is not publicly accessible</span></td><td>Attempting to access /admin/ should return a login redirect or error, not admin content.</td><td>The path returns a 301 redirect to https://example-coffee-shop.com/admin/, indicating the site properly gates this path.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">3</td><td>Verify <span class="mono">the /admin.php path is not publicly accessible</span></td><td>Attempting to access /admin.php should return a login redirect or error, not admin content.</td><td>The path returns a 301 redirect to https://example-coffee-shop.com/admin.php, indicating the site properly gates this path.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">4</td><td>Verify <span class="mono">the /administrator path is not publicly accessible</span></td><td>Attempting to access /administrator should return a login redirect or error, not admin content.</td><td>The path returns a 301 redirect to https://example-coffee-shop.com/administrator, indicating the site properly gates this path.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">5</td><td>Verify <span class="mono">the /dashboard path is not publicly accessible</span></td><td>Attempting to access /dashboard should return a login redirect or error, not admin content.</td><td>The path returns a 301 redirect to https://example-coffee-shop.com/dashboard, indicating the site properly gates this path.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">6</td><td>Verify <span class="mono">the /dashboard/ path is not publicly accessible</span></td><td>Attempting to access /dashboard/ should return a login redirect or error, not admin content.</td><td>The path returns a 301 redirect to https://example-coffee-shop.com/dashboard/, indicating the site properly gates this path.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">7</td><td>Verify <span class="mono">the /wp-admin path is not publicly accessible</span></td><td>Attempting to access /wp-admin should return a login redirect or error, not admin content.</td><td>The path returns a 301 redirect to https://example-coffee-shop.com/wp-admin, indicating the site properly gates this path.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">8</td><td>Verify <span class="mono">the /api/admin path is not publicly accessible</span></td><td>Attempting to access /api/admin should return a login redirect or error, not admin content.</td><td>The path returns a 301 redirect to https://example-coffee-shop.com/api/admin, indicating the site properly gates this path.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">9</td><td>Verify <span class="mono">the /api/users path is not publicly accessible</span></td><td>Attempting to access /api/users should return a login redirect or error, not admin content.</td><td>The path returns a 301 redirect to https://example-coffee-shop.com/api/users, indicating the site properly gates this path.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-RATELIMIT — Rate Limit &amp; Duplicate Submit</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Verify <span class="mono">forms include idempotency tokens to prevent duplicate submissions</span></td><td>Each data-modifying form should carry a token the server can use to detect and block duplicate requests.</td><td>None of the 117 data-modifying forms include an idempotency token, increasing the risk of accidental duplicate submissions.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">2</td><td>Check <span class="mono">if the server applies rate limiting to rapid requests</span></td><td>When sending multiple rapid requests, the server should respond with a rate-limit error or header after some threshold.</td><td>All 20 requests succeeded without any rate-limit signal, suggesting the server does not throttle rapid traffic.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">3</td><td>Check <span class="mono">for rate-limit headers on the login endpoint</span></td><td>The OPTIONS preflight response should include rate-limit or retry-after headers to hint at throttling.</td><td>The server returned a 200 OK response with no rate-limit headers, suggesting no server-side rate limiting is configured.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-SEO — SEO &amp; Discoverability</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Verify <span class="mono">every page has a page title</span></td><td>All pages should declare a non-empty &lt;title&gt; for search engines and browser tabs.</td><td>1 out of 50 pages is missing a title, which hurts search engine indexing and user experience.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">2</td><td>Verify <span class="mono">page titles are between 10 and 60 characters</span></td><td>Titles should be concise enough to display fully in search results and browser tabs.</td><td>37 out of 50 titles are too short (fewer than 10 characters), missing the opportunity to include keywords and context.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">3</td><td>Verify <span class="mono">every page has a meta description</span></td><td>All pages should include a meta description for search engines to display in results.</td><td>32 out of 50 pages lack a meta description, reducing click-through rates from search results.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">4</td><td>Verify <span class="mono">meta descriptions are between 50 and 160 characters</span></td><td>Descriptions should be long enough to convey the page&#39;s purpose but short enough to display fully in search results.</td><td>1 out of 18 meta descriptions is out of range.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">5</td><td>Verify <span class="mono">every page declares a canonical URL</span></td><td>All pages should include a canonical link to help search engines identify the primary version.</td><td>1 out of 50 pages is missing a canonical URL, which may confuse search engines about duplicate content.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">6</td><td>Verify <span class="mono">every page has Open Graph og:title metadata</span></td><td>Pages should declare og:title for better appearance when shared on social media.</td><td>24 out of 50 pages lack og:title, resulting in poor social media previews.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">7</td><td>Verify <span class="mono">every page has Open Graph og:description metadata</span></td><td>Pages should declare og:description for better appearance when shared on social media.</td><td>24 out of 50 pages lack og:description, resulting in poor social media previews.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">8</td><td>Verify <span class="mono">every page has Open Graph og:image metadata</span></td><td>Pages should declare og:image for better appearance when shared on social media.</td><td>24 out of 50 pages lack og:image, resulting in poor social media previews.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">9</td><td>Verify <span class="mono">every page has a main heading (H1)</span></td><td>All pages should declare at least one H1 element for proper document structure and SEO.</td><td>1 out of 50 pages is missing an H1, which harms search engine understanding of the page&#39;s purpose.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">10</td><td>robots.txt <span class="mono">exists</span><span class="step-subtitle">/robots.txt</span></td><td>GET `/robots.txt` returns 2xx</td><td>HTTP 200</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">11</td><td>robots.txt <span class="mono">references a Sitemap</span><span class="step-subtitle">scanned response body</span></td><td>robots.txt body contains a `Sitemap:` directive</td><td>`Sitemap:` directive present</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">12</td><td>Check <span class="mono">if a sitemap.xml file exists</span></td><td>The site should provide a sitemap at /sitemap.xml to help search engines discover all pages.</td><td>A sitemap.xml file was not found (HTTP 404). Search engines may miss some pages during crawling.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">13</td><td>Verify <span class="mono">the sitemap.xml file is valid</span></td><td>The sitemap should be properly formatted XML with valid structure.</td><td>This check was skipped because no sitemap.xml file is available.</td><td class="col-status"><span class="badge badge-blocked">⊘ BLOCKED</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-SSL — SSL / TLS &amp; Server Headers</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>HTTPS <span class="mono">homepage reachable</span><span class="step-subtitle">https://example-coffee-shop.com</span></td><td>HEAD https:// returns 2xx or 3xx</td><td>HTTP 200</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>TLS <span class="mono">certificate expiry</span><span class="step-subtitle">CN=example-coffee-shop.com</span></td><td>Certificate valid for at least 30 more days</td><td>70 days remaining (valid_to Aug 17 07:40:57 2026 GMT)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>Verify <span class="mono">the server redirects plain HTTP to HTTPS</span></td><td>Requests to http:// should redirect to the secure https:// version.</td><td>Plain HTTP requests receive a 301 redirect to https://example-coffee-shop.com/, properly enforcing encryption.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">4</td><td>Verify <span class="mono">server headers do not disclose software version information</span></td><td>Response headers should omit version details to avoid exposing potential vulnerabilities.</td><td>The X-Powered-By header reveals &#39;PHP/8.4.21, PleskLin&#39;, giving attackers information about the server software.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-REDIRECT — Redirect Configuration</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Verify <span class="mono">the HTTP-to-HTTPS redirect chain is efficient</span></td><td>Plain HTTP should redirect to HTTPS in 1–2 hops, landing on the matching URL.</td><td>Plain HTTP redirects in 1 hop directly to https://example-coffee-shop.com/ and loads successfully.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">2</td><td>www <span class="mono">/ apex canonicalization</span><span class="step-subtitle">compared www.example-coffee-shop.com ↔ example-coffee-shop.com</span></td><td>Both entrances land on the same canonical host</td><td>www → example-coffee-shop.com, apex → example-coffee-shop.com.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-META — Meta Tags &amp; PWA Essentials</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Favicon<span class="step-subtitle">homepage HTML scan</span></td><td>`&lt;link rel=&quot;icon&quot;&gt;` declared in the page head.</td><td>tag present in homepage HTML</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>Apple <span class="mono">touch icon</span><span class="step-subtitle">homepage HTML scan</span></td><td>`&lt;link rel=&quot;apple-touch-icon&quot;&gt;` declared in the page head.</td><td>tag present in homepage HTML</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>Structured <span class="mono">data (JSON-LD)</span><span class="step-subtitle">homepage HTML scan</span></td><td>At least one `&lt;script type=&quot;application/ld+json&quot;&gt;` block declaring relevant schema.org types.</td><td>tag present in homepage HTML</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>Charset <span class="mono">declaration</span><span class="step-subtitle">homepage HTML scan</span></td><td>`&lt;meta charset=&quot;utf-8&quot;&gt;` declared at the top of `&lt;head&gt;`.</td><td>tag present in homepage HTML</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">5</td><td>Web <span class="mono">app manifest</span><span class="step-subtitle">homepage declares &lt;link rel=&quot;manifest&quot;&gt;</span></td><td>Either `&lt;link rel=&quot;manifest&quot;&gt;` referenced (and 2xx) OR `/manifest.json` / `/site.webmanifest` reachable</td><td>HTTP 200 from /site.webmanifest</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-IMG — Image Optimization</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Verify <span class="mono">images use lazy loading for performance</span></td><td>At least 25% of images on the homepage should include loading=&quot;lazy&quot; to defer off-screen images.</td><td>Only 3 out of 17 images (18%) use lazy loading, missing an opportunity to improve page speed.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">2</td><td>Verify <span class="mono">images are not excessively large</span></td><td>Each image should transfer no more than 500 KB to keep load times reasonable.</td><td>4 out of 20 probed images exceed 500 KB, slowing down the page for users on slower connections.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">3</td><td>Modern <span class="mono">image formats (WebP / AVIF)</span><span class="step-subtitle">Content-Type inspection across 20 HEAD responses</span></td><td>At least some image responses use modern formats (image/webp or image/avif)</td><td>7 legacy (jpg/png), 13 modern (webp/avif).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-CONSOLE — Console Errors</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Check <span class="mono">for JavaScript errors in the browser console</span></td><td>The page should load without any JavaScript errors.</td><td>26 JavaScript errors were logged across 5 different pages. These errors may break functionality or prevent features from working.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">2</td><td>Check <span class="mono">for the console error: %c%d font-size:&lt;n&gt;;color:transparent NaN</span></td><td>The page should not emit this console error.</td><td>This error was observed: %c%d font-size:0;color:transparent NaN. This suggests a JavaScript library or script is misbehaving.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">3</td><td>Check <span class="mono">for the console error: Failed to load resource with status 401</span></td><td>The page should not emit this console error.</td><td>This error was observed: &#39;Failed to load resource: the server responded with a status of 401 ()&#39;. A resource is being requested without proper authentication.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">4</td><td>Check <span class="mono">for the console error: Bad element for Flickity carousel</span></td><td>The page should not emit this console error.</td><td>This error was observed: &#39;Bad element for Flickity: .magaza-carousel&#39;. The carousel library cannot find its target element, preventing it from functioning.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">5</td><td>Check <span class="mono">for the console error: Bad element for Flickity with null value</span></td><td>The page should not emit this console error.</td><td>This error was observed: &#39;Bad element for Flickity: null&#39;. The carousel library is receiving a null reference, indicating a scripting error.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-EXTLINKS — External Link Health</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Check <span class="mono">external link https://www.instagram.com/example coffee shop/</span><span class="step-subtitle">referenced from https://example-coffee-shop.com/</span></td><td>External link is reachable.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>Check <span class="mono">external link https://www.facebook.com/Example Coffee Shop</span><span class="step-subtitle">referenced from https://example-coffee-shop.com/</span></td><td>External link is reachable.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>Check <span class="mono">external link https://www.youtube.com/channel/UCCcZU6Jtcn5Fd5Ns4Bs-jmg</span><span class="step-subtitle">referenced from https://example-coffee-shop.com/</span></td><td>External link is reachable.</td><td>Link resolves correctly (HTTP 200).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>Check <span class="mono">external link https://twitter.com/Example Coffee ShopCoffee</span><span class="step-subtitle">referenced from https://example-coffee-shop.com/</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 301).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">5</td><td>Check <span class="mono">if an external URL is reachable: https://etbis.eticaret.gov.tr/sitedogrulama/...</span></td><td>The external link should respond with a success, redirect, or authentication error.</td><td>The request failed after 3.37 seconds with a network error. The external site may be down, blocked, or unreachable.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">6</td><td>Check <span class="mono">external link https://maps.app.goo.gl/pdt5cwA1UhYPxAcA9</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">7</td><td>Check <span class="mono">external link https://goo.gl/maps/L43WnbVwQKpt2Atv8</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">8</td><td>Check <span class="mono">external link https://maps.app.goo.gl/acMLfhUUgSGunUkU6</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">9</td><td>Check <span class="mono">external link https://goo.gl/maps/RfCQBPD7ymxDpt5H9</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">10</td><td>Check <span class="mono">external link https://maps.app.goo.gl/kqNwPRnkWn5MiAWJ8</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">11</td><td>Check <span class="mono">external link https://goo.gl/maps/yoFXMSSMCnedN2Qv5</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">12</td><td>Check <span class="mono">external link https://goo.gl/maps/w8JurPsAmL8cvmwB8</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">13</td><td>Check <span class="mono">external link https://goo.gl/maps/ZKAE2fVeF1qgPX4D9</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">14</td><td>Check <span class="mono">external link https://maps.app.goo.gl/6o5fkoNQGnGhCms97</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">15</td><td>Check <span class="mono">external link https://goo.gl/maps/ReHT9JuVw9V9gYzX6</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">16</td><td>Check <span class="mono">external link https://maps.app.goo.gl/VhDZzxn7KZ4Ra8v79</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">17</td><td>Check <span class="mono">external link https://goo.gl/maps/YzpQ4YBdTTvHcJwk7</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">18</td><td>Check <span class="mono">external link https://maps.app.goo.gl/GD9vA6Fq799Cz9L97</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">19</td><td>Check <span class="mono">external link https://maps.app.goo.gl/tVRivvSJntirrkNY9</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">20</td><td>Check <span class="mono">external link https://maps.app.goo.gl/D3nsjdXydf2BvUYg8</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">21</td><td>Check <span class="mono">external link https://maps.app.goo.gl/wR9yC4R14aprZujDA</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">22</td><td>Check <span class="mono">external link https://goo.gl/maps/q4TgzkL7idmjxas9A</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">23</td><td>Check <span class="mono">external link https://maps.app.goo.gl/36HoSUuraDWpTCmF7</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">24</td><td>Check <span class="mono">external link https://maps.app.goo.gl/cQprdqUAKdSmhZdj7</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">25</td><td>Check <span class="mono">external link https://maps.app.goo.gl/WZPp32knn4vdrzb26</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">26</td><td>Check <span class="mono">external link https://goo.gl/maps/yAeVDP3LyockR5jn6</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">27</td><td>Check <span class="mono">external link https://goo.gl/maps/wLAUevfzdTk3WbBf7</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">28</td><td>Check <span class="mono">external link https://maps.app.goo.gl/DYQmcD5ngHF2uFJK7</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">29</td><td>Check <span class="mono">external link https://maps.app.goo.gl/hphAb25tjJkWead16</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">30</td><td>Check <span class="mono">external link https://maps.app.goo.gl/UD6xJURvjVLb1rtm7</span><span class="step-subtitle">&quot;Haritada Gör&quot;</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 302).</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">31</td><td>Check <span class="mono">remaining external links for reachability</span></td><td>n/a (probe has a limit on external links checked)</td><td>16 additional external URLs were not probed due to capacity limits.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-OPENREDIR — Open Redirect Surface</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Test <span class="mono">if the ?redirect parameter can be used for open redirects</span></td><td>The server should ignore or strip external redirect targets to prevent hijacking users.</td><td>The server returns a 301 redirect with the parameter intact, though it remains on the same domain. This is safer than a true open redirect.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">2</td><td>Test <span class="mono">if the ?next parameter can be used for open redirects</span></td><td>The server should ignore or strip external redirect targets to prevent hijacking users.</td><td>The server returns a 301 redirect with the parameter intact, though it remains on the same domain. This is safer than a true open redirect.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">3</td><td>Test <span class="mono">if the ?url parameter can be used for open redirects</span></td><td>The server should ignore or strip external redirect targets to prevent hijacking users.</td><td>The server returns a 301 redirect with the parameter intact, though it remains on the same domain. This is safer than a true open redirect.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">4</td><td>Test <span class="mono">if the ?return parameter can be used for open redirects</span></td><td>The server should ignore or strip external redirect targets to prevent hijacking users.</td><td>The server returns a 301 redirect with the parameter intact, though it remains on the same domain. This is safer than a true open redirect.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">5</td><td>Test <span class="mono">if the ?returnUrl parameter can be used for open redirects</span></td><td>The server should ignore or strip external redirect targets to prevent hijacking users.</td><td>The server returns a 301 redirect with the parameter intact, though it remains on the same domain. This is safer than a true open redirect.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-AUTH — Authentication Form Structure</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Login <span class="mono">form discovered</span><span class="step-subtitle">page: https://example-coffee-shop.com/kullanici/kaydol</span></td><td>Authentication form found via password input / login path</td><td>form @ https://example-coffee-shop.com/kullanici/kaydol (method POST)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>Form <span class="mono">action uses HTTPS</span><span class="step-subtitle">https://example-coffee-shop.com/kullanici/kaydol</span></td><td>Login form posts to an https:// URL</td><td>https:// action confirmed</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>Form <span class="mono">method is POST (not GET)</span><span class="step-subtitle">GET would leak credentials via URL IF the submit isn&#39;t JS-intercepted to a real POST</span></td><td>Form method=POST</td><td>method=POST confirmed</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>Verify <span class="mono">the password field includes autocomplete guidance</span></td><td>Password inputs should declare autocomplete=&quot;current-password&quot; to enable browser password managers.</td><td>The password field lacks an autocomplete attribute, preventing password managers from working correctly.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">5</td><td>Verify <span class="mono">the username field includes autocomplete guidance</span></td><td>Username inputs should declare autocomplete=&quot;username&quot; to enable browser password managers.</td><td>The username field lacks an autocomplete attribute, preventing password managers from working correctly.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">6</td><td>Verify <span class="mono">a password-reset link is visible on the login page</span></td><td>Users should be able to find a &#39;Forgot password&#39; or similar link if they cannot sign in.</td><td>No password-reset link was found on the login page, making it difficult for users who forget their credentials.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">7</td><td>Verify <span class="mono">the password field limits input length</span></td><td>Password inputs should declare a maxlength attribute (typically 64 or more) to prevent excessively long inputs.</td><td>The password field lacks a maxlength attribute, leaving it vulnerable to very long or malicious payloads.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">8</td><td>Verify <span class="mono">the login form includes CSRF protection</span></td><td>The form should carry a hidden CSRF token, or the server may use other defenses (like SameSite cookies).</td><td>No visible CSRF token field was found in the login form. The site may rely on other defenses not externally observable.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">9</td><td>Empty <span class="mono">email + empty password</span><span class="step-subtitle">submitted to https://example-coffee-shop.com/kullanici/kaydol</span></td><td>Form rejects the submission (URL unchanged OR password field still visible OR visible error)</td><td>URL unchanged, password input still visible.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">10</td><td>Valid-format <span class="mono">email + empty password</span><span class="step-subtitle">submitted to https://example-coffee-shop.com/kullanici/kaydol</span></td><td>Form rejects the submission (URL unchanged OR password field still visible OR visible error)</td><td>URL unchanged, password input still visible.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">11</td><td>Empty <span class="mono">email + filled password</span><span class="step-subtitle">submitted to https://example-coffee-shop.com/kullanici/kaydol</span></td><td>Form rejects the submission (URL unchanged OR password field still visible OR visible error)</td><td>URL unchanged, password input still visible.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">12</td><td>Email <span class="mono">without `@`</span><span class="step-subtitle">submitted to https://example-coffee-shop.com/kullanici/kaydol</span></td><td>Form rejects the submission (URL unchanged OR password field still visible OR visible error)</td><td>URL unchanged, password input still visible.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">13</td><td>1-character <span class="mono">password</span><span class="step-subtitle">submitted to https://example-coffee-shop.com/kullanici/kaydol</span></td><td>Form rejects the submission (URL unchanged OR password field still visible OR visible error)</td><td>URL unchanged, password input still visible.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">14</td><td>200-character <span class="mono">password (graceful handling)</span><span class="step-subtitle">submitted to https://example-coffee-shop.com/kullanici/kaydol</span></td><td>Form rejects the submission (URL unchanged OR password field still visible OR visible error)</td><td>URL unchanged, password input still visible.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">15</td><td>SQL-injection <span class="mono">payload in email</span><span class="step-subtitle">submitted to https://example-coffee-shop.com/kullanici/kaydol</span></td><td>Form rejects the submission (URL unchanged OR password field still visible OR visible error)</td><td>URL unchanged, password input still visible.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">16</td><td>XSS <span class="mono">payload in email</span><span class="step-subtitle">submitted to https://example-coffee-shop.com/kullanici/kaydol</span></td><td>Form rejects the submission (URL unchanged OR password field still visible OR visible error)</td><td>URL unchanged, password input still visible.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">17</td><td>Wrong <span class="mono">email + wrong password</span><span class="step-subtitle">submitted to https://example-coffee-shop.com/kullanici/kaydol</span></td><td>Form rejects the submission (URL unchanged OR password field still visible OR visible error)</td><td>URL unchanged, password input still visible.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">18</td><td>Check <span class="mono">for user-enumeration vulnerabilities in login error messages</span></td><td>This test requires a real test account email for comparison.</td><td>This test was skipped because no test account email was provided.</td><td class="col-status"><span class="badge badge-blocked">⊘ BLOCKED</span></td></tr>
    <tr><td class="col-num">19</td><td>Verify <span class="mono">the password field includes a visibility toggle</span></td><td>Users should be able to toggle between masked and visible password text for better usability.</td><td>No password visibility toggle button was found, forcing users to type blindly.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">20</td><td>Verify <span class="mono">a &#39;remember me&#39; checkbox is available</span></td><td>Users should be offered a &#39;remember me&#39; or &#39;stay signed in&#39; option for convenience.</td><td>No remember-me checkbox was found on the login page.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">21</td><td>Check <span class="mono">if the password-reset link is reachable</span></td><td>The password-reset link should point to a valid page.</td><td>No password-reset link was discovered on the page, so this check could not be completed.</td><td class="col-status"><span class="badge badge-blocked">⊘ BLOCKED</span></td></tr>
    <tr><td class="col-num">22</td><td>Register <span class="mono">form requires email + password + confirm-password</span><span class="step-subtitle">page: https://example-coffee-shop.com/kullanici/kaydol</span></td><td>Form contains an email input, a password input, and a second password (confirm) input</td><td>all three required fields present</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">23</td><td>Verify <span class="mono">a password strength indicator is displayed near the password input</span></td><td>Users should see feedback about password strength (weak, medium, strong) or a list of requirements.</td><td>No password strength meter or requirement list was found, leaving users uncertain about acceptable passwords.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">24</td><td>Verify <span class="mono">the registration form requires acceptance of terms and privacy</span></td><td>A checkbox should require users to explicitly agree to the site&#39;s terms and privacy policy.</td><td>No terms or privacy checkbox was found on the registration form, which may violate data protection regulations.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-API — API Responses</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>API <span class="mono">responses return 2xx/3xx</span><span class="step-subtitle">4 XHR/fetch responses on https://example-coffee-shop.com/</span></td><td>All API responses return 2xx / 3xx</td><td>All 4 responses 2xx/3xx</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>API <span class="mono">responses under 2s</span><span class="step-subtitle">4 XHR/fetch responses</span></td><td>Every API response completes in ≤ 2000 ms</td><td>All responses under threshold</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>Verify <span class="mono">API responses declare a Content-Type header</span></td><td>All API responses should include a Content-Type header so clients know how to parse the data.</td><td>3 API responses lack a Content-Type header, which may confuse API clients about the response format.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">4</td><td>API <span class="mono">response bodies do not expose stack traces</span><span class="step-subtitle">4 XHR/fetch responses</span></td><td>Response bodies never contain server stack traces / debug error details</td><td>No stack traces detected in response bodies</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-ERR — Error Page &amp; 404 Handling</div>
<table class="data-table err-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>GET <span class="mono">/xyz</span><span class="step-subtitle">short nonsense path</span></td><td>HTTP 4xx response · branded error page consistent with site chrome</td><td>HTTP 404, branded, 0.65 s.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>GET <span class="mono">/__qa_explorer_404_probe_*</span><span class="step-subtitle">opaque randomized path</span></td><td>HTTP 4xx response · branded error page consistent with site chrome</td><td>HTTP 404, branded, 0.50 s.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>Load <span class="mono">the search page with an invalid query parameter</span></td><td>The page should return a 4xx error with branded site styling consistent with the rest of the site.</td><td>The page returned HTTP 403 with generic error styling, not matching the site&#39;s design. This confuses users about whether it is a site error or a real access denial.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">4</td><td>Request <span class="mono">a very long URL path to test error handling</span></td><td>The page should return a 4xx error with branded site styling consistent with the rest of the site.</td><td>The page returned HTTP 403 with generic error styling, not matching the site&#39;s design. This confuses users about whether it is a site error or a real access denial.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">5</td><td>GET <span class="mono">/test&#39;&lt;sql-payload&gt;</span><span class="step-subtitle">SQL-injection-style path</span></td><td>HTTP 4xx response · branded error page consistent with site chrome</td><td>HTTP 404, branded, 0.29 s.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-FORM — Form Validation Tests</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Form <span class="mono">#1: POST https://example-coffee-shop.com/ebulten</span><span class="step-subtitle">empty submit test</span></td><td>Submission blocked or error message shown</td><td>1 input(s) flagged as invalid, browser message: &quot;Please fill out this field.&quot;.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>Form <span class="mono">#1: POST https://example-coffee-shop.com/ebulten</span><span class="step-subtitle">invalid email format test</span></td><td>Browser rejected the invalid email format (HTML5 :invalid or visible error)</td><td>1 input(s) flagged as invalid, browser message: &quot;Please include an &#39;@&#39; in the email address. &#39;not-an-email&#39; is missing an &#39;@&#39;.&quot;.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>Submit <span class="mono">an empty form at POST https://example-coffee-shop.com/alisveris/ara</span></td><td>The form should validate and show an error message, or prevent submission if required fields are empty.</td><td>The empty form submitted without triggering client-side validation or showing any error, allowing invalid data to be sent.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">4</td><td>Form <span class="mono">#3: POST https://example-coffee-shop.com/sepet/ekle</span><span class="step-subtitle">empty submit test</span></td><td>Submission blocked or error message shown</td><td>4 input(s) flagged as invalid, browser message: &quot;Please select an item in the list.&quot;.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">5</td><td>Form <span class="mono">#4: POST https://example-coffee-shop.com/kullanici/kaydol</span><span class="step-subtitle">empty submit test</span></td><td>Submission blocked or error message shown</td><td>6 input(s) flagged as invalid, browser message: &quot;Please fill out this field.&quot;.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">6</td><td>Form <span class="mono">#4: POST https://example-coffee-shop.com/kullanici/kaydol</span><span class="step-subtitle">invalid email format test</span></td><td>Browser rejected the invalid email format (HTML5 :invalid or visible error)</td><td>6 input(s) flagged as invalid, browser message: &quot;Please fill out this field.&quot;.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">7</td><td>Form <span class="mono">#5: POST https://example-coffee-shop.com/kullanici/oturumac</span><span class="step-subtitle">empty submit test</span></td><td>Submission blocked or error message shown</td><td>2 input(s) flagged as invalid, browser message: &quot;Please fill out this field.&quot;.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">8</td><td>Form <span class="mono">#5: POST https://example-coffee-shop.com/kullanici/oturumac</span><span class="step-subtitle">invalid email format test</span></td><td>Browser rejected the invalid email format (HTML5 :invalid or visible error)</td><td>2 input(s) flagged as invalid, browser message: &quot;Please include an &#39;@&#39; in the email address. &#39;not-an-email&#39; is missing an &#39;@&#39;.&quot;.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">9</td><td>Form <span class="mono">#6: POST https://example-coffee-shop.com/iletisim</span><span class="step-subtitle">empty submit test</span></td><td>Submission blocked or error message shown</td><td>5 input(s) flagged as invalid, browser message: &quot;Please fill out this field.&quot;.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">10</td><td>Form <span class="mono">#6: POST https://example-coffee-shop.com/iletisim</span><span class="step-subtitle">invalid email format test</span></td><td>Browser rejected the invalid email format (HTML5 :invalid or visible error)</td><td>5 input(s) flagged as invalid, browser message: &quot;Please fill out this field.&quot;.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-CTA — Primary CTA Tests</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Click <span class="mono">button &quot;Sign Up&quot;</span><span class="step-subtitle">click navigates to destination</span></td><td>CTA produces a navigation, modal, or DOM update</td><td>Navigated to https://example-coffee-shop.com/kullanici/kaydol (HTTP 200)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>Click <span class="mono">button &quot;Login&quot;</span><span class="step-subtitle">click navigates to destination</span></td><td>CTA produces a navigation, modal, or DOM update</td><td>Navigated to https://example-coffee-shop.com/kullanici/oturumac (HTTP 200)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>Click <span class="mono">button &quot;Subscribe&quot;</span><span class="step-subtitle">click updates page content in place</span></td><td>CTA produces a navigation, modal, or DOM update</td><td>Document text length changed by 254 chars (SPA / in-place update)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>Click <span class="mono">link &quot;Sign Up&quot; → /kullanici/kaydol</span><span class="step-subtitle">click navigates to destination</span></td><td>CTA produces a navigation, modal, or DOM update</td><td>Navigated to https://example-coffee-shop.com/kullanici/kaydol (HTTP 200)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">5</td><td>Click <span class="mono">link &quot;Login&quot; → /kullanici/oturumac</span><span class="step-subtitle">click navigates to destination</span></td><td>CTA produces a navigation, modal, or DOM update</td><td>Navigated to https://example-coffee-shop.com/kullanici/oturumac (HTTP 200)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">6</td><td>Click <span class="mono">link &quot;Add to Cart&quot; → /alisveris</span><span class="step-subtitle">click navigates to destination</span></td><td>CTA produces a navigation, modal, or DOM update</td><td>Navigated to https://example-coffee-shop.com/alisveris (HTTP 200)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">7</td><td>Click <span class="mono">link &quot;Contact Us&quot; → /iletisim</span><span class="step-subtitle">click navigates to destination</span></td><td>CTA produces a navigation, modal, or DOM update</td><td>Navigated to https://example-coffee-shop.com/iletisim (HTTP 200)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">8</td><td>Attempt <span class="mono">to click the &#39;Buy&#39; link pointing to /odeme</span></td><td>Clicking should navigate to the target page or trigger an action.</td><td>This link was not clicked because the text &#39;Buy&#39; matches a destructive action blocklist, preventing accidental activation during automated testing.</td><td class="col-status"><span class="badge badge-blocked">⊘ BLOCKED</span></td></tr>
    <tr><td class="col-num">9</td><td>Click <span class="mono">link &quot;Add to Cart&quot; → …s/urun/Hario-v60-Dripper-seti</span><span class="step-subtitle">click navigates to destination</span></td><td>CTA produces a navigation, modal, or DOM update</td><td>Navigated to https://example-coffee-shop.com/alisveris (HTTP 200)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">10</td><td>Click <span class="mono">link &quot;Add to Cart&quot; → /alisveris/urun/cezve</span><span class="step-subtitle">click navigates to destination</span></td><td>CTA produces a navigation, modal, or DOM update</td><td>Navigated to https://example-coffee-shop.com/alisveris (HTTP 200)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-SEARCH — Search Behavior</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Discover <span class="mono">and exercise the site search functionality</span></td><td>At least one search form should be available on the site to test search behavior.</td><td>No search form was found on any crawled page, so search functionality could not be tested.</td><td class="col-status"><span class="badge badge-blocked">⊘ BLOCKED</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-ERROR — Error &amp; Resilience Handling</div>
<table class="data-table err-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Check <span class="mono">if a service worker is registered</span></td><td>Optional — a service worker enables offline caching and improves resilience.</td><td>No service worker is registered. Offline functionality and caching are not available.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">2</td><td>Test <span class="mono">the page&#39;s behavior when the network is offline</span></td><td>A gracefully designed site should show a cached or branded offline page, not a generic browser error.</td><td>The page failed to load offline with a network error (net::ERR_INTERNET_DISCONNECTED). No offline experience is provided.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">3</td><td>Check <span class="mono">if a loading indicator appears during slow navigation</span></td><td>Users should see visual feedback (spinner, progress bar) while content is loading.</td><td>No loading indicator was detected during navigation, leaving users unsure if the page is responding.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-PERF — Performance &amp; Core Web Vitals</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>FCP <span class="mono">· /</span></td><td>≤1.8s good · ≤3.0s needs improvement</td><td>1.52s</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>LCP <span class="mono">· /</span></td><td>≤2.5s good · ≤4.0s needs improvement</td><td>1.52s</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>CLS <span class="mono">· /</span></td><td>≤0.1 good · ≤0.25 needs improvement</td><td>0.011</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>DOM <span class="mono">· /</span></td><td>≤1500 elements good · ≤3000 needs improvement</td><td>470 elements</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">5</td><td>Measure <span class="mono">the total page weight of the homepage</span></td><td>The homepage should load in 3 MB or less (good), or at most 5 MB (needs improvement).</td><td>The homepage is 4.81 MB, which needs improvement. Optimize images, minify code, or defer non-critical resources.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">6</td><td>FCP <span class="mono">· /demleme-teknik/french-press</span></td><td>≤1.8s good · ≤3.0s needs improvement</td><td>1.58s</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">7</td><td>LCP <span class="mono">· /demleme-teknik/french-press</span></td><td>≤2.5s good · ≤4.0s needs improvement</td><td>1.58s</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">8</td><td>CLS <span class="mono">· /demleme-teknik/french-press</span></td><td>≤0.1 good · ≤0.25 needs improvement</td><td>0.017</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">9</td><td>DOM <span class="mono">· /demleme-teknik/french-press</span></td><td>≤1500 elements good · ≤3000 needs improvement</td><td>389 elements</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">10</td><td>Weight <span class="mono">· /demleme-teknik/french-press</span><span class="step-subtitle">31 resources</span></td><td>≤3 MB good · ≤5 MB needs improvement</td><td>0.72 MB</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">11</td><td>FCP <span class="mono">· /iletisim</span></td><td>≤1.8s good · ≤3.0s needs improvement</td><td>1.45s</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">12</td><td>LCP <span class="mono">· /iletisim</span></td><td>≤2.5s good · ≤4.0s needs improvement</td><td>1.87s</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">13</td><td>CLS <span class="mono">· /iletisim</span></td><td>≤0.1 good · ≤0.25 needs improvement</td><td>0.028</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">14</td><td>DOM <span class="mono">· /iletisim</span></td><td>≤1500 elements good · ≤3000 needs improvement</td><td>360 elements</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">15</td><td>Weight <span class="mono">· /iletisim</span><span class="step-subtitle">32 resources</span></td><td>≤3 MB good · ≤5 MB needs improvement</td><td>0.75 MB</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">16</td><td>FCP <span class="mono">· /aydinlatma</span></td><td>≤1.8s good · ≤3.0s needs improvement</td><td>1.50s</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">17</td><td>LCP <span class="mono">· /aydinlatma</span></td><td>≤2.5s good · ≤4.0s needs improvement</td><td>1.75s</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">18</td><td>CLS <span class="mono">· /aydinlatma</span></td><td>≤0.1 good · ≤0.25 needs improvement</td><td>0.041</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">19</td><td>DOM <span class="mono">· /aydinlatma</span></td><td>≤1500 elements good · ≤3000 needs improvement</td><td>445 elements</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">20</td><td>Weight <span class="mono">· /aydinlatma</span><span class="step-subtitle">30 resources</span></td><td>≤3 MB good · ≤5 MB needs improvement</td><td>0.72 MB</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">21</td><td>FCP <span class="mono">· /alisveris/urun/kenya-kirinyaga</span></td><td>≤1.8s good · ≤3.0s needs improvement</td><td>1.40s</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">22</td><td>LCP <span class="mono">· /alisveris/urun/kenya-kirinyaga</span></td><td>≤2.5s good · ≤4.0s needs improvement</td><td>1.95s</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">23</td><td>CLS <span class="mono">· /alisveris/urun/kenya-kirinyaga</span></td><td>≤0.1 good · ≤0.25 needs improvement</td><td>0.024</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">24</td><td>DOM <span class="mono">· /alisveris/urun/kenya-kirinyaga</span></td><td>≤1500 elements good · ≤3000 needs improvement</td><td>486 elements</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">25</td><td>Measure <span class="mono">the total page weight of the product detail page</span></td><td>Product pages should load in 3 MB or less (good), or at most 5 MB (needs improvement).</td><td>The product page is 3.40 MB, which is acceptable but could be further optimized.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-RESPONSIVE — Responsive Layout Checks</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Check <span class="mono">the homepage layout on a mobile phone (375×812 pixels)</span></td><td>The page should not overflow horizontally, text should not be clipped, and buttons should be at least 44 pixels for easy tapping.</td><td>The page fits without overflow, but 1 element is clipped, and 31 out of 45 touch targets are too small (&lt;44 pixels), making them hard to tap on mobile.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">2</td><td>Check <span class="mono">the homepage layout on a tablet (768×1024 pixels)</span></td><td>The page should not overflow horizontally and text should not be clipped.</td><td>The page fits without overflow, but 1 element is clipped. Text and layout are otherwise acceptable for tablet viewing.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">3</td><td>/ <span class="mono">· Desktop (1440×900)</span><span class="step-subtitle">checks: overflow · clipping</span></td><td>No horizontal overflow · no clipped text</td><td>no horizontal overflow · 1 clipped element</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">4</td><td>/iletisim <span class="mono">· Mobile (375×812)</span><span class="step-subtitle">checks: overflow · clipping · touch targets</span></td><td>No horizontal overflow · no clipped text · touch targets ≥44px</td><td>no horizontal overflow · 33 of 40 touch targets &lt;44px</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">5</td><td>/iletisim <span class="mono">· Tablet (768×1024)</span><span class="step-subtitle">checks: overflow · clipping</span></td><td>The Iletisim page should render correctly at tablet width with no horizontal overflow or clipped text.</td><td>no horizontal overflow</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">6</td><td>/iletisim <span class="mono">· Desktop (1440×900)</span><span class="step-subtitle">checks: overflow · clipping</span></td><td>The Iletisim page should render correctly at desktop width with no horizontal overflow or clipped text.</td><td>no horizontal overflow</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">7</td><td>/alisveris/urun/kenya-kirinyaga <span class="mono">· Mobile (375×812)</span><span class="step-subtitle">checks: overflow · clipping · touch targets</span></td><td>No horizontal overflow · no clipped text · touch targets ≥44px</td><td>no horizontal overflow · 36 of 44 touch targets &lt;44px</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">8</td><td>/alisveris/urun/kenya-kirinyaga <span class="mono">· Tablet (768×1024)</span><span class="step-subtitle">checks: overflow · clipping</span></td><td>The Kenya Kirinyaga page should render correctly at tablet width with no horizontal overflow or clipped text.</td><td>no horizontal overflow</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">9</td><td>/alisveris/urun/kenya-kirinyaga <span class="mono">· Desktop (1440×900)</span><span class="step-subtitle">checks: overflow · clipping</span></td><td>The Kenya Kirinyaga page should render correctly at desktop width with no horizontal overflow or clipped text.</td><td>no horizontal overflow</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">10</td><td>Viewport <span class="mono">meta tag</span><span class="step-subtitle">captured once on the first sample page</span></td><td>`&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, ...&quot;&gt;`</td><td>Present, width=device-width, initial-scale=1.0.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-STATE — State &amp; Navigation</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Deep-link <span class="mono">navigation to inner page</span><span class="step-subtitle">https://example-coffee-shop.com/alisveris</span></td><td>Direct GET on the inner URL renders content</td><td>Loaded, HTTP 200, body length 6786.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>Browser <span class="mono">back returns to a working previous page</span><span class="step-subtitle">https://example-coffee-shop.com/ → https://example-coffee-shop.com/alisveris → back</span></td><td>Going back re-renders the previous page (no blank / error screen)</td><td>Back, HTTP 200, body length 1716.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>Page <span class="mono">reload renders cleanly</span><span class="step-subtitle">https://example-coffee-shop.com/alisveris</span></td><td>Reload renders the page without errors</td><td>Reloaded, HTTP 200, body length 6786.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>Inner <span class="mono">pages have unique meaningful URLs</span><span class="step-subtitle">inspected first 5 inner pages</span></td><td>Each inner page has its own path-based URL (not just a `#` fragment on the homepage)</td><td>All 5 URLs unique</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
  </tbody>
</table>
<div class="test-suite-label">TS-CONTRAST — Color Contrast (WCAG 2.1)</div>
<table class="data-table">
  <thead>
    <tr><th class="col-num">#</th><th class="col-step">Test Step</th><th class="col-expected">Expected Result</th><th class="col-actual">Actual Result</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-num">1</td><td>Color <span class="mono">contrast · /</span><span class="step-subtitle">sampled 31 text elements</span></td><td>Every sampled text element meets WCAG 2.1 contrast (≥ 4.5 normal · ≥ 3 large)</td><td>2 of 31 sampled elements fall below threshold</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">2</td><td>Color <span class="mono">contrast · /iletisim</span><span class="step-subtitle">sampled 23 text elements</span></td><td>Every sampled text element meets WCAG 2.1 contrast (≥ 4.5 normal · ≥ 3 large)</td><td>1 of 23 sampled elements fall below threshold</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">3</td><td>Color <span class="mono">contrast · /alisveris/urun/kenya-kirinyaga</span><span class="step-subtitle">sampled 30 text elements</span></td><td>Every sampled text element meets WCAG 2.1 contrast (≥ 4.5 normal · ≥ 3 large)</td><td>1 of 30 sampled elements fall below threshold</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
  </tbody>
</table>
</div>

<div class="section">
<div class="section-header"><span class="section-number">4</span><span class="section-title">Bug Summary Matrix</span></div>
<div class="section-intro">A consolidated dashboard view of every unique finding from this scan. Detailed entries follow in the next section.</div>
<table class="bug-matrix">
  <thead>
    <tr><th class="col-id">ID</th><th class="col-title">Title</th><th class="col-severity">Severity</th><th class="col-priority">Priority</th><th class="col-status">Status</th></tr>
  </thead>
  <tbody>
    <tr><td class="col-id">BUG-001</td><td>Color contrast failures (site-wide)</td><td class="col-severity"><span class="badge badge-high">High</span></td><td class="col-priority"><span class="priority">P1</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-002</td><td>Form input missing accessible label</td><td class="col-severity"><span class="badge badge-high">High</span></td><td class="col-priority"><span class="priority">P1</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-003</td><td>Pervasive missing accessible names on interactive elements site-wide</td><td class="col-severity"><span class="badge badge-high">High</span></td><td class="col-priority"><span class="priority">P1</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-004</td><td>Internal link unreachable</td><td class="col-severity"><span class="badge badge-high">High</span></td><td class="col-priority"><span class="priority">P1</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-005</td><td>Legal compliance failure: no cookie consent and broken KVKK document</td><td class="col-severity"><span class="badge badge-high">High</span></td><td class="col-priority"><span class="priority">P1</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-006</td><td>Cookie missing HttpOnly flag</td><td class="col-severity"><span class="badge badge-high">High</span></td><td class="col-priority"><span class="priority">P1</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-007</td><td>HTTP requests are not redirected to HTTPS</td><td class="col-severity"><span class="badge badge-high">High</span></td><td class="col-priority"><span class="priority">P1</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-008</td><td>javascript: href links and inline handlers create XSS attack surface</td><td class="col-severity"><span class="badge badge-high">High</span></td><td class="col-priority"><span class="priority">P1</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-009</td><td>Form fields rely</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-010</td><td>Missing language attribute on HTML element</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-011</td><td>Multiple form inputs missing accessible labels</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-012</td><td>Multiple h1 elements and skipped heading levels weaken document structure</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-013</td><td>Multiple primary headings on page</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-014</td><td>Unlabeled buttons</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-015</td><td>Unlabeled links</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-016</td><td>API responses missing Content-Type header</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-017</td><td>External link unreachable</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-018</td><td>Failed resource loading errors in console</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-019</td><td>Form accepts empty submission</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-020</td><td>JavaScript console errors detected</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-021</td><td>No offline or cached state</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-022</td><td>Heavy page weight and low lazy-load adoption degrade mobile performance</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-023</td><td>JavaScript URLs in links</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-024</td><td>Missing Content-Security-Policy header</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-025</td><td>No cookie consent banner detected</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-026</td><td>Server software details publicly visible</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-027</td><td>Text inputs without character limits</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-028</td><td>Third-party cookies set on page load</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-029</td><td>Missing page title</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-030</td><td>Missing SEO metadata</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-031</td><td>Unbranded 403 responses replace expected 404 handling for unknown URLs</td><td class="col-severity"><span class="badge badge-medium">Medium</span></td><td class="col-priority"><span class="priority">P2</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-032</td><td>Inconsistent heading structure</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-033</td><td>Carousel library error in console</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-034</td><td>Carousel library null reference error</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-035</td><td>No offline support (service worker not registered)</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-036</td><td>Heavy page weight (4.81 MB)</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-037</td><td>Images not using native lazy-loading</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-038</td><td>Oversized image (532 KB)</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-039</td><td>Forms lack duplicate-submission prevention</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-040</td><td>Forms may lack cross-site forgery protection</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-041</td><td>Inline event handlers in HTML</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-042</td><td>Login endpoint shows no rate-limit protection signal</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-043</td><td>No &#39;remember me&#39; option on login</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-044</td><td>No password reset link on login page</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-045</td><td>No password visibility toggle</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-046</td><td>No rate-limiting visible on homepage</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-047</td><td>Password field missing autocomplete attribute</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-048</td><td>Password field missing maxlength attribute</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-049</td><td>Potential CSRF gap on state-changing forms (unverified)</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-050</td><td>Username field missing autocomplete attribute</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-051</td><td>Content clipped at desktop viewport (1440px)</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-052</td><td>Content clipped at mobile viewport (375px)</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-053</td><td>Content clipped at tablet viewport (768px)</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-054</td><td>Missing main heading</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-055</td><td>Page titles too short for search results</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-056</td><td>Registration form lacks password strength indicator</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-057</td><td>Registration form missing terms acceptance checkbox</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-058</td><td>Sitemap not found</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
    <tr><td class="col-id">BUG-059</td><td>Undersized touch targets on mobile</td><td class="col-severity"><span class="badge badge-low">Low</span></td><td class="col-priority"><span class="priority">P3</span></td><td class="col-status"><span class="badge badge-new">• New</span></td></tr>
  </tbody>
</table>
</div>

<div class="section">
<div class="section-header"><span class="section-number">5</span><span class="section-title">Detailed Bug Reports</span></div>
<div class="section-intro">Each finding's BUG-NNN identifier matches its row in the Bug Summary Matrix.</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-001</span>
      <span class="bug-title">Color contrast failures (site-wide)</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-high">High</span>
      <span class="priority">P1</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in DevTools → Inspect</li>
      <li>Locate the element matching `label.transition-all.peer-placeholder-shown:text-base`</li>
      <li>In the Styles pane, hover the computed `color` value — DevTools renders the live contrast ratio</li>
      <li>Adjust either color (typically darkening the foreground) until the ratio clears the threshold</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Text should have a contrast ratio of at least 4.5:1.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Text &quot;E-Bülten&quot; (selector label.transition-all.peer-placeholder-shown:text-base) on https://example-coffee-shop.com/ has contrast 1.90:1 (RGB 156,163,175 on RGB 227,222,215).</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-002</span>
      <span class="bug-title">Form input missing accessible label</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-high">High</span>
      <span class="priority">P1</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in a browser</li>
      <li>Open DevTools → Accessibility tree</li>
      <li>Inspect each interactive input — its accessible name should be the field&#39;s purpose, not &#39;edit text&#39;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Every form input should have an associated label.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">1 input on the search form (action=&quot;https://example-coffee-shop.com/alisveris/ara&quot;, method=POST) has no associated label.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-003</span>
      <span class="bug-title">Pervasive missing accessible names on interactive elements site-wide</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-high">High</span>
      <span class="priority">P1</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Navigate to https://example-coffee-shop.com/ with a screen reader (e.g. NVDA + Chrome).</li>
      <li>Tab through interactive elements — most buttons and icon links are announced as &#39;button&#39; or &#39;link&#39; with no descriptive label.</li>
      <li>Run an automated accessibility checker (axe, Lighthouse) — it will flag all unlabelled controls and contrast failures simultaneously.</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">All interactive elements should carry descriptive accessible names (visible text or aria-label), colour contrast should meet WCAG 2.1 AA (4.5:1 for normal text), and every HTML document should declare a valid lang attribute.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">TS-A11Y: 215 buttons without accessible names, 392 links without accessible names across 49 pages. TS-CONTRAST: contrast failures on /, /iletisim, and /alisveris/urun/kenya-kirinyaga. TS-A11Y: 1 page missing lang attribute.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-004</span>
      <span class="bug-title">Internal link unreachable</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-high">High</span>
      <span class="priority">P1</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in a browser</li>
      <li>Click the link to https://example-coffee-shop.com/pdf/kvkk_basvuru.pdf</li>
      <li>Observe no response</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">All internal links should respond successfully (HTTP 200 or redirect to a working page).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">https://example-coffee-shop.com/pdf/kvkk_basvuru.pdf → no response. First referenced from https://example-coffee-shop.com/. Also linked from https://example-coffee-shop.com/alisveris, https://example-coffee-shop.com/alisveris/kategori/kahveler, https://example-coffee-shop.com/alisveris/kategori/ekipmanlar (and 45 more).</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-005</span>
      <span class="bug-title">Legal compliance failure: no cookie consent and broken KVKK document</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-high">High</span>
      <span class="priority">P1</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Load https://example-coffee-shop.com/ in a clean browser profile with no prior cookies.</li>
      <li>Observe that no cookie consent banner appears but third-party cookies are already set (visible in DevTools &gt; Application &gt; Cookies).</li>
      <li>Click the KVKK başvuru link anywhere on the site — browser shows a network error / blank page.</li>
      <li>Confirm via curl: curl -I https://example-coffee-shop.com/pdf/kvkk_basvuru.pdf returns no response.</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">A cookie consent mechanism must gate third-party cookie setting until explicit user consent. The KVKK başvuru PDF must be reachable at its published URL.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">TS-COOKIE: no consent banner found in homepage HTML; 2 of 2 cookies are third-party domain. TS-NAV + TS-LINKS: /pdf/kvkk_basvuru.pdf returns no HTTP response.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-006</span>
      <span class="bug-title">Cookie missing HttpOnly flag</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-high">High</span>
      <span class="priority">P1</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -I &#39;https://example-coffee-shop.com/&#39;</li>
      <li>Locate the &#39;Set-Cookie&#39; response header for the cookie named &quot;XSRF-TOKEN&quot;</li>
      <li>Confirm the HttpOnly flag is absent</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Set-Cookie should include the HttpOnly flag (for example: Set-Cookie: session=...; HttpOnly; Secure; SameSite=Lax).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Cookie &quot;XSRF-TOKEN&quot; observed on https://example-coffee-shop.com/ is missing the HttpOnly flag.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-007</span>
      <span class="bug-title">HTTP requests are not redirected to HTTPS</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-high">High</span>
      <span class="priority">P1</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">http://example-coffee-shop.com (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -sI &#39;http://example-coffee-shop.com/&#39; | head -20</li>
      <li>Confirm the first response is a 3xx redirect whose Location starts with https://</li>
      <li>Update the web server / CDN to force-redirect HTTP traffic to HTTPS</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">HTTP requests should redirect to HTTPS using a 301, 302, 307, or 308 response.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">HTTP 301 redirect to https://example-coffee-shop.com/ is working correctly.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-008</span>
      <span class="bug-title">javascript: href links and inline handlers create XSS attack surface</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-high">High</span>
      <span class="priority">P1</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open any page, e.g. https://example-coffee-shop.com/ and inspect anchor tags in DevTools.</li>
      <li>Search for href=&quot;javascript: — 49 instances exist.</li>
      <li>Search for onclick= — hundreds of inline handlers visible in source.</li>
      <li>Check response headers — no Content-Security-Policy header present to restrict script sources.</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">No javascript: href links; event handlers should be bound via addEventListener in external scripts. A CSP header should restrict script execution to trusted sources.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">TS-XSS: 49 javascript: links and 392 inline handlers across 49 pages. TS-SEC: CSP header not set. The two findings are mutually reinforcing — removing CSP-unsafe-inline would break the inline handlers, revealing that neither can be fixed independently.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-009</span>
      <span class="bug-title">Form fields rely</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Focus into a form field on https://example-coffee-shop.com/</li>
      <li>Observe that the previously-visible hint disappears</li>
      <li>Inspect the DOM and confirm the element is a placeholder attribute, not a `&lt;label&gt;`</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Each form input should have a persistent &lt;label&gt;, with placeholder as an optional supplement.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">1 input on the search form (action=&quot;https://example-coffee-shop.com/alisveris/ara&quot;, method=POST) relies solely on placeholder text.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-010</span>
      <span class="bug-title">Missing language attribute on HTML element</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/pdf/kvkk_basvuru.pdf (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/pdf/kvkk_basvuru.pdf in DevTools → Elements tab</li>
      <li>Inspect the `&lt;html&gt;` element</li>
      <li>Confirm no `lang` attribute is present</li>
      <li>Add `lang=&quot;&lt;bcp47-code&gt;&quot;` to the `&lt;html&gt;` element in the template</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">The &lt;html&gt; element should include a lang attribute (for example: &lt;html lang=&quot;en&quot;&gt; or &lt;html lang=&quot;tr&quot;&gt;).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Language attribute missing or empty on 1 of 50 crawled pages.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-011</span>
      <span class="bug-title">Multiple form inputs missing accessible labels</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/iletisim (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/iletisim in a browser</li>
      <li>Open DevTools → Accessibility tree</li>
      <li>Inspect each interactive input — its accessible name should be the field&#39;s purpose, not &#39;edit text&#39;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Every form input should have an associated label.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">2 of 5 inputs on the contact form (action=&quot;https://example-coffee-shop.com/iletisim&quot;, method=POST) have no associated label.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-012</span>
      <span class="bug-title">Multiple h1 elements and skipped heading levels weaken document structure</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ and run document.querySelectorAll(&#39;h1&#39;) in the console — multiple results returned.</li>
      <li>Use a browser accessibility tree inspector to review heading outline — multiple top-level headings with no clear primary topic heading.</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Each page should have exactly one &lt;h1&gt; that represents the primary page topic, with subsequent content using h2–h6 in logical, non-skipping order.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">TS-A11Y reports 7 pages with multiple &lt;h1&gt; elements and 1 page with a skipped heading level. DOM summary for / shows 23 heading elements, indicating heavily fragmented heading use.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-013</span>
      <span class="bug-title">Multiple primary headings on page</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in DevTools → Elements tab</li>
      <li>Search the DOM for `h1` elements</li>
      <li>Confirm 4 &lt;h1&gt; elements are present</li>
      <li>Promote one as the page title; demote the rest to &lt;h2&gt;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Each page should have exactly one &lt;h1&gt; element.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">7 of 50 crawled pages contain multiple &lt;h1&gt; elements (for example, 4 on https://example-coffee-shop.com/).</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-014</span>
      <span class="bug-title">Unlabeled buttons</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in DevTools → Elements tab</li>
      <li>Run `[...document.querySelectorAll(&#39;button&#39;)].filter(b =&gt; !b.innerText.trim() &amp;&amp; !b.getAttribute(&#39;aria-label&#39;))` in Console</li>
      <li>Add an `aria-label` describing the action to each match</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Each button should have a name, either through visible text or an aria-label attribute.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">215 of 850 buttons across 49 pages have neither text nor aria-label.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-015</span>
      <span class="bug-title">Unlabeled links</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in DevTools → Elements tab</li>
      <li>Run `[...document.querySelectorAll(&#39;a[href]&#39;)].filter(a =&gt; !a.innerText.trim() &amp;&amp; !a.getAttribute(&#39;aria-label&#39;) &amp;&amp; !a.querySelector(&#39;img[alt]&#39;))` in Console</li>
      <li>Add visible text, `aria-label`, or an inner `&lt;img alt&gt;` to each match</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Each link should expose a name through visible text, aria-label, or an image alt attribute.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">392 of 4,319 links across 49 pages lack an accessible name.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-016</span>
      <span class="bug-title">API responses missing Content-Type header</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in DevTools → Network</li>
      <li>Inspect response headers for the listed endpoints</li>
      <li>Confirm `Content-Type` is missing and add it server-side</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Every API response should include a Content-Type header.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">3 of 4 network requests on https://example-coffee-shop.com/ omit Content-Type header.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-017</span>
      <span class="bug-title">External link unreachable</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in a browser</li>
      <li>Click the link to https://etbis.eticaret.gov.tr/sitedogrulama/1d8c05a8868b47f1a71d3cb6b7e27d79</li>
      <li>Observe TypeError: fetch failed</li>
      <li>Update the link target or remove the reference</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">All outbound links should be reachable and return a successful response.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">https://etbis.eticaret.gov.tr/sitedogrulama/1d8c05a8868b47f1a71d3cb6b7e27d79 could not be reached.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-018</span>
      <span class="bug-title">Failed resource loading errors in console</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/kullanici/kaydol (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/kullanici/kaydol in Chrome DevTools → Console</li>
      <li>Reload the page with the console open</li>
      <li>Locate the matching error entry and follow the stack trace into the source</li>
      <li>Fix the failing call or guard against the input that triggered it</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">All resource requests should succeed (or fail gracefully with error handling).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">6 occurrences of &quot;Failed to load resource: the server responded with a status of 401&quot; across 3 pages. First observed on https://example-coffee-shop.com/kullanici/kaydol.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-019</span>
      <span class="bug-title">Form accepts empty submission</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in a browser</li>
      <li>Find the form (action=&quot;https://example-coffee-shop.com/alisveris/ara&quot;, method=POST)</li>
      <li>Reproduce the empty submit test scenario</li>
      <li>Click the submit button and observe the form proceeds without challenge</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Client-side validation should prevent empty submissions.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Empty form on https://example-coffee-shop.com/ submitted without triggering validation or error messages.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-020</span>
      <span class="bug-title">JavaScript console errors detected</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/kullanici/kaydol (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/kullanici/kaydol in Chrome DevTools → Console</li>
      <li>Reload the page with the console open</li>
      <li>Locate the matching error entry and follow the stack trace into the source</li>
      <li>Fix the failing call or guard against the input that triggered it</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Pages should load without JavaScript console errors.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">12 occurrences of &quot;%c%d font-size:0;color:transparent NaN&quot; error across 3 pages. First observed on https://example-coffee-shop.com/kullanici/kaydol.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-021</span>
      <span class="bug-title">No offline or cached state</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/</li>
      <li>Open DevTools → Network → toggle &#39;Offline&#39;</li>
      <li>Reload and observe what the user sees</li>
      <li>Implement a service worker that caches the shell, or render an offline fallback page</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Offline navigation should show a cached page or branded offline screen.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Offline navigation to https://example-coffee-shop.com/ shows a generic browser error: net::ERR_INTERNET_DISCONNECTED.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-022</span>
      <span class="bug-title">Heavy page weight and low lazy-load adoption degrade mobile performance</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open Chrome DevTools Network tab, reload https://example-coffee-shop.com/ — observe total transfer size around 4.8 MB.</li>
      <li>Filter by Img — several images above 500 KB with no lazy-load attribute.</li>
      <li>Throttle to Fast 3G and reload — significant render delay before page is usable.</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Page weight should target under 1.5 MB for e-commerce pages; all below-the-fold images should use loading=&#39;lazy&#39;; individual images should be compressed and served in next-gen formats (WebP/AVIF).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">TS-PERF: / is 4.81 MB, /alisveris/urun/kenya-kirinyaga is 3.40 MB. TS-IMG: only 3 of 17 images use lazy loading; 4 images exceed 500 KB.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-023</span>
      <span class="bug-title">JavaScript URLs in links</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ → DevTools → Console</li>
      <li>Run `[...document.querySelectorAll(&#39;a[href]&#39;)].filter(a =&gt; a.getAttribute(&#39;href&#39;).toLowerCase().startsWith(&#39;javascript:&#39;))`</li>
      <li>Replace each `javascript:` href with a button + script-file handler, or remove the link entirely</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Links should point to real URLs (http://, https://, mailto:, tel:, or #fragment), not javascript: strings.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">49 javascript: href values found across 49 pages. First observed on https://example-coffee-shop.com/.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-024</span>
      <span class="bug-title">Missing Content-Security-Policy header</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -I &#39;https://example-coffee-shop.com/&#39;</li>
      <li>Inspect the response headers — &#39;Content-Security-Policy&#39; should be present</li>
      <li>(Most security headers are configured at the web-server or CDN layer; check the deployment platform&#39;s docs.)</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Every page should include a Content-Security-Policy header that restricts script sources.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Content-Security-Policy header is not set. This was checked on 2 sample pages.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-025</span>
      <span class="bug-title">No cookie consent banner detected</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in a private window (no prior session)</li>
      <li>Verify whether a consent banner appears</li>
      <li>If only after-JS, consider server-side rendering it so static crawlers / accessibility tools see it</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">A cookie or consent banner should be visible or loadable on the first page visit.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Homepage HTML response did not contain common consent-banner indicators.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-026</span>
      <span class="bug-title">Server software details publicly visible</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -I &#39;https://example-coffee-shop.com/&#39;</li>
      <li>Confirm the X-Powered-By response header is present and discloses the software</li>
      <li>Configure the server / reverse proxy to remove or anonymize the header</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Server software version should not be disclosed in response headers.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">X-Powered-By header reveals: PHP/8.4.21, PleskLin</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-027</span>
      <span class="bug-title">Text inputs without character limits</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in DevTools → Elements</li>
      <li>Inspect each form input and check for the `maxlength` attribute</li>
      <li>Add `maxlength` matching the longest legitimate value (or the column width in the database)</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Text inputs, email fields, and text areas should declare a sensible maxlength.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">All 117 text inputs across 49 pages omit maxlength. First observed on https://example-coffee-shop.com/.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-028</span>
      <span class="bug-title">Third-party cookies set on page load</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -I &#39;https://example-coffee-shop.com/&#39;</li>
      <li>Inspect Set-Cookie Domain= values</li>
      <li>Move tracking to first-party (server-side proxy) or implement consent gating</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Cookies should use first-party domains (or no Domain attribute).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">2 third-party cookies detected: XSRF-TOKEN@example-coffee-shop.com, example coffee shop_session@example-coffee-shop.com.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-029</span>
      <span class="bug-title">Missing page title</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/pdf/kvkk_basvuru.pdf (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/pdf/kvkk_basvuru.pdf in DevTools → Elements tab</li>
      <li>Inspect `&lt;head&gt;` and confirm no `&lt;title&gt;` (or an empty one) is present</li>
      <li>Add a descriptive `&lt;title&gt;` to the page template</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Every page should have a &lt;title&gt; element with meaningful content.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">1 of 50 crawled pages has an empty or missing &lt;title&gt; element.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-030</span>
      <span class="bug-title">Missing SEO metadata</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/abonelikler (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/abonelikler → View source</li>
      <li>Search for `&lt;meta name=&quot;description&quot;` and confirm it is absent</li>
      <li>Add a 50–160 character description in the page template</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Every page should include a &lt;meta name=&quot;description&quot; content=&quot;...&quot;&gt; tag.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">32 of 50 crawled pages have no meta description.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-031</span>
      <span class="bug-title">Unbranded 403 responses replace expected 404 handling for unknown URLs</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-medium">Medium</span>
      <span class="priority">P2</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/page-not-found (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Visit https://example-coffee-shop.com/this-page-does-not-exist in a browser.</li>
      <li>Observe a bare, unbranded 403 Forbidden response with no navigation.</li>
      <li>Confirm with curl -I https://example-coffee-shop.com/nonexistent — HTTP/1.1 403.</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Requests for non-existent pages should return a friendly branded 404 page with navigation options, helping users recover and reducing bounce rate.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">TS-ERR: GET /page-not-found returns HTTP 403 (not branded) and GET /aaaa… (500-char) also returns HTTP 403 (not branded), in 0.36 s and 0.20 s respectively.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-032</span>
      <span class="bug-title">Inconsistent heading structure</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/alisveris/kategori/rare (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/alisveris/kategori/rare in DevTools</li>
      <li>Run `[...document.querySelectorAll(&#39;h1,h2,h3,h4,h5,h6&#39;)].map(h =&gt; h.tagName)` in Console</li>
      <li>Confirm at least one adjacent pair skips a level (e.g. H1 followed by H3)</li>
      <li>Rebalance: demote skipped levels or insert the missing intermediate heading</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Heading levels should descend in order (&lt;h1&gt; → &lt;h2&gt; → &lt;h3&gt;, and so on).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">1 of 50 crawled pages has at least one skipped heading level.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-033</span>
      <span class="bug-title">Carousel library error in console</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/abonelikler (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/abonelikler in Chrome DevTools → Console</li>
      <li>Reload the page with the console open</li>
      <li>Locate the matching error entry and follow the stack trace into the source</li>
      <li>Fix the failing call or guard against the input that triggered it</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">JavaScript libraries should initialize without errors.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">4 occurrences of &quot;Bad element for Flickity: .magaza-carousel&quot; across 2 pages. First observed on https://example-coffee-shop.com/abonelikler.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-034</span>
      <span class="bug-title">Carousel library null reference error</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/abonelikler (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/abonelikler in Chrome DevTools → Console</li>
      <li>Reload the page with the console open</li>
      <li>Locate the matching error entry and follow the stack trace into the source</li>
      <li>Fix the failing call or guard against the input that triggered it</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">JavaScript libraries should initialize without errors.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">4 occurrences of &quot;Bad element for Flickity: null&quot; across 2 pages. First observed on https://example-coffee-shop.com/abonelikler.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-035</span>
      <span class="bug-title">No offline support (service worker not registered)</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ → DevTools → Application → Service workers</li>
      <li>Confirm no service worker is registered</li>
      <li>(Optional) Register a service worker to enable offline caching and faster repeat loads</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">A service worker should be registered to support offline access.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">No service worker registrations detected on https://example-coffee-shop.com/.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-036</span>
      <span class="bug-title">Heavy page weight (4.81 MB)</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in Chrome DevTools → Lighthouse → Performance</li>
      <li>Run an audit and confirm the Weight metric exceeds the &quot;good&quot; threshold</li>
      <li>Compare against ≤3 MB good · ≤5 MB needs improvement thresholds (Google Core Web Vitals)</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Page weight should be ≤3 MB (good) or ≤5 MB (acceptable).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Homepage transfers 4.81 MB (verdict: needs improvement). Measured under standard network conditions.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-037</span>
      <span class="bug-title">Images not using native lazy-loading</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -s &#39;https://example-coffee-shop.com/&#39; | grep -oE &#39;&lt;img[^&gt;]*&gt;&#39; | head -20</li>
      <li>Confirm the image tags carry no `loading=&quot;lazy&quot;` attribute</li>
      <li>Add the attribute to each `&lt;img&gt;` below the fold</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Most images below the fold should use the loading=&quot;lazy&quot; attribute.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">3 of 17 images on the homepage use loading=&quot;lazy&quot; (18%).</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-038</span>
      <span class="bug-title">Oversized image (532 KB)</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -sI &#39;https://example-coffee-shop.com/storage/slider/2026/04/slider-sahibi-degil-parcasi-br-oldugumuz-doga-07.jpeg&#39;</li>
      <li>Inspect the `Content-Length` response header</li>
      <li>Re-encode or resize the image asset, then re-deploy</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Images should be under 500 KB.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">https://example-coffee-shop.com/storage/slider/2026/04/slider-sahibi-degil-parcasi-br-oldugumuz-doga-07.jpeg is 532 KB.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-039</span>
      <span class="bug-title">Forms lack duplicate-submission prevention</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/</li>
      <li>Inspect the hidden inputs on a mutating form</li>
      <li>Confirm no idempotency_key / request_id / nonce is present</li>
      <li>Wire the framework&#39;s idempotency helper into the form template</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Each form that changes data should include a hidden idempotency token (e.g., idempotency_key, request_id, or nonce).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">All 117 mutating forms across 49 pages lack an idempotency token.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-040</span>
      <span class="bug-title">Forms may lack cross-site forgery protection</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ → DevTools → Elements</li>
      <li>Confirm the form has no hidden CSRF token AND no other defense (check the session cookie&#39;s SameSite attribute and any CSRF &lt;meta&gt; tag / request header)</li>
      <li>If genuinely unprotected, add a CSRF token or set SameSite=Lax/Strict on the session cookie</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Each form that changes data should be protected by a CSRF token (hidden field), a SameSite-restricted cookie, or a header-based token.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">All 117 mutating forms across 49 pages show no hidden CSRF token field. Other protections (SameSite cookie, custom header) cannot be detected by this scanner.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-041</span>
      <span class="bug-title">Inline event handlers in HTML</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ → DevTools → Elements</li>
      <li>Run `document.querySelectorAll(&#39;[onclick],[onload],[onerror],[onmouseover]&#39;)` in Console</li>
      <li>Replace each inline handler with an `addEventListener` call in a script file</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Event handlers should be wired through JavaScript addEventListener(), not inline on* attributes.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">392 inline event-handler attributes found across 49 pages. First observed on https://example-coffee-shop.com/.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-042</span>
      <span class="bug-title">Login endpoint shows no rate-limit protection signal</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/kullanici/kaydol (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -X OPTIONS &#39;https://example-coffee-shop.com/kullanici/kaydol&#39; -i</li>
      <li>Inspect response headers for Retry-After / X-RateLimit-*</li>
      <li>Wire a rate limiter on the auth endpoint (CDN / edge / framework)</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Login endpoint should include Retry-After or X-RateLimit-* headers to signal rate-limit protection.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">OPTIONS request to https://example-coffee-shop.com/kullanici/kaydol returned HTTP 200 with no rate-limit headers.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-043</span>
      <span class="bug-title">No &#39;remember me&#39; option on login</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/kullanici/kaydol (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/kullanici/kaydol</li>
      <li>Scan the login form for a checkbox</li>
      <li>Add a &#39;Remember me&#39; checkbox that the server interprets as a long-lived session</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Login form should offer a &#39;Remember me&#39; checkbox.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">No &#39;Remember me&#39; checkbox found on the login form.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-044</span>
      <span class="bug-title">No password reset link on login page</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/kullanici/kaydol (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/kullanici/kaydol</li>
      <li>Scan visible link text near the login form</li>
      <li>Add a &#39;Forgot password?&#39; link that initiates the reset flow</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Login page should include a password-reset link.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">No password-reset link found on the login page.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-045</span>
      <span class="bug-title">No password visibility toggle</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/kullanici/kaydol (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/kullanici/kaydol</li>
      <li>Locate the password input</li>
      <li>Add a sibling button that toggles the input type</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Login form should have a button to toggle password visibility.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">No password visibility toggle found near the password field.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-046</span>
      <span class="bug-title">No rate-limiting visible on homepage</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Fire 20 parallel GET https://example-coffee-shop.com/</li>
      <li>Inspect each response status + headers for 429 / X-RateLimit-* / Retry-After</li>
      <li>Add rate limiting at the CDN / edge / framework layer</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Server should send rate-limit signals (429 responses or X-RateLimit-* / Retry-After headers) under heavy load.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">20 parallel requests to the homepage all succeeded with no 429 response or rate-limit header.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-047</span>
      <span class="bug-title">Password field missing autocomplete attribute</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/kullanici/kaydol (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/kullanici/kaydol</li>
      <li>Inspect the password input</li>
      <li>Add `autocomplete=&quot;current-password&quot;` (login) or `&quot;new-password&quot;` (signup)</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Password input should have autocomplete=&quot;current-password&quot; attribute.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">The password input is missing the autocomplete attribute.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-048</span>
      <span class="bug-title">Password field missing maxlength attribute</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/kullanici/kaydol (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/kullanici/kaydol</li>
      <li>Inspect the password input</li>
      <li>Add a `maxlength` matching the server&#39;s accepted password length</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Password input should have a maxlength attribute (e.g., maxlength=&quot;128&quot;).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">The password input is missing maxlength.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-049</span>
      <span class="bug-title">Potential CSRF gap on state-changing forms (unverified)</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/kullanici/kaydol (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open an affected page → DevTools → Elements / Network</li>
      <li>Check the form&#39;s hidden inputs, the session cookie&#39;s SameSite attribute, and any CSRF &lt;meta&gt; tag / request header</li>
      <li>If genuinely none are present, add a CSRF token or set SameSite=Lax/Strict on the session cookie</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Each state-changing form is protected by at least one CSRF defense — a hidden token, a SameSite=Lax/Strict session cookie, or a header / meta token (only the hidden token is visible to an external scan).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">No hidden CSRF token field was found in the form markup. SameSite / header / meta defenses are not externally observable, so protection status is unverified.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-050</span>
      <span class="bug-title">Username field missing autocomplete attribute</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/kullanici/kaydol (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/kullanici/kaydol</li>
      <li>Inspect the username / email input</li>
      <li>Add `autocomplete=&quot;username&quot;` (or `&quot;email&quot;`)</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Username/email input should have autocomplete=&quot;username&quot; or &quot;email&quot; attribute.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">The username input is missing the autocomplete attribute.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-051</span>
      <span class="bug-title">Content clipped at desktop viewport (1440px)</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ and resize the browser to 1440×900</li>
      <li>Inspect the first offender element and verify its computed `overflow` is `hidden`</li>
      <li>Compare `scrollWidth` vs `clientWidth` in DevTools → Properties tab</li>
      <li>Replace `overflow: hidden` with a wrapping rule, or add `text-overflow: ellipsis`</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Content should fit the desktop viewport or be truncated with an ellipsis.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">1 element clips content at 1440px width. Example: div.flickity-viewport (1440px container → 5760px content).</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-052</span>
      <span class="bug-title">Content clipped at mobile viewport (375px)</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ and resize the browser to 375×812</li>
      <li>Inspect the first offender element and verify its computed `overflow` is `hidden`</li>
      <li>Compare `scrollWidth` vs `clientWidth` in DevTools → Properties tab</li>
      <li>Replace `overflow: hidden` with a wrapping rule, or add `text-overflow: ellipsis`</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Content should fit the mobile viewport, or be truncated with an ellipsis indicator.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">1 element clips content at 375px width. Example: div.flickity-viewport (375px container → 1500px content).</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-053</span>
      <span class="bug-title">Content clipped at tablet viewport (768px)</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ and resize the browser to 768×1024</li>
      <li>Inspect the first offender element and verify its computed `overflow` is `hidden`</li>
      <li>Compare `scrollWidth` vs `clientWidth` in DevTools → Properties tab</li>
      <li>Replace `overflow: hidden` with a wrapping rule, or add `text-overflow: ellipsis`</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Content should fit the tablet viewport or be truncated with an ellipsis.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">1 element clips content at 768px width. Example: div.flickity-viewport (768px container → 3072px content).</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-054</span>
      <span class="bug-title">Missing main heading</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/pdf/kvkk_basvuru.pdf (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/pdf/kvkk_basvuru.pdf in DevTools</li>
      <li>Search the DOM for `h1` elements</li>
      <li>Confirm none are present</li>
      <li>Add a single, descriptive `&lt;h1&gt;` to the page template</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Each page should have exactly one &lt;h1&gt; element.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">1 of 50 crawled pages has no &lt;h1&gt; element.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-055</span>
      <span class="bug-title">Page titles too short for search results</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in DevTools → Elements</li>
      <li>Inspect the `&lt;title&gt;` element</li>
      <li>Confirm the text is 9 characters (target 10–60)</li>
      <li>Rewrite the title to fit the 10–60 character window</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Page titles should be between 10 and 60 characters.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">37 of 50 pages have titles that are too short (0 too long, 37 too short). First example: https://example-coffee-shop.com/ (9 characters).</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-056</span>
      <span class="bug-title">Registration form lacks password strength indicator</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/kullanici/kaydol (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/kullanici/kaydol</li>
      <li>Inspect the password input&#39;s neighborhood</li>
      <li>Add a strength meter or live rule list</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Registration form should show a password strength meter or rule list.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">No password strength meter or rule list detected on the registration form.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-057</span>
      <span class="bug-title">Registration form missing terms acceptance checkbox</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/kullanici/kaydol (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/kullanici/kaydol</li>
      <li>Inspect the registration form&#39;s checkboxes</li>
      <li>Add a required terms / privacy acceptance checkbox</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Registration form should include a required checkbox for terms/privacy acceptance.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">No terms, privacy, or consent checkbox found on the registration form.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-058</span>
      <span class="bug-title">Sitemap not found</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/sitemap.xml (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -I &#39;https://example-coffee-shop.com/sitemap.xml&#39;</li>
      <li>Confirm the response is not 2xx</li>
      <li>Generate a sitemap (most frameworks ship a sitemap generator) and serve it at /sitemap.xml</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">GET /sitemap.xml should return HTTP 200 with a valid XML sitemap.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">GET https://example-coffee-shop.com/sitemap.xml returned HTTP 404.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">BUG-059</span>
      <span class="bug-title">Undersized touch targets on mobile</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-low">Low</span>
      <span class="priority">P3</span>
      <span class="badge badge-new">• New</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-location">https://example-coffee-shop.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://example-coffee-shop.com/ in Chrome DevTools at device width 375px</li>
      <li>Highlight each interactive element in turn and check its bounding-box dimensions</li>
      <li>Increase padding so the bounding box is ≥ 44×44 px</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">All interactive elements should be at least 44×44 pixels at mobile viewports.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">31 of 45 interactive elements are below 44px at 375×812. Examples: buttons 22×24px, link 328×24px.</div>
  </div>
</div>
</div>

<div class="section">
<div class="section-header"><span class="section-number">6</span><span class="section-title">Highest-Priority Findings</span></div>
<p class="auto-disclaimer">Auto-generated from severity ranking. Manual review recommended.</p>
<div class="section-intro">The top critical and high-severity findings, in priority order. See the Detailed Bug Reports section for full reproduction steps.</div>
<ol class="priority-list">
  <li><strong>BUG-001</strong> — Color contrast failures (site-wide)</li>
  <li><strong>BUG-002</strong> — Form input missing accessible label</li>
  <li><strong>BUG-003</strong> — Pervasive missing accessible names on interactive elements site-wide</li>
  <li><strong>BUG-004</strong> — Internal link unreachable</li>
  <li><strong>BUG-005</strong> — Legal compliance failure: no cookie consent and broken KVKK document</li>
  <li><strong>BUG-006</strong> — Cookie missing HttpOnly flag</li>
  <li><strong>BUG-007</strong> — HTTP requests are not redirected to HTTPS</li>
</ol>
</div>

<div class="section">
<div class="section-header"><span class="section-number">7</span><span class="section-title">Recommended Fix Order</span></div>
<p class="auto-disclaimer">Auto-generated from severity ranking. Manual review recommended.</p>
<div class="section-intro">Suggested remediation order. Engineering should validate the sequence against business priorities and dependency relationships before scheduling.</div>
<div class="findings-list">
  <div class="finding-row"><span class="finding-num">1</span><span>1. Implement CSRF tokens on all 117 state-mutating forms (including login, registration, and checkout) and mark the XSRF-TOKEN cookie HttpOnly — these two gaps share the same root cause (missing anti-forgery layer) and together represent the highest-risk exploitable vulnerability.</span></div>
  <div class="finding-row"><span class="finding-num">2</span><span>2. Add a compliant KVKK/GDPR cookie consent banner that blocks third-party cookies until explicit user consent is given — the absence of this creates direct regulatory liability.</span></div>
  <div class="finding-row"><span class="finding-num">3</span><span>3. Fix the broken internal link to /pdf/kvkk_basvuru.pdf by uploading the correct file or correcting the URL — this is both a legal-document accessibility failure and a broken user journey on a compliance page.</span></div>
  <div class="finding-row"><span class="finding-num">4</span><span>4. Add a Content-Security-Policy header at the server or CDN/edge layer to restrict script execution sources and mitigate XSS risk; simultaneously remove all 49 javascript: href links and replace with proper button or event-listener patterns.</span></div>
  <div class="finding-row"><span class="finding-num">5</span><span>5. Assign unique, descriptive &lt;title&gt; tags and meta descriptions to all 50 pages (37 titles are too short or duplicate, 32 pages lack meta descriptions entirely) — this is a single templating fix that will substantially improve SEO and click-through rates.</span></div>
  <div class="finding-row"><span class="finding-num">6</span><span>6. Audit and label all 215 unnamed buttons and 392 unnamed links with accessible names (aria-label or visible text) and fix colour contrast failures on the homepage, contact, and product pages to meet WCAG 2.1 AA — a single design-system pass can resolve most instances.</span></div>
  <div class="finding-row"><span class="finding-num">7</span><span>7. Suppress or rotate the X-Powered-By header (PHP/8.4.21, PleskLin) to stop disclosing server stack details to potential attackers.</span></div>
  <div class="finding-row"><span class="finding-num">8</span><span>8. Optimise page weight by lazy-loading the remaining 82% of images without the attribute and compressing the 4 images over 500 KB — targeting the homepage&#39;s 4.81 MB payload will most directly improve Core Web Vitals and mobile conversion.</span></div>
  <div class="finding-row"><span class="finding-num">9</span><span>9. Add rate limiting on the login endpoint and implement client-side idempotency tokens on order/checkout forms to prevent credential stuffing and accidental duplicate orders.</span></div>
  <div class="finding-row"><span class="finding-num">10</span><span>10. Fix the 403 unbranded error responses for unknown URLs — replace with a friendly branded 404 page that keeps users on-site and provides navigation options.</span></div>
</div>
</div>

<div class="section">
<div class="section-header"><span class="section-number">8</span><span class="section-title">Recommended Manual Test Scenarios</span></div>
<div class="section-intro">Manual test scenarios recommended by the AI analyzer based on the crawled site structure. Hand this list to your QA team for execution — each scenario covers something the automation cannot verify on its own.</div>
<div class="test-suite-label">Happy Path (5)</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-001</span>
      <span class="bug-title">Register a new account with valid credentials</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">happy-path</span>
      <span class="badge badge-critical">High</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is not registered and is on the /kullanici/kaydol page.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Enter a first name in the &#39;ad&#39; field</li>
      <li>Enter a last name in the &#39;soyad&#39; field</li>
      <li>Enter a valid email address in the &#39;email&#39; field</li>
      <li>Enter a password of at least 8 characters in the &#39;password&#39; field</li>
      <li>Confirm the password in the &#39;password_confirm&#39; field</li>
      <li>Check the &#39;kvkk&#39; (KVKK agreement) checkbox</li>
      <li>Click the &#39;Kayıt Ol&#39; button</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Account is created successfully and user is redirected to the dashboard or home page.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-002</span>
      <span class="bug-title">Search for a product using the search form</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">happy-path</span>
      <span class="badge badge-critical">High</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on any page with the search form visible.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Locate the search form with &#39;arama&#39; text field</li>
      <li>Enter a product name (e.g., &#39;kahve&#39;) in the &#39;arama&#39; field</li>
      <li>Click the &#39;Bul&#39; button</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Search results page displays products matching the search term.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-003</span>
      <span class="bug-title">Add a coffee subscription to cart with variant selection</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">happy-path</span>
      <span class="badge badge-critical">High</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on the product page /alisveris/urun/kahve-aboneligi and is not logged in.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Select a value from the &#39;ay&#39; (month) dropdown</li>
      <li>Select a value from the &#39;hafta&#39; (week) dropdown</li>
      <li>Select at least one checkbox variant option from product_variant_group_id[1]</li>
      <li>Click the &#39;Sepete Ekle&#39; button</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Product is added to cart and cart counter increases. Success notification appears.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-004</span>
      <span class="bug-title">Subscribe to newsletter with valid email</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">happy-path</span>
      <span class="badge badge-high">Medium</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on any page with the newsletter form visible.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Locate the newsletter form with &#39;email&#39; field</li>
      <li>Enter a valid email address</li>
      <li>Click the &#39;Abone Ol&#39; button</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Newsletter subscription is confirmed and a success message appears.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-005</span>
      <span class="bug-title">Verify product category navigation flow</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">happy-path</span>
      <span class="badge badge-high">Medium</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on the home page /</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Click the &#39;Kahveler&#39; category link</li>
      <li>Verify page loads with coffee products</li>
      <li>Click the &#39;Ekipmanlar&#39; category link</li>
      <li>Verify page loads with equipment products</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Each category page loads correctly and displays products in that category.</div>
  </div>
</div>
<div class="test-suite-label">Negative Cases (9)</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-006</span>
      <span class="bug-title">Register with mismatched password confirmation</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">negative</span>
      <span class="badge badge-critical">High</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on the /kullanici/kaydol page.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Enter a first name</li>
      <li>Enter a last name</li>
      <li>Enter a valid email</li>
      <li>Enter a password in the &#39;password&#39; field</li>
      <li>Enter a different value in the &#39;password_confirm&#39; field</li>
      <li>Check the &#39;kvkk&#39; checkbox</li>
      <li>Click the &#39;Kayıt Ol&#39; button</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Form submission fails with an error message indicating passwords do not match.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-007</span>
      <span class="bug-title">Register without checking KVKK agreement</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">negative</span>
      <span class="badge badge-critical">High</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on the /kullanici/kaydol page.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Enter a first name</li>
      <li>Enter a last name</li>
      <li>Enter a valid email</li>
      <li>Enter a matching password pair</li>
      <li>Leave the &#39;kvkk&#39; checkbox unchecked</li>
      <li>Click the &#39;Kayıt Ol&#39; button</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Form submission fails with an error message requiring KVKK agreement.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-008</span>
      <span class="bug-title">Search with empty search field</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">negative</span>
      <span class="badge badge-high">Medium</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on any page with the search form.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Leave the &#39;arama&#39; field empty</li>
      <li>Click the &#39;Bul&#39; button</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Form submission either fails with a validation error or displays all products without filtering.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-009</span>
      <span class="bug-title">Add product to cart without selecting required variant</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">negative</span>
      <span class="badge badge-critical">High</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on a product page with variant selection (e.g., /alisveris/urun/cezve).</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Do not select any value from the variant dropdown (product_variant_group_id[5])</li>
      <li>Enter a quantity in the &#39;adet&#39; field</li>
      <li>Click the &#39;Sepete Ekle&#39; button</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Form submission fails with a validation error indicating variant selection is required.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-010</span>
      <span class="bug-title">Add subscription product without selecting month or week</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">negative</span>
      <span class="badge badge-critical">High</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on the subscription product page /alisveris/urun/kahve-aboneligi.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Do not select a value from the &#39;ay&#39; dropdown</li>
      <li>Do not select a value from the &#39;hafta&#39; dropdown</li>
      <li>Select a variant checkbox</li>
      <li>Click &#39;Sepete Ekle&#39;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Form submission fails with validation errors for missing month and week selections.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-011</span>
      <span class="bug-title">Subscribe to newsletter with invalid email format</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">negative</span>
      <span class="badge badge-high">Medium</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on any page with the newsletter form.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Enter an invalid email (e.g., &#39;notanemail&#39;) in the &#39;email&#39; field</li>
      <li>Click &#39;Abone Ol&#39;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Form submission fails with a validation error for invalid email format.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-012</span>
      <span class="bug-title">Attempt to add product without quantity value</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">negative</span>
      <span class="badge badge-high">Medium</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on a non-subscription product page with quantity field (e.g., /alisveris/urun/cezve).</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Select a variant from the dropdown</li>
      <li>Leave the &#39;adet&#39; (quantity) field empty</li>
      <li>Click &#39;Sepete Ekle&#39;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Form submission fails with validation error for missing or invalid quantity.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-013</span>
      <span class="bug-title">Register with email that already exists</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">negative</span>
      <span class="badge badge-critical">High</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on the /kullanici/kaydol page and an account with test@example.com already exists.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Enter a first name</li>
      <li>Enter a last name</li>
      <li>Enter an email address that already has a registered account (test@example.com)</li>
      <li>Enter a matching password pair</li>
      <li>Check the &#39;kvkk&#39; checkbox</li>
      <li>Click &#39;Kayıt Ol&#39;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Form submission fails with an error message indicating email is already registered.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-014</span>
      <span class="bug-title">Add zero or negative quantity to cart</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">negative</span>
      <span class="badge badge-high">Medium</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on a product page with quantity number field.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Select a variant if required</li>
      <li>Enter &#39;0&#39; in the &#39;adet&#39; (quantity) field</li>
      <li>Click &#39;Sepete Ekle&#39;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Form submission fails with validation error or quantity is rejected as invalid.</div>
  </div>
</div>
<div class="test-suite-label">Edge Cases (3)</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-015</span>
      <span class="bug-title">Register with extremely long first name (250+ characters)</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">edge-case</span>
      <span class="badge badge-high">Medium</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on the /kullanici/kaydol page.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Enter a string of 300+ characters in the &#39;ad&#39; field</li>
      <li>Enter a valid last name</li>
      <li>Enter a valid email</li>
      <li>Enter a matching password pair</li>
      <li>Check the &#39;kvkk&#39; checkbox</li>
      <li>Click &#39;Kayıt Ol&#39;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Form submission either fails with length validation error or text is truncated appropriately.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-016</span>
      <span class="bug-title">Search with special characters and Unicode in query</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">edge-case</span>
      <span class="badge badge-high">Medium</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on any page with the search form.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Enter special characters and Unicode (e.g., &#39;(kahve)@#$€Ñ&#39;) in the &#39;arama&#39; field</li>
      <li>Click &#39;Bul&#39;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Search processes without errors and returns appropriate results or empty set.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-017</span>
      <span class="bug-title">Submit newsletter form twice rapidly (duplicate submission)</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">edge-case</span>
      <span class="badge badge-high">Medium</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on any page with the newsletter form.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Enter a valid email address in the &#39;email&#39; field</li>
      <li>Click &#39;Abone Ol&#39; button</li>
      <li>Immediately click &#39;Abone Ol&#39; button again before page response</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Only one subscription is recorded; second submission is prevented or ignored.</div>
  </div>
</div>
<div class="test-suite-label">Security (2)</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-018</span>
      <span class="bug-title">Register with XSS payload in email field</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">security</span>
      <span class="badge badge-critical">High</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on the /kullanici/kaydol page.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Enter a first name</li>
      <li>Enter a last name</li>
      <li>Enter a potential XSS payload in email field (e.g., &#39;&lt;script&gt;alert(1)&lt;/script&gt;@test.com&#39;)</li>
      <li>Enter a matching password pair</li>
      <li>Check the &#39;kvkk&#39; checkbox</li>
      <li>Click &#39;Kayıt Ol&#39;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Input is either rejected as invalid email format or safely escaped; no script executes.</div>
  </div>
</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-019</span>
      <span class="bug-title">Search with SQL injection-shaped payload</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">security</span>
      <span class="badge badge-critical">High</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on any page with the search form.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Enter SQL injection attempt in &#39;arama&#39; field (e.g., &quot;&#39;; DROP TABLE products; --&quot;)</li>
      <li>Click &#39;Bul&#39;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Payload is treated as a literal search string; no database modification occurs.</div>
  </div>
</div>
<div class="test-suite-label">UX &amp; Responsive (1)</div>
<div class="bug-card no-break">
  <div class="bug-card-header">
    <div class="bug-card-header-left">
      <span class="bug-id">TC-020</span>
      <span class="bug-title">Navigate category links and verify cart counter persists</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">ux</span>
      <span class="badge badge-high">Medium</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User has added a product to cart and cart counter shows &#39;1&#39;.</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Click the &#39;Kahveler&#39; category link</li>
      <li>Verify cart counter still displays &#39;1&#39;</li>
      <li>Click the &#39;Aksesuar&#39; category link</li>
      <li>Verify cart counter still displays &#39;1&#39;</li>
      <li>Click &#39;Online Dükkan&#39; to return to main shop</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Cart counter persists across all page navigations and displays the correct item count.</div>
  </div>
</div>
</div>

<div class="section">
<div class="section-header"><span class="section-number">9</span><span class="section-title">Summary &amp; Observations</span></div>
<div class="summary-box">
  <div class="summary-box-header">Testing Outcome — Automated Scan</div>
  <div class="summary-box-body">
    <p>Critical and high-severity findings cluster around functional / security issues — recommend an engineering triage session before scheduling remediation.</p>
    <p>An automated scan can only validate what it can statically observe (DOM, console, load timing). Recommend a manual review of business-critical flows (auth, payment, data submission) before sign-off.</p>
  </div>
</div>
</div>

<div class="report-footer">Report Generated by QA Explorer — Confidential</div>
