đŹ 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 mitSpiel.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ĂŒft | Ergebnis |
|---|---|---|
Alphabet: 32 Zeichen, kein I, O, 0, 1 | KlassenraumCodec.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 32 | eigene Rechnung neben pruefsummen() | s. u. â stimmt in allen FĂ€llen |
NL-HC3L-CS gĂŒltig | auftragLesen + eigene Rechnung | Werte [7,2,25,10] â C1 = 126 mod 31 = 2 â C; C2 = 208 mod 32 = 16 â S. Codec liefert CS. gleich â |
NL-WTQJ-EF gĂŒltig | dito | Werte [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 s | ergebnisLesen 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 ZM | eigene Rechnung | Werte [9,5,20,16,7] â C1 = 178 mod 31 = 23 â Z; C2 = 299 mod 32 = 11 â M. gleich â |
NL-4F7K-2Q ist ungĂŒltig | auftragLesen("NL-4F7K-2Q") | {ok:false, fehler:"prĂŒfziffer", grund:"Die PrĂŒfziffer passt nicht â hast du dich vertippt?"} â abgewiesen â |
richtig wĂ€re NL-4F7K-E3 | auftragLesen("NL-4F7K-E3") | ok:true, Sitzung 26, Index 23, Variante 169 â |
| Rundlauf Auftragscode | auftragLesen("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):
auftragBauen({sitzung:7, index:11, variante:42})liefertenullâ ich hielt das kurz fĂŒr eine Asymmetrie. Der Blick in den Quelltext zeigt:artist ein Pflichtfeld (klassenraum-codec.js:99-100,f.art === "hand" ? 0 : f.art === "generiert" ? 1 : ganz(f.art, 1)). Mitartist der Rundlauf grĂŒn.ergebnisBauen({sitzung:9, platz:5, sterne:5, **fehlversuche**:1, **sekunden**:70})lieferteE-KFWA-AT6â fĂŒr einen Moment sah das nach âDokument und Code widersprechen sich" aus. Die Feldnamen heiĂen aberversucheunddauerS(:174-175). Mit den richtigen Namen kommt genau das dokumentierteE-KFWS-HZMheraus. Kein Befund â mein Fehler, und ich hĂ€tte ihn fast als Befund gemeldet.
3 · Die eingefrorenen Tabellen â zeichengleich, und die Umsetzung fĂ€hrt 27
| Behauptung | Wie geprĂŒft | Ergebnis | |
|---|---|---|---|
58 Auftrags-IDs in Spiel.ticketReihe()-Reihenfolge | JSON.stringify(Spiel.ticketReihe().map(id)) gegen Nachweise/Klassenraum/A-tabelle.json â auftraege[].id | zeichengleich â (58 = 58) | |
TABELLE_AUFTRAEGE_LAENGE | Quelltext klassenraum-codec.js:50 | 58 â | |
27 Fertigkeiten, Reihenfolge wie DATEN.skills | tabellen({ticketIds, skillIds}) gegen den Beleg | zeichengleich â (27 = 27) · TABELLE_SKILLS_LAENGE = 27 â | |
Beleg trĂ€gt 24 tauglich: true, 3 false | A-tabelle.json â skills | bestĂ€tigt: 27 EintrĂ€ge, 24 tauglich (Stand vor task-5) | |
| Die Leitung hat 27 entschieden | tauglicheFertigkeiten() mit den echten Listen | 27, nichtTauglich: [] â die Umsetzung fĂ€hrt die Entscheidung â | |
| Die Abweichung ist dokumentiert | docs/Architektur.md:878 | belegt, wörtlich: âL2 | plaetze ⊠" 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"
src/spiel/klassenraum-codec.js:297: â§ 3.3: nur die Fertigkeiten mit Injektor dĂŒrfen angeboten werden (24 von 27)."src/spiel/klassenraum.js:32: â⊠dort 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}.
| Messung | Ergebnis |
|---|---|
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Ă€ten | identisch â |
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.
| Name | Aufrufer in src/ (ohne Definition) |
|---|---|
erzeugen, ausCode, ergebnisCode, ergebnisEintragen, netzkennwert, platzSetzen, plaetze, plaetzeSetzen | src/ui/klassenraum.js (ĂŒber ruf("âŠ"), z. B. :93, :164, :187, :217, :295, :302, :356) |
exportieren, importieren | src/ui/klassenraum.js und src/ui/karriere.js |
tauglicheFertigkeiten, platz, tabellen, ausCode | zusÀtzlich src/spiel/klassenraum.js |
ergebnisLesen | src/spiel/klassenraum.js |
abnehmen | src/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:
- Mein erster Aufruferscan suchte nur
\.nameund meldete fĂŒrerzeugen,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. - Ein Aufrufer in einer Testdatei zĂ€hlt nicht. Ich habe
src/undtests/getrennt gezÀhlt; alle 16 haben mindestens einensrc/-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
plaetzeist dabei (Wert0= ânicht eingestellt", § L6) â die 14 dokumentierten plus die ErgĂ€nzung.- Kein Namensfeld:
Object.keys(...).filter(k => /name|schueler|azubi/i.test(k))ergibt[]â (DoD 11). - Die ErgĂ€nzung ist im Code begrĂŒndet (
src/spiel/klassenraum.js:34-35: âLeitungsentscheidung L6, bewusst gegen A § 7.1, das âgenau diese 14 Felder' sagt") und im Vertrag (docs/Architektur.md:878: â**plaetzekommt dazu ⊠Die Ampel der Lehrkraft braucht den Nenner"). Beides belegt.**
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ĂŒfung | Befehl | Ergebnis |
|---|---|---|
jede neue kl-Klasse hat eine CSS-Regel | python tools/klassen.py | 0 Klassen ohne CSS-Regel â |
| Zeitwerte nur 1/160/320 ms | python tools/ethos.py | GRĂN (29 CSS-Dateien, keine Regel schlechter als der Stand) â |
kein zweites toUpperCase im UI | Select-String src\ui\*.js | genau ein Treffer: src/ui/inspektor.js:393 â vorbestehend, nicht in src/ui/klassenraum.js â |
erwarte.wirftNicht existiert nicht | Suche in tests/*.js | 0 Treffer â |
| keine Zusicherung im Gruppenrumpf (Exit-2-Falle) | alle Testdateien in einem Bereich geladen, testsAusfuehren() nicht gerufen | kein LADEFEHLER â alle GruppenrĂŒmpfe laufen durch â · 661 TestfĂ€lle registriert |
| †6 bzw. †3 sichtbare Bedienelemente (R12) | nicht gemessen | steht unter § 12 |
| Escape schlieĂt jeden Dialog | nicht gemessen | steht unter § 12 |
10 · Der Abnahmebefehl â Dokument D irrt, die Zahl ist 67
| Behauptung (Dokument D) | Wie geprĂŒft | Ergebnis |
|---|---|---|
node tests/run.js --klassenraum â 40/40 | Testnamen 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 Fallzahl | dito | node tests/run.js klassenraum â 67 FĂ€lle (GroĂ-/Kleinschreibung egal, run.js vergleicht klein) |
| Gesamtumfang | dito | 661 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:
| Datei | git ls-files --eol | Urteil |
|---|---|---|
src/spiel/klassenraum.js | i/lf w/lf attr/text=auto eol=lf | LF â |
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) | untracked | alle LF, 0 CRLF â â Byte-ZĂ€hlung unten |
Byte-ZĂ€hlung der neuen Dateien (0 CRLF in jeder):
| Datei | Zeilen | Bytes |
|---|---|---|
src/spiel/klassenraum.js | 392 | 26 295 |
src/spiel/klassenraum-codec.js | 311 | 18 692 |
src/ui/klassenraum.js | 400 | 25 550 |
src/stil/klassenraum.css | 59 | 4 401 |
tests/klassenraum-codec.test.js | 352 | 26 792 |
tests/klassenraum.test.js | 285 | 20 326 |
tests/ui-klassenraum.test.js | 405 | 25 735 |
tests/klassenraum-abnahme.test.js | 331 | 23 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)
- Kein Browser, kein Bildschirmfoto, kein echtes Edge-Profil. Kein
python bauen.py, keintools/rauch.py, keinmenueprobe.py, keinseite-pruefen.py. Aussagen ĂŒber die sichtbare OberflĂ€che (Knöpfe, Dialoge, Escape, †6/†3 Bedienelemente) beruhen nicht auf meiner Messung. - Die Kachel âHeute" und der Ereignistakt fĂŒr einen Klassenraum-Auftrag (§ 6).
- Die 14 Dokumentfelder Name fĂŒr Name gegen A § 7.1 (§ 8).
- Der volle Testlauf nach dieser Runde â die 661/657-Zahl der Leitung habe ich ĂŒber die registrierten Namen bestĂ€tigt, nicht ĂŒber einen eigenen Vollschnitt.
- Die vier Testdateien der beiden laufenden Bausteine â
determinismusunduebergabe-uiwaren zum Messzeitpunkt noch nicht fertig gemeldet; ihre Zahlen sind nicht nachgezÀhlt. - Byte-Vergleich/Index-Arithmetik der neuen Dateien (§ 11).
13 · Befunde an den Lead (kurz)
| Nr. | Befund | Ort | Schwere |
|---|---|---|---|
| K1 | zwei lebende Kommentare sagen â24 von 27", gemessen sind es 27 | src/spiel/klassenraum-codec.js:297, src/spiel/klassenraum.js:32 | klein (Text), aber irrefĂŒhrend |
| K2 | Abnahmebefehl in Dokument D prĂŒft 0 FĂ€lle; richtig ist node tests/run.js klassenraum â 67 | Dokument D | mittel â âgrĂŒn ohne Wirkung" |
| â | Codec, Tabellen, Determinismus, E1, keine Bewertung, 16 Aufrufer, klassen.py, ethos.py, Testrahmen | â | bestĂ€tigt |