<?xml version="1.0" encoding="UTF-8"?>
<!--
  ⚠ THIS FILE IS HAND-MAINTAINED AND HAS GONE STALE BEFORE. It is now CHECKED
  rather than trusted: `npm run check:seo` (scripts/check-seo.mjs) reads the alias
  list in app/pages/index.vue, REAL_PATHS in app/composables/useNotFound.js and
  CASE_PATHS in frogStudies.js, and fails if any of them disagree with the URLs
  below. Run it before a deploy; it takes milliseconds and it is the only reason
  this file can be believed.

  The history is worth keeping, because the failure was subtle. On 27 Aug the
  awards wall moved from /about to /awards and this file was not touched, so it
  went on advertising /about as the awards page. Then /about became the About page
  and the entry became accidentally CORRECT while still being unchecked — a wrong
  file that repairs itself by luck, which teaches nobody anything. A comment
  asserting a check is only as good as its date; a script asserting it is good
  every time it runs.

  A generated Nitro route was written for this on 31 Aug 2026 and then withdrawn:
  Nitro serves public/ ahead of server routes, so the generated one could never
  win while this file existed, and this file could not be deleted from the
  session that wrote it. The route is parked in _to_delete/sitemap.xml.get.ts. If
  you delete public/sitemap.xml, move it back to server/routes/ and this file's
  whole class of problem goes away.

  THE SIX CASE STUDIES ARE HERE NOW (31 Aug 2026). They were deliberately absent,
  described as "scene states reached through the work page rather than
  destinations worth crawling separately". That was true of the site as it was:
  the six paths were real and carried SELF-CANONICALS while rendering the
  HOMEPAGE's title, description and body — six URLs each declaring itself the
  canonical version of a page that never mentioned it. Leaving them out of the
  sitemap hid that rather than fixing it. They now carry their own titles,
  descriptions, h1s and server-rendered copy (CASE_HEAD in index.vue), so they are
  six differentiated pages naming six real brands, which is the most indexable
  content this site has.

  NO <lastmod>, DELIBERATELY. The two honest options were a build timestamp, which
  stamps every URL as changed on every deploy and is precisely how a site teaches
  Google to stop trusting the field, or a hand-kept date per route, which is the
  staleness the check above exists to catch. Google ignores a lastmod it does not
  trust and treats absence as neutral, so absent beats wrong.

  <priority> is kept: Google ignores it, Bing reads it as a weak hint, and it
  costs nothing to be right about which URL matters most.

  Each URL below carries its own canonical, title, description, h1 and Open Graph
  block (app/pages/index.vue).
-->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://andrewhillstead.com/</loc>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://andrewhillstead.com/work</loc>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://andrewhillstead.com/about</loc>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://andrewhillstead.com/contact</loc>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://andrewhillstead.com/awards</loc>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://andrewhillstead.com/showreel</loc>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://andrewhillstead.com/work/world-of-wearableart</loc>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://andrewhillstead.com/work/summer-game-fest</loc>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://andrewhillstead.com/work/super-ai</loc>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://andrewhillstead.com/work/blackbird</loc>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://andrewhillstead.com/work/burgerfuel</loc>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://andrewhillstead.com/work/hellboy</loc>
    <priority>0.6</priority>
  </url>
</urlset>
