Skip to content

v1.12.0 Economy Rebalance - #18

Draft
NeverEndingCode wants to merge 14 commits into
v1.11-risk-reliabilityfrom
v1.12-balance-audit
Draft

v1.12.0 Economy Rebalance#18
NeverEndingCode wants to merge 14 commits into
v1.11-risk-reliabilityfrom
v1.12-balance-audit

Conversation

@NeverEndingCode

@NeverEndingCode NeverEndingCode commented Aug 10, 2026

Copy link
Copy Markdown
Owner

Implements docs/superpowers/specs/2026-08-09-economy-rebalance-design.md.

A daily player now reaches tiers 0-9 in the first four days and tier 10 around day 18. Previously the entire 14-tier ladder fell inside two weeks, with a Singularity available every single day.

The rack ladder itself was never the problem — in isolation it was a clean doubling curve. Every reward system layered on top multiplied progression by ~21x.

Headline fixes

  • Signal Boost scaled the anomaly boost's duration as well as its payout, so at max level a 2-4x global multiplier was permanently active (measured 55% boost uptime). Now 3.6-4.2%.
  • Singularity was a strict downgrade at every scale — it zeroes Legacy Cores and returned far less than it destroyed. Only survivable because cores regrew within a day. Cores now plateau at a cap, and the yield is linear rather than sqrt.
  • The v1.11 supply economy was EV-negative (1.00x / 0.30x / 0.19x) against a 1.89% total drag. Now 3.51x / 2.40x / 3.24x against 9.4%.
  • Overheating was binary — unreachable if you tapped vent, catastrophic if you didn't. Now a real band: idle-stable to 49 nodes/tier, 121 while tapping.
  • Event ladders used absolute FLOPS targets that cleared in under 0.02s. Now expressed in seconds of your own output, snapshotted at join.

Verification

382 math tests pass (baseline 355; 27 added). Client builds clean.

A correction worth reading: tools/pace.mjs was not reproducible — it started its timeline at Date.now(), so UTC day boundaries and Cold Storage alignment depended on when you ran it. The sandbox that scored 7/8 during calibration re-scored 5/8 unchanged. The harness now pins T0 and takes SEED.

Across five seeds, 12 of 16 criteria hold. A3/A4/A6/A7 are marginal: tier 13 lands inside 45 days in 2 of 5 seeds, and the first Singularity is consistently ~1 day late. The shipped shared/ reproduces the reference sandbox exactly, so this is a calibration gap rather than an implementation defect — see spec §6.1.2. Closing it needs one more sweep over coreBonusCap / shardsPerCore / RATIO, read across seeds.

Existing saves are unaffected in balance terms; no progress is rewritten.

🤖 Generated with Claude Code

https://claude.ai/code/session_01CrAuQoUELvtgcMiicB4RAU


Stacked on v1.11-risk-reliability, which is itself unmerged. Merge v1.11 to main first, then this. Retargeted from main so the diff shows only the v1.12 work.

Evan Phyillaier and others added 14 commits August 9, 2026 14:49
Drives the real shared/ engine rather than re-deriving the math: four
harnesses under tools/ measure the core loop in isolation, ablate each
layered subsystem, and pace a daily player over 45 days.

Headline findings: the core rack ladder is well-shaped, but the systems
layered on it multiply progression ~21x (tier 9 in 55min vs 19.8h). Signal
Boost scales anomaly boost DURATION, making a 2-4x global multiplier
permanent. The v1.11 supply economy is EV-negative (1.00/0.30/0.19x) against
a 1.89% total drag. Overheating is binary - unreachable if you tap vent,
catastrophic if you don't. Event ladders use absolute FLOPS targets that
clear in under 0.02s. And Singularity is a strict downgrade at every scale,
which is masked today only because cores regrow within a day.

The spec is a draft for owner review; §6 records what is verified and the
calibration passes still outstanding.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ten parallel sweeps over ~70 configurations, generated by tools/mksandbox.py
and graded by tools/score.py.

Two fixes were discovered during calibration and are now part of the design.
Singularity yield must be LINEAR in cores, not sqrt: once the core bonus is
capped, sqrt(400) returns 20 shards against a multi-thousand-shard tree, so
the meta layer can never progress and the late tiers keep no engine. And the
Engine node needs a longer tail (maxLevel 8 -> 12), because at 8 levels
"tier 13 is reachable" and "the shard tree is still a goal at day 45" are
provably mutually exclusive.

Also recorded: migrateExponent must be ~1.0 rather than 0.42 (the divisor is
pinned by first-Migrate timing, leaving the exponent as the only dial that
reaches the cap), and two player-model bugs in the harness that produced
confidently wrong results until fixed - migrating at the earliest profitable
moment, and never entering an endgame push phase.

Resulting curve for a 60min/day player: tiers 0-9 in four days, tier 10 at
day 18, first Singularity day 21, tier 13 day 44, shard tree 38% at day 45.
Shipped, for comparison, delivers all 14 tiers by day 14 and a Singularity
every day.

A2 and A15 are revised against evidence rather than met; both revisions are
argued in §6.2 and §6.3.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Implements the calibrated design in
docs/superpowers/specs/2026-08-09-economy-rebalance-design.md. Each task is
TDD-shaped with the actual test and implementation code inline, and ends with
an independently testable deliverable.

Appendix A enumerates the 22 existing tests these changes break, across 6
files, assigned to the task that causes each one. That list was produced
empirically - the suite was run against the finished math and every failure
recorded - rather than guessed, which caught roughly twice as many breakages
as reading the diff suggested.

Notable ordering constraint: Task 1 lands the config surface first because
every later task reads from it. migrateGain, singularity, rungProgress and
joinEventIfEligible all change signature; every call site including the two
in client/src/RackStack.jsx is named explicitly.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Adds 21 tunables covering reward magnitudes that were hardcoded - anomaly
payouts, heat per-level rates, the prestige curve, the balance minigame
coefficient - and lands the recalibrated heat/anomaly/risk/minigame values.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
baseCost is re-derived as baseProd * 10 * 2.50^tier, so the cost:production
ratio grows ~2.5x per tier instead of ~1.95x. baseProd is untouched, which is
what keeps goals, contracts and existing saves meaningful. Tier 0 stays cheap
(5); tier 13 becomes 65x dearer.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Heat per-level rates and the discount floor now come from config instead of
being literals, and the curve is retuned so passive venting can sustain a real
fleet - attention is worth ~2.5x the sustainable fleet rather than ~26x.

The account-level output bonus is capped. It was uncapped while the repeatable
goals never run out, so level and therefore output grew forever.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
migrateGain becomes (lifetimeRun / 2e12) ** 1.0, replacing sqrt(L / 1e6) which
granted ~3,900 cores after one day. The divisor is pinned by first-Migrate
timing, so the exponent is the only dial that reaches the cap; near-linear is
safe only because the cap bounds it.

The core bonus now plateaus at 400 cores. That plateau is the gate that makes
Singularity worth taking at all.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Engine gains a longer tail (maxLevel 8 -> 12) so that reaching tier 13 and
leaving the shard tree unmaxed at day 45 stop being mutually exclusive - at 8
levels every calibration setting that reached tier 13 also maxed the tree.

Bootstrap drops to x3/level; maxed with Deep Cache it used to hand out 11M
credits at every Migrate. Echo Cores becomes a share of the gain rather than a
flat grant, which would otherwise be farmable by cheap repeat Migrates.

Also fixes four upgrade descriptions the rebalance turned into lies:
Bootstrap x10, Heat Sink -25%, Thermal -8%, Auto-Vent 0.5/sec.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Was floor(sqrt(cores)). With the core bonus now capped at 400, sqrt returned 20
shards against a ~17k-shard tree, so the meta layer could never progress. Once
cores are bounded the square root has nothing left to damp and only starves the
tree.

The client duplicated the same formula for its Singularity confirm modal; that
call site is updated too.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The headline defect. eventRewardMult scaled both the credit payout and the
boost DURATION, so at max Signal Boost the boost lasted 135-225s against a
70-150s respawn interval - a 2-4x global multiplier that was permanently on.
Measured boost uptime was 55% of session time, worth roughly +245% output.

Signal Boost now scales the payout only. The reward magnitudes come from
config rather than literals.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The balance minigame's wafer coefficient was a hardcoded 1.5, paying 562
wafers per 12-second game at max score with Lucky Silicon - about 2.5 hours of
minigames maxed every permanent upgrade in the game.

Drive failures and overheats now down the TOP owned rack tier instead of a
derived-random one. A random victim was unpredictable and usually trivial
(~1/14 of output); the top tier is legible and worth insuring against. Both
are switchable from the Balancing tab.

The random-vs-top test asserts the two paths genuinely differ - the derived
pick happened to select the top tier for the first timestamps tried, which
would have made the assertion pass for the wrong reason.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ladder rungs gain an optional unit: 'secondsOfOutput'. Absolute FLOPS targets
were the one reward system in the game not priced against the player's rate -
contracts and streaks already were - so the entire FLOPS ladder of every
seasonal event cleared in under 0.02 seconds.

Targets are materialised once at join time, the same snapshot rolloverContracts
uses and for the same reason: a rate-scaled target recomputed on every read
would recede as fast as the player approached it.

All four seasonal ladders are reseeded, with count rungs raised to suit each
event's duration and every literal FLOPS reward converted to wafers/tapes - a
FLOPS payout has exactly the scaling problem the targets did.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
server.overheated now carries { tierIndex } so the client can say which rack
went dark. It stays truthy, so every existing `if (server.overheated)` check
is unaffected.

The modal copy was also simply wrong: it still said the Overclock lane freezes
and "no nodes were lost", which described pre-v1.11 behaviour. Since v1.11 an
overheat downs a rack tier, and finding 2.7 was as much a legibility failure
as a math one - the penalty was never attributed to overclocking, so it read
as the game being broken.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ships the retuned economy and records an important correction to the
calibration record.

tools/pace.mjs was not reproducible: it started its timeline at Date.now(), so
UTC day boundaries (contract rollovers, streak claims) and the Cold Storage
track alignment depended on the time of day the run was launched. The sandbox
that scored 7/8 during calibration re-scored 5/8 when re-run unchanged. The
harness now pins T0 to a fixed epoch and takes SEED; two runs of a seed are
byte-identical.

Measured across five seeds, the implementation reproduces the reference
sandbox exactly, and 12 of 16 acceptance criteria hold. A3/A4/A6/A7 are
marginal - tier 13 lands inside 45 days in 2 of 5 seeds and the first
Singularity is consistently a day or two late. That is a calibration gap, not
an implementation defect, and spec 6.1.2 records it rather than the earlier
single-sample claim.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@NeverEndingCode
NeverEndingCode changed the base branch from main to v1.11-risk-reliability August 10, 2026 22:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant