Skip to content

feat(map): die Mitte wird ein Gebiet mit schmalen Zufahrten (21.7, #94, D-109) - #122

Merged
cubetribe merged 2 commits into
mainfrom
feat/s21-7-mitte-als-gebiet
Aug 29, 2026
Merged

feat(map): die Mitte wird ein Gebiet mit schmalen Zufahrten (21.7, #94, D-109)#122
cubetribe merged 2 commits into
mainfrom
feat/s21-7-mitte-als-gebiet

Conversation

@cubetribe

Copy link
Copy Markdown
Collaborator

Was

Paket 21.7 aus Sprint 21 (#94, Entscheidung D-109) — das letzte offene Paket des Sprints und sein teuerstes.

a) Die Mitte wird ein Gebiet. Aus dem einen Feld bei (62,62) mit 15.000 AE werden fünf Felder à 8.000 — zusammen 40.000 AE, also 28 % des Kartenwerts. Das ist exakt das Gewicht, das das Einzelfeld vorher hatte (29 %), nur teilbar: die Mitte bleibt der Preis, um den es sich zu kämpfen lohnt, ist aber nicht mehr ein einziger Klotz, den einer nimmt oder keiner. Die Karte trägt damit 15 Vorkommen mit 142.000 AE.

b) Chokepoints aus einer einzigen Quelle. Um die Zone liegt ein Felsring — Chebyshev-Radius 14–15 um die Mitte, 168 gesperrte Zellen — mit vier Ecköffnungen auf den Anmarschdiagonalen: den beiden Startbasen (SW/NE) und den beiden umkämpften Flanken (NW/SE). Jede Kehle ist vier Zellen breit, gemessen gegen den MS-1-Trupp aus sechs Einheiten bei 0,5 Zellen Radius: vier passen nebeneinander durch. Eine schmalere Öffnung wäre eine Blockade, kein Engpass.

Die Kernauflage aus D-109 ist erfüllt

„Begehbarkeit und Optik stammen aus einer einzigen Struktur."

Gameplay/Match/GlutrinneTerrainMap hält die kanonische Tabelle. Die Simulation bekommt sie über CostField.SetCost beim Aufbau der Eröffnung (MatchBootstrap:745, mit harter Zellzahl-Sperre), die GlutrinneBlockoutView:240 baut exakt dieselben Zellen als Felsrücken, und die alte Deko-Felsstreuung hält über ein _wallProximity-Feld Abstand zum Ring. Zwei getrennte Quellen hätten Einheiten ergeben, die durch Felsen laufen und an unsichtbaren Wänden hängenbleiben — das Fehlerbild, das dieses Paket verhindern soll.

Die Snapshot-Falle, und wie sie umgangen ist

CostField ist kein Snapshot-Block. Seine Wiederherstellbarkeit war bisher strukturell begründet: der Inhalt folgt vollständig aus dem Bau-Snapshot. Statisches Gelände bricht diese Begründung — es sei denn, es steht auf jedem Host identisch und vor dem ersten Snapshot.

Deshalb liegt das Schreiben in der Host-Konstruktion, nicht im Setup-Pass: der Wiedergabe-Host durchläuft SetupMatch nie. Schreibzahl und Schreibreihenfolge (y, dann x, aufsteigend) liegen fest, damit der Epoch überall auf demselben Wert landet und spätere Baumutationen nach einem Restore im Gleichschritt weiterzählen. Der neue Test SnapshotRestore_ReproducesTheTerrainCarryingCostFieldExactly beweist zellgenaue Identität, Epoch-Gleichheit und byte-identischen Umlauf.

Weil der headless-Pfad Gameplay/ nicht kompiliert, trägt Determinism10000Scenario einen handgespiegelten Zweitausdruck — zellgenau und über eine gemeinsame FNV-1a-Prüfsumme gepinnt.

Gegengelesen — und was dabei herauskam

Diese Arbeit ist von einem zweiten, unabhängigen Worker angegriffen worden, der den Bericht des Autors bewusst zuletzt gelesen hat. Urteil: APPROVED, mit drei Befunden, die hier offen stehen sollen.

1. Eine falsche Begründung in tragender Doku — in diesem PR korrigiert. Der Docstring behauptete, die Wand sei zwei Zellen dick, weil eine einzellige Wand „diagonal leckt". Das ist falsch: ein Königszug ändert max(|dx|,|dy|) um höchstens 1 und kann eine geschlossene Chebyshev-Schale nicht überspringen. Ich habe es nachgerechnet — eine einschalige geschlossene Wand leckt nicht. Die gebaute zweischalige Wand ist trotzdem richtig und dicht; nur ihre Begründung war es nicht. Der Docstring nennt jetzt den echten Grund (Tiefe der Öffnung, sichtbare Masse) und den Beweis, warum eine Schale bereits genügen würde. Das ist kein Schönheitsfehler: genau eine solche unpräzise Docstring-Aussage hat in diesem Sprint schon einmal zu einer falschen Inhaberentscheidung geführt (D-108).

2. Eine Verifikationslücke, die bestehen bleibt. Die EditMode-Spur, die den Gameplay-Ausdruck pinnt, läuft in keiner CI (tests.yml fährt nur die headless-Kette). Die headless-Spur pinnt nur ihren eigenen Spiegel. Eine einseitige Drift von GlutrinneTerrainMap.cs bliebe in der CI also dauerhaft grün. Das ist die konkrete Rechnung, die die offene Hälfte von #110 aufmacht — ein manueller EditMode-Lauf ist hier das eigentliche Merge-Gate, und er steht aus.

3. Ein blinder Fleck im Erreichbarkeitstest. IntegrationField.Generate sät die Zielzelle ohne Begehbarkeitsprüfung. Ein Feld, das künftig unter einer Wand läge, würde als „erreichbar" gelten. Heute liegt kein Feld auf einer Wand, und die Zell-Pins fangen es ab — aber der Test verspricht mehr, als er hält. Simulation/Pathfinding/ gehört dem Einheitenstrang; der Befund geht als eigenes Issue raus.

Nachweis

  • dotnet test tools/Nova.SimRunner.Tests -c Release: 736/736 grün — vom Orchestrator auf frischem main unabhängig nachgefahren, vor und nach der Docstring-Korrektur
  • Die Geometrie ist per Königszug-Flutung nachgerechnet: 168 Zellen, keine Leckage, die vier Öffnungen sind die einzigen Durchgänge
  • Keine Baseline bewegt sich — die vier Golden-Gruppen pinnen Wire-Formate und PRNG, keinen Karteninhalt
  • Nicht belegt: die EditMode- und PlayMode-Spuren (siehe Befund 2), die Optik, und wie sich die Karte spielt. Sprint 21 verlangt in seinem „Fertig wenn" ausdrücklich eine gespielte Runde — sie steht aus

Herkunft

Gebaut von Kimi K3 als delegiertem Worker gegen die Sprintdatei als bindende Vorgabe, gegengelesen von einem zweiten unabhängigen Kimi-Lauf, Geometrie und Testkette vom Orchestrator nachgerechnet. Beide Berichte folgen im Doku-PR.

@cubetribe
cubetribe merged commit 79f9da0 into main Aug 29, 2026
7 checks passed
@cubetribe
cubetribe deleted the feat/s21-7-mitte-als-gebiet branch August 29, 2026 10:40
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.

1 participant