<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url><loc>https://www.totalshowdown.com/</loc><changefreq>daily</changefreq><priority>1.0</priority></url>
  <url><loc>https://www.totalshowdown.com/tournaments</loc><changefreq>daily</changefreq><priority>0.9</priority></url>
  <!-- 🔴 SP-4 (2026-08-11) · THE PLAYER DIRECTORY HUB WAS IN NO SITEMAP AT ALL.
       functions/v1/sitemap?type=players publishes 383 CHILD urls (/players/:id)
       and never published their parent, and this static file did not list it
       either — so the one page that links to all of them, with its A–Z buckets
       (`/players?letter=A`, real <Link>s, see components/profile/PlayerDirectory)
       and its CollectionPage + ItemList structured data, was undiscoverable
       except by guessing the URL. Every player page depended on the sitemap
       alone for discovery. Verified public: `/players` renders PlayerDirectory
       for a signed-out visitor (ProfileScreen.tsx:735) and emits index,follow
       unless its own read failed. -->
  <url><loc>https://www.totalshowdown.com/players</loc><changefreq>daily</changefreq><priority>0.9</priority></url>
  <url><loc>https://www.totalshowdown.com/eleague</loc><changefreq>daily</changefreq><priority>0.8</priority></url>
  <!-- Streamers League stopped being a redirect onto /eleague on 2026-08-11 and
       became its own page (64 individual creators, a different product from the
       /eleague clan pipeline). It has its own <SEO> and had no sitemap entry. -->
  <url><loc>https://www.totalshowdown.com/streamers-league</loc><changefreq>weekly</changefreq><priority>0.7</priority></url>
  <!-- SP-2 · SWITCHED-OFF SYSTEMS ARE NOT ADVERTISED.
       SiteModeGate serves a `noindex` SystemLockedScreen for every route in a
       hidden system. Submitting a URL whose own <meta robots> says "do not
       index" is counted against the whole site. This file is STATIC and cannot
       read site_mode, so a hidden hub is parked in a comment rather than
       deleted: un-comment it the moment its system is unhidden. (The
       per-entity children — /clans/:id etc. — are handled automatically by the
       edge function, which DOES read site_mode.)

       ⚠️ RE-DERIVED 2026-08-25. The list this block named was two systems out
       of date, in both directions — the drift a static mirror of a live
       setting always eventually has. Measured value today:
         hidden_systems = ["store","messages","rankings","match_center"]
       so CLANS came back (it is listed again below, and the edge function is
       already publishing its 35 child pages — a parent that stays commented
       out leaves them in the /players SP-4 situation, discoverable only by
       guessing), and MATCH_CENTER went dark (moved into this comment). Check
       the live row before trusting this list again. -->
  <url><loc>https://www.totalshowdown.com/clans</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
  <!-- hidden systems — restore each line when its system leaves hidden_systems
  <url><loc>https://www.totalshowdown.com/rankings</loc><changefreq>daily</changefreq><priority>0.7</priority></url>
  <url><loc>https://www.totalshowdown.com/match-center</loc><changefreq>daily</changefreq><priority>0.7</priority></url>
  -->
  <url><loc>https://www.totalshowdown.com/giveaway</loc><changefreq>weekly</changefreq><priority>0.7</priority></url>
  <url><loc>https://www.totalshowdown.com/explore</loc><changefreq>daily</changefreq><priority>0.6</priority></url>
  <url><loc>https://www.totalshowdown.com/news</loc><changefreq>daily</changefreq><priority>0.6</priority></url>
  <!-- The EDITORIAL profile hub. Its children (/legends/:slug) are published by
       functions/v1/sitemap?type=legends; this line is the hub itself, exactly
       like /players above. High priority on purpose: these pages exist to answer
       a search for a person's NAME, which is the query the owner asked for.

       ⚠️ PARKED 2026-08-25: `legacy_profiles` has ZERO rows (checked, not
       assumed — the edge child correctly returns an empty urlset), so /legends
       is an empty directory today. This file's own rule for /federations — "a
       directory of nothing is thin content. Add it with the first federation,
       not before." — applies identically here. Un-comment with the first
       published legend.
  <url><loc>https://www.totalshowdown.com/legends</loc><changefreq>weekly</changefreq><priority>0.8</priority></url>
  -->
  <url><loc>https://www.totalshowdown.com/seasons</loc><changefreq>weekly</changefreq><priority>0.6</priority></url>
  <url><loc>https://www.totalshowdown.com/hall-of-fame</loc><changefreq>weekly</changefreq><priority>0.6</priority></url>
  <!-- /about (2026-08-25) — the founding story + manifesto. A cornerstone brand
       page a stranger genuinely searches by NAME ("what is Total Showdown",
       "Total Showdown about"), so it earns a higher priority than a utility page
       like /how-it-works. Static content, rarely changes → monthly. Public, no
       gate, writes its own <SEO> (AboutPage JSON-LD tied to the canonical
       WebSite node — deliberately NOT a second Organization block). -->
  <url><loc>https://www.totalshowdown.com/about</loc><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://www.totalshowdown.com/how-it-works</loc><changefreq>monthly</changefreq><priority>0.6</priority></url>
  <!-- /services (2026-08-11) — the platform's COMMERCIAL page: OBS stream
       production for eFootball and website builds, $30/hour, business@ for
       partnerships. Priority 0.7 rather than 0.5: it is the only page whose
       whole purpose is to be found by a stranger searching for the service,
       and it carries Service structured data with the real price. Public, no
       PageGate, and linked from /support so it is reachable by a human rather
       than only listed here. -->
  <url><loc>https://www.totalshowdown.com/services</loc><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://www.totalshowdown.com/rules</loc><changefreq>monthly</changefreq><priority>0.5</priority></url>
  <url><loc>https://www.totalshowdown.com/league</loc><changefreq>daily</changefreq><priority>0.6</priority></url>
  <url><loc>https://www.totalshowdown.com/community</loc><changefreq>weekly</changefreq><priority>0.5</priority></url>
  <url><loc>https://www.totalshowdown.com/awards</loc><changefreq>weekly</changefreq><priority>0.5</priority></url>
  <!-- hidden system (see the SP-2 note above) — restore when "store" leaves hidden_systems
  <url><loc>https://www.totalshowdown.com/store</loc><changefreq>weekly</changefreq><priority>0.5</priority></url>
  -->
  <!-- SP-1 · the public match RECORD corpus (/match/:id — 1,572 URLs when the
       eligibility query was re-run on 2026-08-11, up from the 1,567 measured
       when this comment was written) is generated by
       functions/v1/sitemap?type=matches, which robots.txt already points
       crawlers at. Nothing per-match belongs in this static file.
       As of 2026-08-11 those pages are also LINKED, not just listed: a
       completed row in /match-center points at /match/:id, and each record
       lists its siblings. Before that, `grep` over all of src/ found exactly
       one reference to a /match/ URL and it was in a test. -->
  <url><loc>https://www.totalshowdown.com/calendar</loc><changefreq>daily</changefreq><priority>0.5</priority></url>
  <url><loc>https://www.totalshowdown.com/scrims</loc><changefreq>weekly</changefreq><priority>0.4</priority></url>
  <url><loc>https://www.totalshowdown.com/titles</loc><changefreq>monthly</changefreq><priority>0.4</priority></url>
  <!-- NOT LISTED, on purpose, and checked rather than assumed:
       · /support — reads as PUB in docs/VISUAL_QA_ROUTES.md, but
         SupportCenter.tsx renders a "Sign in to contact support" wall for a
         signed-out visitor. Submitting a sign-in wall is submitting nothing.
       · /federations — the page is real and public, but `federations` has 0
         rows; a directory of nothing is thin content. Add it with the first
         federation, not before.
       · /awards, /hall-of-fame — LISTED above and genuinely empty today
         (season_awards = 0). Whether an empty entity page should be noindex
         until it has content is an OWNER DECISION; it is raised, not taken. -->

  <!-- /apply/streamer-league-s2 (2026-08-18) — the Season 2 creator intake,
       the first form built on the owner-defined forms engine
       (application_forms). Listed because it is the one page a streamer might
       genuinely find by SEARCHING rather than by following us; weekly because
       an application window is short-lived.

       ⚠️ THIS IS A SNAPSHOT OF A DYNAMIC SET, and it is the honest limitation
       of a hand-maintained sitemap: forms are rows, so the owner can create
       /apply/anything from Control Centre → Forms and it will NOT appear here.
       The page itself is self-canonical and carries `noindex` whenever the form
       is not open (ApplyForm.tsx), so a closed or renamed form de-indexes
       itself and this line goes stale in the safe direction — it never
       submits a URL that would rank a dead form. Enumerating open forms into
       the sitemap edge function is the real fix and is filed as a followup. -->
  <url><loc>https://www.totalshowdown.com/apply/streamer-league-s2</loc><changefreq>weekly</changefreq><priority>0.6</priority></url>
  <url><loc>https://www.totalshowdown.com/sponsors</loc><changefreq>monthly</changefreq><priority>0.5</priority></url>
  <url><loc>https://www.totalshowdown.com/vod</loc><changefreq>weekly</changefreq><priority>0.5</priority></url>
  <url><loc>https://www.totalshowdown.com/fan-hub</loc><changefreq>weekly</changefreq><priority>0.5</priority></url>
  <url><loc>https://www.totalshowdown.com/download</loc><changefreq>monthly</changefreq><priority>0.5</priority></url>
  <url><loc>https://www.totalshowdown.com/privacy</loc><changefreq>yearly</changefreq><priority>0.3</priority></url>
  <url><loc>https://www.totalshowdown.com/terms</loc><changefreq>yearly</changefreq><priority>0.3</priority></url>
</urlset>
