<div class="cover-page">
  <div class="cover-header">
    <div class="cover-eyebrow">Quality Assurance</div>
    <div class="cover-title">vercel.com</div>
    <div class="cover-subtitle">Automated scan of vercel.com via QA Explorer (claude-sonnet-4-6). Covered 15 pages, ran 246 scripted test cases (177 passed), and surfaced 39 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://vercel.com/">https://vercel.com/</a></td></tr>
      <tr><td>Project</td><td>vercel.com</td></tr>
      <tr><td>Methodology</td><td>Automated end-to-end exploratory scan (Playwright + DOM extraction)</td></tr>
      <tr><td>Tester</td><td>QA Explorer (automated)</td></tr>
      <tr><td>Report Date</td><td>2026-05-22</td></tr>
          </table>
  </div>
  <div class="cover-stats">
    <div class="stats-grid">
      <div class="stat-card accent"><div class="stat-number">39</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">246</div><div class="stat-label">Cases Run</div></div>
      <div class="stat-card"><div class="stat-number">177</div><div class="stat-label">Passed</div></div>
    </div>
  </div>
<div class="cover-summary">
<strong>39 findings · 1 critical · 9 high · 39 unique</strong>
<div class="impact-banner critical"><strong>Production Impact:</strong> 1 critical defect is present and should block release until remediated.</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">
Vercel&#39;s marketing site is structurally sound — all 15 pages returned successful responses, internal links are clean, and navigation works as expected. However, the scan uncovered a meaningful cluster of security, accessibility, and reliability issues that collectively create legal exposure, undermine trust, and deliver a degraded experience to users with disabilities or slow connections.
<br><br>
The most serious issues are in three areas. First, tracking cookies are being set on visitors&#39; browsers before any consent is obtained, and no consent banner was detected — this is a likely violation of GDPR, CCPA, and similar privacy regulations, and is especially ironic on a platform that markets compliance features. Second, several security response headers are missing inconsistently across pages, suggesting a misconfiguration at the CDN or edge layer rather than a deliberate policy. Third, the site has significant accessibility gaps: multiple pages have insufficient color contrast that fails WCAG AA, 34 links and 17 buttons have no accessible name, and heading structure is broken on many pages — collectively these may constitute ADA/WCAG non-compliance for a flagship commercial product.
<br><br>
The team should address the cookie consent issue immediately as it carries regulatory risk, then fix the edge-layer header configuration in a single pass to resolve the cluster of missing security headers. Accessibility remediation — contrast ratios, accessible names on interactive elements, and heading hierarchy — should follow as a coordinated sprint. Finally, the broken GitHub Discussions external link, the JavaScript fetch error blocking the &#39;Get Started&#39; CTA, and the oversized page payloads on the AI Gateway and Previews pages should be resolved to protect conversion and performance.
<br><br>
<strong>Production impact.</strong> 1 critical defect is present and should block release until remediated.
</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="">vercel.com</td></tr>
    <tr><td><strong>Environment</strong></td><td class="">https://vercel.com/</td></tr>
    <tr><td><strong>Methodology</strong></td><td class="">Automated end-to-end exploratory scan — headless Chromium crawls same-origin links, captures DOM/console/screenshots, analyzer derives findings.</td></tr>
    <tr><td><strong>Pages Scanned</strong></td><td class="">15</td></tr>
    <tr><td><strong>Duration</strong></td><td class="">2 min 48 s</td></tr>
    <tr><td><strong>Report ID</strong></td><td class="mono">9bd542e3-1469-48b4-88da-de510f46c184</td></tr>
    <tr><td><strong>Analyzer</strong></td><td class="mono">claude-sonnet-4-6</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 0.49s, 36 headings, 134 links, 48 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">Home page</span></td><td>The Home page should load successfully with all content visible.</td><td>HTTP 200, loaded in 0.72s, 36 headings, 134 links, 48 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">Ai page</span></td><td>The Ai page should load successfully with all content visible.</td><td>HTTP 200, loaded in 0.39s, 32 headings, 122 links, 47 images.</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr class="suite-summary-row"><td class="col-num">…</td><td colspan="3"><em>… and 12 more — all passed</em></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;Skip to content&quot;</span></td><td>The &quot;Skip to content&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">/home</span><span class="step-subtitle">&quot;Skip to content&quot; · linked from 14 pages</span></td><td>The &quot;Skip to content&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">/ai</span><span class="step-subtitle">&quot;AI Cloud&quot; · linked from 14 pages</span></td><td>The &quot;AI Cloud&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 class="suite-summary-row"><td class="col-num">…</td><td colspan="3"><em>… and 47 more — all passed</em></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; preload.</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 Content Security Policy header</span></td><td>The server should send a Content Security Policy header to protect against injection attacks.</td><td>The header was not set on 1 of 2 samples tested.</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 X-Content-Type-Options header</span></td><td>The server should send an X-Content-Type-Options header set to &#39;nosniff&#39; to prevent browsers from interpreting files as a different type.</td><td>The header was not set on 1 of 2 samples tested.</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 X-Frame-Options header</span></td><td>The server should send an X-Frame-Options header set to either DENY or SAMEORIGIN to prevent clickjacking attacks.</td><td>The header was not set on 1 of 2 samples tested.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">5</td><td>Check <span class="mono">for Referrer-Policy header</span></td><td>The server should send a Referrer-Policy header to control how much referrer information is shared.</td><td>The header was not set on 1 of 2 samples tested.</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">for Permissions-Policy header</span></td><td>The server should send a Permissions-Policy header to control which browser features can be used.</td><td>The header was not set.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">7</td><td>Check <span class="mono">if &#39;_v-consent&#39; cookie has HttpOnly flag</span></td><td>The &#39;_v-consent&#39; cookie should be marked HttpOnly to prevent JavaScript from accessing it, reducing cross-site scripting risks.</td><td>The HttpOnly flag was not set on the cookie.</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;_v-consent&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;_v-consent&quot; — SameSite attribute</span><span class="step-subtitle">sampled from /</span></td><td>SameSite=Strict / Lax / None</td><td>SameSite=Lax</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">if &#39;_v-anonymous-id&#39; cookie has HttpOnly flag</span></td><td>The &#39;_v-anonymous-id&#39; cookie should be marked HttpOnly to prevent JavaScript from accessing it, reducing cross-site scripting risks.</td><td>The HttpOnly flag was not set on the cookie.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">11</td><td>Cookie <span class="mono">&quot;_v-anonymous-id&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;_v-anonymous-id&quot; — SameSite attribute</span><span class="step-subtitle">sampled from /</span></td><td>SameSite=Strict / Lax / None</td><td>SameSite=Lax</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">if &#39;_v-anonymous-id-renewed&#39; cookie has HttpOnly flag</span></td><td>The &#39;_v-anonymous-id-renewed&#39; cookie should be marked HttpOnly to prevent JavaScript from accessing it, reducing cross-site scripting risks.</td><td>The HttpOnly flag was not set on the cookie.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">14</td><td>Cookie <span class="mono">&quot;_v-anonymous-id-renewed&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">15</td><td>Cookie <span class="mono">&quot;_v-anonymous-id-renewed&quot; — SameSite attribute</span><span class="step-subtitle">sampled from /</span></td><td>SameSite=Strict / Lax / None</td><td>SameSite=Lax</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">16</td><td>Mixed <span class="mono">Content scan across crawled pages</span><span class="step-subtitle">scanned 15 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>HTML <span class="mono">`lang` attribute present</span><span class="step-subtitle">checked 15 pages</span></td><td>Every page sets `&lt;html lang=...&gt;` (screen readers / i18n)</td><td>All pages declare a lang attribute</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">each page has exactly one main heading</span></td><td>Every page should have exactly one H1 tag to clearly identify its primary topic.</td><td>3 of 15 pages had multiple H1 elements, making the page structure confusing for screen reader users.</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 sequential</span></td><td>Headings should descend in order (H1 to H2 to H3) without skipping levels, so assistive technology users can navigate the page structure.</td><td>8 of 15 pages skip heading levels, which breaks the logical structure for users relying on 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 452 images across 15 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>Verify <span class="mono">decorative images use empty alt text</span></td><td>Images used purely for decoration should have empty alt text (alt=&#39;&#39;) so screen readers skip them; images with content should have descriptive alt text.</td><td>143 images across 15 pages declare empty alt text — these should be reviewed to confirm they are truly decorative.</td><td class="col-status"><span class="badge badge-ux">■ UX</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 244 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 accessible names</span></td><td>Every button should have a visible label or aria-label so screen reader users understand its purpose.</td><td>17 buttons on 2 pages lack an accessible name, making them inaccessible to screen reader users.</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 accessible names</span></td><td>Every link should have visible text or an aria-label so screen reader users understand where the link goes.</td><td>34 links across 15 pages lack an accessible name, making them unclear for screen reader users.</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>Text <span class="mono">inputs declare a `maxlength` attribute</span><span class="step-subtitle">inspected 0 text inputs across 15 pages</span></td><td>Every text-like input has `maxlength` so payloads cannot exceed a sane size</td><td>n/a (no text inputs discovered)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>State-mutating <span class="mono">forms carry an anti-CSRF token</span><span class="step-subtitle">inspected 0 POST/PUT/PATCH/DELETE forms</span></td><td>Every mutating form contains a hidden CSRF / authenticity token input</td><td>n/a (no mutating forms discovered)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>No <span class="mono">inline event-handler attributes</span><span class="step-subtitle">inspected 15 pages</span></td><td>No `onclick`/`onload`/`onerror`/… attributes in markup (use addEventListener)</td><td>No inline handlers found</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>No <span class="mono">`javascript:` URLs in `&lt;a href&gt;` attributes</span><span class="step-subtitle">inspected links across 15 pages</span></td><td>`&lt;a href&gt;` values never use the `javascript:` scheme</td><td>No `javascript:` hrefs found</td><td class="col-status"><span class="badge badge-pass">✓ PASS</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>Verify <span class="mono">no tracking cookies are set before user consent</span></td><td>The site should not set any cookies that track user behavior until the user has explicitly consented.</td><td>All 3 cookies set on first load appear to be tracking cookies, suggesting cookies are set before consent.</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">a cookie consent banner is present on the homepage</span></td><td>The homepage should display a visible cookie or consent banner so users can manage their preferences.</td><td>No cookie consent banner pattern was detected in the homepage HTML.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">3</td><td>No <span class="mono">third-party cookies set by homepage</span><span class="step-subtitle">compared cookie Domain= against vercel.com</span></td><td>All Set-Cookie Domain attributes point to the same registrable domain as the page</td><td>All cookies are first-party</td><td class="col-status"><span class="badge badge-pass">✓ PASS</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>Pagination <span class="mono">detected on crawled pages</span><span class="step-subtitle">inspected 15 pages</span></td><td>Any paginated listing pages expose next / prev / page-N navigation</td><td>15 of 15 pages have pagination links</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>Next <span class="mono">/ Prev links never point at the current page</span><span class="step-subtitle">15 paginated pages</span></td><td>A page&#39;s next / prev links target neighboring pages, not the page itself</td><td>All paginated pages have valid next / prev targets</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>Pagination <span class="mono">link health (crawler-known statuses)</span><span class="step-subtitle">46 pagination links (only crawler-visited URLs evaluated)</span></td><td>Pagination links resolve to 2xx / 3xx</td><td>All crawler-known pagination targets are 2xx/3xx</td><td class="col-status"><span class="badge badge-pass">✓ PASS</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>Authorization <span class="mono">gate on /admin</span><span class="step-subtitle">https://vercel.com/admin</span></td><td>Admin page is not publicly accessible.</td><td>HTTP 200 but body does not look like an admin page (likely a soft-404)</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">the /admin/ path is protected</span></td><td>Accessing /admin/ without authentication should block the request with a redirect or error response, not display admin content.</td><td>The request returned HTTP 308 (redirect to itself), which may indicate incomplete protection.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">3</td><td>Authorization <span class="mono">gate on /admin.php</span><span class="step-subtitle">https://vercel.com/admin.php</span></td><td>Admin page is not publicly accessible.</td><td>HTTP 307 → /auth-redirect/admin.php (login redirect)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>Authorization <span class="mono">gate on /administrator</span><span class="step-subtitle">https://vercel.com/administrator</span></td><td>Admin page is not publicly accessible.</td><td>HTTP 307 → /auth-redirect/administrator (login redirect)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">5</td><td>Authorization <span class="mono">gate on /dashboard</span><span class="step-subtitle">https://vercel.com/dashboard</span></td><td>Admin page is not publicly accessible.</td><td>HTTP 307 → /auth-redirect/dashboard (login redirect)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">6</td><td>Verify <span class="mono">the /dashboard/ path is protected</span></td><td>Accessing /dashboard/ without authentication should block the request with a redirect or error response, not display dashboard content.</td><td>The request returned HTTP 308 (redirect to itself), which may indicate incomplete protection.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">7</td><td>Authorization <span class="mono">gate on /wp-admin</span><span class="step-subtitle">https://vercel.com/wp-admin</span></td><td>Admin page is not publicly accessible.</td><td>HTTP 307 → /auth-redirect/wp-admin (login redirect)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">8</td><td>Authorization <span class="mono">gate on /api/admin</span><span class="step-subtitle">https://vercel.com/api/admin</span></td><td>Admin page is not publicly accessible.</td><td>HTTP 404 (path does not exist)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">9</td><td>Authorization <span class="mono">gate on /api/users</span><span class="step-subtitle">https://vercel.com/api/users</span></td><td>Admin page is not publicly accessible.</td><td>HTTP 404 (path does not exist)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</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>Check <span class="mono">if mutating forms declare idempotency tokens</span></td><td>Forms that modify data should include a token the server can use to prevent duplicate submissions if a form is submitted twice.</td><td>No mutating forms were discovered on the site, so this check does not apply.</td><td class="col-status"><span class="badge badge-blocked">⊘ BLOCKED</span></td></tr>
    <tr><td class="col-num">2</td><td>Verify <span class="mono">the homepage enforces rate limits under burst requests</span></td><td>When the site is accessed repeatedly in quick succession, the server should signal rate limits via HTTP 429 responses or rate-limit headers.</td><td>All 20 requests in the burst test returned no rate-limit signals, suggesting rate limiting may not be enforced.</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">the login endpoint for rate-limit headers</span></td><td>The login endpoint should advertise rate limits via headers so clients know to back off after too many attempts.</td><td>No login form was discovered on the site, so this check does not apply.</td><td class="col-status"><span class="badge badge-blocked">⊘ BLOCKED</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>Page <span class="mono">`&lt;title&gt;` present</span><span class="step-subtitle">inspected 15 pages</span></td><td>Every page declares a non-empty `&lt;title&gt;` element</td><td>All pages declare a `&lt;title&gt;`</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">page titles are 10–60 characters</span></td><td>Page titles should be between 10 and 60 characters to be fully visible in search results and browser tabs.</td><td>5 of 15 page titles are out of the recommended range (2 are too long, 3 are too short).</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">3</td><td>Meta <span class="mono">description present</span><span class="step-subtitle">inspected 15 pages</span></td><td>Every page declares a `&lt;meta name=&quot;description&quot;&gt;` tag</td><td>All pages declare a meta description</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">meta descriptions are 50–160 characters</span></td><td>Meta descriptions should be 50–160 characters to be fully visible in search results.</td><td>2 of 15 meta descriptions are outside the recommended range.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">5</td><td>Canonical <span class="mono">URL declared</span><span class="step-subtitle">inspected 15 pages</span></td><td>Every page declares `&lt;link rel=&quot;canonical&quot; href=&quot;...&quot;&gt;`</td><td>All pages declare a canonical URL</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">Graph `og:title` present</span><span class="step-subtitle">inspected 15 pages</span></td><td>Every page declares `&lt;meta property=&quot;og:title&quot;&gt;`</td><td>All pages declare `og:title`</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">Graph `og:description` present</span><span class="step-subtitle">inspected 15 pages</span></td><td>Every page declares `&lt;meta property=&quot;og:description&quot;&gt;`</td><td>All pages declare `og:description`</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">8</td><td>Verify <span class="mono">Open Graph image tag is present</span></td><td>Every page should declare an Open Graph image (og:image) so social media sites display a preview when the page is shared.</td><td>1 of 15 pages is missing the og:image tag.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">9</td><td>Page <span class="mono">declares at least one `&lt;h1&gt;`</span><span class="step-subtitle">inspected 15 pages</span></td><td>Every page has exactly one `&lt;h1&gt;` (primary page title)</td><td>Every page declares at least one `&lt;h1&gt;`</td><td class="col-status"><span class="badge badge-pass">✓ PASS</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>sitemap.xml <span class="mono">exists</span><span class="step-subtitle">/sitemap.xml</span></td><td>GET `/sitemap.xml` 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">13</td><td>sitemap.xml <span class="mono">is valid XML</span><span class="step-subtitle">checked for &lt;urlset&gt; / &lt;sitemapindex&gt; root</span></td><td>Response body parses as `&lt;urlset&gt;` or `&lt;sitemapindex&gt;`</td><td>valid sitemap structure</td><td class="col-status"><span class="badge badge-pass">✓ PASS</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://vercel.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=vercel.com</span></td><td>Certificate valid for at least 30 more days</td><td>87 days remaining (valid_to Aug 17 21:36:15 2026 GMT)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>HTTP <span class="mono">→ HTTPS redirect</span><span class="step-subtitle">http://vercel.com</span></td><td>Plain HTTP serves a 301 / 302 / 307 / 308 to https://</td><td>HTTP 308 → https://vercel.com/</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">server software version is not disclosed</span></td><td>Server headers should not reveal the software name or version, as this information can help attackers identify vulnerabilities.</td><td>The X-Powered-By header reveals &#39;Next.js, Payload&#39;, exposing the technology stack.</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>HTTP <span class="mono">→ HTTPS redirect chain</span><span class="step-subtitle">start http://vercel.com/</span></td><td>1–2 hops landing on the matching https://&lt;host&gt;/ URL</td><td>1 hop → https://vercel.com/ (HTTP 200)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>www <span class="mono">/ apex canonicalization</span><span class="step-subtitle">compared www.vercel.com ↔ vercel.com</span></td><td>Both entrances land on the same canonical host</td><td>www → vercel.com, apex → vercel.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>Verify <span class="mono">favicon is declared</span></td><td>The page head should include a link tag for the favicon so browsers display an icon in the tab.</td><td>The favicon link tag was not found in the homepage HTML.</td><td class="col-status"><span class="badge badge-ux">■ UX</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 /manifest.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>Lazy-loading <span class="mono">attribute usage</span><span class="step-subtitle">parsed 20 &lt;img&gt; tags on homepage</span></td><td>≥25% of homepage &lt;img&gt; tags declare loading=&quot;lazy&quot;</td><td>8 of 20 tags use loading=&quot;lazy&quot; (40%)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>Image <span class="mono">payload size</span><span class="step-subtitle">HEAD-checked 20 of 244 unique image srcs</span></td><td>Each image transfers ≤ 500 KB</td><td>All 20 probed images ≤ 500 KB (or Content-Length unavailable)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</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>0 legacy (jpg/png), 0 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>Verify <span class="mono">no JavaScript console errors appear</span></td><td>The page should not emit any JavaScript errors to the browser console.</td><td>59 errors across 5 distinct patterns were logged on 14 pages, indicating JavaScript issues.</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 &#39;Failed to load resource&#39; errors</span></td><td>Resources should load successfully without emitting console errors.</td><td>A resource returned HTTP 403, failing to load and emitting a console error.</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 Cross-Origin Resource Sharing (CORS) fetch errors</span></td><td>Cross-origin requests should not be blocked by CORS policy.</td><td>A fetch request to &#39;https://ai-sdk.dev/&#39; was blocked by CORS policy or a redirect error.</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 network errors loading resources</span></td><td>All resources should load without network errors.</td><td>A resource failed to load with a network error.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">5</td><td>Check <span class="mono">for Content Security Policy font-loading violations</span></td><td>Fonts should load without violating the Content Security Policy.</td><td>A font from &#39;https://k2mkucxia43oc7fa.public.blob.vercel-storage.com/front/fonts/space-mono/sp…&#39; was blocked by the CSP directive.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">6</td><td>Check <span class="mono">for Content Security Policy connection violations</span></td><td>JavaScript connections should not be blocked by the Content Security Policy.</td><td>A connection to &#39;https://ai-sdk.dev/&#39; was blocked by the CSP directive.</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://v0.app/</span><span class="step-subtitle">&quot;v0Build applications with AI&quot;</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://community.vercel.com/</span><span class="step-subtitle">&quot;CommunityJoin the conversation&quot;</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://nuxt.com/</span><span class="step-subtitle">&quot;NuxtThe progressive web framework&quot;</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://svelte.dev/</span><span class="step-subtitle">&quot;SvelteThe web’s efficient UI framework&quot;</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">5</td><td>Check <span class="mono">external link https://ai-sdk.dev/</span><span class="step-subtitle">&quot;AI SDK&quot;</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">6</td><td>Check <span class="mono">external link https://workflow-sdk.dev/</span><span class="step-subtitle">&quot;Workflow SDKNew&quot;</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">7</td><td>Check <span class="mono">external link https://flags-sdk.dev/</span><span class="step-subtitle">&quot;Flags SDK&quot;</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">8</td><td>Check <span class="mono">external link https://chat-sdk.dev/</span><span class="step-subtitle">&quot;Chat SDK&quot;</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">9</td><td>Check <span class="mono">external link https://streamdown.ai/</span><span class="step-subtitle">&quot;Streamdown AINew&quot;</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">10</td><td>Check <span class="mono">external link https://github.com/vercel</span><span class="step-subtitle">&quot;GitHub&quot;</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">11</td><td>Check <span class="mono">external link https://linkedin.com/company/vercel</span><span class="step-subtitle">&quot;LinkedIn&quot;</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">12</td><td>Verify <span class="mono">external link https://x.com/vercel is reachable</span></td><td>The external link should be accessible or return a valid response code.</td><td>The link returned HTTP 403 (Forbidden) in 0.12 seconds, indicating access restrictions.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">13</td><td>Check <span class="mono">external link https://youtube.com/@VercelHQ</span><span class="step-subtitle">&quot;YouTube&quot;</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">14</td><td>Check <span class="mono">external link https://vercel-status.com/</span><span class="step-subtitle">&quot;All systems normal.&quot;</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">15</td><td>Check <span class="mono">external link https://ai-sdk.dev/getting-started</span><span class="step-subtitle">&quot;AI SDK documentation&quot;</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">16</td><td>Check <span class="mono">external link https://vercel.com/oss</span><span class="step-subtitle">referenced from https://vercel.com/ai-sdk</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">17</td><td>Check <span class="mono">external link https://vercel.com/ai-gateway</span><span class="step-subtitle">&quot;AI GatewayGateway&quot;</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">18</td><td>Check <span class="mono">external link https://github.com/vercel/ai</span><span class="step-subtitle">&quot;GitHub&quot;</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">19</td><td>Verify <span class="mono">external link https://github.com/vercel/ai/discussions is reachable</span></td><td>The external link should be accessible or return a valid response code.</td><td>The link returned HTTP 404 (Not Found) in 0.24 seconds, indicating the page no longer exists.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">20</td><td>Check <span class="mono">external link https://vercel.com/contact</span><span class="step-subtitle">&quot;Contact&quot;</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">21</td><td>Check <span class="mono">external link https://vercel.com/ai-gateway/models</span><span class="step-subtitle">&quot;supported LLM models&quot;</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">22</td><td>Check <span class="mono">external link https://vercel.com/sandbox</span><span class="step-subtitle">referenced from https://vercel.com/ai-sdk</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">23</td><td>Check <span class="mono">external link https://vercel.com/workflow</span><span class="step-subtitle">referenced from https://vercel.com/ai-sdk</span></td><td>External link is reachable.</td><td>Link redirects (HTTP 308).</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://elements.ai-sdk.dev/</span><span class="step-subtitle">referenced from https://vercel.com/ai-sdk</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">25</td><td>Check <span class="mono">external link https://vercel.com/templates</span><span class="step-subtitle">&quot;Templates&quot;</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">26</td><td>Check <span class="mono">external link https://vercel.com/docs/frameworks</span><span class="step-subtitle">&quot;Supported frameworks&quot;</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">27</td><td>Check <span class="mono">external link https://vercel.com/marketplace</span><span class="step-subtitle">&quot;Marketplace&quot;</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">28</td><td>Check <span class="mono">external link https://vercel.com/domains</span><span class="step-subtitle">&quot;Domains&quot;</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">29</td><td>Check <span class="mono">external link https://vercel.com/frameworks/nextjs</span><span class="step-subtitle">&quot;Next.js on Vercel&quot;</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">30</td><td>Check <span class="mono">external link https://vercel.com/solutions/turborepo</span><span class="step-subtitle">&quot;Turborepo&quot;</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">31</td><td>External <span class="mono">links beyond initial sample not checked</span></td><td>A representative sample of external links is tested; remaining links deferred due to probe limits.</td><td>More than 50 external links were not probed due to the automation limit.</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>?redirect=&lt;external&gt; <span class="mono">redirect handling</span><span class="step-subtitle">https://vercel.com/?redirect=https%3A%2F%2Fevil.example%2Fphishing-test</span></td><td>Server ignores or strips off-origin redirect targets</td><td>HTTP 200 (no Location)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">2</td><td>?next=&lt;external&gt; <span class="mono">redirect handling</span><span class="step-subtitle">https://vercel.com/?next=https%3A%2F%2Fevil.example%2Fphishing-test</span></td><td>Server ignores or strips off-origin redirect targets</td><td>HTTP 200 (no Location)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">3</td><td>?url=&lt;external&gt; <span class="mono">redirect handling</span><span class="step-subtitle">https://vercel.com/?url=https%3A%2F%2Fevil.example%2Fphishing-test</span></td><td>Server ignores or strips off-origin redirect targets</td><td>HTTP 200 (no Location)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>?return=&lt;external&gt; <span class="mono">redirect handling</span><span class="step-subtitle">https://vercel.com/?return=https%3A%2F%2Fevil.example%2Fphishing-test</span></td><td>Server ignores or strips off-origin redirect targets</td><td>HTTP 200 (no Location)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">5</td><td>?returnUrl=&lt;external&gt; <span class="mono">redirect handling</span><span class="step-subtitle">https://vercel.com/?returnUrl=https%3A%2F%2Fevil.example%2Fphishing-test</span></td><td>Server ignores or strips off-origin redirect targets</td><td>HTTP 200 (no Location)</td><td class="col-status"><span class="badge badge-pass">✓ PASS</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>Verify <span class="mono">a login form is discoverable</span></td><td>The site should have at least one login form so user authentication can be tested.</td><td>No login form was found 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-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">68 XHR/fetch responses on https://vercel.com/</span></td><td>All API responses return 2xx / 3xx</td><td>All 68 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">68 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>Check <span class="mono">API responses declare a `Content-Type` header</span><span class="step-subtitle">68 XHR/fetch responses</span></td><td>Every API response sets a `Content-Type` header</td><td>All responses declare a Content-Type</td><td class="col-status"><span class="badge badge-pass">✓ PASS</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">68 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>Verify <span class="mono">/xyz returns a 404 error page</span></td><td>Requesting a non-existent path should return an HTTP 4xx error with a branded error page that matches the site design.</td><td>The path returned HTTP 200 (success) instead of an error, and the page is not branded as an error page.</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">/__qa_explorer_404_probe_* returns a 404 error page</span></td><td>Requesting a non-existent path should return an HTTP 4xx error with a branded error page that matches the site design.</td><td>The path returned HTTP 200 (success) instead of an error, and the page is not branded as an error page.</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">/page-not-found?q=&lt;payload&gt; returns a 404 error page</span></td><td>Requesting a non-existent path should return an HTTP 4xx error with a branded error page that matches the site design.</td><td>The path returned HTTP 200 (success) instead of an error, and the page is not branded as an error page. Response time was 0.31 s.</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">/aaaa… (500-char repeat) returns a 404 error page</span></td><td>Requesting a path with an extremely long URL should return an HTTP 4xx error with a branded error page that matches the site design.</td><td>The path returned HTTP 200 (success) instead of an error, and the page is not branded as an error page.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">5</td><td>Verify <span class="mono">/test&#39;&lt;sql-payload&gt; returns a 404 error page</span></td><td>Requesting a path with SQL injection patterns should return an HTTP 4xx error with a branded error page that matches the site design.</td><td>The path returned HTTP 200 (success) instead of an error, and the page is not branded as an error page.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</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">link &quot;Log In&quot; → /login</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://vercel.com/login (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">the &#39;Sign Up&#39; link to navigate to /signup</span></td><td>The link should be clickable and the page should navigate to the sign-up page.</td><td>The click action timed out after 3 seconds, indicating the link was not responsive or not in the expected location.</td><td class="col-status"><span class="badge badge-blocked">⊘ BLOCKED</span></td></tr>
    <tr><td class="col-num">3</td><td>Click <span class="mono">link &quot;Learn more&quot; → /fluid</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://vercel.com/fluid</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;Get Started&quot; → /d</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://vercel.com/login?next=%2Fd%3Fto%3D%252F%255Bteam%255D%252F%257E%252Fsan… (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;Get Started&quot; → /d</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://vercel.com/login?next=%2Fd%3Fto%3D%252F%255Bteam%255D%252F%257E%252Fver… (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">the &#39;Sign in with Vercel&#39; button</span></td><td>The button should be clickable and present in the page.</td><td>The button is no longer in the DOM, likely because it was rendered after the initial page load by client-side JavaScript.</td><td class="col-status"><span class="badge badge-blocked">⊘ BLOCKED</span></td></tr>
    <tr><td class="col-num">7</td><td>Click <span class="mono">the &#39;Get Started&#39; link to navigate to /docs</span></td><td>Clicking the link should not produce any JavaScript errors.</td><td>A &#39;Failed to fetch&#39; error was thrown when the link was clicked.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">8</td><td>Click <span class="mono">link &quot;Contact sales&quot; → /contact/sales</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://vercel.com/contact/sales</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">9</td><td>Click <span class="mono">link &quot;Learn More&quot; → /docs/vercel-firewall</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://vercel.com/docs/vercel-firewall (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;Learn more&quot; → /botid</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://vercel.com/docs/vercel-firewall (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>Verify <span class="mono">a search form is discoverable</span></td><td>The site should have at least one search form so search functionality can be tested.</td><td>No search form was found 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-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>Verify <span class="mono">a service worker is registered</span></td><td>Optionally, a registered service worker enables offline browsing, push notifications, and background synchronization.</td><td>No service worker was registered on the sample page.</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 page displays gracefully when offline</span></td><td>When the browser is offline, the page should show a branded offline message or cached content instead of a generic browser error.</td><td>The page failed to load offline, showing a generic &#39;net::ERR_INTERNET_DISCONNECTED&#39; error rather than a graceful offline state.</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">a loading indicator appears during slow navigation</span></td><td>While the page is loading, a spinner or loading message should be visible to reassure the user that content is on the way.</td><td>No loading spinner or progress indicator was detected during slow navigation.</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>0.23s</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>0.23s</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.000</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">4</td><td>Measure <span class="mono">DOM complexity on the homepage</span></td><td>The homepage should contain no more than 1500 DOM elements (good) or 3000 (needs improvement) for optimal performance.</td><td>The homepage contains 3195 DOM elements, exceeding the recommended limit.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">5</td><td>Measure <span class="mono">page weight on the homepage</span></td><td>The homepage should weigh no more than 3 MB (good) or 5 MB (needs improvement) for fast loading.</td><td>The homepage weighs 3.70 MB, exceeding the good threshold.</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">· /ai-gateway</span></td><td>≤1.8s good · ≤3.0s needs improvement</td><td>0.31s</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">· /ai-gateway</span></td><td>≤2.5s good · ≤4.0s needs improvement</td><td>0.31s</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">· /ai-gateway</span></td><td>≤0.1 good · ≤0.25 needs improvement</td><td>0.000</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">9</td><td>Measure <span class="mono">DOM complexity on /ai-gateway</span></td><td>The page should contain no more than 1500 DOM elements (good) or 3000 (needs improvement) for optimal performance.</td><td>The page contains 2539 DOM elements, which is within acceptable range but toward the higher end.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">10</td><td>Measure <span class="mono">page weight on /ai-gateway</span></td><td>The page should weigh no more than 3 MB (good) or 5 MB (needs improvement) for fast loading.</td><td>The page weighs 4.21 MB, exceeding the good threshold but within acceptable range.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">11</td><td>FCP <span class="mono">· /products/previews</span></td><td>≤1.8s good · ≤3.0s needs improvement</td><td>0.24s</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">· /products/previews</span></td><td>≤2.5s good · ≤4.0s needs improvement</td><td>0.24s</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">· /products/previews</span></td><td>≤0.1 good · ≤0.25 needs improvement</td><td>0.000</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">14</td><td>Measure <span class="mono">DOM complexity on /products/previews</span></td><td>The page should contain no more than 1500 DOM elements (good) or 3000 (needs improvement) for optimal performance.</td><td>The page contains 2416 DOM elements, which is acceptable but on the higher side.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">15</td><td>Measure <span class="mono">page weight on /products/previews</span></td><td>The page should weigh no more than 3 MB (good) or 5 MB (needs improvement) for fast loading.</td><td>The page weighs 3.79 MB, exceeding the good threshold.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">16</td><td>FCP <span class="mono">· /products/observability</span></td><td>≤1.8s good · ≤3.0s needs improvement</td><td>0.23s</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">· /products/observability</span></td><td>≤2.5s good · ≤4.0s needs improvement</td><td>0.23s</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">· /products/observability</span></td><td>≤0.1 good · ≤0.25 needs improvement</td><td>0.000</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">19</td><td>Measure <span class="mono">DOM complexity on /products/observability</span></td><td>The page should contain no more than 1500 DOM elements (good) or 3000 (needs improvement) for optimal performance.</td><td>The page contains 3479 DOM elements, exceeding the acceptable limit.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">20</td><td>Measure <span class="mono">page weight on /products/observability</span></td><td>The page should weigh no more than 3 MB (good) or 5 MB (needs improvement) for fast loading.</td><td>The page weighs 3.93 MB, exceeding the good threshold.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">21</td><td>FCP <span class="mono">· /botid</span></td><td>≤1.8s good · ≤3.0s needs improvement</td><td>0.22s</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">· /botid</span></td><td>≤2.5s good · ≤4.0s needs improvement</td><td>0.22s</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">· /botid</span></td><td>≤0.1 good · ≤0.25 needs improvement</td><td>0.000</td><td class="col-status"><span class="badge badge-pass">✓ PASS</span></td></tr>
    <tr><td class="col-num">24</td><td>Measure <span class="mono">DOM complexity on /botid</span></td><td>The page should contain no more than 1500 DOM elements (good) or 3000 (needs improvement) for optimal performance.</td><td>The page contains 2280 DOM elements, which is acceptable.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">25</td><td>Measure <span class="mono">page weight on /botid</span></td><td>The page should weigh no more than 3 MB (good) or 5 MB (needs improvement) for fast loading.</td><td>The page weighs 3.76 MB, exceeding the good threshold.</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>Test <span class="mono">homepage responsiveness on mobile (375×812)</span></td><td>The homepage should display without horizontal overflow, have no clipped text, and all interactive elements should be at least 44 pixels tall.</td><td>No horizontal overflow observed. However, 4 elements are clipped, and 88 of 101 touch targets are smaller than the recommended 44 pixels.</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">homepage responsiveness on tablet (768×1024)</span></td><td>The homepage should display without horizontal overflow and have no clipped text.</td><td>No horizontal overflow observed, but 1 element is clipped.</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">homepage responsiveness on desktop (1440×900)</span></td><td>The homepage should display without horizontal overflow and have no clipped text.</td><td>No horizontal overflow observed, but 1 element is clipped.</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">/products/previews responsiveness on mobile (375×812)</span></td><td>The page should display without horizontal overflow, have no clipped text, and all interactive elements should be at least 44 pixels tall.</td><td>No horizontal overflow observed. However, 2 elements are clipped, and 69 of 73 touch targets are smaller than the recommended 44 pixels.</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">/products/previews responsiveness on tablet (768×1024)</span></td><td>The page should display without horizontal overflow and have no clipped text.</td><td>No horizontal overflow observed, but 2 elements are clipped.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">6</td><td>Test <span class="mono">/products/previews responsiveness on desktop (1440×900)</span></td><td>The page should display without horizontal overflow and have no clipped text.</td><td>No horizontal overflow observed, but 3 elements are clipped.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">7</td><td>Test <span class="mono">/botid responsiveness on mobile (375×812)</span></td><td>The page should display without horizontal overflow, have no clipped text, and all interactive elements should be at least 44 pixels tall.</td><td>No horizontal overflow observed. However, 2 elements are clipped, and 70 of 78 touch targets are smaller than the recommended 44 pixels.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">8</td><td>Test <span class="mono">/botid responsiveness on tablet (768×1024)</span></td><td>The page should display without horizontal overflow and have no clipped text.</td><td>No horizontal overflow observed, but 2 elements are clipped.</td><td class="col-status"><span class="badge badge-ux">■ UX</span></td></tr>
    <tr><td class="col-num">9</td><td>Test <span class="mono">/botid responsiveness on desktop (1440×900)</span></td><td>The page should display without horizontal overflow and have no clipped text.</td><td>No horizontal overflow observed, but 2 elements are clipped.</td><td class="col-status"><span class="badge badge-ux">■ UX</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, maximum-scale=1.</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://vercel.com/home</span></td><td>Direct GET on the inner URL renders content</td><td>Loaded, HTTP 200, body length 5237.</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://vercel.com/ → https://vercel.com/home → back</span></td><td>Going back re-renders the previous page (no blank / error screen)</td><td>Back, HTTP 200, body length 5237.</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://vercel.com/home</span></td><td>Reload renders the page without errors</td><td>Reloaded, HTTP 200, body length 5237.</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>Measure <span class="mono">color contrast on the homepage</span></td><td>All text should meet WCAG 2.1 color contrast standards (at least 4.5:1 for normal text, 3:1 for large text).</td><td>1 of 50 sampled text elements falls below the required contrast ratio.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">2</td><td>Measure <span class="mono">color contrast on /products/previews</span></td><td>All text should meet WCAG 2.1 color contrast standards (at least 4.5:1 for normal text, 3:1 for large text).</td><td>3 of 48 sampled text elements fall below the required contrast ratio.</td><td class="col-status"><span class="badge badge-fail">✗ FAIL</span></td></tr>
    <tr><td class="col-num">3</td><td>Measure <span class="mono">color contrast on /botid</span></td><td>All text should meet WCAG 2.1 color contrast standards (at least 4.5:1 for normal text, 3:1 for large text).</td><td>3 of 48 sampled text elements fall below the required contrast ratio.</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>Pre-consent cookie firing with no visible banner — GDPR/CCPA violation</td><td class="col-severity"><span class="badge badge-critical">Critical</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>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-003</td><td>59 console errors across 14 pages indicate systemic JS runtime failures</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>Client-side routing returns HTTP 200 for all unknown paths — no real 404</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>CTA click triggers a JavaScript error</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 &quot;_v-anonymous-id-renewed&quot; 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>Cookie &quot;_v-anonymous-id&quot; 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-008</td><td>Cookie &quot;_v-consent&quot; 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-009</td><td>Missing security headers inconsistent across pages — edge config gap</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-010</td><td>Undersized touch targets on mobile</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-011</td><td>Buttons without an accessible name</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>Links without an accessible name</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 `&lt;h1&gt;` elements on the same 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>Broken and unverifiable social/external links undermine content credibility</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>Console error: Cross-origin fetch blocked by browser policy</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>Console error: Failed to load resource with HTTP error status</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>Console error: Network request failed (net::ERR_FAILED)</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>External link returns 404</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>No offline / cached state on sample 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-020</td><td>Page weight and DOM size bloat across multiple product pages</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>CSP violations from first-party resources indicate misconfigured policy</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>Missing security response headers</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>No cookie / consent banner detected in homepage HTML</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>Server software disclosed via X-Powered-By 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>Tracking cookies set before user consent</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>Images with empty `alt=&quot;&quot;` (verify decorative intent)</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-027</td><td>Skipped heading levels in page hierarchy</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-028</td><td>Console error: Connection blocked by Content-Security-Policy</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-029</td><td>Console error: Font blocked by Content-Security-Policy</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-030</td><td>No service worker registered (no offline support)</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-031</td><td>Heavy page weight</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-032</td><td>Oversized DOM</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>No rate-limit signal observed on homepage burst</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>Content clipped at Desktop (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-035</td><td>Content clipped at Mobile (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-036</td><td>Content clipped at Tablet (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-037</td><td>Missing favicon link</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>Missing SEO metadata</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>Page title too long (longest 67 chars)</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">Pre-consent cookie firing with no visible banner — GDPR/CCPA violation</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-critical">Critical</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open an incognito browser window and navigate to https://vercel.com/</li>
      <li>Immediately open DevTools → Application → Cookies before any interaction</li>
      <li>Observe _v-consent, _v-anonymous-id, and _v-anonymous-id-renewed already set</li>
      <li>Confirm no cookie consent banner or modal is visible or present in the DOM</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">No non-essential cookies should be set until the user has been shown a consent banner and made an affirmative choice; the _v-consent cookie should only be written after consent is given.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">All 3 detected cookies are set pre-consent on every page load; no consent banner pattern was found in homepage HTML, meaning users are never shown a choice.</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">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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/ in DevTools → Inspect</li>
      <li>Locate the element matching `span.px-1.h-5`</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">Contrast ratio should be at least 4.5:1 for normal body text (3:1 for large text 18pt+ or 14pt bold+).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Text &quot;&#39;openai/gpt-5.5&#39;&quot; has contrast ratio 4.13:1 (blue text on light blue background) on https://vercel.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-003</span>
      <span class="bug-title">59 console errors across 14 pages indicate systemic JS runtime failures</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://vercel.com/ (Desktop)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open Chrome DevTools Console on https://vercel.com/</li>
      <li>Set filter to &#39;Errors&#39;</li>
      <li>Reload the page without cache</li>
      <li>Observe multiple console errors including 403 resource failures and CORS violations</li>
      <li>Repeat on https://vercel.com/home and https://vercel.com/ai-sdk to confirm the pattern is site-wide</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">A production marketing site should have zero console errors on standard page loads; any third-party or analytics failures should be silently caught and not pollute the console.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">59 errors across 5 patterns on 14 of 15 pages including 403 resource failures, CORS redirect blocks to ai-sdk.dev, ERR_FAILED network errors, font CSP violations, and WebSocket/connection CSP violations.</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">Client-side routing returns HTTP 200 for all unknown paths — no real 404</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://vercel.com/xyz (Desktop)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>In a browser or curl, request https://vercel.com/this-page-does-not-exist</li>
      <li>Observe the HTTP response status is 200, not 404</li>
      <li>Inspect the response body — it does not contain a recognizable Vercel-branded 404 error page</li>
      <li>Repeat with https://vercel.com/aaaa (500 &#39;a&#39; characters) — same result</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Requests for non-existent pages should return HTTP 404 with a branded, user-friendly error page to inform users, prevent SEO index pollution, and enable accurate uptime monitoring.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">All 5 not-found probes returned HTTP 200 with a non-branded response body, confirming the server never signals a missing resource.</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">CTA click triggers a JavaScript error</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://vercel.com/ai-sdk (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/ai-sdk in a browser with DevTools → Console open</li>
      <li>Locate the link labeled &quot;Get Started&quot;</li>
      <li>Click it</li>
      <li>Observe console error: &quot;Failed to fetch&quot;</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Clicking the CTA should trigger its intended action with no JavaScript errors.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Clicking &quot;Get Started&quot; (link) on https://vercel.com/ai-sdk produced a &quot;Failed to fetch&quot; JavaScript error.</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 &quot;_v-anonymous-id-renewed&quot; 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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -I &#39;https://vercel.com/&#39;</li>
      <li>Locate the &#39;Set-Cookie&#39; response header for the cookie named &quot;_v-anonymous-id-renewed&quot;</li>
      <li>Confirm the HttpOnly flag is absent</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">All cookies should include the HttpOnly flag (e.g., Set-Cookie: name=value; HttpOnly; Secure; SameSite=Lax).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Cookie &quot;_v-anonymous-id-renewed&quot; observed on https://vercel.com/ is missing the HttpOnly flag in its Set-Cookie response 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-007</span>
      <span class="bug-title">Cookie &quot;_v-anonymous-id&quot; 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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -I &#39;https://vercel.com/&#39;</li>
      <li>Locate the &#39;Set-Cookie&#39; response header for the cookie named &quot;_v-anonymous-id&quot;</li>
      <li>Confirm the HttpOnly flag is absent</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">All cookies should include the HttpOnly flag (e.g., Set-Cookie: name=value; HttpOnly; Secure; SameSite=Lax).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Cookie &quot;_v-anonymous-id&quot; observed on https://vercel.com/ is missing the HttpOnly flag in its Set-Cookie response 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-008</span>
      <span class="bug-title">Cookie &quot;_v-consent&quot; 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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -I &#39;https://vercel.com/&#39;</li>
      <li>Locate the &#39;Set-Cookie&#39; response header for the cookie named &quot;_v-consent&quot;</li>
      <li>Confirm the HttpOnly flag is absent</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">All cookies should include the HttpOnly flag (e.g., Set-Cookie: name=value; HttpOnly; Secure; SameSite=Lax).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Cookie &quot;_v-consent&quot; observed on https://vercel.com/ is missing the HttpOnly flag in its Set-Cookie response 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-009</span>
      <span class="bug-title">Missing security headers inconsistent across pages — edge config gap</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://vercel.com/ (Desktop)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open DevTools Network tab on https://vercel.com/</li>
      <li>Reload the page and inspect the response headers for the document request</li>
      <li>Note the absence of Content-Security-Policy, X-Content-Type-Options, X-Frame-Options, Referrer-Policy, and Permissions-Policy</li>
      <li>Repeat on a second internal page and compare — headers present on one, absent on another</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">All pages should consistently return the full set of recommended security response headers regardless of which origin or route serves them.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">1 of 2 sampled pages is missing CSP, X-Content-Type-Options, X-Frame-Options, and Referrer-Policy; Permissions-Policy is absent on all sampled pages, meaning the gap is partial and route-dependent.</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">Undersized touch targets on mobile</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.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 the mobile viewport.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">88 of 101 interactive elements are below 44px on mobile (375×812). Examples: menu button (90×18px), toggle button (32×32px).</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">Buttons without an accessible name</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://vercel.com/ai-sdk (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/ai-sdk 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 must have a visible label or an `aria-label` attribute (e.g., `&lt;button aria-label=&quot;Close&quot;&gt;×&lt;/button&gt;`).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">17 of 273 buttons have neither visible text nor aria-label across 2 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-012</span>
      <span class="bug-title">Links without an accessible name</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.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 must have a visible label, an `aria-label`, or an image with alt text describing the destination.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">34 of 1787 links lack an accessible name across 15 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-013</span>
      <span class="bug-title">Multiple `&lt;h1&gt;` elements on the same 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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/ in DevTools → Elements tab</li>
      <li>Search the DOM for `h1` elements</li>
      <li>Confirm 2 &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">Exactly one `&lt;h1&gt;` element per page.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">3 of 15 crawled pages contain multiple &lt;h1&gt; elements (for example, 2 on https://vercel.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">Broken and unverifiable social/external links undermine content credibility</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://vercel.com/ai-sdk (Desktop)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Navigate to https://vercel.com/ai-sdk</li>
      <li>Find and click the GitHub Discussions community link</li>
      <li>Observe the GitHub 404 page</li>
      <li>Separately, attempt to visit https://x.com/vercel — observe access restriction</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">All externally linked URLs on product pages should resolve successfully; community and documentation links are especially critical on developer-focused pages.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">https://github.com/vercel/ai/discussions returns HTTP 404; https://x.com/vercel returns HTTP 403; the GitHub link is a hard failure on the AI SDK product 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-015</span>
      <span class="bug-title">Console error: Cross-origin fetch blocked by browser policy</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://vercel.com/home (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/home 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">Cross-origin requests should be explicitly permitted via CORS headers or use same-origin requests.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">13 instances of blocked fetch requests (attempting to reach &#39;https://ai-sdk.dev/&#39; from &#39;https://vercel.com/...&#39;) across 13 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-016</span>
      <span class="bug-title">Console error: Failed to load resource with HTTP error status</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/ 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 referenced resources should load successfully (HTTP 2xx or valid 3xx redirects).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">28 instances of &quot;Failed to load resource: the server responded with a status of 403&quot; across 14 pages. First observed on https://vercel.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-017</span>
      <span class="bug-title">Console error: Network request failed (net::ERR_FAILED)</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://vercel.com/home (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/home 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 network requests should complete successfully.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">13 instances of &quot;Failed to load resource: net::ERR_FAILED&quot; across 13 pages. First observed on https://vercel.com/home.</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">External link returns 404</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://vercel.com/ai-sdk (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/ai-sdk in a browser</li>
      <li>Click the link to https://github.com/vercel/ai/discussions</li>
      <li>Observe HTTP 404</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">Outbound links should point to pages that exist and respond with HTTP 2xx (or valid 3xx redirects).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">https://github.com/vercel/ai/discussions 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-019</span>
      <span class="bug-title">No offline / cached state on sample 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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.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 display either a cached version of the page or a branded offline message.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Offline navigation to https://vercel.com/ resulted in a 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-020</span>
      <span class="bug-title">Page weight and DOM size bloat across multiple product pages</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://vercel.com/ai-gateway (Desktop)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open Chrome DevTools → Network tab, disable cache, and navigate to https://vercel.com/ai-gateway</li>
      <li>Check the total transferred size in the Network summary bar — observe ~4.21 MB</li>
      <li>Open DevTools Console and run: document.querySelectorAll(&#39;*&#39;).length — observe ~2539</li>
      <li>Repeat on https://vercel.com/products/previews and https://vercel.com/</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Pages should transfer under 1.5 MB and maintain fewer than 1500 DOM nodes to meet Google&#39;s Lighthouse performance budgets and ensure fast Time to Interactive on mid-range devices.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">/ai-gateway transfers 4.21 MB with 2539 DOM nodes; /products/previews transfers 3.79 MB with 2416 DOM nodes; the homepage DOM alone has 3195 nodes, all flagged as exceeding thresholds.</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">CSP violations from first-party resources indicate misconfigured policy</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://vercel.com/home (Desktop)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open DevTools Console on https://vercel.com/home</li>
      <li>Observe CSP violation errors referencing https://k2mkucxia43oc7fa.public.blob.vercel-storage.com and https://ai-sdk.dev/</li>
      <li>Cross-reference with the Network tab to confirm those resources fail to load</li>
      <li>Note that on other pages the CSP header is entirely absent, creating an inconsistent policy surface</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">A correctly configured CSP should allow all legitimate first-party fonts and known third-party API connections while blocking unknown origins; no first-party resources should be CSP-blocked in production.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Console shows &#39;Loading the font violates the following Content Security Policy directive&#39; for a Vercel blob storage URL, and &#39;Connecting to https://ai-sdk.dev/ violates the following Content Security Policy directive&#39;, causing resource load failures on production 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-022</span>
      <span class="bug-title">Missing security response headers</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -I &#39;https://vercel.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 response 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 present on responses from this site (1 of 2 pages sampled).</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">No cookie / consent banner detected in homepage HTML</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://vercel.com (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.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 / consent banner should be visible in the initial page HTML or appear immediately on load.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Homepage HTML response did not contain any of the standard consent-banner selectors (e.g., `.cookie-banner`, `.cookie-consent`).</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">Server software disclosed via X-Powered-By 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://vercel.com (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -I &#39;https://vercel.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">The `X-Powered-By` header should be absent or contain no version or framework identifiers.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">X-Powered-By header reveals: Next.js, Payload</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">Tracking cookies set before user consent</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://vercel.com (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -I &#39;https://vercel.com/&#39;</li>
      <li>Inspect the `Set-Cookie` response headers</li>
      <li>Cross-check each cookie name against the strict-necessary list</li>
      <li>Move tracking cookies behind a consent gate (or implement one)</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Tracking and analytics cookies should only be set after the user accepts them in a consent banner.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">3 cookies set on first load (names: _v-consent, _v-anonymous-id, _v-anonymous-id-renewed) before user consent.</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">Images with empty `alt=&quot;&quot;` (verify decorative intent)</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/ in DevTools → Elements tab</li>
      <li>Run `[...document.querySelectorAll(&#39;img[alt=&quot;&quot;]&#39;)]` in Console</li>
      <li>Review each — replace empty alt with descriptive text on non-decorative images</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Empty alt text only on images that are purely decorative or redundant.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">143 of 452 images use empty alt text across 15 crawled pages. Review each to confirm it is decorative.</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">Skipped heading levels in page hierarchy</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/ 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 without gaps (e.g., h1, h2, h3 in order).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">8 of 15 crawled pages skip at least one heading level in their hierarchy.</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">Console error: Connection blocked by Content-Security-Policy</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/ 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">Required external domains should be listed in the CSP&#39;s `connect-src` directive.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">1 instance of a blocked connection to &#39;https://ai-sdk.dev/&#39; due to CSP restrictions (https://vercel.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">Console error: Font blocked by Content-Security-Policy</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/ 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">Font sources should be permitted in the CSP, or fonts should be self-hosted.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">4 instances of font-loading failures due to CSP violations across 1 page (https://vercel.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-030</span>
      <span class="bug-title">No service worker registered (no offline support)</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.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 cache content and enable offline access.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">No service worker registrations detected on https://vercel.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-031</span>
      <span class="bug-title">Heavy page weight</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.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 not exceed 3 MB (5 MB is considered a hard fail).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">https://vercel.com/ requires 3.70 MB of data to load (verdict: UX concern).</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">Oversized DOM</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/ in Chrome DevTools → Lighthouse → Performance</li>
      <li>Run an audit and confirm the DOM metric exceeds the &quot;good&quot; threshold</li>
      <li>Compare against ≤1500 elements good · ≤3000 needs improvement thresholds (Google Core Web Vitals)</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">DOM size should not exceed 1,500 elements (up to 3,000 is acceptable with mitigation).</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">https://vercel.com/ contains 3,195 DOM elements.</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">No rate-limit signal observed on homepage burst</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Fire 20 parallel GET https://vercel.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 return HTTP 429 (Too Many Requests) or `X-RateLimit-*` / `Retry-After` headers when request rates are exceeded.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">20 parallel requests to the homepage all succeeded with no rate-limit signal.</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">Content clipped at Desktop (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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.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">Text should fit the visible area or be truncated with `text-overflow: ellipsis`.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">1 element clips content on desktop (1440px width): grid block (359px → 359px).</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">Content clipped at Mobile (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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.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">Text should fit the visible area or be truncated with `text-overflow: ellipsis`.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">4 elements clip content on mobile (375px width). Examples: hero grid wrapper (342px → 469px), grid block (341px), screen-reader-only region (293px → 499px).</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">Content clipped at Tablet (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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.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">Text should fit the visible area or be truncated with `text-overflow: ellipsis`.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">1 element clips content on tablet (768px width): grid block (367px → 367px).</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">Missing favicon link</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://vercel.com (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>curl -s &#39;https://vercel.com/&#39; | grep -iE &#39;rel=&quot;(icon|shortcut icon)&quot;&#39;</li>
      <li>Confirm no matching tag is present</li>
      <li>Add the missing tag inside `&lt;head&gt;`</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">`&lt;link rel=&quot;icon&quot;&gt;` should be declared in the page&#39;s `&lt;head&gt;` section.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">Homepage HTML for https://vercel.com/ does not include a favicon link tag.</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">Missing SEO metadata</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://vercel.com/sandbox (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/sandbox → View source</li>
      <li>Locate `&lt;meta name=&quot;description&quot; content=&quot;...&quot;&gt;`</li>
      <li>Rewrite content to fit 50–160 characters</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Meta description should be 50–160 characters.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">2 of 15 page descriptions are outside the 50–160 character range.</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">Page title too long (longest 67 chars)</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://vercel.com/ (Desktop + Mobile)</div>
    <div class="bug-section-label">Steps to Reproduce</div>
    <div class="bug-steps"><ol>
      <li>Open https://vercel.com/ in DevTools → Elements</li>
      <li>Inspect the `&lt;title&gt;` element</li>
      <li>Confirm the text is 67 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 title length should be between 10 and 60 characters.</div>
    <div class="bug-section-label">Actual Result</div>
    <div class="bug-actual">5 of 15 pages have titles out of range (2 too long, 3 too short). The longest is https://vercel.com/ at 67 characters.</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> — Pre-consent cookie firing with no visible banner — GDPR/CCPA violation</li>
  <li><strong>BUG-002</strong> — Color contrast failures (site-wide)</li>
  <li><strong>BUG-003</strong> — 59 console errors across 14 pages indicate systemic JS runtime failures</li>
  <li><strong>BUG-004</strong> — Client-side routing returns HTTP 200 for all unknown paths — no real 404</li>
  <li><strong>BUG-005</strong> — CTA click triggers a JavaScript error</li>
  <li><strong>BUG-006</strong> — Cookie &quot;_v-anonymous-id-renewed&quot; missing HttpOnly flag</li>
  <li><strong>BUG-007</strong> — Cookie &quot;_v-anonymous-id&quot; missing HttpOnly flag</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>Remove or gate all tracking cookies (_v-consent, _v-anonymous-id, _v-anonymous-id-renewed) behind explicit user consent and deploy a compliant cookie consent banner on the homepage to resolve the GDPR/CCPA violation.</span></div>
  <div class="finding-row"><span class="finding-num">2</span><span>Add Content-Security-Policy, X-Content-Type-Options, X-Frame-Options, Referrer-Policy, and Permissions-Policy headers consistently across all pages via a single edge/CDN middleware rule to close the security header gap in one change.</span></div>
  <div class="finding-row"><span class="finding-num">3</span><span>Set the HttpOnly flag on all session and analytics cookies (_v-consent, _v-anonymous-id, _v-anonymous-id-renewed) to prevent JavaScript-based cookie theft.</span></div>
  <div class="finding-row"><span class="finding-num">4</span><span>Fix the JavaScript fetch error on /ai-sdk that blocks the &#39;Get Started&#39; CTA (pageerror: Failed to fetch) and causes the CORS redirect violation for https://ai-sdk.dev/ — investigate the cross-origin redirect and ensure the CTA navigates reliably.</span></div>
  <div class="finding-row"><span class="finding-num">5</span><span>Remediate WCAG AA color contrast failures: the 1.66:1 ratio on /botid is critically low; audit and update text/background color tokens across /, /products/previews, and /botid.</span></div>
  <div class="finding-row"><span class="finding-num">6</span><span>Add accessible names to all 34 unnamed links and 17 unnamed buttons — use aria-label or visible text; prioritize the 2 pages with unnamed buttons as they likely include key interactive controls.</span></div>
  <div class="finding-row"><span class="finding-num">7</span><span>Fix the broken external link to https://github.com/vercel/ai/discussions (HTTP 404) on /ai-sdk — update to the current GitHub Discussions URL or remove the link.</span></div>
  <div class="finding-row"><span class="finding-num">8</span><span>Resolve the multiple &lt;h1&gt; elements on 3 pages and fix heading-level skips on 8 pages to correct document outline structure for screen readers and SEO.</span></div>
  <div class="finding-row"><span class="finding-num">9</span><span>Reduce page weight and DOM complexity on /ai-gateway (4.21 MB, 2539 elements) and /products/previews (3.79 MB, 2416 elements) through image optimization, code splitting, or lazy loading to improve Core Web Vitals.</span></div>
  <div class="finding-row"><span class="finding-num">10</span><span>Remove or suppress the X-Powered-By: Next.js, Payload response header to avoid unnecessary technology fingerprinting by attackers.</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 (6)</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">Navigate to AI Cloud product page from homepage</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 homepage at https://vercel.com/</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Click the &#39;AI Cloud&#39; link in the navigation</li>
      <li>Verify the page loads completely</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">User is redirected to https://vercel.com/ai and the page title displays &#39;Deploy AI at the speed of frontend&#39;</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">Access AI Gateway subproduct from AI Cloud page</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 https://vercel.com/ai</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Click the &#39;AI Gateway&#39; link</li>
      <li>Wait for page to fully load</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">User navigates to https://vercel.com/ai-gateway and sees AI Gateway documentation with SDK options</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">Navigate through multiple product pages using breadcrumb trail</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 homepage</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Click &#39;Products&#39; button in navigation</li>
      <li>Click &#39;CI/CD&#39; link to go to https://vercel.com/products/previews</li>
      <li>Click &#39;Products&#39; again to see options</li>
      <li>Click &#39;Observability&#39; link to go to https://vercel.com/products/observability</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">User can navigate between different product pages without errors</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">Search functionality using keyboard shortcut</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 https://vercel.com/ai-sdk page</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Press the keyboard shortcut for search (⌘K or Ctrl+K)</li>
      <li>Verify search dialog opens</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Search dialog appears on screen, ready for user input</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 sign-in button navigation</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 https://vercel.com/ai-sdk</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Click &#39;Sign in with Vercel&#39; button</li>
      <li>Verify page navigates or modal opens for authentication</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">User is taken to a sign-in or authentication flow</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-006</span>
      <span class="bug-title">Test anchor link navigation within same page</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 https://vercel.com/ page with anchor links</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Click the &#39;Skip to content&#39; anchor link (https://vercel.com/#geist-skip-nav)</li>
      <li>Verify focus moves and page scrolls to target section</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Page scrolls smoothly to the anchor target; focus is set on the target element</div>
  </div>
</div>
<div class="test-suite-label">Edge Cases (4)</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">Test browser back button during navigation flow</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 https://vercel.com/</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Click &#39;AI Cloud&#39; link to navigate to https://vercel.com/ai</li>
      <li>Click &#39;Vercel Agent&#39; link to navigate to https://vercel.com/agent</li>
      <li>Press browser back button</li>
      <li>Press browser back button again</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Each back button press returns to the previous page in history, ending at homepage</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">Test rapid sequential navigation to AI product pages</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 https://vercel.com/</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Click &#39;AI Cloud&#39; link</li>
      <li>Before page fully loads, click browser back button</li>
      <li>Click &#39;AI Gateway&#39; link</li>
      <li>Before page fully loads, click &#39;Sandbox&#39; link</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Page requests are properly cancelled or handled; final page displays correct content without console errors</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">Test navigation with very long page scroll and focus management</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 https://vercel.com/security or another page with extensive vertical content</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Scroll to the bottom of the page</li>
      <li>Click a link to a new page (e.g., &#39;Bot Management&#39;)</li>
      <li>Verify page loads and scroll position resets</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">New page loads with scroll position at the top; no scroll position carried over from previous 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-010</span>
      <span class="bug-title">Test special characters in navigation flow</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">edge-case</span>
      <span class="badge badge-low">Low</span>
    </div>
  </div>
  <div class="bug-card-body">
    <div class="bug-section-label">Precondition</div>
    <div class="bug-expected">User is on https://vercel.com/</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Click multiple links with special characters in their text (e.g., &#39;AI SDK&#39;, &#39;CI/CD&#39;)</li>
      <li>Verify each page loads correctly</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">All pages with special characters in their names load and render properly</div>
  </div>
</div>
<div class="test-suite-label">Security (3)</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">Test XSS injection in search input 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 https://vercel.com/ai-sdk with search dialog open</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Open search dialog using ⌘K</li>
      <li>Type payload: &lt;script&gt;alert(&#39;XSS&#39;)&lt;/script&gt;</li>
      <li>Press Enter to submit search</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">No JavaScript alert appears; payload is either sanitized or escaped in results</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">Test SQL injection-shaped payload in search</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 https://vercel.com/ai-sdk with search dialog open</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Open search dialog using ⌘K</li>
      <li>Type payload: &#39; OR &#39;1&#39;=&#39;1</li>
      <li>Press Enter to submit search</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Search returns normal results or error message; no database errors exposed</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">Attempt to access restricted page without authentication</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 not authenticated</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Navigate directly to a potentially protected URL (e.g., dashboard or admin path if one exists)</li>
      <li>Observe response and page content</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">User is either redirected to login page or sees &#39;unauthorized&#39; message; no sensitive data is exposed</div>
  </div>
</div>
<div class="test-suite-label">UX &amp; Responsive (5)</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">Test skip-to-content navigation shortcut</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 is on https://vercel.com/</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Press Tab key to activate the first focusable element</li>
      <li>Verify &#39;Skip to content&#39; link is visible</li>
      <li>Click the &#39;Skip to content&#39; link</li>
      <li>Verify focus moves to main content area</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Skip link navigates to the main content section, improving keyboard accessibility</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-015</span>
      <span class="bug-title">Verify responsive layout on mobile viewport</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 is on https://vercel.com/ with desktop viewport</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Resize browser to mobile width (375px)</li>
      <li>Verify navigation menu is accessible</li>
      <li>Verify all buttons and links remain clickable</li>
      <li>Scroll through entire page and check text readability</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Layout adapts correctly to mobile width, all interactive elements remain functional and readable</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">Verify all main navigation buttons are accessible</span>
    </div>
    <div class="bug-card-badges">
      <span class="badge badge-new">ux</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 https://vercel.com/</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Use Tab key to navigate to each top-level navigation button</li>
      <li>Verify each button has visible focus indicator</li>
      <li>Verify each button is keyboard-clickable with Enter key</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">All navigation buttons (Products, Resources, Solutions, Ask AI) respond to keyboard navigation and clicks</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">Verify empty state handling when no search results found</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 is on https://vercel.com/ai-sdk with search dialog open</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Open search dialog using ⌘K</li>
      <li>Type a nonsensical search query: &#39;xyzabc123nonexistent&#39;</li>
      <li>Press Enter</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Search displays an empty state message indicating no results found; UI remains responsive</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-018</span>
      <span class="bug-title">Verify loading state behavior during slow network conditions</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 is on https://vercel.com/ with network throttling enabled (slow 3G)</div>
    <div class="bug-section-label">Steps</div>
    <div class="bug-steps"><ol>
      <li>Click a product link to navigate to a new page</li>
      <li>Observe the page while it is loading</li>
    </ol></div>
    <div class="bug-section-label">Expected Result</div>
    <div class="bug-expected">Loading indicators or skeleton screens appear; page content renders progressively without blocking interaction</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>
