DeftechSenior

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. 1.Every report

    1. 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.
    2. It carries its provenance: the source, the sensor, the operator where there is one, and the version of any software that produced it.
    3. It carries two times — when it happened and when it arrived — plus which clock stamped it and how good that clock was.
    4. It says whether it is real, an exercise or a test, in a field that no display and no adapter can drop.
  2. 2.Every track

    1. A track references its reports and never replaces them: merging adds a link, splitting removes one.
    2. A track number is never reused, so a question about a number always gets the same object.
    3. Position carries its uncertainty, and identity is a hypothesis with its alternatives rather than a label.
    4. Confidence says what it is based on, on a scale that everyone producing it means the same thing by.
  3. 3.Every partition and every long run

    1. Nodes exchange an log of reports, not a diff of tracks.
    2. On a conflict both versions are kept and correlation re-runs over the union; nothing is settled by comparing two clocks.
    3. Every sync is counted: reports exchanged, how many were new, how many conflicted, and how each conflict was resolved.
    4. A long uptime is a tested condition: time, counters and caches behave after a hundred hours as they do after one.
  4. 4.Every interface with another system

    1. The message standard and its version are named in the requirement, not chosen by the team.
    2. Units, datum and time base — or GPS time — travel in the data or are fixed by the contract, and the contract is tested rather than trusted.
    3. Anything a partner sends out of range is quarantined and flagged, never silently corrected.
    4. Every translation between schemas is logged, so a wrong value can be traced to the adapter that produced it.
  5. 5.Every display element

    1. Age is visible without a click.
    2. Uncertainty is drawn as uncertainty — an area, a hollow marker — never as a precise symbol.
    3. Any element answers "why do you think that" in one interaction, with the reports and sources behind it.
    4. A stale feed or an isolated node is shown as stale or isolated; silence never looks like "nothing is happening".
  6. 6.Every decision a person makes

    1. The person has enough time to decide, and the time actually available is measured rather than assumed.
    2. The person sees the evidence behind a recommendation — which source, how old, what it matched — not only a score.
    3. Refusing is as easy as accepting, a live action never shares a confirmation screen with a drill, and a cancellation is prepared in advance.
    4. When a person and an automated system can give conflicting instructions, which one wins is decided in advance and known to both.
    5. 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.

A command-and-control system is often described as a map. It is better understood as a correlation engine with a map attached. Reports arrive from sources that disagree about what they saw, arrive with wildly different delays, use different schemas and frequently describe the same object twice. The central operation is deciding whether two reports are one thing or two, and that decision is never certain — which is why the resulting track keeps its sources rather than replacing them, and carries a confidence value as an ordinary field. Two properties follow and are worth building in from the first day. Event time and receipt time are different numbers and both must be stored, because a report that is forty seconds old is not a report about now. And when two nodes lose contact with each other, both keep their own version and reconcile when the link returns; a system that lets one side silently overwrite the other has destroyed the only evidence that they disagreed. The last chip is the one that decides whether any of this is safe: the system proposes, a person decides.

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.

A correlation error is normal — two sensors eighty metres apart may be seeing one object or two — so the question is whether the data model lets it be corrected. On the left the reports are kept and the track only links to them. When the fourth report turns out to belong to a different object, one link is removed and it becomes a second track; nothing is lost, and anyone can see why the system believed what it believed. On the right the reports were collapsed into the track and dropped after the merge. The track holds one averaged position, there is no evidence left to split on, and the mistake cannot even be demonstrated. A track should be a hypothesis that cites its evidence, never a replacement for it.

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.

On 25 February 1991 a Patriot battery at Dhahran failed to track an incoming Scud, which struck a barracks and killed 28 soldiers. The GAO found the cause in time-keeping: the system counted time in tenths of a second as an integer and converted it with 24-bit precision, so its computed time fell behind by about 0.0034 seconds an hour. For a fast target, time error is position error, and the region the radar searched moved with it — 55 metres after 8 hours, 687 metres after 100. The battery had been running for more than 100 hours. Israeli data had already shown the shift after 8 hours, and a software fix reached Dhahran the day after. Nothing in a one-hour test would have shown the line; only a long run does, which is why uptime belongs in the test plan as an operating condition.

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 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 strategyWhat it does with the disagreementVerdict
Last writer winsThe 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 authoritativeThe 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 evidenceBoth 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 personThe 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 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 fixesThe question to answer in writingWhy it matters
UnitsMetres 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 frameWGS 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 baseUTC, 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.
IdentifiersWho 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.
UnknownsHow "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.
VersionWhich 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.

"Human in the loop" is used loosely enough to mean nothing, and as an engineering requirement it is three different arrangements. In the loop, the system proposes and nothing happens until a person decides, so the person needs enough time, the evidence behind the proposal, and a refusal as easy as acceptance. On the loop, the system acts unless a person stops it inside a window, and the length of that window is the whole property: a window too short to use is not oversight. Neither, the person is told after the action. The third arrangement is the common one, and it usually arrives by accident — a confirmation that cannot realistically be refused, or a window nobody can act inside, is lane three carrying the label of lane one or two. The test is to take the last consequential action the system performed and ask whether the person had time, evidence, an easy no, and a record of what they saw.

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.

CaseWhat happenedThe line that covers it
NORAD false alert, November 1979A 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 1988USS 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 1991A 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 1999Ground 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 2002A 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 2003In 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 2018During 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

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.