I swept every map my machine can make. Twenty-nine thousand four hundred of them: two dials taken end to end, the globe spun through a full turn, each result scored out of 100 on area, angle and shape. Not one got all three needles past 47.
Good. That is the entire point of the machine. What I did not expect was that the sweep would also tell me my own tagline was wrong.
The machine is SOMETHING HAS TO STRETCH, a brass press that takes a school globe and squeezes it into a sheet of paper. I built it because on Friday the UN General Assembly voted 164 to 1 to drop Mercator as the picture of the world. Every headline ran the same line. Almost nobody printed the clause where the resolution exempts maritime and aerial navigation, which means Mercator keeps that job. The vote did not find Mercator wrong. It found Mercator in the wrong room.
Gauss settled the rest in 1827. Curvature is intrinsic to a surface, so a sphere cannot be laid flat without something giving. Not with better maths, not ever. The three brass gauges on the front of the press read AREA, ANGLE and SHAPE, and I wanted them measured off the real geometry rather than tuned by hand, because a difficulty curve dressed up as a theorem would be the one dishonest thing in a game about honesty.
Measured means the numbers get to argue back. They did.
Two dials, one family of projections
The press has a brass protractor arc and a spoked wheel. They are not two separate map modes with a crossfade. They are two parameters of one continuous projection:
/** Vertical mapping. Analytic, finite for k < 1, and -> sin(lat) as k -> 0. */
function yOf(lat: number, k: number): number {
const ks = Math.max(-0.99995, Math.min(0.99995, k * Math.sin(lat)))
return Math.atanh(ks) / k
}
/** Meridian convergence. 1 at kappa = 0 (rectangular), pinched at the poles at kappa = 1. */
function wOf(lat: number, k: number, kappa: number): number {
const s = Math.sin(lat)
return 1 - kappa * k * k * s * s
}
At k → 0, atanh(k sin φ)/k → sin φ, which is Lambert cylindrical equal-area. At k → 1 it is atanh(sin φ), which is Mercator. Every value between is a real projection, analytic and differentiable, which matters because the needles read its derivatives rather than a lookup table.
The same arithmetic exists twice, once in TypeScript for the scoring and once in GLSL for the mesh, and the GLSL half lives in the projection module as an exported string:
vec2 gotdProject(float lonRel, float lat, float k, float kappa) {
float s = sin(lat);
float ks = clamp(k * s, -0.99995, 0.99995);
float y = (0.5 * log((1.0 + ks) / (1.0 - ks))) / k;
float w = 1.0 - kappa * k * k * s * s;
return vec2(lonRel * w, y);
}
atanh(x) is 0.5 * log((1+x)/(1-x)) because GLSL ES has no atanh. The globe is a lat/lon grid, 217 by 109 vertices on a desktop and 129 by 65 on a phone, and every one of them gets placed by that function on every frame of the press, so the mesh and the gauges cannot quietly disagree about what the machine just did to the world.
One line of algebra is the whole news story
Differentiate the family and the areal scale falls out:
dy/dφ = cos φ / (1 − k² sin²φ)
dx/dλ = 1 − κ k² sin²φ
areal scale = (dx/dλ · dy/dφ) / cos φ
= (1 − κ k² sin²φ) / (1 − k² sin²φ)
Two things live in that fraction.
Set κ = 1 and the numerator becomes the denominator. The scale is exactly 1 at every latitude, for any k at all. The whole κ = 1 edge of the dial space is equal-area, which is why the second factor is in the family and not decoration.
Set κ = 0 and k = 1 and the scale is 1 / (1 − sin²φ), which is sec²φ. At 60° north that is 4. At 75° it is 14.9. Greenland sits between 60 and 83 degrees, Africa straddles the equator, and that single term is the entire Greenland argument that ran on every front page last week. Mercator did not decide to flatter the north. It decided to be conformal, and sec²φ is the bill.
The press keeps the receipt. metrics() measures the projected area of Greenland's polygons against every African country's, and a paper tape above the middle dial prints the live ratio next to TRUTH 1 : 14.5. I ran the presets through the shipped scorer:
| setting | AREA | ANGLE | SHAPE | Africa : Greenland |
|---|---|---|---|---|
| Mercator | 20.9 | 94.8 | 100.0 | 1.2 |
| Equal Earth | 100.0 | 18.9 | 53.2 | 14.0 |
| sinusoidal | 100.0 | 8.5 | 70.3 | 14.0 |
| Lambert equal-area | 100.0 | 14.8 | 41.9 | 14.0 |
On Mercator, Africa measures 1.2 times Greenland. It is 14 times larger. The row underneath is the map the UN voted for, and it pays in the next column along: ANGLE 18.9. That is exactly why the resolution carves out navigation.
The needles read derivatives, not a difficulty curve
AREA and ANGLE come out of one pass over 930 land cells. For each cell the scorer builds the Tissot indicatrix of the projection at that point, which is the ellipse a tiny circle on the globe turns into on the paper:
const h = Math.hypot(dxdp, dydp)
const kt = Math.hypot(dxdl, 0) / c
const j = Math.abs(dxdl * dydp)
const areal = j / c
AREA is the weighted spread of log(areal) across those cells, mapped through 100 * Math.exp(-2.6 * rms). A uniform scale error is not a lie about area, it is a lie about paper size, so the standard deviation is the right statistic and the mean is thrown away.
ANGLE is the mean angular deformation ω, the worst error any angle drawn through a point suffers, which is zero only where the projection is conformal. Inside this family, that is only Mercator. A rhumb test rides along with it: five constant bearings plotted across the sheet, each measured for maximum deviation from the straight line between its endpoints, because a captain holding one heading wants a straight line on paper and not merely local conformality.
SHAPE is the interesting one, and it is where the machine started teaching me things.

All three needles pegged. A sphere is an honest map of itself, so the distortion is not a property of the dial setting sitting there. It is something the player manufactures by pulling the lever.
A perfect score that does not exist
SHAPE takes each continent's 64-point outline, projects it, and Procrustes-fits it against how that continent looks from directly above its own centroid on the globe. The fit is a similarity transform, so translation, rotation and uniform scale are all free, and what is left over is genuine deformation.
That is normally an SVD. It does not have to be. In two dimensions a similarity transform is multiplication by a complex number, so the optimal rotation and scale accumulate in a single pass:
uu += a * a + b * b
// conj(u) * r accumulated -> the optimal complex scale+rotation
re += a * gx + b * gy
im += a * gy - b * gx
(re² + im²) / uu is the variance the best fit explains. Subtract it from the reference's own spread and the remainder is the residual.
Then the part I got wrong the first time. I scored that residual against zero, and the SHAPE needle never went above 41. Africa spans seventy degrees of latitude. Its silhouette on a globe is a projection of a curved surface onto a plane through a viewpoint at infinity, and no cylindrical projection can reproduce that, ever, at any dial setting. Zero was not a hard target. It was an unreachable one, and a gauge that can never pass 41 is a broken gauge.
So the floor is measured, not assumed:
// A continent 60 degrees across can never match its own globe silhouette exactly, so the best
// any flat map manages is a floor, not zero. Score against the floor or the needle never moves.
return 100 * Math.exp(-6.8 * Math.max(0, err - SHAPE_FLOOR))
}
/** Empirical best-case Procrustes residual over the dial space — measured, not guessed. */
const SHAPE_FLOOR = 0.248
That constant is Gauss with a number attached. 0.248 is how much shape a flat map loses no matter what, expressed as a normalised least-squares residual, found by sweeping the dial space and taking the minimum. Every scoring system built on a real model has one of these hiding in it, and if it is left at zero the top of the scale is decoration.
Where the tear lands changes the arithmetic
Because SHAPE fits each continent independently, a continent the seam runs through scores garbage. Not slightly worse. Garbage, because half of it has been teleported to the other end of the sheet and the similarity fit has no way to describe that.
Which means the central meridian, the thing that on any other map is purely a matter of taste, is load-bearing. I swept lon0 in 30 degree steps and took the best SHAPE reachable at each one, across the whole dial space:
| central meridian | best SHAPE | the seam runs through |
|---|---|---|
| 0° | 100.0 | nothing |
| 90°W | 100.0 | Bangladesh, India, Bhutan |
| 120°W | 95.7 | Iran, Turkmenistan, Uzbekistan |
| 60°E | 83.1 | United States of America, Canada |
| 30°E | 81.8 | United States of America |
| 30°W | 65.5 | Australia, Russia |
| 60°W | 49.1 | Australia, Indonesia, Philippines |
| 150°E | 45.7 | Russia, Greenland |
| 180° | 28.2 | Ghana, Burkina Faso, Mali |
| 150°W | 18.6 | South Africa, Zimbabwe, Zambia |
| 120°E | 15.3 | Antarctica, Argentina, Paraguay |
The two worst rows are the two meridians that run the tear down the length of Africa and South America, which carry the heaviest weights in the fit, 1.35 and 1.1. The best row tears nothing at all because the seam is sitting in the middle of the Pacific.
I had written "spin the globe so the tear lands in open water instead of through somebody's country" in the design notes as a strategy I would need to build. I never built it. It fell out of the measurement, because the measurement is real. That is the argument for honest scoring in one line: a fake number does what it is told, and a real one hands back strategy nobody wrote.
"Any two, never three" is three different sentences
Here is the sweep. 24 central meridians, 49 values of k, 25 values of κ, 29,400 maps, every one scored by the code that ships.
Zero of them had all three needles at 70 or better. Zero at 60. Zero at 50. Zero at 47. Six at 46. The best balanced map the machine can make reads AREA 46.4, ANGLE 46.9, SHAPE 61.0, and it is not a map anybody would want.
Then I looked at the pairs, and the tidy story fell apart:
| pair | best simultaneous score |
|---|---|
| ANGLE and SHAPE | 94.8 |
| AREA and SHAPE | 77.7 |
| AREA and ANGLE | 46.8 |
I had been saying "peg any two, never three" all night. It is not true. Two of the pairs are easy or affordable. The third one is not available at any price.
The reason is that AREA and ANGLE are the pair Gauss actually forbids. Equal-area and conformal are mutually exclusive properties of the same map, and both of my first two needles measure infinitesimal properties, which means they are competing over the exact same derivative at the exact same point. There is no room to negotiate. Every other combination has room, because SHAPE is a finite measure. It looks at a whole continent and asks whether the outline still reads, which leaves it free to shake hands with either of the other two.
Ten customers queue at the service window. Six of them care about exactly one needle. Three care about two, one per pair, and their targets went in before I ever ran the sweep:
| round | asks for | target | ceiling | margin |
|---|---|---|---|---|
| 6, an air charter | ANGLE and SHAPE | 72 | 94.8 | +22.8 |
| 7, a summit of middling powers | AREA and SHAPE | 76 | 77.7 | +1.7 |
| 9, a podcaster | AREA and ANGLE | 72 | 46.8 | -25.2 |
Round seven has a margin of 1.7 points across the entire dial space. Its source comment says the answer is roughly Equal Earth, and it costs the bearing, and the sweep agrees: at Equal Earth AREA is 100 and SHAPE is 53, so the only place the summit gets served is around k = 0.91, κ = 0.88, which is the equal-area edge walked back until the outlines recover. That is precisely the trade the UN spent a week arguing about.
Round nine is the one that cannot happen:
// 9 — impossible, by construction. Area and angle both at 72 is the Theorema Egregium.
// He fails, and the `lose` line is the whole game saying so out loud.
{
id: 'unflattened',
name: 'The Unflattened Podcast',
line: 'Honest sizes, honest bearings, and don’t say geometry at me. Four million people listen.',
needs: ['area', 'angle'],
target: 72,
He is not narrowly disappointed. He is short by twenty-five points, and there is no swipe, no spin and no dial setting anywhere in the machine that gets him closer. His failure line reads He told four million people the machine is rigged. It is. By Gauss, in 1827.
I wrote that round as an assertion. The sweep turned it into a proof.

Same three needles, mid-press. They leave 100 together and never arrive anywhere near each other.
The rhumb line, performed
The ANGLE needle is abstract until a ship walks it. Every round ends on a lantern slide that copies the player's own printed sheet onto a card and performs the consequence on it, so the first customer's straight bearing gets drawn on the exact map that came out of the rollers:

The bearing is plotted through the player's own projection parameters, and the miss is printed under the globe: 3,231 nautical miles.
The card is not a re-run of the scorer. It takes the ANGLE needle back the other way, into a bearing error in degrees:
// an honest map returns the bearing you can hold; a bent one does not
const errDeg = a.ok ? (1 - a.m.angle / 100) * 3.5 : 9 + (1 - a.m.angle / 100) * 26
Then it sails a genuine rhumb at that offset, from 6.3°W 36.5°N to Havana at 82.4°W 23.1°N, plotted through lon = A + tanβ · (ψ(lat) − ψ(A)) on the same isometric latitude the ANGLE needle uses. Math.abs(end[0] - B[0]) * 60 is the longitude gap at landfall in arcminutes, which is nautical miles, which is the 3,231 on the card.
Two ships run at once, and the whole argument is in the difference between them. On the printed sheet at the top of the card the course is drawn straight from port to Havana and it always arrives, which is exactly what the map promised. On the small globe underneath, the same bearing walks the same water and ends up off Newfoundland. The source comment on the first one is the shortest statement of the game I managed all night:
// the ship on the flat sheet always makes it — that is the lie
Honesty costs 1.6 milliseconds
None of this is free. I timed metrics() at 1.588 ms per evaluation on distinct parameters: 930 Tissot evaluations, 105 rhumb samples, seven Procrustes fits over 64 points each, an 85-latitude seam probe, and a polygon area integral over every ring in Greenland and fifty-one African countries.
At 60 Hz that is ten per cent of the frame gone to a gauge. So it does not run at 60 Hz:
// needles, at 18 Hz — the honest metric is not free
acc.current += dt
if (acc.current > 0.055) {
acc.current = 0
metricsRef.current = metrics({ k: l.k, kappa: l.kappa, lon0: l.lon0 })
}
Plus a single-entry cache keyed on the three parameters rounded to four decimals, which catches every frame where nothing moved. The needles themselves interpolate at 10 Hz between 100 and whatever the last measurement said, weighted by how far the press has travelled, so the motion is smooth while the truth underneath it is recomputed eighteen times a second. Nobody can see the difference, and the phone keeps its frame. Measured on four cores at 390 by 844, spinning and pressing throughout: median 16.7 ms, p95 18.4, 59.9 fps.
Sweep the space before writing a single threshold
The thing I would tell anyone building a scored system on top of a real model, in a game or anywhere else: the model has a shape, and nobody knows what it is until it gets swept. A few nested loops over the parameter space and a Math.min told me three things I had wrong.
That SHAPE had an unreachable ceiling of 41 out of 100, because I was scoring against a perfect fit that geometry does not permit.
That ANGLE was measuring the wrong thing, and could sit at 93 next to AREA at 93, which would have quietly destroyed the only rule the game has.
That "any two, never three" was three separate promises with ceilings of 94.8, 77.7 and 46.8, and that the last one is where the actual theorem lives.
None of those is findable by playing. All 29,400 maps take seventeen seconds to score. Thresholds written before the sweep are guesses about a landscape nobody has looked at, and a gauge is only as honest as its top of scale.
That is also the argument the machine makes, so I will let it finish. Every needle on that apron is an instrument built for one specific job. AREA is a true number about a real thing, and it has nothing at all to say about whether a bearing holds. The trouble starts when an instrument gets taken off the chart table, hung on a wall, and called the world.
The tenth customer is a schoolteacher. She asks for no gauge, just the world, for the wall. Whatever comes out of the press for her is the only map in the game with no job, which makes it the only one that cannot be got right.