diff --git a/docs/issues/0099-threadnet-web-12-upstream-sicherheitsfixes-lassen-sich-nicht-m.md b/docs/issues/0099-threadnet-web-12-upstream-sicherheitsfixes-lassen-sich-nicht-m.md index 000b7dc..29d4d80 100644 --- a/docs/issues/0099-threadnet-web-12-upstream-sicherheitsfixes-lassen-sich-nicht-m.md +++ b/docs/issues/0099-threadnet-web-12-upstream-sicherheitsfixes-lassen-sich-nicht-m.md @@ -160,3 +160,72 @@ einer falschen Zielmarke. Der Basisstand liegt zwischen 1.12.17 und 1.12.18 und damit klar unter 1.12.22 — `GHSA-wrcp-5v3v-3j6v` trifft uns weiterhin. Die Korrektur ändert die Dringlichkeit nicht, nur den Weg dorthin. + +## Schritt 3 beantwortet 2026-08-19 — der Graft trägt, und er halbiert das Problem + +Volle Upstream-Historie geholt (70.330 Commits, `.git` wächst von 87 MB auf 603 MB). +Damit ließ sich der gesuchte gemeinsame Vorfahre **suchen statt raten**. + +### Die Basis ist `deadd548` vom 2026-05-08 + +Verfahren: für jeden `develop`-Commit im Fenster 25.04.–16.05. die Zahl der gegen +unseren Import abweichenden Dateien messen — der Basis-Commit ist das Minimum. Gemessen +wurde **der Baum, nicht das Datum**. + +Ergebnis: `deadd548` („Update storybook", #33437) mit **43 abweichenden Dateien** — +gegenüber **783** beim fälschlich angenommenen Tag `v1.12.17`. Und diese 43 zerfallen +sauber: + +| Art | Anzahl | Was es ist | +|---|---|---| +| nur Modus (755 → 644) | **31** | der Import-Bug, den die Fork-Doku als historisch beschreibt | +| echte Inhaltsänderung | 12 | davon 5 + 1 Test = **unser Discord-Feature**, dazu `LICENSE` und `CHANGELOG.md` | +| Hinzufügungen | 2 | unsere Feature-Dateien | + +Der inhaltliche Rest ist also **genau das, was wir damals selbst geändert haben**. Damit +ist `deadd548` der Stand, aus dem der Fork genommen wurde. + +### Der Graft wurde getestet, nicht behauptet + +In einem **Wegwerf-Klon** (Produktions-Repo unberührt, danach entfernt): + +| | | +|---|---| +| vor dem Graft | `git merge-base main upstream/develop` → **leer** | +| nach `git replace --graft 3da3635 deadd548` | gemeinsamer Vorfahre **`deadd548`** | +| `git merge upstream/develop` | läuft durch, **32 konfliktbehaftete Dateien** | + +⚠️ Ein Zwischenergebnis war wertlos und wäre fast als Erfolg durchgegangen: Der erste +Merge-Versuch gegen `v1.12.26` meldete „0 Konflikte" — er war aber **gar nicht +gelaufen** („refusing to merge unrelated histories"), weil der Tag flach geholt war und +nur einen einzigen Commit trägt. Erst die Gegenprobe auf `MERGE_HEAD` deckte das auf. + +### Was die 32 Konflikte sind + +**Nur vier sind Quellcode** — und es sind genau unsere Patches: +`MImageBody.tsx`, `MAudioBody.tsx` (ClamAV), `SdkConfig.ts` (Branding), +`RoomListItemViewModel.ts` (Discord-Feature). Der Rest sind +`.github/workflows/*` (die Fork-Doku führt sie als „gering — eigene Strecke") und +`pnpm-lock.yaml`, das ohnehin regeneriert wird. + +### Was das ändert + +Aus „neuen Upstream-Baum beschaffen und **zwölf Patches von Hand neu auftragen**" wird +„**vier Quellcode-Konflikte in einem normalen Drei-Wege-Merge** lösen". + +Wichtiger noch ist die stille Gefahr, die verschwindet. Das Issue warnt: *„Verschiebt +Element beim MVVM-Umbau eine der `viewmodels/`-Dateien, entsteht kein Konflikt — unsere +Zeilen sind schlicht weg, und Git meldet nichts."* Mit echtem gemeinsamem Vorfahren +**meldet Git es**. Das ist der eigentliche Gewinn, nicht die Zahl. + +### Entscheidung, die noch aussteht + +Der Graft ist eine **lokale** Ersetzung (`refs/replace/*`). Damit alle davon haben, +müsste er mitgeliefert werden — `git push origin 'refs/replace/*'` und ein Hinweis in +der Doku, dass Klone `git fetch origin 'refs/replace/*:refs/replace/*'` brauchen. +Alternative: kein Graft, sondern beim nächsten Update einmalig einen echten +Merge-Commit mit `--allow-unrelated-histories` bauen und ab dann normal weitermergen. + +Beides ändert die Historie-Wahrnehmung des Repos dauerhaft und ist damit +**ADR-pflichtig**. Entscheidung sorb steht aus; Schritt 4 (Auftragsverfahren für die +Patches) wird bei Weg 1 oder 2 weitgehend gegenstandslos.