v1.12.0 Economy Rebalance - #18
Draft
NeverEndingCode wants to merge 14 commits into
Draft
Conversation
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
Verification
382 math tests pass (baseline 355; 27 added). Client builds clean.
A correction worth reading:
tools/pace.mjswas not reproducible — it started its timeline atDate.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 pinsT0and takesSEED.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 overcoreBonusCap/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 tomainfirst, then this. Retargeted frommainso the diff shows only the v1.12 work.