ASTERIX: which categories are implemented, and in which direction
ASTERIX is the EUROCONTROL family of binary surveillance data formats. SynapseCommand publishes five ASTERIX adapters in its open integration layer. Each translates data blocks into the canonical data model and emits them again, and each is verified against shipped fixtures by the same harness a third party can run.
What ASTERIX is
ASTERIX, the All Purpose Structured EUROCONTROL Surveillance Information Exchange, is not one format. It is a family of categories, each defined by its own specification document, sharing a common data block envelope of category octet, length and a field specification bitmap followed by data items.
Categories are allocated by purpose rather than by vendor. Category 021 carries ADS-B target reports as a ground station has already processed them, category 048 carries monoradar target reports from a single radar, category 034 carries the service messages a radar sends about itself, category 062 carries system track data from a tracker, and category 023 carries ground station status.
Because a data block is a tiled sequence of records with no checksum, structural conformance is the only integrity gate the format offers. A block that does not tile exactly, a field specification bit that names an undefined field reference number, or an item that runs past the record boundary are all defects that a lenient reader would silently absorb.
Why this matters to a commander
ASTERIX is the exchange format most European air surveillance infrastructure already speaks. A recognised air picture assembled from radar, multilateration and ADS-B ground stations is very often an ASTERIX stream before it is anything else.
For a decision-support layer, that matters because the alternative to reading ASTERIX is reading a downstream system's private rendering of it, which means inheriting that system's judgements about quality, identity and time without being able to see them.
The categories SynapseCommand implements cover both what a sensor detected and what the sensor said about itself. Sensor health is a decision input: a track thinning out because a radar is in a test mode is a different situation from a track thinning out because the target changed behaviour.
The exact behaviour, not a capability claim
Each category has its own adapter module, and they deliberately share no translation code. A single generic ASTERIX reader would create the appearance of a common basis where the specifications do not provide one, so each category is implemented against its own pinned document.
Ingest turns one data block into one Entity and one Event per record, in block order. A block legitimately carries several records naming several aircraft, and each is a report in its own right.
Egress re-emits from the parsed integers rather than from any derived floating point value, which is what makes byte exact output possible for records that came from the same category.
The full field by field mapping for every category is published as FORMAT_COVERAGE.md in the repository. That document is the specification the code is written against, and a test resolves every canonical path in it against the models so the two cannot drift apart.
- 01Category 021ADS-B target reports. Bidirectional. Dedicated page.
- 02Category 023CNS/ATM ground station and service status reports. Bidirectional. Dedicated page.
- 03Category 034Monoradar service messages. Bidirectional. Dedicated page.
- 04Category 048Monoradar target reports. Bidirectional. Dedicated page.
- 05Category 062System track data from a data processing system. Bidirectional. Dedicated page.
- 06Everything elseNot implemented. No other ASTERIX category is claimed anywhere on this site.
Which way the data actually moves
Into the canonical model
- ASTERIX data blockCategory, length, field specification, records.
- Canonical data modelEntity and Event per record, with every unmapped field parked and visible.
Out of the canonical model
- Canonical data modelObjects that originated in the same category.
- ASTERIX data blockRe-emitted from the parsed integers.
Where this data is used
Recognised air picture ingest
Category 021 and category 048 reports become canonical Entities and Events that the ISR Fusion Agent correlates. Correlation happens in the fusion layer where it is audited, never inside a translator.
Sensor health in the decision record
Category 034 makes the radar itself the subject. A station reporting a changed operating mode is recorded as an Event against the station Entity, so a later review can see what the sensor was doing when a decision was taken.
Replay and evidence
Because ingest is a pure function of one payload, an archived block replays to identical canonical objects. That is what makes a decision record reproducible rather than merely logged.
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 asterix_cat021, asterix_cat023, asterix_cat034, asterix_cat048, asterix_cat062.
Source and fixtures
- Category 021 adapterpackages/cdm/synapse_cdm/adapters/asterix_cat021.py
Ingest and egress for ADS-B target reports.
- Category 034 adapterpackages/cdm/synapse_cdm/adapters/asterix_cat034.py
Ingest and egress for monoradar service messages.
- Category 048 adapterpackages/cdm/synapse_cdm/adapters/asterix_cat048.py
Ingest and egress for monoradar target reports.
- Field by field coverageFORMAT_COVERAGE.md
The written specification each adapter is implemented against, including every declared gap.
- Published JSON Schemaschemas/
Generated from the canonical models, so a non-Python consumer can validate without the package.
Test evidence
- Category 021 harness testtests/test_cdm_asterix_cat021_adapter.py
Replayed by the validation harness shipped in the same package, which runs six checks per fixture including a never-drop lossless check.
- Category 034 harness testtests/test_cdm_asterix_cat034_adapter.py
Replayed by the validation harness shipped in the same package, which runs six checks per fixture including a never-drop lossless check.
- Category 048 harness testtests/test_cdm_asterix_cat048_adapter.py
Replayed by the validation harness shipped in the same package, which runs six checks per fixture including a never-drop lossless check.
- Coverage document testtests/test_cdm_format_coverage.py
Asserts that the coverage document and the models agree, in both directions.
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.
asterix_cat021Maturity L4Claim VERIFIEDasterix_cat023Maturity L4Claim VERIFIEDasterix_cat034Maturity L4Claim VERIFIEDasterix_cat048Maturity L4Claim VERIFIEDasterix_cat062Maturity 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
- Only categories 021, 023, 034, 048 and 062 are implemented. No other category is supported.
- There is no network transport in the integration layer. Splitting a stream into data blocks is the caller's responsibility, which is what the specifications themselves assume.
- No adapter correlates across payloads. Joining reports into tracks is a fusion function, performed outside the translator.
- Each adapter is written against one pinned edition of its specification. Where a pinned document leaves a question open, the gap is recorded in the coverage document rather than closed by a guess.
Security boundary
- The published integration layer is the data contract only. It carries no models, no doctrinal content, no decision logic and no deployment configuration.
- Adapters accept an injected clock rather than reading the wall clock, so translation behaviour is fully determined by its inputs and can be replayed exactly.
- The proprietary decision runtime is not published, and no page on this site describes its internals.
Public sources
Statements about what SynapseCommand® implements are drawn from the published repository rather than from these external sources.
Frequently asked
- Which ASTERIX categories does SynapseCommand support?
- Categories 021, 023, 034, 048 and 062. Each has a published adapter that translates in both directions and is verified by the shipped harness. No other category is implemented.
- Is the ASTERIX support bidirectional?
- Yes, for the five implemented categories. Each adapter provides both a to_cdm and a from_cdm path, and the harness calls the egress path on whatever the ingest path produced for every fixture, so an adapter that could not re-emit its own output would fail its own gate.
- Does SynapseCommand connect to a radar directly?
- No. The integration layer translates payloads. It opens no sockets, holds no reassembly buffer and performs no stream framing, because the ASTERIX specifications place those functions in the layer below the format.
- Can we verify the mapping ourselves?
- Yes. The adapters, the field by field coverage document, the fixtures and the harness are all published under Apache 2.0, and the distribution is installable from PyPI. Running the harness against a shipped adapter is a single command.
Where to go next
Related standards
Related use cases
Related C2 environments
Command environments in the compatibility catalogue whose published characteristics reference this standard. Each page states the current SynapseCommand integration status for that system.