11# Roadmap
22
3- Stages 1–6 (repair, honesty pass, GitHub Pages) are done. What follows is the
4- creative work that was deliberately deferred — scoped here so it isn't lost.
3+ Stages 1–6 (repair, honesty pass, GitHub Pages) are done. Stage 7 (7.1–7.3) is
4+ done. What follows is what's left, plus a record of what Stage 7 chose * not* to
5+ build and why.
56
67Ordered by payoff.
78
89---
910
10- ## Stage 7 — Making it cooler
11-
12- The repair made the game * work* . This makes it * good* . The two items at the top
13- are the ones that would change how the game feels most, and both are called out
14- as limitations in the README today.
15-
16- ### 7.1 Give alignment teeth
11+ ## Stage 7 — Making it cooler — ** done (7.1–7.3)**
12+
13+ The repair made the game * work* . This makes it * good* .
14+
15+ ### 7.1 Give alignment teeth — ** done**
16+
17+ Shipped as ` src/game/alignment.ts ` (bands at ±40, ` upgradeCost ` , the live gate,
18+ ` endingFor ` ), a ` costAxis ` tag on the upgrade data, four new band-exclusive
19+ upgrades including two capstones, and ` src/game/endings.test.ts ` — three
20+ headless runs to victory landing on three different endings.
21+
22+ Two things came out differently from the scoping below, both worth knowing:
23+
24+ - ** The gate is live, not an unlock.** ` reqNpus ` / ` reqTrust ` / ` reqPhase ` latch
25+ on forever; ` reqAlignmentAbove ` / ` reqAlignmentBelow ` are re-checked at
26+ purchase, inside ` buyUpgrade ` . If a band gate latched, you could collect both
27+ sides' content by oscillating, and the axis would be a checkpoint rather than
28+ a commitment.
29+ - ** The two capstones are priced in different currencies, on purpose.** Every
30+ trust-granting upgrade in the game is alignment-positive, so a Cyberpunk run
31+ reaches Phase 3 with a fraction of a Solarpunk run's trust — and therefore its
32+ memory, and therefore its operations ceiling. Pricing both capstones in ops
33+ looked perfectly symmetric and made the Cyberpunk ending unreachable in
34+ practice. The headless run is what caught it; nothing about reading the file
35+ would have.
36+
37+ ** Different win conditions per ending: deliberately not done.** The scoping
38+ below says "ideally, different win conditions", and it's the one item here I'd
39+ push back on. The obvious framing — a Solarpunk victory requires leaving some of
40+ the universe unconverted — is vacuous at this game's numbers. Exploration
41+ advances at ` probes × speed × nav × 2e-9 ` per tick while harvesting takes
42+ ` probes × harvester × 100 ` , so reaching 100% exploration costs on the order of
43+ ` 5e12 ` grams out of ` 6e18 ` available: about one millionth. Any restraint
44+ condition stated in terms of matter preserved is met without the player doing
45+ anything, and shipping it would have been a mechanic that reads as real and
46+ isn't — which is precisely the failure mode
47+ [ LESSONS-FROM-AI-STUDIO.md] ( LESSONS-FROM-AI-STUDIO.md ) is about. What's shipped
48+ instead makes the * ending* something you build (band + capstone), which is a
49+ real fork with a real cost, and leaves the victory condition honest and single.
50+
51+ A genuinely different win condition would need a different Phase 3 economy — one
52+ where consumption and exploration actually compete for the same swarm. That's a
53+ bigger change than Stage 7 was scoped for; it belongs in its own item if anyone
54+ wants it.
55+
56+ <details >
57+ <summary >Original scoping for 7.1</summary >
1758
1859** The problem.** The Solarpunk/Cyberpunk axis is the best original idea in the
1960project and it is currently paint. ` alignment ` swaps two Tailwind colour families
@@ -37,7 +78,25 @@ what unlocks, or how the game ends. Full Solarpunk (+100) and full Cyberpunk
3778mechanics, and most of the plumbing (the alignment number, the flavour strings,
3879a single unlock check) already exists.
3980
40- ### 7.2 Let the interface enact the story
81+ </details >
82+
83+ ### 7.2 Let the interface enact the story — ** done**
84+
85+ Phase transitions are events now. The outgoing phase's panels stay mounted for
86+ ` PHASE_DEMOLITION_MS ` and are visibly destroyed — shaken, desaturated, collapsed
87+ — under a banner naming what was taken (` PhaseTransition.tsx ` , ` panel-demolish `
88+ in ` index.css ` ). The compute panel, the one thing that survives every
89+ transition, stays bright while the rest comes down. Phase 3 collapses to the
90+ swarm view: the swarm panel goes double-width, the compute block is demoted to a
91+ strip along the bottom. The frame widens once per phase and never narrows. In
92+ Overseer mode the pricing and procurement directives stop being rendered once
93+ there is nobody left to sell to.
94+
95+ Keep ` PHASE_DEMOLITION_MS ` in App.tsx and the keyframe durations in ` index.css `
96+ in step, or panels unmount mid-animation.
97+
98+ <details >
99+ <summary >Original scoping for 7.2</summary >
41100
42101** The problem.** Universal Paperclips' real achievement is that the UI * is* the
43102narrative — controls appear, the frame widens, and by the end you've forgotten
@@ -55,7 +114,29 @@ never chose to be — is *stated in flavour text* instead of enacted.
55114** Why:** this is mostly CSS and sequencing — cheap relative to its impact — and
56115it's the single biggest gap between this and the game it's paying tribute to.
57116
58- ### 7.3 Overseer drift
117+ </details >
118+
119+ ### 7.3 Overseer drift — ** done**
120+
121+ ` ScoredAction ` now carries ` utility ` and ` fit ` separately, with ` score ` derived
122+ from both, so drift is a matter of which number gets sorted on.
123+ ` overseer/drift.ts ` rolls it: zero below 8 trust, rising 2% per point, capped at
124+ 35%, and exactly zero while autonomy is revoked. Both engines route through
125+ ` applyDrift ` , so it applies whichever one is driving.
126+
127+ A departure only counts when the alternative is genuinely * both* higher-utility
128+ and less directive-compliant — swapping in something that agrees with you just
129+ as much would be noise, not drift. ` MAKE_DECISION ` now ranks both branches (with
130+ utility measured by actually applying each branch's effect and diffing the
131+ state), which is what gives drift something to defect * to* .
132+
133+ It is never silent: ` OverseerDecision.drift ` , a warning-level log entry, a badge
134+ on the deliberation panel, a running count in the Overseer panel, and a line in
135+ the ending. Revoking autonomy costs ` AUTONOMY_REVOKED_THROUGHPUT ` — 25% of
136+ everything — and is reversible.
137+
138+ <details >
139+ <summary >Original scoping for 7.3</summary >
59140
60141** The problem.** The Overseer is the strongest original idea and it cannot
61142surprise you. There's no tension between your directives and its behaviour —
@@ -72,6 +153,8 @@ latter as trust grows, and surfacing it loudly.
72153** Why:** it's the paperclip thesis, made playable, using machinery that already
73154exists.
74155
156+ </details >
157+
75158### 7.4 Deliberation as a first-class panel
76159
77160Promote the ranking from a strip in the thought terminal to its own panel: a
@@ -80,6 +163,11 @@ sliders, before you commit. With WebLLM active, show the model's rationale
80163alongside the utility engine's ranking for the same state, so you can watch the
81164two disagree.
82165
166+ Still worth doing: with WebLLM active, showing the model's rationale alongside
167+ the utility engine's ranking for the same state is now more interesting than it
168+ was, because the two can disagree about directive fit * and* about whether to
169+ honour it.
170+
83171### 7.5 Smaller wins
84172
85173- ** "While you were away" summary** — offline catch-up already computes this
0 commit comments