Design

10. Progression

Eras, the research tree, product features, and pacing targets.

Progression has three layers inside a company:

  1. Eras gate content by company stage. They decide which request kinds arrive and which research is available.

  2. Research spends Insight to unlock Components, variants, techniques, and visibility.

  3. Features spend Dev Hours to grow the market and change the request mix (Team and velocity).

Above the company, Exit and Legacy carries progress between companies.

Eras#

#EraMilestone to leaveMarket sizeNew kindsNew failure modeSLOApdex target
0Garage1,000 users1,500page, readOne box runs out of CPU, then RAM99%0.85
1Pre-seed5,000 users7,000write, loginDatabase contention, connections, a CPU-heavy kind99%0.86
2Seed25,000 users35,000search, upload, botUnlike workloads, abuse, large payloads99.5%0.88
3Series A150,000 users200,000media, rt, buy, bidZone failures, egress cost, money correctness, long-lived connections99.9%0.90
4Series B1,000,000 users1,400,000job, report, aiOLTP against OLAP, GPU economics, team scaling99.9%0.91
5Series C10,000,000 users14,000,000feed, hook, pushFan-out, hot keys, geography, region failures99.95%0.92
6Pre-IPO50,000,000 users and the IPO checklist70,000,000NoneCompliance, disaster recovery, margin99.95%0.93
7PublicNone (endless)Up to 6,000,000,000NoneQuarterly targets99.99%0.94

Market size is multiplied by features, regions, and Venture rules. It caps user growth inside an Era (Simulation).

Request mix by Era#

Shares of demand, in percent. Features and Ventures shift these shares.

KindGaragePre-seedSeedSeries ASeries BSeries C+
page604530211713
read403530252218
write15121098
login54332
search10876
upload4332
bot10877
media101010
rt888
buy333
bid111
job22
report32
ai56
feed8
hook2
push2

Era 0: Garage#

Garage is the tutorial, without tutorial screens. A player who wants to learn a later Era's mechanics first plays its Sandbox track.

  • Start. 150 users, $300, and one Burstable App Server running PHP with Apache mod_php and PostgreSQL on the same box, connected to Users and Payments. Analytics is linked to the box.

  • First choices, in order.

    1. Collect revenue from the Payments drawer.

    2. Upgrade the box (it is out of CPU credits).

    3. Research "Structured logs" or "Stripe Billing" with the first Insight.

    4. The box runs out of RAM because the database and Apache share it. Split the database onto its own Node. It is the classic first scaling step.

    5. Research "DNS round robin" or "Load balancing" and add a second App Server.

  • The lesson. Vertical scaling first, then the first horizontal step. Measure income per second.

  • Unlocks available. Stack: PHP-FPM, OPcache, Laravel, Ruby with Rails, Node.js with Express. Components: DNS, Load Balancer.

Era 1: Pre-seed#

  • New kinds. write changes the database from read-mostly to contended. login brings bcrypt, 80 ms of CPU per request.

  • New problems. The database is the bottleneck. More app servers exhaust Postgres connections. Node.js players see the event loop stall on login. PHP players see FPM workers wait on the database.

  • New systems. Hiring and Dev Hours (Team). Incidents begin, with types up to SEV2 only (Incidents).

  • Unlocks available. Cache, Connection Pooler, Read Replica, CI/CD Pipeline, Auth Provider, percentiles, alerting, Python, Node.js cluster mode.

Era 2: Seed#

  • New kinds. search needs a search engine (Postgres full-text search works at low volume). upload is CPU-heavy and large. bot earns nothing and costs capacity.

  • New problems. One App Server type cannot serve all kinds well. Work must be separated: CPU work to Workers through a Queue, bots blocked at the edge, payloads moved to Object Storage.

  • Unlocks available. WAF, CDN, Search Engine, Object Storage, Queue, Worker, distributed tracing, Go, Java, C#.

Era 3: Series A#

  • New kinds. media makes egress the largest bill line. rt holds connections open, which breaks process-per-request runtimes. buy is worth $25 and needs correctness: no stale reads, no double charges. bid is worth a tenth of a cent and has to answer inside 100 ms; every Venture serves a little of it, and Ad tech serves ten times as much (Exit and Legacy).

  • New problems. Availability. Zone outages begin, so a single database is a single point of failure. Users expect 99.9%.

  • New systems. Zones (Components), pricing models (Economy), SLOs and error budgets (Incidents), team types.

  • Unlocks available. Multi-zone, Kubernetes, Autoscaler, Serverless Functions, Realtime Hub, Document Store, Payment Provider, Feature Flags, canary deploys, Elixir, Rust.

Era 4: Series B#

  • New kinds. report scans tables and hurts the transactional database. job runs for seconds and must be asynchronous. ai needs GPUs or an LLM API.

  • New problems. Analytics and transactions must separate. GPU cost per prompt decides whether ai makes money. The team passes 15 people and coordination drops velocity.

  • New systems. Service splits (Team), data pipelines.

  • Unlocks available. Data Warehouse, Event Stream, CDC Connector, GPU Node, LLM API, Vector Index, Service Mesh, sharding, ARM instances.

Era 5: Series C#

  • New kinds. feed fans out. hook calls slow customer servers. push fans out on write.

  • New problems. Users are global. A single region gives users far away 200 ms of extra round trip, and each region's users leave on their own Apdex. Celebrity accounts create hot keys. Region outages begin.

  • New systems. Regions as separate boards, Users per region (Simulation), GeoDNS, regional demand peaks (follow the sun).

  • Unlocks available. Multi-region, GeoDNS, Infrastructure as code (Mirror a region), Anycast, Wide-column Store, Distributed SQL, Edge Functions, HTTP/3, hedged requests.

Era 6: Pre-IPO#

Pre-IPO brings no new kinds. Play shifts from growth to proof.

The IPO checklist. All items must be true at the same time:

ItemRequirement
Users50,000,000
Reliability99.95% availability over the last calendar week
SOC 2Research "SOC 2 program" and a Security team
Disaster recoveryA passed DR drill: RTO under 1 calendar hour, RPO under 5 calendar minutes
Data residencyEU users served from an EU region
Rule of 40Growth plus margin of at least 40 (Economy)

The list gives the late game concrete goals that are not "more users". It answers the missing end target that Upload Labs has (Influences).

Era 7: Public#

The company is listed, and play becomes an endless series of quarters.

  • A quarter lasts 7 calendar days (2 hours 48 minutes of real time at 1×).

  • At the start of each quarter, the player sets guidance: a revenue growth target and a margin target. Higher guidance raises the valuation multiple if met.

  • At the end, the market compares results to guidance. A beat raises the multiple. A miss lowers it. A streak of beats adds a bonus.

  • The player can Exit at any time in the Public Era. The payout uses the current market value (Exit and Legacy).

  • Growth slows near the online population. The late Public Era is about margin, regions, latency, and reliability.

Research#

Research costs Insight of named request kinds and takes time, and each item is a Study. Each item belongs to a track, needs an Era, and may need other items. The research screen shows the tree by track, with the locked items of the next Era visible so that the player can plan (Interface).

The track tables below list every item the game offers: 188 items across 10 tracks.

Recipes#

The ◇ column in the track tables is an item's total cost. Its recipe says which Insight pools pay it (Observability). The cost is split equally across the pools in the recipe.

Until Seed, the default recipe is the request kinds that the item's Era brings. From Series A, it is the kinds of the Era before. A Series A kind such as buy arrives only when its Feature ships, and the Checkout Feature itself needs research, so a Series A default of buy could never be paid.

EraDefault recipe
Garagepage, read
Pre-seedwrite, login
Seedsearch, upload
Series Asearch, upload
Series Bmedia, rt, buy
Series Cjob, report, ai
Pre-IPOEvery request kind except bot and bid
PublicEvery request kind except bot and bid

A player cannot study Series B research before Series A's Features bring their traffic, and more page traffic never buys it. Items that teach a new kind's problem ask for that kind, so the player ships the Feature first. The Feature is the production line for that kind's Insight, and no item a Feature needs costs the kind that Feature brings.

A Venture's request mix changes which recipes are cheap. Fintech serves 4× buy, so its Series A research is fast. Every Venture serves every request kind, so every recipe can be paid.

Reliability track rule. Half of every Reliability item's cost is Failure Insight. The other half uses the item's recipe.

Items whose recipe is not the default:

ItemRecipeWhy
logspageThe first traffic the player sees
metrics, query-analysis, eager-loadingreadSlow reads show the problem
percentilesread, loginbcrypt makes login the slow tail
alertingFailure, readAn alert needs something to fire on
health-checksFailure, readA check needs a Node that fails
cachingreadA cache serves reads
pooling, pitr, online-migrationswriteConnections and data loss show under writes
replication, ryw-routing, sharding, denormalizationread, writeThe read and write split
cache-strategiesread, writeEach strategy differs on writes
stampede-protectionread, FailureA stampede is a failure on cached reads
full-text-searchsearch
object-storageupload
cdn, http2, http3page, uploadStatic assets and payloads
waf, bot-managementbotBots teach how bots behave
credential-protectionlogin, botCredential stuffing is bot login
funnelspage, loginSign-up is the funnel
auth-providerlogin
idempotency-keysbuyRetried charges
notificationspush
websocketsrt
tiered-cachingmedia
esipage, media
slo-dashboardsFailure, buyThe budget protects the money path
sync-replication, consensuswrite, buyMoney cannot be lost
data-warehouse, precomputereport
cdcreport, write
outboxbuy, jobDual writes between money and jobs
embeddingsai, search
hosted-models, model-serving, quantization, continuous-batchingai
hybrid-fanout, leaderlessfeedHot keys come from celebrity feeds
rumpage, feedLatency from the user's side
tail-samplingFailureIt keeps the failed traces
anomaly-detectionFailure, feed, hook, push

Breadth. Some Observability items also need their recipe kinds sampled at a number of Component types. A trace needs more than one hop.

ItemBreadth
tracing3 Component types
profiling4 Component types
rumSampled in 2 regions

The rum rule reads the Ledger's breadthRegions. Each of its kinds must be sampled by an Analytics tap on a Node in two regions, so the Study stalls until a second region has its own tap.

Studies#

A Study runs one item. One Study runs at a time; the player queues up to 8, reorders them, and can switch the running Study. A switched Study keeps its progress, as in Factorio. The effect starts when the Study completes.

EraBase duration
Garage20 s
Pre-seed1 min
Seed2 min
Series A4 min
Series B8 min
Series C15 min
Pre-IPO30 min
Public60 min

A Study takes its Insight as it runs, like a Factorio lab takes packs. In each Step:

draw(pool)=cost(pool)×speed×dtbase durationprogress(next)=progress+speed×dt×min⁡(1, balance(pool)/draw(pool))the lowest ratio across the recipe’s pools\begin{aligned} \text{draw} \left(\text{pool}\right) &= \text{cost} \left(\text{pool}\right) \times \text{speed} \times \frac{\text{dt}}{\text{base duration}} \\ \text{progress} \left(\text{next}\right) &= \text{progress} + \text{speed} \times \text{dt} \times \operatorname{min}\left(1{,}\ \text{balance} \left(\text{pool}\right) / \text{draw} \left(\text{pool}\right)\right) \\ &\quad \text{the lowest ratio across the recipe's pools} \end{aligned}

Each pool pays draw(pool) times the same factor. When a pool is empty, the Study runs at the rate that pool earns, so the scarcest kind limits it. Traffic falls at night, so a buy Study slows at night. The player can start a Study with no Insight saved.

A Study stalls when a recipe pool earns nothing and holds less than the Study still draws, or when the Design samples its kinds at too few Component types. A stalled running Study holds every Study behind it. The queue row, the Insight card, and the item's card mark a stalled Study and say why: the pool that earns nothing, and the Feature that brings its kind when one does, such as Password login for login. Queueing a stalled item says the same. While the running Study is stalled, a teammate's Mail waits in Needs action with an Open Research button; its Thread resolves when the Study moves again or leaves the queue.

speed is 1, and two things raise it:

  • A Spike. A Team takes the running Study as its backlog item (Team). While it does, speed × 2. A Spike whose Study is not running waits, and no Team takes it.

  • Study-speed research. trace-search and notebooks add +25% each.

Studies run offline (Simulation). A postmortem's action item puts its Study first in the queue (Incidents).

Cost bands#

The ◇ column in the track tables is a Study's list price. A Study charges that price times its Era's price scale: ×2 in Seed and ×1.5 in Series A, ×1 in every other Era. The bands below are the charged range.

EraCost range (◇)
Garage10–60
Pre-seed60–300
Seed600–3,000
Series A1,500–8,000
Series B8,000–40,000
Series C40,000–200,000
Pre-IPO200,000–1,000,000
Public1,000,000–10,000,000

Track: Infrastructure#

IDNameEra◇RequiresEffect
dns-rrDNS round robinGarage15NoneDNS Component
load-balancingLoad balancingGarage25NoneLoad Balancer (L7, round robin and weighted)
health-checksHealth checksPre-seed90load-balancingHealth-checked DNS, deep checks, check intervals
lb-algorithmsLoad balancing algorithmsPre-seed120load-balancingLeast connections, power of two choices, consistent hashing
auth-providerManaged identityPre-seed140NoneAuth Provider; logins stop costing your CPU
background-jobsBackground jobsSeed300NoneWorker
queuesMessage queuesSeed600background-jobsQueue (RabbitMQ, SQS)
cdnContent deliverySeed350NoneCDN
wafWeb application firewallSeed500NoneWAF
l4-lbL4 load balancingSeed400lb-algorithmsL4 variant
multi-azMultiple zonesSeries A3,000health-checksZone placement
autoscalingAutoscalingSeries A4,000load-balancingAutoscaler
containersContainer orchestrationSeries A5,000autoscalingKubernetes Cluster
serverlessServerlessSeries A3,500NoneServerless Function
websocketsWebSocketsSeries A2,500NoneRealtime Hub
api-gatewayAPI gatewaySeries A2,000load-balancingAPI Gateway
rate-limitingRate limitingSeries A1,800api-gatewayToken bucket limits on the gateway
tiered-cachingTiered cachingSeries A2,000cdnCDN media hit ratio 92%
esiEdge-side includesSeries A3,000cdn+20% page hit ratio for logged-in users
bot-managementBot managementSeries A2,500wafChallenges suspicious clients; lowers false positives
scheduled-scalingScheduled scalingSeries B9,000autoscalingScale ahead of the daily peak
service-meshService meshSeries B20,000containersService Mesh
arm-instancesARM instancesSeries B12,000NoneARM family, 0.8× price
hosted-modelsHosted modelsSeries B8,000NoneLLM API
model-servingModel servingSeries B15,000NoneGPU Node
quantizationQuantizationSeries B18,000model-servingINT8 and INT4 options
continuous-batchingContinuous batchingSeries B25,000model-servingBatch throughput without the latency cost
multi-regionMultiple regionsSeries C60,000multi-azRegions as boards
geo-dnsGeoDNSSeries C50,000multi-regionRoute users to the nearest region
infra-as-codeInfrastructure as codeSeries C40,000multi-regionPick an IaC tool; Mirror a region (Components)
gitopsGitOpsSeries C90,000infra-as-codeMirrors sync on their own, all at once or staged (Components)
anycastAnycastSeries C120,000geo-dns−20 ms on the user hop everywhere
edge-computeEdge computeSeries C80,000cdnEdge Function
notificationsNotificationsSeries C40,000NonePush Provider

Each option is wired to its Component (05 "Load Balancer", "CDN", "WAF", "Autoscaler", "App Server", "GPU Node"): the L4 variant, the Gateway's token bucket, Edge-side includes' 20 points of page, Bot management's half false positives, Scheduled scaling's lead on the peak, the ARM family at 0.8× the price, and the GPU's INT8/INT4 and batch sizes.

Track: Data#

IDNameEra◇RequiresEffect
query-analysisQuery analysis (EXPLAIN)Garage40NoneShows unindexed query shapes; enables "Add index"
cachingCachingPre-seed80NoneCache (Redis, Memcached), cache-aside
poolingConnection poolingPre-seed120NoneConnection Pooler
replicationRead replicasPre-seed220NoneRead Replica (asynchronous)
cache-strategiesCache strategiesSeed600cachingRead-through, write-through, write-behind
stampede-protectionStampede protectionSeed900cachingCoalescing, early expiration, stale-while-revalidate
full-text-searchFull-text searchSeed450NoneSearch Engine
object-storageObject storageSeed500NoneObject Storage
pitrPoint-in-time recoverySeed700NoneBackup options
cache-warmingCache warmingSeries A2,000stampede-protectionWarm before traffic
sync-replicationSynchronous replicationSeries A2,500replicationSynchronous replica option
ryw-routingRead-your-writes routingSeries A3,000replicationRemoves most stale after writes
lifecycle-rulesStorage lifecycle rulesSeries A1,500object-storageAutomatic storage classes
document-dbDocument databasesSeries A3,500NoneDocument Store
online-migrationsOnline schema migrationsSeries A4,000query-analysisMigrations without table locks
event-streamingEvent streamingSeries B15,000queuesEvent Stream
data-warehouseData warehousingSeries B12,000NoneData Warehouse
cdcChange data captureSeries B18,000event-streaming, data-warehouseCDC Connector
outboxTransactional outboxSeries B14,000queuesRemoves dual-write divergence
shardingShardingSeries B25,000replicationDatabase partitioning
expand-contractExpand and contractSeries B10,000online-migrationsZero-lock schema changes
embeddingsEmbeddingsSeries B16,000NoneVector Index
hybrid-fanoutHybrid fan-outSeries C90,000cachingPush for normal accounts, pull for celebrities
leaderlessLeaderless replicationSeries C70,000shardingWide-column Store with tunable quorums
consensusConsensus databasesSeries C150,000sync-replicationDistributed SQL
retentionRetention policiesPre-IPO250,000NoneArchive or delete old data

With online-migrations, a migration does not hold a big table's lock (Incidents). expand-contract removes what is left of it, and outbox takes dual-write divergence out of the Search Engine's answers (Data tier).

Track: Reliability#

IDNameEra◇RequiresEffect
timeoutsTimeouts and retriesPre-seed60NoneLink timeout and naive retries
ciContinuous deliveryPre-seed100NoneCI/CD Pipeline, with Recreate and Rolling
backoff-jitterBackoff with jitterSeed400timeoutsRetry policy option
cert-automationCertificate automationSeed300NoneSecrets and Certificates
blue-greenBlue-green deploysSeed900ciBlue-green deploy strategy
feature-flagsFeature flagsSeed800ciFeature Flags
circuit-breakersCircuit breakersSeries A2,500backoff-jitterLink option
bulkheadsBulkheadsSeries A3,500circuit-breakersLink option
load-sheddingPriority load sheddingSeries A4,000timeoutsWhen saturated, drop the lowest-value kinds first
graceful-degradationGraceful degradationSeries A3,000feature-flagsTurn off expensive features automatically during overload
canaryCanary deploysSeries A3,000ci, percentilesCanary deploy strategy
on-callOn-call rotationSeries A2,000alertingFaster triage; incidents page the player
error-budgetsError budgetsSeries A3,000slo-dashboardsVelocity bonus with budget left, freeze when spent
runbooksRunbooksSeries A5,000on-callAutomatic mitigation for known incident types
restore-drillsRestore drillsSeries A2,000pitrRemoves the failed-restore chance
idempotency-keysIdempotency keysSeries A1,500checkoutA retried charge never charges twice
hedged-requestsHedged requestsSeries C100,000tracingSend a second request after the p95; cuts the tail, adds load
chaos-engineeringChaos engineeringPre-IPO300,000runbooksScheduled failure injection that earns Failure Insight and reveals weak spots
dr-drillsDisaster recovery drillsPre-IPO400,000restore-drills, multi-regionRun the DR drill for the IPO checklist
leap-smearingLeap smearingSeries C60,000NoneA clock never jumps, so no timer fires twice (Incidents)

Four items act on incidents. With on-call the rotation answers the page. With runbooks a written runbook resolves its incident kind by itself (Incidents). With leap-smearing a clock jump does not time out a region.

bulkheads, graceful-degradation, hedged-requests and chaos-engineering each add a behavior (Components):

  • bulkheads: a Link option that frees a caller's slot after 1,000 ms.

  • graceful-degradation: a saturated App Server drops its dearest kinds first.

  • hedged-requests: a Link races a second copy.

  • chaos-engineering: scheduled experiments fail the weakest Node and pay Failure Insight.

Track: Observability#

Observability explains what each step reveals.

IDNameEra◇RequiresEffect
logsStructured logsGarage20NoneError breakdown by cause
metricsMetricsGarage50NoneHistory graphs per Node; the Dashboard
percentilesPercentilesPre-seed150metricsp50, p95, p99 on cards
alertingAlertingPre-seed250metricsPager banner before users notice
tracingDistributed tracingSeed800percentilesPer-kind waterfalls; bottleneck per kind
slo-dashboardsSLO dashboardsSeries A2,500percentilesError budget panel
profilingContinuous profilingSeries A3,000tracingCPU, wait, GC, and lock time per Node; names the limit
trace-searchTrace searchSeed600tracingStudies +25% speed
tail-samplingTail-based samplingSeries B10,000tracingKeep slow and failed traces: ×2 Failure Insight
notebooksNotebooksSeries B12,000trace-searchStudies +25% speed
rumReal user monitoringSeries C50,000tracingLatency per region and device
anomaly-detectionAnomaly detectionSeries C80,000alertingEarly warnings before an incident peaks

profiling names each Node's limiting resource and arrives with the Resources (USE) row (Observability); it carries tracing's breadth rule at 4 Component types. tail-sampling doubles Failure Insight. rum adds a device split (desktop, mobile, and tablet) to the Users row; the device shares and each one's extra round trip are the game's own stylization. anomaly-detection halves how long a threshold must hold before the pager fires, and adds a forecast line at tomorrow's peak, projected from the known diurnal cycle rather than fit from history.

Track: Performance#

IDNameEra◇RequiresEffect
keepaliveConnection reuseGarage25None−1 ms per internal hop (no new TCP handshake)
gzipCompressionGarage30page, read, search, bot, report and feed payload −70%, +CPU
eager-loadingEager loadingPre-seed100NoneEnables the "Eager loading" task
http2HTTP/2Seed350−15% user hop latency on page
denormalizationDenormalizationSeries A3,000NoneRead cost −30%, write cost +20%
precomputeMaterialized viewsSeries B12,000Nonereport cost −50%, data is stale by the refresh interval
binary-rpcBinary RPC between servicesSeries B15,000NoneInter-service serialization CPU −50%
http3HTTP/3Series C60,000http2−20% user hop latency for distant and mobile users

Denormalization takes 30% off a read's CPU and adds 20% to a write's, Materialized views halve a report's scan, and Binary RPC halves the CPU a Node spends serialising its calls (Data tier).

Track: Runtimes#

PHP is the starting language. Each other language needs its research, and each variant needs its language (Runtimes).

IDNameEra◇Requires
php-fpmPHP-FPMGarage25None
opcacheOPcacheGarage45php-fpm
lang-rubyRubyGarage30None
lang-nodeNode.jsGarage40None
lang-pythonPythonPre-seed120None
node-clusterNode.js cluster modePre-seed100lang-node
libuv-poollibuv thread poolPre-seed120lang-node
lang-goGoSeed600None
lang-javaJavaSeed800None
lang-csharpC#Seed800None
php-jitPHP JITSeed500opcache
worker-threadsNode.js worker threadsSeed500lang-node
yjitYJITSeed400lang-ruby
geventgeventSeed400lang-python
asgiASGI with UvicornSeed500lang-python
lang-elixirElixirSeries A2,500None
lang-rustRustSeries A4,000None
lang-zigZigSeries A3,500None
lang-haskellHaskellSeries A3,000None
php-worker-modePHP worker modeSeries A2,500php-fpm
swooleSwooleSeries A3,000php-fpm
bunBunSeries A2,000lang-node
denoDenoSeries A2,000lang-node
falconFalconSeries A2,000lang-ruby
pypyPyPySeries A2,500lang-python
virtual-threadsJava virtual threadsSeries A3,000lang-java
webfluxSpring WebFluxSeries A3,000lang-java
fasthttpfasthttpSeries A2,000lang-go
gogc-tuningGo GC tuningSeries A2,500lang-go
spawn-blockingTokio blocking poolSeries A3,000lang-rust
zgcZGCSeries B9,000lang-java
graal-nativeGraalVM native imageSeries B12,000lang-java
native-aot.NET Native AOTSeries B10,000lang-csharp
distributed-erlangDistributed ErlangSeries B12,000lang-elixir
nifsNIFsSeries B10,000lang-elixir
jemallocjemallocSeries B8,000lang-rust
free-threadingFree-threaded PythonSeries C50,000lang-python

Track: Frameworks#

FrameworkEra◇Requires
LaravelGarage20None
RailsGarage30lang-ruby
ExpressGarage30lang-node
SymfonyPre-seed80None
SinatraPre-seed60lang-ruby
DjangoPre-seed150lang-python
FlaskPre-seed100lang-python
FastAPISeed500asgi
FastifySeed400lang-node
Next.jsSeed600lang-node
Spring BootSeed900lang-java
ASP.NET CoreSeed900lang-csharp
GinSeed700lang-go
NestJSSeries A2,000lang-node
FiberSeries A2,000fasthttp
PhoenixSeries A2,500lang-elixir
AxumSeries A3,000lang-rust
Actix WebSeries A3,000lang-rust
QuarkusSeries B10,000lang-java

Track: Security#

IDNameEra◇RequiresEffect
tls-everywhereTLS everywhereSeed300NoneEncrypts internal links; +0.2 ms per hop; required for SOC 2
secrets-managementSecrets managementSeed400NoneRemoves the "Leaked credentials" incident
credential-protectionCredential stuffing protectionSeries A2,500rate-limitingBlocks bot login bursts
dependency-scanningDependency scanningSeries A3,000ciSupply-chain incident chance −70%
encryption-at-restEncryption at restSeries B9,000NoneRequired for SOC 2
pen-testingPenetration testingPre-IPO200,000NoneReveals one weakness per calendar week
soc2SOC 2 programPre-IPO300,000tls-everywhere, encryption-at-rest, dependency-scanningIPO checklist item
gdpr-residencyData residency controlsPre-IPO350,000multi-regionIPO checklist item
security-teamSecurity teamPre-IPO200,000NoneTeam type
spam-filterSpam filterPre-seed300NonePostbox filter setting; spam sorts into its own folder

credential-protection cuts the Credential stuffing incident's weakness and its bot-login magnitude once a WAF is also in place. pen-testing reveals one weakness a calendar week: it finds the Design's highest-weakness incident kind (the same score the director weighs incidents by) and opens its prevention research as an action item, the same way a Postmortem does.

Track: Cost#

IDNameEra◇RequiresEffect
reserved-instancesReserved instancesSeries A2,000autoscalingReserved pricing model
spot-instancesSpot instancesSeries A3,000autoscalingSpot pricing model
rightsizingRightsizing reportSeries A2,500metricsMarks Nodes below 30% utilization at peak
egress-optimizationEgress optimizationSeries A3,500object-storageR2 variant; egress line breakdown
unit-economicsUnit economicsSeries B8,000NoneCost per request for each kind
cost-allocationCost allocationSeries B10,000unit-economicsCost per service and team
savings-plansSavings plansPre-IPO250,000reserved-instances−20% compute with no per-Node lock

reserved-instances and spot-instances unlock the two pricing models on a compute Node from Series A (Economy). rightsizing marks a Node whose peak utilization stayed under 30% over its kept history, in the Inspector. It reads the client-side Inspector history, not a Ledger field, so it needs no save change. egress-optimization moves upload and media traffic that reaches an Object Storage Node onto an R2-priced path at $0 origin egress, lowering the Egress line by that share (Economy). unit-economics and cost-allocation split Burn by request kind and by the Service that owns each kind's code, shown in the cloud bill panel. savings-plans takes a further 20% off every compute Node's box, on top of whichever pricing model it already runs, with no per-Node commitment. These five numbers are the game's own rates.

Track: Product and business#

IDNameEra◇RequiresEffect
stripeStripe BillingGarage30NonePayments collect automatically
funnelsFunnel analyticsPre-seed150NoneGrowth +10%
code-reviewCode reviewPre-seed120NoneShows hidden costs of features before they ship
testing-cultureAutomated testsPre-seed150ciBad-deploy chance −30%
ab-testingA/B testingSeed700funnels, feature-flagsMeasures each Feature's lift against a holdout group
hiring-pipelineHiring pipelineSeed600NoneTime to hire −30%
trunk-basedTrunk-based developmentSeed800ciDeploy frequency +50%
platform-teamPlatform teamSeries A3,000containersTeam type
sre-teamSRE teamSeries A4,000on-callTeam type
checkoutCheckoutSeries A1,500NonePayment Provider and the Checkout Feature
service-boundariesService boundariesSeries B15,000NoneSplit a Service
data-teamData teamSeries B10,000data-warehouseTeam type
enterprise-salesEnterprise salesSeries B20,000NoneSigns the SLA: a missed week costs SLA credits
investor-relationsInvestor relationsPre-IPO300,000NoneValuation multiple +2
guidance-modelingGuidance modelingPublic1,000,000NoneShows the probability of beating each guidance level

Each item does what its Effect column says:

  • ab-testing reads a Feature's lift and its interval on the Team card, between 5% and 50% rollout (Measured lift).

  • hiring-pipeline takes 30% off the time to hire.

  • trunk-based raises the deploy frequency by half, on top of the policy's own cap.

  • platform-team and data-team unlock their team types (Team). A Platform team runs the Clusters and halves deploy time; a Data team makes report and ai Features cost 30% less and halves a CDC pipeline's lag.

  • sre-team unlocks the SRE team.

  • enterprise-sales signs the SLA and its credits.

Pacing targets for the first company#

The times are measured, not targeted: the Balanced bot at the live pace (pacing model), at SIM_VERSION 17 on seeds 1 and 3, reaches each Era at the sim minutes below. The numbers are re-measured when the tuning changes.

EraMeasured time from start (sim minutes)
Pre-seed5.8
Seed20.5–21.1
Series A65.5
Series B102–106