Nacharbeiten aus M1c für die nächsten Pläne #8

Open
opened 2026-10-02 00:05:13 +00:00 by steven · 1 comment
Owner

Die Abschlussprüfung von M1c (#7) hat den Gleichschritt im Netz mit Korrekturen für zusammenführbar erklärt. Die Korrekturen sind im Branch erledigt. Diese Punkte wurden bewusst verschoben, weil sie erst mit den nächsten Plänen wichtig werden oder nur Kleinigkeiten sind. Jeder Plan übernimmt seine Punkte in seine Tasks. Die offenen Punkte aus #2 und #5 gelten weiter.

Entscheidungen

  • Vertrauensregel bestätigen. Die Reichweite der Spitzhacke prüft nur die Hülle, und jeder Gast bekommt mit jedem Snapshot die Schlüssel aller Spieler. Ein veränderter Client könnte aus der Ferne graben oder sich als ein Spieler ausgeben, der gerade nicht online ist. CLAUDE.md sagt: „Für ein Koop-Spiel unter Freunden nehmen wir beides hin.“ In docs/KONZEPT.md steht das nicht.
  • Mitspieler brauchen heute Git, Rust und Godot (siehe docs/playtests/m1c.md). Ein exportierter Build, der ohne diese Werkzeuge läuft, wäre der nächste Schritt.

Netz und Kern

  • Die Regel-Kennung deckt die Beitrittsgrenzen nicht ab (vier Spieler online, 16 bekannt). Abhilfe ist ein drittes eingefrorenes Skript, sobald sich die festgeschriebenen Werte das nächste Mal ändern. Bis dahin fängt die Prüfsumme eine Abweichung.

  • Das Dekodieren gegen feindliche Eingaben testen:

    • jede Nachricht an jedem Präfix abgeschnitten;
    • lügende Längen;
    • ungültiges UTF-8 und ungültige Wahrheitswerte;
    • die Grenze von 128 und 129 Bytes für Nachrichten eines Gastes.
  • Abweichungsmeldungen pro Gast begrenzen. Heute schickt der Host auf jede Meldung die ganze Welt; auslösen kann das nur ein veränderter Client.

  • Schlüssel und Name werden an drei Stellen gleich dekodiert. Ein gemeinsamer Helfer vor M2.

  • join_refused (aus #5): Das Ereignis nennt jetzt den Schlüssel, aber die Hülle wertet es nicht aus. Ein Host, dessen geladene Welt schon 16 andere Spieler kennt, wäre ein stummer Zuschauer.

  • Die LAN-Adresse des Hosts in der Statuszeile zeigen (Konzept Abschnitt 5: Der Host nennt seine Adresse).

  • Zwei Schläge eines Gastes, die außerhalb der Abklingzeit zwischen denselben zwei Takten ankommen, laufen beide im selben Takt; der zweite verfällt. Das passiert nur bei Bursts, also Nachrichten, die 250 bis 500 ms verzögert ankommen, und trifft 1,7 bis 5,9 % der Schläge, wie vor M1c. Abhilfe ist eine Markierung „in diesem Takt schon eingereiht“ im Host.

  • CLAUDE.md sagte, eine stille Verbindung gelte „nach höchstens NetLink.TIMEOUT_MSEC“ als verloren. ENet prüft die Grenze aber nur, wenn eine Wiederholung fällig ist. Gemessen: 6,4 bis 15,6 s. Seit M1d (#12) steht dort „nach etwa“.

  • Einen Test ergänzen, der Drosselung und Zeitüberschreitung über get_statistic zurückliest. Dabei klären, ob CLAUDE.md die Untergrenze von 5 Sekunden nennen soll: Laut der Prüfung von M1d kann ENet eine stille Verbindung wegen der Untergrenze von set_timeout schon ab 5 Sekunden trennen.

Hülle

  • main.gd aufteilen (Lebenszyklus, Meldungen, Eingabe, Dateien) und die doppelte Startfolge in play und _reload zusammenführen, bevor M2 dazukommt.
  • Zwei Instanzen auf einem Profil verhindern, etwa mit einer Sperrdatei pro Profil. Ein ungültiges --profile nicht still auf das Standardprofil zurückfallen lassen, sondern im Menü melden.
  • Nach einer Neusynchronisierung die Statuszeile und die Figuren mit online_players() abgleichen.

Tests und Werkzeuge

  • Ein Test, dass die Platzhalter in texts.csv auf Deutsch und Englisch übereinstimmen. Heute stimmen sie; eine Abweichung gäbe nur in einer Sprache einen Engine-Fehler.

  • Testlücken der Hauptszene:

    • failed und protocol_error auf Szenenebene;
    • vier von fünf Ablehnungsgründen übers Netz;
    • ein Neustart nach dem Verlassen;
    • ein leerer Name.

    Außerdem verwirft await _wait_until(...) an vier Stellen sein Ergebnis.

  • Der Zwei-Instanzen-Test zeigt bei einem Fehler weder das Ende von guest.log noch den Exit-Code des Bots. Seine Meldung „the host did not answer“ kommt auch, wenn der Host antwortete.

  • Für den Startzeit-Wettlauf im Zwei-Instanzen-Test gibt es keinen eingecheckten Regressionstest, nur einen Versuch mit verzögertem Bot.

  • a_waiting_hit_is_dropped_when_its_guest_leaves bestünde auch, wenn der gehaltene Schlag das Verlassen überlebte, weil World::dig abwesende Spieler übergeht. Der Test sollte den Wiedereintritt innerhalb der Abklingzeit prüfen.

  • test_figures_travel_to_the_other_machines scheitert, wenn test_session_link.gd allein in einem frischen Prozess läuft, weil ENet in der ersten Sekunde drosselt. In der vollen Suite ist der Test stabil. Das bestand schon vor der Korrekturwelle.

Fragebogen

  • In docs/playtests/m1c.md meint „Stand“ einmal das Archiv und einmal den Spielstand.
  • Es fehlen die Mindestversion von Rust (1.94, rust-version in Cargo.toml) und woher Mitspieler das Archiv bekommen.
  • Hat der Host die Firewall-Frage nur für private Netze beantwortet, fehlt die Abhilfe: Godot in der Windows-Firewall auch für öffentliche Netze erlauben.
Die Abschlussprüfung von M1c (#7) hat den Gleichschritt im Netz mit Korrekturen für zusammenführbar erklärt. Die Korrekturen sind im Branch erledigt. Diese Punkte wurden bewusst verschoben, weil sie erst mit den nächsten Plänen wichtig werden oder nur Kleinigkeiten sind. Jeder Plan übernimmt seine Punkte in seine Tasks. Die offenen Punkte aus #2 und #5 gelten weiter. ### Entscheidungen - [ ] Vertrauensregel bestätigen. Die Reichweite der Spitzhacke prüft nur die Hülle, und jeder Gast bekommt mit jedem Snapshot die Schlüssel aller Spieler. Ein veränderter Client könnte aus der Ferne graben oder sich als ein Spieler ausgeben, der gerade nicht online ist. `CLAUDE.md` sagt: „Für ein Koop-Spiel unter Freunden nehmen wir beides hin.“ In `docs/KONZEPT.md` steht das nicht. - [ ] Mitspieler brauchen heute Git, Rust und Godot (siehe `docs/playtests/m1c.md`). Ein exportierter Build, der ohne diese Werkzeuge läuft, wäre der nächste Schritt. ### Netz und Kern - [ ] Die Regel-Kennung deckt die Beitrittsgrenzen nicht ab (vier Spieler online, 16 bekannt). Abhilfe ist ein drittes eingefrorenes Skript, sobald sich die festgeschriebenen Werte das nächste Mal ändern. Bis dahin fängt die Prüfsumme eine Abweichung. - [ ] Das Dekodieren gegen feindliche Eingaben testen: - jede Nachricht an jedem Präfix abgeschnitten; - lügende Längen; - ungültiges UTF-8 und ungültige Wahrheitswerte; - die Grenze von 128 und 129 Bytes für Nachrichten eines Gastes. - [ ] Abweichungsmeldungen pro Gast begrenzen. Heute schickt der Host auf jede Meldung die ganze Welt; auslösen kann das nur ein veränderter Client. - [ ] Schlüssel und Name werden an drei Stellen gleich dekodiert. Ein gemeinsamer Helfer vor M2. - [ ] `join_refused` (aus #5): Das Ereignis nennt jetzt den Schlüssel, aber die Hülle wertet es nicht aus. Ein Host, dessen geladene Welt schon 16 andere Spieler kennt, wäre ein stummer Zuschauer. - [ ] Die LAN-Adresse des Hosts in der Statuszeile zeigen (Konzept Abschnitt 5: Der Host nennt seine Adresse). - [ ] Zwei Schläge eines Gastes, die außerhalb der Abklingzeit zwischen denselben zwei Takten ankommen, laufen beide im selben Takt; der zweite verfällt. Das passiert nur bei Bursts, also Nachrichten, die 250 bis 500 ms verzögert ankommen, und trifft 1,7 bis 5,9 % der Schläge, wie vor M1c. Abhilfe ist eine Markierung „in diesem Takt schon eingereiht“ im Host. - [x] `CLAUDE.md` sagte, eine stille Verbindung gelte „nach höchstens `NetLink.TIMEOUT_MSEC`“ als verloren. ENet prüft die Grenze aber nur, wenn eine Wiederholung fällig ist. Gemessen: 6,4 bis 15,6 s. Seit M1d (#12) steht dort „nach etwa“. - [ ] Einen Test ergänzen, der Drosselung und Zeitüberschreitung über `get_statistic` zurückliest. Dabei klären, ob `CLAUDE.md` die Untergrenze von 5 Sekunden nennen soll: Laut der Prüfung von M1d kann ENet eine stille Verbindung wegen der Untergrenze von `set_timeout` schon ab 5 Sekunden trennen. ### Hülle - [ ] `main.gd` aufteilen (Lebenszyklus, Meldungen, Eingabe, Dateien) und die doppelte Startfolge in `play` und `_reload` zusammenführen, bevor M2 dazukommt. - [ ] Zwei Instanzen auf einem Profil verhindern, etwa mit einer Sperrdatei pro Profil. Ein ungültiges `--profile` nicht still auf das Standardprofil zurückfallen lassen, sondern im Menü melden. - [ ] Nach einer Neusynchronisierung die Statuszeile und die Figuren mit `online_players()` abgleichen. ### Tests und Werkzeuge - [ ] Ein Test, dass die Platzhalter in `texts.csv` auf Deutsch und Englisch übereinstimmen. Heute stimmen sie; eine Abweichung gäbe nur in einer Sprache einen Engine-Fehler. - [ ] Testlücken der Hauptszene: - `failed` und `protocol_error` auf Szenenebene; - vier von fünf Ablehnungsgründen übers Netz; - ein Neustart nach dem Verlassen; - ein leerer Name. Außerdem verwirft `await _wait_until(...)` an vier Stellen sein Ergebnis. - [ ] Der Zwei-Instanzen-Test zeigt bei einem Fehler weder das Ende von `guest.log` noch den Exit-Code des Bots. Seine Meldung „the host did not answer“ kommt auch, wenn der Host antwortete. - [ ] Für den Startzeit-Wettlauf im Zwei-Instanzen-Test gibt es keinen eingecheckten Regressionstest, nur einen Versuch mit verzögertem Bot. - [ ] `a_waiting_hit_is_dropped_when_its_guest_leaves` bestünde auch, wenn der gehaltene Schlag das Verlassen überlebte, weil `World::dig` abwesende Spieler übergeht. Der Test sollte den Wiedereintritt innerhalb der Abklingzeit prüfen. - [ ] `test_figures_travel_to_the_other_machines` scheitert, wenn `test_session_link.gd` allein in einem frischen Prozess läuft, weil ENet in der ersten Sekunde drosselt. In der vollen Suite ist der Test stabil. Das bestand schon vor der Korrekturwelle. ### Fragebogen - [ ] In `docs/playtests/m1c.md` meint „Stand“ einmal das Archiv und einmal den Spielstand. - [ ] Es fehlen die Mindestversion von Rust (1.94, `rust-version` in `Cargo.toml`) und woher Mitspieler das Archiv bekommen. - [ ] Hat der Host die Firewall-Frage nur für private Netze beantwortet, fehlt die Abhilfe: Godot in der Windows-Firewall auch für öffentliche Netze erlauben.
steven added this to the M1 Fundament milestone 2026-10-02 00:05:13 +00:00
Author
Owner

Spieltest M1c, Antworten von Steven auf den Fragebogen docs/playtests/m1c.md:

  1. Der Beitritt hat geklappt und ging relativ fix.
  2. Die Schläge als Gast sind sichtbar verzögert.
  3. Die Figuren der anderen bewegen sich gleichmäßig.
  4. Die Namen sind erkennbar, aber sehr unscharf.
  5. Die Meldung „Welt mit dem Host abgeglichen“ erschien bisher nicht.
  6. Verlassen und Wiederkommen eines Gastes ist noch nicht getestet.

Folgen für M1d (Stilproben):

  • Zu 2: Die Verzögerung ist der Gleichschritt; der Schlag geht zum Host und kommt mit dem nächsten Takt zurück. M1d zeigt den Splitterwurf des eigenen Schlags deshalb sofort beim Klick. Risse und Abbau kommen weiter mit dem Takt.
  • Zu 4: Die Namen wurden in 8 Pixeln gezeichnet und von der Kamera dreifach vergrößert. M1d zeichnet sie in Bildschirmgröße.
  • Frage 6 bleibt für den nächsten Spieltest offen.
Spieltest M1c, Antworten von Steven auf den Fragebogen `docs/playtests/m1c.md`: 1. Der Beitritt hat geklappt und ging relativ fix. 2. Die Schläge als Gast sind sichtbar verzögert. 3. Die Figuren der anderen bewegen sich gleichmäßig. 4. Die Namen sind erkennbar, aber sehr unscharf. 5. Die Meldung „Welt mit dem Host abgeglichen“ erschien bisher nicht. 6. Verlassen und Wiederkommen eines Gastes ist noch nicht getestet. Folgen für M1d (Stilproben): - Zu 2: Die Verzögerung ist der Gleichschritt; der Schlag geht zum Host und kommt mit dem nächsten Takt zurück. M1d zeigt den Splitterwurf des eigenen Schlags deshalb sofort beim Klick. Risse und Abbau kommen weiter mit dem Takt. - Zu 4: Die Namen wurden in 8 Pixeln gezeichnet und von der Kamera dreifach vergrößert. M1d zeichnet sie in Bildschirmgröße. - Frage 6 bleibt für den nächsten Spieltest offen.
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: steven/Grovewright#8