Skip to content

fix(ai): nicht laenger endlos auf dem leeren Aetheriumfeld ernten PR (#85) - #97

Open
arn-c0de wants to merge 1 commit into
VibecodingGermany:mainfrom
arn-c0de:fix/ai-harvest-exhausted-field
Open

fix(ai): nicht laenger endlos auf dem leeren Aetheriumfeld ernten PR (#85) #97
arn-c0de wants to merge 1 commit into
VibecodingGermany:mainfrom
arn-c0de:fix/ai-harvest-exhausted-field

Conversation

@arn-c0de

Copy link
Copy Markdown
Collaborator

Was & Warum

Die KI kam nach Erschöpfung ihres Startvorkommens wirtschaftlich zum Stillstand (#85) — kein Strategiemangel, sondern ein Livelock: TryGetOwnFieldCell wählte das Erntefeld allein nach Distanz zum HQ, der EconomySystem räumte den Befehl auf dem leeren Feld sofort wieder, und genau dieses Räumen liess den Harvester in die Leerlaufliste fallen, aus der die KI ihn jeden Entscheidungstick auf dasselbe leere Feld zurückschickte. Die Erntewahl überspringt erschöpfte Felder jetzt; ist keines mehr übrig, ruhen Nachbestellung und Erntebefehle, statt Kommandos ins Leere zu schicken.

Checkliste

  • dotnet test tools/Nova.SimRunner.Tests lokal grün
  • Zeile unter [Unreleased] in CHANGELOG.md
  • Echte Entscheidung getroffen? → D-ID im DecisionLog — keine; die zwei Abwägungen unten sind Umsetzungsentscheidungen innerhalb des Einheitenstrangs und stehen als Begründung im Code
  • Bei Simulationsänderung: keine Determinismus-Baseline im selben PR geändert

Externe Beiträge

  • I agree to the Contributor License Agreement

Aus dem Betatest vom 10.08.2026 (Issue VibecodingGermany#85): die KI kam nach Erschoepfung
ihres Startvorkommens wirtschaftlich zum Stillstand.

Das war kein Strategiemangel, sondern ein LIVELOCK aus einer fehlenden
Pruefung. TryGetOwnFieldCell waehlte das Erntefeld allein nach Distanz zum
HQ und sah IsExhausted nicht an. Der EconomySystem raeumt beim leeren Feld
HarvestFieldId, genau dieses Raeumen liess den Harvester in die
Leerlaufliste der KI fallen, und die schickte ihn auf dasselbe leere Feld
zurueck — jeden Entscheidungstick, bei Einkommen null, waehrend die drei
Felder abseits der Startpositionen mit 33.000 AE offenstanden.

Der Spielerpfad filtert erschoepfte Felder seit den endlichen Feldern
(VibecodingGermany#80) korrekt; nachgezogen wurde damals nur eine der beiden Stellen.

ZWEI ENTSCHEIDUNGEN ueber das geforderte Minimum hinaus, beide mit Grund:

- Der PLATZIERUNGSANKER filtert bewusst weiter nicht. TryGetOwnFieldCell
  hat eine zweite Aufrufstelle, die das naechste Feld als Anker fuer "wo
  ist meine Basis" benutzt. Filtert man dort mit, setzt ein nachgebautes
  Refinery sich ans naechste Feld MIT Reserve — auf dieser Karte das
  umkaempfte Zentrum oder die Gegenecke. Das ist eine strategische
  Entscheidung, und sie als Nebenwirkung zu treffen waere schlechter, als
  sie offen zu lassen.
- Der RUECKWEG bleibt bedient. Den ganzen Wirtschaftsschritt zu
  ueberspringen, wenn kein Feld mehr uebrig ist, haette einen kleineren
  neuen Defekt erzeugt: ein Harvester mit letzter Ladung ausserhalb der
  Abladereichweite bleibt dann stehen, weil ein gehaltener Rueckwegbefehl
  nur durch die KI aufgeloest wird. Gegattert sind deshalb nur die
  feldabhaengigen Teile.

BELEGE

- Neuer Test SkirmishAiFieldExhaustionTests: ein kleines Feld naeher am HQ
  wird leergemint, danach darf es nie wieder zugewiesen werden und die KI
  muss anderswo weiterernten. Gegenprobe gefahren — mit abgeschalteter
  Pruefung faellt er mit genau diesem Befund.
- 708/708 gruen, keine der vier Baseline-Dateien angefasst.
- Die kanonische Partie ist BYTE-IDENTISCH (Tick 3.213, Endzustand
  0xE002DD893916967B, alle Laborartefakte gleich): dort erschoepft sich
  kein Feld, die neue Bedingung greift also nie. Anders als im Issue
  vermutet wird damit keine Determinismus-Baseline rot, und es braucht
  keinen zweiten PR.
- IM LAUFENDEN SPIEL GESEHEN: eine Partie auf diesem Stand gespielt. Die
  Harvester fahren nach dem Startvorkommen zu anderen Quellen, und es
  kommen weiter neue Einheiten, bis alles zerstoert ist.

Ein Nebenbefund fuer die Werkzeugkiste: der Executor nimmt einen
Erntebefehl auf ein leeres Feld an, die Economy raeumt ihn danach. Der
Defekt erzeugte also NULL abgelehnte Intents — die Spalte
intentsRejected, die im Labor als Fruehwarnsignal gilt, kann diese
Fehlerklasse grundsaetzlich nicht sehen.

AiBehaviorId.Revision bleibt bei 7: die kanonische Partie entscheidet
unveraendert, und 8 ist bereits an das Basisverteidigungs-Verhalten
vergeben — zwei verschiedene Staende duerfen sich keine Kennung teilen.
@arn-c0de
arn-c0de requested a review from cubetribe as a code owner August 10, 2026 20:06
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