Netzwerk-Labor · Doku 📏 Befund – Output-Runde (unabhĂ€ngige Messung) Zum Spiel Online

📏 Befund – Output-Runde (unabhĂ€ngige Messung)

[!info] Was diese Datei ist Ich bin der PrĂŒfer dieser Runde, nicht einer der Ströme. Hier steht der Vorher-Stand der 14 CSS-Dateien und der zwölf Minimalismus-Regeln — gemessen, bevor die Ströme geschrieben haben. Wenn der Lead „Ströme sind durch" meldet, wird derselbe Satz Zahlen erneut gemessen und gegenĂŒbergestellt (§ 7 sagt vorher, was geprĂŒft wird — damit die Abnahme nicht nachtrĂ€glich verhandelbar ist).

[!tip] Der Vorher-Stand ist gegen weiterlaufende Arbeit gesichert Alle 14 Dateien sind byte-identisch mit HEAD (bbf20d8). Die Nullmessung ist deshalb jederzeit reproduzierbar, auch wenn die Ströme weiter am Arbeitsbaum schreiben: git show HEAD:src/stil/<datei>.

1 · Vorher-Stand der 14 Dateien

Aufnahme 09.10.2026, 17:06:43 (Schnappschuss) — geprĂŒft: jede Datei == HEAD (Byte-Vergleich SHA256, nachdem ein erster Vergleich ĂŒber git show im Textmodus bei inspektor.css falsch anschlug; siehe § 5). Bytes, Zeilen und CRLF sind byteweise gezĂ€hlt, nicht ĂŒber einen Editor.

DateiBytesZeilenCRLFSHA256 (HEAD, vollstÀndig)
editor.css29 0643370248CC2C0F79998D5838F6C689CDF078B6E430A816CD152173DB17EF8669D637F
spiel.css24 4322820873924F0A8A7A4D969FA408971DD4AD385CAE0AAB8E0D928A156811F356CE6F9
szene.css6 9577608874206F241A72D121BEA4D7BD8C621BB2DA0D0BBD51669ECC67C7EE140DEB2C
juice.css3 2424708542E107662F195FA616C77287E9000AA4C7592EE98A94D09562C4B972C3B017
rahmen.css17 1361930F1D1C915B08B862C612CD397E1992A4994F7A52F47FB9525EC75543C1A9D5C43
leiste.css6 71978027C6F587FB1F7F7CC413EA1DF43A29FBFBC5F23C7272D6D6686A8DC04755E659
inspektor.css11 658149149C3AAC7D8604C245DF117694AE1DBDE65136592E8A9B58F3AD0847D828C96FB88
ereignisse.css1 577170CAD4294044F7279DF7133DAE05A0486C743786E198B8D4F1915B87C092221280
karriere.css10 4171310319ED3F1398FBC80FAFA6EEBE22784D366E5F98F494105A9601917ABEE5E75C9
hub.css7 061910A1E1B052E7B2F14BA0DFA2164A1090A8E818B0F48F38406338BF72DB585BEC32
simulation.css11 92614601DDACB8E4879CD393E94BBA32BC69D1BF7546673DE3C43B7E95494615E24635C
terminal.css2 0892209DD47547813A508053ADE36890C7F8022EFAC5B153A4D37D4BBFD08D2864C6E2
akte.css2 799370439966587CFD075B75C3720E9A4DAF0D39131B60F5BF1525FF662FDACBF310DA
kundenakte.css2 768420724DE277DE4BE68CE9D2DEA6A479852FEA1C6D283504A60D5A642780C32A9E96

[!warning] inspektor.css ist die einzige CRLF-Datei — und git sieht dort nichts 11 658 B, 149 Zeilen, alle 149 mit CRLF — so steht sie in HEAD, also committet, nicht von einem Strom erzeugt. git ls-files --eol src/stil/inspektor.css meldet i/-text w/-text, git hĂ€lt die Datei fĂŒr binĂ€r: eine LF-Umstellung wĂ€re mit git diff --stat nicht sichtbar. Ich prĂŒfe diese Datei deshalb spĂ€ter byteweise (§ 7, Punkt 1). Alle anderen 13 Dateien sind reines LF (i/lf w/lf).

2 · Vorher-Stand der Regeln — aus HEAD, mit tools/ethos.py selbst gerechnet

Gesamtzahlen aus HEAD (git show HEAD:
 fĂŒr alle 29 Dateien in src/stil/, dem Werkzeug als Textliste ĂŒbergeben):

RegelWas sie zÀhltHEAD
R1Farbe nur per Token23
R2Radius nur aus Tokens122
R3Schrift nur aus 6 Werten206
R4Abstand nur aus der Skala539
R5Dauer nur 1/160/320 ms70
R6z-index nur aus der Leiter11
R7!important nur in basis.css0
R8Bewegung aus: ein zentraler Block5
R9Ein Selektor einmal definiert0
R10keine identische Blockdopplung87
R11LĂ€ngenzahl nur mit Einheit0
R12höchstens 6 Bedienelemente je Ansichtnicht gemessen (ohne --dom ĂŒbersprungen)

Kennzahlen HEAD: 29 Dateien · 2 199 Zeilen · 6 106 Deklarationen · 1 791 Regelblöcke · 1 750 Selektor+Kontext.

Die vier verfolgten Altlasten je Datei (Summe = 173):

DateiR5R6R8R10Summe
editor.css11401934
spiel.css12221935
szene.css1612221
juice.css1001011
rahmen.css8301425
leiste.css50027
inspektor.css200911
ereignisse.css21003
karriere.css30036
hub.css10034
simulation.css0001313
terminal.css00011
akte.css00011
kundenakte.css00011
Summe7011587173

Vier Dateien haben kein R5/R6-Problem (simulation, terminal, akte, kundenakte): dort geht es nur um R10. Umgekehrt trĂ€gt editor.css allein 4 der 11 z-index-VerstĂ¶ĂŸe.

3 · Die Stand-Datei als Referenz — und warum „GRUEN" dort wenig heißt

tests/stil-stand.json (500 B, SHA256 2C685CEB3FB3B2ABC9808C3106DA33B94C3B51F0F9817EE0F00D266E1CC8DFC5, zuletzt 06.10.2026 18:54:39) friert ein: R5 70, R6 11, R8 5, R10 87 — also genau die HEAD-Zahlen, die der Lead genannt hat. Aber: die Stand-Datei friert 21 Dateien / 1 878 Zeilen / 5 450 Deklarationen ein; heute sind es 29 / 2 199 / 6 106.

[!warning] ethos.py meldet damit „GRUEN", obwohl 173 VerstĂ¶ĂŸe offen sind Das ist die Bauart des Werkzeugs, nicht ein Fehler: pruefe_gegen_stand meldet nur, wenn eine Zahl steigt („Eingehalten ist damit nicht jede Regel — der Stand friert die Altlasten ein"). FĂŒr die Abnahme heißt das: „GRUEN" ist kein Nachweis. Der Nachweis sind die Zahlen aus § 2.

Live-Stand um 17:07 (python tools/ethos.py, Exit 0, „GRUEN"): R5 67, R6 10 — die Ströme haben zu diesem Zeitpunkt also bereits 3 Zeitwerte und 1 z-index bereinigt. Alles andere unverĂ€ndert.

4 · Zeitachse der Nullmessung (wer wann was angefasst hat)

ZeitBeobachtung
17:06:39tools/ethos.py geschrieben — syntaktisch kaputt (except Exception als_fehler:)
17:06:43mein Schnappschuss der 14 Dateien — identisch mit HEAD
17:06:45mein erster python tools/ethos.py → SyntaxError: invalid syntax, Exit 1, keine Zahlen
17:06:50ethos.py repariert (571 Zeilen), lÀuft wieder
ab 17:07:15die Ströme schreiben: ereignisse.css, spiel.css (17:07:22), karriere.css (17:07:23) 

17:07:44tests/ethos-r12.test.js neu geschrieben — mit einem echten " im Testnamen (§ 5)
~17:09mein Gesamtlauf → LADEFEHLER, Exit 2: die Suite lĂ€dt nicht mehr
~17:12node tools/pruefe-namen-flicken.js (trocken) → 1 laden nicht; der Blocker war bestĂ€tigt
~17:15derselbe Trockenlauf → 0 laden nicht: der Blocker ist behoben (Datei 6 723 → 6 725 B)

Was die Ströme bis ~17:15 schon verÀndert hatten (Byte-Vergleich gegen HEAD, alles weiter LF):

DateiHEAD B/Zjetzt B/ZΔ Bytes
spiel.css24 432 / 28225 472 / 288+1 040
szene.css6 957 / 768 411 / 90+1 454
juice.css3 242 / 474 313 / 55+1 071
ereignisse.css1 577 / 171 797 / 19+220
karriere.css10 417 / 13110 349 / 128−68
hub.css7 061 / 917 135 / 91+74
simulation.css11 926 / 14611 899 / 136−27
terminal.css2 089 / 222 135 / 22+46
akte.css2 799 / 372 882 / 37+83
kundenakte.css2 768 / 422 826 / 41+58
editor.css · rahmen.css · leiste.css · inspektor.css—unverĂ€ndert0

[!note] Diese ZwischenstĂ€nde sind kein Nachher-Stand Sie sind der Beweis, dass die Runde lĂ€uft — nicht ihr Ergebnis. Die Abnahme (§ 7) misst erst nach dem Wort „Ströme sind durch".

5 · Der Blocker: die Suite lud nicht (und die Ursache)

tests/ethos-r12.test.js:83 enthielt in einem pruefe()-Namen ein echtes ASCII-AnfĂŒhrungszeichen:

pruefe("Eine nicht erreichbare Ansicht ist „nicht gemessen" — und reißt die Regel", () => {

Das " hinter „nicht gemessen“ schließt die Zeichenkette vorzeitig → SyntaxError: missing ) after argument list. Weil tests/run.js:58 alle Testdateien in einen vm-Zusammenhang lĂ€dt, riss das den ganzen Lauf ab: LADEFEHLER: labor-tests.js:22744, Exit 2, keine einzige Zahl. Genau die Falle, vor der AGENTS.md warnt („Gegen die Falle in Testnamen") — und tools/pruefe-namen-flicken.js kannte sie: Trockenlauf 1 laden nicht. Rund zehn Minuten spĂ€ter war sie behoben (0 laden nicht).

Nicht von mir behoben (mein Schreibrecht ist diese Datei): ich habe nur gemeldet und belegt.

Erledigt um ~17:15 — node tools/pruefe-namen-flicken.js meldet danach 0 laden nicht. Die Suite lĂ€dt wieder; node tests/run.js lĂ€uft durch.

Der Gesamtlauf ist wÀhrend der Runde ein bewegliches Ziel

ZeitErgebnisrote Tests
17:15:46678/689 grĂŒn, 11 rot (78 Testdateien, 91 Module)nicht mitgeschrieben
17:20:48686/690 grĂŒn, 4 rotDoku: Markdown-Konverter â€ș „Jede erzeugte Seite hat <h1>, Inhalt, Fussleiste und den Weg zum Spiel" · Doku: Markdown-Konverter â€ș „Die Uebersicht nennt alle Dokumente, gruppiert, mit einer Zeile je Dokument" · Klassenraum: Lösbarkeit â€ș „alle 27 Fertigkeiten: Injektor + Ziel, im Startnetz wirklich gebrochen, gĂŒltig und lösbar" · Klassenraum: Lösbarkeit â€ș „der echte Weg der Lehrkraft: erzeugen → Code → ausCode → lösen → Abnahme besteht (alle 27)"
17:29:38690/690 grĂŒn, 0 rot, Exit 0keine (78 Testdateien, 91 Module, 0 ĂŒbersprungen)

[!warning] Die Nullmessung des Gesamtlaufs ist nicht 661/661 In 14 Minuten: 689 → 690 Tests und 11 → 4 → 0 rote. Die vom Lead genannte Zahl 661/661 ist nicht reproduzierbar — es gibt inzwischen 690 Tests. Wer sie als Vorher-Stand zugrunde legt, vergleicht gegen einen Stand, den es nicht mehr gibt. FĂŒr die Nachher-Messung gilt: Gesamtzahl nur zusammen mit Zeitstempel, und rote Tests namentlich — die Zahl allein sagt nichts. Erschwerend: der Gesamtlauf ist selbst ein Schreibvorgang (siehe Kasten unten), er Ă€ndert also den Zustand, den er misst.

[!note]- Warum zwei rote Tests meine Datei betrafen (und sich selbst heilen) tests/doku-seite.test.js zĂ€hlt die Quellen (docs/**/*.md plus README.md und AGENTS.md) und verlangt, dass jede davon in docs/doku/ als Seite liegt. Mein neuer Befund war um 17:20 noch nicht gebaut → zwei Karten fehlten → zwei Tests rot. Im selben Lauf baut der dritte Test dieser Datei die Seiten neu (tools/seite.py); eine Messung unmittelbar danach zeigt 42 erzeugte Seiten, 41 Karten und „41 Dokumente" in docs/doku/index.html — Bau und Quellen stimmen dann ĂŒberein. Der Zustand heilt sich also selbst, ist aber fĂŒr jeden neu hinzugefĂŒgten Text eine Runde lang rot. Die Testdatei kennt das (Kommentar doku-seite.test.js:114-115). Folge fĂŒr die Messung: node tests/run.js ist kein reiner Leselauf — er baut docs/doku/ neu und verĂ€ndert damit den Zustand, den er misst.

6 · Ein eigener Messfehler, offen gelegt

Mein erster Vergleich „Schnappschuss == HEAD?" lief ĂŒber git show 
 im Textmodus; Python wandelt dabei CRLF → LF. FĂŒr die eine CRLF-Datei (inspektor.css) ergab das einen falschen Unterschied (HEAD „11 509 B" gegen Arbeit „11 658 B"). Korrekt ist die Byte-Messung: HEAD-Blob und Arbeitsbaum sind dort identisch (11 658 B, 149 × CRLF). Der Fehler ist hier festgehalten, weil er die Bauart zeigt: wer Zeilenenden ĂŒber einen Textmodus vergleicht, misst nicht die Datei.

7 · PrĂŒfplan fĂŒr die Nachher-Messung (vorher festgelegt)

  1. Zeilenenden byteweise je Datei (Bytes, Zeilen, CRLF, SHA256) und git ls-files --eol; fĂŒr inspektor.css zusĂ€tzlich git diff --stat gegen --ignore-cr-at-eol — mit dem Wissen, dass git diese Datei fĂŒr binĂ€r hĂ€lt.
  2. Regelzahlen R1–R11 gegen HEAD (jede Verschlechterung ist ein Befund) und gegen tests/stil-stand.json; Hash der Stand-Datei gegen 2C685CEB
 — wird sie gesenkt, um GrĂŒn zu bekommen, ist das ein Befund, kein Fortschritt.
  3. Werkzeuge gegen Abschalten: SHA256 von tools/ethos.py (2CDB1BAB
), tools/klassen.py (932F1959
), tools/menueprobe.py (6406173C
), tools/test.sh (AF592509
), tests/harness.js (6F14D06F
). Wird eine PrĂŒfung entfernt oder entschĂ€rft statt ein Wert geĂ€ndert, ist die Zahl wertlos. R12 muss wirklich gemessen werden (Zahl je Ansicht) — nicht â€žĂŒbersprungen" und nicht „0 aus einem Fehlerpfad".
  4. Bewegung, die RĂŒckmeldung trĂ€gt (§ 3 der Auftragslage): je Datei die Zahl der transition/animation-Deklarationen und @keyframes-Blöcke gegen HEAD — 36 / 54 / 41 in den 14 Dateien. Sinkt eine dieser Zahlen, wĂ€hrend R5/R8 sinken, wurde Bewegung entfernt statt diszipliniert.
  5. TrefferflĂ€che nicht durch Verkleinern des Inhalts: SchriftgrĂ¶ĂŸen-Histogramm je Datei (HEAD: u. a. 12 px = 35×, 13 px = 41×, 12,5 px = 25×, 14 px = 22×) und min-height/min-width-Werte (HEAD: 44 px = 3×, 40 px = 5×, 48 px = 2×, 46 px = 1×). Wird eine FlĂ€che „passend" gemacht, indem Text schrumpft oder verschwindet, ist das eine Verschlechterung, keine Reparatur.
  6. Altlast durch Löschen statt Ändern: sinkt die Zeilenzahl einer Datei, obwohl R10 steigen mĂŒsste — prĂŒfen, ob ein Regelblock gelöscht wurde und seine Selektoren dadurch ohne CSS dastehen (python tools/klassen.py muss 0 bleiben).
  7. Tokens/Farben/AbstĂ€nde: R1 (23), R2 (122), R3 (206), R4 (539) dĂŒrfen nicht steigen; R7/R9/R11 mĂŒssen 0 bleiben.
  8. python tools/klassen.py = 0 Klassen ohne CSS-Regel (Vorher: 0).
  9. node tools/sim-stand.js — die Simulation darf sich durch reine Stil-Arbeit nicht verĂ€ndert haben (Vorher nicht geprĂŒft, wird beim Nachher-Lauf mitgemessen).
  10. node tests/run.js — Gesamtzahl mit Zeitstempel und die roten Tests namentlich. Der Vorher-Stand ist nicht eine Zahl, sondern die Tabelle in § 5: 690/690 grĂŒn, 0 rot um 17:29:38 (davor 678/689 um 17:15:46 und 686/690 um 17:20:48). Die vom Lead genannte Zahl **661/661 ist nicht reproduzierbar** — es gibt inzwischen 690 Tests.
  11. Merkposten tools/menueprobe.py: der Lead nennt 36/43 als rot. Diese Zahl messe ich erst im Nachher-Lauf selbst nach (sie hĂ€ngt am gebauten web/index.html, und Bauen war nicht Teil der Nullmessung) — bis dahin gilt sie als vom Lead genannt, von mir nicht nachgemessen.

8 · Nicht geprĂŒft

9 · Belege (alle in dieser Sitzung ausgefĂŒhrt)

ZweckHandlungErgebnis
Vorher-StandGet-FileHash + Byte-ZÀhlung der 14 Dateien, 17:06:43Bytes/Zeilen/CRLF/SHA256 wie § 1
Ist HEAD der Vorher-Stand?git show HEAD:src/stil/<d> je Datei, Byte-Vergleich14 × identisch
Regeln aus HEADtools/ethos.py als Modul geladen, messen(texte=liste) mit HEAD-TextenR5 70, R6 11, R8 5, R10 87; Kennzahlen § 2
Regeln livepython tools/ethos.pyExit 0, „GRUEN", R5 67, R6 10, R12 ĂŒbersprungen
Klassen ↔ CSSpython tools/klassen.py0 Klassen ohne CSS-Regel, Exit 0
Zeilenendengit ls-files --eol src/stil13 × i/lf w/lf; inspektor.css i/-text w/-text
Blockernode tests/run.jsLADEFEHLER: labor-tests.js:22744, SyntaxError, Exit 2
Blocker bestĂ€tigtnode tools/pruefe-namen-flicken.js (trocken)1 laden nicht → spĂ€ter 0 laden nicht
Gesamtlaufnode tests/run.js (dreimal)678/689 (17:15:46) · 686/690 (17:20:48) · 690/690 grĂŒn, Exit 0 (17:29:38)
Fingerabdrucktransition/animation/@keyframes aus HEAD gezÀhlt36 / 54 / 41 in den 14 Dateien

Nachher-Messung (09.10.2026)

[!success] Kurzurteil Die Runde ist echt. Keine Regel wurde abgeschaltet, keine Schrift wurde kleiner, kein Höhenwert sank, die Zeilenenden sind unversehrt, klassen.py bleibt 0, die Simulation unverĂ€ndert, der Gesamtlauf 715/715 grĂŒn (17:43:37). R5 70 → 0, R6 11 → 0, R8 5 → 0, R10 87 → 0 sind mit unverĂ€nderten ZĂ€hlvorschriften gemessen. Zwei Dinge sind offen, und beide betreffen R8: die fĂŒnf prefers-reduced-motion-Blöcke wurden gelöscht, nicht in den zentralen Block verschoben (basis.css ist byte-identisch) — fĂŒr die meisten FĂ€lle nachweislich unschĂ€dlich, weil die EndzustĂ€nde in die Zustandsregeln wanderten; zwei Selektoren in juice.css haben jetzt aber gar keine Regel mehr (§ 12).

10 · Vorher/Nachher der 14 Dateien

Die Ströme haben noch wÀhrend meiner Nachher-Messung geschrieben: szene.css um 17:39:32 und rahmen.css um 17:42:01. Die Tabelle ist der Stand 17:43:56; Fingerabdruck, Selektor-Vergleich und R8-ZÀhlung habe ich nach diesen beiden SchreibvorgÀngen wiederholt, damit alles denselben Stand zeigt.

DateiHEAD B/ZJETZT B/ZΔBΔZCRLFSHA256 jetzt ([:16])R5·R6·R8·R10 vorher → nachher
editor.css29 064 / 33731 777 / 360+2 713+230949d7dfb2654e60e11·4·0·19 → 0·0·0·0
spiel.css24 432 / 28224 964 / 269+532−130567fc6b10f208b0912·2·2·19 → 0·0·0·0
szene.css6 957 / 7611 071 / 112+4 114+3601be83480f59438d816·1·2·2 → 0·0·0·0
juice.css3 242 / 474 313 / 55+1 071+80cd5df4147aa5c00810·0·1·0 → 0·0·0·0
rahmen.css17 136 / 19318 630 / 201+1 494+804a481b75b2026ea48·3·0·14 → 0·0·0·0
leiste.css6 719 / 786 898 / 79+179+1054ed7f695ec9de115·0·0·2 → 0·0·0·0
inspektor.css11 658 / 14911 490 / 141−168−8141a1005bc5e584ed3f2·0·0·9 → 0·0·0·0
ereignisse.css1 577 / 171 797 / 19+220+206a9b99251ea508112·1·0·0 → 0·0·0·0
karriere.css10 417 / 13110 349 / 128−68−30365bc84fead401ac3·0·0·3 → 0·0·0·0
hub.css7 061 / 916 965 / 88−96−30b305b50d4f38ae261·0·0·3 → 0·0·0·0
simulation.css11 926 / 14611 899 / 136−27−10043b54f31fbf320cf0·0·0·13 → 0·0·0·0
terminal.css2 089 / 222 135 / 22+460055e99c70cc8e764a0·0·0·1 → 0·0·0·0
akte.css2 799 / 372 882 / 37+830093344061d1c6e63d0·0·0·1 → 0·0·0·0
kundenakte.css2 768 / 422 826 / 41+58−101a6dea6255a88b6e0·0·0·1 → 0·0·0·0
Summe137 845 / 1 648147 996 / 1 688+10 151+40141—70·11·5·87 → 0·0·0·0

[!caution] Diese Tabelle ist eine Momentaufnahme, keine Endabnahme Die Summenzeile ist die Summe dieser Tabellenwerte (Stand 17:43:56). Eine NachzĂ€hlung wenige Minuten spĂ€ter ergab bereits 149 990 B / 1 708 Zeilen — es wurde also weiter geschrieben, nachdem der Lead „Ströme sind durch" gemeldet hatte. Meine erste Fassung dieser Summenzeile war außerdem falsch addiert (157 445 / 1 828 / +5 547 / +24); ich habe sie nachgerechnet und korrigiert. Regelzahlen, Zeilenenden und Werkzeug-Hashes sind von diesen NachtrĂ€gen nicht betroffen — sie waren bei jeder Messung im selben Lauf konsistent.

11 · Regeln und Kennzahlen Vorher → Nachher

RegelHEADjetztUrteil
R1 Farbe nur per Token2322besser
R2 Radius nur aus Tokens122121besser
R3 Schrift nur aus 6 Werten206204besser
R4 Abstand nur aus der Skala539530besser
R5 Dauer nur 1/160/320 ms700eingehalten
R6 z-index nur aus der Leiter110eingehalten
R7 !important nur in basis.css00unverÀndert
R8 Bewegung aus: ein zentraler Block50siehe § 12
R9 Ein Selektor einmal definiert00unverÀndert
R10 keine identische Blockdopplung870eingehalten
R11 LÀngenzahl nur mit Einheit00unverÀndert
R12 höchstens 6 Bedienelemente je Ansichtnicht gemessennicht gemessenohne --dom ausdrĂŒcklich „NICHT GEMESSEN" (kein stilles GrĂŒn mehr)

Kennzahlen: 29 Dateien · 2 245 Zeilen / 5 997 Deklarationen / 1 705 Blöcke / 1 658 Selektor+Kontext (HEAD: 2 199 / 6 106 / 1 791 / 1 750).

[!warning] Eine Zahl, die ich zuerst falsch gelesen habe: „Zeilen" tools/ethos.py liest Dateien im Textmodus; dort wird ein einzelnes \r ohne \n als Zeilenumbruch gezĂ€hlt. inspektor.css enthĂ€lt 12 solche einzelnen CR → der Lauf meldet 2 245 Zeilen, byteweise sind es 2 235; fĂŒr HEAD 2 199 gegen 2 187. Die Regelzahlen sind davon unberĂŒhrt. Wer Zeilen vergleicht, muss dieselbe ZĂ€hlweise benutzen.

12 · Der R8-Fund: gelöscht statt verschoben

basis.css ist byte-identisch zu HEAD (6 947 B, 94 Zeilen, git diff = 0 Zeilen). Der zentrale Block basis.css:91 ist eine 1-ms-Regel, kein Ausschalter:

@media (prefers-reduced-motion: reduce){ *,*::before,*::after{animation-duration:1ms !important; animation-iteration-count:1 !important; transition-duration:1ms !important} }

R8 wurde also nicht durch Einlagern gelöst, sondern durch Löschen der fĂŒnf Zusatzblöcke. Was darin stand und wodurch es heute gedeckt ist — jede Zeile nachgemessen:

gelöschter Block (HEAD)Inhaltheute gedeckt durch
juice.css:45animation:none fĂŒr .ger[class*="jc-"] .gb, .kabel[class*="jc-"] *, .am-ziele.jc-haken, .lb-wz.jc-wahl, .pa-kat.jc-wahl, .wert.jc-geld, .sp-sterne.jc-sterne span.vollZentralregel 1 ms — nicht animation:none. Die zwei ersten Selektoren haben gar keine Regel mehr
spiel.css:259.sp-overlay.blatt .sp-karte{transform:none; transition:none}.sp-overlay.da .sp-karte, .sp-overlay.blatt.da .sp-karte{transform:none} (spiel.css) — die Regel war doppelt
spiel.css:269.sp-fest .sp-senior-sym, .sp-fest h2{animation:none}beide Animationen haben both; ihre Keyframes enden auf transform:none; opacity:1 → Endzustand bleibt stehen
szene.css:35
{animation:none} und .sz-balken i{width:100%}szene.css:29 trÀgt den Endzustand jetzt selbst: .sz-balken i{
 width:100%; animation:sz-laden 
 both}, @keyframes sz-laden from{width:0}
szene.css:71animation:none, opacity:1 fĂŒr Adressen/Legende, .sz-stempel{transform:rotate(-12deg); opacity:1}szene.css:83 .sz-audit.gestempelt .sz-stempel{transform:rotate(-12deg); opacity:1; animation:sz-stempeln 
}; die Adress-/Legendregeln tragen opacity:1 ohnehin. Alles mit both

[!danger] Der eine echte Verlust .ger[class*="jc-"] .gb und .kabel[class*="jc-"] * haben im ganzen src/stil/ keine Regel mehr (gemessen ĂŒber alle 29 Dateien). Sie waren nicht tot: UI.juice(el,"einrasten") wird auf Kabel-Elementen gerufen (src/ui/editor-werkzeuge.js:307 und :353, Z.kEl.get(...)), und UI.juice setzt die Klasse jc-einrasten (src/ui/juice.js:11). FĂŒr Nutzer mit „Bewegung reduzieren" liefen die Einrast-Animation und die Port-LED-Animation dieser Elemente bisher gar nicht, jetzt laufen sie in 1 ms. Sichtbar dĂŒrfte der Unterschied nicht sein — gemessen ist er nicht (kein Browserlauf freigegeben).

Die Absicht dahinter ist dokumentiert und vertretbar: „Bewegung reduzieren" heißt im ganzen Programm „1 ms statt aus" (basis.css:91), und der zweite, schĂ€rfere Schalter der Einstellung (basis.css:93, html[data-bewegung="aus"] *{animation:none !important; transition:none !important}) ist unangetastet — „Bewegung aus" schaltet weiterhin wirklich ab.

13 · Die sieben Gegenproben — Ergebnis

#Gegenprobe (aus § 7)Ergebnis
1Zeilenenden byteweise + git ls-files --eol + git diff --stat gegen --ignore-cr-at-eolbestanden: git diff --stat src/stil = 306 insertions(+), 260 deletions(-), mit --ignore-cr-at-eol identisch; von 29 Dateien 28 × i/lf w/lf, nur inspektor.css i/-text w/-text (unverĂ€ndert 141 Zeilen / 141 CRLF / 12 einzelne CR)
2Regeln gegen HEAD und gegen tests/stil-stand.jsonbestanden: keine Regel schlechter, vier besser; Stand-Datei byte-identisch (2C685CEB
), also nicht gesenkt
3Werkzeuge gegen Abschaltenbestanden, mit Fußnote: stil-stand.json, klassen.py, test.sh, harness.js unverĂ€ndert; ethos.py geĂ€ndert — aber nur im R12-Block, Skalen und die Funktionen R4/R5/R6/R8/R10 zeichengleich zu 17:06, und R12 wurde strenger (sagt „nicht gemessen" statt stiller 0); menueprobe.py geĂ€ndert — Diff geprĂŒft: keine Kriterien abgeschwĂ€cht, nur eine Wartestelle + ein Neuladen bei „kein UI"
4Bewegung gegen „RĂŒckmeldung entfernt"bestanden: transition 36 → 35, animation 54 → 54, @keyframes 41 → 41. Die eine verschwundene transition ist benannt: der gelöschte R8-Block transition:none auf .sp-overlay.blatt .sp-karte — keine RĂŒckmeldung, sondern eine Reduced-Motion-Ausnahme
5TrefferflĂ€che nicht durch kleineren Inhaltbestanden: keine neue SchriftgrĂ¶ĂŸe, 0 Selektoren ohne font-size; die drei entfallenen font-size-Deklarationen stecken in Komma-ZusammenschlĂŒssen. min-height/min-width: nichts wurde kleiner, 44px 3 → 11, neu 68px; entfallen sind nur 0(1), 34px(2), 36px(1), 38px(1), 40px(1), 42px(1)
6Altlast durch Löschen statt Ändernbestanden mit zwei benannten Ausnahmen: Regelblöcke mit Komma-Selektorliste 119 → 158 (+39) = Zusammenschluss-Signatur; Selektoren 1 819 → 1 818 (2 weg, 1 neu); 3 Selektoren verloren eine Eigenschaft — .sp-overlay.blatt .sp-karte (transition, = der R8-Fall) und klassenraum.css: .kl-lehrer/.kl-schueler (overflow, außerhalb der 14 Dateien, nicht geprĂŒft ob gewollt)
7Tokens/Farben/AbstĂ€ndebestanden: R1 ↓1, R2 ↓1, R3 ↓2, R4 ↓9; R7/R9/R11 bleiben 0

Weitere Werkzeuge nach der Runde: python tools/klassen.py → 0 Klassen ohne CSS-Regel · node tools/sim-stand.js → „Simulation unverĂ€ndert gegenĂŒber dem Referenzstand" (12/12) · python tools/ethos.py → GRÜN + „BESSER als der Stand" + ausdrĂŒcklich NICHT GEMESSEN: R12 · node tests/run.js → 715/715 grĂŒn, 0 rot, 0 ĂŒbersprungen, Exit 0 (17:43:37, 81 Testdateien, 91 Module).

14 · Was ich widerlegt habe

  1. „R8 wurde in den zentralen Block verschoben." Widerlegt: basis.css ist byte-identisch, die fĂŒnf Blöcke wurden gelöscht, und die Zentralregel ist eine 1-ms-Regel, kein animation:none.
  2. „Eine Regel wurde abgeschaltet, um grĂŒn zu werden." Widerlegt: Skalen und ZĂ€hlfunktionen unverĂ€ndert, Stand-Datei unangetastet, R12 strenger statt lockerer.
  3. „Die TrefferflĂ€chen wurden passend gemacht, indem der Inhalt schrumpft." Widerlegt: keine kleinere Schrift, kein Selektor ohne font-size, kein gesunkener min-height-Wert.
  4. „Die Altlasten wurden gelöscht statt geĂ€ndert." Weitgehend widerlegt: +39 Komma-Listen zeigen den Zusammenschluss; nur 2 Selektoren verschwanden (beide aus dem gelöschten R8-Block).
  5. „Die MenĂŒprobe 43/5 ist reiner CSS-Fortschritt." Relativiert: menueprobe.py wurde in derselben Runde geĂ€ndert (Neuladen bei „kein UI"). Die Kriterien sind nicht abgeschwĂ€cht — aber der Vorher-Wert 36/43 stammt aus einer anderen Werkzeugfassung, der Vergleich ist deshalb nicht allein der Stil-Arbeit zuzuschreiben.
  6. „661/661 als Nullmessung." Nicht reproduzierbar: meine drei LĂ€ufe ergaben 678/689 → 686/690 → 690/690 (vorher) und 715/715 (nachher), jeweils mit Zeitstempel.
  7. Der eigene Fehler aus § 6 (Textmodus bei Zeilenenden) hat sich bestĂ€tigt und ist hier erneut aufgetreten — diesmal bei den Zeilen: Textmodus zĂ€hlt 12 einzelne \r in inspektor.css als UmbrĂŒche. Beide Male ist die Byte-Messung die verlĂ€ssliche.

15 · Nicht geprĂŒft (Nachtrag zur Nachher-Messung)