An Ecore micro-model of architecture: elements with containment, reified relationships with tunneling, and kinds as instance data.
The tower
The micro-models form a linear tower, each model’s extension point extending the one below:
nxcore < role < iam < seal < lifecycle < decision analysis < decision binding < governance < work < architecture < threat
Architecture sits on top of work: AbstractElement extends Workable, so every element is transitively workable, governed, staged, access controlled, and engageable, and carries nxcore documentation and marker-based provenance. Architecture is the composition point of the aspect spine: everything below it is an aspect of elements, everything above it (threat, domain models) sees elements that already carry all aspects. The threat model’s Asset extends Element directly: an asset is an architecture element, and threat modeling is a lens over the architecture rather than a parallel description of it, which is what pytm and Threagile approximate with duplicated YAML.
The ordering is not arbitrary; each link is a dependency already argued elsewhere: role < iam is EngagedSubject (grants to engagement holders), iam < lifecycle is transition guards (“who may fire this transition”), lifecycle < decision is decision workflows as lifecycle instance data (Delphi rounds, approvals) with IAM-backed confidentiality, decision < binding is a binding committing an analyzed Alternative into a variation point, binding < governance is treatment and compensating-control choices as bound variation points cited by waivers, governance < work is Workable extends GovernedElement (findings trace to remediation work), work < architecture is work attachable to any architecture element, architecture < threat is assets as elements. The bar for admission to the spine: multiple floors above must have a typed need (decision passes via governance, work, and threat citations; binding passes via ADRs bound to architecture variation points, so records and model cannot silently drift). A companion rule keeps the tower honest: each floor sits at the lowest position consistent with its own dependencies, which is why binding lands directly above decision rather than directly below architecture.
Two consequences worth naming. First, a lower floor cannot use an upper aspect in its types (an IAM Realm is not itself governed); the escape hatch is a same-name upgrade class at a higher floor (governance.Realm extends iam.Realm, GovernedElement): authoring surfaces resolve the most specific class on the classpath, so adding a dependency upgrades realm { } in place, with no change to the authored source. Second, the spine is for aspects only: domain models branch off the tower at whatever floor they need rather than being forced into the line. The principal branch stack is capability < product-management < org-design, rooted just above architecture (capability providers realize elements); the agentic stack is threat < ai-governance < agent < mcp (an agent is an AISystem; tools and MCP servers stay plain Assets), making agents governed by construction; NCDA branches off decision. For estate models the placement rule has settled empirically: structural-only models branch off architecture; estate models with a security surface (Maven, ai-governance, BW5) branch off threat, because weakness containment on Asset is a typed need wherever vulnerabilities are part of the story.
Competitive landscape
Structurizr / C4. The closest in spirit: model-based, diagrams generated, DSL-authored. But the C4 metamodel is fixed and the workspace is the silo; there is no aspect composition, no federation across workspaces beyond links. Here C4 is one catalog plus a thin extension over a smaller metamodel.
ArchiMate / Archi. A rich standardized metamodel, and that is the problem: ~60 element types that practitioners subset anyway. Kinds-as-data inverts it: the notation is loadable vocabulary, the metamodel stays at five classes.
EA platforms (LeanIX, Ardoq, Bizzdesign). Repository-backed, discovery-fed, proprietary. Same critique as GRC and threat-modeling platforms: the architecture lives in the platform, and the crosswalk to risk, threats, and access is manual or absent. The micro-model tower makes those crosswalks inheritance and references.
Backstage catalog. The most instructive comparison: a tiny entity model (kind, spec, relations) as data in git, wildly adopted precisely because it is small and federated. This model is that shape, with a typed metamodel, reified relationships, tunneling, and generated documentation instead of YAML conventions.
Applications
The threat modeling course exercise has its substrate: model the AI dashboard once as architecture, then threat-model it (Asset extends Element), govern it, and access-control it against the same elements. Cross-system generated views (a model of ElementReferences spanning published models) are the wedge play: the consumer sees a coherent view, the model stays invisible. Micro-wikis get their site map: element containment is the space hierarchy. And the Draw.io surface plus Groovy prototypes make the authoring story the old model promised, minus the metamodel toll.
Model overview
| Area | Types |
|---|---|
| Base | imported from the tower (governance ModelElement standing in for nxcore) |
| Kinds | ElementKind, RelationshipKind (instance data; C4/ArchiMate/TOGAF as catalogs) |
| Elements | AbstractElement (extends work Workable), Element, ElementReference (federation) |
| Relationships | Relationship (reified, directed, contained in source; carries = tunnel) |
Nasdanika Models