Skip to content

test(map): den Spiegel der Geländetabelle in der laufenden CI-Spur schützen, und den Erreichbarkeitstest schärfen (#126) - #129

Merged
cubetribe merged 1 commit into
mainfrom
chore/s23-tests-halten-was-sie-versprechen
Aug 30, 2026
Merged

test(map): den Spiegel der Geländetabelle in der laufenden CI-Spur schützen, und den Erreichbarkeitstest schärfen (#126)#129
cubetribe merged 1 commit into
mainfrom
chore/s23-tests-halten-was-sie-versprechen

Conversation

@cubetribe

Copy link
Copy Markdown
Collaborator

Der rote Faden

Zwei Tests, die mehr versprachen als sie hielten. Beide stammen aus Paket 21.7, beide sind erst durch das adversariale Gegenlesen dieses Pakets aufgefallen.

Fixes #126

Das CI-Loch — bewiesen, nicht vermutet

Die kanonische Geländetabelle steht notgedrungen zweimal im Repo: Gameplay/Match/GlutrinneTerrainMap.cs auf der Unity-Seite, und ein handgespiegelter Ausdruck in tools/Nova.SimRunner/Determinism10000Scenario.cs. Das lässt sich nicht auflösen — tools/Nova.SimRunner* kompiliert Gameplay/ nicht, das ist eine eingefrorene Grenze.

Gepinnt war bisher nur die eine Hälfte. Die Spur, die den Gameplay-Ausdruck pinnt, liegt in Assets/Tests/EditMode/ und läuft in keiner CI (tests.yml fährt ausschließlich dotnet test tools/Nova.SimRunner.Tests).

Das wurde nicht behauptet, sondern nachgewiesen: eine geänderte Konstante in GlutrinneTerrainMap.cs ließ die Kette 736/736 grün durchlaufen. Host und Gast hätten danach verschiedene Karten gerechnet — ein Desync, der sich als „beim Gegner laufen die Einheiten woanders" äußert und den später niemand der Kartenarbeit zuordnet.

Die Behebung, ohne auf Unity zu warten

Ob die Unity-Tests in die CI kommen, ist eine Inhaberentscheidung mit Lizenzkosten und liegt offen (#110). Bis dahin braucht es Schutz in der Spur, die tatsächlich läuft.

GlutrinneTerrainSourceGuardTests liest beide Quellen als Text — dasselbe Muster, mit dem NoFloatInSimulationTests seit jeher Dateien prüft, die in seiner Assembly gar nicht kompiliert werden. Drei Tests:

  1. Konstanten geparst gegen kompiliert. Mittelpunkt, Innen- und Außenradius, Lückenradius, Zellzahl: was im Gameplay-Quelltext steht, muss dem entsprechen, womit der headless Spiegel rechnet.
  2. Das IsImpassable-Prädikat Token für Token zwischen beiden Quellen. Kommentare und Leerraum werden vorher entfernt — eine Umformatierung löst also keinen Fehlalarm aus, und genau das ist gegengeprüft.
  3. Der Wächter liest wirklich beide Dateien. Ein Pfad- oder Extraktionsfehler würde die ersten beiden Tests leer grün laufen lassen. Dieselbe Vorsichtsmaßnahme wie bei den Existenz-Pins des Determinismus-Wächters.

Die Fehlermeldungen sagen, was zu tun ist — beide Ausdrücke nachziehen, nicht den Wächter anpassen. Ohne diesen Satz wird aus einem Wächter beim dritten roten Lauf eine Formalie.

Was er nicht fängt: Semantik. Er bemerkt, dass sich etwas bewegt hat, nicht ob die Bewegung richtig war.

Rot-Nachweis — unabhängig nachgefahren

Vom Orchestrator selbst, nicht nur vom Worker berichtet: CornerGapMinRadius in GlutrinneTerrainMap.cs von 11 auf 12 gesetzt, Kette gefahren, zurückgesetzt.

Fehler GameplaySource_TerrainConstants_MatchTheHeadlessMirror [12 ms]
Fehler!  : Fehler: 1, erfolgreich: 738, gesamt: 739

Vorher wäre derselbe Eingriff grün durchgelaufen. Das ist der ganze Punkt.

#126 — der Erreichbarkeitstest

Der Test aus 21.7 prüft über das FlowField, dass jedes Feld und jedes HQ von beiden Startpunkten erreichbar bleibt. IntegrationField.Generate sät die Zielzelle aber ohne Begehbarkeitsprüfung — ein Ziel auf einer unbegehbaren Zelle bekommt Kosten 0 und gilt als erreicht.

Der Befund ist nachgeprüft und verschärft: auch RequestFlowField und TryAddField prüfen es nicht. Der Test übersah damit genau den Fall, gegen den er existiert.

Die Behebung liegt im Test, nicht in Simulation/Pathfinding/ — das gehört dem Einheitenstrang und bleibt unangetastet. Der Test prüft die Begehbarkeit seiner Ziele jetzt selbst, bevor er die Erreichbarkeit prüft. Das ist ohnehin die schärfere Variante: sie trennt zwei Fehlerbilder, die vorher zu einem grünen Haken verschmolzen — „das Feld liegt auf einer Wand" ist etwas anderes als „das Feld ist umbaut".

Auch hier ein Rot-Nachweis: ein Feld testweise auf eine Wandzelle geschoben, Test wird rot, Änderung zurückgenommen.

Nachweis

  • dotnet test tools/Nova.SimRunner.Tests -c Release: 736/736 → 739/739 grün, vom Orchestrator unabhängig nachgefahren
  • Beide Rot-Nachweise reproduziert, beide Manipulationen zurückgesetzt, Arbeitsbaum sauber

Herkunft

Erarbeitet von Kimi K3 als delegiertem Worker; Rot-Nachweise und Testkette vom Orchestrator unabhängig nachgefahren. Der Befund selbst stammt aus dem adversarialen Gegenlese-Lauf zu Paket 21.7 (reports/v8.6.0/sprint-21/08-kimi-gegenlesen-karte.md).

…huetzen, und den Erreichbarkeitstest schaerfen (#126)
@cubetribe
cubetribe merged commit a2d6d3a into main Aug 30, 2026
7 checks passed
@cubetribe
cubetribe deleted the chore/s23-tests-halten-was-sie-versprechen branch August 30, 2026 00:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Erreichbarkeitstest sieht ein Feld unter einer Wand als erreichbar — IntegrationField sät die Zielzelle ungeprüft

1 participant