<?xml version="1.0" encoding="UTF-8"?>
<!--
  Sitemap fuer Neural Perfection — listet alle indexierbaren URLs.
  DE-only Launch (2026-05): keine hreflang-Annotationen (Sprach-Switch ist
  via FEATURES.langSwitchEnabled deaktiviert). Wenn EN reaktiviert wird,
  die <xhtml:link rel="alternate" hreflang=...> Tags wieder hinzufuegen.
  Private/personalisierte Pages (Drill-Sessions, Billing, Lobby-mit-Code) sind
  via meta robots noindex gegated und werden hier NICHT gelistet.
-->
<!--
  lastmod = Datum der letzten Aenderung an der AUSLIEFERUNG, nicht das
  Datum des Deploys und schon gar nicht „heute".

  Wer hier auf das Tagesdatum stellt, ohne dass sich etwas geaendert hat,
  verbrennt ein Vertrauenssignal: Google gewichtet lastmod danach, ob es
  sich als verlaesslich erwiesen hat.

  Stand 2026-09-29 (Auftrag A-031). Bis dahin stand hier ueberall der
  2026-08-30 — einen Monat und rund tausend Commits alt, nach einem
  Release, der die ausgelieferten Seiten sichtbar veraendert hat. Ein zu
  altes Datum bremst genau die Neuindexierung, die so ein Release
  verdient.

  DIE DATEN SIND NICHT MEHR EINHEITLICH, und das ist der Unterschied zur
  vorigen Fassung. Sie begruendete ein gemeinsames Datum damit, dass alle
  Adressen durch denselben Vorrenderer laufen. Das gilt weiterhin als
  UNTERGRENZE, aber zwei Seiten sind danach noch einzeln angefasst worden.

  Gemessen je Pfad mit `git log`, jeweils der letzte Commit, Datum kurz.
  (Der Aufruf steht hier ohne seine Schalter, und das ist kein Schlampen:
  ein XML-Kommentar darf keinen doppelten Bindestrich enthalten, ein
  zitierter git-Aufruf bringt gleich zwei mit. Diese Datei war damit beim
  Schreiben kurzzeitig ungueltiges XML — aufgefallen, weil danach geprueft
  wurde, nicht beim Tippen.)

    global, betrifft jede Adresse
      scripts/prerender.mjs     2026-09-25  (eingebettetes CSS)
      src/App.tsx               2026-09-25
      src/index.css             2026-09-22
      index.html                2026-09-21

    zusaetzlich nur /learn
      src/pages/LearnPage.tsx                      2026-09-26
      src/components/tutorial/ModuleTutorialHost.tsx  2026-09-28

    die vier Rechtstexte
      src/legal/                2026-09-21  — also aelter als die globale
                                Aenderung; es gilt der 25.09.

  Daraus: /learn traegt den 2026-09-28, alle uebrigen den 2026-09-25.

  WO ICH UNSICHER WAR, habe ich das FRUEHERE Datum genommen. Ob die
  Modul-Tour (`ModuleTutorialHost`) auch auf /speed-test greift, habe ich
  nicht geprueft — deshalb steht dort der 25.09. und nicht der 28.09. Ein
  zu frueher Wert ist konservativ; ein zu spaeter ist genau die Luege, vor
  der der Absatz darueber warnt.

  Und eine Korrektur am Rand: die vorige Fassung sprach von „acht
  Adressen". Es sind sieben, und `src/lib/routes/oeffentlicheRouten.mjs`
  fuehrt ebenfalls sieben mit `inSitemap: true`. Die achte war
  `/challenge`, seit dem 2026-09-14 auf `inSitemap: false`.
-->
<urlset
  xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
>
  <!-- Hauptlanding: Type Challenge (Welcome + Game).

       Die Wurzel `/` fehlt hier — und die Begruendung, die bis zum
       2026-08-25 an dieser Stelle stand, war der Fehler selbst. Sie lautete
       sinngemaess: die Wurzel sei nicht gelistet, weil sie per React-Router
       auf /type-challenge weiterleite; Google habe das als „Seite mit
       Weiterleitung" und „Alternative Seite mit kanonischem Tag" gemeldet,
       und beides sei aufgeloest, indem nur die kanonische Ziel-Adresse
       gelistet werde.

       Aufgeloest war nichts. Search Console meldet am 2026-08-25 weiterhin
       3 Seiten indexiert und 16 nicht, und `/` steht unveraendert unter
       „Seite mit Weiterleitung", zuletzt gecrawlt am 15.08.2026. Die
       Adresse aus der Sitemap zu nehmen hat den Befund nicht behoben,
       sondern nur aus diesem Dokument entfernt — Google crawlt die Wurzel
       ohnehin.

       Die Ursache ist `src/App.tsx:2613`. Sie wird im Wurzel-Umbau behoben
       (`docs/design/wurzel-umbau.md`); mit Schritt S6 gehoert `/` hier
       hinein. -->
  <!-- Die Wurzel. Seit dem 2026-08-25 eine eigene Seite (Schritt S6 des
       Wurzel-Umbaus) — vorher leitete sie per JavaScript weiter und stand
       deshalb bewusst nicht hier. Hoechste Prioritaet: sie traegt den
       Markenbegriff und bekommt die meisten externen Verweise. -->
  <url>
    <loc>https://neural-perfection.com/</loc>
    <lastmod>2026-09-25</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>

  <!-- Speed Test: SEO-Hub fuer "typing speed test" / "schreibgeschwindigkeit test" -->
  <url>
    <loc>https://neural-perfection.com/speed-test</loc>
    <lastmod>2026-09-25</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <!-- Trainer-Hub: Haupt-Produkt mit 40 Lektionen + KI-Bewegungsanalyse -->
  <url>
    <loc>https://neural-perfection.com/learn</loc>
    <lastmod>2026-09-28</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>

  <!-- Compete (/challenge) ist am 2026-08-31 aus der Sitemap genommen.

       CEO: "ich moechte compete erst spaeter wieder aufbauen, wenn die
       ganzen Pro-Features stehen, als zweites Projekt."

       Die Adresse bleibt ERREICHBAR — sie wird nur nicht mehr beworben.
       Kein Redirect, keine Fehlerseite: alte Lesezeichen funktionieren
       weiter, Google laesst die Seite mit der Zeit fallen.

       Die Wahrheit dazu steht in src/lib/routes/oeffentlicheRouten.mjs
       (inSitemap: false, vorrendern: false). Diese Datei ist nur die
       Ausspielung davon; wer hier etwas aendert, aendert es dort zuerst. -->

  <!-- /pricing und /play sind hier NICHT gelistet.

       2026-08-22 (SEO-Audit): entfernt, weil beide Routen bei
       proSubscription: false sofort auf / weiterleiten und damit den Inhalt
       der Startseite unter eigener Adresse lieferten. Wieder aufnehmen,
       sobald Pro live ist.

       2026-08-25: An dieser Stelle standen zwei ineinander verschachtelte
       Kommentare — der zweite begann, bevor der erste geschlossen war. XML
       kennt keine Verschachtelung und verbietet zwei Bindestriche innerhalb
       eines Kommentars; ein strenger Parser bricht hier ab. Folgenlos war
       das nur, weil alle vier Eintraege davorstehen. Der naechste Eintrag
       waere unsichtbar gewesen. -->
  <!-- Rechtstexte, seit 2026-08-25 unter eigener Adresse.

       Bis dahin lagen Impressum, Datenschutz und AGB ausschliesslich hinter
       Schaltflaechen, die eine Raute setzten — kein einziges <a href>, keine
       eigene Adresse. Sie stehen hier mit niedriger Prioritaet: sie sollen
       auffindbar sein, aber keine Suchanfrage tragen. -->
  <url>
    <loc>https://neural-perfection.com/impressum</loc>
    <lastmod>2026-09-25</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>

  <url>
    <loc>https://neural-perfection.com/datenschutz</loc>
    <lastmod>2026-09-25</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>

  <url>
    <loc>https://neural-perfection.com/agb</loc>
    <lastmod>2026-09-25</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>

  <!-- Widerrufsbelehrung, seit 2026-08-27 unter eigener Adresse. Der Text lag
       seit jeher als Datei im Repo und war nirgends erreichbar; die AGB
       verwiesen in §8 auf einen Anker, den das Rauten-Routing nicht kannte. -->
  <url>
    <loc>https://neural-perfection.com/widerruf</loc>
    <lastmod>2026-09-25</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>

</urlset>
