{# Eine Zeile der Checkliste mit ihrem eigenen kleinen Formular. Warum drei Knoepfe statt einer Auswahlliste und warum `bedienbar=False` die Zeile zeigt, ohne sie anzubieten, steht bei `_punkt_html` in `main.py`. Hier steht nur, was die Vorlage anders macht als der f-String davor: **`punkt.id` ging roh in das `action`-Attribut.** Heute liefert die API dort eine UUID, das Loch war also keines — aber die Unversehrtheit des Attributs hing an einer Eigenschaft, die anderswo entsteht, statt am Escaping an der Stelle, die es braucht. Jinja escaped hier beides. **`|pfadteil` und nicht nur Autoescape** (Sicherheitsdurchgang 2026-09-02): Autoescape schliesst den Ausbruch aus dem Attribut, aber es ist keine URL-Kodierung — `/`, `?` und `#` bleiben stehen. Eine Kennung mit einem Schraegstrich verschoebe das Ziel auf einen anderen Pfad derselben Herkunft. Bei einer UUID ist der Filter folgenlos; die Zusicherung liegt damit an der Stelle, die sie braucht. Dieselbe Regel gilt fuer jede andere Pfadeinsetzung der Strecke. Warum nicht Jinjas `|urlencode` und warum der Punkt mitkodiert wird, steht bei `pfadteil` in `vorlage.py`: Der Filter dort kodiert mit `safe="/"` und haette hier genau nichts geleistet, und `quote` haelt auch den Punkt fuer unbedenklich. Das Ankreuzfeld heisst `haken` und nicht mehr `kasten`: `kasten` ist seit Etappe 2 die Karte des Bausatzes. Die Glyphen (☑ ☒ ☐) bleiben und werden VORGELESEN: Sie sind das einzige Merkmal des Zustands, das eine Vorlesesoftware bekommt (die Durchstreichung ist Stil). Ein `aria-hidden` stand kurz daran und nahm es ihr (Code-Review 2026-09-03). Das `aria-label` des Bemerkungsfelds ist ein festes Wort, nicht der Wortlaut des Punkts: Der Browserdurchlauf sucht Felder ueber ihre Beschriftung als Teilstring, und ein Punkt namens «Stunden nachtragen» machte aus `getByLabel("Stunden")` zwei Treffer (Code-Review 2026-09-03). Der HTML-Kommentar im Formular ist ausgeliefertes HTML und bleibt einer: Er erklaert dem, der die Seite liest, warum der erste Knopf unsichtbar ist. #} {% import "bausteine/bausatz.html" as b %}