Looks for things that quietly stopped working. Every check mirrors a case that actually happened this month, named in its docstring: a repo that was never mirrored, mirror drift, pipelines with zero jobs, a successful job without artifacts, an npm package too small to contain a build, and Authentik blueprints stuck on error. Nothing is checked on suspicion. The project list is read from the group at runtime rather than maintained in code - a hardcoded list is exactly where a new repo slips through for years. The first run proved the point by surfacing two projects nobody had in mind. It aborts when a credential is missing instead of skipping quietly. A check that disables itself reports nothing for years and is indistinguishable from all clear. Refs axion1337.chat/management#28
2.8 KiB
Stillstandsprüfung
Sucht Dinge, die leise aufgehört haben zu funktionieren. Beschlossen in der Retro 2026-08-09.
Warum es sie gibt
In neun Augusttagen sind sechs Fehler aufgefallen, die alle dasselbe Merkmal hatten: Sie sahen erfolgreich aus, ohne es zu sein — eine grüne Pipeline, die nie ein Artefakt hochlud; ein veröffentlichtes npm-Paket ohne Inhalt; ein Blueprint, der bei jedem Lauf verworfen wurde, während Flux grün meldete.
Keiner davon wurde durch eine Überwachung gefunden. Vier durch Zufall beim Suchen nach etwas anderem. Genau diese Lücke schließt das Skript.
Was geprüft wird
Jede Prüfung bildet einen real passierten Fall ab. Nichts steht hier auf Vorrat.
| Prüfung | Der Fall dahinter |
|---|---|
| Repo ohne aktiven Push-Mirror | game-operating wurde angelegt und nie gespiegelt — auf Gitea existierte es nicht |
| Mirror-Drift | MIRROR-01 (management#28): fällt der Mirror aus, liefert Flux still den letzten Stand weiter |
| Pipeline mit null Jobs | ThreadNet-Web 203/204, threadnet-call 187 — rot, ohne dass etwas kaputt war |
| Erfolgreicher Job ohne Artefakt | build_embedded lief seit jeher grün und lud nichts hoch |
| npm-Paket zu klein | 0.19.2-threadnet.6: 12,5 KB statt 12,8 MB, ohne dist/ |
| Authentik-Blueprint ≠ successful | matrix-recovery-flow wurde tagelang bei jedem Lauf verworfen |
Die Projektliste wird zur Laufzeit aus der Gruppe gelesen, nicht im Code gepflegt — eine Liste im Quelltext wäre genau die Stelle, an der ein neues Repo jahrelang durchrutscht. (Beim ersten Lauf kamen so zwei Projekte zum Vorschein, die niemand auf dem Schirm hatte.)
Wie sie läuft
Geplanter CI-Job im management-Repo, zusätzlich von Hand über Run pipeline
auslösbar. Befunde färben die Pipeline rot — das ist bei uns die Alarmanlage,
nicht ein zusätzlicher Meldeweg (siehe gitops/CLAUDE.md zur TURN-Rotation).
Lokal:
export GITLAB_TOKEN=$(cat ~/.config/gitlab-lab/token)
export LAB_CA=.../ci/lab-ca-chain.crt
python3 scripts/stillstandspruefung.py
Zwei Regeln für diese Prüfung
Ein Befund wird zum Issue, nicht weggeklickt. Sonst wird die Prüfung zu dem, was sie sucht: etwas, das läuft, ohne dass jemand hinsieht.
⚠️ Fehlt ein Zugang, bricht sie ab — sie überspringt sich nicht still. Eine Prüfung, die sich bei fehlendem Token selbst deaktiviert, ist wertlos: Sie meldet dann jahrelang nichts, und niemand merkt den Unterschied zu „alles in Ordnung". Ausnahme sind die klar benannten optionalen Teile (Authentik), die ihr Fehlen im Ergebnis ausweisen.
Erweitern
Neue Prüfungen kommen dazu, wenn wieder etwas still ausgefallen ist — mit einem Docstring, der den konkreten Fall nennt. Prüfungen auf Verdacht erzeugen Rauschen und kosten die Glaubwürdigkeit, die diese hier braucht.