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
| adapter | format | edition | binding | direction | replayed forms | maturity | licence |
|---|---|---|---|---|---|---|---|
adsb | ADS-B 1090ES Extended Squitter (Mode S DF17/DF18) | not stated — see the limitations | standard-encoding | bidirectional (ingest, egress) | .adsb, .parsed.json | L3 | LICENSED |
ais | AIS (NMEA 0183 AIVDM/AIVDO) | not stated — see the limitations | standard-encoding | bidirectional (ingest, egress) | .nmea, .parsed.json | L3 | LICENSED |
cat021 | EUROCONTROL ASTERIX Category 021 — ADS-B Target Reports | Edition 2.6 | standard-encoding | bidirectional (ingest, egress) | .cat021, .parsed.json | L3 | PUBLIC_GOVERNMENT |
cat023 | EUROCONTROL ASTERIX Category 023 — CNS/ATM Ground Station and Service Status Reports | Edition 1.3 | standard-encoding | bidirectional (ingest, egress) | .cat023, .parsed.json | L3 | PUBLIC_GOVERNMENT |
cat034 | EUROCONTROL ASTERIX Category 034 — Monoradar Service Messages | Edition 1.29 | standard-encoding | bidirectional (ingest, egress) | .cat034, .parsed.json | L3 | PUBLIC_GOVERNMENT |
cat048 | EUROCONTROL ASTERIX Category 048 — Monoradar Target Reports | Edition 1.32 | standard-encoding | bidirectional (ingest, egress) | .cat048, .parsed.json | L3 | PUBLIC_GOVERNMENT |
cat062 | EUROCONTROL ASTERIX Category 062 — SDPS Track Messages | Edition 1.21 | standard-encoding | bidirectional (ingest, egress) | .cat062, .parsed.json | L3 | PUBLIC_GOVERNMENT |
gmti | STANAG 4607 / AEDP-4607 — NATO Ground Moving Target Indicator Format (GMTIF) | AEDP-4607 Edition A Version 1 | standard-encoding | bidirectional (ingest, egress) | .gmti, .parsed.json | L3 | PUBLIC_GOVERNMENT |
legion | Picogrid Legion Platform API v3 | v3 | standard-encoding | ingest (ingest) | .json | L3 | LICENSED |
pntmap | PNTMAP GNSS interference alert | not stated — see the limitations | standard-encoding | ingest (ingest) | .json | L3 | OPEN |
stanag4586 | STANAG 4586 — Standard Interfaces of UAV Control System (UCS), DLI telemetry | Edition 3 | standard-encoding | ingest (ingest) | .parsed.json, .s4586 | L3 | PUBLIC_GOVERNMENT |
stanag4609 | STANAG 4609 / MISP-2019.1 — the UAS Datalink Local Set | MISP-2019.1 (STANAG 4609 Edition 5 wrapper) | standard-encoding | bidirectional (ingest, egress) | .klv, .parsed.json | L3 | PUBLIC_GOVERNMENT |
stanag4676 | STANAG 4676 / AEDP-12 — NATO ISR Tracking Standard (NITS) | AEDP-12 Edition B Version 2 | provisional-internal-profile | bidirectional (ingest, egress) | .nits.xml, .parsed.json | L3 | PUBLIC_GOVERNMENT |
tak | Cursor-on-Target (TAK) | not stated — see the limitations | standard-encoding | bidirectional (ingest, egress) | .parsed.json, .xml | L3 | PUBLIC_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.
| adapter | internal_fixture | self_round_trip | independent_expected | normative_schema | independent_endpoint |
|---|---|---|---|---|---|
adsb | internal — the suite's checks A/B/C over the packaged synthetic fixtures | internal — check E, this package encoding and decoding on both legs; not independence | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
ais | internal — the suite's checks A/B/C over the packaged synthetic fixtures | internal — check E, this package encoding and decoding on both legs; not independence | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
cat021 | internal — the suite's checks A/B/C over the packaged synthetic fixtures | internal — check E, this package encoding and decoding on both legs; not independence | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
cat023 | internal — the suite's checks A/B/C over the packaged synthetic fixtures | internal — check E, this package encoding and decoding on both legs; not independence | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
cat034 | internal — the suite's checks A/B/C over the packaged synthetic fixtures | internal — check E, this package encoding and decoding on both legs; not independence | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
cat048 | internal — the suite's checks A/B/C over the packaged synthetic fixtures | internal — check E, this package encoding and decoding on both legs; not independence | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
cat062 | internal — the suite's checks A/B/C over the packaged synthetic fixtures | internal — check E, this package encoding and decoding on both legs; not independence | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
gmti | internal — the suite's checks A/B/C over the packaged synthetic fixtures | internal — check E, this package encoding and decoding on both legs; not independence | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
legion | internal — the suite's checks A/B/C over the packaged synthetic fixtures | NOT_APPLICABLE — ingest only, no egress leg to round-trip | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
pntmap | internal — the suite's checks A/B/C over the packaged synthetic fixtures | NOT_APPLICABLE — ingest only, no egress leg to round-trip | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
stanag4586 | internal — the suite's checks A/B/C over the packaged synthetic fixtures | NOT_APPLICABLE — ingest only, no egress leg to round-trip | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
stanag4609 | internal — the suite's checks A/B/C over the packaged synthetic fixtures | internal — check E, this package encoding and decoding on both legs; not independence | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
stanag4676 | internal — the suite's checks A/B/C over the packaged synthetic fixtures | internal — check E, this package encoding and decoding on both legs; not independence | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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) |
tak | internal — the suite's checks A/B/C over the packaged synthetic fixtures | internal — check E, this package encoding and decoding on both legs; not independence | ABSENT — no expected result derived by another implementation: every golden in this repository was written by the code under test | ABSENT — 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.jsonrecords as priced, soformat.versionis 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.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith 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 incapabilities.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.jsonrecords both without naming the edition this implementation targets, soformat.versionis 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.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith 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 incapabilities.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.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith 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 incapabilities.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.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith 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 incapabilities.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.jsonrecords Edition 1.30 as available, and this adapter is written against 1.29 - leftovers are parked in
Entity.attributes/Event.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith 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 incapabilities.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.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith 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 incapabilities.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.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith 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 incapabilities.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.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith 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 incapabilities.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.jsonpins
Exclusions and limitations, as declared.
- a VENDOR API rather than a ratified standard:
fixtures/legion/spec/openapi_pin.jsonrecords that it "can change between deploys, and its info.version demonstrably does not move when it does", sov3names 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.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith 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 incapabilities.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.v1event
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.versionis 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.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith 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 incapabilities.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.intanswers 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_basissaying so - leftovers are parked in
Entity.attributes/Event.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith 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 incapabilities.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.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith 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 incapabilities.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.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith its basis beside it and refused before decode by the base class (round P5), andmax_depth, declared the same way and refused byparse_documentimmediately 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 incapabilities.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 (
pyexpatinto anxml.etree.ElementTreetree,parse_document's_parse_xml) and NOT withdefusedxml, 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_bytesbounds 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· provisionalfor 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 hookSYNAPSE_CDM_NITS_XSD_DIRand 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.jsonrecords 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, soformat.versionis null rather than guessed - contact atoms only on ingest; CoT types outside
a-.-...are out of scope - leftovers are parked in
Entity.attributes/Event.payloadundersource_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.availableis true because the records for 2.1.2 are attached to thev2.1.2Release 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 incapabilities.limitswith its basis beside it and refused before decode by the base class (round P5), andmax_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 incapabilities.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.ElementTreeand NOT withdefusedxml, 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_bytesbounds 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:
hook— set SYNAPSE_CDM_NITS_XSD_DIR to a directory outside the repository and outside any published packagedirectory— that directory exists and is readablerecord— 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 datefiles— both stanag4676.xsd and stanag4774_confidentialitymetadatalabel.xsd are present beside the record and named in itsfileschecksum— each file's SHA-256, recomputed, equals the recorded onevalidator— an XSD validator imports:xmlschema(MIT) orlxml(BSD-3-Clause); neither is a dependency of this package and the mode adds nonevalidate— 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.