feat(site): llms.txt als Wegweiser + Charset-Fix für llms.md

Anlass war die Frage, ob `llms.md` ein guter Name ist. Zwei Befunde:

1. Der Zweck der Konvention ist ein anderer, als D43 annahm. llmstxt.org
   über die eigene Datei: „a markdown file that provides brief background
   information and guidance, along with links to markdown files providing
   more detailed information“ — ein Index, kein Inhalt. Der 211-Zeilen-
   Leitfaden ist genau eine jener verlinkten Dateien; `llms.md` ist damit
   der richtige Name, es fehlte der Wegweiser davor.

2. `llms.md` kam auf der stabilen Instanz falsch kodiert an: Apache kennt
   `.md` nicht und sendet GAR KEINEN Content-Type, der Browser rät
   windows-1252. Gemessen: characterSet=windows-1252, aus „notation —
   guide“ wurde „notation â€" guide“, 31 Zeilen betroffen. GitHub Pages
   liefert dieselbe Datei korrekt als text/markdown; charset=utf-8 aus.

- frontend/public/llms.txt: Index nach der Konvention (Titel, Blockquote,
  Notation in Kurzform, ## Docs, ## Optional). Rein ASCII — er ist die
  Datei, die ein fremder Agent ungefragt abruft, und soll auch dort
  ankommen, wo ein Server die Kodierung verschweigt. Alle 5 Links: 200.
- scripts/prod.htaccess: AddType für .md/.txt/.werkbaum, von
  deploy-prod.sh als .htaccess gespiegelt. Nicht in public/ — dort landete
  es wirkungslos im Pages-Artefakt. Rückweg bei 500 steht in der Datei.
- Beide Deploy-Wege kopieren llms.txt mit.

SPEC §13 + D43-Nachtrag 2 (mit Richtigstellung der D43-Annahme);
Plan: #not.llms.index [x]. 243 Tests grün, Plan 157 Knoten, 0 Warnungen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-24 11:01:51 +02:00
co-authored by Claude Opus 5
parent cb966e4e20
commit 48d3174684
7 changed files with 137 additions and 3 deletions
+7
View File
@@ -134,6 +134,13 @@ sed "${SED_ARGS[@]}" frontend/dist/index.html > "$STAGE/index.html"
cp LICENSE "$STAGE/LICENSE"
# Agenten-Fassung der Notation (D43) — liegt per Vite-public/ in dist/
cp frontend/dist/llms.md "$STAGE/llms.md"
# Der Wegweiser der llms.txt-Konvention (D43-Nachtrag 2): kurzer Index, der auf
# llms.md, SPEC und Repo zeigt. Nur er liegt an der Adresse, die Agenten von
# selbst probieren.
cp frontend/dist/llms.txt "$STAGE/llms.txt"
# Ohne diese Zuordnung liefert Apache `.md` ohne Content-Type aus und der
# Browser rät windows-1252 (D43-Nachtrag 2). Pages braucht sie nicht.
cp scripts/prod.htaccess "$STAGE/.htaccess"
# ---- 3) Spiegeln (--delete: nichts Altes bleibt am Ziel) ----
# --chmod=D755,F644 erzwingt web-taugliche Rechte am Ziel, unabhängig von den
+23
View File
@@ -0,0 +1,23 @@
# Werkbaum — Apache-Konfiguration der produktiven Instanz (D43-Nachtrag 2).
# Wird von scripts/deploy-prod.sh als `.htaccess` in die Site-Wurzel gespiegelt.
# GitHub Pages ignoriert `.htaccess` (kein Apache) und braucht es auch nicht —
# dort ist die Zuordnung schon richtig; die Datei liegt deshalb NICHT in
# frontend/public/, sonst landete sie im Pages-Artefakt.
#
# Warum es sie gibt: Apache kennt die Endung `.md` nicht und sendet dann GAR
# KEINEN Content-Type. Der Browser rät daraufhin windows-1252 und macht aus
# jedem `—` ein `â€"` — gemessen am 24.08.2026 auf werkbaum.javagil.de, 31
# betroffene Zeilen in llms.md. Dieselbe Datei kommt von GitHub Pages als
# `text/markdown; charset=utf-8` korrekt an.
#
# `.werkbaum` bekommt `text/plain` aus dem in SPEC §12/D24 genannten Grund:
# dann zeigt der Browser die Datei an, statt sie herunterzuladen.
#
# Sollte der Server nach einem Deploy 500 antworten, verbietet seine
# `AllowOverride`-Einstellung `AddType` (Klasse FileInfo) — dann gehören die
# drei Zeilen in die vhost-Konfiguration und diese Datei entfällt.
<IfModule mod_mime.c>
AddType text/markdown;charset=utf-8 .md
AddType text/plain;charset=utf-8 .txt
AddType text/plain;charset=utf-8 .werkbaum
</IfModule>