This repository has been archived on 2026-09-17. You can view files and clone it, but you cannot make any changes to its state, such as pushing and creating new issues, pull requests or comments.
nixos-config/docs/review/reviewer-systemaudit-2026-09-01.md
pijukka 57ee3a90bb Ersten Reviewer-Systemaudit ablegen: XMPP-Traefik-Bug gefunden, ein High-Befund widerlegt
Erster Praxis-Durchlauf der neuen Systemaudit-Fähigkeit (Volltext-Audit
über dev-Stand: NixOS-Plattform + Agent-/Herdr-Pipeline). Bestätigter
High-Befund: hosts/blunix/localServices/traefik/default.nix verwendet für
das XMPP-TCP-Backend den Schlüssel `loadbalancer` statt `loadBalancer`
(case-sensitive, Traefik verwirft ihn vermutlich als unbekannt) — noch
nicht behoben, das übernimmt ein separater Admin-Auftrag. Vier
Medium-Befunde zu Dokumentationsinkonsistenzen (u.a. veraltete
Netzwerk-Doku-Pfade, unvollständige Rollenübersichten, ein
Planner-E2E-Doku-Widerspruch aus dieser Session selbst).

Ein zweiter, ursprünglich als High gemeldeter Befund (angebliche
Kalender-Routing-Kollision zwischen routes-external.nix und cal.nix) hat
sich bei Gegenprüfung als falsch herausgestellt — die mkRoute-Templating-
Funktion erzeugt für den Eintrag "calendar" tatsächlich den Hostnamen
calendar.${domain}, nicht cal.${domain}; keine Kollision. Im Bericht
korrigiert, nicht stillschweigend entfernt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011uSxdbo8zykSeH5WCMmbvp
2026-09-01 23:06:46 +02:00

173 lines
8.5 KiB
Markdown

# Volltext-Systemaudit: NixOS-Plattform und Agent-/Herdr-Pipeline
Stand: 01.09.2026
## Scope und Ausgangszustand
Geprüft wurde der committete Branch `dev` (`HEAD 2d7e13d`, identisch zu
`origin/dev`), ohne Vergleich gegen `main` und ohne offenen PR als Grundlage.
Der Scope umfasste `tnix`, `blunix`, `pinix`, globale und lokale Dienste,
Flake-/Variablenstruktur sowie die Agent-/Herdr-Pipeline mit Rollendateien,
Katalog, Claude-Settings, Self-Close-Wrapper, `agents/tests/roles.sh` und
Eskalations-/Rückfrage-Dokumentation.
Secrets und private Inhalte wurden nicht gelesen oder entschlüsselt. Es wurde
nichts aktiviert, deployed, committed, gepusht oder veröffentlicht.
## Methode und tatsächlich ausgeführte Prüfungen
- `AGENTS.md`, `agents/reviewer.md` und die Auftragsspezifikation vollständig
gelesen.
- Relevante Plattform-, Pipeline-, Architektur-, Rollen-, Katalog-, Settings-,
Self-Close- und README-Dateien vollständig bzw. anhand aller einschlägigen
Abschnitte gelesen und querverglichen.
- `git status --short --branch`, `git log -1` und Dateiinventur ausgeführt.
- `bash agents/tests/roles.sh`: **grün** (`OK: Rollenkatalog und
Sicherheitsgrenzen`).
- `nix-instantiate --parse` auf Flake, Variablen, Host-Konfigurationen,
globalen Modulen und lokalen Service-Importlisten: **ohne Parsefehler**.
- `nix flake check --no-build`: **nicht erfolgreich**. Zuerst war der
Nix-Fetcher-Cache im Home nicht beschreibbar; mit temporärem Cache war der
Daemon-Socket in der Review-Sandbox nicht erreichbar. Das ist kein belegter
Flake-Fehler.
- Python-Unittests: **nicht ausgeführt**, da kein `python3`/`python` im
`PATH` verfügbar war.
- Graphify wurde gemäß lokalem Skill in einer temporären `git archive`-Kopie
versucht. Der vollständige Lauf stoppte wegen fehlender Modellkonfiguration;
der `--code-only`-AST-Lauf scheiterte zusätzlich mit `Operation not
permitted`. Vorhandene ignorierte Graphify-Artefakte wurden nur als
abgeleitete Navigationshilfe, nicht als Source of Truth, gelesen.
## Befunde
### widerlegt — Ursprünglich als „high" gemeldetes Kalender-Routing-Problem
**Ursprüngliche Behauptung:** Die generische externe Route erzeuge einen
Router `calendar` mit `Host(cal.${domain})`, der mit `cal.nix`s Router
`calendar-web` (ebenfalls `cal.${domain}`) um dieselbe öffentliche Anfrage
konkurriere.
**Korrektur (Orchestrator, nach Gegenprüfung von
`hosts/blunix/localServices/traefik/routes-external.nix:4-18`):** Die
`mkRoute`-Hilfsfunktion baut die Traefik-Regel als
`Host(`${name}.${host}`)`. Für den Listeneintrag `{ name = "calendar"; host
= "${config.domain}"; ... }` ergibt das `Host(calendar.${domain})` —
**nicht** `cal.${domain}`. Der Router heißt zwar `calendar`, das ist aber
nur der interne Traefik-Router-/Service-Name, nicht der Hostname. Es gibt
keine Namenskollision mit `cal.nix`s `calendar-web`-Router
(`Host(cal.${domain})`); beide Hostnamen (`calendar.${domain}` vs.
`cal.${domain}`) sind verschieden und zeigen bewusst auf unterschiedliche
Backends (Radicale/CalDAV auf Port 5002 bzw. das Web-Frontend auf Port
5001). Der Befund beruhte auf einer Verwechslung von Router-/Service-Name
und tatsächlichem `Host()`-Hostnamen der Templating-Funktion. Kein Fix
nötig.
### high — XMPP-TCP-Backend verwendet einen inkonsistenten Key
**Fundstelle:** `hosts/blunix/localServices/traefik/default.nix:81-94`.
**Beleg:** Das Forgejo-TCP-Backend verwendet `loadBalancer`, das XMPP-Backend
jedoch `loadbalancer` (kleines `B`). Traefik-Dynamic-Configuration-Keys sind
case-sensitive.
**Auswirkung:** Das XMPP-Backend kann als unbekannt/ungültig verworfen werden;
der dokumentierte XMPP-TCP-Passthrough wäre dann nicht belastbar verfügbar.
**Empfehlung:** Auf `loadBalancer` vereinheitlichen und eine Evaluierung plus
zielgerichtete Traefik-Konfigurations-/Liveprüfung ergänzen. Der Nix-Parsertest
allein prüft die semantische Traefik-Struktur nicht.
### medium — Netzwerkdokumentation verweist auf nicht existierende Pfade
**Fundstelle:** `docs/networking.md:8-9,28-31,40-42`.
**Beleg:** Dokumentiert werden `.../localServices/traefik.nix`,
`traefik-routes-external.nix`, `traefik-routes-internal.nix` und
`traefik-forgejo.nix`. Tatsächlich liegen die Dateien unter
`.../localServices/traefik/default.nix` sowie
`traefik/routes-{external,internal}.nix` und `traefik/forgejo.nix`.
**Auswirkung:** Die zentrale Betriebsdokumentation führt bei Diagnose und
Änderung zu falschen Fundstellen und schwächt Forkbarkeit/Nachvollziehbarkeit.
**Empfehlung:** Pfade aktualisieren und einen kleinen Check ergänzen, der
referenzierte lokale Pfade auf Existenz prüft.
### medium — Self-Close-Rollenliste ist inkonsistent
**Fundstelle:** `agents/researcher.md:65-99`,
`agents/claude-settings/researcher.json`, `agents/tests/roles.sh:198-266`
gegen `docs/herdr-orchestration.md:242-245,282-285` und
`agents/design/herdr-self-close-entwurf.md:11-24`.
**Beleg:** Researcher ist in Settings, Rollenvertrag und Rollentests mit dem
Wrapper ausgestattet. Die Orchestrierungsdokumentation nennt dagegen nur fünf
Rollen ohne `researcher`; der Entwurf lässt Researcher ebenfalls aus.
**Auswirkung:** Orchestrator und Fork-Betreiber erhalten widersprüchliche
Angaben über die Self-Close-Fähigkeit. Lebenszyklus- und Eskalationssteuerung
werden dadurch unnötig fehleranfällig.
**Empfehlung:** Eine kanonische Liste festlegen und in Doku, Entwurf und Tests
identisch führen. Explizit beibehalten, dass `reviewer` ausgeschlossen ist.
### medium — Planner-E2E-Status widerspricht Vertrag und Testharness
**Fundstelle:** `docs/herdr-orchestration.md:306-317,319-323` gegen
`agents/planner.md:108-113` und `agents/tests/roles.sh:264-266`.
**Beleg:** Die Orchestrierungsdokumentation erklärt den Claude-Self-Close-
Nachtest für Planner als erfolgreich und nennt nur die vier anderen Rollen als
noch ungetestet. `planner.md` behauptet weiterhin, der Test stehe aus; der
statische Test verlangt diese veraltete Formulierung für alle Self-Close-Rollen.
**Auswirkung:** Vertrag, Evidenz und Regressionstest bewerten denselben Zustand
unterschiedlich. Die Testabdeckung wird nicht wahrheitsgetreu ausgewiesen.
**Empfehlung:** Planner-Vertrag und `roles.sh` an den dokumentierten Nachtest
anpassen und den offenen E2E-Status nur für Administrator, Agent-Manager,
Grafiker und Orga führen (oder die Erfolgsbehauptung zurücknehmen).
### medium — Vollständige sichtbare Rollen fehlen in den Übersichten
**Fundstelle:** `docs/herdr-orchestration.md:158-170` und
`docs/pipelines.md:37,64-72`; Vergleich: `agents/catalog.json`.
**Beleg:** Der Katalog führt aktive Rollen `reviewer` und `researcher`;
die Übersicht nennt sie nicht. `docs/pipelines.md` spricht von „alle vier
Rollenverträge“ und nennt nur Administrator, Orga, Agent-Manager und Graphics,
obwohl Planner, Researcher und Reviewer aktiv katalogisiert sind.
**Auswirkung:** Die Ablaufbeschreibung ist kein vollständiges Modell des
aktuellen Systems. Review-, Bericht- und Intent-Pflichten können bei
Weiterpflege übersehen werden.
**Empfehlung:** Übersicht und Pipeline vollständig aus dem Katalog ableiten
oder klar als Teilansicht kennzeichnen; Reviewer, Researcher und Planner
ergänzen und „vier Rollenverträge“ präzisieren.
## Unsicherheiten und offene Prüfungen
- Die Traefik-Befunde sind statisch abgeleitet; vollständige Flake-Evaluierung
und generierte Traefik-Prüfung waren wegen fehlendem Nix-Daemonzugriff nicht
möglich.
- Python-Tests, NixOS-Builds, `nixos-rebuild test`/`dry-activate` und
Live-Dienstprüfungen wurden nicht ausgeführt. Es lag keine Aktivierungs- oder
Deploymentfreigabe vor.
- Sicherheitsbefunde waren nicht Schwerpunkt; offensichtliche Nebenbefunde
wurden nur im Zusammenhang mit Routing oder Rollenverträgen berücksichtigt.
## Fazit
Die statischen Rollengrenzen und Nix-Syntax sind nachvollziehbar, und die
Rollentests laufen grün. Der Stand ist jedoch nicht vollständig konsistent
dokumentiert; zusätzlich besteht ein bestätigter funktionaler Traefik-Fehler
(XMPP-Backend-Key) mit Auswirkung auf die XMPP-Erreichbarkeit. Der
ursprünglich als zweiter `high`-Befund gemeldete Kalender-Routing-Konflikt
wurde bei Gegenprüfung widerlegt (siehe Korrektur oben) — kein Fix nötig.
Vor einer Aktivierungsfreigabe sollte der verbleibende `high`-Befund
(XMPP-Backend-Key) durch eine zielgerichtete Konfigurations-/Liveprüfung
geklärt werden. Die Dokumentations- und Self-Close-Widersprüche sollten
anschließend in einem separaten kleinen Fix bereinigt werden.
Keine Aktivierungs-, Deployment- oder Veröffentlichungsfreigabe erteilt.