← All notes

A Second Opinion, and It Lied Too

Correction, 24 September 2026. The reach in this post dropped the whole tank before the braking burn, so the brake ran on hydrogen held in no tank at all. With the shells that hold the braking hydrogen kept aboard, a 10 percent tank reaches 3.07 light years rather than 3.16, a 20 percent tank 2.33 rather than 2.38, and the arrival dies at a tank of 2.35 percent of the propellant rather than 2.74. The figure and the numbers below are the corrected ones, and the conclusion stands a little more firmly. How it turned up is in The Nearest Star, Flown.

Yesterday's post ended on a confession. The module had told me the engine would pull one gravity, I liked the number, I wrote it down, and then I made the nozzle weigh something and the acceleration fell by a factor of twenty five. My one-gravity figure required a massless nozzle. It had sat in the results looking exactly like every number around it that was fine.

I want to say that finding it was the end of the story. It was not. It was a diagnosis, and I did not take it seriously enough, because the very next day the same mistake was sitting one function over.

The tank that weighed nothing

The engine at a hundred times its power per tonne is the one that reaches another star. It carries 6,000 tonnes of liquid hydrogen, burns for decades, flips over, brakes, and stops at Proxima Centauri with a few years to spare. That was the result. I had it in a table.

The hydrogen had a mass. The tank holding it did not.

A dark panel titled "The tank that weighed nothing". A blue curve falls from left to right on a chart of light years reached in eighty years, stopping, against tank mass as a percent of the propellant it holds. It starts at 4.90 light years with a massless tank and falls to 2.33 at twenty percent. A dashed horizontal line marks Proxima Centauri at 4.24 light years, and a dotted vertical line at 2.35 percent marks where the curve crosses it, labelled "the arrival dies at 2.35%". A shaded band from ten to twenty percent is labelled "liquid hydrogen lives here, and nothing here arrives". The footnote says the reach is computed from the rocket equation with a mirrored braking burn, the empty tank shells dropped at the end of the boost and the ones holding the brake's hydrogen kept.

Read the figure from the left. With no tank at all the ship makes 4.90 light years and stops, which clears Proxima's 4.24 comfortably. Give the tank any mass and the curve falls, and it crosses the star at 2.35 percent of the propellant it holds. A tank of 141 tonnes around 6,000 tonnes of hydrogen, and the arrival is gone.

Real cryogenic hydrogen tankage starts at about 10 percent and runs to 20, because hydrogen is the worst thing in the universe to store: it is the least dense liquid there is, it boils at twenty kelvin, and it leaks through metal. Ten percent puts the reach at 3.07 light years. Twenty puts it at 2.33. The whole shaded band on that figure is a band where the ship does not arrive, and my number came from the one point on the left edge that does not exist.

Same shape as the nozzle. A component that does real work was doing it for free. The module charges the tank now, and the interstellar arrival that survived the nozzle did not survive the tank.

So I stopped trusting my own arithmetic

Two of these in two days is not bad luck, it is a method problem. Every number in that model came out of a formula I had written down myself, and when a formula is wrong it does not announce itself. It returns something plausible in the right units.

What I wanted was a second opinion that shared nothing with the first. Not a test of the formula, which only ever asks whether the formula agrees with itself, but a different route to the same number.

For the warp work there is one available, and it is the real thing: general relativity, done numerically, from the metric up. You write down the geometry of spacetime as a matrix of numbers at a point. You differentiate it to get the Christoffel symbols, differentiate those to get the Riemann curvature tensor, contract that twice to get the Einstein tensor, and what falls out the far end is the matter that geometry requires. No closed forms anywhere. Just derivatives, taken numerically, of the shape of space.

The hard part is that this pipeline is very easy to get subtly wrong and it will still return a well formed matrix. So it gets checked against a case with a known exact answer: drop in a black hole, and the Kretschmann scalar, a particular squeeze of the Riemann tensor, has to come back as forty-eight times the mass squared over the radius to the sixth. It does, to four digits. That is the machine certifying itself against a solution Schwarzschild wrote down in 1916.

What the second opinion caught

The first thing it said was that a piece of engineering I had been sketching was not engineering at all.

I had been drawing a warp ring: a torus of exotic matter around the ship, because a ring felt like the right shape for a machine that has to bend space around a hull. Then I integrated the actual energy the metric demands, over the actual bubble wall, and the answer carries a factor of the sine squared of the angle from the direction of travel.

A dark panel titled "Nobody designed a ring. The geometry is one." On the left, a 3D view looking down the axis of motion shows the bubble wall rendered as a bright orange annulus with a dark hole through the middle, labelled "looking down the axis of motion". On the right, a chart of energy density against degrees from the axis of motion, peaking at 1.00 at ninety degrees and falling to zero at both poles: a blue line for the closed form's sine squared and orange circles for the values computed here from the Einstein tensor, lying on top of it. A dashed line at a fifth of the peak marks what is drawn at left. Callouts read: at the equator, the peak, 1.00; at thirty degrees off the axis, 0.25; on the axis of motion, 0.002.

Zero on the axis of motion. Peak at the equator. The negative energy of a plain warp bubble is already a torus, and a warp ring is a description of the Alcubierre geometry rather than a modification of it. Nobody has to design the ring. Anyone who draws one has drawn the thing the equations already say.

The second thing it said was how much of it there is.

A dark panel titled "The bill, over the only two things that move it". A 3D surface over log bubble radius and log wall thickness, rising steadily to the right, with an orange marker and stem on the surface labelled "the 100 m bubble, 1 m wall, priced in this post". Callouts read: a 100 m bubble with a 1 m wall, 187906 Earth masses; and a throat is linear, not quadratic, 113 Earths per metre. The footnote gives the formula and notes that both axes and the height are logarithmic, so the surface spans thirty orders of magnitude, and that every point on it is negative energy.

A hundred metre bubble with a one metre wall wants 187,906 Earth masses of negative energy, which is a little over half the mass of the sun, with a minus sign in front of it. The surface climbs as the radius squared and falls as one over the wall thickness, and there is no third axis to escape along. Every point on it is negative. Shaping the geometry moves the debt around; nothing in the geometry changes its sign.

Worth putting next to the ship it would have to carry:

A dark panel titled "The ship, and the ring that would have to carry it". Two 3D views side by side. On the left, the engine drawn to scale, a teardrop hull 19.5 metres across its opening, half transparent so the twenty sails inside show as a stack of rings, with the orange opening at the wide end. On the right, the same engine as a small speck at the centre of a blue ring one hundred metres in radius. Callouts read: the engine, drawn to its opening, 19.5 m across; the wall, at the bubble radius, 100 m.

And then the second opinion was wrong

Here is the part I would rather not write.

Since the debt sits at the equator, the obvious move is to shape the wall to match: thicken it where the energy is, thin it at the poles, keep the total wall volume the same, and see whether the bill comes down. My hand derivation said this should save about 6.8 percent. The tensor machine said 4.3 percent, and I had an explanation ready: a wall that varies with angle has an angular gradient, that gradient has its own energy, and the closed form does not contain it. A finding. It went into the module's notes, into a test, and into the first draft of this post.

It is not true. The 4.3 percent was noise.

The integral was summing the energy over a uniform grid laid across the whole bubble. For a hundred metre bubble with a one metre wall, the grid's cells were wider than the wall. Every cell that mattered was straddling the thing it was supposed to be measuring, so the answer depended on where the grid happened to cross. It was not computing the energy of a wall. It was computing the energy of wherever the wall and the grid happened to intersect.

The reason I believed it is worse than the bug. I had run it at two resolutions and got 4.347 percent both times. Two independent runs, same answer to four digits. That reads exactly like convergence.

It was two grids missing the wall the same way. The next resolution up gave 6.8 percent. A coarser one gave minus 0.7, which is to say the saving had turned into a cost. Agreement between two runs of the same wrong method is not evidence of anything.

The fix is to make the grid follow the wall: sample in radius and angle around the bubble so every radial sample lands inside the wall by construction, instead of laying a box over the whole thing and hoping. With that, the same comparison converges, and the answer it converges to is 6.80 percent against the closed form's 6.77. The closed form was right the whole time and my correction to it was the artefact.

The same bug was in the other integral, the one that prices the whole bubble. On the old grid it returned anywhere between 0.78 and 1.14 times the closed form depending on the resolution, and it passed its test because the test asked for agreement within a few percent and one of those runs happened to land there. On the new grid it returns 0.99975 times the closed form and does not move in the fifth digit when the resolution changes by a factor of four in each direction. That is what two independent routes agreeing actually looks like, and I had not seen it until today.

What I actually changed

The tank has a mass. The interstellar arrival that depended on it is gone from the model, and the figure above is what replaced it.

The integrals sample the wall instead of the bubble. Both of them.

And the function that reports the wall-shaping saving now runs the whole comparison a second time at half the resolution and returns the gap between the two answers beside the answer itself. A number that has not been asked whether it is converged is not a number, and a single grid cannot tell you it resolved anything. The old code had no way to say "I do not know". Now it says it out loud.

The thing this blog keeps being about

Five of these now, across the last few posts: the check that refused my own drive, the nozzle with no mass, a week of green tests over unreachable code, and now a tank that weighed nothing and a grid that agreed with itself.

Every one is the same shape. A system returned a well formed answer that happened to be false, and in every case the thing that caught it was not a better test of the same code. It was making something pay for what it had been getting free, or computing the same quantity by a route that shared nothing with the first.

The uncomfortable half is that the second route needed the same treatment. I built it specifically to be a check, and it had a bug of its own that presented as a discovery, and it took two runs agreeing a little too exactly to send me looking. I do not have a general lesson here beyond the obvious one: the thing you built to catch your mistakes is a thing you built.