# ERLEDIGT — was seit der ROADMAP vom 28.08.2026 fertig wurde

**Stand 09.09.2026 (nach Runde MERGE-10).** Geprüft gegen `/root/osum-merge9`, Zweig `merge9`.

**Warum es diese Datei gibt:** Die ROADMAP vom 28.08. trug **37× `[OFFEN]`**.
Ein großer Teil davon ist inzwischen gebaut und gemessen — die alte Datei
führte in die Irre. Hier steht je Punkt **eine Zeile** mit Runde, Beleg und
Messwert. Wer wissen will, was noch fehlt: `OFFEN.md`.

Legende Beleg: `Datei` = im Baum vorhanden · `Läufer` = Testabschnitt mit Zahl ·
`Blech` = auf Justins echtem Rechner gemessen.

---

## 1. BLOCK A — Sockel

| ROADMAP | Punkt | Runde | Beleg / Messwert |
|---|---|---|---|
| **A1** | **Ereignis-Multiplex `poll`** | POLL | `SYS_POLL=7` in `kernel/sys.fi` + `lib/libc/kcall.fi`; `tools/poll/run.sh` **67 Zusagen**; `POLL-STATUS.md`. Widerlegt `docs/ROADMAP-UPDATE.md` B2 ("keiner dieser Aufrufe existiert") |
| **A1** | **Threads + Futex** | FREMDLAND | `clone(56)`, `futex(202)`, `mprotect(10)`; **vier Fäden mit musl-pthreads, 100 000 Sperrzyklen ohne Verlust** (Commit `dddacd0`) |
| **A2** | **Init / Dienstverwaltung (pid 1)** | INIT | `kernel/user/init.fi` 1072 Z.; `/etc/inittab` mit `once`/`respawn`/`ctrl`/`off`, Neustart gedeckelt auf 5×/s; `tools/init/run.sh` **78/0** |
| **A3** | **Systembus / IPC mit Rechten** | SYSTEMBUS | `kernel/bus.fi` **1382 Z.**; `tools/systembus/run.sh` **30/5**; gemessen: `sends=201 recvs=200 denied=1 drops=0`, Durchsatz `byt=1048576 us=2683`. Restpunkte: `S-003`, `S-004` |
| **A4** | **Sitzung + Anmeldung (Teil)** | MULTIUSER | `tools/multiuser/run.sh` **91/0** (seriell nachgefahren). GUI-Login fehlt weiter → `P-002` |
| **A8** | **Dateisystem-Robustheit** | FSROBUST / OFS3 | Journal, `fsck` (`kernel/user/fsck.fi`), `fsync`; **größte Datei 136 351 744 B, größter Träger 137 438 953 472 B (128 GiB) — gemessen**, `docs/OFS-LIMITS.md` |
| **A9** | **Statisch vs. dynamisch** | Entscheidung | **STATISCH** (Justin, 29.08.). Begründung: PLAN speichert inhaltsadressiert + dedupliziert. Preis benannt → `O-005` |
| **A11** | **Benachrichtigungen (Dienst)** | SYSTEMBUS | Bus trägt Meldungen, `taskbar: text noti … t=Meldg 2`. Sichtbare Toasts fehlen → `S-006` |
| **A13** | **Kompositor mit Vsync** | VSYNC | `STATUS-VSYNC.md`: Bildgrenze, Seitenwechsel, Fensterbewegung; `kernel/kgui.fi` 18 Vsync-Stellen, `kernel/wm.fi` 21. Ohne GPU-Treiber bleibt Tearing → `G-008` |

---

## 2. BLOCK B — Betriebstauglichkeit

| ROADMAP | Punkt | Runde | Beleg / Messwert |
|---|---|---|---|
| **B1** | **Protokollierung** ("höchster Nutzen pro Aufwand") | PROTOKOLL | `kernel/klog.fi` **917 Z.**; `tools/protokoll/run.sh` **55 Zusagen, 0 Fehler**; gemessen: **4 Kerne × 10 000 Zeilen = 40 000, keine verloren, keine verschränkt** (`ring=510 rotiert=39490 kaputt=0`); 1 Mio. gefilterte `debug`-Aufrufe in **14 ms** (KVM) |
| **B2** | **Absturzberichte** | PROTOKOLL | Panik-Bildschirm mit **17 aufgelösten Symbolen** + Datei:Zeile + 16 Registern; Bericht in `/var/crash` überlebt den Neustart (9 Symbole); Ring-3-Nullzeiger → Bericht, System läuft weiter |
| **B3** | **Task-Manager** | — | `kernel/user/taskmgr.fi` + `top.fi` + `assets/apps/taskmgr.osp` im Starter |
| **B4** | **Update mit Rückrollen** | UPDATE / OTA | `kernel/user/ota.fi` **1971 Z.**; A/B-Zähler `kernel/ab.fi`, Rückschrittsschutz, Wiederaufnahme (`Range`/`206`), automatischer Rückfall; Gerät holt sein Update **selbst über HTTPS**, prüft und spielt es ein. Grenzen → `O-001`…`O-007` |
| **B4** | **`/bin/opk` nativ** | — | `kernel/user/opk.fi` **1693 Z.** in Firn (nicht mehr nur Python). Format-Wahrheit liegt aber weiter im OrientOS-Repo → `O-006` |
| **B5** | **Feedback aus dem System** | FEEDBACK | Zweig `feedback` (29.08.) — **ungemergt**, siehe `A-012` |

---

## 3. BLOCK C — Hardware-Brücke

| ROADMAP | Punkt | Runde | Beleg / Messwert |
|---|---|---|---|
| **C1** | **AHCI/SATA-Treiber** | AHCI | `kernel/ahci.fi` **1119 Z.**; **Blech:** `hwdiag: disk AHCI bdf=0x201 1022:43c8`. Läufer 58/4 (vorbestehend) → `A-005` |
| **C2** | **e1000 + Treiberwahl nach PCI-ID** | HWNET | `tools/hwnet/run.sh`; `netdev: bestand … 1 mit treiber, 0 ohne` |
| **C2+** | **Realtek RTL8168/8169** | RTL | **Blech:** `netdev: bestand 09:00.0 10ec:8168 RTL8111/8168/8411 -> r8169`. Widerlegt `docs/REALHW.md` Teil A |
| **C3** | **USB-Stick-Abbild BIOS+UEFI + Hardware-Diagnose** | USBIMG / STICK | `tools/usbimg/run.sh` **46/2** (merge8: 37/11 — besser); Abbild `orientos-usb-20260909-2b5fd03.img`, sha256 `de83bb44…`; **Blech:** UEFI-Start von Justins Stick |
| **C5** | **Eigene Auflösungen / EDID** | CUSTOMRES / DISPLAY | ~20 Auflösungen bis 2560×1080; `vmode.dpi_scale` liest EDID; **neu 09.09.:** `uiscale=<1..4>` auf der Kernel-Kommandozeile schlägt das EDID. Mehrschirm fehlt → `G-007` |
| **C7** | **Audio: AC97 → Intel HDA + Mischer** | MEDIA1 / HDA / TON-2 | `kernel/hda.fi` **2570 Z.** (CORB/RIRB, Codec-Aufzählung, Widget-Graph, Wegsuche Buchse→Wandler, BDL mit zyklischem DMA), `kernel/mix.fi` 821 Z. (4 Ströme, gesättigte Summe), `kernel/ac97.fi` 1024 Z., `/bin/play` für WAV **und MP3**; 5 Systemaufrufe 1840–1844 |
| **C8** | **Netzprofile + MAC-Datenschutz** | NETPROFIL | 3 MAC-Stufen je Profil, `/etc/netprofile.conf` 0o600, Aufrufe 1330/1331; **68 Zusagen** |

---

## 4. BLOCK D — GUI-Kernstück

| ROADMAP | Punkt | Runde | Beleg / Messwert |
|---|---|---|---|
| **D1** | **Zwischenablage — Unterbau** | SYSTEMBUS | Besitzermodell, Typenliste `CT_TEXT/PATH/HTML/IMAGE/FILES`, verzögerte Übergabe (`OFFER`/`FILL`), großer Datenweg über geteilten Speicher; gemessen `clipsets=100 clipgets=100 segs=1 segseiten=256 verlauf=20`. **Ende-zu-Ende fehlt** → `S-001` |
| **D3** | **Zwischenablage-Verlauf** | SYSTEMBUS | `clip_hist_take`/`clip_hist_count`, 20 Einträge gemessen. Ohne GUI → `D-015` |
| **D4** | **Schriftrasterung** | PAINT / GLYPHE | `vendor/firn/lib/font/{ttf,raster,metrics}.fi`; Anti-Aliasing, Fensterschatten; **Textbeleg:** "Ausführen" **100 %**, "Einstellungen" **100 %** bei 30 px (`tools/usbimg/suchtext.py`) |
| **D5** | **Tastaturlayout folgt der Sprache** | TÜRSCHLOSS | `KB_LAYOUT` war immer `L_US` — behoben (Commit `7bc8fd5`). F-Tasten fehlen weiter → `G-004` |
| **D6** | **Mehrsprachigkeit + echte Umlaute** | UMLAUT2 / I18N | `docs/I18N.md`, Katalog/Locale; `wlibc.fit` schneidet auf **UTF-8-Zeichengrenze** statt Oktetten (behob abgeschnittene Umlaute) |
| **D8** | **Papierkorb** | — | `kernel/user/papierkorb.fi` + `korb.fi`; Explorer löscht über `korb.hinein` (Shift = endgültig). GUI-Wiederherstellen fehlt → `D-016` |
| **D9** | **Dateisuche** | SUPERSEARCH | `kernel/user/locate.fi` + `nidx.fi`; Starter sucht: `launcher: suche [edi] treffer=4 apps=2 dateien=2` |
| **D11** | **Theme-Vorlagen + Konto** | THEMESTORE / KONTO | Farb- **und** Formtoken, `assets/schemes/`, `assets/shapes/`; `taskbar: shape file=osum name=OrientOS keys=26`. Läufer nie zu Ende → `D-013` |

---

## 5. BLOCK E — Anwendungen

| ROADMAP | Punkt | Runde | Beleg / Messwert |
|---|---|---|---|
| **E1** | Dateimanager | — | `kernel/user/explorer.fi` **1920 Z.**: Baum, sortierbare Tabelle, Zurück/Vor/Hinauf, Kontextmenü, ZIP packen/entpacken, Papierkorb. Große Lücken → `P-004`, `P-018`…`P-021` |
| **E2** | Terminal + Shell | TÜRSCHLOSS | `assets/apps/terminal.osp`; Shell im Fenster stirbt nicht mehr nach 4 s Stille (`72fb911`); Rückstrich funktioniert (`lua -e print("A B")` → `A B`) |
| **E3** | Texteditor | — | `kernel/user/edit.fi`, `assets/apps/editor.osp`; Start belegt (`ready=['edit']`) |
| **E4** | Einstellungen | TÜRSCHLOSS | `kernel/user/settings.fi` **4154 Z.**, `/apps/settings.osp` im Starter (`490c574`); Start belegt mit `pid=21` |
| **E5** | Starter + Taskleiste + Alt+Tab | TÜRSCHLOSS | `kernel/user/taskbar.fi` **4283 Z.**; **Alt+Tab gebaut** (`5a99b40`), `wm: fokus 13 -> 15 -> 7`, vier umschaltbare Fenster; Startmenü stapelt sich nicht mehr |
| **E6** | **Bildbetrachter** | VIEWER | `kernel/user/viewer.fi` + `bild.fi` + `jpeg.fi` im Baum. Zweig `viewer` **ungemergt** → `P-014` |
| **E7** | **Archiv-Werkzeug ZIP** | — | `kernel/user/zip.fi` — **echtes ZIP-Format mit deflate/inflate** (feste + dynamische Bäume), CRC-32, `zip -c/-x/-0c`; dazu `tar.fi`, `gzip.fi`, `flate.fi` |
| **E9** | **Webbrowser** | CERTUS-AUF-OSUM | **Certus läuft als gewöhnliches Ring-3-Programm auf Osum** — mit Osums Widgets, Netz, Adressraum. `/bin/certus` **6 493 760 B** im Abbild, `assets/apps/certus.osp` im Katalog. Vierte Rückwand `lib/fenster/osum.fi` nach X11/Win32/Android |
| **E11** | **Snipping-Tool** | SNIP | `kernel/user/snip.fi`; Bildschirmfoto-Syscall `SYS_OSUM_SHOT` (1841) |
| **E12** | **Medienwiedergabe** | MEDIA1 / DEMUX / HDA | `kernel/user/media.fi`, `play.fi`, `mp3.fi`, `mp3tab.fi` (~3550 Z. MP3-Dekodierer). Video → `P-009` |
| **E13** | Taschenrechner | — | `kernel/user/rechner.fi` |
| **E14** | Systemmonitor | — | = B3, `taskmgr.fi` |
| **E17** | Sicherung (Teil) | TRESOR | `backup.fi`, `tresor.fi`; Geräteidentität, verschlüsselter Speicher, PBKDF2, `crypto erase` **in 20 ms gemessen**. Rückweg auf leeres Blech → `P-013` |

---

## 6. QUER — was in keiner ROADMAP-Zeile stand

| Punkt | Runde | Beleg / Messwert |
|---|---|---|
| **Linux-Binaries laufen auf Osum** | LAUFZEIT | Ein **statisch gegen musl gelinktes Linux-Binary** läuft ohne Änderung. `arch_prctl(158)`, `readv/writev(19/20)`, `set_tid_address(218)`, `pread64/pwrite64(17/18)`, `fcntl(72)`, TLS über `fs`-Register |
| **Lua 5.4.7 läuft vollständig** | LAUFZEIT | `lua /test.lua` gibt korrekt aus; `/bin/lua` **380 488 B** im Abbild |
| **busybox läuft** | FREMDLAND | `uname(63)`, `prctl(157)`; **15 Applets gemessen**; `/bin/busybox` **326 336 B** im Abbild |
| **SQLite legt eine Datenbank an** | LAUFZEIT | über `pread64`/`pwrite64`/`fcntl`. Binärdatei fehlt noch → `F-005` |
| **Echte Dateisperren** | FREMDLAND | `fcntl` — "die Lüge von LAUFZEIT ist beseitigt" (`b4b7ce5`) |
| **Selbst-Hosting auf dem Stick** | TÜRSCHLOSS | `firnc` übersetzt **auf dem laufenden System im Terminalfenster**; der Übersetzer kommt mit auf den Stick (`4529afd`) |
| **Ed25519 in Firn** | — | `lib/crypto/ed25519.fi` **809 Z.**, benutzt von `opk`, `ota`, `sshd`, `jarvisd`, `jsig`, `modul`. Widerlegt `docs/ROADMAP-UPDATE.md` A3 ("Ed25519 ist in Firn NICHT umgesetzt") |
| **SSH-2-Server** | SSHD | **OpenSSH 9.2 loggt sich wirklich ein** — `curve25519-sha256`, `ssh-ed25519`, `chacha20-poly1305@openssh.com`, Terrapin-Schutz; Schlüssel- **und** Passwort-Login; 1895 Vergleiche gegen Pythons `hashlib`/`cryptography` + 67 Zusagen gegen echte OpenSSH-Werkzeuge |
| **JARVIS-Brücke** | BRIDGE | `kernel/app/jarvisd.fi` **2765 Z.** — TLS + Ed25519 + Rechteliste |
| **Härtung Ring 3** | HÄRTUNG-2 | Fuzzer in Ring 3; **Blech:** `guard: cr4=0x340620 smep=1 smap=1` |
| **KVM-Durchgriff** | KVMFIX | Abnahme **4,6× schneller**, deckt echte CPU-Fehler auf |
| **SSE2-Alpha + Dirty-Rects** | SCHNELLBILD | Durchsatz in MB/s gemessen, Anteil übertragener Bildpunkte zählbar |
| **Wurzelabbild 20 → 32 MiB** | MERGE-9 | `FS_BLOCKS` 40960→65536; gemessen `blocks=65536 free=19225` (9,4 MiB frei) — vorher passte Certus (6,19 MiB) nicht |
| **171 Systemaufrufe** | fortlaufend | `grep SYS_ kernel/sys.fi | sort -u` = **171** (Roadmap-Zeit: 158) |
| **~264 500 Zeilen Firn** | — | `find kernel lib -name '*.fi' | xargs wc -l` |
| **Firn-Allokation 2,8× schneller** | ANLEGEWEG (Firn) | 24 Oktette **153,9 → 54,9 ns**; `__gc_mark` auf Nicht-Zeiger **279 → 5 ns**; längste GC-Pause **27,5 → 10,0 ms** (`/root/AW-REPORT.md`) |

---

## 7. ECHTHARDWARE-1 (09.09.2026) — Justins Blech-Kritik, alle zehn Punkte

Belegt im Emulator bei **`uiscale=2`, 2560×1440**. **Auf Justins Rechner noch
nicht nachgemessen** → `B-004`.

| # | Justins Kritik | Ursache | Beleg des Fixes |
|---|---|---|---|
| A1 | Startmenü: Klick startet nichts | `panic: integer overflow` `wlib.fi:2878` — `bw - 2*bo` läuft in `u64` unter null. Lief **nur bei `radius_button != 0`**, also nur unter `shape=osum` — den lieferte der Stick nie mit. **Der sterbende Prozess war der Starter selbst** | `serial: 0 panics`; `launcher: start /apps/explorer.osp/start pid=19` |
| A1b | Tippen kommt nicht an | `wm.on_mouse` gibt Fokus **nur an `L_NORMAL`**; der Starter liegt auf `L_TOP` und war damit vom Fokus ausgeschlossen | neues Flag `F_KEYS`/`WS_KEYS`; `launcher: suche [edi] treffer=4` |
| A1c | (Folgefehler) | `index out of bounds '[u64;16]'` `launcher.fi:199` — Schleife zählte bis 32 über ein 16er-Feld | 0 panics; `edi` liefert Programme **und** Dateien |
| A2 | Kacheln: Titel über Zustand | `qs.fi` rechnete mit **festen** Pixeln (`TW 180 TH 74`), geeicht auf Schrifthöhe 15 | jedes Maß Funktion über `ui_scale()`; Titel `y=93`, Zustand `y=136` → **43 px Abstand** |
| A2b | Schieber quer durch die Schrift | Rinne ab fester Spalte `PAD+104`, "Lautstärke" ist bei 30 px breiter | Beschriftung eigene Zeile; Text endet `y≤515`, Rinne ab `y=540` — **kein Schnittpunkt** |
| A2c | Titel hart abgeschnitten | `qs.fit()` zählte **Oktette** herunter (zerteilt Umlaute), kein Kürzungszeichen | `wlibc.fit` auf Zeichengrenze + `…`; "Netz vortae" → `Netz-Sim` |
| A3 | Fenster ohne Text | **kein Fehler** | "Ausführen" 100 %, "Einstellungen" 100 % bei 30 px |
| A5 | Uhr: drei verschiedene Zeiten | `time.init` legte den RTC-Wert **unbesehen als UTC** ab, `now_local` addierte `tz=120` **noch einmal** | `tz_anwenden` rechnet **einmal**; Systemzeit UTC 11:43 → Leiste **13:43** (genau +2 h) |
| A6 | Tafel rot `LG 2 Z21 51` | **keine Sicherheitsfrage** — Zeile 21 listete 6 USB-Funde à 7 Zeichen = 51 > 48 Spalten | höchstens 5 Funde (44 Zeichen) + `+N` |
| B1 | "Alles komplett eckig" | Das Abbild lieferte **kein** `/etc/theme.conf`, keine `/etc/shapes/`. **Kein fehlender Zeichenweg — eine fehlende Datei** | `build.sh` liefert Schemata/Formen mit; Fensterecke = sauberer Viertelkreis |
| B2 | "Farben passen nicht zusammen" | `/etc/theme` aus `tools/k15/tree.py` (12 dunkle Flächenfarben **ohne Schriftfarbe**) wurde **zuletzt** gelesen und überschrieb das helle Tagschema | `/etc/theme` wird nicht mehr mitgeliefert; Panelgrund `bg=16777215` weiß statt `3820126` |

**Neues Werkzeug dieser Runde:** `uiscale=<1..4>` auf der Kernel-Kommandozeile.
**Warum es das brauchte:** QEMU liefert **kein EDID**, also stand dort immer
`ui_scale()==1` — und damit war jeder dieser Fehler unsichtbar, obwohl sie seit
Wochen im Baum lagen. *Der Prüfstand konnte Justins Fehler gar nicht auslösen.*

**Prüfstände nach den Fixes:** WM **104/0**, USERLAND **91/0**.

---

## 8. MERGE-9 (09.09.2026) — die zwei echten Regressionen

| Regression | Ursache | Fix | Beleg |
|---|---|---|---|
| `kernel/wm.fi`: zwei Skalare auf einer Adresse | `S_PXSUM` lag auf `0x1130`, dort steht seit GLYPHE `S_LESER`. Auf dem Zweig SCHNELLBILD war die Stelle frei — zusammengeführt schrieben **beide dasselbe Wort** | `S_PXSUM` → `0x11C8` | `paint` **32/1**, FAIL-Menge identisch mit merge8 |
| `tools/tiling/run.sh`: eine Zahl, die im Test stand | TÜRSCHLOSS legte `bind mod+tab next-window` nach `assets/tiling.conf` — 21 Einträge wurden 22. Abschnitt 9 verglich gegen die **fest getippte 21** | rechnet `soll` jetzt aus der Datei | `tiling` **68/0** |

**Besser geworden:** `werkzeug` 23/11 → **32/2** · `usbimg` 37/11 → **46/2** ·
`icons` 25/2 → **25/0**.

**Vier Zweige ohne einen einzigen Konflikt** zusammengeführt (`schnellbild`,
`laufzeit`, `fremdland`, `tuerschloss`) — alle von derselben Basis `c0f7151`.
Die vermeintliche Syscall-Kollision war eine **Textkollision, kein Sachkonflikt**:
beide Zweige vergaben die Linux-Standardnummern für dieselben Aufrufe.
Nach dem Merge: 158 → 165 → **168 Syscalls, keine Doppelbelegung**.

---

## 9. ECHTHARDWARE-2 (09.09.2026) — Justins zweite Blech-Rückmeldung

Belegt im Nachbau bei **`uiscale=2`, 2560×1440** *und* **`uiscale=1`, 1920×1080**.
Commits `c101990`, `307f623`, `f6ea486`, `4432a9f`, `56f41d1`, `faa6a07`.

| # | Justins Kritik | Ursache | Beleg des Fixes |
|---|---|---|---|
| A1 | `panic ... u64 - u64` **auf dem Blech weiterhin** | Nicht `wlib.fi:969`, sondern **`wlibc.fi:970:25`** — wörtlich `x - i` in `drop_shadow`. Die Meldung selbst führt in die Irre: zwei Prozesse schreiben gleichzeitig auf die serielle Leitung, und die panic-Zeile steht **mitten in einer Leistenzeile** (`taskbar: field panic: … wlibc.fi:970:25net x=2012 …`). Wer das vom Foto abliest, liest „wlib" und eine Zahl daneben. `drop_shadow` malt `reach` Ringe **um** ein Fenster; der linke Rand liegt bei `x - i` — steht das Fenster näher als `reach` am Schirmrand, ist das in `u64` keine negative Zahl | `pruef/einst.py`: Lauf `einst1` = panic, Lauf `einst2` = **0 panics**. Wurzel behoben: `wlibc.fi` hat jetzt `sub()` (sättigend, wie `wlib.fi` längst); der Ring wird **beschnitten**, nicht verschoben. Dazu `rring`: `w - 2*k` lief unter null, sobald der Fokusring breiter ist als das halbe Bedienelement |
| A2 | Einstellungen-Fenster **leer/weiß** | `assets/apps/settings.osp/INFO` ist **2101 Oktette**, `name=` steht das zweite Mal bei Oktett **1236** — `appdir.fi` las nur 1023. Das Bündel wurde nie gefunden, die App hatte nichts anzuzeigen. **Dieselbe Wurzel wie A1**: die Einstellungen sind das erste Fenster, das groß genug ist, um am Rand zu stehen | Puffer 1024 → **8192** an **beiden** Lesestellen (`eine_datei` + `net_user`). Vorher `appdir: INFO laenger als 1023 …` auf der Leitung, nachher **weg**. Fenster **1520×1132** mit Tinte in **jedem** Achtel (2,7–16,1 %) |
| A3 | Explorer: Spaltenköpfe überlappen | `explorer.fi` setzte `spalten[0..3]` fest auf `186/80/76/108` **ohne** `ui_scale()` | `* wlibc.ui_scale()`. Serial: `378 528 608 684` → **`382 714 874 1026`** (scale 2) bzw. `202 368 448 524` (scale 1) |
| A4 | Symbol und Text nicht auf gleicher Höhe, kleben aneinander | Zwei Stellen: `wlib.list_ein()` gab **fest 22** zurück (bei scale 2 läuft ein 32 px breites Symbol unter den Text), und beide Malstellen setzten mit festem `ry + 2` statt mittig | `icon_small() + 6*scale`, wie `table_ein` es immer schon machte; Liste **und** Tabelle setzen senkrecht mittig. Taskleiste: Mitte nach der **gemalten** Höhe (`icon_draw_h`) statt nach `gl_w()` — das Symbol saß gemessen **5 px zu hoch** |
| A5 | Fensterinhalte zerrissen, weiße Streifen | **Im Nachbau nicht reproduzierbar** — Terminalfenster bei scale 2: **0 von 190** ganz weiße Zeilen | → `OFFEN.md` `D-018`, braucht ein zweites Foto |
| B6 | Taskleisten-Symbole **winzig** (24 px bei 1440p) | **Wurzel: `wlibc.icon_draw` blittete 1:1, ohne die Vervielfachung überhaupt zu kennen.** Jede andere Größe (Schrift, Knopfhöhe, `gl_w()`) nahm `ui_scale()` mit, dieses eine Blit nicht | Kästchen je Quellpunkt (nächste Nachbarschaft — die Quellen sind Flächenzeichnungen mit harten Kanten). Im Bild gemessen: Tintenblock **14 px → 36 px**, aus zwei Fragmenten wird **ein** Block. Dazu `IC_W`/`MK_W` → `ic_w()`/`mk_w()` |
| B7 | OS-Symbol links unten: **Klick macht nichts** | **Nicht die Klickfläche** — die deckt den ganzen Knopf ab (72×64). Zu klein war das **Zeichen**: Tinte `y=1392..1415`, also **24 px in einem 64-px-Knopf**. Wer auf das kleine Zeichen zielt, das er *sieht*, trifft daneben | `marke_start` hat drei eingebackene Größen (16/24/32); die 32er passt auf 60 nutzbare Punkte **genau einmal**. Jetzt wird die beste Paarung aus Quellgröße und ganzzahliger Vervielfachung gesucht: **24×2 = 48** schlägt 32×1. Gemessen: **24 px → 60 px** |
| B8 | Super-Taste: Leiste kommt nach vorn statt Startmenü | **Kein Fehler mehr** — die Kette `kbd.fi` → `hotkey_step` → `startmenue_um` war schon richtig gebaut. Der Befund der Vorrunde stammte aus einem Lauf, der **18 s blind schlief**: bei 2560×1440 stand die Leiste da noch nicht | Aktiv auf `taskbar: state` warten. Belegt: `taskbar: klinke seq=1 war=0 taste=0` → `startmenue auf`; Tippen `ter` filtert **18 → 7** Treffer; Enter startet |
| B9 | Tray: „Kontrollzentrum an/aus"/„Taskleiste an/aus" gehören nicht dorthin; Kachelklick → „danach geht gar nichts mehr" | **Kein Absturz** — im ganzen Lauf **keine** panic-Zeile. Kachel *Hide bar* **versteckt die Taskleiste** (`taskbar: hide`, Fenster wandert auf `y=1438`), die Uhr steht danach still; Kachel *Network* schaltet das Netz ab. Beide tun genau, was draufsteht — für den, der davorsitzt, sieht die Kombination aus wie „kaputt" | Nachgestellt in `pruef/kacheln.py` (Lauf `kach3`). `N_TILE` 6 → **4**; *Hide bar* und *Fake net* sind raus. **Ohne Funktionsverlust**: beide stehen längst in den Einstellungen (`settings.taskbar.autohide`, `settings.netview.choices` mit „faked"). Zuordnung über `tile_of` statt sechs umnummerierter Zweige; `TOP2` rechnet die Reihenzahl. Lauf `kach4`: alle vier Kacheln, **0 panics**, Leiste bleibt |
| C | **Englisch als Hauptsprache** | Es waren **nicht 71 Stellen im Quelltext**, sondern **ein Wort in `build.sh`**: `printf 'de\n' > $OUT/locale-de` schrieb `de` nach `/users/root/config/locale`. `msg.fi` (Runde I18N) liest **immer zuerst** `locale/en/messages`, Englisch ist die Rückfallsprache jedes Schlüssels | Vorgabe ist `en`. Belegt: `taskbar: lang=en src=1 keys=288`. Dazu die App-Namen in den `INFO`-Dateien (`Datei-Explorer` → `File Explorer`) und `explorer.columns` = `Name/Size/Modified/Permissions`. Beide Kataloge bleiben im Abbild; Deutsch ist in den Einstellungen wählbar |
| E | Tooltips + Rechtsklick-Kontextmenü | Gab es beides nicht | **Infoblase**: `wlib` legt das Fenster an (`tip_win_open/close/id`), Verweilzeit und Zeichnen stehen in `taskbar.fi`. Belegt: `wlib: tip [Terminal -- sh] x=120 y=1343`, `[169.254.10.1]`, `[Start]`, **1877 Punkte Tinte** im gemeldeten Rechteck. **Kontextmenü**: Rechtsklick → Minimieren/Anheften; belegt `kontext btn=1` → `mnklick x=16 y=40 nohit=0` → `kontext w=0` |

**Zwei eigene Regressionen, beide vom Prüfstand gefunden und behoben:**

1. **K16 62/2** — `firnc1` brach still an `netmon`, `freunde`, `powermon` ab
   (RC=1, **keine** Zeile Ausgabe, 4 MB resident → keine Wirtsknappheit,
   sondern eine feste Tabelle in firnc1). Ursache: die Infoblase lag in
   `wlib.fi`, und `wlib` steckt in **dreizehn** Programmen. *Einzeln* übersetzt
   jeder Bestandteil; es ist die **Summe**. Behoben durch Umzug nach
   `taskbar.fi` → **K16 64/0**. Restrisiko in `vendor/firn` → `OFFEN.md` `D-019`.
2. **`msg.fi` SLOTS 288 → 352** kostete 9 KiB `.bss` und schob dieselben drei
   Programme über die Grenze von `fas`. Jetzt **320** (Katalog hat 317 Schlüssel).

**Messfallen, die diese Runde gekostet haben** (für künftige Runden):

- `firnc1` braucht `export FIRNLIB=$REPO/lib`. **Ohne** die Variable hängt es an
  stdin und liefert RC=2 mit leerer Ausgabe — das sieht aus wie derselbe Fehler
  und führt zu dem falschen Schluss „war schon vorher kaputt".
- Das Kontrollzentrum öffnet **nur** über das **Netzfeld** (oder den Lautsprecher),
  nicht über die Uhr. `qs: geo` wird auch gemeldet, wenn es **zu** ist — erst
  `qs: open` beweist, dass es offen ist.
- Ein Menü, das aus einer Leiste auf `L_TOP` aufklappt, muss **selbst** auf
  `L_TOP` liegen — sonst deckt das 880×600 große Startmenü es zu und der
  Fensterserver gibt den Klick folgerichtig diesem.

**Prüfstände nach allen Fixes:** WM **104/0**, USERLAND **91/0**, K16 **64/0**.

---

## 9b. Runde MERGE-10 (09.09.2026)

**Zweig `merge9`, Commits `71bbc63` … `9a1d87c`. Nicht gepusht.**

| Punkt | Beleg / Messwert |
|---|---|
| **`explorer2` gemergt** | Commit `71bbc63`, 5 Konflikte einzeln nachgemessen. **WM 104/0, USERLAND 91/0, K16 64/0** |
| **Merge-Regression verhindert** (dieselbe Klasse wie MERGE-9) | `explorer2` hob `D_FIELDS` 25→29, `echthardware-2` hob `MAXWN` 4→5 — beide ließen die andere Feldgröße stehen. Richtig: `wd = 160*29 = 4640`, `wn = 5*14 = 70`. Neu `tools/design/felderpruef.py`: **37 Felder, 0 Abweichungen** |
| **Katalog am zusammengeführten Bestand neu gemessen** | 377 Schlüssel (nicht 317), längster Schlüssel 32, längster Text 177 → `SLOTS 512 / KEYW 48 / VALW 192`. Gegenprobe: K16 bindet weiter alle Programme |
| **`D-012` Dunkelmodus blaustichig** | Neuer Schlüssel `dark_scheme=`. **B−R +5,8 → +2,5**, `#0f172a/#1e293b` → `#18181b/#27272a` |
| **Terminal an die Themafarben** | `set_deco_colour` setzte `W_BG`, malte aber nicht → `term_redraw()`. **`#10141a` von 20,4 % Bildfläche auf 0,0 %** |
| **Akzent im Dunkelmodus** | `#7c3aed` auf `#18181b` = 3,11:1 (unter der Linie) → `#8b5cf6` = **4,18:1** |
| **Startknopf schaltet** (Runde GRIFF) | Zwei Fehler: `sysgui` wies jeden `win_act` auf `L_TOP` ab; danach fragte `WA_TOGGLE` „verborgen **oder nicht aktiv**", und ein `L_TOP`-Fenster ist nie „aktiv". **Vorher `auf`/`auf` und zwei Oktett-gleiche Bilder, nachher `zu`/`auf`, Akzentpunkte 0 → 295** |
| **Die Leiste prüft den Rückgabewert** | `taskbar: startmenue FEHLER rc=` statt eines erfundenen Erfolgs — genau diese fehlende Prüfung hatte den Fehler verdeckt |
| **Super+Pfeile** | `tile_snap` kann 8 Ziele, gebunden waren 2 → 6 Bindungen ergänzt (up/down + 4 Viertel), **kein neuer Code** |
| **Taskleisten-Spalt** (`h=2 rc=-4`) | `resize_win` verlangte `h>=16`; die Untergrenze gilt jetzt nur für Fenster **mit Schmuck**, undekorierte dürfen bis 1×1 |
| **`D-019` `firnc1` still** | **Keine Größengrenze.** Dieselbe Datei (md5 gleich) geht in `kernel/user/` und scheitert in `/tmp/` — fehlender Nachbar `ulib.fi`. `firnc0` nennt Datei+Zeile, `firnc1` gibt RC=2 und **null Oktett**. `BEFUND-FIRNC1-STILL.md`, festgenagelt in K16 §2b |
| **Runde KANTE: kein Fehler** | Am Bild nachgemessen — die Ecke ist ein sauberer Viertelkreis (5/4/2/1 Bildpunkte Einzug). `FM_RADIUS=0` ist die Vorgabe **ohne** Formmarke, nicht der gemalte Wert |
| **Sprache in der Abnahme** | `aufnahme.sh` schrieb `lang=de` **und** gab `lang=` nicht auf die Kommandozeile → Tastatur blieb deutsch, während die Oberfläche englisch war. Jetzt `kbd: layout en`, `taskbar: lang=en src=2 keys=377` |
| **Eine Meldung, die log** | `kbd.say_seq` legte die Sequenznummer als rohes Oktett auf die Leitung (`^[[^_` statt `31;5~`) — ausgeliefert war alles richtig |

---

## 10. Getroffene Entscheidungen (nicht mehr aufrollen)

| Entscheidung | Datum | Kern |
|---|---|---|
| **Browser: CERTUS** | 28.08. | Kein Chromium-Port. Eigener Unterbau, gemessen ~81 000 Zeilen (browser 12 471, js 28 718, html 9 353, css 9 305, layout 7 236, dom 2 914, net 5 979, paint 3 283, font 1 910) — **umgesetzt** |
| **MP4/MKV** | 28.08. | Container **lesen**, Video-Codecs (H.264/HEVC/AV1/VP9) **nicht** dekodieren, klare Meldung stattdessen. **Ton wird abgespielt** → zugleich vollwertiger Musikspieler |
| **Linken: STATISCH** | 29.08. | PLAN speichert inhaltsadressiert + dedupliziert. Jede Generation in sich vollständig, kein brechender ABI-Vertrag. Preis: libc-Lücke = alles neu bauen → `O-005` |
| **Barrierefreiheit ins Fensterserver-Protokoll** | 28.08. | Weil alle Programme dieselbe Widget-Schicht (`wig.fi`) nutzen, entsteht der Baum **einmal zentral**. Zweig `a11y` gebaut, aber **ungemergt** → `S-007` |
| **Lizenz GPL-2.0-only** | 27.08. | Osum, OrientOS, Firn, Certus |
| **Zwei Architekturen** | 27.08. | x86-64 **und** ARM (AArch64), Fernziel Telefon |
| **Namensregel** | 27.08. | Befehls-/Programmnamen **englisch**, Oberflächentexte deutsch |
| **Leitsatz** | 08.09. | "Brutal leichtgewichtig **und** brutale Kompatibilität" gleichzeitig |

---

*(Fortsetzung unten: Runde OFFEN-PRÜFUNG vom 12.09.2026.)*

---

## RUNDE ECHTHARDWARE-3 (09.09.2026, Zweig `merge9`, Commits `2954ea2` … `3f763c5`)

Belege: `/srv/store/belege/orientos-eh3/2026-09-09/` (BEFUND.md + vier Bilderreihen).
**Nichts gepusht.**

| ID | Punkt | Beleg / Messwert |
|---|---|---|
| `G-001` | **Fenstergröße per Maus ändern** | Der Griff war `GRIP0=12` **nur unten rechts** — auf 2560×1440 mit uiscale 2 ein 24×24-Ziel; wer danebentrifft, verschiebt das Fenster. Jetzt ist der ganze rechte **und** untere Rand Griff (`wm.fi` `on_mouse`), `GRIP0` 12→8 |
| `D-017` | **Vektorsymbole in der Shell** (Teil: Startknopf) | Der Startknopf war das letzte hochskalierte Bitmap (`marke_start`, drei Größen 16/24/32, ganzzahlig vervielfacht). Jetzt `icons.START` aus `assets/osum-icons.ttf` über `wlibc.icon_at` **in Zielgröße gerastert**. **GEMESSEN:** `taskbar: marke vektor px=28`. App-Bündel bleiben OSYM → `D-017` bleibt *teilweise* |
| `D-012b` | **Dunkelmodus gemessen, nicht behauptet** | Mittlere Bildhelligkeit über alle sechs Ansichten: **hell 244–245, dunkel 16–18**. Kein weißes Fenster in einer der sechs Ansichten (`pruef` in BEFUND.md §6) |
| — | **Sechs Ebenen statt drei** (Framework) | `L_DESK 0 < L_NORMAL 1 < L_TOP 2 < L_MENUE 3 < L_POPUP 4 < L_TIP 5` (`kernel/wm.fi`). Blase über allem **und klickdurchlässig** (`wm.hit` überspringt `L_TIP`), Menü auf `L_POPUP` + `WS_KEYS`, Startmenü auf `L_MENUE`. Die Handnachhilfe in `taskbar.fi` (Menü von Hand auf `L_TOP`, mit `tip_win_id` auf ein Menüfenster) ist **entfallen** |
| — | **Tastenzustellung an Leiste und Schreibtisch** | `taskbar.fi:4566` und `desktop.fi:325` holten jedes Ereignis mit `WM_EVENT` ab (und damit **aus dem Ring**) und prüften nur auf `EV_DOWN`/`EV_CLOSE`. Jede Taste dorthin war gelesen und weggeworfen. Neu: `wlib.feed_key` |
| — | **Ereignisring verliert keine Taste mehr** | Bei Überlauf flog immer das **älteste** Ereignis; das war meist eine Bewegung, manchmal ein Tastendruck. Jetzt wird gezielt die älteste **Bewegung** geopfert (`wm.ev_push`) |
| — | **Uhr: doppelter Zeitzonenversatz** | `taskbar.clock_build` addierte den Versatz aus `/etc/time.conf` ein **zweites** Mal auf die bereits lokale Kernzeit. Neues Feld `I_TZMIN` (`uio.fi`/`ulib.fi`). **GEMESSEN:** `t=22:43:59 09.09.26` gegen Hostzeit 20:44:00 UTC |
| — | **Kachelmodus zerschießt die Oberfläche** | `set_tile_on` nahm **alles** in den Baum — Schreibtisch, Taskleiste, Startmenü, Menüs, Blasen. Neue Regel `kachelbar()` **in `tile_take`** (eine Stelle, nicht vier Rufer) |
| — | **Helligkeitsregler ziehbar** | `qs.fi` `step()` kannte nur `EV_KEY`/`EV_DOWN`/`EV_CLOSE` — eine Bewegung bei gedrückter Taste kam nie an. Jetzt `EV_MOVE` + `EV_UP` mit `zieht`-Wache |
| — | **Leistensymbole folgen der Leistenhöhe** | `gl_w()` war fest `16 × ui_scale`; jetzt zwei Drittel der Knopfhöhe, gerundet, begrenzt 12..32. Bei Vorgabe (Knopf 32) **exakt die alte 16** |
| — | **Diagnosetafel auf Englisch** | 15 Beschriftungen (`QUEUE CURSOR PANEL CALIB BEAT STAGE IMAGE PICK STRIP BOARD KEYS CLOCK FOUND NET SAFETY TICK`). Zeile 19 war 51 Zeichen bei 48 Spalten (`LG 4 Z19 51`) → gekürzt |
| `G-002` | **Kontrollzentrum: Regler ziehbar + über der Leiste** | Drei Ursachen: `qs.step()` kannte kein `EV_MOVE`; der Schließweg pollt den Zeiger und hielt die Mitte eines Ziehens für einen Druck daneben; das Panel lag auf `L_NORMAL`, also unter der Leiste. Jetzt `EV_MOVE`+`EV_UP`, Flanken-Entscheid und `L_MENUE`+`WS_KEYS`. **GEMESSEN am Bild (y=591):** Griff links `x=916..924`, Mitte `x=1082..1090`, rechts `x=1247..1255` |
| — | **Abnahme-Werkzeug kann ziehen** | `tools/design/fahren.py`: `ziehe`, `zieheauf`, `ziehespur`. Ohne das lässt sich weder Fenstergröße noch Schieberegler prüfen. Dazu meldet `qs.fi` seine Reglerrinne selbst (`qs: hell spur von=… bis=… ym=…`) — geschätzte Koordinaten lagen 16 Punkte daneben |
| `B-001` | **DHCP-Klient entlastet** (nicht gelöst) | **GEMESSEN in QEMU/e1000:** Discover→Offer→Request→Ack, `lease=86400`, `/etc/network.conf` + `/etc/resolv.conf` geschrieben, Leiste zeigt `10.0.2.15`. `N-002` (Rundruf ohne ARP) ist in `vendor/firn/lib/net/stack.fi` **bereits gebaut**. Der Verdacht liegt damit beim **r8169** — bleibt offen |

---

## RUNDE OFFEN-PRÜFUNG (12.09.2026) — geprüft gegen `/root/osum-merge11` `main` `3ce22f3`

Diese Einträge kamen **nicht** aus einer Baurunde, sondern aus der Prüfung
der Liste selbst: sie waren längst fertig, `OFFEN.md` wusste es nur nicht.
Der Stand vom 09.09. galt gegen `merge9 faa6a07` und kannte den Merge des
Zweigs `explorer2` (`71bbc63`) sowie die Runden VEKTOR, ECHTHARDWARE-3…6,
MERGE-11, BRUECKE, WASM, fUi 31/32, ENGLISCH, ABBILD und BELEG nicht.

**20 Punkte, davon 13 P1.** Jede Zeile trägt den Beleg, mit dem der Status
gewechselt wurde — kein Punkt hat ihn ohne Messung oder Fundstelle gewechselt.

### Der wichtigste: eine Falschmeldung widerlegt

| ID | Punkt | Runde | Beleg / Messwert |
|---|---|---|---|
| `P-018` | **Explorer `umbenennen()` zerstört Ordner — WIDERLEGT** | EXPLORER-2 | Die Kette ist `rename_do` (`explorer.fi:1554`) → `expakt.umbenennen` (`expakt.fi:596`) → `io.rename` (`io.fi:335`) → `SYS_RENAME=82` (`sys.fi:1045`/`:2421`) → `fs.rename_path` (`fs.fi:2443`), und die hängt mit `dir_add`+`dir_remove` den **Verzeichniseintrag** um. **GEMESSEN** `bash tools/ofs3/run.sh` 12.09.: `rename() kam ohne Fehler zurueck: 0` · **`UMBENANNT UND NICHT KOPIERT: dieselbe Inode vor und nach rename (21)`** · `OFS3: 75 bestanden, 0 gescheitert`. Zwei Zugaben: belegtes Ziel gibt `EEXIST` statt still zu überschreiben (`fs.fi:2465`), und `..` wird beim Ordnerwechsel nachgezogen (`fs.fi:2478`). `unlink` steht in `explorer.fi` nur noch in einem Kommentar (Z. 19) |

### Aus dem Merge des Zweigs `explorer2` (`71bbc63`, Runde EXPLORER-2)

`STATUS-EXPLORER2.md`: 12 Punkte fertig, **49 Prüfungen, 0 Mängel**,
Sichtprüfung in zwei Auflösungen (`cut 0` in 13 Bildern).

| ID | Punkt | Beleg / Messwert |
|---|---|---|
| `P-004` | **Explorer — die große Lücke** | Einfügen/Ausschneiden (`T_STRG_V` `explorer.fi:1642`, `paste_do` `:1532`), Mehrfachauswahl (`select_list` `:1448`, `wlib.sel_*`), Eigenschaften (`props_show` `:1589`), Seitenleiste, Breadcrumb, Filter, Öffnen-mit, Miniaturen, Undo. Mitschnitt: `explorer: clip n=8 schnitt=0` · `explorer: paste n=7 sprung=1 rc=0` · `explorer: props zeilen=8 bytes=14` |
| `P-019` | **Toter Code (`welches == 4` doppelt)** | Jedes Menü hat jetzt eine eigene Nummer; die Tafel steht in `explorer.fi:2912-2935`. Läufer: „der doppelte Zweig ist aufgeloest (1 Vorkommen)" |
| `P-020` | **Explorer-Grenzen zu eng** | `expmodell.fi:82-83`: `MAXENT 4096`, `NAMEB 256`, Historie 64. Die alten 96/32 gelten nur noch für den Sicherungsmodus und heißen deshalb `SIC_MAXENT`/`SIC_NAMEB` (`explorer.fi:118-119`) |
| `P-021` | **Zeit-Spalte zeigt `--`** | `explorer: zeit mtime=… mit=9 von=9 tzoff=120` — **9 von 9** Einträgen mit echter Zeit, in Ortszeit aus derselben Quelle wie die Taskleiste |
| `G-003` | **Strg+N öffnet keinen Dialog** | Es fehlte die **Taste**, nicht der Dialog. `explorer.fi:1763` behandelt `wlib.KEY_CTRL_N` → `dlg_open`; `wlib.fi:538` `KEY_CTRL_N = 0x131` |
| `G-004` | **F-Tasten fehlen in `kbd.fi`** | `kbd.fi:414`: Abtastcodes `0x3B..0x44` → `ESC [ n ~` (F1..F5 = 11..15, F6..F10 = 17..21, die Lücke bei 16 ist Überlieferung). F11 `:444` und F12 `:456` gehen in den Kürzelring |
| `G-005` | **STRG+Buchstabe kommt als Steueroktett an** | `kbd.fi:506-541`: genau die **zwei** Kollisionen gehen als `ESC[n;5~` — Strg+H (↔ Rückschritt 8) und Strg+N (↔ Pfeil hoch 14). Die anderen 24 bleiben Steueroktette, damit Shell und Editor nichts merken |
| `G-011` | **Werkzeugleiste ohne Symbole** | Läufer: „die Textzeichen < > ^ sind weg" + „die Werkzeugleiste ruft icon_button(NAV_BACK)" |
| `S-001` | **Zwischenablage nicht Ende-zu-Ende** | Jetzt kopieren **drei** Programme wirklich voneinander: `edit.fi:1138/1151`, `sh.fi:1088/1096`, `explorer.fi:2497`. Damit ist die Zusage „ein Programmpaar kopiert voneinander" eingelöst |
| `A-011` | **`osum-explorer2` nicht gemergt** | `git log main` zeigt `71bbc63 MERGE-10: Zweig explorer2 in merge9, fuenf Konflikte gemessen geloest`. (`schleuse2` bleibt offen → `F-003`) |

### Aus der Runde VEKTOR / AVX

| ID | Punkt | Beleg / Messwert |
|---|---|---|
| `K-001` | **XSAVE/XCR0 für Ring 3** | `tools/avx/run.sh` **32 passed, 0 failed**. Gemessen: `CR4 traegt OSFXSR, OSXMMEXCPT und OSXSAVE (cr4=0x340620)` · `der Kern nimmt XSAVE und nicht nur FXSAVE (mode=3)` · `XCR0 ist gesetzt und zurueckgelesen: 0x7` · `der Sicherungsbereich ist genau der, den cpuid nennt: size=832 = need=832` · `Abweichungen ueber alle vier Prozesse: 0` · `kein Prozess hat je die Register eines anderen gesehen` · `saves=2937 restores=2936` |
| `B-002` | **AVX-512-Maschinen: Ring 3 stirbt mit `#UD`** | Dieselbe Runde. Und die Zusage ist **fallbar gemacht**: `GEGENPROBE: ohne Sicherung sehen die Prozesse fremde Register (sum=1000)` · `GEGENPROBE: ohne die Runde stirbt der erste Prozess an einem #UD`. Freischalten allein wäre falsch gewesen — genau das prüft `nofpuswitch` |

### Aus den Runden STICK, BETRIEB, ECHTHARDWARE-6

| ID | Punkt | Beleg / Messwert |
|---|---|---|
| `N-002` | **Rundruf hängt an ARP** | Gelöst als **Flicken auf Firn**, damit er einen `--force`-Lauf überlebt: `vendor/firn/patches/0001-rundruf-ohne-arp.patch`, wirksam in `vendor/firn/lib/net/stack.fi:560` — `out_dst == 0xFFFFFFFF` geht direkt an `ff:ff:ff:ff:ff:ff` statt über `next_hop`. Gemessen: vom USB-Abbild ohne Gateway kam vorher keine Antwort, danach `dhcp: offer` und `dhcp: gesetzt ip=10.0.2.15` |
| `N-001` | **DNS-Resolver fehlt** | `kernel/user/dhcp.fi:454` schreibt `/etc/resolv.conf`, `lib/libc/dns.fi` liest es. **GEMESSEN** (`BEFUND-ECHTHARDWARE-5.md` §I): `host -v example.com` → **172.66.147.243**, server 10.0.2.3, tries 1, **ms 11**, ttl 273. Und darauf aufbauend HTTPS: `fetch https://example.com/` → verify OK, suite 4865, **HTTP/1.1 200 OK** |
| `B-001` | **DHCP auf Justins Brett scheitert** | Drei Dinge zusammen: (1) `N-002`, (2) der Klient wartet bis zu **10 s** auf den Treiber statt endgültig aufzugeben, (3) er **gibt nicht mehr auf** — Wiederholung mit wachsendem Abstand **5/10/20/40/60 s** (`dhcp.fi:520-556`, Commits `2578d9d`, `aec2110`). Justin hat auf echter Hardware per DHCP eine Adresse bekommen; `aec2110` hält fest: „Im Lauf davor gab es `192.168.1.107` vom selben Router" — der Stapel ist also nicht das Problem gewesen, sondern der Zeitpunkt und das Aufgeben |
| `K-010` | **`/proc/klog` passt nicht** (1 Seite statt Ring) | `kernel/procfs.fi:125` nennt den Weg für alles: **`/dev/klog`** — „der Strom hat keine Grenze". Die Seitengrenze von `/proc/klog` ist damit eine Eigenschaft und kein Mangel |

### Aus den Runden ECHTHARDWARE-3 und MERGE-10 (in `OFFEN.md` schon als erledigt markiert, hier zur Vollständigkeit)

| ID | Punkt | Beleg / Messwert |
|---|---|---|
| `G-001` | **Fenstergröße per Maus ändern** | Der Weg war da, nur unerreichbar: `GRIP0=12` allein unten rechts, auf 2560×1440 mit uiscale 2 ein 24×24-Ziel. Jetzt ist der ganze rechte und untere Rand Griff, `GRIP0` 12→8 (`wm.fi` `on_mouse`) |
| `G-002` | **Kontrollzentrum öffnet kein Panel** | Drei Ursachen (kein `EV_MOVE` im Regler, Schließweg hielt ein Ziehen für einen Druck daneben, Panel auf `L_NORMAL` unter der Leiste). **Am Bild bestätigt 12.09.2026:** `hell-05-kontrollzentrum.png` und `dunkel-05-kontrollzentrum.png` in `/srv/store/belege/orientos-abbild-2/` zeigen das Panel mit Kacheln und Reglern |
| `D-012` | **Dunkelmodus ist blaustichig** | `STATUS-MERGE10.md` §3. Gemessen: B−R +5,8 → +2,5; `#10141a` von 20,4 % auf 0,0 % |

### Abgelöst, nicht erledigt

| ID | Punkt | Warum |
|---|---|---|
| `A-001` | **25 von 74 Abschnitten rot** | Die Zahl galt für `merge9`. Der Volllauf gegen `3ce22f3` misst andere Abschnitte **aus anderen Ursachen** — und die beiden größten sind Messaufbau, nicht Kernel: `A-014` (`memmap.py` stürzt an einem umbenannten Konstantennamen ab, sechs Abschnitte) und `A-016` (die Läufer bauen die fUi-Programme mit `profile kernel` statt `app`, sechs weitere). Der Punkt ist durch `A-014`/`A-015`/`A-016` ersetzt |

**Was diese Runde NICHT geleistet hat:** der Volllauf war bei Abschnitt 26
von 73 noch nicht durch, als dieser Bericht geschrieben wurde. `A-002`
(`stick` 22), `A-003` (`k15` 20) und `A-009` (Durchklick) stehen deshalb in
`OFFEN.md` als **unklar** bzw. unverändert — nicht als „noch da", sondern
als „nicht neu gemessen". Das ist der ehrlichere von beiden Fehlern.

*Ende ERLEDIGT.md — was noch fehlt: `OFFEN.md` · wo alles liegt: `INVENTAR.md`*

---

## Welle vom 15.09.2026 — vier Runden, auf `main` gemergt und auf dem VEREINIGTEN Stand neu gemessen

OrientOS `main` = `75c44db`. Alle Zahlen unten stammen aus Laeufen **nach**
dem Zusammenfuehren, nicht aus den Zweigen.

| Punkt | Runde | Beleg | Messwert (auf dem Merge-Stand) |
|---|---|---|---|
| **K-019** Plattenverschluesselung | `krypto` | Laeufer `tools/krypto/run.sh` | **61/0.** Argon2id + XTS-AES-256, LUKS2-Prinzip. Bausteine **168/168** gegen `hashlib`, `argon2-cffi` und OpenSSL; RFC-9106-Vektor auch gegen den `argon2`-Befehl (dritte Umsetzung). Rohgeraet: Entropie 7,495–7,586, **0** Dateisignaturen, **0** Textfolgen. Gegenprobe in BEIDE Richtungen: der Wirt liest OrientOS' Traeger (4/4) UND OrientOS macht einen fremden Traeger auf, formatiert und beschreibt ihn (4/4). Passphrase wechseln ohne einen Sektor neu zu verschluesseln. |
| **P-022** Videocodecs | `codec` | Laeufer `tools/codec/run.sh` | **71/0.** h.264 Baseline, I- und P-Slices, CAVLC, Deblocking, Viertelpel-Bewegungskompensation. **51 Bilder aus 10 Stroemen, 51 SHA-256 gegen ffmpeg, 51 Treffer** — byteweise, PSNR unendlich, 0 abweichende Bildpunkte. 35 kaputte Stroeme sauber abgewiesen. CIF 352x288 mit 31,9–55,9 B/s. |
| **K-015** `RAND_*`/`MARGIN_*` | `kleinkram` | `kernel/uprog.fi`, `tools/english/const_table.tsv` | Uebrig war **ein** Treffer (`u_fuzz_margin` -> `u_fuzz_rand`). Echte margin-Bedeutungen geprueft und **nicht** angefasst. Die sieben Tabellenzeilen entfernt, die den Fehler beim naechsten Lauf wieder eingebaut haetten. |
| **F-006** `vendor/net/BLOBS` | `kleinkram` | `vendor/firn/COMMIT` | **War schon erledigt, jetzt belegt.** Alle drei Hashes stimmen gegen den Pin `c4e3dfce`. Nachgezogen hatte es `5091963`. |
| **B-007** UEFI in `hwdiag` | `kleinkram` | zwei QEMU-Laeufe | **War schon erledigt, jetzt belegt.** OVMF: `firmware=UEFI`, SeaBIOS: `firmware=BIOS`, beide Male richtig, beide mit den drei Rohwerten daneben. Warnung notiert: `qemu -kernel` mit OVMF funktioniert nicht. |
| **A-017** `themetest` | `kleinkram` | `tests/theme` | 65/26 -> **82/9**. Zwei Werkzeugfehler, keiner im Kern: `image.sh` baute mit 8 MiB statt 32768 Bloecken, und `tools/theme/model.py` war dem Kern nicht nachgezogen. Neun Zusagen bleiben rot -> `A-021`, `A-022`, `A-023`. |
| **A-018** `customres` | `kleinkram` | `tools/customres/run.sh` | 123/12 -> **135/0** (auf dem Merge-Stand nachgemessen). Alle zwoelf gingen auf **eine** richtige Kernaenderung zurueck (`WIN_SLOTS` 8 -> 16, `maplimit` jetzt 29 360 128) — **rot war die Erwartung, nicht der Kern.** Dabei fiel ein echter Fehler auf: zwei Zusagen zaehlten hinter einer fest getippten Grenze **lautlos nicht mehr mit**. |
| **A-019** `powermon` | `kleinkram` | `tools/powermon/run.sh` | **121/0** (erster Lauf 120/1, der eine Fehler beim Nachlauf nicht reproduzierbar). |
| **A-020** `display` EDID | `kleinkram` | `tools/display/run.sh` | 142/3 -> **145/0**. EDID kommt bis Ring 3 durch, samt Hersteller- und Modellname. Die Tafelbreite kommt jetzt aus dem Kernmitschnitt desselben Laufs statt aus einer getippten Zahl. |

**Die Lehre dieser Welle steht in `docs/RUNDE-KLEINKRAM.md` und ist die
wichtigste Zeile:** vier von fuenf untersuchten Ursachen waren *zweite
Implementierungen und fest getippte Zahlen, die einer richtigen
Kernaenderung nicht nachgezogen wurden*. Jedes Mal war der Kern im Recht
und die Messung im Rueckstand.

---

## Welle 2 vom 15.09.2026 — drei Runden, `main` = `3b28f2b`

Alle Zahlen aus Laeufen **nach** dem Zusammenfuehren.

| Punkt | Runde | Messwert (auf dem Merge-Stand) |
|---|---|---|
| **K-020** AES-NI | `aesni` | **31/0.** XTS von **0,58 auf 188 MiB/s** — Faktor **276x** (512 Oktette) bis **349x** (4096). Ein Megaoktett: 2,5 s -> **6 ms**. Richtigkeit auf sieben unabhaengigen Proben: FIPS 197 exakt, 6000 Zufallsbloecke Tabelle-gegen-AES-NI **0 ungleich**, 300+200+400 Sektoren gegen OpenSSL in beiden Richtungen **0 Abweichungen**, im Kern `gleich=385 ungleich=0`. Rueckfallweg dreifach echt gefahren. `krypto` weiter **61/0**, WLAN **185/0**. |
| **A-021** Kontrast | `farbe` | `text-secondary` dunkel `N_400` -> `N_300`: **4,038 -> 6,974** (day/night), 6,896 (paper), 7,066 (midnight). **110 Rollenpaarungen** gerechnet, vorher 4 unter der Schwelle, nachher **0**. An BEIDEN Stellen geaendert (`wlibc.fi` und `model.py`, ein Commit). Im Foto: die alte Farbe **0 Bildpunkte**, die neue 284 auf 3956 Punkten `surface-hover`. |
| **A-022** rohe Farbwerte | `farbe` | 17 -> **0**. Nach Einzelpruefung sind **16 zu Recht roh** und einzeln begruendet: acht sind ein **Drahtformat**, das `tools/vsync/zerreiss.py` zurueckliest, um Reissen zu zaehlen; sieben sind die **Diagnosetafel**, die lesbar bleiben muss, wenn das Markensystem kaputt ist; einer ist eine **Deckung**, keine Farbe. Der **eine echte Fehler**: `taskbar.fi:3598` `0xFFFFFF` -> `wlibc.RGB24` (eine Maske) — dieselbe Aenderung hatte `wlibc.fi` schon, `taskbar.fi` war nicht nachgezogen. |
| **A-023** `surface`-Anteil | `farbe` | 4 rot -> **14 gruen**. **Die Zusage war falsch, nicht die Oberflaeche:** `surface` traegt in allen sechs Schemata **exakt 80 879 Punkte** (7,9 %). Gemessen wurde der *Rang*, und der haengt an der Quantisierung des Schreibtisch-Verlaufs (hell 6-14 breite Stufen, dunkel 31-47 duenne), nicht an der Zeichenroutine. Neue Zusage: **Flaeche** (>= 3 %) statt Rang, **plus** eine Gegenprobe auf Verschiedenheit von `surface`/`surface-sunken` — damit **schaerfer** als vorher. Sie hat sofort einen stillen Messfehler gefunden: Fotos entstanden, bevor das Fenster offen war. |
| **K-018** 2. Haelfte | `schlaf` | **66/0** (die 31 der Vorrunde alle gruen, 35 neu). Der Ruhezustand traegt jetzt ueber den **Hochlauf**. Details und was offen bleibt: siehe `OFFEN.md` K-018. |

**Certus** (`main`, Zweig `smi32`): SMI-Bereich auf **+/-2^31**, Bitoperationen
ganzzahlig. **1,42x** auf Bit-Code (drei Laeufe: 1,423/1,427/1,421),
gegen Chromium **50,1x -> 48,9x**. WPT auf dem gemergten Stand neu
gemessen: **142/776 Dateien und 5998/12016 Subtests — Zahl fuer Zahl
gehalten.** Der eigentliche Befund war die Vorabmessung: eine
Bitoperation kostete **519 ns gegen 44 ns** fuer eine Addition, weil
`a|b` durch `to_int32` -> `f64_to_int32` lief und dort `trunc` und
`fmod` rief — zwei Gleitkomma-Bibliotheksaufrufe, um aus einer Zahl,
die schon ganz ist, eine ganze zu machen. Der **Bereich selbst ist
gratis** (5,2 gegen 5,7 ns); es gab nie einen Tempogrund fuer 2^30.

### Die Lehre dieser Welle

**Die Zuteilung beider Nummernraeume hat beim ersten Mal gehalten.** Ein
einziger Konflikt, und der war rein textlich. Zum Vergleich Welle 1:
nur die Seiten vergeben, zwei Runden nahmen denselben Modusindex.

Dazu ein neuer Befund des Kartenpruefers: er findet nicht nur
Kollisionen, sondern auch **Zuteilungen, die ins Leere zeigen** —
`schlaf` bekam 1020..1029, der Modusvektor endete bei 1024.
`MODE_WORDS` steht deshalb jetzt auf 17.

---

## C-003 — die Baufalle, 15.09.2026 (Certus `main` = `ddf2c34`)

`tools/gauntlet/bauen.sh` trug im Kopf „baut aus dem AKTUELLEN
Arbeitsbaum" und sprang in Zeile 8 nach `cd /root/certus-ui`, mit
`FIRNLIB=/root/firn-dnspic/lib`. Wer aus einem Arbeitsbaum heraus
„sein" Binaer baute, baute **ohne Warnung `main`** — und mass
anschliessend zwei identische Fassungen gegeneinander. Die Runden
NANBOX und SMI32 haben sich beide mit einer von Hand gebauten
Symlink-Farm beholfen und die Falle im Bericht beschrieben; das Skript
blieb, wie es war.

**Behoben:** die Wurzel kommt jetzt aus dem Ort der Skriptdatei, und
die FIRNLIB-Farm wird dazu passend erzeugt — die Laufzeit aus
`/root/firn-dnspic/lib`, darueber alles, was der eigene Baum selbst
hat. Der eigene Baum gewinnt.

**Belegt mit `bash tools/gauntlet/bauen.sh --selbsttest`** — der setzt
einen Syntaxfehler in die eigene `lib/js/val.fi`, baut, und vergleicht
den **aufgeloesten** Pfad aus der Fehlermeldung:

```
aus main:            zeigt auf: /root/certus-ui/lib/js/val.fi
aus dem Arbeitsbaum: zeigt auf: /root/certus-w-probe/lib/js/val.fi
```

Die erste Fassung des Selbsttests war dabei selbst zu streng: sie
verglich den **gemeldeten** Pfad (`.bau/firnlib/js/val.fi`) als Text
und schlug fehl, obwohl der Symlink auf die richtige Datei zeigte.
Verglichen wird deshalb `readlink -f`, nicht die Zeichenkette.

---

## Welle 3 vom 15.09.2026 — sieben Runden, OrientOS `main` = `2ed5911`, Glass `main` = `f39b8df`

| Punkt | Messwert auf dem vereinigten Stand |
|---|---|
| **K-018** Ruhezustand fertig | `tools/suspend/run.sh` **94/0**. Prozesse laufen nach dem Wiederanlauf **wirklich weiter** — der Kern bildet den Speicher identisch ab, also liegt ein per `reserve_frame` zurueckgeholter Kernstapel automatisch an derselben virtuellen Adresse; der Sprung ist `context_switch`, kein eigenes `restore_regs`. |
| **K-021** Argon2 parallel + SHA-NI | `tools/argon/run.sh` **35/0**. Entsperren **825 -> 461 ms** (Faktor 2,2-2,7 bei vier Kernen, `p=4` deckelt). Die 5,2 s des Auftrags waren eine Hochlauf-Gesamtzeit; das Entsperren kostete **790 ms**. Unbelegte Schluesselplaetze kosten nichts. SHA-NI mit Rueckfall auf drei Maschinen, **4512 Kreisproben, 0 ungleich**. Seriell angelegte Platte geht parallel auf und umgekehrt. |
| **K-022** | Der XTS-Schluesselspeicher bleibt bei einem Schluessel — unveraendert offen, siehe `OFFEN.md`. |
| **G-012** GPU | VIRGL auf diesem Wirt nicht baubar -> `G-013`. Stattdessen **Hardware-Zeiger**: 2001 -> 17 Bilder, 2,3x weniger Oktette, 28 % schneller, QEMU bezeugt 2001 `update_cursor`. |
| **C-001** `binary_op` | Rechenbefehle deutlich billiger, Wirkung auf den Baenken **null** -> der Befund geht als `C-004` weiter. |
| **Layout** (Glass) | `css-flexbox` **39 -> 69**, `css-sizing` **16 -> 36**, `css-grid` **20 -> 35**. Ursache waren **zwei Fehler ausserhalb des Layouts**: die ID-Kollision `G_EL_OFF_W`/`D_DOC_CTOR` auf 40180 (jeder `offsetWidth` lief in den Dokument-Erzeuger) und `<body onload=...>` wurde nie uebersetzt. Stumme Dateien in flexbox **186 -> 3**. |
| **Speicher-API** (Glass) | `lib/js/typed.fi` (ArrayBuffer, DataView, neun TypedArray-Sorten), `lib/js/sclone.fi` (strukturiertes Klonen). **IndexedDB 33 -> 42**, **webstorage 12 -> 16**. Bytes liegen im **rohen** GcVec, weil der Sammler konservativ ist. |

**Glass gegen Chromium, acht Suiten:** 261 -> **340 von 2260 Dateien**.

**P-023 h264-Tempo (15.09., Zweig `h264t`, auf `main`).** 640x480 mit
**24,3-25,2 Bilder/s** (Messlatte war 25), 720p 7,5 B/s, CIF 62 B/s.
`tools/codec/run.sh` **95/0**, alle Bilder weiter **bitgleich** mit
ffmpeg. **SIMD wurde nicht gebraucht** — und die Profilmessung hat die
Rangfolge des Auftrags widerlegt: `tab_find` war einzeln messbar
schneller, aber am Ende **wirkungslos**. Details in
`docs/RUNDE-H264T.md`.

---

## Welle 4 vom 15.09.2026 — OrientOS `main` nach `kleinkram2`, Glass `main` nach `bcloop`+`reftest`+`gridtief`

| Punkt | Messwert auf dem vereinigten Stand |
|---|---|
| **C-004** Befehlsabruf | **Der Auftrag war falsch adressiert, und das ist der Befund.** Der Abruf kostet **9,70 ns**, nicht 131-152. Die Zeit lag in `OP_LDNAME`/`OP_STNAME` (**216,5 / 256,5 ns**): `resolve_name` sucht per `has_prop`, wirft den Fund weg, `lookup_value` laeuft dieselbe Kette nochmal; beim Schreiben ein drittes Mal. Jetzt ein Gang statt zwei. Baenke **1,46x/1,49x**, Bit-Baenke **1,77x**, gegen Chromium **48,5x -> 32,5x**. Die Deuterschleife blieb unangetastet: `bc_exec_n` exakt **17 607 Byte** wie vorher. |
| **C-005** Reftest-Laeufer | `tools/wpt/reftest.py` steht. **CSS2/floats 17/62, CSS2/normal-flow 22/41** -- erstmals ueberhaupt eine Zahl. Der eigentliche Fund lag im Download: unter `/root/wpt-run` lagen **null `-ref.html`**, `hole_suiten.py` hatte sie mit zwei Zeilen uebersprungen. Dazu die Pfadfalle: `CSS2/` liegt upstream unter `css/CSS2/`. **Der Laeufer waere beinahe einer geworden, der immer gruen sagt** -- Xvfb und HTTP-Dienst starben still, und zwei leere Seiten sind pixelgleich (109 Tests waeren "bestanden"). Deshalb `dienste.sh` (prueft HTTP 200 und `xdpyinfo`) und ein Selbsttest mit fuenf Faellen. Verglichen wird **exakt**: derselbe Test zweimal gerendert 0 abweichende Punkte, ein scheiternder 3536. |
| **Grid** | `css-grid` **35 -> 42 Dateien**, Subtests 1310 -> 2571, **stumme Dateien 329 -> 32**. Von 625 roten Dateien waren 329 stumm -- `document.fonts` fehlte (294 Dateien haengen ihren Test daran), `getComputedStyle().gridTemplate*` war `undefined`, `el.style.gridTemplateColumns` lief ins Leere. Der Spurenalgorithmus hatte **genau einen** echten Rechenfehler: `expand_flexible` hob jeden `fr`-Faktor einzeln auf 1 an statt die **Summe** (12.7.1) -- bei `1fr 1fr` faellt das nie auf. Nebenbei: ein Zwischenspeicher in `sel.fi` wurde bei Klassenaenderungen aus JS nie entwertet, das hob `css-cascade` von 14 auf **15**. |
| **K-022** XTS-Tafel | `tools/xtstafel/run.sh` **6/0**. Vier Plaetze statt einem: zwei Traeger abwechselnd, **200 Neufuellungen -> 0**. Die offene Frage aus Runde AESNI ist beantwortet: nach `forget()` **0 von 3360 Oktetten** ungleich null. `forget()` loescht alle Plaetze, der Vergleich laeuft weiter ohne fruehen Abbruch (Zeitkanal). |
| **O-009** Geraeteschluessel | `tools/geraetekey/run.sh` **12/0** -- der Schluessel ueberlebt den Neustart. Der echte Weg ueber die installierte Platte wartet auf **P-001**. |

**Glass gegen Chromium, acht Suiten: 340 -> 350 von 2260 Dateien.**
Tempo **32,5x** langsamer statt 48,5x.

---

## Welle 5 vom 15.09.2026 — Glass `main`, OrientOS `main`

| Punkt | Messwert auf dem vereinigten Stand |
|---|---|
| **P-001** Installer | **`tools/install/abnahme.sh` 35/0, einschliesslich 7b.** Alle fuenf Auftragsvermutungen waren falsch: `/bin/installer` lag im Abbild, `sofort` kam an, `wigapp=` wurde richtig zerlegt. Die Ursache war eine **Reihenfolge in `kmain.fi`**: `osum(state)` (Zeile 796) steht vor `gfx.stage_surface` (934), startet `/bin/init`, das im Ziel `grafik` keinen Dienst hat, 100 s leer dreht und `shutdown()` ruft — die Oberflaeche wurde nie erreicht. `wm_owns_shell` fragte nur nach `M_WMSHELL`, nicht nach `wig`. Die naheliegende Reparatur haette die Platte gebrochen (`installer: ready n=0`), weil die fruehe Rueckkehr auch den Plattenaufbau uebersprang — sie steht jetzt **vor dem ersten Prozess** statt im Funktionskopf. |
| **O-009** Geraeteschluessel | Damit auch auf dem **echten Weg** belegt (installierte Platte statt RAM-Wurzel). `tools/geraetekey/run.sh` **12/0**, darin die Gegenprobe: mit einer Wegwerfwurzel faellt O-009 durch. |
| **C-008** CSSOM-Setzer | **Der Auftrag lag bei der Ursache daneben, und die echte war groesser.** `css_supports_cp` prueft nur den NAMEN (`property_id != P_NONE`) — `grid: 10px` haette ihn passiert. Der Fehler lag tiefer: `el.style['grid-auto-flow']` tat **gar nichts**, weil `install_css_props` nur die 73 KAMEL-Namen anlegte; WPT schreibt mit Bindestrich. Deshalb waren **17 von 19 `*-invalid.html` falsches Gruen** — sie bestanden, weil nichts ankam. Parsing **413 -> 803 Subtests**, 20 -> 27 Dateien. |
| **C-009** Reftests | Laeufer jetzt **mehrstraengig**: CSS2/floats+normal-flow **185 s -> 40,1 s** (4,6x). `css-flexbox` erstmals ganz gemessen: **336/853 = 39,4 %** (vorher Stichprobe 24/106). 1638 fehlende Referenzen in css-grid -> 3, Kosten 0,2 GB. `reftest_selbsttest.sh` 5/5. |
| **C-007** Web Animations | **Die Maschine war da, es fehlte die Tuer.** `lib/anim/` (5725 Zeilen, seit Runde UHR) rechnete CSS Animations 78 % und Transitions 88 %, Web Animations **0 %** — derselbe Motor, dreimal gemessen. Es fehlte nur `element.animate`. **0/648 -> 520/581.** Die zwei erschlichenen 190/190-Dateien aus Runde GRIDTIEF stehen jetzt ehrlich bei 62/190. |
| **C-006** oberste Ebene | **Ziel weitgehend verfehlt, und der Bericht sagt es.** Geometrisches Mittel **1,11x**: zwei Baenke gewinnen (`leere_schleife` 2,39x, `arith` 1,68x), zehn stehen still — das eigene Ventil schaltet ab, sobald irgendwo eine Funktion steht. Richtigkeit haelt: **67/67** Semantikfaelle, 13 neue Beobachtungsfaelle, gegen node gegengeprueft. Geht als `C-010` weiter. |

**Glass gegen Chromium, acht Suiten: 350 -> 365 von 2260 Dateien**,
11 138 bestandene Subtests. `dom` zeigt -1, das ist als **Lastartefakt
nachgewiesen** (siehe `M-001`), kein Rueckschritt.

---

## Welle 6 vom 15./16.09.2026 — Glass `main`

| Punkt | Messwert auf dem vereinigten Stand |
|---|---|
| **Landkarte** (`breite`) | **17 Suiten, 5365 Dateien: 644 gruen = 12,0 %**, 12155/44924 Subtests = 27,1 %. Chromium liegt dort praktisch bei 100 %. Der Bericht sagt es direkt: *„Wir sind bei einem Achtel."* Neu ist die Trennung **ECHT stumm** von **Infra stumm** — 1097 gegen 322 Dateien. Liegt in `docs/GLASS-LANDKARTE.md`. |
| **C-012** css-grid-Reftests | **299/1610 = 18,6 %**, alle 1650 Dateien, **0 RENDER_FEHLER**. Der erste Lauf meldete 1600 RENDER_FEHLER und haette „5/32 = 15,6 %" ins Protokoll geschrieben — **ein echter Fehler in `lib/window/x11.fi`**: bei Anzeige `:100` rechnete die alte Fassung `(100/10)%10 = 0` und baute `/tmp/.X11-unix/X00`. **Zweistellig war die stille Obergrenze**, jeder Reftest-Strang ab dem dritten lief ins Leere. Behoben bis `:9999`. Dass daraus keine gruene Luege wurde, liegt an der Ergebnisart `RENDER_FEHLER` — genau dafuer ist sie da. |
| **C-011** Web-Animations-Reste | **Die Messung hat die Reihenfolge umgedreht.** Die JS-Oberflaeche (`reverse`, `updateTiming`, `playbackRate`, `KeyframeEffect`) bringt in diesen Suiten **null Subtests** — die 306 Treffer auf „reverse" waren `wrap-reverse`/`row-reverse` aus dem Flexbox-Layout. Deshalb **nicht gebaut und gesagt**. Stattdessen: alle acht `neutral-keyframe`-Dateien **0/1 -> 1/1**, Komposition **62 -> 71/190**, Web Animations 161 -> 164/170 bei unveraenderten CSS-Wegen (133/170 und 150/170). Vier Fehler behoben, die aelter waren als die Runde (`calc()` als Spurgroesse galt als ungueltig). **Zwei eigene Rueckschritte selbst gemessen und behoben** — der erste war nur in der Web-Animations-Spalte sichtbar, genau wofuer die getrennte Zaehlung gebaut wurde. |
| **C-010** Ventil je Name | **Gebaut, korrekt, wirkungslos — und das ist das Ergebnis.** Die Auftragspraemisse war falsch: B3 ist nicht der Grund fuer die stillstehenden Baenke. **An 872 echten Skripten gemessen blockiert B3 allein 0,00 %.** Das Ventil ist eine weisse Liste; die zehn Baenke scheitern an `N_CALL`, `N_MEMBER`, `N_OBJECT`, `N_ARRAY` — die laut Auftrag ausdruecklich bleiben sollten. Befoerderte Baenke nach der Aenderung: **0 von 12**, der Bytecode Wort fuer Wort derselbe. |

**Die acht Kernsuiten: 365 -> 375 von 2260 Dateien** (`css-grid` 45 -> 54,
`css-cascade` 15 -> 16), keine Suite gefallen.
