Skip to content

Linked.Archi APM

Six Agent Skills that let an AI agent answer questions about an enterprise architecture from an RDF knowledge graph, and attach the query, the dataset identity and the profile version to every answer it gives.

The graph is produced by the Linked.Archi converters from ArchiMate, BPMN, C4 or Structurizr, Backstage and LeanIX models, against the published ontologies at meta.linked.archi.

The problem this package exists for

An architecture question answered from a model file is unfalsifiable. The reader cannot tell a correct answer from a plausible one, and the two failure modes look identical:

  • An empty result reads as absence. "No capability is unrealised" and "no capability is modelled" are different statements, and a query returning zero rows produces both.
  • A wrong vocabulary returns nothing, silently. Scope a query to a named graph the dataset does not have and it succeeds with no rows.

Every design decision here follows from refusing to let those two look like answers.

The six skills

flowchart TB
  subgraph acquire["1 · Acquire and attach"]
    direction LR
    S["linked-archi-source<br/><small>verified bytes</small>"]
    C["linked-archi-connect<br/><small>one dataset, one identity</small>"]
    S -->|"target: data[] or endpoint"| C
  end

  subgraph describe["2 · Describe"]
    P["linked-archi-profile<br/><small>what this data calls things</small>"]
  end

  subgraph answer["3 · Answer"]
    direction LR
    Q["linked-archi-query<br/><small>templates, SPARQL, envelope</small>"]
    A["linked-archi-analyse<br/><small>plans and bundles<br/>executes nothing</small>"]
    V["linked-archi-validate<br/><small>SHACL with coverage</small>"]
  end

  C -->|"probes"| P
  P -->|"resolved profile snapshot"| Q
  C -->|"adapter, dataset_id"| Q
  C --> V
  Q -->|"result envelopes"| A
  A -->|"the commands to run"| Q
  Q -.->|"read-only lint"| C
Skill Owns Never does
linked-archi-source Acquiring RDF from HTTPS, a pinned Git revision, or a read-only GitLab MCP handoff. Digest, size, redirect and parse verification. Executes no SPARQL.
linked-archi-connect Dataset discovery, attachment and identity. Local pyoxigraph store or SPARQL endpoint. Chooses no dataset for you.
linked-archi-profile The graph profile: namespaces, roles, graph layout, capabilities, notations. Verifies its claims against real data. Never applies a recommendation.
linked-archi-query The 39-template catalogue, rendering, read-only enforcement, execution, and the result envelope. Invents no IRI.
linked-archi-validate SHACL in-process, plus reading a report someone else produced. Target-class coverage beside the verdict. Needs no JVM or converter.
linked-archi-analyse Routing a question to an analysis pattern, planning the ordered steps, bundling the envelopes. Executes nothing.

What an answer looks like

Every result carries a citation line naming what ran, against what, under which profile:

model   label
urn:uuid:1  Archisurance
urn:uuid:2  Errata
#
# 2 row(s)
# core/models | query 4ae81572f06e | dataset base.trig | profile linked-archi-default v2 | 2026-09-16T23:24:55.552005+00:00 | 2 row(s)

query 4ae81572f06e is a SHA-256 over the query with whitespace collapsed, so re-indenting a template does not change it but changing an IRI or a limit does. See Evidence and refusal.

Three properties worth knowing before you start

A template can be refused, and a refusal is an answer. The catalogue declares what each template needs — profile roles, graph roles, capabilities, a notation's vocabulary and whether the dataset holds any of it. When the profile cannot support a template, it is refused with a reason and a named alternative, on exit code 1. That is routing, not a crash. See The graph profile.

Read-only is enforced, not requested. Every query is linted before execution, including queries that arrive through the analyse skill's plans and through connect's machine contract.

The profile is a set of claims, and claims decay. la-profile verify probes the dataset and reports where a claim is false. Until a profile has been verified against a dataset, every result from it carries a caveat saying so.

Where to go next

  • Getting started — install, check the tooling, run the first query.
  • Conversational analysis — a question in natural language turned into a planned series of catalogued queries and a fact-grounded answer.
  • Template catalogue — all 39 templates, what each answers and what it does not prove.