FB-12 point 3: the declared-extended files are deliberately outside the
byte comparison, so nothing reported when upstream changed them. Two of
three were touched between v0.1.1 and v0.3.1 and it only surfaced because
someone thought of it.
Two checks added to the script that already owns the subject, rather than
a second script beside it:
* completeness — every vendored file belongs to exactly one class.
check_harvest.py and judge.py were adopted byte-for-byte during the
upgrade and never entered the pair list; nothing compared them.
* reconciliation — if upstream touched an extended file between the
previous and the current baseline, ABGLEICH.tsv of the new baseline
must acknowledge it.
The acknowledgement lives in its own file on purpose. The first draft
searched HERKUNFT.md's prose for the filename, which is always there in
the inventory table: strict-looking and inert. Its selftest missed that
because the fixture was an unrealistically empty note; the counterfactual
against real history caught it.
Ten assertions, twelve deliberate breaks, none uncovered. Two of the
breaks exposed two useless assertions.
104 lines
4.2 KiB
YAML
104 lines
4.2 KiB
YAML
# CI des management-Repos. Enthaelt bewusst nur die Stillstandspruefung — hier
|
|
# liegt Dokumentation, es gibt nichts zu bauen.
|
|
#
|
|
# Die Pruefung sucht Dinge, die leise aufgehoert haben zu funktionieren. Anlass ist
|
|
# die Retro vom 2026-08-09: sechs solcher Faelle in neun Tagen, keiner davon durch
|
|
# eine Ueberwachung gefunden.
|
|
|
|
# Ohne workflow-Block legt GitLab auch dann eine Pipeline an, wenn KEIN Job auf sie
|
|
# passt, und fuehrt sie als "failed" - rot ohne Fehler, genau das, wogegen #0104
|
|
# angeht. Die drei Jobs unten decken schedule, web und push ab; ein API-Trigger
|
|
# traefe keinen davon. Im gitops-Repo ist dieser Fall am 2026-08-19 real eingetreten
|
|
# (Pipeline 518), hier wird er vorbeugend ausgeschlossen.
|
|
workflow:
|
|
rules:
|
|
- if: $CI_PIPELINE_SOURCE == "schedule"
|
|
- if: $CI_PIPELINE_SOURCE == "web"
|
|
- if: $CI_PIPELINE_SOURCE == "push"
|
|
- when: never
|
|
|
|
stages:
|
|
- pruefen
|
|
|
|
# Nur geplant und von Hand. Bei jedem Doku-Commit zu laufen brächte nichts —
|
|
# die Pruefung sieht auf den Zustand des Verbunds, nicht auf diesen Commit.
|
|
stillstandspruefung:
|
|
stage: pruefen
|
|
image: python:3.12-alpine
|
|
rules:
|
|
- if: $CI_PIPELINE_SOURCE == "schedule"
|
|
- if: $CI_PIPELINE_SOURCE == "web"
|
|
variables:
|
|
LAB_CA: "$CI_PROJECT_DIR/ci/lab-ca-chain.crt"
|
|
before_script:
|
|
- apk add --no-cache curl ca-certificates >/dev/null
|
|
script:
|
|
# Ohne Token laeuft nichts — und das soll laut auffallen. Eine Pruefung, die
|
|
# sich still selbst ueberspringt, waere genau der Fehler, den sie sucht.
|
|
- |
|
|
if [ -z "$GITLAB_TOKEN" ]; then
|
|
echo "GITLAB_TOKEN fehlt (Gruppen-Token mit read_api)."
|
|
echo "Ohne Lesezugriff kann nichts geprueft werden - siehe management#31."
|
|
exit 1
|
|
fi
|
|
- python3 scripts/stillstandspruefung.py
|
|
# Befunde sind kein Betriebsausfall, aber sie sollen sichtbar bleiben. Die rote
|
|
# Pipeline ist bei uns die Alarmanlage (gitops/CLAUDE.md, TURN-Rotation).
|
|
allow_failure: false
|
|
|
|
# Offline-Gate bei jedem Push: Artefakte gegen schema.yaml, STATUS.md
|
|
# aktuell, Framework-Dateien unveraendert (Design 2026-08-11, Slice 1).
|
|
# Braucht nur den Baum - bewusst ohne Token und ohne Netz.
|
|
validate:
|
|
stage: pruefen
|
|
image: python:3.12-alpine
|
|
variables:
|
|
# Volle Historie: pruefe_sperrliste.py vergleicht gegen den Vorgaenger-
|
|
# Commit. Im flachen Klon faellt es auf HEAD~1 zurueck und sagt das -
|
|
# genau messen ist aber besser als benannt lueckenhaft. Repo ist klein.
|
|
GIT_DEPTH: "0"
|
|
rules:
|
|
- if: $CI_PIPELINE_SOURCE == "push"
|
|
before_script:
|
|
- apk add --no-cache git >/dev/null # pruefe_prosa.py braucht git cat-file
|
|
- pip install --quiet pyyaml
|
|
script:
|
|
- python3 scripts/validate.py
|
|
- python3 scripts/gen_status.py --check
|
|
- python3 scripts/pruefe_upstream_drift.py
|
|
# Positivkontrolle der Drift-Pruefung: sie traegt seit dem 2026-08-21
|
|
# die Vollstaendigkeits- und die Abgleichspruefung (FB-12), und ihr
|
|
# erster Entwurf der letzteren war wirkungslos. Ein Tor, das nur gruen
|
|
# gesehen wurde, ist eine Vermutung.
|
|
- python3 scripts/pruefe_upstream_drift.py --selbsttest
|
|
- python3 scripts/pruefe_prosa.py
|
|
# Sperrliste (FRAMEWORK-BEFUNDE FB-10): angenommene ADRs und docs/sources
|
|
# sind unveraenderlich. Braucht den Vorgaenger-Commit im Klon.
|
|
- python3 scripts/pruefe_sperrliste.py
|
|
allow_failure: false
|
|
|
|
# Verbund-Prüfung (ADR-0012/0013): Gruppenliste vs. docs/components/,
|
|
# Pointer-Praesenz, Meilenstein-/Prioritaetspflicht, Issue-Drift,
|
|
# Git-Hygiene. Gleiche Regeln wie die Stillstandspruefung: geplant/von
|
|
# Hand, rot = Alarm, Abbruch ohne Token.
|
|
gruppenpruefung:
|
|
stage: pruefen
|
|
image: python:3.12-alpine
|
|
rules:
|
|
- if: $CI_PIPELINE_SOURCE == "schedule"
|
|
- if: $CI_PIPELINE_SOURCE == "web"
|
|
variables:
|
|
# gruppenpruefung.py spricht die git.lab-API per urllib an; git.lab läuft
|
|
# über die private aXionLabs-CA. Python honoriert SSL_CERT_FILE im Default-Context.
|
|
SSL_CERT_FILE: "$CI_PROJECT_DIR/ci/lab-ca-chain.crt"
|
|
before_script:
|
|
- apk add --no-cache git >/dev/null # gruppenpruefung.py ruft 'git log' auf
|
|
script:
|
|
- |
|
|
if [ -z "$GITLAB_TOKEN" ]; then
|
|
echo "GITLAB_TOKEN fehlt (Gruppen-Token mit read_api)."
|
|
exit 1
|
|
fi
|
|
- python3 scripts/gruppenpruefung.py
|
|
allow_failure: false
|