All notable changes to nrdax-python are documented here. The format follows
Keep a Changelog, and the package version
follows Semantic Versioning.
Note: the package version tracked here is independent of the NRDAX dataset
version and the NRDAX schema version. See docs/data-model.md for the
compatibility policy.
- Breaking (tracks the API):
Technique.familyis now the published mechanism taxonomy and isstr | None. It isNonewhile the registry has not classified a technique, which on the live registry is 323 of 420. The producing pipeline's own label moves to the newproducer_familyfield. Code doingt.family == "..."or grouping ont.familymust handleNone;Technique.is_classifiedis provided for the intent. NRDAX.families()now returns the five mechanism families (always all five, zero counts included). The producer vocabulary moved toNRDAX.producer_families().FamilyCountgainsaxis("mechanism"or"producer-class"), because a name such asmemory_ampoccurs on both axes with different counts.by_family()and--familyfilter the mechanism axis.by_producer_family()and--producer-familyfilter the producer axis.- Search matches both axes; STIX export carries
x_nrdax_producer_family,x_nrdax_surface,x_nrdax_bound_failureandx_nrdax_classificationalongsidex_nrdax_family, byte-identical to the backend emitter.
techniques_by_family()andfamily_siblingsno longer group unclassified techniques together. Both compared families directly, and sinceNone == Noneevery pending technique was a "sibling" of every other one - 323 of them against the live registry. Grouping now requires a known mechanism.- A
nullfamily is no longer reported as a validation issue. A pending technique is well-formed, and flagging it made the registry's own honest gap look like a data defect. - The CLI renders
(pending classification)rather than a bareNone.
MECHANISM_FAMILIES,SURFACES,BOUND_FAILURESandCLASSIFICATION_STATESvocabularies;Technique.surface,.bound_failure,.dual_with,.classificationand.is_classified;NRDAX.classified(),.unclassified()and.techniques_by_producer_family().
0.3.0 - 2026-07-16
- Breaking (tracks the API): the live read API is now versioned under
/v1;NRDAX_APIishttps://api.nrdax.com/v1andApiSourcerequests the versioned paths. Unversioned paths on the API host return 404, sonrdax updateand--source apiin earlier releases (<= 0.2.0) no longer work against the live host - upgrade, or pass--source api:https://api.nrdax.com/v1explicitly.
0.2.0 - 2026-07-14
- The bundled dataset snapshot no longer ships in the package. The dataset is
versioned and distributed separately; the wheel now contains code only. Fetch the
data explicitly with
nrdax update(cached for offline/pinned use) or load a source directly (--source api/NRDAX.from_api(),feed:,file:,stix:). This mirrors howmitreattack-pythonkeeps the ATT&CK data out of the library. - Removed
NRDAX.bundled()and thebundledsource spec (--source bundled).
- Breaking: the zero-config default (
NRDAX.load(), or any CLI command with no--source) now resolves to the local cache from a priornrdax update, and raisesSourceErrorwith guidance when the cache is empty (previously it silently fell back to the in-wheel snapshot). Runnrdax updateonce, or pass an explicit source.
0.1.1 - 2026-07-14
- Refreshed the bundled dataset snapshot to the current registry: 388 techniques
(was 381; 7 added,
NRDAX-T0382..NRDAX-T0388), captured from the live read API. The dataset version is unchanged (v0.1-import); this is a snapshot refresh, not a schema change. - The snapshot now reflects the upstream canonicalisation of instance-level
cve/ghsareference ids (they carry the identifier, e.g.CVE-2013-5700, with the URL inurl), soby_reference/--reference/ citations / STIXexternal_idresolve for those references.
0.1.0 - 2026-07-13
First public release: the standard open-source Python interface to NRDAX.
- Library (
nrdax): theNRDAXfacade withload,get,search,filter,related,coverage,families,instances,by_reference, and serialization helpers. Typed dataclass models that mirror the canonical schema, preserve unknown fields, and validate leniently (or strictly). - Data sources: bundled snapshot (offline default), static feed (directory or
URL), live read API (
api.nrdax.com), local file (.jsonl/ bundle / single technique), STIX 2.1 bundle, and in-memory. - CLI (
nrdax):search,get,list,related,export,cite,changes,info,version,update,cache,schema. Table / JSON / CSV / STIX output where meaningful; stable exit codes and structured JSON errors. - Deterministic search: weighted, explainable field matching (no network, no LLM).
- Exporters: JSON and CSV (with field projection), and STIX 2.1 that is byte-identical to the canonical NRDAX emitter (identity round-trips).
- Citations: text, Markdown, BibTeX, and CSL-JSON. Never fabricates a DOI.
- Changes:
--since(fromfirst_seen) and a real snapshot-diff engine. - Offline / cache:
nrdax updatewrites a snapshot;nrdax cache info|clear. - Bundled dataset snapshot: NRDAX
v0.1-import(381 techniques), captured 2026-07-13, for zero-config offline use. - Docs, runnable examples, a comprehensive test suite, CI, and release automation.
- NRDAX has no
implementationorsurfacefield;--implementationand related search are derived text heuristics. - NRDAX has no asserted technique-to-technique relationships;
relatedis derived (shared family / chain / reference). - No historical versioned releases are published yet, so cross-version
changesrequires two snapshots you supply;--from-version/--to-versionis not available. - No DOI is minted upstream; citations omit it.
- The static feed is not yet hosted at a stable public URL, so
nrdax updatefetches from the live API by default.