diff --git a/packages/game-simulation/src/analysis/report.ts b/packages/game-simulation/src/analysis/report.ts index f32b1d7..70f81ab 100644 --- a/packages/game-simulation/src/analysis/report.ts +++ b/packages/game-simulation/src/analysis/report.ts @@ -205,15 +205,35 @@ export function printConsoleReport(result: SimulationResult, config: SimulationC console.log(''); // --- System Interconnections --- - console.log(`System Interconnections (overall: ${interconnections.overallScore.toFixed(1)}/10):`); - for (const c of interconnections.connections) { - const bar = '#'.repeat(c.score) + '-'.repeat(10 - c.score); - console.log(` ${pad(`${c.from} -> ${c.to}`, 30)} [${bar}] ${c.score}/10 (${c.events} events)`); - } - if (interconnections.deadLinks.length > 0) { - console.log(` [!] Dead links (no observed effect):`); - for (const d of interconnections.deadLinks) { - console.log(` ${d.from} -> ${d.to}: ${d.evidence}`); + console.log(`System Interconnections (${interconnections.overallScore.toFixed(1)}/10):`); + const broken = interconnections.connections.filter(c => c.score <= 2); + const moderate = interconnections.connections.filter(c => c.score >= 3 && c.score <= 6); + const healthy = interconnections.connections.filter(c => c.score >= 7); + + if (broken.length === 0 && moderate.length === 0) { + console.log(` All ${interconnections.connections.length} links healthy.`); + } else { + if (broken.length > 0) { + console.log(' Broken:'); + for (const c of broken) { + const bar = '#'.repeat(c.score) + '-'.repeat(10 - c.score); + console.log(` [!!] ${pad(`${c.from} -> ${c.to}`, 28)} [${bar}] ${String(c.score).padStart(2)}/10`); + console.log(` ${c.diagnosis}`); + } + } + if (moderate.length > 0) { + console.log(' Moderate:'); + for (const c of moderate) { + const bar = '#'.repeat(c.score) + '-'.repeat(10 - c.score); + console.log(` [~~] ${pad(`${c.from} -> ${c.to}`, 28)} [${bar}] ${String(c.score).padStart(2)}/10 ${c.diagnosis}`); + } + } + if (healthy.length > 0) { + console.log(' Healthy:'); + for (const c of healthy) { + const bar = '#'.repeat(c.score) + '-'.repeat(10 - c.score); + console.log(` [ok] ${pad(`${c.from} -> ${c.to}`, 28)} [${bar}] ${String(c.score).padStart(2)}/10 (${c.events} ${c.eventLabel})`); + } } } console.log(''); diff --git a/packages/game-simulation/src/analysis/systemInterconnections.ts b/packages/game-simulation/src/analysis/systemInterconnections.ts index 7d8bb2a..58da56e 100644 --- a/packages/game-simulation/src/analysis/systemInterconnections.ts +++ b/packages/game-simulation/src/analysis/systemInterconnections.ts @@ -6,7 +6,9 @@ export interface SystemConnection { to: string; score: number; evidence: string; + diagnosis: string; events: number; + eventLabel: string; } export interface InterconnectionResult { @@ -139,11 +141,16 @@ export function analyzeSystemInterconnections( } } const score = events > 0 ? scoreFromDelta(totalDelta, events, 5) : 0; + const avgDelta = events > 0 ? (totalDelta / events).toFixed(1) : '0'; connections.push({ from: 'Research', to: 'Model Capability', score, events, + eventLabel: 'research completions', evidence: events > 0 - ? `${events} research completions, avg capability delta: ${(totalDelta / events).toFixed(1)}` + ? `${events} research completions, avg capability delta: ${avgDelta}` : 'No research completions observed', + diagnosis: score >= 7 ? 'Strong link' + : events === 0 ? 'No research completions observed' + : `Research completions did not improve model capability (avg delta: ${avgDelta})`, }); } @@ -162,9 +169,13 @@ export function analyzeSystemInterconnections( const score = events > 0 && totalDelta > 0 ? Math.min(10, Math.round((totalDelta / events / 100) * 10)) : 0; connections.push({ from: 'Research', to: 'Infrastructure', score, events, + eventLabel: 'research completions', evidence: events > 0 ? `${events} research completions, avg FLOPS delta: ${(totalDelta / events).toFixed(0)}` : 'No research completions observed', + diagnosis: score >= 7 ? 'Strong link' + : events === 0 ? 'No research completions observed' + : `Research completions did not increase compute FLOPS`, }); } @@ -181,11 +192,16 @@ export function analyzeSystemInterconnections( } } const score = events > 0 ? scoreFromDelta(totalDelta, events, 3) : 0; + const avgChange = events > 0 ? (totalDelta / events).toFixed(1) : '0'; connections.push({ from: 'Talent', to: 'Training', score, events, + eventLabel: 'hiring spikes', evidence: events > 0 - ? `${events} hiring spikes, avg capability change: ${(totalDelta / events).toFixed(1)}` + ? `${events} hiring spikes, avg capability change: ${avgChange}` : 'No significant hiring events observed', + diagnosis: score >= 7 ? 'Strong link' + : events === 0 ? 'No significant hiring events observed' + : `Hiring had no effect on training capability (avg delta: ${avgChange})`, }); } @@ -204,9 +220,13 @@ export function analyzeSystemInterconnections( const score = events > 0 && totalDelta > 0 ? Math.min(10, Math.round((totalDelta / events) * 5)) : 0; connections.push({ from: 'Talent', to: 'Enterprise', score, events, + eventLabel: 'hiring spikes', evidence: events > 0 ? `${events} hiring spikes, avg enterprise contract delta: ${(totalDelta / events).toFixed(1)}` : 'No hiring events observed', + diagnosis: score >= 7 ? 'Strong link' + : events === 0 ? 'No hiring events observed' + : `Hiring did not lead to enterprise contracts`, }); } @@ -225,9 +245,13 @@ export function analyzeSystemInterconnections( const score = events > 0 ? Math.min(10, Math.max(0, Math.round((totalDelta / events) * 20))) : 0; connections.push({ from: 'Infrastructure', to: 'Revenue', score, events, + eventLabel: 'compute expansions', evidence: events > 0 ? `${events} compute growth events, avg revenue growth: ${((totalDelta / events) * 100).toFixed(1)}%` : 'No compute growth events observed', + diagnosis: score >= 7 ? 'Strong link' + : events === 0 ? 'No compute growth events observed' + : `Compute growth did not increase revenue`, }); } @@ -249,9 +273,13 @@ export function analyzeSystemInterconnections( const score = events > 0 ? Math.min(10, Math.max(0, Math.round((totalDelta / events) * 10))) : 0; connections.push({ from: 'Models', to: 'Revenue', score, events, + eventLabel: 'model deployments', evidence: events > 0 ? `${events} model deployments, avg revenue change: ${((totalDelta / events) * 100).toFixed(1)}%` : 'No model deployments observed', + diagnosis: score >= 7 ? 'Strong link' + : events === 0 ? 'No model deployments observed' + : `Model deployments did not increase revenue`, }); } @@ -270,34 +298,13 @@ export function analyzeSystemInterconnections( const score = events > 0 && totalDelta > 0 ? Math.min(10, Math.round((totalDelta / events) * 5)) : 0; connections.push({ from: 'Models', to: 'Enterprise', score, events, + eventLabel: 'model deployments', evidence: events > 0 ? `${events} deployments, avg enterprise contract delta: ${(totalDelta / events).toFixed(1)}` : 'No model deployments observed', - }); - } - - // Reputation → Era gates - { - let score = 0; - const eraChanges = []; - for (let i = 1; i < metrics.length; i++) { - if (metrics[i].era !== metrics[i - 1].era) { - eraChanges.push({ tick: metrics[i].tick, repBefore: metrics[i - 1].reputation }); - } - } - if (eraChanges.length > 0) { - let bindingCount = 0; - for (const ec of eraChanges) { - const before = findMetricAtTick(metrics, ec.tick - 120); - if (before && (ec.repBefore - before.reputation) > 1) bindingCount++; - } - score = Math.min(10, Math.round((bindingCount / eraChanges.length) * 10)); - } - connections.push({ - from: 'Reputation', to: 'Era Gates', score, events: eraChanges.length, - evidence: eraChanges.length > 0 - ? `${eraChanges.length} era transitions observed` - : 'No era transitions observed', + diagnosis: score >= 7 ? 'Strong link' + : events === 0 ? 'No model deployments observed' + : `Model deployments did not attract enterprise contracts`, }); } @@ -320,9 +327,13 @@ export function analyzeSystemInterconnections( const score = events > 0 ? Math.min(10, Math.max(0, Math.round((totalDelta / events) * 10))) : 0; connections.push({ from: 'Funding', to: 'Growth', score, events, + eventLabel: 'funding rounds', evidence: events > 0 ? `${events} funding rounds, avg revenue growth: ${((totalDelta / events) * 100).toFixed(1)}%` : 'No funding rounds observed', + diagnosis: score >= 7 ? 'Strong link' + : events === 0 ? 'No funding rounds observed' + : `Funding rounds did not boost revenue`, }); } @@ -338,11 +349,16 @@ export function analyzeSystemInterconnections( } } const score = totalSamples > 0 ? Math.min(10, Math.round((wellUtilizedCount / totalSamples) * 10)) : 0; + const pct = totalSamples > 0 ? ((wellUtilizedCount / totalSamples) * 100).toFixed(1) : '0'; connections.push({ from: 'Compute', to: 'Serving', score, events: totalSamples, + eventLabel: 'utilization samples', evidence: totalSamples > 0 ? `${wellUtilizedCount}/${totalSamples} samples with healthy utilization (20-95%)` : 'No compute capacity observed', + diagnosis: score >= 7 ? 'Strong link' + : totalSamples === 0 ? 'No compute capacity observed' + : `Only ${wellUtilizedCount}/${totalSamples} samples (${pct}%) in healthy utilization range (20-95%)`, }); } diff --git a/packages/game-simulation/src/multirun.ts b/packages/game-simulation/src/multirun.ts index 8cecbd8..cfcc05c 100644 --- a/packages/game-simulation/src/multirun.ts +++ b/packages/game-simulation/src/multirun.ts @@ -63,7 +63,7 @@ interface WorkerResult { revenueStreamDiversity: number; }; systemInterconnections: { - connections: Array<{ from: string; to: string; score: number; evidence: string; events: number }>; + connections: Array<{ from: string; to: string; score: number; evidence: string; diagnosis: string; events: number; eventLabel: string }>; overallScore: number; }; cashFlow: { bankruptcyRisks: number };