Handbuch › freemapper-courseplan
8. Prüfen: Hinweise lesen, Ausnahmen begründen
check legt jede Einzel- und Score-Bahn neben die Regeln, nach denen die Veranstaltung gelten soll, und sagt dir, was auffällt. Es ändert nichts an der Projektdatei. Du entscheidest, ob du die Bahn änderst oder den Befund als gewollte Ausnahme begründest.
freemapper-courseplan check halle.courseplan.toml
freemapper-courseplan check halle.courseplan.toml --all
Winkel prüft check in beide Richtungen. Spitze Winkel meldet es unter 90° als Hinweis und unter 45° als Warnung. Läuft die Bahn an einem Posten fast geradeaus, also mit einem Winkel über 170° zwischen den Strecken, gibt es einen Hinweis (wkb2026.leg.straight_angle_hint). Der Posten ändert die Laufrichtung dann kaum, und hinter dem Kreis ist kein Platz für die Nummer.
Mannschafts- und Staffelbahnen prüft das Programm noch nicht. Für jede meldet es einmal, dass sie nicht geprüft wurde. Für Score-Bahnen gibt es eigene Regeln (siehe Score-Bahnen unten).
Eine Zeile lesen
Bahn A:
Hinweis Bahn A, Strecke 36–37: Die Strecken am Posten 37 bilden einen Winkel von 85°, gefordert sind mindestens 90° (wkb2026.leg.acute_angle_hint, BL12 5. Bahnkonzeption)
Von links nach rechts steht da:
- die Schwere, hier „Hinweis“,
- der Ort, hier die Strecke von Posten 36 zu Posten 37 auf Bahn A. Eine Strecke heißt nach ihren Enden, etwa „Strecke Start–31“ oder „Strecke 37–Ziel“; Start und Ziel als Ort heißen „Start S1“ und „Ziel F1“,
- der Text mit gemessenem Wert und Grenze,
- in Klammern die Kennung der Prüfregel und die Quelle, aus der die Grenze stammt.
Die Kennung brauchst du, um eine Ausnahme zu begründen. Die Quelle sagt dir, wo du die Regel selbst nachlesen kannst. Innerhalb einer Bahn stehen zuerst die Befunde der ganzen Bahn, dann die der Strecken in Laufrichtung. Am Ende der Ausgabe steht einmal eine Zusammenfassung, im Beispiel „0 Fehler, 0 Warnungen, 1 Hinweis; 0 akzeptiert, 6 übersprungen“.
Schwere und Exit-Code
Das Regelprofil legt für jede Prüfregel fest, wie schwer ein Verstoß wiegt. check selbst unterscheidet die drei Stufen nur beim Exit-Code:
- Fehler: Das Profil führt die Regel als verbindlich. Ein offener Fehler setzt den Exit-Code 1.
- Warnung: Das Profil erwartet, dass du die Bahn änderst oder die Abweichung begründest.
- Hinweis: Etwas fällt auf, das du ansehen solltest, etwa ein Winkel knapp unter dem Richtwert.
Der Exit-Code sagt einem Skript, wie es ausging: 0, wenn kein Befund der Schwere Fehler offen ist, 1 bei mindestens einem Fehler oder wenn die Prüfung abgelehnt wurde (Projektdatei oder Karte nicht lesbar), und 2 bei falschem Aufruf, etwa einer unbekannten Option. Warnungen und Hinweise ändern den Exit-Code nicht, und akzeptierte Befunde zählen nicht.
Einige Grenzen stehen so nicht in den Regeln, das Programm schlägt sie vor, zum Beispiel dass die halbierten Postenabstände auch auf Schulhofkarten gelten. Als Quelle steht dann „Vorschlag von freemapper-courseplan“, und check --all zeigt unter dem Befund die Anmerkung der Prüfregel, die den Vorschlag begründet. Die Regel, dass die beste Laufroute nicht durch ein Sperrgebiet führen darf, prüft das Programm nicht: Sie braucht die Routenanalyse. Sie steht in check --all unter den nicht geprüften Regeln. Eine gerade Strecke über ein Sperrgebiet bekommt keinen Befund, denn die Strecke ist die Luftlinie und nicht die Laufroute.
Die Lage der Posten prüft check dagegen. Ein Posten in einem Sperrgebiet ist ein Fehler. Die Regel heißt wkb2026.control.in_forbidden, auf Sprint- und Schulhofkarten wkb2026.control.in_forbidden_sprint. Als Sperrgebiet gilt ein Sonderobjekt der Art Sperrgebiet, das zur Bahn des Postens gehört oder keine Bahn nennt, und auf der Karte jede Fläche mit dem Symbol 520 oder 709, auf Sprint- und Schulhofkarten auch 714. Ein Posten genau auf dem Rand steht im Gebiet. Start, Ziel, Querungsstellen und Posten, die auf keiner Bahn liegen, prüft die Regel nicht. Willst du die Lage trotzdem, akzeptierst du den Befund mit einer Begründung.
Start, Ziel, Posten und Querungsstellen müssen außerdem auf der kartierten Fläche liegen. Viele Karten sind keine Rechtecke: Die Rummelsburger Bucht ist ein schräger Streifen, und der Rest des Blatts ist weiß, obwohl er im Rechteck um alle Kartenobjekte liegt (woran die Warnung wkb2026.map.edge misst). Eine Stelle im weißen Teil ist ein Fehler, Regel wkb2026.map.inside. Eine Stelle gilt als kartiert, wenn ein Kartenobjekt höchstens 50 m entfernt liegt (auf einer Waldkarte höchstens 10 mm auf dem Blatt, siehe Waldkarten unten). Der Blattrahmen und Layoutsymbole wie das Nordlinienmuster (601) zählen nicht als Objekte. Die Meldung nennt die Stelle in Kartenmillimetern und das nächste Objekt. Ein Platz zwischen Gebäuden ohne Objekt darin bleibt innen, solange er nicht viel breiter als 80 m ist; bei einer Karte mit großen leeren Flächen akzeptierst du den Befund mit einer Begründung oder bittest um einen größeren Wert in der Regel (ADR 0084).
Start, Ziel, Posten und Querungsstellen müssen außerdem mindestens 50 m vom Rand der kartierten Fläche entfernt bleiben, damit der Läufer immer auf kartiertem Gebiet laufen kann (Fehler, Regel wkb2026.map.margin, ADR 0087). Der Rand ist dort, wo kein Kartenobjekt mehr innerhalb von 50 m liegt, dieselbe Grenze wie oben (auf einer Waldkarte die Grenze für Wald). Der Abstand wird auf einem Raster der kartierten Fläche gemessen und stimmt auf etwa 2 m. Eine Stelle außerhalb der kartierten Fläche bekommt nur den Fehler von oben. Die Einstellung heißt map_margin_m (0 bis 200, 0 schaltet die Regel ab) und ändert sich mit score settings --map-margin.
Zwei Empfehlungen des Nutzers, keine Regeln der WKB, gelten für Sprint- und Schulhofkarten. Ein Posten tief in einer Sackgasse nimmt dem Läufer die Routenwahl, er läuft nur eine lange Strecke hinein und wieder heraus. check warnt, wenn ein Posten mehr als 60 m tief in einer Sackgasse liegt (Regel wkb2026.control.dead_end, ADR 0085). Die Tiefe ist die Gehstrecke vom Posten bis dorthin, wo das Wegenetz wieder eine Wahl bietet; ein großer offener Platz oder Innenhof ist keine Sackgasse. Die Grenze ist die Einstellung dead_end_max_m (20 bis 300, score settings --dead-end-max). Start und Ziel eines Sprints liegen meist nah beieinander: check gibt einen Hinweis, wenn sie in der Luftlinie mehr als 400 m auseinander liegen (Regel wkb2026.course.start_finish_distance, ADR 0086, Einstellung start_finish_max_m, 50 bis 2000, score settings --start-finish-max). Eine Bahn von Hand darf von allen dreien abweichen; score suggest und score draft halten sie ein. score draft lehnt einen Start und ein Ziel ab, die weiter auseinander oder näher am Rand liegen, als die Einstellungen erlauben, und nennt die Einstellung, die du ändern kannst.
Waldkarten
Das Programm legt Bahnen auch auf Waldkarten nach ISOM 2017-2 im Maßstab 1:5000 bis 1:15000, mit denselben Befehlen wie auf einer Sprintkarte. init liest den Namen des Symbolsatzes der Karte. Eine Waldkarte in ISOM 2017-2 wird angenommen. Eine Waldkarte in ISOM2000, in der ersten Ausgabe ISOM2017 oder in einem anderen Satz lehnt init ab und nennt in der Meldung den gefundenen Satz, denn die Regeldaten benutzen Symbolnummern aus ISOM 2017-2, die in ISOM 2000 etwas anderes bedeuten (ADR 0092). Wandle eine solche Karte zuerst in OpenOrienteering Mapper um. Sprint- und Schulhofkarten arbeiten wie bisher. Die Kartenart nimmt das Programm aus freemapper.toml, wenn dort eine steht, sonst aus Symbolsatz und Maßstab; eine ISOM-Karte im Maßstab 1:4000 zählt als Sprintkarte.
Auf einer Waldkarte gelten die Waldfassungen der Regeln: mindestens 30 m zwischen Posten, ähnliche Objekte innerhalb von 60 m (die Gruppen bestehen aus Symbolen von ISOM 2017-2, siehe die Recherchedatei docs/research/2026-11-14-isom-2017-2-symbols.md) und ein Posten in einer Fläche mit dem Symbol 520 oder 709 als Fehler. Ein Symbol, das die Kartendatei ausblendet, zählt nicht als Karteninhalt; das Symbol 709 ist im ISOM-2017-2-Satz von Mapper ausgeblendet. Die Grenze für die kartierte Fläche ist ein Abstand auf dem Blatt, 10 mm: 50 m bei 1:5000, 100 m bei 1:10000 und 150 m bei 1:15000. map.inside und map.margin benutzen sie; die Einstellung map_margin_m behält ihre 50 m.
Nicht alles wird geprüft. Die Sackgassenregel und der Abstand zwischen Start und Ziel sind Empfehlungen für Sprints; check --all führt sie als „nicht für Waldkarten“ auf. Die Lkm-Regeln des Overlays nor-bb-2021 brauchen die Höhenmeter der Bahn, die das Programm ohne Höhenmodell nicht ausrechnen kann; trage sie mit course set --climb ein, sonst bleibt die Regel übersprungen. Die Regel zur Laufroute durch Sperrgebiete wartet weiter auf die Routenanalyse.
score suggest, score draft und score length lehnen eine Waldkarte ab, ebenso die passenden MCP-Werkzeuge und der Score-Bereich des Editors, wo die drei Schaltflächen stehen bleiben, aber gesperrt sind. Die Routensuche arbeitet auf einem Raster der Kartensymbole und kennt weder Höhe noch Geschwindigkeit durch Bewuchs, ihre Zeiten würden in die Irre führen. Eine Score-Bahn mit Posten und Verbindungen kannst du weiter von Hand anlegen. check prüft dann Codes, Werte und Verbindungen und führt die Längenbänder als nicht geprüft auf.
Übersprungene Prüfregeln
check zählt die übersprungenen Prüfregeln in der Zusammenfassung, check --all nennt jede mit dem Grund. Häufige Gründe:
- Beim Training wendet das Programm die Längen- und Schwierigkeitsregeln des Wettkampfs nicht an.
- Die Prüfregel gilt nur für eine andere Disziplin, Kartenart oder einen anderen Druckmaßstab.
- Die Regel braucht die Laufroute.
wkb2026.leg.through_forbiddenundwkb2026.leg.through_forbidden_sprint(die beste Route darf nicht durch ein Sperrgebiet führen) warten auf die Routenanalyse und stehen deshalb immer hier. - Ein Aufsatz hat die Prüfregel abgeschaltet; der Grund nennt ihn, etwa „Das Regelprofil nor-bb-2021 schaltet die Prüfregel ab“.
- Ein Wert fehlt. Das Startfenster setzt
event start-window halle.courseplan.toml 90(--nonestatt der Minuten entfernt es), die erwartete Starterzahl einer Kategorieclass set halle.courseplan.toml H21 --starters 40, den Anstieg einer Bahncourse set halle.courseplan.toml A --climb 120. - Eine Kategorie hat keine Regelkategorie, zum Beispiel ein selbst gewählter Name wie „Offen“.
class set halle.courseplan.toml Offen --rule-category H21ordnet ihr eine zu. Eine Regelkategorie, die in keiner Zeile der Tabelle steht, überspringt die Bahn ebenfalls.
Eine übersprungene Prüfregel hat nicht geprüft. Ein leeres Ergebnis heißt deshalb nicht, dass alles besteht. Lies die Liste einmal durch, bevor du dich darauf verlässt.
Score-Bahnen
check prüft auch Score-Bahnen. Die Regeln für Einzelbahnen (Winkel, Postenabstände entlang der Strecken) gelten für sie nicht; acht eigene Regeln lesen die Postenmenge, das Limit und die Verbindungen. Alle Kennungen beginnen mit wkb2026.score.:
value_code(Fehler): Der Wert eines Postens stimmt mit dem Wert überein, den sein Code trägt (Kapitel 3, Score-Bahnen).code_ambiguity(Warnung): Zwei Codes der Bahn sehen auf dem Kopf gleich aus oder unterscheiden sich nur durch 6 und 9, etwa 61 und 91.ringundorder(Warnungen): Die Posten stehen nicht im Ring um Start und Ziel, und ihre Reihenfolge ist nicht offensichtlich, zum Beispiel weil sie auf der äußeren Hülle liegen und die Tour zum jeweils nächsten Posten fast die kürzeste ist. Beide Regeln gelten erst ab sechs Posten.length_bands(Warnung): Auf der Kostenfläche der Karte holt der gute Läufer standardmäßig 87 bis 93 Prozent aller Punkte, und der sehr gute Läufer läuft alle Posten an und ist nach 95 bis 100 Prozent des Limits im Ziel. Die Bänder sind Zielwerte mit einer Toleranz von standardmäßig 3 Prozentpunkten; nur eine Abweichung darüber hinaus ist ein Befund, eine innerhalb der Toleranz steht nur im Längenbericht. Bänder und Toleranz sind Einstellungen der Veranstaltung. Die Regel sucht Routen und braucht auf einer großen Karte einige Sekunden. Ohne Kartenobjekte oder bei einer gescheiterten Suche wird sie mit Grund übersprungen.limit_penalty(Warnung): Das Limit liegt zwischen 30 und 90 Minuten, und eine Minute darüber kostet mindestens so viele Punkte wie der höchste Postenwert.link(Fehler oder Warnung): Eine Verbindung braucht zwei verschiedene Posten der Bahn und darf nur einmal vorkommen. Eine Luftlinie durch Sperrgebiet oder über einen verbotenen Weg ist eine Warnung, ebenso eine Verbindung ohne zweite Route ähnlicher Länge. Für den zweiten Fall hat die Datei kein Merkmal; ist er gewollt, akzeptierst du den Hinweis mit einer Begründung.mix(Warnung): Der Anteil schwerer Posten passt auf 15 Punkte genau zur Einstellungmix_hard_percent. Die Regel urteilt ab fünf Posten.
Mehrere dieser Grenzen sind Vorschläge von freemapper-courseplan, keine Werte aus einer Quelle; die Quelle in der Zeile sagt, welche. Einen Befund an einem Postenpaar akzeptierst du mit --controls, einen an der ganzen Bahn mit --course, wie in den Beispielen examples/gleisdreieck/check.de.txt und examples/rummelsburger-bucht/check.de.txt. Mannschafts- und Staffelbahnen bleiben ungeprüft.
Eine Ausnahme begründen
Manche Befunde sind gewollt. Du akzeptierst sie mit der Kennung der Prüfregel, dem Ort und einer Begründung:
# zwei Posten, die bewusst nah beieinander stehen
freemapper-courseplan finding accept halle.courseplan.toml wkb2026.distance.min_half --controls 31,32 --note "Die Posten liegen an zwei Seiten desselben Gebäudes und gehören zu verschiedenen Bahnen."
# eine Strecke
freemapper-courseplan finding accept halle.courseplan.toml wkb2026.leg.acute_angle --leg A:3 --note "Der spitze Winkel ist gewollt, die Bahn wendet an diesem Posten."
# ein Posten und der Start
freemapper-courseplan finding accept halle.courseplan.toml wkb2026.distance.min_half --controls 31,S1 --note "Der Start liegt bewusst nah am ersten Posten, das Training beginnt mit einer kurzen Einlaufstrecke."
--controls nimmt Postencodes und die Kennung von Start oder Ziel, --course BAHN einen Befund der ganzen Bahn. --leg BAHN:N nennt die Strecke, die von Position N der Bahn abgeht. Die Positionen zählen die Posten der Bahn ab 1, Querungsstellen mitgezählt, und 0 ist der Start. N ist also nicht die Postennummer auf der Karte: Auf Bahn A mit den Posten 31 bis 37 ist --leg A:6 die Strecke 36–37. Ein Befund an zwei Strecken bekommt --leg zweimal, etwa --leg A:2 --leg A:5. Ein Befund der ganzen Veranstaltung braucht keine Ortsangabe. Gibst du einen Ort an, an dem die Prüfregel nie etwas meldet, lehnt das Programm ab und nennt die Orte, an denen sie meldet. Akzeptierst du denselben Befund noch einmal, ersetzt die neue Begründung die alte.
Die Begründung steht in der Projektdatei, bei einer Strecke zusammen mit ihren Enden. check zeigt akzeptierte Befunde nicht mehr in der Liste, zählt sie aber in der Zusammenfassung. Mit --all stehen sie unter „akzeptiert“, mit deiner Begründung. So sieht auch die Bahnlegerin im nächsten Jahr, warum die Bahn so ist.
Änderst du die Bahn, kann eine Ausnahme ihren Befund verlieren: Der Posten ist entfernt, die Bahn gelöscht, oder die Strecke läuft jetzt zwischen anderen Posten. Im letzten Fall meldet check den Befund an der neuen Strecke wieder, denn die alte Begründung galt für die alte Strecke. check --all listet solche Ausnahmen unter „nicht zugeordnet“, die Zusammenfassung zählt sie, und am Exit-Code ändern sie nichts.
Willst du einen Befund wieder sehen oder eine nicht zugeordnete Ausnahme loswerden, nimmst du sie mit Prüfregel und Ort zurück:
freemapper-courseplan finding remove halle.courseplan.toml wkb2026.distance.min_half --controls 31,32
freemapper-courseplan finding remove halle.courseplan.toml wkb2026.leg.acute_angle --leg A:3
finding remove --leg entfernt zuerst die Ausnahme für die Strecke, wie sie jetzt verläuft. Gibt es keine, entfernt es die Ausnahmen an dieser Position, deren Strecke sich seitdem geändert hat. Ändert sich die Kennung einer Prüfregel, etwa in einer neuen Programmversion, meldet check die Befunde dazu wieder.
Regelprofil und Aufsätze wählen
Eine Veranstaltung hat ein Basisprofil und beliebig viele Aufsätze darauf. Das Programm bringt zwei mit: wkb-2026 (Wettkampfbestimmungen Orientierungslauf 2026) und nor-bb-2021, einen Aufsatz mit den Bahnempfehlungen von Berlin und Brandenburg. Beide setzt du mit einem Befehl:
freemapper-courseplan event profile halle.courseplan.toml wkb-2026 --overlay nor-bb-2021
Mehrere Aufsätze wiederholen --overlay und gelten in der angegebenen Reihenfolge. Das Programm lädt die Profile vorher. Einen unbekannten Namen lehnt es mit der Liste der vorhandenen Profile ab. info zeigt das Profil an. In jedem Befund von check beginnt die Kennung der Prüfregel mit ihrem Profil (wkb2026, norbb2021). Wie eine Profildatei aufgebaut ist und wie man eine neue anlegt, steht in crates/freemapper-courseplan/rules/README.md.
Datum und Veranstalter
event set legt das Datum der Veranstaltung und ihren Veranstalter in der Projektdatei ab:
freemapper-courseplan event set halle.courseplan.toml --date 2026-11-14 --organizer "OLV Beispiel"
freemapper-courseplan event set halle.courseplan.toml --no-organizer
Das Datum hat die Form JJJJ-MM-TT, ohne Uhrzeit. Der Veranstalter ist ein Text, der nicht leer sein darf. Gib mindestens eine der Angaben --date, --organizer, --no-date und --no-organizer an; --date zusammen mit --no-date ist ein Aufruffehler, ebenso die beiden Veranstalter-Optionen. info zeigt beides. Der IOF-XML-Export schreibt sie als Event/StartTime/Date und Event/Organiser/Name und lässt ein Feld weg, das nicht gesetzt ist (siehe "Weitergeben" unten). freemapper-print übernimmt sie in den Titelblock. Purple Pen kennt keines von beiden, darum fassen Purple-Pen-Export, -Import und sync sie nicht an. Die Entscheidung steht in ADR 0090.
Mit dem KI-Assistenten
Der Assistent hat sieben Werkzeuge dafür: check liefert Befunde, akzeptierte und nicht zugeordnete Ausnahmen und übersprungene Prüfregeln. accept_finding und remove_accepted_finding entsprechen finding accept und finding remove, set_rule_profile entspricht event profile, set_start_window und set_class entsprechen event start-window und class set, set_event_details entspricht event set. Bitte ihn zum Beispiel, die Bahnen zu prüfen, jeden Befund in einem Satz zu erklären und dich zu fragen, bevor er einen akzeptiert. Die Begründung schreibst du oder diktierst sie ihm. Er soll sie nicht erfinden.