diff --git a/STATUS.md b/STATUS.md index ec177ad..859ad57 100644 --- a/STATUS.md +++ b/STATUS.md @@ -2,9 +2,9 @@ -## Issues (59 open, 40 closed) +## Issues (58 open, 41 closed) -Verteilung: M1 12 · M2 17 · M3 4 · M4 11 · M5 15 +Verteilung: M1 11 · M2 17 · M3 4 · M4 11 · M5 15 | Issue | Status | Meilenstein | Priorität | Title | |---|---|---|---|---| @@ -61,7 +61,6 @@ Verteilung: M1 12 · M2 17 · M3 4 · M4 11 · M5 15 | [0095](docs/issues/0095-threadnet-web-6-windows-desktop-code-signing-installer-brandi.md) | open | M4 | low | Windows-Desktop: Code-Signing (+ Installer-Branding) | | [0096](docs/issues/0096-threadnet-web-7-rebranding-element-axion1337-web-desktop-gesa.md) | waiting | M4 | medium | Rebranding: Element → aXion1337 (Web + Desktop, Gesamtklammer) | | [0097](docs/issues/0097-threadnet-web-9-feedback-bugreport-weg-eigener-rageshake-oder.md) | open | M4 | low | Feedback-/Bugreport-Weg: eigener Rageshake oder Alternative (Zammad nachhalten) | -| [0099](docs/issues/0099-threadnet-web-12-upstream-sicherheitsfixes-lassen-sich-nicht-m.md) | open | M1 | medium | Upstream-Sicherheitsfixes lassen sich nicht mergen — kein gemeinsamer Vorfahre | | [0100](docs/issues/0100-threadnet-web-13-asset-pfade-tragen-weiterhin-element-themes-e.md) | open | M4 | low | Asset-Pfade tragen weiterhin "element" (themes/element/…) | | [0101](docs/issues/0101-threadnet-call-4-kaputtes-paket-0-19-2-threadnet-6-in-der-regi.md) | open | M4 | low | Kaputtes Paket 0.19.2-threadnet.6 in der Registry — Herkunft ungeklärt | | [0102](docs/issues/0102-dmarc-und-mail-haertung-der-zone-axion1337-chat.md) | open | M1 | medium | DMARC der Plattform-Zone `axion1337.chat` steht auf p=none — und gehört IONOS, nicht uns | diff --git a/docs/adr/0022-upstream-anschluss-durch-einmaligen-merge.md b/docs/adr/0022-upstream-anschluss-durch-einmaligen-merge.md index 0140ea7..cc52102 100644 --- a/docs/adr/0022-upstream-anschluss-durch-einmaligen-merge.md +++ b/docs/adr/0022-upstream-anschluss-durch-einmaligen-merge.md @@ -73,3 +73,31 @@ und ohne diese Messung wäre der Merge auf eine erfundene Grundlage gelaufen. empfangen) ist der Merge nicht abgenommen. - Schritt 4 aus #0099 — ein Verfahren zum Auftragen der Patches — wird damit gegenstandslos. + +## Nachtrag 2026-08-19: ausgeführt, und was die Ausführung korrigiert + +Vollzogen. `ThreadNet-Web:main` steht auf `8ca03fe`, der Merge-Commit `88c4e15` trägt +beide echten Eltern. Produktion läuft auf `v0.6.0`. Zwei Annahmen dieser ADR haben sich +in der Praxis verschoben: + +**Die stille Klasse verschwindet nicht ganz — sie dreht sich um.** Die Entscheidung +begründet sich damit, dass Git künftig meldet, wenn Upstream eine Datei verschiebt, die +wir angefasst haben. Das hat gehalten (`RoomListItemWrapper`-Umbenennung wurde als +Konflikt gemeldet). Was ein Drei-Wege-Merge **nicht** meldet, ist der umgekehrte Fall: +Beide Seiten überleben die Auflösung, aber nur eine ergibt noch Sinn. Genau das brach +`v0.6.0-rc.2` in Produktion — eine `getValue`-Zeile auf einen von Upstream entfernten +Einstellungsschlüssel, die niemand mehr liest und die trotzdem wirft. + +**Ein grüner Build ist keine Abnahme, und war nie eine.** Diese ADR sagt richtig +„Abnahme ist kein Build, sondern ein Funktionstest" — gemeint war der ClamAV-Test. Der +rc.2-Vorfall zeigt die Lücke davor: Der CI-Job `web` **baut** nur, webpack entfernt +Typen ohne sie zu prüfen. `tsc` meldete den Fehler durchgehend, gefragt hatte ihn +niemand. Seit `8ca03fe` führt `docker_web` den Job `typecheck` als `needs`; kein Image +entsteht mehr ohne bestandene Typprüfung. + +**Daraus die stehende Regel für künftige Upstream-Merges:** Nach der Konfliktauflösung +gehört eine Prüfung auf *überlebende* Reste — nicht nur auf verlorene Zeilen. Der +billigste Hebel ist die Typprüfung; sie fand beide Reste sofort. Wo Zeichenketten statt +Typen im Spiel sind (Einstellungsschlüssel, Feature-Namen, Übersetzungs-IDs), reicht sie +nicht, und es braucht einen Abgleich gegen die jeweilige Registry — für Einstellungen +wurde er einmalig gefahren: 135 abgefragte gegen 152 registrierte. 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 a31d19d..817b75b 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 @@ -1,7 +1,7 @@ --- type: issue id: "0099" -status: open +status: done created: 2026-08-06 milestone: M1 priority: medium @@ -295,3 +295,95 @@ bleibt im Klon liegen, damit der nächste Anlauf nicht wieder 600 MB holen muss. **Nächster Schritt:** den Merge als eigenes Vorhaben fahren, mit Build und ClamAV-Abnahme als Voraussetzung — nicht als Nebenschritt. + +## Ausgeführt und abgenommen 2026-08-19 — `v0.6.0` läuft in Produktion + +Der Merge ist vollzogen. `ThreadNet-Web:main` steht auf `8ca03fe`; der Merge-Commit +`88c4e15` trägt beide echten Eltern (`fa5dcc5` = unser bisheriger `main`, +`c43ef70b` = `v1.12.26`). Damit ist die Abstammung hergestellt, der Graft ist weg, +und `GHSA-wrcp-5v3v-3j6v` ist mit dem Versionssprung erledigt. + +### Die beiden Produktentscheidungen aus dem Abschnitt davor + +| Zeile | Auflösung | Beleg | +|---|---|---| +| `@sorb/threadnet-call-embedded` | **unsere** behalten, `0.19.2-threadnet.12` | auf `main` und im Zweig identisch — die KI-Geräuschunterdrückung (#0054) ist unberührt | +| `matrix-js-sdk` | **Upstreams** `42.2.0` genommen, Git-Ref-Pin fällt weg | Build läuft; der seinerzeitige Build-Fix hat sich erübrigt | + +### Drei Anläufe, zwei davon gescheitert + +| | | +|---|---| +| `v0.6.0-rc.1` | **kein Image.** `docker_web` scheiterte: `.npmrc` stand nie in der `COPY`-Zeile des Dockerfiles. Unter pnpm 10 folgenlos, weil `--frozen-lockfile` die gepinnte Tarball-URL nahm; pnpm 11 prüft mit `minimumReleaseAgeStrict` das Alter jedes Eintrags, löst den Scope wieder auf und landet ohne `.npmrc` bei npmjs → 404. Genau der Ablauf, den die `.npmrc` selbst vorhersagt (#0055). | +| `v0.6.0-rc.2` | **ging live und brach die Raumliste.** Nach wenigen Minuten auf `v0.5.4` zurückgenommen. Siehe unten. | +| `v0.6.0-rc.3` | Abnahme bestanden, als `v0.6.0` freigegeben. | + +### Der rc.2-Vorfall — eine stille Leiche der anderen Sorte + +`RoomListItemViewModel.ts` rief `SettingsStore.getValue("feature_room_list_sections")` +auf einen Labs-Schalter, den Upstream **entfernt** hat; Sektionen laufen dort über +`RoomList.showSections`. Die Auflösung hatte überall Upstreams Seite genommen — Menü, +View, Snapshot, Typen — und nur diese eine `const`-Zeile aus unserer Seite stehen +lassen. Sie wurde tree-weit von niemandem gelesen und warf trotzdem: bei **jedem** +Raumlisteneintrag, als `react-soft-crash`. + +Bemerkenswert ist die Richtung: Dieses Issue warnt vor Zeilen, die *verschwinden*. +Hier ist eine Zeile **übrig geblieben**, die verschwinden musste. Der Merge meldet +Konflikte, wo Dateien wandern — er merkt aber nicht, wenn beide Seiten überleben und +nur eine davon noch Sinn ergibt. + +Abgesichert statt gehofft: alle **135** im Quellbaum abgefragten Einstellungen gegen +die **152** in `Settings.tsx` registrierten verglichen — genau diese eine Leiche, +keine weitere. Ein zweiter Rest derselben Art (ungenutzter Import +`ElementDesktopLogoSvg` in `SdkConfig.ts`) war harmlos; geprüft wurde dabei +ausdrücklich, ob unser Rebrand gelitten hat — hat er nicht, `desktopBuilds` trägt +weiter eigenes Logo und eigenen Release-Pfad. + +### Warum kein Build das fangen konnte — und was daraus folgt + +Der CI-Job `web` führt ausschließlich `pnpm --dir apps/web build` aus. webpack +entfernt Typen, ohne sie zu prüfen; ein unbekannter Einstellungsschlüssel ist zur +Bauzeit bloß ein String. `tsc` dagegen meldete den Fehler die ganze Zeit — **zweimal** +(`TS2345` unbekannter Schlüssel, `TS6133` ungenutzte Konstante). Gefragt hatte ihn +niemand. + +Konsequenz, umgesetzt in `8ca03fe`: neuer Job `typecheck`, den `docker_web` als +`needs` führt. **Kein Image mehr ohne bestandene Typprüfung.** Maßstab ist „kein +Fehler außerhalb von `node_modules`", weil Upstream v1.12.26 selbst nicht typrein ist +— `matrix-js-sdk@42.2.0` wirft drei Fehler in der eigenen Quelle, in einem sauberen +v1.12.26-Checkout gegengeprüft. + +⚠️ Das Tor wäre beim Bau selbst fast wertlos geworden: Das erste `grep "error TS"` +hätte nie gegriffen, weil nx auch in der Pipe färbt und zwischen `error` und `TS` eine +Escape-Sequenz steht. Es ist jetzt in **beide** Richtungen belegt — mit wieder +eingesetzter Zeile scheitert es und benennt beide Fehler, ohne sie besteht es — und +scheitert zusätzlich bei leerer `tsc`-Ausgabe, damit ein stiller Erfolg nicht als +Prüfung durchgeht. + +### Die Abnahme, wie dieses Issue sie verlangt + +Gefordert war „verschlüsselte Datei senden, abgelehnte empfangen" — geprüft am +laufenden System, nicht am Build: + +| Prüfpunkt | Ergebnis | +|---|---| +| Raumliste lädt | ✅ mit konfigurierten Sektionen, also im kritischen Pfad | +| ClamAV Sendepfad | ✅ blockiert vor dem Upload — **ein** Scan-Aufruf, kein zweiter | +| ClamAV Empfangspfad (Datei) | ✅ EICAR erkannt, Abweisung wird angezeigt | +| ClamAV Bildpfad (`.png`) | ✅ zugestellt, beim Herunterladen abgewiesen, **Meldung gerendert** | +| Call-Teilnehmerliste | ✅ | + +Der `.png`-Fall ist der wichtigste: Er ist der einzige, der den portierten Code +`ImageBodyViewModel.computeErrorLabel()` tatsächlich durchläuft. Wäre die Datei schon +beim Senden geblockt worden, hätte der Test den Sendepfad ein zweites Mal geprüft und +den Bildpfad gar nicht — beides sieht im Scanner-Log gleich aus, weil die Meldung +`flagged an upload/download` nicht unterscheidet. + +### Stand + +`v0.6.0` ist in Produktion (`gitops:d87c432`), `/version` liefert `0.6.0`. +Rückhebel bleibt der Tag-Revert auf `v0.5.4`. + +**Alle vier Schritte dieses Issues sind beantwortet**; Schritt 4 ist wie in ADR-0022 +vorhergesagt gegenstandslos geworden. Das nächste Upstream-Update ist ein gewöhnlicher +Merge.