Overhaul model system with multi-stage training, variants, benchmarks, and eval
CI / build-and-push (push) Successful in 32s

Replace the single-stage training + flat capability score with a realistic AI
development pipeline: pre-training with Chinchilla scaling laws, SFT with
specializations, alignment with safety/capability tradeoffs (RLHF/DPO/Constitutional),
model families with distillation/fine-tuning/quantization variants, named benchmark
suite with compute-costing eval jobs, and segment-specific market quality.

Phases 1-6 of the model rework plan: new types, engine rewrite, save migration,
training events/risk system, concurrent training, variant creation, benchmark
evaluation with leaderboard, and market integration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-25 07:36:34 -04:00
parent fc1f371c8c
commit 4c1c0e9ff2
24 changed files with 2157 additions and 357 deletions
@@ -107,9 +107,9 @@ export function StateInspectionTab() {
<Stat label="Completed" value={research.completedResearch.length} />
<Stat label="Points" value={research.researchPoints.toFixed(1)} />
<Stat label="Active" value={research.activeResearch?.researchId ?? 'None'} />
<Stat label="Models" value={models.trainedModels.length} />
<Stat label="Training" value={models.activeTraining?.modelName ?? 'None'} />
<Stat label="Deployed" value={models.trainedModels.filter(m => m.isDeployed).length} />
<Stat label="Models" value={models.baseModels.length} />
<Stat label="Training" value={models.activeTrainingPipelines.filter(p => p.status === 'active').length} />
<Stat label="Deployed" value={models.baseModels.filter(m => m.isDeployed).length} />
</Section>
</div>
);
@@ -111,12 +111,17 @@ function instantCompleteResearch() {
}
function instantCompleteTraining() {
const { activeTraining } = useGameStore.getState().models;
if (!activeTraining) return;
const { activeTrainingPipelines } = useGameStore.getState().models;
const active = activeTrainingPipelines.find(p => p.status === 'active');
if (!active) return;
useGameStore.setState((s) => ({
models: {
...s.models,
activeTraining: { ...activeTraining, progressTicks: activeTraining.totalTicks },
activeTrainingPipelines: s.models.activeTrainingPipelines.map(p =>
p.id === active.id
? { ...p, stages: { ...p.stages, pretraining: { ...p.stages.pretraining, progressTicks: p.stages.pretraining.totalTicks } } }
: p,
),
},
}));
}
@@ -137,7 +142,7 @@ function forceEra(era: Era) {
export function TimeCompletionTab() {
const [tickCount, setTickCount] = useState('100');
const activeResearch = useGameStore((s) => s.research.activeResearch);
const activeTraining = useGameStore((s) => s.models.activeTraining);
const activeTraining = useGameStore((s) => s.models.activeTrainingPipelines.find(p => p.status === 'active'));
const currentEra = useGameStore((s) => s.meta.currentEra);
const pipelineCount = useGameStore((s) =>
@@ -189,6 +194,7 @@ export function TimeCompletionTab() {
</DevButton>
<DevButton onClick={instantCompleteTraining} variant="success">
Training {activeTraining && `(${activeTraining.modelName})`}
</DevButton>
</div>
</div>
@@ -13,10 +13,8 @@ export function CompanyStatsCard({ onClose }: { onClose: () => void }) {
const totalRevenue = useGameStore((s) => s.economy.totalRevenue);
const valuation = useGameStore((s) => s.economy.funding.valuation);
const subscribers = useGameStore((s) => s.market.consumers.totalSubscribers);
const models = useGameStore((s) => s.models.trainedModels.length);
const bestModel = useGameStore((s) =>
s.models.trainedModels.reduce((best, m) => Math.max(best, m.benchmarkScore), 0),
);
const models = useGameStore((s) => s.models.baseModels.length);
const bestModel = useGameStore((s) => s.models.bestDeployedModelScore);
const reputation = useGameStore((s) => s.reputation.score);
const achievements = useGameStore((s) => s.achievements.unlocked.length);
const dataCenters = useGameStore((s) => s.infrastructure.totalDataCenterCount);