v1.5.0
A minor release, and the whole of it is one capability: the stanag4609 adapter now reads the
MISB ST 0102.12 Security Metadata Local Set nested under ST 0601 item 48, and says on every
object it emits what basis it had for the marking it carries — or for carrying none.
Package version 1.5.0 · CDM schema_version 1.0.0. No schema moved: no field was added,
removed or retyped, and git diff v1.4.1..HEAD -- schemas/ returns nothing, which is the check
that decided SCHEMA_VERSION stays where it is rather than an assumption that it would.
What a stanag4609 Entity now carries
Two keys, under attributes.
security_metadata — present only when the packet carried ST 0601 item 48. It holds the
decoded ST 0102.12 local set: all seventeen elements of §6.7's Table 2 are read — tags 1–14,
22, 23 and 24, of which six are Required, eight are Context and three are Optional. Each element
carries its decoded value together with its octets, its stated length, its presence class and the
clause that governs it. A malformed element is refused with its octets parked while the other
sixteen decode.
security_metadata_basis — present on every object, marked or not. Its state is a token
from a closed set: UNLABELLED (no item 48), PARTIAL (a security set was present and not all
six Required elements decoded), COMPLETE-ON-REQUIRED (a security set was present and every
Required element decoded). Beside it the record carries the carrier and its clauses, the pinned
copy the element layer was read from by SHA-256, the clause pointers that govern this case, the
required tags present and absent, any advisories and refusals, and one pointer to the argument.
No marking is ever defaulted. confidentiality_ruling reads CARRIED AND NEVER INVENTED: a
security_classification outside §6.7's five listed values is carried with no label and an
advisory names the clause; a packet with no item 48 emits no security_metadata key at all,
because §6.5 says "the absence of Security Metadata does not signify Motion Imagery Data as
Unclassified"; and an element that cannot be decoded is refused, never guessed.
Tag 13's UTF-16 byte order is composed from three documents — RFC 2781 §4.3 for the BOM rule,
MISB ST 0107.3's ST 0107.2-02 for the no-BOM baseline, and ST 0102.12 §6.1.13 for
everything else about the element — because ST 0102.12 states no byte order anywhere in its own
voice.
Why this is a MINOR, and the gate derived it rather than being told
gates/bump_derivation.py classifies the diff over the distribution's own contents between
v1.4.1 and this tree against version.py's PACKAGE_VERSION table. It reports MINOR over
173 signals across 92 distribution files, and the floor is 1.5.0.
adapters/klv_security_codec.py is a new importable module and fixtures/klv/ gains seven
payloads that extend a fixture set — both MINOR rows. Eight units the table could not decide
carry Bump rulings in MIGRATIONS.md's 1.5.0 section, four MINOR and four PATCH, and the gate
reads them back and refuses one that outlives its case.
The first text pin
IETF RFC 2781, UTF-16, an encoding of ISO 10646 (February 2000), is pinned at
fixtures/klv/spec/rfc2781.txt — the first document this repository pins that is not a PDF.
The RFC Editor issues no PDF for it. It is a held document and not a delegation, so the delegated
tally is unchanged at fourteen in scope and nine held, and like every pinned specification it
is gitignored and not redistributed.
Derived off the tagged tree (release condition 4)
Fourteen adapters, from --list-adapters in the run summary: adsb, ais, cat021,
cat023, cat034, cat048, cat062, gmti, legion, pntmap, stanag4586, stanag4609,
stanag4676, tak — 458 fixture verdicts, 0 failed. The whole of the increase over 1.4.1 is
stanag4609's, which moves from twenty to forty-six.
Six schemas, regenerating byte-identical from the models: cdm_object, entity, event,
payload_gnss_interference, plan_object, track.
Suite at the tag, on the runner: 3468 passed, 72 skipped. A CI green is not a maintainer's —
the pinned specification documents are gitignored, so a fresh clone skips the tests that read
them, and the skip list is printed with -rs in the "Condition 1" step.
Artefacts
Built once by run 33888828645,
gated as that build, and uploaded as those same files through PyPI Trusted Publishing over OIDC
with no token anywhere in the workflow.
23fd8cf8ea2545bf1e53d6bef1adb0dfb0a80de10650663ea2d4655fe205ef85 synapse_cdm-1.5.0-py3-none-any.whl
54916e8d0bc24ca18e24cdebd12b75de23a0a694a176d1f3816c576a97103059 synapse_cdm-1.5.0.tar.gz
4 526 344 bytes and 2 398 792 bytes. PUBLICATION.md ledger entry 14 records these digests read
back from six independent places, together with both runs the v1.5.0 tag produced.
pip install synapse-cdm==1.5.0
python -m synapse_cdm.harness --list-adaptersFor what 1.4.1 was — one KLV framing refusal changing its exception class — see the 1.4.1 release.