docs(fork): der Anschluss ist vollzogen - Abschnitt 4 war der Zustand davor

Abschnitt 4 beschreibt das Repo ohne gemeinsamen Vorfahren. Seit dem Merge am
2026-08-19 (88c4e15) stimmt das nicht mehr. Er bleibt stehen, weil er die
Messungen enthaelt, auf denen ADR-0022 beruht - jetzt aber als historisch
markiert und mit Verweis nach unten.

Neuer Abschnitt: wie ein Upstream-Update heute laeuft (gewoehnlicher Merge), was
beim Aufloesen zu pruefen ist, das Typpruefungs-Tor in der CI, und die drei
Fallstricke, die beim ersten Mal Zeit gekostet haben - shallow-Grenze, .npmrc im
Docker-Kontext, Erstschub auf den Gitea-Spiegel.

Der wichtigste Satz darin ist der ueber den umgekehrten Fall: Der Merge meldet,
wenn Upstream unsere Zeilen wegschiebt, aber nicht, wenn beide Seiten die
Aufloesung ueberleben und nur eine noch Sinn ergibt. Daran starb v0.6.0-rc.2.
This commit is contained in:
Thore Cimbal
2026-08-20 12:00:00 +00:00
parent ac343e9347
commit 6632ad5a80
+67
View File
@@ -55,6 +55,11 @@ Beide behoben.
## 4. Merge-Reibung: was ein Upstream-Update wirklich kostet
> ⚠️ **Historisch seit 2026-08-19.** Dieser Abschnitt beschreibt den Zustand *ohne*
> gemeinsamen Vorfahren. Der ist behoben — siehe „Upstream-Update seit dem Anschluss"
> weiter unten. Der Abschnitt bleibt stehen, weil er die Messungen enthält, auf denen
> die Entscheidung beruht (management ADR-0022).
*Arbeitspaket 3 aus ThreadNet-Web#7. Gemessen am 2026-08-06, nicht geschätzt.*
### Die unangenehme Grundlage zuerst
@@ -214,3 +219,65 @@ git diff v1.12.17 v1.12.26 -- <datei> # was Upstream seither geaendert ha
⚠️ Ein flacher Fetch liefert **keine Historie**: `git merge-base`, `git log` über
Upstream und ein Graft-Versuch brauchen `git fetch upstream` ohne `--depth`.
## Upstream-Update seit dem Anschluss (seit 2026-08-19)
**Der Fork hängt wieder an der Upstream-Historie.** Am 2026-08-19 wurde `v1.12.26` mit
einem echten Merge-Commit hereingeholt (`88c4e15`, beide Eltern: unser bisheriger
`main` `fa5dcc5` und `c43ef70b` = `v1.12.26`). Entscheidung und Messungen stehen in
management ADR-0022 und #0099.
Ein Update ist damit ein **gewöhnlicher Merge** — kein Auftragen von Patches mehr:
```sh
git fetch upstream # ohne --depth, sonst fehlt die Historie
git merge v1.12.27 # oder der gewuenschte Tag
```
### Worauf beim Auflösen zu achten ist
Der Merge meldet jetzt, wenn Upstream eine Datei verschiebt, die wir angefasst haben —
das war der Zweck der Übung, und es hat beim ersten Mal funktioniert (die Umbenennung
`RoomListItemAccessibilityWrapper``RoomListItemWrapper` kam als Konflikt).
⚠️ **Was er NICHT meldet, ist der umgekehrte Fall:** Beide Seiten überleben die
Auflösung, und nur eine ergibt noch Sinn. Genau das brach `v0.6.0-rc.2` in Produktion —
in `RoomListItemViewModel.ts` blieb eine `getValue`-Zeile auf den von Upstream
entfernten Labs-Schalter `feature_room_list_sections` stehen, direkt über der neuen
Zeile mit `RoomList.showSections`. Niemand las sie, sie warf trotzdem — bei jedem
Raumlisteneintrag.
Nach dem Auflösen deshalb auf **überlebende** Reste prüfen, nicht nur auf verlorene
Zeilen. Der billigste Hebel ist `pnpm -r lint:types`; er fand beide Reste sofort. Wo
Zeichenketten statt Typen im Spiel sind — Einstellungsschlüssel, Feature-Namen,
Übersetzungs-IDs — reicht das nicht, dort braucht es einen Abgleich gegen die
jeweilige Registry.
### Das Tor in der CI
`typecheck` in `.gitlab-ci.yml` prüft `pnpm -r lint:types` über den ganzen Baum;
`docker_web`, `desktop_linux` und `desktop_windows` führen ihn als `needs`. **Kein
Artefakt entsteht ohne bestandene Typprüfung.**
Maßstab ist „kein Fehler außerhalb von `node_modules`", nicht „`tsc` sauber": Upstream
v1.12.26 ist selbst nicht typrein — `matrix-js-sdk@42.2.0` wirft drei Fehler in der
eigenen Quelle (`skipLibCheck` deckt nur `.d.ts` ab), nachgeprüft in einem sauberen
v1.12.26-Checkout. Fällt das bei einem Upstream-Wechsel weg, verschärft sich der Job
von allein.
Der Job existiert, weil `web` **nur baut**: webpack entfernt Typen, ohne sie zu prüfen,
und ein unbekannter Einstellungsschlüssel ist zur Bauzeit bloß ein String. `tsc` meldete
den rc.2-Fehler die ganze Zeit — gefragt hatte ihn niemand.
### Fallstricke, die beim ersten Mal Zeit gekostet haben
- **`--depth=1` geholte Tags** tragen eine `.git/shallow`-Grenze. Jeder Merge-Versuch
scheitert dann mit „refusing to merge unrelated histories", was wie ein
Grundproblem aussieht und keines ist. `git fetch --unshallow upstream` löst es.
- **`.npmrc` muss im Docker-Build-Kontext liegen**, sonst löst pnpm `@sorb/*` gegen
npmjs auf. Unter pnpm 10 fiel das nicht auf, weil `--frozen-lockfile` die gepinnte
Tarball-URL nahm; pnpm 11 prüft mit `minimumReleaseAgeStrict` jeden Eintrag und löst
wieder auf (management #0055).
- **Der Gitea-Spiegel** trägt nach dem Merge 70.000 fremde Commits. Der Erstschub
scheitert, wenn das Ziel-Repo nicht sauber gepackt ist — erst dessen Zustand messen
(`count-objects -vH`, freier Platz), dann übertragen (#0099).