# Fabular Storefront — Runtime-Befund (Sitemap / Karte / API / MCP)

- **Prüfer:** 44up Observatory
- **Gegenstand:** `fabular.pages.dev` — Fresh Haven, fab4minds „fabular." Demo-Storefront
- **Geprüft:** `sitemap.xml` · `/produzenten` · `/api/products|recipes|producers` · `/api/mcp` · Build-Output
- **Datum:** 2026-06-09 · Erweiterung des `2026-06-07`-Schnittstellenreviews
- **Methode:** Sitemap-Crawl + echter Browser-Lauf (Konsole / CSP) + read-only API-Probes. Keine DB-Writes. Beobachtet vs. abgeleitet markiert.
- **Befunde:** 2 kritisch · 2 funktional · 1 strukturell

## Zusammenfassung

Jeder `next build` ist grün — aber an der ausgelieferten Kante zeigen sich fünf
Lücken, die der Build nicht sieht. Dieselbe Klasse wie der `2026-06-07`-Befund:
korrekt im Code-Pfad, falsch an der Schnittstelle. Jede ist klein und exakt
benennbar.

## Befunde

### KRITISCH · K1 — Die Sitemap bewirbt 158 tote URLs
Die öffentliche `/sitemap.xml` listet 2.329 URLs; ~158 (~7 %) antworten mit
`404` — fast alle Produkt-Slugs mit Umlauten/Sonderzeichen (z. B.
`/produkt/leberkäse-300g`), dazu zwei fehlende Rechtsrouten (Widerrufsbelehrung,
Datenschutz). Die Sitemap gibt rohe Slugs aus, die Produktseite macht einen
Exact-Match-Lookup — jeder Umlaut-Slug fällt durch. Setzt den `2026-06-07`-Befund
fort (dort 153 gemessen).

→ **Fix:** Slugs ausgehend URL-encoden und eingehend decoden (eine zentrale
Helper-Funktion); die zwei Rechtsrouten ergänzen oder aus der Sitemap nehmen.

Impact: Suchmaschinen crawlen ~158 beworbene Dead-Links — verschenktes
Crawl-Budget, SEO-Schaden auf dem Produkt-Long-Tail.

### KRITISCH · K2 — Die Produzentenkarte rendert im Browser nicht
`/produzenten` lädt das Welt-Atlas-Topojson von `cdn.jsdelivr.net`, aber die
eigene Content-Security-Policy erlaubt nur `self` + die API — der Browser blockt
den Fetch, die Karte bleibt leer. Im Build unsichtbar (SSR wirft den Fehler
nicht), in jeder echten Browser-Sitzung sichtbar (Konsole zeigt den CSP-Block).

→ **Fix:** Die Topologie selbst hosten (same-origin) — dann bleibt die CSP
strikt; oder die Kartenbibliothek durch eine native SVG-Projektion ersetzen, was
die externe Abhängigkeit ganz entfernt.

Impact: Ein Kern-Feature — die Produzenten-Landkarte — zeigt Besuchern eine
leere Fläche.

### FUNKTIONAL · F1 — Öffentliche API-Edges antworten mit irreführenden 200
Die öffentlichen Endpunkte `/api/products`, `/api/recipes`, `/api/producers`
nehmen `limit`/`offset` ungeprüft: `limit=-1`, `limit=abc`, `offset=-10`,
`limit=100000` liefern alle `200` — mit leeren, falschen oder übergroßen
Ergebnissen statt eines klaren 4xx.

→ **Fix:** Parameter zentral clampen/validieren (Finite-Check, Min/Max-Deckel).
Im echten API-Modus verhindert das zugleich ungedeckelte Backend-Abfragen.

Impact: Agenten und Integratoren bekommen stille Fehlausgaben statt benennbarer
Fehler.

### FUNKTIONAL · F2 — Der MCP-Checkout-Link zeigt auf eine tote Route
Der öffentliche MCP-Endpunkt (`/api/mcp`) gibt Agenten `checkout_url …/checkout`
zurück — `/checkout` ist aber `404`, die Live-Route heißt `/kasse`.

→ **Fix:** Einen `/checkout → /kasse`-Redirect setzen oder die URL im
MCP-Kontrakt korrigieren.

Impact: Ein Agent, der dem MCP-Kontrakt folgt, schickt den Kunden in einen 404
statt zur Kasse.

### STRUKTURELL · S1 — Payload-Druck auf den Kernseiten
Kritische Seiten dekodieren ~1,5–1,7 MB; `/warenkorb` ist mit ~257 KB
First-Load-JS die schwerste Build-Route; der Such-Vorschlag-Endpunkt
(`/api/suggest`) ist der heißeste Pfad. Lokal schnell, aber payload-schwer.

→ **Fix:** Bild-/JS-Last je Kernseite trimmen; den Suggest-Index cachen statt
ihn pro Request neu zu falten.

Impact: Auf mobilen Verbindungen kostet das spürbar Ladezeit.

## Das Richtige im System

Keiner dieser Befunde taucht im `next build` auf; alle fünf zeigen sich erst im
Crawl der eigenen Sitemap und im echten Browser-Lauf. Es sind kleine, exakt
benennbare Fixes — Slug-Encoding, ein same-origin-Asset, ein Parameter-Clamp,
ein Redirect. Das Demo beweist die Decke; der ausgelieferte Rand erreicht sie
noch nicht.

## Quellen — jeder Befund von der öffentlichen Oberfläche reproduzierbar

- **Sitemap:** `/sitemap.xml` (2.329 URLs) · Crawl 158× 404, Umlaut-Slugs + 2 Rechtsrouten
- **Produzentenkarte:** `/produzenten` · Browser-Konsole (CSP-Block `cdn.jsdelivr.net`)
- **API-Edges:** `/api/products?limit=-1|abc|100000` · `/api/recipes` · `/api/producers`
- **MCP-Kontrakt:** `/api/mcp` · `checkout_url` → `/checkout` (404) vs. `/kasse` (200)
- **Payload:** Build-Output First-Load-JS · Browser-Decoded-Resources je Kernseite
- **Kontext:** `2026-06-07` Schnittstellenreview (Social / SEO / GEO)
