Overhaul market system with shared TAM competition, multi-tier pricing, enterprise pipeline, and developer ecosystem
CI / build-and-push (push) Successful in 42s

Replaces the simplified single-subscriber market with a full competitive simulation:
shared TAM with softmax market shares across 4 segments, multi-tier consumer
subscriptions (Free/Plus/Pro/Team) and API tiers (Free/PAYG/Scale/Enterprise),
enterprise sales pipeline (Lead→Qualification→POC→Negotiation→Active→Renewal)
with SLA tracking, developer ecosystem flywheel, technology obsolescence pressure,
seasonal demand cycles, and two new product lines (Code Assistant, AI Agents Platform).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-25 08:30:24 -04:00
parent 4c1c0e9ff2
commit 09a5cb69a7
34 changed files with 2851 additions and 408 deletions
@@ -90,9 +90,9 @@ function triggerMarketBoom(multiplier: number) {
useGameStore.setState((s) => ({
market: {
...s.market,
consumers: {
...s.market.consumers,
totalSubscribers: Math.round(s.market.consumers.totalSubscribers * multiplier),
consumerTiers: {
...s.market.consumerTiers,
totalUsers: Math.round(s.market.consumerTiers.totalUsers * multiplier),
},
},
}));
@@ -75,10 +75,9 @@ export function StateInspectionTab() {
</Section>
<Section title="Market">
<Stat label="Subscribers" value={formatNumber(market.consumers.totalSubscribers)} />
<Stat label="Satisfaction" value={formatPercent(market.consumers.satisfaction)} />
<Stat label="Growth/tick" value={market.consumers.growthRatePerTick.toFixed(4)} />
<Stat label="Churn/tick" value={market.consumers.churnRatePerTick.toFixed(4)} />
<Stat label="Subscribers" value={formatNumber(market.consumerTiers.totalUsers)} />
<Stat label="Satisfaction" value={formatPercent(market.consumerTiers.satisfaction)} />
<Stat label="Viral Coeff" value={market.consumerTiers.viralCoefficient.toFixed(4)} />
<Stat label="Contracts" value={market.enterprise.activeContracts.length} />
<Stat label="API tok/tick" value={formatNumber(market.enterprise.totalApiCallsPerTick)} />
</Section>
@@ -12,7 +12,7 @@ export function CompanyStatsCard({ onClose }: { onClose: () => void }) {
const money = useGameStore((s) => s.economy.money);
const totalRevenue = useGameStore((s) => s.economy.totalRevenue);
const valuation = useGameStore((s) => s.economy.funding.valuation);
const subscribers = useGameStore((s) => s.market.consumers.totalSubscribers);
const subscribers = useGameStore((s) => s.market.consumerTiers.totalUsers);
const models = useGameStore((s) => s.models.baseModels.length);
const bestModel = useGameStore((s) => s.models.bestDeployedModelScore);
const reputation = useGameStore((s) => s.reputation.score);