Die Steckernorm veröffentlicht, prüfbar, verkehrt herum unmöglich
Ein Schukostecker taugt wegen dreier Eigenschaften: Die Form ist veröffentlicht, die Passform ist prüfbar, und falsch herum passt er nicht hinein. Wer eine Lampe baut, muss den Kraftwerksbetreiber nicht kennen. Genau das ist hier verlangt — ein Standard, den nur unser eigener Code prüfen kann, ist keiner.
→ Musterblatt — jedes Bauteil einmal in echt, mit umschaltbarer Tiefe.
-
Regelwerk · 8
data/regelwerke/_schema.json— alle passen -
Gebiet · 2
data/gebiete/_schema.json— alle passen -
Aktivität · 1
data/_schema-aktivitaeten.json— alle passen -
Geoquelle · 1
data/_schema-geoquellen.json— alle passen -
Tour · 31
touren/_schema.json— alle passen
bedingung im Regelwerk. Ein Schlüssel, den niemand liest, lässt die Kategorie jede Tour zählen — deshalb gilt dort additionalProperties: false, und erfuellt() wirft zusätzlich zur Laufzeit.Der Riegel was hier durchfällt, kommt nicht in den Hauptzweig
-
Einheit · 140
Rechnet der Kern richtig? Zuordnung, Bedingungen, Fünfjahresfenster — die eine Rechnung, an der die Bewerbung hängt. -
Vertrag · 24
Greift die Prüfung überhaupt? Jeder Datensatz gegen seinen Vertrag, dazu absichtlich falsch gebaute Stecker, die abgewiesen werden müssen. -
Durchlauf · 32
Entsteht das Kartenwerk vollständig? Alle Blätter, alle Verweise, alle Bilder — und der Bau ohne die privaten Messdaten.
- Steckerprüfung — passen alle Daten auf ihren Vertrag?
- Einheitstests — rechnet der Kern richtig?
- Vertragstests — greift die Prüfung überhaupt?
- Oberfläche — hält das Kartenwerk WCAG 2.1 AA?
- Durchlauf — entsteht das Kartenwerk vollständig?
- Prüfdaten — ist ein Regelwerk überfällig?
Der Aufbau 27 Skripte, 12 geteilte Bausteine
Acht Regelwerke, vier grundverschiedene Nachweislogiken — ein Auswertungsskript ohne Sonderfälle. Der VDBS zählt Touren in vier Kategorien, die UIMLA zählt Tage, die Steiermark zählt nach Höhenmetern ohne Zeitlimit, und vier Bundesländer verlangen gar keinen Nachweis. Keine dieser Unterschiede steht im Code.
Jedes Regelwerk trägt quelle und geprueft_am. Ein wöchentlicher Wächter prüft die fälligen Quellen und öffnet bei Abweichung einen Pull Request mit Zitat und Fundstelle. Ein falsches Regelwerk ist schlimmer als gar keins.
Höhenmeter, Distanz, Herzfrequenz kommen über strava_id aus der Aktivitätsdatenbank. Von Hand gepflegt wird nur, was keine Uhr messen kann: Schwierigkeitsgrad, Begleitung, Verhältnisse, Bewertung.
Diese Blätter entstehen aus denselben Skripten wie die Konsolenausgaben — nicht aus einer zweiten Quelle. Sonst driftet beides auseinander und das Web erzählt Märchen. Der Durchlauf prüft es: Der Quotenstand auf Blatt 1 muss dem entsprechen, was stand.mjs --json ausgibt.
Was noch keinen Vertrag hat ehrlich benannt
Damit niemand mehr Ordnung vermutet, als da ist:
-
Der Modulschnitt
Die Datenverträge stehen, die Codegrenzen nicht: 20 von 27 Skripten exportieren nichts und sind einzeln nicht prüfbar. Geteilt wird über die 12 Bausteine inscripts/lib/. -
Die Höhenverläufe
Die Streams hängen am Endpunkt der Schwesteranwendung und haben keinen eigenen Vertrag. -
Der Verbandsimport
Ein Verband, der sein Regelwerk selbst pflegen will, braucht mehr als ein Schema — eine Einreichung, eine Prüfung, eine Signatur. Heute geht das über einen Pull Request, und das ist für einen Verband keine Antwort.
Was die Norm bereits gefunden hat beim ersten Lauf
Das Schema schrieb für den Mindest-Schwierigkeitsgrad die Form "T3" vor. Der Code verglich numerisch, und 5 >= "T3" ist in JavaScript false. Ein Regelwerk, exakt nach unserem eigenen Standard geschrieben, hätte für jede Kategorie mit Schwierigkeitsgrad null Touren gezählt — lautlos, bis zur Ablehnung.
Genau dieses Blatt stand im Blattspiegel und wurde nirgends geschrieben. Es lebte als Überbleibsel eines früheren Laufs im nicht versionierten Ausgabeverzeichnis. Jeder Bau nach einem frischen Klon stürzte ab — auf dem Entwicklungsrechner fiel es nie auf, weil dort die alte Datei noch lag.
Das Ausgabeformular stand fest im Code — ein zweiter Verband hätte einen zweiten Zweig gebraucht. Die Messwerte kamen aus einer bestimmten fremden Datenbank, die sonst niemand hat. Höhenkacheln und Wegenetz hingen an je einer Adresse tief in einem Skript. Alle drei sind jetzt Verträge; heute gehen drei Verbände mit drei Formularen durch dasselbe Ausgabeskript, ohne dass es einen davon beim Namen nennt.
erfuellt() übergab einen unbekannten Schlüssel stillschweigend. Die Kategorie hätte jede Tour gezählt, und der Quotenstand hätte Fortschritt gemeldet, den es nicht gibt.