champions-of-luneraria/docs/port/PORT-QA.md
Martin Stickelbroeck 769e622952 U4 Netzwerk: LuneSession, TCP, Host/Join, 43+12 Prüfungen
Der M4-Umfang ist als Protokoll 4 portiert, serverautoritativ. Der Host
besitzt LuneMatch und rechnet jeden Kampf; Clients senden nur Absichten
und zeigen den Kampf aus Host-Momentaufnahmen.

- LuneSession (Core/Net): Rollen offline/Host/Gast, sechs Sitze, Lobby,
  Hallo mit Protokollprüfung und Namenskürzung, Beitritt und Wieder-
  einstieg über den Anzeigenamen, private Planung mit Spoof-Schutz,
  Bereit ist verbindlich, Bots planen einmal je Runde, Disconnect gibt
  den Platz an einen Bot (nie Kernverlust), Übernahme verwirft den
  unbestätigten Bot-Entwurf, Revanche hält die Plätze, Hostverlust
  meldet und führt ins Menü zurück.
- Kampfsynchronisation: Beginn mit Einheitenätzen und Gebäude-HP, alle
  0,05 s neue Einheiten und ein Frame (13 Werte je Einheit), späte
  Frames über die Serial verworfen, Gast interpoliert (frame_alpha).
- Transport: LuneLoopback (In-Prozess) für die Tests, LuneTcp + LuneWire
  (Cursor-Codec) für Echtverbindungen statt ENet; ein Socket je Gast.
- Oberfläche: LuneMainMenu (Offline/Hosten/Beitreten, Bund, Lane, Name,
  Adresse, Port) als Startbildschirm, LuneNetPlay als Schale wie
  lune_main.gd. LuneGame leitet Befehle, Rückgängig und Bereit im
  Netzspiel über die Sitzung; Tempo und Pause bestimmt der Host.
- Tests: NetSuite 43/43 (Port von test_lune_net.gd), NetRoundsSuite
  12/12 (Port von net_rounds.py: 5 Runden, Prüfsummen gleich, Gast
  rechnet 0 Schritte, Drop und Wiedereinstieg auf denselben Sitz),
  LuneWireTests Round-trip. EditMode 29/29, PlayMode 13/13, Kerntests
  457/457. Fingerabdrücke der Bot-Partien unverändert.
- Dokumentation: U4-NETWORK (Abnahme, Grenzen), PORT-QA (U4), PORT-STATUS
  (U4 fertig, U5 nächster Schritt), KNOWN-BEHAVIOR-DIFFERENCES.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 16:14:42 +02:00

84 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Port-QA
Je Meilenstein: Tests, Bild, Leistung, bekannte Unterschiede, Commit.
## U1 · C#-Simulation
| Punkt | Ergebnis |
| --- | --- |
| Tests | `content` 75/75, `core` 91/91, `m2` 73/73, `golden` 157/157, `determinism` 6/6 = **402/402**; dreimal in getrennten Prozessen; Protokoll `logs/u1/core-tests.json` |
| Golden-Parität | 19 Szenarien, 120 Snapshots, 51.221 Werte; größte Abweichung 0 in allen Kategorien (Toleranzen siehe U1-RULES.md) |
| Bild | `screenshots/u1/replay-start_three_lanes-t10.png`, `replay-boss_cycle-marching.png`, `replay-grotto_contested-t15.png`: Godot-Positionen (Punkte) und C#-Positionen (Ringe) decken sich (31/31, 35/35, 15/15) |
| Leistung (Mac M5) | Simulationsschritt bei 120 Einheiten: Godot 1,587 ms, C#/.NET 8 0,259 ms; Bot-Partien pro Runde: 648 ms zu 36 ms (`logs/u1/sim-bench-*.json`) |
| Bekannte Unterschiede | technische Repräsentation (Klassen statt Dictionaries, stabile Sortierung, 32-Bit-int, kein ungenutzter Zufallsgenerator); Referenzfehler R1 bewusst übernommen |
| Offen | erledigt in U1.5: Lauf im Unity-Editor, Mono-Leistung. Weiter offen: Kerntests auf Windows 11 und Fedora 44 |
| Commit | Zweig `luneraria/u1` (`4d6ed17`) |
Hinweis: Die Projektdateien des .NET-Harness (`tools/dotnet/*/*.csproj`) fehlten im U1-Commit, weil `.gitignore` alle `*.csproj` ausschloss. Sie sind seit U1.5 eingecheckt.
## U1.5 · Unity-Integrationsprüfung
| Punkt | Ergebnis |
| --- | --- |
| Umgebung | Unity 6000.3.20f1 (6.3 LTS), Personal-Lizenz, URP 17.3.0, Editor-Mono 6.13.0, Standalone-Backend Mono, API-Level .NET Standard 2.1 |
| Tests | Unity Test Runner (EditMode): 402/402 in Release und Debug, dazu 2 Integrationstests; .NET 8 weiter 402/402. Protokolle `logs/u1_5/editmode-results-*.xml`, `core-tests-*.json` |
| Golden in Unity | 51.221 Werte, Abweichung 0 in allen Kategorien und Bereichen (Gold, HP, Positionen, Türme, Ancients, Wellen, Helden, Boss, Gewinner, …) |
| Float-Befund | Mono rechnet float32-Zwischenwerte doppelt genau. Das beeinflusste eine Zielentscheidung (`mirror_match` Runde 7: +4,8 s Kampfdauer). Behoben durch explizite Rundung in `Vec2`; .NET-Ergebnisse byteidentisch zu vorher |
| Bild | keines; U1.5 hat keine sichtbare Szene. Nachweis sind der Schritt-Trace (`tools/port/trace_diff.py`) und die Float-Probe (`logs/u1_5/float-probe-*.json`) |
| Leistung (Editor-Benchmark) | Schritt mit 120 Einheiten: Editor Release 0,51 ms, Debug 1,00 ms; .NET 8 0,24–0,26 ms; Godot 1,60 ms (`logs/u1_5/sim-bench-*.json`) |
| Bekannte Unterschiede | R1 bewusst übernommen; F1 (Mono-Float) behoben ([KNOWN-BEHAVIOR-DIFFERENCES.md](KNOWN-BEHAVIOR-DIFFERENCES.md)) |
| Offen | IL2CPP- und Player-Läufe unter Windows 11 und Fedora 44 (Build-Module fehlen, Installation nach Freigabe) |
| Commit | Zweig `luneraria/u1.5` |
## U2 · Unity-Spielwelt
| Punkt | Ergebnis |
| --- | --- |
| Tests | Blender-Pipeline 176/176 und Unity-Verifier 128/128 (9 Assets). Test Runner EditMode 11/11: Kern 402 Prüfungen, 2 Integrationstests, 4 Bildratentests. PlayMode 2/2: Szene bei echten Bildraten, Vertical Function Test |
| Parität | Bot-Partie Seed 2 (9 Runden) und Seed 9 ab Runde 21 in der sichtbaren Szene mit demselben Fingerabdruck wie der reine Kern; ebenso bei 30, 60, 120 fps, unbegrenzt, mit Rucklern und bei 8× Tempo |
| Bild | `screenshots/u2a/` (Assets), `u2b/` (Karte mit Godot-Kameraeinstellungen; Vergleich mit `g2/nachher`), `u2d/` (14 Schlüsselmomente der Partien) |
| Leistung | macOS-Player (M5, 1080p, VSync aus) mit 116 Einheiten: 161–199 fps; Hauptthread 1,3 ms, Render-Thread 1,3 ms, Simulation unter 0,1 ms. Ausreißer beim Present (p95 18–26 ms) offen für U5 |
| Bekannte Unterschiede | keine Verhaltensunterschiede. Darstellung vereinfacht: Platzhaltermodelle für Einheiten, Materialien, Effekte, Debug-Anzeige statt HUD ([U2-WORLD.md](U2-WORLD.md)) |
| Offen | Windows-/Linux-Player (Build-Module); Leistungsspitzen (Batch-Import inzwischen erledigt, siehe unten) |
| Commits | `luneraria/u2`: U2A `49cb4af`, U2B `8a72cb1`, U2C `3871b3e`, U2D `323cc3a` |
### Batch-Import aller Modelle (nach U2D)
| Punkt | Ergebnis |
| --- | --- |
| Tests | Blender-Pipeline 1.616/1.616 und Unity-Verifier 1.247/1.247 (86 Modelle); zwei Exportläufe byteidentisch. Test Runner EditMode 11/11, PlayMode 2/2 mit allen Modellen |
| Parität | Vertical Function Test mit allen Modellen: Seed 2 `DCE95C96556F3A1A` (12.690 Schritte), Seed 9 ab Runde 21 `7B8E43AEFC0D60C5` (4.195 Schritte), beide gleich dem Kern; Szene bei 30, 60, 120 fps und unbegrenzt gleich |
| Bild | `screenshots/u2a-batch/<Gruppe>.png` (Kontaktbögen aller Modelle), `screenshots/u2a-batch/01-…` bis `14-…` (Partie mit allen Modellen) |
| Leistung | macOS-Player mit allen Modellen, 116 Einheiten: 158–160 fps (Mid-Lane 205–207). Hauptthread 2,5 ms, Render-Thread 3,2 ms, etwa doppelt so viel wie mit dem Platzhalter. Present-Ausreißer kürzer (p95 18 statt 24 ms). Player 228 MB |
| Befund | Projekt liegt in iCloud Drive; Konfliktkopien im Build-Cache machten den Player unbrauchbar. `LunePlayerBuild` fängt das ab ([U2-WORLD.md](U2-WORLD.md)) |
| Bekannte Unterschiede | keine Verhaltensunterschiede; starre Figuren ohne Godots prozedurale Gliederbewegung |
| Offen | Draw Calls messen (U5); Windows-/Linux-Player (Build-Module) |
| Commit | `luneraria/u2`: Batch-Import `3ca38a8` (Modelle direkt in Git) |
## U3 · G3-HUD portieren
| Punkt | Ergebnis |
| --- | --- |
| Tests | EditMode 23/23 (Kern 402 Prüfungen, Sichtmodell, Bildraten-Logik). PlayMode 13/13: Verify A–I **718 Prüfungen, 0 Fehler** (Port von `verify_g3` 715/715 plus Teil I), Szene bei echten Bildraten, Vertical Function Test, Capture, UI-Toolkit-Probe. Bildwerkzeuge und Spieltest sind `Explicit`. Protokolle `logs/u3/`, Summen `tools/out/hud-verify-*.txt` |
| Parität | Bot-Partie Seed 2 `DCE95C96556F3A1A` (12.690 Schritte), Seed 9 ab Runde 21 `7B8E43AEFC0D60C5` (4.195 Schritte), beide unverändert gleich dem Kern |
| Bild | `screenshots/u3/motive-1920x1080/` (14 G3-Motive), `pruefung/` (Teile B–F), `aufloesungen/` (1152×720 … 2560×1440), `r1-*.png`/`r2-*.png` (Spieltest) |
| Leistung | macOS-Player mit HUD, 116 Einheiten: 169 fps (Übersicht) und 218 fps (Mid nah). HUD-Skripte **0,090 bzw. 0,078 ms je Bild**; Simulation 0,09/0,04 ms, Ansichten 0,31/0,33 ms. Ausreißer beim Present (p95 10–13 ms) im Rahmen der U2D-Streuung. Rohdaten `logs/u3/player-benchmark-macos.json` |
| Bekannte Unterschiede | Godots deklarierte Schriftgewichte werden in der Referenz nie angewendet (String-Schlüssel „wght“); Port zeigt wie G3 Regular 400. Kein Hauptmenü, kein Grottenlicht. Details [U3-UI.md](U3-UI.md) und [KNOWN-BEHAVIOR-DIFFERENCES.md](KNOWN-BEHAVIOR-DIFFERENCES.md) |
| Offen | Hauptmenü und Netzwerk (U4); Schriftgewichte, Grottenlicht und weitere Darstellung (U5); Windows-/Linux-Player (Build-Module) |
| Commits | `luneraria/u3`: U3A `4dee9b1`, U3B/U3C `2b86c0d`, U3D `66867f3` |
## U4 · Netzwerk
| Punkt | Ergebnis |
| --- | --- |
| Tests | Protokoll `NetSuite` **43/43** (Port von `test_lune_net.gd`), Mehr-Runden-Loopback `NetRoundsSuite` **12/12** (Port von `net_rounds.py`, In-Prozess mit `LuneLoopback`), `LuneWireTests` Round-trip. EditMode 29/29, PlayMode 13/13, Kerntests .NET 457/457 (402 + 43 + 12) |
| Parität | Bot-Partien unverändert `DCE95C96556F3A1A`, `7B8E43AEFC0D60C5`; Mindestumfang M4 erfüllt (Ready, private Planung, Bot-Übernahme, Wiedereinstieg, Snapshots, Revanche, Disconnect, sechs Plätze) |
| Bild | Startbildschirm `LuneMainMenu` (Offline/Hosten/Beitreten); Partiefenster unverändert U3 |
| Leistung | keine eigenen Netz-Messungen; Rahmen 20/s wie in der Referenz (`LuneNet.FrameInterval` 0,05 s), 13 Floats je Einheit |
| Bekannte Unterschiede | TCP statt ENet (Rahmen auf demselben Socket, Verwerfen über Serial); Zwei-Prozess-Loopback als In-Prozess-Test; vereinfachtes Hauptmenü |
| Offen | Windows-/Linux-Player (Build-Module); Internetpartie über mehrere Rechner; optional unzuverlässiger Rahmenkanal |
| Commits | `luneraria/u4` (dieser Stand) |
## U5
U5 (Visuelle Neuausrichtung) ist noch nicht begonnen.