docs: first retro, and the ADR the history rewrite should have had

Retro 2026-08-09, the first one under the framework. Main finding: six silent failures in nine days - a green pipeline that uploaded nothing, a broken npm package, a blueprint rejected on every run, a working copy tracking the forbidden remote, empty pipelines going red for nothing, and a release build that nearly overwrote a published image. None was found by monitoring; four surfaced by accident while looking for something else.

ADR-0009 documents the commit conventions and the retroactive anonymisation of 251 commits. It is filed after the fact, which is exactly the mistake the ADR duty exists to prevent - stated in the ADR rather than smoothed over.

Also recorded: assigning status:next and reassigning milestones are forbidden to a session acting alone; both happened here in the refinement with sorb, so the rule stands unweakened.
This commit is contained in:
Thore Cimbal
2026-08-09 12:00:00 +00:00
parent 46c61e1c1e
commit 0fde69a6f2
3 changed files with 221 additions and 0 deletions
@@ -0,0 +1,92 @@
# 0009 — Commit-Konventionen und rückwirkende Anonymisierung der Historie
**Status:** akzeptiert · **Datum:** 2026-08-07 (Regel) / 2026-08-09 (Durchführung) · **Entscheider:** sorb
> Nachgetragen am 2026-08-09 in der [Retro](../verfahren/retro/2026-08-09.md). Die
> Entscheidung war getroffen und ausgeführt, bevor sie als ADR vorlag — das ist
> genau der Fehler, den die ADR-Pflicht verhindern soll, und wird hier benannt
> statt geglättet.
## Kontext
Commit-Zeitstempel geben Arbeitszeiten preis. Bei einem Ein-Personen-Projekt mit
öffentlichem Gitea-Spiegel heißt das: Jeder, der die Repos liest, kann ablesen, an
welchen Abenden und bis wann gearbeitet wurde. Vor der Umstellung standen die
Commits eines Tages typischerweise zwischen 17:00 und 23:00 — ein Muster, das
nichts mit der Software zu tun hat.
Dazu kam eine uneinheitliche Sprache in den Commit-Nachrichten (Deutsch und
Englisch gemischt) und drei Autoren-Identitäten für dieselbe Person.
## Entscheidung
**Regel ab 2026-08-07**, gültig für alle Repos der Gruppe `axion1337.chat` und die
ThreadNet-Dienste:
- Nachrichten auf **Englisch**, Conventional-Commit-Stil
- Autor- **und** Committer-Datum auf **12:00:00 UTC des laufenden Tages**
**Rückwirkend angewandt am 2026-08-09** auf **251 Commits** — alles aus dieser
Zusammenarbeit, nicht die davor liegende Historie:
| Repo | umgeschrieben | Grenze |
|---|---|---|
| gitops | 117 von 264 | ab 2026-07-27 |
| management | 78 von 78 | vollständig |
| ThreadNet-Web | 47 von 50 | ab 2026-07-28 |
| threadnet-call | 9 von 9 | vollständig |
Dabei wurden 17 Tags mit umgezogen und die Autoren-Identitäten vereinheitlicht —
**mit Ausnahme des `turn-secret-rotation`-Bots**, dessen Commits maschinell
entstehen und deren Zuschreibung an einen Menschen falsch wäre.
Zeitstempel wurden auf **12:00 UTC des jeweils eigenen Tages** gesetzt, nicht auf
ein einheitliches Datum: Der Tag bleibt damit als Information erhalten, die
Uhrzeit verschwindet.
## Konsequenzen
- **Der Inhalt ist unverändert.** Alle Trees sind bitgleich, Nachrichten und
Merge-Struktur erhalten — geprüft über alle 251 Paare.
- **Alle SHAs im Bereich sind neu.** Verweise in Issues, Doku und Commit-Texten
zeigen ins Leere. Die Doku wurde nachgezogen (12 Stellen); für alles andere gibt
es die dauerhafte Zuordnungstabelle
[`shared/commit-zuordnung-2026-08-07.md`](../shared/commit-zuordnung-2026-08-07.md).
- **Issue-Kommentare wurden bewusst NICHT umgeschrieben.** Eine Tabelle
nachzuschlagen ist zumutbar; nachträglich zu ändern, was jemand geschrieben hat,
beschädigt dieselbe Nachvollziehbarkeit ein zweites Mal.
- **Container-Images verweisen auf Commits, die es nicht mehr gibt.** Sie laufen
unverändert; ihre Herkunft ist nur über die Tabelle auflösbar.
- **Branch- und Tag-Schutz mussten vorübergehend gelockert werden.** Beide sind
wieder aktiv.
⚠️ **Der Nutzen ist begrenzt, und das gehört zur Entscheidung.** Geschützt ist
allein die Git-Historie. Push-Zeiten, Issue- und Kommentar-Zeitstempel,
Pipeline-Läufe und Paket-Veröffentlichungen tragen weiterhin die echte Uhrzeit,
liegen im selben GitLab und teilweise auf dem öffentlichen Spiegel — und sind
**feiner** als Commit-Zeiten, weil es mehr davon gibt. Wer wirklich kein Muster
ableitbar haben will, muss dort ansetzen. Diese ADR löst das nicht.
## Was dabei fast schiefging
Das Force-Push der umgezogenen Tags hat in ThreadNet-Web **drei Release-Pipelines
neu gestartet**. Ohne Sperre hätte `docker_web` das veröffentlichte Image
`v0.4.0` aus altem Quellcode gegen heutige Basis-Images neu gebaut und
überschrieben. Verhindert hat es allein, dass die geschützten Registry-Variablen
in diesem Fenster nicht verfügbar waren — **Zufall, nicht Planung**. Behoben in
ThreadNet-Web#14; die Sperre ist seit `3cb43f5` scharf.
## Verworfene Alternativen
- **Nur vorwärts, Historie unangetastet.** War die Empfehlung: kein Risiko, keine
toten Verweise, und der Nutzen des Rewrites ist durch die Plattform-Zeitstempel
ohnehin begrenzt. sorb hat sich bewusst dagegen entschieden — die Git-Historie
ist der Teil, der geklont und weitergegeben wird.
- **Alles umschreiben, auch die Vor-Historie.** Hätte fremde Autorenschaft
angefasst (`Scrublord@Mac.Bad`, 135 Commits aus der Zeit vor dieser
Zusammenarbeit) und den Nutzen nicht erhöht.
- **Ein einheitliches Datum für alle Commits.** Hätte die zeitliche Reihenfolge
unlesbar gemacht, ohne mehr zu schützen als der Tagesstempel.
- **Auch die Commit-Nachrichten rückwirkend übersetzen.** 251 Nachrichten neu zu
formulieren hieße, die darin festgehaltenen Begründungen umzuschreiben —
Inhaltsverlust für einen Stilgewinn, den nur die Vergangenheit hätte.