Skip to content
🚧 Early alpha — building the foundation. See the roadmap →

Ontology evolution: first principles revisited

Created Updated

The EvolutionPattern taxonomy was our first attempt at solving the ontology evolution problem. It defined 8 fields (release_cadence, breaking_change_policy, id_stability, etc.) to classify how frameworks change over time.

After reviewing the Foundation research and external architecture analysis, a deeper question surfaced:

Can we describe what happens when an ontology changes at the data structure level — without needing conventions, taxonomies-of-taxonomies, or philosophical classification schemes?

This page captures the current thinking, the specific problem we’re facing, and the paths forward.

When a user imports NIST 800-53 Rev 5 today, and NIST publishes Rev 6 next year:

  1. What changed? Some controls renamed, some added, some removed, hierarchy restructured, new relationships added
  2. What breaks? Crosswalk links to CIS Controls now point to renamed/removed nodes. Evidence links reference old control IDs.
  3. What should Crosswalker do? Detect the changes, show the user what happened, and help them update their vault without losing evidence mappings

The EvolutionPattern taxonomy tried to PREDICT these changes based on organizational patterns. But prediction is fragile — organizations change behavior. What if we just DETECT and HANDLE changes as they happen?

Strip away all domain meaning. Every ontology is:

  • Nodes with IDs, properties, and types
  • Edges with sources, targets, and relationship types
  • Hierarchy (trees within the graph)

Every change that can happen is a combination of 13 structural primitives:

#ChangeExample
1Node addedNIST adds new control AC-24
2Node removedCIS deprecates control 4.7
3Node ID changedCSF renames PR.AC-07 to PR.AA-01
4Node properties changedMITRE updates T1078 description
5Node type changedControl reclassified from “technical” to “administrative”
#ChangeExample
6Edge addedNew crosswalk: AC-2 maps to CIS 5.1
7Edge removedOld crosswalk no longer valid
8Edge type changedRelationship upgraded from “partial” to “full”
9Edge properties changedConfidence score updated
#ChangeExample
10Hierarchy restructuredCSF moves “Asset Management” under new function
11Hierarchy depth changedNIST adds enhancement tier
12Subgraph mergedTwo control families consolidated
13Subgraph splitOne control family divided

Every ontology change that has ever happened is a composition of these 13 primitives.

If NIST renames AC-2 to AC-2.0, is it the “same” control? Structurally: it depends on whether there’s an explicit alias. Semantically: the user has to decide. Crosswalker needs to support both automatic resolution (when aliases exist) and manual curation (when they don’t).

A crosswalk between NIST AC-2 and CIS 5.1 becomes stale when EITHER side changes. Staleness is a computed property of the edge, not a stored annotation:

stale = (source.last_changed > crosswalk.created) 
     OR (target.last_changed > crosswalk.created)

No taxonomy needed for this — just timestamps and hashes.

If Crosswalker is a meta-system for managing ontologies, and we need to evolve our OWN schema… how do we handle that? This recursion is real — our _crosswalker metadata format will need to change over time, and we need migration paths for it.

Three paths for the EvolutionPattern taxonomy

Section titled “Three paths for the EvolutionPattern taxonomy”

Keep the 8-field taxonomy but reframe it. It’s not describing changes — it’s predicting PATTERNS of change based on organizational behavior. Useful for strategy selection upfront.

Pro: Helps users prepare before importing
Con: Predictions can be wrong; adds complexity before it’s needed

Path B: Drop taxonomy, track actual changes

Section titled “Path B: Drop taxonomy, track actual changes”

Record what actually happens through structural diffs. No classification needed — just show the user what changed.

Pro: Simpler, more accurate, no prediction errors
Con: Reactive, not proactive; user gets no warning about what to expect

  • Structural change tracking is the FOUNDATION — hash-based diff of imported versions, producing a list of the 13 primitives
  • EvolutionPattern taxonomy is a COMMUNITY FEATURE — an optional annotation that helps users predict what to expect, contributed progressively as the community learns each framework’s behavior

This means the Foundation schema does NOT depend on the taxonomy. The taxonomy ships later as an enhancement.

Minimum viable change tracking (in note frontmatter)

Section titled “Minimum viable change tracking (in note frontmatter)”
_crosswalker:
  source: nist-800-53
  source_version: r5
  source_id: AC-2
  import_hash: abc123
  import_date: 2026-04-08

When re-importing a new version:

  1. Hash the new source data
  2. Compare against stored import_hash for each node
  3. Produce a diff using the 13 primitives
  4. Present to user with handling options per change type
For each crosswalk edge:
  valid = both endpoint hashes match their latest import
  stale = either endpoint hash has changed since edge was created

Three strategies, progressively complex:

  1. Exact match — same ID means same node (default)
  2. Alias table — explicit old-ID → new-ID mappings (from framework changelog)
  3. Fuzzy match — string similarity + property overlap (when no explicit mapping exists)
  • Path A, B, or C? — leaning C (both) but need to confirm
  • Hash granularity — hash per-node or per-import-batch?
  • Identity resolution default — exact match only for v1?
  • Obsidian Bases direction — can we build on it for the viewing problem?
  • Core library boundary — what’s in the library vs. what’s in the plugin?