Tactical situational awarenessImplementation status: BidirectionalInput supportedOutput supported

Cursor-on-Target: the implemented event translation

Cursor-on-Target is the compact XML event format used across the TAK ecosystem and beyond. SynapseCommand publishes a bidirectional CoT adapter: contact atoms become canonical objects, and canonical plans become free-form drawings.

About the standard

What CoT is

A CoT event is a small XML document describing what, where, when and how sure. The type string encodes affiliation and battle dimension, the point element carries position with error estimates, and the detail element is an open container that implementations extend.

Its virtue is its size and its ubiquity. Its cost is that almost everything meaningful lives in convention rather than in the schema, so two conformant implementations can disagree about what a field means while both remaining valid.

That is why a published, field level mapping is worth more here than a claim of support. Anyone integrating can read exactly which conventions this implementation follows.

Operational relevance

Why this matters to a commander

CoT is how a dismounted user's position, a sighting and a sketched control measure move between tactical clients today.

For a decision-support layer, being able to emit a plan as a drawing means a recommended course of action can appear on the same screen the user already has, without asking anyone to adopt a new client.

Reading atoms means the same layer can see the reported picture as the edge sees it, rather than as a headquarters system has already reconciled it.

What is implemented

The exact behaviour, not a capability claim

Ingest takes one CoT atom, a contact report, and produces one Entity and one Event. The atom describes a thing that exists and a thing that happened, which is the same split every adapter in the set uses.

Egress takes one canonical object and produces one CoT event document. A plan object becomes a free-form drawing, and an Entity becomes an atom, which is what makes the ingest path round-trippable. Entity egress is not an extra: the harness calls the egress path on whatever ingest produced for every fixture, so an adapter that could only emit drawings would fail its own gate.

A drawing arriving on ingest is not special-cased. The canonical answer to an incoming drawing would be a plan object, and a plan object is defined as something pushed out, so ingesting one would invert that definition for a symmetry nothing has asked for. Such a payload still translates without loss, with affiliation and type resolving to unknown and every field parked.

The CoT sentinel for an unavailable height or error estimate is translated to an absent value rather than forwarded, because forwarding it would place a contact nine thousand kilometres up with nine thousand kilometres of error. The translation is declared, so it appears as a printed line in every harness report.

A position at zero latitude and zero longitude is not treated as a sentinel, because it is a real point in the Gulf of Guinea. An event with no point element yields no position; an event at zero and zero yields a position there.

An unrecognised how value resolves to estimated rather than to a satellite fix, because understating a fix is the safe direction when a commander is using that field to tell a measurement from a guess in a navigation-denied environment. The source's own value is kept either way.

XML parsing is guarded. A document carrying a document type definition is refused before the parser sees it, since a CoT event has no legitimate use for one and internal entity expansion is a memory amplification attack on bytes that arrive off a network.

  • 01
    Ingest
    CoT atoms, meaning contact reports, as XML bytes or as the parsed dictionary twin.
  • 02
    Egress
    Canonical Entity to atom; canonical plan object to a free-form drawing.
  • 03
    Not ingested
    Drawings. Deliberate, and stated in the adapter.
  • 04
    Sentinels
    The unavailable value for height and error estimates becomes an absent field, declared as a transform.
  • 05
    Security
    Documents carrying a document type definition are refused before parsing.
Direction of exchange

Which way the data actually moves

Into the canonical model

  1. CoT event XML
    One atom.
  2. Entity and Event
    Affiliation and battle dimension mapped; the full type string parked.

Out of the canonical model

  1. Entity or plan object
    Canonical objects.
  2. CoT event XML
    Atom, or free-form drawing for a plan.
Workflows

Where this data is used

Recommended course of action to the edge

A canonical plan object is emitted as a drawing, so a proposed scheme of manoeuvre can be rendered by a client that already speaks CoT. Authority stays with the human decision gate; the drawing is a proposal, not an order.

Reported picture ingest

Atoms become canonical Entities and Events, with position source qualified rather than assumed, which is what allows the Blue-Force Posture Agent to reason about reporting quality.

Round trip verification

A shipped fixture can be translated in and back out with the published harness, which is how an integrator checks the conventions rather than negotiating them.

Implementation evidence

Every claim above has a file behind it

These paths are in the public repository, published under Apache 2.0. The adapter module for this page is tak.

Source and fixtures

  • Adapter source
    packages/cdm/synapse_cdm/adapters/tak.py

    Both directions, the sentinel rules, the type mapping and the guarded parse.

  • Fixtures
    packages/cdm/synapse_cdm/fixtures/tak/

    Event documents, parsed twins and golden canonical output. Each ingest fixture ships twice so the lossless check can run on the structured form.

  • Field by field coverage
    FORMAT_COVERAGE.md

    The CoT row set, including which rows are egress only.

Test evidence

  • Harness test
    tests/test_cdm_tak_adapter.py

    Replayed by the validation harness shipped in the same package, which runs six checks per fixture including a never-drop lossless check.

  • Lossless check
    tests/test_cdm_lossless.py

    Runs against the parsed twin of every XML fixture, so the never-drop rule is genuinely exercised.

Manifest-backed assurance

Maturity is declared in each generated adapter manifest and checked against suite eligibility. VERIFIED is a separate claim-status axis. Neither means external certification or integration with a named system.

  • tak
    Maturity L4Claim VERIFIED
What these maturity levels mean

L3 means required provenance survives translation. L4 adds applicable roundtrip evidence. L5 would require every applicable public conformance gate to pass. L6 requires an independent real implementation or system and cannot be awarded from this repository's synthetic fixtures.

Status and limits

What is claimed, and what is not

Implementation status: Bidirectional

The published adapter implements both translation directions: the format into the canonical data model, and the canonical data model back out to the format. Both directions are replayed by the validation harness against shipped fixtures.

Last reviewed against the published implementation on 2026-09-06.

Limitations

  • Drawings are emitted but not ingested.
  • The adapter is a translator with no transport. It does not connect to a server, subscribe to a stream or authenticate to anything.
  • Only contact atoms are ingested. Other event families are not claimed.
  • Conventions differ across the ecosystem. The mapping this implementation follows is published so a difference can be found before an integration begins rather than during it.

Security boundary

  • No credentials, certificates, endpoints or enrolment procedures appear in the published layer or on this page.
  • The refusal of document type definitions is a deliberate hardening decision on a network-facing parser.
Questions

Frequently asked

Is the Cursor-on-Target support bidirectional?
Yes. Atoms are ingested and both atoms and free-form drawings are emitted. Drawings are not ingested, which is a deliberate decision recorded in the adapter.
Does the adapter connect to a TAK server?
No. It translates event documents. There is no network client, no certificate handling and no subscription logic in the published layer, and none is claimed.
How are unknown values handled?
The CoT unavailable sentinel becomes an absent canonical field, declared as a transform so it appears in every harness report. A position at zero and zero is treated as a real position, because it is one.