C2 systems
A command and control (C2) system is software that turns reports from many sources into one shared picture people can act on, and it is usually pictured as a map. It is better understood as a correlation engine with a map attached, whose central job is deciding whether two reports are one thing or two. The page opens with the twenty-five-line shared-picture checklist, then covers correlation, the two times and the clock every record carries, what happens when two nodes lose contact, interoperability as a requirement, the person in the loop as properties you can test, and seven documented failures.
- Central operation
- Correlation
- Every record carries
- Two times and a clock
- A person in the loop is
- Five testable lines
The shared-picture checklist
Here is the whole checklist first, because it is what a design review of a C2 system should walk through and because almost every line is cheap in the first schema and a migration in the second. It is numbered so a line can be cited: "we fail 2.2" is a ticket, where "the track model feels fragile" is a mood. The groups follow the data from the moment a report is created to the moment a person acts on it.
1.Every report
- A report is immutable and has its own id, assigned where it was created. A correction is a new report that references the old one.
- It carries its provenance: the source, the sensor, the operator where there is one, and the version of any software that produced it.
- It carries two times — when it happened and when it arrived — plus which clock stamped it and how good that clock was.
- It says whether it is real, an exercise or a test, in a field that no display and no adapter can drop.
2.Every track
- A track references its reports and never replaces them: merging adds a link, splitting removes one.
- A track number is never reused, so a question about a number always gets the same object.
- Position carries its uncertainty, and identity is a hypothesis with its alternatives rather than a label.
- Confidence says what it is based on, on a scale that everyone producing it means the same thing by.
3.Every partition and every long run
- Nodes exchange an append-onlyrecords added, never changedA store or log in which new records are only ever added and existing ones are never changed or deleted in place; a correction is a new record pointing at the old one. It costs space and turns "the current value" into a query, and in return nothing that was once known can silently disappear.All terms log of reports, not a diff of tracks.
- On a conflict both versions are kept and correlation re-runs over the union; nothing is settled by comparing two clocks.
- Every sync is counted: reports exchanged, how many were new, how many conflicted, and how each conflict was resolved.
- A long uptime is a tested condition: time, counters and caches behave after a hundred hours as they do after one.
4.Every interface with another system
- The message standard and its version are named in the requirement, not chosen by the team.
- Units, datum and time base — UTCCoordinated Universal Time — the world’s reference timeThe time standard that clocks and logs are normally kept in, with no time zones and no daylight saving. It inserts leap seconds to stay close to the Earth’s rotation, which is why GPS time, which does not, now runs 18 seconds ahead of it.All terms or GPS time — travel in the data or are fixed by the contract, and the contract is tested rather than trusted.
- Anything a partner sends out of range is quarantined and flagged, never silently corrected.
- Every translation between schemas is logged, so a wrong value can be traced to the adapter that produced it.
5.Every display element
- Age is visible without a click.
- Uncertainty is drawn as uncertainty — an area, a hollow marker — never as a precise symbol.
- Any element answers "why do you think that" in one interaction, with the reports and sources behind it.
- A stale feed or an isolated node is shown as stale or isolated; silence never looks like "nothing is happening".
6.Every decision a person makes
- The person has enough time to decide, and the time actually available is measured rather than assumed.
- The person sees the evidence behind a recommendation — which source, how old, what it matched — not only a score.
- Refusing is as easy as accepting, a live action never shares a confirmation screen with a drill, and a cancellation is prepared in advance.
- When a person and an automated system can give conflicting instructions, which one wins is decided in advance and known to both.
- What was shown, what was chosen, by whom and when is recorded.
Correlation is the operation, and it is never certain
Three terms make the rest of this page readable, and they are worth separating because systems that blur them produce a picture nobody can reason about. A REPORT is what one source said at one moment: raw, attributable, never modified. An ENTITY is the real thing in the world that a report may or may not be about. A TRACK is the system’s current best belief about an entity, assembled from reports and always revisable. Reports are facts about sources; tracks are hypotheses about the world.
Correlation is the step that assigns a report to a track, and it is a judgement under uncertainty every single time. Two sensors reporting positions eighty metres apart may be seeing one object with a position error or two objects that happen to be close. The system has to pick, and both mistakes are expensive in different directions: merging two entities hides one of them, and splitting one entity produces a picture with a thing in it that does not exist. Neither error is recoverable if the reports were discarded after merging.
Line 2.2 is the same rule applied to names. A track number is how people talk about an object, over a radio or across a room, and a number that can be reassigned, or that changes when two tracks merge, turns a question about one object into an answer about another. Give each track an identity that never moves, and if tracks merge, keep the old numbers as aliases that resolve to the surviving track rather than freeing them for reuse.
Two times and a clock on every record
Retrofitting any of these is a migration across every consumer of the data, so they belong in the first schema rather than the second version. All four look like details, and all four decide whether the picture can be trusted — which is why they are lines 1.2 and 1.3.
Event time and receipt time
When it happened and when you learned about it are different numbers, and the gap can be minutes. A report that is forty seconds old is not a report about now, and a display that cannot show the difference will present stale information as current.
Confidence, as a value
Every report and every track carries how sure it is and on what basis. Rounding uncertainty away at the edge of the system is the most common way a picture becomes confidently wrong.
Provenance
Which source, which sensor, which operator, which version of which classifier. This is what makes a disagreement investigable rather than a matter of opinion.
Clock discipline
Nodes that cannot reach a time source drift. Record the clock source and its quality with the timestamp, or ordering across nodes becomes a guess dressed as a fact.
The clock deserves more than a card, because the way a clock goes wrong is slow. A small error per hour is invisible in a one-hour test and decisive in the hundredth hour, and for anything that moves, an error in time is an error in position. The most studied case in software engineering is exactly this, and the diagram below is drawn from the investigators’ own table.
That is line 3.4, and it generalises well beyond clocks. Counters that wrap, caches that grow, sequence numbers that exhaust a field, floating-point accumulators that lose precision — each of them passes every test that restarts the system first. If the system will run for days in the field, one test has to run for days too, and the uptime at which each component was last verified belongs in the release notes.
Confidence deserves one extra note because it is where good intentions fail — line 2.4. A number between zero and one is only meaningful if everyone producing it means the same thing by it, and they do not: a sensor’s 0.9 is a calibrated probability, a classifier’s 0.9 is a softmaxscores squashed into 0–1The function a classifier’s last layer usually applies to turn raw scores into numbers between zero and one that add up to one. They look like probabilities but are not calibrated ones, so a softmax of 0.9 does not mean the model is right nine times in ten.All terms output that means very little, and a person’s 0.9 is a shrug rendered as a number. Either agree what the scale means and calibrate against it, or carry the raw evidence and let the consumer decide. What does not work is averaging three incompatible 0.9s into a 0.9 that describes nothing.
When two nodes lose contact
This is where the absent network stops being abstract. Two nodes are disconnected for an hour, both keep receiving reports, both update their tracks, and both are correct about what they saw. When the link returns they disagree — not because either is broken, but because they saw different things. The general distributed-systems material on this lives elsewhere on the site; what is specific here is that the correct resolution is almost never to pick a winner.
| Reconciliation strategy | What it does with the disagreement | Verdict |
|---|---|---|
| Last writer wins | The later timestamp overwrites the earlier one, silently. | The default in most databases and the wrong answer here: "later" often means "from the node with the faster clock". |
| One node is authoritative | The designated node’s version is taken and the other is discarded. | Workable when that node genuinely has better information, and it usually does not — the forward node saw it first. |
| Keep both, merge on evidence | Both versions persist as separate reports; correlation re-runs over the union and may or may not merge them. | The correct default, and line 3.2. Nothing is lost, and a genuine disagreement stays visible instead of being resolved by a clock. |
| Escalate to a person | The conflict is surfaced with both versions and their provenance for someone to judge. | Right for the small number of conflicts that matter, and unusable as a general policy — nobody can triage thousands. |
One practical consequence, which is line 3.1: because reconciliation happens over reports rather than over tracks, the sync protocol exchanges an append-only log of immutable facts, not a diff of mutable state. That is a considerably simpler thing to make correct, it is idempotentsafe to repeatAn operation that has the same effect whether it runs once or five times. It is what makes a retry safe — and since any network call may be retried without you knowing, the alternative is charging a card twice.All terms by construction, and it survives being interrupted halfway — which matters when the contact window is measured in seconds.
Interoperability is a requirement, not a preference
A product team chooses its formats. A C2 team mostly does not. Requirements arrive as documents written by someone who will never meet you, and one sentence in them usually decides the architecture: the system shall exchange data with these systems, in this message standard, at this version. Those partners are often older than yours and cannot be changed, so the standard is a constraint you inherit rather than a design you get to improve — which is line 4.1, and the reason a lot of the skill here is reading a specification closely.
| What the contract fixes | The question to answer in writing | Why it matters |
|---|---|---|
| Units | Metres or feet, knots or metres a second, newton-seconds or pound-force seconds. | A spacecraft was lost to this row alone. The specification was right; nothing checked that both sides obeyed it. |
| Datum and frame | WGS 84 or a national datum; latitude and longitude or a grid; height above what. | The same point can differ by tens to hundreds of metres between datums, and nothing about the numbers looks wrong. |
| Time base | UTC, local time or GPS time, and to what precision. | GPS time runs 18 seconds ahead of UTC today, because it ignores leap seconds. Eighteen seconds is a long way for a moving object. |
| Identifiers | Who assigns them, whether they are ever reused, and what happens when two systems number the same object. | A reused number turns a question about one object into an answer about another — line 2.2, across a boundary. |
| Unknowns | How "unknown" is written, and what a value outside the agreed list means. | An adapter that maps an unknown code to the nearest known one has invented data. |
| Version | Which version of the standard, and what an older reader does with a newer message. | Partners upgrade at different times, and a field-length change is a silent truncation somewhere. |
The person in the loop, and the screen they decide through
Everything above exists so that a person can make a decision, and "human in the loop" is used loosely enough to mean nothing. As an engineering requirement it is specific. A person is IN the loop when nothing consequential happens until they act. A person is ON the loop when the system acts unless they stop it inside a window. And a person is in NEITHER when they are told after the action. The third is the common arrangement, and it usually arrives by accident rather than by decision.
Group 6 of the checklist is what turns the phrase into properties you can test. A person needs enough time to decide, measured rather than assumed — a two-second confirmation is not oversight, it is a rubber stamp with extra latency. They need the evidence behind the recommendation, not only its score. Refusing has to be as easy as accepting and must not look like a mistake; if "no" is harder than "yes", the loop is decorative. When the person and the automation can disagree, which one wins has to be settled in advance. And the decision has to be recorded — what was shown, what was chosen, when, and by whom — or a bad outcome cannot be reviewed.
The display is therefore not a presentation layer over the real system. It is the last stage of it, and the place where careful data modelling is most easily thrown away: a track carrying age, confidence and provenance, rendered as an icon identical to every other track, has lost all three at the last step. Group 5 of the checklist is the minimum.
- Age visible without being asked for (5.1). A track built on a report four minutes old should not look like one updated two seconds ago.
- Uncertainty drawn as uncertainty (5.2). A precise symbol is a claim, and drawing one over a guess is a lie the interface tells on the system’s behalf.
- Every element answers "why do you think that" in one interaction (5.3), showing the reports behind it and their sources.
- Degraded modes have a design, not a blank panel (5.4) — silence reads identically to "nothing is happening".
- An interruption the person cannot act on trains them to ignore the ones they can — the same alerting rule as everywhere else on this site.
Seven failures, and the line that covers each
Each of these has a public investigation, and several cost lives. They are here for what they teach about building a shared picture, not as a verdict on the people involved: in almost every one, the investigators found the cause in a field, a screen or a procedure that the system’s designers had made or left out.
| Case | What happened | The line that covers it |
|---|---|---|
| NORAD false alert, November 1979 | A tape carrying an exercise scenario was loaded into an operational computer, and warning displays at NORAD, the Pentagon and Strategic Air Command showed a massive missile attack. Interceptors were launched. Within about six to seven minutes, sensors that did not depend on that computer showed nothing, and the alert was stood down. | 1.4 and 1.2. Nothing in the data said "exercise", and only independent raw sources exposed it. |
| Iran Air 655, Persian Gulf, July 1988 | USS Vincennes shot down an Airbus with 290 people aboard. The formal investigation found that the track’s number changed mid-engagement, that the crew reported it descending while the ship’s system showed it climbing throughout, and that a military IFF code read at the airport it had left was attached to it because the read-gate stayed on the airfield. It concluded the captain might not have fired had he relied on the system’s data alone. | 2.2, 5.3 and 6.2. Identity moved between numbers and a reading moved between aircraft, and nothing on the screen showed where either had come from. |
| Patriot, Dhahran, February 1991 | A battery that had run for over 100 hours failed to track an incoming Scud, which struck a barracks and killed 28 soldiers. Time was counted in tenths of a second and converted with 24-bit precision; the error grew with uptime and moved the region the radar searched by 687 metres. Israeli data had shown the drift after 8 hours, and the fixed software arrived the next day. | 3.4 and 1.3. Uptime was never a tested condition, and the clock’s quality was not something the system knew about itself. |
| Mars Climate Orbiter, September 1999 | Ground software supplied thruster impulse in pound-force seconds where the interface specification required newton-seconds. The trajectory error built up over months, and the spacecraft was lost entering orbit around Mars. | 4.2. The units lived in a document rather than in the data or in a test. |
| Überlingen mid-air collision, July 2002 | A Tu-154 and a Boeing 757 collided over southern Germany and 71 people died. The collision-avoidance system told the Tupolev to climb and the 757 to descend; the air traffic controller told the Tupolev to descend, and its crew followed the controller. Afterwards ICAO made the automated resolution advisory take precedence over a controller’s instruction. | 6.4. Two authorities gave opposite instructions, and which one wins was not settled anywhere the crew could rely on. |
| Patriot fratricides, March–April 2003 | In the first weeks of the Iraq war, Patriot batteries shot down a British Tornado and a US Navy F/A-18, killing three aircrew. The Defense Science Board found a largely automatic operating protocol with operators trained to trust the system’s software, alongside poor combat identification, and called for more operator involvement through changes to software, displays and training. | 6.1 and 6.2. The person was on the loop with a window too short to use and without the evidence to judge. |
| Hawaii false missile alert, January 2018 | During a no-notice drill whose recording said "this is not a drill", a warning officer believed an attack was real and sent a live alert to the whole state. The software asked the same "Are you sure?" for a test and a live alert without showing the message, the checklist had no procedure for correcting a false alert, and the correction took 38 minutes. | 6.3 and 1.4. A live action shared its confirmation with a drill, and the cancellation had never been prepared. |
Where it degrades
The honest limit of everything on this page is that a shared picture can only correlate what was reported. The sensor that was never there, the source that was jammed, the object that looked like background — these are absent without a trace, and a complete-looking picture invites the belief that the absence of a track is the absence of an object. The interface can show that a feed has gone stale; it cannot show a feed that never existed. The only defence is to draw coverage as well as tracks, so that "we see nothing here" and "we cannot see here" never look the same.
- A picture that looks complete because gaps in coverage are drawn as empty map rather than as unknown.
- A two-second confirmation dialog counted as "human in the loop".
- A reconciliation dashboard that is green because a long partition produced zero conflicts.
- Confidence averaged across sources that mean different things by the number.
- An exercise flag that exists in the database and is dropped by the adapter to a partner system.
- An interface specification that exists as a document and is never run as a test.
- A system tested for an hour and deployed for a month.
- Every conflict escalated to a person, so that none of them is read.
- A display that renders every track identically, deleting age, confidence and provenance at the last possible step.
When to use it
Use it when
- As a design review for any system that assembles one picture from sources that disagree, arrive late or overlap — the twenty-five lines at the top.
- When designing the schema: event time, receipt time, clock quality, confidence, provenance and the exercise flag belong in the first version.
- When a requirement names partner systems and a message standard, and the adapters to them are about to be written.
- When someone writes "human in the loop" in a requirement and nobody has said what the person will see, or for how long.
Avoid it when
- As general distributed-systems material — the architecture and infrastructure sections own that and this page leans on them.
- For a single-source system, where correlation does not exist and most of this is overhead.
- As justification for escalating every conflict to a person, which is unusable at any real volume.
- As a substitute for deciding what the operator is actually being asked to do, which no data model supplies.
Sources and method
What this page stands on
- 7 sources
- 7 documented failures
- Checked October 13, 2026
The failures this page learns from
the failures in the case table- Regulator reportThe 3 A.M. Phone Call: False Missile Attack Warning Incidents, 1979-1980 (opens in a new tab)National Security Archive · Mar 2012
- Regulator reportFormal Investigation into the Circumstances Surrounding the Downing of Iran Air Flight 655 on 3 July 1988U.S. Department of Defense · Jul 28, 1988
- Regulator reportGAO — Patriot Missile Defense: Software Problem Led to System Failure at Dhahran, Saudi Arabia (opens in a new tab)U.S. General Accounting Office · Feb 1992
- PostmortemMars Climate Orbiter Mishap Investigation Board — Phase I Report (opens in a new tab)NASA · Nov 10, 1999
- Regulator reportBFU — Investigation Report AX001-1-2/02 (Überlingen) (opens in a new tab)German Federal Bureau of Aircraft Accidents Investigation · SKYbrary · May 2004
- Regulator reportReport of the Defense Science Board Task Force on Patriot System Performance — Report Summary (opens in a new tab)Defense Science Board · Jan 2005
- Regulator reportReport and Recommendations: Hawaii Emergency Management Agency January 13, 2018 False Alert (opens in a new tab)FCC Public Safety and Homeland Security Bureau · Apr 2018
Researched with Claude. Finding and cross-checking the primary sources was done with Claude (Anthropic). Selection, writing and fact-checking: the Anatomy of IT Product editors.
Found this useful?
Share it with someone who is working on the same problem.