Skip to content

feat(ai): KI-Profile als Datenschicht (Nova.AI.Data) — Stufe 1 von 5, verhaltensneutral - #36

Merged
cubetribe merged 2 commits into
VibecodingGermany:mainfrom
arn-c0de:refactor/ai-profile-data-layer
Aug 9, 2026
Merged

feat(ai): KI-Profile als Datenschicht (Nova.AI.Data) — Stufe 1 von 5, verhaltensneutral#36
cubetribe merged 2 commits into
VibecodingGermany:mainfrom
arn-c0de:refactor/ai-profile-data-layer

Conversation

@arn-c0de

@arn-c0de arn-c0de commented Aug 9, 2026

Copy link
Copy Markdown
Collaborator

Stufe 1 von 5 des Einheitenstrangs — diese zuerst.
Reihenfolge: 1 Datenschicht → 2 Zielwahl → 3 Wellen → 4 Rückzug → 5 HUD (optional).
Die Branches sind gestapelt: 2 zweigt von 1 ab, 3 von 2 und so weiter. Wird 1
gemergt, rebased sich 2 von selbst. Jede Stufe ist für sich grün und für sich
lauffähig.

Was & Warum

Die Stellschrauben der Skirmish-KI lagen an zwei Orten: als Konstruktor-Defaults
auf AiFactionProfile und als const-Felder in SkirmishAiSystem. Tunen hiess
damit Verhaltenscode editieren, und vier Werte — Kadenz, Suchradius, beide
Queue-Batches — waren von aussen gar nicht erreichbar. Sie liegen jetzt
vollständig in einem AiProfile unter Nova.AI.Data.

Dieser PR ändert kein Verhalten. Er ist bewusst der erste: er läuft den
ganzen CI-Weg samt der neuen Wächter einmal durch, ohne dass Verhalten zur
Debatte steht.

Der Nachweis, dass er neutral ist

Das ausgelieferte Profil ms1-canonical trägt die bisherigen acht Zahlen
wertgleich — Strommarge 0, Armee 12, Angriffsschwelle 6, Harvester 2, Kadenz 20,
Suchradius 8, beide Batches 2. Nichts wurde gerundet oder „verbessert". Die vier
Determinismus-Baselines bleiben grün, und genau das ist der Nachweis.

Was sich ändert

Datei Was
AI.Data/AiProfile.cs (neu) der Werttyp, readonly struct, Gleichheit über alle Werte
AI.Data/AiProfiles.cs (neu) ms1-canonical und legacy-defaults
AI.Data/Nova.AI.Data.asmdef noEngineReferences: true
AI/AiFactionProfile.cs dünner Griff über ein AiProfile, Signatur unverändert
AI/Nova.AI.asmdef Referenz auf Nova.AI.Data
AI/SkirmishAiSystem.cs liest die Zahlen aus dem Profil; zwei veraltete Doku-Behauptungen korrigiert
tools/Nova.SimRunner.Tests/AiProfileTests.cs (neu) 8 Tests
tools/Nova.SimRunner.Tests/…csproj AI.Data/ in die geteilten Quellen

MatchRunner ist nicht angefasst — deshalb blieb die Signatur von
AiFactionProfile unverändert.

Zwei Vorarbeiten sind mit erledigt: AiFactionProfile verglich bisher nur den
Fraktionsnamen
, sodass zwei Profile mit gleichem Namen und verschiedenen Zahlen
als gleich galten — was erst beim Tunen auffällt, wo genau das der Regelfall ist.
Und Nova.AI.Data ist jetzt strukturell enginefrei statt zufällig, kann also
keine FactionId nennen und unbemerkt zur zweiten Definitionstabelle werden.

Tests

dotnet test tools/Nova.SimRunner.Tests -c Release561/561 grün, die vier
Determinismus-Baselines inbegriffen und nicht angefasst.

Im laufenden Spiel gesehen

Nichts — dieser PR ändert kein Verhalten, es gibt nichts zu sehen.

Die Stufen 3 und 4 sind inzwischen gespielt worden und tragen die Beobachtung
im eigenen Text; Stufe 2 ist gemessen, aber im Spiel nicht erkennbar und sagt das
dort auch.

Was noch kommt

Stufe Inhalt Verhalten Stand
1 Datenschicht unverändert dieser PR, 561/561
2 Zielwahl nach Score, Verhaltensbezeichner r1r2 gebaut, 562/562, einseitig gemessen
3 Angriff in Wellen r2r3 gebaut, 564/564, einseitig gemessen
4 Rückzug angeschlagener Einheiten r3r4 gebaut, 565/565, einseitig gemessen
5 Drei Werkzeuge zum Zusehen Anzeige gebaut, optional, fasst fremdes Terrain an

Alle fünf sind gebaut, getestet und zusammen als Integrationsstand geprüft
(565/565, Determinismus über 24 Seeds ohne Abweichung). Sie kommen einzeln,
damit jede für sich beurteilbar bleibt.

Checkliste

  • dotnet test tools/Nova.SimRunner.Tests lokal grün — 561/561
  • Zeile unter [Unreleased] in CHANGELOG.md
  • Bei Simulationsänderung: keine Determinismus-Baseline im selben PR geändert

Externe Beiträge

  • I agree to the Contributor License Agreement

@arn-c0de arn-c0de changed the title KI-Profile als Datenschicht (Nova.AI.Data) — Stufe 1 von 5, verhaltensneutral feat(ai): KI-Profile als Datenschicht (Nova.AI.Data) — Stufe 1 von 5, verhaltensneutral Aug 9, 2026

@cubetribe cubetribe left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Geprüft: vollständiger Diff-Audit des Stapels (Determinismus, Bösartigkeit unter feindseliger Annahme, Cheat-Fläche, Korrektheit, Beweislage, Vertragsflächen), jeder Fund gegengeprüft.

Kein Bösartigkeitsbefund. Der Determinismus ist sauber: kein float/double, keine Hash-Container, keine instabile Iterationsreihenfolge, Zielwahl mit vollständigem Tiebreaker. Die acht migrierten Zahlen wurden unabhängig gegen MatchRunner.cs:243-247 und SkirmishAiSystem.cs:94-103 verifiziert — sie stimmen wertgleich.

CI ist nach Freigabe der Fork-Läufe grün: tests, docs-check, integrity, baseline-guard.

Eine Anmerkung ohne Blockwirkung: Der Changelog nennt die vier Determinismus-Baselines als Neutralitätsnachweis. Die führen die Skirmish-KI nicht aus — was du selbst zwei Stufen später dokumentierst. Der reale Nachweis dieser Stufe sind die handgeschriebenen Literale in AiProfileTests. Ziehe ich beim Aufräumen nach.

Angenommen.

Die Stellschrauben der Skirmish-KI lagen an zwei Orten: als
Konstruktor-Defaults auf AiFactionProfile und als const-Felder in
SkirmishAiSystem. Tunen hiess damit Verhaltenscode editieren, und vier
Werte (Kadenz, Suchradius, beide Queue-Batches) waren von aussen gar
nicht erreichbar. Sie liegen jetzt vollstaendig in einem AiProfile
unter Nova.AI.Data.

VERHALTENSNEUTRAL, und das ist der Nachweis, nicht die Absicht: Das
ausgelieferte Profil ms1-canonical traegt die bisherigen acht Zahlen
wertgleich (Strommarge 0, Armee 12, Angriffsschwelle 6, Harvester 2,
Kadenz 20, Suchradius 8, Batches 2). Nichts wurde gerundet oder
"verbessert". Die vier Determinismus-Baselines bleiben gruen, 561/561
SimRunner-Tests.

Die Signatur von AiFactionProfile und SkirmishAiSystem bleibt
unveraendert, damit MatchRunner nicht angefasst werden muss - der
gehoert dem Netzstrang.

Zwei Vorarbeiten sind mit erledigt. AiFactionProfile verglich bisher
NUR den Fraktionsnamen, sodass zwei Profile mit gleichem Namen und
verschiedenen Zahlen als gleich galten; das faellt erst beim Tunen auf,
wo genau das der Regelfall ist. Und Nova.AI.Data steht auf
noEngineReferences: true, ist also strukturell enginefrei statt
zufaellig - eine Profilklasse kann so keine FactionId nennen und
unbemerkt zur zweiten Definitionstabelle werden.

Dazu zwei veraltete Behauptungen in der Klassendoku von
SkirmishAiSystem: GB-002 "kein Auto-Acquire" gilt seit D-087 nicht mehr,
und SetRallyPoint wird sehr wohl akzeptiert (IsProducerRole liest
producerRole: Refinery aus der Definitionstabelle). Der Code galt, die
Doku nicht.

(cherry picked from commit c5deb5c)
@cubetribe
cubetribe force-pushed the refactor/ai-profile-data-layer branch from 6aa4681 to 23729f3 Compare August 9, 2026 12:41
@cubetribe
cubetribe merged commit 51d673b into VibecodingGermany:main Aug 9, 2026
7 checks passed
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.

2 participants