Netzwerk-Labor · Doku 🔬 Review – Klassenraum A+B (task-35, unabhĂ€ngige GegenprĂŒfung) Zum Spiel Online

🔬 Review – Klassenraum A+B (task-35, unabhĂ€ngige GegenprĂŒfung)

âŹ†ïž Netzwerk-Labor · Vertrag: Architektur § 12 · Spezifikation: A – Codec und Determinismus · B – OberflĂ€che und Ablauf · Vorherige PrĂŒfung: Review – 2.0-Fundament

Auftrag. Wieder der WIDERSPRUCH: Codec, eingefrorene Tabellen, Determinismus, „Wirkung vor GrĂŒn", E1, OberflĂ€chen-Regeln, Zeilenenden und der Abnahmebefehl — jede Aussage mit eigenem Befehl oder Experiment. GeĂ€ndert wurde nichts außer dieser Datei.

Kernaussage in einem Satz. Der Codec hĂ€lt jedes dokumentierte Beispiel ein, mit eigener Arithmetik nachgerechnet (auch das ungĂŒltige NL-4F7K-2Q) · die eingefrorenen Tabellen stimmen zeichengleich mit Spiel.ticketReihe() und dem Beleg, und die Umsetzung fĂ€hrt 27 Fertigkeiten, nicht 24 · E1 gilt (nicht im Postfach, aber spielbar), die Abnahme zahlt 0 €/0 Ruf/0 EintrĂ€ge · alle 16 Schnittstellennamen haben einen Aufrufer — aber zwei Kommentare und Dokument D sind veraltet, und der dort genannte Abnahmebefehl liefert 0 FĂ€lle statt 40.

Stand der Messung: 09.10.2026, 16:31–16:5x · Arbeitsbaum nur gelesen · kein Produktivcode, keine fremden Tests, kein schreibender git-Befehl, kein Prozess beendet · Schreibrecht nur diese Datei (so der Lead: eigene Datei statt Nachtrag — die 2.0-PrĂŒfung ist abgeschlossen und wird nicht mehr angerĂŒhrt).


1 · Verfahren

Alle Laufzeitmessungen laufen in einem eigenen vm-Bereich mit derselben Modulladung wie tests/run.js (90 Module, Schicht- und Alphabetreihenfolge). Es wurde keine PrĂŒfdatei angelegt; die Programme wurden per node -e ĂŒbergeben. FĂŒr die Aufrufer- und ZeilenendenprĂŒfung: Select-String, git ls-files --eol, Byte-Vergleich, Index-Arithmetik (Verfahren aus SITZUNGSABSCHLUSS Schritt 6, in Review – 2.0-Fundament § 10.3 belegt).


2 · Der Codec gegen Dokument A — bestĂ€tigt, mit eigener Arithmetik

Behauptung (Dokument A)Wie geprĂŒftErgebnis
Alphabet: 32 Zeichen, kein I, O, 0, 1KlassenraumCodec.ALPHABET gelesen"ABCDEFGHJKLMNPQRSTUVWXYZ23456789", LÀnge 32, eindeutig, keines der vier Zeichen enthalten · BASIS = 32
PrĂŒfsummen: C1 Gewichte 1,2,3,
 mod 31; C2 Gewichte 1,3,5,
 mod 32eigene Rechnung neben pruefsummen()s. u. — stimmt in allen FĂ€llen
NL-HC3L-CS gĂŒltigauftragLesen + eigene RechnungWerte [7,2,25,10] → C1 = 126 mod 31 = 2 → C; C2 = 208 mod 32 = 16 → S. Codec liefert CS. gleich ✓
NL-WTQJ-EF gĂŒltigditoWerte [20,17,14,8] → C1 = 128 mod 31 = 4 → E; C2 = 197 mod 32 = 5 → F ✓
E-KFWS-HZM = Sitzung 9, Platz 5, 5 Sterne, 1 Fehlversuch, 70 sergebnisLesen und ergebnisBauen({sitzung:9, platz:5, sterne:5, versuche:1, dauerS:70})gelesen: {sitzung:9, platz:5, sterne:5, versuche:1, dauerS:70}; gebaut: E-KFWS-HZM — Zeichen fĂŒr Zeichen gleich ✓
Nutzzeichen des Ergebniscodes KFWSH, PrĂŒfzeichen ZMeigene RechnungWerte [9,5,20,16,7] → C1 = 178 mod 31 = 23 → Z; C2 = 299 mod 32 = 11 → M. gleich ✓
NL-4F7K-2Q ist ungĂŒltigauftragLesen("NL-4F7K-2Q"){ok:false, fehler:"prĂŒfziffer", grund:"Die PrĂŒfziffer passt nicht – hast du dich vertippt?"} — abgewiesen ✓
richtig wĂ€re NL-4F7K-E3auftragLesen("NL-4F7K-E3")ok:true, Sitzung 26, Index 23, Variante 169 ✓
Rundlauf AuftragscodeauftragLesen("NL-HC3L-CS") → {7, 11, 42, art:"hand"}, damit auftragBauen(...)ergibt NL-HC3L-CS ✓

Zwei Fehlversuche auf meiner Seite, ausdrĂŒcklich genannt (sie gehören zur Wahrheit dieser PrĂŒfung):

  1. auftragBauen({sitzung:7, index:11, variante:42}) lieferte null — ich hielt das kurz fĂŒr eine Asymmetrie. Der Blick in den Quelltext zeigt: art ist ein Pflichtfeld (klassenraum-codec.js:99-100, f.art === "hand" ? 0 : f.art === "generiert" ? 1 : ganz(f.art, 1)). Mit art ist der Rundlauf grĂŒn.
  2. ergebnisBauen({sitzung:9, platz:5, sterne:5, **fehlversuche**:1, **sekunden**:70}) lieferte E-KFWA-AT6 — fĂŒr einen Moment sah das nach „Dokument und Code widersprechen sich" aus. Die Feldnamen heißen aber versuche und dauerS (:174-175). Mit den richtigen Namen kommt genau das dokumentierte E-KFWS-HZM heraus. Kein Befund — mein Fehler, und ich hĂ€tte ihn fast als Befund gemeldet.

3 · Die eingefrorenen Tabellen — zeichengleich, und die Umsetzung fĂ€hrt 27

BehauptungWie geprĂŒftErgebnis
58 Auftrags-IDs in Spiel.ticketReihe()-ReihenfolgeJSON.stringify(Spiel.ticketReihe().map(id)) gegen Nachweise/Klassenraum/A-tabelle.json → auftraege[].idzeichengleich ✓ (58 = 58)
TABELLE_AUFTRAEGE_LAENGEQuelltext klassenraum-codec.js:5058 ✓
27 Fertigkeiten, Reihenfolge wie DATEN.skillstabellen({ticketIds, skillIds}) gegen den Belegzeichengleich ✓ (27 = 27) · TABELLE_SKILLS_LAENGE = 27 ✓
Beleg trĂ€gt 24 tauglich: true, 3 falseA-tabelle.json → skillsbestĂ€tigt: 27 EintrĂ€ge, 24 tauglich (Stand vor task-5)
Die Leitung hat 27 entschiedentauglicheFertigkeiten() mit den echten Listen27, nichtTauglich: [] — die Umsetzung fĂ€hrt die Entscheidung ✓
Die Abweichung ist dokumentiertdocs/Architektur.md:878belegt, wörtlich: „L2plaetze 
 " bzw. die Zeile zur Tauglichkeit; und tests/klassenraum-codec.test.js:257-260 sagt ausdrĂŒcklich: „A § 3.3 nennt ‚24 von 27' — das ist ÜBERHOLT: seit task-5 
 gehören deshalb alle auf true", mit erwarte.gleich(T.tauglicheFertigkeiten().length, 27, 
)

Befund K1 — zwei lebende Kommentare sagen weiter „24 von 27"

Beide Stellen stehen im Produktivcode, nicht in einer Protokollnotiz. Die Zahl ist seit task-5 falsch (gemessen: 27). Der Lead hatte genau danach gefragt („wenn irgendwo noch 24 steht, ist das ein Befund"). Restzweifel: In den Dokumenten (A § 3.3, § 8, § 9) steht 24 weiterhin — das sind Protokolle des damaligen Standes und laut Projektregel nicht nachzuziehen; ich werte sie nicht als Befund.


4 · Determinismus ĂŒber den echten Weg — bestĂ€tigt

Nachgestellt wie die OberflĂ€che es tut (src/ui/klassenraum.js:312-315): ausCode → instanzErstellen mit {ticketId|skill, seed, quelle:"klassenraum", ohneFlow:true}.

MessungErgebnis
ausCode("NL-HC3L-CS"){sitzung:7, ticketId:"baeckerei-hotline", seed:43, code:"NL-HC3L-CS"} — der Code kommt kanonisch zurĂŒck
zwei „GerĂ€te": frischer Stand vs. Stand mit st.flow["lab.vlan"].stand = "verwicklung"def.id beide Male baeckerei-hotline → derselbe Auftrag ✓
Code auf beiden GerĂ€tenidentisch ✓

Verglichen wurde def.id — nicht der Netzkennwert, wie von E8 verlangt. Restzweifel: zwei ZustĂ€nde sind kein Beweis fĂŒr alle; ich habe genau die zwei Stellen variiert, die laut Fahrplan § 2.4 den Unterschied machten (Flow-Stand), nicht die Sitzungs-/Platzwerte.


5 · „Wirkung vor GrĂŒn": alle 16 Namen haben einen Aufrufer

Die Schnittstelle hat 16 Namen, nicht elf — docs/Architektur.md:885-886 erklĂ€rt das selbst („die elf Funktionen der Vertragstabelle § 12 + plaetze/plaetzeSetzen nach L6 + das vorhandene abnehmen + die PrĂŒfflĂ€che tabellen() — zusammen 16 Namen"). Meine Messung von Object.keys(Spiel.klassenraum) ergibt genau diese 16.

NameAufrufer in src/ (ohne Definition)
erzeugen, ausCode, ergebnisCode, ergebnisEintragen, netzkennwert, platzSetzen, plaetze, plaetzeSetzensrc/ui/klassenraum.js (ĂŒber ruf("
"), z. B. :93, :164, :187, :217, :295, :302, :356)
exportieren, importierensrc/ui/klassenraum.js und src/ui/karriere.js
tauglicheFertigkeiten, platz, tabellen, ausCodezusÀtzlich src/spiel/klassenraum.js
ergebnisLesensrc/spiel/klassenraum.js
abnehmensrc/spiel/abnahme.js, src/ui/klassenraum.js, src/ui/training.js

Zwei Fallen, die ich selbst getreten bin — und die ein oberflĂ€chlicher PrĂŒfer ĂŒbersieht:

  1. Mein erster Aufruferscan suchte nur \.name und meldete fĂŒr erzeugen, ergebnisCode, ergebnisEintragen, netzkennwert, platzSetzen, plaetzeSetzen „kein Aufrufer". Das war falsch: die OberflĂ€che ruft die API ĂŒber einen Namensverteiler (ruf("
")), die Namen stehen als Zeichenketten. Der zweite Scan (auch "name" und 'name') findet fĂŒr jeden der 16 einen Aufrufer.
  2. Ein Aufrufer in einer Testdatei zÀhlt nicht. Ich habe src/ und tests/ getrennt gezÀhlt; alle 16 haben mindestens einen src/-Aufrufer.

Was ich damit nicht belegt habe: dass der Weg im Browser auch anklickbar ist (kein Browser, § 12).


6 · E1 gilt — gemessen, nicht zitiert

Frischer Stand, Klassenraum-Auftrag ĂŒber den echten Weg (ausCode → instanzErstellen → inst.klassenraum):

Frage (E1)Messung
im Postfach?nein — postfach().some(x => x.iid === inst.iid) === false
im Offen-ZĂ€hler?nein — Spiel.offen() === 0
trotzdem spielbar?ja — Spiel.instanz(iid) vorhanden, Spiel.oeffnen(iid) ohne Wurf, Spiel.aktiveInstanz() === iid

Restzweifel, ehrlich: mein frischer Stand hatte ein leeres Postfach (postfachLaenge: 0), weil Spiel.leererStand() es nicht fĂŒllt. Der Beweis „nicht im Postfach" ruht daher auf dem iid-Vergleich, nicht auf der LĂ€nge. Die Kachel „Heute" und der Ereignistakt habe ich nicht gemessen — die gehören in Phase 2 (die TaktprĂŒfung braucht virtuelle Zeit ĂŒber Spiel.ereignisse).


7 · Keine Bewertung — bestĂ€tigt

Klassenraum-Auftrag gelöst und abgeschlossen (Spiel.loesung → Spiel.arbeitszieleErfuellen → Spiel.abnahme → Spiel.abschliessen):

bestanden: true   ΔEuro: 0   ΔRuf: 0   Δst.erledigt: 0   note: null

Kein Geld, kein Ruf, kein Karriere-Eintrag, keine Note. Restzweifel: „kein Hilfe-Feld" im Ergebnis-Code habe ich nicht einzeln geprĂŒft; der Feldkatalog des Codes ist nach Dokument A § 6.1 {sitzung, platz, sterne, versuche, dauerS} plus PrĂŒfzeichen — gemessen ĂŒber ergebnisLesen (Felder u. a. nutzzeichen, prĂŒfzeichen, C1, C2), kein Namens- oder Hilfefeld.


8 · Die Sitzung: 15 Felder — die 14 plus plaetze, kein Namensfeld

Spiel.klassenraum.erzeugen({ticketId:"salon-01"}) → Sitzung mit 15 Feldern, gemessen:

id · titel · art · ticketId · skill · index · variante · seed · eigene · schritte ·
code · dauerMin · plaetze · erstellt · ergebnisse

Restzweifel: Die 14 Dokumentfelder habe ich nicht Namen fĂŒr Namen gegen A § 7.1 aufgelistet (die Tabelle liegt um :696-702); ich habe gezĂ€hlt (15 − plaetze = 14) und die Namensliste auf VollstĂ€ndigkeit der naheliegenden Felder geprĂŒft. Ein einzelnes fehlendes Dokumentfeld wĂ€re mir dabei entgangen.


9 · OberflÀche, CSS, Testrahmen

PrĂŒfungBefehlErgebnis
jede neue kl-Klasse hat eine CSS-Regelpython tools/klassen.py0 Klassen ohne CSS-Regel ✓
Zeitwerte nur 1/160/320 mspython tools/ethos.pyGRÜN (29 CSS-Dateien, keine Regel schlechter als der Stand) ✓
kein zweites toUpperCase im UISelect-String src\ui\*.jsgenau ein Treffer: src/ui/inspektor.js:393 — vorbestehend, nicht in src/ui/klassenraum.js ✓
erwarte.wirftNicht existiert nichtSuche in tests/*.js0 Treffer ✓
keine Zusicherung im Gruppenrumpf (Exit-2-Falle)alle Testdateien in einem Bereich geladen, testsAusfuehren() nicht gerufenkein LADEFEHLER — alle GruppenrĂŒmpfe laufen durch ✓ · 661 TestfĂ€lle registriert
≀ 6 bzw. ≀ 3 sichtbare Bedienelemente (R12)nicht gemessensteht unter § 12
Escape schließt jeden Dialognicht gemessensteht unter § 12

10 · Der Abnahmebefehl — Dokument D irrt, die Zahl ist 67

Behauptung (Dokument D)Wie geprĂŒftErgebnis
node tests/run.js --klassenraum → 40/40Testnamen im geladenen Bereich gezĂ€hlt (Filter wirkt in tests/run.js:60 auf e.name.toLowerCase())0 FĂ€lle — die fĂŒhrenden Striche treffen keinen Namen. 0/0 grĂŒn. bestĂ€tigt: der Befehl ist unbrauchbar
der richtige Befehl und die echte Fallzahlditonode tests/run.js klassenraum → 67 FĂ€lle (Groß-/Kleinschreibung egal, run.js vergleicht klein)
Gesamtumfangdito661 registrierte TestfĂ€lle — deckt sich mit der Leitungsangabe „657/661"

Befund K2: In Dokument D steht ein Befehl, der null FĂ€lle prĂŒft, und eine Zahl (40), die nicht die Fallzahl dieses Filters ist. Wer ihn benutzt, sieht 0/0 grĂŒn und hĂ€lt das fĂŒr Erfolg — dieselbe Bauart wie der DHCP-Pool-Modus: grĂŒn, aber ohne Wirkung.


11 · Zeilenenden

git ls-files --eol fĂŒhrt nur die verfolgten Dateien; die fĂŒnf neuen sind noch ?? und erscheinen dort nicht. Gemessen:

Dateigit ls-files --eolUrteil
src/spiel/klassenraum.jsi/lf w/lf attr/text=auto eol=lfLF ✓
src/spiel/zustand.js (geĂ€ndert, +1 Zeile)i/lf **w/crlf**Verdacht — entlastet: zustand.js stand schon in der CRLF-Liste der ersten Messung um 15:20, vor der Änderung
src/spiel/klassenraum-codec.js, src/ui/klassenraum.js, src/stil/klassenraum.css (+ die vier Testdateien)untrackedalle LF, 0 CRLF ✓ — Byte-ZĂ€hlung unten

Byte-ZĂ€hlung der neuen Dateien (0 CRLF in jeder):

DateiZeilenBytes
src/spiel/klassenraum.js39226 295
src/spiel/klassenraum-codec.js31118 692
src/ui/klassenraum.js40025 550
src/stil/klassenraum.css594 401
tests/klassenraum-codec.test.js35226 792
tests/klassenraum.test.js28520 326
tests/ui-klassenraum.test.js40525 735
tests/klassenraum-abnahme.test.js33123 034

Index-Arithmetik fĂŒr src/spiel/zustand.js: HEAD 12 032 B + 215 Zeilen = 12 247 = Index-Statistik 12 247 → die Datei war schon vor der Änderung CRLF (dieselbe Rechnung wie in Review – 2.0-Fundament § 10.3). Ergebnis: kein Zeilenenden-Bruch in dieser Runde.

Restzweifel: Der Byte-Vergleich belegt den jetzigen Zustand; fĂŒr die fĂŒnf untracked Dateien gibt es keinen HEAD-Vergleich. FĂŒr zustand.js ist die Index-Statistik ein Indizienbeweis (Zustand beim letzten Git-Zugriff), kein lĂŒckenloser Verlauf.


12 · Nicht gemessen (Pflichtabschnitt)


13 · Befunde an den Lead (kurz)

Nr.BefundOrtSchwere
K1zwei lebende Kommentare sagen „24 von 27", gemessen sind es 27src/spiel/klassenraum-codec.js:297, src/spiel/klassenraum.js:32klein (Text), aber irrefĂŒhrend
K2Abnahmebefehl in Dokument D prĂŒft 0 FĂ€lle; richtig ist node tests/run.js klassenraum → 67Dokument Dmittel — „grĂŒn ohne Wirkung"
–Codec, Tabellen, Determinismus, E1, keine Bewertung, 16 Aufrufer, klassen.py, ethos.py, Testrahmen–bestĂ€tigt