Skip to content

Relationships

Relationships are the edges in your architecture graph. They’re declared in registry-mapping.yaml and populated in element frontmatter.

  1. Declare the relationship in the mapping (which types can connect, how to resolve references)
  2. Populate the frontmatter field in your Markdown file (with slugs, names, or abbreviations)
  3. The loader resolves references at build time and creates edges in the graph

In registry-mapping.yaml:

elements:
software_system:
relationships:
composes_software_subsystems:
target: software_subsystem
type: composition
cardinality: many
resolve_by: slug
inverse: parent_software_system
required: false

In your element’s Markdown:

---
name: Platform Core
composes_software_subsystems:
- crm-api-gateway
- billing-worker
- analytics-engine
---

The loader finds crm-api-gateway.md, billing-worker.md, and analytics-engine.md in the software_subsystem folder and creates edges.

StrategyMatches againstExample valueBest for
slugFilename (without .md)billing-workerTechnical identifiers
namename: frontmatter fieldTenant ManagementHuman-readable names
abbreviationabbreviation: fieldNOVASystem codes

The inverse field automatically creates the reverse link. When you declare:

composes_software_subsystems:
target: software_subsystem
type: composition
inverse: parent_software_system # <- auto-creates reverse on subsystem

You only need to declare the relationship once. The loader builds both outgoing and incoming views.

Use inverse: ~ (tilde) when there’s no reverse link.

Relationship types define the verbs shown in the UI:

relationship_types:
composition:
outgoing: Composes
incoming: Part of
icon: "+"
serving:
outgoing: Serves
incoming: Served by
icon: "->"

You can define any relationship types you want. The defaults are inspired by ArchiMate but you can rename them freely.

TypeOutgoing verbIncoming verbTypical use
compositionComposesPart ofStructural containment
aggregationOwnsOwned byGrouping, ownership
realizationRealizesRealized byImplementation links
servingServesServed byAPI exposure
assignmentAssigned toAssigned fromInfrastructure mapping
accessAccessesAccessed byData read/write

When a reference can’t be resolved, the build continues successfully. The element shows a broken-link indicator and the linter flags it as a warning.

# Loader output for unresolved reference:
{ resolved: false, raw: "missing-system" }

This graceful degradation means you can add elements incrementally without worrying about dangling references breaking the build.