The $125 Million Unit Label
In September 1999, NASA’s Mars Climate Orbiter reached Mars after travelling for nine months.
Then it disappeared.
The spacecraft had approached the planet on the wrong trajectory, roughly 170 kilometres lower than planned. It either burned up in the Martian atmosphere or escaped back into space.
The famous explanation sounds almost too simple: one team used English units, and another expected metric units.
More precisely, ground software produced thruster impulse data in pound-force seconds. The interface specification required newton seconds. The navigation software treated the numbers as if they were already metric.
The digits travelled successfully. Their meaning did not.
The idea in 20 seconds
- Two systems can exchange valid data and still misunderstand each other.
- Units, formats and assumptions are part of the data, not documentation around it.
- A handoff is an interface, even when no screen exists.
- The most expensive bugs often live between teams rather than inside either team.
Compatibility is not the ability to receive the same number. It is the ability to interpret that number the same way.
What actually went wrong
The Mars Climate Orbiter used small thruster firings to manage the buildup of angular momentum in its reaction wheels. Ground software modelled the effect of those firings.
According to NASA’s mishap report, a software output called the “Small Forces” file supplied impulse data in pound-force seconds. The documented requirement was newton seconds. One pound-force second is about 4.45 newton seconds.
The receiving system did not know the value needed conversion. It accepted the number and continued calculating. Each mismatch introduced a small trajectory error, and over the long journey those errors accumulated.
By the time the spacecraft reached Mars, there was no harmless correction screen. Physics processed the input exactly as given.
This was not just “someone forgot metric”
The unit mismatch is memorable because it is easy to explain. But NASA’s investigation found a larger system around it: weak communication, incomplete verification, insufficient systems engineering and warning signs that were not fully resolved.
The lesson is not:
Engineers should remember their units.
That places the entire failure inside one person’s head. The stronger lesson is:
A critical system should not require memory to preserve meaning across a boundary.
The interface documentation specified metric units, but the data itself did not enforce them. The receiving model had no effective guardrail to reject or question the unexpected values. The system trusted an assumption it could have tested.
A number without a unit is unfinished
Imagine receiving a message that says:
The temperature is 35.
Is that pleasant or dangerous? The number is syntactically complete and semantically useless.
Yet software systems exchange similarly incomplete values all the time:
price: 100without a currency,date: 07/08/26without a format or time zone,weight: 12without kilograms or pounds,duration: 500without seconds or milliseconds,status: 1without a shared definition,user_id: 342without knowing which system issued it.
Humans use context to fill the gap. Computers use assumptions. An assumption is simply invisible data.
The interface was between organisations
We usually imagine an interface as something a user taps. The orbiter reminds us that interfaces also exist:
- between teams,
- between companies,
- between software services,
- between hardware and software,
- between a specification and an implementation,
- between a measurement and a decision.
Lockheed Martin built the spacecraft. NASA’s Jet Propulsion Laboratory navigated it. Both contained skilled people doing reasonable work inside their own contexts. The failure emerged where those contexts met.
This is common in large systems. Each component passes its own tests. Each team’s dashboard is green. The output from one system becomes the input to another. Then the whole thing fails.
Local correctness is not the same as system correctness.
The type system we needed
In ordinary programming, a type can prevent us from adding text to a number. Critical systems need richer types.
Not:
impulse = 25.6
But:
impulse = 25.6 newton-seconds
The unit should travel with the value, be checked at the boundary and become difficult to discard accidentally.
The same principle helps non-technical interfaces:
- show the currency beside every monetary total,
- show the time zone beside meeting times,
- write months as words when date order may be ambiguous,
- label whether a price is monthly or annual,
- state whether a measurement is net, gross, estimated or final.
Context should not live only in somebody’s memory or in a PDF nobody opens. It should remain attached to the decision.
The handoff test
For every important exchange between systems or teams, ask:
What assumptions are not inside the payload?
Units, time zones, formats, identifiers, precision and definitions.
Can the receiver validate the value?
Use ranges, schemas, invariants and independent checks.
Does the failure look obviously wrong?
A value can be technically valid but physically implausible.
Has the complete path been tested?
Not component A and component B separately, but the actual exchange from A through B to the outcome.
Can somebody see the interpretation?
Expose what the receiving system believes, not only what the sending system transmitted.
The small-error illusion
The mismatch did not necessarily produce one spectacularly absurd command. It produced small errors that accumulated.
That makes the story useful beyond spacecraft. A tiny rounding error repeated across millions of transactions becomes real money. A minor time-zone mismatch repeated across calendars becomes missed meetings. A slightly biased recommendation repeated across a platform changes what people see. A small accessibility barrier repeated at every step becomes exclusion.
We notice dramatic failures. Systems are often destroyed by quiet ones with excellent attendance.
One final thought
People often describe the Mars Climate Orbiter as a cautionary tale about metric versus imperial units. That is true, but incomplete.
The spacecraft was lost because meaning fell out of a handoff. The value passed through the interface. The file opened. The software ran. Nobody received an obvious error. Everything worked except the shared understanding.
The most dangerous interface is not one that crashes. It is one that confidently translates the wrong meaning.
A button with a bad label can send a user to the wrong page. A number with a missing label can send a spacecraft into a planet.


