<?xml version="1.0" encoding="UTF-8"?>
<!--
  THE REPORT ENTRIES ARE GENERATED — do not add or remove them by hand.
    node backend/scripts/derive-sitemap-reports.js  (with the write flag)
  ⚠ the flag is spelled out rather than written, because a double hyphen is illegal
    inside an XML comment and pasting it here makes this file unparseable.
  The twelve static routes and this header are NOT generated and are preserved verbatim.

  REBUILT BY HAND 2026-08-26, and correct that day. By 2026-09-06 it listed 9 report URLs
  while 13 reports satisfied the rule stated below: four showcases became indexable
  afterwards and nothing added them, because nothing could — a hand-maintained derived list
  has no deriver, so it cannot be re-derived and nothing makes it move. The rule never
  changed; only its output had aged.

  ⛔ THE RULE FOR REPORTS, AND IT IS TWO CONDITIONS, NOT ONE.
  A report is listed here only where BOTH `is_public_showcase = true` AND
  `is_search_indexable = true`. The first is the privacy gate. The second is what the
  page itself says: report/[reportId]/layout.tsx computes `indexable = showcase &&
  is_search_indexable`, so a showcase with the second bit false serves `noindex`.
  LISTING A NOINDEX PAGE IN A SITEMAP ASKS A CRAWLER TO FETCH SOMETHING AND THEN TELLS
  IT TO FORGET WHAT IT FETCHED. That contradiction is the defect this rebuild removes.
  ⛔ AND "PROMOTED" HAS TWO SURFACES THAT DO NOT AGREE. lib/showcase-lens.ts SAMPLES (the
  /site-intelligence/sample?type= redirect table) carries 11 reports; the /samples gallery
  carries 12; they share only 6, and the union is 17. A first cut of this rebuild used the
  GALLERY ALONE as the promotion population and dropped KRAYN-2026-454350, -581382, -758924
  and -ac5ec9fb324e4beb — four reports that are showcase AND indexable AND publicly reachable
  through the redirect table, three of which had been listed here for months. They are
  restored above. ⚖ A DECLARED SET IS A HYPOTHESIS ABOUT THE SERVED SET, and picking one of
  two promotion tables is how a census misses a third of its population.

  MEASURED 2026-08-26: 23 reports carry is_public_showcase; 15 of those are also
  search-indexable; 17 are promoted on one surface or the other; 10 satisfy all three and are
  listed here. The other 7 promoted reports are showcases with is_search_indexable = FALSE —
  including KRAYN-2026-d994f6b94935bb81 (Werrington), the `nsw` flagship of the redirect
  table. It is absent from this file BECAUSE ITS OWN INDEXABLE BIT IS FALSE, not by oversight.
  Whether that bit is correct for a flagship is a decision, and it is not this file's.

  ⛔ KRAYN-2026-421065 REMOVED. It was `is_public_showcase = false` and
  `is_search_indexable = false`, and it had been listed here since 2026-05-29 05:39 UTC
  (commit 4b8a21e1) — 89 days. It was added ~3 hours after that report was generated,
  as the then-current sample, and was never removed when the VIC trio replaced it on
  2026-06-06 (3c804be3).
  ⚑ WHAT WAS AND WAS NOT EXPOSED, MEASURED RATHER THAN ASSUMED: the page served
  `noindex, nofollow`, its og:title carried no address, and the teaser redaction had
  already coarsened the locator — an anonymous fetch returned "Yarra Junction VIC 3797,
  Australia" and 2-dp coordinates, never the street address. THE FULL ADDRESS WAS NOT
  DISCLOSED. What was wrong is narrower and still wrong: a private report was advertised
  to crawlers in the estate's own index for three months.

  ⛔ FOURTEEN DEAD ROUTES REMOVED. /demo /transport /transport-intel /for-contractors
  /rfq /rfq/create /enterprise /government /supplier/register /blog /guides /how-to
  /tutorials /resources — every one has NO page directory and every one 307s to
  /site-intelligence. They returned 200 through the edge, which is exactly why they
  survived: with a catch-all redirect a removed page and a live page are the same status
  code. Submitting fourteen URLs that all resolve to one page is a duplicate-content
  signal pointed at the hub it redirects to.
  ⚠ /pricing /about /how-it-works /faq /help also removed — they are ALIASES that 307 to
  /site-intelligence/pricing, /about, the hub, /faq and /contact, all of which are listed
  here directly. An alias beside its target is the same page submitted twice.
  ⚠ /login and /auth/register removed on this file's own existing rule: an app route is
  not a search landing page. That is the same reason /site-intelligence/generate has
  never been listed.

  ADDED: /site-intelligence/methodology and /site-intelligence/coverage. Both serve 200
  and self-canonical, verified 2026-08-26.
  WITHDRAWN 2026-08-27 (A3): /site-intelligence/coverage. It is noindex while its link is
  withdrawn from what-we-check — the matrix and individual reports disagree about three
  layers and which is wrong is undecided. A sitemap entry at priority 0.8 with index,follow
  IS a link; withdrawing from browse while inviting crawlers withdrew it from nobody. The
  URL stays reachable and returns 200. Restore this line and the layout's robots block
  together. 23 URLs -> 22.
-->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">

  <!-- Core -->
  <url><loc>https://krayn.au/</loc><lastmod>2026-08-26</lastmod><changefreq>daily</changefreq><priority>1.0</priority></url>

  <!-- Site Intelligence — the product -->
  <url><loc>https://krayn.au/site-intelligence</loc><lastmod>2026-08-26</lastmod><changefreq>weekly</changefreq><priority>0.9</priority></url>
  <url><loc>https://krayn.au/site-intelligence/what-we-check</loc><lastmod>2026-08-26</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url>
  <url><loc>https://krayn.au/site-intelligence/methodology</loc><lastmod>2026-08-26</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url>
  <url><loc>https://krayn.au/site-intelligence/how-it-works</loc><lastmod>2026-08-26</lastmod><changefreq>monthly</changefreq><priority>0.8</priority></url>
  <url><loc>https://krayn.au/site-intelligence/pricing</loc><lastmod>2026-08-26</lastmod><changefreq>monthly</changefreq><priority>0.8</priority></url>
  <url><loc>https://krayn.au/site-intelligence/samples</loc><lastmod>2026-08-26</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url>
  <url><loc>https://krayn.au/site-intelligence/faq</loc><lastmod>2026-08-26</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/site-intelligence/about</loc><lastmod>2026-08-26</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>

  <!-- Sample reports — showcase AND search-indexable. Both bits, every time. -->
  <url><loc>https://krayn.au/report/KRAYN-2026-183757</loc><lastmod>2026-09-05</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/report/KRAYN-2026-220563</loc><lastmod>2026-09-05</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/report/KRAYN-2026-369741</loc><lastmod>2026-09-05</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/report/KRAYN-2026-454350</loc><lastmod>2026-09-05</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/report/KRAYN-2026-581382</loc><lastmod>2026-09-05</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/report/KRAYN-2026-758924</loc><lastmod>2026-07-27</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/report/KRAYN-2026-829329</loc><lastmod>2026-08-12</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/report/KRAYN-2026-912640</loc><lastmod>2026-09-05</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/report/KRAYN-2026-946702</loc><lastmod>2026-09-05</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/report/KRAYN-2026-948278</loc><lastmod>2026-09-05</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/report/KRAYN-2026-ac02e45d1b196d42</loc><lastmod>2026-09-05</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/report/KRAYN-2026-ac5ec9fb324e4beb</loc><lastmod>2026-09-05</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>
  <url><loc>https://krayn.au/report/KRAYN-2026-f7d59e752ad37fb9</loc><lastmod>2026-09-05</lastmod><changefreq>monthly</changefreq><priority>0.7</priority></url>

  <!-- Legal / contact -->
  <url><loc>https://krayn.au/contact</loc><lastmod>2026-08-26</lastmod><changefreq>monthly</changefreq><priority>0.6</priority></url>
  <url><loc>https://krayn.au/terms</loc><lastmod>2026-08-26</lastmod><changefreq>yearly</changefreq><priority>0.4</priority></url>
  <url><loc>https://krayn.au/privacy</loc><lastmod>2026-08-26</lastmod><changefreq>yearly</changefreq><priority>0.4</priority></url>

</urlset>
