Compare commits

..
3 Commits
Author SHA1 Message Date
Thore Cimbal 6632ad5a80 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.
2026-08-20 12:00:00 +00:00
Thore Cimbal ac343e9347 Typpruefung auf den ganzen Baum ausweiten
apps/desktop/electron-builder.ts:237 war der letzte Typfehler im eigenen Code:
config.dmg ist moeglicherweise undefined, weil Upstreams Configuration-Interface
zwar linux/win/mac/deb verpflichtend macht, dmg aber nicht. Der Wert steht
literal in config - behoben mit ! statt mit einer Zeile in Upstreams Interface,
weil der Kommentar direkt darueber genau diese Aenderung vermeiden will, um bei
Upstream-Merges keinen Konflikt zu erzeugen. Dasselbe Idiom nutzt die Datei
weiter unten fuer win.signtoolOptions.

Damit ist der Baum typrein und der Job kann von apps/web auf pnpm -r wechseln.
Bis heute brach die Baumpruefung an genau dieser Datei ab und erreichte apps/web
nie - deshalb war das Tor am 19.08. eng gefasst; die Begruendung ist hinfaellig.

desktop_linux und desktop_windows fuehren typecheck jetzt ebenfalls als needs.
Ein Typfehler im Desktop-Code haette sonst weiter ein Paket erzeugt - genau das
Loch, das fuer das Web-Image geschlossen wurde.

Massstab bleibt unveraendert: kein Fehler ausserhalb von node_modules. Upstreams
drei in matrix-js-sdk 42.2.0 bleiben ausgenommen.
2026-08-20 12:00:00 +00:00
Thore Cimbal 8ca03feffa Merge-Reste entfernen und Typpruefung ins Tor vor dem Image
v0.6.0-rc.2 brach in Produktion die Raumliste: RoomListItemViewModel.ts rief
SettingsStore.getValue("feature_room_list_sections") auf einen Schalter, den
Upstream entfernt hat - Sektionen laufen dort ueber RoomList.showSections. Der
Merge hatte ueberall Upstreams Seite genommen (Menue, View, Snapshot, Typen),
nur diese eine const-Zeile blieb stehen. Sie wurde tree-weit von niemandem
gelesen und warf bei jedem Raumlisteneintrag.

Zweiter Rest gleicher Art: der Import ElementDesktopLogoSvg in SdkConfig.ts.
Upstream nutzt ihn in desktopBuilds.logo, wir ueberschreiben den Block bewusst
mit eigenem Logo und Release-Pfad - der Import blieb ungenutzt zurueck. Das
Fork-Patch selbst ist unveraendert.

Abgesichert: alle 135 abgefragten gegen die 152 registrierten Einstellungen im
Quellbaum verglichen - keine weiteren Leichen.

Neuer Job typecheck, den docker_web als needs fuehrt. Der web-Job baut nur;
webpack entfernt Typen, ohne sie zu pruefen. tsc meldete beide Reste (TS2345,
TS6133) die ganze Zeit - gefragt hatte ihn niemand.

Massstab ist "kein Fehler ausserhalb 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 nachgeprueft - dieselben drei, sonst
nichts.

Das Tor ist in beide Richtungen geprueft: mit wieder eingesetzter Zeile
scheitert es und benennt beide Fehler, ohne sie besteht es. Farbcodes werden
vorher entfernt - nx faerbt auch in der Pipe, zwischen "error" und "TS" steht
sonst eine Escape-Sequenz und das grep liefe ins Leere. Zusaetzlich scheitert
der Job bei leerer tsc-Ausgabe, damit ein stiller Erfolg nicht als Pruefung
durchgeht.
2026-08-19 12:00:00 +00:00
5 changed files with 133 additions and 5 deletions
+60 -1
View File
@@ -112,7 +112,7 @@ trivy_scan:
web: web:
stage: build stage: build
image: node:24-bullseye image: node:24-bullseye
rules: rules: &regeln_build
# Release-Tags bauen immer (docker_web/desktop_* brauchen web als needs) # Release-Tags bauen immer (docker_web/desktop_* brauchen web als needs)
- if: $CI_COMMIT_TAG =~ /^v/ - if: $CI_COMMIT_TAG =~ /^v/
# Scheduled Pipelines gehoeren dem trivy_scan - kein wochentlicher Leerbuild # Scheduled Pipelines gehoeren dem trivy_scan - kein wochentlicher Leerbuild
@@ -136,6 +136,54 @@ web:
- apps/web/webapp - apps/web/webapp
expire_in: 1 day expire_in: 1 day
# Typpruefung. Der web-Job baut nur - webpack entfernt Typen, ohne sie zu pruefen, ein
# unbekannter Einstellungsschluessel ist zur Bauzeit bloss ein String. So ging am
# 19.08. v0.6.0-rc.2 in Produktion: in RoomListItemViewModel.ts zeigte eine
# getValue-Zeile auf den von Upstream entfernten Schalter feature_room_list_sections,
# und die Raumliste stuerzte bei jedem Eintrag ab. tsc meldet genau das (TS2345 und
# TS6133) - gefragt hatte ihn nur niemand.
#
# Massstab ist "kein Fehler ausserhalb 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). Nachgeprueft in einem sauberen
# v1.12.26-Checkout - dieselben drei, sonst nichts. Faellt das bei einem Upstream-Wechsel
# weg, verschaerft sich der Job von allein, ohne Anpassung.
typecheck:
stage: build
image: node:24-bullseye
rules: *regeln_build
variables:
NODE_OPTIONS: "--max-old-space-size=6144"
before_script:
- corepack enable
script:
- pnpm install --frozen-lockfile
# tsc darf rot sein - bewertet wird unten, sonst bricht der Job an Upstreams Fehlern ab.
# Farbcodes muessen raus: nx faerbt auch in der Pipe, und dann steht zwischen "error"
# und "TS" eine Escape-Sequenz - ein grep auf "error TS" liefe ins Leere und das Tor
# waere immer gruen, ohne je zu pruefen.
# Ganzer Baum, nicht nur apps/web: Bis 2026-08-20 brach `pnpm -r lint:types` an
# apps/desktop/electron-builder.ts ab (config.dmg moeglicherweise undefined) und
# erreichte apps/web nie - deshalb war der Job anfangs eng gefasst. Der Fehler ist
# behoben, damit deckt das Tor auch die Desktop-Pakete ab.
- pnpm -r --workspace-concurrency=1 lint:types 2>&1 | sed -r 's/\x1b\[[0-9;]*[mK]//g' | tee tsc.log || true
- |
if grep -E "error TS[0-9]+" tsc.log | grep -v node_modules; then
echo "FEHLER: Typfehler im eigenen Code (siehe oben)."
exit 1
fi
# Kein stiller Erfolg bei leerem Log: ohne tsc-Ausgabe hat nichts geprueft
if ! grep -qE "Successfully ran|error TS[0-9]+" tsc.log; then
echo "FEHLER: tsc hat keine auswertbare Ausgabe geliefert - Tor haelt nicht."
exit 1
fi
echo "Keine Typfehler ausserhalb von node_modules."
artifacts:
paths:
- tsc.log
expire_in: 7 days
when: always
# Baut das kanonische Web-Image (apps/web/Dockerfile, Kontext = Monorepo-Root) und pusht # Baut das kanonische Web-Image (apps/web/Dockerfile, Kontext = Monorepo-Root) und pusht
# es in die rohana-Registry, aus der Flux/k8s zieht. Deploy bleibt ein manueller Tag-Bump # es in die rohana-Registry, aus der Flux/k8s zieht. Deploy bleibt ein manueller Tag-Bump
# im gitops-Repo. Bewusster Doppel-Build (webpack laeuft im web-Job UND im Dockerfile) - # im gitops-Repo. Bewusster Doppel-Build (webpack laeuft im web-Job UND im Dockerfile) -
@@ -146,6 +194,9 @@ docker_web:
needs: needs:
- job: web - job: web
artifacts: false artifacts: false
# Kein Image ohne Typpruefung - genau diese Luecke lieferte rc.2 aus
- job: typecheck
artifacts: false
rules: rules:
# Nur bei Release-Tags (v*) - "releasen" ist ein bewusster Akt: # Nur bei Release-Tags (v*) - "releasen" ist ein bewusster Akt:
# Tag pushen -> Image entsteht -> Tag-Bump im gitops-Repo deployt es # Tag pushen -> Image entsteht -> Tag-Bump im gitops-Repo deployt es
@@ -207,6 +258,10 @@ desktop_linux:
image: registry.git.lab/axion1337.chat/threadnet-web/desktop-build:bullseye image: registry.git.lab/axion1337.chat/threadnet-web/desktop-build:bullseye
needs: needs:
- job: web - job: web
# Seit 2026-08-20 prueft typecheck den ganzen Baum, also auch apps/desktop -
# dann darf auch kein Desktop-Paket ohne bestandene Pruefung entstehen.
- job: typecheck
artifacts: false
artifacts: true artifacts: true
rules: rules:
- if: $CI_COMMIT_TAG =~ /^v/ - if: $CI_COMMIT_TAG =~ /^v/
@@ -248,6 +303,10 @@ desktop_windows:
- windows - windows
needs: needs:
- job: web - job: web
# Seit 2026-08-20 prueft typecheck den ganzen Baum, also auch apps/desktop -
# dann darf auch kein Desktop-Paket ohne bestandene Pruefung entstehen.
- job: typecheck
artifacts: false
artifacts: true artifacts: true
rules: rules:
- if: $CI_COMMIT_TAG =~ /^v/ - if: $CI_COMMIT_TAG =~ /^v/
+6 -1
View File
@@ -234,7 +234,12 @@ if (variant["mac.icon"]) {
} }
if (variant["dmg.badgeIcon"]) { if (variant["dmg.badgeIcon"]) {
config.dmg.badgeIcon = variant["dmg.badgeIcon"]; // `!`, weil Upstreams Configuration-Interface oben zwar linux/win/mac/deb
// verpflichtend macht, dmg aber nicht - der Wert steht literal in config.
// Dort eine Zeile zu ergaenzen waere die schoenere Loesung und genau die
// Aenderung an Upstreams Block, die der Kommentar oben vermeiden will.
// Dasselbe Idiom nutzt die Datei weiter unten fuer win.signtoolOptions.
config.dmg!.badgeIcon = variant["dmg.badgeIcon"];
} }
/** /**
-1
View File
@@ -13,7 +13,6 @@ import { type DeepReadonly } from "shared-types";
import { SnakedObject } from "./utils/SnakedObject"; import { SnakedObject } from "./utils/SnakedObject";
import { type IConfigOptions, type ConfigOptions } from "./IConfigOptions"; import { type IConfigOptions, type ConfigOptions } from "./IConfigOptions";
import { isObject, objectClone } from "./utils/objects"; import { isObject, objectClone } from "./utils/objects";
import ElementDesktopLogoSvg from "../res/img/element-desktop-logo.svg";
// see element-web config.md for docs, or the IConfigOptions interface for dev docs // see element-web config.md for docs, or the IConfigOptions interface for dev docs
export const DEFAULTS = { export const DEFAULTS = {
@@ -396,8 +396,6 @@ export class RoomListItemViewModel
}) })
: undefined; : undefined;
const canMoveToSection = SettingsStore.getValue("feature_room_list_sections");
// Build sections list for the "Move to section" submenu // Build sections list for the "Move to section" submenu
const sections: Section[] = RoomListItemViewModel.buildSections(roomTags, availableSections); const sections: Section[] = RoomListItemViewModel.buildSections(roomTags, availableSections);
const areSectionsEnabled = SettingsStore.getValue("RoomList.showSections"); const areSectionsEnabled = SettingsStore.getValue("RoomList.showSections");
+67
View File
@@ -55,6 +55,11 @@ Beide behoben.
## 4. Merge-Reibung: was ein Upstream-Update wirklich kostet ## 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.* *Arbeitspaket 3 aus ThreadNet-Web#7. Gemessen am 2026-08-06, nicht geschätzt.*
### Die unangenehme Grundlage zuerst ### 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 ⚠️ Ein flacher Fetch liefert **keine Historie**: `git merge-base`, `git log` über
Upstream und ein Graft-Versuch brauchen `git fetch upstream` ohne `--depth`. 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).