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.
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.
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.
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.
- 01IngestCoT atoms, meaning contact reports, as XML bytes or as the parsed dictionary twin.
- 02EgressCanonical Entity to atom; canonical plan object to a free-form drawing.
- 03Not ingestedDrawings. Deliberate, and stated in the adapter.
- 04SentinelsThe unavailable value for height and error estimates becomes an absent field, declared as a transform.
- 05SecurityDocuments carrying a document type definition are refused before parsing.
Which way the data actually moves
Into the canonical model
- CoT event XMLOne atom.
- Entity and EventAffiliation and battle dimension mapped; the full type string parked.
Out of the canonical model
- Entity or plan objectCanonical objects.
- CoT event XMLAtom, or free-form drawing for a plan.
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.
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 sourcepackages/cdm/synapse_cdm/adapters/tak.py
Both directions, the sentinel rules, the type mapping and the guarded parse.
- Fixturespackages/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 coverageFORMAT_COVERAGE.md
The CoT row set, including which rows are egress only.
Test evidence
- Harness testtests/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 checktests/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.
takMaturity 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.
What is claimed, and what is not
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.
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.