<?xml version="1.0" encoding="UTF-8"?>
<!-- ⚠️ List CANONICAL, 200-returning urls ONLY. Cloudflare Pages 308s /foo.html -> /foo, so the
     .html forms are REDIRECTS and must never appear here (a sitemap of redirects is a documented
     error). Declaring /terms.html is exactly how Google ended up indexing BOTH /terms and
     /terms.html as separate pages. The .html urls stay working via the 308 for the external
     references (Chrome Web Store listing, Stripe checkout) — they just aren't canonical. See #667.
     ⚠️ No hand-written lastmod dates here: deploy.sh §1a stamps them into the STAGED copy from
     each page's git commit date. A hand-added date would go stale and teach Google to distrust
     it — and a literal lastmod TAG in this comment would break §1a's stamped-count assertion. -->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://jobshifu.com/</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <!-- Tier-A content pages. These carry the long-tail question queries the
       one-pager cannot: one page can only win one query. -->
  <url>
    <loc>https://jobshifu.com/calibration</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/autofill</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <!-- /fresh is the Tier-A page for the fresh / employer-direct / "is this posting real"
       cluster (docs/marketing-fresh-jobs-direction.md). Unlike /tailoring it has no organic
       sibling, so it is indexed and doubles as the future Campaign E landing page. -->
  <url>
    <loc>https://jobshifu.com/fresh</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/is-this-job-still-open</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/resume-tailoring</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <!-- ⚠️ /tailoring (LP-B) is deliberately ABSENT. It is a paid-ad landing page for Google
       Search Campaign B and argues the same query cluster as /resume-tailoring, so it ships
       `noindex, follow` rather than competing with the Tier-A page for one query. /ats-truth
       below is the opposite case: it is the flagship Tier-A asset of that build and is meant
       to keep earning after the ad spend stops. -->
  <url>
    <loc>https://jobshifu.com/ats-truth</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/fit-score</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/cover-letters</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/interview-prep</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/job-tracker</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/visa-sponsorship</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/extension</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <!-- Comparison pages (blog program Play A). Prices on them rot: each carries an
       "as of" date in copy and gets a quarterly re-verify. -->
  <url>
    <loc>https://jobshifu.com/jobshifu-vs-jobright</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/faq</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/pricing</loc>
    <lastmod>2026-08-16</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/privacy</loc>
    <lastmod>2026-08-06</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/terms</loc>
    <lastmod>2026-08-05</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>
  <!-- ⚠️ /bot is deliberately ABSENT, removed 2026-08-07. It is the crawler-information
       page for JobShifuBot, and its audience is a webmaster reading their own access log —
       who arrives via the `+https://jobshifu.com/bot` in FEED_UA (packages/crawler-providers/
       src/util.ts), not via a search result. Listing it here made it a sitemap-only ORPHAN:
       255 words, zero inbound links from any page on the site, which is precisely the shape
       Google leaves in "Discovered - currently not indexed" forever (it sat there from
       2026-08-05). The page stays live and crawlable — robots.txt still allows it and it
       still 200s; it just stops asking for index budget it was never going to win.
       ⛔ Do not "fix" the GSC report by re-adding it. Re-adding recreates the orphan.
       ⚠️ Removing a url is safe for deploy.sh §1a only because its count assertion is
       DERIVED by grepping this file, not hardcoded. Verified by replaying §1a against
       this file: stamped=16 prestamped=5 locs=21 mods=21, assertion passes.
       ⛔ THE COMMENT ITSELF IS PARSED. §1a counts loc and lastmod tags with grep, which
       does not know what a comment is — so spelling either tag literally in prose here
       ABORTS EVERY DEPLOY. The existing warning at the top of this file says that about
       lastmod; it is equally true of loc, and this comment tripped exactly that while
       being written (a loc tag quoted inside a code span pushed the count 21 -> 22 and
       §1a aborted). Describe the tags in words; never spell them. -->
  <!-- ⚠️ /admin is likewise absent and must stay absent: it is held out of the index by
       X-Robots-Tag + a meta robots tag (see robots.txt), which a sitemap entry would fight. -->
  <!-- BEGIN blog (generated by scripts/build-blog.mjs: do not hand-edit) -->
  <url>
    <loc>https://jobshifu.com/blog</loc>
    <lastmod>2026-08-13</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.7</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/blog/we-analyzed-500000-job-descriptions</loc>
    <lastmod>2026-08-13</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/blog/h1b-sponsors-hiring-now</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/blog/is-jobshifu-legit</loc>
    <lastmod>2026-08-04</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/blog/is-jobshifu-worth-it</loc>
    <lastmod>2026-08-04</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <url>
    <loc>https://jobshifu.com/blog/first-48-hours</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.6</priority>
  </url>
  <!-- END blog -->
</urlset>
