Skip to content

fix(construction): founding Harvester is born with a field order (#43, Sprint 16.1) - #68

Merged
cubetribe merged 4 commits into
mainfrom
feat/16-1-founding-harvester
Aug 9, 2026
Merged

fix(construction): founding Harvester is born with a field order (#43, Sprint 16.1)#68
cubetribe merged 4 commits into
mainfrom
feat/16-1-founding-harvester

Conversation

@cubetribe

Copy link
Copy Markdown
Collaborator

Was

Sprint 16.1 (Beta-Issue #43) — drei Korrekturen an ConstructionSystem.GrantFoundingHarvester:

  1. Auftrag bei der Geburt: Der geschenkte Sammler spawnt jetzt mit einem stehenden Ernteauftrag auf das nächstgelegene Feld mit Restreserve (EconomySystem.TryFindNearestField — Chebyshev-Distanz ab Footprint-Zentrum, Gleichstand zugunsten des kleineren Registrierungsindex, erschöpfte Felder übersprungen). Der Kreislauf startet von allein: Die Economy hält den Auftrag („held, not dropped"), die Fahrt übernehmen die bereits existierenden Eskorten (RtsDeviceInput.UpdateHarvesterEscort für den lokalen Spieler, SkirmishAiSystem für die KI) — beide lesen genau dieses Feld. Kein neuer CommandKind, kein neues Zustandsfeld; dasselbe direkte Schreibmuster wie SetTarget im Push-out desselben Systems.
  2. Latch: Die Schenkung feuert nur, solange der Besitzer keinen lebenden Sammler hat — abgeleitet per aufsteigendem Scan über den Einheitenbestand (Muster FindLowestIndexBuilder), nicht gespeichert. Ein Zählerfeld wäre Formatbruch im Economy-Block (TryParseState lehnt StateVersion != 2 ab). Zweite Raffinerie und Wiederaufbau schenken nichts mehr; verliert der Spieler alle Sammler, rüstet die Schenkung wieder auf — genau die Dead-End-Versicherung, für die sie existiert.
  3. Protokollierung: Jeder Fehlerweg — voller Entitätenspeicher, fehlende Fraktionsdefinition, keine freie Zelle in acht Ringen — schreibt eine LogWarn-Zeile statt still zu kehren. Der Latch-Fall und der Spawn ohne registriertes Feld sind LogInfo.

Betroffene Bereiche

  • Simulation/Construction/ConstructionSystem.cs (Grant, Latch, Logger — Netzstrang-Terrain)
  • Simulation/Economy/EconomySystem.cs (nur additiv: TryFindNearestField)
  • Tests: tools/Nova.SimRunner.Tests/ConstructionSystemTests.cs + EditMode-Spiegel
  • CHANGELOG: eine Zeile unter [Unreleased]

Spiegel-Drift geschlossen: Die Grant-Tests der .NET-Lane (GrantsTheFirstHarvesterFree, PlaceCompletedBuilding_Refinery_GrantsNothing, Helfer CountUnits) waren nie in den EditMode-Spiegel gewandert. Beide Kopien sind jetzt wieder zeilensynchron (bis auf Lane-Kopf/Namespace/sealed), inklusive vier neuer Tests: Auftragsziel, Fall ohne Felder, Latch, Wiederaufrüstung.

Baseline-Erwartung (wichtig)

Das Determinism10000-Drehbuch stellt eine Raffinerie per Baustelle fertig — der Grant feuert dort, und der Sammler trägt ab jetzt HarvestFieldId != 0 im serialisierten Zustand. Die Golden-Byte-Tests werden in diesem PR erwartbar rot. Das ist der dokumentierte Ablauf: Die Baseline-Neusetzung kommt als eigener PR mit altem und neuem Wert. Ich kann sie auf dieser Maschine nicht erzeugen (global.json pinnt SDK 8.0.318 mit rollForward: disable, installiert ist 10.0.302) — sie braucht eine SDK-8-Umgebung.

Nachweis (ehrlich)

  • Kein lokaler dotnet test-Lauf möglich — Nachweis läuft über die CI. Vier neue Tests decken Auftragsziel, Latch, Wiederaufrüstung und den feldlosen Fall ab; bestehende Grant-Tests bleiben unverändert gültig.
  • Spiel-Sicht (steht aus): Der eigentliche Befund aus Sammler steht nach Fertigstellung der Raffinerie still, statt zu ernten #43 — „der Sammler fährt nach der ersten Raffinerie von allein los" — ist Presentation-Verhalten und in keiner CI ausführbar. Braucht eine gespielte Runde: erste Raffinerie fertigstellen, beobachten, ob der Gratis-Sammler ohne Spielerbefehl zum Feld fährt.

Changelog

Eine Zeile unter [Unreleased] → „#43: Der erste Sammler erntet von allein".

@cubetribe
cubetribe requested a review from travelhawk as a code owner August 9, 2026 16:32
Sprint 16.1, three corrections to GrantFoundingHarvester:

- ORDER: the granted Harvester now spawns with a standing harvest order
  on the nearest field with reserve left (Chebyshev from the footprint
  centre, ties to the lower registration index). The economy holds the
  order; the existing client/AI escorts drive the legs. No new command
  kind, no state field — same write class as the push-out's SetTarget.
- LATCH: the grant fires only while the owner has no living Harvester,
  derived from the unit store (a counter field would break the economy
  block's fixed per-slot layout). Second Refineries and rebuilds no
  longer hand out free Harvesters; losing every Harvester re-arms the
  grant, which is the dead-end insurance it exists for.
- LOGGING: every failure path (full entity store, missing faction
  definition, no free cell in 8 rings) logs instead of returning
  silently.

Also closes the EditMode mirror drift: the .NET lane's grant tests were
never mirrored; both copies of ConstructionSystemTests are now in sync
again, including four new tests (order target, no-field case, latch,
re-arm).

Expected: golden-byte baselines move (the Determinism10000 scenario
completes a Refinery site, so the grant fires there with a different
state). Baseline reset lands in a SEPARATE PR per the standing rule;
it cannot be produced on this machine (global.json pins SDK 8.0.318,
only 10.0.302 installed) and needs an SDK-8 environment.
@cubetribe
cubetribe force-pushed the feat/16-1-founding-harvester branch from 2b9fe08 to d930a4e Compare August 9, 2026 17:52
Der Fixture-Konfigurator in ConstructionSystemTests registriert seit 16.1
Aetheriumfelder ueber GridPos2D. Der Typ liegt in Nova.Simulation.Pathfinding,
und das using fehlte in beiden Spiegeln - die CI brach mit CS0246 ab, bevor
ein einziger Test lief.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
cubetribe and others added 2 commits August 9, 2026 20:58
Der geschenkte Sammler startet seit 16.1 mit stehendem Ernteauftrag, damit
endet die kanonische KI-Partie in einer anderen Wirtschaftslage. Der
Entscheidungstick bleibt 2548, die KI-Kennung bleibt r5.779A1B5B - es hat sich
die Simulation bewegt, nicht die KI (D-101).

Alter Wert: 0x14472B2B943ED2BB
Neuer Wert: 0x8C0B54F31F2986B7

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@cubetribe
cubetribe merged commit 98fec23 into main Aug 9, 2026
7 checks passed
@cubetribe
cubetribe deleted the feat/16-1-founding-harvester branch August 9, 2026 19:03
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