game-operating was made private on Gitea, and the check quietly skipped the mirror comparison. A repo that IS mirrored but whose far side cannot be read is unverified, and unverified must not look like fine. It is now a finding that names the missing GITEA_TOKEN. While testing that, a second bug surfaced: the header helper built 'Authorization: token: <value>' from a name that already contained the schema, producing a silently invalid header. The Authentik check had the same defect and would have failed the moment a token was added - it never ran, so nobody would have connected the two. Refs axion1337.chat/management#28, #31
3.2 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 GITEA_TOKEN=$(cat ~/.config/gitea-rohana/push-token) # fuer private Spiegel
export LAB_CA=.../ci/lab-ca-chain.crt
python3 scripts/stillstandspruefung.py
Zwei Regeln für diese Prüfung
Ein „kann nicht geprüft werden" ist ein Befund, kein Übersprungen. Real
aufgefallen am 2026-08-09: game-operating wurde auf Gitea privat gestellt, und
die Prüfung übersprang den Mirror-Abgleich klaglos. Ein Repo, das gespiegelt wird,
dessen Gegenseite aber unlesbar ist, ist ungeprüft — und das darf nicht wie
„in Ordnung" aussehen.
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.