Skip to main content

Adapter support matrix

Every row below is read off one adapter's metadata — the same declaration manifests/<id>.json publishes and python -m synapse_cdm.harness --list-adapters prints — so the four cannot say different things about the same adapter. The page is regenerated by the command in its header, and tests/test_cdm_support_matrix.py in the test suite fails while the page on disk and the declarations disagree (no CI step runs the generator's --check; the suite is what holds it); a sentence in it is not a claim somebody typed.

How to read the binding column. standard-encoding means the bytes this adapter reads and writes are the cited document's own encoding, checked by this repository's fixtures and tests — verified by this package's own evidence, not by an independent implementation or a normative schema (those are the external evidence categories below). provisional-internal-profile means the element names or namespace were chosen here from the standard's data model because the normative binding resource is not held; reader and writer agreeing proves the profile is self-consistent and nothing more. normative-verified would mean the wire form was validated against the authorised normative schema through the adapter's local-resource hook; no shipped adapter declares it, and the manifests test holds the value to an exercise report.

The matrix

adapterformateditionbindingdirectionreplayed formsmaturitylicence
adsbADS-B 1090ES Extended Squitter (Mode S DF17/DF18)not stated — see the limitationsstandard-encodingbidirectional (ingest, egress).adsb, .parsed.jsonL3LICENSED
aisAIS (NMEA 0183 AIVDM/AIVDO)not stated — see the limitationsstandard-encodingbidirectional (ingest, egress).nmea, .parsed.jsonL3LICENSED
cat021EUROCONTROL ASTERIX Category 021 — ADS-B Target ReportsEdition 2.6standard-encodingbidirectional (ingest, egress).cat021, .parsed.jsonL3PUBLIC_GOVERNMENT
cat023EUROCONTROL ASTERIX Category 023 — CNS/ATM Ground Station and Service Status ReportsEdition 1.3standard-encodingbidirectional (ingest, egress).cat023, .parsed.jsonL3PUBLIC_GOVERNMENT
cat034EUROCONTROL ASTERIX Category 034 — Monoradar Service MessagesEdition 1.29standard-encodingbidirectional (ingest, egress).cat034, .parsed.jsonL3PUBLIC_GOVERNMENT
cat048EUROCONTROL ASTERIX Category 048 — Monoradar Target ReportsEdition 1.32standard-encodingbidirectional (ingest, egress).cat048, .parsed.jsonL3PUBLIC_GOVERNMENT
cat062EUROCONTROL ASTERIX Category 062 — SDPS Track MessagesEdition 1.21standard-encodingbidirectional (ingest, egress).cat062, .parsed.jsonL3PUBLIC_GOVERNMENT
gmtiSTANAG 4607 / AEDP-4607 — NATO Ground Moving Target Indicator Format (GMTIF)AEDP-4607 Edition A Version 1standard-encodingbidirectional (ingest, egress).gmti, .parsed.jsonL3PUBLIC_GOVERNMENT
legionPicogrid Legion Platform API v3v3standard-encodingingest (ingest).jsonL3LICENSED
pntmapPNTMAP GNSS interference alertnot stated — see the limitationsstandard-encodingingest (ingest).jsonL3OPEN
stanag4586STANAG 4586 — Standard Interfaces of UAV Control System (UCS), DLI telemetryEdition 3standard-encodingingest (ingest).parsed.json, .s4586L3PUBLIC_GOVERNMENT
stanag4609STANAG 4609 / MISP-2019.1 — the UAS Datalink Local SetMISP-2019.1 (STANAG 4609 Edition 5 wrapper)standard-encodingbidirectional (ingest, egress).klv, .parsed.jsonL3PUBLIC_GOVERNMENT
stanag4676STANAG 4676 / AEDP-12 — NATO ISR Tracking Standard (NITS)AEDP-12 Edition B Version 2provisional-internal-profilebidirectional (ingest, egress).nits.xml, .parsed.jsonL3PUBLIC_GOVERNMENT
takCursor-on-Target (TAK)not stated — see the limitationsstandard-encodingbidirectional (ingest, egress).parsed.json, .xmlL3PUBLIC_GOVERNMENT

direction is the declared value with the directions the capability block says are exercised in brackets; the model refuses a disagreement between the two. replayed forms are the file suffixes in the adapter's packaged fixture directory — the wire form and, for binary and XML adapters, the parsed twin beside it. maturity is the declared rung, which the conformance suite computes independently and the manifests test holds to the evidence.

Evidence scope

The five evidence categories of evidence.EvidenceCategory, per adapter. The first two the conformance suite produces from this repository's own fixtures; the other three only an exercise report from outside it can make PRESENT, and until one exists each reads ABSENT with the reason. A rung's requirement is satisfied by PRESENT only.

adapterinternal_fixtureself_round_tripindependent_expectednormative_schemaindependent_endpoint
adsbinternal — the suite's checks A/B/C over the packaged synthetic fixturesinternal — check E, this package encoding and decoding on both legs; not independenceABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
aisinternal — the suite's checks A/B/C over the packaged synthetic fixturesinternal — check E, this package encoding and decoding on both legs; not independenceABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
cat021internal — the suite's checks A/B/C over the packaged synthetic fixturesinternal — check E, this package encoding and decoding on both legs; not independenceABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
cat023internal — the suite's checks A/B/C over the packaged synthetic fixturesinternal — check E, this package encoding and decoding on both legs; not independenceABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
cat034internal — the suite's checks A/B/C over the packaged synthetic fixturesinternal — check E, this package encoding and decoding on both legs; not independenceABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
cat048internal — the suite's checks A/B/C over the packaged synthetic fixturesinternal — check E, this package encoding and decoding on both legs; not independenceABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
cat062internal — the suite's checks A/B/C over the packaged synthetic fixturesinternal — check E, this package encoding and decoding on both legs; not independenceABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
gmtiinternal — the suite's checks A/B/C over the packaged synthetic fixturesinternal — check E, this package encoding and decoding on both legs; not independenceABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
legioninternal — the suite's checks A/B/C over the packaged synthetic fixturesNOT_APPLICABLE — ingest only, no egress leg to round-tripABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
pntmapinternal — the suite's checks A/B/C over the packaged synthetic fixturesNOT_APPLICABLE — ingest only, no egress leg to round-tripABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
stanag4586internal — the suite's checks A/B/C over the packaged synthetic fixturesNOT_APPLICABLE — ingest only, no egress leg to round-tripABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
stanag4609internal — the suite's checks A/B/C over the packaged synthetic fixturesinternal — check E, this package encoding and decoding on both legs; not independenceABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
stanag4676internal — the suite's checks A/B/C over the packaged synthetic fixturesinternal — check E, this package encoding and decoding on both legs; not independenceABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)
takinternal — the suite's checks A/B/C over the packaged synthetic fixturesinternal — check E, this package encoding and decoding on both legs; not independenceABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under testABSENT — check B validates the CDM's own published schema, which this repository wrote; no authorised normative schema of the source format is held offline (F05)ABSENT — no exchange with an independently implemented endpoint has been recorded; external_exercise is null and L6 is not awardable from this repository's own evidence (ARCHITECTURE.md §3.3)

Per adapter: message families and exclusions

adsb — ADS-B 1090ES

Format. ADS-B 1090ES Extended Squitter (Mode S DF17/DF18), not stated — see the limitations. Binding standard-encoding. No profile declared.

Message families implemented.

  • DF17 (ADS-B)
  • DF18 (TIS-B / non-ICAO)
  • ME type codes: identification, surface_position, airborne_position, airborne_velocity_ground, airborne_velocity_air, aircraft_status, operational_status

Exclusions and limitations, as declared.

  • the edition this adapter is written against is NOT STATED by any document in this repository — no pin record exists for RTCA DO-260x or ICAO Annex 10, both of which fixtures/adsb/spec/adsb_terms.json records as priced, so format.version is null rather than guessed
  • DF17 and DF18 only; every other downlink format is out of scope
  • a single frame carries no unambiguous position — the 17-bit CPR fields need a second frame of the opposite parity or a reference position, and no frame carries a time at all
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces ONE — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5). The other four are still absent, each with its own reason in capabilities.limits.absent_because; a depth, object-count, decompression or wall-clock bound is not enforced here today

ais — AIS

Format. AIS (NMEA 0183 AIVDM/AIVDO), not stated — see the limitations. Binding standard-encoding. No profile declared.

Message families implemented.

  • AIVDM/AIVDO message types 1, 2, 3, 4, 5, 18, 19, 21

Exclusions and limitations, as declared.

  • the edition this adapter is written against is NOT STATED by any document in this repository — the format has two publishers, ITU-R (M.1371) and NMEA (0183), and fixtures/ais/spec/ais_terms.json records both without naming the edition this implementation targets, so format.version is null rather than guessed
  • message types 1, 2, 3, 4, 5, 18, 19 and 21 are in scope; every other type is named in FORMAT_COVERAGE.md with the reason it is out
  • type 24 static data is out of scope, so a vessel's name and call sign arrive in no message this adapter reads
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces ONE — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5). The other four are still absent, each with its own reason in capabilities.limits.absent_because; a depth, object-count, decompression or wall-clock bound is not enforced here today

cat021 — ASTERIX CAT021

Format. EUROCONTROL ASTERIX Category 021 — ADS-B Target Reports, Edition 2.6. Binding standard-encoding. No profile declared.

Message families implemented.

  • ASTERIX data blocks of category 021
  • the Reserved Expansion Field (Appendix A, Edition 1.5)

Exclusions and limitations, as declared.

  • ADS-B MOPS versions 0, 1 and 2 in full; version 3 (ED-102B / DO-260C) only partially, and mostly in the Reserved Expansion Field
  • Edition 2.6 states on its own cover that it is not backwards compatible to Edition 2.1 or earlier, and this adapter does not read those editions
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces ONE — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5). The other four are still absent, each with its own reason in capabilities.limits.absent_because; a depth, object-count, decompression or wall-clock bound is not enforced here today

cat023 — ASTERIX CAT023

Format. EUROCONTROL ASTERIX Category 023 — CNS/ATM Ground Station and Service Status Reports, Edition 1.3. Binding standard-encoding. No profile declared.

Message families implemented.

  • ASTERIX data blocks of category 023 — the nine data items Edition 1.3 defines

Exclusions and limitations, as declared.

  • the smallest specification pinned in this repository: nine data items, and nothing outside them is decoded
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces ONE — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5). The other four are still absent, each with its own reason in capabilities.limits.absent_because; a depth, object-count, decompression or wall-clock bound is not enforced here today

cat034 — ASTERIX CAT034

Format. EUROCONTROL ASTERIX Category 034 — Monoradar Service Messages, Edition 1.29. Binding standard-encoding. No profile declared.

Message families implemented.

  • ASTERIX data blocks of category 034 — the monoradar service message types

Exclusions and limitations, as declared.

  • the pinned edition is 1.29 and it is NOT the latest: fixtures/cat034/spec/cat034_pin.json records Edition 1.30 as available, and this adapter is written against 1.29
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces ONE — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5). The other four are still absent, each with its own reason in capabilities.limits.absent_because; a depth, object-count, decompression or wall-clock bound is not enforced here today

cat048 — ASTERIX CAT048

Format. EUROCONTROL ASTERIX Category 048 — Monoradar Target Reports, Edition 1.32. Binding standard-encoding. No profile declared.

Message families implemented.

  • ASTERIX data blocks of category 048

Exclusions and limitations, as declared.

  • the Reserved Expansion field is carried verbatim and never interpreted: no edition of this category defines its contents
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces ONE — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5). The other four are still absent, each with its own reason in capabilities.limits.absent_because; a depth, object-count, decompression or wall-clock bound is not enforced here today

cat062 — ASTERIX CAT062

Format. EUROCONTROL ASTERIX Category 062 — SDPS Track Messages, Edition 1.21. Binding standard-encoding. No profile declared.

Message families implemented.

  • ASTERIX data blocks of category 062
  • the Reserved Expansion Field (Appendix A, Edition 1.3)

Exclusions and limitations, as declared.

  • the input is already the output of a fusion process, so the CDM objects this adapter emits carry judgements a tracker made and this adapter neither repeats nor re-decides
  • items the specification marks implementation-dependent are parked verbatim and not interpreted
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces ONE — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5). The other four are still absent, each with its own reason in capabilities.limits.absent_because; a depth, object-count, decompression or wall-clock bound is not enforced here today

gmti — STANAG 4607 GMTIF

Format. STANAG 4607 / AEDP-4607 — NATO Ground Moving Target Indicator Format (GMTIF), AEDP-4607 Edition A Version 1. Binding standard-encoding. No profile declared.

Message families implemented.

  • segment types 1, 2, 3, 5, 6, 10, 12, 13 and the two Controlled-Extension slots 101 and 102

Exclusions and limitations, as declared.

  • the Controlled Extension FIELD DEFINITIONS are not implemented and cannot be: AEDP-4607's §L.4, which is where their field tables belong, reads "(TO BE PROVIDED)" in the promulgated Edition A Version 1
  • the standard itself declines to specify error handling (§2.2), so a malformed packet's treatment is this adapter's decision and is documented at the site rather than cited
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces ONE — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5). The other four are still absent, each with its own reason in capabilities.limits.absent_because; a depth, object-count, decompression or wall-clock bound is not enforced here today

legion — Picogrid Legion

Format. Picogrid Legion Platform API v3, v3. Binding standard-encoding. No profile declared.

Message families implemented.

  • Entity
  • Event
  • Track
  • Telemetry — the resources fixtures/legion/spec/openapi_pin.json pins

Exclusions and limitations, as declared.

  • a VENDOR API rather than a ratified standard: fixtures/legion/spec/openapi_pin.json records that it "can change between deploys, and its info.version demonstrably does not move when it does", so v3 names the endpoint family and not a frozen edition
  • ingest only — this adapter does not emit Legion documents and never acquires one: no HTTP client, no token, no cursor, no base URL
  • only the resources the pinned OpenAPI document names are in scope
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces ONE — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5). The other four are still absent, each with its own reason in capabilities.limits.absent_because; a depth, object-count, decompression or wall-clock bound is not enforced here today

pntmap — PNTMAP

Format. PNTMAP GNSS interference alert, not stated — see the limitations. Binding standard-encoding. Profiles PNT.

Message families implemented.

  • GNSS interference alert — one alert becomes an INTERFERENCE_SOURCE entity and a sc.pnt.gnss_interference.v1 event

Exclusions and limitations, as declared.

  • no document in this repository DEFINES the PNTMAP alert payload — FORMAT_COVERAGE.md carries no PNTMAP section — so there is no edition to name and format.version is null; the licence class rests on the payload being first-party rather than on a licensing sentence about the format
  • ingest only: this adapter does not emit PNTMAP alerts
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces ONE — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5). The other four are still absent, each with its own reason in capabilities.limits.absent_because; a depth, object-count, decompression or wall-clock bound is not enforced here today

stanag4586 — STANAG 4586 DLI

Format. STANAG 4586 — Standard Interfaces of UAV Control System (UCS), DLI telemetry, Edition 3. Binding standard-encoding. No profile declared.

Message families implemented.

  • DLI datagrams — the wrapped message set §3.3.1 defines, message 0101 and its companions

Exclusions and limitations, as declared.

  • Edition 4 is current (promulgated as AEP-84 Edition A) and is NOT implemented: FORMAT_COVERAGE.md records that nso.nato.int answers HTTP 403 on every route tried, that the mirror carrying this family lists exactly Editions 2 and 3, and that the commercial distributors holding Edition 4 serve it paywalled and DRM-wrapped. No sentence here claims an Edition 3 decoder reads an Edition 4 feed
  • ingest only: this adapter does not emit DLI
  • whether the 5-octet millisecond timestamp steps at a leap second is not stated by the document, and every object carries attributes.time_basis saying so
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces ONE — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5). The other four are still absent, each with its own reason in capabilities.limits.absent_because; a depth, object-count, decompression or wall-clock bound is not enforced here today

stanag4609 — STANAG 4609 KLV

Format. STANAG 4609 / MISP-2019.1 — the UAS Datalink Local Set, MISP-2019.1 (STANAG 4609 Edition 5 wrapper). Binding standard-encoding. No profile declared.

Message families implemented.

  • UAS Datalink Local Set packets (MISB ST 0601.14)
  • the VMTI Local Set (ST 0903.4) and the RVT Local Set (ST 0806.4) where a packet carries them

Exclusions and limitations, as declared.

  • ST 0601.14 is the authoritative tag table; ST 0601.19 is pinned as CONTEXT ONLY and is never a source of tag semantics here
  • a length-divergent item's original octets are carried verbatim so that egress is byte exact, which means this adapter reproduces a defect rather than correcting it
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces ONE — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5). The other four are still absent, each with its own reason in capabilities.limits.absent_because; a depth, object-count, decompression or wall-clock bound is not enforced here today

stanag4676 — STANAG 4676 NITS

Format. STANAG 4676 / AEDP-12 — NATO ISR Tracking Standard (NITS), AEDP-12 Edition B Version 2. Binding provisional-internal-profile. No profile declared.

Message families implemented.

  • NITSRoot documents — the 48 classes and 273 attributes AEDP-12 Edition B Version 2 defines

Exclusions and limitations, as declared.

  • Edition A (the STANAG 4676 Edition 1 generation) is read for the edition delta and is never a basis: Edition B §2.1.1.1 declares the two incompatible
  • the binary encoding of AEDP-12.1 Annex F is not implemented
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces TWO — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5), and max_depth, declared the same way and refused by parse_document immediately after the XML parse and before either reader recurses into the tree (2026-09-16). The other three are still absent, each with its own reason in capabilities.limits.absent_because; an object-count, decompression or wall-clock bound is not enforced here today
  • XML is parsed with the standard library's expat (pyexpat into an xml.etree.ElementTree tree, parse_document's _parse_xml) and NOT with defusedxml, which is not a dependency of this package (M's F5.5 ruling, round P5). Since F05 (2026-09-20) an EXTERNAL entity reference FAILS the parse at the reference and parameter-entity parsing is off, so an external DTD subset is never requested — both set on the parser rather than read off its defaults — but an INTERNAL entity IS expanded, and what stops an entity bomb is libexpat's own input-amplification limit rather than anything in this package. That protection belongs to the RUNTIME's expat build (2.4.0 and later, on by default), so a deployment on an older expat loses it without this package changing; max_input_bytes bounds the document either way. tests/test_cdm_parser_safety.py reads the linked version and takes every one of these readings rather than asserting them
  • the XML element names this adapter reads and writes are a PROVISIONAL internal profile (binding: provisional-internal-profile): AEDP-12's UML attribute names bound through one table (ELEMENT_NAMES) in no namespace, because the normative XSD is distributed through NATO national representatives (Ed B §B.5) and is not held here. Reader and writer agreeing through that table proves the profile is self-consistent, not that it is the standard's binding; FORMAT_COVERAGE.md marks every NITS row · provisional for the same reason. The verified normative binding is a separate, explicit mode (SYNAPSE_CDM_NITS_BINDING=normative) that validates every document read or emitted against the authorised schema through the local-resource hook SYNAPSE_CDM_NITS_XSD_DIR and FAILS BLOCKED_EXTERNAL_EVIDENCE without it — it never falls back to the profile, and no shipped fixture, golden or evidence record was produced under it

tak — Cursor-on-Target

Format. Cursor-on-Target (TAK), not stated — see the limitations. Binding standard-encoding. No profile declared.

Message families implemented.

  • CoT atoms (a-.-...) — contact reports
  • CoT drawing shapes, on egress

Exclusions and limitations, as declared.

  • the CoT schema edition this adapter is written against is NOT STATED by any document in this repository — fixtures/tak/spec/tak_terms.json records the Base-Event Schema's own version as its publisher states it, which is a reading of that page and not a statement that this implementation targets it, so format.version is null rather than guessed
  • contact atoms only on ingest; CoT types outside a-.-... are out of scope
  • leftovers are parked in Entity.attributes / Event.payload under source_extras (lossless.residual()), not in the origin-identifying container ARCHITECTURE.md §5 gives to P3 — the Part 1 stance that section rules for the adapters already shipped
  • the evidence RECORD for this adapter is not IN the distribution: evidence/ is untracked and unpackaged, CI generates the set on every run and the release pipeline attaches it to the GitHub Release. evidence.available is true because the records for 2.1.2 are attached to the v2.1.2 Release and retrievable by a third party, and it says nothing about what the wheel contains
  • of §3.5's five resource limits this adapter enforces TWO — max_input_bytes, declared in capabilities.limits with its basis beside it and refused before decode by the base class (round P5), and max_depth, declared the same way and refused by this module immediately after the XML parse and before anything recurses into the tree (2026-09-16). The other three are still absent, each with its own reason in capabilities.limits.absent_because; an object-count, decompression or wall-clock bound is not enforced here today
  • XML is parsed with the standard library's xml.etree.ElementTree and NOT with defusedxml, which is not a dependency of this package (M's F5.5 ruling, round P5). An EXTERNAL entity is not resolved and an external DTD is not fetched — the parser never reads the external subset — but an INTERNAL entity IS expanded, and what stops an entity bomb is libexpat's own input-amplification limit rather than anything in this package. That protection belongs to the RUNTIME's expat build (2.4.0 and later, on by default), so a deployment on an older expat loses it without this package changing; max_input_bytes bounds the document either way. tests/test_cdm_parser_safety.py reads the linked version and takes every one of these readings rather than asserting them

STANAG 4676: the provisional profile and the normative mode

stanag4676 declares binding: provisional-internal-profile. Its XML element names are AEDP-12's UML attribute names bound through one table (ELEMENT_NAMES) in no namespace, because the normative XSD is distributed through NATO national representatives (Ed B §B.5) and is not held in this repository or its wheel. Every fixture, golden and evidence record for this adapter was produced under that profile, and an emitted document says so in a comment on its first line. The · provisional qualifier on every NITS row of FORMAT_COVERAGE.md is the same statement.

The verified normative binding is a separate, explicit mode: SYNAPSE_CDM_NITS_BINDING=normative in the environment, or binding="normative" to the constructor. Under it every document read is validated against the authorised schema before anything interprets it, every document emitted is validated before it is handed over, and the adapter records what it validated against (binding_report). The mode needs the local-resource hook and FAILS BLOCKED_EXTERNAL_EVIDENCE without it — at construction, naming the first unmet step — and it never falls back to the profile. A document whose root is in a namespace is refused by the profile by name, and an unqualified document is refused by the normative mode by name, in both directions.

Status (2026-09-20): BLOCKED_EXTERNAL_EVIDENCE. No authorised XSD is available in this environment, so the normative binding is not verified for any document, and the normative_schema category reads ABSENT above. The acceptance procedure, in the order the resolver checks it:

  1. hook — set SYNAPSE_CDM_NITS_XSD_DIR to a directory outside the repository and outside any published package
  2. directory — that directory exists and is readable
  3. record — it holds xsd_pin.json recording, non-empty, edition, schema_revision, schema_revision_date, target_namespace, provenance, usage_rights, obtained_on, files — the edition, the schema's own revision number and date read from inside the XSD (AEDP-12.1 guide §D.1.1), the target namespace, the channel it was obtained through (DiWEB via a national representative, Ed B §B.5, or the APAN 4676 Community, guide §D.1), the usage rights that permit this use, and the date
  4. files — both stanag4676.xsd and stanag4774_confidentialitymetadatalabel.xsd are present beside the record and named in its files
  5. checksum — each file's SHA-256, recomputed, equals the recorded one
  6. validator — an XSD validator imports: xmlschema (MIT) or lxml (BSD-3-Clause); neither is a dependency of this package and the mode adds none
  7. validate — the document's root is <NITSRoot> in the recorded target namespace and the document validates against stanag4676.xsd with external entities, DTD loading and network access disabled in the validator

The hook is SYNAPSE_CDM_NITS_XSD_DIR; the record is xsd_pin.json beside stanag4676.xsd and stanag4774_confidentialitymetadatalabel.xsd, recording edition, schema_revision, schema_revision_date, target_namespace, provenance, usage_rights, obtained_on, files. Both files stay outside Git and outside any published package. When the procedure has run, the F07 exercise runner records it as a normative_schema report and only then may the manifest say normative-verified.