Add game-simulation package with multi-run balance testing, fix stalled-pipeline trap
Adds a full simulation harness (game-simulation package) with greedy/random strategies, 36-metric diagnostics, multi-run orchestration via child processes, and a statistical interpreter. Includes 2.3x engine performance optimizations (research bonus caching, per-DC dirty tracking, reduced allocations in tick pipeline, single-pass loops). Fixes a critical balance bug where training pipelines stalled on insufficient VRAM would permanently block training slots — the engine never re-checked stalled pipelines, and the greedy strategy didn't pre-check VRAM requirements. This caused 20-25% of seeds to get stuck in Scale-up era. All three fixes (engine un-stalling, strategy VRAM pre-check, stalled pipeline cancellation) bring pass rate from 75% to 100% across 20 random seeds. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -68,13 +68,18 @@ function buildModelFleet(
|
||||
): ModelServingSlot[] {
|
||||
const slots: ModelServingSlot[] = [];
|
||||
|
||||
const deployedBases = modelsState.baseModels.filter(m => m.isDeployed);
|
||||
const deployedVariants: { variant: ModelVariant; baseModel: BaseModel }[] = [];
|
||||
const deployedBases: BaseModel[] = [];
|
||||
const baseModelById = new Map<string, BaseModel>();
|
||||
for (const m of modelsState.baseModels) {
|
||||
if (m.isDeployed) deployedBases.push(m);
|
||||
baseModelById.set(m.id, m);
|
||||
}
|
||||
|
||||
const deployedVariants: { variant: ModelVariant; baseModel: BaseModel }[] = [];
|
||||
for (const family of modelsState.families) {
|
||||
for (const variant of family.variants) {
|
||||
if (!variant.isDeployed) continue;
|
||||
const base = modelsState.baseModels.find(m => m.id === variant.baseModelId);
|
||||
const base = baseModelById.get(variant.baseModelId);
|
||||
if (base) deployedVariants.push({ variant, baseModel: base });
|
||||
}
|
||||
}
|
||||
@@ -173,7 +178,9 @@ function serveFromFleet(
|
||||
let degraded = 0;
|
||||
let qualityWeightedSum = 0;
|
||||
|
||||
const bestQuality = fleet.length > 0 ? Math.max(...fleet.map(s => s.qualityScore)) : 1;
|
||||
let bestQuality = 0;
|
||||
for (const s of fleet) { if (s.qualityScore > bestQuality) bestQuality = s.qualityScore; }
|
||||
if (bestQuality === 0) bestQuality = 1;
|
||||
const degradationActive = policy.autoDegradation.enabled && overallUtilization > policy.autoDegradation.triggerThreshold;
|
||||
|
||||
for (const slot of fleet) {
|
||||
|
||||
Reference in New Issue
Block a user