Netzwerk-Labor · Doku 🔬 Review – 2.0-Fundament (task-14, unabhĂ€ngige GegenprĂŒfung) Zum Spiel Online

🔬 Review – 2.0-Fundament (task-14, unabhĂ€ngige GegenprĂŒfung)

âŹ†ïž Netzwerk-Labor · Vertrag: Fahrplan – 1.3 und 2.0 · SITZUNGSABSCHLUSS

Auftrag. Nicht „sind die Tests grĂŒn?", sondern: Stimmt, was die anderen behaupten? Jeder Bericht eines Teammates ist eine BEHAUPTUNG. Verfahren: jede Zahl mit eigenem Befehl nachzĂ€hlen, jede Ursache mit eigenem Experiment belegen, jede Datei per Byte-Vergleich prĂŒfen — und ausdrĂŒcklich sagen, was nicht geprĂŒft wurde. GeĂ€ndert wird nichts: dieses Dokument ist mein einziges Schreibrecht.

Kernaussage in einem Satz. Die Nullmessung des Leads ist exakt bestĂ€tigt (471/479 grĂŒn, 8 rot, 55 Testdateien, 84 Module, 0 ĂŒbersprungen) · die 8 roten UI: Übergabe â€ș 
 waren ein Fehler der Attrappe, nicht des Produktivcodes (gemessen; inzwischen behoben, 8/8 in Isolation) · kein Zeilenenden-Bruch in dieser Sitzung (sieben VerdachtsfĂ€lle per Index-Arithmetik als vorbestehend entlastet) · die vorgeschriebene WĂ€chterprĂŒfung tools/pruefe-namen-flicken.js verschwieg im Trockenlauf genau die Datei, die nicht lĂ€dt (:86 — behoben, mit Verweis auf dieses Review) · eine Zusicherung außerhalb eines pruefe-Rumpfs gibt es in keiner der 66 Testdateien (24 statische Treffer, jeder von Hand gelesen: alles Helfer-Funktionen) · eine öffentliche Funktion ohne Aufrufer: Spiel.ergebnisKurz — und ein Zwischenstand mit 8 neuen roten Zeilen, von denen drei inhaltlich waren.

Was ich gemessen habe, in Zahlen (jede mit Befehl, siehe unten): 92 Minis mit 91 Denkhilfen, davon 91 von 91 wirklich ausgeliefert (kein stiller WĂ€chter-Tausch) · Hilfe-VorschlĂ€ge 44 statt 29, Ebene 2: 15 statt 0, 0 Fertigkeiten ohne Vorschlag statt 10 · Trainingskarten 0 gesperrt statt 3, alle drei Ende-zu-Ende wirksam · Hilfe-Vorrat 6/4/2/0 je Bildungsstand, Stufe am Ticket · Klassenraum +0 €/+0 Ruf statt +33/+1 (Kontrolle pruefung liefert exakt die +33/+1) · Determinismus: derselbe Code ⇒ derselbe def.id, und der Flow-Regler lebt im Postfach-Weg weiter · Fehlerdex 39 Fehlerarten, 7 Grundcodes ohne Injektor, keine fehlenden Pflichtfelder.

Stand der Messung: 09.10.2026, 15:13–15:40 · Arbeitsbaum nur gelesen · kein git add, kein Commit, kein Prozess beendet · HEAD unverĂ€ndert fe6d7c1. Dies ist der Zwischenstand. Phase 2 (voller Lauf nach Ende der Bauphase, Zahlen aller Teammates) folgt unten in § 10 — die Nummern dort bleiben offen, bis sie gemessen sind. „Nicht geprĂŒft" steht als „nicht geprĂŒft" da.


1 · Verfahren

SchrittBefehl / Ort
Voller Testlauf (ungesiebt)& "$env:LOCALAPPDATA\node-portable\node-v24.21.0-win-x64\node.exe" tests/run.js — ohne Filter, denn tests/run.js:60 zĂ€hlt die Bilanzzeile ĂŒber die gefilterte Liste
Einzelmessung ohne Datei zu schreibennode -e "<Programm>" mit eigenem Mini-Rahmen (Module wie tests/run.js:23-37 laden, harness.js, dann genau eine Testdatei) — die Testdatei wird im Speicher verĂ€ndert, nie auf der Platte
Zeilenendengit -c core.pager=cat ls-files --eol, git diff --numstat gegen --ignore-cr-at-eol, plus Byte-Vergleich Arbeitsbaum ↔ git show HEAD:<datei> (SITZUNGSABSCHLUSS Schritt 6)
Syntax aller JS-Dateiennode --check ĂŒber jede *.js in src/, tests/, tools/, fremd/ (206 Dateien)
Zahlen der Datenpaketeeigener vm-Bereich, DATEN.* und Spiel.training.liste() direkt ausgezÀhlt

Warum node -e und kein Skript im Projekt: mein Schreibrecht umfasst nur diese Datei. Ein PrĂŒfskript im Projektordner wĂ€re eine Änderung am Produkt.


2 · Die Nullmessung des Leads — nachgezĂ€hlt, nicht zitiert

Behauptung (Lead, ĂŒberall im Task-Board): „471/479 grĂŒn, 8 rot — die 8 roten heißen alle UI: Übergabe â€ș 
; 55 Testdateien, 84 Module."

Meine Messung (voller Lauf, kein Filter, 15:15–15:19):

471/479 grĂŒn, 8 ROT  (55 Testdateien, 84 Module)
davon 0 ĂŒbersprungen

Alle acht ✗-Zeilen beginnen mit UI: Übergabe â€ș.

Teil der BehauptungErgebnisBeleg
471/479 grĂŒn, 8 rotbestĂ€tigt, exaktBilanzzeile meines Laufs
die 8 roten sind alle UI: Übergabe â€ș 
bestĂ€tigtacht ✗-Zeilen im Lauf
55 Testdateien, 84 ModulebestÀtigtKlammer der Bilanzzeile
„davon N ĂŒbersprungen" (AGENTS.md-Regel)0 ĂŒbersprungenZeile unter der Bilanz (tests/harness.js:60-75 hĂ€ngt sie an)

Restzweifel. Mein Lauf traf den Stand vor src/spiel/ergebnis.js (angelegt 15:15:34) — deshalb 84 und nicht 85/87 Module. Er ist damit genau die Nullmessung des Leads, aber kein Stand nach der Bauphase. Die Testdateizahl 55 war zum Messzeitpunkt ebenfalls die des Leads.


3 · Die 8 roten UI: Übergabe â€ș 
 — Ursache gemessen, und sie liegt im Test

Behauptung (task-11): „die 8 roten FĂ€lle sind inhaltlich 
 die Attrappe ist unvollstĂ€ndig oder src/ui/uebergabe.js greift auf etwas zu, das sie nicht kennt."

3.1 Was der Lauf zeigt — und was er verschweigt

Der Lauf druckt als Fehler einen Code-Ausschnitt, keine Meldung:

✗ UI: Übergabe â€ș Der Einstellungs-Abschnitt „Rechner ĂŒbergeben" steht da, mit Knopf
    evalmachine.<anonymous>:3
    UI.app = {einstellungAbschnitt: (titel, fn) => { const c = h('div', 
); fn(c); globalThis.__abschnitte.push([titel, c]); }, 
};
                                                                                                                                 ^

Nebenbefund N1 (Testrahmen): tests/harness.js:41 kĂŒrzt den Fehler auf vier Stack-Zeilen (e.stack.split("\n").slice(0, 4)). Bei einem Fehler aus vm.runInContext sind diese vier Zeilen der Code-Ausschnitt — die Meldung selbst (TypeError: 
) fĂ€llt weg. Genau deshalb stand im Board eine Meldung („Cannot set properties of undefined"), die der Lauf so gar nicht ausgibt. Wer kĂŒnftig einen vm-Fehler sucht, findet die Ursache nur ĂŒber ein eigenes Experiment; drei Zeilen im Harness (e.name + ": " + e.message voranstellen) wĂŒrden das beheben.

3.2 Eigene Ursachenmessung (drei Proben, node -e)

ProbeAufbauMessergebnis
P1vm.createContext({}), dann globalThis.__abschnitte.push([1,2])TypeError: Cannot read properties of undefined (reading 'push')
P2Funktion im Außenbereich erzeugt, in den Bereich gelegt: location: {reload(){ globalThis.__reloads++; }}bereich.__reloads = 0, global.__reloads = NaN — der ZĂ€hler landet im erzeugenden Realm
P3Gegenprobe: __zaehler vorher verdrahtet (Object.assign(bereich, {__zaehler: 0}))bereich.__zaehler = 2 — das Muster selbst ist richtig

Befund B1 (belegt): In tests/ui-uebergabe.test.js (Fassung 15:16, 220 Z.) verdrahtete Object.assign(bereich, {__reloads: 0}) nur __reloads. Die Attrappe schreibt aber nach globalThis.__abschnitte / __uebergaben / __toasts / __exporte, wĂ€hrend der Test die Ă€ußeren Felder abschnitte, uebergaben, toasts, exporte liest. uebStand() warf beim ersten Start-Haken — vor jeder Zusicherung. Das ist ein Fehler der Attrappe, nicht des Produktivcodes.

3.3 Gegenversuch: Attrappe im Speicher repariert — es bleiben drei Fehler

Ich habe nur die Verdrahtung im Speicher nachgezogen (Datei unverÀndert) und erneut gemessen:

FallErgebnis nach der Reparatur
Abschnitt steht da, mit KnopfOK
Klick öffnet den DialogOK
genau EIN DialogOK
„Behalten" ĂŒbergibt und lĂ€dt neuROT die Seite lĂ€dt neu: ist 0 – soll 1
„Löschen" ĂŒbergibt und lĂ€dt neuROT die Seite lĂ€dt neu: ist 0 – soll 1
Abbrechen ĂŒbergibt nichtOK
„Erst sichern" schreibt eine DateiROT TypeError: Cannot read properties of null (reading 'euro')
Fehlschlag lÀdt nicht neu, meldet den GrundOK

Befund B2: Die beiden „lĂ€dt neu"-FĂ€lle scheiterten an P2 — location.reload zĂ€hlte in den erzeugenden Realm. Befund B3: „Erst sichern" scheiterte, weil uebKapsel Spiel._trocken = true setzt, Spiel.speichern() bei src/spiel/zustand.js:170 sofort zurĂŒckkehrt und der Speicher deshalb kein labor hat; die Zusicherung inhalt.speicher.labor.euro === 42 ist in dieser Kapsel nicht einlösbar. Der Exportweg selbst ist dabei regelkonform: src/ui/uebergabe.js:28-31 ist Zeichen fĂŒr Zeichen derselbe Weg wie src/ui/karriere.js:442-445 (store.sofort(), dann store.alles()).

Ergebnis: „Die 8 grĂŒn machen" war nicht mit einer Reparatur an einer Stelle getan. Das war der wertvollste Teil dieser PrĂŒfung — und der Grund, warum ich die Attrappe nicht als „kleine UnvollstĂ€ndigkeit" durchgehen lasse.

3.4 Was der EigentĂŒmer daraus gemacht hat (nachgemessen)

tests/ui-uebergabe.test.js wurde um 15:16:22 geĂ€ndert. Die neue Fassung (235 Z., SHA256 F125293B629A3FD7
) verdrahtet alle vier Felder (:101), zĂ€hlt neuladungen ĂŒber eine Verschlussvariable statt ĂŒber globalThis (:73, :92 — mit genau dieser BegrĂŒndung im Kommentar) und legt store.set("labor", Spiel.st) vor die Export-Zusicherung (:211).

Meine Messung der neuen Fassung (Einzellauf im eigenen Bereich, 87 Module): 8/8 grĂŒn, 0 ĂŒbersprungen.

Restzweifel. Das ist ein Einzellauf dieser einen Datei, kein voller Lauf; die Zahl im Gesamtlauf steht in Phase 2 (§ 10). Und: dass drei Fehler in einer Testdatei steckten, sagt nichts ĂŒber src/ui/uebergabe.js selbst — dessen Wirkung im echten Browser habe ich nicht gemessen (§ 8).


4 · PrĂŒfauftrag des Leads: Zusicherungen außerhalb eines pruefe-Rumpfs

Auftrag (Lead, 15:30). tests/klassenraum-hilfevorrat.test.js:66 hatte eine Zusicherung direkt im Gruppenrumpf; sie schlug durch bis vm.runInContext, tests/run.js:58 meldete LADEFEHLER und beendete den ganzen Lauf mit Exit 2. Gesucht: jede weitere solche Stelle.

4.1 Der gemeldete Ort ist inzwischen sauber

tests/klassenraum-hilfevorrat.test.js hat jetzt 131 Zeilen; jede Zusicherung steht in pruefe(
, kapsel(() => {
})). Der Kopfkommentar :20-22 warnt inzwischen selbst: „ein sofort ausgefĂŒhrter Rumpf brĂ€chte den ganzen Lauf mit LADEFEHLER (exit 2) zum Stehen."

4.2 Statischer Scan ĂŒber alle 65 Testdateien

Eigener Tokenizer (Zeichenketten, Vorlagen, Zeilen- und Blockkommentare werden zu Leerzeichen), dann Klammerstapel: eine Zusicherung gilt als „außerhalb", wenn beim Auftreffen von erwarte. kein offener pruefe(-Aufruf im Stapel liegt.

Geprueft: 65 Testdateien, 2352 erwarte.*-Aufrufe im Quelltext
AUSSERHALB eines pruefe-Rumpfs: 24

Jeden der 24 Treffer habe ich von Hand im Kontext gelesen. Alle 24 stehen in Helfer-Funktionen, die nur aus pruefe-RĂŒmpfen gerufen werden — zum Beispiel:

Datei:ZeileUmgebungUrteil
sim-gruende.test.js:7const grund = (r, soll) => { erwarte.falsch(
); erwarte.gleich(
); };Helfer, kein Laufzeitpfad beim Laden
sim-dhcp-gruende.test.js:17const nurDieser = (tr, code, hinweis) => erwarte.gleich(
)Helfer
klassenraum-determinismus.test.js:59-60const alleGleich = (liste, was) => {
}Helfer
spiel-training.test.js:40,45,47const id = (
) => {
} / function durchgang(
){
}Helfer
spiel-einstieg-stufe.test.js:400-412innerhalb pruefe(
, kapsel(() => mitWelt(welt => { 
 })))liegt im pruefe-Rumpf; mein Stapel hat die Klammer wegen eines Regex-Literals verloren
spiel-mini-hilfe.test.js:308innerhalb oberflaecheKapsel = fn => () => {
}Helfer (wird aus pruefe gerufen)

Ergebnis (statisch): keine Zusicherung, die beim AusfĂŒhren eines Gruppenrumpfs ungeschĂŒtzt lĂ€uft. EinschrĂ€nkung, ehrlich: mein Scanner ist eine Heuristik — Regex-Literale mit AnfĂŒhrungszeichen können den Klammerstapel verschieben (genau das passiert bei spiel-einstieg-stufe.test.js). Deshalb die HandprĂŒfung jedes Treffers; ein sauberes Ergebnis ist damit belegt, ein „Scanner findet nichts" allein wĂ€re es nicht.

4.3 Dynamischer Scan — die belastbare Gegenprobe

Ich habe jede Testdatei einzeln in einen frischen Bereich geladen: dieselben 87 Module wie tests/run.js, dazu tests/harness.js und genau eine Testdatei — und testsAusfuehren() absichtlich nicht gerufen. Damit laufen alle GruppenrĂŒmpfe (und nur die), also genau der Pfad, der den LADEFEHLER auslöst.

Geprueft: 65 Testdateien  |  Dateien mit LADEFEHLER beim Laden: 1
  LADEFEHLER  hilfe-ebene2.test.js

Befund B4 (hart, mit Zeitfenster): tests/hilfe-ebene2.test.js war beim Anlegen nicht ladbar:

tests/hilfe-ebene2.test.js:174
  for (const v of e1) erwarte.gleich(v.art, "pruefen", v.id + ": Ebene 1 („ansehen") muss prĂŒfen");
SyntaxError: Unexpected identifier 'muss'          (node --check, Exit 1)

Das ASCII-" nach „ansehen schließt den String; muss ist dann ein Bezeichner. Gemessen im Fenster 15:20:16 (Anlage) bis 15:21:03 — in diesem Fenster hĂ€tte tests/run.js mit Exit 2 abgebrochen, also derselbe Totalausfall wie der gemeldete Fall, nur mit anderer Ursache. Der EigentĂŒmer hat die Datei um 15:21:03 selbst behoben; node --check liefert jetzt Exit 0. Der Fehler steht hier, weil er gemessen ist — nicht als Vorwurf, sondern als Beleg fĂŒr die Fehlerklasse.

Gesamturteil zum PrĂŒfauftrag: In der aktuellen Fassung gibt es weder eine ungeschĂŒtzte Zusicherung noch eine nicht ladbare Testdatei (65 von 65 laden, Stand 15:35).

4.4 Werkzeugbefund: die WĂ€chterprĂŒfung verschweigt den Fall, fĂŒr den es sie gibt

Behauptung (AGENTS.md, Befehlstabelle): node tools/pruefe-namen-flicken.js „findet pruefe("
„
"
"), das den Lauf mit LADEFEHLER (Exit 2) anhĂ€lt — trockener Lauf zuerst".

Messung im selben Befehlsblock, in dem node --check tests/hilfe-ebene2.test.js mit Exit 1 scheiterte:

wĂŒrde flicken tests\hilfe-ebene2.test.js: 2 pruefe()-Name(n)


65 Datei(en) geprĂŒft, 0 geschrieben, 0 laden nicht.
Exit: 0

Das Werkzeug meldet „0 laden nicht", wĂ€hrend dieselbe Datei nicht ladbar ist.

Ursache (Zitat, tools/pruefe-namen-flicken.js:86):

if (setzen || !anzahl) {
  const fehler = ladbar(datei);
  if (fehler !== true) { kaputt.push(rel + " — " + fehler); 
 }
}

Im Trockenlauf (setzen === false) wird die LadbarkeitsprĂŒfung fĂŒr jede Datei ĂŒbersprungen, die geflickt werden mĂŒsste (anzahl > 0) — also fĂŒr genau die verdĂ€chtigen. Der Trockenlauf ist aber der Lauf, den AGENTS.md vorschreibt.

Vorschlag (nicht von mir ausgefĂŒhrt, weil fremde Datei): die Bedingung auf if (setzen || true) bzw. schlicht const fehler = ladbar(datei); verkĂŒrzen — die PrĂŒfung kostet Millisekunden und ist der einzige Grund, warum es das Werkzeug gibt.

Restzweifel. Ich habe den Werkzeugbefund an einer Datei in einem Zeitfenster gemessen. Dass die Bedingung generell so wirkt, ist Quelltext-Zitat (:86), nicht Stichprobe ĂŒber viele Dateien.

Nachtrag 15:26 — der Befund ist behoben. tools/pruefe-namen-flicken.js ist im Arbeitsbaum geĂ€ndert; die Bedingung lautet jetzt unbedingt (Diff zitiert):

-    if (setzen || !anzahl) {
+    /* Die Ladbarkeit wird IMMER geprĂŒft. 
 (gemessen am 09.10.2026 von der GegenprĂŒfung,
+       Beleg im Review – 2.0-Fundament.md) */
+    {
       const fehler = ladbar(datei);

Meine Nachmessung: node tools/pruefe-namen-flicken.js → „66 Datei(en) geprĂŒft, 0 geschrieben, 0 laden nicht", Exit 0. Die Zahl der geprĂŒften Dateien ist von 65 auf 66 gestiegen (neue Testdatei), die PrĂŒfung lĂ€uft jetzt fĂŒr jede Datei — Beleg im Quelltext (:92, aus der Bedingung herausgezogen). Restzweifel: dass die Korrektur auch eine kaputte Datei meldet, konnte ich nicht vorfĂŒhren — dafĂŒr mĂŒsste ich eine nicht ladbare Testdatei anlegen, und Testdateien liegen außerhalb meines Schreibrechts. Belegt ist die geĂ€nderte Bedingung und der fehlerfreie Trockenlauf, nicht der scharfe Gegenfall.


5 · Zeilenenden — der Byte-Vergleich, und eine Entlastung

Regel (AGENTS.md / SITZUNGSABSCHLUSS Schritt 6). Ein Editor, der normalisiert, dreht die ganze Datei um; git diff --numstat und --ignore-cr-at-eol können dabei identisch aussehen. VerlÀsslich ist der Byte-Vergleich.

Erste Messung (Alarm): src/ui/spiel.js — Arbeitsbaum CRLF=876, LF=0, HEAD CRLF=0, LF=866. Und die Falle aus der Doku ist echt: git diff --numstat und --ignore-cr-at-eol zeigen beide 10 0, git diff --stat beide 10 insertions. Der Diff sieht also harmlos aus, obwohl der ganze Dateiinhalt umgestellt ist. Dazu passt git ls-files --eol:

i/lf  w/crlf  attr/text=auto eol=lf   src/ui/spiel.js

und Git warnt von selbst: „in the working copy of 'src/ui/spiel.js', CRLF will be replaced by LF the next time Git touches it".

Gegenmessung — und sie entlastet die Sitzung. Ein Zeilenendenwechsel in dieser Sitzung hĂ€tte bedeutet: die Datei war vorher LF. Die Index-Statistik sagt das Gegenteil:

GrĂ¶ĂŸeWertRechnung
HEAD-Blob f992bae
67 546 B (866 LF-Zeilen)git cat-file -s HEAD:src/ui/spiel.js
Index-Statistik (Arbeitsbaum beim letzten Git-Zugriff)68 412 Bgit ls-files --debug src/ui/spiel.js
Differenz866 Bgenau 1 Byte je Zeile → der Arbeitsbaum war schon damals CRLF

Befund B5: Die CRLF von src/ui/spiel.js sind vorbestehend. Die 10 in dieser Sitzung angehĂ€ngten Zeilen wurden in CRLF angehĂ€ngt — also im Sinne der Datei, nicht gegen sie. Nach AGENTS.md ist das die richtige Behandlung (Zeilenenden bewahren), auch wenn sie der Deklaration in .gitattributes (* text=auto eol=lf) widerspricht.

Repo-weiter Zustand (gemessen): 51 von 423 verfolgten Dateien sind w/crlf, 372 w/lf, 0 w/mixed. In src/ allein: 38 CRLF, 105 LF. Es ist also kein Einzelfall dieser Sitzung, sondern gewachsener Bestand.

DateiArbeitsbaumHEADUrteil
src/ui/spiel.jsCRLF=876, LF=0CRLF=0, LF=866vorbestehend (Index-Statistik), Inhalt +10 Zeilen
src/daten/wiki.jsCRLF=0, LF=603CRLF=0, LF=586LF bewahrt
docs/INHALT.mdCRLF=0, LF=102CRLF=0, LF=85LF bewahrt
src/spiel/ergebnis.js, src/spiel/uebergabe.js, src/ui/uebergabe.js, src/stil/uebergabe.css, tests/spiel-ergebnis.test.js, tests/spiel-uebergabe.test.js, tests/ui-uebergabe.test.js, tests/klassenraum-determinismus.test.js, tests/lernmotor-wache.test.js, docs/entwicklung/Übergabe – Stand 2.0-Fundament.mdalle LF, 0 CRLF(untracked)LF, wie gefordert

Restzweifel. FĂŒr untracked Dateien gibt es keinen HEAD-Vergleich; ich kann nur die jetzige Verteilung belegen (alles LF). Und fĂŒr src/ui/spiel.js ist die Index-Statistik ein Indizienbeweis, kein Beweis aus einem zweiten Arbeitsbaum: sie zeigt den Zustand beim letzten Git-Zugriff, nicht lĂŒckenlos jeden Zeitpunkt davor. Kein anderes Argument in dieser Sitzung spricht dafĂŒr, dass jemand die Datei in dieser Sitzung umgestellt hat — der Inhalt ist um genau die 10 neuen Zeilen gewachsen.


6 · „Wirkung vor GrĂŒn" — was ich bisher messen konnte

Die Regel: ein Baustein zĂ€hlt erst, wenn er im echten Weg vorkommt. Das belegte Gegenbeispiel des Projekts ist der DHCP-Pool-Modus, der jahrelang wirkungslos war, weil der Test nur den Prompt prĂŒfte.

6.1 Eingebunden ist alles (Bau-Reihenfolge, nicht Wirkung)

bauen.py:60 (d.glob("*.js") je Schicht) und bauen.py:124 (d.glob("*.css") in src/stil) nehmen neue Dateien automatisch mit. python bauen.py --liste nennt spiel/uebergabe.js, spiel/ergebnis.js und ui/uebergabe.js. Aber: „steht im Bau" ist nicht „wird aufgerufen" — der DHCP-Fall war auch gebaut.

6.2 Übergabe: der echte Weg ist belegt, die Wirkung im Browser nicht

KettengliedBelegUrteil
Start-Haken wird ausgefĂŒhrtsrc/ui/start.js:49 for (const fn of UI.startHaken \|\| [])Aufruf vorhanden
Abschnitt wird angemeldetsrc/ui/app.js:272-275 einstellungAbschnittvorhanden
Abschnitt wird gezeichnetsrc/ui/app.js:346 for (const a of [...eigeneAbschnitte(), ...abschnitte]) → a.fn(c)vorhanden
Knopf → Dialog → Logiksrc/ui/uebergabe.js:74 Knopf, :35 Spiel.uebergabe(...), :42 location.reload()Aufrufkette vorhanden
nur EIN Aufrufer der Kernlogikgrep Spiel.uebergabe in src/: nur src/ui/uebergabe.js:35 (+ Testdateien)kein zweiter Weg, kein toter Aufruf

Nicht gemessen: dass der Knopf im echten Browser sichtbar ist und der Dialog dort öffnet. DafĂŒr brĂ€uchte es python bauen.py + tools/rauch.py (echter Edge) — beides gehört dem Lead und schreibt Erzeugnisse. Nicht geprĂŒft.

6.3 Spiel.ergebnisText wirkt, Spiel.ergebnisKurz hat (noch) keinen Aufrufer

NameAufrufer in src/Urteil
Spiel.ergebnisTextsrc/ui/spiel.js:453 (Knopf „Ergebnis kopieren", :535)Wirkung belegt (Aufrufkette: Abschlussfenster → Knopf → UI.kopieren)
Spiel.ergebnisKurzkeiner — nur tests/spiel-ergebnis.test.jsBefund B6: grĂŒn, aber ohne Wirkung
Spiel.ergebnis.lage, .sterneText, .zahl, .dauer, .zeitpunkt, .kundeName, .thema, .niveau, .ziele, .ergebnisTeilindirekt ĂŒber ergebnisTexterreicht

Befund B6 (Wirkung vor GrĂŒn): Spiel.ergebnisKurz ist eine öffentliche Funktion der zugesagten Schnittstelle, hat aber null Aufrufer im Programm. Nach der Projektregel gilt sie damit als nicht fertig. Ob das ein Fehler des Teammates ist, hĂ€ngt an der Schnittstellenzusage des Leads (task-1 Punkt 2 nennt beide Funktionen) — die Entscheidung liegt beim Lead, nicht bei mir. Mein Befund ist die Zahl: 0 Aufrufer.

6.4 Klassenraum: der Schaden ist behoben — und der Fahrplan-Wert exakt reproduziert

Eigener Lauf im echten Fluss (Spiel.instanzErstellen → Spiel.oeffnen → Lösung → Spiel.abnahme → Spiel.abschliessen), Ticket salon-01, Niveau AP2, je Quelle ein frischer Stand:

quellebestandenΔ EuroΔ RufΔ st.erledigterg.euro/rufEintrag mit welcher Quelle
pruefung (Kontrolle)ja+33+1+133 / 1pruefung
trainingja0000 / 0—
klassenraumja0000 / 0—
raetselja+30+1+130 / 1raetsel

Ergebnis: Die Zahl +33 € / +1 Ruf des Fahrplans ist auf dem ungefilterten Pfad exakt reproduziert (Kontrollzeile pruefung) — und der Klassenraum-Auftrag zahlt in der jetzigen Fassung nichts: Spiel.klassenraum existiert (typeof = object), die Umleitung greift. Den Vorher-Zustand konnte ich nicht messen — als ich messen konnte, war die Behebung schon eingebaut. Die Fahrplan-Zahl ist damit plausibel und konsistent, aber von mir nicht als Vorher-Messung wiederholt.

Nicht gemessen: die Teilbehauptungen „Wochenziel erfĂŒllt" und „Kundenampel grĂŒn" — im frischen Stand ist st.woche === null und es gibt keinen Vertragskunden. Nicht geprĂŒft.


6.5 Denkhilfen: 91 von 91 kommen wirklich beim Spieler an (Wirkung, nicht Prompt)

Das ist die schĂ€rfste PrĂŒfung dieses Bausteins — denn src/spiel/mini.js:182-193 (miniOhneLoesung) ersetzt einen Text still durch den Fertigkeitssatz, wenn er die Lösung verrĂ€t oder eine Option wörtlich nennt. Ein grĂŒner Daten-Test wĂŒrde das nicht merken. Ich habe deshalb ĂŒber die echte API gemessen: je Mini Spiel.mini.hilfe(id, {nurSehen:true}) aufrufen und den zurĂŒckgegebenen Text mit dem Eintrag vergleichen.

Messung (Stufe azubi, SPROSSEN = {azubi:2, azubi-plus:1, geselle:1, meister:0})Ergebnis
Minis92
EintrÀge in DATEN.miniDenkhilfen91
davon Sprosse 1: Text identisch mit eintrag.denkhilfe, art === "denkhilfe"91
Sprosse 1 still ersetzt oder anders0
Sprosse 1 liefert gar nichts0
EintrÀge mit eigenem ausschnitt, Sprosse 2 identisch, art === "ausschnitt"68 von 68
ohne Eintrag1 (mini-link-2, der reservierte)

Ergebnis: Kein Text fĂ€llt durch den WĂ€chter. Das ist die Aussage, die ein reiner Daten-Test nicht liefern kann. Restzweifel: gemessen auf einer Stufe (azubi) und mit nurSehen — ob die OberflĂ€che den Text danach auch anzeigt, ist damit nicht belegt (kein Browser, § 9).

6.6 Hilfe-Vorrat: der Vorrat folgt dem Bildungsstand, nicht dem stillen Standard

Eigener Lauf, je Bildungsstand ein frischer Klassenraum-Auftrag (salon-01, ohneFlow:true):

BildungsstandSpiel.stufe.konto() (ohne Instanz)hilfenFrei()Stufe am Ticketkonto(inst)
(keine gesetzt → RĂŒckfall){frei:6, gesamt:6}6azubi{frei:6, gesamt:6}
azubi{frei:6, gesamt:6}6azubi{frei:6, gesamt:6}
azubi-plus{frei:4, gesamt:4}4azubi-plus{frei:4, gesamt:4}
geselle{frei:2, gesamt:2}2geselle{frei:2, gesamt:2}
meister{frei:0, gesamt:0}0meister{frei:0, gesamt:0}

Ergebnis: 6/4/2/0 wie in der Zusage, und der Bildungsstand steht ausdrĂŒcklich am Ticket (inst.stufe) — der stille RĂŒckfall auf EINST_STANDARD ist weg. Nicht gemessen: der Gegenfall „EINST_STANDARD auf meister, Mensch auf azubi" — den prĂŒft die Testdatei des EigentĂŒmers (tests/klassenraum-hilfevorrat.test.js:104-118, zitiert, nicht von mir nachgerechnet).

6.7 Die drei gesperrten Trainingskarten: alle drei wirken jetzt (Ende-zu-Ende gemessen)

Nicht „liste() sagt offen", sondern der ganze Weg: starten → Startzustand verletzt → Lösung → Abnahme → training.abnehmen. Je Karte ein frischer Stand.

Kartestarten.okdef.idZieleverletzt vorherverletzt nachherAbnahmeSterneΔ EuroΔ Ruf
tr-portsec-dosejagen-lab.portsec-1374736676220bestanden500
tr-stp-schleifejagen-lab.stp-823619411110bestanden4,500
tr-storage-nas-sanjagen-lab.storage-1998957893110bestanden500
tr-link-kabel (Kontrolle, war nie gesperrt)jagen-lab.link-413487848330bestanden500

Ergebnis: Der Fehler wirkt (Ziel verletzt vor der Lösung), die Lösung heilt (0 verletzt nach der Lösung), die Abnahme besteht, und das Training zahlt weiterhin 0 € / 0 Ruf. Die Kontrollzeile zeigt, dass mein PrĂŒfstand ĂŒberhaupt unterscheiden kann.

Wichtige EinschrĂ€nkung: Die board-eigene Warnung zu lab.stp lautete, ein zweites Kabel erzeuge keinen Sturm und ticketBauen verwerfe einen Injektor, der nichts bricht. starten.ok = true und „Ziel verletzt" belegen, dass irgendein wirkender Fall gebaut wird — nicht, dass es ein Broadcast-Sturm ist (Grundcode STORM). Ob der STP-Injektor den behaupteten Mechanismus hat, prĂŒfe ich am Bericht des EigentĂŒmers nach (Phase 2). Bisher nicht geprĂŒft: der Grundcode der erzeugten FĂ€lle.

6.8 Determinismus: der Klassenraum ist fest — und der Flow-Regler lebt weiter

Gemessen mit Kontrolle (sonst wĂ€re „alles gleich" auch als „mein Schalter tut nichts" deutbar):

quelleFlow-Stand gelesendef.idZiele
postfachnormalgen-lab.vlan-52
postfachgeruestgen-lab.vlan-5-geruest1
postfachverwicklunggen-lab.vlan-5-verwicklung3
klassenraumnormal / geruest / verwicklunggen-lab.vlan-5 (dreimal gleich)2 / 2 / 2
pruefungnormal / geruest / verwicklunggen-lab.vlan-5 (dreimal gleich)2 / 2 / 2

Spiel.flow.stand("lab.vlan") gab in jedem Durchgang genau den gesetzten Wert zurĂŒck — der Schalter wirkt also, das Ergebnis ist nicht „Rauschen". Ursache im Quelltext, src/spiel/postfach.js:

const ohneRegler = o.quelle === "pruefung" || o.quelle === "raetsel" || o.quelle === "klassenraum";
const flow = Spiel.flow && !o.ohneFlow && !ohneRegler ? Spiel.flow.fuer(def) : null;

Ergebnis: Die Zusage „derselbe Code + derselbe Seed ⇒ derselbe Auftrag" ist fĂŒr den Klassenraum belegt, und die naheliegende Abhilfe „Flow einfach abschalten" wurde nicht gewĂ€hlt: im normalen Postfach-Weg adaptiert der Regler weiter (1 / 2 / 3 Ziele). Das ist der Unterschied zwischen „Test grĂŒn" und „Feature heil".

Nebenbefund N3 (zwei Listen, gemessen): src/spiel/flow.js:nachAbschluss nimmt nur pruefung und raetsel aus — nicht klassenraum. Ein Klassenraum-Auftrag schreibt also weiter in den Flow-Stand seines GerĂ€ts, obwohl er ihn nicht mehr liest. Ob das gewollt ist (der Flow ist die Lern-Geschichte des GerĂ€ts), entscheidet der Lead — ich melde nur, dass zwei Stellen zwei verschiedene Ausnahmelisten fĂŒhren.

6.9 Was weiterhin ohne Aufrufer dasteht

NameAufrufer in src/Urteil
Spiel.ergebnisKurzkeinerBefund B6 (§ 6.3)
Spiel.uebergabeLetztesrc/ui/uebergabe.js:46erreicht
Spiel.klassenraum.abnehmensrc/spiel/abnahme.js (Umleitung)erreicht — Wirkung in § 6.4 gemessen
Spiel.ergebnis.lage/.sterneText/.zahl/.dauer/.zeitpunkt/.kundeName/.thema/.niveau/.ziele/.ergebnisTeilĂŒber ergebnisTexterreicht

7 · Die Vorher-Zahlen des Task-Boards — selbst ausgezĂ€hlt

Alle Zahlen aus einem eigenen vm-Bereich (87 Module, Stand 15:35), nicht aus Berichten ĂŒbernommen.

Behauptung im BoardMeine MessungUrteil
„67 von 92 Mini-Tickets ohne eigenen Denkanstoß" (Vorher)92 Minis, 91 EintrĂ€ge in DATEN.miniDenkhilfen, 1 ohne: mini-link-2bestĂ€tigt als Vorher (25 + 66 = 91; vorher 92−67 = 25 ✓). Der verbliebene eine ist der absichtlich reservierte (tests/spiel-mini-denktexte.test.js)
keine verwaisten Denkhilfen0 EintrÀge ohne zugehöriges Minisauber
„Ebene 2 existiert 0×"DATEN.hilfen.VORSCHLAEGE: 29 gesamt, Ebene 1 = 22, Ebene 2 = 0, sonst/ohne ebene = 7bestĂ€tigt (Stand 15:35 noch 0 — task-8 lief noch)
„10 Fertigkeiten ohne einen einzigen Vorschlag"27 Fertigkeiten, 17 mit Vorschlag, 10 ohne: lab.netz, lab.arp, lab.subnetz, lab.dhcp, lab.tcp, lab.rostick, lab.portfwd, lab.portsec, lab.stp, lab.storagebestĂ€tigt, exakt
Vertrag § 13.2: bereich immer eine Spiel.LEITER-idLeiter-ids link, vlan, ip, gateway, route, dienst; 0 VorschlĂ€ge außerhalbeingehalten
art ∈ {pruefen,aendern}genau diese zweieingehalten
„drei gesperrte Trainingskarten lab.portsec, lab.stp, lab.storage"Vorher (15:19): 34 Szenarien, 31 offen, 3 gesperrt = tr-portsec-dose, tr-stp-schleife, tr-storage-nas-san. Nachher (15:29): dieselben drei offen:true und startbar (§ 6.7)bestĂ€tigt, exakt drei — und inzwischen behoben

Nebenbefund N2 (Board-Text vs. Datei): task-1 sagt „tests/spiel-uebergabe.test.js (8 FĂ€lle, grĂŒn)". Gemessen: 10 pruefe-FĂ€lle, alle zehn im vollen Lauf grĂŒn. Eine Nebenangabe, kein Sachfehler — die Datei ist seither gewachsen.


8 · Verbote und Randbedingungen (gemessen)

FrageMessungUrteil
Wurde in dieser Sitzung committet?git log -1 → fe6d7c1 
 2026-10-09T15:00:57 (vor Sitzungsbeginn dieser Runde), git reflog zeigt nur Vorarbeitenkein Commit in dieser Sitzung
Wurde etwas außerhalb des Projektordners geĂ€ndert?../FISI-Spielhalle/src/lernmotor.js: LastWriteTime 29.09.2026 15:57, 4221 BunberĂŒhrt
Prozess-Beendigung im Baum?Suche nach Stop-Process\|taskkill\|kill -9\|pkill\|TerminateProcess in *.js,*.py,*.ps1,*.cmd,*.sh (ohne Erzeugnisse) → ein Treffer: tools/cdp.py:355vorbestehendes Werkzeug, beendet eine selbst gestartete PID — laut AGENTS.md Regel 1 ausdrĂŒcklich erlaubt. Kein Verstoß belegt
Testlauf-Ergebnis unabhĂ€ngig nachgefahrenpython tools/klassen.py → 0 Klassen ohne CSS-Regel (die neuen .uz-*-Klassen sind abgedeckt)grĂŒn
python tools/ethos.py → GRUEN: keine Regel schlechter als tests/stil-stand.json, R4 = 539grĂŒn; die 539 deckt sich mit dem Kommentar in src/stil/uebergabe.css, der von „R4 539 → 542" im ersten Entwurf spricht
node tools/sim-stand.js → 12/12 „unverĂ€ndert", „Simulation unverĂ€ndert gegenĂŒber dem Referenzstand"grĂŒn
Syntax aller Quellennode --check ĂŒber 206 Dateien: 2 nicht ladbar — tests/hilfe-ebene2.test.js (inzwischen behoben, § 4.3) und tools/klassenraum-probe/B-workflow.js (await is only valid in async functions 
)B-workflow.js ist ein Probe-Werkzeug und in AGENTS.md nicht als Befehl gefĂŒhrt; ob es als ESM gedacht ist, habe ich nicht geprĂŒft

9 · Was ich nicht geprĂŒft habe (ehrlich)


10 · Zwischen- und Endmessungen der Bauphase

(Dieser Abschnitt wĂ€chst mit. Jede Zeile nennt den Messzeitpunkt, weil der Baum wĂ€hrend der Bauphase wandert — ein Zwischenstand ist kein Endstand.)

10.1 Voller Lauf 15:25 — 562/570 grĂŒn, 8 ROT (66 Testdateien, 90 Module, 0 ĂŒbersprungen)

Kein LADEFEHLER. Die ursprĂŒnglichen acht UI: Übergabe â€ș 
 sind verschwunden; dafĂŒr standen acht neue rote Zeilen im Lauf. Ich habe sie dem Umstand zugeschrieben, dass die Bauphase lief — und das war richtig, aber nicht bei allen:

#roter Fall (wörtlich)Fehlermeine Einordnung
1–2Doku: 
 â€ș Jede erzeugte Seite hat <h1>, 
 · 
 â€ș Die Uebersicht nennt alle Dokumente 
39 Dokumente + Uebersicht: ist 37 – soll 40 · 39 Karten — eine je Dokument: ist 36 – soll 39Bauartefakt: tests/doku-seite.test.js:114 zĂ€hlt die Quelle, vergleicht mit dem Erzeugnis docs/doku/ — das war noch nicht neu gebaut. Erwartung: nach dem Endbau grĂŒn. Bleibt zu prĂŒfen.
3–5Spiel: Bogen (S2) â€ș Fehlerdex 
 (drei FĂ€lle)ist 39 – soll 36Zwischenstand: die drei neuen Fehlerarten heben den Dex 36 → 39. Der EigentĂŒmer hat tests/spiel-bogen.test.js inzwischen auf 36 + DEX_NEU.length umgestellt (:41, :43, :49, :63, :71).
6Injektoren: neu â€ș portsec-fremde-mac 
ist "TIMEOUT" – soll "PORTSEC_VIOLATION"inhaltlich: der neue Injektor bricht den Ping nicht wie zugesagt
7Injektoren: neu â€ș stp-doppelkabel: der Lauf bricht wirklich mit STORM ab 
nach dem Ziehen der zweiten Leitung trĂ€gt das Netz wiederinhaltlich (der EigentĂŒmer prĂŒft genau das, was ich in § 6.7 offenlassen musste)
8Spiel: Netzplan â€ș alle generierten Tickets (Injektor × Vorlage) 
ist ["stp-doppelkabel/standorte: Abweichungen sw1,sw2 ≠ Lösung "] – soll []inhaltlich: mindestens in der Vorlage standorte heilt die Lösung die Abweichung nicht

Wert fĂŒr die Abnahme: Punkt 8 ist der Fall, der sonst durchrutscht — eine Karte, die startet und „irgendwie" rot wird, aber dessen Lösung das Netz nicht heilt. Die Punkte 6–8 sind keine Bauartefakte und mĂŒssen vor dem Endlauf grĂŒn sein (oder ehrlich als Befund dastehen).

10.2 Die Datenzahlen nach der Bauphase (15:28, 90 Module)

GrĂ¶ĂŸeNullmessung/VorherJetzt gemessenUrteil
Module (headless)8490gewachsen
Mini-Tickets9292unverÀndert
Denkhilfen-EintrĂ€ge25 („67 fehlten")9166 LĂŒcken gefĂŒllt, 1 absichtlich frei (mini-link-2)
Hilfe-VorschlÀge gesamt2944+15
davon Ebene 2015„Ebene 2 existiert nicht mehr 0×" — belegt
Fertigkeiten ohne Vorschlag100 (skillsOhne: [])belegt; die 10 Namen aus § 7 sind alle abgedeckt
bereich-Werte der VorschlĂ€ge—dienst, gateway, ip, link, route, vlangenau die Spiel.LEITER-ids, kein Fremdwert
Trainingskarten gesperrt30 (gesperrt: [])belegt (§ 6.7)

10.3 Zeilenenden — kein Bruch in dieser Sitzung (15:27)

Der Byte-Vergleich zeigt fĂŒr sieben geĂ€nderte Dateien „Arbeitsbaum CRLF, HEAD LF":

src/spiel/abnahme.js · src/spiel/dex.js · src/spiel/flow.js · src/spiel/postfach.js · src/ui/netzplan.js · src/ui/spiel.js · tests/spiel-bogen.test.js

Das sieht wie der verbotene Fall aus. Die Index-Arithmetik entlastet alle sieben — Index-Statistik-GrĂ¶ĂŸe = HEAD-Bytes + Zeilenzahl, also war die Datei beim letzten Git-Zugriff bereits CRLF:

DateiHEAD-BytesHEAD-ZeilenHEAD+ZeilenIndex-Statistik
src/spiel/abnahme.js16 00123816 23916 239
src/spiel/dex.js8 6241168 7408 740
src/spiel/flow.js5 190795 2695 269
src/spiel/postfach.js13 99423514 22914 229
src/ui/netzplan.js11 15115211 30311 303
src/ui/spiel.js67 54686668 41268 412
tests/spiel-bogen.test.js10 75216110 91310 913

Ergebnis: Keine Datei wurde in dieser Sitzung von LF auf CRLF gedreht. Alle neuen Dateien (24 untracked, darunter dieses Review) sind LF, 0 CRLF. Der CRLF-Bestand ist gewachsen (repo-weit 51 von 423 verfolgten Dateien) und widerspricht .gitattributes (* text=auto eol=lf) — aber er ist vorbestehend, nicht von dieser Sitzung gemacht.

10.4 Werkzeuge (15:30–15:31)

WerkzeugErgebnis
python tools/klassen.py0 Klassen ohne CSS-Regel — die neuen .uz-*/.nst-*-Klassen sind abgedeckt
node tools/sim-stand.jsSimulation unverĂ€ndert gegenĂŒber dem Referenzstand (12/12)
node --check ĂŒber 212 JS-Dateien1 nicht ladbar: tools/klassenraum-probe/B-workflow.js (Top-Level-await); tests/hilfe-ebene2.test.js ist behoben
python tools/ethos.py 15:30ROT: R5 Dauer nur 1/160/320 ms: 70 → 73 (+3)
python tools/ethos.py 15:31:10GRÜN: keine Regel schlechter als tests/stil-stand.json
node tools/pruefe-namen-flicken.js66 Dateien geprĂŒft, 0 laden nicht, Exit 0 (nach der Korrektur, § 4.4)

Zur ethos-Roten, ehrlich: sie fiel in dasselbe Zeitfenster, in dem src/stil/naechster.css entstand (15:29:34) — die einzige neue CSS-Datei. Um 15:31:10 war die Regel wieder grĂŒn, ohne dass ich etwas geĂ€ndert hĂ€tte. Ich habe die +3 deshalb nicht einer bestimmten Zeile zuordnen können: mein eigener Nachbau des ZĂ€hlers (messen() des Werkzeugs direkt aufgerufen, mit und ohne naechster.css) ergab in beiden FĂ€llen 70. Ergebnis: Zwischenstand wĂ€hrend des Schreibens, kein belegter Verstoß. Restzweifel: ein ZĂ€hler, der beim Schreiben einer Datei kurz ausschlĂ€gt, ist selbst eine Beobachtung wert — fĂŒr die Abnahme zĂ€hlt der Endlauf.

10.5 Zweiter Vollschnitt 15:31 — 591/593 grĂŒn, 2 ROT (69 Testdateien, 90 Module, 0 ĂŒbersprungen)

Kein LADEFEHLER. Von den acht roten aus § 10.1 sind sechs verschwunden (Doku-Erzeugnis neu gebaut, Fehlerdex-Zahlen nachgezogen, stp-doppelkabel heilt jetzt auch in standorte). Es blieben zwei — beide gehören Bausteinen, die nach meinem Task-Board-Abzug entstanden sind:

✗ Fragen-Generator â€ș Fragen-Generator: jede falsche Option ist ein typischer Denkfehler, keine Zufallszahl
✗ Spiel: naechster Schritt â€ș Nur auf Bedarf: azubi nach Wartezeit, geselle nach Fehler, meister nie — gefragt bekommt sie jeder

Wert fĂŒr die Abnahme: 591 von 593 grĂŒn heißt nicht fertig — die zwei roten Zeilen sind genau der Grund, warum die Abnahme am Ende zĂ€hlt und nicht der Zwischenstand. Nicht geprĂŒft: ob diese zwei im Endlauf noch rot sind (der Baum wanderte weiter, wĂ€hrend ich maß).

10.6 Fremdbericht gegengeprĂŒft: Fehlerdex-Nachzug (Peer-Meldung hilfevorrat, 15:35)

Der Peer meldete Zahlen zum Fehlerdex-Nachzug. Ich habe sie nicht zitiert, sondern mit eigener Probe nachgezÀhlt (90 Module, eigener vm-Bereich):

Behauptung des Peersmeine MessungUrteil
Injektoren 39 = Spiel.dex.liste() 39 = dex.zaehlen().gesamt 3939 / 39 / 39bestÀtigt
Gruppen: schicht1 4 · adressen 6 · dienste 7 · vlan 5 · routing 4 · nat 4 · filter 6 · betrieb 3dieselben acht Zahlen, Summe 39bestÀtigt
alle 39 mit Gruppe, Symptom, Erkennungszeichen, ErklĂ€rungfehlt: [] ĂŒber alle 39 (gruppe, symptom, erkennen, erklaerung)bestĂ€tigt
7 Grundcodes ohne Injektor: DEVICEOFF, DHCPCONFLICT, DHCPLEASEEXPIRED, DHCPPOOLEMPTY, DHCPRESERVEDBUSY, DHCPSNOOPINGBLOCKED, NATIVE_MISMATCHgenau diese 7bestÀtigt
„Jeder von Injektoren benutzte Code liegt in Sim.GRUENDE (Differenz [])"eine Ausnahme: OFFEN wird von einem Injektor benutzt und steht nicht in Sim.GRUENDEteilweise widerlegt

Zu OFFEN: src/spiel/dex.js:77 fĂ€ngt genau diesen Wert ausdrĂŒcklich ab („Etwas ist erreichbar, das gesperrt sein soll"). Die Ausnahme ist also gewollt — aber die Aussage „Differenz []" ist zu stark. Restzweifel: meine Zahl beruht auf Spiel.INJEKTOREN als Objekt (Object.values); die erste Probe lief in einen Typfehler, weil ich ein Feld falsch angenommen hatte. Diesen Fehlalarm nenne ich hier ausdrĂŒcklich, weil er die Regel des Hauses belegt: eine Probe, die das Falsche misst, sieht wie ein Befund aus.

10.7 Was fĂŒr die Abnahme offen bleibt

WasStand
Voller Lauf nach dem letzten Bau-Taskoffen — mein letzter Stand: 591/593 (15:31)
Die zwei roten aus § 10.5offen
python tools/ethos.py, klassen.py, sim-stand.js nach dem letzten Bauklassen 0, sim-stand unverĂ€ndert, ethos GRÜN (15:31) — Endlauf offen
Zeilenenden der Dateien, die nach 15:27 entstehenoffen
Browser/OberflĂ€che (bauen.py, tools/rauch.py, menueprobe.py, seite-pruefen.py)nicht geprĂŒft — siehe § 9