You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Browse filesBrowse the repository at this point in the historyBrowse files
Simon Morley
committed
Mechanism taxonomy: nullable family, and stop grouping the pending
Tracks the registry's contract change. `family` is now the published mechanism
taxonomy and is nullable: a technique the registry has not classified is served
null with classification "pending". The producer's own clustering label moves
to `producer_family`.
The fix that matters is the grouping bug. `techniques_by_family()` and
`family_siblings` compared families directly, and `None == None` is true, so
every unclassified technique became a sibling of every other one - 323 of 420
against the live registry, presented to a caller as a real relationship. The
same shape was in the search haystack, which joined a None into a string and
raised. Grouping now requires a known mechanism, and the index simply does not
key on None.
A null family is also no longer a validation issue. Flagging it made the
registry's deliberate, published gap look like a data defect.
Both axes stay queryable and separate: families() is the mechanism axis (all
five, zero counts included), producer_families() the producer vocabulary, and
FamilyCount carries `axis` so a count is never read against the wrong one.
`memory_amp` means one thing on each and the counts differ.
STIX export verified byte-identical to the Rust backend on every x_nrdax
property including the pending technique's nulls.
142 tests, ruff and mypy clean. Checked against the live registry: 97
classified / 323 pending, family counts match, a pending technique has zero
siblings, and validate() reports no issues.
0 commit comments