# Arbeitsweise für Entwickler: So arbeiten wir mit KI-Agenten an den LNO-Plugins Für Kolleginnen und Kollegen, die neu einsteigen. Fachwissen wird vorausgesetzt, Software-Erfahrung nicht. Wir arbeiten mit Claude Code (ADR 0008); die Dateien bleiben werkzeugneutral. Die Kurzfassung für den Agenten selbst ist `AGENTS.md`, dieser Leitfaden erklärt das Warum und das Wie. Git im Detail: `05_git_arbeitsweise.md`. Tests im Detail: `06_tests.md`. ## 1. In zehn Minuten startklar **Voraussetzungen:** Git, Python ≥ 3.11 (ist in OSGeo4W enthalten: `python-qgis.bat` oder das OSGeo-Python), Zugang zu Gitea (`entwicklung.flurneuordnung-sachsen.de`), Claude Code (CLI oder VS-Code-Erweiterung). Für QGIS-Tests: QGIS 3.44 LTR oder 4 mit einem eigenen Profil (z. B. `dev`), in dessen Plugin-Ordner die Pakete `sn_basis`, `sn_verfahrensgebiet`, `sn_plan41` liegen (Verknüpfungen auf die Klone). ```bash git clone https://entwicklung.flurneuordnung-sachsen.de/AG_QGIS/Projektwissen.git AG_QGIS cd AG_QGIS python scripts/setup_workspace.py # klont die Plugin-Repos, spiegelt Skills python scripts/run_tests.py # muss laufen: 3 Suiten, Zusammenfassung ``` > **Solange `AG_QGIS/Projektwissen` auf Gitea noch nicht angelegt ist** (Phase 0 im Konzept), schlägt der Clone mit > „Repository not found“ fehl, obwohl die Anmeldung gelingt. Übergangslösung: den Ordner `AG_QGIS` aus dem > Projektverzeichnis auf dem Netzlaufwerk (`Projekte\QGIS Plan 41\AG_QGIS`) komplett kopieren, darin > `python scripts/setup_workspace.py` ausführen (erneuert den Skill-Spiegel und prüft die Klone) und weiter wie oben. Dann das Werkzeug **im Ordner `AG_QGIS/` starten**: | Form | Start | Prüfen | |---|---|---| | Claude Code CLI | `claude` im Ordner `AG_QGIS` | `/context` zeigt `CLAUDE.md` und `AGENTS.md` unter „Memory files“; `/hallo` ist im Menü | | Claude Code in VS Code | Ordner `AG_QGIS` öffnen, Panel starten | dasselbe; Diffs erscheinen im Editor | Einrichtung Schritt für Schritt: `04_werkzeuge_einrichten.md`. Erste Frage an den Agenten zum Warmwerden: „Fasse `docs/status/STATUS.md` zusammen und nenne die drei wichtigsten Regeln aus `AGENTS.md`.“ Antwortet er korrekt, ist die Einrichtung fertig. ## 2. Der Arbeitszyklus ```mermaid flowchart TD A["1 Issue auf Gitea (Vorlage docs/vorlagen/issue.md)"] --> B["2 Branch von unstable: feature/-"] B --> C["3 Auftrag an den Agenten (Abschnitt 3)"] C --> D["4 Umsetzung in kleinen Schritten, Zwischenstände committen"] D --> E["5 python scripts/run_tests.py --baseline"] E -->|rot| D E -->|grün| F["6 Bei UI/QGIS-Verhalten: Test in QGIS, Ergebnis notieren"] F --> G["7 changelog.txt oben ergänzen"] G --> H["8 PR auf unstable (Vorlage docs/vorlagen/pull_request.md) mit Übergabenotiz"] H --> I["9 Review durch eine Kollegin/einen Kollegen"] I -->|Änderungswünsche| D I -->|Merge| J["10 STATUS.md und Wissensbasis nachziehen"] ``` Jeder Schritt ist klein. Ein PR sollte an einem Tag entstehen und in einer Viertelstunde reviewbar sein. Wenn das nicht geht, ist das Issue zu groß: aufteilen. **Branch-Namen:** `feature/-`, `bugfix/-`, `doku/`. **Commit-Nachrichten:** deutsch, Präsens, erste Zeile ≤ 72 Zeichen, Issue-Nummer am Ende (`Shape-Import: FBSchl.-Variante akzeptieren (#41)`). ## 3. Wie man einem Agenten einen Auftrag gibt Der Agent liest `AGENTS.md` automatisch. Was er **nicht** weiß: was genau gewollt ist, wo es endet, und was fachlich richtig ist. Ein guter Auftrag hat vier Teile: 1. **Ziel und Issue:** „Bearbeite Issue Verfahrensgebiet #41: …“ oder das Ziel in zwei Sätzen. 2. **Kontext-Zeiger statt Erklärungen:** „Betroffen ist `functions/verfahrensgebiet_shape_komplett.py`, Ablauf in `docs/aus_shape_laden_technisch.md`. Lies zuerst `docs/architektur/schnittstellen.md` Abschnitt 6.“ 3. **Grenzen:** „Keine Änderung am ALKIS-Ablauf. Keine neuen Abhängigkeiten. Kein Refactoring.“ 4. **Abnahme:** „Fertig ist es, wenn `run_tests.py sn_verfahrensgebiet --baseline` keine neuen roten Tests zeigt, ein Test für den Fall `FBSchl.` existiert und die Übergabenotiz geschrieben ist.“ Beispiel eines guten Auftrags (das Issue wurde am 02.09.2026 tatsächlich so in PR #45 gelöst; hier als Muster): > Nutze den Skill `sn-aufgabe-bearbeiten` für Issue Verfahrensgebiet #41. Der Shape-Import soll zusätzlich das Feld > `FBSchl.` (mit Punkt) akzeptieren, wie es manche DAVID-Exporte liefern. Betroffen: `_ermittle_gebietstyp_aus_fbschl` > in `functions/verfahrensgebiet_shape_komplett.py`. Nicht ändern: die Bedeutung der Schlüssel `901/10110F` und > `901/10120F`. Schreibe einen Test im Mock-Modus für beide Feldnamen. Am Ende: Übergabenotiz nach Vorlage. Beispiel eines schlechten Auftrags: „Schau dir das Shape-Laden an und mach es besser.“ Das erzeugt lange Erkundung, unklare Änderungen und einen PR, den niemand reviewen kann. **Während der Arbeit:** Rückfragen des Agenten beantworten, fachlich prüfen, was er behauptet, und ihn bei Abschweifungen zurückholen („Nur Issue #41“). Wenn er anfängt, Tests zu ändern statt Code, nach der Begründung fragen. **Was der Agent nicht darf:** mergen, taggen/releasen, Baseline ändern, Verträge (Abschnitt `schnittstellen.md`) ändern ohne Issue, Zugangsdaten anfassen. ## 4. Die Regeln und warum es sie gibt | Regel (aus `AGENTS.md`) | Warum | |---|---| | Qt/QGIS nur über Wrapper | Ein Code für Qt5 und Qt6; Tests ohne QGIS; ein Ort für Kompatibilitätsfixe | | Projektvariablen nur über `get_variable`/`set_variable`, Schlüssel ohne `sn_` | Einheitliches Präfix; Mock-Speicher in Tests; Doppelpräfixe vermeiden | | Fachlogik ins Fachplugin, `sn_basis` importiert keine Fachplugins | Basis muss allein laden können; sonst Startfehler wie Issue Basis #57 | | `grep` vor Änderungen an `sn_basis` | Drei Fachplugins in drei Repos hängen daran | | Mock-Tests vor jedem Commit, keine neuen roten Tests | Tests sind der einzige schnelle Nachweis für Agentenarbeit | | Kein Refactoring nebenbei | Umbauten ohne Plan zerstören Verträge, die nur im Code stehen; eigene Phase | | Deutsch in Doku, Commits, Issues | Team und Fachbegriffe sind deutsch; Agenten folgen der Sprache der Dateien | | Keine Zugangsdaten, keine echten Verfahrensdaten | Öffentliche Repos, Datenschutz | | Übergabenotiz | Die nächste Person oder der nächste Agent soll nicht von vorn beginnen | ## 5. Tests **Mock-Modus (immer):** `python scripts/run_tests.py --baseline`. Läuft ohne QGIS in Sekunden, verlinkt die Repos unter ihren Paketnamen in ein temporäres Verzeichnis und fasst zusammen. `--baseline` vergleicht mit `docs/status/testbaseline.json` und meldet **NEU ROT** (nicht erlaubt) und **neu grün** (bitte Baseline-Update im PR vorschlagen). `--verbose` zeigt die volle Ausgabe eines Laufs, wenn man einen Fehler verstehen will. **QGIS-Tests (bei UI, Layern, WFS, Layouts):** Windows, OSGeo4W-Shell, im Plugin-Repo `tests\test_qgis.bat` (Pfad zu `python-qgis.bat` anpassen) oder QGIS starten und den Ablauf manuell durchspielen. Ergebnis im PR unter „Nachweis“ eintragen: was geprüft wurde, mit welchen Daten, was herauskam. **Neue Tests:** `unittest`, Datei `tests/test_.py`, Mock-Modus, ohne Netzwerk. Muster: vorhandene Tests des Pakets. Ein Test pro Verhalten, deutsche Methodennamen sind üblich (`test_zip_fehler_gibt_none_und_warning`). **Rote Tests reparieren:** Erst klären, ob der Test veraltet ist oder der Code falsch. Bei veralteten Tests den Test an das neue Verhalten anpassen und in der Übergabenotiz begründen. Niemals Tests löschen oder mit `skip` stilllegen, um grün zu werden. ## 6. Wissen festhalten | Situation | Was tun | |---|---| | Etwas hat überraschend Zeit gekostet | Eintrag in `docs/wissen/fallstricke.md` (Rubrik, Datum, Quelle) | | Ein Vertrag wurde geändert oder entdeckt | `docs/architektur/schnittstellen.md` anpassen | | Modul neu, verschoben, gewachsen | `docs/architektur/modulkarte.md` anpassen | | Team hat etwas entschieden | neue Datei `docs/entscheidungen/NNNN-.md` nach Vorlage | | Aufgabe abgegeben oder pausiert | Übergabenotiz im PR (Vorlage) und Zeile in `STATUS.md` | | Fachbegriff musste erklärt werden | `docs/wissen/glossar.md` | Der Skill `sn-uebergabe` führt den Agenten am Ende jeder Aufgabe durch genau diese Liste. Das eigene Gedächtnis des Werkzeugs (Claude Auto-Memory) ist ein Notizzettel; teilbares Wissen gehört in die Dateien oben. ## 7. Was liegt wo, und was liest der Agent | Datei | Wird gelesen | |---|---| | `AGENTS.md` (Projektwissen) | ja, über `CLAUDE.md` (`@AGENTS.md`) – kanonisch, ADR 0001 | | `CLAUDE.md` | ja, enthält nur den Verweis und wenige Claude-spezifische Zeilen | | `Plugin_*/AGENTS.md` | über `Plugin_*/CLAUDE.md`, wenn in dem Ordner gearbeitet wird | | `.agents/skills/` | kanonischer Ort; gelesen wird der Spiegel `.claude/skills/` | | `.claude/commands/` | Slash-Befehle, z. B. `/hallo` | | `.claude/settings.json` | Berechtigungen – sperrt `git push`, `merge`, `tag` | | `docs/` | auf Abruf, nicht automatisch | | `CLAUDE.local.md` | ja, lokal, nicht versioniert | ## 8. Release in Kürze Nur Maintainer. Kanal-Branch (`unstable` oder `testing`) auf den gewünschten Stand bringen, `changelog.txt`-Block prüfen, Tag `v-u` bzw. `-t` auf dem **Kopf des Kanal-Branches** setzen und pushen. Der Workflow baut den Branch, erzeugt `metadata.txt`, legt das Release an und aktualisiert den Feed. Details und Prüfliste: Skill `sn-release`. ## 9. Häufige Fragen **Der Agent findet `sn_basis` nicht.** Er hat nicht `scripts/run_tests.py` benutzt oder wurde im falschen Ordner gestartet. Tests immer über das Skript; Werkzeug im Workspace-Root starten. **Der Agent will `qgis.core` direkt importieren.** Auf den Wrapper verweisen; fehlt ein Symbol, zuerst im Wrapper mit Mock-Fallback ergänzen (siehe Muster in `qgiscore_wrapper.py`, Zeilen 73–260). **Der Agent „repariert“ rote Tests durch Anpassen der Erwartung.** Nach Begründung fragen; nur akzeptieren, wenn das Verhalten bewusst geändert wurde und das Issue es abdeckt. **Der Agent hat eine Datei komplett umgeschrieben.** Diff prüfen, auf das Issue zurückführen, Rest verwerfen. Regel „kein Refactoring nebenbei“ zitieren. **Zwei Personen arbeiten am selben Modul.** In `STATUS.md` steht, wer woran arbeitet; vorher dort eintragen und kleine PRs machen. Konflikte in `unstable` löst der Maintainer mit beiden. **Wie kommt das Plugin aus dem Workspace ohne Release in mein QGIS?** Die Klone im Workspace verknüpfen: `python scripts/link_qgis_profile.py --profil dev`. QGIS lädt dann `Plugin_SN_Basis` als `sn_basis` direkt aus der Arbeitskopie. Details in `04_werkzeuge_einrichten.md` Abschnitt 2.5. **Windows und Symlinks.** `setup_workspace.py` und `run_tests.py` nutzen Junctions oder Kopien, wenn Symlinks nicht erlaubt sind. Nach Änderungen an Skills das Setup-Skript erneut ausführen, falls es „Kopie“ gemeldet hat. ## 10. Checklisten **Vor dem PR** - [ ] Issue verlinkt, Branch von `unstable` - [ ] `python scripts/run_tests.py --baseline` ohne NEU ROT - [ ] Bei UI/QGIS-Verhalten: Test in QGIS dokumentiert - [ ] Keine direkten Qt/QGIS-Importe, keine Debug-`print`, kein auskommentierter Code - [ ] `changelog.txt` ergänzt - [ ] Übergabenotiz im PR; Wissensbasis nachgezogen, falls nötig - [ ] Diff gelesen: nur, was das Issue verlangt **Review** - [ ] Fachlich richtig? (Verhalten, Begriffe, Dienste) - [ ] Verträge unberührt oder per Issue abgestimmt? - [ ] Tests vorhanden und sinnvoll (nicht nur angepasst)? - [ ] Umfang überschaubar (< 400 Zeilen)? - [ ] Nach dem Merge: `STATUS.md` **Sitzungsende (auch bei Abbruch)** - [ ] Zwischenstand committet oder gestasht und in der Übergabenotiz benannt - [ ] Offene Fragen im Issue notiert - [ ] `STATUS.md`-Zeile aktualisiert