Neu in docs/wissen: wfs_dienste.md (ALKIS-WFS-Endpunkte der saechsischen Dienste, erprobte Anfragen je Objektart, die vom WAF blockierten Normfaelle) und alkis_objektarten.md (die von sn_verfahrensgebiet genutzten AAA-Objektarten mit Attributen, Filterkonventionen und den FlurbG-Werten von artderfestlegung). Neu in docs/konzept: 09_alkis7_umstellung.md - Vergleich ALKIS 6 (GID 6.0) gegen ALKIS 7 (GID 7.1) und die konkrete Anpassungsliste fuer sn_verfahrensgebiet (fest verdrahteter NAS-Namespace, abgeflachte WFS-Feldnamen, Codelisten, Tests). Als offene Baustelle 14 in STATUS.md verlinkt. Quellmaterial (OK-AAA 7.1.2, ALKIS-FSK 2.1.0, EA-Modellexporte, ~180 MB) liegt lokal unter referenz/ und wird per .gitignore nicht versioniert; Herkunft ist in alkis_objektarten.md dokumentiert. Querverweise aus externe_dienste.md, fallstricke.md, docs/README.md ergaenzt; Glossar um NAS, ZUSO/REO, OK-AAA erweitert. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NqvdHqySjQMVowB3G3Vf3U
8.9 KiB
Fallstricke und Erkenntnisse
Gemeinsames Gedächtnis: Dinge, die man nicht aus dem Code ablesen kann und die schon einmal Zeit gekostet haben. Kurz, konkret, mit Datum und Quelle. Neue Einträge oben in der passenden Rubrik. Veraltetes löschen, nicht auskommentieren.
Umgebung und Werkzeuge
- QGIS 3.40 ist seit Januar 2026 End of Life. Aktueller LTR ist 3.44, Stable 4.2 (wird 25.09.2026 LTR).
workspace.tomlund allemetadata.templatestehen noch auf3.40– offene Produktentscheidung, siehedocs/konzept/07_qgis_tests_plan.mdAbschnitt 2. (04.09.2026, QGIS-Release-Fahrplan) - Zwei Qt-Welten. QGIS 3.40/3.44 laufen mit Qt5/PyQt5, QGIS 4 mit Qt6/PyQt6.
qt_wrapperlädt PyQt6 zuerst, dann PyQt5, sonst Mock. Enum-Zugriffe unterscheiden sich (Qt.AlignmentFlag.AlignTopstattQt.AlignTop), deshalb nur Wrapper-Aliase verwenden. (09/2026, Code) - Mock-Modus ist kein QGIS.
python scripts/run_tests.pyläuft in Sekunden, prüft aber nur Logik gegen Mock-Klassen. Geometrieoperationen, WFS, Layouts und Signale müssen in QGIS geprüft werden (tests/test_qgis.batunter Windows). Manuelle QGIS-Tests im PR dokumentieren. (09/2026) openpyxlist eine harte Abhängigkeit vonsn_basis(Excel-Import) und unter Linux-QGIS oft nicht installiert (Issue Verfahrensgebiet #21).requestsist nur optionaler Fallback. Es gibt keinerequirements.txt. (09/2026)- QGIS lädt Plugins in nicht garantierter Reihenfolge. Fachplugins dürfen in
initGui()nicht davon ausgehen, dasssn_basisfertig ist;sn_basisruftinitGui()allersn_*nach. (Codemain.py) - Exit-Crash unter QGIS 3.40 entstand durch nicht getrennte Projektsignale beim Unload. Regel: jeder Tab/Manager, der Signale verbindet, bietet
cleanup()/teardown_...()und wird beim Schließen aufgerufen. (Basis,assets/plan-qgis340ExitCrashFix.prompt.md) .vscode/gehört nicht ins Repository. Im Projektwissen wurde er am 04.09.2026 entfernt; brauchbare Einstellungen stehen jetzt indocs/leitfaden/04_werkzeuge_einrichten.mdAbschnitt 4.2 zum Kopieren in die Benutzereinstellungen. InPlugin_SN_Basis,Plugin_SN_Plan41,Plugin_SN_VerfahrensgebietundPlugin_SN_Widmungliegt er noch und enthält Pfade eines einzelnen Arbeitsplatzes (OSGeo-Installationspfad, persönliches Benutzerprofil) – nicht als Vorgabe verstehen. (09/2026)
QGIS-Tests (geplant, siehe docs/konzept/07_qgis_tests_plan.md)
-
QT_QPA_PLATFORM=offscreenmuss gesetzt sein, bevor dieQgsApplicationerzeugt wird. Danach wirkt es nicht mehr. (04.09.2026, Recherche) -
qgis.utils.ifaceist nachstart_app()None. Entwederpytest-qgisverwenden (patcht automatisch) oder selbstqgis.utils.iface = get_iface()setzen – und keine Module zu früh importieren. (04.09.2026) -
QgsProject.instance()ist global. Ohne Aufräumen zwischen den Tests beeinflussen sie sich gegenseitig. (04.09.2026) -
Abstürze beim Beenden sind ein bekanntes QGIS-Thema, wenn Layer- oder Canvas-Objekte noch referenziert werden. Gegenmittel:
pytest-qgisoder--qgis_disable_exit. (04.09.2026) -
QgisTestCase.render_layout_check()ist für Plugins nicht nutzbar: es sucht Referenzbilder in einem einkompilierten Pfad des QGIS-Quellbaums. NurQgsRenderCheckerbietetsetControlImagePath(). Referenzbilder immer im CI-Container erzeugen, nie unter Windows (Font- und Antialiasing-Unterschiede). (04.09.2026) -
Modale Dialoge blockieren den Test. Reihenfolge der Gegenmittel: modalen Aufruf per
monkeypatchersetzen,open()stattexec(), erst zuletztQTimer.singleShot. (04.09.2026) -
Unter Windows nur
python-qgis.bat/python-qgis-ltr.batverwenden – ein normalespython -m pytestfindet die QGIS-Bindings nicht. (04.09.2026) -
Gitea ordnet Commits über die E-Mail-Adresse zu. Stimmt
user.emailnicht mit einer im Gitea-Konto hinterlegten Adresse überein, erscheinen die Commits ohne Zuordnung zum Benutzer. Für dieses Projekt gilt die dienstliche Adresse (@lfulg.sachsen.de). Wer den Rechner auch privat nutzt, setzt sie je Repository mitgit config --localstatt global. Nachträglich nur durch Umschreiben der Historie korrigierbar. (04.09.2026)
Release und Versionen
- Der Release-Workflow baut den Kopf des Kanal-Branches, nicht den getaggten Commit (
git checkout "$CHANNEL"inRepository:hidden/workflows). Tag nur setzen, wenn der Kanal-Branch auf dem gewünschten Stand ist. (09/2026) metadata.txtnie von Hand pflegen. Sie wird beim Release aus.gitea/templates/metadata.templateerzeugt. Die im Repo liegende Datei ist ein Abbild des letzten Builds und kann irreführende Versionen/URLs zeigen (Issue Verfahrensgebiet #26). (09/2026)- Stable-Kanal ist leer, ein Branch dafür existiert nicht; ein Tag ohne Suffix würde derzeit fehlschlagen. Der Branch muss exakt
stableheißen, weil der Release-Workflow inRepository:hidden/workflowsgit checkout "$CHANNEL"ausführt und$CHANNELaus dem Tag-Suffix stammt. Anlegen:docs/konzept/08_repo_einrichten.md(ADR 0007). (04.09.2026, Workflow gelesen) - Repo-Name ≠ Paketname.
Plugin_SN_Basiswird alssn_basisinstalliert (Gitea-VariableZIP_FOLDER). Importe im Code verwenden immer den Paketnamen. - Bekannte Metadata-Fehler: Plan41-Template verweist auf
Plugin_Test_Actionals Repository; FLT-Template aufPlugin_SN_Neu; Widmung trägt Version4711-unstable. (Gesamtüberblick 09/2026) - Workspace-Dateien in Release-ZIPs. Der rsync-Schritt schließt nur
.git,.gitea,.gitignore,__pycache__aus.AGENTS.md,CLAUDE.md,.agents/,.claude/,docs/,tests/werden mit ausgeliefert, bis die Excludes ergänzt sind (offener Punkt).
Daten und Dienste
- WFS-Beschränkungen der sächsischen ALKIS-Dienste: POST/GML-Filter werden blockiert, URL-Länge ist begrenzt, serverseitige Feature-Limits. Deshalb arbeiten Flurstücks- und Grenzpunktabrufe mit BBOX, gemarkungsweisen Batches und Nutzerdialogen. Nicht „vereinfachen“, ohne das gegen den Dienst zu testen. Vollständig mit erprobten Anfragen:
docs/wissen/wfs_dienste.md, Objektarten/Attribute:docs/wissen/alkis_objektarten.md. (Verfahrensgebiet, Code) - Zwei Linklisten. Zentrale
Linkliste/linkliste.csv(Spaltenid;gruppe;ebene;inhalt;url;provider;stil) und die vom Plugin genutztePlugin_SN_Plan41/assets/Linkliste.xlsx(ident, gruppe, kartenebene, inhalt, link, provider, stildatei) sind nicht verbunden. Änderungen an Diensten in beiden nachziehen, bis die Zusammenführung entschieden ist. (09/2026) - ArcGIS-REST-Layer nicht nach Nummer deuten. Gleiche Layer-URLs werden in der Linkliste und im Alternativansatz unterschiedlich benannt; Bedeutung und Geometrie immer gegen die Dienstmetadaten prüfen. (Vergleich Alternativansatz 09/2026)
- CRS: Plan41 und VLN-API arbeiten in EPSG:25833. Der Alternativansatz erzeugt EPSG:25832. Für neue Layer 25833 verwenden, bis eine Entscheidung dokumentiert ist.
- Shape-Import erwartet Feld
FBSchlmit901/10110F(Neuordnungsgebiet) oder901/10120F(Neuvermessungsgebiet). Exporte mit abweichendem Feldnamen (FBSchl.) wurden bis 26.8.3 abgewiesen; seit PR Verfahrensgebiet #45 (02.09.2026, 26.8.4-unstable) ist die Feldsuche tolerant. Neue Exportvarianten trotzdem gegen die Erkennung testen. - VLN-Upload ersetzt den Serverbestand der VKZ vollständig (
PUT). Vor dem Upload sicherstellen, dass alle Teillayer geladen sind. - API-Key liegt in
QSettings(Registry/Konfigurationsdatei), kein sicherer Schlüsselspeicher. Niemals in Logs oder Tests ausgeben.
Code-Konventionen, die man kennen muss
- Projektvariablen-Schlüssel ohne
sn_übergeben.set_variable("sn_abdeckungslayer", ...)erzeugtsn_sn_abdeckungslayer(Altlast in Druckmodulen; funktioniert nur, weil Lesen und Schreiben denselben Fehler machen). - Zwei Schreibweisen für den Verfahrensgebiet-Layer:
verfahrensgebiet_layer(Manager, Fachplugins) undverfahrensgebietslayer(print_logic.py). Bis zur Bereinigung nicht auf Gleichheit vertrauen. - Layer werden über Anzeigenamen gefunden (
BROR_LAYER_NAMEusw.). Umbenennungen in der UI brechen Abläufe. print()ist im Code verbreitet, aber kein Logging. Neue Ausgaben übermessage_wrapper(Nutzer) oder gar nicht; Debug-printvor dem PR entfernen.- Testrunner pro Repo (
tests/run_tests.py) und Workspace-Runner unterscheiden sich. Für PR-Nachweise zähltscripts/run_tests.py --baseline. - Tests der Verfahrensgebiet-Suite sind teils veraltet (erwarten Einzeldatei-/Einzellayer-Schnittstellen vor der Mehrfachauswahl). Vor dem Fixen prüfen, ob der Test oder der Code falsch ist; siehe Baseline.
Zusammenarbeit
- Tool-Gedächtnis ist lokal. Die Claude-Auto-Memory sieht niemand sonst. Geteiltes Wissen nur in diesem Ordner (siehe Issue Basis #36 „shared-memory-architektur“, Kai).
- Issues sind teils Diskussionen, nicht Aufträge (Label
Diskussion). Vor der Umsetzung Konsens im Issue abwarten oder im PR als Annahme kennzeichnen.